From python-checkins at python.org Wed Mar 1 00:09:09 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 00:09:09 +0100 (CET) Subject: [Python-checkins] r42699 - python/trunk/Include/compile.h Message-ID: <20060228230909.F1A841E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 00:09:08 2006 New Revision: 42699 Modified: python/trunk/Include/compile.h Log: Move #include to outside "extern C {}", before Tim figures out it'll break VC++. Modified: python/trunk/Include/compile.h ============================================================================== --- python/trunk/Include/compile.h (original) +++ python/trunk/Include/compile.h Wed Mar 1 00:09:08 2006 @@ -1,12 +1,13 @@ #ifndef Py_COMPILE_H #define Py_COMPILE_H + +#include "code.h" + #ifdef __cplusplus extern "C" { #endif -#include "code.h" - /* Public interface */ struct _node; /* Declare the existence of this type */ PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); From python-checkins at python.org Wed Mar 1 00:10:30 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 1 Mar 2006 00:10:30 +0100 (CET) Subject: [Python-checkins] r42700 - peps/trunk/pep-0263.txt Message-ID: <20060228231030.80C6A1E401C@bag.python.org> Author: neal.norwitz Date: Wed Mar 1 00:10:27 2006 New Revision: 42700 Modified: peps/trunk/pep-0263.txt Log: Martin changed the encoding warning to an error Modified: peps/trunk/pep-0263.txt ============================================================================== --- peps/trunk/pep-0263.txt (original) +++ peps/trunk/pep-0263.txt Wed Mar 1 00:10:27 2006 @@ -205,6 +205,12 @@ SUZUKI Hisao is working on a patch; see [2] for details. A patch implementing only phase 1 is available at [1]. +Phases + Implemenation of steps 1 and 2 above were completed in 2.3, + except for changing the default encoding to "ascii". + + The default encoding was set to "ascii" in version 2.5. + Scope This PEP intends to provide an upgrade path from the current From python-checkins at python.org Wed Mar 1 00:41:19 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 00:41:19 +0100 (CET) Subject: [Python-checkins] r42702 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060228234119.4EC3D1E4009@bag.python.org> Author: tim.peters Date: Wed Mar 1 00:41:18 2006 New Revision: 42702 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: The code nesting here has gotten impossibly deep. Will probably need to refactor, but until then renaming "partially_allocated_arenas" to "usable_arenas" seems to help readability a lot. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 00:41:18 2006 @@ -276,8 +276,8 @@ * * When this arena_object is associated with an allocated arena * with at least one available pool, both members are used in the - * doubly-linked `partially_allocated_arenas` list, which is - * maintained in increasing order of `nfreepools` values. + * doubly-linked `usable_arenas` list, which is maintained in + * increasing order of `nfreepools` values. * * Else this arena_object is associated with an allocated arena * all of whose pools are in use. `nextarena` and `prevarena` @@ -452,7 +452,7 @@ head of the list in new_arena(), and are pushed on the head of the list in PyObject_Free() when the arena is empty. -partially_allocated_arenas +usable_arenas This is a doubly-linked list of the arena_objects associated with arenas that have pools available. These pools are either waiting to be reused, @@ -473,7 +473,7 @@ static struct arena_object* available_arenas = NULL; /* The head of the doubly-linked list of arenas with pools available. */ -static struct arena_object* partially_allocated_arenas = NULL; +static struct arena_object* usable_arenas = NULL; /* How many arena_objects do we initially allocate? * 16 = can allocate 16 arenas = 16 * ARENA_SIZE = 4MB before growing the @@ -533,7 +533,7 @@ * into the old array. Thus, we don't have to worry about * invalid pointers. Just to be sure, some asserts: */ - assert(partially_allocated_arenas == NULL); + assert(usable_arenas == NULL); assert(available_arenas == NULL); /* Zero fill the new section of the array. */ @@ -729,61 +729,53 @@ UNLOCK(); return (void *)bp; } - if (partially_allocated_arenas == NULL) { - /* - * Allocate new arena - */ + + /* There isn't a pool of the right size class immediately + * available: use a free pool from an arena. + */ + if (usable_arenas == NULL) { + /* No arena has a free pool: allocate a new arena. */ #ifdef WITH_MEMORY_LIMITS if (narenas_currently_allocated >= MAX_ARENAS) { UNLOCK(); goto redirect; } #endif - partially_allocated_arenas = new_arena(); - if (partially_allocated_arenas == NULL) { + usable_arenas = new_arena(); + if (usable_arenas == NULL) { UNLOCK(); goto redirect; } - assert(partially_allocated_arenas->address != - (uptr)NULL); - /* This is the beginning of a new list, and is - * initialized in new_arena. - */ - assert(partially_allocated_arenas->nextarena == NULL - && partially_allocated_arenas->prevarena == NULL); } + assert(usable_arenas->address != 0); - /* - * Try to get a cached free pool - */ - pool = partially_allocated_arenas->freepools; + /* Try to get a cached free pool. */ + pool = usable_arenas->freepools; if (pool != NULL) { - /* - * Unlink from cached pools - */ - partially_allocated_arenas->freepools = pool->nextpool; + /* Unlink from cached pools. */ + usable_arenas->freepools = pool->nextpool; /* This moves the arena *towards* the head of the list but it is already at the head of the list: do nothing */ /* XXX what did that mean? */ /* XXX reformat very long lines below */ - partially_allocated_arenas->nfreepools --; - if (partially_allocated_arenas->nfreepools == 0) { - assert(partially_allocated_arenas->freepools == NULL); - assert(partially_allocated_arenas->nextarena == NULL - || partially_allocated_arenas->nextarena->prevarena == partially_allocated_arenas); + usable_arenas->nfreepools --; + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->freepools == NULL); + assert(usable_arenas->nextarena == NULL + || usable_arenas->nextarena->prevarena == usable_arenas); /* Unlink the arena: it is completely allocated. This is a dequeue from the head operation. */ - partially_allocated_arenas = partially_allocated_arenas->nextarena; - if (partially_allocated_arenas != NULL) - partially_allocated_arenas->prevarena = NULL; - assert(partially_allocated_arenas == NULL || partially_allocated_arenas->address != (uptr) NULL); + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) + usable_arenas->prevarena = NULL; + assert(usable_arenas == NULL || usable_arenas->address != (uptr) NULL); } else { - assert(partially_allocated_arenas->freepools != NULL - || partially_allocated_arenas->base_address <= ((block*) partially_allocated_arenas->address) + ARENA_SIZE - POOL_SIZE); + assert(usable_arenas->freepools != NULL + || usable_arenas->base_address <= ((block*) usable_arenas->address) + ARENA_SIZE - POOL_SIZE); } init_pool: /* @@ -824,42 +816,39 @@ /* * Allocate new pool */ - assert(partially_allocated_arenas->nfreepools > 0); - if (partially_allocated_arenas->nfreepools) { + assert(usable_arenas->nfreepools > 0); + if (usable_arenas->nfreepools) { /* Verify that the arenabase address is in range. */ /* XXX This assert appears to be equivalent to assert(POOL_SIZE <= ARENA_SIZE); what's it _trying_ to check? */ - assert(partially_allocated_arenas->base_address <= - partially_allocated_arenas->base_address + + assert(usable_arenas->base_address <= + usable_arenas->base_address + ARENA_SIZE - POOL_SIZE); - pool = (poolp)partially_allocated_arenas->base_address; - pool->arenaindex = partially_allocated_arenas - arenas; + pool = (poolp)usable_arenas->base_address; + pool->arenaindex = usable_arenas - arenas; assert(&arenas[pool->arenaindex] == - partially_allocated_arenas); + usable_arenas); pool->szidx = DUMMY_SIZE_IDX; - --partially_allocated_arenas->nfreepools; - partially_allocated_arenas->base_address += POOL_SIZE; + --usable_arenas->nfreepools; + usable_arenas->base_address += POOL_SIZE; - if (partially_allocated_arenas->nfreepools == 0) { - assert(partially_allocated_arenas->nextarena == + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->nextarena == NULL || - partially_allocated_arenas->nextarena->prevarena == - partially_allocated_arenas); + usable_arenas->nextarena->prevarena == + usable_arenas); /* Unlink the arena: it is completely * allocated. */ - partially_allocated_arenas = - partially_allocated_arenas->nextarena; - if (partially_allocated_arenas != NULL) - partially_allocated_arenas->prevarena = - NULL; - assert(partially_allocated_arenas == NULL || - partially_allocated_arenas->address != - (uptr) NULL); + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) + usable_arenas->prevarena = NULL; + assert(usable_arenas == NULL || + usable_arenas->address != 0); } goto init_pool; @@ -953,15 +942,12 @@ (uptr)NULL); /* Fix the pointer in the prevarena, or the - * partially_allocated_arenas pointer + * usable_arenas pointer */ if (arenaobj->prevarena == NULL) { - partially_allocated_arenas = - arenaobj->nextarena; - assert(partially_allocated_arenas == - NULL || - partially_allocated_arenas->address - != (uptr)NULL); + usable_arenas = arenaobj->nextarena; + assert(usable_arenas == NULL || + usable_arenas->address != 0); } else { assert(arenaobj->prevarena->nextarena == @@ -996,17 +982,16 @@ * go link it to the head of the partially * allocated list. */ - arenaobj->nextarena = partially_allocated_arenas; + arenaobj->nextarena = usable_arenas; arenaobj->prevarena = NULL; - partially_allocated_arenas = arenaobj; + usable_arenas = arenaobj; /* Fix the pointer in the nextarena. */ if (arenaobj->nextarena != NULL) { arenaobj->nextarena->prevarena = arenaobj; } - assert(partially_allocated_arenas->address != - (uptr)NULL); + assert(usable_arenas->address != 0); } /* If this arena is now out of order, we need to keep * the list sorted. The list is kept sorted so that @@ -1025,7 +1010,7 @@ if (arenaobj->prevarena != NULL) lastPointer = &arenaobj->prevarena->nextarena; else - lastPointer = &partially_allocated_arenas; + lastPointer = &usable_arenas; assert(*lastPointer == arenaobj); /* Step one: unlink the arena from the list. */ @@ -1065,8 +1050,7 @@ assert(arenaobj->nextarena == NULL || arenaobj->nextarena->prevarena == arenaobj); - assert((partially_allocated_arenas == - arenaobj && + assert((usable_arenas == arenaobj && arenaobj->prevarena == NULL) || arenaobj->prevarena->nextarena == arenaobj); From python-checkins at python.org Wed Mar 1 01:25:13 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 01:25:13 +0100 (CET) Subject: [Python-checkins] r42703 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301002513.0F1741E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 01:25:12 2006 New Revision: 42703 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Simplification and reformatting. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 01:25:12 2006 @@ -256,7 +256,7 @@ uptr address; /* Pool-aligned pointer to the next pool to be carved off. */ - block* base_address; + block* pool_address; /* The number of available pools in the arena: free pools + never- * allocated pools. @@ -579,13 +579,13 @@ #endif /* base_address <- first pool-aligned address in the arena nfreepools <- number of whole pools that fit after alignment */ - arenaobj->base_address = (block*)arenaobj->address; + arenaobj->pool_address = (block*)arenaobj->address; arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE; assert(POOL_SIZE * arenaobj->nfreepools == ARENA_SIZE); excess = (uint)((Py_uintptr_t)arenaobj->address & POOL_SIZE_MASK); if (excess != 0) { --arenaobj->nfreepools; - arenaobj->base_address += POOL_SIZE - excess; + arenaobj->pool_address += POOL_SIZE - excess; } arenaobj->ntotalpools = arenaobj->nfreepools; @@ -758,24 +758,27 @@ /* This moves the arena *towards* the head of the list but it is already at the head of the list: do nothing */ /* XXX what did that mean? */ - /* XXX reformat very long lines below */ - usable_arenas->nfreepools --; + --usable_arenas->nfreepools; if (usable_arenas->nfreepools == 0) { + /* Unlink the arena: it's completely + * allocated. + */ assert(usable_arenas->freepools == NULL); - assert(usable_arenas->nextarena == NULL - || usable_arenas->nextarena->prevarena == usable_arenas); + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); - /* Unlink the arena: it is completely - allocated. This is a dequeue from the - head operation. */ usable_arenas = usable_arenas->nextarena; - if (usable_arenas != NULL) + if (usable_arenas != NULL) { usable_arenas->prevarena = NULL; - assert(usable_arenas == NULL || usable_arenas->address != (uptr) NULL); + assert(usable_arenas->address != 0); + } } else { - assert(usable_arenas->freepools != NULL - || usable_arenas->base_address <= ((block*) usable_arenas->address) + ARENA_SIZE - POOL_SIZE); + assert(usable_arenas->freepools != NULL || + usable_arenas->pool_address <= + ((block*) usable_arenas->address) + + ARENA_SIZE - POOL_SIZE); } init_pool: /* @@ -813,46 +816,38 @@ UNLOCK(); return (void *)bp; } - /* - * Allocate new pool - */ + /* Allocate new pool. */ assert(usable_arenas->nfreepools > 0); - if (usable_arenas->nfreepools) { - /* Verify that the arenabase address is in range. */ - /* XXX This assert appears to be equivalent to - assert(POOL_SIZE <= ARENA_SIZE); what's it - _trying_ to check? - */ - assert(usable_arenas->base_address <= - usable_arenas->base_address + - ARENA_SIZE - POOL_SIZE); - pool = (poolp)usable_arenas->base_address; - pool->arenaindex = usable_arenas - arenas; - assert(&arenas[pool->arenaindex] == - usable_arenas); - pool->szidx = DUMMY_SIZE_IDX; - - --usable_arenas->nfreepools; - usable_arenas->base_address += POOL_SIZE; - - if (usable_arenas->nfreepools == 0) { - assert(usable_arenas->nextarena == - NULL || - usable_arenas->nextarena->prevarena == - usable_arenas); - - /* Unlink the arena: it is completely - * allocated. - */ - usable_arenas = usable_arenas->nextarena; - if (usable_arenas != NULL) - usable_arenas->prevarena = NULL; - assert(usable_arenas == NULL || - usable_arenas->address != 0); + /* Verify that the arenabase address is in range. */ + /* XXX This assert appears to be equivalent to + assert(POOL_SIZE <= ARENA_SIZE); what's it + _trying_ to check? + */ + assert(usable_arenas->pool_address <= + usable_arenas->pool_address + + ARENA_SIZE - POOL_SIZE); + pool = (poolp)usable_arenas->pool_address; + pool->arenaindex = usable_arenas - arenas; + assert(&arenas[pool->arenaindex] == + usable_arenas); + pool->szidx = DUMMY_SIZE_IDX; + + --usable_arenas->nfreepools; + usable_arenas->pool_address += POOL_SIZE; + + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); + /* Unlink the arena: it is completely allocated. */ + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) { + usable_arenas->prevarena = NULL; + assert(usable_arenas->address != 0); } - - goto init_pool; } + + goto init_pool; } /* The small block allocator ends here. */ @@ -1618,9 +1613,9 @@ } /* visit every pool in the arena */ - assert(base <= (uptr) arenas[i].base_address); + assert(base <= (uptr) arenas[i].pool_address); for (j = 0; - base < (uptr) arenas[i].base_address; + base < (uptr) arenas[i].pool_address; ++j, base += POOL_SIZE) { poolp p = (poolp)base; const uint sz = p->szidx; From python-checkins at python.org Wed Mar 1 01:47:27 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 01:47:27 +0100 (CET) Subject: [Python-checkins] r42704 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301004727.4AF401E400F@bag.python.org> Author: tim.peters Date: Wed Mar 1 01:47:25 2006 New Revision: 42704 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Typo repair. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 01:47:25 2006 @@ -577,7 +577,7 @@ #ifdef PYMALLOC_DEBUG ++ntimes_arena_allocated; #endif - /* base_address <- first pool-aligned address in the arena + /* pool_address <- first pool-aligned address in the arena nfreepools <- number of whole pools that fit after alignment */ arenaobj->pool_address = (block*)arenaobj->address; arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE; From python-checkins at python.org Wed Mar 1 02:01:56 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 02:01:56 +0100 (CET) Subject: [Python-checkins] r42705 - python/trunk/Modules/_bsddb.c Message-ID: <20060301010156.76EE51E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 02:01:55 2006 New Revision: 42705 Modified: python/trunk/Modules/_bsddb.c Log: Fix DBEnv's set_tx_timestamp wrapper to be slightly more correct on non-32bit platforms. Will still only allow 32 bits in a timestamp on Win64, but at least it won't crash, and it'll work right on platforms where longs are big enough to contain time_t's. (A better-working, although conceptually less-right fix would have been to use Py_ssize_t here, but Martin and Tim won't let me.) Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Wed Mar 1 02:01:55 2006 @@ -4190,13 +4190,14 @@ DBEnv_set_tx_timestamp(DBEnvObject* self, PyObject* args) { int err; - time_t stamp; + long stamp; + time_t timestamp; - if (!PyArg_ParseTuple(args, "i:set_tx_timestamp", &stamp)) + if (!PyArg_ParseTuple(args, "l:set_tx_timestamp", &stamp)) return NULL; CHECK_ENV_NOT_CLOSED(self); - - err = self->db_env->set_tx_timestamp(self->db_env, &stamp); + timestamp = (time_t)stamp; + err = self->db_env->set_tx_timestamp(self->db_env, ×tamp); RETURN_IF_ERR(); RETURN_NONE(); } From python-checkins at python.org Wed Mar 1 02:05:18 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 02:05:18 +0100 (CET) Subject: [Python-checkins] r42706 - python/trunk/Modules/posixmodule.c Message-ID: <20060301010518.4C38C1E401E@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 02:05:10 2006 New Revision: 42706 Modified: python/trunk/Modules/posixmodule.c Log: Py_ssize_t-ify. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Wed Mar 1 02:05:10 2006 @@ -13,6 +13,8 @@ /* See also ../Dos/dosmodule.c */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include "structseq.h" @@ -1759,7 +1761,7 @@ #define MAX_PATH CCHMAXPATH #endif char *name, *pt; - int len; + Py_ssize_t len; PyObject *d, *v; char namebuf[MAX_PATH+5]; HDIR hdir = 1; @@ -1899,7 +1901,7 @@ /* assume encoded strings wont more than double no of chars */ char inbuf[MAX_PATH*2]; char *inbufp = inbuf; - int insize = sizeof(inbuf)/sizeof(inbuf[0]); + Py_ssize_t insize; char outbuf[MAX_PATH*2]; char *temp; #ifdef Py_WIN_WIDE_FILENAMES @@ -1919,6 +1921,7 @@ PyErr_Clear(); } #endif + /* XXX(twouters) Why use 'et#' here at all? insize isn't used */ if (!PyArg_ParseTuple (args, "et#:_getfullpathname", Py_FileSystemDefaultEncoding, &inbufp, &insize)) @@ -5590,16 +5593,18 @@ static PyObject * posix_write(PyObject *self, PyObject *args) { - int fd, size; + int fd; + Py_ssize_t size; char *buffer; + if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size)) return NULL; Py_BEGIN_ALLOW_THREADS - size = write(fd, buffer, size); + size = write(fd, buffer, (size_t)size); Py_END_ALLOW_THREADS if (size < 0) return posix_error(); - return PyInt_FromLong((long)size); + return PyInt_FromSsize_t(size); } From python-checkins at python.org Wed Mar 1 02:16:10 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 02:16:10 +0100 (CET) Subject: [Python-checkins] r42707 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301011610.3762C1E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 02:16:09 2006 New Revision: 42707 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Cleaned up an XXX -- figured out what the code intended to do here, and did it. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 02:16:09 2006 @@ -318,8 +318,9 @@ usedpools[0] corresponds to blocks of size 8, usedpools[2] to blocks of size 16, and so on: index 2*i <-> blocks of size (i+1)<nextoffset <= pool->maxnextoffset) { - /* - * There is room for another block - */ - pool->freeblock = (block *)pool + + /* There is room for another block. */ + pool->freeblock = (block*)pool + pool->nextoffset; pool->nextoffset += INDEX2SIZE(size); *(block **)(pool->freeblock) = NULL; UNLOCK(); return (void *)bp; } - /* - * Pool is full, unlink from used pools - */ + /* Pool is full, unlink from used pools. */ next = pool->nextpool; pool = pool->prevpool; next->prevpool = pool; @@ -731,7 +728,7 @@ } /* There isn't a pool of the right size class immediately - * available: use a free pool from an arena. + * available: use a free pool. */ if (usable_arenas == NULL) { /* No arena has a free pool: allocate a new arena. */ @@ -775,15 +772,18 @@ } } else { + /* nfreepools > 0: it must be that freepools + * isn't NULL, or that we haven't yet carved + * off all the arena's pools for the first + * time. + */ assert(usable_arenas->freepools != NULL || usable_arenas->pool_address <= - ((block*) usable_arenas->address) + + (block*)usable_arenas->address + ARENA_SIZE - POOL_SIZE); } init_pool: - /* - * Frontlink to used pools - */ + /* Frontlink to used pools. */ next = usedpools[size + size]; /* == prev */ pool->nextpool = next; pool->prevpool = next; @@ -791,8 +791,7 @@ next->prevpool = pool; pool->ref.count = 1; if (pool->szidx == size) { - /* - * Luckily, this pool last contained blocks + /* Luckily, this pool last contained blocks * of the same size class, so its header * and free list are already initialized. */ @@ -816,24 +815,18 @@ UNLOCK(); return (void *)bp; } - /* Allocate new pool. */ + + /* Carve off a new pool. */ assert(usable_arenas->nfreepools > 0); - /* Verify that the arenabase address is in range. */ - /* XXX This assert appears to be equivalent to - assert(POOL_SIZE <= ARENA_SIZE); what's it - _trying_ to check? - */ - assert(usable_arenas->pool_address <= - usable_arenas->pool_address + - ARENA_SIZE - POOL_SIZE); + assert(usable_arenas->freepools == NULL); pool = (poolp)usable_arenas->pool_address; + assert((block*)pool <= (block*)usable_arenas->address + + ARENA_SIZE - POOL_SIZE); pool->arenaindex = usable_arenas - arenas; - assert(&arenas[pool->arenaindex] == - usable_arenas); + assert(&arenas[pool->arenaindex] == usable_arenas); pool->szidx = DUMMY_SIZE_IDX; - - --usable_arenas->nfreepools; usable_arenas->pool_address += POOL_SIZE; + --usable_arenas->nfreepools; if (usable_arenas->nfreepools == 0) { assert(usable_arenas->nextarena == NULL || From python-checkins at python.org Wed Mar 1 05:02:50 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 05:02:50 +0100 (CET) Subject: [Python-checkins] r42708 - python/trunk/Include/object.h Message-ID: <20060301040250.B75381E4021@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 05:02:43 2006 New Revision: 42708 Modified: python/trunk/Include/object.h Log: Make ob_refcnt and tp_maxalloc (and friends) Py_ssize_t. Modified: python/trunk/Include/object.h ============================================================================== --- python/trunk/Include/object.h (original) +++ python/trunk/Include/object.h Wed Mar 1 05:02:43 2006 @@ -77,7 +77,7 @@ /* PyObject_HEAD defines the initial segment of every PyObject. */ #define PyObject_HEAD \ _PyObject_HEAD_EXTRA \ - int ob_refcnt; \ + Py_ssize_t ob_refcnt; \ struct _typeobject *ob_type; #define PyObject_HEAD_INIT(type) \ @@ -333,9 +333,9 @@ #ifdef COUNT_ALLOCS /* these must be last and never explicitly initialized */ - int tp_allocs; - int tp_frees; - int tp_maxalloc; + Py_ssize_t tp_allocs; + Py_ssize_t tp_frees; + Py_ssize_t tp_maxalloc; struct _typeobject *tp_next; #endif } PyTypeObject; From python-checkins at python.org Wed Mar 1 05:04:31 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 05:04:31 +0100 (CET) Subject: [Python-checkins] r42709 - python/trunk/Parser/tokenizer.h Message-ID: <20060301040431.98D2A1E4018@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 05:04:20 2006 New Revision: 42709 Modified: python/trunk/Parser/tokenizer.h Log: Remove unused field. Modified: python/trunk/Parser/tokenizer.h ============================================================================== --- python/trunk/Parser/tokenizer.h (original) +++ python/trunk/Parser/tokenizer.h Wed Mar 1 05:04:20 2006 @@ -43,7 +43,6 @@ int decoding_state; /* -1:decoding, 0:init, 1:raw */ int decoding_erred; /* whether erred in decoding */ int read_coding_spec; /* whether 'coding:...' has been read */ - int issued_encoding_warning; /* whether non-ASCII warning was issued */ char *encoding; int cont_line; /* whether we are in a continuation line. */ #ifndef PGEN From python-checkins at python.org Wed Mar 1 05:06:15 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 05:06:15 +0100 (CET) Subject: [Python-checkins] r42710 - in python/trunk: Include/modsupport.h Python/getargs.c Message-ID: <20060301040615.E00511E4022@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 05:06:10 2006 New Revision: 42710 Modified: python/trunk/Include/modsupport.h python/trunk/Python/getargs.c Log: Use Py_ssize_t for PyArg_UnpackTuple arguments. Modified: python/trunk/Include/modsupport.h ============================================================================== --- python/trunk/Include/modsupport.h (original) +++ python/trunk/Include/modsupport.h Wed Mar 1 05:06:10 2006 @@ -25,7 +25,7 @@ PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, const char *, char **, ...); -PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, int, int, ...); +PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kw); Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Wed Mar 1 05:06:10 2006 @@ -1662,9 +1662,9 @@ int -PyArg_UnpackTuple(PyObject *args, const char *name, int min, int max, ...) +PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) { - int i, l; + Py_ssize_t i, l; PyObject **o; va_list vargs; From python-checkins at python.org Wed Mar 1 05:25:51 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 05:25:51 +0100 (CET) Subject: [Python-checkins] r42711 - in python/trunk: Include/pyerrors.h Lib/test/exception_hierarchy.txt Lib/test/output/test_logging Lib/test/test_coercion.py Lib/test/test_descr.py Lib/test/test_exceptions.py Lib/test/test_pep352.py Lib/traceback.py Lib/warnings.py Misc/NEWS Objects/genobject.c Python/ceval.c Python/codecs.c Python/errors.c Python/exceptions.c Python/pythonrun.c Message-ID: <20060301042551.47FE91E4002@bag.python.org> Author: brett.cannon Date: Wed Mar 1 05:25:17 2006 New Revision: 42711 Added: python/trunk/Lib/test/exception_hierarchy.txt (contents, props changed) python/trunk/Lib/test/test_pep352.py (contents, props changed) Modified: python/trunk/Include/pyerrors.h python/trunk/Lib/test/output/test_logging python/trunk/Lib/test/test_coercion.py python/trunk/Lib/test/test_descr.py python/trunk/Lib/test/test_exceptions.py python/trunk/Lib/traceback.py python/trunk/Lib/warnings.py python/trunk/Misc/NEWS python/trunk/Objects/genobject.c python/trunk/Python/ceval.c python/trunk/Python/codecs.c python/trunk/Python/errors.c python/trunk/Python/exceptions.c python/trunk/Python/pythonrun.c Log: PEP 352 implementation. Creates a new base class, BaseException, which has an added message attribute compared to the previous version of Exception. It is also a new-style class, making all exceptions now new-style. KeyboardInterrupt and SystemExit inherit from BaseException directly. String exceptions now raise DeprecationWarning. Applies patch 1104669, and closes bugs 1012952 and 518846. Modified: python/trunk/Include/pyerrors.h ============================================================================== --- python/trunk/Include/pyerrors.h (original) +++ python/trunk/Include/pyerrors.h Wed Mar 1 05:25:17 2006 @@ -26,9 +26,32 @@ PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); +/* */ +#define PyExceptionClass_Check(x) \ + (PyClass_Check((x)) \ + || (PyType_Check((x)) && PyType_IsSubtype( \ + (PyTypeObject*)(x), (PyTypeObject*)PyExc_BaseException))) + + +#define PyExceptionInstance_Check(x) \ + (PyInstance_Check((x)) || \ + (PyType_IsSubtype((x)->ob_type, (PyTypeObject*)PyExc_BaseException))) + +#define PyExceptionClass_Name(x) \ + (PyClass_Check((x)) \ + ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ + : (char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) \ + ((PyInstance_Check((x)) \ + ? (PyObject*)((PyInstanceObject*)(x))->in_class \ + : (PyObject*)((x)->ob_type))) + + /* Predefined exceptions */ +PyAPI_DATA(PyObject *) PyExc_BaseException; PyAPI_DATA(PyObject *) PyExc_Exception; PyAPI_DATA(PyObject *) PyExc_StopIteration; PyAPI_DATA(PyObject *) PyExc_GeneratorExit; Added: python/trunk/Lib/test/exception_hierarchy.txt ============================================================================== --- (empty file) +++ python/trunk/Lib/test/exception_hierarchy.txt Wed Mar 1 05:25:17 2006 @@ -0,0 +1,46 @@ +BaseException + +-- SystemExit + +-- KeyboardInterrupt + +-- Exception + +-- GeneratorExit + +-- StopIteration + +-- StandardError + | +-- ArithmeticError + | | +-- FloatingPointError + | | +-- OverflowError + | | +-- ZeroDivisionError + | +-- AssertionError + | +-- AttributeError + | +-- EnvironmentError + | | +-- IOError + | | +-- OSError + | | +-- WindowsError (Windows) + | +-- EOFError + | +-- ImportError + | +-- LookupError + | | +-- IndexError + | | +-- KeyError + | +-- MemoryError + | +-- NameError + | | +-- UnboundLocalError + | +-- ReferenceError + | +-- RuntimeError + | | +-- NotImplementedError + | +-- SyntaxError + | | +-- IndentationError + | | +-- TabError + | +-- SystemError + | +-- TypeError + | +-- ValueError + | | +-- UnicodeError + | | +-- UnicodeDecodeError + | | +-- UnicodeEncodeError + | | +-- UnicodeTranslateError + +-- Warning + +-- DeprecationWarning + +-- PendingDeprecationWarning + +-- RuntimeWarning + +-- SyntaxWarning + +-- UserWarning + +-- FutureWarning + +-- OverflowWarning [not generated by the interpreter] Modified: python/trunk/Lib/test/output/test_logging ============================================================================== --- python/trunk/Lib/test/output/test_logging (original) +++ python/trunk/Lib/test/output/test_logging Wed Mar 1 05:25:17 2006 @@ -488,12 +488,12 @@ -- log_test4 begin --------------------------------------------------- config0: ok. config1: ok. -config2: exceptions.AttributeError -config3: exceptions.KeyError +config2: +config3: -- log_test4 end --------------------------------------------------- -- log_test5 begin --------------------------------------------------- ERROR:root:just testing -exceptions.KeyError... Don't panic! +... Don't panic! -- log_test5 end --------------------------------------------------- -- logrecv output begin --------------------------------------------------- ERR -> CRITICAL: Message 0 (via logrecv.tcp.ERR) Modified: python/trunk/Lib/test/test_coercion.py ============================================================================== --- python/trunk/Lib/test/test_coercion.py (original) +++ python/trunk/Lib/test/test_coercion.py Wed Mar 1 05:25:17 2006 @@ -96,7 +96,7 @@ x = eval('a %s b' % op) except: error = sys.exc_info()[:2] - print '... %s' % error[0] + print '... %s.%s' % (error[0].__module__, error[0].__name__) else: print '=', format_result(x) try: @@ -108,7 +108,7 @@ exec('z %s= b' % op) except: error = sys.exc_info()[:2] - print '... %s' % error[0] + print '... %s.%s' % (error[0].__module__, error[0].__name__) else: print '=>', format_result(z) @@ -121,7 +121,7 @@ x = eval('%s(a, b)' % op) except: error = sys.exc_info()[:2] - print '... %s' % error[0] + print '... %s.%s' % (error[0].__module__, error[0].__name__) else: print '=', format_result(x) Modified: python/trunk/Lib/test/test_descr.py ============================================================================== --- python/trunk/Lib/test/test_descr.py (original) +++ python/trunk/Lib/test/test_descr.py Wed Mar 1 05:25:17 2006 @@ -3355,31 +3355,6 @@ vereq(NewClass.__doc__, 'object=None; type=NewClass') vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass') -def string_exceptions(): - if verbose: - print "Testing string exceptions ..." - - # Ensure builtin strings work OK as exceptions. - astring = "An exception string." - try: - raise astring - except astring: - pass - else: - raise TestFailed, "builtin string not usable as exception" - - # Ensure string subclass instances do not. - class MyStr(str): - pass - - newstring = MyStr("oops -- shouldn't work") - try: - raise newstring - except TypeError: - pass - except: - raise TestFailed, "string subclass allowed as exception" - def copy_setstate(): if verbose: print "Testing that copy.*copy() correctly uses __setstate__..." @@ -4172,7 +4147,6 @@ funnynew() imulbug() docdescriptor() - string_exceptions() copy_setstate() slices() subtype_resurrection() Modified: python/trunk/Lib/test/test_exceptions.py ============================================================================== --- python/trunk/Lib/test/test_exceptions.py (original) +++ python/trunk/Lib/test/test_exceptions.py Wed Mar 1 05:25:17 2006 @@ -29,10 +29,7 @@ def r(thing): test_raise_catch(thing) - if isinstance(thing, ClassType): - print thing.__name__ - else: - print thing + print getattr(thing, '__name__', thing) r(AttributeError) import sys Added: python/trunk/Lib/test/test_pep352.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_pep352.py Wed Mar 1 05:25:17 2006 @@ -0,0 +1,182 @@ +import unittest +import __builtin__ +import exceptions +import warnings +from test.test_support import run_unittest +import os +from platform import system as platform_system + +class ExceptionClassTests(unittest.TestCase): + + """Tests for anything relating to exception objects themselves (e.g., + inheritance hierarchy)""" + + def test_builtins_new_style(self): + self.failUnless(issubclass(Exception, object)) + + def verify_instance_interface(self, ins): + for attr in ("args", "message", "__str__", "__unicode__", "__repr__", + "__getitem__"): + self.failUnless(hasattr(ins, attr), "%s missing %s attribute" % + (ins.__class__.__name__, attr)) + + def test_inheritance(self): + # Make sure the inheritance hierarchy matches the documentation + exc_set = set(x for x in dir(exceptions) if not x.startswith('_')) + inheritance_tree = open(os.path.join(os.path.split(__file__)[0], + 'exception_hierarchy.txt')) + try: + superclass_name = inheritance_tree.readline().rstrip() + try: + last_exc = getattr(__builtin__, superclass_name) + except AttributeError: + self.fail("base class %s not a built-in" % superclass_name) + self.failUnless(superclass_name in exc_set) + exc_set.discard(superclass_name) + superclasses = [] # Loop will insert base exception + last_depth = 0 + for exc_line in inheritance_tree: + exc_line = exc_line.rstrip() + depth = exc_line.rindex('-') + exc_name = exc_line[depth+2:] # Slice past space + if '(' in exc_name: + paren_index = exc_name.index('(') + platform_name = exc_name[paren_index+1:-1] + if platform_system() != platform_name: + exc_set.discard(exc_name) + continue + if '[' in exc_name: + left_bracket = exc_name.index('[') + exc_name = exc_name[:left_bracket-1] # cover space + try: + exc = getattr(__builtin__, exc_name) + except AttributeError: + self.fail("%s not a built-in exception" % exc_name) + if last_depth < depth: + superclasses.append((last_depth, last_exc)) + elif last_depth > depth: + while superclasses[-1][0] >= depth: + superclasses.pop() + self.failUnless(issubclass(exc, superclasses[-1][1]), + "%s is not a subclass of %s" % (exc.__name__, + superclasses[-1][1].__name__)) + try: # Some exceptions require arguments; just skip them + self.verify_instance_interface(exc()) + except TypeError: + pass + self.failUnless(exc_name in exc_set) + exc_set.discard(exc_name) + last_exc = exc + last_depth = depth + finally: + inheritance_tree.close() + self.failUnlessEqual(len(exc_set), 0, "%s not accounted for" % exc_set) + + interface_tests = ("length", "args", "message", "str", "unicode", "repr", + "indexing") + + def interface_test_driver(self, results): + for test_name, (given, expected) in zip(self.interface_tests, results): + self.failUnlessEqual(given, expected, "%s: %s != %s" % (test_name, + given, expected)) + + def test_interface_single_arg(self): + # Make sure interface works properly when given a single argument + arg = "spam" + exc = Exception(arg) + results = ([len(exc.args), 1], [exc.args[0], arg], [exc.message, arg], + [str(exc), str(arg)], [unicode(exc), unicode(arg)], + [repr(exc), exc.__class__.__name__ + repr(exc.args)], [exc[0], arg]) + self.interface_test_driver(results) + + def test_interface_multi_arg(self): + # Make sure interface correct when multiple arguments given + arg_count = 3 + args = tuple(range(arg_count)) + exc = Exception(*args) + results = ([len(exc.args), arg_count], [exc.args, args], + [exc.message, ''], [str(exc), str(args)], + [unicode(exc), unicode(args)], + [repr(exc), exc.__class__.__name__ + repr(exc.args)], + [exc[-1], args[-1]]) + self.interface_test_driver(results) + + def test_interface_no_arg(self): + # Make sure that with no args that interface is correct + exc = Exception() + results = ([len(exc.args), 0], [exc.args, tuple()], [exc.message, ''], + [str(exc), ''], [unicode(exc), u''], + [repr(exc), exc.__class__.__name__ + '()'], [True, True]) + self.interface_test_driver(results) + +class UsageTests(unittest.TestCase): + + """Test usage of exceptions""" + + def setUp(self): + self._filters = warnings.filters[:] + + def tearDown(self): + warnings.filters = self._filters[:] + + def test_raise_classic(self): + class ClassicClass: + pass + try: + raise ClassicClass + except ClassicClass: + pass + except: + self.fail("unable to raise classic class") + try: + raise ClassicClass() + except ClassicClass: + pass + except: + self.fail("unable to raise class class instance") + + def test_raise_new_style_non_exception(self): + class NewStyleClass(object): + pass + try: + raise NewStyleClass + except TypeError: + pass + except: + self.fail("unable to raise new-style class") + try: + raise NewStyleClass() + except TypeError: + pass + except: + self.fail("unable to raise new-style class instance") + + def test_raise_string(self): + warnings.resetwarnings() + warnings.filterwarnings("error") + try: + raise "spam" + except DeprecationWarning: + pass + except: + self.fail("raising a string did not cause a DeprecationWarning") + + def test_catch_string(self): + # Test will be pertinent when catching exceptions raises a + # DeprecationWarning + warnings.filterwarnings("ignore", "raising") + str_exc = "spam" + try: + raise str_exc + except str_exc: + pass + except: + self.fail("catching a string exception failed") + +def test_main(): + run_unittest(ExceptionClassTests, UsageTests) + + + +if __name__ == '__main__': + test_main() Modified: python/trunk/Lib/traceback.py ============================================================================== --- python/trunk/Lib/traceback.py (original) +++ python/trunk/Lib/traceback.py Wed Mar 1 05:25:17 2006 @@ -157,7 +157,8 @@ which exception occurred is the always last string in the list. """ list = [] - if type(etype) == types.ClassType: + if (type(etype) == types.ClassType + or (isinstance(etype, type) and issubclass(etype, Exception))): stype = etype.__name__ else: stype = etype Modified: python/trunk/Lib/warnings.py ============================================================================== --- python/trunk/Lib/warnings.py (original) +++ python/trunk/Lib/warnings.py Wed Mar 1 05:25:17 2006 @@ -145,7 +145,8 @@ assert action in ("error", "ignore", "always", "default", "module", "once"), "invalid action: %r" % (action,) assert isinstance(message, basestring), "message must be a string" - assert isinstance(category, types.ClassType), "category must be a class" + assert isinstance(category, (type, types.ClassType)), \ + "category must be a class" assert issubclass(category, Warning), "category must be a Warning subclass" assert isinstance(module, basestring), "module must be a string" assert isinstance(lineno, int) and lineno >= 0, \ Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 1 05:25:17 2006 @@ -12,6 +12,11 @@ Core and builtins ----------------- +- PEP 352, patch #1104669: Make exceptions new-style objects. Introduced the + new exception base class, BaseException, which has a new message attribute. + KeyboardInterrupt and SystemExit to directly inherit from BaseException now. + Raising a string exception now raises a DeprecationWarning. + - Patch #1438387, PEP 328: relative and absolute imports. Imports can now be explicitly relative, using 'from .module import name' to mean 'from the same package as this module is in. Imports without dots still default to the Modified: python/trunk/Objects/genobject.c ============================================================================== --- python/trunk/Objects/genobject.c (original) +++ python/trunk/Objects/genobject.c Wed Mar 1 05:25:17 2006 @@ -230,11 +230,11 @@ Py_XINCREF(val); Py_XINCREF(tb); - if (PyClass_Check(typ)) { + if (PyExceptionClass_Check(typ)) { PyErr_NormalizeException(&typ, &val, &tb); } - else if (PyInstance_Check(typ)) { + else if (PyExceptionInstance_Check(typ)) { /* Raising an instance. The value should be a dummy. */ if (val && val != Py_None) { PyErr_SetString(PyExc_TypeError, @@ -245,7 +245,7 @@ /* Normalize to raise , */ Py_XDECREF(val); val = typ; - typ = (PyObject*) ((PyInstanceObject*)typ)->in_class; + typ = PyExceptionInstance_Class(typ); Py_INCREF(typ); } } Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Wed Mar 1 05:25:17 2006 @@ -1685,7 +1685,7 @@ why == WHY_CONTINUE) retval = POP(); } - else if (PyClass_Check(v) || PyString_Check(v)) { + else if (PyExceptionClass_Check(v) || PyString_Check(v)) { w = POP(); u = POP(); PyErr_Restore(v, w, u); @@ -3026,14 +3026,14 @@ /* Raising builtin string is deprecated but still allowed -- * do nothing. Raising an instance of a new-style str * subclass is right out. */ - if (-1 == PyErr_Warn(PyExc_PendingDeprecationWarning, + if (PyErr_Warn(PyExc_DeprecationWarning, "raising a string exception is deprecated")) goto raise_error; } - else if (PyClass_Check(type)) + else if (PyExceptionClass_Check(type)) PyErr_NormalizeException(&type, &value, &tb); - else if (PyInstance_Check(type)) { + else if (PyExceptionInstance_Check(type)) { /* Raising an instance. The value should be a dummy. */ if (value != Py_None) { PyErr_SetString(PyExc_TypeError, @@ -3044,7 +3044,7 @@ /* Normalize to raise , */ Py_DECREF(value); value = type; - type = (PyObject*) ((PyInstanceObject*)type)->in_class; + type = PyExceptionInstance_Class(type); Py_INCREF(type); } } Modified: python/trunk/Python/codecs.c ============================================================================== --- python/trunk/Python/codecs.c (original) +++ python/trunk/Python/codecs.c Wed Mar 1 05:25:17 2006 @@ -448,9 +448,8 @@ PyObject *PyCodec_StrictErrors(PyObject *exc) { - if (PyInstance_Check(exc)) - PyErr_SetObject((PyObject*)((PyInstanceObject*)exc)->in_class, - exc); + if (PyExceptionInstance_Check(exc)) + PyErr_SetObject(PyExceptionInstance_Class(exc), exc); else PyErr_SetString(PyExc_TypeError, "codec must pass exception instance"); return NULL; Modified: python/trunk/Python/errors.c ============================================================================== --- python/trunk/Python/errors.c (original) +++ python/trunk/Python/errors.c Wed Mar 1 05:25:17 2006 @@ -97,11 +97,14 @@ return 0; } /* err might be an instance, so check its class. */ - if (PyInstance_Check(err)) - err = (PyObject*)((PyInstanceObject*)err)->in_class; + if (PyExceptionInstance_Check(err)) + err = PyExceptionInstance_Class(err); - if (PyClass_Check(err) && PyClass_Check(exc)) - return PyClass_IsSubclass(err, exc); + if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { + /* problems here!? not sure PyObject_IsSubclass expects to + be called with an exception pending... */ + return PyObject_IsSubclass(err, exc); + } return err == exc; } @@ -138,19 +141,19 @@ Py_INCREF(value); } - if (PyInstance_Check(value)) - inclass = (PyObject*)((PyInstanceObject*)value)->in_class; + if (PyExceptionInstance_Check(value)) + inclass = PyExceptionInstance_Class(value); /* Normalize the exception so that if the type is a class, the value will be an instance. */ - if (PyClass_Check(type)) { + if (PyExceptionClass_Check(type)) { /* if the value was not an instance, or is not an instance whose class is (or is derived from) type, then use the value as an argument to instantiation of the type class. */ - if (!inclass || !PyClass_IsSubclass(inclass, type)) { + if (!inclass || !PyObject_IsSubclass(inclass, type)) { PyObject *args, *res; if (value == Py_None) @@ -282,7 +285,7 @@ { /* Note that the Win32 errors do not lineup with the errno error. So if the error is in the MSVC error - table, we use it, otherwise we assume it really _is_ + table, we use it, otherwise we assume it really _is_ a Win32 error code */ if (i > 0 && i < _sys_nerr) { @@ -302,7 +305,7 @@ 0, /* size not used */ NULL); /* no args */ if (len==0) { - /* Only ever seen this in out-of-mem + /* Only ever seen this in out-of-mem situations */ sprintf(s_small_buf, "Windows Error 0x%X", i); s = s_small_buf; @@ -345,8 +348,8 @@ PyObject * PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename) { - PyObject *name = filename ? - PyUnicode_FromUnicode(filename, wcslen(filename)) : + PyObject *name = filename ? + PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); Py_XDECREF(name); @@ -360,7 +363,7 @@ return PyErr_SetFromErrnoWithFilenameObject(exc, NULL); } -#ifdef MS_WINDOWS +#ifdef MS_WINDOWS /* Windows specific error code handling */ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( PyObject *exc, @@ -415,8 +418,8 @@ const char *filename) { PyObject *name = filename ? PyString_FromString(filename) : NULL; - PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, - ierr, + PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, + ierr, name); Py_XDECREF(name); return ret; @@ -428,11 +431,11 @@ int ierr, const Py_UNICODE *filename) { - PyObject *name = filename ? - PyUnicode_FromUnicode(filename, wcslen(filename)) : + PyObject *name = filename ? + PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; - PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, - ierr, + PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, + ierr, name); Py_XDECREF(name); return ret; @@ -466,8 +469,8 @@ int ierr, const Py_UNICODE *filename) { - PyObject *name = filename ? - PyUnicode_FromUnicode(filename, wcslen(filename)) : + PyObject *name = filename ? + PyUnicode_FromUnicode(filename, wcslen(filename)) : NULL; PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( PyExc_WindowsError, @@ -574,7 +577,24 @@ if (f != NULL) { PyFile_WriteString("Exception ", f); if (t) { - PyFile_WriteObject(t, f, Py_PRINT_RAW); + char* className = PyExceptionClass_Name(t); + PyObject* moduleName = + PyObject_GetAttrString(t, "__module__"); + + if (moduleName == NULL) + PyFile_WriteString("", f); + else { + char* modstr = PyString_AsString(moduleName); + if (modstr) + { + PyFile_WriteString(modstr, f); + PyFile_WriteString(".", f); + } + } + if (className == NULL) + PyFile_WriteString("", f); + else + PyFile_WriteString(className, f); if (v && v != Py_None) { PyFile_WriteString(": ", f); PyFile_WriteObject(v, f, 0); @@ -726,7 +746,7 @@ /* com_fetch_program_text will attempt to load the line of text that the exception refers to. If it fails, it will return NULL but will - not set an exception. + not set an exception. XXX The functionality of this function is quite similar to the functionality in tb_displayline() in traceback.c. Modified: python/trunk/Python/exceptions.c ============================================================================== --- python/trunk/Python/exceptions.c (original) +++ python/trunk/Python/exceptions.c Wed Mar 1 05:25:17 2006 @@ -11,6 +11,7 @@ * 98-08-19 fl created (for pyexe) * 00-02-08 fl updated for 1.5.2 * 26-May-2000 baw vetted for Python 1.6 + * XXX * * written by Fredrik Lundh * modifications, additions, cleanups, and proofreading by Barry Warsaw @@ -33,99 +34,19 @@ PyDoc_STRVAR(module__doc__, "Python's standard exception class hierarchy.\n\ \n\ -Before Python 1.5, the standard exceptions were all simple string objects.\n\ -In Python 1.5, the standard exceptions were converted to classes organized\n\ -into a relatively flat hierarchy. String-based standard exceptions were\n\ -optional, or used as a fallback if some problem occurred while importing\n\ -the exception module. With Python 1.6, optional string-based standard\n\ -exceptions were removed (along with the -X command line flag).\n\ -\n\ -The class exceptions were implemented in such a way as to be almost\n\ -completely backward compatible. Some tricky uses of IOError could\n\ -potentially have broken, but by Python 1.6, all of these should have\n\ -been fixed. As of Python 1.6, the class-based standard exceptions are\n\ -now implemented in C, and are guaranteed to exist in the Python\n\ -interpreter.\n\ -\n\ -Here is a rundown of the class hierarchy. The classes found here are\n\ -inserted into both the exceptions module and the `built-in' module. It is\n\ -recommended that user defined class based exceptions be derived from the\n\ -`Exception' class, although this is currently not enforced.\n" +Exceptions found here are defined both in the exceptions module and the \n\ +built-in namespace. It is recommended that user-defined exceptions inherit \n\ +from Exception.\n\ +" + /* keep string pieces "small" */ -"\n\ -Exception\n\ - |\n\ - +-- SystemExit\n\ - +-- StopIteration\n\ - +-- GeneratorExit\n\ - +-- StandardError\n\ - | |\n\ - | +-- KeyboardInterrupt\n\ - | +-- ImportError\n\ - | +-- EnvironmentError\n\ - | | |\n\ - | | +-- IOError\n\ - | | +-- OSError\n\ - | | |\n\ - | | +-- WindowsError\n\ - | | +-- VMSError\n\ - | |\n\ - | +-- EOFError\n\ - | +-- RuntimeError\n\ - | | |\n\ - | | +-- NotImplementedError\n\ - | |\n\ - | +-- NameError\n\ - | | |\n\ - | | +-- UnboundLocalError\n\ - | |\n\ - | +-- AttributeError\n\ - | +-- SyntaxError\n\ - | | |\n\ - | | +-- IndentationError\n\ - | | |\n\ - | | +-- TabError\n\ - | |\n\ - | +-- TypeError\n\ - | +-- AssertionError\n\ - | +-- LookupError\n\ - | | |\n\ - | | +-- IndexError\n\ - | | +-- KeyError\n\ - | |\n\ - | +-- ArithmeticError\n\ - | | |\n\ - | | +-- OverflowError\n\ - | | +-- ZeroDivisionError\n\ - | | +-- FloatingPointError\n\ - | |\n\ - | +-- ValueError\n\ - | | |\n\ - | | +-- UnicodeError\n\ - | | |\n\ - | | +-- UnicodeEncodeError\n\ - | | +-- UnicodeDecodeError\n\ - | | +-- UnicodeTranslateError\n\ - | |\n\ - | +-- ReferenceError\n\ - | +-- SystemError\n\ - | +-- MemoryError\n\ - |\n\ - +---Warning\n\ - |\n\ - +-- UserWarning\n\ - +-- DeprecationWarning\n\ - +-- PendingDeprecationWarning\n\ - +-- SyntaxWarning\n\ - +-- OverflowWarning\n\ - +-- RuntimeWarning\n\ - +-- FutureWarning" +/* XXX exception hierarchy from Lib/test/exception_hierarchy.txt */ ); /* Helper function for populating a dictionary with method wrappers. */ static int -populate_methods(PyObject *klass, PyObject *dict, PyMethodDef *methods) +populate_methods(PyObject *klass, PyMethodDef *methods) { PyObject *module; int status = -1; @@ -151,7 +72,7 @@ } /* add method to dictionary */ - status = PyDict_SetItemString(dict, methods->ml_name, meth); + status = PyObject_SetAttrString(klass, methods->ml_name, meth); Py_DECREF(meth); Py_DECREF(func); @@ -196,7 +117,7 @@ if (!(*klass = PyErr_NewException(name, base, dict))) goto finally; - if (populate_methods(*klass, dict, methods)) { + if (populate_methods(*klass, methods)) { Py_DECREF(*klass); *klass = NULL; goto finally; @@ -232,47 +153,81 @@ /* Notes on bootstrapping the exception classes. * * First thing we create is the base class for all exceptions, called - * appropriately enough: Exception. Creation of this class makes no + * appropriately BaseException. Creation of this class makes no * assumptions about the existence of any other exception class -- except * for TypeError, which can conditionally exist. * - * Next, StandardError is created (which is quite simple) followed by + * Next, Exception is created since it is the common subclass for the rest of + * the needed exceptions for this bootstrapping to work. StandardError is + * created (which is quite simple) followed by * TypeError, because the instantiation of other exceptions can potentially * throw a TypeError. Once these exceptions are created, all the others * can be created in any order. See the static exctable below for the * explicit bootstrap order. * - * All classes after Exception can be created using PyErr_NewException(). + * All classes after BaseException can be created using PyErr_NewException(). */ -PyDoc_STRVAR(Exception__doc__, "Common base class for all exceptions."); +PyDoc_STRVAR(BaseException__doc__, "Common base class for all exceptions"); +/* + Set args and message attributes. -static PyObject * -Exception__init__(PyObject *self, PyObject *args) + Assumes self and args have already been set properly with set_self, etc. +*/ +static int +set_args_and_message(PyObject *self, PyObject *args) { - int status; + PyObject *message_val; + Py_ssize_t args_len = PySequence_Length(args); + + if (args_len < 0) + return 0; + + /* set args */ + if (PyObject_SetAttrString(self, "args", args) < 0) + return 0; + + /* set message */ + if (args_len == 1) + message_val = PySequence_GetItem(args, 0); + else + message_val = PyString_FromString(""); + if (!message_val) + return 0; + + if (PyObject_SetAttrString(self, "message", message_val) < 0) { + Py_DECREF(message_val); + return 0; + } + + Py_DECREF(message_val); + return 1; +} +static PyObject * +BaseException__init__(PyObject *self, PyObject *args) +{ if (!(self = get_self(args))) return NULL; - /* set args attribute */ - /* XXX size is only a hint */ - args = PySequence_GetSlice(args, 1, PySequence_Size(args)); + /* set args and message attribute */ + args = PySequence_GetSlice(args, 1, PySequence_Length(args)); if (!args) return NULL; - status = PyObject_SetAttrString(self, "args", args); - Py_DECREF(args); - if (status < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; + } + + Py_DECREF(args); + Py_RETURN_NONE; } static PyObject * -Exception__str__(PyObject *self, PyObject *args) +BaseException__str__(PyObject *self, PyObject *args) { PyObject *out; @@ -310,9 +265,116 @@ return out; } +#ifdef Py_USING_UNICODE +static PyObject * +BaseException__unicode__(PyObject *self, PyObject *args) +{ + Py_ssize_t args_len; + + if (!PyArg_ParseTuple(args, "O:__unicode__", &self)) + return NULL; + + args = PyObject_GetAttrString(self, "args"); + if (!args) + return NULL; + + args_len = PySequence_Size(args); + if (args_len < 0) { + Py_DECREF(args); + return NULL; + } + + if (args_len == 0) { + Py_DECREF(args); + return PyUnicode_FromUnicode(NULL, 0); + } + else if (args_len == 1) { + PyObject *temp = PySequence_GetItem(args, 0); + if (!temp) { + Py_DECREF(args); + return NULL; + } + Py_DECREF(args); + return PyObject_Unicode(temp); + } + else { + Py_DECREF(args); + return PyObject_Unicode(args); + } +} +#endif /* Py_USING_UNICODE */ + +static PyObject * +BaseException__repr__(PyObject *self, PyObject *args) +{ + PyObject *args_attr; + Py_ssize_t args_len; + PyObject *repr_suffix; + PyObject *repr; + + if (!PyArg_ParseTuple(args, "O:__repr__", &self)) + return NULL; + + args_attr = PyObject_GetAttrString(self, "args"); + if (!args_attr) + return NULL; + + args_len = PySequence_Length(args_attr); + if (args_len < 0) { + Py_DECREF(args_attr); + return NULL; + } + + if (args_len == 0) { + Py_DECREF(args_attr); + repr_suffix = PyString_FromString("()"); + if (!repr_suffix) + return NULL; + } + else { + PyObject *args_repr; + /*PyObject *right_paren; + + repr_suffix = PyString_FromString("(*"); + if (!repr_suffix) { + Py_DECREF(args_attr); + return NULL; + }*/ + + args_repr = PyObject_Repr(args_attr); + Py_DECREF(args_attr); + if (!args_repr) + return NULL; + + repr_suffix = args_repr; + + /*PyString_ConcatAndDel(&repr_suffix, args_repr); + if (!repr_suffix) + return NULL; + + right_paren = PyString_FromString(")"); + if (!right_paren) { + Py_DECREF(repr_suffix); + return NULL; + } + + PyString_ConcatAndDel(&repr_suffix, right_paren); + if (!repr_suffix) + return NULL;*/ + } + + repr = PyString_FromString(self->ob_type->tp_name); + if (!repr) { + Py_DECREF(repr_suffix); + return NULL; + } + + PyString_ConcatAndDel(&repr, repr_suffix); + return repr; +} static PyObject * -Exception__getitem__(PyObject *self, PyObject *args) +BaseException__getitem__(PyObject *self, PyObject *args) { PyObject *out; PyObject *index; @@ -331,21 +393,27 @@ static PyMethodDef -Exception_methods[] = { - /* methods for the Exception class */ - { "__getitem__", Exception__getitem__, METH_VARARGS}, - { "__str__", Exception__str__, METH_VARARGS}, - { "__init__", Exception__init__, METH_VARARGS}, - { NULL, NULL } +BaseException_methods[] = { + /* methods for the BaseException class */ + {"__getitem__", BaseException__getitem__, METH_VARARGS}, + {"__repr__", BaseException__repr__, METH_VARARGS}, + {"__str__", BaseException__str__, METH_VARARGS}, +#ifdef Py_USING_UNICODE + {"__unicode__", BaseException__unicode__, METH_VARARGS}, +#endif /* Py_USING_UNICODE */ + {"__init__", BaseException__init__, METH_VARARGS}, + {NULL, NULL } }; static int -make_Exception(char *modulename) +make_BaseException(char *modulename) { PyObject *dict = PyDict_New(); PyObject *str = NULL; PyObject *name = NULL; + PyObject *emptytuple = NULL; + PyObject *argstuple = NULL; int status = -1; if (!dict) @@ -360,20 +428,28 @@ if (PyDict_SetItemString(dict, "__module__", str)) goto finally; Py_DECREF(str); - if (!(str = PyString_FromString(Exception__doc__))) + + if (!(str = PyString_FromString(BaseException__doc__))) goto finally; if (PyDict_SetItemString(dict, "__doc__", str)) goto finally; - if (!(name = PyString_FromString("Exception"))) + if (!(name = PyString_FromString("BaseException"))) goto finally; - if (!(PyExc_Exception = PyClass_New(NULL, dict, name))) + if (!(emptytuple = PyTuple_New(0))) + goto finally; + + if (!(argstuple = PyTuple_Pack(3, name, emptytuple, dict))) + goto finally; + + if (!(PyExc_BaseException = PyType_Type.tp_new(&PyType_Type, argstuple, + NULL))) goto finally; /* Now populate the dictionary with the method suite */ - if (populate_methods(PyExc_Exception, dict, Exception_methods)) - /* Don't need to reclaim PyExc_Exception here because that'll + if (populate_methods(PyExc_BaseException, BaseException_methods)) + /* Don't need to reclaim PyExc_BaseException here because that'll * happen during interpreter shutdown. */ goto finally; @@ -384,13 +460,18 @@ Py_XDECREF(dict); Py_XDECREF(str); Py_XDECREF(name); + Py_XDECREF(emptytuple); + Py_XDECREF(argstuple); return status; } +PyDoc_STRVAR(Exception__doc__, "Common base class for all non-exit exceptions."); + PyDoc_STRVAR(StandardError__doc__, -"Base class for all standard Python exceptions."); +"Base class for all standard Python exceptions that do not represent" +"interpreter exiting."); PyDoc_STRVAR(TypeError__doc__, "Inappropriate argument type."); @@ -411,14 +492,12 @@ if (!(self = get_self(args))) return NULL; - /* Set args attribute. */ if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args)))) return NULL; - status = PyObject_SetAttrString(self, "args", args); - if (status < 0) { - Py_DECREF(args); - return NULL; + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; } /* set code attribute */ @@ -445,8 +524,7 @@ if (status < 0) return NULL; - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } @@ -482,8 +560,12 @@ if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args)))) return NULL; - if (PyObject_SetAttrString(self, "args", args) || - PyObject_SetAttrString(self, "errno", Py_None) || + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; + } + + if (PyObject_SetAttrString(self, "errno", Py_None) || PyObject_SetAttrString(self, "strerror", Py_None) || PyObject_SetAttrString(self, "filename", Py_None)) { @@ -624,9 +706,9 @@ * return StandardError.__str__(self) * * but there is no StandardError__str__() function; we happen to - * know that's just a pass through to Exception__str__(). + * know that's just a pass through to BaseException__str__(). */ - rtnval = Exception__str__(originalself, args); + rtnval = BaseException__str__(originalself, args); finally: Py_XDECREF(filename); @@ -712,8 +794,10 @@ if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args)))) return NULL; - if (PyObject_SetAttrString(self, "args", args)) - goto finally; + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; + } lenargs = PySequence_Size(args); if (lenargs >= 1) { @@ -879,8 +963,9 @@ if (!PyArg_ParseTuple(args, "O:__str__", &self)) return NULL; - if (!(argsattr = PyObject_GetAttrString(self, "args"))) - return NULL; + argsattr = PyObject_GetAttrString(self, "args"); + if (!argsattr) + return NULL; /* If args is a tuple of exactly one item, apply repr to args[0]. This is done so that e.g. the exception raised by {}[''] prints @@ -889,14 +974,14 @@ KeyError alone. The downside is that if KeyError is raised with an explanatory string, that string will be displayed in quotes. Too bad. - If args is anything else, use the default Exception__str__(). + If args is anything else, use the default BaseException__str__(). */ if (PyTuple_Check(argsattr) && PyTuple_GET_SIZE(argsattr) == 1) { PyObject *key = PyTuple_GET_ITEM(argsattr, 0); result = PyObject_Repr(key); } else - result = Exception__str__(self, args); + result = BaseException__str__(self, args); Py_DECREF(argsattr); return result; @@ -1193,6 +1278,11 @@ if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args)))) return NULL; + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; + } + if (!PyArg_ParseTuple(args, "O!O!O!O!O!", &PyString_Type, &encoding, objecttype, &object, @@ -1201,9 +1291,6 @@ &PyString_Type, &reason)) goto finally; - if (PyObject_SetAttrString(self, "args", args)) - goto finally; - if (PyObject_SetAttrString(self, "encoding", encoding)) goto finally; if (PyObject_SetAttrString(self, "object", object)) @@ -1405,6 +1492,11 @@ if (!(args = PySequence_GetSlice(args, 1, PySequence_Size(args)))) return NULL; + if (!set_args_and_message(self, args)) { + Py_DECREF(args); + return NULL; + } + if (!PyArg_ParseTuple(args, "O!O!O!O!", &PyUnicode_Type, &object, &PyInt_Type, &start, @@ -1412,9 +1504,6 @@ &PyString_Type, &reason)) goto finally; - if (PyObject_SetAttrString(self, "args", args)) - goto finally; - if (PyObject_SetAttrString(self, "object", object)) goto finally; if (PyObject_SetAttrString(self, "start", start)) @@ -1424,8 +1513,8 @@ if (PyObject_SetAttrString(self, "reason", reason)) goto finally; - Py_INCREF(Py_None); rtnval = Py_None; + Py_INCREF(rtnval); finally: Py_DECREF(args); @@ -1591,6 +1680,7 @@ /* Global C API defined exceptions */ +PyObject *PyExc_BaseException; PyObject *PyExc_Exception; PyObject *PyExc_StopIteration; PyObject *PyExc_GeneratorExit; @@ -1636,7 +1726,7 @@ #endif /* Pre-computed MemoryError instance. Best to create this as early as - * possibly and not wait until a MemoryError is actually raised! + * possible and not wait until a MemoryError is actually raised! */ PyObject *PyExc_MemoryErrorInst; @@ -1663,9 +1753,10 @@ int (*classinit)(PyObject *); } exctable[] = { /* - * The first three classes MUST appear in exactly this order + * The first four classes MUST appear in exactly this order */ - {"Exception", &PyExc_Exception}, + {"BaseException", &PyExc_BaseException}, + {"Exception", &PyExc_Exception, &PyExc_BaseException, Exception__doc__}, {"StopIteration", &PyExc_StopIteration, &PyExc_Exception, StopIteration__doc__}, {"GeneratorExit", &PyExc_GeneratorExit, &PyExc_Exception, @@ -1676,9 +1767,10 @@ /* * The rest appear in depth-first order of the hierarchy */ - {"SystemExit", &PyExc_SystemExit, &PyExc_Exception, SystemExit__doc__, + {"SystemExit", &PyExc_SystemExit, &PyExc_BaseException, SystemExit__doc__, SystemExit_methods}, - {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 0, KeyboardInterrupt__doc__}, + {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, &PyExc_BaseException, + KeyboardInterrupt__doc__}, {"ImportError", &PyExc_ImportError, 0, ImportError__doc__}, {"EnvironmentError", &PyExc_EnvironmentError, 0, EnvironmentError__doc__, EnvironmentError_methods}, @@ -1786,11 +1878,11 @@ } /* This is the base class of all exceptions, so make it first. */ - if (make_Exception(modulename) || - PyDict_SetItemString(mydict, "Exception", PyExc_Exception) || - PyDict_SetItemString(bdict, "Exception", PyExc_Exception)) + if (make_BaseException(modulename) || + PyDict_SetItemString(mydict, "BaseException", PyExc_BaseException) || + PyDict_SetItemString(bdict, "BaseException", PyExc_BaseException)) { - Py_FatalError("Base class `Exception' could not be created."); + Py_FatalError("Base class `BaseException' could not be created."); } /* Now we can programmatically create all the remaining exceptions. Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Wed Mar 1 05:25:17 2006 @@ -976,7 +976,7 @@ fflush(stdout); if (value == NULL || value == Py_None) goto done; - if (PyInstance_Check(value)) { + if (PyExceptionInstance_Check(value)) { /* The error code should be in the `code' attribute. */ PyObject *code = PyObject_GetAttrString(value, "code"); if (code) { @@ -1106,11 +1106,10 @@ if (err) { /* Don't do anything else */ } - else if (PyClass_Check(exception)) { - PyClassObject* exc = (PyClassObject*)exception; - PyObject* className = exc->cl_name; + else if (PyExceptionClass_Check(exception)) { + char* className = PyExceptionClass_Name(exception); PyObject* moduleName = - PyDict_GetItemString(exc->cl_dict, "__module__"); + PyObject_GetAttrString(exception, "__module__"); if (moduleName == NULL) err = PyFile_WriteString("", f); @@ -1126,8 +1125,7 @@ if (className == NULL) err = PyFile_WriteString("", f); else - err = PyFile_WriteObject(className, f, - Py_PRINT_RAW); + err = PyFile_WriteString(className, f); } } else From python-checkins at python.org Wed Mar 1 05:28:45 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 05:28:45 +0100 (CET) Subject: [Python-checkins] r42712 - in python/trunk/Misc: NEWS Vim/vim_syntax.py Message-ID: <20060301042845.911D61E4002@bag.python.org> Author: brett.cannon Date: Wed Mar 1 05:28:00 2006 New Revision: 42712 Modified: python/trunk/Misc/NEWS python/trunk/Misc/Vim/vim_syntax.py Log: Add Misc/NEWS entry for Misc/Vim/vim_syntax.py . Also use conditional expression for the hell of it. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 1 05:28:00 2006 @@ -911,6 +911,10 @@ Tools/Demos ----------- +- Created Misc/Vim/vim_syntax.py to auto-generate a python.vim file in that + directory for syntax highlighting in Vim. Vim directory was added and placed + vimrc to it (was previous up a level). + - Added two new files to Tools/scripts: pysource.py, which recursively finds Python source files, and findnocoding.py, which finds Python source files that need an encoding declaration. Modified: python/trunk/Misc/Vim/vim_syntax.py ============================================================================== --- python/trunk/Misc/Vim/vim_syntax.py (original) +++ python/trunk/Misc/Vim/vim_syntax.py Wed Mar 1 05:28:00 2006 @@ -65,10 +65,7 @@ skip = skip_regex.substitute(sep=separator) else: skip = '' - if not raw: - contains = 'contains=pythonEscape' - else: - contains = '' + contains = 'contains=pythonEscape' if not raw else '' yield regex_template.substitute(raw=raw, sep=separator, skip=skip, contains = contains) From python-checkins at python.org Wed Mar 1 05:35:50 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 05:35:50 +0100 (CET) Subject: [Python-checkins] r42713 - python/trunk/Modules/posixmodule.c Message-ID: <20060301043550.5C3761E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 05:35:45 2006 New Revision: 42713 Modified: python/trunk/Modules/posixmodule.c Log: Repair mangled code in the Windows flavor of posix__getfullpathname(). In partial answer to the now-deleted XXX comment: /* XXX(twouters) Why use 'et#' here at all? insize isn't used */ `insize` is an input parameter too, and it was left uninitialized, leading to seemingly random failures. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Wed Mar 1 05:35:45 2006 @@ -1901,7 +1901,7 @@ /* assume encoded strings wont more than double no of chars */ char inbuf[MAX_PATH*2]; char *inbufp = inbuf; - Py_ssize_t insize; + Py_ssize_t insize = sizeof(inbuf); char outbuf[MAX_PATH*2]; char *temp; #ifdef Py_WIN_WIDE_FILENAMES @@ -1921,7 +1921,6 @@ PyErr_Clear(); } #endif - /* XXX(twouters) Why use 'et#' here at all? insize isn't used */ if (!PyArg_ParseTuple (args, "et#:_getfullpathname", Py_FileSystemDefaultEncoding, &inbufp, &insize)) From python-checkins at python.org Wed Mar 1 05:48:54 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 05:48:54 +0100 (CET) Subject: [Python-checkins] r42714 - peps/trunk/pep-0000.txt peps/trunk/pep-0352.txt Message-ID: <20060301044854.A6CEB1E4002@bag.python.org> Author: brett.cannon Date: Wed Mar 1 05:48:52 2006 New Revision: 42714 Modified: peps/trunk/pep-0000.txt peps/trunk/pep-0352.txt Log: Change status of PEP 352 to final. Also clarified wording to reflect the implementation; only exceptions are new-style class. Wording was ambiguous and suggested that you could raise any new-style class which was considered insane by everyone at the core sprint at PyCon 2006. And, most importantly, a Tim-channeled Guido thought that the current implementation was the way to go. No one should be able to ``raise 42``. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Wed Mar 1 05:48:52 2006 @@ -67,7 +67,6 @@ SA 328 Imports: Multi-Line and Absolute/Relative Aahz SA 343 The "with" Statement GvR, Coghlan - SA 352 Required Superclass for Exceptions GvR, Cannon Open PEPs (under consideration) @@ -166,6 +165,7 @@ SF 327 Decimal Data Type Batista SF 341 Unifying try-except and try-finally Brandl SF 342 Coroutines via Enhanced Generators GvR, Eby + SF 352 Required Superclass for Exceptions GvR, Cannon SF 353 Using ssize_t as the index type von Loewis Empty PEPs (or containing only an abstract) Modified: peps/trunk/pep-0352.txt ============================================================================== --- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Wed Mar 1 05:48:52 2006 @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Brett Cannon , Guido van Rossum -Status: Accepted +Status: Final Type: Standards Track Content-Type: text/x-rst Created: 27-Oct-2005 @@ -16,10 +16,11 @@ In Python 2.4 and before, any (classic) class can be raised as an exception. The plan is to allow new-style classes starting in Python 2.5, but this makes the problem worse -- it would mean *any* class (or -instance) can be raised! This is a problem since it prevents any -guarantees to be made about the interface of exceptions. This PEP -proposes introducing a new superclass that all raised objects must -inherit from. Imposing the restriction will allow a standard +instance) can be raised (this is not the case in the final version; +only built-in exceptions can be new-style)! This is a problem since it +prevents any guarantees to be made about the interface of exceptions. +This PEP proposes introducing a new superclass that all raised objects +must inherit from. Imposing the restriction will allow a standard interface for exceptions to exist that can be relied upon. One might counter that requiring a specific base class for a @@ -86,8 +87,6 @@ def __repr__(self): if not self.args: argss = "()" - elif len(self.args) <= 1: - argss = "(%s)" % repr(self.message) else: argss = repr(self.args) return self.__class__.__name__ + argss @@ -208,8 +207,6 @@ * Python 2.5 - - allow exceptions to be new-style classes - - all standard exceptions become new-style classes - introduce BaseException @@ -248,12 +245,7 @@ Implementation ============== -An initial patch to make exceptions new-style classes has been -authored by Michael Hudson can be found at SF patch #1104669 -[#SF_1104669]_. While it does not implement all points mentioned in -this PEP, it will most likely be used as a basis for the final path -to implement this PEP. - +The initial implementation of this PEP has been checked into Python 2.5 . References ========== From python-checkins at python.org Wed Mar 1 06:16:15 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 06:16:15 +0100 (CET) Subject: [Python-checkins] r42715 - python/trunk/Doc/api/abstract.tex python/trunk/Doc/api/concrete.tex python/trunk/Doc/api/exceptions.tex python/trunk/Doc/api/init.tex python/trunk/Doc/api/newtypes.tex python/trunk/Doc/api/utilities.tex Message-ID: <20060301051615.7AD611E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 06:16:03 2006 New Revision: 42715 Modified: python/trunk/Doc/api/abstract.tex python/trunk/Doc/api/concrete.tex python/trunk/Doc/api/exceptions.tex python/trunk/Doc/api/init.tex python/trunk/Doc/api/newtypes.tex python/trunk/Doc/api/utilities.tex Log: Make documentation match the implementation. Modified: python/trunk/Doc/api/abstract.tex ============================================================================== --- python/trunk/Doc/api/abstract.tex (original) +++ python/trunk/Doc/api/abstract.tex Wed Mar 1 06:16:03 2006 @@ -16,7 +16,7 @@ object is written instead of the \function{repr()}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyObject_HasAttrString}{PyObject *o, char *attr_name} +\begin{cfuncdesc}{int}{PyObject_HasAttrString}{PyObject *o, const char *attr_name} Returns \code{1} if \var{o} has the attribute \var{attr_name}, and \code{0} otherwise. This is equivalent to the Python expression \samp{hasattr(\var{o}, \var{attr_name})}. This function always @@ -24,7 +24,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyObject_GetAttrString}{PyObject *o, - char *attr_name} + const char *attr_name} Retrieve an attribute named \var{attr_name} from object \var{o}. Returns the attribute value on success, or \NULL{} on failure. This is the equivalent of the Python expression @@ -50,7 +50,7 @@ \begin{cfuncdesc}{int}{PyObject_SetAttrString}{PyObject *o, - char *attr_name, PyObject *v} + const char *attr_name, PyObject *v} Set the value of the attribute named \var{attr_name}, for object \var{o}, to the value \var{v}. Returns \code{-1} on failure. This is the equivalent of the Python statement @@ -67,7 +67,7 @@ \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyObject_DelAttrString}{PyObject *o, char *attr_name} +\begin{cfuncdesc}{int}{PyObject_DelAttrString}{PyObject *o, const char *attr_name} Delete attribute named \var{attr_name}, for object \var{o}. Returns \code{-1} on failure. This is the equivalent of the Python statement: \samp{del \var{o}.\var{attr_name}}. @@ -301,7 +301,7 @@ \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyObject_Hash}{PyObject *o} +\begin{cfuncdesc}{long}{PyObject_Hash}{PyObject *o} Compute and return the hash value of an object \var{o}. On failure, return \code{-1}. This is the equivalent of the Python expression \samp{hash(\var{o})}.\bifuncindex{hash} @@ -340,8 +340,8 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyObject_Length}{PyObject *o} -\cfuncline{int}{PyObject_Size}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PyObject_Length}{PyObject *o} +\cfuncline{Py_ssize_t}{PyObject_Size}{PyObject *o} Return the length of object \var{o}. If the object \var{o} provides either the sequence and mapping protocols, the sequence length is returned. On error, \code{-1} is returned. This is the equivalent @@ -697,14 +697,14 @@ \code{0} otherwise. This function always succeeds. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_Size}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PySequence_Size}{PyObject *o} Returns the number of objects in sequence \var{o} on success, and \code{-1} on failure. For objects that do not provide sequence protocol, this is equivalent to the Python expression \samp{len(\var{o})}.\bifuncindex{len} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_Length}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PySequence_Length}{PyObject *o} Alternate name for \cfunction{PySequence_Size()}. \end{cfuncdesc} @@ -715,7 +715,7 @@ \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_Repeat}{PyObject *o, int count} +\begin{cfuncdesc}{PyObject*}{PySequence_Repeat}{PyObject *o, Py_ssize_t count} Return the result of repeating sequence object \var{o} \var{count} times, or \NULL{} on failure. This is the equivalent of the Python expression \samp{\var{o} * \var{count}}. @@ -730,7 +730,7 @@ \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_InPlaceRepeat}{PyObject *o, int count} +\begin{cfuncdesc}{PyObject*}{PySequence_InPlaceRepeat}{PyObject *o, Py_ssize_t count} Return the result of repeating sequence object \var{o} \var{count} times, or \NULL{} on failure. The operation is done \emph{in-place} when \var{o} supports it. This is the equivalent of the Python @@ -738,41 +738,41 @@ \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_GetItem}{PyObject *o, int i} +\begin{cfuncdesc}{PyObject*}{PySequence_GetItem}{PyObject *o, Py_ssize_t i} Return the \var{i}th element of \var{o}, or \NULL{} on failure. This is the equivalent of the Python expression \samp{\var{o}[\var{i}]}. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_GetSlice}{PyObject *o, int i1, int i2} +\begin{cfuncdesc}{PyObject*}{PySequence_GetSlice}{PyObject *o, Py_ssize_t i1, Py_ssize_t i2} Return the slice of sequence object \var{o} between \var{i1} and \var{i2}, or \NULL{} on failure. This is the equivalent of the Python expression \samp{\var{o}[\var{i1}:\var{i2}]}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_SetItem}{PyObject *o, int i, PyObject *v} +\begin{cfuncdesc}{int}{PySequence_SetItem}{PyObject *o, Py_ssize_t i, PyObject *v} Assign object \var{v} to the \var{i}th element of \var{o}. Returns \code{-1} on failure. This is the equivalent of the Python statement \samp{\var{o}[\var{i}] = \var{v}}. This function \emph{does not} steal a reference to \var{v}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_DelItem}{PyObject *o, int i} +\begin{cfuncdesc}{int}{PySequence_DelItem}{PyObject *o, Py_ssize_t i} Delete the \var{i}th element of object \var{o}. Returns \code{-1} on failure. This is the equivalent of the Python statement \samp{del \var{o}[\var{i}]}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_SetSlice}{PyObject *o, int i1, - int i2, PyObject *v} +\begin{cfuncdesc}{int}{PySequence_SetSlice}{PyObject *o, Py_ssize_t i1, + Py_ssize_t i2, PyObject *v} Assign the sequence object \var{v} to the slice in sequence object \var{o} from \var{i1} to \var{i2}. This is the equivalent of the Python statement \samp{\var{o}[\var{i1}:\var{i2}] = \var{v}}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySequence_DelSlice}{PyObject *o, int i1, int i2} +\begin{cfuncdesc}{int}{PySequence_DelSlice}{PyObject *o, Py_ssize_t i1, Py_ssize_t i2} Delete the slice in sequence object \var{o} from \var{i1} to \var{i2}. Returns \code{-1} on failure. This is the equivalent of the Python statement \samp{del \var{o}[\var{i1}:\var{i2}]}. @@ -821,7 +821,7 @@ text. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_Fast_GET_ITEM}{PyObject *o, int i} +\begin{cfuncdesc}{PyObject*}{PySequence_Fast_GET_ITEM}{PyObject *o, Py_ssize_t i} Return the \var{i}th element of \var{o}, assuming that \var{o} was returned by \cfunction{PySequence_Fast()}, \var{o} is not \NULL, and that \var{i} is within bounds. @@ -834,7 +834,7 @@ \versionadded{2.4} \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PySequence_ITEM}{PyObject *o, int i} +\begin{cfuncdesc}{PyObject*}{PySequence_ITEM}{PyObject *o, Py_ssize_t i} Return the \var{i}th element of \var{o} or \NULL{} on failure. Macro form of \cfunction{PySequence_GetItem()} but without checking that \cfunction{PySequence_Check(\var{o})} is true and without @@ -860,7 +860,7 @@ \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyMapping_Length}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PyMapping_Length}{PyObject *o} Returns the number of keys in object \var{o} on success, and \code{-1} on failure. For objects that do not provide mapping protocol, this is equivalent to the Python expression @@ -986,7 +986,7 @@ \begin{cfuncdesc}{int}{PyObject_AsCharBuffer}{PyObject *obj, const char **buffer, - int *buffer_len} + Py_ssize_t *buffer_len} Returns a pointer to a read-only memory location useable as character- based input. The \var{obj} argument must support the single-segment character buffer interface. On success, returns \code{0}, sets @@ -997,7 +997,7 @@ \begin{cfuncdesc}{int}{PyObject_AsReadBuffer}{PyObject *obj, const void **buffer, - int *buffer_len} + Py_ssize_t *buffer_len} Returns a pointer to a read-only memory location containing arbitrary data. The \var{obj} argument must support the single-segment readable buffer interface. On success, returns @@ -1015,7 +1015,7 @@ \begin{cfuncdesc}{int}{PyObject_AsWriteBuffer}{PyObject *obj, void **buffer, - int *buffer_len} + Py_ssize_t *buffer_len} Returns a pointer to a writeable memory location. The \var{obj} argument must support the single-segment, character buffer interface. On success, returns \code{0}, sets \var{buffer} to the Modified: python/trunk/Doc/api/concrete.tex ============================================================================== --- python/trunk/Doc/api/concrete.tex (original) +++ python/trunk/Doc/api/concrete.tex Wed Mar 1 06:16:03 2006 @@ -65,7 +65,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyType_GenericAlloc}{PyTypeObject *type, - int nitems} + Py_ssize_t nitems} \versionadded{2.2} \end{cfuncdesc} @@ -179,7 +179,7 @@ \versionadded{2.3} \end{cfuncdesc} -\begin{cfuncdesc}{unsigned long long}{PyInt_AsUnsignedLongLongMask}{PyObject *io} +\begin{cfuncdesc}{unsigned PY_LONG_LONG}{PyInt_AsUnsignedLongLongMask}{PyObject *io} Will first attempt to cast the object to a \ctype{PyIntObject} or \ctype{PyLongObject}, if it is not already one, and then return its value as unsigned long long, without checking for overflow. @@ -268,12 +268,12 @@ long}, or \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyLong_FromLongLong}{long long v} +\begin{cfuncdesc}{PyObject*}{PyLong_FromLongLong}{PY_LONG_LONG v} Return a new \ctype{PyLongObject} object from a C \ctype{long long}, or \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyLong_FromUnsignedLongLong}{unsigned long long v} +\begin{cfuncdesc}{PyObject*}{PyLong_FromUnsignedLongLong}{unsigned PY_LONG_LONG v} Return a new \ctype{PyLongObject} object from a C \ctype{unsigned long long}, or \NULL{} on failure. \end{cfuncdesc} @@ -300,7 +300,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyLong_FromUnicode}{Py_UNICODE *u, - int length, int base} + Py_ssize_t length, int base} Convert a sequence of Unicode digits to a Python long integer value. The first parameter, \var{u}, points to the first character of the Unicode string, \var{length} gives the number of characters, @@ -333,14 +333,14 @@ \withsubitem{(built-in exception)}{\ttindex{OverflowError}} \end{cfuncdesc} -\begin{cfuncdesc}{long long}{PyLong_AsLongLong}{PyObject *pylong} +\begin{cfuncdesc}{PY_LONG_LONG}{PyLong_AsLongLong}{PyObject *pylong} Return a C \ctype{long long} from a Python long integer. If \var{pylong} cannot be represented as a \ctype{long long}, an \exception{OverflowError} will be raised. \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{unsigned long long}{PyLong_AsUnsignedLongLong}{PyObject +\begin{cfuncdesc}{unsigned PY_LONG_LONG}{PyLong_AsUnsignedLongLong}{PyObject *pylong} Return a C \ctype{unsigned long long} from a Python long integer. If \var{pylong} cannot be represented as an \ctype{unsigned long @@ -582,7 +582,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyString_FromStringAndSize}{const char *v, - int len} + Py_ssize_t len} Return a new string object with the value \var{v} and length \var{len} on success, and \NULL{} on failure. If \var{v} is \NULL{}, the contents of the string are uninitialized. @@ -601,6 +601,7 @@ \lineiii{\%c}{int}{A single character, represented as an C int.} \lineiii{\%d}{int}{Exactly equivalent to \code{printf("\%d")}.} \lineiii{\%ld}{long}{Exactly equivalent to \code{printf("\%ld")}.} + \lineiii{\%zd}{long}{Exactly equivalent to \code{printf("\%zd")}.} \lineiii{\%i}{int}{Exactly equivalent to \code{printf("\%i")}.} \lineiii{\%x}{int}{Exactly equivalent to \code{printf("\%x")}.} \lineiii{\%s}{char*}{A null-terminated C character array.} @@ -617,11 +618,11 @@ exactly two arguments. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyString_Size}{PyObject *string} +\begin{cfuncdesc}{Py_ssize_t}{PyString_Size}{PyObject *string} Return the length of the string in string object \var{string}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyString_GET_SIZE}{PyObject *string} +\begin{cfuncdesc}{Py_ssize_t}{PyString_GET_SIZE}{PyObject *string} Macro form of \cfunction{PyString_Size()} but without error checking. \end{cfuncdesc} @@ -647,7 +648,7 @@ \begin{cfuncdesc}{int}{PyString_AsStringAndSize}{PyObject *obj, char **buffer, - int *length} + Py_ssize_t *length} Return a NUL-terminated representation of the contents of the object \var{obj} through the output variables \var{buffer} and \var{length}. @@ -686,7 +687,7 @@ the reference count of \var{newpart}. \end{cfuncdesc} -\begin{cfuncdesc}{int}{_PyString_Resize}{PyObject **string, int newsize} +\begin{cfuncdesc}{int}{_PyString_Resize}{PyObject **string, Py_ssize_t newsize} A way to resize a string object even though it is ``immutable''. Only use this to build up a brand new string object; don't use this if the string may already be known in other parts of the code. It @@ -730,7 +731,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyString_Decode}{const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors} Create an object by decoding \var{size} bytes of the encoded @@ -754,7 +755,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyString_Encode}{const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors} Encode the \ctype{char} buffer of the given size by passing it to @@ -829,12 +830,12 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_GET_SIZE}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_GET_SIZE}{PyObject *o} Return the size of the object. \var{o} has to be a \ctype{PyUnicodeObject} (not checked). \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_GET_DATA_SIZE}{PyObject *o} +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_GET_DATA_SIZE}{PyObject *o} Return the size of the object's internal buffer in bytes. \var{o} has to be a \ctype{PyUnicodeObject} (not checked). \end{cfuncdesc} @@ -937,7 +938,7 @@ use these APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_FromUnicode}{const Py_UNICODE *u, - int size} + Py_ssize_t size} Create a Unicode Object from the Py_UNICODE buffer \var{u} of the given size. \var{u} may be \NULL{} which causes the contents to be undefined. It is the user's responsibility to fill in the needed @@ -953,7 +954,7 @@ object. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_GetSize}{PyObject *unicode} +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_GetSize}{PyObject *unicode} Return the length of the Unicode object. \end{cfuncdesc} @@ -996,14 +997,14 @@ \ctype{Py_UNICODE} type is identical to the system's \ctype{wchar_t}. \begin{cfuncdesc}{PyObject*}{PyUnicode_FromWideChar}{const wchar_t *w, - int size} + Py_ssize_t size} Create a Unicode object from the \ctype{wchar_t} buffer \var{w} of the given size. Return \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_AsWideChar}{PyUnicodeObject *unicode, +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_AsWideChar}{PyUnicodeObject *unicode, wchar_t *w, - int size} + Py_ssize_t size} Copy the Unicode object contents into the \ctype{wchar_t} buffer \var{w}. At most \var{size} \ctype{wchar_t} characters are copied (excluding a possibly trailing 0-termination character). Return @@ -1045,7 +1046,7 @@ These are the generic codec APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_Decode}{const char *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors} Create a Unicode object by decoding \var{size} bytes of the encoded @@ -1057,7 +1058,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_Encode}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *encoding, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size and return @@ -1083,7 +1084,7 @@ These are the UTF-8 codec APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeUTF8}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the UTF-8 encoded string \var{s}. Return \NULL{} if an exception was raised @@ -1091,9 +1092,9 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeUTF8Stateful}{const char *s, - int size, + Py_ssize_t size, const char *errors, - int *consumed} + Py_ssize_t *consumed} If \var{consumed} is \NULL{}, behave like \cfunction{PyUnicode_DecodeUTF8()}. If \var{consumed} is not \NULL{}, trailing incomplete UTF-8 byte sequences will not be treated as an error. Those bytes will not be decoded and the @@ -1102,7 +1103,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeUTF8}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using UTF-8 and return a Python string object. Return \NULL{} if an exception @@ -1120,7 +1121,7 @@ These are the UTF-16 codec APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeUTF16}{const char *s, - int size, + Py_ssize_t size, const char *errors, int *byteorder} Decode \var{length} bytes from a UTF-16 encoded buffer string and @@ -1147,10 +1148,10 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeUTF16Stateful}{const char *s, - int size, + Py_ssize_t size, const char *errors, int *byteorder, - int *consumed} + Py_ssize_t *consumed} If \var{consumed} is \NULL{}, behave like \cfunction{PyUnicode_DecodeUTF16()}. If \var{consumed} is not \NULL{}, \cfunction{PyUnicode_DecodeUTF16Stateful()} will not treat trailing incomplete @@ -1161,7 +1162,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeUTF16}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors, int byteorder} Return a Python string object holding the UTF-16 encoded value of @@ -1198,7 +1199,7 @@ These are the ``Unicode Escape'' codec APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeUnicodeEscape}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the Unicode-Escape encoded string \var{s}. Return \NULL{} if an @@ -1206,8 +1207,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeUnicodeEscape}{const Py_UNICODE *s, - int size, - const char *errors} + Py_ssize_t size} Encode the \ctype{Py_UNICODE} buffer of the given size using Unicode-Escape and return a Python string object. Return \NULL{} if an exception was raised by the codec. @@ -1224,7 +1224,7 @@ These are the ``Raw Unicode Escape'' codec APIs: \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeRawUnicodeEscape}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the Raw-Unicode-Escape encoded string \var{s}. Return \NULL{} if an @@ -1232,7 +1232,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeRawUnicodeEscape}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using Raw-Unicode-Escape and return a Python string object. Return @@ -1252,7 +1252,7 @@ are accepted by the codecs during encoding. \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeLatin1}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the Latin-1 encoded string \var{s}. Return \NULL{} if an exception was raised @@ -1260,7 +1260,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeLatin1}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using Latin-1 and return a Python string object. Return \NULL{} if an @@ -1279,7 +1279,7 @@ accepted. All other codes generate errors. \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeASCII}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the \ASCII{} encoded string \var{s}. Return \NULL{} if an exception @@ -1287,7 +1287,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeASCII}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using \ASCII{} and return a Python string object. Return \NULL{} if an @@ -1327,7 +1327,7 @@ points. \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeCharmap}{const char *s, - int size, + Py_ssize_t size, PyObject *mapping, const char *errors} Create a Unicode object by decoding \var{size} bytes of the encoded @@ -1341,7 +1341,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeCharmap}{const Py_UNICODE *s, - int size, + Py_ssize_t size, PyObject *mapping, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using the @@ -1360,7 +1360,7 @@ The following codec API is special in that maps Unicode to Unicode. \begin{cfuncdesc}{PyObject*}{PyUnicode_TranslateCharmap}{const Py_UNICODE *s, - int size, + Py_ssize_t size, PyObject *table, const char *errors} Translate a \ctype{Py_UNICODE} buffer of the given length by @@ -1386,7 +1386,7 @@ machine running the codec. \begin{cfuncdesc}{PyObject*}{PyUnicode_DecodeMBCS}{const char *s, - int size, + Py_ssize_t size, const char *errors} Create a Unicode object by decoding \var{size} bytes of the MBCS encoded string \var{s}. Return \NULL{} if an exception was @@ -1394,7 +1394,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyUnicode_EncodeMBCS}{const Py_UNICODE *s, - int size, + Py_ssize_t size, const char *errors} Encode the \ctype{Py_UNICODE} buffer of the given size using MBCS and return a Python string object. Return \NULL{} if an exception @@ -1424,7 +1424,7 @@ \begin{cfuncdesc}{PyObject*}{PyUnicode_Split}{PyObject *s, PyObject *sep, - int maxsplit} + Py_ssize_t maxsplit} Split a string giving a list of Unicode strings. If sep is \NULL{}, splitting will be done at all whitespace substrings. Otherwise, splits occur at the given separator. At most \var{maxsplit} splits @@ -1466,8 +1466,8 @@ \begin{cfuncdesc}{int}{PyUnicode_Tailmatch}{PyObject *str, PyObject *substr, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction} Return 1 if \var{substr} matches \var{str}[\var{start}:\var{end}] at the given tail end (\var{direction} == -1 means to do a prefix @@ -1475,10 +1475,10 @@ Return \code{-1} if an error occurred. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_Find}{PyObject *str, +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_Find}{PyObject *str, PyObject *substr, - int start, - int end, + Py_ssize_t start, + Py_ssize_t end, int direction} Return the first position of \var{substr} in \var{str}[\var{start}:\var{end}] using the given \var{direction} @@ -1489,10 +1489,10 @@ an exception has been set. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyUnicode_Count}{PyObject *str, +\begin{cfuncdesc}{Py_ssize_t}{PyUnicode_Count}{PyObject *str, PyObject *substr, - int start, - int end} + Py_ssize_t start, + Py_ssize_t end} Return the number of non-overlapping occurrences of \var{substr} in \code{\var{str}[\var{start}:\var{end}]}. Return \code{-1} if an error occurred. @@ -1501,7 +1501,7 @@ \begin{cfuncdesc}{PyObject*}{PyUnicode_Replace}{PyObject *str, PyObject *substr, PyObject *replstr, - int maxcount} + Py_ssize_t maxcount} Replace at most \var{maxcount} occurrences of \var{substr} in \var{str} with \var{replstr} and return the resulting Unicode object. \var{maxcount} == -1 means replace all occurrences. @@ -1599,7 +1599,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyBuffer_FromObject}{PyObject *base, - int offset, int size} + Py_ssize_t offset, Py_ssize_t size} Return a new read-only buffer object. This raises \exception{TypeError} if \var{base} doesn't support the read-only buffer protocol or doesn't provide exactly one buffer segment, or it @@ -1613,15 +1613,15 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyBuffer_FromReadWriteObject}{PyObject *base, - int offset, - int size} + Py_ssize_t offset, + Py_ssize_t size} Return a new writable buffer object. Parameters and exceptions are similar to those for \cfunction{PyBuffer_FromObject()}. If the \var{base} object does not export the writeable buffer protocol, then \exception{TypeError} is raised. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyBuffer_FromMemory}{void *ptr, int size} +\begin{cfuncdesc}{PyObject*}{PyBuffer_FromMemory}{void *ptr, Py_ssize_t size} Return a new read-only buffer object that reads from a specified location in memory, with a specified size. The caller is responsible for ensuring that the memory buffer, passed in as @@ -1632,12 +1632,12 @@ raised in that case. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyBuffer_FromReadWriteMemory}{void *ptr, int size} +\begin{cfuncdesc}{PyObject*}{PyBuffer_FromReadWriteMemory}{void *ptr, Py_ssize_t size} Similar to \cfunction{PyBuffer_FromMemory()}, but the returned buffer is writable. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyBuffer_New}{int size} +\begin{cfuncdesc}{PyObject*}{PyBuffer_New}{Py_ssize_t size} Return a new writable buffer object that maintains its own memory buffer of \var{size} bytes. \exception{ValueError} is returned if \var{size} is not zero or positive. Note that the memory buffer (as @@ -1671,11 +1671,11 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyTuple_New}{int len} +\begin{cfuncdesc}{PyObject*}{PyTuple_New}{Py_ssize_t len} Return a new tuple object of size \var{len}, or \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyTuple_Pack}{int n, \moreargs} +\begin{cfuncdesc}{PyObject*}{PyTuple_Pack}{Py_ssize_t n, \moreargs} Return a new tuple object of size \var{n}, or \NULL{} on failure. The tuple values are initialized to the subsequent \var{n} C arguments pointing to Python objects. \samp{PyTuple_Pack(2, \var{a}, \var{b})} @@ -1693,38 +1693,38 @@ point to a tuple; no error checking is performed. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyTuple_GetItem}{PyObject *p, int pos} +\begin{cfuncdesc}{PyObject*}{PyTuple_GetItem}{PyObject *p, Py_ssize_t pos} Return the object at position \var{pos} in the tuple pointed to by \var{p}. If \var{pos} is out of bounds, return \NULL{} and sets an \exception{IndexError} exception. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyTuple_GET_ITEM}{PyObject *p, int pos} +\begin{cfuncdesc}{PyObject*}{PyTuple_GET_ITEM}{PyObject *p, Py_ssize_t pos} Like \cfunction{PyTuple_GetItem()}, but does no checking of its arguments. \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyTuple_GetSlice}{PyObject *p, - int low, int high} + Py_ssize_t low, Py_ssize_t high} Take a slice of the tuple pointed to by \var{p} from \var{low} to \var{high} and return it as a new tuple. \end{cfuncdesc} \begin{cfuncdesc}{int}{PyTuple_SetItem}{PyObject *p, - int pos, PyObject *o} + Py_ssize_t pos, PyObject *o} Insert a reference to object \var{o} at position \var{pos} of the tuple pointed to by \var{p}. Return \code{0} on success. \note{This function ``steals'' a reference to \var{o}.} \end{cfuncdesc} \begin{cfuncdesc}{void}{PyTuple_SET_ITEM}{PyObject *p, - int pos, PyObject *o} + Py_ssize_t pos, PyObject *o} Like \cfunction{PyTuple_SetItem()}, but does no error checking, and should \emph{only} be used to fill in brand new tuples. \note{This function ``steals'' a reference to \var{o}.} \end{cfuncdesc} -\begin{cfuncdesc}{int}{_PyTuple_Resize}{PyObject **p, int newsize} +\begin{cfuncdesc}{int}{_PyTuple_Resize}{PyObject **p, Py_ssize_t newsize} Can be used to resize a tuple. \var{newsize} will be the new length of the tuple. Because tuples are \emph{supposed} to be immutable, this should only be used if there is only one reference to the @@ -1768,32 +1768,32 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyList_New}{int len} +\begin{cfuncdesc}{PyObject*}{PyList_New}{Py_ssize_t len} Return a new list of length \var{len} on success, or \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyList_Size}{PyObject *list} +\begin{cfuncdesc}{Py_ssize_t}{PyList_Size}{PyObject *list} Return the length of the list object in \var{list}; this is equivalent to \samp{len(\var{list})} on a list object. \bifuncindex{len} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyList_GET_SIZE}{PyObject *list} +\begin{cfuncdesc}{Py_ssize_t}{PyList_GET_SIZE}{PyObject *list} Macro form of \cfunction{PyList_Size()} without error checking. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyList_GetItem}{PyObject *list, int index} +\begin{cfuncdesc}{PyObject*}{PyList_GetItem}{PyObject *list, Py_ssize_t index} Return the object at position \var{pos} in the list pointed to by \var{p}. If \var{pos} is out of bounds, return \NULL{} and set an \exception{IndexError} exception. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyList_GET_ITEM}{PyObject *list, int i} +\begin{cfuncdesc}{PyObject*}{PyList_GET_ITEM}{PyObject *list, Py_ssize_t i} Macro form of \cfunction{PyList_GetItem()} without error checking. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyList_SetItem}{PyObject *list, int index, +\begin{cfuncdesc}{int}{PyList_SetItem}{PyObject *list, Py_ssize_t index, PyObject *item} Set the item at index \var{index} in list to \var{item}. Return \code{0} on success or \code{-1} on failure. \note{This function @@ -1801,7 +1801,7 @@ item already in the list at the affected position.} \end{cfuncdesc} -\begin{cfuncdesc}{void}{PyList_SET_ITEM}{PyObject *list, int i, +\begin{cfuncdesc}{void}{PyList_SET_ITEM}{PyObject *list, Py_ssize_t i, PyObject *o} Macro form of \cfunction{PyList_SetItem()} without error checking. This is normally only used to fill in new lists where there is no @@ -1812,7 +1812,7 @@ \var{list} at position \var{i} will be leaked.} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyList_Insert}{PyObject *list, int index, +\begin{cfuncdesc}{int}{PyList_Insert}{PyObject *list, Py_ssize_t index, PyObject *item} Insert the item \var{item} into list \var{list} in front of index \var{index}. Return \code{0} if successful; return \code{-1} and @@ -1828,7 +1828,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyList_GetSlice}{PyObject *list, - int low, int high} + Py_ssize_t low, Py_ssize_t high} Return a list of the objects in \var{list} containing the objects \emph{between} \var{low} and \var{high}. Return \NULL{} and set an exception if unsuccessful. @@ -1836,7 +1836,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyList_SetSlice}{PyObject *list, - int low, int high, + Py_ssize_t low, Py_ssize_t high, PyObject *itemlist} Set the slice of \var{list} between \var{low} and \var{high} to the contents of \var{itemlist}. Analogous to @@ -1934,7 +1934,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyDict_SetItemString}{PyObject *p, - char *key, + const char *key, PyObject *val} Insert \var{value} into the dictionary \var{p} using \var{key} as a key. \var{key} should be a \ctype{char*}. The key object is created @@ -1961,7 +1961,7 @@ \emph{without} setting an exception. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyDict_GetItemString}{PyObject *p, char *key} +\begin{cfuncdesc}{PyObject*}{PyDict_GetItemString}{PyObject *p, const char *key} This is the same as \cfunction{PyDict_GetItem()}, but \var{key} is specified as a \ctype{char*}, rather than a \ctype{PyObject*}. \end{cfuncdesc} @@ -1984,12 +1984,12 @@ (see the \citetitle[../lib/lib.html]{Python Library Reference}). \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyDict_Size}{PyObject *p} +\begin{cfuncdesc}{Py_ssize_t}{PyDict_Size}{PyObject *p} Return the number of items in the dictionary. This is equivalent to \samp{len(\var{p})} on a dictionary.\bifuncindex{len} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyDict_Next}{PyObject *p, int *ppos, +\begin{cfuncdesc}{int}{PyDict_Next}{PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue} Iterate over all key-value pairs in the dictionary \var{p}. The \ctype{int} referred to by \var{ppos} must be initialized to @@ -2126,7 +2126,7 @@ when the file should be closed. Return \NULL{} on failure. \end{cfuncdesc} -\begin{cfuncdesc}{FILE*}{PyFile_AsFile}{PyFileObject *p} +\begin{cfuncdesc}{FILE*}{PyFile_AsFile}{PyObject *p} Return the file object associated with \var{p} as a \ctype{FILE*}. \end{cfuncdesc} @@ -2175,7 +2175,7 @@ function, but doing so should not be needed. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyFile_WriteObject}{PyObject *obj, PyFileObject *p, +\begin{cfuncdesc}{int}{PyFile_WriteObject}{PyObject *obj, PyObject *p, int flags} Write object \var{obj} to file object \var{p}. The only supported flag for \var{flags} is @@ -2185,7 +2185,7 @@ failure; the appropriate exception will be set. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyFile_WriteString}{const char *s, PyFileObject *p} +\begin{cfuncdesc}{int}{PyFile_WriteString}{const char *s, PyObject *p} Write string \var{s} to file object \var{p}. Return \code{0} on success or \code{-1} on failure; the appropriate exception will be set. @@ -2313,7 +2313,7 @@ \cdata{PyMethod_Type}). The parameter must not be \NULL{}. \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyMethod_New}{PyObject *func. +\begin{cfuncdesc}{PyObject*}{PyMethod_New}{PyObject *func, PyObject *self, PyObject *class} Return a new method object, with \var{func} being any callable object; this is the function that will be called when the method is @@ -2378,7 +2378,7 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyModule_New}{char *name} +\begin{cfuncdesc}{PyObject*}{PyModule_New}{const char *name} Return a new module object with the \member{__name__} attribute set to \var{name}. Only the module's \member{__doc__} and \member{__name__} attributes are filled in; the caller is @@ -2415,7 +2415,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyModule_AddObject}{PyObject *module, - char *name, PyObject *value} + const char *name, PyObject *value} Add an object to \var{module} as \var{name}. This is a convenience function which can be used from the module's initialization function. This steals a reference to \var{value}. Return @@ -2424,7 +2424,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyModule_AddIntConstant}{PyObject *module, - char *name, long value} + const char *name, long value} Add an integer constant to \var{module} as \var{name}. This convenience function can be used from the module's initialization function. Return \code{-1} on error, \code{0} on success. @@ -2432,7 +2432,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyModule_AddStringConstant}{PyObject *module, - char *name, char *value} + const char *name, const char *value} Add a string constant to \var{module} as \var{name}. This convenience function can be used from the module's initialization function. The string \var{value} must be null-terminated. Return @@ -2503,17 +2503,17 @@ \end{cvardesc} \begin{cfuncdesc}{PyObject*}{PyDescr_NewGetSet}{PyTypeObject *type, - PyGetSetDef *getset} + struct PyGetSetDef *getset} \versionadded{2.2} \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyDescr_NewMember}{PyTypeObject *type, - PyMemberDef *meth} + struct PyMemberDef *meth} \versionadded{2.2} \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyDescr_NewMethod}{PyTypeObject *type, - PyMethodDef *meth} + struct PyMethodDef *meth} \versionadded{2.2} \end{cfuncdesc} @@ -2563,8 +2563,8 @@ not be allocated. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySlice_GetIndices}{PySliceObject *slice, int length, - int *start, int *stop, int *step} +\begin{cfuncdesc}{int}{PySlice_GetIndices}{PySliceObject *slice, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step} Retrieve the start, stop and step indices from the slice object \var{slice}, assuming a sequence of length \var{length}. Treats indices greater than \var{length} as errors. @@ -2579,9 +2579,9 @@ suitably renamed, in the source of your extension. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySlice_GetIndicesEx}{PySliceObject *slice, int length, - int *start, int *stop, int *step, - int *slicelength} +\begin{cfuncdesc}{int}{PySlice_GetIndicesEx}{PySliceObject *slice, Py_ssize_t length, + Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, + Py_ssize_t *slicelength} Usable replacement for \cfunction{PySlice_GetIndices}. Retrieve the start, stop, and step indices from the slice object \var{slice} assuming a sequence of length \var{length}, and store the length of Modified: python/trunk/Doc/api/exceptions.tex ============================================================================== --- python/trunk/Doc/api/exceptions.tex (original) +++ python/trunk/Doc/api/exceptions.tex Wed Mar 1 06:16:03 2006 @@ -113,7 +113,7 @@ exception state.} \end{cfuncdesc} -\begin{cfuncdesc}{void}{PyErr_SetString}{PyObject *type, char *message} +\begin{cfuncdesc}{void}{PyErr_SetString}{PyObject *type, const char *message} This is the most common way to set the error indicator. The first argument specifies the exception type; it is normally one of the standard exceptions, e.g. \cdata{PyExc_RuntimeError}. You need not @@ -184,7 +184,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyErr_SetFromErrnoWithFilename}{PyObject *type, - char *filename} + const char *filename} Similar to \cfunction{PyErr_SetFromErrno()}, with the additional behavior that if \var{filename} is not \NULL, it is passed to the constructor of \var{type} as a third parameter. In the case of @@ -217,7 +217,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyErr_SetFromWindowsErrWithFilename}{int ierr, - char *filename} + const char *filename} Similar to \cfunction{PyErr_SetFromWindowsErr()}, with the additional behavior that if \var{filename} is not \NULL, it is passed to the constructor of \exception{WindowsError} as a third @@ -275,8 +275,9 @@ command line documentation. There is no C API for warning control. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyErr_WarnExplicit}{PyObject *category, char *message, - char *filename, int lineno, char *module, PyObject *registry} +\begin{cfuncdesc}{int}{PyErr_WarnExplicit}{PyObject *category, + const char *message, const char *filename, int lineno, + const char *module, PyObject *registry} Issue a warning message with explicit control over all warning attributes. This is a straightforward wrapper around the Python function \function{warnings.warn_explicit()}, see there for more Modified: python/trunk/Doc/api/init.tex ============================================================================== --- python/trunk/Doc/api/init.tex (original) +++ python/trunk/Doc/api/init.tex Wed Mar 1 06:16:03 2006 @@ -331,7 +331,7 @@ \withsubitem{(in module sys)}{\ttindex{version}} \end{cfuncdesc} -\begin{cfuncdesc}{int}{PySys_SetArgv}{int argc, char **argv} +\begin{cfuncdesc}{void}{PySys_SetArgv}{int argc, char **argv} Set \code{sys.argv} based on \var{argc} and \var{argv}. These parameters are similar to those passed to the program's \cfunction{main()}\ttindex{main()} function with the difference that Modified: python/trunk/Doc/api/newtypes.tex ============================================================================== --- python/trunk/Doc/api/newtypes.tex (original) +++ python/trunk/Doc/api/newtypes.tex Wed Mar 1 06:16:03 2006 @@ -11,7 +11,7 @@ \begin{cfuncdesc}{PyObject*}{_PyObject_New}{PyTypeObject *type} \end{cfuncdesc} -\begin{cfuncdesc}{PyVarObject*}{_PyObject_NewVar}{PyTypeObject *type, int size} +\begin{cfuncdesc}{PyVarObject*}{_PyObject_NewVar}{PyTypeObject *type, Py_ssize_t size} \end{cfuncdesc} \begin{cfuncdesc}{void}{_PyObject_Del}{PyObject *op} @@ -27,7 +27,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyVarObject*}{PyObject_InitVar}{PyVarObject *op, - PyTypeObject *type, int size} + PyTypeObject *type, Py_ssize_t size} This does everything \cfunction{PyObject_Init()} does, and also initializes the length information for a variable-size object. \end{cfuncdesc} @@ -42,7 +42,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{\var{TYPE}*}{PyObject_NewVar}{TYPE, PyTypeObject *type, - int size} + Py_ssize_t size} Allocate a new Python object using the C structure type \var{TYPE} and the Python type object \var{type}. Fields not defined by the Python object header are not initialized. The allocated memory @@ -69,7 +69,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{\var{TYPE}*}{PyObject_NEW_VAR}{TYPE, PyTypeObject *type, - int size} + Py_ssize_t size} Macro version of \cfunction{PyObject_NewVar()}, to gain performance at the expense of safety. This does not check \var{type} for a \NULL{} value. @@ -170,13 +170,13 @@ \csimplemacro{Py_TRACE_REFS}. By default, that macro is not defined, and \csimplemacro{PyObject_HEAD} expands to: \begin{verbatim} - int ob_refcnt; + Py_ssize_t ob_refcnt; PyTypeObject *ob_type; \end{verbatim} When \csimplemacro{Py_TRACE_REFS} is defined, it expands to: \begin{verbatim} PyObject *_ob_next, *_ob_prev; - int ob_refcnt; + Py_ssize_t ob_refcnt; PyTypeObject *ob_type; \end{verbatim} \end{csimplemacrodesc} @@ -383,7 +383,7 @@ These fields are not inherited by subtypes. \end{cmemberdesc} -\begin{cmemberdesc}{PyObject}{int}{ob_refcnt} +\begin{cmemberdesc}{PyObject}{Py_ssize_t}{ob_refcnt} This is the type object's reference count, initialized to \code{1} by the \code{PyObject_HEAD_INIT} macro. Note that for statically allocated type objects, the type's instances (objects whose @@ -421,7 +421,7 @@ and in 2.3 and beyond, it is inherited by subtypes. \end{cmemberdesc} -\begin{cmemberdesc}{PyVarObject}{int}{ob_size} +\begin{cmemberdesc}{PyVarObject}{Py_ssize_t}{ob_size} For statically allocated type objects, this should be initialized to zero. For dynamically allocated type objects, this field has a special internal meaning. @@ -457,8 +457,8 @@ This field is not inherited by subtypes. \end{cmemberdesc} -\begin{cmemberdesc}{PyTypeObject}{int}{tp_basicsize} -\cmemberline{PyTypeObject}{int}{tp_itemsize} +\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_basicsize} +\cmemberline{PyTypeObject}{Py_ssize_t}{tp_itemsize} These fields allow calculating the size in bytes of instances of the type. @@ -1234,7 +1234,7 @@ The function signature is \begin{verbatim} -PyObject *tp_alloc(PyTypeObject *self, int nitems) +PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems) \end{verbatim} The purpose of this function is to separate memory allocation from @@ -1386,15 +1386,15 @@ They are documented here for completeness. None of these fields are inherited by subtypes. -\begin{cmemberdesc}{PyTypeObject}{int}{tp_allocs} +\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_allocs} Number of allocations. \end{cmemberdesc} -\begin{cmemberdesc}{PyTypeObject}{int}{tp_frees} +\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_frees} Number of frees. \end{cmemberdesc} -\begin{cmemberdesc}{PyTypeObject}{int}{tp_maxalloc} +\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_maxalloc} Maximum simultaneously allocated objects. \end{cmemberdesc} @@ -1509,8 +1509,8 @@ \member{bf_getcharbuffer} slot is non-\NULL. \end{datadesc} -\begin{ctypedesc}[getreadbufferproc]{int (*getreadbufferproc) - (PyObject *self, int segment, void **ptrptr)} +\begin{ctypedesc}[getreadbufferproc]{Py_ssize_t (*readbufferproc) + (PyObject *self, Py_ssize_t segment, void **ptrptr)} Return a pointer to a readable segment of the buffer. This function is allowed to raise an exception, in which case it must return \code{-1}. The \var{segment} which is passed must be zero or @@ -1520,8 +1520,8 @@ pointer to that memory. \end{ctypedesc} -\begin{ctypedesc}[getwritebufferproc]{int (*getwritebufferproc) - (PyObject *self, int segment, void **ptrptr)} +\begin{ctypedesc}[getwritebufferproc]{Py_ssize_t (*writebufferproc) + (PyObject *self, Py_ssize_t segment, void **ptrptr)} Return a pointer to a writable memory buffer in \code{*\var{ptrptr}}, and the length of that segment as the function return value. The memory buffer must correspond to buffer segment @@ -1535,16 +1535,16 @@ % code. \end{ctypedesc} -\begin{ctypedesc}[getsegcountproc]{int (*getsegcountproc) - (PyObject *self, int *lenp)} +\begin{ctypedesc}[getsegcountproc]{Py_ssize_t (*segcountproc) + (PyObject *self, Py_ssize_t *lenp)} Return the number of memory segments which comprise the buffer. If \var{lenp} is not \NULL, the implementation must report the sum of the sizes (in bytes) of all segments in \code{*\var{lenp}}. The function cannot fail. \end{ctypedesc} -\begin{ctypedesc}[getcharbufferproc]{int (*getcharbufferproc) - (PyObject *self, int segment, const char **ptrptr)} +\begin{ctypedesc}[getcharbufferproc]{Py_ssize_t (*charbufferproc) + (PyObject *self, Py_ssize_t segment, const char **ptrptr)} Return the size of the memory buffer in \var{ptrptr} for segment \var{segment}. \code{*\var{ptrptr}} is set to the memory buffer. \end{ctypedesc} @@ -1599,12 +1599,12 @@ \end{cfuncdesc} \begin{cfuncdesc}{\var{TYPE}*}{PyObject_GC_NewVar}{TYPE, PyTypeObject *type, - int size} + Py_ssize_t size} Analogous to \cfunction{PyObject_NewVar()} but for container objects with the \constant{Py_TPFLAGS_HAVE_GC} flag set. \end{cfuncdesc} -\begin{cfuncdesc}{PyVarObject *}{PyObject_GC_Resize}{PyVarObject *op, int} +\begin{cfuncdesc}{PyVarObject *}{PyObject_GC_Resize}{PyVarObject *op, Py_ssize_t} Resize an object allocated by \cfunction{PyObject_NewVar()}. Returns the resized object or \NULL{} on failure. \end{cfuncdesc} @@ -1633,12 +1633,12 @@ \cfunction{PyObject_GC_Del()}. \end{enumerate} -\begin{cfuncdesc}{void}{PyObject_GC_Del}{PyObject *op} +\begin{cfuncdesc}{void}{PyObject_GC_Del}{void *op} Releases memory allocated to an object using \cfunction{PyObject_GC_New()} or \cfunction{PyObject_GC_NewVar()}. \end{cfuncdesc} -\begin{cfuncdesc}{void}{PyObject_GC_UnTrack}{PyObject *op} +\begin{cfuncdesc}{void}{PyObject_GC_UnTrack}{void *op} Remove the object \var{op} from the set of container objects tracked by the collector. Note that \cfunction{PyObject_GC_Track()} can be called again on this object to add it back to the set of tracked Modified: python/trunk/Doc/api/utilities.tex ============================================================================== --- python/trunk/Doc/api/utilities.tex (original) +++ python/trunk/Doc/api/utilities.tex Wed Mar 1 06:16:03 2006 @@ -8,7 +8,7 @@ \section{Operating System Utilities \label{os}} -\begin{cfuncdesc}{int}{Py_FdIsInteractive}{FILE *fp, char *filename} +\begin{cfuncdesc}{int}{Py_FdIsInteractive}{FILE *fp, const char *filename} Return true (nonzero) if the standard I/O file \var{fp} with name \var{filename} is deemed interactive. This is the case for files for which \samp{isatty(fileno(\var{fp}))} is true. If the global @@ -91,7 +91,7 @@ \section{Importing Modules \label{importing}} -\begin{cfuncdesc}{PyObject*}{PyImport_ImportModule}{char *name} +\begin{cfuncdesc}{PyObject*}{PyImport_ImportModule}{const char *name} This is a simplified interface to \cfunction{PyImport_ImportModuleEx()} below, leaving the \var{globals} and \var{locals} arguments set to \NULL. When the @@ -148,7 +148,7 @@ case). \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{PyImport_AddModule}{char *name} +\begin{cfuncdesc}{PyObject*}{PyImport_AddModule}{const char *name} Return the module object corresponding to a module name. The \var{name} argument may be of the form \code{package.module}. First check the modules dictionary if there's one there, and if not, @@ -369,7 +369,7 @@ \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyMarshal_ReadObjectFromString}{char *string, - int len} + Py_ssize_t len} Return a Python object from the data stream in a character buffer containing \var{len} bytes pointed to by \var{string}. On error, sets the appropriate exception (\exception{EOFError} or @@ -687,21 +687,21 @@ \cfunction{PyArg_Parse*()} functions return true, otherwise they return false and raise an appropriate exception. -\begin{cfuncdesc}{int}{PyArg_ParseTuple}{PyObject *args, char *format, +\begin{cfuncdesc}{int}{PyArg_ParseTuple}{PyObject *args, const char *format, \moreargs} Parse the parameters of a function that takes only positional parameters into local variables. Returns true on success; on failure, it returns false and raises the appropriate exception. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyArg_VaParse}{PyObject *args, char *format, +\begin{cfuncdesc}{int}{PyArg_VaParse}{PyObject *args, const char *format, va_list vargs} Identical to \cfunction{PyArg_ParseTuple()}, except that it accepts a va_list rather than a variable number of arguments. \end{cfuncdesc} \begin{cfuncdesc}{int}{PyArg_ParseTupleAndKeywords}{PyObject *args, - PyObject *kw, char *format, char *keywords[], + PyObject *kw, const char *format, char *keywords[], \moreargs} Parse the parameters of a function that takes both positional and keyword parameters into local variables. Returns true on success; @@ -709,13 +709,13 @@ \end{cfuncdesc} \begin{cfuncdesc}{int}{PyArg_VaParseTupleAndKeywords}{PyObject *args, - PyObject *kw, char *format, char *keywords[], + PyObject *kw, const char *format, char *keywords[], va_list vargs} Identical to \cfunction{PyArg_ParseTupleAndKeywords()}, except that it accepts a va_list rather than a variable number of arguments. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyArg_Parse}{PyObject *args, char *format, +\begin{cfuncdesc}{int}{PyArg_Parse}{PyObject *args, const char *format, \moreargs} Function used to deconstruct the argument lists of ``old-style'' functions --- these are functions which use the @@ -727,8 +727,8 @@ purpose. \end{cfuncdesc} -\begin{cfuncdesc}{int}{PyArg_UnpackTuple}{PyObject *args, char *name, - int min, int max, \moreargs} +\begin{cfuncdesc}{int}{PyArg_UnpackTuple}{PyObject *args, const char *name, + Py_ssize_t min, Py_ssize_t max, \moreargs} A simpler form of parameter retrieval which does not use a format string to specify the types of the arguments. Functions which use this method to retrieve their parameters should be declared as @@ -774,7 +774,7 @@ \versionadded{2.2} \end{cfuncdesc} -\begin{cfuncdesc}{PyObject*}{Py_BuildValue}{char *format, +\begin{cfuncdesc}{PyObject*}{Py_BuildValue}{const char *format, \moreargs} Create a new value based on a format string similar to those accepted by the \cfunction{PyArg_Parse*()} family of functions and a From python-checkins at python.org Wed Mar 1 06:18:14 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 06:18:14 +0100 (CET) Subject: [Python-checkins] r42716 - python/trunk/Doc/tools/cmpcsyms Message-ID: <20060301051814.018D01E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 06:18:07 2006 New Revision: 42716 Added: python/trunk/Doc/tools/cmpcsyms - copied, changed from r42684, python/trunk/Doc/tools/findcsyms Log: Add tool to check documentation against declaration. Copied: python/trunk/Doc/tools/cmpcsyms (from r42684, python/trunk/Doc/tools/findcsyms) ============================================================================== --- python/trunk/Doc/tools/findcsyms (original) +++ python/trunk/Doc/tools/cmpcsyms Wed Mar 1 06:18:07 2006 @@ -1,9 +1,10 @@ #! /usr/bin/env python - +from __future__ import with_statement import errno import os import re import sys +import string if __name__ == "__main__": _base = sys.argv[0] @@ -23,24 +24,19 @@ def list_headers(): """Return a list of headers.""" incdir = os.path.join(srcdir, "Include") - return [fn for fn in os.listdir(incdir) + return [os.path.join(incdir, fn) for fn in os.listdir(incdir) if fn.endswith(".h") and fn not in EXCLUDES] def matcher(pattern): - return re.compile(pattern).match + return re.compile(pattern).search MATCHERS = [ - matcher(r"\\begin\{cfuncdesc\}\{[^{]*\}\{(?P[^{]*)\}"), - matcher(r"\\cfuncline\{[^{]*\}\{(?P[^{]*)\}"), - matcher(r"\\begin\{ctypedesc\}(\[[^{]*\])?\{(?P[^{]*)\}"), - matcher(r"\\begin\{cvardesc\}\{[^{]*\}\{(?P[^{]*)\}"), - matcher(r"\\begin\{cmemberdesc\}\{[^{]*\}\{(?P[^{]*)\}"), - matcher(r"\\cmemberline\{[^{]*\}\{(?P[^{]*)\}"), - matcher(r"\\begin\{csimplemacrodesc\}\{(?P[^{]*)\}"), + # XXX this should also deal with ctypedesc, cvardesc and cmemberdesc + matcher(r"\\begin\{cfuncdesc\}\{(?P[^}]*)\}\{(?P[^}]*)\}{(?P[^}]*)\}"), + matcher(r"\\cfuncline\{(?P[^})]*)\}\{(?P[^}]*)\}{(?P[^}]*)\}"), ] - def list_documented_items(): """Return a list of everything that's already documented.""" apidir = os.path.join(srcdir, "Doc", "api") @@ -48,89 +44,114 @@ L = [] for fn in files: fullname = os.path.join(apidir, fn) - for line in open(fullname): - line = line.lstrip() - if not line.startswith("\\"): - continue - for matcher in MATCHERS: - m = matcher(line) - if m: - L.append(m.group("sym")) - break + data = open(fullname).read() + for matcher in MATCHERS: + pos = 0 + while 1: + m = matcher(data, pos) + if not m: break + pos = m.end() + sym = m.group("sym") + result = m.group("result") + params = m.group("params") + # replace all whitespace with a single one + params = " ".join(params.split()) + L.append((sym, result, params, fn)) return L -def split_documented(all, documented): - """Split the list of all symbols into documented and undocumented - categories.""" - doc = [] - undoc = [] - for t in all: - if t[0] in documented: - doc.append(t) - else: - undoc.append(t) - return doc, undoc - -def print_list(L, title=None): - """Dump a list to stdout.""" - if title: - print title + ":" - print "-" * (len(title) + 1) - w = 0 - for sym, filename in L: - w = max(w, len(sym)) - if w % 4 == 0: - w += 4 - else: - w += (4 - (w % 4)) - for sym, filename in L: - print "%-*s%s" % (w, sym, filename) - - -_spcjoin = ' '.join +def normalize_type(t): + t = t.strip() + s = t.rfind("*") + if s != -1: + # strip everything after the pointer name + t = t[:s+1] + # Drop the variable name + s = t.split() + typenames = 1 + if len(s)>1 and s[0]=='unsigned' and s[1]=='int': + typenames = 2 + if len(s) > typenames and s[-1][0] in string.letters: + del s[-1] + if not s: + print "XXX", t + return "" + # Drop register + if s[0] == "register": + del s[0] + # discard all spaces + return ''.join(s) + +def compare_type(t1, t2): + t1 = normalize_type(t1) + t2 = normalize_type(t2) + if t1 == r'\moreargs' and t2 == '...': + return False + if t1 != t2: + #print "different:", t1, t2 + return False + return True + + +def compare_types(ret, params, hret, hparams): + if not compare_type(ret, hret): + return False + params = params.split(",") + hparams = hparams.split(",") + if not params and hparams == ['void']: + return True + if not hparams and params == ['void']: + return True + if len(params) != len(hparams): + return False + for p1, p2 in zip(params, hparams): + if not compare_type(p1, p2): + return False + return True def main(): - args = sys.argv[1:] - if args: - headers = args - documented = [] - else: - os.chdir(os.path.join(srcdir, "Include")) - headers = list_headers() - documented = list_documented_items() - - cmd = ("ctags -f - --file-scope=no --c-types=dgpstux " - "-Istaticforward -Istatichere=static " - + _spcjoin(headers)) - fp = os.popen(cmd) - L = [] + headers = list_headers() + documented = list_documented_items() + + lines = [] + for h in headers: + data = open(h).read() + data, n = re.subn(r"PyAPI_FUNC\(([^)]*)\)", r"\1", data) + name = os.path.basename(h) + with open(name, "w") as f: + f.write(data) + cmd = ("ctags -f - --file-scope=no --c-kinds=p --fields=S " + "-Istaticforward -Istatichere=static " + name) + with os.popen(cmd) as f: + lines.extend(f.readlines()) + os.unlink(name) + L = {} prevsym = None - while 1: - line = fp.readline() + for line in lines: if not line: break - sym, filename = line.split()[:2] + sym, filename, signature = line.split(None, 2) if sym == prevsym: continue - if not sym.endswith("_H"): - L.append((sym, filename)) - prevsym = sym - L.sort() - fp.close() - - try: - if documented: - documented, undocumented = split_documented(L, documented) - print_list(documented, "Documented symbols") - if undocumented: - print - print_list(undocumented, "Undocumented symbols") - else: - print_list(L) - except IOError, e: - if e.errno != errno.EPIPE: - raise - + expr = "\^(.*)%s" % sym + m = re.search(expr, signature) + if not m: + print "Could not split",signature, "using",expr + rettype = m.group(1).strip() + m = re.search("signature:\(([^)]*)\)", signature) + if not m: + print "Could not get signature from", signature + params = m.group(1) + L[sym] = (rettype, params) + + for sym, ret, params, fn in documented: + if sym not in L: + print "No declaration for '%s'" % sym + continue + hret, hparams = L[sym] + if not compare_types(ret, params, hret, hparams): + print "Declaration error for %s (%s):" % (sym, fn) + print ret+": "+params + print hret+": "+hparams if __name__ == "__main__": main() From python-checkins at python.org Wed Mar 1 06:32:37 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 06:32:37 +0100 (CET) Subject: [Python-checkins] r42717 - python/trunk/Python/ceval.c Message-ID: <20060301053237.8169F1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 06:32:33 2006 New Revision: 42717 Modified: python/trunk/Python/ceval.c Log: Put back the essence of Jeremy's original XXX comment. Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Wed Mar 1 06:32:33 2006 @@ -3654,7 +3654,9 @@ } /* Clear the stack of the function object and the arguments, - in case they weren't consumed already */ + in case they weren't consumed already. + XXX(twouters) when are they not consumed already? + */ while ((*pp_stack) > pfunc) { w = EXT_POP(*pp_stack); Py_DECREF(w); From python-checkins at python.org Wed Mar 1 06:32:51 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 06:32:51 +0100 (CET) Subject: [Python-checkins] r42718 - peps/trunk/pep-3000.txt Message-ID: <20060301053251.39C231E4002@bag.python.org> Author: brett.cannon Date: Wed Mar 1 06:32:44 2006 New Revision: 42718 Modified: peps/trunk/pep-3000.txt Log: Reorganize: move stuff from core language to atomic types, add Influencing PEPs section. Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 1 06:32:44 2006 @@ -38,18 +38,22 @@ obvious way of doing something is enough. [1]_ +Influencing PEPs +================ + +* PEP 238 (Changing the Division Operator) [#pep238]_ +* PEP 328 (Imports: Multi-Line and Absolute/Relative) [#pep328]_ +* PEP 343 (The "with" Statement) [#pep343]_ +* PEP 352 (Required Superclass for Exceptions) [#pep352]_ + + Core language ============= -* Remove distinction between int and long types [1]_ * True division becomes default behavior [10]_ -* Make all strings be Unicode, and have a separate bytes() type [1]_ * ``exec`` as a statement is not worth it -- make it a function * Add optional declarations for static typing [11]_ * Support only new-style classes; classic classes will be gone [1]_ -* Return iterators instead of lists where appropriate for atomic type methods - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) - (Do we keep iter*() methods or remove them? I vote remove. -- nn) * Replace ``print`` by a function [16]_ * Do something so you can catch multiple exceptions using ``except E1, E2, E3:``. Maybe use ``except E1, E2, E3 as err:`` if you want the @@ -70,12 +74,13 @@ be required for top-level packages. * Cleanup the Py_InitModule() variants {,3,4} (also import and parser APIs) * Cleanup the APIs exported in pythonrun, etc. -* Fix (or remove) {}.setdefault() [21]_ * Some expressions will require parentheses that didn't in 2.x: + - List comprehensions will require parentheses around the iterables. This will make list comprehensions more similar to generator comprehensions. [x for x in 1, 2] will need to be: [x for x in (1, 2)] - Lambdas will have to be parenthesized [23]_ + * Builtin module init function names (PyMODINIT_FUNC) will be prefixed with _Py (or Py). Currently they aren't namespace safe since the names start with init. @@ -95,9 +100,26 @@ PySequence_In, PyEval_EvalFrame, PyEval_CallObject, _PyObject_Del, _PyObject_GC_Del, _PyObject_GC_Track, _PyObject_GC_UnTrack PyString_AsEncodedString, PyString_AsDecodedString - PyArg_NoArgs, PyArg_GetInt + PyArg_NoArgs, PyArg_GetInt, intargfunc, intintargfunc + + +Atomic Types +============ + +* Remove distinction between int and long types [1]_ +* Make all strings be Unicode, and have a separate bytes() type [1]_ +* Return iterators instead of lists where appropriate for atomic type methods + (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) + (Do we keep iter*() methods or remove them? I vote remove. -- nn) + +To be removed: + +* ``basestring.find()`` and ``basestring.rfind()``; use ``basestring.index()`` + or ``basestring.rindex()`` in a try/except block [15]_ +* ``file.xreadlines()`` method [17]_ +* ``dict.setdefault()`` [22]_ +* ``dict.has_key()`` method - typedefs: intargfunc, intintargfunc Built-in Namespace ================== @@ -127,18 +149,6 @@ * ``xrange()``: use ``range()`` instead [1]_ -Atomic Types -============ - -To be removed: - -* ``basestring.find()`` and ``basestring.rfind()``; use ``basestring.index()`` - or ``basestring.rindex()`` in a try/except block [15]_ -* ``file.xreadlines()`` method [17]_ -* ``dict.setdefault()`` [22]_ -* ``dict.has_key()`` method - - Standard library ================ @@ -253,6 +263,18 @@ .. [23] PEP 308 ("Conditional Expressions") http://www.python.org/peps/pep-0308.html +.. [#pep238] PEP 238 (Changing the Division Operator) + http://www.python.org/peps/pep-0238.html + +.. [#pep328] PEP 328 (Imports: Multi-Line and Absolute/Relative) + http://www.python.org/peps/pep-0328.html + +.. [#pep343] PEP 343 (The "with" Statement) + http://www.python.org/peps/pep-0343.html + +.. [#pep352] PEP 352 (Required Superclass for Exceptions) + http://www.python.org/peps/pep-0352.html + Copyright ========= From python-checkins at python.org Wed Mar 1 06:34:28 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 06:34:28 +0100 (CET) Subject: [Python-checkins] r42719 - python/trunk/Lib/traceback.py Message-ID: <20060301053428.9AE791E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 06:34:22 2006 New Revision: 42719 Modified: python/trunk/Lib/traceback.py Log: Remove redundant isinstance() check. Modified: python/trunk/Lib/traceback.py ============================================================================== --- python/trunk/Lib/traceback.py (original) +++ python/trunk/Lib/traceback.py Wed Mar 1 06:34:22 2006 @@ -158,7 +158,7 @@ """ list = [] if (type(etype) == types.ClassType - or (isinstance(etype, type) and issubclass(etype, Exception))): + or issubclass(etype, Exception)): stype = etype.__name__ else: stype = etype From python-checkins at python.org Wed Mar 1 06:38:42 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 06:38:42 +0100 (CET) Subject: [Python-checkins] r42720 - python/trunk/Python/getargs.c Message-ID: <20060301053842.7D8481E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 06:38:39 2006 New Revision: 42720 Modified: python/trunk/Python/getargs.c Log: Use %zd format characters for Py_ssize_t types. Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Wed Mar 1 06:38:39 2006 @@ -1686,13 +1686,13 @@ if (name != NULL) PyErr_Format( PyExc_TypeError, - "%s expected %s%d arguments, got %d", + "%s expected %s%zd arguments, got %zd", name, (min == max ? "" : "at least "), min, l); else PyErr_Format( PyExc_TypeError, - "unpacked tuple should have %s%d elements," - " but has %d", + "unpacked tuple should have %s%zd elements," + " but has %zd", (min == max ? "" : "at least "), min, l); va_end(vargs); return 0; @@ -1701,13 +1701,13 @@ if (name != NULL) PyErr_Format( PyExc_TypeError, - "%s expected %s%d arguments, got %d", + "%s expected %s%zd arguments, got %zd", name, (min == max ? "" : "at most "), max, l); else PyErr_Format( PyExc_TypeError, - "unpacked tuple should have %s%d elements," - " but has %d", + "unpacked tuple should have %s%zd elements," + " but has %zd", (min == max ? "" : "at most "), max, l); va_end(vargs); return 0; From python-checkins at python.org Wed Mar 1 06:41:26 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 06:41:26 +0100 (CET) Subject: [Python-checkins] r42721 - python/trunk/Objects/floatobject.c python/trunk/Objects/intobject.c python/trunk/Objects/object.c Message-ID: <20060301054126.3F8331E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 06:41:20 2006 New Revision: 42721 Modified: python/trunk/Objects/floatobject.c python/trunk/Objects/intobject.c python/trunk/Objects/object.c Log: Use %ld and casts to long for refcount printing, in absense of a universally available %zd format character. Mark with an XXX comment so we can fix this, later. Modified: python/trunk/Objects/floatobject.c ============================================================================== --- python/trunk/Objects/floatobject.c (original) +++ python/trunk/Objects/floatobject.c Wed Mar 1 06:41:20 2006 @@ -1326,9 +1326,13 @@ p->ob_refcnt != 0) { char buf[100]; PyFloat_AsString(buf, p); + /* XXX(twouters) cast refcount to + long until %zd is universally + available + */ fprintf(stderr, - "# \n", - p, p->ob_refcnt, buf); + "# \n", + p, (long)p->ob_refcnt, buf); } } list = list->next; Modified: python/trunk/Objects/intobject.c ============================================================================== --- python/trunk/Objects/intobject.c (original) +++ python/trunk/Objects/intobject.c Wed Mar 1 06:41:20 2006 @@ -1220,9 +1220,14 @@ i < N_INTOBJECTS; i++, p++) { if (PyInt_CheckExact(p) && p->ob_refcnt != 0) + /* XXX(twouters) cast refcount to + long until %zd is universally + available + */ fprintf(stderr, - "# \n", - p, p->ob_refcnt, p->ob_ival); + "# \n", + p, (long)p->ob_refcnt, + p->ob_ival); } list = list->next; } Modified: python/trunk/Objects/object.c ============================================================================== --- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Wed Mar 1 06:41:20 2006 @@ -138,9 +138,11 @@ { char buf[300]; + /* XXX(twouters) cast refcount to long until %zd is universally + available */ PyOS_snprintf(buf, sizeof(buf), - "%s:%i object at %p has negative ref count %i", - fname, lineno, op, op->ob_refcnt); + "%s:%i object at %p has negative ref count %ld", + fname, lineno, op, (long)op->ob_refcnt); Py_FatalError(buf); } @@ -233,8 +235,10 @@ } else { if (op->ob_refcnt <= 0) - fprintf(fp, "", - op->ob_refcnt, op); + /* XXX(twouters) cast refcount to long until %zd is + universally available */ + fprintf(fp, "", + (long)op->ob_refcnt, op); else if (op->ob_type->tp_print == NULL) { PyObject *s; if (flags & Py_PRINT_RAW) @@ -277,12 +281,14 @@ else { fprintf(stderr, "object : "); (void)PyObject_Print(op, stderr, 0); + /* XXX(twouters) cast refcount to long until %zd is + universally available */ fprintf(stderr, "\n" "type : %s\n" - "refcount: %d\n" + "refcount: %ld\n" "address : %p\n", op->ob_type==NULL ? "NULL" : op->ob_type->tp_name, - op->ob_refcnt, + (long)op->ob_refcnt, op); } } @@ -1893,7 +1899,9 @@ PyObject *op; fprintf(fp, "Remaining objects:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { - fprintf(fp, "%p [%d] ", op, op->ob_refcnt); + /* XXX(twouters) cast refcount to long until %zd is + universally available */ + fprintf(fp, "%p [%ld] ", op, (long)op->ob_refcnt); if (PyObject_Print(op, fp, 0) != 0) PyErr_Clear(); putc('\n', fp); @@ -1909,7 +1917,9 @@ PyObject *op; fprintf(fp, "Remaining object addresses:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) - fprintf(fp, "%p [%d] %s\n", op, op->ob_refcnt, + /* XXX(twouters) cast refcount to long until %zd is + universally available */ + fprintf(fp, "%p [%ld] %s\n", op, (long)op->ob_refcnt, op->ob_type->tp_name); } From python-checkins at python.org Wed Mar 1 06:47:12 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 06:47:12 +0100 (CET) Subject: [Python-checkins] r42722 - python/trunk/Doc/api/concrete.tex python/trunk/Doc/api/utilities.tex Message-ID: <20060301054712.8FCF41E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 06:47:11 2006 New Revision: 42722 Modified: python/trunk/Doc/api/concrete.tex python/trunk/Doc/api/utilities.tex Log: Document new Py_ssize_t API. Modified: python/trunk/Doc/api/concrete.tex ============================================================================== --- python/trunk/Doc/api/concrete.tex (original) +++ python/trunk/Doc/api/concrete.tex Wed Mar 1 06:47:11 2006 @@ -162,9 +162,20 @@ suspect the behaviour of Python in this case is undefined. :-) \end{cfuncdesc} +\begin{cfuncdesc}{PyObject*}{PyInt_FromSsize_t}{Py_ssize_t ival} + Create a new integer object with a value of \var{ival}. + If the value exceeds \code{LONG_MAX}, a long integer object is + returned. + + \versionadded{2.5} +\end{cfuncdesc} + \begin{cfuncdesc}{long}{PyInt_AsLong}{PyObject *io} Will first attempt to cast the object to a \ctype{PyIntObject}, if - it is not already one, and then return its value. + it is not already one, and then return its value. If there is an + error, \code{-1} is returned, and the caller should check + \code{PyErr_Occurred()} to find out whether there was an error, or + whether the value just happened to be -1. \end{cfuncdesc} \begin{cfuncdesc}{long}{PyInt_AS_LONG}{PyObject *io} @@ -186,6 +197,13 @@ \versionadded{2.3} \end{cfuncdesc} +\begin{cfuncdesc}{Py_ssize_t}{PyInt_AsSsize_t}{PyObject *io} + Will first attempt to cast the object to a \ctype{PyIntObject} or + \ctype{PyLongObject}, if it is not already one, and then return its + value as \ctype{Py_ssize_t}. + \versionadded{2.5} +\end{cfuncdesc} + \begin{cfuncdesc}{long}{PyInt_GetMax}{} Return the system's idea of the largest integer it can handle (\constant{LONG_MAX}\ttindex{LONG_MAX}, as defined in the system Modified: python/trunk/Doc/api/utilities.tex ============================================================================== --- python/trunk/Doc/api/utilities.tex (original) +++ python/trunk/Doc/api/utilities.tex Wed Mar 1 06:47:11 2006 @@ -553,6 +553,10 @@ platforms that support \ctype{unsigned long long} (or \ctype{unsigned _int64} on Windows). \versionadded{2.3} + \item[\samp{n} (integer) {[Py_ssize_t]}] + Convert a Python integer or long integer to a C \ctype{Py_ssize_t}. + \versionadded{2.5} + \item[\samp{c} (string of length 1) {[char]}] Convert a Python character, represented as a string of length 1, to a C \ctype{char}. @@ -866,6 +870,10 @@ Convert a C \ctype{unsigned long long} to a Python long integer object. Only available on platforms that support \ctype{unsigned long long}. + \item[\samp{n} (int) {[Py_ssize_t]}] + Convert a C \ctype{Py_ssize_t) to a Python integer or long integer. + \versionadded{2.5} + \item[\samp{c} (string of length 1) {[char]}] Convert a C \ctype{int} representing a character to a Python string of length 1. From python at rcn.com Wed Mar 1 06:50:28 2006 From: python at rcn.com (Raymond Hettinger) Date: Wed, 1 Mar 2006 00:50:28 -0500 Subject: [Python-checkins] r42718 - peps/trunk/pep-3000.txt References: <20060301053251.39C231E4002@bag.python.org> Message-ID: <004901c63cf4$0b6e90c0$6a01a8c0@RaymondLaptop1> > -* Return iterators instead of lists where appropriate for atomic type methods > - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) > - (Do we keep iter*() methods or remove them? I vote remove. -- nn) The last line doesn't make sense to me. I had thought the direction was to keep simple names like range(), dict.items(), dict.keys(), and dict.values() and have them return an iterator instead of a list. When that is done, then the current iterator versions will be redundant and we can kill-off the weird names like xrange(), dict.iter_items(), dict.iter_keys(), and dict.iter_values(). IOW, we still need some method to iterator over dictionary items and the name should be dict.items() rather than the long-winded, dict.iter_items() Raymond From thomas at python.org Wed Mar 1 06:56:41 2006 From: thomas at python.org (Thomas Wouters) Date: Wed, 1 Mar 2006 06:56:41 +0100 Subject: [Python-checkins] r42718 - peps/trunk/pep-3000.txt In-Reply-To: <004901c63cf4$0b6e90c0$6a01a8c0@RaymondLaptop1> References: <20060301053251.39C231E4002@bag.python.org> <004901c63cf4$0b6e90c0$6a01a8c0@RaymondLaptop1> Message-ID: <9e804ac0602282156s65daf829j208f073146570861@mail.gmail.com> On 3/1/06, Raymond Hettinger wrote: > > -* Return iterators instead of lists where appropriate for atomic type methods > > - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) > > - (Do we keep iter*() methods or remove them? I vote remove. -- nn) > > The last line doesn't make sense to me. I had thought the direction was to keep > simple names like range(), dict.items(), dict.keys(), and dict.values() and have > them return an iterator instead of a list. When that is done, then the current > iterator versions will be redundant and we can kill-off the weird names like > xrange(), dict.iter_items(), dict.iter_keys(), and dict.iter_values(). I can't read Neal's original question as anything other than a suggestion to do exactly that, asking for confirmation. I agree with his suggestion, and I guess you do too :-) -- Thomas Wouters Hi! I'm a .signature virus! copy me into your .signature file to help me spread! From python-checkins at python.org Wed Mar 1 07:10:50 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 07:10:50 +0100 (CET) Subject: [Python-checkins] r42723 - python/trunk/Lib/test/test_pep352.py Message-ID: <20060301061050.6F4891E4042@bag.python.org> Author: brett.cannon Date: Wed Mar 1 07:10:48 2006 New Revision: 42723 Modified: python/trunk/Lib/test/test_pep352.py Log: Fix parsing of exception_hierarchy.txt when a platform-specific exception is specified. Hopefully this wll bring warming to Tim's Windows-loving heart. Modified: python/trunk/Lib/test/test_pep352.py ============================================================================== --- python/trunk/Lib/test/test_pep352.py (original) +++ python/trunk/Lib/test/test_pep352.py Wed Mar 1 07:10:48 2006 @@ -42,6 +42,7 @@ if '(' in exc_name: paren_index = exc_name.index('(') platform_name = exc_name[paren_index+1:-1] + exc_name = exc_name[:paren_index-1] # Slice off space if platform_system() != platform_name: exc_set.discard(exc_name) continue From python-checkins at python.org Wed Mar 1 07:19:10 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 07:19:10 +0100 (CET) Subject: [Python-checkins] r42724 - in python/trunk: Lib/bsddb/test/test_1413192.py Lib/email/test/data/msg_44.txt Lib/encodings/utf_8_sig.py Lib/test/bad_coding2.py Lib/test/crashers/coerce.py Lib/test/crashers/dangerous_subclassing.py Lib/test/crashers/infinite_rec_1.py Lib/test/crashers/infinite_rec_2.py Lib/test/crashers/infinite_rec_3.py Lib/test/crashers/infinite_rec_4.py Lib/test/crashers/infinite_rec_5.py Lib/test/crashers/loosing_dict_ref.py Lib/test/crashers/modify_dict_attr.py Lib/test/crashers/recursive_call.py Lib/test/crashers/weakref_in_del.py Lib/test/crashers/xml_parsers.py Lib/test/outstanding_bugs.py Lib/test/test_defaultdict.py Lib/test/test_exception_variations.py Lib/test/test_platform.py Lib/xmlcore/etree/cElementTree.py Modules/zlib/algorithm.txt Message-ID: <20060301061910.545251E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 07:19:04 2006 New Revision: 42724 Modified: python/trunk/Lib/bsddb/test/test_1413192.py (props changed) python/trunk/Lib/email/test/data/msg_44.txt (props changed) python/trunk/Lib/encodings/utf_8_sig.py (props changed) python/trunk/Lib/test/bad_coding2.py (contents, props changed) python/trunk/Lib/test/crashers/coerce.py (props changed) python/trunk/Lib/test/crashers/dangerous_subclassing.py (props changed) python/trunk/Lib/test/crashers/infinite_rec_1.py (props changed) python/trunk/Lib/test/crashers/infinite_rec_2.py (props changed) python/trunk/Lib/test/crashers/infinite_rec_3.py (props changed) python/trunk/Lib/test/crashers/infinite_rec_4.py (props changed) python/trunk/Lib/test/crashers/infinite_rec_5.py (props changed) python/trunk/Lib/test/crashers/loosing_dict_ref.py (props changed) python/trunk/Lib/test/crashers/modify_dict_attr.py (props changed) python/trunk/Lib/test/crashers/recursive_call.py (props changed) python/trunk/Lib/test/crashers/weakref_in_del.py (contents, props changed) python/trunk/Lib/test/crashers/xml_parsers.py (contents, props changed) python/trunk/Lib/test/outstanding_bugs.py (contents, props changed) python/trunk/Lib/test/test_defaultdict.py (props changed) python/trunk/Lib/test/test_exception_variations.py (contents, props changed) python/trunk/Lib/test/test_platform.py (props changed) python/trunk/Lib/xmlcore/etree/cElementTree.py (props changed) python/trunk/Modules/zlib/algorithm.txt (props changed) Log: Set svn:eol-style to native. Modified: python/trunk/Lib/test/bad_coding2.py ============================================================================== --- python/trunk/Lib/test/bad_coding2.py (original) +++ python/trunk/Lib/test/bad_coding2.py Wed Mar 1 07:19:04 2006 @@ -1,2 +1,2 @@ -?#coding: utf8 -print '?' +?#coding: utf8 +print '?' Modified: python/trunk/Lib/test/crashers/weakref_in_del.py ============================================================================== --- python/trunk/Lib/test/crashers/weakref_in_del.py (original) +++ python/trunk/Lib/test/crashers/weakref_in_del.py Wed Mar 1 07:19:04 2006 @@ -1,16 +1,16 @@ -import weakref - -# http://python.org/sf/1377858 - -ref = None - -def test_weakref_in_del(): - class Target(object): - def __del__(self): - global ref - ref = weakref.ref(self) - - w = Target() - -if __name__ == '__main__': - test_weakref_in_del() +import weakref + +# http://python.org/sf/1377858 + +ref = None + +def test_weakref_in_del(): + class Target(object): + def __del__(self): + global ref + ref = weakref.ref(self) + + w = Target() + +if __name__ == '__main__': + test_weakref_in_del() Modified: python/trunk/Lib/test/crashers/xml_parsers.py ============================================================================== --- python/trunk/Lib/test/crashers/xml_parsers.py (original) +++ python/trunk/Lib/test/crashers/xml_parsers.py Wed Mar 1 07:19:04 2006 @@ -1,56 +1,56 @@ -from xml.parsers import expat - -# http://python.org/sf/1296433 - -def test_parse_only_xml_data(): - # - xml = "%s" % ('a' * 1025) - # this one doesn't crash - #xml = "%s" % ('a' * 10000) - - def handler(text): - raise Exception - - parser = expat.ParserCreate() - parser.CharacterDataHandler = handler - - try: - parser.Parse(xml) - except: - pass - -if __name__ == '__main__': - test_parse_only_xml_data() - -# Invalid read of size 4 -# at 0x43F936: PyObject_Free (obmalloc.c:735) -# by 0x45A7C7: unicode_dealloc (unicodeobject.c:246) -# by 0x1299021D: PyUnknownEncodingHandler (pyexpat.c:1314) -# by 0x12993A66: processXmlDecl (xmlparse.c:3330) -# by 0x12999211: doProlog (xmlparse.c:3678) -# by 0x1299C3F0: prologInitProcessor (xmlparse.c:3550) -# by 0x12991EA3: XML_ParseBuffer (xmlparse.c:1562) -# by 0x1298F8EC: xmlparse_Parse (pyexpat.c:895) -# by 0x47B3A1: PyEval_EvalFrameEx (ceval.c:3565) -# by 0x47CCAC: PyEval_EvalCodeEx (ceval.c:2739) -# by 0x47CDE1: PyEval_EvalCode (ceval.c:490) -# by 0x499820: PyRun_SimpleFileExFlags (pythonrun.c:1198) -# by 0x4117F1: Py_Main (main.c:492) -# by 0x12476D1F: __libc_start_main (in /lib/libc-2.3.5.so) -# by 0x410DC9: (within /home/neal/build/python/svn/clean/python) -# Address 0x12704020 is 264 bytes inside a block of size 592 free'd -# at 0x11B1BA8A: free (vg_replace_malloc.c:235) -# by 0x124B5F18: (within /lib/libc-2.3.5.so) -# by 0x48DE43: find_module (import.c:1320) -# by 0x48E997: import_submodule (import.c:2249) -# by 0x48EC15: load_next (import.c:2083) -# by 0x48F091: import_module_ex (import.c:1914) -# by 0x48F385: PyImport_ImportModuleEx (import.c:1955) -# by 0x46D070: builtin___import__ (bltinmodule.c:44) -# by 0x4186CF: PyObject_Call (abstract.c:1777) -# by 0x474E9B: PyEval_CallObjectWithKeywords (ceval.c:3432) -# by 0x47928E: PyEval_EvalFrameEx (ceval.c:2038) -# by 0x47CCAC: PyEval_EvalCodeEx (ceval.c:2739) -# by 0x47CDE1: PyEval_EvalCode (ceval.c:490) -# by 0x48D0F7: PyImport_ExecCodeModuleEx (import.c:635) -# by 0x48D4F4: load_source_module (import.c:913) +from xml.parsers import expat + +# http://python.org/sf/1296433 + +def test_parse_only_xml_data(): + # + xml = "%s" % ('a' * 1025) + # this one doesn't crash + #xml = "%s" % ('a' * 10000) + + def handler(text): + raise Exception + + parser = expat.ParserCreate() + parser.CharacterDataHandler = handler + + try: + parser.Parse(xml) + except: + pass + +if __name__ == '__main__': + test_parse_only_xml_data() + +# Invalid read of size 4 +# at 0x43F936: PyObject_Free (obmalloc.c:735) +# by 0x45A7C7: unicode_dealloc (unicodeobject.c:246) +# by 0x1299021D: PyUnknownEncodingHandler (pyexpat.c:1314) +# by 0x12993A66: processXmlDecl (xmlparse.c:3330) +# by 0x12999211: doProlog (xmlparse.c:3678) +# by 0x1299C3F0: prologInitProcessor (xmlparse.c:3550) +# by 0x12991EA3: XML_ParseBuffer (xmlparse.c:1562) +# by 0x1298F8EC: xmlparse_Parse (pyexpat.c:895) +# by 0x47B3A1: PyEval_EvalFrameEx (ceval.c:3565) +# by 0x47CCAC: PyEval_EvalCodeEx (ceval.c:2739) +# by 0x47CDE1: PyEval_EvalCode (ceval.c:490) +# by 0x499820: PyRun_SimpleFileExFlags (pythonrun.c:1198) +# by 0x4117F1: Py_Main (main.c:492) +# by 0x12476D1F: __libc_start_main (in /lib/libc-2.3.5.so) +# by 0x410DC9: (within /home/neal/build/python/svn/clean/python) +# Address 0x12704020 is 264 bytes inside a block of size 592 free'd +# at 0x11B1BA8A: free (vg_replace_malloc.c:235) +# by 0x124B5F18: (within /lib/libc-2.3.5.so) +# by 0x48DE43: find_module (import.c:1320) +# by 0x48E997: import_submodule (import.c:2249) +# by 0x48EC15: load_next (import.c:2083) +# by 0x48F091: import_module_ex (import.c:1914) +# by 0x48F385: PyImport_ImportModuleEx (import.c:1955) +# by 0x46D070: builtin___import__ (bltinmodule.c:44) +# by 0x4186CF: PyObject_Call (abstract.c:1777) +# by 0x474E9B: PyEval_CallObjectWithKeywords (ceval.c:3432) +# by 0x47928E: PyEval_EvalFrameEx (ceval.c:2038) +# by 0x47CCAC: PyEval_EvalCodeEx (ceval.c:2739) +# by 0x47CDE1: PyEval_EvalCode (ceval.c:490) +# by 0x48D0F7: PyImport_ExecCodeModuleEx (import.c:635) +# by 0x48D4F4: load_source_module (import.c:913) Modified: python/trunk/Lib/test/outstanding_bugs.py ============================================================================== --- python/trunk/Lib/test/outstanding_bugs.py (original) +++ python/trunk/Lib/test/outstanding_bugs.py Wed Mar 1 07:19:04 2006 @@ -1,27 +1,27 @@ -# -# This file is for everybody to add tests for bugs that aren't -# fixed yet. Please add a test case and appropriate bug description. -# -# When you fix one of the bugs, please move the test to the correct -# test_ module. -# - -import unittest -from test import test_support - -class TestBug1385040(unittest.TestCase): - def testSyntaxError(self): - import compiler - - # The following snippet gives a SyntaxError in the interpreter - # - # If you compile and exec it, the call foo(7) returns (7, 1) - self.assertRaises(SyntaxError, compiler.compile, - "def foo(a=1, b): return a, b\n\n", "", "exec") - - -def test_main(): - test_support.run_unittest(TestBug1385040) - -if __name__ == "__main__": - test_main() +# +# This file is for everybody to add tests for bugs that aren't +# fixed yet. Please add a test case and appropriate bug description. +# +# When you fix one of the bugs, please move the test to the correct +# test_ module. +# + +import unittest +from test import test_support + +class TestBug1385040(unittest.TestCase): + def testSyntaxError(self): + import compiler + + # The following snippet gives a SyntaxError in the interpreter + # + # If you compile and exec it, the call foo(7) returns (7, 1) + self.assertRaises(SyntaxError, compiler.compile, + "def foo(a=1, b): return a, b\n\n", "", "exec") + + +def test_main(): + test_support.run_unittest(TestBug1385040) + +if __name__ == "__main__": + test_main() Modified: python/trunk/Lib/test/test_exception_variations.py ============================================================================== --- python/trunk/Lib/test/test_exception_variations.py (original) +++ python/trunk/Lib/test/test_exception_variations.py Wed Mar 1 07:19:04 2006 @@ -1,180 +1,180 @@ - -from test.test_support import run_unittest -import unittest - -class ExceptionTestCase(unittest.TestCase): - def test_try_except_else_finally(self): - hit_except = False - hit_else = False - hit_finally = False - - try: - raise Exception, 'nyaa!' - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertTrue(hit_except) - self.assertTrue(hit_finally) - self.assertFalse(hit_else) - - def test_try_except_else_finally_no_exception(self): - hit_except = False - hit_else = False - hit_finally = False - - try: - pass - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertFalse(hit_except) - self.assertTrue(hit_finally) - self.assertTrue(hit_else) - - def test_try_except_finally(self): - hit_except = False - hit_finally = False - - try: - raise Exception, 'yarr!' - except: - hit_except = True - finally: - hit_finally = True - - self.assertTrue(hit_except) - self.assertTrue(hit_finally) - - def test_try_except_finally_no_exception(self): - hit_except = False - hit_finally = False - - try: - pass - except: - hit_except = True - finally: - hit_finally = True - - self.assertFalse(hit_except) - self.assertTrue(hit_finally) - - def test_try_except(self): - hit_except = False - - try: - raise Exception, 'ahoy!' - except: - hit_except = True - - self.assertTrue(hit_except) - - def test_try_except_no_exception(self): - hit_except = False - - try: - pass - except: - hit_except = True - - self.assertFalse(hit_except) - - def test_try_except_else(self): - hit_except = False - hit_else = False - - try: - raise Exception, 'foo!' - except: - hit_except = True - else: - hit_else = True - - self.assertFalse(hit_else) - self.assertTrue(hit_except) - - def test_try_except_else_no_exception(self): - hit_except = False - hit_else = False - - try: - pass - except: - hit_except = True - else: - hit_else = True - - self.assertFalse(hit_except) - self.assertTrue(hit_else) - - def test_try_finally_no_exception(self): - hit_finally = False - - try: - pass - finally: - hit_finally = True - - self.assertTrue(hit_finally) - - def test_nested(self): - hit_finally = False - hit_inner_except = False - hit_inner_finally = False - - try: - try: - raise Exception, 'inner exception' - except: - hit_inner_except = True - finally: - hit_inner_finally = True - finally: - hit_finally = True - - self.assertTrue(hit_inner_except) - self.assertTrue(hit_inner_finally) - self.assertTrue(hit_finally) - - def test_nested_else(self): - hit_else = False - hit_finally = False - hit_except = False - hit_inner_except = False - hit_inner_else = False - - try: - try: - pass - except: - hit_inner_except = True - else: - hit_inner_else = True - - raise Exception, 'outer exception' - except: - hit_except = True - else: - hit_else = True - finally: - hit_finally = True - - self.assertFalse(hit_inner_except) - self.assertTrue(hit_inner_else) - self.assertFalse(hit_else) - self.assertTrue(hit_finally) - self.assertTrue(hit_except) - -def test_main(): - run_unittest(ExceptionTestCase) - -if __name__ == '__main__': - test_main() + +from test.test_support import run_unittest +import unittest + +class ExceptionTestCase(unittest.TestCase): + def test_try_except_else_finally(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + raise Exception, 'nyaa!' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + self.assertFalse(hit_else) + + def test_try_except_else_finally_no_exception(self): + hit_except = False + hit_else = False + hit_finally = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + self.assertTrue(hit_else) + + def test_try_except_finally(self): + hit_except = False + hit_finally = False + + try: + raise Exception, 'yarr!' + except: + hit_except = True + finally: + hit_finally = True + + self.assertTrue(hit_except) + self.assertTrue(hit_finally) + + def test_try_except_finally_no_exception(self): + hit_except = False + hit_finally = False + + try: + pass + except: + hit_except = True + finally: + hit_finally = True + + self.assertFalse(hit_except) + self.assertTrue(hit_finally) + + def test_try_except(self): + hit_except = False + + try: + raise Exception, 'ahoy!' + except: + hit_except = True + + self.assertTrue(hit_except) + + def test_try_except_no_exception(self): + hit_except = False + + try: + pass + except: + hit_except = True + + self.assertFalse(hit_except) + + def test_try_except_else(self): + hit_except = False + hit_else = False + + try: + raise Exception, 'foo!' + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_else) + self.assertTrue(hit_except) + + def test_try_except_else_no_exception(self): + hit_except = False + hit_else = False + + try: + pass + except: + hit_except = True + else: + hit_else = True + + self.assertFalse(hit_except) + self.assertTrue(hit_else) + + def test_try_finally_no_exception(self): + hit_finally = False + + try: + pass + finally: + hit_finally = True + + self.assertTrue(hit_finally) + + def test_nested(self): + hit_finally = False + hit_inner_except = False + hit_inner_finally = False + + try: + try: + raise Exception, 'inner exception' + except: + hit_inner_except = True + finally: + hit_inner_finally = True + finally: + hit_finally = True + + self.assertTrue(hit_inner_except) + self.assertTrue(hit_inner_finally) + self.assertTrue(hit_finally) + + def test_nested_else(self): + hit_else = False + hit_finally = False + hit_except = False + hit_inner_except = False + hit_inner_else = False + + try: + try: + pass + except: + hit_inner_except = True + else: + hit_inner_else = True + + raise Exception, 'outer exception' + except: + hit_except = True + else: + hit_else = True + finally: + hit_finally = True + + self.assertFalse(hit_inner_except) + self.assertTrue(hit_inner_else) + self.assertFalse(hit_else) + self.assertTrue(hit_finally) + self.assertTrue(hit_except) + +def test_main(): + run_unittest(ExceptionTestCase) + +if __name__ == '__main__': + test_main() From python-checkins at python.org Wed Mar 1 07:28:58 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 07:28:58 +0100 (CET) Subject: [Python-checkins] r42725 - in python/trunk/PC: example_nt/readme.txt os2vacpp/readme.txt readme.txt testpy.py Message-ID: <20060301062858.A21541E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 07:28:58 2006 New Revision: 42725 Modified: python/trunk/PC/example_nt/readme.txt (contents, props changed) python/trunk/PC/os2vacpp/readme.txt (props changed) python/trunk/PC/readme.txt (contents, props changed) python/trunk/PC/testpy.py (contents, props changed) Log: Remove svn:mime-type (inexplicably set to a binary type), and set svn:eol-style to native, on some text files. Modified: python/trunk/PC/example_nt/readme.txt ============================================================================== Binary files. No diff available. Modified: python/trunk/PC/readme.txt ============================================================================== Binary files. No diff available. Modified: python/trunk/PC/testpy.py ============================================================================== Binary files. No diff available. From python-checkins at python.org Wed Mar 1 09:59:13 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 1 Mar 2006 09:59:13 +0100 (CET) Subject: [Python-checkins] r42726 - peps/trunk/pep-0000.txt Message-ID: <20060301085913.B74F91E4002@bag.python.org> Author: neal.norwitz Date: Wed Mar 1 09:59:06 2006 New Revision: 42726 Modified: peps/trunk/pep-0000.txt Log: Forgot to update both places for the status Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Wed Mar 1 09:59:06 2006 @@ -405,7 +405,7 @@ SD 349 Allow str() to return unicode strings Schemenauer I 350 Codetags Elliott SR 351 The freeze protocol Warsaw - SA 352 Required Superclass for Exceptions GvR, Cannon + SF 352 Required Superclass for Exceptions GvR, Cannon SA 353 Using ssize_t as the index type von Loewis S 354 Enumerations in Python Finney S 355 Path - Object oriented filesystem paths Lindqvist From nnorwitz at gmail.com Wed Mar 1 10:07:12 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 1 Mar 2006 01:07:12 -0800 Subject: [Python-checkins] r42718 - peps/trunk/pep-3000.txt In-Reply-To: <9e804ac0602282156s65daf829j208f073146570861@mail.gmail.com> References: <20060301053251.39C231E4002@bag.python.org> <004901c63cf4$0b6e90c0$6a01a8c0@RaymondLaptop1> <9e804ac0602282156s65daf829j208f073146570861@mail.gmail.com> Message-ID: On 2/28/06, Thomas Wouters wrote: > On 3/1/06, Raymond Hettinger wrote: > > > -* Return iterators instead of lists where appropriate for atomic type methods > > > - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) > > > - (Do we keep iter*() methods or remove them? I vote remove. -- nn) > > > > The last line doesn't make sense to me. I had thought the direction was to keep > > simple names like range(), dict.items(), dict.keys(), and dict.values() and have > > them return an iterator instead of a list. When that is done, then the current > > iterator versions will be redundant and we can kill-off the weird names like > > xrange(), dict.iter_items(), dict.iter_keys(), and dict.iter_values(). > > I can't read Neal's original question as anything other than a > suggestion to do exactly that, asking for confirmation. I agree with > his suggestion, and I guess you do too :-) Right and so does Guido. dict.iter*() methods will be removed in 3. We made a bunch more modifications to the PEP, but we didn't have internet access while in the airport. n From neal at metaslash.com Wed Mar 1 11:30:20 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 05:30:20 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (80) Message-ID: <20060301103020.GA5496@python.psfb.org> test_opcodes leaked [32, 32, 32] references test_builtin leaked [109, 109, 109] references test_exceptions leaked [1, 1, 1] references test___all__ leaked [397, 397, 397] references test__locale leaked [2, 2, 2] references test_array leaked [134, 134, 134] references test_ast leaked [175, 175, 175] references test_audioop leaked [77, 77, 77] references test_binop leaked [51, 51, 51] references test_bisect leaked [26, 26, 26] references test_bool leaked [2, 2, 2] references test_cProfile leaked [1, 1, 1] references test_cfgparser leaked [0, 0, -54] references test_class leaked [193, 193, 193] references test_cmd_line leaked [0, 15, -15] references test_code leaked [41, 41, 41] references test_codecmaps_cn leaked [58985, 58985, 58985] references test_codecmaps_hk leaked [9636, 9636, 9636] references test_codecmaps_jp leaked [101531, 101531, 101531] references test_codecmaps_kr leaked [85342, 85342, 85342] references test_codecmaps_tw leaked [54682, 54682, 54682] references test_codeop leaked [220, 220, 220] references test_coercion leaked [2187, 2187, 2187] references test_compile leaked [25175, 25175, 25175] references test_compiler leaked [3736, 2016, 978] references test_cookie leaked [132, 132, 132] references test_datetime leaked [60, 60, 60] references test_decorators leaked [26, 26, 26] references test_deque leaked [317, 317, 317] references test_descr leaked [5830, 5830, 5830] references test_descrtut leaked [355, 355, 355] references test_distutils leaked [45, 45, 45] references test_doctest leaked [2736, 2736, 2736] references test_doctest2 leaked [37, 37, 37] references test_dumbdbm leaked [351, 345, 324] references test_extcall leaked [689, 689, 689] references test_funcattrs leaked [3, 3, 3] references test_future leaked [110, 110, 110] references test_gc leaked [1, 1, 1] references test_generators leaked [1459, 1459, 1459] references test_genexps leaked [307, 307, 307] references test_getopt leaked [90, 90, 90] references test_gettext leaked [130, 130, 130] references test_global leaked [18, 18, 18] references test_import leaked [65027, 65027, 65027] references test_itertools leaked [372, 372, 372] references test_long leaked [86, 86, 86] references test_long_future leaked [36, 36, 36] references test_longexp leaked [65580, 65580, 65580] references test_math leaked [1, 1, 1] references test_new leaked [8, 8, 8] references test_ntpath leaked [280, 280, 280] references test_parser leaked [8, 8, 8] references test_peepholer leaked [97, 97, 97] references test_pep352 leaked [1, 1, 1] references test_pickle leaked [28, 28, 28] references test_pickletools leaked [324, 324, 324] references test_pkg leaked [143, 143, 143] references test_pkgimport leaked [3, 3, 3] references test_popen leaked [11, 11, 11] references test_profile leaked [1, 1, 1] references test_re leaked [680, 680, 680] references test_regex leaked [225, 225, 225] references test_scope leaked [67, 67, 67] references test_set leaked [120, 120, 120] references test_sets leaked [183, 183, 183] references test_site leaked [2, 2, 2] references test_socket_ssl leaked [20, 0, 0] references test_symtable leaked [5, 5, 5] references test_syntax leaked [85, 85, 85] references test_sys leaked [3, 3, 3] references test_threadedtempfile leaked [4, 1, 0] references test_threading_local leaked [278, 270, 278] references test_traceback leaked [9, 9, 9] references test_transformer leaked [14, 14, 14] references test_ucn leaked [49, 49, 49] references test_unary leaked [14, 14, 14] references test_unittest leaked [22, 22, 22] references test_univnewlines leaked [35, 35, 35] references test_unpack leaked [123, 123, 123] references test_urllib2 leaked [80, -130, 70] references test_weakref leaked [128, 128, 128] references test_xml_etree leaked [323, 323, 323] references test_xml_etree_c leaked [280, 280, 280] references test_zipimport leaked [50, 50, 50] references test_inspect leaked [30, 30, 30] references test_grammar leaked [49, 49, 49] references From neal at metaslash.com Wed Mar 1 11:52:52 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 05:52:52 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) Message-ID: <20060301105252.GA7271@python.psfb.org> TEXINPUTS=/home/neal/python/trunk/Doc/commontex: python /home/neal/python/trunk/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/api api/api.tex *** Session transcript and error messages are in /home/neal/python/trunk/Doc/html/api/api.how. *** Exited with status 1. The relevant lines from the transcript are: ------------------------------------------------------------------------ +++ latex api This is TeX, Version 3.14159 (Web2C 7.4.5) (/home/neal/python/trunk/Doc/api/api.tex LaTeX2e <2001/06/01> Babel and hyphenation patterns for american, french, german, ngerman, n ohyphenation, loaded. (/home/neal/python/trunk/Doc/texinputs/manual.cls Document Class: manual 1998/03/03 Document class (Python manual) (/home/neal/python/trunk/Doc/texinputs/pypaper.sty (/usr/share/texmf/tex/latex/psnfss/times.sty) Using Times instead of Computer Modern. ) (/usr/share/texmf/tex/latex/misc/fancybox.sty Style option: `fancybox' v1.3 <2000/09/19> (tvz) ) (/usr/share/texmf/tex/latex/base/report.cls Document Class: report 2001/04/21 v1.4e Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) (/home/neal/python/trunk/Doc/texinputs/fancyhdr.sty) Using fancier footers than usual. (/home/neal/python/trunk/Doc/texinputs/fncychap.sty) Using fancy chapter headings. (/home/neal/python/trunk/Doc/texinputs/python.sty (/usr/share/texmf/tex/latex/tools/longtable.sty) (/home/neal/python/trunk/Doc/texinputs/underscore.sty) (/usr/share/texmf/tex/latex/tools/verbatim.sty) (/usr/share/texmf/tex/latex/base/alltt.sty))) (/home/neal/python/trunk/Doc/commontex/boilerplate.tex (/home/neal/python/trunk/Doc/commontex/patchlevel.tex)) Writing index file api.idx No file api.aux. (/usr/share/texmf/tex/latex/psnfss/ot1ptm.fd) (/usr/share/texmf/tex/latex/psnfss/ot1phv.fd) [1] (/home/neal/python/trunk/Doc/commontex/copyright.tex (/usr/share/texmf/tex/latex/psnfss/omsptm.fd)) [2] Adding blank page after the abstract. [1] [2] No file api.toc. Adding blank page after the table of contents. [1] [2] (/home/neal/python/trunk/Doc/api/intro.tex Chapter 1. (/usr/share/texmf/tex/latex/psnfss/ot1pcr.fd) Underfull \hbox (badness 10000) in paragraph at lines 45--46 [1] [2] [3] [4] [5] [6] [7]) (/home/neal/python/trunk/Doc/api/veryhigh.tex [8] Chapter 2. [9] [10]) (/home/neal/python/trunk/Doc/api/refcounting.tex [11] [12] Chapter 3. ) (/home/neal/python/trunk/Doc/api/exceptions.tex [13] [14] Chapter 4. [15] [16] [17] [18]) (/home/neal/python/trunk/Doc/api/utilities.tex [19] [20] Chapter 5. [21] [22] [23] [24] Underfull \hbox (badness 10000) in paragraph at lines 450--453 []\OT1/ptm/m/n/10 This [25] Underfull \hbox (badness 10000) in paragraph at lines 471--474 [] Overfull \hbox (68.01pt too wide) in paragraph at lines 477--481 [] Underfull \hbox (badness 10000) in paragraph at lines 513--516 [] [26] [27] [28] [29]) Runaway argument? {Py_ssize_t) to a Python integer or long integer. \versionadded {2.5}\ETC. ! File ended while scanning use of \ctype. \par l.43 \input{utilities} ? ! Emergency stop. \par l.43 \input{utilities} Output written on api.dvi (35 pages, 111836 bytes). Transcript written on api.log. *** Session transcript and error messages are in /home/neal/python/trunk/Doc/html/api/api.how. *** Exited with status 1. +++ TEXINPUTS=/home/neal/python/trunk/Doc/api:/home/neal/python/trunk/Doc/commontex:/home/neal/python/trunk/Doc/paper-letter:/home/neal/python/trunk/Doc/texinputs: +++ latex api make: *** [html/api/api.html] Error 1 From dynkin at gmail.com Wed Mar 1 12:29:18 2006 From: dynkin at gmail.com (George Yoshida) Date: Wed, 1 Mar 2006 20:29:18 +0900 Subject: [Python-checkins] Python Regression Test Failures doc (1) In-Reply-To: <20060301105252.GA7271@python.psfb.org> References: <20060301105252.GA7271@python.psfb.org> Message-ID: <2f188ee80603010329i57c0cd19wf49447fdb6d51fe3@mail.gmail.com> Index: Doc/api/utilities.tex =================================================================== --- Doc/api/utilities.tex (revision 42726) +++ Doc/api/utilities.tex (working copy) @@ -871,7 +871,7 @@ Only available on platforms that support \ctype{unsigned long long}. \item[\samp{n} (int) {[Py_ssize_t]}] - Convert a C \ctype{Py_ssize_t) to a Python integer or long integer. + Convert a C \ctype{Py_ssize_t} to a Python integer or long integer. \versionadded{2.5} -- george On 3/1/06, Neal Norwitz wrote: > TEXINPUTS=/home/neal/python/trunk/Doc/commontex: python /home/neal/python/trunk/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/api api/api.tex > *** Session transcript and error messages are in /home/neal/python/trunk/Doc/html/api/api.how. > *** Exited with status 1. From python-checkins at python.org Wed Mar 1 13:43:55 2006 From: python-checkins at python.org (fredrik.lundh) Date: Wed, 1 Mar 2006 13:43:55 +0100 (CET) Subject: [Python-checkins] r42727 - python/trunk/Doc/api/utilities.tex Message-ID: <20060301124355.DB8BC1E4002@bag.python.org> Author: fredrik.lundh Date: Wed Mar 1 13:43:53 2006 New Revision: 42727 Modified: python/trunk/Doc/api/utilities.tex Log: markup glitch (spotted by George Yoshida) Modified: python/trunk/Doc/api/utilities.tex ============================================================================== --- python/trunk/Doc/api/utilities.tex (original) +++ python/trunk/Doc/api/utilities.tex Wed Mar 1 13:43:53 2006 @@ -871,7 +871,7 @@ Only available on platforms that support \ctype{unsigned long long}. \item[\samp{n} (int) {[Py_ssize_t]}] - Convert a C \ctype{Py_ssize_t) to a Python integer or long integer. + Convert a C \ctype{Py_ssize_t} to a Python integer or long integer. \versionadded{2.5} \item[\samp{c} (string of length 1) {[char]}] From python-checkins at python.org Wed Mar 1 16:02:25 2006 From: python-checkins at python.org (jeremy.hylton) Date: Wed, 1 Mar 2006 16:02:25 +0100 (CET) Subject: [Python-checkins] r42728 - python/trunk/Python/pyarena.c Message-ID: <20060301150225.75D2F1E4002@bag.python.org> Author: jeremy.hylton Date: Wed Mar 1 16:02:24 2006 New Revision: 42728 Modified: python/trunk/Python/pyarena.c Log: Add missing DECREF. Modified: python/trunk/Python/pyarena.c ============================================================================== --- python/trunk/Python/pyarena.c (original) +++ python/trunk/Python/pyarena.c Wed Mar 1 16:02:24 2006 @@ -159,5 +159,9 @@ int PyArena_AddPyObject(PyArena *arena, PyObject *obj) { - return PyList_Append(arena->a_objects, obj) >= 0; + int r = PyList_Append(arena->a_objects, obj); + if (r >= 0) { + Py_DECREF(obj); + } + return r; } From python-checkins at python.org Wed Mar 1 16:47:07 2006 From: python-checkins at python.org (jeremy.hylton) Date: Wed, 1 Mar 2006 16:47:07 +0100 (CET) Subject: [Python-checkins] r42729 - python/trunk/Python/compile.c Message-ID: <20060301154707.488C01E42A8@bag.python.org> Author: jeremy.hylton Date: Wed Mar 1 16:47:05 2006 New Revision: 42729 Modified: python/trunk/Python/compile.c Log: Tabify and reflow some long lines. Much of the peephole optimizer is now indented badly, but it's about to be revised anyway. Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Wed Mar 1 16:47:05 2006 @@ -5,18 +5,18 @@ * PyCodeObject. The compiler makes several passes to build the code * object: * 1. Checks for future statements. See future.c - * 2. Builds a symbol table. See symtable.c. - * 3. Generate code for basic blocks. See compiler_mod() in this file. + * 2. Builds a symbol table. See symtable.c. + * 3. Generate code for basic blocks. See compiler_mod() in this file. * 4. Assemble the basic blocks into final code. See assemble() in - * this file. + * this file. * * Note that compiler_mod() suggests module, but the module ast type * (mod_ty) has cases for expressions and interactive statements. * - * CAUTION: The VISIT_* macros abort the current function when they encounter - * a problem. So don't invoke them when there is memory which needs to be - * released. Code blocks are OK, as the compiler structure takes care of - * releasing those. + * CAUTION: The VISIT_* macros abort the current function when they + * encounter a problem. So don't invoke them when there is memory + * which needs to be released. Code blocks are OK, as the compiler + * structure takes care of releasing those. */ #include "Python.h" @@ -33,16 +33,16 @@ int Py_OptimizeFlag = 0; /* - ISSUES: + ISSUES: - character encodings aren't handled + character encodings aren't handled - ref leaks in interpreter when press return on empty line + ref leaks in interpreter when press return on empty line - opcode_stack_effect() function should be reviewed since stack depth bugs - could be really hard to find later. + opcode_stack_effect() function should be reviewed since stack depth bugs + could be really hard to find later. - Dead code is being generated (i.e. after unconditional jumps). + Dead code is being generated (i.e. after unconditional jumps). */ #define DEFAULT_BLOCK_SIZE 16 @@ -80,20 +80,20 @@ /* depth of stack upon entry of block, computed by stackdepth() */ int b_startdepth; /* instruction offset for block, computed by assemble_jump_offsets() */ - int b_offset; + int b_offset; } basicblock; /* fblockinfo tracks the current frame block. - A frame block is used to handle loops, try/except, and try/finally. - It's called a frame block to distinguish it from a basic block in the - compiler IR. +A frame block is used to handle loops, try/except, and try/finally. +It's called a frame block to distinguish it from a basic block in the +compiler IR. */ enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END }; struct fblockinfo { - enum fblocktype fb_type; + enum fblocktype fb_type; basicblock *fb_block; }; @@ -105,7 +105,7 @@ PyObject *u_name; /* The following fields are dicts that map objects to - the index of them in co_XXX. The index is used as + the index of them in co_XXX. The index is used as the argument for opcodes that refer to those collections. */ PyObject *u_consts; /* all constants */ @@ -116,50 +116,50 @@ PyObject *u_private; /* for private name mangling */ - int u_argcount; /* number of arguments for block */ + int u_argcount; /* number of arguments for block */ basicblock *u_blocks; /* pointer to list of blocks */ basicblock *u_curblock; /* pointer to current block */ - int u_tmpname; /* temporary variables for list comps */ + int u_tmpname; /* temporary variables for list comps */ int u_nfblocks; struct fblockinfo u_fblock[CO_MAXBLOCKS]; int u_firstlineno; /* the first lineno of the block */ - int u_lineno; /* the lineno for the current stmt */ + int u_lineno; /* the lineno for the current stmt */ bool u_lineno_set; /* boolean to indicate whether instr has been generated with current lineno */ }; /* This struct captures the global state of a compilation. - The u pointer points to the current compilation unit, while units - for enclosing blocks are stored in c_stack. The u and c_stack are - managed by compiler_enter_scope() and compiler_exit_scope(). +The u pointer points to the current compilation unit, while units +for enclosing blocks are stored in c_stack. The u and c_stack are +managed by compiler_enter_scope() and compiler_exit_scope(). */ struct compiler { const char *c_filename; struct symtable *c_st; - PyFutureFeatures *c_future; /* pointer to module's __future__ */ + PyFutureFeatures *c_future; /* pointer to module's __future__ */ PyCompilerFlags *c_flags; int c_interactive; - int c_nestlevel; + int c_nestlevel; - struct compiler_unit *u; /* compiler state for current block */ - PyObject *c_stack; /* Python list holding compiler_unit ptrs */ + struct compiler_unit *u; /* compiler state for current block */ + PyObject *c_stack; /* Python list holding compiler_unit ptrs */ char *c_encoding; /* source encoding (a borrowed reference) */ - PyArena *c_arena; /* pointer to memory allocation arena */ + PyArena *c_arena; /* pointer to memory allocation arena */ }; struct assembler { PyObject *a_bytecode; /* string containing bytecode */ - int a_offset; /* offset into bytecode */ - int a_nblocks; /* number of reachable blocks */ + int a_offset; /* offset into bytecode */ + int a_nblocks; /* number of reachable blocks */ basicblock **a_postorder; /* list of blocks in dfs postorder */ PyObject *a_lnotab; /* string containing lnotab */ int a_lnotab_off; /* offset into lnotab */ - int a_lineno; /* last lineno of emitted instruction */ + int a_lineno; /* last lineno of emitted instruction */ int a_lineno_off; /* bytecode offset of last lineno */ }; @@ -201,33 +201,34 @@ { /* Name mangling: __private becomes _classname__private. This is independent from how the name is used. */ - const char *p, *name = PyString_AsString(ident); - char *buffer; + const char *p, *name = PyString_AsString(ident); + char *buffer; size_t nlen, plen; - if (private == NULL || name == NULL || name[0] != '_' || name[1] != '_') { - Py_INCREF(ident); + if (private == NULL || name == NULL || name[0] != '_' || + name[1] != '_') { + Py_INCREF(ident); return ident; - } - p = PyString_AsString(private); + } + p = PyString_AsString(private); nlen = strlen(name); if (name[nlen-1] == '_' && name[nlen-2] == '_') { - Py_INCREF(ident); + Py_INCREF(ident); return ident; /* Don't mangle __whatever__ */ - } + } /* Strip leading underscores from class name */ while (*p == '_') p++; if (*p == '\0') { - Py_INCREF(ident); + Py_INCREF(ident); return ident; /* Don't mangle if class is just underscores */ - } + } plen = strlen(p); - ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen); - if (!ident) - return 0; + ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen); + if (!ident) + return 0; /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ - buffer = PyString_AS_STRING(ident); - buffer[0] = '_'; + buffer = PyString_AS_STRING(ident); + buffer[0] = '_'; strncpy(buffer+1, p, plen); strcpy(buffer+1+plen, name); return ident; @@ -247,35 +248,35 @@ PyCodeObject * PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, - PyArena *arena) + PyArena *arena) { struct compiler c; PyCodeObject *co = NULL; - PyCompilerFlags local_flags; - int merged; + PyCompilerFlags local_flags; + int merged; - if (!__doc__) { - __doc__ = PyString_InternFromString("__doc__"); - if (!__doc__) - return NULL; - } + if (!__doc__) { + __doc__ = PyString_InternFromString("__doc__"); + if (!__doc__) + return NULL; + } if (!compiler_init(&c)) return NULL; c.c_filename = filename; - c.c_arena = arena; + c.c_arena = arena; c.c_future = PyFuture_FromAST(mod, filename); if (c.c_future == NULL) goto finally; if (!flags) { - local_flags.cf_flags = 0; - flags = &local_flags; - } - merged = c.c_future->ff_features | flags->cf_flags; - c.c_future->ff_features = merged; - flags->cf_flags = merged; - c.c_flags = flags; - c.c_nestlevel = 0; + local_flags.cf_flags = 0; + flags = &local_flags; + } + merged = c.c_future->ff_features | flags->cf_flags; + c.c_future->ff_features = merged; + flags->cf_flags = merged; + c.c_flags = flags; + c.c_nestlevel = 0; c.c_st = PySymtable_Build(mod, filename, c.c_future); if (c.c_st == NULL) { @@ -299,11 +300,11 @@ PyNode_Compile(struct _node *n, const char *filename) { PyCodeObject *co = NULL; - PyArena *arena = PyArena_New(); + PyArena *arena = PyArena_New(); mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); if (mod) co = PyAST_Compile(mod, filename, NULL, arena); - PyArena_Free(arena); + PyArena_Free(arena); return co; } @@ -330,8 +331,8 @@ Py_DECREF(dict); return NULL; } - k = PyList_GET_ITEM(list, i); - k = Py_BuildValue("(OO)", k, k->ob_type); + k = PyList_GET_ITEM(list, i); + k = Py_BuildValue("(OO)", k, k->ob_type); if (k == NULL || PyDict_SetItem(dict, k, v) < 0) { Py_XDECREF(k); Py_DECREF(v); @@ -346,10 +347,10 @@ /* Return new dict containing names from src that match scope(s). - src is a symbol table dictionary. If the scope of a name matches - either scope_type or flag is set, insert it into the new dict. The - values are integers, starting at offset and increasing by one for - each key. +src is a symbol table dictionary. If the scope of a name matches +either scope_type or flag is set, insert it into the new dict. The +values are integers, starting at offset and increasing by one for +each key. */ static PyObject * @@ -358,32 +359,32 @@ Py_ssize_t pos = 0, i = offset, scope; PyObject *k, *v, *dest = PyDict_New(); - assert(offset >= 0); - if (dest == NULL) - return NULL; + assert(offset >= 0); + if (dest == NULL) + return NULL; while (PyDict_Next(src, &pos, &k, &v)) { - /* XXX this should probably be a macro in symtable.h */ - assert(PyInt_Check(v)); - scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK; - - if (scope == scope_type || PyInt_AS_LONG(v) & flag) { - PyObject *tuple, *item = PyInt_FromLong(i); - if (item == NULL) { - Py_DECREF(dest); - return NULL; - } - i++; - tuple = Py_BuildValue("(OO)", k, k->ob_type); - if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { + /* XXX this should probably be a macro in symtable.h */ + assert(PyInt_Check(v)); + scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK; + + if (scope == scope_type || PyInt_AS_LONG(v) & flag) { + PyObject *tuple, *item = PyInt_FromLong(i); + if (item == NULL) { + Py_DECREF(dest); + return NULL; + } + i++; + tuple = Py_BuildValue("(OO)", k, k->ob_type); + if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { + Py_DECREF(item); + Py_DECREF(dest); + Py_XDECREF(tuple); + return NULL; + } Py_DECREF(item); - Py_DECREF(dest); - Py_XDECREF(tuple); - return NULL; + Py_DECREF(tuple); } - Py_DECREF(item); - Py_DECREF(tuple); - } } return dest; } @@ -391,17 +392,18 @@ /* Begin: Peephole optimizations ----------------------------------------- */ #define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1])) -#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) +#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP) #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3)) #define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255 #define CODESIZE(op) (HAS_ARG(op) ? 3 : 1) -#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1]) +#define ISBASICBLOCK(blocks, start, bytes) \ + (blocks[start]==blocks[start+bytes-1]) /* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n - with LOAD_CONST (c1, c2, ... cn). + with LOAD_CONST (c1, c2, ... cn). The consts table must still be in list form so that the - new constant (c1, c2, ... cn) can be appended. + new constant (c1, c2, ... cn) can be appended. Called with codestr pointing to the first LOAD_CONST. Bails out with no change if one or more of the LOAD_CONSTs is missing. Also works for BUILD_LIST when followed by an "in" or "not in" test. @@ -448,14 +450,14 @@ } /* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP - with LOAD_CONST binop(c1,c2) + with LOAD_CONST binop(c1,c2) The consts table must still be in list form so that the - new constant can be appended. + new constant can be appended. Called with codestr pointing to the first LOAD_CONST. Abandons the transformation if the folding fails (i.e. 1+'a'). If the new constant is a sequence, only folds when the size - is below a threshold value. That keeps pyc files from - becoming large in the presence of code like: (None,)*1000. + is below a threshold value. That keeps pyc files from + becoming large in the presence of code like: (None,)*1000. */ static int fold_binops_on_constants(unsigned char *codestr, PyObject *consts) @@ -474,55 +476,56 @@ w = PyList_GET_ITEM(consts, GETARG(codestr, 3)); opcode = codestr[6]; switch (opcode) { - case BINARY_POWER: - newconst = PyNumber_Power(v, w, Py_None); - break; - case BINARY_MULTIPLY: - newconst = PyNumber_Multiply(v, w); - break; - case BINARY_DIVIDE: - /* Cannot fold this operation statically since - the result can depend on the run-time presence of the -Qnew flag */ - return 0; - case BINARY_TRUE_DIVIDE: - newconst = PyNumber_TrueDivide(v, w); - break; - case BINARY_FLOOR_DIVIDE: - newconst = PyNumber_FloorDivide(v, w); - break; - case BINARY_MODULO: - newconst = PyNumber_Remainder(v, w); - break; - case BINARY_ADD: - newconst = PyNumber_Add(v, w); - break; - case BINARY_SUBTRACT: - newconst = PyNumber_Subtract(v, w); - break; - case BINARY_SUBSCR: - newconst = PyObject_GetItem(v, w); - break; - case BINARY_LSHIFT: - newconst = PyNumber_Lshift(v, w); - break; - case BINARY_RSHIFT: - newconst = PyNumber_Rshift(v, w); - break; - case BINARY_AND: - newconst = PyNumber_And(v, w); - break; - case BINARY_XOR: - newconst = PyNumber_Xor(v, w); - break; - case BINARY_OR: - newconst = PyNumber_Or(v, w); - break; - default: - /* Called with an unknown opcode */ - PyErr_Format(PyExc_SystemError, + case BINARY_POWER: + newconst = PyNumber_Power(v, w, Py_None); + break; + case BINARY_MULTIPLY: + newconst = PyNumber_Multiply(v, w); + break; + case BINARY_DIVIDE: + /* Cannot fold this operation statically since + the result can depend on the run-time presence + of the -Qnew flag */ + return 0; + case BINARY_TRUE_DIVIDE: + newconst = PyNumber_TrueDivide(v, w); + break; + case BINARY_FLOOR_DIVIDE: + newconst = PyNumber_FloorDivide(v, w); + break; + case BINARY_MODULO: + newconst = PyNumber_Remainder(v, w); + break; + case BINARY_ADD: + newconst = PyNumber_Add(v, w); + break; + case BINARY_SUBTRACT: + newconst = PyNumber_Subtract(v, w); + break; + case BINARY_SUBSCR: + newconst = PyObject_GetItem(v, w); + break; + case BINARY_LSHIFT: + newconst = PyNumber_Lshift(v, w); + break; + case BINARY_RSHIFT: + newconst = PyNumber_Rshift(v, w); + break; + case BINARY_AND: + newconst = PyNumber_And(v, w); + break; + case BINARY_XOR: + newconst = PyNumber_Xor(v, w); + break; + case BINARY_OR: + newconst = PyNumber_Or(v, w); + break; + default: + /* Called with an unknown opcode */ + PyErr_Format(PyExc_SystemError, "unexpected binary operation %d on a constant", - opcode); - return 0; + opcode); + return 0; } if (newconst == NULL) { PyErr_Clear(); @@ -566,23 +569,23 @@ v = PyList_GET_ITEM(consts, GETARG(codestr, 0)); opcode = codestr[3]; switch (opcode) { - case UNARY_NEGATIVE: - /* Preserve the sign of -0.0 */ - if (PyObject_IsTrue(v) == 1) - newconst = PyNumber_Negative(v); - break; - case UNARY_CONVERT: - newconst = PyObject_Repr(v); - break; - case UNARY_INVERT: - newconst = PyNumber_Invert(v); - break; - default: - /* Called with an unknown opcode */ - PyErr_Format(PyExc_SystemError, + case UNARY_NEGATIVE: + /* Preserve the sign of -0.0 */ + if (PyObject_IsTrue(v) == 1) + newconst = PyNumber_Negative(v); + break; + case UNARY_CONVERT: + newconst = PyObject_Repr(v); + break; + case UNARY_INVERT: + newconst = PyNumber_Invert(v); + break; + default: + /* Called with an unknown opcode */ + PyErr_Format(PyExc_SystemError, "unexpected unary operation %d on a constant", - opcode); - return 0; + opcode); + return 0; } if (newconst == NULL) { PyErr_Clear(); @@ -629,12 +632,12 @@ case SETUP_FINALLY: j = GETJUMPTGT(code, i); blocks[j] = 1; - break; + break; } } /* Build block numbers in the second pass */ for (i=0 ; i= 255. Optimizations are restricted to simple transformations occuring within a - single basic block. All transformations keep the code size the same or + single basic block. All transformations keep the code size the same or smaller. For those that reduce size, the gaps are initially filled with NOPs. Later those NOPs are removed and the jump addresses retargeted in a single pass. Line numbering is adjusted accordingly. */ static PyObject * -optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj) +optimize_code(PyObject *code, PyObject* consts, PyObject *names, + PyObject *lineno_obj) { Py_ssize_t i, j, codelen; int nops, h, adj; @@ -665,7 +669,7 @@ unsigned char *lineno; int *addrmap = NULL; int new_line, cum_orig_line, last_line, tabsiz; - int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */ + int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */ unsigned int *blocks = NULL; char *name; @@ -692,7 +696,7 @@ goto exitUnchanged; codestr = memcpy(codestr, PyString_AS_STRING(code), codelen); - /* Verify that RETURN_VALUE terminates the codestring. This allows + /* Verify that RETURN_VALUE terminates the codestring. This allows the various transformation patterns to look ahead several instructions without additional checks to make sure they are not looking beyond the end of the code string. @@ -718,206 +722,208 @@ switch (opcode) { - /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with - with JUMP_IF_TRUE POP_TOP */ - case UNARY_NOT: - if (codestr[i+1] != JUMP_IF_FALSE || - codestr[i+4] != POP_TOP || - !ISBASICBLOCK(blocks,i,5)) - continue; - tgt = GETJUMPTGT(codestr, (i+1)); - if (codestr[tgt] != POP_TOP) - continue; - j = GETARG(codestr, i+1) + 1; - codestr[i] = JUMP_IF_TRUE; - SETARG(codestr, i, j); - codestr[i+3] = POP_TOP; - codestr[i+4] = NOP; - break; + /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with + with JUMP_IF_TRUE POP_TOP */ + case UNARY_NOT: + if (codestr[i+1] != JUMP_IF_FALSE || + codestr[i+4] != POP_TOP || + !ISBASICBLOCK(blocks,i,5)) + continue; + tgt = GETJUMPTGT(codestr, (i+1)); + if (codestr[tgt] != POP_TOP) + continue; + j = GETARG(codestr, i+1) + 1; + codestr[i] = JUMP_IF_TRUE; + SETARG(codestr, i, j); + codestr[i+3] = POP_TOP; + codestr[i+4] = NOP; + break; - /* not a is b --> a is not b - not a in b --> a not in b - not a is not b --> a is b - not a not in b --> a in b - */ - case COMPARE_OP: - j = GETARG(codestr, i); - if (j < 6 || j > 9 || - codestr[i+3] != UNARY_NOT || - !ISBASICBLOCK(blocks,i,4)) - continue; - SETARG(codestr, i, (j^1)); - codestr[i+3] = NOP; - break; + /* not a is b --> a is not b + not a in b --> a not in b + not a is not b --> a is b + not a not in b --> a in b + */ + case COMPARE_OP: + j = GETARG(codestr, i); + if (j < 6 || j > 9 || + codestr[i+3] != UNARY_NOT || + !ISBASICBLOCK(blocks,i,4)) + continue; + SETARG(codestr, i, (j^1)); + codestr[i+3] = NOP; + break; - /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */ - case LOAD_NAME: - case LOAD_GLOBAL: - j = GETARG(codestr, i); - name = PyString_AsString(PyTuple_GET_ITEM(names, j)); - if (name == NULL || strcmp(name, "None") != 0) - continue; - for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) { - if (PyList_GET_ITEM(consts, j) == Py_None) { - codestr[i] = LOAD_CONST; - SETARG(codestr, i, j); - cumlc = lastlc + 1; - break; + /* Replace LOAD_GLOBAL/LOAD_NAME None + with LOAD_CONST None */ + case LOAD_NAME: + case LOAD_GLOBAL: + j = GETARG(codestr, i); + name = PyString_AsString(PyTuple_GET_ITEM(names, j)); + if (name == NULL || strcmp(name, "None") != 0) + continue; + for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) { + if (PyList_GET_ITEM(consts, j) == Py_None) { + codestr[i] = LOAD_CONST; + SETARG(codestr, i, j); + cumlc = lastlc + 1; + break; + } } - } - break; - - /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */ - case LOAD_CONST: - cumlc = lastlc + 1; - j = GETARG(codestr, i); - if (codestr[i+3] != JUMP_IF_FALSE || - codestr[i+6] != POP_TOP || - !ISBASICBLOCK(blocks,i,7) || - !PyObject_IsTrue(PyList_GET_ITEM(consts, j))) - continue; - memset(codestr+i, NOP, 7); - cumlc = 0; - break; + break; - /* Try to fold tuples of constants (includes a case for lists - which are only used for "in" and "not in" tests). - Skip over BUILD_SEQN 1 UNPACK_SEQN 1. - Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2. - Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */ - case BUILD_TUPLE: - case BUILD_LIST: - j = GETARG(codestr, i); - h = i - 3 * j; - if (h >= 0 && - j <= lastlc && - ((opcode == BUILD_TUPLE && - ISBASICBLOCK(blocks, h, 3*(j+1))) || - (opcode == BUILD_LIST && - codestr[i+3]==COMPARE_OP && - ISBASICBLOCK(blocks, h, 3*(j+2)) && - (GETARG(codestr,i+3)==6 || - GETARG(codestr,i+3)==7))) && - tuple_of_constants(&codestr[h], j, consts)) { - assert(codestr[i] == LOAD_CONST); - cumlc = 1; + /* Skip over LOAD_CONST trueconst + JUMP_IF_FALSE xx POP_TOP */ + case LOAD_CONST: + cumlc = lastlc + 1; + j = GETARG(codestr, i); + if (codestr[i+3] != JUMP_IF_FALSE || + codestr[i+6] != POP_TOP || + !ISBASICBLOCK(blocks,i,7) || + !PyObject_IsTrue(PyList_GET_ITEM(consts, j))) + continue; + memset(codestr+i, NOP, 7); + cumlc = 0; break; - } - if (codestr[i+3] != UNPACK_SEQUENCE || - !ISBASICBLOCK(blocks,i,6) || - j != GETARG(codestr, i+3)) - continue; - if (j == 1) { - memset(codestr+i, NOP, 6); - } else if (j == 2) { - codestr[i] = ROT_TWO; - memset(codestr+i+1, NOP, 5); - } else if (j == 3) { - codestr[i] = ROT_THREE; - codestr[i+1] = ROT_TWO; - memset(codestr+i+2, NOP, 4); - } - break; - /* Fold binary ops on constants. - LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */ - case BINARY_POWER: - case BINARY_MULTIPLY: - case BINARY_TRUE_DIVIDE: - case BINARY_FLOOR_DIVIDE: - case BINARY_MODULO: - case BINARY_ADD: - case BINARY_SUBTRACT: - case BINARY_SUBSCR: - case BINARY_LSHIFT: - case BINARY_RSHIFT: - case BINARY_AND: - case BINARY_XOR: - case BINARY_OR: - if (lastlc >= 2 && - ISBASICBLOCK(blocks, i-6, 7) && - fold_binops_on_constants(&codestr[i-6], consts)) { - i -= 2; - assert(codestr[i] == LOAD_CONST); - cumlc = 1; - } - break; + /* Try to fold tuples of constants (includes a case for lists + which are only used for "in" and "not in" tests). + Skip over BUILD_SEQN 1 UNPACK_SEQN 1. + Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2. + Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */ + case BUILD_TUPLE: + case BUILD_LIST: + j = GETARG(codestr, i); + h = i - 3 * j; + if (h >= 0 && + j <= lastlc && + ((opcode == BUILD_TUPLE && + ISBASICBLOCK(blocks, h, 3*(j+1))) || + (opcode == BUILD_LIST && + codestr[i+3]==COMPARE_OP && + ISBASICBLOCK(blocks, h, 3*(j+2)) && + (GETARG(codestr,i+3)==6 || + GETARG(codestr,i+3)==7))) && + tuple_of_constants(&codestr[h], j, consts)) { + assert(codestr[i] == LOAD_CONST); + cumlc = 1; + break; + } + if (codestr[i+3] != UNPACK_SEQUENCE || + !ISBASICBLOCK(blocks,i,6) || + j != GETARG(codestr, i+3)) + continue; + if (j == 1) { + memset(codestr+i, NOP, 6); + } else if (j == 2) { + codestr[i] = ROT_TWO; + memset(codestr+i+1, NOP, 5); + } else if (j == 3) { + codestr[i] = ROT_THREE; + codestr[i+1] = ROT_TWO; + memset(codestr+i+2, NOP, 4); + } + break; - /* Fold unary ops on constants. - LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */ - case UNARY_NEGATIVE: - case UNARY_CONVERT: - case UNARY_INVERT: - if (lastlc >= 1 && - ISBASICBLOCK(blocks, i-3, 4) && - fold_unaryops_on_constants(&codestr[i-3], consts)) { - i -= 2; - assert(codestr[i] == LOAD_CONST); - cumlc = 1; - } - break; + /* Fold binary ops on constants. + LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */ + case BINARY_POWER: + case BINARY_MULTIPLY: + case BINARY_TRUE_DIVIDE: + case BINARY_FLOOR_DIVIDE: + case BINARY_MODULO: + case BINARY_ADD: + case BINARY_SUBTRACT: + case BINARY_SUBSCR: + case BINARY_LSHIFT: + case BINARY_RSHIFT: + case BINARY_AND: + case BINARY_XOR: + case BINARY_OR: + if (lastlc >= 2 && + ISBASICBLOCK(blocks, i-6, 7) && + fold_binops_on_constants(&codestr[i-6], consts)) { + i -= 2; + assert(codestr[i] == LOAD_CONST); + cumlc = 1; + } + break; - /* Simplify conditional jump to conditional jump where the - result of the first test implies the success of a similar - test or the failure of the opposite test. - Arises in code like: - "if a and b:" - "if a or b:" - "a and b or c" - "(a and b) and c" - x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z - x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3 - where y+3 is the instruction following the second test. - */ - case JUMP_IF_FALSE: - case JUMP_IF_TRUE: - tgt = GETJUMPTGT(codestr, i); - j = codestr[tgt]; - if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) { - if (j == opcode) { - tgttgt = GETJUMPTGT(codestr, tgt) - i - 3; - SETARG(codestr, i, tgttgt); - } else { - tgt -= i; - SETARG(codestr, i, tgt); + /* Fold unary ops on constants. + LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */ + case UNARY_NEGATIVE: + case UNARY_CONVERT: + case UNARY_INVERT: + if (lastlc >= 1 && + ISBASICBLOCK(blocks, i-3, 4) && + fold_unaryops_on_constants(&codestr[i-3], consts)) { + i -= 2; + assert(codestr[i] == LOAD_CONST); + cumlc = 1; } break; - } - /* Intentional fallthrough */ - /* Replace jumps to unconditional jumps */ - case FOR_ITER: - case JUMP_FORWARD: - case JUMP_ABSOLUTE: - case CONTINUE_LOOP: - case SETUP_LOOP: - case SETUP_EXCEPT: - case SETUP_FINALLY: - tgt = GETJUMPTGT(codestr, i); - if (!UNCONDITIONAL_JUMP(codestr[tgt])) - continue; - tgttgt = GETJUMPTGT(codestr, tgt); - if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */ - opcode = JUMP_ABSOLUTE; - if (!ABSOLUTE_JUMP(opcode)) - tgttgt -= i + 3; /* Calc relative jump addr */ - if (tgttgt < 0) /* No backward relative jumps */ - continue; - codestr[i] = opcode; - SETARG(codestr, i, tgttgt); - break; + /* Simplify conditional jump to conditional jump where the + result of the first test implies the success of a similar + test or the failure of the opposite test. + Arises in code like: + "if a and b:" + "if a or b:" + "a and b or c" + "(a and b) and c" + x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z + x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3 + where y+3 is the instruction following the second test. + */ + case JUMP_IF_FALSE: + case JUMP_IF_TRUE: + tgt = GETJUMPTGT(codestr, i); + j = codestr[tgt]; + if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) { + if (j == opcode) { + tgttgt = GETJUMPTGT(codestr, tgt) - i - 3; + SETARG(codestr, i, tgttgt); + } else { + tgt -= i; + SETARG(codestr, i, tgt); + } + break; + } + /* Intentional fallthrough */ - case EXTENDED_ARG: - goto exitUnchanged; + /* Replace jumps to unconditional jumps */ + case FOR_ITER: + case JUMP_FORWARD: + case JUMP_ABSOLUTE: + case CONTINUE_LOOP: + case SETUP_LOOP: + case SETUP_EXCEPT: + case SETUP_FINALLY: + tgt = GETJUMPTGT(codestr, i); + if (!UNCONDITIONAL_JUMP(codestr[tgt])) + continue; + tgttgt = GETJUMPTGT(codestr, tgt); + if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */ + opcode = JUMP_ABSOLUTE; + if (!ABSOLUTE_JUMP(opcode)) + tgttgt -= i + 3; /* Calc relative jump addr */ + if (tgttgt < 0) /* No backward relative jumps */ + continue; + codestr[i] = opcode; + SETARG(codestr, i, tgttgt); + break; - /* Replace RETURN LOAD_CONST None RETURN with just RETURN */ - case RETURN_VALUE: - if (i+4 >= codelen || - codestr[i+4] != RETURN_VALUE || - !ISBASICBLOCK(blocks,i,5)) - continue; - memset(codestr+i+1, NOP, 4); - break; + case EXTENDED_ARG: + goto exitUnchanged; + + /* Replace RETURN LOAD_CONST None RETURN with just RETURN */ + case RETURN_VALUE: + if (i+4 >= codelen || + codestr[i+4] != RETURN_VALUE || + !ISBASICBLOCK(blocks,i,5)) + continue; + memset(codestr+i+1, NOP, 4); + break; } } @@ -974,7 +980,7 @@ PyMem_Free(blocks); return code; -exitUnchanged: + exitUnchanged: if (blocks != NULL) PyMem_Free(blocks); if (addrmap != NULL) @@ -994,36 +1000,36 @@ static void compiler_display_symbols(PyObject *name, PyObject *symbols) { - PyObject *key, *value; - int flags; - Py_ssize_t pos = 0; - - fprintf(stderr, "block %s\n", PyString_AS_STRING(name)); - while (PyDict_Next(symbols, &pos, &key, &value)) { - flags = PyInt_AsLong(value); - fprintf(stderr, "var %s:", PyString_AS_STRING(key)); - if (flags & DEF_GLOBAL) - fprintf(stderr, " declared_global"); - if (flags & DEF_LOCAL) - fprintf(stderr, " local"); - if (flags & DEF_PARAM) - fprintf(stderr, " param"); - if (flags & DEF_STAR) - fprintf(stderr, " stararg"); - if (flags & DEF_DOUBLESTAR) - fprintf(stderr, " starstar"); - if (flags & DEF_INTUPLE) - fprintf(stderr, " tuple"); - if (flags & DEF_FREE) - fprintf(stderr, " free"); - if (flags & DEF_FREE_GLOBAL) - fprintf(stderr, " global"); - if (flags & DEF_FREE_CLASS) - fprintf(stderr, " free/class"); - if (flags & DEF_IMPORT) - fprintf(stderr, " import"); - fprintf(stderr, "\n"); - } +PyObject *key, *value; +int flags; +Py_ssize_t pos = 0; + +fprintf(stderr, "block %s\n", PyString_AS_STRING(name)); +while (PyDict_Next(symbols, &pos, &key, &value)) { +flags = PyInt_AsLong(value); +fprintf(stderr, "var %s:", PyString_AS_STRING(key)); +if (flags & DEF_GLOBAL) +fprintf(stderr, " declared_global"); +if (flags & DEF_LOCAL) +fprintf(stderr, " local"); +if (flags & DEF_PARAM) +fprintf(stderr, " param"); +if (flags & DEF_STAR) +fprintf(stderr, " stararg"); +if (flags & DEF_DOUBLESTAR) +fprintf(stderr, " starstar"); +if (flags & DEF_INTUPLE) +fprintf(stderr, " tuple"); +if (flags & DEF_FREE) +fprintf(stderr, " free"); +if (flags & DEF_FREE_GLOBAL) +fprintf(stderr, " global"); +if (flags & DEF_FREE_CLASS) +fprintf(stderr, " free/class"); +if (flags & DEF_IMPORT) +fprintf(stderr, " import"); +fprintf(stderr, "\n"); +} fprintf(stderr, "\n"); } */ @@ -1081,22 +1087,22 @@ u = PyObject_Malloc(sizeof(struct compiler_unit)); if (!u) { - PyErr_NoMemory(); - return 0; + PyErr_NoMemory(); + return 0; } - memset(u, 0, sizeof(struct compiler_unit)); + memset(u, 0, sizeof(struct compiler_unit)); u->u_argcount = 0; u->u_ste = PySymtable_Lookup(c->c_st, key); if (!u->u_ste) { - compiler_unit_free(u); - return 0; + compiler_unit_free(u); + return 0; } Py_INCREF(name); u->u_name = name; u->u_varnames = list2dict(u->u_ste->ste_varnames); u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, - PyDict_Size(u->u_cellvars)); + PyDict_Size(u->u_cellvars)); u->u_blocks = NULL; u->u_tmpname = 0; @@ -1106,31 +1112,31 @@ u->u_lineno_set = false; u->u_consts = PyDict_New(); if (!u->u_consts) { - compiler_unit_free(u); + compiler_unit_free(u); return 0; } u->u_names = PyDict_New(); if (!u->u_names) { - compiler_unit_free(u); + compiler_unit_free(u); return 0; } - u->u_private = NULL; + u->u_private = NULL; /* Push the old compiler_unit on the stack. */ if (c->u) { PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL); if (PyList_Append(c->c_stack, wrapper) < 0) { - compiler_unit_free(u); + compiler_unit_free(u); return 0; } Py_DECREF(wrapper); - u->u_private = c->u->u_private; - Py_XINCREF(u->u_private); + u->u_private = c->u->u_private; + Py_XINCREF(u->u_private); } c->u = u; - c->c_nestlevel++; + c->c_nestlevel++; if (compiler_use_new_block(c) == NULL) return 0; @@ -1143,7 +1149,7 @@ int n; PyObject *wrapper; - c->c_nestlevel--; + c->c_nestlevel--; compiler_unit_free(c->u); /* Restore c->u to the parent unit. */ n = PyList_GET_SIZE(c->c_stack) - 1; @@ -1234,7 +1240,7 @@ compiler_next_instr(struct compiler *c, basicblock *b) { assert(b != NULL); - if (b->b_instr == NULL) { + if (b->b_instr == NULL) { b->b_instr = PyObject_Malloc(sizeof(struct instr) * DEFAULT_BLOCK_SIZE); if (b->b_instr == NULL) { @@ -1244,7 +1250,7 @@ b->b_ialloc = DEFAULT_BLOCK_SIZE; memset((char *)b->b_instr, 0, sizeof(struct instr) * DEFAULT_BLOCK_SIZE); - } + } else if (b->b_iused == b->b_ialloc) { size_t oldsize, newsize; oldsize = b->b_ialloc * sizeof(struct instr); @@ -1270,7 +1276,7 @@ return; c->u->u_lineno_set = true; b = c->u->u_curblock; - b->b_instr[off].i_lineno = c->u->u_lineno; + b->b_instr[off].i_lineno = c->u->u_lineno; } static int @@ -1520,10 +1526,10 @@ PyObject *t, *v; Py_ssize_t arg; - /* necessary to make sure types aren't coerced (e.g., int and long) */ - t = PyTuple_Pack(2, o, o->ob_type); - if (t == NULL) - return -1; + /* necessary to make sure types aren't coerced (e.g., int and long) */ + t = PyTuple_Pack(2, o, o->ob_type); + if (t == NULL) + return -1; v = PyDict_GetItem(dict, t); if (!v) { @@ -1532,7 +1538,7 @@ if (!v) { Py_DECREF(t); return -1; - } + } if (PyDict_SetItem(dict, t, v) < 0) { Py_DECREF(t); Py_DECREF(v); @@ -1543,7 +1549,7 @@ else arg = PyInt_AsLong(v); Py_DECREF(t); - return arg; + return arg; } static int @@ -1552,22 +1558,22 @@ { int arg = compiler_add_o(c, dict, o); if (arg < 0) - return 0; + return 0; return compiler_addop_i(c, opcode, arg); } static int compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, - PyObject *o) + PyObject *o) { int arg; PyObject *mangled = _Py_Mangle(c->u->u_private, o); if (!mangled) - return 0; + return 0; arg = compiler_add_o(c, dict, mangled); Py_DECREF(mangled); if (arg < 0) - return 0; + return 0; return compiler_addop_i(c, opcode, arg); } @@ -1613,8 +1619,8 @@ return 1; } -/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd - like to find better names.) NEW_BLOCK() creates a new block and sets +/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd + like to find better names.) NEW_BLOCK() creates a new block and sets it as the current block. NEXT_BLOCK() also creates an implicit jump from the current block to the new block. */ @@ -1625,13 +1631,13 @@ #define NEW_BLOCK(C) { \ - if (compiler_use_new_block((C)) == NULL) \ - return 0; \ + if (compiler_use_new_block((C)) == NULL) \ + return 0; \ } #define NEXT_BLOCK(C) { \ - if (compiler_next_block((C)) == NULL) \ - return 0; \ + if (compiler_next_block((C)) == NULL) \ + return 0; \ } #define ADDOP(C, OP) { \ @@ -1718,7 +1724,7 @@ compiler_isdocstring(stmt_ty s) { if (s->kind != Expr_kind) - return 0; + return 0; return s->v.Expr.value->kind == Str_kind; } @@ -1739,8 +1745,8 @@ if (!compiler_nameop(c, __doc__, Store)) return 0; } - for (; i < asdl_seq_LEN(stmts); i++) - VISIT(c, stmt, asdl_seq_GET(stmts, i)); + for (; i < asdl_seq_LEN(stmts); i++) + VISIT(c, stmt, asdl_seq_GET(stmts, i)); return 1; } @@ -1748,7 +1754,7 @@ compiler_mod(struct compiler *c, mod_ty mod) { PyCodeObject *co; - int addNone = 1; + int addNone = 1; static PyObject *module; if (!module) { module = PyString_FromString(""); @@ -1770,13 +1776,13 @@ break; case Expression_kind: VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); - addNone = 0; + addNone = 0; break; case Suite_kind: PyErr_SetString(PyExc_SystemError, "suite should not be possible"); return 0; - default: + default: PyErr_Format(PyExc_SystemError, "module kind %d should not be possible", mod->kind); @@ -1796,23 +1802,23 @@ get_ref_type(struct compiler *c, PyObject *name) { int scope = PyST_GetScope(c->u->u_ste, name); - if (scope == 0) { - char buf[350]; - PyOS_snprintf(buf, sizeof(buf), - "unknown scope for %.100s in %.100s(%s) in %s\n" - "symbols: %s\nlocals: %s\nglobals: %s\n", - PyString_AS_STRING(name), - PyString_AS_STRING(c->u->u_name), - PyObject_REPR(c->u->u_ste->ste_id), - c->c_filename, - PyObject_REPR(c->u->u_ste->ste_symbols), - PyObject_REPR(c->u->u_varnames), - PyObject_REPR(c->u->u_names) + if (scope == 0) { + char buf[350]; + PyOS_snprintf(buf, sizeof(buf), + "unknown scope for %.100s in %.100s(%s) in %s\n" + "symbols: %s\nlocals: %s\nglobals: %s\n", + PyString_AS_STRING(name), + PyString_AS_STRING(c->u->u_name), + PyObject_REPR(c->u->u_ste->ste_id), + c->c_filename, + PyObject_REPR(c->u->u_ste->ste_symbols), + PyObject_REPR(c->u->u_varnames), + PyObject_REPR(c->u->u_names) ); - Py_FatalError(buf); - } + Py_FatalError(buf); + } - return scope; + return scope; } static int @@ -1821,11 +1827,11 @@ PyObject *k, *v; k = Py_BuildValue("(OO)", name, name->ob_type); if (k == NULL) - return -1; + return -1; v = PyDict_GetItem(dict, k); Py_DECREF(k); if (v == NULL) - return -1; + return -1; return PyInt_AS_LONG(v); } @@ -1834,10 +1840,10 @@ { int i, free = PyCode_GetNumFree(co); if (free == 0) { - ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); - ADDOP_I(c, MAKE_FUNCTION, args); - return 1; - } + ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); + ADDOP_I(c, MAKE_FUNCTION, args); + return 1; + } for (i = 0; i < free; ++i) { /* Bypass com_addop_varname because it will generate LOAD_DEREF but LOAD_CLOSURE is needed. @@ -1868,10 +1874,10 @@ } ADDOP_I(c, LOAD_CLOSURE, arg); } - ADDOP_I(c, BUILD_TUPLE, free); + ADDOP_I(c, BUILD_TUPLE, free); ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); - ADDOP_I(c, MAKE_CLOSURE, args); - return 1; + ADDOP_I(c, MAKE_CLOSURE, args); + return 1; } static int @@ -1906,7 +1912,7 @@ return 0; } Py_DECREF(id); - VISIT(c, expr, arg); + VISIT(c, expr, arg); } } return 1; @@ -1916,10 +1922,10 @@ compiler_function(struct compiler *c, stmt_ty s) { PyCodeObject *co; - PyObject *first_const = Py_None; + PyObject *first_const = Py_None; arguments_ty args = s->v.FunctionDef.args; asdl_seq* decos = s->v.FunctionDef.decorators; - stmt_ty st; + stmt_ty st; int i, n, docstring; assert(s->kind == FunctionDef_kind); @@ -1932,21 +1938,21 @@ s->lineno)) return 0; - st = asdl_seq_GET(s->v.FunctionDef.body, 0); - docstring = compiler_isdocstring(st); - if (docstring) - first_const = st->v.Expr.value->v.Str.s; - if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { + st = asdl_seq_GET(s->v.FunctionDef.body, 0); + docstring = compiler_isdocstring(st); + if (docstring) + first_const = st->v.Expr.value->v.Str.s; + if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { compiler_exit_scope(c); - return 0; + return 0; } - /* unpack nested arguments */ + /* unpack nested arguments */ compiler_arguments(c, args); c->u->u_argcount = asdl_seq_LEN(args->args); n = asdl_seq_LEN(s->v.FunctionDef.body); - /* if there was a docstring, we need to skip the first statement */ + /* if there was a docstring, we need to skip the first statement */ for (i = docstring; i < n; i++) { stmt_ty s2 = asdl_seq_GET(s->v.FunctionDef.body, i); if (i == 0 && s2->kind == Expr_kind && @@ -1959,7 +1965,7 @@ if (co == NULL) return 0; - compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); + compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); Py_DECREF(co); for (i = 0; i < asdl_seq_LEN(decos); i++) { @@ -1974,7 +1980,7 @@ { int n; PyCodeObject *co; - PyObject *str; + PyObject *str; /* push class name on stack, needed by BUILD_CLASS */ ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts); /* push the tuple of base classes on the stack */ @@ -1985,23 +1991,23 @@ if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno)) return 0; - c->u->u_private = s->v.ClassDef.name; - Py_INCREF(c->u->u_private); - str = PyString_InternFromString("__name__"); + c->u->u_private = s->v.ClassDef.name; + Py_INCREF(c->u->u_private); + str = PyString_InternFromString("__name__"); if (!str || !compiler_nameop(c, str, Load)) { Py_XDECREF(str); compiler_exit_scope(c); return 0; - } - - Py_DECREF(str); - str = PyString_InternFromString("__module__"); + } + + Py_DECREF(str); + str = PyString_InternFromString("__module__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); compiler_exit_scope(c); return 0; - } - Py_DECREF(str); + } + Py_DECREF(str); if (!compiler_body(c, s->v.ClassDef.body)) { compiler_exit_scope(c); @@ -2015,7 +2021,7 @@ if (co == NULL) return 0; - compiler_make_closure(c, co, 0); + compiler_make_closure(c, co, 0); Py_DECREF(co); ADDOP_I(c, CALL_FUNCTION, 0); @@ -2068,7 +2074,7 @@ if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) return 0; - /* unpack nested arguments */ + /* unpack nested arguments */ compiler_arguments(c, args); c->u->u_argcount = asdl_seq_LEN(args->args); @@ -2079,7 +2085,7 @@ if (co == NULL) return 0; - compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); + compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); Py_DECREF(co); return 1; @@ -2131,18 +2137,18 @@ end = compiler_new_block(c); if (end == NULL) return 0; - next = compiler_new_block(c); - if (next == NULL) - return 0; - VISIT(c, expr, s->v.If.test); - ADDOP_JREL(c, JUMP_IF_FALSE, next); - ADDOP(c, POP_TOP); - VISIT_SEQ(c, stmt, s->v.If.body); - ADDOP_JREL(c, JUMP_FORWARD, end); - compiler_use_next_block(c, next); - ADDOP(c, POP_TOP); - if (s->v.If.orelse) - VISIT_SEQ(c, stmt, s->v.If.orelse); + next = compiler_new_block(c); + if (next == NULL) + return 0; + VISIT(c, expr, s->v.If.test); + ADDOP_JREL(c, JUMP_IF_FALSE, next); + ADDOP(c, POP_TOP); + VISIT_SEQ(c, stmt, s->v.If.body); + ADDOP_JREL(c, JUMP_FORWARD, end); + compiler_use_next_block(c, next); + ADDOP(c, POP_TOP); + if (s->v.If.orelse) + VISIT_SEQ(c, stmt, s->v.If.orelse); compiler_use_next_block(c, end); return 1; } @@ -2251,7 +2257,7 @@ ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block); break; case FINALLY_END: - return compiler_error(c, + return compiler_error(c, "'continue' not supported inside 'finally' clause"); } @@ -2340,14 +2346,14 @@ [tb, val] (or POP if no V1) [tb] POP [] - JUMP_FORWARD L0 + JUMP_FORWARD L0 [tb, val, exc, 0] L2: POP [tb, val, exc] DUP .............................etc....................... [tb, val, exc, 0] Ln+1: POP - [tb, val, exc] END_FINALLY # re-raise exception + [tb, val, exc] END_FINALLY # re-raise exception [] L0: @@ -2356,7 +2362,7 @@ static int compiler_try_except(struct compiler *c, stmt_ty s) { - basicblock *body, *orelse, *except, *end; + basicblock *body, *orelse, *except, *end; int i, n; body = compiler_new_block(c); @@ -2473,10 +2479,10 @@ if (alias->asname) { r = compiler_import_as(c, alias->name, alias->asname); - if (!r) - return r; - } - else { + if (!r) + return r; + } + else { identifier tmp = alias->name; const char *base = PyString_AS_STRING(alias->name); char *dot = strchr(base, '.'); @@ -2529,7 +2535,7 @@ Py_DECREF(names); return compiler_error(c, "from __future__ imports must occur " - "at the beginning of the file"); + "at the beginning of the file"); } } @@ -2604,11 +2610,11 @@ c->u->u_lineno = s->lineno; c->u->u_lineno_set = false; switch (s->kind) { - case FunctionDef_kind: + case FunctionDef_kind: return compiler_function(c, s); - case ClassDef_kind: + case ClassDef_kind: return compiler_class(c, s); - case Return_kind: + case Return_kind: if (c->u->u_ste->ste_type != FunctionBlock) return compiler_error(c, "'return' outside function"); if (s->v.Return.value) { @@ -2622,10 +2628,10 @@ ADDOP_O(c, LOAD_CONST, Py_None, consts); ADDOP(c, RETURN_VALUE); break; - case Delete_kind: + case Delete_kind: VISIT_SEQ(c, expr, s->v.Delete.targets) break; - case Assign_kind: + case Assign_kind: n = asdl_seq_LEN(s->v.Assign.targets); VISIT(c, expr, s->v.Assign.value); for (i = 0; i < n; i++) { @@ -2635,17 +2641,17 @@ (expr_ty)asdl_seq_GET(s->v.Assign.targets, i)); } break; - case AugAssign_kind: + case AugAssign_kind: return compiler_augassign(c, s); - case Print_kind: + case Print_kind: return compiler_print(c, s); - case For_kind: + case For_kind: return compiler_for(c, s); - case While_kind: + case While_kind: return compiler_while(c, s); - case If_kind: + case If_kind: return compiler_if(c, s); - case Raise_kind: + case Raise_kind: n = 0; if (s->v.Raise.type) { VISIT(c, expr, s->v.Raise.type); @@ -2661,17 +2667,17 @@ } ADDOP_I(c, RAISE_VARARGS, n); break; - case TryExcept_kind: + case TryExcept_kind: return compiler_try_except(c, s); - case TryFinally_kind: + case TryFinally_kind: return compiler_try_finally(c, s); - case Assert_kind: + case Assert_kind: return compiler_assert(c, s); - case Import_kind: + case Import_kind: return compiler_import(c, s); - case ImportFrom_kind: + case ImportFrom_kind: return compiler_from_import(c, s); - case Exec_kind: + case Exec_kind: VISIT(c, expr, s->v.Exec.body); if (s->v.Exec.globals) { VISIT(c, expr, s->v.Exec.globals); @@ -2686,9 +2692,9 @@ } ADDOP(c, EXEC_STMT); break; - case Global_kind: + case Global_kind: break; - case Expr_kind: + case Expr_kind: VISIT(c, expr, s->v.Expr.value); if (c->c_interactive && c->c_nestlevel <= 1) { ADDOP(c, PRINT_EXPR); @@ -2697,17 +2703,17 @@ ADDOP(c, POP_TOP); } break; - case Pass_kind: + case Pass_kind: break; - case Break_kind: + case Break_kind: if (!c->u->u_nfblocks) return compiler_error(c, "'break' outside loop"); ADDOP(c, BREAK_LOOP); break; - case Continue_kind: + case Continue_kind: return compiler_continue(c); - case With_kind: - return compiler_with(c, s); + case With_kind: + return compiler_with(c, s); } return 1; } @@ -2834,7 +2840,7 @@ int op, scope, arg; enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; - PyObject *dict = c->u->u_names; + PyObject *dict = c->u->u_names; PyObject *mangled; /* XXX AugStore isn't used anywhere! */ @@ -2853,11 +2859,11 @@ scope = PyST_GetScope(c->u->u_ste, mangled); switch (scope) { case FREE: - dict = c->u->u_freevars; + dict = c->u->u_freevars; optype = OP_DEREF; break; case CELL: - dict = c->u->u_cellvars; + dict = c->u->u_cellvars; optype = OP_DEREF; break; case LOCAL: @@ -3018,7 +3024,7 @@ compiler_compare(struct compiler *c, expr_ty e) { int i, n; - basicblock *cleanup = NULL; + basicblock *cleanup = NULL; /* XXX the logic can be cleaned up for 1 or multiple comparisons */ VISIT(c, expr, e->v.Compare.left); @@ -3026,8 +3032,8 @@ assert(n > 0); if (n > 1) { cleanup = compiler_new_block(c); - if (cleanup == NULL) - return 0; + if (cleanup == NULL) + return 0; VISIT(c, expr, asdl_seq_GET(e->v.Compare.comparators, 0)); } for (i = 1; i < n; i++) { @@ -3048,8 +3054,8 @@ cmpop((cmpop_ty)asdl_seq_GET(e->v.Compare.ops, n - 1))); if (n > 1) { basicblock *end = compiler_new_block(c); - if (end == NULL) - return 0; + if (end == NULL) + return 0; ADDOP_JREL(c, JUMP_FORWARD, end); compiler_use_next_block(c, cleanup); ADDOP(c, ROT_TWO); @@ -3098,24 +3104,24 @@ static int compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, - asdl_seq *generators, int gen_index, - expr_ty elt) + asdl_seq *generators, int gen_index, + expr_ty elt) { /* generate code for the iterator, then each of the ifs, and then write to the element */ comprehension_ty l; basicblock *start, *anchor, *skip, *if_cleanup; - int i, n; + int i, n; start = compiler_new_block(c); skip = compiler_new_block(c); if_cleanup = compiler_new_block(c); anchor = compiler_new_block(c); - if (start == NULL || skip == NULL || if_cleanup == NULL || - anchor == NULL) - return 0; + if (start == NULL || skip == NULL || if_cleanup == NULL || + anchor == NULL) + return 0; l = asdl_seq_GET(generators, gen_index); VISIT(c, expr, l->iter); @@ -3125,7 +3131,7 @@ NEXT_BLOCK(c); VISIT(c, expr, l->target); - /* XXX this needs to be cleaned up...a lot! */ + /* XXX this needs to be cleaned up...a lot! */ n = asdl_seq_LEN(l->ifs); for (i = 0; i < n; i++) { expr_ty e = asdl_seq_GET(l->ifs, i); @@ -3135,32 +3141,32 @@ ADDOP(c, POP_TOP); } - if (++gen_index < asdl_seq_LEN(generators)) - if (!compiler_listcomp_generator(c, tmpname, - generators, gen_index, elt)) - return 0; - - /* only append after the last for generator */ - if (gen_index >= asdl_seq_LEN(generators)) { - if (!compiler_nameop(c, tmpname, Load)) - return 0; - VISIT(c, expr, elt); - ADDOP_I(c, CALL_FUNCTION, 1); - ADDOP(c, POP_TOP); + if (++gen_index < asdl_seq_LEN(generators)) + if (!compiler_listcomp_generator(c, tmpname, + generators, gen_index, elt)) + return 0; + + /* only append after the last for generator */ + if (gen_index >= asdl_seq_LEN(generators)) { + if (!compiler_nameop(c, tmpname, Load)) + return 0; + VISIT(c, expr, elt); + ADDOP_I(c, CALL_FUNCTION, 1); + ADDOP(c, POP_TOP); - compiler_use_next_block(c, skip); - } + compiler_use_next_block(c, skip); + } for (i = 0; i < n; i++) { ADDOP_I(c, JUMP_FORWARD, 1); - if (i == 0) - compiler_use_next_block(c, if_cleanup); + if (i == 0) + compiler_use_next_block(c, if_cleanup); ADDOP(c, POP_TOP); } ADDOP_JABS(c, JUMP_ABSOLUTE, start); compiler_use_next_block(c, anchor); - /* delete the append method added to locals */ + /* delete the append method added to locals */ if (gen_index == 1) - if (!compiler_nameop(c, tmpname, Del)) + if (!compiler_nameop(c, tmpname, Del)) return 0; return 1; @@ -3170,7 +3176,7 @@ compiler_listcomp(struct compiler *c, expr_ty e) { identifier tmp; - int rc = 0; + int rc = 0; static identifier append; asdl_seq *generators = e->v.ListComp.generators; @@ -3187,23 +3193,23 @@ ADDOP(c, DUP_TOP); ADDOP_O(c, LOAD_ATTR, append, names); if (compiler_nameop(c, tmp, Store)) - rc = compiler_listcomp_generator(c, tmp, generators, 0, - e->v.ListComp.elt); - Py_DECREF(tmp); + rc = compiler_listcomp_generator(c, tmp, generators, 0, + e->v.ListComp.elt); + Py_DECREF(tmp); return rc; } static int compiler_genexp_generator(struct compiler *c, - asdl_seq *generators, int gen_index, - expr_ty elt) + asdl_seq *generators, int gen_index, + expr_ty elt) { /* generate code for the iterator, then each of the ifs, and then write to the element */ comprehension_ty ge; basicblock *start, *anchor, *skip, *if_cleanup, *end; - int i, n; + int i, n; start = compiler_new_block(c); skip = compiler_new_block(c); @@ -3211,7 +3217,7 @@ anchor = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || skip == NULL || if_cleanup == NULL || + if (start == NULL || skip == NULL || if_cleanup == NULL || anchor == NULL || end == NULL) return 0; @@ -3235,7 +3241,7 @@ NEXT_BLOCK(c); VISIT(c, expr, ge->target); - /* XXX this needs to be cleaned up...a lot! */ + /* XXX this needs to be cleaned up...a lot! */ n = asdl_seq_LEN(ge->ifs); for (i = 0; i < n; i++) { expr_ty e = asdl_seq_GET(ge->ifs, i); @@ -3245,21 +3251,21 @@ ADDOP(c, POP_TOP); } - if (++gen_index < asdl_seq_LEN(generators)) + if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_genexp_generator(c, generators, gen_index, elt)) return 0; - /* only append after the last 'for' generator */ - if (gen_index >= asdl_seq_LEN(generators)) { + /* only append after the last 'for' generator */ + if (gen_index >= asdl_seq_LEN(generators)) { VISIT(c, expr, elt); ADDOP(c, YIELD_VALUE); ADDOP(c, POP_TOP); compiler_use_next_block(c, skip); - } + } for (i = 0; i < n; i++) { ADDOP_I(c, JUMP_FORWARD, 1); - if (i == 0) + if (i == 0) compiler_use_next_block(c, if_cleanup); ADDOP(c, POP_TOP); @@ -3297,7 +3303,7 @@ if (co == NULL) return 0; - compiler_make_closure(c, co, 0); + compiler_make_closure(c, co, 0); Py_DECREF(co); VISIT(c, expr, outermost_iter); @@ -3315,7 +3321,7 @@ return 1; } -/* Test whether expression is constant. For constants, report +/* Test whether expression is constant. For constants, report whether they are true or false. Return values: 1 for true, 0 for false, -1 for non-constant. @@ -3352,9 +3358,9 @@ BLOCK finally: if an exception was raised: - exc = copy of (exception, instance, traceback) + exc = copy of (exception, instance, traceback) else: - exc = (None, None, None) + exc = (None, None, None) exit(*exc) */ static int @@ -3367,34 +3373,34 @@ assert(s->kind == With_kind); if (!context_attr) { - context_attr = PyString_InternFromString("__context__"); - if (!context_attr) - return 0; + context_attr = PyString_InternFromString("__context__"); + if (!context_attr) + return 0; } if (!enter_attr) { - enter_attr = PyString_InternFromString("__enter__"); - if (!enter_attr) - return 0; + enter_attr = PyString_InternFromString("__enter__"); + if (!enter_attr) + return 0; } if (!exit_attr) { - exit_attr = PyString_InternFromString("__exit__"); - if (!exit_attr) - return 0; + exit_attr = PyString_InternFromString("__exit__"); + if (!exit_attr) + return 0; } block = compiler_new_block(c); finally = compiler_new_block(c); if (!block || !finally) - return 0; + return 0; /* Create a temporary variable to hold context.__exit__ */ tmpexit = compiler_new_tmpname(c); if (tmpexit == NULL) - return 0; + return 0; PyArena_AddPyObject(c->c_arena, tmpexit); if (s->v.With.optional_vars) { - /* Create a temporary variable to hold context.__enter__(). + /* Create a temporary variable to hold context.__enter__(). We need to do this rather than preserving it on the stack because SETUP_FINALLY remembers the stack level. We need to do the assignment *inside* the try/finally @@ -3403,7 +3409,7 @@ the try/finally so that if it fails we won't call context.__exit__(). */ - tmpvalue = compiler_new_tmpname(c); + tmpvalue = compiler_new_tmpname(c); if (tmpvalue == NULL) return 0; PyArena_AddPyObject(c->c_arena, tmpvalue); @@ -3425,13 +3431,13 @@ ADDOP_I(c, CALL_FUNCTION, 0); if (s->v.With.optional_vars) { - /* Store it in tmpvalue */ - if (!compiler_nameop(c, tmpvalue, Store)) + /* Store it in tmpvalue */ + if (!compiler_nameop(c, tmpvalue, Store)) return 0; } else { - /* Discard result from context.__enter__() */ - ADDOP(c, POP_TOP); + /* Discard result from context.__enter__() */ + ADDOP(c, POP_TOP); } /* Start the try block */ @@ -3439,15 +3445,15 @@ compiler_use_next_block(c, block); if (!compiler_push_fblock(c, FINALLY_TRY, block)) { - return 0; + return 0; } if (s->v.With.optional_vars) { - /* Bind saved result of context.__enter__() to VAR */ - if (!compiler_nameop(c, tmpvalue, Load) || + /* Bind saved result of context.__enter__() to VAR */ + if (!compiler_nameop(c, tmpvalue, Load) || !compiler_nameop(c, tmpvalue, Del)) return 0; - VISIT(c, expr, s->v.With.optional_vars); + VISIT(c, expr, s->v.With.optional_vars); } /* BLOCK code */ @@ -3460,12 +3466,12 @@ ADDOP_O(c, LOAD_CONST, Py_None, consts); compiler_use_next_block(c, finally); if (!compiler_push_fblock(c, FINALLY_END, finally)) - return 0; + return 0; /* Finally block starts; push tmpexit and issue our magic opcode. */ if (!compiler_nameop(c, tmpexit, Load) || !compiler_nameop(c, tmpexit, Del)) - return 0; + return 0; ADDOP(c, WITH_CLEANUP); ADDOP_I(c, CALL_FUNCTION, 3); ADDOP(c, POP_TOP); @@ -3486,22 +3492,22 @@ c->u->u_lineno_set = false; } switch (e->kind) { - case BoolOp_kind: + case BoolOp_kind: return compiler_boolop(c, e); - case BinOp_kind: + case BinOp_kind: VISIT(c, expr, e->v.BinOp.left); VISIT(c, expr, e->v.BinOp.right); ADDOP(c, binop(c, e->v.BinOp.op)); break; - case UnaryOp_kind: + case UnaryOp_kind: VISIT(c, expr, e->v.UnaryOp.operand); ADDOP(c, unaryop(e->v.UnaryOp.op)); break; - case Lambda_kind: + case Lambda_kind: return compiler_lambda(c, e); case IfExp_kind: return compiler_ifexp(c, e); - case Dict_kind: + case Dict_kind: /* XXX get rid of arg? */ ADDOP_I(c, BUILD_MAP, 0); n = asdl_seq_LEN(e->v.Dict.values); @@ -3515,13 +3521,13 @@ ADDOP(c, STORE_SUBSCR); } break; - case ListComp_kind: + case ListComp_kind: return compiler_listcomp(c, e); - case GeneratorExp_kind: + case GeneratorExp_kind: return compiler_genexp(c, e); case Yield_kind: if (c->u->u_ste->ste_type != FunctionBlock) - return compiler_error(c, "'yield' outside function"); + return compiler_error(c, "'yield' outside function"); /* for (i = 0; i < c->u->u_nfblocks; i++) { if (c->u->u_fblock[i].fb_type == FINALLY_TRY) @@ -3538,22 +3544,22 @@ } ADDOP(c, YIELD_VALUE); break; - case Compare_kind: + case Compare_kind: return compiler_compare(c, e); - case Call_kind: + case Call_kind: return compiler_call(c, e); - case Repr_kind: + case Repr_kind: VISIT(c, expr, e->v.Repr.value); ADDOP(c, UNARY_CONVERT); break; - case Num_kind: + case Num_kind: ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts); break; - case Str_kind: + case Str_kind: ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts); break; /* The following exprs can be assignment targets. */ - case Attribute_kind: + case Attribute_kind: if (e->v.Attribute.ctx != AugStore) VISIT(c, expr, e->v.Attribute.value); switch (e->v.Attribute.ctx) { @@ -3579,7 +3585,7 @@ return 0; } break; - case Subscript_kind: + case Subscript_kind: switch (e->v.Subscript.ctx) { case AugLoad: VISIT(c, expr, e->v.Subscript.value); @@ -3603,16 +3609,16 @@ case Param: default: PyErr_SetString(PyExc_SystemError, - "param invalid in subscript expression"); + "param invalid in subscript expression"); return 0; } break; - case Name_kind: + case Name_kind: return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); /* child nodes of List and Tuple will have expr_context set */ - case List_kind: + case List_kind: return compiler_list(c, e); - case Tuple_kind: + case Tuple_kind: return compiler_tuple(c, e); } return 1; @@ -3627,11 +3633,11 @@ assert(s->kind == AugAssign_kind); switch (e->kind) { - case Attribute_kind: + case Attribute_kind: auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, AugLoad, e->lineno, c->c_arena); - if (auge == NULL) - return 0; + if (auge == NULL) + return 0; VISIT(c, expr, auge); VISIT(c, expr, s->v.AugAssign.value); ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); @@ -3641,14 +3647,14 @@ case Subscript_kind: auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, AugLoad, e->lineno, c->c_arena); - if (auge == NULL) - return 0; + if (auge == NULL) + return 0; VISIT(c, expr, auge); VISIT(c, expr, s->v.AugAssign.value); ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - auge->v.Subscript.ctx = AugStore; + auge->v.Subscript.ctx = AugStore; VISIT(c, expr, auge); - break; + break; case Name_kind: VISIT(c, expr, s->v.AugAssign.target); VISIT(c, expr, s->v.AugAssign.value); @@ -3658,7 +3664,7 @@ PyErr_Format(PyExc_SystemError, "invalid node type (%d) for augmented assignment", e->kind); - return 0; + return 0; } return 1; } @@ -3717,31 +3723,31 @@ static int compiler_handle_subscr(struct compiler *c, const char *kind, - expr_context_ty ctx) + expr_context_ty ctx) { - int op = 0; + int op = 0; - /* XXX this code is duplicated */ - switch (ctx) { - case AugLoad: /* fall through to Load */ - case Load: op = BINARY_SUBSCR; break; - case AugStore:/* fall through to Store */ - case Store: op = STORE_SUBSCR; break; - case Del: op = DELETE_SUBSCR; break; - case Param: - PyErr_Format(PyExc_SystemError, + /* XXX this code is duplicated */ + switch (ctx) { + case AugLoad: /* fall through to Load */ + case Load: op = BINARY_SUBSCR; break; + case AugStore:/* fall through to Store */ + case Store: op = STORE_SUBSCR; break; + case Del: op = DELETE_SUBSCR; break; + case Param: + PyErr_Format(PyExc_SystemError, "invalid %s kind %d in subscript\n", kind, ctx); - return 0; - } - if (ctx == AugLoad) { - ADDOP_I(c, DUP_TOPX, 2); - } - else if (ctx == AugStore) { - ADDOP(c, ROT_THREE); - } - ADDOP(c, op); - return 1; + return 0; + } + if (ctx == AugLoad) { + ADDOP_I(c, DUP_TOPX, 2); + } + else if (ctx == AugStore) { + ADDOP(c, ROT_THREE); + } + ADDOP(c, op); + return 1; } static int @@ -3752,17 +3758,17 @@ /* only handles the cases where BUILD_SLICE is emitted */ if (s->v.Slice.lower) { - VISIT(c, expr, s->v.Slice.lower); + VISIT(c, expr, s->v.Slice.lower); } else { - ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP_O(c, LOAD_CONST, Py_None, consts); } - + if (s->v.Slice.upper) { - VISIT(c, expr, s->v.Slice.upper); + VISIT(c, expr, s->v.Slice.upper); } else { - ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP_O(c, LOAD_CONST, Py_None, consts); } if (s->v.Slice.step) { @@ -3792,20 +3798,20 @@ VISIT(c, expr, s->v.Slice.upper); } - if (ctx == AugLoad) { - switch (stack_count) { - case 0: ADDOP(c, DUP_TOP); break; - case 1: ADDOP_I(c, DUP_TOPX, 2); break; - case 2: ADDOP_I(c, DUP_TOPX, 3); break; - } - } - else if (ctx == AugStore) { - switch (stack_count) { - case 0: ADDOP(c, ROT_TWO); break; - case 1: ADDOP(c, ROT_THREE); break; - case 2: ADDOP(c, ROT_FOUR); break; - } - } + if (ctx == AugLoad) { + switch (stack_count) { + case 0: ADDOP(c, DUP_TOP); break; + case 1: ADDOP_I(c, DUP_TOPX, 2); break; + case 2: ADDOP_I(c, DUP_TOPX, 3); break; + } + } + else if (ctx == AugStore) { + switch (stack_count) { + case 0: ADDOP(c, ROT_TWO); break; + case 1: ADDOP(c, ROT_THREE); break; + case 2: ADDOP(c, ROT_FOUR); break; + } + } switch (ctx) { case AugLoad: /* fall through to Load */ @@ -3857,7 +3863,7 @@ case Slice_kind: if (!s->v.Slice.step) return compiler_simple_slice(c, s, ctx); - if (!compiler_slice(c, s, ctx)) + if (!compiler_slice(c, s, ctx)) return 0; if (ctx == AugLoad) { ADDOP_I(c, DUP_TOPX, 2); @@ -3874,12 +3880,12 @@ return 0; } ADDOP_I(c, BUILD_TUPLE, n); - return compiler_handle_subscr(c, "extended slice", ctx); + return compiler_handle_subscr(c, "extended slice", ctx); } case Index_kind: - if (ctx != AugStore) + if (ctx != AugStore) VISIT(c, expr, s->v.Index.value); - return compiler_handle_subscr(c, "index", ctx); + return compiler_handle_subscr(c, "index", ctx); default: PyErr_Format(PyExc_SystemError, "invalid slice %d", s->kind); @@ -3972,7 +3978,7 @@ if (!a->a_lnotab) return 0; a->a_postorder = (basicblock **)PyObject_Malloc( - sizeof(basicblock *) * nblocks); + sizeof(basicblock *) * nblocks); if (!a->a_postorder) { PyErr_NoMemory(); return 0; @@ -4020,14 +4026,14 @@ The array is conceptually a list of (bytecode offset increment, line number increment) -pairs. The details are important and delicate, best illustrated by example: +pairs. The details are important and delicate, best illustrated by example: - byte code offset source code line number - 0 1 - 6 2 + byte code offset source code line number + 0 1 + 6 2 50 7 - 350 307 - 361 308 + 350 307 + 361 308 The first trick is that these numbers aren't stored, only the increments from one row to the next (this doesn't really work, but it's a start): @@ -4039,22 +4045,22 @@ offsets and their corresponding line #s both increase monotonically, and (b) if at least one column jumps by more than 255 from one row to the next, more than one pair is written to the table. In case #b, there's no way to know -from looking at the table later how many were written. That's the delicate +from looking at the table later how many were written. That's the delicate part. A user of c_lnotab desiring to find the source line number corresponding to a bytecode address A should do something like this lineno = addr = 0 for addr_incr, line_incr in c_lnotab: - addr += addr_incr - if addr > A: - return lineno - lineno += line_incr + addr += addr_incr + if addr > A: + return lineno + lineno += line_incr In order for this to work, when the addr field increments by more than 255, the line # increment in each pair generated must be 0 until the remaining addr increment is < 256. So, in the example above, com_set_lineno should not (as was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to -255, 0, 45, 255, 0, 45. +255, 0, 45, 255, 0, 45. */ static int @@ -4130,7 +4136,7 @@ *lnotab++ = d_bytecode; *lnotab++ = d_lineno; } - else { /* First line of a block; def stmt, etc. */ + else { /* First line of a block; def stmt, etc. */ *lnotab++ = 0; *lnotab++ = d_lineno; } @@ -4221,7 +4227,7 @@ } /* XXX: This is an awful hack that could hurt performance, but - on the bright side it should work until we come up + on the bright side it should work until we come up with a better solution. In the meantime, should the goto be dropped in favor @@ -4229,7 +4235,7 @@ The issue is that in the first loop blocksize() is called which calls instrsize() which requires i_oparg be set - appropriately. There is a bootstrap problem because + appropriately. There is a bootstrap problem because i_oparg is calculated in the second loop above. So we loop until we stop seeing new EXTENDED_ARGs. @@ -4254,10 +4260,10 @@ return NULL; while (PyDict_Next(dict, &pos, &k, &v)) { i = PyInt_AS_LONG(v); - k = PyTuple_GET_ITEM(k, 0); + k = PyTuple_GET_ITEM(k, 0); Py_INCREF(k); assert((i - offset) < size); - assert((i - offset) >= 0); + assert((i - offset) >= 0); PyTuple_SET_ITEM(tuple, i - offset, k); } return tuple; @@ -4286,7 +4292,7 @@ flags |= CO_GENERATOR; /* (Only) inherit compilerflags in PyCF_MASK */ - flags |= (c->c_flags->cf_flags & PyCF_MASK); + flags |= (c->c_flags->cf_flags & PyCF_MASK); n = PyDict_Size(c->u->u_freevars); if (n < 0) @@ -4315,7 +4321,7 @@ PyObject *name = NULL; PyObject *freevars = NULL; PyObject *cellvars = NULL; - PyObject *bytecode = NULL; + PyObject *bytecode = NULL; int nlocals, flags; tmp = dict_keys_inorder(c->u->u_consts, 0); @@ -4329,17 +4335,17 @@ if (!consts || !names || !varnames) goto error; - cellvars = dict_keys_inorder(c->u->u_cellvars, 0); - if (!cellvars) - goto error; - freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); - if (!freevars) - goto error; + cellvars = dict_keys_inorder(c->u->u_cellvars, 0); + if (!cellvars) + goto error; + freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); + if (!freevars) + goto error; filename = PyString_FromString(c->c_filename); if (!filename) goto error; - nlocals = PyDict_Size(c->u->u_varnames); + nlocals = PyDict_Size(c->u->u_varnames); flags = compute_code_flags(c); if (flags < 0) goto error; From python-checkins at python.org Wed Mar 1 17:37:55 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 17:37:55 +0100 (CET) Subject: [Python-checkins] r42730 - python/trunk/Doc/api/init.tex Message-ID: <20060301163755.D95211E402A@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 17:37:55 2006 New Revision: 42730 Modified: python/trunk/Doc/api/init.tex Log: Fix warning that texcheck complained about. Modified: python/trunk/Doc/api/init.tex ============================================================================== --- python/trunk/Doc/api/init.tex (original) +++ python/trunk/Doc/api/init.tex Wed Mar 1 17:37:55 2006 @@ -184,7 +184,7 @@ variable in the top-level \file{Makefile} and the \longprogramopt{prefix} argument to the \program{configure} script at build time. The value is available to Python code as - \code{sys.prefix}. It is only useful on \UNIX. See also the next + \code{sys.prefix}. It is only useful on \UNIX{}. See also the next function. \end{cfuncdesc} From python-checkins at python.org Wed Mar 1 17:55:44 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 17:55:44 +0100 (CET) Subject: [Python-checkins] r42731 - in python/trunk: Include/pythonrun.h Python/pythonrun.c Message-ID: <20060301165544.A394D1E4024@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 17:55:42 2006 New Revision: 42731 Modified: python/trunk/Include/pythonrun.h python/trunk/Python/pythonrun.c Log: Reconst parameters that lost their const in the AST merge. Modified: python/trunk/Include/pythonrun.h ============================================================================== --- python/trunk/Include/pythonrun.h (original) +++ python/trunk/Include/pythonrun.h Wed Mar 1 17:55:42 2006 @@ -31,8 +31,8 @@ PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); -PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, char *, PyCompilerFlags *); -PyAPI_FUNC(int) PyRun_AnyFileExFlags(FILE *, char *, int, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_AnyFileExFlags(FILE *, const char *, int, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_SimpleFileExFlags(FILE *, const char *, int, PyCompilerFlags *); PyAPI_FUNC(int) PyRun_InteractiveOneFlags(FILE *, const char *, PyCompilerFlags *); Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Wed Mar 1 17:55:42 2006 @@ -638,7 +638,7 @@ /* Parse input from a file and execute it */ int -PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit, +PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags) { if (filename == NULL) From python-checkins at python.org Wed Mar 1 17:56:29 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 17:56:29 +0100 (CET) Subject: [Python-checkins] r42732 - in python/trunk: Include/objimpl.h Modules/gcmodule.c Message-ID: <20060301165629.CD7DE1E4009@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 17:56:25 2006 New Revision: 42732 Modified: python/trunk/Include/objimpl.h python/trunk/Modules/gcmodule.c Log: Change GC refcount to Py_ssize_t. Modified: python/trunk/Include/objimpl.h ============================================================================== --- python/trunk/Include/objimpl.h (original) +++ python/trunk/Include/objimpl.h Wed Mar 1 17:56:25 2006 @@ -250,7 +250,7 @@ struct { union _gc_head *gc_next; union _gc_head *gc_prev; - int gc_refs; + Py_ssize_t gc_refs; } gc; long double dummy; /* force worst-case alignment */ } PyGC_Head; Modified: python/trunk/Modules/gcmodule.c ============================================================================== --- python/trunk/Modules/gcmodule.c (original) +++ python/trunk/Modules/gcmodule.c Wed Mar 1 17:56:25 2006 @@ -303,7 +303,7 @@ { if (PyObject_IS_GC(op)) { PyGC_Head *gc = AS_GC(op); - const int gc_refs = gc->gc.gc_refs; + const Py_ssize_t gc_refs = gc->gc.gc_refs; if (gc_refs == 0) { /* This is in move_unreachable's 'young' list, but From python-checkins at python.org Wed Mar 1 18:06:48 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 1 Mar 2006 18:06:48 +0100 (CET) Subject: [Python-checkins] r42733 - peps/trunk/pep-0343.txt peps/trunk/pep-0356.txt peps/trunk/pep-3000.txt Message-ID: <20060301170648.DD3781E4009@bag.python.org> Author: guido.van.rossum Date: Wed Mar 1 18:06:46 2006 New Revision: 42733 Modified: peps/trunk/pep-0343.txt peps/trunk/pep-0356.txt peps/trunk/pep-3000.txt Log: 343: fix bug in nested(). 356: add some tentative future keywords. 3000: add some new ideas. Modified: peps/trunk/pep-0343.txt ============================================================================== --- peps/trunk/pep-0343.txt (original) +++ peps/trunk/pep-0343.txt Wed Mar 1 18:06:46 2006 @@ -827,7 +827,6 @@ def nested(*contexts): exits = [] vars = [] - exc = (None, None, None) try: try: for context in contexts: @@ -839,6 +838,8 @@ yield vars except: exc = sys.exc_info() + else: + exc = (None, None, None) finally: while exits: exit = exits.pop() @@ -846,6 +847,8 @@ exit(*exc) except: exc = sys.exc_info() + else: + exc = (None, None, None) if exc != (None, None, None): raise Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Wed Mar 1 18:06:46 2006 @@ -75,6 +75,13 @@ Target for inclusion of each feature by March 16. At that point, we should re-evaluate schedule or consider dropping feature. + Prepare for 'do' becoming a keyword in 2.6 (PEP 315)? + And as long as we're going wild, how about 'super'? + And what about 'interface' and 'implements'? (PEP 245) + Or 'switch' and 'case'? (PEP 275) + + Add builtin @deprecated decorator? + PEP 352: Required Superclass for Exceptions (Brett Cannon is expected to implement this.) Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 1 18:06:46 2006 @@ -54,12 +54,17 @@ * ``exec`` as a statement is not worth it -- make it a function * Add optional declarations for static typing [11]_ * Support only new-style classes; classic classes will be gone [1]_ +* Return iterators instead of lists where appropriate for atomic type methods + (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) + iter*() methods will be removed. +* OR... Make keys() etc. return "views" a la Java collections??? * Replace ``print`` by a function [16]_ * Do something so you can catch multiple exceptions using ``except E1, E2, E3:``. Maybe use ``except E1, E2, E3 as err:`` if you want the error variable? [3]_ * ``None``, ``True`` and ``False`` become keywords [4]_ -* ``as`` becomes a keyword [5]_ + (Or perhaps just ``None``?) +* ``as`` becomes a keyword [5]_ (probably in 2.6 already) * Have list comprehensions be syntactic sugar for passing an equivalent generator expression to ``list()``; as a consequence the loop variable will no longer be exposed [12]_ From python-checkins at python.org Wed Mar 1 18:10:03 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 1 Mar 2006 18:10:03 +0100 (CET) Subject: [Python-checkins] r42734 - in python/trunk/Lib: contextlib.py test/test_contextlib.py Message-ID: <20060301171003.A51681E400A@bag.python.org> Author: guido.van.rossum Date: Wed Mar 1 18:10:01 2006 New Revision: 42734 Modified: python/trunk/Lib/contextlib.py python/trunk/Lib/test/test_contextlib.py Log: Fix a bug in nested() - if one of the sub-context-managers swallows the exception, it should not be propagated up. With unit tests. Modified: python/trunk/Lib/contextlib.py ============================================================================== --- python/trunk/Lib/contextlib.py (original) +++ python/trunk/Lib/contextlib.py Wed Mar 1 18:10:01 2006 @@ -91,7 +91,6 @@ """ exits = [] vars = [] - exc = (None, None, None) try: try: for context in contexts: @@ -103,6 +102,8 @@ yield vars except: exc = sys.exc_info() + else: + exc = (None, None, None) finally: while exits: exit = exits.pop() @@ -110,6 +111,8 @@ exit(*exc) except: exc = sys.exc_info() + else: + exc = (None, None, None) if exc != (None, None, None): raise Modified: python/trunk/Lib/test/test_contextlib.py ============================================================================== --- python/trunk/Lib/test/test_contextlib.py (original) +++ python/trunk/Lib/test/test_contextlib.py Wed Mar 1 18:10:01 2006 @@ -107,6 +107,60 @@ else: self.fail("Didn't raise ZeroDivisionError") + def test_nested_b_swallows(self): + @contextmanager + def a(): + yield + @contextmanager + def b(): + try: + yield + except: + # Swallow the exception + pass + try: + with nested(a(), b()): + 1/0 + except ZeroDivisionError: + self.fail("Didn't swallow ZeroDivisionError") + + def test_nested_break(self): + @contextmanager + def a(): + yield + state = 0 + while True: + state += 1 + with nested(a(), a()): + break + state += 10 + self.assertEqual(state, 1) + + def test_nested_continue(self): + @contextmanager + def a(): + yield + state = 0 + while state < 3: + state += 1 + with nested(a(), a()): + continue + state += 10 + self.assertEqual(state, 3) + + def test_nested_return(self): + @contextmanager + def a(): + try: + yield + except: + pass + def foo(): + with nested(a(), a()): + return 1 + return 10 + self.assertEqual(foo(), 1) + class ClosingTestCase(unittest.TestCase): # XXX This needs more work From python-checkins at python.org Wed Mar 1 19:32:38 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 19:32:38 +0100 (CET) Subject: [Python-checkins] r42735 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301183238.1748E1E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 19:32:31 2006 New Revision: 42735 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Close an XXX (+ misc.): track and report debug info about total # of arenas allocated, # reclaimed, # currently allocated, and highwater mark. >From a -uall debug-build test run(*) w/ the PYTHONMALLOCSTATS envar set, it's clear that arenas do get reclaimed. This is part of the output at the end of the run: # times object malloc called = 138,387,107 # arenas allocated total = 1,841 # arenas reclaimed = 1,733 # arenas highwater mark = 212 # arenas allocated current = 108 (*) The branch was created before the sprints started, so this doesn't reflect the current trunk tests. test_subprocess was excluded, because it hangs with PYTHONMALLOCSTATS set (the debug output gets written to stderr, and at least one of the test_subprocess tests doesn't expect anything in the spawned process's stderr, and the pipe it sets up for stderr fills). Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 19:32:31 2006 @@ -487,8 +487,9 @@ #ifdef PYMALLOC_DEBUG /* Total number of times malloc() called to allocate an arena. */ -/* XXX Teach the debug malloc output about this. */ static ulong ntimes_arena_allocated = 0; +/* High water mark (max value ever seen) for narenas_currently_allocated. */ +static ulong narenas_highwater = 0; #endif /* Allocate a new arena. If we run out of memory, return NULL. Else @@ -577,6 +578,8 @@ ++narenas_currently_allocated; #ifdef PYMALLOC_DEBUG ++ntimes_arena_allocated; + if (narenas_currently_allocated > narenas_highwater) + narenas_highwater = narenas_currently_allocated; #endif /* pool_address <- first pool-aligned address in the arena nfreepools <- number of whole pools that fit after alignment */ @@ -875,8 +878,7 @@ if (Py_ADDRESS_IN_RANGE(p, pool)) { /* We allocated this address. */ LOCK(); - /* - * Link p to the start of the pool's freeblock list. Since + /* Link p to the start of the pool's freeblock list. Since * the pool had at least the p block outstanding, the pool * wasn't empty (so it's already in a usedpools[] list, or * was full and is in no list -- it's not in the freeblocks @@ -888,8 +890,7 @@ if (lastfree) { struct arena_object* arenaobj; - /* - * freeblock wasn't NULL, so the pool wasn't full, + /* freeblock wasn't NULL, so the pool wasn't full, * and the pool is in a usedpools[] list. */ if (--pool->ref.count != 0) { @@ -897,8 +898,7 @@ UNLOCK(); return; } - /* - * Pool is now empty: unlink from usedpools, and + /* Pool is now empty: unlink from usedpools, and * link to the front of freepools. This ensures that * previously freed pools will be allocated later * (being not referenced, they are perhaps paged out). @@ -914,7 +914,7 @@ arenaobj = &arenas[pool->arenaindex]; pool->nextpool = arenaobj->freepools; arenaobj->freepools = pool; - arenaobj->nfreepools ++; + ++arenaobj->nfreepools; if (arenaobj->nfreepools == arenaobj->ntotalpools) { void* address; @@ -975,9 +975,8 @@ usable_arenas = arenaobj; /* Fix the pointer in the nextarena. */ - if (arenaobj->nextarena != NULL) { + if (arenaobj->nextarena != NULL) arenaobj->nextarena->prevarena = arenaobj; - } assert(usable_arenas->address != 0); } @@ -1047,8 +1046,7 @@ UNLOCK(); return; } - /* - * Pool was full, so doesn't currently live in any list: + /* Pool was full, so doesn't currently live in any list: * link it to the front of the appropriate usedpools[] list. * This mimics LRU pool usage for new allocations and * targets optimal filling when several pools contain @@ -1570,7 +1568,7 @@ */ ulong quantization = 0; /* # of arenas actually allocated. */ - uint narenas = 0; + ulong narenas = 0; /* running total -- should equal narenas * ARENA_SIZE */ ulong total; char buf[128]; @@ -1629,6 +1627,7 @@ #endif } } + assert(narenas == narenas_currently_allocated); fputc('\n', stderr); fputs("class size num pools blocks in use avail blocks\n" @@ -1654,9 +1653,14 @@ fputc('\n', stderr); (void)printone("# times object malloc called", serialno); + (void)printone("# arenas allocated total", ntimes_arena_allocated); + (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas); + (void)printone("# arenas highwater mark", narenas_highwater); + (void)printone("# arenas allocated current", narenas); + PyOS_snprintf(buf, sizeof(buf), - "%u arenas * %d bytes/arena", narenas, ARENA_SIZE); - (void)printone(buf, (ulong)narenas * ARENA_SIZE); + "%lu arenas * %d bytes/arena", narenas, ARENA_SIZE); + (void)printone(buf, narenas * ARENA_SIZE); fputc('\n', stderr); From python-checkins at python.org Wed Mar 1 19:47:47 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 19:47:47 +0100 (CET) Subject: [Python-checkins] r42736 - peps/trunk/pep-3000.txt Message-ID: <20060301184747.E71821E4002@bag.python.org> Author: brett.cannon Date: Wed Mar 1 19:47:47 2006 New Revision: 42736 Modified: peps/trunk/pep-3000.txt Log: Move an edited idea from the core language section down to atomic types section. Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 1 19:47:47 2006 @@ -54,9 +54,6 @@ * ``exec`` as a statement is not worth it -- make it a function * Add optional declarations for static typing [11]_ * Support only new-style classes; classic classes will be gone [1]_ -* Return iterators instead of lists where appropriate for atomic type methods - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) - iter*() methods will be removed. * OR... Make keys() etc. return "views" a la Java collections??? * Replace ``print`` by a function [16]_ * Do something so you can catch multiple exceptions using ``except E1, @@ -114,8 +111,9 @@ * Remove distinction between int and long types [1]_ * Make all strings be Unicode, and have a separate bytes() type [1]_ * Return iterators instead of lists where appropriate for atomic type methods - (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.) - (Do we keep iter*() methods or remove them? I vote remove. -- nn) + (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.); iter* + methods will be removed + OR make keys(), etc. return views ala Java collections??? To be removed: From python-checkins at python.org Wed Mar 1 21:53:08 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 21:53:08 +0100 (CET) Subject: [Python-checkins] r42737 - python/trunk/Misc/Vim/python.vim python/trunk/Misc/Vim/syntax_test.py python/trunk/Misc/Vim/vim_syntax.py Message-ID: <20060301205308.031F51E4039@bag.python.org> Author: brett.cannon Date: Wed Mar 1 21:53:08 2006 New Revision: 42737 Modified: python/trunk/Misc/Vim/python.vim python/trunk/Misc/Vim/syntax_test.py python/trunk/Misc/Vim/vim_syntax.py Log: Update for 'with' statement. Modified: python/trunk/Misc/Vim/python.vim ============================================================================== --- python/trunk/Misc/Vim/python.vim (original) +++ python/trunk/Misc/Vim/python.vim Wed Mar 1 21:53:08 2006 @@ -14,8 +14,9 @@ let python_highlight_space_errors = 1 endif -syn keyword pythonStatement assert break continue del except exec finally -syn keyword pythonStatement global lambda pass print raise return try yield +syn keyword pythonStatement as assert break continue del except exec finally +syn keyword pythonStatement global lambda pass print raise return try with +syn keyword pythonStatement yield syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite @@ -82,8 +83,9 @@ syn keyword pythonException UnicodeTranslateError MemoryError StopIteration syn keyword pythonException PendingDeprecationWarning EnvironmentError syn keyword pythonException LookupError OSError DeprecationWarning - syn keyword pythonException UnicodeError FloatingPointError ReferenceError - syn keyword pythonException NameError OverflowWarning IOError SyntaxError + syn keyword pythonException UnicodeError UnicodeEncodeError + syn keyword pythonException FloatingPointError ReferenceError NameError + syn keyword pythonException OverflowWarning IOError SyntaxError syn keyword pythonException FutureWarning SystemExit Exception EOFError syn keyword pythonException StandardError ValueError TabError KeyError syn keyword pythonException ZeroDivisionError SystemError @@ -92,7 +94,7 @@ syn keyword pythonException RuntimeWarning KeyboardInterrupt UserWarning syn keyword pythonException SyntaxWarning UnboundLocalError ArithmeticError syn keyword pythonException Warning NotImplementedError AttributeError - syn keyword pythonException OverflowError UnicodeEncodeError + syn keyword pythonException OverflowError BaseException endif Modified: python/trunk/Misc/Vim/syntax_test.py ============================================================================== --- python/trunk/Misc/Vim/syntax_test.py (original) +++ python/trunk/Misc/Vim/syntax_test.py Wed Mar 1 21:53:08 2006 @@ -13,20 +13,28 @@ # OPTIONAL: XXX catch your attention # Statements +from __future__ import with_statement # Import +from sys import path as thing assert True # keyword def foo(): # function definition return [] class Bar(object): # Class definition - pass + def __context__(self): + return self + def __enter__(self): + pass + def __exit__(self, *args): + pass foo() # UNCOLOURED: function call while False: # 'while' continue for x in foo(): # 'for' break +with Bar() as stuff: + pass if False: pass # 'if' elif False: pass -else False: pass -from sys import path as thing # Import +else: pass # Constants 'single-quote', u'unicode' # Strings of all kinds; prefixes not highlighted Modified: python/trunk/Misc/Vim/vim_syntax.py ============================================================================== --- python/trunk/Misc/Vim/vim_syntax.py (original) +++ python/trunk/Misc/Vim/vim_syntax.py Wed Mar 1 21:53:08 2006 @@ -1,3 +1,5 @@ +from __future__ import with_statement + import keyword import exceptions import __builtin__ @@ -143,11 +145,9 @@ except StopIteration: if buffer_: break - if not buffer_ and overflow: - yield buffer_ - return - else: - return + if overflow: + yield overflow + return if total_len > fill_len: overflow = buffer_.pop() total_len -= len(overflow) - 1 @@ -158,8 +158,7 @@ FILL = 80 def main(file_path): - FILE = open(file_path, 'w') - try: + with open(file_path, 'w') as FILE: # Comment for file print>>FILE, comment_header print>>FILE, '' @@ -222,8 +221,6 @@ print>>FILE, '' # Statements at the end of the file print>>FILE, statement_footer - finally: - FILE.close() if __name__ == '__main__': main("python.vim") From python-checkins at python.org Wed Mar 1 22:11:50 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 22:11:50 +0100 (CET) Subject: [Python-checkins] r42738 - python/trunk/Lib/test/test_compiler.py Message-ID: <20060301211150.07C7C1E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 22:11:49 2006 New Revision: 42738 Modified: python/trunk/Lib/test/test_compiler.py Log: Make failures in test cases print failing source file. Modified: python/trunk/Lib/test/test_compiler.py ============================================================================== --- python/trunk/Lib/test/test_compiler.py (original) +++ python/trunk/Lib/test/test_compiler.py Wed Mar 1 22:11:49 2006 @@ -32,7 +32,11 @@ self.assertRaises(SyntaxError, compiler.compile, buf, basename, "exec") else: - compiler.compile(buf, basename, "exec") + try: + compiler.compile(buf, basename, "exec") + except Exception, e: + e.args[0] += "[in file %s]" % basename + raise def testNewClassSyntax(self): compiler.compile("class foo():pass\n\n","","exec") From python-checkins at python.org Wed Mar 1 22:31:23 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 22:31:23 +0100 (CET) Subject: [Python-checkins] r42739 - python/trunk/Python/getargs.c Message-ID: <20060301213123.3FE001E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 22:31:21 2006 New Revision: 42739 Modified: python/trunk/Python/getargs.c Log: Fix C99-ism, and add XXX to comment Modified: python/trunk/Python/getargs.c ============================================================================== --- python/trunk/Python/getargs.c (original) +++ python/trunk/Python/getargs.c Wed Mar 1 22:31:21 2006 @@ -849,7 +849,7 @@ arg, msgbuf, bufsize); if (*format == '#') { FETCH_SIZE; - assert(0); // redundant with if-case + assert(0); /* XXX redundant with if-case */ if (arg == Py_None) *q = 0; else From python-checkins at python.org Wed Mar 1 22:33:54 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 22:33:54 +0100 (CET) Subject: [Python-checkins] r42740 - python/trunk/Python/modsupport.c Message-ID: <20060301213354.8A7F11E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 22:33:54 2006 New Revision: 42740 Modified: python/trunk/Python/modsupport.c Log: Fix more memory leaks. Will backport to 2.4. Modified: python/trunk/Python/modsupport.c ============================================================================== --- python/trunk/Python/modsupport.c (original) +++ python/trunk/Python/modsupport.c Wed Mar 1 22:33:54 2006 @@ -71,13 +71,17 @@ PyErr_SetString(PyExc_ValueError, "module functions cannot set" " METH_CLASS or METH_STATIC"); + Py_DECREF(n); return NULL; } v = PyCFunction_NewEx(ml, passthrough, n); - if (v == NULL) + if (v == NULL) { + Py_DECREF(n); return NULL; + } if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { Py_DECREF(v); + Py_DECREF(n); return NULL; } Py_DECREF(v); From python-checkins at python.org Wed Mar 1 22:36:35 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 22:36:35 +0100 (CET) Subject: [Python-checkins] r42741 - python/branches/release24-maint/Python/modsupport.c Message-ID: <20060301213635.931291E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 22:36:32 2006 New Revision: 42741 Modified: python/branches/release24-maint/Python/modsupport.c Log: Backport of memory leak fixes. Modified: python/branches/release24-maint/Python/modsupport.c ============================================================================== --- python/branches/release24-maint/Python/modsupport.c (original) +++ python/branches/release24-maint/Python/modsupport.c Wed Mar 1 22:36:32 2006 @@ -71,13 +71,17 @@ PyErr_SetString(PyExc_ValueError, "module functions cannot set" " METH_CLASS or METH_STATIC"); + Py_DECREF(n); return NULL; } v = PyCFunction_NewEx(ml, passthrough, n); - if (v == NULL) + if (v == NULL) { + Py_DECREF(n); return NULL; + } if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { Py_DECREF(v); + Py_DECREF(n); return NULL; } Py_DECREF(v); From python-checkins at python.org Wed Mar 1 22:37:34 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 22:37:34 +0100 (CET) Subject: [Python-checkins] r42742 - python/trunk/Modules/binascii.c Message-ID: <20060301213734.03E6F1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 22:37:32 2006 New Revision: 42742 Modified: python/trunk/Modules/binascii.c Log: Make Py_ssize_t-clean. Modified: python/trunk/Modules/binascii.c ============================================================================== --- python/trunk/Modules/binascii.c (original) +++ python/trunk/Modules/binascii.c Wed Mar 1 22:37:32 2006 @@ -53,6 +53,7 @@ ** Brandon Long, September 2001. */ +#include PY_SSIZE_T_CLEAN #include "Python.h" @@ -189,7 +190,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int ascii_len, bin_len; + Py_ssize_t ascii_len, bin_len; if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) ) return NULL; @@ -265,7 +266,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int bin_len; + Py_ssize_t bin_len; if ( !PyArg_ParseTuple(args, "s#:b2a_uu", &bin_data, &bin_len) ) return NULL; @@ -307,7 +308,7 @@ static int -binascii_find_valid(unsigned char *s, int slen, int num) +binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num) { /* Finds & returns the (num+1)th ** valid character for base64, or -1 if none. @@ -341,7 +342,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int ascii_len, bin_len; + Py_ssize_t ascii_len, bin_len; int quad_pos = 0; if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) ) @@ -432,7 +433,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int bin_len; + Py_ssize_t bin_len; if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) ) return NULL; @@ -485,7 +486,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int len; + Py_ssize_t len; int done = 0; if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) ) @@ -549,7 +550,7 @@ unsigned char *in_data, *out_data; PyObject *rv; unsigned char ch; - int in, inend, len; + Py_ssize_t in, inend, len; if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) ) return NULL; @@ -598,7 +599,7 @@ unsigned char this_ch; unsigned int leftchar = 0; PyObject *rv; - int len; + Py_ssize_t len; if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) ) return NULL; @@ -636,7 +637,7 @@ unsigned char *in_data, *out_data; unsigned char in_byte, in_repeat; PyObject *rv; - int in_len, out_len, out_len_left; + Py_ssize_t in_len, out_len, out_len_left; if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) ) return NULL; @@ -732,7 +733,7 @@ { unsigned char *bin_data; unsigned int crc; - int len; + Py_ssize_t len; if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) ) return NULL; @@ -870,7 +871,7 @@ { /* By Jim Ahlstrom; All rights transferred to CNRI */ unsigned char *bin_data; unsigned long crc = 0UL; /* initial value of CRC */ - int len; + Py_ssize_t len; long result; if ( !PyArg_ParseTuple(args, "s#|l:crc32", &bin_data, &len, &crc) ) @@ -903,10 +904,10 @@ binascii_hexlify(PyObject *self, PyObject *args) { char* argbuf; - int arglen; + Py_ssize_t arglen; PyObject *retval; char* retbuf; - int i, j; + Py_ssize_t i, j; if (!PyArg_ParseTuple(args, "t#:b2a_hex", &argbuf, &arglen)) return NULL; @@ -960,10 +961,10 @@ binascii_unhexlify(PyObject *self, PyObject *args) { char* argbuf; - int arglen; + Py_ssize_t arglen; PyObject *retval; char* retbuf; - int i, j; + Py_ssize_t i, j; if (!PyArg_ParseTuple(args, "s#:a2b_hex", &argbuf, &arglen)) return NULL; @@ -1030,7 +1031,7 @@ unsigned int in, out; char ch; unsigned char *data, *odata; - unsigned int datalen = 0; + Py_ssize_t datalen = 0; PyObject *rv; static char *kwlist[] = {"data", "header", NULL}; int header = 0; @@ -1130,7 +1131,7 @@ { unsigned int in, out; unsigned char *data, *odata; - unsigned int datalen = 0, odatalen = 0; + Py_ssize_t datalen = 0, odatalen = 0; PyObject *rv; unsigned int linelen = 0; static char *kwlist[] = {"data", "quotetabs", "istext", From python-checkins at python.org Wed Mar 1 22:50:09 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 22:50:09 +0100 (CET) Subject: [Python-checkins] r42743 - python/trunk/Modules/_hashopenssl.c Message-ID: <20060301215009.5E5CE1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 22:50:07 2006 New Revision: 42743 Modified: python/trunk/Modules/_hashopenssl.c Log: Make Py_ssize_t-clean. Modified: python/trunk/Modules/_hashopenssl.c ============================================================================== --- python/trunk/Modules/_hashopenssl.c (original) +++ python/trunk/Modules/_hashopenssl.c Wed Mar 1 22:50:07 2006 @@ -11,6 +11,8 @@ * */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include "structmember.h" @@ -166,12 +168,13 @@ EVP_update(EVPobject *self, PyObject *args) { unsigned char *cp; - int len; + Py_ssize_t len; if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) return NULL; - EVP_DigestUpdate(&self->ctx, cp, len); + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); Py_INCREF(Py_None); return Py_None; @@ -238,7 +241,7 @@ PyObject *name_obj = NULL; char *nameStr; unsigned char *cp = NULL; - unsigned int len; + Py_ssize_t len; const EVP_MD *digest; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s#:HASH", kwlist, @@ -262,7 +265,8 @@ Py_INCREF(self->name); if (cp && len) - EVP_DigestUpdate(&self->ctx, cp, len); + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); return 0; } @@ -375,7 +379,7 @@ char *name; const EVP_MD *digest; unsigned char *cp = NULL; - unsigned int len; + Py_ssize_t len; if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|s#:new", kwlist, &name_obj, &cp, &len)) { @@ -389,7 +393,8 @@ digest = EVP_get_digestbyname(name); - return EVPnew(name_obj, digest, NULL, cp, len); + return EVPnew(name_obj, digest, NULL, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); } /* @@ -404,7 +409,7 @@ EVP_new_ ## NAME (PyObject *self, PyObject *args) \ { \ unsigned char *cp = NULL; \ - unsigned int len; \ + Py_ssize_t len; \ \ if (!PyArg_ParseTuple(args, "|s#:" #NAME , &cp, &len)) { \ return NULL; \ @@ -414,7 +419,7 @@ CONST_ ## NAME ## _name_obj, \ NULL, \ CONST_new_ ## NAME ## _ctx_p, \ - cp, len); \ + cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int)); \ } /* a PyMethodDef structure for the constructor */ From python-checkins at python.org Wed Mar 1 22:58:31 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 22:58:31 +0100 (CET) Subject: [Python-checkins] r42744 - python/trunk/Modules/unicodedata.c Message-ID: <20060301215831.03F261E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 22:58:30 2006 New Revision: 42744 Modified: python/trunk/Modules/unicodedata.c Log: Remove gcc (4.0.x) warning about uninitialized value by explicitly setting the sentinel value in the main function, rather than the helper. This function could possibly do with an early-out if any of the helper calls ends up with a len of 0, but I doubt it really matters (how common are malformed hangul syllables, really?) Modified: python/trunk/Modules/unicodedata.c ============================================================================== --- python/trunk/Modules/unicodedata.c (original) +++ python/trunk/Modules/unicodedata.c Wed Mar 1 22:58:30 2006 @@ -799,7 +799,6 @@ } if (*len == -1) { *len = 0; - *pos = -1; } } @@ -812,7 +811,7 @@ /* Check for hangul syllables. */ if (strncmp(name, "HANGUL SYLLABLE ", 16) == 0) { - int L, V, T, len; + int len, L = -1, V = -1, T = -1; const char *pos = name + 16; find_syllable(pos, &len, &L, LCount, 0); pos += len; From python-checkins at python.org Wed Mar 1 22:59:45 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 22:59:45 +0100 (CET) Subject: [Python-checkins] r42745 - python/trunk/Modules/binascii.c Message-ID: <20060301215945.0222D1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 22:59:44 2006 New Revision: 42745 Modified: python/trunk/Modules/binascii.c Log: Fix brainfart. Modified: python/trunk/Modules/binascii.c ============================================================================== --- python/trunk/Modules/binascii.c (original) +++ python/trunk/Modules/binascii.c Wed Mar 1 22:59:44 2006 @@ -53,7 +53,7 @@ ** Brandon Long, September 2001. */ -#include PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN #include "Python.h" From python-checkins at python.org Wed Mar 1 23:01:39 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 23:01:39 +0100 (CET) Subject: [Python-checkins] r42746 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301220139.8651B1E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 23:01:38 2006 New Revision: 42746 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Heroic attempts to get lines under 80 columns. Resolved all new XXX except for the critical one: Py_ADDRESS_IN_RANGE is still broken in an endcase by the new logic, and I still haven't thought of a way to fix that "for free". Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 23:01:38 2006 @@ -494,10 +494,8 @@ /* Allocate a new arena. If we run out of memory, return NULL. Else * allocate a new arena, and return the address of an arena_object - * descriptor describing the new arena. The `prevarena` and `freepools` - * members of the arena_object are left as uninitialized trash. XXX - * That last sentence isn't true right now (it's all zero filled, but don't - * know yet why we bother to do that). + * descriptor describing the new arena. It's expected that the caller will + * set `usable_arenas` to the return value. */ static struct arena_object* new_arena(void) @@ -509,7 +507,6 @@ if (Py_GETENV("PYTHONMALLOCSTATS")) _PyObject_DebugMallocStats(); #endif - if (available_arenas == NULL) { uint i; uint numarenas; @@ -538,16 +535,12 @@ assert(usable_arenas == NULL); assert(available_arenas == NULL); - /* Zero fill the new section of the array. */ - /* XXX Why? */ - memset(&(arenas[maxarenas]), 0, - sizeof(*arenas) * (numarenas - maxarenas)); - /* Put the new arenas on the available_arenas list. */ - for (i = maxarenas; i < numarenas-1; ++i) - arenas[i].nextarena = &arenas[i+1]; - /* The last new arenaobj still points to NULL. */ - assert(arenas[numarenas-1].nextarena == NULL); + for (i = maxarenas; i < numarenas; ++i) { + arenas[i].address = 0; /* mark as unassociated */ + arenas[i].nextarena = i < numarenas - 1 ? + &arenas[i+1] : NULL; + } /* Update globals. */ available_arenas = &arenas[maxarenas]; @@ -557,16 +550,10 @@ /* Take the next available arena object off the head of the list. */ assert(available_arenas != NULL); arenaobj = available_arenas; - available_arenas = available_arenas->nextarena; - - assert(arenaobj->address == (uptr)NULL); - - /* Fill the newly allocated or reused arena object with zeros. */ - /* XXX Why? */ - memset(arenaobj, 0, sizeof(*arenaobj)); - + available_arenas = arenaobj->nextarena; + assert(arenaobj->address == 0); arenaobj->address = (uptr)malloc(ARENA_SIZE); - if (arenaobj->address == (uptr)NULL) { + if (arenaobj->address == 0) { /* The allocation failed: return NULL after putting the * arenaobj back. */ @@ -581,12 +568,13 @@ if (narenas_currently_allocated > narenas_highwater) narenas_highwater = narenas_currently_allocated; #endif + arenaobj->freepools = NULL; /* pool_address <- first pool-aligned address in the arena nfreepools <- number of whole pools that fit after alignment */ arenaobj->pool_address = (block*)arenaobj->address; arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE; assert(POOL_SIZE * arenaobj->nfreepools == ARENA_SIZE); - excess = (uint)((Py_uintptr_t)arenaobj->address & POOL_SIZE_MASK); + excess = (uint)(arenaobj->address & POOL_SIZE_MASK); if (excess != 0) { --arenaobj->nfreepools; arenaobj->pool_address += POOL_SIZE - excess; @@ -746,6 +734,8 @@ UNLOCK(); goto redirect; } + usable_arenas->nextarena = + usable_arenas->prevarena = NULL; } assert(usable_arenas->address != 0); @@ -888,7 +878,8 @@ *(block **)p = lastfree = pool->freeblock; pool->freeblock = (block *)p; if (lastfree) { - struct arena_object* arenaobj; + struct arena_object* ao; + uint nf; /* ao->nfreepools */ /* freeblock wasn't NULL, so the pool wasn't full, * and the pool is in a usedpools[] list. @@ -911,72 +902,65 @@ /* Link the pool to freepools. This is a singly-linked * list, and pool->prevpool isn't used there. */ - arenaobj = &arenas[pool->arenaindex]; - pool->nextpool = arenaobj->freepools; - arenaobj->freepools = pool; - ++arenaobj->nfreepools; + ao = &arenas[pool->arenaindex]; + pool->nextpool = ao->freepools; + ao->freepools = pool; + nf = ++ao->nfreepools; - if (arenaobj->nfreepools == arenaobj->ntotalpools) { - void* address; + if (nf == ao->ntotalpools) { /* This arena is completely deallocated. * Unlink it from the partially allocated * arenas. */ - assert(arenaobj->prevarena == NULL || - arenaobj->prevarena->address != - (uptr)NULL); - assert(arenaobj->nextarena == NULL || - arenaobj->nextarena->address != - (uptr)NULL); + assert(ao->prevarena == NULL || + ao->prevarena->address != 0); + assert(ao ->nextarena == NULL || + ao->nextarena->address != 0); /* Fix the pointer in the prevarena, or the - * usable_arenas pointer + * usable_arenas pointer. */ - if (arenaobj->prevarena == NULL) { - usable_arenas = arenaobj->nextarena; + if (ao->prevarena == NULL) { + usable_arenas = ao->nextarena; assert(usable_arenas == NULL || usable_arenas->address != 0); } else { - assert(arenaobj->prevarena->nextarena == - arenaobj); - arenaobj->prevarena->nextarena = - arenaobj->nextarena; + assert(ao->prevarena->nextarena == ao); + ao->prevarena->nextarena = + ao->nextarena; } /* Fix the pointer in the nextarena. */ - if (arenaobj->nextarena != NULL) { - assert(arenaobj->nextarena->prevarena == - arenaobj); - arenaobj->nextarena->prevarena = - arenaobj->prevarena; + if (ao->nextarena != NULL) { + assert(ao->nextarena->prevarena == ao); + ao->nextarena->prevarena = + ao->prevarena; } - /* Record that this arena slot is available to - * be reused. + /* Record that this arena_object slot is + * available to be reused. */ - arenaobj->nextarena = available_arenas; - available_arenas = arenaobj; + ao->nextarena = available_arenas; + available_arenas = ao; /* Free the entire arena. */ - address = (void *)arenaobj->address; - arenaobj->address = (uptr)NULL; - free(address); + free((void *)ao->address); + ao->address = 0; --narenas_currently_allocated; - } - else if (arenaobj->nfreepools == 1) { + else if (nf == 1) { /* If this arena was completely allocated, * go link it to the head of the partially * allocated list. */ - arenaobj->nextarena = usable_arenas; - arenaobj->prevarena = NULL; - usable_arenas = arenaobj; + ao->nextarena = usable_arenas; + ao->prevarena = NULL; + usable_arenas = ao; /* Fix the pointer in the nextarena. */ - if (arenaobj->nextarena != NULL) - arenaobj->nextarena->prevarena = arenaobj; + if (ao->nextarena != NULL) + ao->nextarena->prevarena = ao; assert(usable_arenas->address != 0); } @@ -987,60 +971,56 @@ * a few un-scientific tests, it seems like this * approach allowed a lot more memory to be freed. */ - else if (arenaobj->nextarena != NULL && - arenaobj->nfreepools > - arenaobj->nextarena->nfreepools) { + else if (ao->nextarena != NULL && + nf > ao->nextarena->nfreepools) { /* We have to move the arena towards the end * of the list. */ struct arena_object** lastPointer; - if (arenaobj->prevarena != NULL) - lastPointer = &arenaobj->prevarena->nextarena; + if (ao->prevarena != NULL) + lastPointer = + &ao->prevarena->nextarena; else lastPointer = &usable_arenas; - assert(*lastPointer == arenaobj); + assert(*lastPointer == ao); /* Step one: unlink the arena from the list. */ - *lastPointer = arenaobj->nextarena; - arenaobj->nextarena->prevarena = arenaobj->prevarena; + *lastPointer = ao->nextarena; + ao->nextarena->prevarena = ao->prevarena; /* Step two: Locate the new insertion point by * iterating over the list, using our nextarena * pointer. */ - while (arenaobj->nextarena != NULL && - arenaobj->nfreepools > - arenaobj->nextarena->nfreepools) { - arenaobj->prevarena = arenaobj->nextarena; - arenaobj->nextarena = arenaobj->nextarena->nextarena; + while (ao->nextarena != NULL && + nf > ao->nextarena->nfreepools) { + ao->prevarena = ao->nextarena; + ao->nextarena = + ao->nextarena->nextarena; } /* Step three: insert the arena at this point. */ - assert(arenaobj->nextarena == NULL || - arenaobj->prevarena == - arenaobj->nextarena->prevarena); - assert(arenaobj->prevarena->nextarena == - arenaobj->nextarena); - - arenaobj->prevarena->nextarena = arenaobj; - if (arenaobj->nextarena != NULL) { - arenaobj->nextarena->prevarena = arenaobj; + assert(ao->nextarena == NULL || + ao->prevarena == + ao->nextarena->prevarena); + assert(ao->prevarena->nextarena == + ao->nextarena); + + ao->prevarena->nextarena = ao; + if (ao->nextarena != NULL) { + ao->nextarena->prevarena = ao; } /* Verify that the swaps worked. */ - assert(arenaobj->nextarena == NULL || - arenaobj->nfreepools <= - arenaobj->nextarena->nfreepools); - assert(arenaobj->prevarena == NULL || - arenaobj->nfreepools > - arenaobj->prevarena->nfreepools); - assert(arenaobj->nextarena == NULL || - arenaobj->nextarena->prevarena == - arenaobj); - assert((usable_arenas == arenaobj && - arenaobj->prevarena == NULL) || - arenaobj->prevarena->nextarena == - arenaobj); + assert(ao->nextarena == NULL || + nf <= ao->nextarena->nfreepools); + assert(ao->prevarena == NULL || + nf > ao->prevarena->nfreepools); + assert(ao->nextarena == NULL || + ao->nextarena->prevarena == ao); + assert((usable_arenas == ao && + ao->prevarena == NULL) || + ao->prevarena->nextarena == ao); } UNLOCK(); From python-checkins at python.org Wed Mar 1 23:06:23 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:06:23 +0100 (CET) Subject: [Python-checkins] r42747 - python/trunk/Python/ast.c Message-ID: <20060301220623.8E1731E400A@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:06:23 2006 New Revision: 42747 Modified: python/trunk/Python/ast.c Log: Fix uninitialized value. (Why are we using bools instead of ints, like we do everywhere else?) Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Wed Mar 1 23:06:23 2006 @@ -1415,7 +1415,7 @@ int j; slice_ty slc; expr_ty e; - bool simple; + bool simple = true; asdl_seq *slices, *elts; slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); if (!slices) From python-checkins at python.org Wed Mar 1 23:10:51 2006 From: python-checkins at python.org (brett.cannon) Date: Wed, 1 Mar 2006 23:10:51 +0100 (CET) Subject: [Python-checkins] r42748 - in python/trunk: Doc/api/exceptions.tex Doc/lib/libexcs.tex Doc/tut/tut.tex Python/exceptions.c Message-ID: <20060301221051.30A3D1E4014@bag.python.org> Author: brett.cannon Date: Wed Mar 1 23:10:49 2006 New Revision: 42748 Modified: python/trunk/Doc/api/exceptions.tex python/trunk/Doc/lib/libexcs.tex python/trunk/Doc/tut/tut.tex python/trunk/Python/exceptions.c Log: Document PEP 352 changes. Also added GeneratorExit. Modified: python/trunk/Doc/api/exceptions.tex ============================================================================== --- python/trunk/Doc/api/exceptions.tex (original) +++ python/trunk/Doc/api/exceptions.tex Wed Mar 1 23:10:49 2006 @@ -346,6 +346,7 @@ completeness, here are all the variables: \begin{tableiii}{l|l|c}{cdata}{C Name}{Python Name}{Notes} + \lineiii{PyExc_BaseException\ttindex{PyExc_BaseException}}{\exception{BaseException}}{(1), (4)} \lineiii{PyExc_Exception\ttindex{PyExc_Exception}}{\exception{Exception}}{(1)} \lineiii{PyExc_StandardError\ttindex{PyExc_StandardError}}{\exception{StandardError}}{(1)} \lineiii{PyExc_ArithmeticError\ttindex{PyExc_ArithmeticError}}{\exception{ArithmeticError}}{(1)} @@ -388,14 +389,17 @@ \item[(3)] Only defined on Windows; protect code that uses this by testing that the preprocessor macro \code{MS_WINDOWS} is defined. + +\item[(4)] + \versionadded{2.5} \end{description} \section{Deprecation of String Exceptions} All exceptions built into Python or provided in the standard library -are derived from \exception{Exception}. -\withsubitem{(built-in exception)}{\ttindex{Exception}} +are derived from \exception{BaseException}. +\withsubitem{(built-in exception)}{\ttindex{BaseException}} String exceptions are still supported in the interpreter to allow existing code to run unmodified, but this will also change in a future Modified: python/trunk/Doc/lib/libexcs.tex ============================================================================== --- python/trunk/Doc/lib/libexcs.tex (original) +++ python/trunk/Doc/lib/libexcs.tex Wed Mar 1 23:10:49 2006 @@ -14,7 +14,8 @@ In past versions of Python string exceptions were supported. In Python 1.5 and newer versions, all standard exceptions have been converted to class objects and users are encouraged to do the same. -String exceptions will raise a \code{PendingDeprecationWarning}. +String exceptions will raise a \code{DeprecationWarning} in Python 2.5 and +newer. In future versions, support for string exceptions will be removed. Two distinct string objects with the same value are considered different @@ -43,9 +44,9 @@ second argument of the \keyword{except} clause (if any). For class exceptions, that variable receives the exception instance. If the exception class is derived from the standard root class -\exception{Exception}, the associated value is present as the -exception instance's \member{args} attribute, and possibly on other -attributes as well. +\exception{BaseException}, the associated value is present as the +exception instance's \member{args} attribute. If there is a single argument +(as is preferred), it is bound to the \member{message} attribute. User code can raise built-in exceptions. This can be used to test an exception handler or to report an error condition ``just like'' the @@ -55,7 +56,8 @@ The built-in exception classes can be sub-classed to define new exceptions; programmers are encouraged to at least derive new -exceptions from the \exception{Exception} base class. More +exceptions from the \exception{Exception} class and not +\exception{BaseException}. More information on defining exceptions is available in the \citetitle[../tut/tut.html]{Python Tutorial} under the heading ``User-defined Exceptions.'' @@ -65,23 +67,33 @@ The following exceptions are only used as base classes for other exceptions. +\begin{excdesc}{BaseException} +The base class for all built-in exceptions. It is not meant to be directly +inherited by user-defined classes (for that use \exception{Exception}). If +\function{str()} or \function{unicode()} is called on an instance of this +class, the representation of the argument(s) to the instance are returned or +the emptry string when there were no arguments. If only a single argument is +passed in, it is stored in the \member{message} attribute. If more than one +argument is passed in, \member{message} is set to the empty string. These +semantics are meant to reflect the fact that \member{message} is to store a +text message explaining why the exception had been raised. If more data needs +to be attached to the exception, attach it through arbitrary attributes on the +instance. All arguments are also stored in \member{args} as a tuple, but it will +eventually be deprecated and thus its use is discouraged. +\versionchanged[Changed to inherit from \exception{BaseException}]{2.5} +\versionadded{2.5} + \begin{excdesc}{Exception} -The root class for exceptions. All built-in exceptions are derived +All built-in, non-system-exiting exceptions are derived from this class. All user-defined exceptions should also be derived -from this class, but this is not (yet) enforced. The \function{str()} -function, when applied to an instance of this class (or most derived -classes) returns the string value of the argument or arguments, or an -empty string if no arguments were given to the constructor. When used -as a sequence, this accesses the arguments given to the constructor -(handy for backward compatibility with old code). The arguments are -also available on the instance's \member{args} attribute, as a tuple. +from this class. \end{excdesc} \begin{excdesc}{StandardError} The base class for all built-in exceptions except -\exception{StopIteration} and \exception{SystemExit}. -\exception{StandardError} itself is derived from the root class -\exception{Exception}. +\exception{StopIteration}, \exception{GeneratorExit}, +\exception{KeyboardInterrupt} and \exception{SystemExit}. +\exception{StandardError} itself is derived from \exception{Exception}. \end{excdesc} \begin{excdesc}{ArithmeticError} @@ -156,6 +168,12 @@ \file{pyconfig.h} file. \end{excdesc} +\begin{excdesv}{GeneratorExit} + Raise when a generator's \method{close()} method is called. + It directly inherits from \exception{Exception} instead of + \exception{StandardError} since it is technically not an error. + \versionadded{2.5} + \begin{excdesc}{IOError} % XXXJH xrefs here Raised when an I/O operation (such as a \keyword{print} statement, @@ -192,10 +210,14 @@ Raised when the user hits the interrupt key (normally \kbd{Control-C} or \kbd{Delete}). During execution, a check for interrupts is made regularly. -% XXXJH xrefs here +% XXX(hylton) xrefs here Interrupts typed when a built-in function \function{input()} or \function{raw_input()} is waiting for input also raise this exception. + The exception inherits from \exception{BaseException} so as to not be + accidentally caught by code that catches \exception{Exception} and thus + prevent the interpreter from exiting. + \versionchanged[Changed to inherit from \exception{BaseException}]{2.5} \end{excdesc} \begin{excdesc}{MemoryError} @@ -270,6 +292,7 @@ \versionadded{2.2} \end{excdesc} + \begin{excdesc}{SyntaxError} % XXXJH xref to these functions? Raised when the parser encounters a syntax error. This may occur in @@ -299,7 +322,7 @@ \end{excdesc} \begin{excdesc}{SystemExit} -% XXXJH xref to module sys? +% XXX(hylton) xref to module sys? This exception is raised by the \function{sys.exit()} function. When it is not handled, the Python interpreter exits; no stack traceback is printed. If the associated value is a plain integer, it specifies the @@ -309,7 +332,7 @@ Instances have an attribute \member{code} which is set to the proposed exit status or error message (defaulting to \code{None}). - Also, this exception derives directly from \exception{Exception} and + Also, this exception derives directly from \exception{BaseException} and not \exception{StandardError}, since it is not technically an error. A call to \function{sys.exit()} is translated into an exception so that @@ -319,6 +342,12 @@ can be used if it is absolutely positively necessary to exit immediately (for example, in the child process after a call to \function{fork()}). + + The exception inherits from \exception{BaseException} instead of + \exception{StandardError} or \exception{Exception} so that it is not + accidentally caught by code that catches \exception{Exception}. This allows + the exception to properly propagate up and cause the interpreter to exit. + \versionchanged[Changed to inherit from \exception{BaseException}]{2.5} \end{excdesc} \begin{excdesc}{TypeError} @@ -418,49 +447,4 @@ The class hierarchy for built-in exceptions is: -\begin{verbatim} - Exception - +-- SystemExit - +-- StopIteration - +-- StandardError - | +-- KeyboardInterrupt - | +-- ImportError - | +-- EnvironmentError - | | +-- IOError - | | +-- OSError - | | +-- WindowsError - | +-- EOFError - | +-- RuntimeError - | | +-- NotImplementedError - | +-- NameError - | | +-- UnboundLocalError - | +-- AttributeError - | +-- SyntaxError - | | +-- IndentationError - | | +-- TabError - | +-- TypeError - | +-- AssertionError - | +-- LookupError - | | +-- IndexError - | | +-- KeyError - | +-- ArithmeticError - | | +-- OverflowError - | | +-- ZeroDivisionError - | | +-- FloatingPointError - | +-- ValueError - | | +-- UnicodeError - | | +-- UnicodeEncodeError - | | +-- UnicodeDecodeError - | | +-- UnicodeTranslateError - | +-- ReferenceError - | +-- SystemError - | +-- MemoryError - +---Warning - +-- UserWarning - +-- DeprecationWarning - +-- PendingDeprecationWarning - +-- SyntaxWarning - +-- OverflowWarning (not generated in 2.4; won't exist in 2.5) - +-- RuntimeWarning - +-- FutureWarning -\end{verbatim} +\verbatiminput{../../Lib/test/exception_hierarchy.txt} Modified: python/trunk/Doc/tut/tut.tex ============================================================================== --- python/trunk/Doc/tut/tut.tex (original) +++ python/trunk/Doc/tut/tut.tex Wed Mar 1 23:10:49 2006 @@ -3512,6 +3512,12 @@ defines \method{__getitem__} and \method{__str__} so the arguments can be accessed or printed directly without having to reference \code{.args}. +But use of \code{.args} is discouraged. Instead, the preferred use is to pass +a single argument to an exception (which can be a tuple if multiple arguments +are needed) and have it bound to the \code{message} attribute. One my also +instantiate an exception first before raising it and add any attributes to it +as desired. + \begin{verbatim} >>> try: ... raise Exception('spam', 'eggs') Modified: python/trunk/Python/exceptions.c ============================================================================== --- python/trunk/Python/exceptions.c (original) +++ python/trunk/Python/exceptions.c Wed Mar 1 23:10:49 2006 @@ -7,11 +7,6 @@ * By moving the exceptions into C and statically linking, we can guarantee * that the standard exceptions will always be available. * - * history: - * 98-08-19 fl created (for pyexe) - * 00-02-08 fl updated for 1.5.2 - * 26-May-2000 baw vetted for Python 1.6 - * XXX * * written by Fredrik Lundh * modifications, additions, cleanups, and proofreading by Barry Warsaw @@ -36,11 +31,11 @@ \n\ Exceptions found here are defined both in the exceptions module and the \n\ built-in namespace. It is recommended that user-defined exceptions inherit \n\ -from Exception.\n\ +from Exception. See the documentation for the exception inheritance hierarchy.\n\ " /* keep string pieces "small" */ -/* XXX exception hierarchy from Lib/test/exception_hierarchy.txt */ +/* XXX(bcannon): exception hierarchy in Lib/test/exception_hierarchy.txt */ ); From python-checkins at python.org Wed Mar 1 23:15:15 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:15:15 +0100 (CET) Subject: [Python-checkins] r42749 - python/trunk/Modules/cStringIO.c Message-ID: <20060301221515.6C95B1E4026@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:15:15 2006 New Revision: 42749 Modified: python/trunk/Modules/cStringIO.c Log: Silence gcc (4.0.x) warning about use of uninitialized value. Modified: python/trunk/Modules/cStringIO.c ============================================================================== --- python/trunk/Modules/cStringIO.c (original) +++ python/trunk/Modules/cStringIO.c Wed Mar 1 23:15:15 2006 @@ -173,7 +173,7 @@ static PyObject * IO_read(IOobject *self, PyObject *args) { Py_ssize_t n = -1; - char *output; + char *output = NULL; UNLESS (PyArg_ParseTuple(args, "|n:read", &n)) return NULL; From python-checkins at python.org Wed Mar 1 23:30:48 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:30:48 +0100 (CET) Subject: [Python-checkins] r42750 - python/trunk/Python/marshal.c Message-ID: <20060301223048.344C81E4050@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:30:47 2006 New Revision: 42750 Modified: python/trunk/Python/marshal.c Log: Fix gcc (4.0.x) warning about use of uninitialized variables. (PyMarshal_ReadShortFromFile() is only used in zipimport.c, I don't believe the extra initializations will matter one way or another.) Modified: python/trunk/Python/marshal.c ============================================================================== --- python/trunk/Python/marshal.c (original) +++ python/trunk/Python/marshal.c Wed Mar 1 23:30:47 2006 @@ -885,8 +885,9 @@ PyMarshal_ReadShortFromFile(FILE *fp) { RFILE rf; + assert(fp); rf.fp = fp; - rf.strings = NULL; + rf.strings = rf.end = rf.ptr = NULL; return r_short(&rf); } From python-checkins at python.org Wed Mar 1 23:34:10 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:34:10 +0100 (CET) Subject: [Python-checkins] r42751 - python/trunk/Python/marshal.c Message-ID: <20060301223410.8500F1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:34:09 2006 New Revision: 42751 Modified: python/trunk/Python/marshal.c Log: Fix incompatible assignment warning from previous checkin. Modified: python/trunk/Python/marshal.c ============================================================================== --- python/trunk/Python/marshal.c (original) +++ python/trunk/Python/marshal.c Wed Mar 1 23:34:09 2006 @@ -887,7 +887,8 @@ RFILE rf; assert(fp); rf.fp = fp; - rf.strings = rf.end = rf.ptr = NULL; + rf.strings = NULL; + rf.end = rf.ptr = NULL; return r_short(&rf); } From python-checkins at python.org Wed Mar 1 23:45:36 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:45:36 +0100 (CET) Subject: [Python-checkins] r42752 - python/trunk/Modules/linuxaudiodev.c python/trunk/Modules/ossaudiodev.c Message-ID: <20060301224536.857BB1E4029@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:45:36 2006 New Revision: 42752 Modified: python/trunk/Modules/linuxaudiodev.c python/trunk/Modules/ossaudiodev.c Log: Rework channelnumber/samplesize detetion code's output variables a bit to convince gcc (4.0.x) the variables are never used uninitialized (and raising a proper exception if they ever are.) Modified: python/trunk/Modules/linuxaudiodev.c ============================================================================== --- python/trunk/Modules/linuxaudiodev.c (original) +++ python/trunk/Modules/linuxaudiodev.c Wed Mar 1 23:45:36 2006 @@ -332,7 +332,6 @@ default: return -EOPNOTSUPP; } - *nchannels = 0; if (ioctl(self->x_fd, SNDCTL_DSP_CHANNELS, nchannels) < 0) return -errno; return 0; @@ -345,11 +344,11 @@ lad_bufsize(lad_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":bufsize")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { PyErr_SetFromErrno(LinuxAudioError); return NULL; } @@ -366,12 +365,12 @@ lad_obufcount(lad_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":obufcount")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { PyErr_SetFromErrno(LinuxAudioError); return NULL; } @@ -389,12 +388,12 @@ lad_obuffree(lad_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":obuffree")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !ssize || !nchannels) { PyErr_SetFromErrno(LinuxAudioError); return NULL; } Modified: python/trunk/Modules/ossaudiodev.c ============================================================================== --- python/trunk/Modules/ossaudiodev.c (original) +++ python/trunk/Modules/ossaudiodev.c Wed Mar 1 23:45:36 2006 @@ -569,7 +569,6 @@ default: return -EOPNOTSUPP; } - *nchannels = 0; if (ioctl(self->fd, SNDCTL_DSP_CHANNELS, nchannels) < 0) return -errno; return 0; @@ -582,11 +581,11 @@ oss_bufsize(oss_audio_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":bufsize")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) { PyErr_SetFromErrno(PyExc_IOError); return NULL; } @@ -603,12 +602,12 @@ oss_obufcount(oss_audio_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":obufcount")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) { PyErr_SetFromErrno(PyExc_IOError); return NULL; } @@ -626,12 +625,12 @@ oss_obuffree(oss_audio_t *self, PyObject *args) { audio_buf_info ai; - int nchannels, ssize; + int nchannels=0, ssize=0; if (!PyArg_ParseTuple(args, ":obuffree")) return NULL; - if (_ssize(self, &nchannels, &ssize) < 0) { + if (_ssize(self, &nchannels, &ssize) < 0 || !nchannels || !ssize) { PyErr_SetFromErrno(PyExc_IOError); return NULL; } From python-checkins at python.org Wed Mar 1 23:49:09 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 1 Mar 2006 23:49:09 +0100 (CET) Subject: [Python-checkins] r42753 - in python/trunk: Doc/lib/libast.tex Include/Python-ast.h Include/node.h Lib/test/test_ast.py Modules/parsermodule.c Parser/Python.asdl Parser/asdl.py Parser/node.c Parser/parser.c Parser/parser.h Parser/parsetok.c Parser/tokenizer.c Parser/tokenizer.h Python/Python-ast.c Python/ast.c Python/compile.c Message-ID: <20060301224909.7DB371E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 1 23:49:05 2006 New Revision: 42753 Modified: python/trunk/Doc/lib/libast.tex python/trunk/Include/Python-ast.h python/trunk/Include/node.h python/trunk/Lib/test/test_ast.py python/trunk/Modules/parsermodule.c python/trunk/Parser/Python.asdl python/trunk/Parser/asdl.py python/trunk/Parser/node.c python/trunk/Parser/parser.c python/trunk/Parser/parser.h python/trunk/Parser/parsetok.c python/trunk/Parser/tokenizer.c python/trunk/Parser/tokenizer.h python/trunk/Python/Python-ast.c python/trunk/Python/ast.c python/trunk/Python/compile.c Log: Patch #1440601: Add col_offset attribute to AST nodes. Modified: python/trunk/Doc/lib/libast.tex ============================================================================== --- python/trunk/Doc/lib/libast.tex (original) +++ python/trunk/Doc/lib/libast.tex Wed Mar 1 23:49:05 2006 @@ -34,7 +34,13 @@ Each instance of a concrete class has one attribute for each child node, of the type as defined in the grammar. For example, \code{_ast.BinOp} -instances have an attribute \code{left} of type \code{_ast.expr}. +instances have an attribute \code{left} of type \code{_ast.expr}. +Instances of \code{_ast.expr} and \code{_ast.stmt} subclasses also +have lineno and col_offset attributes. The lineno is the line number +of source text (1 indexed so the first line is line 1) and the +col_offset is the utf8 byte offset of the first token that generated +the node. The utf8 offset is recorded because the parser uses utf8 +internally. If these attributes are marked as optional in the grammar (using a question mark), the value might be \code{None}. If the attributes Modified: python/trunk/Include/Python-ast.h ============================================================================== --- python/trunk/Include/Python-ast.h (original) +++ python/trunk/Include/Python-ast.h Wed Mar 1 23:49:05 2006 @@ -178,6 +178,7 @@ } v; int lineno; + int col_offset; }; struct _expr { @@ -288,6 +289,7 @@ } v; int lineno; + int col_offset; }; struct _slice { @@ -346,68 +348,79 @@ mod_ty Expression(expr_ty body, PyArena *arena); mod_ty Suite(asdl_seq * body, PyArena *arena); stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorators, int lineno, PyArena *arena); + asdl_seq * decorators, int lineno, int col_offset, PyArena + *arena); stmt_ty ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int - lineno, PyArena *arena); -stmt_ty Return(expr_ty value, int lineno, PyArena *arena); -stmt_ty Delete(asdl_seq * targets, int lineno, PyArena *arena); -stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena); + lineno, int col_offset, PyArena *arena); +stmt_ty Return(expr_ty value, int lineno, int col_offset, PyArena *arena); +stmt_ty Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena); +stmt_ty Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, + PyArena *arena); stmt_ty AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, - PyArena *arena); -stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena - *arena); + int col_offset, PyArena *arena); +stmt_ty Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int + col_offset, PyArena *arena); stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, - int lineno, PyArena *arena); -stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - PyArena *arena); -stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - PyArena *arena); + int lineno, int col_offset, PyArena *arena); +stmt_ty While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int + col_offset, PyArena *arena); +stmt_ty If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int + col_offset, PyArena *arena); stmt_ty With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int - lineno, PyArena *arena); -stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena - *arena); + lineno, int col_offset, PyArena *arena); +stmt_ty Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int + col_offset, PyArena *arena); stmt_ty TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int - lineno, PyArena *arena); -stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena - *arena); -stmt_ty Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena); -stmt_ty Import(asdl_seq * names, int lineno, PyArena *arena); + lineno, int col_offset, PyArena *arena); +stmt_ty TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int + col_offset, PyArena *arena); +stmt_ty Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena + *arena); +stmt_ty Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena); stmt_ty ImportFrom(identifier module, asdl_seq * names, int level, int lineno, - PyArena *arena); -stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena - *arena); -stmt_ty Global(asdl_seq * names, int lineno, PyArena *arena); -stmt_ty Expr(expr_ty value, int lineno, PyArena *arena); -stmt_ty Pass(int lineno, PyArena *arena); -stmt_ty Break(int lineno, PyArena *arena); -stmt_ty Continue(int lineno, PyArena *arena); -expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena); -expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena - *arena); -expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena); -expr_ty Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena); -expr_ty IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, PyArena - *arena); -expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena); -expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena - *arena); -expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena - *arena); -expr_ty Yield(expr_ty value, int lineno, PyArena *arena); + int col_offset, PyArena *arena); +stmt_ty Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int + col_offset, PyArena *arena); +stmt_ty Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena); +stmt_ty Expr(expr_ty value, int lineno, int col_offset, PyArena *arena); +stmt_ty Pass(int lineno, int col_offset, PyArena *arena); +stmt_ty Break(int lineno, int col_offset, PyArena *arena); +stmt_ty Continue(int lineno, int col_offset, PyArena *arena); +expr_ty BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int + col_offset, PyArena *arena); +expr_ty UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, + PyArena *arena); +expr_ty Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, + PyArena *arena); +expr_ty IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int + col_offset, PyArena *arena); +expr_ty Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, + PyArena *arena); +expr_ty ListComp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +expr_ty GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int + col_offset, PyArena *arena); +expr_ty Yield(expr_ty value, int lineno, int col_offset, PyArena *arena); expr_ty Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int - lineno, PyArena *arena); + lineno, int col_offset, PyArena *arena); expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty - starargs, expr_ty kwargs, int lineno, PyArena *arena); -expr_ty Repr(expr_ty value, int lineno, PyArena *arena); -expr_ty Num(object n, int lineno, PyArena *arena); -expr_ty Str(string s, int lineno, PyArena *arena); + starargs, expr_ty kwargs, int lineno, int col_offset, PyArena + *arena); +expr_ty Repr(expr_ty value, int lineno, int col_offset, PyArena *arena); +expr_ty Num(object n, int lineno, int col_offset, PyArena *arena); +expr_ty Str(string s, int lineno, int col_offset, PyArena *arena); expr_ty Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int - lineno, PyArena *arena); + lineno, int col_offset, PyArena *arena); expr_ty Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int - lineno, PyArena *arena); -expr_ty Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena); -expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); -expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena); + lineno, int col_offset, PyArena *arena); +expr_ty Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, + PyArena *arena); +expr_ty List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, + PyArena *arena); +expr_ty Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, + PyArena *arena); slice_ty Ellipsis(PyArena *arena); slice_ty Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); slice_ty ExtSlice(asdl_seq * dims, PyArena *arena); Modified: python/trunk/Include/node.h ============================================================================== --- python/trunk/Include/node.h (original) +++ python/trunk/Include/node.h Wed Mar 1 23:49:05 2006 @@ -11,13 +11,14 @@ short n_type; char *n_str; int n_lineno; + int n_col_offset; int n_nchildren; struct _node *n_child; } node; PyAPI_FUNC(node *) PyNode_New(int type); PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, - char *str, int lineno); + char *str, int lineno, int col_offset); PyAPI_FUNC(void) PyNode_Free(node *n); /* Node access functions */ Modified: python/trunk/Lib/test/test_ast.py ============================================================================== --- python/trunk/Lib/test/test_ast.py (original) +++ python/trunk/Lib/test/test_ast.py Wed Mar 1 23:49:05 2006 @@ -1,4 +1,5 @@ import sys, itertools +import _ast def to_tuple(t): if t is None or isinstance(t, (basestring, int, long, complex)): @@ -6,6 +7,8 @@ elif isinstance(t, list): return [to_tuple(e) for e in t] result = [t.__class__.__name__] + if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): + result.append((t.lineno, t.col_offset)) if t._fields is None: return tuple(result) for f in t._fields: @@ -106,7 +109,10 @@ # List "[1,2,3]", # Tuple - "1,2,3" + "1,2,3", + # Combination + "a.b.c.d(a.b[1:2])", + ] # TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension @@ -121,58 +127,77 @@ print "run_tests()" raise SystemExit +def test_order(ast_node, parent_pos): + + if not isinstance(ast_node, _ast.AST) or ast_node._fields == None: + return + if isinstance(ast_node, (_ast.expr, _ast.stmt)): + node_pos = (ast_node.lineno, ast_node.col_offset) + assert node_pos >= parent_pos, (node_pos, parent_pos) + parent_pos = (ast_node.lineno, ast_node.col_offset) + for name in ast_node._fields: + value = getattr(ast_node, name) + if isinstance(value, list): + for child in value: + test_order(child, parent_pos) + elif value != None: + test_order(value, parent_pos) + def run_tests(): for input, output, kind in ((exec_tests, exec_results, "exec"), (single_tests, single_results, "single"), (eval_tests, eval_results, "eval")): for i, o in itertools.izip(input, output): - assert to_tuple(compile(i, "?", kind, 0x400)) == o + ast_tree = compile(i, "?", kind, 0x400) + assert to_tuple(ast_tree) == o + test_order(ast_tree, (0, 0)) #### EVERYTHING BELOW IS GENERATED ##### exec_results = [ -('Module', [('FunctionDef', 'f', ('arguments', [], None, None, []), [('Pass',)], [])]), -('Module', [('ClassDef', 'C', [], [('Pass',)])]), -('Module', [('FunctionDef', 'f', ('arguments', [], None, None, []), [('Return', ('Num', 1))], [])]), -('Module', [('Delete', [('Name', 'v', ('Del',))])]), -('Module', [('Assign', [('Name', 'v', ('Store',))], ('Num', 1))]), -('Module', [('AugAssign', ('Name', 'v', ('Load',)), ('Add',), ('Num', 1))]), -('Module', [('Print', ('Name', 'f', ('Load',)), [('Num', 1)], False)]), -('Module', [('For', ('Name', 'v', ('Store',)), ('Name', 'v', ('Load',)), [('Pass',)], [])]), -('Module', [('While', ('Name', 'v', ('Load',)), [('Pass',)], [])]), -('Module', [('If', ('Name', 'v', ('Load',)), [('Pass',)], [])]), -('Module', [('Raise', ('Name', 'Exception', ('Load',)), ('Str', 'string'), None)]), -('Module', [('TryExcept', [('Pass',)], [('excepthandler', ('Name', 'Exception', ('Load',)), None, [('Pass',)])], [])]), -('Module', [('TryFinally', [('Pass',)], [('Pass',)])]), -('Module', [('Assert', ('Name', 'v', ('Load',)), None)]), -('Module', [('Import', [('alias', 'sys', None)])]), -('Module', [('ImportFrom', 'sys', [('alias', 'v', None)], 0)]), -('Module', [('Exec', ('Str', 'v'), None, None)]), -('Module', [('Global', ['v'])]), -('Module', [('Expr', ('Num', 1))]), -('Module', [('Pass',)]), -('Module', [('Break',)]), -('Module', [('Continue',)]), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Pass', (1, 9))], [])]), +('Module', [('ClassDef', (1, 0), 'C', [], [('Pass', (1, 8))])]), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [])]), +('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]), +('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]), +('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Load',)), ('Add',), ('Num', (1, 5), 1))]), +('Module', [('Print', (1, 0), ('Name', (1, 8), 'f', ('Load',)), [('Num', (1, 11), 1)], False)]), +('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]), +('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]), +('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]), +('Module', [('Raise', (1, 0), ('Name', (1, 6), 'Exception', ('Load',)), ('Str', (1, 17), 'string'), None)]), +('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('excepthandler', ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]), +('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]), +('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]), +('Module', [('Import', (1, 0), [('alias', 'sys', None)])]), +('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]), +('Module', [('Exec', (1, 0), ('Str', (1, 5), 'v'), None, None)]), +('Module', [('Global', (1, 0), ['v'])]), +('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]), +('Module', [('Pass', (1, 0))]), +('Module', [('Break', (1, 0))]), +('Module', [('Continue', (1, 0))]), ] single_results = [ -('Interactive', [('Expr', ('BinOp', ('Num', 1), ('Add',), ('Num', 2)))]), +('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]), ] eval_results = [ -('Expression', ('BoolOp', ('And',), [('Name', 'a', ('Load',)), ('Name', 'b', ('Load',))])), -('Expression', ('BinOp', ('Name', 'a', ('Load',)), ('Add',), ('Name', 'b', ('Load',)))), -('Expression', ('UnaryOp', ('Not',), ('Name', 'v', ('Load',)))), -('Expression', ('Lambda', ('arguments', [], None, None, []), ('Name', 'None', ('Load',)))), -('Expression', ('Dict', [('Num', 1)], [('Num', 2)])), -('Expression', ('ListComp', ('Name', 'a', ('Load',)), [('comprehension', ('Name', 'b', ('Store',)), ('Name', 'c', ('Load',)), [('Name', 'd', ('Load',))])])), -('Expression', ('GeneratorExp', ('Name', 'a', ('Load',)), [('comprehension', ('Name', 'b', ('Store',)), ('Name', 'c', ('Load',)), [('Name', 'd', ('Load',))])])), -('Expression', ('Compare', ('Num', 1), [('Lt',), ('Lt',)], [('Num', 2), ('Num', 3)])), -('Expression', ('Call', ('Name', 'f', ('Load',)), [('Num', 1), ('Num', 2)], [('keyword', 'c', ('Num', 3))], ('Name', 'd', ('Load',)), ('Name', 'e', ('Load',)))), -('Expression', ('Repr', ('Name', 'v', ('Load',)))), -('Expression', ('Num', 10L)), -('Expression', ('Str', 'string')), -('Expression', ('Attribute', ('Name', 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', ('Name', 'a', ('Load',)), ('Slice', ('Name', 'b', ('Load',)), ('Name', 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', 'v', ('Load',))), -('Expression', ('List', [('Num', 1), ('Num', 2), ('Num', 3)], ('Load',))), -('Expression', ('Tuple', [('Num', 1), ('Num', 2), ('Num', 3)], ('Load',))), +('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, []), ('Name', (1, 7), 'None', ('Load',)))), +('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])), +('Expression', ('ListComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])), +('Expression', ('GeneratorExp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])), +('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])), +('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2)], [('keyword', 'c', ('Num', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))), +('Expression', ('Repr', (1, 0), ('Name', (1, 1), 'v', ('Load',)))), +('Expression', ('Num', (1, 0), 10L)), +('Expression', ('Str', (1, 0), 'string')), +('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0), 'v', ('Load',))), +('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))), +('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))), +('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)), ] run_tests() Modified: python/trunk/Modules/parsermodule.c ============================================================================== --- python/trunk/Modules/parsermodule.c (original) +++ python/trunk/Modules/parsermodule.c Wed Mar 1 23:49:05 2006 @@ -715,7 +715,7 @@ Py_XDECREF(elem); return (0); } - err = PyNode_AddChild(root, type, strn, *line_num); + err = PyNode_AddChild(root, type, strn, *line_num, 0); if (err == E_NOMEM) { PyMem_DEL(strn); return (node *) PyErr_NoMemory(); Modified: python/trunk/Parser/Python.asdl ============================================================================== --- python/trunk/Parser/Python.asdl (original) +++ python/trunk/Parser/Python.asdl Wed Mar 1 23:49:05 2006 @@ -46,7 +46,8 @@ | Pass | Break | Continue -- XXX Jython will be different - attributes (int lineno) + -- col_offset is the byte offset in the utf8 string the parser uses + attributes (int lineno, int col_offset) -- BoolOp() can use left & right? expr = BoolOp(boolop op, expr* values) @@ -76,7 +77,8 @@ | List(expr* elts, expr_context ctx) | Tuple(expr *elts, expr_context ctx) - attributes (int lineno) + -- col_offset is the byte offset in the utf8 string the parser uses + attributes (int lineno, int col_offset) expr_context = Load | Store | Del | AugLoad | AugStore | Param Modified: python/trunk/Parser/asdl.py ============================================================================== --- python/trunk/Parser/asdl.py (original) +++ python/trunk/Parser/asdl.py Wed Mar 1 23:49:05 2006 @@ -156,6 +156,8 @@ if id.value != "attributes": raise ASDLSyntaxError(id.lineno, msg="expected attributes, found %s" % id) + if attributes: + attributes.reverse() return Sum(sum, attributes) def p_product(self, (_0, fields, _1)): Modified: python/trunk/Parser/node.c ============================================================================== --- python/trunk/Parser/node.c (original) +++ python/trunk/Parser/node.c Wed Mar 1 23:49:05 2006 @@ -76,7 +76,7 @@ int -PyNode_AddChild(register node *n1, int type, char *str, int lineno) +PyNode_AddChild(register node *n1, int type, char *str, int lineno, int col_offset) { const int nch = n1->n_nchildren; int current_capacity; @@ -103,6 +103,7 @@ n->n_type = type; n->n_str = str; n->n_lineno = lineno; + n->n_col_offset = col_offset; n->n_nchildren = 0; n->n_child = NULL; return 0; Modified: python/trunk/Parser/parser.c ============================================================================== --- python/trunk/Parser/parser.c (original) +++ python/trunk/Parser/parser.c Wed Mar 1 23:49:05 2006 @@ -105,11 +105,11 @@ /* PARSER STACK OPERATIONS */ static int -shift(register stack *s, int type, char *str, int newstate, int lineno) +shift(register stack *s, int type, char *str, int newstate, int lineno, int col_offset) { int err; assert(!s_empty(s)); - err = PyNode_AddChild(s->s_top->s_parent, type, str, lineno); + err = PyNode_AddChild(s->s_top->s_parent, type, str, lineno, col_offset); if (err) return err; s->s_top->s_state = newstate; @@ -117,13 +117,13 @@ } static int -push(register stack *s, int type, dfa *d, int newstate, int lineno) +push(register stack *s, int type, dfa *d, int newstate, int lineno, int col_offset) { int err; register node *n; n = s->s_top->s_parent; assert(!s_empty(s)); - err = PyNode_AddChild(n, type, (char *)NULL, lineno); + err = PyNode_AddChild(n, type, (char *)NULL, lineno, col_offset); if (err) return err; s->s_top->s_state = newstate; @@ -213,7 +213,7 @@ int PyParser_AddToken(register parser_state *ps, register int type, char *str, - int lineno, int *expected_ret) + int lineno, int col_offset, int *expected_ret) { register int ilabel; int err; @@ -245,7 +245,7 @@ dfa *d1 = PyGrammar_FindDFA( ps->p_grammar, nt); if ((err = push(&ps->p_stack, nt, d1, - arrow, lineno)) > 0) { + arrow, lineno, col_offset)) > 0) { D(printf(" MemError: push\n")); return err; } @@ -255,7 +255,7 @@ /* Shift the token */ if ((err = shift(&ps->p_stack, type, str, - x, lineno)) > 0) { + x, lineno, col_offset)) > 0) { D(printf(" MemError: shift.\n")); return err; } Modified: python/trunk/Parser/parser.h ============================================================================== --- python/trunk/Parser/parser.h (original) +++ python/trunk/Parser/parser.h Wed Mar 1 23:49:05 2006 @@ -32,7 +32,7 @@ parser_state *PyParser_New(grammar *g, int start); void PyParser_Delete(parser_state *ps); -int PyParser_AddToken(parser_state *ps, int type, char *str, int lineno, +int PyParser_AddToken(parser_state *ps, int type, char *str, int lineno, int col_offset, int *expected_ret); void PyGrammar_AddAccelerators(grammar *g); Modified: python/trunk/Parser/parsetok.c ============================================================================== --- python/trunk/Parser/parsetok.c (original) +++ python/trunk/Parser/parsetok.c Wed Mar 1 23:49:05 2006 @@ -130,6 +130,7 @@ int type; size_t len; char *str; + int col_offset; type = PyTokenizer_Get(tok, &a, &b); if (type == ERRORTOKEN) { @@ -185,9 +186,13 @@ len == 4 && str[0] == 'w' && strcmp(str, "with") == 0) handling_with = 1; #endif - + if (a >= tok->line_start) + col_offset = a - tok->line_start; + else + col_offset = -1; + if ((err_ret->error = - PyParser_AddToken(ps, (int)type, str, tok->lineno, + PyParser_AddToken(ps, (int)type, str, tok->lineno, col_offset, &(err_ret->expected))) != E_OK) { if (err_ret->error != E_DONE) PyObject_FREE(str); Modified: python/trunk/Parser/tokenizer.c ============================================================================== --- python/trunk/Parser/tokenizer.c (original) +++ python/trunk/Parser/tokenizer.c Wed Mar 1 23:49:05 2006 @@ -764,6 +764,7 @@ } if (tok->start == NULL) tok->buf = tok->cur; + tok->line_start = tok->cur; tok->lineno++; tok->inp = end; return Py_CHARMASK(*tok->cur++); @@ -798,6 +799,7 @@ } tok->buf = buf; tok->cur = tok->buf + oldlen; + tok->line_start = tok->cur; strcpy(tok->buf + oldlen, new); PyMem_FREE(new); tok->inp = tok->buf + newlen; @@ -809,7 +811,9 @@ if (tok->buf != NULL) PyMem_DEL(tok->buf); tok->buf = new; + tok->line_start = tok->buf; tok->cur = tok->buf; + tok->line_start = tok->buf; tok->inp = strchr(tok->buf, '\0'); tok->end = tok->inp + 1; } @@ -877,6 +881,7 @@ done = tok->inp[-1] == '\n'; } tok->cur = tok->buf + cur; + tok->line_start = tok->cur; /* replace "\r\n" with "\n" */ /* For Mac we leave the \r, giving a syntax error */ pt = tok->inp - 2; Modified: python/trunk/Parser/tokenizer.h ============================================================================== --- python/trunk/Parser/tokenizer.h (original) +++ python/trunk/Parser/tokenizer.h Wed Mar 1 23:49:05 2006 @@ -45,6 +45,7 @@ int read_coding_spec; /* whether 'coding:...' has been read */ char *encoding; int cont_line; /* whether we are in a continuation line. */ + const char* line_start; /* pointer to start of current line */ #ifndef PGEN PyObject *decoding_readline; /* codecs.open(...).readline */ PyObject *decoding_buffer; Modified: python/trunk/Python/Python-ast.c ============================================================================== --- python/trunk/Python/Python-ast.c (original) +++ python/trunk/Python/Python-ast.c Wed Mar 1 23:49:05 2006 @@ -25,6 +25,7 @@ static PyTypeObject *stmt_type; static char *stmt_attributes[] = { "lineno", + "col_offset", }; static PyObject* ast2obj_stmt(void*); static PyTypeObject *FunctionDef_type; @@ -142,6 +143,7 @@ static PyTypeObject *expr_type; static char *expr_attributes[] = { "lineno", + "col_offset", }; static PyObject* ast2obj_expr(void*); static PyTypeObject *BoolOp_type; @@ -450,7 +452,7 @@ if (!Suite_type) return 0; stmt_type = make_type("stmt", AST_type, NULL, 0); if (!stmt_type) return 0; - if (!add_attributes(stmt_type, stmt_attributes, 1)) return 0; + if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0; FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields, 4); if (!FunctionDef_type) return 0; @@ -502,7 +504,7 @@ if (!Continue_type) return 0; expr_type = make_type("expr", AST_type, NULL, 0); if (!expr_type) return 0; - if (!add_attributes(expr_type, expr_attributes, 1)) return 0; + if (!add_attributes(expr_type, expr_attributes, 2)) return 0; BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2); if (!BoolOp_type) return 0; BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3); @@ -783,7 +785,7 @@ stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * - decorators, int lineno, PyArena *arena) + decorators, int lineno, int col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -807,12 +809,13 @@ p->v.FunctionDef.body = body; p->v.FunctionDef.decorators = decorators; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno, - PyArena *arena) +ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno, int + col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -830,11 +833,12 @@ p->v.ClassDef.bases = bases; p->v.ClassDef.body = body; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Return(expr_ty value, int lineno, PyArena *arena) +Return(expr_ty value, int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -845,11 +849,12 @@ p->kind = Return_kind; p->v.Return.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Delete(asdl_seq * targets, int lineno, PyArena *arena) +Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -860,11 +865,13 @@ p->kind = Delete_kind; p->v.Delete.targets = targets; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Assign(asdl_seq * targets, expr_ty value, int lineno, PyArena *arena) +Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena + *arena) { stmt_ty p; if (!value) { @@ -881,12 +888,13 @@ p->v.Assign.targets = targets; p->v.Assign.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, PyArena - *arena) +AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int + col_offset, PyArena *arena) { stmt_ty p; if (!target) { @@ -914,11 +922,13 @@ p->v.AugAssign.op = op; p->v.AugAssign.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, PyArena *arena) +Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int col_offset, + PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -931,12 +941,13 @@ p->v.Print.values = values; p->v.Print.nl = nl; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int - lineno, PyArena *arena) + lineno, int col_offset, PyArena *arena) { stmt_ty p; if (!target) { @@ -960,12 +971,13 @@ p->v.For.body = body; p->v.For.orelse = orelse; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena - *arena) +While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int + col_offset, PyArena *arena) { stmt_ty p; if (!test) { @@ -983,11 +995,13 @@ p->v.While.body = body; p->v.While.orelse = orelse; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, PyArena *arena) +If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int + col_offset, PyArena *arena) { stmt_ty p; if (!test) { @@ -1005,12 +1019,13 @@ p->v.If.body = body; p->v.If.orelse = orelse; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno, - PyArena *arena) + int col_offset, PyArena *arena) { stmt_ty p; if (!context_expr) { @@ -1028,11 +1043,13 @@ p->v.With.optional_vars = optional_vars; p->v.With.body = body; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, PyArena *arena) +Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int col_offset, + PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1045,12 +1062,13 @@ p->v.Raise.inst = inst; p->v.Raise.tback = tback; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno, - PyArena *arena) + int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1063,11 +1081,13 @@ p->v.TryExcept.handlers = handlers; p->v.TryExcept.orelse = orelse; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, PyArena *arena) +TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset, + PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1079,11 +1099,12 @@ p->v.TryFinally.body = body; p->v.TryFinally.finalbody = finalbody; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Assert(expr_ty test, expr_ty msg, int lineno, PyArena *arena) +Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena) { stmt_ty p; if (!test) { @@ -1100,11 +1121,12 @@ p->v.Assert.test = test; p->v.Assert.msg = msg; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Import(asdl_seq * names, int lineno, PyArena *arena) +Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1115,12 +1137,13 @@ p->kind = Import_kind; p->v.Import.names = names; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -ImportFrom(identifier module, asdl_seq * names, int level, int lineno, PyArena - *arena) +ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int + col_offset, PyArena *arena) { stmt_ty p; if (!module) { @@ -1138,11 +1161,13 @@ p->v.ImportFrom.names = names; p->v.ImportFrom.level = level; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, PyArena *arena) +Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int col_offset, + PyArena *arena) { stmt_ty p; if (!body) { @@ -1160,11 +1185,12 @@ p->v.Exec.globals = globals; p->v.Exec.locals = locals; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Global(asdl_seq * names, int lineno, PyArena *arena) +Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1175,11 +1201,12 @@ p->kind = Global_kind; p->v.Global.names = names; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Expr(expr_ty value, int lineno, PyArena *arena) +Expr(expr_ty value, int lineno, int col_offset, PyArena *arena) { stmt_ty p; if (!value) { @@ -1195,11 +1222,12 @@ p->kind = Expr_kind; p->v.Expr.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Pass(int lineno, PyArena *arena) +Pass(int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1209,11 +1237,12 @@ } p->kind = Pass_kind; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Break(int lineno, PyArena *arena) +Break(int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1223,11 +1252,12 @@ } p->kind = Break_kind; p->lineno = lineno; + p->col_offset = col_offset; return p; } stmt_ty -Continue(int lineno, PyArena *arena) +Continue(int lineno, int col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1237,11 +1267,13 @@ } p->kind = Continue_kind; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -BoolOp(boolop_ty op, asdl_seq * values, int lineno, PyArena *arena) +BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!op) { @@ -1258,11 +1290,13 @@ p->v.BoolOp.op = op; p->v.BoolOp.values = values; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, PyArena *arena) +BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset, + PyArena *arena) { expr_ty p; if (!left) { @@ -1290,11 +1324,13 @@ p->v.BinOp.op = op; p->v.BinOp.right = right; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -UnaryOp(unaryop_ty op, expr_ty operand, int lineno, PyArena *arena) +UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!op) { @@ -1316,11 +1352,13 @@ p->v.UnaryOp.op = op; p->v.UnaryOp.operand = operand; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Lambda(arguments_ty args, expr_ty body, int lineno, PyArena *arena) +Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!args) { @@ -1342,11 +1380,13 @@ p->v.Lambda.args = args; p->v.Lambda.body = body; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, PyArena *arena) +IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset, + PyArena *arena) { expr_ty p; if (!test) { @@ -1374,11 +1414,13 @@ p->v.IfExp.body = body; p->v.IfExp.orelse = orelse; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Dict(asdl_seq * keys, asdl_seq * values, int lineno, PyArena *arena) +Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena + *arena) { expr_ty p; p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1390,11 +1432,13 @@ p->v.Dict.keys = keys; p->v.Dict.values = values; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -ListComp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) +ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, + PyArena *arena) { expr_ty p; if (!elt) { @@ -1411,11 +1455,13 @@ p->v.ListComp.elt = elt; p->v.ListComp.generators = generators; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, PyArena *arena) +GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, + PyArena *arena) { expr_ty p; if (!elt) { @@ -1432,11 +1478,12 @@ p->v.GeneratorExp.elt = elt; p->v.GeneratorExp.generators = generators; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Yield(expr_ty value, int lineno, PyArena *arena) +Yield(expr_ty value, int lineno, int col_offset, PyArena *arena) { expr_ty p; p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1447,12 +1494,13 @@ p->kind = Yield_kind; p->v.Yield.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, - PyArena *arena) +Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno, int + col_offset, PyArena *arena) { expr_ty p; if (!left) { @@ -1470,12 +1518,13 @@ p->v.Compare.ops = ops; p->v.Compare.comparators = comparators; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs, - expr_ty kwargs, int lineno, PyArena *arena) + expr_ty kwargs, int lineno, int col_offset, PyArena *arena) { expr_ty p; if (!func) { @@ -1495,11 +1544,12 @@ p->v.Call.starargs = starargs; p->v.Call.kwargs = kwargs; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Repr(expr_ty value, int lineno, PyArena *arena) +Repr(expr_ty value, int lineno, int col_offset, PyArena *arena) { expr_ty p; if (!value) { @@ -1515,11 +1565,12 @@ p->kind = Repr_kind; p->v.Repr.value = value; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Num(object n, int lineno, PyArena *arena) +Num(object n, int lineno, int col_offset, PyArena *arena) { expr_ty p; if (!n) { @@ -1535,11 +1586,12 @@ p->kind = Num_kind; p->v.Num.n = n; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Str(string s, int lineno, PyArena *arena) +Str(string s, int lineno, int col_offset, PyArena *arena) { expr_ty p; if (!s) { @@ -1555,12 +1607,13 @@ p->kind = Str_kind; p->v.Str.s = s; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, - PyArena *arena) +Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena) { expr_ty p; if (!value) { @@ -1588,12 +1641,13 @@ p->v.Attribute.attr = attr; p->v.Attribute.ctx = ctx; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, - PyArena *arena) +Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int + col_offset, PyArena *arena) { expr_ty p; if (!value) { @@ -1621,11 +1675,13 @@ p->v.Subscript.slice = slice; p->v.Subscript.ctx = ctx; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Name(identifier id, expr_context_ty ctx, int lineno, PyArena *arena) +Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!id) { @@ -1647,11 +1703,13 @@ p->v.Name.id = id; p->v.Name.ctx = ctx; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -List(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) +List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!ctx) { @@ -1668,11 +1726,13 @@ p->v.List.elts = elts; p->v.List.ctx = ctx; p->lineno = lineno; + p->col_offset = col_offset; return p; } expr_ty -Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, PyArena *arena) +Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena + *arena) { expr_ty p; if (!ctx) { @@ -1689,6 +1749,7 @@ p->v.Tuple.elts = elts; p->v.Tuple.ctx = ctx; p->lineno = lineno; + p->col_offset = col_offset; return p; } @@ -2264,6 +2325,9 @@ value = ast2obj_int(o->lineno); if (!value) goto failed; PyObject_SetAttrString(result, "lineno", value); + value = ast2obj_int(o->col_offset); + if (!value) goto failed; + PyObject_SetAttrString(result, "col_offset", value); return result; failed: Py_XDECREF(value); @@ -2580,6 +2644,9 @@ value = ast2obj_int(o->lineno); if (!value) goto failed; PyObject_SetAttrString(result, "lineno", value); + value = ast2obj_int(o->col_offset); + if (!value) goto failed; + PyObject_SetAttrString(result, "col_offset", value); return result; failed: Py_XDECREF(value); Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Wed Mar 1 23:49:05 2006 @@ -243,7 +243,7 @@ stmts = asdl_seq_new(1, arena); if (!stmts) goto error; - asdl_seq_SET(stmts, 0, Pass(n->n_lineno, arena)); + asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, arena)); return Interactive(stmts, arena); } else { @@ -564,7 +564,7 @@ ast_error(child, "assignment to None"); return NULL; } - arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child), + arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child), child->n_col_offset, c->c_arena); } else { @@ -573,7 +573,7 @@ asdl_seq_SET(args, i, arg); } - result = Tuple(args, Store, LINENO(n), c->c_arena); + result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena); if (!set_context(result, Store, n)) return NULL; return result; @@ -651,7 +651,7 @@ goto error; } name = Name(NEW_IDENTIFIER(CHILD(ch, 0)), - Param, LINENO(ch), c->c_arena); + Param, LINENO(ch), ch->n_col_offset, c->c_arena); if (!name) goto error; asdl_seq_SET(args, k++, name); @@ -696,14 +696,18 @@ { expr_ty e; identifier id; + int lineno, col_offset; int i; REQ(n, dotted_name); - + + lineno = LINENO(n); + col_offset = n->n_col_offset; + id = NEW_IDENTIFIER(CHILD(n, 0)); if (!id) return NULL; - e = Name(id, Load, LINENO(n), c->c_arena); + e = Name(id, Load, lineno, col_offset, c->c_arena); if (!e) return NULL; @@ -711,7 +715,7 @@ id = NEW_IDENTIFIER(CHILD(n, i)); if (!id) return NULL; - e = Attribute(e, id, Load, LINENO(CHILD(n, i)), c->c_arena); + e = Attribute(e, id, Load, lineno, col_offset, c->c_arena); if (!e) return NULL; } @@ -739,7 +743,7 @@ name_expr = NULL; } else if (NCH(n) == 5) { /* Call with no arguments */ - d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); + d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); if (!d) return NULL; name_expr = NULL; @@ -811,7 +815,7 @@ if (!body) return NULL; - return FunctionDef(name, args, body, decorator_seq, LINENO(n), c->c_arena); + return FunctionDef(name, args, body, decorator_seq, LINENO(n), n->n_col_offset, c->c_arena); } static expr_ty @@ -838,7 +842,7 @@ return NULL; } - return Lambda(args, expression, LINENO(n), c->c_arena); + return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena); } static expr_ty @@ -857,7 +861,7 @@ orelse = ast_for_expr(c, CHILD(n, 4)); if (!orelse) return NULL; - return IfExp(expression, body, orelse, LINENO(n), c->c_arena); + return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset, c->c_arena); } /* Count the number of 'for' loop in a list comprehension. @@ -968,7 +972,7 @@ lc = comprehension(asdl_seq_GET(t, 0), expression, NULL, c->c_arena); else - lc = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset, c->c_arena), expression, NULL, c->c_arena); if (!lc) return NULL; @@ -1003,7 +1007,7 @@ asdl_seq_SET(listcomps, i, lc); } - return ListComp(elt, listcomps, LINENO(n), c->c_arena); + return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena); } /* @@ -1113,7 +1117,7 @@ ge = comprehension(asdl_seq_GET(t, 0), expression, NULL, c->c_arena); else - ge = comprehension(Tuple(t, Store, LINENO(ch), c->c_arena), + ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset, c->c_arena), expression, NULL, c->c_arena); if (!ge) @@ -1152,7 +1156,7 @@ asdl_seq_SET(genexps, i, ge); } - return GeneratorExp(elt, genexps, LINENO(n), c->c_arena); + return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena); } static expr_ty @@ -1167,14 +1171,14 @@ case NAME: /* All names start in Load context, but may later be changed. */ - return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), c->c_arena); + return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena); case STRING: { PyObject *str = parsestrplus(c, n); if (!str) return NULL; PyArena_AddPyObject(c->c_arena, str); - return Str(str, LINENO(n), c->c_arena); + return Str(str, LINENO(n), n->n_col_offset, c->c_arena); } case NUMBER: { PyObject *pynum = parsenumber(STR(ch)); @@ -1182,13 +1186,13 @@ return NULL; PyArena_AddPyObject(c->c_arena, pynum); - return Num(pynum, LINENO(n), c->c_arena); + return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); } case LPAR: /* some parenthesized expressions */ ch = CHILD(n, 1); if (TYPE(ch) == RPAR) - return Tuple(NULL, Load, LINENO(n), c->c_arena); + return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); if (TYPE(ch) == yield_expr) return ast_for_expr(c, ch); @@ -1201,7 +1205,7 @@ ch = CHILD(n, 1); if (TYPE(ch) == RSQB) - return List(NULL, Load, LINENO(n), c->c_arena); + return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); REQ(ch, listmaker); if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { @@ -1209,7 +1213,7 @@ if (!elts) return NULL; - return List(elts, Load, LINENO(n), c->c_arena); + return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); } else return ast_for_listcomp(c, ch); @@ -1243,14 +1247,14 @@ asdl_seq_SET(values, i / 4, expression); } - return Dict(keys, values, LINENO(n), c->c_arena); + return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena); } case BACKQUOTE: { /* repr */ expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); if (!expression) return NULL; - return Repr(expression, LINENO(n), c->c_arena); + return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena); } default: PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); @@ -1353,7 +1357,7 @@ if (!operator) return NULL; - result = BinOp(expr1, operator, expr2, LINENO(n), c->c_arena); + result = BinOp(expr1, operator, expr2, LINENO(n), n->n_col_offset, c->c_arena); if (!result) return NULL; @@ -1371,7 +1375,7 @@ return NULL; tmp_result = BinOp(result, operator, tmp, - LINENO(next_oper), c->c_arena); + LINENO(next_oper), next_oper->n_col_offset, c->c_arena); if (!tmp) return NULL; result = tmp_result; @@ -1389,13 +1393,13 @@ REQ(n, trailer); if (TYPE(CHILD(n, 0)) == LPAR) { if (NCH(n) == 2) - return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), c->c_arena); + return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); else return ast_for_call(c, CHILD(n, 1), left_expr); } else if (TYPE(CHILD(n, 0)) == DOT ) { return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load, - LINENO(n), c->c_arena); + LINENO(n), n->n_col_offset, c->c_arena); } else { REQ(CHILD(n, 0), LSQB); @@ -1405,7 +1409,7 @@ slice_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; - return Subscript(left_expr, slc, Load, LINENO(n), c->c_arena); + return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset, c->c_arena); } else { /* The grammar is ambiguous here. The ambiguity is resolved @@ -1430,7 +1434,7 @@ } if (!simple) { return Subscript(left_expr, ExtSlice(slices, c->c_arena), - Load, LINENO(n), c->c_arena); + Load, LINENO(n), n->n_col_offset, c->c_arena); } /* extract Index values and put them in a Tuple */ elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); @@ -1439,11 +1443,11 @@ assert(slc->kind == Index_kind && slc->v.Index.value); asdl_seq_SET(elts, j, slc->v.Index.value); } - e = Tuple(elts, Load, LINENO(n), c->c_arena); + e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); if (!e) return NULL; return Subscript(left_expr, Index(e, c->c_arena), - Load, LINENO(n), c->c_arena); + Load, LINENO(n), n->n_col_offset, c->c_arena); } } } @@ -1468,13 +1472,15 @@ tmp = ast_for_trailer(c, ch, e); if (!tmp) return NULL; + tmp->lineno = e->lineno; + tmp->col_offset = e->col_offset; e = tmp; } if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); if (!f) return NULL; - tmp = BinOp(e, Pow, f, LINENO(n), c->c_arena); + tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena); if (!tmp) return NULL; e = tmp; @@ -1542,9 +1548,9 @@ asdl_seq_SET(seq, i / 2, e); } if (!strcmp(STR(CHILD(n, 1)), "and")) - return BoolOp(And, seq, LINENO(n), c->c_arena); + return BoolOp(And, seq, LINENO(n), n->n_col_offset, c->c_arena); assert(!strcmp(STR(CHILD(n, 1)), "or")); - return BoolOp(Or, seq, LINENO(n), c->c_arena); + return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena); case not_test: if (NCH(n) == 1) { n = CHILD(n, 0); @@ -1555,7 +1561,7 @@ if (!expression) return NULL; - return UnaryOp(Not, expression, LINENO(n), c->c_arena); + return UnaryOp(Not, expression, LINENO(n), n->n_col_offset, c->c_arena); } case comparison: if (NCH(n) == 1) { @@ -1594,7 +1600,7 @@ return NULL; } - return Compare(expression, ops, cmps, LINENO(n), c->c_arena); + return Compare(expression, ops, cmps, LINENO(n), n->n_col_offset, c->c_arena); } break; @@ -1620,7 +1626,7 @@ if (!exp) return NULL; } - return Yield(exp, LINENO(n), c->c_arena); + return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena); } case factor: { expr_ty expression; @@ -1636,11 +1642,11 @@ switch (TYPE(CHILD(n, 0))) { case PLUS: - return UnaryOp(UAdd, expression, LINENO(n), c->c_arena); + return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset, c->c_arena); case MINUS: - return UnaryOp(USub, expression, LINENO(n), c->c_arena); + return UnaryOp(USub, expression, LINENO(n), n->n_col_offset, c->c_arena); case TILDE: - return UnaryOp(Invert, expression, LINENO(n), c->c_arena); + return UnaryOp(Invert, expression, LINENO(n), n->n_col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, "unhandled factor: %d", TYPE(CHILD(n, 0))); @@ -1761,7 +1767,7 @@ } } - return Call(func, args, keywords, vararg, kwarg, LINENO(n), c->c_arena); + return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena); } static expr_ty @@ -1787,7 +1793,7 @@ asdl_seq *tmp = seq_for_testlist(c, n); if (!tmp) return NULL; - return Tuple(tmp, Load, LINENO(n), c->c_arena); + return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena); } } @@ -1841,7 +1847,7 @@ if (!e) return NULL; - return Expr(e, LINENO(n), c->c_arena); + return Expr(e, LINENO(n), n->n_col_offset, c->c_arena); } else if (TYPE(CHILD(n, 1)) == augassign) { expr_ty expr1, expr2; @@ -1851,7 +1857,7 @@ if (TYPE(ch) == testlist) expr1 = ast_for_testlist(c, ch); else - expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch), + expr1 = Yield(ast_for_expr(c, CHILD(ch, 0)), LINENO(ch), n->n_col_offset, c->c_arena); if (!expr1) @@ -1883,7 +1889,7 @@ if (TYPE(ch) == testlist) expr2 = ast_for_testlist(c, ch); else - expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), c->c_arena); + expr2 = Yield(ast_for_expr(c, ch), LINENO(ch), ch->n_col_offset, c->c_arena); if (!expr2) return NULL; @@ -1891,7 +1897,7 @@ if (!operator) return NULL; - return AugAssign(expr1, operator, expr2, LINENO(n), c->c_arena); + return AugAssign(expr1, operator, expr2, LINENO(n), n->n_col_offset, c->c_arena); } else { int i; @@ -1929,7 +1935,7 @@ expression = ast_for_expr(c, value); if (!expression) return NULL; - return Assign(targets, expression, LINENO(n), c->c_arena); + return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena); } } @@ -1961,7 +1967,7 @@ asdl_seq_SET(seq, j, expression); } nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true; - return Print(dest, seq, nl, LINENO(n), c->c_arena); + return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena); } static asdl_seq * @@ -1998,7 +2004,7 @@ expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); if (!expr_list) return NULL; - return Delete(expr_list, LINENO(n), c->c_arena); + return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena); } static stmt_ty @@ -2020,32 +2026,32 @@ ch = CHILD(n, 0); switch (TYPE(ch)) { case break_stmt: - return Break(LINENO(n), c->c_arena); + return Break(LINENO(n), n->n_col_offset, c->c_arena); case continue_stmt: - return Continue(LINENO(n), c->c_arena); + return Continue(LINENO(n), n->n_col_offset, c->c_arena); case yield_stmt: { /* will reduce to yield_expr */ expr_ty exp = ast_for_expr(c, CHILD(ch, 0)); if (!exp) return NULL; - return Expr(exp, LINENO(n), c->c_arena); + return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena); } case return_stmt: if (NCH(ch) == 1) - return Return(NULL, LINENO(n), c->c_arena); + return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena); else { expr_ty expression = ast_for_testlist(c, CHILD(ch, 1)); if (!expression) return NULL; - return Return(expression, LINENO(n), c->c_arena); + return Return(expression, LINENO(n), n->n_col_offset, c->c_arena); } case raise_stmt: if (NCH(ch) == 1) - return Raise(NULL, NULL, NULL, LINENO(n), c->c_arena); + return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); else if (NCH(ch) == 2) { expr_ty expression = ast_for_expr(c, CHILD(ch, 1)); if (!expression) return NULL; - return Raise(expression, NULL, NULL, LINENO(n), c->c_arena); + return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); } else if (NCH(ch) == 4) { expr_ty expr1, expr2; @@ -2057,7 +2063,7 @@ if (!expr2) return NULL; - return Raise(expr1, expr2, NULL, LINENO(n), c->c_arena); + return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena); } else if (NCH(ch) == 6) { expr_ty expr1, expr2, expr3; @@ -2072,7 +2078,7 @@ if (!expr3) return NULL; - return Raise(expr1, expr2, expr3, LINENO(n), c->c_arena); + return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena); } default: PyErr_Format(PyExc_SystemError, @@ -2167,10 +2173,14 @@ import_from: 'from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' | import_as_names) */ + int lineno; + int col_offset; int i; asdl_seq *aliases; REQ(n, import_stmt); + lineno = LINENO(n); + col_offset = n->n_col_offset; n = CHILD(n, 0); if (TYPE(n) == import_name) { n = CHILD(n, 1); @@ -2184,11 +2194,10 @@ return NULL; asdl_seq_SET(aliases, i / 2, import_alias); } - return Import(aliases, LINENO(n), c->c_arena); + return Import(aliases, lineno, col_offset, c->c_arena); } else if (TYPE(n) == import_from) { int n_children; - int lineno = LINENO(n); int idx, ndots = 0; alias_ty mod = NULL; identifier modname; @@ -2259,7 +2268,7 @@ modname = mod->name; else modname = new_identifier("", c->c_arena); - return ImportFrom(modname, aliases, ndots, lineno, + return ImportFrom(modname, aliases, ndots, lineno, col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, @@ -2286,7 +2295,7 @@ return NULL; asdl_seq_SET(s, i / 2, name); } - return Global(s, LINENO(n), c->c_arena); + return Global(s, LINENO(n), n->n_col_offset, c->c_arena); } static stmt_ty @@ -2317,7 +2326,7 @@ return NULL; } - return Exec(expr1, globals, locals, LINENO(n), c->c_arena); + return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena); } static stmt_ty @@ -2329,7 +2338,7 @@ expr_ty expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) return NULL; - return Assert(expression, NULL, LINENO(n), c->c_arena); + return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena); } else if (NCH(n) == 4) { expr_ty expr1, expr2; @@ -2341,7 +2350,7 @@ if (!expr2) return NULL; - return Assert(expr1, expr2, LINENO(n), c->c_arena); + return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, "improper number of parts to 'assert' statement: %d", @@ -2436,7 +2445,7 @@ if (!suite_seq) return NULL; - return If(expression, suite_seq, NULL, LINENO(n), c->c_arena); + return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena); } s = STR(CHILD(n, 4)); @@ -2458,7 +2467,7 @@ if (!seq2) return NULL; - return If(expression, seq1, seq2, LINENO(n), c->c_arena); + return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena); } else if (s[2] == 'i') { int i, n_elif, has_else = 0; @@ -2491,7 +2500,7 @@ return NULL; asdl_seq_SET(orelse, 0, If(expression, seq1, seq2, - LINENO(CHILD(n, NCH(n) - 6)), + LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset, c->c_arena)); /* the just-created orelse handled the last elif */ n_elif--; @@ -2513,12 +2522,12 @@ asdl_seq_SET(new, 0, If(expression, suite_seq, orelse, - LINENO(CHILD(n, off)), c->c_arena)); + LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena)); orelse = new; } return If(ast_for_expr(c, CHILD(n, 1)), ast_for_suite(c, CHILD(n, 3)), - orelse, LINENO(n), c->c_arena); + orelse, LINENO(n), n->n_col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, @@ -2542,7 +2551,7 @@ suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) return NULL; - return While(expression, suite_seq, NULL, LINENO(n), c->c_arena); + return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena); } else if (NCH(n) == 7) { expr_ty expression; @@ -2558,7 +2567,7 @@ if (!seq2) return NULL; - return While(expression, seq1, seq2, LINENO(n), c->c_arena); + return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, @@ -2588,7 +2597,7 @@ if (asdl_seq_LEN(_target) == 1) target = asdl_seq_GET(_target, 0); else - target = Tuple(_target, Store, LINENO(n), c->c_arena); + target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena); expression = ast_for_testlist(c, CHILD(n, 3)); if (!expression) @@ -2597,7 +2606,7 @@ if (!suite_seq) return NULL; - return For(target, expression, suite_seq, seq, LINENO(n), c->c_arena); + return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset, c->c_arena); } static excepthandler_ty @@ -2711,7 +2720,7 @@ asdl_seq_SET(handlers, i, e); } - except_st = TryExcept(body, handlers, orelse, LINENO(n), c->c_arena); + except_st = TryExcept(body, handlers, orelse, LINENO(n), n->n_col_offset, c->c_arena); if (!finally) return except_st; @@ -2725,7 +2734,7 @@ /* must be a try ... finally (except clauses are in body, if any exist) */ assert(finally != NULL); - return TryFinally(body, finally, LINENO(n), c->c_arena); + return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena); } static expr_ty @@ -2765,7 +2774,8 @@ if (!suite_seq) { return NULL; } - return With(context_expr, optional_vars, suite_seq, LINENO(n), c->c_arena); + return With(context_expr, optional_vars, suite_seq, LINENO(n), + n->n_col_offset, c->c_arena); } static stmt_ty @@ -2785,7 +2795,7 @@ s = ast_for_suite(c, CHILD(n, 3)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), n->n_col_offset, c->c_arena); } /* check for empty base list */ @@ -2793,7 +2803,7 @@ s = ast_for_suite(c, CHILD(n,5)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n), n->n_col_offset, c->c_arena); } @@ -2805,7 +2815,7 @@ s = ast_for_suite(c, CHILD(n, 6)); if (!s) return NULL; - return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n), + return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n), n->n_col_offset, c->c_arena); } @@ -2835,7 +2845,7 @@ case del_stmt: return ast_for_del_stmt(c, n); case pass_stmt: - return Pass(LINENO(n), c->c_arena); + return Pass(LINENO(n), n->n_col_offset, c->c_arena); case flow_stmt: return ast_for_flow_stmt(c, n); case import_stmt: Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Wed Mar 1 23:49:05 2006 @@ -3635,7 +3635,7 @@ switch (e->kind) { case Attribute_kind: auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, - AugLoad, e->lineno, c->c_arena); + AugLoad, e->lineno, e->col_offset, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); @@ -3646,7 +3646,7 @@ break; case Subscript_kind: auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, - AugLoad, e->lineno, c->c_arena); + AugLoad, e->lineno, e->col_offset, c->c_arena); if (auge == NULL) return 0; VISIT(c, expr, auge); From python-checkins at python.org Wed Mar 1 23:54:38 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 1 Mar 2006 23:54:38 +0100 (CET) Subject: [Python-checkins] r42754 - python/trunk/Modules/gdbmmodule.c Message-ID: <20060301225438.25F401E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 1 23:54:36 2006 New Revision: 42754 Modified: python/trunk/Modules/gdbmmodule.c Log: Fix gcc (4.0.x) warning about use of uninitialized variable. Modified: python/trunk/Modules/gdbmmodule.c ============================================================================== --- python/trunk/Modules/gdbmmodule.c (original) +++ python/trunk/Modules/gdbmmodule.c Wed Mar 1 23:54:36 2006 @@ -97,6 +97,7 @@ datum key,okey; int size; okey.dsize=0; + okey.dptr=NULL; size = 0; for (key=gdbm_firstkey(dp->di_dbm); key.dptr; From python-checkins at python.org Wed Mar 1 23:57:24 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 1 Mar 2006 23:57:24 +0100 (CET) Subject: [Python-checkins] r42755 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301225724.41B3C1E4002@bag.python.org> Author: tim.peters Date: Wed Mar 1 23:57:23 2006 New Revision: 42755 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Fixed a logic error in doubly-linked list fiddling. Resolved an overlooked XXX. Code fiddling to reduce the deepest nesting by a level. This is all I want to do, except to fix the new Py_ADDRESS_IN_RANGE endcase error. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Wed Mar 1 23:57:23 2006 @@ -747,7 +747,6 @@ /* This moves the arena *towards* the head of the list but it is already at the head of the list: do nothing */ - /* XXX what did that mean? */ --usable_arenas->nfreepools; if (usable_arenas->nfreepools == 0) { /* Unlink the arena: it's completely @@ -907,10 +906,20 @@ ao->freepools = pool; nf = ++ao->nfreepools; + /* All the rest is arena management. We just freed + * a pool, and there are 4 cases for arena mgmt: + * 1. If all the pools are free, return the arena to + * the system free(). + * 2. If this is the only free pool in the arena, + * add the arena back to the `usable_arenas` list. + * 3. If the "next" arena has a smaller count of + * of free pulls, we have to "push this arena right" + * to restore that `usable_arenas` is sorted in + * order of nfreepools. + * 4. Else there's nothing more to do. + */ if (nf == ao->ntotalpools) { - /* This arena is completely deallocated. - * Unlink it from the partially allocated - * arenas. + /* Case 1. First unlink ao from usable_arenas. */ assert(ao->prevarena == NULL || ao->prevarena->address != 0); @@ -930,14 +939,12 @@ ao->prevarena->nextarena = ao->nextarena; } - /* Fix the pointer in the nextarena. */ if (ao->nextarena != NULL) { assert(ao->nextarena->prevarena == ao); ao->nextarena->prevarena = ao->prevarena; } - /* Record that this arena_object slot is * available to be reused. */ @@ -946,23 +953,28 @@ /* Free the entire arena. */ free((void *)ao->address); - ao->address = 0; + ao->address = 0; /* mark unassociated */ --narenas_currently_allocated; + + UNLOCK(); + return; } - else if (nf == 1) { - /* If this arena was completely allocated, - * go link it to the head of the partially - * allocated list. + + if (nf == 1) { + /* Case 2. Put ao at the head of + * usable_arenas. Note that because + * ao->nfreepools was 0 before, ao isn't + * currently on the usable_arenas list. */ ao->nextarena = usable_arenas; ao->prevarena = NULL; + if (usable_arenas) + usable_arenas->prevarena = ao; usable_arenas = ao; - - /* Fix the pointer in the nextarena. */ - if (ao->nextarena != NULL) - ao->nextarena->prevarena = ao; - assert(usable_arenas->address != 0); + + UNLOCK(); + return; } /* If this arena is now out of order, we need to keep * the list sorted. The list is kept sorted so that @@ -971,57 +983,58 @@ * a few un-scientific tests, it seems like this * approach allowed a lot more memory to be freed. */ - else if (ao->nextarena != NULL && - nf > ao->nextarena->nfreepools) { - /* We have to move the arena towards the end - * of the list. - */ - struct arena_object** lastPointer; - if (ao->prevarena != NULL) - lastPointer = - &ao->prevarena->nextarena; - else - lastPointer = &usable_arenas; - assert(*lastPointer == ao); - - /* Step one: unlink the arena from the list. */ - *lastPointer = ao->nextarena; - ao->nextarena->prevarena = ao->prevarena; - - /* Step two: Locate the new insertion point by - * iterating over the list, using our nextarena - * pointer. - */ - while (ao->nextarena != NULL && - nf > ao->nextarena->nfreepools) { - ao->prevarena = ao->nextarena; - ao->nextarena = - ao->nextarena->nextarena; - } - - /* Step three: insert the arena at this point. */ - assert(ao->nextarena == NULL || - ao->prevarena == - ao->nextarena->prevarena); - assert(ao->prevarena->nextarena == - ao->nextarena); - - ao->prevarena->nextarena = ao; - if (ao->nextarena != NULL) { - ao->nextarena->prevarena = ao; - } + if (ao->nextarena == NULL || + nf <= ao->nextarena->nfreepools) { + /* Case 4. Nothing to do. */ + UNLOCK(); + return; + } - /* Verify that the swaps worked. */ - assert(ao->nextarena == NULL || - nf <= ao->nextarena->nfreepools); - assert(ao->prevarena == NULL || - nf > ao->prevarena->nfreepools); - assert(ao->nextarena == NULL || - ao->nextarena->prevarena == ao); - assert((usable_arenas == ao && - ao->prevarena == NULL) || - ao->prevarena->nextarena == ao); + /* Case 3: We have to move the arena towards the end + * of the list, because it has more free pools than + * the arena to its right. + * First unlink ao from usable_arenas. + */ + if (ao->prevarena != NULL) { + /* ao isn't at the head of the list */ + assert(ao->prevarena->nextarena == ao); + ao->prevarena->nextarena = ao->nextarena; } + else { + /* ao is at the head of the list */ + assert(usable_arenas == ao); + usable_arenas = ao->nextarena; + } + ao->nextarena->prevarena = ao->prevarena; + + /* Locate the new insertion point by iterating over + * the list, using our nextarena pointer. + */ + while (ao->nextarena != NULL && + nf > ao->nextarena->nfreepools) { + ao->prevarena = ao->nextarena; + ao->nextarena = ao->nextarena->nextarena; + } + + /* Insert ao at this point. */ + assert(ao->nextarena == NULL || + ao->prevarena == ao->nextarena->prevarena); + assert(ao->prevarena->nextarena == ao->nextarena); + + ao->prevarena->nextarena = ao; + if (ao->nextarena != NULL) + ao->nextarena->prevarena = ao; + + /* Verify that the swaps worked. */ + assert(ao->nextarena == NULL || + nf <= ao->nextarena->nfreepools); + assert(ao->prevarena == NULL || + nf > ao->prevarena->nfreepools); + assert(ao->nextarena == NULL || + ao->nextarena->prevarena == ao); + assert((usable_arenas == ao && + ao->prevarena == NULL) || + ao->prevarena->nextarena == ao); UNLOCK(); return; From python-checkins at python.org Thu Mar 2 00:02:59 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 2 Mar 2006 00:02:59 +0100 (CET) Subject: [Python-checkins] r42756 - python/trunk/Lib/test/test_ast.py Message-ID: <20060301230259.5931A1E4009@bag.python.org> Author: tim.peters Date: Thu Mar 2 00:02:57 2006 New Revision: 42756 Modified: python/trunk/Lib/test/test_ast.py Log: Whitespace normalization. Modified: python/trunk/Lib/test/test_ast.py ============================================================================== --- python/trunk/Lib/test/test_ast.py (original) +++ python/trunk/Lib/test/test_ast.py Thu Mar 2 00:02:57 2006 @@ -128,7 +128,7 @@ raise SystemExit def test_order(ast_node, parent_pos): - + if not isinstance(ast_node, _ast.AST) or ast_node._fields == None: return if isinstance(ast_node, (_ast.expr, _ast.stmt)): From python-checkins at python.org Thu Mar 2 00:03:19 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 2 Mar 2006 00:03:19 +0100 (CET) Subject: [Python-checkins] r42757 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301230319.5DBD81E4009@bag.python.org> Author: tim.peters Date: Thu Mar 2 00:03:17 2006 New Revision: 42757 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Typo repair. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Thu Mar 2 00:03:17 2006 @@ -913,7 +913,7 @@ * 2. If this is the only free pool in the arena, * add the arena back to the `usable_arenas` list. * 3. If the "next" arena has a smaller count of - * of free pulls, we have to "push this arena right" + * of free pools, we have to "push this arena right" * to restore that `usable_arenas` is sorted in * order of nfreepools. * 4. Else there's nothing more to do. From python-checkins at python.org Thu Mar 2 00:10:05 2006 From: python-checkins at python.org (thomas.wouters) Date: Thu, 2 Mar 2006 00:10:05 +0100 (CET) Subject: [Python-checkins] r42758 - python/trunk/Modules/binascii.c Message-ID: <20060301231005.AA5911E4002@bag.python.org> Author: thomas.wouters Date: Thu Mar 2 00:10:05 2006 New Revision: 42758 Modified: python/trunk/Modules/binascii.c Log: Use Py_ssize_t for arithmetic on Py_ssize_t's, instead of unsigned ints. Modified: python/trunk/Modules/binascii.c ============================================================================== --- python/trunk/Modules/binascii.c (original) +++ python/trunk/Modules/binascii.c Thu Mar 2 00:10:05 2006 @@ -1028,7 +1028,7 @@ static PyObject* binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs) { - unsigned int in, out; + Py_ssize_t in, out; char ch; unsigned char *data, *odata; Py_ssize_t datalen = 0; @@ -1129,7 +1129,7 @@ static PyObject* binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs) { - unsigned int in, out; + Py_ssize_t in, out; unsigned char *data, *odata; Py_ssize_t datalen = 0, odatalen = 0; PyObject *rv; From python-checkins at python.org Thu Mar 2 00:10:50 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 2 Mar 2006 00:10:50 +0100 (CET) Subject: [Python-checkins] r42759 - python/trunk/Modules/cStringIO.c Message-ID: <20060301231050.256D71E4002@bag.python.org> Author: martin.v.loewis Date: Thu Mar 2 00:10:49 2006 New Revision: 42759 Modified: python/trunk/Modules/cStringIO.c Log: Remove UNLESS. Modified: python/trunk/Modules/cStringIO.c ============================================================================== --- python/trunk/Modules/cStringIO.c (original) +++ python/trunk/Modules/cStringIO.c Thu Mar 2 00:10:49 2006 @@ -33,9 +33,6 @@ "\n" "cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n"); -#define UNLESS(E) if (!(E)) - - /* Declaration for file-like objects that manage data as strings The IOobject type should be though of as a common base type for @@ -80,7 +77,7 @@ static int IO__opencheck(IOobject *self) { - UNLESS (self->buf) { + if (!self->buf) { PyErr_SetString(PyExc_ValueError, "I/O operation on closed file"); return 0; @@ -107,7 +104,7 @@ static PyObject * IO_flush(IOobject *self, PyObject *unused) { - UNLESS (IO__opencheck(self)) return NULL; + if (!IO__opencheck(self)) return NULL; Py_INCREF(Py_None); return Py_None; @@ -121,7 +118,7 @@ static PyObject * IO_cgetval(PyObject *self) { - UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL; + if (!IO__opencheck(IOOOBJECT(self))) return NULL; return PyString_FromStringAndSize(((IOobject*)self)->buf, ((IOobject*)self)->pos); } @@ -131,8 +128,8 @@ PyObject *use_pos=Py_None; Py_ssize_t s; - UNLESS (IO__opencheck(self)) return NULL; - UNLESS (PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL; + if (!IO__opencheck(self)) return NULL; + if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL; if (PyObject_IsTrue(use_pos)) { s=self->pos; @@ -158,7 +155,7 @@ IO_cread(PyObject *self, char **output, Py_ssize_t n) { Py_ssize_t l; - UNLESS (IO__opencheck(IOOOBJECT(self))) return -1; + if (!IO__opencheck(IOOOBJECT(self))) return -1; l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos; if (n < 0 || n > l) { n = l; @@ -175,7 +172,7 @@ Py_ssize_t n = -1; char *output = NULL; - UNLESS (PyArg_ParseTuple(args, "|n:read", &n)) return NULL; + if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL; if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL; @@ -189,7 +186,7 @@ char *n, *s; Py_ssize_t l; - UNLESS (IO__opencheck(IOOOBJECT(self))) return -1; + if (!IO__opencheck(IOOOBJECT(self))) return -1; for (n = ((IOobject*)self)->buf + ((IOobject*)self)->pos, s = ((IOobject*)self)->buf + ((IOobject*)self)->string_size; @@ -209,7 +206,7 @@ char *output; if (args) - UNLESS (PyArg_ParseTuple(args, "|i:readline", &m)) return NULL; + if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL; if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL; if (m >= 0 && m < n) { @@ -229,7 +226,7 @@ PyObject *result, *line; int hint = 0, length = 0; - UNLESS (PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL; + if (!PyArg_ParseTuple(args, "|i:readlines", &hint)) return NULL; result = PyList_New(0); if (!result) @@ -264,7 +261,7 @@ static PyObject * IO_reset(IOobject *self, PyObject *unused) { - UNLESS (IO__opencheck(self)) return NULL; + if (!IO__opencheck(self)) return NULL; self->pos = 0; @@ -277,7 +274,7 @@ static PyObject * IO_tell(IOobject *self, PyObject *unused) { - UNLESS (IO__opencheck(self)) return NULL; + if (!IO__opencheck(self)) return NULL; return PyInt_FromSsize_t(self->pos); } @@ -289,8 +286,8 @@ IO_truncate(IOobject *self, PyObject *args) { Py_ssize_t pos = -1; - UNLESS (IO__opencheck(self)) return NULL; - UNLESS (PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL; + if (!IO__opencheck(self)) return NULL; + if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL; if (pos < 0) pos = self->pos; if (self->string_size > pos) self->string_size = pos; @@ -329,8 +326,8 @@ Py_ssize_t position; int mode = 0; - UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL; - UNLESS (PyArg_ParseTuple(args, "n|i:seek", &position, &mode)) + if (!IO__opencheck(IOOOBJECT(self))) return NULL; + if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode)) return NULL; if (mode == 2) { @@ -343,8 +340,8 @@ if (position > self->buf_size) { self->buf_size*=2; if (self->buf_size <= position) self->buf_size=position+1; - UNLESS (self->buf = (char*) - realloc(self->buf,self->buf_size)) { + self->buf = (char*) realloc(self->buf,self->buf_size); + if (!self->buf) { self->buf_size=self->pos=0; return PyErr_NoMemory(); } @@ -369,7 +366,7 @@ Py_ssize_t newl; Oobject *oself; - UNLESS (IO__opencheck(IOOOBJECT(self))) return -1; + if (!IO__opencheck(IOOOBJECT(self))) return -1; oself = (Oobject *)self; newl = oself->pos+l; @@ -379,8 +376,8 @@ assert(newl + 1 < INT_MAX); oself->buf_size = (int)(newl+1); } - UNLESS (oself->buf = - (char*)realloc(oself->buf, oself->buf_size)) { + oself->buf = (char*)realloc(oself->buf, oself->buf_size); + if (!oself->buf) { PyErr_SetString(PyExc_MemoryError,"out of memory"); oself->buf_size = oself->pos = 0; return -1; @@ -404,7 +401,7 @@ char *c; int l; - UNLESS (PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL; + if (!PyArg_ParseTuple(args, "t#:write", &c, &l)) return NULL; if (O_cwrite((PyObject*)self,c,l) < 0) return NULL; @@ -543,7 +540,8 @@ self->string_size = 0; self->softspace = 0; - UNLESS (self->buf = (char *)malloc(size)) { + self->buf = (char *)malloc(size); + if (!self->buf) { PyErr_SetString(PyExc_MemoryError,"out of memory"); self->buf_size = 0; return NULL; @@ -573,8 +571,8 @@ Py_ssize_t position; int mode = 0; - UNLESS (IO__opencheck(IOOOBJECT(self))) return NULL; - UNLESS (PyArg_ParseTuple(args, "n|i:seek", &position, &mode)) + 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; @@ -662,7 +660,8 @@ s->ob_type->tp_name); return NULL; } - UNLESS (self = PyObject_New(Iobject, &Itype)) return NULL; + self = PyObject_New(Iobject, &Itype); + if (!self) return NULL; Py_INCREF(s); self->buf=buf; self->string_size=size; From python-checkins at python.org Thu Mar 2 00:12:22 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 2 Mar 2006 00:12:22 +0100 (CET) Subject: [Python-checkins] r42760 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060301231222.9562F1E4009@bag.python.org> Author: tim.peters Date: Thu Mar 2 00:12:22 2006 New Revision: 42760 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Typo repair. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Thu Mar 2 00:12:22 2006 @@ -912,10 +912,10 @@ * the system free(). * 2. If this is the only free pool in the arena, * add the arena back to the `usable_arenas` list. - * 3. If the "next" arena has a smaller count of - * of free pools, we have to "push this arena right" - * to restore that `usable_arenas` is sorted in - * order of nfreepools. + * 3. If the "next" arena has a smaller count of free + * pools, we have to "push this arena right" to + * restore that `usable_arenas` is sorted in order + * of nfreepools. * 4. Else there's nothing more to do. */ if (nf == ao->ntotalpools) { From python-checkins at python.org Thu Mar 2 00:24:35 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 2 Mar 2006 00:24:35 +0100 (CET) Subject: [Python-checkins] r42761 - python/trunk/Lib/test/test_compiler.py Message-ID: <20060301232435.AF5C21E4002@bag.python.org> Author: martin.v.loewis Date: Thu Mar 2 00:24:34 2006 New Revision: 42761 Modified: python/trunk/Lib/test/test_compiler.py Log: Reformat the exception message by going through a list. Modified: python/trunk/Lib/test/test_compiler.py ============================================================================== --- python/trunk/Lib/test/test_compiler.py (original) +++ python/trunk/Lib/test/test_compiler.py Thu Mar 2 00:24:34 2006 @@ -35,7 +35,9 @@ try: compiler.compile(buf, basename, "exec") except Exception, e: - e.args[0] += "[in file %s]" % basename + args = list(e.args) + args[0] += "[in file %s]" % basename + e.args = tuple(args) raise def testNewClassSyntax(self): From python-checkins at python.org Thu Mar 2 00:44:49 2006 From: python-checkins at python.org (brett.cannon) Date: Thu, 2 Mar 2006 00:44:49 +0100 (CET) Subject: [Python-checkins] r42762 - peps/trunk/pep-0352.txt Message-ID: <20060301234449.C18751E4002@bag.python.org> Author: brett.cannon Date: Thu Mar 2 00:44:47 2006 New Revision: 42762 Modified: peps/trunk/pep-0352.txt Log: Rework pseduo-code to better match implementation. Only affected __str__ and __unicode__. Had to be done this way for backwards-compatibility issues. Modified: peps/trunk/pep-0352.txt ============================================================================== --- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Thu Mar 2 00:44:47 2006 @@ -59,8 +59,12 @@ """Superclass representing the base of the exception hierarchy. - Provides a 'message' attribute that contains any argument - passed in during instantiation. + Provides a 'message' attribute that contains any single argument + passed in during instantiation. If more than one argument is passed, it + is set to the empty string. It is meant to represent any message + (usually some text) that should be printed out with the traceback. + Unfortunatley, for backwards-compatibility, the 'args' attribute + (discussed below) is used for printing out to tracebacks. The 'args' attribute and __getitem__ method are provided for backwards-compatibility and will be deprecated at some point. @@ -68,28 +72,41 @@ """ def __init__(self, *args): - """Set 'message' and 'args' attribute""" + """Set 'message' and 'args' attribute. + + 'args' will eventually be deprecated. But it is still used when + printing out tracebacks for backwards-compatibility. Once 'args' is + removed, though, 'message' will be used instead. + + """ self.args = args self.message = args[0] if args else '' def __str__(self): - """Return the str of 'message'""" - return str(self.message + """Return the str of args[0] or args, depending on length. + + Once 'args' has been removed, 'message' will be used exclusively for + the str representation for exceptions. + + """ + return str(self.args[0] if len(self.args) <= 1 else self.args) def __unicode__(self): - """Return the unicode of 'message'""" - return unicode(self.message + """Return the unicode of args[0] or args, depending on length. + + Once 'args' has been removed, 'message' will be used exclusively for + the unicode representation of exceptions. + + """ + return unicode(self.args[0] if len(self.args) <= 1 else self.args) def __repr__(self): - if not self.args: - argss = "()" - else: - argss = repr(self.args) - return self.__class__.__name__ + argss + func_args = repr(self.args) if self.args else "()" + return self.__class__.__name__ + func_args def __getitem__(self, index): """Index into arguments passed in during instantiation. From python-checkins at python.org Thu Mar 2 00:49:14 2006 From: python-checkins at python.org (thomas.wouters) Date: Thu, 2 Mar 2006 00:49:14 +0100 (CET) Subject: [Python-checkins] r42763 - python/trunk/Python/marshal.c Message-ID: <20060301234914.AB6101E4002@bag.python.org> Author: thomas.wouters Date: Thu Mar 2 00:49:13 2006 New Revision: 42763 Modified: python/trunk/Python/marshal.c Log: Make Py_ssize_t clean. Modified: python/trunk/Python/marshal.c ============================================================================== --- python/trunk/Python/marshal.c (original) +++ python/trunk/Python/marshal.c Thu Mar 2 00:49:13 2006 @@ -4,6 +4,8 @@ a true persistent storage facility would be much harder, since it would have to take circular links and sharing into account. */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include "longintrepr.h" #include "code.h" @@ -1088,7 +1090,7 @@ { RFILE rf; char *s; - int n; + Py_ssize_t n; PyObject* result; if (!PyArg_ParseTuple(args, "s#:loads", &s, &n)) return NULL; From python-checkins at python.org Thu Mar 2 00:51:20 2006 From: python-checkins at python.org (brett.cannon) Date: Thu, 2 Mar 2006 00:51:20 +0100 (CET) Subject: [Python-checkins] r42764 - peps/trunk/pep-0352.txt Message-ID: <20060301235120.DE7441E4002@bag.python.org> Author: brett.cannon Date: Thu Mar 2 00:51:20 2006 New Revision: 42764 Modified: peps/trunk/pep-0352.txt Log: Fix a typo. Modified: peps/trunk/pep-0352.txt ============================================================================== --- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Thu Mar 2 00:51:20 2006 @@ -63,7 +63,7 @@ passed in during instantiation. If more than one argument is passed, it is set to the empty string. It is meant to represent any message (usually some text) that should be printed out with the traceback. - Unfortunatley, for backwards-compatibility, the 'args' attribute + Unfortunately, for backwards-compatibility, the 'args' attribute (discussed below) is used for printing out to tracebacks. The 'args' attribute and __getitem__ method are provided for From python-checkins at python.org Thu Mar 2 01:21:11 2006 From: python-checkins at python.org (thomas.wouters) Date: Thu, 2 Mar 2006 01:21:11 +0100 (CET) Subject: [Python-checkins] r42765 - python/trunk/Modules/fcntlmodule.c Message-ID: <20060302002111.AB0251E403C@bag.python.org> Author: thomas.wouters Date: Thu Mar 2 01:21:10 2006 New Revision: 42765 Modified: python/trunk/Modules/fcntlmodule.c Log: Make Py_ssize_t-clean Modified: python/trunk/Modules/fcntlmodule.c ============================================================================== --- python/trunk/Modules/fcntlmodule.c (original) +++ python/trunk/Modules/fcntlmodule.c Thu Mar 2 01:21:10 2006 @@ -1,6 +1,8 @@ /* fcntl module */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #ifdef HAVE_SYS_FILE_H @@ -35,7 +37,7 @@ int arg; int ret; char *str; - int len; + Py_ssize_t len; char buf[1024]; if (PyArg_ParseTuple(args, "O&is#:fcntl", @@ -98,7 +100,7 @@ int arg; int ret; char *str; - int len; + Py_ssize_t len; int mutate_arg = 1; char buf[1024]; From mwh at python.net Thu Mar 2 01:24:09 2006 From: mwh at python.net (Michael Hudson) Date: Thu, 02 Mar 2006 00:24:09 +0000 Subject: [Python-checkins] r42759 - python/trunk/Modules/cStringIO.c In-Reply-To: <20060301231050.256D71E4002@bag.python.org> (martin v. loewis's message of "Thu, 2 Mar 2006 00:10:50 +0100 (CET)") References: <20060301231050.256D71E4002@bag.python.org> Message-ID: <2mpsl566dy.fsf@starship.python.net> "martin.v.loewis" writes: > Author: martin.v.loewis > Date: Thu Mar 2 00:10:49 2006 > New Revision: 42759 > > Modified: > python/trunk/Modules/cStringIO.c > Log: > Remove UNLESS. Hoo-ray! Cheers, mwh -- I've even been known to get Marmite *near* my mouth -- but never actually in it yet. Vegamite is right out. UnicodeError: ASCII unpalatable error: vegamite found, ham expected -- Tim Peters, comp.lang.python From python-checkins at python.org Thu Mar 2 01:31:27 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 2 Mar 2006 01:31:27 +0100 (CET) Subject: [Python-checkins] r42766 - in python/trunk: Parser/asdl_c.py Python/Python-ast.c Message-ID: <20060302003127.B14EB1E4002@bag.python.org> Author: martin.v.loewis Date: Thu Mar 2 01:31:27 2006 New Revision: 42766 Modified: python/trunk/Parser/asdl_c.py python/trunk/Python/Python-ast.c Log: Fix memory leak on attributes. Modified: python/trunk/Parser/asdl_c.py ============================================================================== --- python/trunk/Parser/asdl_c.py (original) +++ python/trunk/Parser/asdl_c.py Thu Mar 2 01:31:27 2006 @@ -607,7 +607,9 @@ for a in sum.attributes: self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('PyObject_SetAttrString(result, "%s", value);' % a.name, 1) + self.emit('if (PyObject_SetAttrString(result, "%s", value) < 0)' % a.name, 1) + self.emit('goto failed;', 2) + self.emit('Py_DECREF(value);', 1) self.func_end() def simpleSum(self, sum, name): Modified: python/trunk/Python/Python-ast.c ============================================================================== --- python/trunk/Python/Python-ast.c (original) +++ python/trunk/Python/Python-ast.c Thu Mar 2 01:31:27 2006 @@ -2324,10 +2324,14 @@ } value = ast2obj_int(o->lineno); if (!value) goto failed; - PyObject_SetAttrString(result, "lineno", value); + if (PyObject_SetAttrString(result, "lineno", value) < 0) + goto failed; + Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - PyObject_SetAttrString(result, "col_offset", value); + if (PyObject_SetAttrString(result, "col_offset", value) < 0) + goto failed; + Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -2643,10 +2647,14 @@ } value = ast2obj_int(o->lineno); if (!value) goto failed; - PyObject_SetAttrString(result, "lineno", value); + if (PyObject_SetAttrString(result, "lineno", value) < 0) + goto failed; + Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - PyObject_SetAttrString(result, "col_offset", value); + if (PyObject_SetAttrString(result, "col_offset", value) < 0) + goto failed; + Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -3023,7 +3031,7 @@ if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return; if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0) return; - if (PyModule_AddStringConstant(m, "__version__", "42649") < 0) + if (PyModule_AddStringConstant(m, "__version__", "42753") < 0) return; if(PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return; if(PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) From python-checkins at python.org Thu Mar 2 01:36:20 2006 From: python-checkins at python.org (brett.cannon) Date: Thu, 2 Mar 2006 01:36:20 +0100 (CET) Subject: [Python-checkins] r42767 - peps/trunk/pep-0352.txt Message-ID: <20060302003620.D61AA1E4002@bag.python.org> Author: brett.cannon Date: Thu Mar 2 01:36:20 2006 New Revision: 42767 Modified: peps/trunk/pep-0352.txt Log: Shift pseudo-code to Transition Plan section and provide a pseudo-code implementation of what BaseException will look like in Python 3.0 . Modified: peps/trunk/pep-0352.txt ============================================================================== --- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Thu Mar 2 01:36:20 2006 @@ -2,7 +2,8 @@ Title: Required Superclass for Exceptions Version: $Revision$ Last-Modified: $Date$ -Author: Brett Cannon , Guido van Rossum +Author: Brett Cannon + Guido van Rossum Status: Final Type: Standards Track Content-Type: text/x-rst @@ -53,70 +54,36 @@ This PEP proposes introducing a new exception named BaseException that is a new-style class and has a single attribute, ``message`` (that -will cause the deprecation of the existing ``args`` attribute):: +will cause the deprecation of the existing ``args`` attribute) Below +is the code as the exception will work in Python 3.0 (how it will +work in Python 2.x is covered in the `Transition Plan`_ section):: class BaseException(object): """Superclass representing the base of the exception hierarchy. - Provides a 'message' attribute that contains any single argument - passed in during instantiation. If more than one argument is passed, it - is set to the empty string. It is meant to represent any message - (usually some text) that should be printed out with the traceback. - Unfortunately, for backwards-compatibility, the 'args' attribute - (discussed below) is used for printing out to tracebacks. - - The 'args' attribute and __getitem__ method are provided for - backwards-compatibility and will be deprecated at some point. + Provides a 'message' attribute that contains either the single + argument to the constructor or the empty string. This attribute + is used in both the string and unicode representation for the + exception. This is so that it provides the extra details in the + traceback. """ - def __init__(self, *args): - """Set 'message' and 'args' attribute. - - 'args' will eventually be deprecated. But it is still used when - printing out tracebacks for backwards-compatibility. Once 'args' is - removed, though, 'message' will be used instead. - - """ - self.args = args - self.message = args[0] if args else '' + def __init__(self, message=''): + """Set the 'message' attribute'""" + self.message = message def __str__(self): - """Return the str of args[0] or args, depending on length. - - Once 'args' has been removed, 'message' will be used exclusively for - the str representation for exceptions. - - """ - return str(self.args[0] - if len(self.args) <= 1 - else self.args) + """Return the str of 'message'""" + return str(self.message) def __unicode__(self): - """Return the unicode of args[0] or args, depending on length. - - Once 'args' has been removed, 'message' will be used exclusively for - the unicode representation of exceptions. - - """ - return unicode(self.args[0] - if len(self.args) <= 1 - else self.args) + """Return the unicode of 'message'""" + return unicode(self.message) def __repr__(self): - func_args = repr(self.args) if self.args else "()" - return self.__class__.__name__ + func_args - - def __getitem__(self, index): - """Index into arguments passed in during instantiation. - - Provided for backwards-compatibility and will be - deprecated. - - """ - return self.args[index] - + return "%s(%s)" % (self.__class__.__name__, repr(self.message)) The ``message`` attribute will contain either the first argument passed in at instantiation of the object or the empty string if no @@ -212,6 +179,72 @@ deprecation and the raising of a DeprecationWarning for the version specifically listed. +Here is BaseException as implemented in the 2.x series:: + + class BaseException(object): + + """Superclass representing the base of the exception hierarchy. + + Provides a 'message' attribute that contains any single argument + passed in during instantiation. If more than one argument is + passed, it is set to the empty string. It is meant to represent + any message (usually some text) that should be printed out with + the traceback. Unfortunately, for backwards-compatibility, the + 'args' attribute (discussed below) is used for printing out to + tracebacks. + + The 'args' attribute and __getitem__ method are provided for + backwards-compatibility and will be deprecated at some point. + + """ + + def __init__(self, *args): + """Set 'message' and 'args' attribute. + + 'args' will eventually be deprecated. But it is still used + when printing out tracebacks for backwards-compatibility. + Once 'args' is removed, though, 'message' will be used instead. + + """ + self.args = args + self.message = args[0] if args else '' + + def __str__(self): + """Return the str of args[0] or args, depending on length. + + Once 'args' has been removed, 'message' will be used + exclusively for the str representation for exceptions. + + """ + return str(self.args[0] + if len(self.args) <= 1 + else self.args) + + def __unicode__(self): + """Return the unicode of args[0] or args, depending on length. + + Once 'args' has been removed, 'message' will be used + exclusively for the unicode representation of exceptions. + + """ + return unicode(self.args[0] + if len(self.args) <= 1 + else self.args) + + def __repr__(self): + func_args = repr(self.args) if self.args else "()" + return self.__class__.__name__ + func_args + + def __getitem__(self, index): + """Index into arguments passed in during instantiation. + + Provided for backwards-compatibility and will be + deprecated. + + """ + return self.args[index] + + Deprecation of features in Python 2.9 is optional. This is because it is not known at this time if Python 2.9 (which is slated to be the last version in the 2.x series) will actively deprecate features that From dynkin at gmail.com Thu Mar 2 04:29:41 2006 From: dynkin at gmail.com (George Yoshida) Date: Thu, 2 Mar 2006 12:29:41 +0900 Subject: [Python-checkins] r42748 - in python/trunk: Doc/api/exceptions.tex Doc/lib/libexcs.tex Doc/tut/tut.tex Python/exceptions.c In-Reply-To: <20060301221051.30A3D1E4014@bag.python.org> References: <20060301221051.30A3D1E4014@bag.python.org> Message-ID: <2f188ee80603011929y446a0851i9569ed9fe13b2117@mail.gmail.com> On 3/2/06, brett.cannon wrote: > Author: brett.cannon > Date: Wed Mar 1 23:10:49 2006 > New Revision: 42748 > > Modified: > python/trunk/Doc/api/exceptions.tex > python/trunk/Doc/lib/libexcs.tex > python/trunk/Doc/tut/tut.tex > python/trunk/Python/exceptions.c > Log: > Document PEP 352 changes. Also added GeneratorExit. > Hmm, your commit triggers a latex compile error. -- geprge Index: Doc/lib/libexcs.tex =================================================================== --- Doc/lib/libexcs.tex (revision 42767) +++ Doc/lib/libexcs.tex (working copy) @@ -82,6 +82,7 @@ eventually be deprecated and thus its use is discouraged. \versionchanged[Changed to inherit from \exception{BaseException}]{2.5} \versionadded{2.5} +\end{excdesc} \begin{excdesc}{Exception} All built-in, non-system-exiting exceptions are derived @@ -168,11 +169,12 @@ \file{pyconfig.h} file. \end{excdesc} -\begin{excdesv}{GeneratorExit} +\begin{excdesc}{GeneratorExit} Raise when a generator's \method{close()} method is called. It directly inherits from \exception{Exception} instead of \exception{StandardError} since it is technically not an error. \versionadded{2.5} +\end{excdesc} \begin{excdesc}{IOError} % XXXJH xrefs here -------------- next part -------------- A non-text attachment was scrubbed... Name: doc.diff Type: application/octet-stream Size: 854 bytes Desc: not available Url : http://mail.python.org/pipermail/python-checkins/attachments/20060302/7e8051d1/attachment-0001.obj From python-checkins at python.org Thu Mar 2 04:46:56 2006 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 2 Mar 2006 04:46:56 +0100 (CET) Subject: [Python-checkins] r42768 - peps/trunk/pep-0008.txt Message-ID: <20060302034656.17C851E4002@bag.python.org> Author: guido.van.rossum Date: Thu Mar 2 04:46:55 2006 New Revision: 42768 Modified: peps/trunk/pep-0008.txt Log: /pubic/public/. Thanks Jennings Jared! Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Thu Mar 2 04:46:55 2006 @@ -552,7 +552,7 @@ Public attributes are those that you expect unrelated clients of your class to use, with your commitment to avoid backward incompatible changes. Non-public attributes are those that are not intended to be - used by third parties; you make no guarantees that non-pubic attributes + used by third parties; you make no guarantees that non-public attributes won't change or even be removed. We don't use the term "private" here, since no attribute is really From python-checkins at python.org Thu Mar 2 04:52:07 2006 From: python-checkins at python.org (brett.cannon) Date: Thu, 2 Mar 2006 04:52:07 +0100 (CET) Subject: [Python-checkins] r42769 - python/trunk/Doc/lib/libexcs.tex Message-ID: <20060302035207.DFDE31E4002@bag.python.org> Author: brett.cannon Date: Thu Mar 2 04:52:06 2006 New Revision: 42769 Modified: python/trunk/Doc/lib/libexcs.tex Log: Fix latex typos as spotted by George Yoshida. Modified: python/trunk/Doc/lib/libexcs.tex ============================================================================== --- python/trunk/Doc/lib/libexcs.tex (original) +++ python/trunk/Doc/lib/libexcs.tex Thu Mar 2 04:52:06 2006 @@ -82,6 +82,7 @@ eventually be deprecated and thus its use is discouraged. \versionchanged[Changed to inherit from \exception{BaseException}]{2.5} \versionadded{2.5} +\end{excdesc} \begin{excdesc}{Exception} All built-in, non-system-exiting exceptions are derived @@ -168,11 +169,12 @@ \file{pyconfig.h} file. \end{excdesc} -\begin{excdesv}{GeneratorExit} +\begin{excdesc}{GeneratorExit} Raise when a generator's \method{close()} method is called. It directly inherits from \exception{Exception} instead of \exception{StandardError} since it is technically not an error. \versionadded{2.5} +\end{excdesc} \begin{excdesc}{IOError} % XXXJH xrefs here From brett at python.org Thu Mar 2 04:52:44 2006 From: brett at python.org (Brett Cannon) Date: Wed, 1 Mar 2006 19:52:44 -0800 Subject: [Python-checkins] r42748 - in python/trunk: Doc/api/exceptions.tex Doc/lib/libexcs.tex Doc/tut/tut.tex Python/exceptions.c In-Reply-To: <2f188ee80603011929y446a0851i9569ed9fe13b2117@mail.gmail.com> References: <20060301221051.30A3D1E4014@bag.python.org> <2f188ee80603011929y446a0851i9569ed9fe13b2117@mail.gmail.com> Message-ID: On 3/1/06, George Yoshida wrote: > On 3/2/06, brett.cannon wrote: > > Author: brett.cannon > > Date: Wed Mar 1 23:10:49 2006 > > New Revision: 42748 > > > > Modified: > > python/trunk/Doc/api/exceptions.tex > > python/trunk/Doc/lib/libexcs.tex > > python/trunk/Doc/tut/tut.tex > > python/trunk/Python/exceptions.c > > Log: > > Document PEP 352 changes. Also added GeneratorExit. > > > > Hmm, your commit triggers a latex compile error. > Fixed in rev. 42769. Thanks, George. -Brett From guido at python.org Thu Mar 2 04:54:04 2006 From: guido at python.org (Guido van Rossum) Date: Wed, 1 Mar 2006 21:54:04 -0600 Subject: [Python-checkins] r42748 - in python/trunk: Doc/api/exceptions.tex Doc/lib/libexcs.tex Doc/tut/tut.tex Python/exceptions.c In-Reply-To: <2f188ee80603011929y446a0851i9569ed9fe13b2117@mail.gmail.com> References: <20060301221051.30A3D1E4014@bag.python.org> <2f188ee80603011929y446a0851i9569ed9fe13b2117@mail.gmail.com> Message-ID: > On 3/2/06, brett.cannon wrote: > > Author: brett.cannon > > Date: Wed Mar 1 23:10:49 2006 > > New Revision: 42748 On 3/1/06, George Yoshida wrote: > Hmm, your commit triggers a latex compile error. Thanks -- now fixed! -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Thu Mar 2 05:03:51 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 2 Mar 2006 05:03:51 +0100 (CET) Subject: [Python-checkins] r42770 - python/trunk/Misc/NEWS Message-ID: <20060302040351.461581E400E@bag.python.org> Author: neal.norwitz Date: Thu Mar 2 05:03:44 2006 New Revision: 42770 Modified: python/trunk/Misc/NEWS Log: Remove duplicate entry Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Mar 2 05:03:44 2006 @@ -430,9 +430,6 @@ - Bug #1413790: zipfile now sanitizes absolute archive names that are not allowed by the specs. -- Bug #1413790: zipfile now sanitizes absolute archive names that are - not allowed by the specs. - - Patch #1215184: FileInput now can be given an opening hook which can be used to control how files are opened. From python-checkins at python.org Thu Mar 2 05:06:28 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 2 Mar 2006 05:06:28 +0100 (CET) Subject: [Python-checkins] r42771 - python/trunk/Python/compile.c Message-ID: <20060302040628.C4D681E4002@bag.python.org> Author: neal.norwitz Date: Thu Mar 2 05:06:10 2006 New Revision: 42771 Modified: python/trunk/Python/compile.c Log: Update known issues to reflect reality Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Thu Mar 2 05:06:10 2006 @@ -35,14 +35,11 @@ /* ISSUES: - character encodings aren't handled - - ref leaks in interpreter when press return on empty line - opcode_stack_effect() function should be reviewed since stack depth bugs could be really hard to find later. Dead code is being generated (i.e. after unconditional jumps). + XXX(nnorwitz): not sure this is still true */ #define DEFAULT_BLOCK_SIZE 16 From neal at metaslash.com Thu Mar 2 05:09:12 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 23:09:12 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (4) Message-ID: <20060302040912.GA11253@python.psfb.org> test_ast leaked [107, 107, 107] references test_cfgparser leaked [0, -54, 0] references test_cmd_line leaked [15, 0, 15] references test_compiler leaked [204, 67, 146] references test_future leaked [3, 3, 3] references test_generators leaked [255, 255, 255] references test_pep352 leaked [1, 1, 1] references test_sys leaked [1, 1, 1] references test_threadedtempfile leaked [3, 4, 0] references test_threading leaked [1, 0, 0] references test_threading_local leaked [42, 42, 34] references test_urllib2 leaked [80, -130, 70] references From neal at metaslash.com Thu Mar 2 05:09:12 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 23:09:12 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (4) Message-ID: <20060302040912.GA11256@python.psfb.org> test_ast leaked [107, 107, 107] references test_cfgparser leaked [0, -54, 0] references test_cmd_line leaked [15, 0, 15] references test_compiler leaked [204, 67, 146] references test_future leaked [3, 3, 3] references test_generators leaked [255, 255, 255] references test_pep352 leaked [1, 1, 1] references test_sys leaked [1, 1, 1] references test_threadedtempfile leaked [3, 4, 0] references test_threading leaked [1, 0, 0] references test_threading_local leaked [42, 42, 34] references test_urllib2 leaked [80, -130, 70] references From neal at metaslash.com Thu Mar 2 05:09:12 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 23:09:12 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (4) Message-ID: <20060302040912.GA11254@python.psfb.org> test_ast leaked [107, 107, 107] references test_cfgparser leaked [0, -54, 0] references test_cmd_line leaked [15, 0, 15] references test_compiler leaked [204, 67, 146] references test_future leaked [3, 3, 3] references test_generators leaked [255, 255, 255] references test_pep352 leaked [1, 1, 1] references test_sys leaked [1, 1, 1] references test_threadedtempfile leaked [3, 4, 0] references test_threading leaked [1, 0, 0] references test_threading_local leaked [42, 42, 34] references test_urllib2 leaked [80, -130, 70] references From neal at metaslash.com Thu Mar 2 05:09:12 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 23:09:12 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (4) Message-ID: <20060302040912.GA11252@python.psfb.org> test_ast leaked [107, 107, 107] references test_cfgparser leaked [0, -54, 0] references test_cmd_line leaked [15, 0, 15] references test_compiler leaked [204, 67, 146] references test_future leaked [3, 3, 3] references test_generators leaked [255, 255, 255] references test_pep352 leaked [1, 1, 1] references test_sys leaked [1, 1, 1] references test_threadedtempfile leaked [3, 4, 0] references test_threading leaked [1, 0, 0] references test_threading_local leaked [42, 42, 34] references test_urllib2 leaked [80, -130, 70] references From python-checkins at python.org Thu Mar 2 05:24:09 2006 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 2 Mar 2006 05:24:09 +0100 (CET) Subject: [Python-checkins] r42772 - in python/trunk/Lib: compiler/transformer.py test/test_compiler.py Message-ID: <20060302042409.A2AB91E400F@bag.python.org> Author: guido.van.rossum Date: Thu Mar 2 05:24:01 2006 New Revision: 42772 Modified: python/trunk/Lib/compiler/transformer.py python/trunk/Lib/test/test_compiler.py Log: Fix failure of test_compiler.py when compiling test_contextlib.py. The culprit was an expression-less yield -- the first apparently in the standard library. I added a unit test for this. Also removed the hack to force compilation of test_with.py. Modified: python/trunk/Lib/compiler/transformer.py ============================================================================== --- python/trunk/Lib/compiler/transformer.py (original) +++ python/trunk/Lib/compiler/transformer.py Thu Mar 2 05:24:01 2006 @@ -408,11 +408,11 @@ return Discard(expr, lineno=expr.lineno) def yield_expr(self, nodelist): - if len(nodelist)>1: - value = nodelist[1] + if len(nodelist) > 1: + value = self.com_node(nodelist[1]) else: value = Const(None) - return Yield(self.com_node(value), lineno=nodelist[0][2]) + return Yield(value, lineno=nodelist[0][2]) def raise_stmt(self, nodelist): # raise: [test [',' test [',' test]]] Modified: python/trunk/Lib/test/test_compiler.py ============================================================================== --- python/trunk/Lib/test/test_compiler.py (original) +++ python/trunk/Lib/test/test_compiler.py Thu Mar 2 05:24:01 2006 @@ -20,7 +20,7 @@ for basename in os.listdir(dir): if not basename.endswith(".py"): continue - if not TEST_ALL and random() < 0.98 and basename != "test_with.py": + if not TEST_ALL and random() < 0.98: continue path = os.path.join(dir, basename) if test.test_support.verbose: @@ -43,6 +43,9 @@ def testNewClassSyntax(self): compiler.compile("class foo():pass\n\n","","exec") + def testYieldExpr(self): + compiler.compile("def g(): yield\n\n", "", "exec") + def testLineNo(self): # Test that all nodes except Module have a correct lineno attribute. filename = __file__ From python-checkins at python.org Thu Mar 2 05:31:57 2006 From: python-checkins at python.org (brett.cannon) Date: Thu, 2 Mar 2006 05:31:57 +0100 (CET) Subject: [Python-checkins] r42773 - python/trunk/Python/exceptions.c Message-ID: <20060302043157.5E7B91E4002@bag.python.org> Author: brett.cannon Date: Thu Mar 2 05:31:55 2006 New Revision: 42773 Modified: python/trunk/Python/exceptions.c Log: Add a missing Py_DECREF to BaseException__unicode__ . Modified: python/trunk/Python/exceptions.c ============================================================================== --- python/trunk/Python/exceptions.c (original) +++ python/trunk/Python/exceptions.c Thu Mar 2 05:31:55 2006 @@ -285,16 +285,22 @@ } else if (args_len == 1) { PyObject *temp = PySequence_GetItem(args, 0); + PyObject *unicode_obj; + if (!temp) { Py_DECREF(args); return NULL; } Py_DECREF(args); - return PyObject_Unicode(temp); + unicode_obj = PyObject_Unicode(temp); + Py_DECREF(temp); + return unicode_obj; } else { + PyObject *unicode_obj = PyObject_Unicode(args); + Py_DECREF(args); - return PyObject_Unicode(args); + return unicode_obj; } } #endif /* Py_USING_UNICODE */ From neal at metaslash.com Thu Mar 2 05:46:31 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 1 Mar 2006 23:46:31 -0500 Subject: [Python-checkins] Python Regression Test Failures all (1) Message-ID: <20060302044631.GA22293@python.psfb.org> /home/neal/python/trunk/Lib/random.py:44: RuntimeWarning: Python C API version mismatch for module math: This Python has API version 1013, module math has version 1012. from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil /home/neal/python/trunk/Lib/random.py:47: RuntimeWarning: Python C API version mismatch for module binascii: This Python has API version 1013, module binascii has version 1012. from binascii import hexlify as _hexlify /home/neal/python/trunk/Lib/random.py:68: RuntimeWarning: Python C API version mismatch for module _random: This Python has API version 1013, module _random has version 1012. import _random ./Lib/test/regrtest.py:113: RuntimeWarning: Python C API version mismatch for module cStringIO: This Python has API version 1013, module cStringIO has version 1012. import cStringIO /home/neal/python/trunk/Lib/unittest.py:51: RuntimeWarning: Python C API version mismatch for module time: This Python has API version 1013, module time has version 1012. import time test_grammar test_opcodes test_operations test_builtin /home/neal/python/trunk/Lib/test/test_builtin.py:5: RuntimeWarning: Python C API version mismatch for module operator: This Python has API version 1013, module operator has version 1012. from operator import neg /home/neal/python/trunk/Lib/locale.py:28: RuntimeWarning: Python C API version mismatch for module _locale: This Python has API version 1013, module _locale has version 1012. from _locale import * /home/neal/python/trunk/Lib/string.py:527: RuntimeWarning: Python C API version mismatch for module strop: This Python has API version 1013, module strop has version 1012. from strop import maketrans, lowercase, uppercase, whitespace test test_builti/home/neal/python/trunk/Lib/test/test_exceptions.py:179: RuntimeWarning: Python C API version mismatch for module _testcapi: This Python has API version 1013, module _testcapi has version 1012. import _testcapi test_types test_MimeWriter /home/neal/python/trunk/Lib/tempfile.py:40: RuntimeWarning: Python C API version mismatch for module fcntl: This Python has API version 1013, module fcntl has version 1012. import fcntl as _fcntl test_StringIO test___all__ /home/neal/python/trunk/Lib/test/test___all__.py:41: RuntimeWarning: Python C API version mismatch for module _socket: This Python has API version 1013, module _socket has version 1012. import _socket /home/neal/python/trunk/Lib/soc/home/neal/python/trunk/Lib/test/test___all__.py:41: RuntimeWarning: Python C API version mismatch for module _socket: This Python has API version 1013,/home/neal/python/trunk/Lib/CGIHTTPServer.py:31: RuntimeWarning: Python C API version mismatch for module select: This Python has API version 1013, module select has version 1012. import select /home/neal/python/trunk/Lib/Cookie.py:216: RuntimeWarning: Python C API version mismatch for module cPickle: This Python has API version 1013, module cPickle has version 1012. from cPickle import dumps, loads /home/neal/python/trunk/Lib/Queue.py:4: RuntimeWarning: Python C API version mismatch for module collections: This Python has API version 1013, module collections has version 1012. from collections import deque /home/neal/python/trunk/Lib/aifc.py:137: RuntimeWarning: Python C API version mismatch for module struct: This Python has API version 1013, module struct has version 1012. import struct /home/neal/python/trunk/Lib/calendar.py:8: RuntimeWarning: Python C API version mismatch for module datetime: This Python has API version 1013, module datetime has version 1012. import datetime /home/neal/python/trunk/Lib/csv.py:7: RuntimeWarning: Python C API version mismatch for module _csv: This Python has API version 1013, module _csv has version 1012. from _csv import Error, __version__, writer, reader, register_diale/home//home/neal/python/trunk/Lib/weakref.py:14: RuntimeWarning: Python C API version mismatch for module _weakref: This Python has API version 1013, module _weakref has version 1012. from _weakref import ( /home/neal/python/trunk/Lib/heapq.py:132: RuntimeWarning: Python C API version mismatch for module itertools: This Python has API version 1013, module itertools has version 1012. from itertools import islice, repeat, count, imap, iz/home/neal/python/trunk/Lib/heapq.py:132: RuntimeWarning: Python C API version mismatch for module itertools: This Python has API version 1013, module itertools has version 1012. from itertools import islice, repeat, count, imap, izip, tee /home/neal/python/trunk/Lib/bisect.py:82: RuntimeWarning: Python C API version mismatch for module _bisect: This Python has API version 1013, module _bisect has version 1012. from _bisect import bisect_right, bisect_left, insort_left, insort_right, insort, bisect /home/neal/python/tru/home/neal/python/trunk/Lib/getpass.py:106: RuntimeWarning: Python C API version mismatch for module termios: This Python has API version 1013, module termios has version 1012. import termios /home/neal/python/trunk/Lib/gzip.py:9: RuntimeWarning: Python C API version mismatch for module zlib: This Python has API version 1013, module zlib has version 1012. import zlib /home/neal/python/trunk/Lib/profile.py:116: RuntimeWarning: Python C API version mismatch for module resource: This Python has API version 1013, module resource has version 1012. import resource /home/neal/python/trunk/Lib/reconvert/home/neal/python/trunk/Lib/profile.py:116: RuntimeWarning: Python C API version mismatch for module resource: This Python has API version 1013, module resource has version 1012. import resource /home/neal/python/trunk/Lib/reconvert.py:67: RuntimeWarning: Python C API version mismatch for module regex: This Python has API version 1013, module regex has version 1012. import regex /home/neal/python/trunk/Lib/rlcompleter.py:42: RuntimeWarning: Python C API version mismatch for module readline: This Python has API version 1013, modutest___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm /home/neal/python/trunk/Lib/anydbm.py:54: RuntimeWarning: Python C API version mismatch for module gdbm: This Python has API version 1013, module gdbm has version 1012. _mod = __import__(_name) /home/neal/python/trunk/Litest_anydbm /home/neal/python/trunk/Lib/anydbm.py:54: RuntimeWarning: Python C API version mismatch for module gdbm: This Python has API version 1013, module gdbm has vtest test_anydbm failed -- errors occurred in test.test_anydbm.AnyDBMTestCase test_applesingle test_applesingle skipped -- No module named macostools test_array /home/neal/python/trunk/Lib/test/test_array.py:9: RuntimeWarning: Python test test_anydbm failed -- errors occurred in test.test_anydbm.AnyDBMTestCase test_applesingle test_applesingle skipped -- No module namedtest_ast test_asynchat test_atexit test_audioop /home/neal/python/trunk/Lib/test/test_audioop.py:2: RuntimeWarning: Python C API version mismatch for module audioop: This Python has API version 1013, module audioop has version 1012. import audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 Exception in thread reader 4: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 473, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 453, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') Exception in thread writer 0: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 473, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 453, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 254, in writerThread self.assertEqual(data, self.makeData(key)) File "/home/neal/python/trunk/Lib/unittest.py", line 334, in failUnlessEqual (msg or '%r != %r' % (first, second)) AssertionError: None != '0003-0003-0003-0003-0003' Exception in thread writer 1: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 473, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 453, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 254, in writerThread self.assertEqual(data, self.makeData(key)) File "/home/neal/python/trunk/Lib/unittest.py", line 334, in failUnlessEqual (msg or '%r != %r' % (first, second)) AssertionError: None != '1000-1000-1000-1000-1000' Exception in thread writer 2: Traceback (most recent call Exception in thread writer 1: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 473, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 453, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 372, in writerThread self.doWrite(d, name, x, min(stop, x+step)) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 360, in doWrite txn.abort() DBRunRecoverytest test_bsddb3 failed -- errors occurred; run in verbose mode for details test_bufio test_bz2 /home/neal/python/trunk/Lib/test/test_bz2.py:11: RuntimeWarning: Python C API version mismatch for module bz2: This Python has API version 1013, module bz2 has version 1012. import bz2 test_cProfile /home/neal/python/trunk/Lib/cProfile.py:9: RuntimeWarning: Python C API version mismatch for module _lsprof: This Python has API version 1013, module _lsprof has version 1012. import _lsprof test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath /home/neal/python/trunk/Lib/test/test_cmath.py:5: RuntimeWarning: Python C API version mismatch for module cmath: This Python has API version 1013, module cmath has version 1012. import cmath, math test_cmd_line test_code test_codeccallbacks /home/neal/python/trunk/Lib/test/test_codeccallbacks.py:2: RuntimeWarning: Python C API version mismatch for module unicodedata: This Python has API version 1013, module unicodedata has version 1012. import sys, codecs, htmlentitydefs, unicodedata test_codecencodings_cn /home/neal/python/trunk/Lib/encodings/gb2312.py:8: RuntimeWarning: Python C API version mismatch for module _codecs_cn: This Python has API version 1013, module _codecs_cn has version 1012. import _codecs_cn, codecs /home/neal/python/trunk/Lib/encodings/gb2312.py:10: RuntimeWarning: Python C API version mismatch for module _multibytecodec: This Python has API version 1013, module _multibytecodec has version 1012. codec = _codecs_cn.getcodec('gb2312') test_codecencodings_hk /home/neal/python/trunk/Lib/encodings/big5hkscs.py:8: RuntimeWarning: Python C API version mismatch for module _codecs_hk: This Python has API version 1013, module _codecs_hk has version 1012. import _codecs_hk, codecs /home/neal/python/trunk/Lib/encodings/big5hkscs.py:10: RuntimeWarning: Python C API version mismatch for module _codecs_tw: This Python has API version 1013, module _codecs_tw has version 1012. codec = _codecs_hk.getcodec('big5hkscs') test_codecencodings_jp /home/neal/python/trunk/Lib/encodings/cp932.py:8: RuntimeWarning: Python C API version mismatch for module _codecs_jp: This Python has API version 1013, module _codecs_jp has version 1012. import _codecs_jp, codecs test_codecencodings_kr /home/neal/python/trunk/Lib/encodings/cp949.py:8: RuntimeWarning: Python C API version mismatch for module _codecs_kr: This Python has API version 1013, module _codecs_kr has version 1012. import _codecs_kr, codecs test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs /home/neal/python/trunk/Lib/encodings/iso2022_jp.py:8: RuntimeWarning: Python C API version mismatch for module _codecs_iso2022: This Python has API version 1013, module _codecs_iso2022 has version 1012. import _codecs_iso2022, codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test test_compiler failed -- Traceback (most recent call last): File "/home/neal/python/trunk/Lib/test/test_compiler.py", line 35, in testCompileLibrary compiler.compile(buf, basename, "exec") File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 63, in compile gen.compile() File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 110, in compile tree = self._get_tree() File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 76, in _get_tree tree = parse(self.source, self.mode) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 52, in parse return Transformer().parsesuite(buf) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 129, in parsesuite return self.transform(parser.suite(text)) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 125, in transform return self.compile_node(tree) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 158, in compile_node return self.file_input(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 189, in file_input self.com_append_stmt(stmts, node) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1059, in com_append_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 296, in classdef code = self.com_node(nodelist[-1]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 779, in com_node return self._dispatch[node[0]](node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 553, in suite self.com_append_stmt(stmts, node) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1059, in com_append_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 260, in funcdef code = self.com_node(nodelist[-1]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 779, in com_node return self._dispatch[node[0]](node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 553, in suite self.com_append_stmt(stmts, node) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1059, in com_append_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 260, in funcdef code = self.com_node(nodelist[-1]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 779, in com_node return self._dispatch[node[0]](node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 553, in suite self.com_append_stmt(stmts, node) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1059, in com_append_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 316, in simple_stmt self.com_append_stmt(stmts, nodelist[i]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1059, in com_append_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 306, in stmt return self.com_stmt(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 1052, in com_stmt result = self.lookup_node(node)(node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 407, in yield_stmt expr = self.com_node(nodelist[0]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 779, in com_node return self._dispatch[node[0]](node[1:]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 415, in yield_expr return Yield(self.com_node(value), lineno=nodelist[0][2]) File "/home/neal/python/trunk/Lib/compiler/transformer.py", line 779, in com_node return self._dispatch[node[0]](node[1:]) AttributeError: Const instance has no attribute '__getitem__' test_complex test_contains test_contextlib test_cookie test_cookielib /home/neal/python/trunk/Lib/hashlib.py:73: RuntimeWarning: Python C API version mismatch for module _hashlib: This Python has API version 1013, module _hashlib has version 1012. import _hashlib /home/neal/python/trunk/Lib/hashlib.py:34: RuntimeWarning: Python C API version mismatch for module _sha256: This Python has API version 1013, module _sha256 has version 1012. import _sha256 /home/neal/python/trunk/Lib/hashlib.py:41: RuntimeWarning: Python C API version mismatch for module _sha512: This Python has API version 1013, module _sha512 has version 1012. import _sha512 test_copy test_copy_reg test_cpickle test_crypt /home/neal/python/trunk/Lib/test/test_crypt.py:7: RuntimeWarning: Python C API version mismatch for module crypt: This Python has API version 1013, module crypt has version 1012. import crypt test_csv test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl /home/neal/python/trunk/Lib/test/test_dl.py:6: RuntimeWarning: Python C API version mismatch for module dl: This Python has API version 1013, module dl has version 1012. import dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional /home/neal/python/trunk/Lib/test/test_functional.py:1: RuntimeWarning: Python C API version mismatch for module functional: This Python has API version 1013, module functional has version 1012. import functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot /home/neal/python/trunk/Lib/hotshot/__init__.py:3: RuntimeWarning: Python C API version mismatch for module _hotshot: This Python has API version 1013, module _hotshot has version 1012. import _hotshot test_htmllib test_htmlparser test_httplib test_imageop /home/neal/python/trunk/Lib/test/test_imageop.py:10: RuntimeWarning: Python C API version mismatch for module imageop: This Python has API version 1013, module imageop has version 1012. import imageop, uu, os /home/neal/python/trunk/Lib/test/test_imageop.py:129: RuntimeWarning: Python C API version mismatch for module rgbimg: This Python has API version 1013, module rgbimg has version 1012. import rgbimg test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom /home/neal/python/trunk/Lib/xmlcore/parsers/expat.py:4: RuntimeWarning: Python C API version mismatch for module pyexpat: This Python has API version 1013, module pyexpat has version 1012. from pyexpat import * test_mmap /home/neal/python/trunk/Lib/test/test_mmap.py:2: RuntimeWarning: Python C API version mismatch for module mmap: This Python has API version 1013, module mmap has version 1012. import mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis /home/neal/python/trunk/Lib/test/test_nis.py:2: RuntimeWarning: Python C API version mismatch for module nis: This Python has API version 1013, module nis has version 1012. import nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9159 refs] [9159 refs] [9159 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri /home/neal/python/trunk/Lib/quopri.py:15: RuntimeWarning: Python C API version mismatch for module binascii: This Python has API version 1013, module binascii has version 1012. from binascii import a2b_qp, b2a_qp [9447 refs] /home/neal/python/trunk/Lib/quopri.py:15: RuntimeWarning: Python C API version mismatch for module binascii: This Python has API version 1013, module binascii has version 1012. from binascii import a2b_qp, b2a_qp [9447 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socketserver test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9154 refs] [9156 refs] [9154 refs] [9154 refs] [9154 refs] [9154 refs] [9154 refs] [9155 refs] [9155 refs] [9154 refs] [9155 refs] [9154 refs] -c:1: RuntimeWarning: Python C API version mismatch for module time: This Python has API version 1013, module time has version 1012. [9464 refs] [9155 refs] [9155 refs] [9155 refs] [9155 refs] [9155 refs] [9155 refs] [9155 refs] this bit of output is from a test of stdout in a different process ... [9155 refs] [9154 refs] -c:1: RuntimeWarning: Python C API version mismatch for module time: This Python has API version 1013, module time has version 1012. [9464 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry /home/neal/python/trunk/Lib/curses/__init__.py:15: RuntimeWarning: Python C API version mismatch for module _curses: This Python has API version 1013, module _curses has version 1012. from _curses import * test_symtable test_syntax test_sys [9154 refs] [9154 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9156 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_timing /home/neal/python/trunk/Lib/test/test_timing.py:2: RuntimeWarning: Python C API version mismatch for module timing: This Python has API version 1013, module timing has version 1012. import timing test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllibnet test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c /home/neal/python/trunk/Lib/xmlcore/etree/cElementTree.py:3: RuntimeWarning: Python C API version mismatch for module _elementtree: This Python has API version 1013, module _elementtree has version 1012. from _elementtree import * test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 281 tests OK. 3 tests failed: test_anydbm test_bsddb3 test_compiler 21 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_cd test_cl test_gl test_hashlib_speed test_imgfile test_ioctl test_macfs test_macostools test_nis test_pep277 test_plistlib test_scriptpackages test_sunaudiodev test_tcl test_unicode_file test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [363040 refs] From python-checkins at python.org Thu Mar 2 05:48:28 2006 From: python-checkins at python.org (thomas.wouters) Date: Thu, 2 Mar 2006 05:48:28 +0100 (CET) Subject: [Python-checkins] r42774 - python/trunk/Modules/_hashopenssl.c Message-ID: <20060302044828.224521E4002@bag.python.org> Author: thomas.wouters Date: Thu Mar 2 05:48:27 2006 New Revision: 42774 Modified: python/trunk/Modules/_hashopenssl.c Log: Py_SAFE_DOWNCAST isn't quite doing the right thing for going from Py_ssize_t to an unsigned int (and back again) on 64-bit machines, even though the actual value of the Py_ssize_t variable is way below 31 bits. I suspect compiler-error. Modified: python/trunk/Modules/_hashopenssl.c ============================================================================== --- python/trunk/Modules/_hashopenssl.c (original) +++ python/trunk/Modules/_hashopenssl.c Thu Mar 2 05:48:27 2006 @@ -173,8 +173,7 @@ if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) return NULL; - EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, - unsigned int)); + EVP_DigestUpdate(&self->ctx, cp, (unsigned int)len); Py_INCREF(Py_None); return Py_None; @@ -265,8 +264,7 @@ Py_INCREF(self->name); if (cp && len) - EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, - unsigned int)); + EVP_DigestUpdate(&self->ctx, cp, (unsigned int)len); return 0; } @@ -393,8 +391,7 @@ digest = EVP_get_digestbyname(name); - return EVPnew(name_obj, digest, NULL, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, - unsigned int)); + return EVPnew(name_obj, digest, NULL, cp, (unsigned int)len); } /* @@ -419,7 +416,7 @@ CONST_ ## NAME ## _name_obj, \ NULL, \ CONST_new_ ## NAME ## _ctx_p, \ - cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int)); \ + cp, (unsigned int)len); \ } /* a PyMethodDef structure for the constructor */ From nnorwitz at gmail.com Thu Mar 2 05:50:21 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 1 Mar 2006 20:50:21 -0800 Subject: [Python-checkins] r42743 - python/trunk/Modules/_hashopenssl.c In-Reply-To: <20060301215009.5E5CE1E4002@bag.python.org> References: <20060301215009.5E5CE1E4002@bag.python.org> Message-ID: This change causes failures on my amd64: http://www.python.org/dev/buildbot/all/amd64%20gentoo%20trunk/builds/199/step-test/0 n -- On 3/1/06, thomas.wouters wrote: > Author: thomas.wouters > Date: Wed Mar 1 22:50:07 2006 > New Revision: 42743 > > Modified: > python/trunk/Modules/_hashopenssl.c > Log: > > Make Py_ssize_t-clean. > > > > Modified: python/trunk/Modules/_hashopenssl.c > ============================================================================== > --- python/trunk/Modules/_hashopenssl.c (original) > +++ python/trunk/Modules/_hashopenssl.c Wed Mar 1 22:50:07 2006 > @@ -11,6 +11,8 @@ > * > */ > > +#define PY_SSIZE_T_CLEAN > + > #include "Python.h" > #include "structmember.h" > > @@ -166,12 +168,13 @@ > EVP_update(EVPobject *self, PyObject *args) > { > unsigned char *cp; > - int len; > + Py_ssize_t len; > > if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) > return NULL; > > - EVP_DigestUpdate(&self->ctx, cp, len); > + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, > + unsigned int)); > > Py_INCREF(Py_None); > return Py_None; > @@ -238,7 +241,7 @@ > PyObject *name_obj = NULL; > char *nameStr; > unsigned char *cp = NULL; > - unsigned int len; > + Py_ssize_t len; > const EVP_MD *digest; > > if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s#:HASH", kwlist, > @@ -262,7 +265,8 @@ > Py_INCREF(self->name); > > if (cp && len) > - EVP_DigestUpdate(&self->ctx, cp, len); > + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, > + unsigned int)); > > return 0; > } > @@ -375,7 +379,7 @@ > char *name; > const EVP_MD *digest; > unsigned char *cp = NULL; > - unsigned int len; > + Py_ssize_t len; > > if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|s#:new", kwlist, > &name_obj, &cp, &len)) { > @@ -389,7 +393,8 @@ > > digest = EVP_get_digestbyname(name); > > - return EVPnew(name_obj, digest, NULL, cp, len); > + return EVPnew(name_obj, digest, NULL, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, > + unsigned int)); > } > > /* > @@ -404,7 +409,7 @@ > EVP_new_ ## NAME (PyObject *self, PyObject *args) \ > { \ > unsigned char *cp = NULL; \ > - unsigned int len; \ > + Py_ssize_t len; \ > \ > if (!PyArg_ParseTuple(args, "|s#:" #NAME , &cp, &len)) { \ > return NULL; \ > @@ -414,7 +419,7 @@ > CONST_ ## NAME ## _name_obj, \ > NULL, \ > CONST_new_ ## NAME ## _ctx_p, \ > - cp, len); \ > + cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int)); \ > } > > /* a PyMethodDef structure for the constructor */ > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From python-checkins at python.org Thu Mar 2 06:05:19 2006 From: python-checkins at python.org (thomas.wouters) Date: Thu, 2 Mar 2006 06:05:19 +0100 (CET) Subject: [Python-checkins] r42775 - python/trunk/Modules/_hashopenssl.c Message-ID: <20060302050519.39AF01E401C@bag.python.org> Author: thomas.wouters Date: Thu Mar 2 06:05:17 2006 New Revision: 42775 Modified: python/trunk/Modules/_hashopenssl.c Log: Properly fix Py_SAFE_DOWNCAST-triggerd bugs. Modified: python/trunk/Modules/_hashopenssl.c ============================================================================== --- python/trunk/Modules/_hashopenssl.c (original) +++ python/trunk/Modules/_hashopenssl.c Thu Mar 2 06:05:17 2006 @@ -173,7 +173,8 @@ if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) return NULL; - EVP_DigestUpdate(&self->ctx, cp, (unsigned int)len); + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); Py_INCREF(Py_None); return Py_None; @@ -240,7 +241,7 @@ PyObject *name_obj = NULL; char *nameStr; unsigned char *cp = NULL; - Py_ssize_t len; + Py_ssize_t len = 0; const EVP_MD *digest; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s#:HASH", kwlist, @@ -264,7 +265,8 @@ Py_INCREF(self->name); if (cp && len) - EVP_DigestUpdate(&self->ctx, cp, (unsigned int)len); + EVP_DigestUpdate(&self->ctx, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); return 0; } @@ -377,7 +379,7 @@ char *name; const EVP_MD *digest; unsigned char *cp = NULL; - Py_ssize_t len; + Py_ssize_t len = 0; if (!PyArg_ParseTupleAndKeywords(args, kwdict, "O|s#:new", kwlist, &name_obj, &cp, &len)) { @@ -391,7 +393,8 @@ digest = EVP_get_digestbyname(name); - return EVPnew(name_obj, digest, NULL, cp, (unsigned int)len); + return EVPnew(name_obj, digest, NULL, cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, + unsigned int)); } /* @@ -406,7 +409,7 @@ EVP_new_ ## NAME (PyObject *self, PyObject *args) \ { \ unsigned char *cp = NULL; \ - Py_ssize_t len; \ + Py_ssize_t len = 0; \ \ if (!PyArg_ParseTuple(args, "|s#:" #NAME , &cp, &len)) { \ return NULL; \ @@ -416,7 +419,7 @@ CONST_ ## NAME ## _name_obj, \ NULL, \ CONST_new_ ## NAME ## _ctx_p, \ - cp, (unsigned int)len); \ + cp, Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int)); \ } /* a PyMethodDef structure for the constructor */ From python-checkins at python.org Thu Mar 2 08:41:13 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 2 Mar 2006 08:41:13 +0100 (CET) Subject: [Python-checkins] r42776 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060302074113.700091E401A@bag.python.org> Author: tim.peters Date: Thu Mar 2 08:41:12 2006 New Revision: 42776 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Repaired the new insecurity in Py_ADDRESS_IN_RANGE. Explained more about what that macro does and why. This "is done" now, except (I hope) for eventually merging to the trunk. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Thu Mar 2 08:41:12 2006 @@ -470,10 +470,14 @@ /* Number of slots currently allocated in the `arenas` vector. */ static uint maxarenas = 0; -/* The head of the singly-linked list of available arena objects. */ +/* The head of the singly-linked, NULL-terminated list of available + * arena_objects. + */ static struct arena_object* available_arenas = NULL; -/* The head of the doubly-linked list of arenas with pools available. */ +/* The head of the doubly-linked, NULL-terminated at each end, list of + * arena_objects associated with arenas that have pools available. + */ static struct arena_object* usable_arenas = NULL; /* How many arena_objects do we initially allocate? @@ -494,8 +498,8 @@ /* Allocate a new arena. If we run out of memory, return NULL. Else * allocate a new arena, and return the address of an arena_object - * descriptor describing the new arena. It's expected that the caller will - * set `usable_arenas` to the return value. + * describing the new arena. It's expected that the caller will set + * `usable_arenas` to the return value. */ static struct arena_object* new_arena(void) @@ -600,25 +604,59 @@ * 0 <= P-B < ARENA_SIZE * By using unsigned arithmetic, the "0 <=" half of the test can be skipped. * - * XXX This is broken. The arena-management patch sets B to 0 when an - * XXX arena_object isn't associated with storage obmalloc controls. - * XXX But if P is "small enough" (< ARENA_SIZE), P is not an address - * XXX controlled by obmalloc, and arenas[POOL_ADDR(P)->arenaindex] doesn't - * XXX correspond to an allocated arena, - * XXX (uptr)(P) - arenas[(POOL)->arenaindex].address will equal - * XXX (uptr)P - 0 = (uptr)P, and Py_ADDRESS_IN_RANGE will falsely claim - * XXX that P _is_ controlled by obmalloc (P < ARENA_SIZE by case assumption). - * XXX This is a disaster ... complicate+slow the macro to verify that - * XXX .address != 0 too? - * * Obscure: A PyMem "free memory" function can call the pymalloc free or - * realloc before the first arena has been allocated. arenas is still + * realloc before the first arena has been allocated. `arenas` is still * NULL in that case. We're relying on that maxarenas is also 0 in that case, * so that (POOL)->arenaindex < maxarenas must be false, saving us from * trying to index into a NULL arenas. + * + * Details: given P and POOL, the arena_object corresponding to P is + * AO = arenas[(POOL)->arenaindex]. Suppose obmalloc controls P. Then + * (barring wild stores, etc), POOL is the correct address of P's pool, + * AO.address is the correct base address of the pool's arena, and P must be + * within ARENA_SIZE of AO.address. Therefore Py_ADDRESS_IN_RANGE correctly + * reports that obmalloc controls P. + * + * Now suppose obmalloc does not control P (e.g., P was obtained via a + * direct call to the system malloc() or free()). (POOL)->arenaindex may + * be anything in this case -- it may even be uninitialized trash. If the + * trash arenaindex is >= maxarenas, the macro correctly concludes at once + * that obmalloc doesn't control P. + * + * Else arenaindex is < maxarena, and AO is read up. If AO corresponds + * to an unassociated arena, AO.address is 0 and the macro correctly + * concludes that obmalloc doesn't control P. Note: This clause was added + * in Python 2.5. Before 2.5, arenas were never free()'ed, and an + * arenaindex < maxarena always corresponded to a currently-allocated + * arena. Why this matters is explained later. + * + * Else AO corresponds to an allocated arena, with base address AO.address. + * AO.address can't be 0 in this case, since no allocated memory can start + * at address 0 (NULL). Since it is an allocated arena, obmalloc controls + * all the memory in slice AO.address:AO.address+ARENA_SIZE. By case + * assumption, P is not controlled by obmalloc, so it doesn't lie in that + * slice, so the macro again correctly reports that P is not controlled by + * obmalloc. + * + * Why the test for AO.address != 0 is necessary: suppose some address P + * has integer value < ARENA_SIZE, P is not controlled by obmalloc, and + * the trash arenaindex corresponding to P's POOL gives an AO for a currently + * unassociated arena. Then AO.address is 0, and P - AO.address = P - 0 = + * P < ARENA_SIZE. Without the AO.address != 0 check, the macro would + * _incorrectly_ conclude that obmalloc does control P. While that's very + * unlikely, it's not impossible, and it would be a disaster if it occurred. + * + * Note that the logic is excruciating, and reading up possibly uninitialized + * memory when P is not controlled by obmalloc (to get at (POOL)->arenaindex) + * creates problems for some memory debuggers. The overwhelming advantage is + * that this test determines whether an arbitrary address is controlled by + * obmalloc in a small constant time, independent of the number of arenas + * obmalloc controls. Since this test is needed at every entry point, it's + * extremely desirable that it be this fast. */ -#define Py_ADDRESS_IN_RANGE(P, POOL) \ +#define Py_ADDRESS_IN_RANGE(P, POOL) \ ((POOL)->arenaindex < maxarenas && \ + arenas[(POOL)->arenaindex].address != 0 && \ (uptr)(P) - arenas[(POOL)->arenaindex].address < (uptr)ARENA_SIZE) @@ -1673,12 +1711,15 @@ #endif /* PYMALLOC_DEBUG */ #ifdef Py_USING_MEMORY_DEBUGGER -/* Make this function last so gcc won't inline it - since the definition is after the reference. */ +/* Make this function last so gcc won't inline it since the definition is + * after the reference. + */ int Py_ADDRESS_IN_RANGE(void *P, poolp pool) { - return ((pool->arenaindex) < maxarenas && - (uptr)(P) - arenas[pool->arenaindex].address < (uptr)ARENA_SIZE); + const uptr address = arenas[pool->arenaindex].address; + return pool->arenaindex < maxarenas && + address != 0 && + (uptr)P - address < (uptr)ARENA_SIZE; } #endif From python-checkins at python.org Thu Mar 2 08:51:46 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 2 Mar 2006 08:51:46 +0100 (CET) Subject: [Python-checkins] r42777 - python/trunk/Misc/build.sh Message-ID: <20060302075146.D95071E4002@bag.python.org> Author: neal.norwitz Date: Thu Mar 2 08:51:44 2006 New Revision: 42777 Modified: python/trunk/Misc/build.sh Log: Spell threading write, not thraeading Modified: python/trunk/Misc/build.sh ============================================================================== --- python/trunk/Misc/build.sh (original) +++ python/trunk/Misc/build.sh Thu Mar 2 08:51:44 2006 @@ -59,7 +59,7 @@ # test_generators really leaks. Since test_generators probably won't # be fixed real soon, disable warning about it for now. # The entire leak report will be mailed if any test not in this list leaks. -LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|threaded_import|threadedtempfile|threading|thraeading_local|urllib2)" +LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|threaded_import|threadedtempfile|threading|threading_local|urllib2)" # Change this flag to "yes" for old releases to just update/build the docs. BUILD_DISABLED="no" From python-checkins at python.org Thu Mar 2 08:54:30 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 2 Mar 2006 08:54:30 +0100 (CET) Subject: [Python-checkins] r42778 - python/trunk/Python/ceval.c Message-ID: <20060302075430.33F971E4002@bag.python.org> Author: neal.norwitz Date: Thu Mar 2 08:54:28 2006 New Revision: 42778 Modified: python/trunk/Python/ceval.c Log: Use Py_ssize_t since we are working with list size below Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Thu Mar 2 08:54:28 2006 @@ -1174,7 +1174,7 @@ v = TOP(); if (PyList_CheckExact(v) && PyInt_CheckExact(w)) { /* INLINE: list[int] */ - long i = PyInt_AsLong(w); + Py_ssize_t i = PyInt_AsSsize_t(w); if (i < 0) i += PyList_GET_SIZE(v); if (i >= 0 && i < PyList_GET_SIZE(v)) { From python-checkins at python.org Thu Mar 2 08:59:44 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 2 Mar 2006 08:59:44 +0100 (CET) Subject: [Python-checkins] r42779 - python/branches/tim-obmalloc/Objects/obmalloc.c Message-ID: <20060302075944.D45B81E4002@bag.python.org> Author: tim.peters Date: Thu Mar 2 08:59:42 2006 New Revision: 42779 Modified: python/branches/tim-obmalloc/Objects/obmalloc.c Log: Oops! I "over-optimized" the new spelling of the Py_ADDRESS_IN_RANGE() _function_. Repaired. Modified: python/branches/tim-obmalloc/Objects/obmalloc.c ============================================================================== --- python/branches/tim-obmalloc/Objects/obmalloc.c (original) +++ python/branches/tim-obmalloc/Objects/obmalloc.c Thu Mar 2 08:59:42 2006 @@ -1717,9 +1717,8 @@ int Py_ADDRESS_IN_RANGE(void *P, poolp pool) { - const uptr address = arenas[pool->arenaindex].address; return pool->arenaindex < maxarenas && - address != 0 && - (uptr)P - address < (uptr)ARENA_SIZE; + arenas[pool->arenaindex].address != 0 && + (uptr)P - arenas[pool->arenaindex].address < (uptr)ARENA_SIZE; } #endif From python-checkins at python.org Thu Mar 2 09:08:44 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 2 Mar 2006 09:08:44 +0100 (CET) Subject: [Python-checkins] r42780 - python/trunk/Python/compile.c Message-ID: <20060302080844.1B4A31E4002@bag.python.org> Author: neal.norwitz Date: Thu Mar 2 09:08:42 2006 New Revision: 42780 Modified: python/trunk/Python/compile.c Log: Fix refleak if from __future__ import was not first Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Thu Mar 2 09:08:42 2006 @@ -2529,6 +2529,7 @@ if (s->lineno > c->c_future->ff_lineno) { if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module), "__future__")) { + Py_DECREF(level); Py_DECREF(names); return compiler_error(c, "from __future__ imports must occur " From neal at metaslash.com Thu Mar 2 10:54:42 2006 From: neal at metaslash.com (Neal Norwitz) Date: Thu, 2 Mar 2006 04:54:42 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (2) Message-ID: <20060302095442.GA20026@python.psfb.org> test_cmd_line leaked [0, 15, 0] references test_compiler leaked [131, 48, 252] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_sys leaked [1, 1, 1] references test_threadedtempfile leaked [1, 1, 0] references test_threading_local leaked [42, 34, 42] references test_urllib2 leaked [80, -130, 70] references From python-checkins at python.org Thu Mar 2 17:45:10 2006 From: python-checkins at python.org (sean.reifschneider) Date: Thu, 2 Mar 2006 17:45:10 +0100 (CET) Subject: [Python-checkins] r42781 - peps/trunk/pep2pyramid.py Message-ID: <20060302164510.7D2591E4028@bag.python.org> Author: sean.reifschneider Date: Thu Mar 2 17:45:09 2006 New Revision: 42781 Added: peps/trunk/pep2pyramid.py (contents, props changed) Log: Kludged version. Added: peps/trunk/pep2pyramid.py ============================================================================== --- (empty file) +++ peps/trunk/pep2pyramid.py Thu Mar 2 17:45:09 2006 @@ -0,0 +1,624 @@ +#!/usr/bin/env python +"""Convert PEPs to (X)HTML - courtesy of /F + +Usage: %(PROGRAM)s [options] [ ...] + +Options: + +-u, --user + python.org username + +-b, --browse + After generating the HTML, direct your web browser to view it + (using the Python webbrowser module). If both -i and -b are + given, this will browse the on-line HTML; otherwise it will + browse the local HTML. If no pep arguments are given, this + will browse PEP 0. + +-i, --install + After generating the HTML, install it and the plaintext source file + (.txt) on python.org. In that case the user's name is used in the scp + and ssh commands, unless "-u username" is given (in which case, it is + used instead). Without -i, -u is ignored. + +-l, --local + Same as -i/--install, except install on the local machine. Use this + when logged in to the python.org machine (dinsdale). + +-q, --quiet + Turn off verbose messages. + +-h, --help + Print this help message and exit. + +The optional arguments ``peps`` are either pep numbers or .txt files. +""" + +import sys +import os +import re +import cgi +import glob +import getopt +import errno +import random +import time + +REQUIRES = {'python': '2.2', + 'docutils': '0.2.7'} +PROGRAM = sys.argv[0] +RFCURL = 'http://www.faqs.org/rfcs/rfc%d.html' +PEPURL = 'pep-%04d.html' +PEPCVSURL = ('http://svn.python.org/view/peps/trunk/pep-%04d.txt') +PEPDIRRUL = 'http://www.python.org/peps/' + + +HOST = "dinsdale.python.org" # host for update +HDIR = "/data/ftp.python.org/pub/www.python.org/peps" # target host directory +LOCALVARS = "Local Variables:" + +COMMENT = """""" + +# The generated HTML doesn't validate -- you cannot use
and

inside +#
 tags.  But if I change that, the result doesn't look very nice...
+DTD = ('')
+
+fixpat = re.compile("((https?|ftp):[-_a-zA-Z0-9/.+~:?#$=&,]+)|(pep-\d+(.txt)?)|"
+                    "(RFC[- ]?(?P\d+))|"
+                    "(PEP\s+(?P\d+))|"
+                    ".")
+
+EMPTYSTRING = ''
+SPACE = ' '
+COMMASPACE = ', '
+
+
+
+def usage(code, msg=''):
+    """Print usage message and exit.  Uses stderr if code != 0."""
+    if code == 0:
+        out = sys.stdout
+    else:
+        out = sys.stderr
+    print >> out, __doc__ % globals()
+    if msg:
+        print >> out, msg
+    sys.exit(code)
+
+
+
+def fixanchor(current, match):
+    text = match.group(0)
+    link = None
+    if (text.startswith('http:') or text.startswith('https:')
+        or text.startswith('ftp:')):
+        # Strip off trailing punctuation.  Pattern taken from faqwiz.
+        ltext = list(text)
+        while ltext:
+            c = ltext.pop()
+            if c not in '();:,.?\'"<>':
+                ltext.append(c)
+                break
+        link = EMPTYSTRING.join(ltext)
+    elif text.startswith('pep-') and text <> current:
+        link = os.path.splitext(text)[0] + ".html"
+    elif text.startswith('PEP'):
+        pepnum = int(match.group('pepnum'))
+        link = PEPURL % pepnum
+    elif text.startswith('RFC'):
+        rfcnum = int(match.group('rfcnum'))
+        link = RFCURL % rfcnum
+    if link:
+        return '%s' % (cgi.escape(link), cgi.escape(text))
+    return cgi.escape(match.group(0)) # really slow, but it works...
+
+
+
+NON_MASKED_EMAILS = [
+    'peps at python.org',
+    'python-list at python.org',
+    'python-dev at python.org',
+    ]
+
+def fixemail(address, pepno):
+    if address.lower() in NON_MASKED_EMAILS:
+        # return hyperlinked version of email address
+        return linkemail(address, pepno)
+    else:
+        # return masked version of email address
+        parts = address.split('@', 1)
+        return '%s at %s' % (parts[0], parts[1])
+
+
+def linkemail(address, pepno):
+    parts = address.split('@', 1)
+    return (''
+            '%s at %s'
+            % (parts[0], parts[1], pepno, parts[0], parts[1]))
+
+
+def fixfile(inpath, input_lines, outfile):
+    m = re.search(r'pep-(\d+)\.', inpath)
+    if not m:
+        print "Ugh, can't find PEP number in name"
+        sys.exit(1)
+    pepIn = m.group(1)
+    destDir = '/home/jafo/cvs/beta.python.org/build/data/doc/peps/'
+    destDir = os.path.join(destDir, 'pep-%s' % pepIn)
+
+    if not os.path.exists(destDir):
+        os.mkdir(destDir)
+
+        fp = open(os.path.join(destDir, 'content.html'), 'w')
+        fp.write('\n')
+        fp.write('
' + print >> outfile, '

%s

' % line.strip() + need_pre = 1 + elif not line.strip() and need_pre: + continue + else: + # PEP 0 has some special treatment + if basename == 'pep-0000.txt': + parts = line.split() + if len(parts) > 1 and re.match(r'\s*\d{1,4}', parts[1]): + # This is a PEP summary line, which we need to hyperlink + url = PEPURL % int(parts[1]) + if need_pre: + print >> outfile, '
'
+                        need_pre = 0
+                    print >> outfile, re.sub(
+                        parts[1],
+                        '%s' % (int(parts[1]),
+                            parts[1]), line, 1),
+                    continue
+                elif parts and '@' in parts[-1]:
+                    # This is a pep email address line, so filter it.
+                    url = fixemail(parts[-1], pep)
+                    if need_pre:
+                        print >> outfile, '
'
+                        need_pre = 0
+                    print >> outfile, re.sub(
+                        parts[-1], url, line, 1),
+                    continue
+            line = fixpat.sub(lambda x, c=inpath: fixanchor(c, x), line)
+            if need_pre:
+                print >> outfile, '
'
+                need_pre = 0
+            outfile.write(line)
+
+
+docutils_settings = None
+"""Runtime settings object used by Docutils.  Can be set by the client
+application when this module is imported."""
+
+def fix_rst_pep(inpath, input_lines, outfile):
+    m = re.search(r'pep-(\d+)\.', inpath)
+    if not m:
+        print "Ugh, can't find PEP number in name"
+        sys.exit(1)
+    pepIn = m.group(1)
+    destDir = '/home/jafo/cvs/beta.python.org/build/data/doc/peps/'
+    destDir = os.path.join(destDir, 'pep-%s' % pepIn)
+
+    if not os.path.exists(destDir):
+        os.mkdir(destDir)
+
+        fp = open(os.path.join(destDir, 'content.html'), 'w')
+        fp.write('\n')
+        fp.write('
 
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/mimelib.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/mimelib.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/mimelib.html Sun Mar 5 20:54:07 2006 @@ -45,7 +45,7 @@

Barry Warsaw

Release 4.0
-February 17, 2006

+March 5, 2006

@@ -122,7 +122,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Added: sandbox/trunk/emailpkg/4_0/docs/mimelib.pdf ============================================================================== Binary file. No diff available. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.charset.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.charset.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.charset.html Sun Mar 5 20:54:07 2006 @@ -67,7 +67,7 @@

- +
class Charset(class Charset( [input_charset])
Map character sets to their email properties. @@ -103,7 +103,7 @@ Charset instances have the following data attributes:

-

input_charset
+
input_charset
The initial character set specified. Common aliases are converted to their official email names (e.g. latin_1 is converted to @@ -111,7 +111,7 @@

-

header_encoding
+
header_encoding
If the character set must be encoded before it can be used in an email header, this attribute will be set to Charset.QP (for @@ -121,7 +121,7 @@

-

body_encoding
+
body_encoding
Same as header_encoding, but describes the encoding for the mail message's body, which indeed may be different than the header @@ -130,7 +130,7 @@

-

output_charset
+
output_charset
Some character sets must be converted before they can be used in email headers or bodies. If the input_charset is one of @@ -139,7 +139,7 @@

-

input_codec
+
input_codec
The name of the Python codec used to convert the input_charset to Unicode. If no conversion codec is necessary, this attribute will be @@ -147,7 +147,7 @@

-

output_codec
+
output_codec
The name of the Python codec used to convert Unicode to the output_charset. If no conversion codec is necessary, this @@ -159,7 +159,7 @@

- +
get_body_encoding(get_body_encoding( )
Return the content transfer encoding used for body encoding. @@ -180,7 +180,7 @@

- +
convert(convert( s)
Convert the string s from the input_codec to the @@ -189,7 +189,7 @@

- +
to_splittable(to_splittable( s)
Convert a possibly multibyte string to a safely splittable format. @@ -211,7 +211,7 @@

- +
from_splittable(from_splittable( ustr[, to_output])
Convert a splittable string back into an encoded string. ustr @@ -235,7 +235,7 @@

- +
get_output_charset(get_output_charset( )
Return the output character set. @@ -247,7 +247,7 @@

- +
encoded_header_len(encoded_header_len( )
Return the length of the encoded header string, properly calculating @@ -256,7 +256,7 @@

- +
header_encode(header_encode( s[, convert])
Header-encode the string s. @@ -276,7 +276,7 @@

- +
body_encode(body_encode( s[, convert])
Body-encode the string s. @@ -299,7 +299,7 @@

- +
__str__(__str__( )
Returns input_charset as a string coerced to lower case. @@ -308,7 +308,7 @@

- +
__eq__(__eq__( other)
This method allows you to compare two Charset instances for equality. @@ -316,7 +316,7 @@

- +
__ne__(__ne__( other)
This method allows you to compare two Charset instances for inequality. @@ -329,7 +329,7 @@

- +
add_charset(add_charset( charset[, header_enc[, body_enc[, output_charset]]])
@@ -368,7 +368,7 @@

- +
add_alias(add_alias( alias, canonical)
Add a character set alias. alias is the alias name, @@ -382,7 +382,7 @@

- +
add_codec(add_codec( charset, codecname)
Add a codec that map characters in the given character set to and from @@ -429,7 +429,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.encoders.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html Sun Mar 5 20:54:07 2006 @@ -71,20 +71,20 @@

- +
encode_quopri(encode_quopri( msg)
Encodes the payload into quoted-printable form and sets the Content-Transfer-Encoding: header to quoted-printable2. + HREF="#foot2098">2. This is a good encoding to use when most of your payload is normal printable data, but contains a few unprintable characters.

- +
encode_base64(encode_base64( msg)
Encodes the payload into base64 form and sets the @@ -97,7 +97,7 @@

- +
encode_7or8bit(encode_7or8bit( msg)
This doesn't actually modify the message's payload, but it does set @@ -107,7 +107,7 @@

- +
encode_noop(encode_noop( msg)
This does nothing; it doesn't even set the @@ -117,7 +117,7 @@



Footnotes

-
...quoted-printable...quoted-printable2
Note that encoding with encode_quopri() also encodes all tabs and space characters in @@ -157,7 +157,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.errors.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html Sun Mar 5 20:54:07 2006 @@ -57,7 +57,7 @@

- +
exception MessageError(exception MessageError( )
This is the base class for all exceptions that the email @@ -67,7 +67,7 @@

- +
exception MessageParseError(exception MessageParseError( )
This is the base class for exceptions thrown by the Parser @@ -76,10 +76,10 @@

- +
exception HeaderParseError(exception HeaderParseError( )
-Raised under some error conditions when parsing the RFC 2822 headers of a message, this class is derived from MessageParseError. It can be raised from the Parser.parse() or @@ -87,9 +87,9 @@

Situations where it can be raised include finding an envelope -header after the first RFC 2822 header of the message, finding a -continuation line before the first RFC 2822 header is found, or finding a line in the headers which is neither a header or a continuation line. @@ -97,10 +97,10 @@

- +
exception BoundaryError(exception BoundaryError( )
-Raised under some error conditions when parsing the RFC 2822 headers of a message, this class is derived from MessageParseError. It can be raised from the Parser.parse() or @@ -114,7 +114,7 @@

- +
exception MultipartConversionError(exception MultipartConversionError( )
Raised when a payload is added to a Message object using @@ -216,7 +216,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.generator.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html Sun Mar 5 20:54:07 2006 @@ -102,7 +102,7 @@ maxheaderlen (in characters, with tabs expanded to 8 spaces), the header will be split as defined in the email.header.Header class. Set to zero to disable header wrapping. The default is 78, as -recommended (but not required) by RFC 2822.
@@ -121,7 +121,7 @@

Optional unixfrom is a flag that forces the printing of the -envelope header delimiter before the first RFC 2822 header of the root message object. If the root object has no envelope header, a standard one is crafted. By default, this is set to False to @@ -278,7 +278,7 @@


-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.header.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.header.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.header.html Sun Mar 5 20:54:07 2006 @@ -52,12 +52,12 @@

-RFC 2822 is the base standard that describes the format of email -messages. It derives from the older RFC 822 standard which came into widespread use at a time when most email was composed of ASCII -characters only. RFC 2822 is a specification written assuming email contains only 7-bit ASCII characters. @@ -67,12 +67,12 @@ be used in email messages. The base standard still requires email messages to be transferred using only 7-bit ASCII characters, so a slew of RFCs have been written describing how to encode email -containing non-ASCII characters into RFC 2822-compliant format. -These RFCs include RFC 2045, RFC 2046, RFC 2047, and RFC 2045, RFC 2046, RFC 2047, and RFC 2231. The email package supports these standards in its email.header and email.charset modules. @@ -101,7 +101,7 @@ non-ASCII character? We did this by creating a Header instance and passing in the character set that the byte string was encoded in. When the subsequent Message instance was -flattened, the Subject: field was properly Subject: field was properly RFC 2047 encoded. MIME-aware mail readers would show this header using the embedded ISO-8859-1 character. @@ -115,7 +115,7 @@

- +
class Header(class Header( [s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
@@ -149,7 +149,7 @@ taken into account for the first line of a long, split header.

-Optional continuation_ws must be continuation_ws must be RFC 2822-compliant folding whitespace, and is usually either a space or a hard tab character. This character will be prepended to continuation lines. @@ -161,7 +161,7 @@

- +
append(append( s[, charset[, errors]])
Append the string s to the MIME header. @@ -183,8 +183,8 @@

If s is a Unicode string, then charset is a hint specifying the character set of the characters in the string. In this -case, when producing an RFC 2822-compliant header using RFC 2822-compliant header using RFC 2047 rules, the Unicode string will be encoded using the following charsets in order: us-ascii, the charset hint, utf-8. The @@ -197,16 +197,16 @@

- +
encode(encode( [splitchars])
Encode a message header into an RFC-compliant format, possibly wrapping long lines and encapsulating non-ASCII parts in base64 or quoted-printable encodings. Optional splitchars is a string containing characters to split long ASCII lines on, in rough support -of RFC 2822's highest level syntactic breaks. This doesn't -affect RFC 2047 encoded lines.
@@ -216,7 +216,7 @@

- +
__str__(__str__( )
A synonym for Header.encode(). Useful for @@ -225,7 +225,7 @@

- +
__unicode__(__unicode__( )
A helper for the built-in unicode() function. Returns the @@ -234,7 +234,7 @@

- +
__eq__(__eq__( other)
This method allows you to compare two Header instances for equality. @@ -242,7 +242,7 @@

- +
__ne__(__ne__( other)
This method allows you to compare two Header instances for inequality. @@ -254,7 +254,7 @@

- +
decode_header(decode_header( header)
Decode a message header value without converting the character set. @@ -280,7 +280,7 @@

- +
make_header(make_header( decoded_seq[, maxlinelen[, header_name[, continuation_ws]]])
@@ -333,7 +333,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.html Sun Mar 5 20:54:07 2006 @@ -60,22 +60,22 @@

The email package is a library for managing email messages, -including MIME and other RFC 2822-based message documents. It subsumes most of the functionality in several older standard modules such as rfc822, mimetools, multifile, and other non-standard packages such as mimecntl. It is specifically not designed to do any -sending of email messages to SMTP (RFC 2821), NNTP, or other servers; those are functions of modules such as smtplib and nntplib. The email package attempts to be as RFC-compliant as possible, -supporting in addition to RFC 2822, such MIME-related RFCs as -RFC 2045, RFC 2046, RFC 2047, and RFC 2045, RFC 2046, RFC 2047, and RFC 2231.

@@ -188,7 +188,7 @@


-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.iterators.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html Sun Mar 5 20:54:07 2006 @@ -59,7 +59,7 @@

- +
body_line_iterator(body_line_iterator( msg[, decode])
This iterates over all the payloads in all the subparts of msg, @@ -75,7 +75,7 @@

- +
typed_subpart_iterator(typed_subpart_iterator( msg[, maintype[, subtype]])
@@ -100,7 +100,7 @@

- +
_structure(_structure( msg[, fp[, level]])
Prints an indented representation of the content types of the @@ -167,7 +167,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.message.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.message.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.message.html Sun Mar 5 20:54:07 2006 @@ -60,7 +60,7 @@

Conceptually, a Message object consists of headers and -payloads. Headers are payloads. Headers are RFC 2822 style field names and values where the field name and value are separated by a colon. The colon is not part of either the field name or the field value. @@ -260,7 +260,7 @@

The following methods implement a mapping-like interface for accessing -the message's RFC 2822 headers. Note that there are some semantic differences between these methods and a normal mapping (i.e. dictionary) interface. For example, in a dictionary there are @@ -467,17 +467,17 @@ lower case of the form maintype/subtype. If there was no Content-Type: header in the message the default type as given by get_default_type() will be returned. Since -according to RFC 2045, messages always have a default type, get_content_type() will always return a value.

-RFC 2045 defines a message's default type to be text/plain unless it appears inside a multipart/digest container, in which case it would be message/rfc822. If the Content-Type: header -has an invalid type specification, RFC 2045 mandates that the default type be text/plain. @@ -592,7 +592,7 @@

Parameter keys are always compared case insensitively. The return value can either be a string, or a 3-tuple if the parameter was -RFC 2231 encoded. When it's a 3-tuple, the elements of the value are of the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and LANGUAGE can be None, in which case you should consider @@ -601,7 +601,7 @@

If your application doesn't care whether the parameter was encoded as in -RFC 2231, you can collapse the parameter value by calling email.Utils.collapse_rfc2231_value(), passing in the return value from get_param(). This will return a suitably decoded Unicode string @@ -639,7 +639,7 @@ parameter already exists in the header, its value will be replaced with value. If the Content-Type: header as not yet been defined for this message, it will be set to text/plain -and the new parameter value will be appended as per RFC 2045.

@@ -650,7 +650,7 @@

If optional charset is specified, the parameter will be encoded -according to RFC 2231. Optional language specifies the RFC 2231 language, defaulting to the empty string. Both charset and language should be strings. @@ -919,7 +919,7 @@


-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.mime.text.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html Sun Mar 5 20:54:07 2006 @@ -154,7 +154,38 @@

- + +
class MIMEAudio(class MIMEApplication(_data[, _subtype[, + _encoder[, **_params]]])
+
+Module: email.mime.application + +

+A subclass of MIMENonMultipart, the MIMEApplication class is +used to represent MIME message objects of major type application. +_data is a string containing the raw byte data. Optional _subtype +specifies the MIME subtype and defaults to octet-stream. + +

+Optional _encoder is a callable (i.e. function) which will +perform the actual encoding of the data for transport. This +callable takes one argument, which is the MIMEApplication instance. +It should use get_payload() and set_payload() to +change the payload to encoded form. It should also add any +Content-Transfer-Encoding: or other headers to the message +object as necessary. The default encoding is base64. See the +email.encoders module for a list of the built-in encoders. + +

+_params are passed straight through to the base class constructor. + +New in version 2.5. + +

+ +

+

+
class MIMEAudio( _audiodata[, _subtype[, _encoder[, **_params]]])
@@ -187,7 +218,7 @@

- +
class MIMEImage(class MIMEImage( _imagedata[, _subtype[, _encoder[, **_params]]])
@@ -221,7 +252,7 @@

- +
class MIMEMessage(class MIMEMessage( _msg[, _subtype])
Module: email.mime.message @@ -240,7 +271,7 @@

- +
class MIMEText(class MIMEText( _text[, _subtype[, _charset]])
Module: email.mime.text @@ -297,7 +328,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.parser.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html Sun Mar 5 20:54:07 2006 @@ -146,7 +146,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/module-email.utils.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html Sun Mar 5 20:54:07 2006 @@ -57,7 +57,7 @@

- +
quote(quote( str)
Return a new string with backslashes in str replaced by two @@ -66,7 +66,7 @@

- +
unquote(unquote( str)
Return a new string which is an unquoted version of str. @@ -77,7 +77,7 @@

- +
parseaddr(parseaddr( address)
Parse address - which should be the value of some address-containing @@ -89,7 +89,7 @@

- +
formataddr(formataddr( pair)
The inverse of parseaddr(), this takes a 2-tuple of the form @@ -100,7 +100,7 @@

- +
getaddresses(getaddresses( fieldvalues)
This method returns a list of 2-tuples of the form returned by @@ -122,14 +122,14 @@

- +
parsedate(parsedate( date)
-Attempts to parse a date according to the rules in RFC 2822. however, some mailers don't follow that format as specified, so parsedate() tries to guess correctly in such cases. -date is a string containing an date is a string containing an RFC 2822 date, such as "Mon, 20 Nov 1995 19:12:08 -0500". If it succeeds in parsing the date, parsedate() returns a 9-tuple that can be passed @@ -140,7 +140,7 @@

- +
parsedate_tz(parsedate_tz( date)
Performs the same function as parsedate(), but returns @@ -148,7 +148,7 @@ that can be passed directly to time.mktime(), and the tenth is the offset of the date's timezone from UTC (which is the official term for Greenwich Mean Time)3. If the input + HREF="#foot2387">3. If the input string has no timezone, the last element of the tuple returned is None. Note that fields 6, 7, and 8 of the result tuple are not usable. @@ -156,7 +156,7 @@

- +
mktime_tz(mktime_tz( tuple)
Turn a 10-tuple as returned by parsedate_tz() into a UTC @@ -170,10 +170,10 @@

- +
formatdate(formatdate( [timeval[, localtime][, usegmt]])
-Returns a date string as per RFC 2822, e.g.:

@@ -204,10 +204,10 @@

- +
make_msgid(make_msgid( [idstring])
-Returns a string suitable for an RFC 2822-compliant Message-ID: header. Optional idstring if given, is a string used to strengthen the uniqueness of the message id. @@ -215,19 +215,19 @@

- +
decode_rfc2231(decode_rfc2231( s)
-Decode the string s according to s according to RFC 2231.

- +
encode_rfc2231(encode_rfc2231( s[, charset[, language]])
-Encode the string s according to s according to RFC 2231. Optional charset and language, if given is the character set name and language name to use. If neither is given, s is returned @@ -237,18 +237,18 @@

- +
collapse_rfc2231_value(collapse_rfc2231_value( value[, errors[, fallback_charset]])
-When a header parameter is encoded in RFC 2231 format, Message.get_param() may return a 3-tuple containing the character set, language, and value. collapse_rfc2231_value() turns this into a unicode string. Optional errors is passed to the errors argument of the built-in unicode() function; it defaults to replace. Optional fallback_charset specifies the character set -to use if the one in the RFC 2231 header is not known by Python; it defaults to us-ascii. @@ -260,10 +260,10 @@

- +
decode_params(decode_params( params)
-Decode parameters list according to RFC 2231. params is a sequence of 2-tuples containing elements of the form (content-type, string-value). @@ -291,12 +291,12 @@



Footnotes

-
... Time)... Time)3
Note that the sign of the timezone offset is the opposite of the sign of the time.timezone variable for the same timezone; the latter variable follows the -POSIX standard while this module follows RFC 2822.
@@ -333,7 +333,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node1.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node1.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node1.html Sun Mar 5 20:54:07 2006 @@ -117,7 +117,7 @@
-Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node16.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node16.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node16.html Sun Mar 5 20:54:07 2006 @@ -70,7 +70,7 @@

    -
  • All modules have been renamed according to All modules have been renamed according to PEP 8 standards. For example, the version 3 module email.Message was renamed to email.message in version 4. @@ -262,7 +262,7 @@
    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node17.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node17.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node17.html Sun Mar 5 20:54:07 2006 @@ -191,7 +191,7 @@ a Message instance containing separate Message subparts for each header block in the delivery status notification4. + HREF="#foot2697">4.

    The Generator class has no differences in its public @@ -251,11 +251,11 @@



    Footnotes

    -
    ... +
    ... notification4
    Delivery Status Notifications (DSN) are defined -in RFC 1894.
    @@ -292,7 +292,7 @@
    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node18.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node18.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node18.html Sun Mar 5 20:54:07 2006 @@ -136,7 +136,7 @@ Here's an example of how to send the entire contents of a directory as an email message: 5 + HREF="#foot2688">5

    #!/usr/bin/env python
    @@ -337,7 +337,7 @@
     



    Footnotes

    -
    ... message:... message:5
    Thanks to Matthew Dixon Cowles for the original inspiration and examples. @@ -376,7 +376,7 @@

    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node5.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node5.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node5.html Sun Mar 5 20:54:07 2006 @@ -143,7 +143,7 @@
    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node6.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node6.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node6.html Sun Mar 5 20:54:07 2006 @@ -105,7 +105,7 @@ on file-like objects.

    -The text contained in fp must be formatted as a block of fp must be formatted as a block of RFC 2822 style headers and header continuation lines, optionally preceded by a envelope header. The header block is terminated either by the @@ -227,7 +227,7 @@


    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/docs/node7.html ============================================================================== --- sandbox/trunk/emailpkg/4.0/docs/node7.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node7.html Sun Mar 5 20:54:07 2006 @@ -125,7 +125,7 @@
    -Release 4.0, documentation updated on February 17, 2006. +Release 4.0, documentation updated on March 5, 2006. Modified: sandbox/trunk/emailpkg/4_0/manual/Makefile ============================================================================== --- sandbox/trunk/emailpkg/4.0/manual/Makefile (original) +++ sandbox/trunk/emailpkg/4_0/manual/Makefile Sun Mar 5 20:54:07 2006 @@ -1,2 +1,2 @@ all: - mkhowto --html --pdf --dir ../doc mimelib.tex + mkhowto --html --pdf --dir ../docs mimelib.tex From python-checkins at python.org Sun Mar 5 21:27:58 2006 From: python-checkins at python.org (barry.warsaw) Date: Sun, 5 Mar 2006 21:27:58 +0100 (CET) Subject: [Python-checkins] r42856 - in sandbox/trunk/emailpkg/4_0: docs/email-pkg-history.html docs/index.html docs/mimelib.html docs/mimelib.pdf docs/module-email.encoders.html docs/module-email.errors.html docs/module-email.generator.html docs/module-email.header.html docs/module-email.html docs/module-email.iterators.html docs/module-email.message.html docs/module-email.mime.text.html docs/module-email.parser.html docs/module-email.utils.html docs/node1.html docs/node17.html docs/node18.html docs/node6.html email/__init__.py manual/Makefile manual/email.tex manual/emailmimebase.tex manual/mimelib.tex Message-ID: <20060305202758.9F5561E4007@bag.python.org> Author: barry.warsaw Date: Sun Mar 5 21:27:55 2006 New Revision: 42856 Added: sandbox/trunk/emailpkg/4_0/docs/email-pkg-history.html Modified: sandbox/trunk/emailpkg/4_0/docs/index.html sandbox/trunk/emailpkg/4_0/docs/mimelib.html sandbox/trunk/emailpkg/4_0/docs/mimelib.pdf sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html sandbox/trunk/emailpkg/4_0/docs/module-email.header.html sandbox/trunk/emailpkg/4_0/docs/module-email.html sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html sandbox/trunk/emailpkg/4_0/docs/module-email.message.html sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html sandbox/trunk/emailpkg/4_0/docs/node1.html sandbox/trunk/emailpkg/4_0/docs/node17.html sandbox/trunk/emailpkg/4_0/docs/node18.html sandbox/trunk/emailpkg/4_0/docs/node6.html sandbox/trunk/emailpkg/4_0/email/__init__.py sandbox/trunk/emailpkg/4_0/manual/Makefile sandbox/trunk/emailpkg/4_0/manual/email.tex sandbox/trunk/emailpkg/4_0/manual/emailmimebase.tex sandbox/trunk/emailpkg/4_0/manual/mimelib.tex Log: Updated documentation. Bump to 4.0a2 and ready for upload and release. Added: sandbox/trunk/emailpkg/4_0/docs/email-pkg-history.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/4_0/docs/email-pkg-history.html Sun Mar 5 21:27:55 2006 @@ -0,0 +1,294 @@ + + + + + + + + + + + + +2.11 Package History + + + + + +

    +
    +2.11 Package History +

    + +

    +This table describes the release history of the email package, corresponding +to the version of Python that the package was released with. For purposes of +this document, when you see a note about change or added versions, these refer +to the Python version the change was made it, not the email package +version. This table also describes the Python compatibility of each version +of the package. + +

    +

    + + + + + + + + + + + + + + + + + + + + +
    email versiondistributed withcompatible with
    1.xPython 2.2.0 to Python 2.2.1no longer supported
    2.5Python 2.2.2+ and Python 2.3Python 2.1 to 2.5
    3.0Python 2.4Python 2.3 to 2.5
    4.0Python 2.5Python 2.3 to 2.5
    + +

    +Here are the major differences between email verson 4 and version 3: + +

    + +

      +
    • All modules have been renamed according to PEP 8 standards. For + example, the version 3 module email.Message was renamed to + email.message in version 4. + +

      +

    • +
    • A new subpackage email.mime was added and all the version 3 + email.MIME* modules were renamed and situated into the + email.mime subpackage. For example, the version 3 module + email.MIMEText was renamed to email.mime.text. + +

      +Note that the version 3 names will continue to work until Python + 2.6. + +

      +

    • +
    • The email.mime.application module was added, which contains the + MIMEApplication class. + +

      +

    • +
    • Methods that were deprecated in version 3 have been removed. These + include Generator.__call__(), Message.get_type(), + Message.get_main_type(), Message.get_subtype(). +
    • +
    + +

    +Here are the major differences between email version 3 and version 2: + +

    + +

      +
    • The FeedParser class was introduced, and the Parser + class was implemented in terms of the FeedParser. All parsing + therefore is non-strict, and parsing will make a best effort never to + raise an exception. Problems found while parsing messages are stored in + the message's defect attribute. + +

      +

    • +
    • All aspects of the API which raised DeprecationWarnings in + version 2 have been removed. These include the _encoder argument + to the MIMEText constructor, the Message.add_payload() + method, the Utils.dump_address_pair() function, and the + functions Utils.decode() and Utils.encode(). + +

      +

    • +
    • New DeprecationWarnings have been added to: + Generator.__call__(), Message.get_type(), + Message.get_main_type(), Message.get_subtype(), and + the strict argument to the Parser class. These are + expected to be removed in future versions. + +

      +

    • +
    • Support for Pythons earlier than 2.3 has been removed. +
    • +
    + +

    +Here are the differences between email version 2 and version 1: + +

    + +

      +
    • The email.Header and email.Charset modules + have been added. + +

      +

    • +
    • The pickle format for Message instances has changed. + Since this was never (and still isn't) formally defined, this + isn't considered a backward incompatibility. However if your + application pickles and unpickles Message instances, be + aware that in email version 2, Message + instances now have private variables _charset and + _default_type. + +

      +

    • +
    • Several methods in the Message class have been + deprecated, or their signatures changed. Also, many new methods + have been added. See the documentation for the Message + class for details. The changes should be completely backward + compatible. + +

      +

    • +
    • The object structure has changed in the face of + message/rfc822 content types. In email + version 1, such a type would be represented by a scalar payload, + i.e. the container message's is_multipart() returned + false, get_payload() was not a list object, but a single + Message instance. + +

      +This structure was inconsistent with the rest of the package, so + the object representation for message/rfc822 content + types was changed. In email version 2, the container + does return True from is_multipart(), and + get_payload() returns a list containing a single + Message item. + +

      +Note that this is one place that backward compatibility could + not be completely maintained. However, if you're already + testing the return type of get_payload(), you should be + fine. You just need to make sure your code doesn't do a + set_payload() with a Message instance on a + container with a content type of message/rfc822. + +

      +

    • +
    • The Parser constructor's strict argument was + added, and its parse() and parsestr() methods + grew a headersonly argument. The strict flag was + also added to functions email.message_from_file() + and email.message_from_string(). + +

      +

    • +
    • Generator.__call__() is deprecated; use + Generator.flatten() instead. The Generator + class has also grown the clone() method. + +

      +

    • +
    • The DecodedGenerator class in the + email.Generator module was added. + +

      +

    • +
    • The intermediate base classes MIMENonMultipart and + MIMEMultipart have been added, and interposed in the + class hierarchy for most of the other MIME-related derived + classes. + +

      +

    • +
    • The _encoder argument to the MIMEText constructor + has been deprecated. Encoding now happens implicitly based + on the _charset argument. + +

      +

    • +
    • The following functions in the email.Utils module have + been deprecated: dump_address_pairs(), + decode(), and encode(). The following + functions have been added to the module: + make_msgid(), decode_rfc2231(), + encode_rfc2231(), and decode_params(). + +

      +

    • +
    • The non-public function email.Iterators._structure() + was added. +
    • +
    + +

    + +

    + + + + Modified: sandbox/trunk/emailpkg/4_0/docs/index.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/index.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/index.html Sun Mar 5 21:27:55 2006 @@ -87,7 +87,7 @@
  • 2.8 Exception and Defect classes
  • 2.9 Miscellaneous utilities
  • 2.10 Iterators -
  • 2.11 Package History +
  • 2.11 Package History
  • 2.12 Differences from mimelib
  • 2.13 Examples
Modified: sandbox/trunk/emailpkg/4_0/docs/mimelib.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/mimelib.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/mimelib.html Sun Mar 5 21:27:55 2006 @@ -87,7 +87,7 @@
  • 2.8 Exception and Defect classes
  • 2.9 Miscellaneous utilities
  • 2.10 Iterators -
  • 2.11 Package History +
  • 2.11 Package History
  • 2.12 Differences from mimelib
  • 2.13 Examples Modified: sandbox/trunk/emailpkg/4_0/docs/mimelib.pdf ============================================================================== Binary files. No diff available. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.encoders.html Sun Mar 5 21:27:55 2006 @@ -77,7 +77,7 @@ Encodes the payload into quoted-printable form and sets the Content-Transfer-Encoding: header to quoted-printable2. + HREF="#foot2099">2. This is a good encoding to use when most of your payload is normal printable data, but contains a few unprintable characters.
  • @@ -117,7 +117,7 @@



    Footnotes

    -
    ...quoted-printable...quoted-printable2
    Note that encoding with encode_quopri() also encodes all tabs and space characters in Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.errors.html Sun Mar 5 21:27:55 2006 @@ -79,7 +79,7 @@ exception HeaderParseError( )
    -Raised under some error conditions when parsing the RFC 2822 headers of a message, this class is derived from MessageParseError. It can be raised from the Parser.parse() or @@ -87,9 +87,9 @@

    Situations where it can be raised include finding an envelope -header after the first RFC 2822 header of the message, finding a -continuation line before the first RFC 2822 header is found, or finding a line in the headers which is neither a header or a continuation line. @@ -100,7 +100,7 @@ exception BoundaryError( )

    -Raised under some error conditions when parsing the RFC 2822 headers of a message, this class is derived from MessageParseError. It can be raised from the Parser.parse() or Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.generator.html Sun Mar 5 21:27:55 2006 @@ -102,7 +102,7 @@ maxheaderlen (in characters, with tabs expanded to 8 spaces), the header will be split as defined in the email.header.Header class. Set to zero to disable header wrapping. The default is 78, as -recommended (but not required) by RFC 2822.
    @@ -121,7 +121,7 @@

    Optional unixfrom is a flag that forces the printing of the -envelope header delimiter before the first RFC 2822 header of the root message object. If the root object has no envelope header, a standard one is crafted. By default, this is set to False to Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.header.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.header.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.header.html Sun Mar 5 21:27:55 2006 @@ -52,12 +52,12 @@

    -RFC 2822 is the base standard that describes the format of email -messages. It derives from the older RFC 822 standard which came into widespread use at a time when most email was composed of ASCII -characters only. RFC 2822 is a specification written assuming email contains only 7-bit ASCII characters. @@ -67,12 +67,12 @@ be used in email messages. The base standard still requires email messages to be transferred using only 7-bit ASCII characters, so a slew of RFCs have been written describing how to encode email -containing non-ASCII characters into RFC 2822-compliant format. -These RFCs include RFC 2045, RFC 2046, RFC 2047, and RFC 2045, RFC 2046, RFC 2047, and RFC 2231. The email package supports these standards in its email.header and email.charset modules. @@ -101,7 +101,7 @@ non-ASCII character? We did this by creating a Header instance and passing in the character set that the byte string was encoded in. When the subsequent Message instance was -flattened, the Subject: field was properly Subject: field was properly RFC 2047 encoded. MIME-aware mail readers would show this header using the embedded ISO-8859-1 character. @@ -149,7 +149,7 @@ taken into account for the first line of a long, split header.

    -Optional continuation_ws must be continuation_ws must be RFC 2822-compliant folding whitespace, and is usually either a space or a hard tab character. This character will be prepended to continuation lines. @@ -183,8 +183,8 @@

    If s is a Unicode string, then charset is a hint specifying the character set of the characters in the string. In this -case, when producing an RFC 2822-compliant header using RFC 2822-compliant header using RFC 2047 rules, the Unicode string will be encoded using the following charsets in order: us-ascii, the charset hint, utf-8. The @@ -204,9 +204,9 @@ wrapping long lines and encapsulating non-ASCII parts in base64 or quoted-printable encodings. Optional splitchars is a string containing characters to split long ASCII lines on, in rough support -of RFC 2822's highest level syntactic breaks. This doesn't -affect RFC 2047 encoded lines.

    Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.html Sun Mar 5 21:27:55 2006 @@ -60,22 +60,22 @@

    The email package is a library for managing email messages, -including MIME and other RFC 2822-based message documents. It subsumes most of the functionality in several older standard modules such as rfc822, mimetools, multifile, and other non-standard packages such as mimecntl. It is specifically not designed to do any -sending of email messages to SMTP (RFC 2821), NNTP, or other servers; those are functions of modules such as smtplib and nntplib. The email package attempts to be as RFC-compliant as possible, -supporting in addition to RFC 2822, such MIME-related RFCs as -RFC 2045, RFC 2046, RFC 2047, and RFC 2045, RFC 2046, RFC 2047, and RFC 2231.

    @@ -149,7 +149,7 @@

  • 2.8 Exception and Defect classes
  • 2.9 Miscellaneous utilities
  • 2.10 Iterators -
  • 2.11 Package History +
  • 2.11 Package History
  • 2.12 Differences from mimelib
  • 2.13 Examples Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.iterators.html Sun Mar 5 21:27:55 2006 @@ -5,10 +5,10 @@ - + - + 2.10 Iterators @@ -24,7 +24,7 @@ href="module-email.html">Up One Level email Package Reference Up: 2 email Next: - +
    @@ -147,7 +147,7 @@ href="module-email.html">Up One Level email Package Reference Up: 2 email Next: - +
    Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.message.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.message.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.message.html Sun Mar 5 21:27:55 2006 @@ -60,7 +60,7 @@

    Conceptually, a Message object consists of headers and -payloads. Headers are payloads. Headers are RFC 2822 style field names and values where the field name and value are separated by a colon. The colon is not part of either the field name or the field value. @@ -260,7 +260,7 @@

    The following methods implement a mapping-like interface for accessing -the message's RFC 2822 headers. Note that there are some semantic differences between these methods and a normal mapping (i.e. dictionary) interface. For example, in a dictionary there are @@ -467,17 +467,17 @@ lower case of the form maintype/subtype. If there was no Content-Type: header in the message the default type as given by get_default_type() will be returned. Since -according to RFC 2045, messages always have a default type, get_content_type() will always return a value.

    -RFC 2045 defines a message's default type to be text/plain unless it appears inside a multipart/digest container, in which case it would be message/rfc822. If the Content-Type: header -has an invalid type specification, RFC 2045 mandates that the default type be text/plain. @@ -592,7 +592,7 @@

    Parameter keys are always compared case insensitively. The return value can either be a string, or a 3-tuple if the parameter was -RFC 2231 encoded. When it's a 3-tuple, the elements of the value are of the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and LANGUAGE can be None, in which case you should consider @@ -601,7 +601,7 @@

    If your application doesn't care whether the parameter was encoded as in -RFC 2231, you can collapse the parameter value by calling email.Utils.collapse_rfc2231_value(), passing in the return value from get_param(). This will return a suitably decoded Unicode string @@ -639,7 +639,7 @@ parameter already exists in the header, its value will be replaced with value. If the Content-Type: header as not yet been defined for this message, it will be set to text/plain -and the new parameter value will be appended as per RFC 2045.

    @@ -650,7 +650,7 @@

    If optional charset is specified, the parameter will be encoded -according to RFC 2231. Optional language specifies the RFC 2231 language, defaulting to the empty string. Both charset and language should be strings. Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.mime.text.html Sun Mar 5 21:27:55 2006 @@ -121,7 +121,7 @@ [subtype[, boundary[, _subparts[, _params]]]])

    -Module: email.mmime.multipart +Module: email.mime.multipart

    A subclass of MIMEBase, this is an intermediate base class for Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.parser.html Sun Mar 5 21:27:55 2006 @@ -79,7 +79,7 @@ an email message from a socket). The FeedParser can consume and parse the message incrementally, and only returns the root object when you close the parser1. + HREF="#foot977">1.

    Note that the parser can be extended in limited ways, and of course @@ -91,7 +91,7 @@



    Footnotes

    -
    ... +
    ... parser1
    As of email package version 3.0, introduced in Modified: sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/module-email.utils.html Sun Mar 5 21:27:55 2006 @@ -125,11 +125,11 @@ parsedate( date)
    -Attempts to parse a date according to the rules in RFC 2822. however, some mailers don't follow that format as specified, so parsedate() tries to guess correctly in such cases. -date is a string containing an date is a string containing an RFC 2822 date, such as "Mon, 20 Nov 1995 19:12:08 -0500". If it succeeds in parsing the date, parsedate() returns a 9-tuple that can be passed @@ -148,7 +148,7 @@ that can be passed directly to time.mktime(), and the tenth is the offset of the date's timezone from UTC (which is the official term for Greenwich Mean Time)3. If the input + HREF="#foot2388">3. If the input string has no timezone, the last element of the tuple returned is None. Note that fields 6, 7, and 8 of the result tuple are not usable. @@ -173,7 +173,7 @@ formatdate( [timeval[, localtime][, usegmt]])
    -Returns a date string as per RFC 2822, e.g.:

    @@ -207,7 +207,7 @@ make_msgid( [idstring])

    -Returns a string suitable for an RFC 2822-compliant Message-ID: header. Optional idstring if given, is a string used to strengthen the uniqueness of the message id. @@ -218,7 +218,7 @@ decode_rfc2231( s)
    -Decode the string s according to s according to RFC 2231.
    @@ -227,7 +227,7 @@ encode_rfc2231( s[, charset[, language]])
    -Encode the string s according to s according to RFC 2231. Optional charset and language, if given is the character set name and language name to use. If neither is given, s is returned @@ -241,14 +241,14 @@ value[, errors[, fallback_charset]])
    -When a header parameter is encoded in RFC 2231 format, Message.get_param() may return a 3-tuple containing the character set, language, and value. collapse_rfc2231_value() turns this into a unicode string. Optional errors is passed to the errors argument of the built-in unicode() function; it defaults to replace. Optional fallback_charset specifies the character set -to use if the one in the RFC 2231 header is not known by Python; it defaults to us-ascii. @@ -263,7 +263,7 @@ decode_params( params)
    -Decode parameters list according to RFC 2231. params is a sequence of 2-tuples containing elements of the form (content-type, string-value). @@ -291,12 +291,12 @@



    Footnotes

    -
    ... Time)... Time)3
    Note that the sign of the timezone offset is the opposite of the sign of the time.timezone variable for the same timezone; the latter variable follows the -POSIX standard while this module follows RFC 2822.
    Modified: sandbox/trunk/emailpkg/4_0/docs/node1.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/node1.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node1.html Sun Mar 5 21:27:55 2006 @@ -71,7 +71,8 @@
    • Deprecation and ``version added'' notes are relative to the - Python version a feature was added or deprecated. + Python version a feature was added or deprecated. See + the package history in section 2.11 for details.

    • Modified: sandbox/trunk/emailpkg/4_0/docs/node17.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/node17.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node17.html Sun Mar 5 21:27:55 2006 @@ -6,7 +6,7 @@ - + @@ -18,7 +18,7 @@
      Previous: - + Up: 2 email Next: @@ -191,7 +191,7 @@ a Message instance containing separate Message subparts for each header block in the delivery status notification4. + HREF="#foot2719">4.

      The Generator class has no differences in its public @@ -251,11 +251,11 @@



      Footnotes

      -
      ... +
      ... notification4
      Delivery Status Notifications (DSN) are defined -in RFC 1894.
      @@ -266,7 +266,7 @@
      Previous: - + Up: 2 email Next: Modified: sandbox/trunk/emailpkg/4_0/docs/node18.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/node18.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node18.html Sun Mar 5 21:27:55 2006 @@ -136,7 +136,7 @@ Here's an example of how to send the entire contents of a directory as an email message: 5 + HREF="#foot2708">5

      #!/usr/bin/env python
      @@ -337,7 +337,7 @@
       



      Footnotes

      -
      ... message:... message:5
      Thanks to Matthew Dixon Cowles for the original inspiration and examples. Modified: sandbox/trunk/emailpkg/4_0/docs/node6.html ============================================================================== --- sandbox/trunk/emailpkg/4_0/docs/node6.html (original) +++ sandbox/trunk/emailpkg/4_0/docs/node6.html Sun Mar 5 21:27:55 2006 @@ -105,7 +105,7 @@ on file-like objects.

      -The text contained in fp must be formatted as a block of fp must be formatted as a block of RFC 2822 style headers and header continuation lines, optionally preceded by a envelope header. The header block is terminated either by the Modified: sandbox/trunk/emailpkg/4_0/email/__init__.py ============================================================================== --- sandbox/trunk/emailpkg/4_0/email/__init__.py (original) +++ sandbox/trunk/emailpkg/4_0/email/__init__.py Sun Mar 5 21:27:55 2006 @@ -4,7 +4,7 @@ """A package for parsing, handling, and generating email messages.""" -__version__ = '4.0a1' +__version__ = '4.0a2' __all__ = [ # Old names Modified: sandbox/trunk/emailpkg/4_0/manual/Makefile ============================================================================== --- sandbox/trunk/emailpkg/4_0/manual/Makefile (original) +++ sandbox/trunk/emailpkg/4_0/manual/Makefile Sun Mar 5 21:27:55 2006 @@ -1,2 +1,3 @@ all: mkhowto --html --pdf --dir ../docs mimelib.tex + mv -f mimelib.pdf ../docs Modified: sandbox/trunk/emailpkg/4_0/manual/email.tex ============================================================================== --- sandbox/trunk/emailpkg/4_0/manual/email.tex (original) +++ sandbox/trunk/emailpkg/4_0/manual/email.tex Sun Mar 5 21:27:55 2006 @@ -89,18 +89,21 @@ \subsection{Iterators} \input{emailiter} -\subsection{Package History} +\subsection{Package History\label{email-pkg-history}} -Version 1 of the \module{email} package was bundled with Python -releases up to Python 2.2.1. Version 2 was developed for the Python -2.3 release, and backported to Python 2.2.2. It was also available as -a separate distutils-based package, and is compatible back to Python 2.1. - -\module{email} version 3.0 was released with Python 2.4 and as a separate -distutils-based package. It is compatible back to Python 2.3. - -\module{email} version 4.0 was released with Python 2.5 and as a separate -distutils-based package. It is also compatible back to Python 2.3. +This table describes the release history of the email package, corresponding +to the version of Python that the package was released with. For purposes of +this document, when you see a note about change or added versions, these refer +to the Python version the change was made it, \emph{not} the email package +version. This table also describes the Python compatibility of each version +of the package. + +\begin{tableiii}{l|l|l}{constant}{email version}{distributed with}{compatible with} +\lineiii{1.x}{Python 2.2.0 to Python 2.2.1}{\emph{no longer supported}} +\lineiii{2.5}{Python 2.2.2+ and Python 2.3}{Python 2.1 to 2.5} +\lineiii{3.0}{Python 2.4}{Python 2.3 to 2.5} +\lineiii{4.0}{Python 2.5}{Python 2.3 to 2.5} +\end{tableiii} Here are the major differences between \module{email} verson 4 and version 3: @@ -117,6 +120,9 @@ \emph{Note that the version 3 names will continue to work until Python 2.6}. +\item The \module{email.mime.application} module was added, which contains the + \class{MIMEApplication} class. + \item Methods that were deprecated in version 3 have been removed. These include \method{Generator.__call__()}, \method{Message.get_type()}, \method{Message.get_main_type()}, \method{Message.get_subtype()}. Modified: sandbox/trunk/emailpkg/4_0/manual/emailmimebase.tex ============================================================================== --- sandbox/trunk/emailpkg/4_0/manual/emailmimebase.tex (original) +++ sandbox/trunk/emailpkg/4_0/manual/emailmimebase.tex Sun Mar 5 21:27:55 2006 @@ -57,7 +57,7 @@ \begin{classdesc}{MIMEMultipart}{\optional{subtype\optional{, boundary\optional{, _subparts\optional{, _params}}}}} -Module: \module{email.mmime.multipart} +Module: \module{email.mime.multipart} A subclass of \class{MIMEBase}, this is an intermediate base class for MIME messages that are \mimetype{multipart}. Optional \var{_subtype} Modified: sandbox/trunk/emailpkg/4_0/manual/mimelib.tex ============================================================================== --- sandbox/trunk/emailpkg/4_0/manual/mimelib.tex (original) +++ sandbox/trunk/emailpkg/4_0/manual/mimelib.tex Sun Mar 5 21:27:55 2006 @@ -51,7 +51,8 @@ \begin{itemize} \item Deprecation and ``version added'' notes are relative to the - Python version a feature was added or deprecated. + Python version a feature was added or deprecated. See + the package history in section \ref{email-pkg-history} for details. \item If you're reading this documentation as part of the standalone \module{email} package, some of the internal links to From python-checkins at python.org Sun Mar 5 21:49:55 2006 From: python-checkins at python.org (barry.warsaw) Date: Sun, 5 Mar 2006 21:49:55 +0100 (CET) Subject: [Python-checkins] r42857 - sandbox/trunk/emailpkg/4_0/MANIFEST Message-ID: <20060305204955.73CF91E4007@bag.python.org> Author: barry.warsaw Date: Sun Mar 5 21:49:53 2006 New Revision: 42857 Modified: sandbox/trunk/emailpkg/4_0/MANIFEST Log: Updated Modified: sandbox/trunk/emailpkg/4_0/MANIFEST ============================================================================== --- sandbox/trunk/emailpkg/4_0/MANIFEST (original) +++ sandbox/trunk/emailpkg/4_0/MANIFEST Sun Mar 5 21:49:53 2006 @@ -1,6 +1,6 @@ setup.py testall.py -README +README.txt email/__init__.py email/_parseaddr.py email/base64mime.py @@ -83,12 +83,14 @@ docs/contents.png docs/email-dir.txt docs/email-mime.txt +docs/email-pkg-history.html docs/email-simple.txt docs/email-unpack.txt docs/index.html docs/index.png docs/mimelib.css docs/mimelib.html +docs/mimelib.pdf docs/module-email.charset.html docs/module-email.encoders.html docs/module-email.errors.html @@ -112,3 +114,20 @@ docs/previous.png docs/pyfav.png docs/up.png +manual/Makefile +manual/email-dir.py +manual/email-mime.py +manual/email-simple.py +manual/email-unpack.py +manual/email.tex +manual/emailcharsets.tex +manual/emailencoders.tex +manual/emailexc.tex +manual/emailgenerator.tex +manual/emailheaders.tex +manual/emailiter.tex +manual/emailmessage.tex +manual/emailmimebase.tex +manual/emailparser.tex +manual/emailutil.tex +manual/mimelib.tex From neal at metaslash.com Sun Mar 5 22:54:09 2006 From: neal at metaslash.com (Neal Norwitz) Date: Sun, 5 Mar 2006 16:54:09 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060305215409.GA7545@python.psfb.org> test_cmd_line leaked [0, 15, 0] references test_compiler leaked [80, 73, 185] references test_generators leaked [255, 255, 255] references test_socket leaked [0, 0, 197] references test_threadedtempfile leaked [4, 2, 3] references test_threading leaked [1, 0, 0] references test_threading_local leaked [27, 27, 27] references test_urllib2 leaked [80, -130, 70] references From python-checkins at python.org Mon Mar 6 01:23:07 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 01:23:07 +0100 (CET) Subject: [Python-checkins] r42858 - in sandbox/trunk/emailpkg: 2.5 2_5 3.0 3_0 Message-ID: <20060306002307.6BA581E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 01:23:06 2006 New Revision: 42858 Added: sandbox/trunk/emailpkg/2_5/ - copied from r42857, sandbox/trunk/emailpkg/2.5/ sandbox/trunk/emailpkg/3_0/ - copied from r42857, sandbox/trunk/emailpkg/3.0/ Removed: sandbox/trunk/emailpkg/2.5/ sandbox/trunk/emailpkg/3.0/ Log: Moved 2.5 to 2_5 and 3.0 to 3_0. From python-checkins at python.org Mon Mar 6 01:55:27 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 01:55:27 +0100 (CET) Subject: [Python-checkins] r42859 - python/branches/release24-maint/Lib/email/test/test_email_codecs.py Message-ID: <20060306005527.6D2021E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 01:55:25 2006 New Revision: 42859 Modified: python/branches/release24-maint/Lib/email/test/test_email_codecs.py Log: Skip codecs tests on Python 2.3. Modified: python/branches/release24-maint/Lib/email/test/test_email_codecs.py ============================================================================== --- python/branches/release24-maint/Lib/email/test/test_email_codecs.py (original) +++ python/branches/release24-maint/Lib/email/test/test_email_codecs.py Mon Mar 6 01:55:25 2006 @@ -10,6 +10,13 @@ from email.Header import Header, decode_header from email.Message import Message +# We're compatible with Python 2.3, but it doesn't have the built-in Asian +# codecs, so we have to skip all these tests. +try: + unicode('foo', 'euc-jp') +except LookupError: + raise TestSkipped + class TestEmailAsianCodecs(TestEmailBase): From python-checkins at python.org Mon Mar 6 02:06:11 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 02:06:11 +0100 (CET) Subject: [Python-checkins] r42860 - in sandbox/trunk/emailpkg/3_0: MANIFEST NEWS README README.txt docs docs/about.html docs/blank.png docs/contents.png docs/email-dir.txt docs/email-mime.txt docs/email-simple.txt docs/email-unpack.txt docs/index.dat docs/index.html docs/index.png docs/internals.pl docs/intlabels.pl docs/labels.pl docs/mimelib.css docs/mimelib.html docs/mimelib.pdf docs/module-email.Charset.html docs/module-email.Encoders.html docs/module-email.Errors.html docs/module-email.Generator.html docs/module-email.Header.html docs/module-email.Iterators.html docs/module-email.Message.html docs/module-email.Parser.html docs/module-email.Utils.html docs/module-email.html docs/modules.png docs/next.png docs/node1.html docs/node10.html docs/node11.html docs/node18.html docs/node19.html docs/node20.html docs/node4.html docs/node6.html docs/node7.html docs/node8.html docs/previous.png docs/pyfav.png docs/up.png Message-ID: <20060306010611.5E2081E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 02:05:58 2006 New Revision: 42860 Added: sandbox/trunk/emailpkg/3_0/README.txt - copied, changed from r42858, sandbox/trunk/emailpkg/3_0/README sandbox/trunk/emailpkg/3_0/docs/ sandbox/trunk/emailpkg/3_0/docs/about.html sandbox/trunk/emailpkg/3_0/docs/blank.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/contents.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/email-dir.txt sandbox/trunk/emailpkg/3_0/docs/email-mime.txt sandbox/trunk/emailpkg/3_0/docs/email-simple.txt sandbox/trunk/emailpkg/3_0/docs/email-unpack.txt sandbox/trunk/emailpkg/3_0/docs/index.dat sandbox/trunk/emailpkg/3_0/docs/index.html sandbox/trunk/emailpkg/3_0/docs/index.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/internals.pl sandbox/trunk/emailpkg/3_0/docs/intlabels.pl sandbox/trunk/emailpkg/3_0/docs/labels.pl sandbox/trunk/emailpkg/3_0/docs/mimelib.css sandbox/trunk/emailpkg/3_0/docs/mimelib.html sandbox/trunk/emailpkg/3_0/docs/mimelib.pdf (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/module-email.Charset.html sandbox/trunk/emailpkg/3_0/docs/module-email.Encoders.html sandbox/trunk/emailpkg/3_0/docs/module-email.Errors.html sandbox/trunk/emailpkg/3_0/docs/module-email.Generator.html sandbox/trunk/emailpkg/3_0/docs/module-email.Header.html sandbox/trunk/emailpkg/3_0/docs/module-email.Iterators.html sandbox/trunk/emailpkg/3_0/docs/module-email.Message.html sandbox/trunk/emailpkg/3_0/docs/module-email.Parser.html sandbox/trunk/emailpkg/3_0/docs/module-email.Utils.html sandbox/trunk/emailpkg/3_0/docs/module-email.html sandbox/trunk/emailpkg/3_0/docs/modules.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/next.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/node1.html sandbox/trunk/emailpkg/3_0/docs/node10.html sandbox/trunk/emailpkg/3_0/docs/node11.html sandbox/trunk/emailpkg/3_0/docs/node18.html sandbox/trunk/emailpkg/3_0/docs/node19.html sandbox/trunk/emailpkg/3_0/docs/node20.html sandbox/trunk/emailpkg/3_0/docs/node4.html sandbox/trunk/emailpkg/3_0/docs/node6.html sandbox/trunk/emailpkg/3_0/docs/node7.html sandbox/trunk/emailpkg/3_0/docs/node8.html sandbox/trunk/emailpkg/3_0/docs/previous.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/pyfav.png (contents, props changed) sandbox/trunk/emailpkg/3_0/docs/up.png (contents, props changed) Removed: sandbox/trunk/emailpkg/3_0/NEWS sandbox/trunk/emailpkg/3_0/README Modified: sandbox/trunk/emailpkg/3_0/MANIFEST Log: Add docs, remove NEWS, move README to README.txt. Modified: sandbox/trunk/emailpkg/3_0/MANIFEST ============================================================================== --- sandbox/trunk/emailpkg/3_0/MANIFEST (original) +++ sandbox/trunk/emailpkg/3_0/MANIFEST Mon Mar 6 02:05:58 2006 @@ -1,7 +1,6 @@ setup.py testall.py -NEWS -README +README.txt LICENSE.txt email/_compat21.py email/_compat22.py @@ -83,10 +82,15 @@ docs/email-mime.txt docs/email-simple.txt docs/email-unpack.txt +docs/index.dat docs/index.html docs/index.png +docs/internals.pl +docs/intlabels.pl +docs/labels.pl docs/mimelib.css docs/mimelib.html +docs/mimelib.pdf docs/module-email.Charset.html docs/module-email.Encoders.html docs/module-email.Errors.html @@ -110,4 +114,5 @@ docs/node7.html docs/node8.html docs/previous.png +docs/pyfav.png docs/up.png Deleted: /sandbox/trunk/emailpkg/3_0/NEWS ============================================================================== --- /sandbox/trunk/emailpkg/3_0/NEWS Mon Mar 6 02:05:58 2006 +++ (empty file) @@ -1,594 +0,0 @@ -Copyright (C) 2001-2004 Python Software Foundation - -Here is a history of user visible changes to this software. - -2.5.5 (13-May-2004) -2.5.4 -2.5.3 -2.5.2 - - Lots of bug fixes. - -2.5.1 (30-Mar-2003) - - Bug fixes and improved compatibility for Python 2.2.0. - -2.5 (21-Mar-2003) - - A few other minor bug fixes. - -2.5b1 (11-Mar-2003) - - - Message.get_payload() now recognizes various uuencoded - Content-Transfer-Encodings (e.g. x-uuencode). - - When passing decode=True to Message.get_payload() and a - low-level decoding error occurs, the payload is returned as-is - instead of raising an exception. - - - Header.__init__() and Header.append() now accept an optional - argument `errors' which is passed through to the unicode() and - ustr.encode() calls. You can use this to prevent conversion - errors by e.g. passing 'replace' or 'ignore'. - - RFC 2822 specifies that long headers should be split at the - "highest level syntactic break" possible. This can only really - be determined by the application, and the current API doesn't - support arbitrary break points. As a compromise, - Header.encode() grew a `splitchars' argument which provides some - control over splitting at higher level syntactic breaks. - - Header.decode_header() now transforms binascii.Errors into - email.Errors.HeaderParseErrors when bogus base64 data appears in - the header. - - The header splitting and folding algorithms were completely - reimplemented, especially when dealing with ASCII headers. - - We now preserve spaces between encoded and non-encode parts in - RFC 2047 headers when converting the header to Unicode. While - the RFC is technically ambiguous on this point, this is the - behavior most people expect. - - - email.Iterators.body_line_iterator() now takes an optional - decode argument, which is passed through to Message.get_payload(). - - - The MIMEText constructor used to append a newline to the _text - argument if it didn't already end in a newline. Now it doesn't. - This could theoretically break code so it should be considered - experimental for 2.5 beta 1. But it's the right fix, so we'll - keep it unless there are howls of derision. - - - The quopriMIME.header_encode() maxlinelen argument now accepts - None, which inhibits line breaking. - - - Support for Korean charsets was added to Charset.py. Also the - Charset class grew a __repr__() method. - - - Various and sundry bug fixes, improved RFC conformance, and - improved lax parsing. - -2.4.3 (14-Oct-2002) -2.4.2 (10-Oct-2002) -2.4.1 (07-Oct-2002) - - Last minute patches for the Python 2.2.2 backport. This includes - case insensitivity of character set names, patches for Windows, - and some fixes for non-splitting of unspecified 8bit header data. - -2.4 (01-Oct-2002) - - - Updated all the documentation. - - - Clarification to the semantics of Header.__init__() and - Header.append() when it gets byte strings and Unicode strings as - its first argument. When a byte string is used, the charset - must be the encoding of the string, such that unicode(s,charset) - succeeds. When a Unicode string is used, the charset is a hint, - and the first of the following to succeed is used: us-ascii, the - charset hint, utf-8. - - - A new header encoding flag has been added to the Charset - module. SHORTEST (which cannot be used for body encodings) - returns the string either quoted-printable or base64 encoding, - whichever is shortest in terms of characters. This is a good - heuristic for providing the most human readable value possible. - The utf-8 charset uses SHORTEST encoding by default now. - - - Message.get_content_charset() is a new method that returns the - charset parameter on the Content-Type header, unquoted and RFC - 2231 decoded if necessary. - - - "import email" no longer imports some sub-modules by side-effect. - - - Fixed some problems related to RFC 2231 encoding of boundary and - charset parameters on Content-Type headers. Document that - get_param() and get_params() may return values that are strings - or 3-tuples. - - - The signature of the non-public function _structure() has - changed. - -2.3.1 (13-Sep-2002) - - - Minor update to the distutils package. A file was missing in - the email-2.3.tar.gz file. - -2.3 (10-Sep-2002) - - - Added support for RFC 2231 encoding. Patch by Oleg Broytmann - (previous patch was for RFC 2231 decoding only). - - - New method Message.replace_header() which replaces the first - occurrence of a header with a new value, preserving header order - and header name case. Patch by Skip Montanaro. - - - RFC 2045, section 5.2 states that if the Content-Type: header is - invalid, it defaults to text/plain. Implement simple checks for - this in get_content_type(), get_content_maintype(), and - get_content_subtype(). These will no longer raise ValueErrors. - - - In non-strict parsing, if no start boundary can be found for a - multipart message, the entire body of the message is set as the - payload. Strict parsing such a message will still raise a - BoundaryError. - -2.2 (23-Jul-2002) - - - Better support for default content types has been added. - Specifically: - - o The following methods have been silently deprecated. At some - future release they may be unsilently deprecated: - Message.get_type(), Message.get_main_type(), - Message.get_subtype(). - - o The following methods have been added as a consistent way of - getting a message's content type: Message.get_content_type(), - Message.get_content_maintype(), Message.get_content_subtype(). - - Note that none of these methods take a `failobj' argument - because messages always have a default content type. Usually - this type is text/plain, but for messages inside a - multipart/digest container, it's message/rfc822. - - Also note that .get_content_maintype() and - .get_content_subtype() can raise ValueError exceptions if the - default content type doesn't include exactly one slash. - - - The Parser constructor's `strict' flag is exposed to - email.message_from_file() and email.message_from_string(). - Also, non-strict parsing is now the default, since that seems to - be the most useful behavior. - - - email.Header.Header.append() now allows the charset argument to - be a string, naming a character set. It will convert these to a - Charset instance automatically. - - - The test procedure has changed. See the README for details. - Also, a new torture test has been added. - - - The non-public function email.Iterators._structure() can now - take an output file object (which must be suitable for print>>). - -2.1 (09-Jul-2002) - - - Support for RFC 2231 by Oleg Broytmann was added. - - - Fixed some representational, parsing, and generation bugs with - multipart/digest and message/rfc822 messages. Now we guarantee - that the structure of such messages is something like: - - multipart/digest - message/rfc822 - text/plain (or whatever the subpart's type is) - message/rfc822 - text/plain (ditto) - - The encapsulating message/rfc822 object is a multipart of - exactly length 1. - - To preserve idempotency, the concept of a "default type" is - added to Message objects. For most messages the default type is - text/plain, except for messages at the first level inside a - multipart/digest which are message/rfc822. This default type is - not described in the Content-Type: header of the container. - - Message objects thus have new methods get_default_type() and - set_default_type(), the latter of which takes a string argument - that must be either 'text/plain' or 'message/rfc822'. - - (Some changes were also made to the non-public interface for the - Generator class.) - - - The Header class now knows how to split long non-RFC 2047 - encoded headers (i.e. us-ascii charset) in the RFC 2822 - recommended way. Splits are attempted at the "highest-level - syntactic breaks" which we define as on parameter semicolons, - followed by folding whitespace. No errors are raised if long - headers still exceed the maximum RFC 2822 header length of 998 - characters after splitting. - - - Other Header class API changes: - o All __init__() arguments have default values now. Also, a - new argument continuation_ws has been added (defaults to a - single ASCII space). - o Rich comparison __eq__ and __ne__ operators are defined - o __unicode__() for Python 2.2 by Mikhail Zabaluev - o guess_maxlinelen() method has been removed - o encode_chunks() is no longer public - - - The email.Header module has grown a function make_header() which - takes the output of decode_header() and returns a Header - instance. - - - A non-public function email.Iterators._structure() has been - added for debugging purposes. - - - MIMEMultipart.__init__() doesn't attach the subparts of the - tuple is empty (i.e. there are no subparts). Fixed a bug - related to passing in explicit boundary. - - - Anthony Baxter's patches for non-strict parsing have been added - to the Parser class. There are currently no test cases for - non-strict parsing yet. Other Parser class API changes: - o Parser.__init__() grew a strict argument, defaulting to - true for backwards compatibility. - o parse() and parsestr() both grew a headersonly argument - which tells them to stop parsing once the header block is - parsed. The file pointer is left at the start of the body. - - - For RFC 2231 support, added the following functions to the - email.Utils module: decode_rfc2231(), encode_rfc2231(), - decode_params(). - -2.0.5 (02-Jun-2002) - - - Two new class/modules MIMEMultipart and MIMENonMultipart have - been added. The former is useful as a concrete class for - creating multipart/* parts. The latter is mostly useful as a - base class for other MIME non-multipart subparts. For example, - the MIMEAudio, MIMEImage, and MIMEText clases now derive from - MIMENonMultipart. Note also that MIMENonMultipart.attach() - raises a MultipartConversionError. - - - The message structure for message/rfc822 subparts has been - changed to be more consistent. Now message/rfc822 payloads are - defined as a list containing exactly one element, the - sub-Message object. - - - The callable interface to the Generator class is now silently - deprecated in favor of the Generator.flatten() method. - __call__() can be 2-3 times slower than the equivalent normal - method. - -2.0.4 (21-May-2002) - - - Fixed a bug in email.Utils.getaddresses(). - -2.0.3 (19-May-2002) - - - Fixed some limitations that caused the Parser to not work with - CRLF style line-endings. The parser should now be able to parse - any email message with consistent line endings of \r, \n, \r\n. - - - Fixed a bug related to the semantics of the Header class - constructor. If neither maxlinelen or header_name is given, the - maximum line length is 76 by default. If maxlinelen is given, - it is always honored. If maxlinelen is not given, but - header_name is given, then a suitable default line length is - calculated. - - - Implemented a simpler testing framework. Now you just need to - run "python test.py" in the source directory. - - - Merged with the standard Python cvs tree, with compatibility - modules for working in Python 2.1 and Python 2.2. - -2.0.2 (26-Apr-2002) - - - Fix a Python 2.1.3 incompatibility in Iterators.py, - body_line_iterator(). - -2.0.1 (10-Apr-2002) - - - Minor bug fixes in the test suite. - - - One minor API change: in Header.append(), the charset is - optional, and used to default to the empty Charset(). It now - defaults to the charset given in the Header constructor. - -2.0 (08-Apr-2002) - - - Message.add_payload() is now deprecated. Instead use - Message.attach() and Message.set_payload(). The former always - ensures that the message's payload is a list object, while the - latter is used only for scalar payloads (i.e. a string or a - single Message object in the case of message/rfc822 types). - - - email.Utils.formataddr(): New function which is the inverse of - .parseaddr(); i.e. it glues a realname and an email address - together. This replaces email.Utils.dump_address_pair() which - is deprecated. - - - class Charset now has a __str__() method, and implements rich - comparison operators for comparison to lower case charset - names. - - - encode_7or8bit(): If there is no payload, set the - Content-Transfer-Encoding: value to 7bit. - - - Fixes for bugs in generating multipart messages that had exactly - zero or one subparts. - -1.2 (18-Mar-2002) - - - In the MIMEText class's constructor, the _encoder argument is - deprecated. You will get a DeprecationWarning if you try to use - it. This is because there is a fundamental conflict between - _encoder and the fact that _charset is passed to the underlying - set_payload() method. _encoder really makes no sense any more. - - - When Message.set_type() is used to set the Content-Type: header, - the MIME-Version: header is always set (overriding any existing - MIME-Version: header). - - - More liberal acceptance of parameter formatting, e.g. this is - now accepted: Content-Type: multipart/mixed; boundary = "FOO" - I.e. spaces around the = sign. - - - Bug fix in Generator related to splitting long lines in a - multiline header. - - - In class Charset, __str__() method added, as were __eq__() and - __ne__(). - - - Charset.get_body_encoding() may now return a function as well as - a string character set name. The function takes a single - argument, which is a Message instance, and may change the - Content-Transfer-Encoding: header (or do any other manipulations - on the message). - - - Charset.from_splittable() added argument to_output which is used - to specify whether the input_codec or the output_codec is used - for the conversion (by default, the output codec is used). - -1.1 (unreleased) - - - No changes since 0.97. Only the version number has changed. - -0.97 (unreleased) - - - Message.set_charset() can now take a string naming a character - set in addition to a Charset instance. In the former case, a - Charset is instantiated by passing the string to its - constructor. - - - The MIMEText constructor now passes the _charset argument to the - underlying set_charset() method. This makes things consistent - at the cost of a minor semantic change: the resulting instance - will have a Content-Transfer-Encoding: header where previously - it did not. - - - A fix for a crash when quopriMIME.encode() tried to encode a - multiline string containing a blank line. - - - New module Header.py which provides a higher level interface for - encoded email headers, such as Subject:, From:, and To:. This - module provides an abstraction for composing such headers out of - charset encoded parts, and for decoding such headers. It - properly splits lines on character boundaries even for multibyte - character sets. - - - New RFC compliant base64 and quoted-printable modules, called - base64MIME.py and quopriMIME.py. These are intended to replace - the Python standard base64.py and quopri.py modules, but are - geared toward their use conformant to the various MIME email - standards. - - - The Message class is much more character set aware and RFC - compliant: - - + set_payload() now takes a new optional charset argument - + New methods set_charset(), get_charset(), set_param(), - del_param(), set_type() - + Header parameter quoting is more RFC compliant - + get_param() and get_params() now take a new optional unquote - argument - - - The Charset module now knows about utf-8, gb2132, and big5 - codecs, the latter two of which are available independently of - Python (see the comments in this module for downloading Chinese, - Japanese, and Korean codecs). - - New Charset methods get_body_encoding(), get_output_charset(), - encoded_header_len(), header_encode(), and body_encode(). - - - The Generator now handles encoding the body, if the message - object has a character set. - - - The Utils module has new functions fix_eols() and make_msgid(). - It also includes a workaround for bugs in parseaddr() when used - with Python versions before 2.2. - - - A fix for a Parser bug when parsing multipart/* parts that - contain only a single subpart. - -0.96 (19-Nov-2001) - - - A fix for email.Utils.formatdate() for "uneven" timezones like - Australia/Adelaide and America/St_Johns. - -0.95 (09-Nov-2001) - - - A new implementation of email.Utils.formatdate() which makes it - more RFC 2822 compliant. - -0.94 (25-Oct-2001) - - - A fix for SF bug #472560, extra newlines returned by get_param() - when the separating semi-colon shows up on a continuation line - (legal, but weird). - -0.93 (17-Oct-2001) - - - Fix for SF bug #471918, generator splitting long headers - produces dupliaction. Bug report and fix contributed by Matthew - Cowles. - - - If a line could not be split on semicolons in order to produce - shorter lines, an attempt is made to split the header on folding - white space. One deficiency still: it won't try to split on - both semis and folding whitespace. Oh well. - -0.92 (14-Oct-2001) - - - Iterators.typed_subpart_iterator() should use a 'text/plain' - failobj in its get_main_type() call. - - - Added class Parser.HeaderParser which just parses headers and - leaves the message as a string payload; it does not recursively - parse the body. - -0.91 (09-Oct-2001) - - - Added the MIMEAudio class/module for audio/* MIME types. - Contributed by Anthony Baxter. - - - Fixed a bug in Message.get_all() where failobj was never - returned if no matching fields were found. - -0.90 (01-Oct-2001) - - - mimelib has been integrated with Python 2.2. A compatibility - package called email 0.90 is being made available here. It is - significantly different in API from the mimelib package. See - the README for details. mimelib as a separate package is no - longer being supported. - -0.6 (17-Sep-2001) - - - Last minute bug fixes. - -0.5 (17-Sep-2001) - - - New methods in the top-level mimelib package namespace: - + messageFromString() to create an object tree from a string. - + messageFromFile() to create an object tree from an open file. - - - New methods in the address.py module: - + encode() for encoding to RFC 2047 headers - + decode() for decoding from RFC 2047 headers - - - New methods in the Message class: - + asString() to get a flat text representation of the object - tree. - + __str__() same as asString() but includes the Unix-From - envelope header in the output. - + __contains__() for use with the `in' operator. - + attach() is a synonym for add_payload() - + getcharsets() - + getfilename() - + getboundary() - + setboundary() - + getdecodedpayload() - + getpayloadastext() - + getbodyastext() - - - Message.preamble and Message.epilogue default to None (they used - to not exist by default). - - - Changes to the Generator class: - + New optional argument `maxheaderlen' for __init__() controls - the maximum length in characters of any header line. - + write() isn't the entry point for doing the text generation - any more. This lets us make this method compatible with - file-like objects. Use __call__() semantics instead. - + Calling a Generator instance creates the plain text - message. This is the same as the old write() interface - except that the optional `unixfrom' argument now defaults to - 0. - + There is a new, undocumented semi-private interface for - extending the MIME types Generator can handle. UTSL. - - - New Encoders.py module contains some useful encoders for Image - and Text instances. - - - Text.__init__() has a new _encoder optional argument, which has - the same semantics as _encoder for Image.__init__(). - - - StringableMixin.py module has been removed, and its - functionality merged back into the Message class. - - - MessageParseError doesn't contain line numbers any more. - - - Lots of bug fixes; lots more unit tests. - -0.4 (09-Jul-2001) - - - New module/class called RFC822 which represents message/rfc822 - MIME types. This takes a single Message instance. - - - Message.getmaintype() and Message.getsubtype() will now return - failobj when the Content-Type: header doesn't have enough - information. - -0.3 (20-Apr-2001) - - - In the Image class, the _encoding argument has been changed to - _encoder. Also ImageTypeError is removed; if Image.__init__() - can't guess the image's minor type, a TypeError is raised - instead. - - - Message.getparam() and Message.getparams() have grown a new - optional argument `header'. - - - MsgReader class has grown a new method readlines() for - compatibility with Python 2.1's xreadline module. - - - The ReprMixin module and class have been renamed to - StringableMixin - - - New exception MultipartConversionError can be raised by - Message.add_payload() - - - Bug fixes - - - mimelib has been moved to SourceForge. See - http://mimelib.sourceforge.net - -0.2 (14-Feb-2001) - - - Generator constructor has a new optional argument `mangle_from_' - which is a flag. If true, the generated flat text has From_ - lines mangled in the body of messages by prepending a `>' in - front of the line. This assures that such lines are not - mistaken for Unix mailbox separators. - - - Added a new class ReprMixin for adding convenience methods - get_text() and __str__() to Message subclasses. - - - RFC 1341 (MIME) calls the blob between the closing boundary and - the end of the message, the `epilogue'. Change `postamble' to - `epilogue' in Message and Generator classes. - - - Much better conformance to RFC 1341 in the Generator. - - - Added __all__ support for "from mimelib import *" - - - Added LICENSE file, currently BSD-ish. The copyright will - eventually be transferred to the Python Software Foundation when - it is activated. - - - Bug fixes. - -0.1 (24-Jan-2001) - - Initial beta release. - - - -Local Variables: -mode: indented-text -indent-tabs-mode: nil -End: Deleted: /sandbox/trunk/emailpkg/3_0/README ============================================================================== --- /sandbox/trunk/emailpkg/3_0/README Mon Mar 6 02:05:58 2006 +++ (empty file) @@ -1,95 +0,0 @@ -email -- a mail and MIME handling package -Copyright (C) 2001-2004 Python Software Foundation - - -Introduction - - The email package is a library for managing email messages, including MIME - and other RFC 2822-based message documents. It is intended to replace - most of the functionality in several older standard modules such as - rfc822, mimetools, multifile, mimify, and MIMEWriter, and other - non-standard packages such as mimecntl. It is compliant with most of the - email related RFCs such as 2045-2047 (the MIME RFCs) and 2231. - - This version is identical to the package available in Python 2.4. It is - being made available as a standalone distutils package for use in older - Python releases. A minimum of Python 2.3 is required. Because the email - package is part of Python, it is covered by the PSF license for Python, as - described in the LICENSE.txt file. - - -Testing - - To test the email package, run the standard unit test suite from the - directory that you unpacked the source in (i.e. the directory containing - the setup.py file and this README file): - - % python testall.py - - You should see a couple of lines of dots followed by the number of tests - ran and the time the tests took. The test should end with an "OK". If - so, you're good to go. Note that the exact number of tests depends on - such things as whether you have the Japanese codecs installed or not. - - -Documentation and Examples - - The documentation can be found in the docs directory: - - docs/index.html - - If you're looking for examples, you might want to check out some - of the tests. There are a few examples in the documentation as - well. - - -Installing - - To install simply execute the following at your shell prompt: - - % python setup.py install - - If you're using Python 2.4, you've already got the latest version. - - -Acknowledgements - - A big thanks goes to Ben Gertzfield who implemented the bulk of the - multibyte support in version 1.1, as well as the RFC compliant base64 and - quoted-printable modules. - - Many thanks to these other fine folks for providing code contributions or - examples, suggestions, bug reports, feedback, encouragement, etc. - - Anthony Baxter - Martin Bless - Oleg Broytmann - Matthew Dixon Cowles - Jeff Dairiki - Quinn Dunkan - David Given - Phil Hunt - Sheila King - Martin Koch - Jason Mastaler - Andrew McNamara - Skip Montanaro - Guido van Rossum - Thomas Wouters - - Apologies to anybody I've left out (let me know!). - - -Contact Information - - The email-sig is the mailing list and community of users and developers of - the package and related Python email technologies. For more information: - - http://www.python.org/sigs/email-sig - - - -Local Variables: -mode: indented-text -indent-tabs-mode: nil -End: Copied: sandbox/trunk/emailpkg/3_0/README.txt (from r42858, sandbox/trunk/emailpkg/3_0/README) ============================================================================== --- sandbox/trunk/emailpkg/3_0/README (original) +++ sandbox/trunk/emailpkg/3_0/README.txt Mon Mar 6 02:05:58 2006 @@ -1,5 +1,5 @@ email -- a mail and MIME handling package -Copyright (C) 2001-2004 Python Software Foundation +Copyright (C) 2001-2006 Python Software Foundation Introduction Added: sandbox/trunk/emailpkg/3_0/docs/about.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/about.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,108 @@ + + + + + + + + + + +About this document ... + + +

      + + +

      +About this document ... +

      + email Package Reference, +March 5, 2006, Release 3.0 +

      This document was generated using the + LaTeX2HTML translator. +

      + +

      + LaTeX2HTML is Copyright © + 1993, 1994, 1995, 1996, 1997, Nikos + Drakos, Computer Based Learning Unit, University of + Leeds, and Copyright © 1997, 1998, Ross + Moore, Mathematics Department, Macquarie University, + Sydney. +

      + +

      The application of + LaTeX2HTML to the Python + documentation has been heavily tailored by Fred L. Drake, + Jr. Original navigation icons were contributed by Christopher + Petrilli. +

      + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/blank.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/contents.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/email-dir.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/email-dir.txt Mon Mar 6 02:05:58 2006 @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +"""Send the contents of a directory as a MIME message. + +Usage: dirmail [options] from to [to ...]* + +Options: + -h / --help + Print this message and exit. + + -d directory + --directory=directory + Mail the contents of the specified directory, otherwise use the + current directory. Only the regular files in the directory are sent, + and we don't recurse to subdirectories. + +`from' is the email address of the sender of the message. + +`to' is the email address of the recipient of the message, and multiple +recipients may be given. + +The email is sent by forwarding to your local SMTP server, which then does the +normal delivery process. Your local machine must be running an SMTP server. +""" + +import sys +import os +import getopt +import smtplib +# For guessing MIME type based on file name extension +import mimetypes + +from email import Encoders +from email.Message import Message +from email.MIMEAudio import MIMEAudio +from email.MIMEBase import MIMEBase +from email.MIMEMultipart import MIMEMultipart +from email.MIMEImage import MIMEImage +from email.MIMEText import MIMEText + +COMMASPACE = ', ' + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ + if msg: + print >> sys.stderr, msg + sys.exit(code) + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) + except getopt.error, msg: + usage(1, msg) + + dir = os.curdir + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-d', '--directory'): + dir = arg + + if len(args) < 2: + usage(1) + + sender = args[0] + recips = args[1:] + + # Create the enclosing (outer) message + outer = MIMEMultipart() + outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir) + outer['To'] = COMMASPACE.join(recips) + outer['From'] = sender + outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' + # To guarantee the message ends with a newline + outer.epilogue = '' + + for filename in os.listdir(dir): + path = os.path.join(dir, filename) + if not os.path.isfile(path): + continue + # Guess the content type based on the file's extension. Encoding + # will be ignored, although we should check for simple things like + # gzip'd or compressed files. + ctype, encoding = mimetypes.guess_type(path) + if ctype is None or encoding is not None: + # No guess could be made, or the file is encoded (compressed), so + # use a generic bag-of-bits type. + ctype = 'application/octet-stream' + maintype, subtype = ctype.split('/', 1) + if maintype == 'text': + fp = open(path) + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'image': + fp = open(path, 'rb') + msg = MIMEImage(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'audio': + fp = open(path, 'rb') + msg = MIMEAudio(fp.read(), _subtype=subtype) + fp.close() + else: + fp = open(path, 'rb') + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) + fp.close() + # Encode the payload using Base64 + Encoders.encode_base64(msg) + # Set the filename parameter + msg.add_header('Content-Disposition', 'attachment', filename=filename) + outer.attach(msg) + + # Now send the message + s = smtplib.SMTP() + s.connect() + s.sendmail(sender, recips, outer.as_string()) + s.close() + + +if __name__ == '__main__': + main() Added: sandbox/trunk/emailpkg/3_0/docs/email-mime.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/email-mime.txt Mon Mar 6 02:05:58 2006 @@ -0,0 +1,34 @@ +# Import smtplib for the actual sending function +import smtplib + +# Here are the email package modules we'll need +from email.MIMEImage import MIMEImage +from email.MIMEMultipart import MIMEMultipart + +COMMASPACE = ', ' + +# Create the container (outer) email message. +msg = MIMEMultipart() +msg['Subject'] = 'Our family reunion' +# me == the sender's email address +# family = the list of all recipients' email addresses +msg['From'] = me +msg['To'] = COMMASPACE.join(family) +msg.preamble = 'Our family reunion' +# Guarantees the message ends in a newline +msg.epilogue = '' + +# Assume we know that the image files are all in PNG format +for file in pngfiles: + # Open the files in binary mode. Let the MIMEImage class automatically + # guess the specific image type. + fp = open(file, 'rb') + img = MIMEImage(fp.read()) + fp.close() + msg.attach(img) + +# Send the email via our own SMTP server. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, family, msg.as_string()) +s.close() Added: sandbox/trunk/emailpkg/3_0/docs/email-simple.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/email-simple.txt Mon Mar 6 02:05:58 2006 @@ -0,0 +1,25 @@ +# Import smtplib for the actual sending function +import smtplib + +# Import the email modules we'll need +from email.MIMEText import MIMEText + +# Open a plain text file for reading. For this example, assume that +# the text file contains only ASCII characters. +fp = open(textfile, 'rb') +# Create a text/plain message +msg = MIMEText(fp.read()) +fp.close() + +# me == the sender's email address +# you == the recipient's email address +msg['Subject'] = 'The contents of %s' % textfile +msg['From'] = me +msg['To'] = you + +# Send the message via our own SMTP server, but don't include the +# envelope header. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, [you], msg.as_string()) +s.close() Added: sandbox/trunk/emailpkg/3_0/docs/email-unpack.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/email-unpack.txt Mon Mar 6 02:05:58 2006 @@ -0,0 +1,83 @@ +#!/usr/bin/env python + +"""Unpack a MIME message into a directory of files. + +Usage: unpackmail [options] msgfile + +Options: + -h / --help + Print this message and exit. + + -d directory + --directory=directory + Unpack the MIME message into the named directory, which will be + created if it doesn't already exist. + +msgfile is the path to the file containing the MIME message. +""" + +import sys +import os +import getopt +import errno +import mimetypes +import email + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ + if msg: + print >> sys.stderr, msg + sys.exit(code) + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) + except getopt.error, msg: + usage(1, msg) + + dir = os.curdir + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-d', '--directory'): + dir = arg + + try: + msgfile = args[0] + except IndexError: + usage(1) + + try: + os.mkdir(dir) + except OSError, e: + # Ignore directory exists error + if e.errno <> errno.EEXIST: raise + + fp = open(msgfile) + msg = email.message_from_file(fp) + fp.close() + + counter = 1 + for part in msg.walk(): + # multipart/* are just containers + if part.get_content_maintype() == 'multipart': + continue + # Applications should really sanitize the given filename so that an + # email message can't be used to overwrite important files + filename = part.get_filename() + if not filename: + ext = mimetypes.guess_extension(part.get_type()) + if not ext: + # Use a generic bag-of-bits extension + ext = '.bin' + filename = 'part-%03d%s' % (counter, ext) + counter += 1 + fp = open(os.path.join(dir, filename), 'wb') + fp.write(part.get_payload(decode=1)) + fp.close() + + +if __name__ == '__main__': + main() Added: sandbox/trunk/emailpkg/3_0/docs/index.dat ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/index.dat Mon Mar 6 02:05:58 2006 @@ -0,0 +1,133 @@ +email (standard module)###DEF0000003005 +email.Message (standard module)###DEF0000003021 +Message (class in email.Message)###0000003022 +as_string() (Message method)###0000003023 +__str__() (Message method)###0000003024 +is_multipart() (Message method)###0000003025 +set_unixfrom() (Message method)###0000003026 +get_unixfrom() (Message method)###0000003027 +attach() (Message method)###0000003028 +get_payload() (Message method)###0000003029 +set_payload() (Message method)###0000003030 +set_charset() (Message method)###0000003031 +get_charset() (Message method)###0000003032 +__len__() (Message method)###0000003033 +__contains__() (Message method)###0000003034 +__getitem__() (Message method)###0000003035 +__setitem__() (Message method)###0000003036 +__delitem__() (Message method)###0000003037 +has_key() (Message method)###0000003038 +keys() (Message method)###0000003039 +values() (Message method)###0000003040 +items() (Message method)###0000003041 +get() (Message method)###0000003042 +get_all() (Message method)###0000003043 +add_header() (Message method)###0000003044 +replace_header() (Message method)###0000003045 +get_content_type() (Message method)###0000003046 +get_content_maintype() (Message method)###0000003047 +get_content_subtype() (Message method)###0000003048 +get_default_type() (Message method)###0000003049 +set_default_type() (Message method)###0000003050 +get_params() (Message method)###0000003051 +get_param() (Message method)###0000003052 +set_param() (Message method)###0000003053 +del_param() (Message method)###0000003054 +set_type() (Message method)###0000003055 +get_filename() (Message method)###0000003056 +get_boundary() (Message method)###0000003057 +set_boundary() (Message method)###0000003058 +get_content_charset() (Message method)###0000003059 +get_charsets() (Message method)###0000003060 +walk() (Message method)###0000003061 +preamble (in module email.Message)###0000003062 +epilogue (in module email.Message)###0000003063 +defects (in module email.Message)###0000003064 +get_type() (Message method)###0000003084 +get_main_type() (Message method)###0000003085 +get_subtype() (Message method)###0000003086 +email.Parser (standard module)###DEF0000003088 +FeedParser (class in email.Parser)###0000003093 +feed() (FeedParser method)###0000003094 +close() (FeedParser method)###0000003095 +Parser (class in email.Parser)###0000003097 +parse() (Parser method)###0000003098 +parsestr() (Parser method)###0000003099 +message_from_string() (in module email.Parser)###0000003100 +message_from_file() (in module email.Parser)###0000003101 +email.Generator (standard module)###DEF0000003106 +Generator (class in email.Generator)###0000003107 +flatten() (Generator method)###0000003108 +clone() (Generator method)###0000003109 +write() (Generator method)###0000003110 +DecodedGenerator (class in email.Generator)###0000003111 +__call__() (Generator method)###0000003117 +MIMEBase (class in email.Generator)###0000003119 +MIMENonMultipart (class in email.Generator)###0000003120 +MIMEMultipart (class in email.Generator)###0000003121 +MIMEAudio (class in email.Generator)###0000003122 +MIMEImage (class in email.Generator)###0000003123 +MIMEMessage (class in email.Generator)###0000003124 +MIMEText (class in email.Generator)###0000003125 +email.Header (standard module)###DEF0000003127 +Header (class in email.Header)###0000003128 +append() (Header method)###0000003129 +encode() (Header method)###0000003130 +__str__() (Header method)###0000003131 +__unicode__() (Header method)###0000003132 +__eq__() (Header method)###0000003133 +__ne__() (Header method)###0000003134 +decode_header() (in module email.Header)###0000003135 +make_header() (in module email.Header)###0000003136 +email.Charset (standard module)###DEF0000003166 +Charset (class in email.Charset)###0000003167 +input_charset (in module email.Charset)###0000003168 +header_encoding (in module email.Charset)###0000003169 +body_encoding (in module email.Charset)###0000003170 +output_charset (in module email.Charset)###0000003171 +input_codec (in module email.Charset)###0000003172 +output_codec (in module email.Charset)###0000003173 +get_body_encoding() (Charset method)###0000003174 +convert() (Charset method)###0000003175 +to_splittable() (Charset method)###0000003176 +from_splittable() (Charset method)###0000003177 +get_output_charset() (Charset method)###0000003178 +encoded_header_len() (Charset method)###0000003179 +header_encode() (Charset method)###0000003180 +body_encode() (Charset method)###0000003181 +__str__() (Charset method)###0000003182 +__eq__() (Charset method)###0000003183 +__ne__() (Header method)###0000003184 +add_charset() (in module email.Charset)###0000003185 +add_alias() (in module email.Charset)###0000003186 +add_codec() (in module email.Charset)###0000003187 +email.Encoders (standard module)###DEF0000003189 +encode_quopri() (in module email.Encoders)###0000003190 +encode_base64() (in module email.Encoders)###0000003193 +encode_7or8bit() (in module email.Encoders)###0000003194 +encode_noop() (in module email.Encoders)###0000003195 +email.Errors (standard module)###DEF0000003198 +MessageError (exception in email.Errors)###0000003199 +MessageParseError (exception in email.Errors)###0000003200 +HeaderParseError (exception in email.Errors)###0000003201 +BoundaryError (exception in email.Errors)###0000003202 +MultipartConversionError (exception in email.Errors)###0000003203 +email.Utils (standard module)###DEF0000003213 +quote() (in module email.Utils)###0000003214 +unquote() (in module email.Utils)###0000003215 +parseaddr() (in module email.Utils)###0000003216 +formataddr() (in module email.Utils)###0000003217 +getaddresses() (in module email.Utils)###0000003218 +parsedate() (in module email.Utils)###0000003219 +parsedate_tz() (in module email.Utils)###0000003220 +mktime_tz() (in module email.Utils)###0000003225 +formatdate() (in module email.Utils)###0000003226 +make_msgid() (in module email.Utils)###0000003227 +decode_rfc2231() (in module email.Utils)###0000003228 +encode_rfc2231() (in module email.Utils)###0000003229 +collapse_rfc2231_value() (in module email.Utils)###0000003230 +decode_params() (in module email.Utils)###0000003231 +email.Iterators (standard module)###DEF0000003252 +body_line_iterator() (in module email.Iterators)###0000003253 +typed_subpart_iterator() (in module email.Iterators)###0000003254 +_structure() (in module email.Iterators)###0000003255 Added: sandbox/trunk/emailpkg/3_0/docs/index.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/index.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,136 @@ + + + + + + + + + +email Package Reference + + + + + +

      + +

      +
      +

      email Package Reference

      +

      Barry Warsaw

      +

      +

      Release 3.0
      +March 5, 2006

      +

      +
      +
      + +

      + +

      Abstract:

      +
      + The email package provides classes and utilities to create, + parse, generate, and modify email messages, conforming to all the + relevant email and MIME related RFCs. +
      +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/index.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/internals.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/internals.pl Mon Mar 6 02:05:58 2006 @@ -0,0 +1,50 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate internals original text with physical files. + + +$key = q/module-email.Utils/; +$ref_files{$key} = "$dir".q|node16.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$ref_files{$key} = "$dir".q|node15.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$ref_files{$key} = "$dir".q|node9.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$ref_files{$key} = "$dir".q|node12.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$ref_files{$key} = "$dir".q|node14.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$ref_files{$key} = "$dir".q|node17.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/about/; +$ref_files{$key} = "$dir".q|node21.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$ref_files{$key} = "$dir".q|node13.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +1; + Added: sandbox/trunk/emailpkg/3_0/docs/intlabels.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/intlabels.pl Mon Mar 6 02:05:58 2006 @@ -0,0 +1,136 @@ +%internal_labels = (); +1; # hack in case there are no entries + +$internal_labels{"l2h-1"} = "/node2.html"; +$internal_labels{"l2h-2"} = "/node3.html"; +$internal_labels{"l2h-3"} = "/node3.html"; +$internal_labels{"l2h-4"} = "/node3.html"; +$internal_labels{"l2h-5"} = "/node3.html"; +$internal_labels{"l2h-6"} = "/node3.html"; +$internal_labels{"l2h-7"} = "/node3.html"; +$internal_labels{"l2h-8"} = "/node3.html"; +$internal_labels{"l2h-9"} = "/node3.html"; +$internal_labels{"l2h-10"} = "/node3.html"; +$internal_labels{"l2h-11"} = "/node3.html"; +$internal_labels{"l2h-12"} = "/node3.html"; +$internal_labels{"l2h-13"} = "/node3.html"; +$internal_labels{"l2h-14"} = "/node3.html"; +$internal_labels{"l2h-15"} = "/node3.html"; +$internal_labels{"l2h-16"} = "/node3.html"; +$internal_labels{"l2h-17"} = "/node3.html"; +$internal_labels{"l2h-18"} = "/node3.html"; +$internal_labels{"l2h-19"} = "/node3.html"; +$internal_labels{"l2h-20"} = "/node3.html"; +$internal_labels{"l2h-21"} = "/node3.html"; +$internal_labels{"l2h-22"} = "/node3.html"; +$internal_labels{"l2h-23"} = "/node3.html"; +$internal_labels{"l2h-24"} = "/node3.html"; +$internal_labels{"l2h-25"} = "/node3.html"; +$internal_labels{"l2h-26"} = "/node3.html"; +$internal_labels{"l2h-27"} = "/node3.html"; +$internal_labels{"l2h-28"} = "/node3.html"; +$internal_labels{"l2h-29"} = "/node3.html"; +$internal_labels{"l2h-30"} = "/node3.html"; +$internal_labels{"l2h-31"} = "/node3.html"; +$internal_labels{"l2h-32"} = "/node3.html"; +$internal_labels{"l2h-33"} = "/node3.html"; +$internal_labels{"l2h-34"} = "/node3.html"; +$internal_labels{"l2h-35"} = "/node3.html"; +$internal_labels{"l2h-36"} = "/node3.html"; +$internal_labels{"l2h-37"} = "/node3.html"; +$internal_labels{"l2h-38"} = "/node3.html"; +$internal_labels{"l2h-39"} = "/node3.html"; +$internal_labels{"l2h-40"} = "/node3.html"; +$internal_labels{"l2h-41"} = "/node3.html"; +$internal_labels{"l2h-42"} = "/node3.html"; +$internal_labels{"l2h-43"} = "/node3.html"; +$internal_labels{"l2h-44"} = "/node3.html"; +$internal_labels{"l2h-45"} = "/node3.html"; +$internal_labels{"l2h-46"} = "/node4.html"; +$internal_labels{"l2h-47"} = "/node4.html"; +$internal_labels{"l2h-48"} = "/node4.html"; +$internal_labels{"l2h-49"} = "/node5.html"; +$internal_labels{"l2h-50"} = "/node6.html"; +$internal_labels{"l2h-51"} = "/node6.html"; +$internal_labels{"l2h-52"} = "/node6.html"; +$internal_labels{"l2h-53"} = "/node7.html"; +$internal_labels{"l2h-54"} = "/node7.html"; +$internal_labels{"l2h-55"} = "/node7.html"; +$internal_labels{"l2h-56"} = "/node7.html"; +$internal_labels{"l2h-57"} = "/node7.html"; +$internal_labels{"l2h-58"} = "/node9.html"; +$internal_labels{"l2h-59"} = "/node9.html"; +$internal_labels{"l2h-60"} = "/node9.html"; +$internal_labels{"l2h-61"} = "/node9.html"; +$internal_labels{"l2h-62"} = "/node9.html"; +$internal_labels{"l2h-63"} = "/node9.html"; +$internal_labels{"l2h-64"} = "/node10.html"; +$internal_labels{"l2h-65"} = "/node11.html"; +$internal_labels{"l2h-66"} = "/node11.html"; +$internal_labels{"l2h-67"} = "/node11.html"; +$internal_labels{"l2h-68"} = "/node11.html"; +$internal_labels{"l2h-69"} = "/node11.html"; +$internal_labels{"l2h-70"} = "/node11.html"; +$internal_labels{"l2h-71"} = "/node11.html"; +$internal_labels{"l2h-72"} = "/node12.html"; +$internal_labels{"l2h-73"} = "/node12.html"; +$internal_labels{"l2h-74"} = "/node12.html"; +$internal_labels{"l2h-75"} = "/node12.html"; +$internal_labels{"l2h-76"} = "/node12.html"; +$internal_labels{"l2h-77"} = "/node12.html"; +$internal_labels{"l2h-78"} = "/node12.html"; +$internal_labels{"l2h-79"} = "/node12.html"; +$internal_labels{"l2h-80"} = "/node12.html"; +$internal_labels{"l2h-81"} = "/node12.html"; +$internal_labels{"l2h-82"} = "/node13.html"; +$internal_labels{"l2h-83"} = "/node13.html"; +$internal_labels{"l2h-84"} = "/node13.html"; +$internal_labels{"l2h-85"} = "/node13.html"; +$internal_labels{"l2h-86"} = "/node13.html"; +$internal_labels{"l2h-87"} = "/node13.html"; +$internal_labels{"l2h-88"} = "/node13.html"; +$internal_labels{"l2h-89"} = "/node13.html"; +$internal_labels{"l2h-90"} = "/node13.html"; +$internal_labels{"l2h-91"} = "/node13.html"; +$internal_labels{"l2h-92"} = "/node13.html"; +$internal_labels{"l2h-93"} = "/node13.html"; +$internal_labels{"l2h-94"} = "/node13.html"; +$internal_labels{"l2h-95"} = "/node13.html"; +$internal_labels{"l2h-96"} = "/node13.html"; +$internal_labels{"l2h-97"} = "/node13.html"; +$internal_labels{"l2h-98"} = "/node13.html"; +$internal_labels{"l2h-99"} = "/node13.html"; +$internal_labels{"l2h-100"} = "/node13.html"; +$internal_labels{"l2h-101"} = "/node13.html"; +$internal_labels{"l2h-102"} = "/node13.html"; +$internal_labels{"l2h-103"} = "/node13.html"; +$internal_labels{"l2h-104"} = "/node14.html"; +$internal_labels{"l2h-105"} = "/node14.html"; +$internal_labels{"l2h-106"} = "/node14.html"; +$internal_labels{"l2h-107"} = "/node14.html"; +$internal_labels{"l2h-108"} = "/node14.html"; +$internal_labels{"l2h-109"} = "/node15.html"; +$internal_labels{"l2h-110"} = "/node15.html"; +$internal_labels{"l2h-111"} = "/node15.html"; +$internal_labels{"l2h-112"} = "/node15.html"; +$internal_labels{"l2h-113"} = "/node15.html"; +$internal_labels{"l2h-114"} = "/node15.html"; +$internal_labels{"l2h-115"} = "/node16.html"; +$internal_labels{"l2h-116"} = "/node16.html"; +$internal_labels{"l2h-117"} = "/node16.html"; +$internal_labels{"l2h-118"} = "/node16.html"; +$internal_labels{"l2h-119"} = "/node16.html"; +$internal_labels{"l2h-120"} = "/node16.html"; +$internal_labels{"l2h-121"} = "/node16.html"; +$internal_labels{"l2h-122"} = "/node16.html"; +$internal_labels{"l2h-123"} = "/node16.html"; +$internal_labels{"l2h-124"} = "/node16.html"; +$internal_labels{"l2h-125"} = "/node16.html"; +$internal_labels{"l2h-126"} = "/node16.html"; +$internal_labels{"l2h-127"} = "/node16.html"; +$internal_labels{"l2h-128"} = "/node16.html"; +$internal_labels{"l2h-129"} = "/node16.html"; +$internal_labels{"l2h-130"} = "/node17.html"; +$internal_labels{"l2h-131"} = "/node17.html"; +$internal_labels{"l2h-132"} = "/node17.html"; +$internal_labels{"l2h-133"} = "/node17.html"; Added: sandbox/trunk/emailpkg/3_0/docs/labels.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/labels.pl Mon Mar 6 02:05:58 2006 @@ -0,0 +1,97 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate labels original text with physical files. + + +$key = q/module-email.Utils/; +$external_labels{$key} = "$URL/" . q|node16.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$external_labels{$key} = "$URL/" . q|node15.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$external_labels{$key} = "$URL/" . q|node9.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$external_labels{$key} = "$URL/" . q|node12.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$external_labels{$key} = "$URL/" . q|node14.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$external_labels{$key} = "$URL/" . q|node17.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/about/; +$external_labels{$key} = "$URL/" . q|node21.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$external_labels{$key} = "$URL/" . q|node13.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +1; + + +# LaTeX2HTML 2002-2-1 (1.71) +# labels from external_latex_labels array. + + +$key = q/module-email.Utils/; +$external_latex_labels{$key} = q|2.9|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$external_latex_labels{$key} = q|2.2|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$external_latex_labels{$key} = q|2.8|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$external_latex_labels{$key} = q|2.3|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$external_latex_labels{$key} = q|2.5|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$external_latex_labels{$key} = q|2.7|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$external_latex_labels{$key} = q|2.10|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$external_latex_labels{$key} = q|2|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$external_latex_labels{$key} = q|2.6|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$external_latex_labels{$key} = q|2.1|; +$noresave{$key} = "$nosave"; + +1; + Added: sandbox/trunk/emailpkg/3_0/docs/mimelib.css ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/mimelib.css Mon Mar 6 02:05:58 2006 @@ -0,0 +1,243 @@ +/* + * The first part of this is the standard CSS generated by LaTeX2HTML, + * with the "empty" declarations removed. + */ + +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.math { font-family: "Century Schoolbook", serif; } +.math i { font-family: "Century Schoolbook", serif; + font-weight: bold } +.boldmath { font-family: "Century Schoolbook", serif; + font-weight: bold } + +/* + * Implement both fixed-size and relative sizes. + * + * I think these can be safely removed, as it doesn't appear that + * LaTeX2HTML ever generates these, even though these are carried + * over from the LaTeX2HTML stylesheet. + */ +small.xtiny { font-size : xx-small; } +small.tiny { font-size : x-small; } +small.scriptsize { font-size : smaller; } +small.footnotesize { font-size : small; } +big.xlarge { font-size : large; } +big.xxlarge { font-size : x-large; } +big.huge { font-size : larger; } +big.xhuge { font-size : xx-large; } + +/* + * Document-specific styles come next; + * these are added for the Python documentation. + * + * Note that the size specifications for the H* elements are because + * Netscape on Solaris otherwise doesn't get it right; they all end up + * the normal text size. + */ + +body { color: #000000; + background-color: #ffffff; } + +a:link:active { color: #ff0000; } +a:link:hover { background-color: #bbeeff; } +a:visited:hover { background-color: #bbeeff; } +a:visited { color: #551a8b; } +a:link { color: #0000bb; } + +h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; + font-weight: bold; } +h1 { font-size: 180%; } +h2 { font-size: 150%; } +h3, h4 { font-size: 120%; } + +/* These are section titles used in navigation links, so make sure we + * match the section header font here, even it not the weight. + */ +.sectref { font-family: avantgarde, sans-serif; } +/* And the label before the titles in navigation: */ +.navlabel { font-size: 85%; } + + +/* LaTeX2HTML insists on inserting
      elements into headers which + * are marked with \label. This little bit of CSS magic ensures that + * these elements don't cause spurious whitespace to be added. + */ +h1>br, h2>br, h3>br, +h4>br, h5>br, h6>br { display: none; } + +code, tt { font-family: "lucida typewriter", lucidatypewriter, + monospace; } +var { font-family: times, serif; + font-style: italic; + font-weight: normal; } + +.Unix { font-variant: small-caps; } + +.typelabel { font-family: lucida, sans-serif; } + +.navigation td { background-color: #99ccff; + font-weight: bold; + font-family: avantgarde, sans-serif; + font-size: 110%; } + +div.warning { background-color: #fffaf0; + border: thin solid black; + padding: 1em; + margin-left: 2em; + margin-right: 2em; } + +div.warning .label { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +div.note { background-color: #fffaf0; + border: thin solid black; + padding: 1em; + margin-left: 2em; + margin-right: 2em; } + +div.note .label { margin-right: 0.5em; + font-family: sans-serif; } + +address { font-size: 80%; } +.release-info { font-style: italic; + font-size: 80%; } + +.titlegraphic { vertical-align: top; } + +.verbatim pre { color: #00008b; + font-family: "lucida typewriter", lucidatypewriter, + monospace; + font-size: 90%; } +.verbatim { margin-left: 2em; } +.verbatim .footer { padding: 0.05in; + font-size: 85%; + background-color: #99ccff; + margin-right: 0.5in; } + +.grammar { background-color: #99ccff; + margin-right: 0.5in; + padding: 0.05in; } +.grammar-footer { padding: 0.05in; + font-size: 85%; } +.grammartoken { font-family: "lucida typewriter", lucidatypewriter, + monospace; } + +.productions { background-color: #bbeeff; } +.productions a:active { color: #ff0000; } +.productions a:link:hover { background-color: #99ccff; } +.productions a:visited:hover { background-color: #99ccff; } +.productions a:visited { color: #551a8b; } +.productions a:link { color: #0000bb; } +.productions table { vertical-align: baseline; + empty-cells: show; } +.productions > table td, +.productions > table th { padding: 2px; } +.productions > table td:first-child, +.productions > table td:last-child { + font-family: "lucida typewriter", + lucidatypewriter, + monospace; + } +/* same as the second selector above, but expressed differently for Opera */ +.productions > table td:first-child + td + td { + font-family: "lucida typewriter", + lucidatypewriter, + monospace; + vertical-align: baseline; + } +.productions > table td:first-child + td { + padding-left: 1em; + padding-right: 1em; + } +.productions > table tr { vertical-align: baseline; } + +.email { font-family: avantgarde, sans-serif; } +.mailheader { font-family: avantgarde, sans-serif; } +.mimetype { font-family: avantgarde, sans-serif; } +.newsgroup { font-family: avantgarde, sans-serif; } +.url { font-family: avantgarde, sans-serif; } +.file { font-family: avantgarde, sans-serif; } +.guilabel { font-family: avantgarde, sans-serif; } + +.realtable { border-collapse: collapse; + border-color: black; + border-style: solid; + border-width: 0px 0px 2px 0px; + empty-cells: show; + margin-left: auto; + margin-right: auto; + padding-left: 0.4em; + padding-right: 0.4em; + } +.realtable tbody { vertical-align: baseline; } +.realtable tfoot { display: table-footer-group; } +.realtable thead { background-color: #99ccff; + border-width: 0px 0px 2px 1px; + display: table-header-group; + font-family: avantgarde, sans-serif; + font-weight: bold; + vertical-align: baseline; + } +.realtable thead :first-child { + border-width: 0px 0px 2px 0px; + } +.realtable thead th { border-width: 0px 0px 2px 1px } +.realtable td, +.realtable th { border-color: black; + border-style: solid; + border-width: 0px 0px 1px 1px; + padding-left: 0.4em; + padding-right: 0.4em; + } +.realtable td:first-child, +.realtable th:first-child { + border-left-width: 0px; + vertical-align: baseline; + } +.center { text-align: center; } +.left { text-align: left; } +.right { text-align: right; } + +.refcount-info { font-style: italic; } +.refcount-info .value { font-weight: bold; + color: #006600; } + +/* + * Some decoration for the "See also:" blocks, in part inspired by some of + * the styling on Lars Marius Garshol's XSA pages. + * (The blue in the navigation bars is #99CCFF.) + */ +.seealso { background-color: #fffaf0; + border: thin solid black; + padding: 0pt 1em 4pt 1em; } + +.seealso > .heading { font-size: 110%; + font-weight: bold; } + +/* + * Class 'availability' is used for module availability statements at + * the top of modules. + */ +.availability .platform { font-weight: bold; } + + +/* + * Additional styles for the distutils package. + */ +.du-command { font-family: monospace; } +.du-option { font-family: avantgarde, sans-serif; } +.du-filevar { font-family: avantgarde, sans-serif; + font-style: italic; } +.du-xxx:before { content: "** "; + font-weight: bold; } +.du-xxx:after { content: " **"; + font-weight: bold; } + + +/* + * Some specialization for printed output. + */ + at media print { + .online-navigation { display: none; } + } Added: sandbox/trunk/emailpkg/3_0/docs/mimelib.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/mimelib.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,136 @@ + + + + + + + + + +email Package Reference + + + + + +

      + +

      +
      +

      email Package Reference

      +

      Barry Warsaw

      +

      +

      Release 3.0
      +March 5, 2006

      +

      +
      +
      + +

      + +

      Abstract:

      +
      + The email package provides classes and utilities to create, + parse, generate, and modify email messages, conforming to all the + relevant email and MIME related RFCs. +
      +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/mimelib.pdf ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Charset.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Charset.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,434 @@ + + + + + + + + + + + + +2.6 Representing character sets + + + + + +

      +2.6 Representing character sets +

      + + +

      +This module provides a class Charset for representing +character sets and character set conversions in email messages, as +well as a character set registry and several convenience methods for +manipulating this registry. Instances of Charset are used in +several other modules within the email package. + +

      + +New in version 2.2.2. + +

      +

      + +
      class Charset([input_charset])
      +
      +Map character sets to their email properties. + +

      +This class provides information about the requirements imposed on +email for a specific character set. It also provides convenience +routines for converting between character sets, given the availability +of the applicable codecs. Given a character set, it will do its best +to provide information on how to use that character set in an email +message in an RFC-compliant way. + +

      +Certain character sets must be encoded with quoted-printable or base64 +when used in email headers or bodies. Certain character sets must be +converted outright, and are not allowed in email. + +

      +Optional input_charset is as described below; it is always +coerced to lower case. After being alias normalized it is also used +as a lookup into the registry of character sets to find out the header +encoding, body encoding, and output conversion codec to be used for +the character set. For example, if +input_charset is iso-8859-1, then headers and bodies will +be encoded using quoted-printable and no output conversion codec is +necessary. If input_charset is euc-jp, then headers will +be encoded with base64, bodies will not be encoded, but output text +will be converted from the euc-jp character set to the +iso-2022-jp character set. +

      + +

      +Charset instances have the following data attributes: + +

      +

      input_charset
      +
      +The initial character set specified. Common aliases are converted to +their official email names (e.g. latin_1 is converted to +iso-8859-1). Defaults to 7-bit us-ascii. +
      + +

      +

      header_encoding
      +
      +If the character set must be encoded before it can be used in an +email header, this attribute will be set to Charset.QP (for +quoted-printable), Charset.BASE64 (for base64 encoding), or +Charset.SHORTEST for the shortest of QP or BASE64 encoding. +Otherwise, it will be None. +
      + +

      +

      body_encoding
      +
      +Same as header_encoding, but describes the encoding for the +mail message's body, which indeed may be different than the header +encoding. Charset.SHORTEST is not allowed for +body_encoding. +
      + +

      +

      output_charset
      +
      +Some character sets must be converted before they can be used in +email headers or bodies. If the input_charset is one of +them, this attribute will contain the name of the character set +output will be converted to. Otherwise, it will be None. +
      + +

      +

      input_codec
      +
      +The name of the Python codec used to convert the input_charset to +Unicode. If no conversion codec is necessary, this attribute will be +None. +
      + +

      +

      output_codec
      +
      +The name of the Python codec used to convert Unicode to the +output_charset. If no conversion codec is necessary, this +attribute will have the same value as the input_codec. +
      + +

      +Charset instances also have the following methods: + +

      +

      + +
      get_body_encoding()
      +
      +Return the content transfer encoding used for body encoding. + +

      +This is either the string "quoted-printable" or "base64"depending on the encoding used, or it is a function, in which case you +should call the function with a single argument, the Message object +being encoded. The function should then set the +Content-Transfer-Encoding: header itself to whatever is +appropriate. + +

      +Returns the string "quoted-printable" if +body_encoding is QP, returns the string +"base64" if body_encoding is BASE64, and returns the +string "7bit" otherwise. +

      + +

      +

      + +
      convert(s)
      +
      +Convert the string s from the input_codec to the +output_codec. +
      + +

      +

      + +
      to_splittable(s)
      +
      +Convert a possibly multibyte string to a safely splittable format. +s is the string to split. + +

      +Uses the input_codec to try and convert the string to Unicode, +so it can be safely split on character boundaries (even for multibyte +characters). + +

      +Returns the string as-is if it isn't known how to convert s to +Unicode with the input_charset. + +

      +Characters that could not be converted to Unicode will be replaced +with the Unicode replacement character "U+FFFD". +

      + +

      +

      + +
      from_splittable(ustr[, to_output])
      +
      +Convert a splittable string back into an encoded string. ustr +is a Unicode string to ``unsplit''. + +

      +This method uses the proper codec to try and convert the string from +Unicode back into an encoded format. Return the string as-is if it is +not Unicode, or if it could not be converted from Unicode. + +

      +Characters that could not be converted from Unicode will be replaced +with an appropriate character (usually "?"). + +

      +If to_output is True (the default), uses +output_codec to convert to an +encoded format. If to_output is False, it uses +input_codec. +

      + +

      +

      + +
      get_output_charset()
      +
      +Return the output character set. + +

      +This is the output_charset attribute if that is not None, +otherwise it is input_charset. +

      + +

      +

      + +
      encoded_header_len()
      +
      +Return the length of the encoded header string, properly calculating +for quoted-printable or base64 encoding. +
      + +

      +

      + +
      header_encode(s[, convert])
      +
      +Header-encode the string s. + +

      +If convert is True, the string will be converted from the +input charset to the output charset automatically. This is not useful +for multibyte character sets, which have line length issues (multibyte +characters must be split on a character, not a byte boundary); use the +higher-level Header class to deal with these issues (see +email.Header). convert defaults to False. + +

      +The type of encoding (base64 or quoted-printable) will be based on +the header_encoding attribute. +

      + +

      +

      + +
      body_encode(s[, convert])
      +
      +Body-encode the string s. + +

      +If convert is True (the default), the string will be +converted from the input charset to output charset automatically. +Unlike header_encode(), there are no issues with byte +boundaries and multibyte charsets in email bodies, so this is usually +pretty safe. + +

      +The type of encoding (base64 or quoted-printable) will be based on +the body_encoding attribute. +

      + +

      +The Charset class also provides a number of methods to support +standard operations and built-in functions. + +

      +

      + +
      __str__()
      +
      +Returns input_charset as a string coerced to lower case. +__repr__() is an alias for __str__(). +
      + +

      +

      + +
      __eq__(other)
      +
      +This method allows you to compare two Charset instances for equality. +
      + +

      +

      + +
      __ne__(other)
      +
      +This method allows you to compare two Charset instances for inequality. +
      + +

      +The email.Charset module also provides the following +functions for adding new entries to the global character set, alias, +and codec registries: + +

      +

      + +
      add_charset(charset[, header_enc[, + body_enc[, output_charset]]])
      +
      +Add character properties to the global registry. + +

      +charset is the input character set, and must be the canonical +name of a character set. + +

      +Optional header_enc and body_enc is either +Charset.QP for quoted-printable, Charset.BASE64 for +base64 encoding, Charset.SHORTEST for the shortest of +quoted-printable or base64 encoding, or None for no encoding. +SHORTEST is only valid for header_enc. The default is +None for no encoding. + +

      +Optional output_charset is the character set that the output +should be in. Conversions will proceed from input charset, to +Unicode, to the output charset when the method +Charset.convert() is called. The default is to output in the +same character set as the input. + +

      +Both input_charset and output_charset must have Unicode +codec entries in the module's character set-to-codec mapping; use +add_codec() to add codecs the module does +not know about. See the codecs module's documentation for +more information. + +

      +The global character set registry is kept in the module global +dictionary CHARSETS. +

      + +

      +

      + +
      add_alias(alias, canonical)
      +
      +Add a character set alias. alias is the alias name, +e.g. latin-1. canonical is the character set's canonical +name, e.g. iso-8859-1. + +

      +The global charset alias registry is kept in the module global +dictionary ALIASES. +

      + +

      +

      + +
      add_codec(charset, codecname)
      +
      +Add a codec that map characters in the given character set to and from +Unicode. + +

      +charset is the canonical name of a character set. +codecname is the name of a Python codec, as appropriate for the +second argument to the unicode() built-in, or to the +encode() method of a Unicode string. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Encoders.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Encoders.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,165 @@ + + + + + + + + + + + + +2.7 Encoders + + + + + +

      +2.7 Encoders +

      + + +

      +When creating Message objects from scratch, you often need to +encode the payloads for transport through compliant mail servers. +This is especially true for image/* and text/* +type messages containing binary data. + +

      +The email package provides some convenient encodings in its +Encoders module. These encoders are actually used by the +MIMEAudio and MIMEImage class constructors to provide default +encodings. All encoder functions take exactly one argument, the message +object to encode. They usually extract the payload, encode it, and reset the +payload to this newly encoded value. They should also set the +Content-Transfer-Encoding: header as appropriate. + +

      +Here are the encoding functions provided: + +

      +

      + +
      encode_quopri(msg)
      +
      +Encodes the payload into quoted-printable form and sets the +Content-Transfer-Encoding: header to +quoted-printable2. +This is a good encoding to use when most of your payload is normal +printable data, but contains a few unprintable characters. +
      + +

      +

      + +
      encode_base64(msg)
      +
      +Encodes the payload into base64 form and sets the +Content-Transfer-Encoding: header to +base64. This is a good encoding to use when most of your payload +is unprintable data since it is a more compact form than +quoted-printable. The drawback of base64 encoding is that it +renders the text non-human readable. +
      + +

      +

      + +
      encode_7or8bit(msg)
      +
      +This doesn't actually modify the message's payload, but it does set +the Content-Transfer-Encoding: header to either 7bit or +8bit as appropriate, based on the payload data. +
      + +

      +

      + +
      encode_noop(msg)
      +
      +This does nothing; it doesn't even set the +Content-Transfer-Encoding: header. +
      + +

      +


      Footnotes

      +
      +
      ...quoted-printable2
      +
      Note that encoding with +encode_quopri() also encodes all tabs and space characters in +the data. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Errors.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Errors.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,224 @@ + + + + + + + + + + + + +2.8 Exception and Defect classes + + + + + +

      +2.8 Exception and Defect classes +

      + + +

      +The following exception classes are defined in the +email.Errors module: + +

      +

      + +
      exception MessageError()
      +
      +This is the base class for all exceptions that the email +package can raise. It is derived from the standard +Exception class and defines no additional methods. +
      + +

      +

      + +
      exception MessageParseError()
      +
      +This is the base class for exceptions thrown by the Parser +class. It is derived from MessageError. +
      + +

      +

      + +
      exception HeaderParseError()
      +
      +Raised under some error conditions when parsing the RFC 2822 headers of +a message, this class is derived from MessageParseError. +It can be raised from the Parser.parse() or +Parser.parsestr() methods. + +

      +Situations where it can be raised include finding an envelope +header after the first RFC 2822 header of the message, finding a +continuation line before the first RFC 2822 header is found, or finding +a line in the headers which is neither a header or a continuation +line. +

      + +

      +

      + +
      exception BoundaryError()
      +
      +Raised under some error conditions when parsing the RFC 2822 headers of +a message, this class is derived from MessageParseError. +It can be raised from the Parser.parse() or +Parser.parsestr() methods. + +

      +Situations where it can be raised include not being able to find the +starting or terminating boundary in a multipart/* message +when strict parsing is used. +

      + +

      +

      + +
      exception MultipartConversionError()
      +
      +Raised when a payload is added to a Message object using +add_payload(), but the payload is already a scalar and the +message's Content-Type: main type is not either +multipart or missing. MultipartConversionError +multiply inherits from MessageError and the built-in +TypeError. + +

      +Since Message.add_payload() is deprecated, this exception is +rarely raised in practice. However the exception may also be raised +if the attach() method is called on an instance of a class +derived from MIMENonMultipart (e.g. MIMEImage). +

      + +

      +Here's the list of the defects that the FeedParser can find while +parsing messages. Note that the defects are added to the message where the +problem was found, so for example, if a message nested inside a +multipart/alternative had a malformed header, that nested message +object would have a defect, but the containing messages would not. + +

      +All defect classes are subclassed from email.Errors.MessageDefect, but +this class is not an exception! + +

      + +New in version 2.4: +All the defect classes were added. + +

      + +

        +
      • NoBoundaryInMultipartDefect - A message claimed to be a + multipart, but had no boundary parameter. + +

        +

      • +
      • StartBoundaryNotFoundDefect - The start boundary claimed in the + Content-Type: header was never found. + +

        +

      • +
      • FirstHeaderLineIsContinuationDefect - The message had a + continuation line as its first header line. + +

        +

      • +
      • MisplacedEnvelopeHeaderDefect - A ``Unix From'' header was found + in the middle of a header block. + +

        +

      • +
      • MalformedHeaderDefect - A header was found that was missing a + colon, or was otherwise malformed. + +

        +

      • +
      • MultipartInvariantViolationDefect - A message claimed to be a + multipart, but no subparts were found. Note that when a + message has this defect, its is_multipart() method may return + false even though its content type claims to be multipart. +
      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Generator.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Generator.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,289 @@ + + + + + + + + + + + + +2.3 Generating MIME documents + + + + + +

      +2.3 Generating MIME documents +

      + + +

      +One of the most common tasks is to generate the flat text of the email +message represented by a message object structure. You will need to do +this if you want to send your message via the smtplib +module or the nntplib module, or print the message on the +console. Taking a message object structure and producing a flat text +document is the job of the Generator class. + +

      +Again, as with the email.Parser module, you aren't limited +to the functionality of the bundled generator; you could write one +from scratch yourself. However the bundled generator knows how to +generate most email in a standards-compliant way, should handle MIME +and non-MIME email messages just fine, and is designed so that the +transformation from flat text, to a message structure via the +Parser class, and back to flat text, is idempotent (the input +is identical to the output). + +

      +Here are the public methods of the Generator class: + +

      +

      + +
      class Generator(outfp[, mangle_from_[, + maxheaderlen]])
      +
      +The constructor for the Generator class takes a file-like +object called outfp for an argument. outfp must support +the write() method and be usable as the output file in a +Python extended print statement. + +

      +Optional mangle_from_ is a flag that, when True, puts a +">" character in front of any line in the body that starts exactly as +"From ", i.e. From followed by a space at the beginning of the +line. This is the only guaranteed portable way to avoid having such +lines be mistaken for a Unix mailbox format envelope header separator (see +WHY THE CONTENT-LENGTH FORMAT IS BAD +for details). mangle_from_ defaults to True, but you +might want to set this to False if you are not writing Unix +mailbox format files. + +

      +Optional maxheaderlen specifies the longest length for a +non-continued header. When a header line is longer than +maxheaderlen (in characters, with tabs expanded to 8 spaces), +the header will be split as defined in the email.Header +class. Set to zero to disable header wrapping. The default is 78, as +recommended (but not required) by RFC 2822. +

      + +

      +The other public Generator methods are: + +

      +

      + +
      flatten(msg[, unixfrom])
      +
      +Print the textual representation of the message object structure rooted at +msg to the output file specified when the Generator +instance was created. Subparts are visited depth-first and the +resulting text will be properly MIME encoded. + +

      +Optional unixfrom is a flag that forces the printing of the +envelope header delimiter before the first RFC 2822 header of the +root message object. If the root object has no envelope header, a +standard one is crafted. By default, this is set to False to +inhibit the printing of the envelope delimiter. + +

      +Note that for subparts, no envelope header is ever printed. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      clone(fp)
      +
      +Return an independent clone of this Generator instance with +the exact same options. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      write(s)
      +
      +Write the string s to the underlying file object, +i.e. outfp passed to Generator's constructor. This +provides just enough file-like API for Generator instances to +be used in extended print statements. +
      + +

      +As a convenience, see the methods Message.as_string() and +str(aMessage), a.k.a. Message.__str__(), which +simplify the generation of a formatted string representation of a +message object. For more detail, see email.Message. + +

      +The email.Generator module also provides a derived class, +called DecodedGenerator which is like the Generator +base class, except that non-text parts are substituted with +a format string representing the part. + +

      +

      + +
      class DecodedGenerator(outfp[, mangle_from_[, + maxheaderlen[, fmt]]])
      +
      + +

      +This class, derived from Generator walks through all the +subparts of a message. If the subpart is of main type +text, then it prints the decoded payload of the subpart. +Optional _mangle_from_ and maxheaderlen are as with the +Generator base class. + +

      +If the subpart is not of main type text, optional fmt +is a format string that is used instead of the message payload. +fmt is expanded with the following keywords, "%(keyword)s"format: + +

      + +

        +
      • type - Full MIME type of the non-text part + +

        +

      • +
      • maintype - Main MIME type of the non-text part + +

        +

      • +
      • subtype - Sub-MIME type of the non-text part + +

        +

      • +
      • filename - Filename of the non-text part + +

        +

      • +
      • description - Description associated with the + non-text part + +

        +

      • +
      • encoding - Content transfer encoding of the + non-text part + +

        +

      • +
      + +

      +The default value for fmt is None, meaning + +

      +

      +[Non-text (%(type)s) part of message omitted, filename %(filename)s]
      +
      + +

      + +New in version 2.2.2. + +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Header.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Header.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,340 @@ + + + + + + + + + + + + +2.5 Internationalized headers + + + + + +

      +2.5 Internationalized headers +

      + + +

      +RFC 2822 is the base standard that describes the format of email +messages. It derives from the older RFC 822 standard which came +into widespread use at a time when most email was composed of ASCII +characters only. RFC 2822 is a specification written assuming email +contains only 7-bit ASCII characters. + +

      +Of course, as email has been deployed worldwide, it has become +internationalized, such that language specific character sets can now +be used in email messages. The base standard still requires email +messages to be transferred using only 7-bit ASCII characters, so a +slew of RFCs have been written describing how to encode email +containing non-ASCII characters into RFC 2822-compliant format. +These RFCs include RFC 2045, RFC 2046, RFC 2047, and RFC 2231. +The email package supports these standards in its +email.Header and email.Charset modules. + +

      +If you want to include non-ASCII characters in your email headers, +say in the Subject: or To: fields, you should +use the Header class and assign the field in the +Message object to an instance of Header instead of +using a string for the header value. For example: + +

      +

      +>>> from email.Message import Message
      +>>> from email.Header import Header
      +>>> msg = Message()
      +>>> h = Header('p\xf6stal', 'iso-8859-1')
      +>>> msg['Subject'] = h
      +>>> print msg.as_string()
      +Subject: =?iso-8859-1?q?p=F6stal?=
      +
      + +

      +Notice here how we wanted the Subject: field to contain a +non-ASCII character? We did this by creating a Header +instance and passing in the character set that the byte string was +encoded in. When the subsequent Message instance was +flattened, the Subject: field was properly RFC 2047 +encoded. MIME-aware mail readers would show this header using the +embedded ISO-8859-1 character. + +

      + +New in version 2.2.2. + +

      +Here is the Header class description: + +

      +

      + +
      class Header([s[, charset[, + maxlinelen[, header_name[, continuation_ws[, + errors]]]]]])
      +
      +Create a MIME-compliant header that can contain strings in different +character sets. + +

      +Optional s is the initial header value. If None (the +default), the initial header value is not set. You can later append +to the header with append() method calls. s may be a +byte string or a Unicode string, but see the append() +documentation for semantics. + +

      +Optional charset serves two purposes: it has the same meaning as +the charset argument to the append() method. It also +sets the default character set for all subsequent append() +calls that omit the charset argument. If charset is not +provided in the constructor (the default), the us-ascii +character set is used both as s's initial charset and as the +default for subsequent append() calls. + +

      +The maximum line length can be specified explicit via +maxlinelen. For splitting the first line to a shorter value (to +account for the field header which isn't included in s, +e.g. Subject:) pass in the name of the field in +header_name. The default maxlinelen is 76, and the +default value for header_name is None, meaning it is not +taken into account for the first line of a long, split header. + +

      +Optional continuation_ws must be RFC 2822-compliant folding +whitespace, and is usually either a space or a hard tab character. +This character will be prepended to continuation lines. +

      + +

      +Optional errors is passed straight through to the +append() method. + +

      +

      + +
      append(s[, charset[, errors]])
      +
      +Append the string s to the MIME header. + +

      +Optional charset, if given, should be a Charset instance +(see email.Charset) or the name of a character set, which +will be converted to a Charset instance. A value of +None (the default) means that the charset given in the +constructor is used. + +

      +s may be a byte string or a Unicode string. If it is a byte +string (i.e. isinstance(s, str) is true), then +charset is the encoding of that byte string, and a +UnicodeError will be raised if the string cannot be +decoded with that character set. + +

      +If s is a Unicode string, then charset is a hint +specifying the character set of the characters in the string. In this +case, when producing an RFC 2822-compliant header using RFC 2047 +rules, the Unicode string will be encoded using the following charsets +in order: us-ascii, the charset hint, utf-8. The +first character set to not provoke a UnicodeError is used. + +

      +Optional errors is passed through to any unicode() or +ustr.encode() call, and defaults to ``strict''. +

      + +

      +

      + +
      encode([splitchars])
      +
      +Encode a message header into an RFC-compliant format, possibly +wrapping long lines and encapsulating non-ASCII parts in base64 or +quoted-printable encodings. Optional splitchars is a string +containing characters to split long ASCII lines on, in rough support +of RFC 2822's highest level syntactic breaks. This doesn't +affect RFC 2047 encoded lines. +
      + +

      +The Header class also provides a number of methods to support +standard operators and built-in functions. + +

      +

      + +
      __str__()
      +
      +A synonym for Header.encode(). Useful for +str(aHeader). +
      + +

      +

      + +
      __unicode__()
      +
      +A helper for the built-in unicode() function. Returns the +header as a Unicode string. +
      + +

      +

      + +
      __eq__(other)
      +
      +This method allows you to compare two Header instances for equality. +
      + +

      +

      + +
      __ne__(other)
      +
      +This method allows you to compare two Header instances for inequality. +
      + +

      +The email.Header module also provides the following +convenient functions. + +

      +

      + +
      decode_header(header)
      +
      +Decode a message header value without converting the character set. +The header value is in header. + +

      +This function returns a list of (decoded_string, charset) pairs +containing each of the decoded parts of the header. charset is +None for non-encoded parts of the header, otherwise a lower +case string containing the name of the character set specified in the +encoded string. + +

      +Here's an example: + +

      +

      +>>> from email.Header import decode_header
      +>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
      +[('p\xf6stal', 'iso-8859-1')]
      +
      +
      + +

      +

      + +
      make_header(decoded_seq[, maxlinelen[, + header_name[, continuation_ws]]])
      +
      +Create a Header instance from a sequence of pairs as returned +by decode_header(). + +

      +decode_header() takes a header value string and returns a +sequence of pairs of the format (decoded_string, charset) where +charset is the name of the character set. + +

      +This function takes one of those sequence of pairs and returns a +Header instance. Optional maxlinelen, +header_name, and continuation_ws are as in the +Header constructor. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Iterators.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Iterators.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,175 @@ + + + + + + + + + + + + +2.10 Iterators + + + + + +

      +2.10 Iterators +

      + + +

      +Iterating over a message object tree is fairly easy with the +Message.walk() method. The email.Iterators module +provides some useful higher level iterations over message object +trees. + +

      +

      + +
      body_line_iterator(msg[, decode])
      +
      +This iterates over all the payloads in all the subparts of msg, +returning the string payloads line-by-line. It skips over all the +subpart headers, and it skips over any subpart with a payload that +isn't a Python string. This is somewhat equivalent to reading the +flat text representation of the message from a file using +readline(), skipping over all the intervening headers. + +

      +Optional decode is passed through to Message.get_payload(). +

      + +

      +

      + +
      typed_subpart_iterator(msg[, + maintype[, subtype]])
      +
      +This iterates over all the subparts of msg, returning only those +subparts that match the MIME type specified by maintype and +subtype. + +

      +Note that subtype is optional; if omitted, then subpart MIME +type matching is done only with the main type. maintype is +optional too; it defaults to text. + +

      +Thus, by default typed_subpart_iterator() returns each +subpart that has a MIME type of text/*. +

      + +

      +The following function has been added as a useful debugging tool. It +should not be considered part of the supported public interface +for the package. + +

      +

      + +
      _structure(msg[, fp[, level]])
      +
      +Prints an indented representation of the content types of the +message object structure. For example: + +

      +

      +>>> msg = email.message_from_file(somefile)
      +>>> _structure(msg)
      +multipart/mixed
      +    text/plain
      +    text/plain
      +    multipart/digest
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +    text/plain
      +
      + +

      +Optional fp is a file-like object to print the output to. It +must be suitable for Python's extended print statement. level +is used internally. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Message.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Message.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,934 @@ + + + + + + + + + + + + +2.1 Representing an email message + + + + + +

      +2.1 Representing an email message +

      + + +

      +The central class in the email package is the +Message class; it is the base class for the email +object model. Message provides the core functionality for +setting and querying header fields, and for accessing message bodies. + +

      +Conceptually, a Message object consists of headers and +payloads. Headers are RFC 2822 style field names and +values where the field name and value are separated by a colon. The +colon is not part of either the field name or the field value. + +

      +Headers are stored and returned in case-preserving form but are +matched case-insensitively. There may also be a single envelope +header, also known as the Unix-From header or the +From_ header. The payload is either a string in the case of +simple message objects or a list of Message objects for +MIME container documents (e.g. multipart/* and +message/rfc822). + +

      +Message objects provide a mapping style interface for +accessing the message headers, and an explicit interface for accessing +both the headers and the payload. It provides convenience methods for +generating a flat text representation of the message object tree, for +accessing commonly used header parameters, and for recursively walking +over the object tree. + +

      +Here are the methods of the Message class: + +

      +

      + +
      class Message()
      +
      +The constructor takes no arguments. +
      + +

      +

      + +
      as_string([unixfrom])
      +
      +Return the entire message flatten as a string. When optional +unixfrom is True, the envelope header is included in the +returned string. unixfrom defaults to False. + +

      +Note that this method is provided as a convenience and may not always format +the message the way you want. For example, by default it mangles lines that +begin with From . For more flexibility, instantiate a +Generator instance and use its +flatten() method directly. For example: + +

      +

      +from cStringIO import StringIO
      +from email.Generator import Generator
      +fp = StringIO()
      +g = Generator(fp, mangle_from_=False, maxheaderlen=60)
      +g.flatten(msg)
      +text = fp.getvalue()
      +
      +
      + +

      +

      + +
      __str__()
      +
      +Equivalent to as_string(unixfrom=True). +
      + +

      +

      + +
      is_multipart()
      +
      +Return True if the message's payload is a list of +sub-Message objects, otherwise return False. When +is_multipart() returns False, the payload should be a string +object. +
      + +

      +

      + +
      set_unixfrom(unixfrom)
      +
      +Set the message's envelope header to unixfrom, which should be a string. +
      + +

      +

      + +
      get_unixfrom()
      +
      +Return the message's envelope header. Defaults to None if the +envelope header was never set. +
      + +

      +

      + +
      attach(payload)
      +
      +Add the given payload to the current payload, which must be +None or a list of Message objects before the call. +After the call, the payload will always be a list of Message +objects. If you want to set the payload to a scalar object (e.g. a +string), use set_payload() instead. +
      + +

      +

      + +
      get_payload([i[, decode]])
      +
      +Return a reference the current payload, which will be a list of +Message objects when is_multipart() is True, or a +string when is_multipart() is False. If the +payload is a list and you mutate the list object, you modify the +message's payload in place. + +

      +With optional argument i, get_payload() will return the +i-th element of the payload, counting from zero, if +is_multipart() is True. An IndexError +will be raised if i is less than 0 or greater than or equal to +the number of items in the payload. If the payload is a string +(i.e. is_multipart() is False) and i is given, a +TypeError is raised. + +

      +Optional decode is a flag indicating whether the payload should be +decoded or not, according to the Content-Transfer-Encoding: header. +When True and the message is not a multipart, the payload will be +decoded if this header's value is "quoted-printable" or +"base64". If some other encoding is used, or +Content-Transfer-Encoding: header is +missing, or if the payload has bogus base64 data, the payload is +returned as-is (undecoded). If the message is a multipart and the +decode flag is True, then None is returned. The +default for decode is False. +

      + +

      +

      + +
      set_payload(payload[, charset])
      +
      +Set the entire message object's payload to payload. It is the +client's responsibility to ensure the payload invariants. Optional +charset sets the message's default character set; see +set_charset() for details. + +

      + +Changed in version 2.2.2: +charset argument added. + +

      + +

      +

      + +
      set_charset(charset)
      +
      +Set the character set of the payload to charset, which can +either be a Charset instance (see email.Charset), a +string naming a character set, +or None. If it is a string, it will be converted to a +Charset instance. If charset is None, the +charset parameter will be removed from the +Content-Type: header. Anything else will generate a +TypeError. + +

      +The message will be assumed to be of type text/* encoded with +charset.input_charset. It will be converted to +charset.output_charset +and encoded properly, if needed, when generating the plain text +representation of the message. MIME headers +(MIME-Version:, Content-Type:, +Content-Transfer-Encoding:) will be added as needed. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_charset()
      +
      +Return the Charset instance associated with the message's payload. + +New in version 2.2.2. + +
      + +

      +The following methods implement a mapping-like interface for accessing +the message's RFC 2822 headers. Note that there are some +semantic differences between these methods and a normal mapping +(i.e. dictionary) interface. For example, in a dictionary there are +no duplicate keys, but here there may be duplicate message headers. Also, +in dictionaries there is no guaranteed order to the keys returned by +keys(), but in a Message object, headers are always +returned in the order they appeared in the original message, or were +added to the message later. Any header deleted and then re-added are +always appended to the end of the header list. + +

      +These semantic differences are intentional and are biased toward +maximal convenience. + +

      +Note that in all cases, any envelope header present in the message is +not included in the mapping interface. + +

      +

      + +
      __len__()
      +
      +Return the total number of headers, including duplicates. +
      + +

      +

      + +
      __contains__(name)
      +
      +Return true if the message object has a field named name. +Matching is done case-insensitively and name should not include the +trailing colon. Used for the in operator, +e.g.: + +

      +

      +if 'message-id' in myMessage:
      +    print 'Message-ID:', myMessage['message-id']
      +
      +
      + +

      +

      + +
      __getitem__(name)
      +
      +Return the value of the named header field. name should not +include the colon field separator. If the header is missing, +None is returned; a KeyError is never raised. + +

      +Note that if the named field appears more than once in the message's +headers, exactly which of those field values will be returned is +undefined. Use the get_all() method to get the values of all +the extant named headers. +

      + +

      +

      + +
      __setitem__(name, val)
      +
      +Add a header to the message with field name name and value +val. The field is appended to the end of the message's existing +fields. + +

      +Note that this does not overwrite or delete any existing header +with the same name. If you want to ensure that the new header is the +only one present in the message with field name +name, delete the field first, e.g.: + +

      +

      +del msg['subject']
      +msg['subject'] = 'Python roolz!'
      +
      +
      + +

      +

      + +
      __delitem__(name)
      +
      +Delete all occurrences of the field with name name from the +message's headers. No exception is raised if the named field isn't +present in the headers. +
      + +

      +

      + +
      has_key(name)
      +
      +Return true if the message contains a header field named name, +otherwise return false. +
      + +

      +

      + +
      keys()
      +
      +Return a list of all the message's header field names. +
      + +

      +

      + +
      values()
      +
      +Return a list of all the message's field values. +
      + +

      +

      + +
      items()
      +
      +Return a list of 2-tuples containing all the message's field headers +and values. +
      + +

      +

      + +
      get(name[, failobj])
      +
      +Return the value of the named header field. This is identical to +__getitem__() except that optional failobj is returned +if the named header is missing (defaults to None). +
      + +

      +Here are some additional useful methods: + +

      +

      + +
      get_all(name[, failobj])
      +
      +Return a list of all the values for the field named name. +If there are no such named headers in the message, failobj is +returned (defaults to None). +
      + +

      +

      + +
      add_header(_name, _value, **_params)
      +
      +Extended header setting. This method is similar to +__setitem__() except that additional header parameters can be +provided as keyword arguments. _name is the header field to add +and _value is the primary value for the header. + +

      +For each item in the keyword argument dictionary _params, the +key is taken as the parameter name, with underscores converted to +dashes (since dashes are illegal in Python identifiers). Normally, +the parameter will be added as key="value" unless the value is +None, in which case only the key will be added. + +

      +Here's an example: + +

      +

      +msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
      +
      + +

      +This will add a header that looks like + +

      +

      +Content-Disposition: attachment; filename="bud.gif"
      +
      +
      + +

      +

      + +
      replace_header(_name, _value)
      +
      +Replace a header. Replace the first header found in the message that +matches _name, retaining header order and field name case. If +no matching header was found, a KeyError is raised. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_type()
      +
      +Return the message's content type. The returned string is coerced to +lower case of the form maintype/subtype. If there was no +Content-Type: header in the message the default type as +given by get_default_type() will be returned. Since +according to RFC 2045, messages always have a default type, +get_content_type() will always return a value. + +

      +RFC 2045 defines a message's default type to be +text/plain unless it appears inside a +multipart/digest container, in which case it would be +message/rfc822. If the Content-Type: header +has an invalid type specification, RFC 2045 mandates that the +default type be text/plain. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_maintype()
      +
      +Return the message's main content type. This is the +maintype part of the string returned by +get_content_type(). + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_subtype()
      +
      +Return the message's sub-content type. This is the subtype +part of the string returned by get_content_type(). + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_default_type()
      +
      +Return the default content type. Most messages have a default content +type of text/plain, except for messages that are subparts +of multipart/digest containers. Such subparts have a +default content type of message/rfc822. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      set_default_type(ctype)
      +
      +Set the default content type. ctype should either be +text/plain or message/rfc822, although this is +not enforced. The default content type is not stored in the +Content-Type: header. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_params([failobj[, + header[, unquote]]])
      +
      +Return the message's Content-Type: parameters, as a list. The +elements of the returned list are 2-tuples of key/value pairs, as +split on the "=" sign. The left hand side of the +"=" is the key, while the right hand side is the value. If +there is no "=" sign in the parameter the value is the empty +string, otherwise the value is as described in get_param() and is +unquoted if optional unquote is True (the default). + +

      +Optional failobj is the object to return if there is no +Content-Type: header. Optional header is the header to +search instead of Content-Type:. + +

      + +Changed in version 2.2.2: +unquote argument added. + +

      + +

      +

      + +
      get_param(param[, + failobj[, header[, unquote]]])
      +
      +Return the value of the Content-Type: header's parameter +param as a string. If the message has no Content-Type: +header or if there is no such parameter, then failobj is +returned (defaults to None). + +

      +Optional header if given, specifies the message header to use +instead of Content-Type:. + +

      +Parameter keys are always compared case insensitively. The return +value can either be a string, or a 3-tuple if the parameter was +RFC 2231 encoded. When it's a 3-tuple, the elements of the value are of +the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and +LANGUAGE can be None, in which case you should consider +VALUE to be encoded in the us-ascii charset. You can +usually ignore LANGUAGE. + +

      +If your application doesn't care whether the parameter was encoded as in +RFC 2231, you can collapse the parameter value by calling +email.Utils.collapse_rfc2231_value(), passing in the return value +from get_param(). This will return a suitably decoded Unicode string +whn the value is a tuple, or the original string unquoted if it isn't. For +example: + +

      +

      +rawparam = msg.get_param('foo')
      +param = email.Utils.collapse_rfc2231_value(rawparam)
      +
      + +

      +In any case, the parameter value (either the returned string, or the +VALUE item in the 3-tuple) is always unquoted, unless +unquote is set to False. + +

      + +Changed in version 2.2.2: +unquote argument added, and 3-tuple return value +possible. + +

      + +

      +

      + +
      set_param(param, value[, + header[, requote[, charset[, language]]]])
      +
      + +

      +Set a parameter in the Content-Type: header. If the +parameter already exists in the header, its value will be replaced +with value. If the Content-Type: header as not yet +been defined for this message, it will be set to text/plain +and the new parameter value will be appended as per RFC 2045. + +

      +Optional header specifies an alternative header to +Content-Type:, and all parameters will be quoted as +necessary unless optional requote is False (the default +is True). + +

      +If optional charset is specified, the parameter will be encoded +according to RFC 2231. Optional language specifies the RFC +2231 language, defaulting to the empty string. Both charset and +language should be strings. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      del_param(param[, header[, + requote]])
      +
      +Remove the given parameter completely from the +Content-Type: header. The header will be re-written in +place without the parameter or its value. All values will be quoted +as necessary unless requote is False (the default is +True). Optional header specifies an alternative to +Content-Type:. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      set_type(type[, header][, + requote])
      +
      +Set the main type and subtype for the Content-Type: +header. type must be a string in the form +maintype/subtype, otherwise a ValueError is +raised. + +

      +This method replaces the Content-Type: header, keeping all +the parameters in place. If requote is False, this +leaves the existing header's quoting as is, otherwise the parameters +will be quoted (the default). + +

      +An alternative header can be specified in the header argument. +When the Content-Type: header is set a +MIME-Version: header is also added. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_filename([failobj])
      +
      +Return the value of the filename parameter of the +Content-Disposition: header of the message. If the header does +not have a filename parameter, this method falls back to looking for +the name parameter. If neither is found, or the header is missing, +then failobj is returned. The returned string will always be unquoted +as per Utils.unquote(). +
      + +

      +

      + +
      get_boundary([failobj])
      +
      +Return the value of the boundary parameter of the +Content-Type: header of the message, or failobj if either +the header is missing, or has no boundary parameter. The +returned string will always be unquoted as per +Utils.unquote(). +
      + +

      +

      + +
      set_boundary(boundary)
      +
      +Set the boundary parameter of the Content-Type: +header to boundary. set_boundary() will always quote +boundary if necessary. A HeaderParseError is raised +if the message object has no Content-Type: header. + +

      +Note that using this method is subtly different than deleting the old +Content-Type: header and adding a new one with the new boundary +via add_header(), because set_boundary() preserves the +order of the Content-Type: header in the list of headers. +However, it does not preserve any continuation lines which may +have been present in the original Content-Type: header. +

      + +

      +

      + +
      get_content_charset([failobj])
      +
      +Return the charset parameter of the Content-Type: +header, coerced to lower case. If there is no +Content-Type: header, or if that header has no +charset parameter, failobj is returned. + +

      +Note that this method differs from get_charset() which +returns the Charset instance for the default encoding of the +message body. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_charsets([failobj])
      +
      +Return a list containing the character set names in the message. If +the message is a multipart, then the list will contain one +element for each subpart in the payload, otherwise, it will be a list +of length 1. + +

      +Each item in the list will be a string which is the value of the +charset parameter in the Content-Type: header for the +represented subpart. However, if the subpart has no +Content-Type: header, no charset parameter, or is not of +the text main MIME type, then that item in the returned list +will be failobj. +

      + +

      +

      + +
      walk()
      +
      +The walk() method is an all-purpose generator which can be +used to iterate over all the parts and subparts of a message object +tree, in depth-first traversal order. You will typically use +walk() as the iterator in a for loop; each +iteration returns the next subpart. + +

      +Here's an example that prints the MIME type of every part of a +multipart message structure: + +

      +

      +>>> for part in msg.walk():
      +...     print part.get_content_type()
      +multipart/report
      +text/plain
      +message/delivery-status
      +text/plain
      +text/plain
      +message/rfc822
      +
      +
      + +

      +Message objects can also optionally contain two instance +attributes, which can be used when generating the plain text of a MIME +message. + +

      +

      preamble
      +
      +The format of a MIME document allows for some text between the blank +line following the headers, and the first multipart boundary string. +Normally, this text is never visible in a MIME-aware mail reader +because it falls outside the standard MIME armor. However, when +viewing the raw text of the message, or when viewing the message in a +non-MIME aware reader, this text can become visible. + +

      +The preamble attribute contains this leading extra-armor text +for MIME documents. When the Parser discovers some text after +the headers but before the first boundary string, it assigns this text +to the message's preamble attribute. When the Generator +is writing out the plain text representation of a MIME message, and it +finds the message has a preamble attribute, it will write this +text in the area between the headers and the first boundary. See +email.Parser and email.Generator for details. + +

      +Note that if the message object has no preamble, the +preamble attribute will be None. +

      + +

      +

      epilogue
      +
      +The epilogue attribute acts the same way as the preamble +attribute, except that it contains text that appears between the last +boundary and the end of the message. + +

      +One note: when generating the flat text for a multipart +message that has no epilogue (using the standard +Generator class), no newline is added after the closing +boundary line. If the message object has an epilogue and its +value does not start with a newline, a newline is printed after the +closing boundary. This seems a little clumsy, but it makes the most +practical sense. The upshot is that if you want to ensure that a +newline get printed after your closing multipart boundary, +set the epilogue to the empty string. +

      + +

      +

      defects
      +
      +The defects attribute contains a list of all the problems found when +parsing this message. See email.Errors for a detailed description +of the possible parsing defects. + +

      + +New in version 2.4. + +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Parser.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Parser.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,154 @@ + + + + + + + + + + + + +2.2 Parsing email messages + + + + + +

      +2.2 Parsing email messages +

      + + +

      +Message object structures can be created in one of two ways: they can be +created from whole cloth by instantiating Message objects and +stringing them together via attach() and +set_payload() calls, or they can be created by parsing a flat text +representation of the email message. + +

      +The email package provides a standard parser that understands +most email document structures, including MIME documents. You can +pass the parser a string or a file object, and the parser will return +to you the root Message instance of the object structure. For +simple, non-MIME messages the payload of this root object will likely +be a string containing the text of the message. For MIME +messages, the root object will return True from its +is_multipart() method, and the subparts can be accessed via +the get_payload() and walk() methods. + +

      +There are actually two parser interfaces available for use, the classic +Parser API and the incremental FeedParser API. The classic +Parser API is fine if you have the entire text of the message in +memory as a string, or if the entire message lives in a file on the file +system. FeedParser is more appropriate for when you're reading the +message from a stream which might block waiting for more input (e.g. reading +an email message from a socket). The FeedParser can consume and parse +the message incrementally, and only returns the root object when you close the +parser1. + +

      +Note that the parser can be extended in limited ways, and of course +you can implement your own parser completely from scratch. There is +no magical connection between the email package's bundled +parser and the Message class, so your custom parser can create +message object trees any way it finds necessary. + +

      +


      Footnotes

      +
      +
      ... +parser1
      +
      As of email package version 3.0, introduced in +Python 2.4, the classic Parser was re-implemented in terms of the +FeedParser, so the semantics and results are identical between the two +parsers. + +
      +
      +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.Utils.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.Utils.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,341 @@ + + + + + + + + + + + + +2.9 Miscellaneous utilities + + + + + +

      +2.9 Miscellaneous utilities +

      + + +

      +There are several useful utilities provided in the email.Utils +module: + +

      +

      + +
      quote(str)
      +
      +Return a new string with backslashes in str replaced by two +backslashes, and double quotes replaced by backslash-double quote. +
      + +

      +

      + +
      unquote(str)
      +
      +Return a new string which is an unquoted version of str. +If str ends and begins with double quotes, they are stripped +off. Likewise if str ends and begins with angle brackets, they +are stripped off. +
      + +

      +

      + +
      parseaddr(address)
      +
      +Parse address - which should be the value of some address-containing +field such as To: or Cc: - into its constituent +realname and email address parts. Returns a tuple of that +information, unless the parse fails, in which case a 2-tuple of +('', '') is returned. +
      + +

      +

      + +
      formataddr(pair)
      +
      +The inverse of parseaddr(), this takes a 2-tuple of the form +(realname, email_address) and returns the string value suitable +for a To: or Cc: header. If the first element of +pair is false, then the second element is returned unmodified. +
      + +

      +

      + +
      getaddresses(fieldvalues)
      +
      +This method returns a list of 2-tuples of the form returned by +parseaddr(). fieldvalues is a sequence of header field +values as might be returned by Message.get_all(). Here's a +simple example that gets all the recipients of a message: + +

      +

      +from email.Utils import getaddresses
      +
      +tos = msg.get_all('to', [])
      +ccs = msg.get_all('cc', [])
      +resent_tos = msg.get_all('resent-to', [])
      +resent_ccs = msg.get_all('resent-cc', [])
      +all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
      +
      +
      + +

      +

      + +
      parsedate(date)
      +
      +Attempts to parse a date according to the rules in RFC 2822. +however, some mailers don't follow that format as specified, so +parsedate() tries to guess correctly in such cases. +date is a string containing an RFC 2822 date, such as +"Mon, 20 Nov 1995 19:12:08 -0500". If it succeeds in parsing +the date, parsedate() returns a 9-tuple that can be passed +directly to time.mktime(); otherwise None will be +returned. Note that fields 6, 7, and 8 of the result tuple are not +usable. +
      + +

      +

      + +
      parsedate_tz(date)
      +
      +Performs the same function as parsedate(), but returns +either None or a 10-tuple; the first 9 elements make up a tuple +that can be passed directly to time.mktime(), and the tenth +is the offset of the date's timezone from UTC (which is the official +term for Greenwich Mean Time)3. If the input +string has no timezone, the last element of the tuple returned is +None. Note that fields 6, 7, and 8 of the result tuple are not +usable. +
      + +

      +

      + +
      mktime_tz(tuple)
      +
      +Turn a 10-tuple as returned by parsedate_tz() into a UTC +timestamp. It the timezone item in the tuple is None, assume +local time. Minor deficiency: mktime_tz() interprets the +first 8 elements of tuple as a local time and then compensates +for the timezone difference. This may yield a slight error around +changes in daylight savings time, though not worth worrying about for +common use. +
      + +

      +

      + +
      formatdate([timeval[, localtime][, usegmt]])
      +
      +Returns a date string as per RFC 2822, e.g.: + +

      +

      +Fri, 09 Nov 2001 01:08:47 -0000
      +
      + +

      +Optional timeval if given is a floating point time value as +accepted by time.gmtime() and time.localtime(), +otherwise the current time is used. + +

      +Optional localtime is a flag that when True, interprets +timeval, and returns a date relative to the local timezone +instead of UTC, properly taking daylight savings time into account. +The default is False meaning UTC is used. + +

      +Optional usegmt is a flag that when True, outputs a +date string with the timezone as an ascii string GMT, rather +than a numeric -0000. This is needed for some protocols (such +as HTTP). This only applies when localtime is False. + +New in version 2.4. + +

      + +

      +

      + +
      make_msgid([idstring])
      +
      +Returns a string suitable for an RFC 2822-compliant +Message-ID: header. Optional idstring if given, is +a string used to strengthen the uniqueness of the message id. +
      + +

      +

      + +
      decode_rfc2231(s)
      +
      +Decode the string s according to RFC 2231. +
      + +

      +

      + +
      encode_rfc2231(s[, charset[, language]])
      +
      +Encode the string s according to RFC 2231. Optional +charset and language, if given is the character set name +and language name to use. If neither is given, s is returned +as-is. If charset is given but language is not, the +string is encoded using the empty string for language. +
      + +

      +

      + +
      collapse_rfc2231_value(value[, errors[, + fallback_charset]])
      +
      +When a header parameter is encoded in RFC 2231 format, +Message.get_param() may return a 3-tuple containing the character +set, language, and value. collapse_rfc2231_value() turns this into +a unicode string. Optional errors is passed to the errors +argument of the built-in unicode() function; it defaults to +replace. Optional fallback_charset specifies the character set +to use if the one in the RFC 2231 header is not known by Python; it defaults +to us-ascii. + +

      +For convenience, if the value passed to +collapse_rfc2231_value() is not a tuple, it should be a string and +it is returned unquoted. +

      + +

      +

      + +
      decode_params(params)
      +
      +Decode parameters list according to RFC 2231. params is a +sequence of 2-tuples containing elements of the form +(content-type, string-value). +
      + +

      + +Changed in version 2.4: +The dump_address_pair() function has been removed; +use formataddr() instead. + +

      + +Changed in version 2.4: +The decode() function has been removed; use the +Header.decode_header() method instead. + +

      + +Changed in version 2.4: +The encode() function has been removed; use the +Header.encode() method instead. + + +

      +


      Footnotes

      +
      +
      ... Time)3
      +
      Note that the sign of the timezone +offset is the opposite of the sign of the time.timezone +variable for the same timezone; the latter variable follows the +POSIX standard while this module follows RFC 2822. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/module-email.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/module-email.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,198 @@ + + + + + + + + + + + + +2 email -- An email and MIME handling package + + + + + +

      +2 email -- + An email and MIME handling package +

      + +

      + + +

      + +New in version 2.2. + +

      +The email package is a library for managing email messages, +including MIME and other RFC 2822-based message documents. It +subsumes most of the functionality in several older standard modules +such as rfc822, mimetools, +multifile, and other non-standard packages such as +mimecntl. It is specifically not designed to do any +sending of email messages to SMTP (RFC 2821) servers; that is the +function of the smtplib module. The email +package attempts to be as RFC-compliant as possible, supporting in +addition to RFC 2822, such MIME-related RFCs as +RFC 2045, RFC 2046, RFC 2047, and RFC 2231. + +

      +The primary distinguishing feature of the email package is +that it splits the parsing and generating of email messages from the +internal object model representation of email. Applications +using the email package deal primarily with objects; you can +add sub-objects to messages, remove sub-objects from messages, +completely re-arrange the contents, etc. There is a separate parser +and a separate generator which handles the transformation from flat +text to the object model, and then back to flat text again. There +are also handy subclasses for some common MIME object types, and a few +miscellaneous utilities that help with such common tasks as extracting +and parsing message field values, creating RFC-compliant dates, etc. + +

      +The following sections describe the functionality of the +email package. The ordering follows a progression that +should be common in applications: an email message is read as flat +text from a file or other source, the text is parsed to produce the +object structure of the email message, this structure is manipulated, +and finally rendered back into flat text. + +

      +It is perfectly feasible to create the object structure out of whole +cloth -- i.e. completely from scratch. From there, a similar +progression can be taken as above. + +

      +Also included are detailed specifications of all the classes and +modules that the email package provides, the exception +classes you might encounter while using the email package, +some auxiliary utilities, and a few examples. For users of the older +mimelib package, or previous versions of the email +package, a section on differences and porting is provided. + +

      +

      +

      See Also:

      + +
      +
      Module smtplib: +
      SMTP protocol client. +
      +
      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/modules.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/next.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/node1.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node1.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,125 @@ + + + + + + + + + + + + +1 Introduction + + + + + +

      +1 Introduction +

      +The email package provides classes and utilities to create, +parse, generate, and modify email messages, conforming to all the +relevant email and MIME related RFCs. + +

      +This document describes version 3.0 of the email package, which is +distributed with Python 2.4 and is available as a standalone distutils-based +package for use with Python 2.3. email 3.0 is not compatible with +Python versions earlier than 2.3. For more information about the +email package, including download links and mailing lists, see +Python's email SIG. + +

      +The documentation that follows was written for the Python project, so +if you're reading this as part of the standalone email +package documentation, there are a few notes to be aware of: + +

      + +

        +
      • Deprecation and ``version added'' notes are relative to the + Python version a feature was added or deprecated. + +

        +

      • +
      • If you're reading this documentation as part of the + standalone email package, some of the internal links to + other sections of the Python standard library may not resolve. + +

        +

      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node10.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node10.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,107 @@ + + + + + + + + + + + +2.3.1 Deprecated methods + + + + + +

      +2.3.1 Deprecated methods +

      + +

      +The following methods are deprecated in email version 2. +They are documented here for completeness. + +

      +

      + +
      __call__(msg[, unixfrom])
      +
      +This method is identical to the flatten() method. + +

      +

      Deprecated since release 2.2.2. +Use the flatten() method instead.

      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node11.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node11.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,305 @@ + + + + + + + + + + + + +2.4 Creating email and MIME objects from scratch + + + + + +

      +2.4 Creating email and MIME objects from scratch +

      +Ordinarily, you get a message object structure by passing a file or +some text to a parser, which parses the text and returns the root +message object. However you can also build a complete message +structure from scratch, or even individual Message objects by +hand. In fact, you can also take an existing structure and add new +Message objects, move them around, etc. This makes a very +convenient interface for slicing-and-dicing MIME messages. + +

      +You can create a new object structure by creating Message +instances, adding attachments and all the appropriate headers manually. +For MIME messages though, the email package provides some +convenient subclasses to make things easier. Each of these classes +should be imported from a module with the same name as the class, from +within the email package. E.g.: + +

      +

      +import email.MIMEImage.MIMEImage
      +
      + +

      +or + +

      +

      +from email.MIMEText import MIMEText
      +
      + +

      +Here are the classes: + +

      +

      + +
      class MIMEBase(_maintype, _subtype, **_params)
      +
      +This is the base class for all the MIME-specific subclasses of +Message. Ordinarily you won't create instances specifically +of MIMEBase, although you could. MIMEBase is provided +primarily as a convenient base class for more specific MIME-aware +subclasses. + +

      +_maintype is the Content-Type: major type +(e.g. text or image), and _subtype is the +Content-Type: minor type +(e.g. plain or gif). _params is a parameter +key/value dictionary and is passed directly to +Message.add_header(). + +

      +The MIMEBase class always adds a Content-Type: header +(based on _maintype, _subtype, and _params), and a +MIME-Version: header (always set to 1.0). +

      + +

      +

      + +
      class MIMENonMultipart()
      +
      +A subclass of MIMEBase, this is an intermediate base class for +MIME messages that are not multipart. The primary purpose +of this class is to prevent the use of the attach() method, +which only makes sense for multipart messages. If +attach() is called, a MultipartConversionError +exception is raised. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      class MIMEMultipart([subtype[, + boundary[, _subparts[, _params]]]])
      +
      + +

      +A subclass of MIMEBase, this is an intermediate base class for +MIME messages that are multipart. Optional _subtype +defaults to mixed, but can be used to specify the subtype +of the message. A Content-Type: header of +multipart/_subtype will be added to the message +object. A MIME-Version: header will also be added. + +

      +Optional boundary is the multipart boundary string. When +None (the default), the boundary is calculated when needed. + +

      +_subparts is a sequence of initial subparts for the payload. It +must be possible to convert this sequence to a list. You can always +attach new subparts to the message by using the +Message.attach() method. + +

      +Additional parameters for the Content-Type: header are +taken from the keyword arguments, or passed into the _params +argument, which is a keyword dictionary. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      class MIMEAudio(_audiodata[, _subtype[, + _encoder[, **_params]]])
      +
      + +

      +A subclass of MIMENonMultipart, the MIMEAudio class +is used to create MIME message objects of major type audio. +_audiodata is a string containing the raw audio data. If this +data can be decoded by the standard Python module sndhdr, +then the subtype will be automatically included in the +Content-Type: header. Otherwise you can explicitly specify the +audio subtype via the _subtype parameter. If the minor type could +not be guessed and _subtype was not given, then TypeError +is raised. + +

      +Optional _encoder is a callable (i.e. function) which will +perform the actual encoding of the audio data for transport. This +callable takes one argument, which is the MIMEAudio instance. +It should use get_payload() and set_payload() to +change the payload to encoded form. It should also add any +Content-Transfer-Encoding: or other headers to the message +object as necessary. The default encoding is base64. See the +email.Encoders module for a list of the built-in encoders. + +

      +_params are passed straight through to the base class constructor. +

      + +

      +

      + +
      class MIMEImage(_imagedata[, _subtype[, + _encoder[, **_params]]])
      +
      + +

      +A subclass of MIMENonMultipart, the MIMEImage class is +used to create MIME message objects of major type image. +_imagedata is a string containing the raw image data. If this +data can be decoded by the standard Python module imghdr, +then the subtype will be automatically included in the +Content-Type: header. Otherwise you can explicitly specify the +image subtype via the _subtype parameter. If the minor type could +not be guessed and _subtype was not given, then TypeError +is raised. + +

      +Optional _encoder is a callable (i.e. function) which will +perform the actual encoding of the image data for transport. This +callable takes one argument, which is the MIMEImage instance. +It should use get_payload() and set_payload() to +change the payload to encoded form. It should also add any +Content-Transfer-Encoding: or other headers to the message +object as necessary. The default encoding is base64. See the +email.Encoders module for a list of the built-in encoders. + +

      +_params are passed straight through to the MIMEBase +constructor. +

      + +

      +

      + +
      class MIMEMessage(_msg[, _subtype])
      +
      +A subclass of MIMENonMultipart, the MIMEMessage class +is used to create MIME objects of main type message. +_msg is used as the payload, and must be an instance of class +Message (or a subclass thereof), otherwise a +TypeError is raised. + +

      +Optional _subtype sets the subtype of the message; it defaults +to rfc822. +

      + +

      +

      + +
      class MIMEText(_text[, _subtype[, _charset]])
      +
      +A subclass of MIMENonMultipart, the MIMEText class is +used to create MIME objects of major type text. +_text is the string for the payload. _subtype is the +minor type and defaults to plain. _charset is the +character set of the text and is passed as a parameter to the +MIMENonMultipart constructor; it defaults to us-ascii. No +guessing or encoding is performed on the text data. + +

      + +Changed in version 2.4: +The previously deprecated _encoding argument has +been removed. Encoding happens implicitly based on the _charset +argument. + +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node18.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node18.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,236 @@ + + + + + + + + + + + + +2.11 Package History + + + + + +

      +2.11 Package History +

      + +

      +Version 1 of the email package was bundled with Python +releases up to Python 2.2.1. Version 2 was developed for the Python +2.3 release, and backported to Python 2.2.2. It was also available as +a separate distutils-based package, and is compatible back to Python 2.1. + +

      +email version 3.0 was released with Python 2.4 and as a separate +distutils-based package. It is compatible back to Python 2.3. + +

      +Here are the differences between email version 3 and version 2: + +

      + +

        +
      • The FeedParser class was introduced, and the Parser + class was implemented in terms of the FeedParser. All parsing + there for is non-strict, and parsing will make a best effort never to + raise an exception. Problems found while parsing messages are stored in + the message's defect attribute. + +

        +

      • +
      • All aspects of the API which raised DeprecationWarnings in + version 2 have been removed. These include the _encoder argument + to the MIMEText constructor, the Message.add_payload() + method, the Utils.dump_address_pair() function, and the + functions Utils.decode() and Utils.encode(). + +

        +

      • +
      • New DeprecationWarnings have been added to: + Generator.__call__(), Message.get_type(), + Message.get_main_type(), Message.get_subtype(), and + the strict argument to the Parser class. These are + expected to be removed in email 3.1. + +

        +

      • +
      • Support for Pythons earlier than 2.3 has been removed. +
      • +
      + +

      +Here are the differences between email version 2 and version 1: + +

      + +

        +
      • The email.Header and email.Charset modules + have been added. + +

        +

      • +
      • The pickle format for Message instances has changed. + Since this was never (and still isn't) formally defined, this + isn't considered a backward incompatibility. However if your + application pickles and unpickles Message instances, be + aware that in email version 2, Message + instances now have private variables _charset and + _default_type. + +

        +

      • +
      • Several methods in the Message class have been + deprecated, or their signatures changed. Also, many new methods + have been added. See the documentation for the Message + class for details. The changes should be completely backward + compatible. + +

        +

      • +
      • The object structure has changed in the face of + message/rfc822 content types. In email + version 1, such a type would be represented by a scalar payload, + i.e. the container message's is_multipart() returned + false, get_payload() was not a list object, but a single + Message instance. + +

        +This structure was inconsistent with the rest of the package, so + the object representation for message/rfc822 content + types was changed. In email version 2, the container + does return True from is_multipart(), and + get_payload() returns a list containing a single + Message item. + +

        +Note that this is one place that backward compatibility could + not be completely maintained. However, if you're already + testing the return type of get_payload(), you should be + fine. You just need to make sure your code doesn't do a + set_payload() with a Message instance on a + container with a content type of message/rfc822. + +

        +

      • +
      • The Parser constructor's strict argument was + added, and its parse() and parsestr() methods + grew a headersonly argument. The strict flag was + also added to functions email.message_from_file() + and email.message_from_string(). + +

        +

      • +
      • Generator.__call__() is deprecated; use + Generator.flatten() instead. The Generator + class has also grown the clone() method. + +

        +

      • +
      • The DecodedGenerator class in the + email.Generator module was added. + +

        +

      • +
      • The intermediate base classes MIMENonMultipart and + MIMEMultipart have been added, and interposed in the + class hierarchy for most of the other MIME-related derived + classes. + +

        +

      • +
      • The _encoder argument to the MIMEText constructor + has been deprecated. Encoding now happens implicitly based + on the _charset argument. + +

        +

      • +
      • The following functions in the email.Utils module have + been deprecated: dump_address_pairs(), + decode(), and encode(). The following + functions have been added to the module: + make_msgid(), decode_rfc2231(), + encode_rfc2231(), and decode_params(). + +

        +

      • +
      • The non-public function email.Iterators._structure() + was added. +
      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node19.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node19.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,300 @@ + + + + + + + + + + + + +2.12 Differences from mimelib + + + + + +

      +2.12 Differences from mimelib +

      + +

      +The email package was originally prototyped as a separate +library called +mimelib. +Changes have been made so that +method names are more consistent, and some methods or modules have +either been added or removed. The semantics of some of the methods +have also changed. For the most part, any functionality available in +mimelib is still available in the email package, +albeit often in a different way. Backward compatibility between +the mimelib package and the email package was not a +priority. + +

      +Here is a brief description of the differences between the +mimelib and the email packages, along with hints on +how to port your applications. + +

      +Of course, the most visible difference between the two packages is +that the package name has been changed to email. In +addition, the top-level package has the following differences: + +

      + +

        +
      • messageFromString() has been renamed to + message_from_string(). + +

        +

      • +
      • messageFromFile() has been renamed to + message_from_file(). + +

        +

      • +
      + +

      +The Message class has the following differences: + +

      + +

        +
      • The method asString() was renamed to as_string(). + +

        +

      • +
      • The method ismultipart() was renamed to + is_multipart(). + +

        +

      • +
      • The get_payload() method has grown a decode + optional argument. + +

        +

      • +
      • The method getall() was renamed to get_all(). + +

        +

      • +
      • The method addheader() was renamed to add_header(). + +

        +

      • +
      • The method gettype() was renamed to get_type(). + +

        +

      • +
      • The method getmaintype() was renamed to + get_main_type(). + +

        +

      • +
      • The method getsubtype() was renamed to + get_subtype(). + +

        +

      • +
      • The method getparams() was renamed to + get_params(). + Also, whereas getparams() returned a list of strings, + get_params() returns a list of 2-tuples, effectively + the key/value pairs of the parameters, split on the "=" + sign. + +

        +

      • +
      • The method getparam() was renamed to get_param(). + +

        +

      • +
      • The method getcharsets() was renamed to + get_charsets(). + +

        +

      • +
      • The method getfilename() was renamed to + get_filename(). + +

        +

      • +
      • The method getboundary() was renamed to + get_boundary(). + +

        +

      • +
      • The method setboundary() was renamed to + set_boundary(). + +

        +

      • +
      • The method getdecodedpayload() was removed. To get + similar functionality, pass the value 1 to the decode flag + of the get_payload() method. + +

        +

      • +
      • The method getpayloadastext() was removed. Similar + functionality + is supported by the DecodedGenerator class in the + email.Generator module. + +

        +

      • +
      • The method getbodyastext() was removed. You can get + similar functionality by creating an iterator with + typed_subpart_iterator() in the + email.Iterators module. +
      • +
      + +

      +The Parser class has no differences in its public interface. +It does have some additional smarts to recognize +message/delivery-status type messages, which it represents as +a Message instance containing separate Message +subparts for each header block in the delivery status +notification4. + +

      +The Generator class has no differences in its public +interface. There is a new class in the email.Generator +module though, called DecodedGenerator which provides most of +the functionality previously available in the +Message.getpayloadastext() method. + +

      +The following modules and classes have been changed: + +

      + +

        +
      • The MIMEBase class constructor arguments _major + and _minor have changed to _maintype and + _subtype respectively. + +

        +

      • +
      • The Image class/module has been renamed to + MIMEImage. The _minor argument has been renamed to + _subtype. + +

        +

      • +
      • The Text class/module has been renamed to + MIMEText. The _minor argument has been renamed to + _subtype. + +

        +

      • +
      • The MessageRFC822 class/module has been renamed to + MIMEMessage. Note that an earlier version of + mimelib called this class/module RFC822, but + that clashed with the Python standard library module + rfc822 on some case-insensitive file systems. + +

        +Also, the MIMEMessage class now represents any kind of + MIME message with main type message. It takes an + optional argument _subtype which is used to set the MIME + subtype. _subtype defaults to rfc822. +

      • +
      + +

      +mimelib provided some utility functions in its +address and date modules. All of these functions +have been moved to the email.Utils module. + +

      +The MsgReader class/module has been removed. Its functionality +is most closely supported in the body_line_iterator() +function in the email.Iterators module. + +

      +


      Footnotes

      +
      +
      ... +notification4
      +
      Delivery Status Notifications (DSN) are defined +in RFC 1894. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node20.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node20.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,408 @@ + + + + + + + + + + + +2.13 Examples + + + + + +

      +2.13 Examples +

      + +

      +Here are a few examples of how to use the email package to +read, write, and send simple email messages, as well as more complex +MIME messages. + +

      +First, let's see how to create and send a simple text message: + +

      +

      +
      # Import smtplib for the actual sending function
      +import smtplib
      +
      +# Import the email modules we'll need
      +from email.MIMEText import MIMEText
      +
      +# Open a plain text file for reading.  For this example, assume that
      +# the text file contains only ASCII characters.
      +fp = open(textfile, 'rb')
      +# Create a text/plain message
      +msg = MIMEText(fp.read())
      +fp.close()
      +
      +# me == the sender's email address
      +# you == the recipient's email address
      +msg['Subject'] = 'The contents of %s' % textfile
      +msg['From'] = me
      +msg['To'] = you
      +
      +# Send the message via our own SMTP server, but don't include the
      +# envelope header.
      +s = smtplib.SMTP()
      +s.connect()
      +s.sendmail(me, [you], msg.as_string())
      +s.close()
      +
      +
      + +

      +Here's an example of how to send a MIME message containing a bunch of +family pictures that may be residing in a directory: + +

      +

      +
      # Import smtplib for the actual sending function
      +import smtplib
      +
      +# Here are the email package modules we'll need
      +from email.MIMEImage import MIMEImage
      +from email.MIMEMultipart import MIMEMultipart
      +
      +COMMASPACE = ', '
      +
      +# Create the container (outer) email message.
      +msg = MIMEMultipart()
      +msg['Subject'] = 'Our family reunion'
      +# me == the sender's email address
      +# family = the list of all recipients' email addresses
      +msg['From'] = me
      +msg['To'] = COMMASPACE.join(family)
      +msg.preamble = 'Our family reunion'
      +# Guarantees the message ends in a newline
      +msg.epilogue = ''
      +
      +# Assume we know that the image files are all in PNG format
      +for file in pngfiles:
      +    # Open the files in binary mode.  Let the MIMEImage class automatically
      +    # guess the specific image type.
      +    fp = open(file, 'rb')
      +    img = MIMEImage(fp.read())
      +    fp.close()
      +    msg.attach(img)
      +
      +# Send the email via our own SMTP server.
      +s = smtplib.SMTP()
      +s.connect()
      +s.sendmail(me, family, msg.as_string())
      +s.close()
      +
      +
      + +

      +Here's an example of how to send the entire contents of a directory as +an email message: +5 +

      +

      +
      #!/usr/bin/env python
      +
      +"""Send the contents of a directory as a MIME message.
      +
      +Usage: dirmail [options] from to [to ...]*
      +
      +Options:
      +    -h / --help
      +        Print this message and exit.
      +
      +    -d directory
      +    --directory=directory
      +        Mail the contents of the specified directory, otherwise use the
      +        current directory.  Only the regular files in the directory are sent,
      +        and we don't recurse to subdirectories.
      +
      +`from' is the email address of the sender of the message.
      +
      +`to' is the email address of the recipient of the message, and multiple
      +recipients may be given.
      +
      +The email is sent by forwarding to your local SMTP server, which then does the
      +normal delivery process.  Your local machine must be running an SMTP server.
      +"""
      +
      +import sys
      +import os
      +import getopt
      +import smtplib
      +# For guessing MIME type based on file name extension
      +import mimetypes
      +
      +from email import Encoders
      +from email.Message import Message
      +from email.MIMEAudio import MIMEAudio
      +from email.MIMEBase import MIMEBase
      +from email.MIMEMultipart import MIMEMultipart
      +from email.MIMEImage import MIMEImage
      +from email.MIMEText import MIMEText
      +
      +COMMASPACE = ', '
      +
      +def usage(code, msg=''):
      +    print >> sys.stderr, __doc__
      +    if msg:
      +        print >> sys.stderr, msg
      +    sys.exit(code)
      +
      +def main():
      +    try:
      +        opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory='])
      +    except getopt.error, msg:
      +        usage(1, msg)
      +
      +    dir = os.curdir
      +    for opt, arg in opts:
      +        if opt in ('-h', '--help'):
      +            usage(0)
      +        elif opt in ('-d', '--directory'):
      +            dir = arg
      +
      +    if len(args) < 2:
      +        usage(1)
      +
      +    sender = args[0]
      +    recips = args[1:]
      +
      +    # Create the enclosing (outer) message
      +    outer = MIMEMultipart()
      +    outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir)
      +    outer['To'] = COMMASPACE.join(recips)
      +    outer['From'] = sender
      +    outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
      +    # To guarantee the message ends with a newline
      +    outer.epilogue = ''
      +
      +    for filename in os.listdir(dir):
      +        path = os.path.join(dir, filename)
      +        if not os.path.isfile(path):
      +            continue
      +        # Guess the content type based on the file's extension.  Encoding
      +        # will be ignored, although we should check for simple things like
      +        # gzip'd or compressed files.
      +        ctype, encoding = mimetypes.guess_type(path)
      +        if ctype is None or encoding is not None:
      +            # No guess could be made, or the file is encoded (compressed), so
      +            # use a generic bag-of-bits type.
      +            ctype = 'application/octet-stream'
      +        maintype, subtype = ctype.split('/', 1)
      +        if maintype == 'text':
      +            fp = open(path)
      +            # Note: we should handle calculating the charset
      +            msg = MIMEText(fp.read(), _subtype=subtype)
      +            fp.close()
      +        elif maintype == 'image':
      +            fp = open(path, 'rb')
      +            msg = MIMEImage(fp.read(), _subtype=subtype)
      +            fp.close()
      +        elif maintype == 'audio':
      +            fp = open(path, 'rb')
      +            msg = MIMEAudio(fp.read(), _subtype=subtype)
      +            fp.close()
      +        else:
      +            fp = open(path, 'rb')
      +            msg = MIMEBase(maintype, subtype)
      +            msg.set_payload(fp.read())
      +            fp.close()
      +            # Encode the payload using Base64
      +            Encoders.encode_base64(msg)
      +        # Set the filename parameter
      +        msg.add_header('Content-Disposition', 'attachment', filename=filename)
      +        outer.attach(msg)
      +
      +    # Now send the message
      +    s = smtplib.SMTP()
      +    s.connect()
      +    s.sendmail(sender, recips, outer.as_string())
      +    s.close()
      +
      +if __name__ == '__main__':
      +    main()
      +
      +
      + +

      +And finally, here's an example of how to unpack a MIME message like +the one above, into a directory of files: + +

      +

      +
      #!/usr/bin/env python
      +
      +"""Unpack a MIME message into a directory of files.
      +
      +Usage: unpackmail [options] msgfile
      +
      +Options:
      +    -h / --help
      +        Print this message and exit.
      +
      +    -d directory
      +    --directory=directory
      +        Unpack the MIME message into the named directory, which will be
      +        created if it doesn't already exist.
      +
      +msgfile is the path to the file containing the MIME message.
      +"""
      +
      +import sys
      +import os
      +import getopt
      +import errno
      +import mimetypes
      +import email
      +
      +def usage(code, msg=''):
      +    print >> sys.stderr, __doc__
      +    if msg:
      +        print >> sys.stderr, msg
      +    sys.exit(code)
      +
      +def main():
      +    try:
      +        opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory='])
      +    except getopt.error, msg:
      +        usage(1, msg)
      +
      +    dir = os.curdir
      +    for opt, arg in opts:
      +        if opt in ('-h', '--help'):
      +            usage(0)
      +        elif opt in ('-d', '--directory'):
      +            dir = arg
      +
      +    try:
      +        msgfile = args[0]
      +    except IndexError:
      +        usage(1)
      +
      +    try:
      +        os.mkdir(dir)
      +    except OSError, e:
      +        # Ignore directory exists error
      +        if e.errno <> errno.EEXIST: raise
      +
      +    fp = open(msgfile)
      +    msg = email.message_from_file(fp)
      +    fp.close()
      +
      +    counter = 1
      +    for part in msg.walk():
      +        # multipart/* are just containers
      +        if part.get_content_maintype() == 'multipart':
      +            continue
      +        # Applications should really sanitize the given filename so that an
      +        # email message can't be used to overwrite important files
      +        filename = part.get_filename()
      +        if not filename:
      +            ext = mimetypes.guess_extension(part.get_type())
      +            if not ext:
      +                # Use a generic bag-of-bits extension
      +                ext = '.bin'
      +            filename = 'part-%03d%s' % (counter, ext)
      +        counter += 1
      +        fp = open(os.path.join(dir, filename), 'wb')
      +        fp.write(part.get_payload(decode=1))
      +        fp.close()
      +
      +if __name__ == '__main__':
      +    main()
      +
      +
      + +

      +


      Footnotes

      +
      +
      ... message:5
      +
      Thanks to Matthew Dixon Cowles for the original inspiration + and examples. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node4.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node4.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,148 @@ + + + + + + + + + + + +2.1.1 Deprecated methods + + + + + +

      +2.1.1 Deprecated methods +

      + +

      + +Changed in version 2.4: +The add_payload() method was removed; use the +attach() method instead. + +

      +The following methods are deprecated. They are documented here for +completeness. + +

      +

      + +
      get_type([failobj])
      +
      +Return the message's content type, as a string of the form +maintype/subtype as taken from the +Content-Type: header. +The returned string is coerced to lowercase. + +

      +If there is no Content-Type: header in the message, +failobj is returned (defaults to None). + +

      +

      Deprecated since release 2.2.2. +Use the get_content_type() method instead.

      +
      + +

      +

      + +
      get_main_type([failobj])
      +
      +Return the message's main content type. This essentially returns the +maintype part of the string returned by get_type(), with the +same semantics for failobj. + +

      +

      Deprecated since release 2.2.2. +Use the get_content_maintype() method instead.

      +
      + +

      +

      + +
      get_subtype([failobj])
      +
      +Return the message's sub-content type. This essentially returns the +subtype part of the string returned by get_type(), with the +same semantics for failobj. + +

      +

      Deprecated since release 2.2.2. +Use the get_content_subtype() method instead.

      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node6.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node6.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,150 @@ + + + + + + + + + + + + +2.2.1 FeedParser API + + + + + +

      +2.2.1 FeedParser API +

      + +

      + +New in version 2.4. + +

      +The FeedParser provides an API that is conducive to incremental +parsing of email messages, such as would be necessary when reading the text of +an email message from a source that can block (e.g. a socket). The +FeedParser can of course be used to parse an email message fully +contained in a string or a file, but the classic Parser API may be +more convenient for such use cases. The semantics and results of the two +parser APIs are identical. + +

      +The FeedParser's API is simple; you create an instance, feed it a +bunch of text until there's no more to feed it, then close the parser to +retrieve the root message object. The FeedParser is extremely +accurate when parsing standards-compliant messages, and it does a very good +job of parsing non-compliant messages, providing information about how a +message was deemed broken. It will populate a message object's defects +attribute with a list of any problems it found in a message. See the +email.Errors module for the list of defects that it can find. + +

      +Here is the API for the FeedParser: + +

      +

      + +
      class FeedParser([_factory])
      +
      +Create a FeedParser instance. Optional _factory is a +no-argument callable that will be called whenever a new message object is +needed. It defaults to the email.Message.Message class. +
      + +

      +

      + +
      feed(data)
      +
      +Feed the FeedParser some more data. data should be a +string containing one or more lines. The lines can be partial and the +FeedParser will stitch such partial lines together properly. The +lines in the string can have any of the common three line endings, carriage +return, newline, or carriage return and newline (they can even be mixed). +
      + +

      +

      + +
      close()
      +
      +Closing a FeedParser completes the parsing of all previously fed data, +and returns the root message object. It is undefined what happens if you feed +more data to a closed FeedParser. +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node7.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node7.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,234 @@ + + + + + + + + + + + + +2.2.2 Parser class API + + + + + +

      +2.2.2 Parser class API +

      + +

      +The Parser provides an API that can be used to parse a message when +the complete contents of the message are available in a string or file. The +email.Parser module also provides a second class, called +HeaderParser which can be used if you're only interested in +the headers of the message. HeaderParser can be much faster in +these situations, since it does not attempt to parse the message body, +instead setting the payload to the raw body as a string. +HeaderParser has the same API as the Parser class. + +

      +

      + +
      class Parser([_class[, strict]])
      +
      +The constructor for the Parser class takes an optional +argument _class. This must be a callable factory (such as a +function or a class), and it is used whenever a sub-message object +needs to be created. It defaults to Message (see +email.Message). The factory will be called without +arguments. + +

      +The optional strict flag is ignored.

      Deprecated since release 2.4. +Because the +Parser class is a backward compatible API wrapper around the +new-in-Python 2.4 FeedParser, all parsing is effectively +non-strict. You should simply stop passing a strict flag to the +Parser constructor.

      + +

      + +Changed in version 2.2.2: +The strict flag was added. + +Changed in version 2.4: +The strict flag was deprecated. + +

      + +

      +The other public Parser methods are: + +

      +

      + +
      parse(fp[, headersonly])
      +
      +Read all the data from the file-like object fp, parse the +resulting text, and return the root message object. fp must +support both the readline() and the read() methods +on file-like objects. + +

      +The text contained in fp must be formatted as a block of RFC 2822 +style headers and header continuation lines, optionally preceded by a +envelope header. The header block is terminated either by the +end of the data or by a blank line. Following the header block is the +body of the message (which may contain MIME-encoded subparts). + +

      +Optional headersonly is as with the parse() method. + +

      + +Changed in version 2.2.2: +The headersonly flag was added. + +

      + +

      +

      + +
      parsestr(text[, headersonly])
      +
      +Similar to the parse() method, except it takes a string +object instead of a file-like object. Calling this method on a string +is exactly equivalent to wrapping text in a StringIO +instance first and calling parse(). + +

      +Optional headersonly is a flag specifying whether to stop +parsing after reading the headers or not. The default is False, +meaning it parses the entire contents of the file. + +

      + +Changed in version 2.2.2: +The headersonly flag was added. + +

      + +

      +Since creating a message object structure from a string or a file +object is such a common task, two functions are provided as a +convenience. They are available in the top-level email +package namespace. + +

      +

      + +
      message_from_string(s[, _class[, strict]])
      +
      +Return a message object structure from a string. This is exactly +equivalent to Parser().parsestr(s). Optional _class and +strict are interpreted as with the Parser class constructor. + +

      + +Changed in version 2.2.2: +The strict flag was added. + +

      + +

      +

      + +
      message_from_file(fp[, _class[, strict]])
      +
      +Return a message object structure tree from an open file object. This +is exactly equivalent to Parser().parse(fp). Optional +_class and strict are interpreted as with the +Parser class constructor. + +

      + +Changed in version 2.2.2: +The strict flag was added. + +

      + +

      +Here's an example of how you might use this at an interactive Python +prompt: + +

      +

      +>>> import email
      +>>> msg = email.message_from_string(myString)
      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/node8.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/3_0/docs/node8.html Mon Mar 6 02:05:58 2006 @@ -0,0 +1,133 @@ + + + + + + + + + + + +2.2.3 Additional notes + + + + + +

      +2.2.3 Additional notes +

      + +

      +Here are some notes on the parsing semantics: + +

      + +

        +
      • Most non-multipart type messages are parsed as a single + message object with a string payload. These objects will return + False for is_multipart(). Their + get_payload() method will return a string object. + +

        +

      • +
      • All multipart type messages will be parsed as a + container message object with a list of sub-message objects for + their payload. The outer container message will return + True for is_multipart() and their + get_payload() method will return the list of + Message subparts. + +

        +

      • +
      • Most messages with a content type of message/* + (e.g. message/delivery-status and + message/rfc822) will also be parsed as container + object containing a list payload of length 1. Their + is_multipart() method will return True. The + single element in the list payload will be a sub-message object. + +

        +

      • +
      • Some non-standards compliant messages may not be internally consistent + about their multipart-edness. Such messages may have a + Content-Type: header of type multipart, but their + is_multipart() method may return False. If such + messages were parsed with the FeedParser, they will have an + instance of the MultipartInvariantViolationDefect class in their + defects attribute list. See email.Errors for + details. +
      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/3_0/docs/previous.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/pyfav.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/3_0/docs/up.png ============================================================================== Binary file. No diff available. From python-checkins at python.org Mon Mar 6 02:11:29 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 02:11:29 +0100 (CET) Subject: [Python-checkins] r42861 - sandbox/trunk/emailpkg/3_0 sandbox/trunk/emailpkg/3_0/MANIFEST Message-ID: <20060306011129.03A9A1E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 02:11:25 2006 New Revision: 42861 Modified: sandbox/trunk/emailpkg/3_0/ (props changed) sandbox/trunk/emailpkg/3_0/MANIFEST Log: Fix MANIFEST and ignore dist directory. Modified: sandbox/trunk/emailpkg/3_0/MANIFEST ============================================================================== --- sandbox/trunk/emailpkg/3_0/MANIFEST (original) +++ sandbox/trunk/emailpkg/3_0/MANIFEST Mon Mar 6 02:11:25 2006 @@ -74,6 +74,8 @@ email/test/data/msg_40.txt email/test/data/msg_41.txt email/test/data/msg_42.txt +email/test/data/msg_43.txt +email/test/data/msg_44.txt moredata/crispin-torture.txt docs/about.html docs/blank.png From python-checkins at python.org Mon Mar 6 02:24:32 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 02:24:32 +0100 (CET) Subject: [Python-checkins] r42862 - in sandbox/trunk/emailpkg/2_5: MANIFEST NEWS.txt README.txt docs docs/about.html docs/blank.png docs/contents.png docs/email-dir.txt docs/email-mime.txt docs/email-simple.txt docs/email-unpack.txt docs/index.dat docs/index.html docs/index.png docs/internals.pl docs/intlabels.pl docs/labels.pl docs/mimelib.css docs/mimelib.html docs/mimelib.pdf docs/module-email.Charset.html docs/module-email.Encoders.html docs/module-email.Errors.html docs/module-email.Generator.html docs/module-email.Header.html docs/module-email.Iterators.html docs/module-email.Message.html docs/module-email.Parser.html docs/module-email.Utils.html docs/module-email.html docs/modules.png docs/next.png docs/node1.html docs/node10.html docs/node17.html docs/node18.html docs/node19.html docs/node4.html docs/node6.html docs/node7.html docs/node9.html docs/previous.png docs/pyfav.png docs/up.png Message-ID: <20060306012432.E06A01E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 02:24:24 2006 New Revision: 42862 Added: sandbox/trunk/emailpkg/2_5/docs/ sandbox/trunk/emailpkg/2_5/docs/about.html sandbox/trunk/emailpkg/2_5/docs/blank.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/contents.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/email-dir.txt sandbox/trunk/emailpkg/2_5/docs/email-mime.txt sandbox/trunk/emailpkg/2_5/docs/email-simple.txt sandbox/trunk/emailpkg/2_5/docs/email-unpack.txt sandbox/trunk/emailpkg/2_5/docs/index.dat sandbox/trunk/emailpkg/2_5/docs/index.html sandbox/trunk/emailpkg/2_5/docs/index.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/internals.pl sandbox/trunk/emailpkg/2_5/docs/intlabels.pl sandbox/trunk/emailpkg/2_5/docs/labels.pl sandbox/trunk/emailpkg/2_5/docs/mimelib.css sandbox/trunk/emailpkg/2_5/docs/mimelib.html sandbox/trunk/emailpkg/2_5/docs/mimelib.pdf (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/module-email.Charset.html sandbox/trunk/emailpkg/2_5/docs/module-email.Encoders.html sandbox/trunk/emailpkg/2_5/docs/module-email.Errors.html sandbox/trunk/emailpkg/2_5/docs/module-email.Generator.html sandbox/trunk/emailpkg/2_5/docs/module-email.Header.html sandbox/trunk/emailpkg/2_5/docs/module-email.Iterators.html sandbox/trunk/emailpkg/2_5/docs/module-email.Message.html sandbox/trunk/emailpkg/2_5/docs/module-email.Parser.html sandbox/trunk/emailpkg/2_5/docs/module-email.Utils.html sandbox/trunk/emailpkg/2_5/docs/module-email.html sandbox/trunk/emailpkg/2_5/docs/modules.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/next.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/node1.html sandbox/trunk/emailpkg/2_5/docs/node10.html sandbox/trunk/emailpkg/2_5/docs/node17.html sandbox/trunk/emailpkg/2_5/docs/node18.html sandbox/trunk/emailpkg/2_5/docs/node19.html sandbox/trunk/emailpkg/2_5/docs/node4.html sandbox/trunk/emailpkg/2_5/docs/node6.html sandbox/trunk/emailpkg/2_5/docs/node7.html sandbox/trunk/emailpkg/2_5/docs/node9.html sandbox/trunk/emailpkg/2_5/docs/previous.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/pyfav.png (contents, props changed) sandbox/trunk/emailpkg/2_5/docs/up.png (contents, props changed) Removed: sandbox/trunk/emailpkg/2_5/NEWS.txt Modified: sandbox/trunk/emailpkg/2_5/ (props changed) sandbox/trunk/emailpkg/2_5/MANIFEST sandbox/trunk/emailpkg/2_5/README.txt Log: Remove NEWS.txt, add docs, and other updates for email 2.5.7. Modified: sandbox/trunk/emailpkg/2_5/MANIFEST ============================================================================== --- sandbox/trunk/emailpkg/2_5/MANIFEST (original) +++ sandbox/trunk/emailpkg/2_5/MANIFEST Mon Mar 6 02:24:24 2006 @@ -83,10 +83,15 @@ docs/email-mime.txt docs/email-simple.txt docs/email-unpack.txt +docs/index.dat docs/index.html docs/index.png +docs/internals.pl +docs/intlabels.pl +docs/labels.pl docs/mimelib.css docs/mimelib.html +docs/mimelib.pdf docs/module-email.Charset.html docs/module-email.Encoders.html docs/module-email.Errors.html @@ -101,13 +106,13 @@ docs/next.png docs/node1.html docs/node10.html -docs/node11.html +docs/node17.html docs/node18.html docs/node19.html -docs/node20.html docs/node4.html docs/node6.html docs/node7.html -docs/node8.html +docs/node9.html docs/previous.png +docs/pyfav.png docs/up.png Deleted: /sandbox/trunk/emailpkg/2_5/NEWS.txt ============================================================================== --- /sandbox/trunk/emailpkg/2_5/NEWS.txt Mon Mar 6 02:24:24 2006 +++ (empty file) @@ -1,594 +0,0 @@ -Copyright (C) 2001-2004 Python Software Foundation - -Here is a history of user visible changes to this software. - -2.5.5 (13-May-2004) -2.5.4 -2.5.3 -2.5.2 - - Lots of bug fixes. - -2.5.1 (30-Mar-2003) - - Bug fixes and improved compatibility for Python 2.2.0. - -2.5 (21-Mar-2003) - - A few other minor bug fixes. - -2.5b1 (11-Mar-2003) - - - Message.get_payload() now recognizes various uuencoded - Content-Transfer-Encodings (e.g. x-uuencode). - - When passing decode=True to Message.get_payload() and a - low-level decoding error occurs, the payload is returned as-is - instead of raising an exception. - - - Header.__init__() and Header.append() now accept an optional - argument `errors' which is passed through to the unicode() and - ustr.encode() calls. You can use this to prevent conversion - errors by e.g. passing 'replace' or 'ignore'. - - RFC 2822 specifies that long headers should be split at the - "highest level syntactic break" possible. This can only really - be determined by the application, and the current API doesn't - support arbitrary break points. As a compromise, - Header.encode() grew a `splitchars' argument which provides some - control over splitting at higher level syntactic breaks. - - Header.decode_header() now transforms binascii.Errors into - email.Errors.HeaderParseErrors when bogus base64 data appears in - the header. - - The header splitting and folding algorithms were completely - reimplemented, especially when dealing with ASCII headers. - - We now preserve spaces between encoded and non-encode parts in - RFC 2047 headers when converting the header to Unicode. While - the RFC is technically ambiguous on this point, this is the - behavior most people expect. - - - email.Iterators.body_line_iterator() now takes an optional - decode argument, which is passed through to Message.get_payload(). - - - The MIMEText constructor used to append a newline to the _text - argument if it didn't already end in a newline. Now it doesn't. - This could theoretically break code so it should be considered - experimental for 2.5 beta 1. But it's the right fix, so we'll - keep it unless there are howls of derision. - - - The quopriMIME.header_encode() maxlinelen argument now accepts - None, which inhibits line breaking. - - - Support for Korean charsets was added to Charset.py. Also the - Charset class grew a __repr__() method. - - - Various and sundry bug fixes, improved RFC conformance, and - improved lax parsing. - -2.4.3 (14-Oct-2002) -2.4.2 (10-Oct-2002) -2.4.1 (07-Oct-2002) - - Last minute patches for the Python 2.2.2 backport. This includes - case insensitivity of character set names, patches for Windows, - and some fixes for non-splitting of unspecified 8bit header data. - -2.4 (01-Oct-2002) - - - Updated all the documentation. - - - Clarification to the semantics of Header.__init__() and - Header.append() when it gets byte strings and Unicode strings as - its first argument. When a byte string is used, the charset - must be the encoding of the string, such that unicode(s,charset) - succeeds. When a Unicode string is used, the charset is a hint, - and the first of the following to succeed is used: us-ascii, the - charset hint, utf-8. - - - A new header encoding flag has been added to the Charset - module. SHORTEST (which cannot be used for body encodings) - returns the string either quoted-printable or base64 encoding, - whichever is shortest in terms of characters. This is a good - heuristic for providing the most human readable value possible. - The utf-8 charset uses SHORTEST encoding by default now. - - - Message.get_content_charset() is a new method that returns the - charset parameter on the Content-Type header, unquoted and RFC - 2231 decoded if necessary. - - - "import email" no longer imports some sub-modules by side-effect. - - - Fixed some problems related to RFC 2231 encoding of boundary and - charset parameters on Content-Type headers. Document that - get_param() and get_params() may return values that are strings - or 3-tuples. - - - The signature of the non-public function _structure() has - changed. - -2.3.1 (13-Sep-2002) - - - Minor update to the distutils package. A file was missing in - the email-2.3.tar.gz file. - -2.3 (10-Sep-2002) - - - Added support for RFC 2231 encoding. Patch by Oleg Broytmann - (previous patch was for RFC 2231 decoding only). - - - New method Message.replace_header() which replaces the first - occurrence of a header with a new value, preserving header order - and header name case. Patch by Skip Montanaro. - - - RFC 2045, section 5.2 states that if the Content-Type: header is - invalid, it defaults to text/plain. Implement simple checks for - this in get_content_type(), get_content_maintype(), and - get_content_subtype(). These will no longer raise ValueErrors. - - - In non-strict parsing, if no start boundary can be found for a - multipart message, the entire body of the message is set as the - payload. Strict parsing such a message will still raise a - BoundaryError. - -2.2 (23-Jul-2002) - - - Better support for default content types has been added. - Specifically: - - o The following methods have been silently deprecated. At some - future release they may be unsilently deprecated: - Message.get_type(), Message.get_main_type(), - Message.get_subtype(). - - o The following methods have been added as a consistent way of - getting a message's content type: Message.get_content_type(), - Message.get_content_maintype(), Message.get_content_subtype(). - - Note that none of these methods take a `failobj' argument - because messages always have a default content type. Usually - this type is text/plain, but for messages inside a - multipart/digest container, it's message/rfc822. - - Also note that .get_content_maintype() and - .get_content_subtype() can raise ValueError exceptions if the - default content type doesn't include exactly one slash. - - - The Parser constructor's `strict' flag is exposed to - email.message_from_file() and email.message_from_string(). - Also, non-strict parsing is now the default, since that seems to - be the most useful behavior. - - - email.Header.Header.append() now allows the charset argument to - be a string, naming a character set. It will convert these to a - Charset instance automatically. - - - The test procedure has changed. See the README for details. - Also, a new torture test has been added. - - - The non-public function email.Iterators._structure() can now - take an output file object (which must be suitable for print>>). - -2.1 (09-Jul-2002) - - - Support for RFC 2231 by Oleg Broytmann was added. - - - Fixed some representational, parsing, and generation bugs with - multipart/digest and message/rfc822 messages. Now we guarantee - that the structure of such messages is something like: - - multipart/digest - message/rfc822 - text/plain (or whatever the subpart's type is) - message/rfc822 - text/plain (ditto) - - The encapsulating message/rfc822 object is a multipart of - exactly length 1. - - To preserve idempotency, the concept of a "default type" is - added to Message objects. For most messages the default type is - text/plain, except for messages at the first level inside a - multipart/digest which are message/rfc822. This default type is - not described in the Content-Type: header of the container. - - Message objects thus have new methods get_default_type() and - set_default_type(), the latter of which takes a string argument - that must be either 'text/plain' or 'message/rfc822'. - - (Some changes were also made to the non-public interface for the - Generator class.) - - - The Header class now knows how to split long non-RFC 2047 - encoded headers (i.e. us-ascii charset) in the RFC 2822 - recommended way. Splits are attempted at the "highest-level - syntactic breaks" which we define as on parameter semicolons, - followed by folding whitespace. No errors are raised if long - headers still exceed the maximum RFC 2822 header length of 998 - characters after splitting. - - - Other Header class API changes: - o All __init__() arguments have default values now. Also, a - new argument continuation_ws has been added (defaults to a - single ASCII space). - o Rich comparison __eq__ and __ne__ operators are defined - o __unicode__() for Python 2.2 by Mikhail Zabaluev - o guess_maxlinelen() method has been removed - o encode_chunks() is no longer public - - - The email.Header module has grown a function make_header() which - takes the output of decode_header() and returns a Header - instance. - - - A non-public function email.Iterators._structure() has been - added for debugging purposes. - - - MIMEMultipart.__init__() doesn't attach the subparts of the - tuple is empty (i.e. there are no subparts). Fixed a bug - related to passing in explicit boundary. - - - Anthony Baxter's patches for non-strict parsing have been added - to the Parser class. There are currently no test cases for - non-strict parsing yet. Other Parser class API changes: - o Parser.__init__() grew a strict argument, defaulting to - true for backwards compatibility. - o parse() and parsestr() both grew a headersonly argument - which tells them to stop parsing once the header block is - parsed. The file pointer is left at the start of the body. - - - For RFC 2231 support, added the following functions to the - email.Utils module: decode_rfc2231(), encode_rfc2231(), - decode_params(). - -2.0.5 (02-Jun-2002) - - - Two new class/modules MIMEMultipart and MIMENonMultipart have - been added. The former is useful as a concrete class for - creating multipart/* parts. The latter is mostly useful as a - base class for other MIME non-multipart subparts. For example, - the MIMEAudio, MIMEImage, and MIMEText clases now derive from - MIMENonMultipart. Note also that MIMENonMultipart.attach() - raises a MultipartConversionError. - - - The message structure for message/rfc822 subparts has been - changed to be more consistent. Now message/rfc822 payloads are - defined as a list containing exactly one element, the - sub-Message object. - - - The callable interface to the Generator class is now silently - deprecated in favor of the Generator.flatten() method. - __call__() can be 2-3 times slower than the equivalent normal - method. - -2.0.4 (21-May-2002) - - - Fixed a bug in email.Utils.getaddresses(). - -2.0.3 (19-May-2002) - - - Fixed some limitations that caused the Parser to not work with - CRLF style line-endings. The parser should now be able to parse - any email message with consistent line endings of \r, \n, \r\n. - - - Fixed a bug related to the semantics of the Header class - constructor. If neither maxlinelen or header_name is given, the - maximum line length is 76 by default. If maxlinelen is given, - it is always honored. If maxlinelen is not given, but - header_name is given, then a suitable default line length is - calculated. - - - Implemented a simpler testing framework. Now you just need to - run "python test.py" in the source directory. - - - Merged with the standard Python cvs tree, with compatibility - modules for working in Python 2.1 and Python 2.2. - -2.0.2 (26-Apr-2002) - - - Fix a Python 2.1.3 incompatibility in Iterators.py, - body_line_iterator(). - -2.0.1 (10-Apr-2002) - - - Minor bug fixes in the test suite. - - - One minor API change: in Header.append(), the charset is - optional, and used to default to the empty Charset(). It now - defaults to the charset given in the Header constructor. - -2.0 (08-Apr-2002) - - - Message.add_payload() is now deprecated. Instead use - Message.attach() and Message.set_payload(). The former always - ensures that the message's payload is a list object, while the - latter is used only for scalar payloads (i.e. a string or a - single Message object in the case of message/rfc822 types). - - - email.Utils.formataddr(): New function which is the inverse of - .parseaddr(); i.e. it glues a realname and an email address - together. This replaces email.Utils.dump_address_pair() which - is deprecated. - - - class Charset now has a __str__() method, and implements rich - comparison operators for comparison to lower case charset - names. - - - encode_7or8bit(): If there is no payload, set the - Content-Transfer-Encoding: value to 7bit. - - - Fixes for bugs in generating multipart messages that had exactly - zero or one subparts. - -1.2 (18-Mar-2002) - - - In the MIMEText class's constructor, the _encoder argument is - deprecated. You will get a DeprecationWarning if you try to use - it. This is because there is a fundamental conflict between - _encoder and the fact that _charset is passed to the underlying - set_payload() method. _encoder really makes no sense any more. - - - When Message.set_type() is used to set the Content-Type: header, - the MIME-Version: header is always set (overriding any existing - MIME-Version: header). - - - More liberal acceptance of parameter formatting, e.g. this is - now accepted: Content-Type: multipart/mixed; boundary = "FOO" - I.e. spaces around the = sign. - - - Bug fix in Generator related to splitting long lines in a - multiline header. - - - In class Charset, __str__() method added, as were __eq__() and - __ne__(). - - - Charset.get_body_encoding() may now return a function as well as - a string character set name. The function takes a single - argument, which is a Message instance, and may change the - Content-Transfer-Encoding: header (or do any other manipulations - on the message). - - - Charset.from_splittable() added argument to_output which is used - to specify whether the input_codec or the output_codec is used - for the conversion (by default, the output codec is used). - -1.1 (unreleased) - - - No changes since 0.97. Only the version number has changed. - -0.97 (unreleased) - - - Message.set_charset() can now take a string naming a character - set in addition to a Charset instance. In the former case, a - Charset is instantiated by passing the string to its - constructor. - - - The MIMEText constructor now passes the _charset argument to the - underlying set_charset() method. This makes things consistent - at the cost of a minor semantic change: the resulting instance - will have a Content-Transfer-Encoding: header where previously - it did not. - - - A fix for a crash when quopriMIME.encode() tried to encode a - multiline string containing a blank line. - - - New module Header.py which provides a higher level interface for - encoded email headers, such as Subject:, From:, and To:. This - module provides an abstraction for composing such headers out of - charset encoded parts, and for decoding such headers. It - properly splits lines on character boundaries even for multibyte - character sets. - - - New RFC compliant base64 and quoted-printable modules, called - base64MIME.py and quopriMIME.py. These are intended to replace - the Python standard base64.py and quopri.py modules, but are - geared toward their use conformant to the various MIME email - standards. - - - The Message class is much more character set aware and RFC - compliant: - - + set_payload() now takes a new optional charset argument - + New methods set_charset(), get_charset(), set_param(), - del_param(), set_type() - + Header parameter quoting is more RFC compliant - + get_param() and get_params() now take a new optional unquote - argument - - - The Charset module now knows about utf-8, gb2132, and big5 - codecs, the latter two of which are available independently of - Python (see the comments in this module for downloading Chinese, - Japanese, and Korean codecs). - - New Charset methods get_body_encoding(), get_output_charset(), - encoded_header_len(), header_encode(), and body_encode(). - - - The Generator now handles encoding the body, if the message - object has a character set. - - - The Utils module has new functions fix_eols() and make_msgid(). - It also includes a workaround for bugs in parseaddr() when used - with Python versions before 2.2. - - - A fix for a Parser bug when parsing multipart/* parts that - contain only a single subpart. - -0.96 (19-Nov-2001) - - - A fix for email.Utils.formatdate() for "uneven" timezones like - Australia/Adelaide and America/St_Johns. - -0.95 (09-Nov-2001) - - - A new implementation of email.Utils.formatdate() which makes it - more RFC 2822 compliant. - -0.94 (25-Oct-2001) - - - A fix for SF bug #472560, extra newlines returned by get_param() - when the separating semi-colon shows up on a continuation line - (legal, but weird). - -0.93 (17-Oct-2001) - - - Fix for SF bug #471918, generator splitting long headers - produces dupliaction. Bug report and fix contributed by Matthew - Cowles. - - - If a line could not be split on semicolons in order to produce - shorter lines, an attempt is made to split the header on folding - white space. One deficiency still: it won't try to split on - both semis and folding whitespace. Oh well. - -0.92 (14-Oct-2001) - - - Iterators.typed_subpart_iterator() should use a 'text/plain' - failobj in its get_main_type() call. - - - Added class Parser.HeaderParser which just parses headers and - leaves the message as a string payload; it does not recursively - parse the body. - -0.91 (09-Oct-2001) - - - Added the MIMEAudio class/module for audio/* MIME types. - Contributed by Anthony Baxter. - - - Fixed a bug in Message.get_all() where failobj was never - returned if no matching fields were found. - -0.90 (01-Oct-2001) - - - mimelib has been integrated with Python 2.2. A compatibility - package called email 0.90 is being made available here. It is - significantly different in API from the mimelib package. See - the README for details. mimelib as a separate package is no - longer being supported. - -0.6 (17-Sep-2001) - - - Last minute bug fixes. - -0.5 (17-Sep-2001) - - - New methods in the top-level mimelib package namespace: - + messageFromString() to create an object tree from a string. - + messageFromFile() to create an object tree from an open file. - - - New methods in the address.py module: - + encode() for encoding to RFC 2047 headers - + decode() for decoding from RFC 2047 headers - - - New methods in the Message class: - + asString() to get a flat text representation of the object - tree. - + __str__() same as asString() but includes the Unix-From - envelope header in the output. - + __contains__() for use with the `in' operator. - + attach() is a synonym for add_payload() - + getcharsets() - + getfilename() - + getboundary() - + setboundary() - + getdecodedpayload() - + getpayloadastext() - + getbodyastext() - - - Message.preamble and Message.epilogue default to None (they used - to not exist by default). - - - Changes to the Generator class: - + New optional argument `maxheaderlen' for __init__() controls - the maximum length in characters of any header line. - + write() isn't the entry point for doing the text generation - any more. This lets us make this method compatible with - file-like objects. Use __call__() semantics instead. - + Calling a Generator instance creates the plain text - message. This is the same as the old write() interface - except that the optional `unixfrom' argument now defaults to - 0. - + There is a new, undocumented semi-private interface for - extending the MIME types Generator can handle. UTSL. - - - New Encoders.py module contains some useful encoders for Image - and Text instances. - - - Text.__init__() has a new _encoder optional argument, which has - the same semantics as _encoder for Image.__init__(). - - - StringableMixin.py module has been removed, and its - functionality merged back into the Message class. - - - MessageParseError doesn't contain line numbers any more. - - - Lots of bug fixes; lots more unit tests. - -0.4 (09-Jul-2001) - - - New module/class called RFC822 which represents message/rfc822 - MIME types. This takes a single Message instance. - - - Message.getmaintype() and Message.getsubtype() will now return - failobj when the Content-Type: header doesn't have enough - information. - -0.3 (20-Apr-2001) - - - In the Image class, the _encoding argument has been changed to - _encoder. Also ImageTypeError is removed; if Image.__init__() - can't guess the image's minor type, a TypeError is raised - instead. - - - Message.getparam() and Message.getparams() have grown a new - optional argument `header'. - - - MsgReader class has grown a new method readlines() for - compatibility with Python 2.1's xreadline module. - - - The ReprMixin module and class have been renamed to - StringableMixin - - - New exception MultipartConversionError can be raised by - Message.add_payload() - - - Bug fixes - - - mimelib has been moved to SourceForge. See - http://mimelib.sourceforge.net - -0.2 (14-Feb-2001) - - - Generator constructor has a new optional argument `mangle_from_' - which is a flag. If true, the generated flat text has From_ - lines mangled in the body of messages by prepending a `>' in - front of the line. This assures that such lines are not - mistaken for Unix mailbox separators. - - - Added a new class ReprMixin for adding convenience methods - get_text() and __str__() to Message subclasses. - - - RFC 1341 (MIME) calls the blob between the closing boundary and - the end of the message, the `epilogue'. Change `postamble' to - `epilogue' in Message and Generator classes. - - - Much better conformance to RFC 1341 in the Generator. - - - Added __all__ support for "from mimelib import *" - - - Added LICENSE file, currently BSD-ish. The copyright will - eventually be transferred to the Python Software Foundation when - it is activated. - - - Bug fixes. - -0.1 (24-Jan-2001) - - Initial beta release. - - - -Local Variables: -mode: indented-text -indent-tabs-mode: nil -End: Modified: sandbox/trunk/emailpkg/2_5/README.txt ============================================================================== --- sandbox/trunk/emailpkg/2_5/README.txt (original) +++ sandbox/trunk/emailpkg/2_5/README.txt Mon Mar 6 02:24:24 2006 @@ -1,5 +1,5 @@ email -- a mail and MIME handling package -Copyright (C) 2001-2004 Python Software Foundation +Copyright (C) 2001-2006 Python Software Foundation Introduction Added: sandbox/trunk/emailpkg/2_5/docs/about.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/about.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,108 @@ + + + + + + + + + + +About this document ... + + + + + +

      +About this document ... +

      + email Package Reference, +March 5, 2006, Release 2.5 +

      This document was generated using the + LaTeX2HTML translator. +

      + +

      + LaTeX2HTML is Copyright © + 1993, 1994, 1995, 1996, 1997, Nikos + Drakos, Computer Based Learning Unit, University of + Leeds, and Copyright © 1997, 1998, Ross + Moore, Mathematics Department, Macquarie University, + Sydney. +

      + +

      The application of + LaTeX2HTML to the Python + documentation has been heavily tailored by Fred L. Drake, + Jr. Original navigation icons were contributed by Christopher + Petrilli. +

      + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/blank.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/contents.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/email-dir.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/email-dir.txt Mon Mar 6 02:24:24 2006 @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +"""Send the contents of a directory as a MIME message. + +Usage: dirmail [options] from to [to ...]* + +Options: + -h / --help + Print this message and exit. + + -d directory + --directory=directory + Mail the contents of the specified directory, otherwise use the + current directory. Only the regular files in the directory are sent, + and we don't recurse to subdirectories. + +`from' is the email address of the sender of the message. + +`to' is the email address of the recipient of the message, and multiple +recipients may be given. + +The email is sent by forwarding to your local SMTP server, which then does the +normal delivery process. Your local machine must be running an SMTP server. +""" + +import sys +import os +import getopt +import smtplib +# For guessing MIME type based on file name extension +import mimetypes + +from email import Encoders +from email.Message import Message +from email.MIMEAudio import MIMEAudio +from email.MIMEBase import MIMEBase +from email.MIMEMultipart import MIMEMultipart +from email.MIMEImage import MIMEImage +from email.MIMEText import MIMEText + +COMMASPACE = ', ' + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ + if msg: + print >> sys.stderr, msg + sys.exit(code) + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) + except getopt.error, msg: + usage(1, msg) + + dir = os.curdir + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-d', '--directory'): + dir = arg + + if len(args) < 2: + usage(1) + + sender = args[0] + recips = args[1:] + + # Create the enclosing (outer) message + outer = MIMEMultipart() + outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir) + outer['To'] = COMMASPACE.join(recips) + outer['From'] = sender + outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' + # To guarantee the message ends with a newline + outer.epilogue = '' + + for filename in os.listdir(dir): + path = os.path.join(dir, filename) + if not os.path.isfile(path): + continue + # Guess the content type based on the file's extension. Encoding + # will be ignored, although we should check for simple things like + # gzip'd or compressed files. + ctype, encoding = mimetypes.guess_type(path) + if ctype is None or encoding is not None: + # No guess could be made, or the file is encoded (compressed), so + # use a generic bag-of-bits type. + ctype = 'application/octet-stream' + maintype, subtype = ctype.split('/', 1) + if maintype == 'text': + fp = open(path) + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'image': + fp = open(path, 'rb') + msg = MIMEImage(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'audio': + fp = open(path, 'rb') + msg = MIMEAudio(fp.read(), _subtype=subtype) + fp.close() + else: + fp = open(path, 'rb') + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) + fp.close() + # Encode the payload using Base64 + Encoders.encode_base64(msg) + # Set the filename parameter + msg.add_header('Content-Disposition', 'attachment', filename=filename) + outer.attach(msg) + + # Now send the message + s = smtplib.SMTP() + s.connect() + s.sendmail(sender, recips, outer.as_string()) + s.close() + + +if __name__ == '__main__': + main() Added: sandbox/trunk/emailpkg/2_5/docs/email-mime.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/email-mime.txt Mon Mar 6 02:24:24 2006 @@ -0,0 +1,34 @@ +# Import smtplib for the actual sending function +import smtplib + +# Here are the email pacakge modules we'll need +from email.MIMEImage import MIMEImage +from email.MIMEMultipart import MIMEMultipart + +COMMASPACE = ', ' + +# Create the container (outer) email message. +msg = MIMEMultipart() +msg['Subject'] = 'Our family reunion' +# me == the sender's email address +# family = the list of all recipients' email addresses +msg['From'] = me +msg['To'] = COMMASPACE.join(family) +msg.preamble = 'Our family reunion' +# Guarantees the message ends in a newline +msg.epilogue = '' + +# Assume we know that the image files are all in PNG format +for file in pngfiles: + # Open the files in binary mode. Let the MIMEImage class automatically + # guess the specific image type. + fp = open(file, 'rb') + img = MIMEImage(fp.read()) + fp.close() + msg.attach(img) + +# Send the email via our own SMTP server. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, family, msg.as_string()) +s.close() Added: sandbox/trunk/emailpkg/2_5/docs/email-simple.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/email-simple.txt Mon Mar 6 02:24:24 2006 @@ -0,0 +1,25 @@ +# Import smtplib for the actual sending function +import smtplib + +# Import the email modules we'll need +from email.MIMEText import MIMEText + +# Open a plain text file for reading. For this example, assume that +# the text file contains only ASCII characters. +fp = open(textfile, 'rb') +# Create a text/plain message +msg = MIMEText(fp.read()) +fp.close() + +# me == the sender's email address +# you == the recipient's email address +msg['Subject'] = 'The contents of %s' % textfile +msg['From'] = me +msg['To'] = you + +# Send the message via our own SMTP server, but don't include the +# envelope header. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, [you], msg.as_string()) +s.close() Added: sandbox/trunk/emailpkg/2_5/docs/email-unpack.txt ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/email-unpack.txt Mon Mar 6 02:24:24 2006 @@ -0,0 +1,83 @@ +#!/usr/bin/env python + +"""Unpack a MIME message into a directory of files. + +Usage: unpackmail [options] msgfile + +Options: + -h / --help + Print this message and exit. + + -d directory + --directory=directory + Unpack the MIME message into the named directory, which will be + created if it doesn't already exist. + +msgfile is the path to the file containing the MIME message. +""" + +import sys +import os +import getopt +import errno +import mimetypes +import email + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ + if msg: + print >> sys.stderr, msg + sys.exit(code) + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) + except getopt.error, msg: + usage(1, msg) + + dir = os.curdir + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-d', '--directory'): + dir = arg + + try: + msgfile = args[0] + except IndexError: + usage(1) + + try: + os.mkdir(dir) + except OSError, e: + # Ignore directory exists error + if e.errno <> errno.EEXIST: raise + + fp = open(msgfile) + msg = email.message_from_file(fp) + fp.close() + + counter = 1 + for part in msg.walk(): + # multipart/* are just containers + if part.get_content_maintype() == 'multipart': + continue + # Applications should really sanitize the given filename so that an + # email message can't be used to overwrite important files + filename = part.get_filename() + if not filename: + ext = mimetypes.guess_extension(part.get_type()) + if not ext: + # Use a generic bag-of-bits extension + ext = '.bin' + filename = 'part-%03d%s' % (counter, ext) + counter += 1 + fp = open(os.path.join(dir, filename), 'wb') + fp.write(part.get_payload(decode=1)) + fp.close() + + +if __name__ == '__main__': + main() Added: sandbox/trunk/emailpkg/2_5/docs/index.dat ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/index.dat Mon Mar 6 02:24:24 2006 @@ -0,0 +1,132 @@ +email (standard module)###DEF0000002884 +email.Message (standard module)###DEF0000002898 +Message (class in email.Message)###0000002899 +as_string() (Message method)###0000002900 +__str__() (Message method)###0000002901 +is_multipart() (Message method)###0000002902 +set_unixfrom() (Message method)###0000002903 +get_unixfrom() (Message method)###0000002904 +attach() (Message method)###0000002905 +get_payload() (Message method)###0000002906 +set_payload() (Message method)###0000002907 +set_charset() (Message method)###0000002908 +get_charset() (Message method)###0000002909 +__len__() (Message method)###0000002910 +__contains__() (Message method)###0000002911 +__getitem__() (Message method)###0000002912 +__setitem__() (Message method)###0000002913 +__delitem__() (Message method)###0000002914 +has_key() (Message method)###0000002915 +keys() (Message method)###0000002916 +values() (Message method)###0000002917 +items() (Message method)###0000002918 +get() (Message method)###0000002919 +get_all() (Message method)###0000002920 +add_header() (Message method)###0000002921 +replace_header() (Message method)###0000002922 +get_content_type() (Message method)###0000002923 +get_content_maintype() (Message method)###0000002924 +get_content_subtype() (Message method)###0000002925 +get_default_type() (Message method)###0000002926 +set_default_type() (Message method)###0000002927 +get_params() (Message method)###0000002928 +get_param() (Message method)###0000002929 +set_param() (Message method)###0000002930 +del_param() (Message method)###0000002931 +set_type() (Message method)###0000002932 +get_filename() (Message method)###0000002933 +get_boundary() (Message method)###0000002934 +set_boundary() (Message method)###0000002935 +get_content_charset() (Message method)###0000002936 +get_charsets() (Message method)###0000002937 +walk() (Message method)###0000002938 +preamble (in module email.Message)###0000002939 +epilogue (in module email.Message)###0000002940 +add_payload() (Message method)###0000002958 +get_type() (Message method)###0000002959 +get_main_type() (Message method)###0000002960 +get_subtype() (Message method)###0000002961 +email.Parser (standard module)###DEF0000002963 +Parser (class in email.Parser)###0000002965 +parse() (Parser method)###0000002966 +parsestr() (Parser method)###0000002967 +message_from_string() (in module email.Parser)###0000002968 +message_from_file() (in module email.Parser)###0000002969 +email.Generator (standard module)###DEF0000002974 +Generator (class in email.Generator)###0000002975 +flatten() (Generator method)###0000002976 +clone() (Generator method)###0000002977 +write() (Generator method)###0000002978 +DecodedGenerator (class in email.Generator)###0000002979 +__call__() (Generator method)###0000002985 +MIMEBase (class in email.Generator)###0000002987 +MIMENonMultipart (class in email.Generator)###0000002988 +MIMEMultipart (class in email.Generator)###0000002989 +MIMEAudio (class in email.Generator)###0000002990 +MIMEImage (class in email.Generator)###0000002991 +MIMEMessage (class in email.Generator)###0000002992 +MIMEText (class in email.Generator)###0000002993 +email.Header (standard module)###DEF0000002995 +Header (class in email.Header)###0000002996 +append() (Header method)###0000002997 +encode() (Header method)###0000002998 +__str__() (Header method)###0000002999 +__unicode__() (Header method)###0000003000 +__eq__() (Header method)###0000003001 +__ne__() (Header method)###0000003002 +decode_header() (in module email.Header)###0000003003 +make_header() (in module email.Header)###0000003004 +email.Charset (standard module)###DEF0000003034 +Charset (class in email.Charset)###0000003035 +input_charset (in module email.Charset)###0000003036 +header_encoding (in module email.Charset)###0000003037 +body_encoding (in module email.Charset)###0000003038 +output_charset (in module email.Charset)###0000003039 +input_codec (in module email.Charset)###0000003040 +output_codec (in module email.Charset)###0000003041 +get_body_encoding() (Charset method)###0000003042 +convert() (Charset method)###0000003043 +to_splittable() (Charset method)###0000003044 +from_splittable() (Charset method)###0000003045 +get_output_charset() (Charset method)###0000003046 +encoded_header_len() (Charset method)###0000003047 +header_encode() (Charset method)###0000003048 +body_encode() (Charset method)###0000003049 +__str__() (Charset method)###0000003050 +__eq__() (Charset method)###0000003051 +__ne__() (Header method)###0000003052 +add_charset() (in module email.Charset)###0000003053 +add_alias() (in module email.Charset)###0000003054 +add_codec() (in module email.Charset)###0000003055 +email.Encoders (standard module)###DEF0000003057 +encode_quopri() (in module email.Encoders)###0000003058 +encode_base64() (in module email.Encoders)###0000003061 +encode_7or8bit() (in module email.Encoders)###0000003062 +encode_noop() (in module email.Encoders)###0000003063 +email.Errors (standard module)###DEF0000003066 +MessageError (exception in email.Errors)###0000003067 +MessageParseError (exception in email.Errors)###0000003068 +HeaderParseError (exception in email.Errors)###0000003069 +BoundaryError (exception in email.Errors)###0000003070 +MultipartConversionError (exception in email.Errors)###0000003071 +email.Utils (standard module)###DEF0000003081 +quote() (in module email.Utils)###0000003082 +unquote() (in module email.Utils)###0000003083 +parseaddr() (in module email.Utils)###0000003084 +formataddr() (in module email.Utils)###0000003085 +getaddresses() (in module email.Utils)###0000003086 +parsedate() (in module email.Utils)###0000003087 +parsedate_tz() (in module email.Utils)###0000003088 +mktime_tz() (in module email.Utils)###0000003093 +formatdate() (in module email.Utils)###0000003094 +make_msgid() (in module email.Utils)###0000003095 +decode_rfc2231() (in module email.Utils)###0000003096 +encode_rfc2231() (in module email.Utils)###0000003097 +decode_params() (in module email.Utils)###0000003098 +dump_address_pair() (in module email.Utils)###0000003099 +decode() (in module email.Utils)###0000003100 +encode() (in module email.Utils)###0000003101 +email.Iterators (standard module)###DEF0000003118 +body_line_iterator() (in module email.Iterators)###0000003119 +typed_subpart_iterator() (in module email.Iterators)###0000003120 +_structure() (in module email.Iterators)###0000003121 Added: sandbox/trunk/emailpkg/2_5/docs/index.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/index.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,135 @@ + + + + + + + + + +email Package Reference + + + + + +

      + +

      +
      +

      email Package Reference

      +

      Barry Warsaw

      +

      +

      Release 2.5
      +March 5, 2006

      +

      +
      +
      + +

      + +

      Abstract:

      +
      + The email package provides classes and utilities to create, + parse, generate, and modify email messages, conforming to all the + relevant email and MIME related RFCs. +
      +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/index.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/internals.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/internals.pl Mon Mar 6 02:24:24 2006 @@ -0,0 +1,50 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate internals original text with physical files. + + +$key = q/module-email.Utils/; +$ref_files{$key} = "$dir".q|node15.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$ref_files{$key} = "$dir".q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$ref_files{$key} = "$dir".q|node14.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$ref_files{$key} = "$dir".q|node8.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$ref_files{$key} = "$dir".q|node11.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$ref_files{$key} = "$dir".q|node13.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$ref_files{$key} = "$dir".q|node16.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$ref_files{$key} = "$dir".q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/about/; +$ref_files{$key} = "$dir".q|node20.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$ref_files{$key} = "$dir".q|node12.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$ref_files{$key} = "$dir".q|node3.html|; +$noresave{$key} = "$nosave"; + +1; + Added: sandbox/trunk/emailpkg/2_5/docs/intlabels.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/intlabels.pl Mon Mar 6 02:24:24 2006 @@ -0,0 +1,135 @@ +%internal_labels = (); +1; # hack in case there are no entries + +$internal_labels{"l2h-1"} = "/node2.html"; +$internal_labels{"l2h-2"} = "/node3.html"; +$internal_labels{"l2h-3"} = "/node3.html"; +$internal_labels{"l2h-4"} = "/node3.html"; +$internal_labels{"l2h-5"} = "/node3.html"; +$internal_labels{"l2h-6"} = "/node3.html"; +$internal_labels{"l2h-7"} = "/node3.html"; +$internal_labels{"l2h-8"} = "/node3.html"; +$internal_labels{"l2h-9"} = "/node3.html"; +$internal_labels{"l2h-10"} = "/node3.html"; +$internal_labels{"l2h-11"} = "/node3.html"; +$internal_labels{"l2h-12"} = "/node3.html"; +$internal_labels{"l2h-13"} = "/node3.html"; +$internal_labels{"l2h-14"} = "/node3.html"; +$internal_labels{"l2h-15"} = "/node3.html"; +$internal_labels{"l2h-16"} = "/node3.html"; +$internal_labels{"l2h-17"} = "/node3.html"; +$internal_labels{"l2h-18"} = "/node3.html"; +$internal_labels{"l2h-19"} = "/node3.html"; +$internal_labels{"l2h-20"} = "/node3.html"; +$internal_labels{"l2h-21"} = "/node3.html"; +$internal_labels{"l2h-22"} = "/node3.html"; +$internal_labels{"l2h-23"} = "/node3.html"; +$internal_labels{"l2h-24"} = "/node3.html"; +$internal_labels{"l2h-25"} = "/node3.html"; +$internal_labels{"l2h-26"} = "/node3.html"; +$internal_labels{"l2h-27"} = "/node3.html"; +$internal_labels{"l2h-28"} = "/node3.html"; +$internal_labels{"l2h-29"} = "/node3.html"; +$internal_labels{"l2h-30"} = "/node3.html"; +$internal_labels{"l2h-31"} = "/node3.html"; +$internal_labels{"l2h-32"} = "/node3.html"; +$internal_labels{"l2h-33"} = "/node3.html"; +$internal_labels{"l2h-34"} = "/node3.html"; +$internal_labels{"l2h-35"} = "/node3.html"; +$internal_labels{"l2h-36"} = "/node3.html"; +$internal_labels{"l2h-37"} = "/node3.html"; +$internal_labels{"l2h-38"} = "/node3.html"; +$internal_labels{"l2h-39"} = "/node3.html"; +$internal_labels{"l2h-40"} = "/node3.html"; +$internal_labels{"l2h-41"} = "/node3.html"; +$internal_labels{"l2h-42"} = "/node3.html"; +$internal_labels{"l2h-43"} = "/node3.html"; +$internal_labels{"l2h-44"} = "/node3.html"; +$internal_labels{"l2h-45"} = "/node4.html"; +$internal_labels{"l2h-46"} = "/node4.html"; +$internal_labels{"l2h-47"} = "/node4.html"; +$internal_labels{"l2h-48"} = "/node4.html"; +$internal_labels{"l2h-49"} = "/node5.html"; +$internal_labels{"l2h-50"} = "/node6.html"; +$internal_labels{"l2h-51"} = "/node6.html"; +$internal_labels{"l2h-52"} = "/node6.html"; +$internal_labels{"l2h-53"} = "/node6.html"; +$internal_labels{"l2h-54"} = "/node6.html"; +$internal_labels{"l2h-55"} = "/node8.html"; +$internal_labels{"l2h-56"} = "/node8.html"; +$internal_labels{"l2h-57"} = "/node8.html"; +$internal_labels{"l2h-58"} = "/node8.html"; +$internal_labels{"l2h-59"} = "/node8.html"; +$internal_labels{"l2h-60"} = "/node8.html"; +$internal_labels{"l2h-61"} = "/node9.html"; +$internal_labels{"l2h-62"} = "/node10.html"; +$internal_labels{"l2h-63"} = "/node10.html"; +$internal_labels{"l2h-64"} = "/node10.html"; +$internal_labels{"l2h-65"} = "/node10.html"; +$internal_labels{"l2h-66"} = "/node10.html"; +$internal_labels{"l2h-67"} = "/node10.html"; +$internal_labels{"l2h-68"} = "/node10.html"; +$internal_labels{"l2h-69"} = "/node11.html"; +$internal_labels{"l2h-70"} = "/node11.html"; +$internal_labels{"l2h-71"} = "/node11.html"; +$internal_labels{"l2h-72"} = "/node11.html"; +$internal_labels{"l2h-73"} = "/node11.html"; +$internal_labels{"l2h-74"} = "/node11.html"; +$internal_labels{"l2h-75"} = "/node11.html"; +$internal_labels{"l2h-76"} = "/node11.html"; +$internal_labels{"l2h-77"} = "/node11.html"; +$internal_labels{"l2h-78"} = "/node11.html"; +$internal_labels{"l2h-79"} = "/node12.html"; +$internal_labels{"l2h-80"} = "/node12.html"; +$internal_labels{"l2h-81"} = "/node12.html"; +$internal_labels{"l2h-82"} = "/node12.html"; +$internal_labels{"l2h-83"} = "/node12.html"; +$internal_labels{"l2h-84"} = "/node12.html"; +$internal_labels{"l2h-85"} = "/node12.html"; +$internal_labels{"l2h-86"} = "/node12.html"; +$internal_labels{"l2h-87"} = "/node12.html"; +$internal_labels{"l2h-88"} = "/node12.html"; +$internal_labels{"l2h-89"} = "/node12.html"; +$internal_labels{"l2h-90"} = "/node12.html"; +$internal_labels{"l2h-91"} = "/node12.html"; +$internal_labels{"l2h-92"} = "/node12.html"; +$internal_labels{"l2h-93"} = "/node12.html"; +$internal_labels{"l2h-94"} = "/node12.html"; +$internal_labels{"l2h-95"} = "/node12.html"; +$internal_labels{"l2h-96"} = "/node12.html"; +$internal_labels{"l2h-97"} = "/node12.html"; +$internal_labels{"l2h-98"} = "/node12.html"; +$internal_labels{"l2h-99"} = "/node12.html"; +$internal_labels{"l2h-100"} = "/node12.html"; +$internal_labels{"l2h-101"} = "/node13.html"; +$internal_labels{"l2h-102"} = "/node13.html"; +$internal_labels{"l2h-103"} = "/node13.html"; +$internal_labels{"l2h-104"} = "/node13.html"; +$internal_labels{"l2h-105"} = "/node13.html"; +$internal_labels{"l2h-106"} = "/node14.html"; +$internal_labels{"l2h-107"} = "/node14.html"; +$internal_labels{"l2h-108"} = "/node14.html"; +$internal_labels{"l2h-109"} = "/node14.html"; +$internal_labels{"l2h-110"} = "/node14.html"; +$internal_labels{"l2h-111"} = "/node14.html"; +$internal_labels{"l2h-112"} = "/node15.html"; +$internal_labels{"l2h-113"} = "/node15.html"; +$internal_labels{"l2h-114"} = "/node15.html"; +$internal_labels{"l2h-115"} = "/node15.html"; +$internal_labels{"l2h-116"} = "/node15.html"; +$internal_labels{"l2h-117"} = "/node15.html"; +$internal_labels{"l2h-118"} = "/node15.html"; +$internal_labels{"l2h-119"} = "/node15.html"; +$internal_labels{"l2h-120"} = "/node15.html"; +$internal_labels{"l2h-121"} = "/node15.html"; +$internal_labels{"l2h-122"} = "/node15.html"; +$internal_labels{"l2h-123"} = "/node15.html"; +$internal_labels{"l2h-124"} = "/node15.html"; +$internal_labels{"l2h-125"} = "/node15.html"; +$internal_labels{"l2h-126"} = "/node15.html"; +$internal_labels{"l2h-127"} = "/node15.html"; +$internal_labels{"l2h-128"} = "/node15.html"; +$internal_labels{"l2h-129"} = "/node16.html"; +$internal_labels{"l2h-130"} = "/node16.html"; +$internal_labels{"l2h-131"} = "/node16.html"; +$internal_labels{"l2h-132"} = "/node16.html"; Added: sandbox/trunk/emailpkg/2_5/docs/labels.pl ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/labels.pl Mon Mar 6 02:24:24 2006 @@ -0,0 +1,97 @@ +# LaTeX2HTML 2002-2-1 (1.71) +# Associate labels original text with physical files. + + +$key = q/module-email.Utils/; +$external_labels{$key} = "$URL/" . q|node15.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$external_labels{$key} = "$URL/" . q|node5.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$external_labels{$key} = "$URL/" . q|node14.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$external_labels{$key} = "$URL/" . q|node8.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$external_labels{$key} = "$URL/" . q|node11.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$external_labels{$key} = "$URL/" . q|node13.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$external_labels{$key} = "$URL/" . q|node16.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$external_labels{$key} = "$URL/" . q|node2.html|; +$noresave{$key} = "$nosave"; + +$key = q/about/; +$external_labels{$key} = "$URL/" . q|node20.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$external_labels{$key} = "$URL/" . q|node12.html|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$external_labels{$key} = "$URL/" . q|node3.html|; +$noresave{$key} = "$nosave"; + +1; + + +# LaTeX2HTML 2002-2-1 (1.71) +# labels from external_latex_labels array. + + +$key = q/module-email.Utils/; +$external_latex_labels{$key} = q|2.9|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Parser/; +$external_latex_labels{$key} = q|2.2|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Errors/; +$external_latex_labels{$key} = q|2.8|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Generator/; +$external_latex_labels{$key} = q|2.3|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Header/; +$external_latex_labels{$key} = q|2.5|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Encoders/; +$external_latex_labels{$key} = q|2.7|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Iterators/; +$external_latex_labels{$key} = q|2.10|; +$noresave{$key} = "$nosave"; + +$key = q/module-email/; +$external_latex_labels{$key} = q|2|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Charset/; +$external_latex_labels{$key} = q|2.6|; +$noresave{$key} = "$nosave"; + +$key = q/module-email.Message/; +$external_latex_labels{$key} = q|2.1|; +$noresave{$key} = "$nosave"; + +1; + Added: sandbox/trunk/emailpkg/2_5/docs/mimelib.css ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/mimelib.css Mon Mar 6 02:24:24 2006 @@ -0,0 +1,243 @@ +/* + * The first part of this is the standard CSS generated by LaTeX2HTML, + * with the "empty" declarations removed. + */ + +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.math { font-family: "Century Schoolbook", serif; } +.math i { font-family: "Century Schoolbook", serif; + font-weight: bold } +.boldmath { font-family: "Century Schoolbook", serif; + font-weight: bold } + +/* + * Implement both fixed-size and relative sizes. + * + * I think these can be safely removed, as it doesn't appear that + * LaTeX2HTML ever generates these, even though these are carried + * over from the LaTeX2HTML stylesheet. + */ +small.xtiny { font-size : xx-small; } +small.tiny { font-size : x-small; } +small.scriptsize { font-size : smaller; } +small.footnotesize { font-size : small; } +big.xlarge { font-size : large; } +big.xxlarge { font-size : x-large; } +big.huge { font-size : larger; } +big.xhuge { font-size : xx-large; } + +/* + * Document-specific styles come next; + * these are added for the Python documentation. + * + * Note that the size specifications for the H* elements are because + * Netscape on Solaris otherwise doesn't get it right; they all end up + * the normal text size. + */ + +body { color: #000000; + background-color: #ffffff; } + +a:link:active { color: #ff0000; } +a:link:hover { background-color: #bbeeff; } +a:visited:hover { background-color: #bbeeff; } +a:visited { color: #551a8b; } +a:link { color: #0000bb; } + +h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; + font-weight: bold; } +h1 { font-size: 180%; } +h2 { font-size: 150%; } +h3, h4 { font-size: 120%; } + +/* These are section titles used in navigation links, so make sure we + * match the section header font here, even it not the weight. + */ +.sectref { font-family: avantgarde, sans-serif; } +/* And the label before the titles in navigation: */ +.navlabel { font-size: 85%; } + + +/* LaTeX2HTML insists on inserting
      elements into headers which + * are marked with \label. This little bit of CSS magic ensures that + * these elements don't cause spurious whitespace to be added. + */ +h1>br, h2>br, h3>br, +h4>br, h5>br, h6>br { display: none; } + +code, tt { font-family: "lucida typewriter", lucidatypewriter, + monospace; } +var { font-family: times, serif; + font-style: italic; + font-weight: normal; } + +.Unix { font-variant: small-caps; } + +.typelabel { font-family: lucida, sans-serif; } + +.navigation td { background-color: #99ccff; + font-weight: bold; + font-family: avantgarde, sans-serif; + font-size: 110%; } + +div.warning { background-color: #fffaf0; + border: thin solid black; + padding: 1em; + margin-left: 2em; + margin-right: 2em; } + +div.warning .label { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +div.note { background-color: #fffaf0; + border: thin solid black; + padding: 1em; + margin-left: 2em; + margin-right: 2em; } + +div.note .label { margin-right: 0.5em; + font-family: sans-serif; } + +address { font-size: 80%; } +.release-info { font-style: italic; + font-size: 80%; } + +.titlegraphic { vertical-align: top; } + +.verbatim pre { color: #00008b; + font-family: "lucida typewriter", lucidatypewriter, + monospace; + font-size: 90%; } +.verbatim { margin-left: 2em; } +.verbatim .footer { padding: 0.05in; + font-size: 85%; + background-color: #99ccff; + margin-right: 0.5in; } + +.grammar { background-color: #99ccff; + margin-right: 0.5in; + padding: 0.05in; } +.grammar-footer { padding: 0.05in; + font-size: 85%; } +.grammartoken { font-family: "lucida typewriter", lucidatypewriter, + monospace; } + +.productions { background-color: #bbeeff; } +.productions a:active { color: #ff0000; } +.productions a:link:hover { background-color: #99ccff; } +.productions a:visited:hover { background-color: #99ccff; } +.productions a:visited { color: #551a8b; } +.productions a:link { color: #0000bb; } +.productions table { vertical-align: baseline; + empty-cells: show; } +.productions > table td, +.productions > table th { padding: 2px; } +.productions > table td:first-child, +.productions > table td:last-child { + font-family: "lucida typewriter", + lucidatypewriter, + monospace; + } +/* same as the second selector above, but expressed differently for Opera */ +.productions > table td:first-child + td + td { + font-family: "lucida typewriter", + lucidatypewriter, + monospace; + vertical-align: baseline; + } +.productions > table td:first-child + td { + padding-left: 1em; + padding-right: 1em; + } +.productions > table tr { vertical-align: baseline; } + +.email { font-family: avantgarde, sans-serif; } +.mailheader { font-family: avantgarde, sans-serif; } +.mimetype { font-family: avantgarde, sans-serif; } +.newsgroup { font-family: avantgarde, sans-serif; } +.url { font-family: avantgarde, sans-serif; } +.file { font-family: avantgarde, sans-serif; } +.guilabel { font-family: avantgarde, sans-serif; } + +.realtable { border-collapse: collapse; + border-color: black; + border-style: solid; + border-width: 0px 0px 2px 0px; + empty-cells: show; + margin-left: auto; + margin-right: auto; + padding-left: 0.4em; + padding-right: 0.4em; + } +.realtable tbody { vertical-align: baseline; } +.realtable tfoot { display: table-footer-group; } +.realtable thead { background-color: #99ccff; + border-width: 0px 0px 2px 1px; + display: table-header-group; + font-family: avantgarde, sans-serif; + font-weight: bold; + vertical-align: baseline; + } +.realtable thead :first-child { + border-width: 0px 0px 2px 0px; + } +.realtable thead th { border-width: 0px 0px 2px 1px } +.realtable td, +.realtable th { border-color: black; + border-style: solid; + border-width: 0px 0px 1px 1px; + padding-left: 0.4em; + padding-right: 0.4em; + } +.realtable td:first-child, +.realtable th:first-child { + border-left-width: 0px; + vertical-align: baseline; + } +.center { text-align: center; } +.left { text-align: left; } +.right { text-align: right; } + +.refcount-info { font-style: italic; } +.refcount-info .value { font-weight: bold; + color: #006600; } + +/* + * Some decoration for the "See also:" blocks, in part inspired by some of + * the styling on Lars Marius Garshol's XSA pages. + * (The blue in the navigation bars is #99CCFF.) + */ +.seealso { background-color: #fffaf0; + border: thin solid black; + padding: 0pt 1em 4pt 1em; } + +.seealso > .heading { font-size: 110%; + font-weight: bold; } + +/* + * Class 'availability' is used for module availability statements at + * the top of modules. + */ +.availability .platform { font-weight: bold; } + + +/* + * Additional styles for the distutils package. + */ +.du-command { font-family: monospace; } +.du-option { font-family: avantgarde, sans-serif; } +.du-filevar { font-family: avantgarde, sans-serif; + font-style: italic; } +.du-xxx:before { content: "** "; + font-weight: bold; } +.du-xxx:after { content: " **"; + font-weight: bold; } + + +/* + * Some specialization for printed output. + */ + at media print { + .online-navigation { display: none; } + } Added: sandbox/trunk/emailpkg/2_5/docs/mimelib.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/mimelib.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,135 @@ + + + + + + + + + +email Package Reference + + + + + +

      + +

      +
      +

      email Package Reference

      +

      Barry Warsaw

      +

      +

      Release 2.5
      +March 5, 2006

      +

      +
      +
      + +

      + +

      Abstract:

      +
      + The email package provides classes and utilities to create, + parse, generate, and modify email messages, conforming to all the + relevant email and MIME related RFCs. +
      +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/mimelib.pdf ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Charset.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Charset.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,434 @@ + + + + + + + + + + + + +2.6 Representing character sets + + + + + +

      +2.6 Representing character sets +

      + + +

      +This module provides a class Charset for representing +character sets and character set conversions in email messages, as +well as a character set registry and several convenience methods for +manipulating this registry. Instances of Charset are used in +several other modules within the email package. + +

      + +New in version 2.2.2. + +

      +

      + +
      class Charset([input_charset])
      +
      +Map character sets to their email properties. + +

      +This class provides information about the requirements imposed on +email for a specific character set. It also provides convenience +routines for converting between character sets, given the availability +of the applicable codecs. Given a character set, it will do its best +to provide information on how to use that character set in an email +message in an RFC-compliant way. + +

      +Certain character sets must be encoded with quoted-printable or base64 +when used in email headers or bodies. Certain character sets must be +converted outright, and are not allowed in email. + +

      +Optional input_charset is as described below; it is always +coerced to lower case. After being alias normalized it is also used +as a lookup into the registry of character sets to find out the header +encoding, body encoding, and output conversion codec to be used for +the character set. For example, if +input_charset is iso-8859-1, then headers and bodies will +be encoded using quoted-printable and no output conversion codec is +necessary. If input_charset is euc-jp, then headers will +be encoded with base64, bodies will not be encoded, but output text +will be converted from the euc-jp character set to the +iso-2022-jp character set. +

      + +

      +Charset instances have the following data attributes: + +

      +

      input_charset
      +
      +The initial character set specified. Common aliases are converted to +their official email names (e.g. latin_1 is converted to +iso-8859-1). Defaults to 7-bit us-ascii. +
      + +

      +

      header_encoding
      +
      +If the character set must be encoded before it can be used in an +email header, this attribute will be set to Charset.QP (for +quoted-printable), Charset.BASE64 (for base64 encoding), or +Charset.SHORTEST for the shortest of QP or BASE64 encoding. +Otherwise, it will be None. +
      + +

      +

      body_encoding
      +
      +Same as header_encoding, but describes the encoding for the +mail message's body, which indeed may be different than the header +encoding. Charset.SHORTEST is not allowed for +body_encoding. +
      + +

      +

      output_charset
      +
      +Some character sets must be converted before they can be used in +email headers or bodies. If the input_charset is one of +them, this attribute will contain the name of the character set +output will be converted to. Otherwise, it will be None. +
      + +

      +

      input_codec
      +
      +The name of the Python codec used to convert the input_charset to +Unicode. If no conversion codec is necessary, this attribute will be +None. +
      + +

      +

      output_codec
      +
      +The name of the Python codec used to convert Unicode to the +output_charset. If no conversion codec is necessary, this +attribute will have the same value as the input_codec. +
      + +

      +Charset instances also have the following methods: + +

      +

      + +
      get_body_encoding()
      +
      +Return the content transfer encoding used for body encoding. + +

      +This is either the string "quoted-printable" or "base64"depending on the encoding used, or it is a function, in which case you +should call the function with a single argument, the Message object +being encoded. The function should then set the +Content-Transfer-Encoding: header itself to whatever is +appropriate. + +

      +Returns the string "quoted-printable" if +body_encoding is QP, returns the string +"base64" if body_encoding is BASE64, and returns the +string "7bit" otherwise. +

      + +

      +

      + +
      convert(s)
      +
      +Convert the string s from the input_codec to the +output_codec. +
      + +

      +

      + +
      to_splittable(s)
      +
      +Convert a possibly multibyte string to a safely splittable format. +s is the string to split. + +

      +Uses the input_codec to try and convert the string to Unicode, +so it can be safely split on character boundaries (even for multibyte +characters). + +

      +Returns the string as-is if it isn't known how to convert s to +Unicode with the input_charset. + +

      +Characters that could not be converted to Unicode will be replaced +with the Unicode replacement character "U+FFFD". +

      + +

      +

      + +
      from_splittable(ustr[, to_output])
      +
      +Convert a splittable string back into an encoded string. ustr +is a Unicode string to ``unsplit''. + +

      +This method uses the proper codec to try and convert the string from +Unicode back into an encoded format. Return the string as-is if it is +not Unicode, or if it could not be converted from Unicode. + +

      +Characters that could not be converted from Unicode will be replaced +with an appropriate character (usually "?"). + +

      +If to_output is True (the default), uses +output_codec to convert to an +encoded format. If to_output is False, it uses +input_codec. +

      + +

      +

      + +
      get_output_charset()
      +
      +Return the output character set. + +

      +This is the output_charset attribute if that is not None, +otherwise it is input_charset. +

      + +

      +

      + +
      encoded_header_len()
      +
      +Return the length of the encoded header string, properly calculating +for quoted-printable or base64 encoding. +
      + +

      +

      + +
      header_encode(s[, convert])
      +
      +Header-encode the string s. + +

      +If convert is True, the string will be converted from the +input charset to the output charset automatically. This is not useful +for multibyte character sets, which have line length issues (multibyte +characters must be split on a character, not a byte boundary); use the +higher-level Header class to deal with these issues (see +email.Header). convert defaults to False. + +

      +The type of encoding (base64 or quoted-printable) will be based on +the header_encoding attribute. +

      + +

      +

      + +
      body_encode(s[, convert])
      +
      +Body-encode the string s. + +

      +If convert is True (the default), the string will be +converted from the input charset to output charset automatically. +Unlike header_encode(), there are no issues with byte +boundaries and multibyte charsets in email bodies, so this is usually +pretty safe. + +

      +The type of encoding (base64 or quoted-printable) will be based on +the body_encoding attribute. +

      + +

      +The Charset class also provides a number of methods to support +standard operations and built-in functions. + +

      +

      + +
      __str__()
      +
      +Returns input_charset as a string coerced to lower case. +__repr__() is an alias for __str__(). +
      + +

      +

      + +
      __eq__(other)
      +
      +This method allows you to compare two Charset instances for equality. +
      + +

      +

      + +
      __ne__(other)
      +
      +This method allows you to compare two Charset instances for inequality. +
      + +

      +The email.Charset module also provides the following +functions for adding new entries to the global character set, alias, +and codec registries: + +

      +

      + +
      add_charset(charset[, header_enc[, + body_enc[, output_charset]]])
      +
      +Add character properties to the global registry. + +

      +charset is the input character set, and must be the canonical +name of a character set. + +

      +Optional header_enc and body_enc is either +Charset.QP for quoted-printable, Charset.BASE64 for +base64 encoding, Charset.SHORTEST for the shortest of +quoted-printable or base64 encoding, or None for no encoding. +SHORTEST is only valid for header_enc. The default is +None for no encoding. + +

      +Optional output_charset is the character set that the output +should be in. Conversions will proceed from input charset, to +Unicode, to the output charset when the method +Charset.convert() is called. The default is to output in the +same character set as the input. + +

      +Both input_charset and output_charset must have Unicode +codec entries in the module's character set-to-codec mapping; use +add_codec() to add codecs the module does +not know about. See the codecs module's documentation for +more information. + +

      +The global character set registry is kept in the module global +dictionary CHARSETS. +

      + +

      +

      + +
      add_alias(alias, canonical)
      +
      +Add a character set alias. alias is the alias name, +e.g. latin-1. canonical is the character set's canonical +name, e.g. iso-8859-1. + +

      +The global charset alias registry is kept in the module global +dictionary ALIASES. +

      + +

      +

      + +
      add_codec(charset, codecname)
      +
      +Add a codec that map characters in the given character set to and from +Unicode. + +

      +charset is the canonical name of a character set. +codecname is the name of a Python codec, as appropriate for the +second argument to the unicode() built-in, or to the +encode() method of a Unicode string. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Encoders.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Encoders.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,165 @@ + + + + + + + + + + + + +2.7 Encoders + + + + + +

      +2.7 Encoders +

      + + +

      +When creating Message objects from scratch, you often need to +encode the payloads for transport through compliant mail servers. +This is especially true for image/* and text/* +type messages containing binary data. + +

      +The email package provides some convenient encodings in its +Encoders module. These encoders are actually used by the +MIMEImage and MIMEText class constructors to provide default +encodings. All encoder functions take exactly one argument, the +message object to encode. They usually extract the payload, encode +it, and reset the payload to this newly encoded value. They should also +set the Content-Transfer-Encoding: header as appropriate. + +

      +Here are the encoding functions provided: + +

      +

      + +
      encode_quopri(msg)
      +
      +Encodes the payload into quoted-printable form and sets the +Content-Transfer-Encoding: header to +quoted-printable1. +This is a good encoding to use when most of your payload is normal +printable data, but contains a few unprintable characters. +
      + +

      +

      + +
      encode_base64(msg)
      +
      +Encodes the payload into base64 form and sets the +Content-Transfer-Encoding: header to +base64. This is a good encoding to use when most of your payload +is unprintable data since it is a more compact form than +quoted-printable. The drawback of base64 encoding is that it +renders the text non-human readable. +
      + +

      +

      + +
      encode_7or8bit(msg)
      +
      +This doesn't actually modify the message's payload, but it does set +the Content-Transfer-Encoding: header to either 7bit or +8bit as appropriate, based on the payload data. +
      + +

      +

      + +
      encode_noop(msg)
      +
      +This does nothing; it doesn't even set the +Content-Transfer-Encoding: header. +
      + +

      +


      Footnotes

      +
      +
      ...quoted-printable1
      +
      Note that encoding with +encode_quopri() also encodes all tabs and space characters in +the data. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Errors.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Errors.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,173 @@ + + + + + + + + + + + + +2.8 Exception classes + + + + + +

      +2.8 Exception classes +

      + + +

      +The following exception classes are defined in the +email.Errors module: + +

      +

      + +
      exception MessageError()
      +
      +This is the base class for all exceptions that the email +package can raise. It is derived from the standard +Exception class and defines no additional methods. +
      + +

      +

      + +
      exception MessageParseError()
      +
      +This is the base class for exceptions thrown by the Parser +class. It is derived from MessageError. +
      + +

      +

      + +
      exception HeaderParseError()
      +
      +Raised under some error conditions when parsing the RFC 2822 headers of +a message, this class is derived from MessageParseError. +It can be raised from the Parser.parse() or +Parser.parsestr() methods. + +

      +Situations where it can be raised include finding an envelope +header after the first RFC 2822 header of the message, finding a +continuation line before the first RFC 2822 header is found, or finding +a line in the headers which is neither a header or a continuation +line. +

      + +

      +

      + +
      exception BoundaryError()
      +
      +Raised under some error conditions when parsing the RFC 2822 headers of +a message, this class is derived from MessageParseError. +It can be raised from the Parser.parse() or +Parser.parsestr() methods. + +

      +Situations where it can be raised include not being able to find the +starting or terminating boundary in a multipart/* message +when strict parsing is used. +

      + +

      +

      + +
      exception MultipartConversionError()
      +
      +Raised when a payload is added to a Message object using +add_payload(), but the payload is already a scalar and the +message's Content-Type: main type is not either +multipart or missing. MultipartConversionError +multiply inherits from MessageError and the built-in +TypeError. + +

      +Since Message.add_payload() is deprecated, this exception is +rarely raised in practice. However the exception may also be raised +if the attach() method is called on an instance of a class +derived from MIMENonMultipart (e.g. MIMEImage). +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Generator.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Generator.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,289 @@ + + + + + + + + + + + + +2.3 Generating MIME documents + + + + + +

      +2.3 Generating MIME documents +

      + + +

      +One of the most common tasks is to generate the flat text of the email +message represented by a message object structure. You will need to do +this if you want to send your message via the smtplib +module or the nntplib module, or print the message on the +console. Taking a message object structure and producing a flat text +document is the job of the Generator class. + +

      +Again, as with the email.Parser module, you aren't limited +to the functionality of the bundled generator; you could write one +from scratch yourself. However the bundled generator knows how to +generate most email in a standards-compliant way, should handle MIME +and non-MIME email messages just fine, and is designed so that the +transformation from flat text, to a message structure via the +Parser class, and back to flat text, is idempotent (the input +is identical to the output). + +

      +Here are the public methods of the Generator class: + +

      +

      + +
      class Generator(outfp[, mangle_from_[, + maxheaderlen]])
      +
      +The constructor for the Generator class takes a file-like +object called outfp for an argument. outfp must support +the write() method and be usable as the output file in a +Python extended print statement. + +

      +Optional mangle_from_ is a flag that, when True, puts a +">" character in front of any line in the body that starts exactly as +"From ", i.e. From followed by a space at the beginning of the +line. This is the only guaranteed portable way to avoid having such +lines be mistaken for a Unix mailbox format envelope header separator (see +WHY THE CONTENT-LENGTH FORMAT IS BAD +for details). mangle_from_ defaults to True, but you +might want to set this to False if you are not writing Unix +mailbox format files. + +

      +Optional maxheaderlen specifies the longest length for a +non-continued header. When a header line is longer than +maxheaderlen (in characters, with tabs expanded to 8 spaces), +the header will be split as defined in the email.Header +class. Set to zero to disable header wrapping. The default is 78, as +recommended (but not required) by RFC 2822. +

      + +

      +The other public Generator methods are: + +

      +

      + +
      flatten(msg[, unixfrom])
      +
      +Print the textual representation of the message object structure rooted at +msg to the output file specified when the Generator +instance was created. Subparts are visited depth-first and the +resulting text will be properly MIME encoded. + +

      +Optional unixfrom is a flag that forces the printing of the +envelope header delimiter before the first RFC 2822 header of the +root message object. If the root object has no envelope header, a +standard one is crafted. By default, this is set to False to +inhibit the printing of the envelope delimiter. + +

      +Note that for subparts, no envelope header is ever printed. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      clone(fp)
      +
      +Return an independent clone of this Generator instance with +the exact same options. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      write(s)
      +
      +Write the string s to the underlying file object, +i.e. outfp passed to Generator's constructor. This +provides just enough file-like API for Generator instances to +be used in extended print statements. +
      + +

      +As a convenience, see the methods Message.as_string() and +str(aMessage), a.k.a. Message.__str__(), which +simplify the generation of a formatted string representation of a +message object. For more detail, see email.Message. + +

      +The email.Generator module also provides a derived class, +called DecodedGenerator which is like the Generator +base class, except that non-text parts are substituted with +a format string representing the part. + +

      +

      + +
      class DecodedGenerator(outfp[, mangle_from_[, + maxheaderlen[, fmt]]])
      +
      + +

      +This class, derived from Generator walks through all the +subparts of a message. If the subpart is of main type +text, then it prints the decoded payload of the subpart. +Optional _mangle_from_ and maxheaderlen are as with the +Generator base class. + +

      +If the subpart is not of main type text, optional fmt +is a format string that is used instead of the message payload. +fmt is expanded with the following keywords, "%(keyword)s"format: + +

      + +

        +
      • type - Full MIME type of the non-text part + +

        +

      • +
      • maintype - Main MIME type of the non-text part + +

        +

      • +
      • subtype - Sub-MIME type of the non-text part + +

        +

      • +
      • filename - Filename of the non-text part + +

        +

      • +
      • description - Description associated with the + non-text part + +

        +

      • +
      • encoding - Content transfer encoding of the + non-text part + +

        +

      • +
      + +

      +The default value for fmt is None, meaning + +

      +

      +[Non-text (%(type)s) part of message omitted, filename %(filename)s]
      +
      + +

      + +New in version 2.2.2. + +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Header.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Header.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,340 @@ + + + + + + + + + + + + +2.5 Internationalized headers + + + + + +

      +2.5 Internationalized headers +

      + + +

      +RFC 2822 is the base standard that describes the format of email +messages. It derives from the older RFC 822 standard which came +into widespread use at a time when most email was composed of ASCII +characters only. RFC 2822 is a specification written assuming email +contains only 7-bit ASCII characters. + +

      +Of course, as email has been deployed worldwide, it has become +internationalized, such that language specific character sets can now +be used in email messages. The base standard still requires email +messages to be transfered using only 7-bit ASCII characters, so a +slew of RFCs have been written describing how to encode email +containing non-ASCII characters into RFC 2822-compliant format. +These RFCs include RFC 2045, RFC 2046, RFC 2047, and RFC 2231. +The email package supports these standards in its +email.Header and email.Charset modules. + +

      +If you want to include non-ASCII characters in your email headers, +say in the Subject: or To: fields, you should +use the Header class and assign the field in the +Message object to an instance of Header instead of +using a string for the header value. For example: + +

      +

      +>>> from email.Message import Message
      +>>> from email.Header import Header
      +>>> msg = Message()
      +>>> h = Header('p\xf6stal', 'iso-8859-1')
      +>>> msg['Subject'] = h
      +>>> print msg.as_string()
      +Subject: =?iso-8859-1?q?p=F6stal?=
      +
      + +

      +Notice here how we wanted the Subject: field to contain a +non-ASCII character? We did this by creating a Header +instance and passing in the character set that the byte string was +encoded in. When the subsequent Message instance was +flattened, the Subject: field was properly RFC 2047 +encoded. MIME-aware mail readers would show this header using the +embedded ISO-8859-1 character. + +

      + +New in version 2.2.2. + +

      +Here is the Header class description: + +

      +

      + +
      class Header([s[, charset[, + maxlinelen[, header_name[, continuation_ws[, + errors]]]]]])
      +
      +Create a MIME-compliant header that can contain strings in different +character sets. + +

      +Optional s is the initial header value. If None (the +default), the initial header value is not set. You can later append +to the header with append() method calls. s may be a +byte string or a Unicode string, but see the append() +documentation for semantics. + +

      +Optional charset serves two purposes: it has the same meaning as +the charset argument to the append() method. It also +sets the default character set for all subsequent append() +calls that omit the charset argument. If charset is not +provided in the constructor (the default), the us-ascii +character set is used both as s's initial charset and as the +default for subsequent append() calls. + +

      +The maximum line length can be specified explicit via +maxlinelen. For splitting the first line to a shorter value (to +account for the field header which isn't included in s, +e.g. Subject:) pass in the name of the field in +header_name. The default maxlinelen is 76, and the +default value for header_name is None, meaning it is not +taken into account for the first line of a long, split header. + +

      +Optional continuation_ws must be RFC 2822-compliant folding +whitespace, and is usually either a space or a hard tab character. +This character will be prepended to continuation lines. +

      + +

      +Optional errors is passed straight through to the +append() method. + +

      +

      + +
      append(s[, charset[, errors]])
      +
      +Append the string s to the MIME header. + +

      +Optional charset, if given, should be a Charset instance +(see email.Charset) or the name of a character set, which +will be converted to a Charset instance. A value of +None (the default) means that the charset given in the +constructor is used. + +

      +s may be a byte string or a Unicode string. If it is a byte +string (i.e. isinstance(s, str) is true), then +charset is the encoding of that byte string, and a +UnicodeError will be raised if the string cannot be +decoded with that character set. + +

      +If s is a Unicode string, then charset is a hint +specifying the character set of the characters in the string. In this +case, when producing an RFC 2822-compliant header using RFC 2047 +rules, the Unicode string will be encoded using the following charsets +in order: us-ascii, the charset hint, utf-8. The +first character set to not provoke a UnicodeError is used. + +

      +Optional errors is passed through to any unicode() or +ustr.encode() call, and defaults to ``strict''. +

      + +

      +

      + +
      encode([splitchars])
      +
      +Encode a message header into an RFC-compliant format, possibly +wrapping long lines and encapsulating non-ASCII parts in base64 or +quoted-printable encodings. Optional splitchars is a string +containing characters to split long ASCII lines on, in rough support +of RFC 2822's highest level syntactic breaks. This doesn't +affect RFC 2047 encoded lines. +
      + +

      +The Header class also provides a number of methods to support +standard operators and built-in functions. + +

      +

      + +
      __str__()
      +
      +A synonym for Header.encode(). Useful for +str(aHeader). +
      + +

      +

      + +
      __unicode__()
      +
      +A helper for the built-in unicode() function. Returns the +header as a Unicode string. +
      + +

      +

      + +
      __eq__(other)
      +
      +This method allows you to compare two Header instances for equality. +
      + +

      +

      + +
      __ne__(other)
      +
      +This method allows you to compare two Header instances for inequality. +
      + +

      +The email.Header module also provides the following +convenient functions. + +

      +

      + +
      decode_header(header)
      +
      +Decode a message header value without converting the character set. +The header value is in header. + +

      +This function returns a list of (decoded_string, charset) pairs +containing each of the decoded parts of the header. charset is +None for non-encoded parts of the header, otherwise a lower +case string containing the name of the character set specified in the +encoded string. + +

      +Here's an example: + +

      +

      +>>> from email.Header import decode_header
      +>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
      +[('p\\xf6stal', 'iso-8859-1')]
      +
      +
      + +

      +

      + +
      make_header(decoded_seq[, maxlinelen[, + header_name[, continuation_ws]]])
      +
      +Create a Header instance from a sequence of pairs as returned +by decode_header(). + +

      +decode_header() takes a header value string and returns a +sequence of pairs of the format (decoded_string, charset) where +charset is the name of the character set. + +

      +This function takes one of those sequence of pairs and returns a +Header instance. Optional maxlinelen, +header_name, and continuation_ws are as in the +Header constructor. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Iterators.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Iterators.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,175 @@ + + + + + + + + + + + + +2.10 Iterators + + + + + +

      +2.10 Iterators +

      + + +

      +Iterating over a message object tree is fairly easy with the +Message.walk() method. The email.Iterators module +provides some useful higher level iterations over message object +trees. + +

      +

      + +
      body_line_iterator(msg[, decode])
      +
      +This iterates over all the payloads in all the subparts of msg, +returning the string payloads line-by-line. It skips over all the +subpart headers, and it skips over any subpart with a payload that +isn't a Python string. This is somewhat equivalent to reading the +flat text representation of the message from a file using +readline(), skipping over all the intervening headers. + +

      +Optional decode is passed through to Message.get_payload(). +

      + +

      +

      + +
      typed_subpart_iterator(msg[, + maintype[, subtype]])
      +
      +This iterates over all the subparts of msg, returning only those +subparts that match the MIME type specified by maintype and +subtype. + +

      +Note that subtype is optional; if omitted, then subpart MIME +type matching is done only with the main type. maintype is +optional too; it defaults to text. + +

      +Thus, by default typed_subpart_iterator() returns each +subpart that has a MIME type of text/*. +

      + +

      +The following function has been added as a useful debugging tool. It +should not be considered part of the supported public interface +for the package. + +

      +

      + +
      _structure(msg[, fp[, level]])
      +
      +Prints an indented representation of the content types of the +message object structure. For example: + +

      +

      +>>> msg = email.message_from_file(somefile)
      +>>> _structure(msg)
      +multipart/mixed
      +    text/plain
      +    text/plain
      +    multipart/digest
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +        message/rfc822
      +            text/plain
      +    text/plain
      +
      + +

      +Optional fp is a file-like object to print the output to. It +must be suitable for Python's extended print statement. level +is used internally. +

      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Message.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Message.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,916 @@ + + + + + + + + + + + + +2.1 Representing an email message + + + + + +

      +2.1 Representing an email message +

      + + +

      +The central class in the email package is the +Message class; it is the base class for the email +object model. Message provides the core functionality for +setting and querying header fields, and for accessing message bodies. + +

      +Conceptually, a Message object consists of headers and +payloads. Headers are RFC 2822 style field names and +values where the field name and value are separated by a colon. The +colon is not part of either the field name or the field value. + +

      +Headers are stored and returned in case-preserving form but are +matched case-insensitively. There may also be a single envelope +header, also known as the Unix-From header or the +From_ header. The payload is either a string in the case of +simple message objects or a list of Message objects for +MIME container documents (e.g. multipart/* and +message/rfc822). + +

      +Message objects provide a mapping style interface for +accessing the message headers, and an explicit interface for accessing +both the headers and the payload. It provides convenience methods for +generating a flat text representation of the message object tree, for +accessing commonly used header parameters, and for recursively walking +over the object tree. + +

      +Here are the methods of the Message class: + +

      +

      + +
      class Message()
      +
      +The constructor takes no arguments. +
      + +

      +

      + +
      as_string([unixfrom])
      +
      +Return the entire message flatten as a string. When optional +unixfrom is True, the envelope header is included in the +returned string. unixfrom defaults to False. + +

      +Note that this method is provided as a convenience and may not always +format the message the way you want. For more flexibility, +instantiate a Generator instance and use its +flatten() method directly. For example: + +

      +

      +from cStringIO import StringIO
      +from email.Generator import Generator
      +fp = StringIO()
      +g = Generator(fp, mangle_from_=False, maxheaderlen=60)
      +g.flatten(msg)
      +text = fp.getvalue()
      +
      +
      + +

      +

      + +
      __str__()
      +
      +Equivalent to as_string(unixfrom=True). +
      + +

      +

      + +
      is_multipart()
      +
      +Return True if the message's payload is a list of +sub-Message objects, otherwise return False. When +is_multipart() returns False, the payload should be a string +object. +
      + +

      +

      + +
      set_unixfrom(unixfrom)
      +
      +Set the message's envelope header to unixfrom, which should be a string. +
      + +

      +

      + +
      get_unixfrom()
      +
      +Return the message's envelope header. Defaults to None if the +envelope header was never set. +
      + +

      +

      + +
      attach(payload)
      +
      +Add the given payload to the current payload, which must be +None or a list of Message objects before the call. +After the call, the payload will always be a list of Message +objects. If you want to set the payload to a scalar object (e.g. a +string), use set_payload() instead. +
      + +

      +

      + +
      get_payload([i[, decode]])
      +
      +Return a reference the current payload, which will be a list of +Message objects when is_multipart() is True, or a +string when is_multipart() is False. If the +payload is a list and you mutate the list object, you modify the +message's payload in place. + +

      +With optional argument i, get_payload() will return the +i-th element of the payload, counting from zero, if +is_multipart() is True. An IndexError +will be raised if i is less than 0 or greater than or equal to +the number of items in the payload. If the payload is a string +(i.e. is_multipart() is False) and i is given, a +TypeError is raised. + +

      +Optional decode is a flag indicating whether the payload should be +decoded or not, according to the Content-Transfer-Encoding: header. +When True and the message is not a multipart, the payload will be +decoded if this header's value is "quoted-printable" or +"base64". If some other encoding is used, or +Content-Transfer-Encoding: header is +missing, or if the payload has bogus base64 data, the payload is +returned as-is (undecoded). If the message is a multipart and the +decode flag is True, then None is returned. The +default for decode is False. +

      + +

      +

      + +
      set_payload(payload[, charset])
      +
      +Set the entire message object's payload to payload. It is the +client's responsibility to ensure the payload invariants. Optional +charset sets the message's default character set; see +set_charset() for details. + +

      + +Changed in version 2.2.2: +charset argument added. + +

      + +

      +

      + +
      set_charset(charset)
      +
      +Set the character set of the payload to charset, which can +either be a Charset instance (see email.Charset), a +string naming a character set, +or None. If it is a string, it will be converted to a +Charset instance. If charset is None, the +charset parameter will be removed from the +Content-Type: header. Anything else will generate a +TypeError. + +

      +The message will be assumed to be of type text/* encoded with +charset.input_charset. It will be converted to +charset.output_charset +and encoded properly, if needed, when generating the plain text +representation of the message. MIME headers +(MIME-Version:, Content-Type:, +Content-Transfer-Encoding:) will be added as needed. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_charset()
      +
      +Return the Charset instance associated with the message's payload. + +New in version 2.2.2. + +
      + +

      +The following methods implement a mapping-like interface for accessing +the message's RFC 2822 headers. Note that there are some +semantic differences between these methods and a normal mapping +(i.e. dictionary) interface. For example, in a dictionary there are +no duplicate keys, but here there may be duplicate message headers. Also, +in dictionaries there is no guaranteed order to the keys returned by +keys(), but in a Message object, headers are always +returned in the order they appeared in the original message, or were +added to the message later. Any header deleted and then re-added are +always appended to the end of the header list. + +

      +These semantic differences are intentional and are biased toward +maximal convenience. + +

      +Note that in all cases, any envelope header present in the message is +not included in the mapping interface. + +

      +

      + +
      __len__()
      +
      +Return the total number of headers, including duplicates. +
      + +

      +

      + +
      __contains__(name)
      +
      +Return true if the message object has a field named name. +Matching is done case-insensitively and name should not include the +trailing colon. Used for the in operator, +e.g.: + +

      +

      +if 'message-id' in myMessage:
      +    print 'Message-ID:', myMessage['message-id']
      +
      +
      + +

      +

      + +
      __getitem__(name)
      +
      +Return the value of the named header field. name should not +include the colon field separator. If the header is missing, +None is returned; a KeyError is never raised. + +

      +Note that if the named field appears more than once in the message's +headers, exactly which of those field values will be returned is +undefined. Use the get_all() method to get the values of all +the extant named headers. +

      + +

      +

      + +
      __setitem__(name, val)
      +
      +Add a header to the message with field name name and value +val. The field is appended to the end of the message's existing +fields. + +

      +Note that this does not overwrite or delete any existing header +with the same name. If you want to ensure that the new header is the +only one present in the message with field name +name, delete the field first, e.g.: + +

      +

      +del msg['subject']
      +msg['subject'] = 'Python roolz!'
      +
      +
      + +

      +

      + +
      __delitem__(name)
      +
      +Delete all occurrences of the field with name name from the +message's headers. No exception is raised if the named field isn't +present in the headers. +
      + +

      +

      + +
      has_key(name)
      +
      +Return true if the message contains a header field named name, +otherwise return false. +
      + +

      +

      + +
      keys()
      +
      +Return a list of all the message's header field names. +
      + +

      +

      + +
      values()
      +
      +Return a list of all the message's field values. +
      + +

      +

      + +
      items()
      +
      +Return a list of 2-tuples containing all the message's field headers +and values. +
      + +

      +

      + +
      get(name[, failobj])
      +
      +Return the value of the named header field. This is identical to +__getitem__() except that optional failobj is returned +if the named header is missing (defaults to None). +
      + +

      +Here are some additional useful methods: + +

      +

      + +
      get_all(name[, failobj])
      +
      +Return a list of all the values for the field named name. +If there are no such named headers in the message, failobj is +returned (defaults to None). +
      + +

      +

      + +
      add_header(_name, _value, **_params)
      +
      +Extended header setting. This method is similar to +__setitem__() except that additional header parameters can be +provided as keyword arguments. _name is the header field to add +and _value is the primary value for the header. + +

      +For each item in the keyword argument dictionary _params, the +key is taken as the parameter name, with underscores converted to +dashes (since dashes are illegal in Python identifiers). Normally, +the parameter will be added as key="value" unless the value is +None, in which case only the key will be added. + +

      +Here's an example: + +

      +

      +msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
      +
      + +

      +This will add a header that looks like + +

      +

      +Content-Disposition: attachment; filename="bud.gif"
      +
      +
      + +

      +

      + +
      replace_header(_name, _value)
      +
      +Replace a header. Replace the first header found in the message that +matches _name, retaining header order and field name case. If +no matching header was found, a KeyError is raised. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_type()
      +
      +Return the message's content type. The returned string is coerced to +lower case of the form maintype/subtype. If there was no +Content-Type: header in the message the default type as +given by get_default_type() will be returned. Since +according to RFC 2045, messages always have a default type, +get_content_type() will always return a value. + +

      +RFC 2045 defines a message's default type to be +text/plain unless it appears inside a +multipart/digest container, in which case it would be +message/rfc822. If the Content-Type: header +has an invalid type specification, RFC 2045 mandates that the +default type be text/plain. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_maintype()
      +
      +Return the message's main content type. This is the +maintype part of the string returned by +get_content_type(). + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_content_subtype()
      +
      +Return the message's sub-content type. This is the subtype +part of the string returned by get_content_type(). + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_default_type()
      +
      +Return the default content type. Most messages have a default content +type of text/plain, except for messages that are subparts +of multipart/digest containers. Such subparts have a +default content type of message/rfc822. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      set_default_type(ctype)
      +
      +Set the default content type. ctype should either be +text/plain or message/rfc822, although this is +not enforced. The default content type is not stored in the +Content-Type: header. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_params([failobj[, + header[, unquote]]])
      +
      +Return the message's Content-Type: parameters, as a list. The +elements of the returned list are 2-tuples of key/value pairs, as +split on the "=" sign. The left hand side of the +"=" is the key, while the right hand side is the value. If +there is no "=" sign in the parameter the value is the empty +string, otherwise the value is as described in get_param() and is +unquoted if optional unquote is True (the default). + +

      +Optional failobj is the object to return if there is no +Content-Type: header. Optional header is the header to +search instead of Content-Type:. + +

      + +Changed in version 2.2.2: +unquote argument added. + +

      + +

      +

      + +
      get_param(param[, + failobj[, header[, unquote]]])
      +
      +Return the value of the Content-Type: header's parameter +param as a string. If the message has no Content-Type: +header or if there is no such parameter, then failobj is +returned (defaults to None). + +

      +Optional header if given, specifies the message header to use +instead of Content-Type:. + +

      +Parameter keys are always compared case insensitively. The return +value can either be a string, or a 3-tuple if the parameter was +RFC 2231 encoded. When it's a 3-tuple, the elements of the value are of +the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and +LANGUAGE can be None, in which case you should consider +VALUE to be encoded in the us-ascii charset. You can +usually ignore LANGUAGE. + +

      +Your application should be prepared to deal with 3-tuple return +values, and can convert the parameter to a Unicode string like so: + +

      +

      +param = msg.get_param('foo')
      +if isinstance(param, tuple):
      +    param = unicode(param[2], param[0] or 'us-ascii')
      +
      + +

      +In any case, the parameter value (either the returned string, or the +VALUE item in the 3-tuple) is always unquoted, unless +unquote is set to False. + +

      + +Changed in version 2.2.2: +unquote argument added, and 3-tuple return value +possible. + +

      + +

      +

      + +
      set_param(param, value[, + header[, requote[, charset[, language]]]])
      +
      + +

      +Set a parameter in the Content-Type: header. If the +parameter already exists in the header, its value will be replaced +with value. If the Content-Type: header as not yet +been defined for this message, it will be set to text/plain +and the new parameter value will be appended as per RFC 2045. + +

      +Optional header specifies an alternative header to +Content-Type:, and all parameters will be quoted as +necessary unless optional requote is False (the default +is True). + +

      +If optional charset is specified, the parameter will be encoded +according to RFC 2231. Optional language specifies the RFC +2231 language, defaulting to the empty string. Both charset and +language should be strings. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      del_param(param[, header[, + requote]])
      +
      +Remove the given parameter completely from the +Content-Type: header. The header will be re-written in +place without the parameter or its value. All values will be quoted +as necessary unless requote is False (the default is +True). Optional header specifies an alternative to +Content-Type:. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      set_type(type[, header][, + requote])
      +
      +Set the main type and subtype for the Content-Type: +header. type must be a string in the form +maintype/subtype, otherwise a ValueError is +raised. + +

      +This method replaces the Content-Type: header, keeping all +the parameters in place. If requote is False, this +leaves the existing header's quoting as is, otherwise the parameters +will be quoted (the default). + +

      +An alternative header can be specified in the header argument. +When the Content-Type: header is set a +MIME-Version: header is also added. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_filename([failobj])
      +
      +Return the value of the filename parameter of the +Content-Disposition: header of the message. If the header does +not have a filename parameter, this method falls back to looking for +the name parameter. If neither is found, or the header is missing, +then failobj is returned. The returned string will always be unquoted +as per Utils.unquote(). +
      + +

      +

      + +
      get_boundary([failobj])
      +
      +Return the value of the boundary parameter of the +Content-Type: header of the message, or failobj if either +the header is missing, or has no boundary parameter. The +returned string will always be unquoted as per +Utils.unquote(). +
      + +

      +

      + +
      set_boundary(boundary)
      +
      +Set the boundary parameter of the Content-Type: +header to boundary. set_boundary() will always quote +boundary if necessary. A HeaderParseError is raised +if the message object has no Content-Type: header. + +

      +Note that using this method is subtly different than deleting the old +Content-Type: header and adding a new one with the new boundary +via add_header(), because set_boundary() preserves the +order of the Content-Type: header in the list of headers. +However, it does not preserve any continuation lines which may +have been present in the original Content-Type: header. +

      + +

      +

      + +
      get_content_charset([failobj])
      +
      +Return the charset parameter of the Content-Type: +header, coerced to lower case. If there is no +Content-Type: header, or if that header has no +charset parameter, failobj is returned. + +

      +Note that this method differs from get_charset() which +returns the Charset instance for the default encoding of the +message body. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      get_charsets([failobj])
      +
      +Return a list containing the character set names in the message. If +the message is a multipart, then the list will contain one +element for each subpart in the payload, otherwise, it will be a list +of length 1. + +

      +Each item in the list will be a string which is the value of the +charset parameter in the Content-Type: header for the +represented subpart. However, if the subpart has no +Content-Type: header, no charset parameter, or is not of +the text main MIME type, then that item in the returned list +will be failobj. +

      + +

      +

      + +
      walk()
      +
      +The walk() method is an all-purpose generator which can be +used to iterate over all the parts and subparts of a message object +tree, in depth-first traversal order. You will typically use +walk() as the iterator in a for loop; each +iteration returns the next subpart. + +

      +Here's an example that prints the MIME type of every part of a +multipart message structure: + +

      +

      +>>> for part in msg.walk():
      +>>>     print part.get_content_type()
      +multipart/report
      +text/plain
      +message/delivery-status
      +text/plain
      +text/plain
      +message/rfc822
      +
      +
      + +

      +Message objects can also optionally contain two instance +attributes, which can be used when generating the plain text of a MIME +message. + +

      +

      preamble
      +
      +The format of a MIME document allows for some text between the blank +line following the headers, and the first multipart boundary string. +Normally, this text is never visible in a MIME-aware mail reader +because it falls outside the standard MIME armor. However, when +viewing the raw text of the message, or when viewing the message in a +non-MIME aware reader, this text can become visible. + +

      +The preamble attribute contains this leading extra-armor text +for MIME documents. When the Parser discovers some text after +the headers but before the first boundary string, it assigns this text +to the message's preamble attribute. When the Generator +is writing out the plain text representation of a MIME message, and it +finds the message has a preamble attribute, it will write this +text in the area between the headers and the first boundary. See +email.Parser and email.Generator for details. + +

      +Note that if the message object has no preamble, the +preamble attribute will be None. +

      + +

      +

      epilogue
      +
      +The epilogue attribute acts the same way as the preamble +attribute, except that it contains text that appears between the last +boundary and the end of the message. + +

      +One note: when generating the flat text for a multipart +message that has no epilogue (using the standard +Generator class), no newline is added after the closing +boundary line. If the message object has an epilogue and its +value does not start with a newline, a newline is printed after the +closing boundary. This seems a little clumsy, but it makes the most +practical sense. The upshot is that if you want to ensure that a +newline get printed after your closing multipart boundary, +set the epilogue to the empty string. +

      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Parser.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Parser.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,147 @@ + + + + + + + + + + + + +2.2 Parsing email messages + + + + + +

      +2.2 Parsing email messages +

      + + +

      +Message object structures can be created in one of two ways: they can be +created from whole cloth by instantiating Message objects and +stringing them together via attach() and +set_payload() calls, or they can be created by parsing a flat text +representation of the email message. + +

      +The email package provides a standard parser that understands +most email document structures, including MIME documents. You can +pass the parser a string or a file object, and the parser will return +to you the root Message instance of the object structure. For +simple, non-MIME messages the payload of this root object will likely +be a string containing the text of the message. For MIME +messages, the root object will return True from its +is_multipart() method, and the subparts can be accessed via +the get_payload() and walk() methods. + +

      +Note that the parser can be extended in limited ways, and of course +you can implement your own parser completely from scratch. There is +no magical connection between the email package's bundled +parser and the Message class, so your custom parser can create +message object trees any way it finds necessary. + +

      +The primary parser class is Parser which parses both the +headers and the payload of the message. In the case of +multipart messages, it will recursively parse the body of +the container message. Two modes of parsing are supported, +strict parsing, which will usually reject any non-RFC compliant +message, and lax parsing, which attempts to adjust for common +MIME formatting problems. + +

      +The email.Parser module also provides a second class, called +HeaderParser which can be used if you're only interested in +the headers of the message. HeaderParser can be much faster in +these situations, since it does not attempt to parse the message body, +instead setting the payload to the raw body as a string. +HeaderParser has the same API as the Parser class. + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.Utils.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.Utils.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,320 @@ + + + + + + + + + + + + +2.9 Miscellaneous utilities + + + + + +

      +2.9 Miscellaneous utilities +

      + + +

      +There are several useful utilities provided in the email.Utils +module: + +

      +

      + +
      quote(str)
      +
      +Return a new string with backslashes in str replaced by two +backslashes, and double quotes replaced by backslash-double quote. +
      + +

      +

      + +
      unquote(str)
      +
      +Return a new string which is an unquoted version of str. +If str ends and begins with double quotes, they are stripped +off. Likewise if str ends and begins with angle brackets, they +are stripped off. +
      + +

      +

      + +
      parseaddr(address)
      +
      +Parse address - which should be the value of some address-containing +field such as To: or Cc: - into its constituent +realname and email address parts. Returns a tuple of that +information, unless the parse fails, in which case a 2-tuple of +('', '') is returned. +
      + +

      +

      + +
      formataddr(pair)
      +
      +The inverse of parseaddr(), this takes a 2-tuple of the form +(realname, email_address) and returns the string value suitable +for a To: or Cc: header. If the first element of +pair is false, then the second element is returned unmodified. +
      + +

      +

      + +
      getaddresses(fieldvalues)
      +
      +This method returns a list of 2-tuples of the form returned by +parseaddr(). fieldvalues is a sequence of header field +values as might be returned by Message.get_all(). Here's a +simple example that gets all the recipients of a message: + +

      +

      +from email.Utils import getaddresses
      +
      +tos = msg.get_all('to', [])
      +ccs = msg.get_all('cc', [])
      +resent_tos = msg.get_all('resent-to', [])
      +resent_ccs = msg.get_all('resent-cc', [])
      +all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
      +
      +
      + +

      +

      + +
      parsedate(date)
      +
      +Attempts to parse a date according to the rules in RFC 2822. +however, some mailers don't follow that format as specified, so +parsedate() tries to guess correctly in such cases. +date is a string containing an RFC 2822 date, such as +"Mon, 20 Nov 1995 19:12:08 -0500". If it succeeds in parsing +the date, parsedate() returns a 9-tuple that can be passed +directly to time.mktime(); otherwise None will be +returned. Note that fields 6, 7, and 8 of the result tuple are not +usable. +
      + +

      +

      + +
      parsedate_tz(date)
      +
      +Performs the same function as parsedate(), but returns +either None or a 10-tuple; the first 9 elements make up a tuple +that can be passed directly to time.mktime(), and the tenth +is the offset of the date's timezone from UTC (which is the official +term for Greenwich Mean Time)2. If the input +string has no timezone, the last element of the tuple returned is +None. Note that fields 6, 7, and 8 of the result tuple are not +usable. +
      + +

      +

      + +
      mktime_tz(tuple)
      +
      +Turn a 10-tuple as returned by parsedate_tz() into a UTC +timestamp. It the timezone item in the tuple is None, assume +local time. Minor deficiency: mktime_tz() interprets the +first 8 elements of tuple as a local time and then compensates +for the timezone difference. This may yield a slight error around +changes in daylight savings time, though not worth worrying about for +common use. +
      + +

      +

      + +
      formatdate([timeval[, localtime]])
      +
      +Returns a date string as per RFC 2822, e.g.: + +

      +

      +Fri, 09 Nov 2001 01:08:47 -0000
      +
      + +

      +Optional timeval if given is a floating point time value as +accepted by time.gmtime() and time.localtime(), +otherwise the current time is used. + +

      +Optional localtime is a flag that when True, interprets +timeval, and returns a date relative to the local timezone +instead of UTC, properly taking daylight savings time into account. +The default is False meaning UTC is used. +

      + +

      +

      + +
      make_msgid([idstring])
      +
      +Returns a string suitable for an RFC 2822-compliant +Message-ID: header. Optional idstring if given, is +a string used to strengthen the uniqueness of the message id. +
      + +

      +

      + +
      decode_rfc2231(s)
      +
      +Decode the string s according to RFC 2231. +
      + +

      +

      + +
      encode_rfc2231(s[, charset[, language]])
      +
      +Encode the string s according to RFC 2231. Optional +charset and language, if given is the character set name +and language name to use. If neither is given, s is returned +as-is. If charset is given but language is not, the +string is encoded using the empty string for language. +
      + +

      +

      + +
      decode_params(params)
      +
      +Decode parameters list according to RFC 2231. params is a +sequence of 2-tuples containing elements of the form +(content-type, string-value). +
      + +

      +The following functions have been deprecated: + +

      +

      + +
      dump_address_pair(pair)
      +
      +
      Deprecated since release 2.2.2. +Use formataddr() instead.

      +
      + +

      +

      + +
      decode(s)
      +
      +
      Deprecated since release 2.2.2. +Use Header.decode_header() instead.

      +
      + +

      +

      + +
      encode(s[, charset[, encoding]])
      +
      +
      Deprecated since release 2.2.2. +Use Header.encode() instead.

      +
      + +

      +


      Footnotes

      +
      +
      ... Time)2
      +
      Note that the sign of the timezone +offset is the opposite of the sign of the time.timezone +variable for the same timezone; the latter variable follows the +POSIX standard while this module follows RFC 2822. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/module-email.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/module-email.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,196 @@ + + + + + + + + + + + + +2 email -- An email and MIME handling package + + + + + +

      +2 email -- + An email and MIME handling package +

      + +

      + + +

      + +New in version 2.2. + +

      +The email package is a library for managing email messages, +including MIME and other RFC 2822-based message documents. It +subsumes most of the functionality in several older standard modules +such as rfc822, mimetools, +multifile, and other non-standard packages such as +mimecntl. It is specifically not designed to do any +sending of email messages to SMTP (RFC 2821) servers; that is the +function of the smtplib module. The email +package attempts to be as RFC-compliant as possible, supporting in +addition to RFC 2822, such MIME-related RFCs as +RFC 2045-RFC 2047, and RFC 2231. + +

      +The primary distinguishing feature of the email package is +that it splits the parsing and generating of email messages from the +internal object model representation of email. Applications +using the email package deal primarily with objects; you can +add sub-objects to messages, remove sub-objects from messages, +completely re-arrange the contents, etc. There is a separate parser +and a separate generator which handles the transformation from flat +text to the object model, and then back to flat text again. There +are also handy subclasses for some common MIME object types, and a few +miscellaneous utilities that help with such common tasks as extracting +and parsing message field values, creating RFC-compliant dates, etc. + +

      +The following sections describe the functionality of the +email package. The ordering follows a progression that +should be common in applications: an email message is read as flat +text from a file or other source, the text is parsed to produce the +object structure of the email message, this structure is manipulated, +and finally rendered back into flat text. + +

      +It is perfectly feasible to create the object structure out of whole +cloth -- i.e. completely from scratch. From there, a similar +progression can be taken as above. + +

      +Also included are detailed specifications of all the classes and +modules that the email package provides, the exception +classes you might encounter while using the email package, +some auxiliary utilities, and a few examples. For users of the older +mimelib package, or previous versions of the email +package, a section on differences and porting is provided. + +

      +

      +

      See Also:

      + +
      +
      Module smtplib: +
      SMTP protocol client. +
      +
      + +

      + +



      + + + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/modules.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/next.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/node1.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node1.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,160 @@ + + + + + + + + + + + + +1 Introduction + + + + + +

      +1 Introduction +

      +The email package provides classes and utilities to create, +parse, generate, and modify email messages, conforming to all the +relevant email and MIME related RFCs. + +

      +This document describes the current version of the email +package, which is available to Python programmers in a number of ways. +Python 2.2.2 and 2.3 come with email version 2, while earlier +versions of Python 2.2.x come with email version 1. Python +2.1.x and earlier do not come with any version of the email +package. + +

      +The email package is also available as a standalone distutils +package, and is compatible with Python 2.1.3 and beyond. Thus, if +you're using Python 2.1.3 you can download the standalone package and +install it in your site-packages directory. The standalone +email package is available on the +SourceForge mimelib project. + +

      +The documentation that follows was written for the Python project, so +if you're reading this as part of the standalone email +package documentation, there are a few notes to be aware of: + +

      + +

        +
      • Deprecation and ``version added'' notes are relative to the + Python version a feature was added or deprecated. To find out + what version of the email package a particular item was + added, changed, or removed, refer to the package's + NEWS file. + +

        +

      • +
      • The code samples are written with Python 2.2 in mind. For + Python 2.1.3, some adjustments are necessary. For example, this + code snippet; + +

        +

        +      if isinstance(s, str):
        +          # ...
        +
        + +

        +would need to be written this way in Python 2.1.3: + +

        +

        +      from types import StringType
        +      # ...
        +      if isinstance(s, StringType):
        +          # ...
        +
        + +

        +

      • +
      • If you're reading this documentation as part of the + standalone email package, some of the internal links to + other sections of the Python standard library may not resolve. + +

        +

      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node10.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node10.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,305 @@ + + + + + + + + + + + + +2.4 Creating email and MIME objects from scratch + + + + + +

      +2.4 Creating email and MIME objects from scratch +

      +Ordinarily, you get a message object structure by passing a file or +some text to a parser, which parses the text and returns the root +message object. However you can also build a complete message +structure from scratch, or even individual Message objects by +hand. In fact, you can also take an existing structure and add new +Message objects, move them around, etc. This makes a very +convenient interface for slicing-and-dicing MIME messages. + +

      +You can create a new object structure by creating Message +instances, adding attachments and all the appropriate headers manually. +For MIME messages though, the email package provides some +convenient subclasses to make things easier. Each of these classes +should be imported from a module with the same name as the class, from +within the email package. E.g.: + +

      +

      +import email.MIMEImage.MIMEImage
      +
      + +

      +or + +

      +

      +from email.MIMEText import MIMEText
      +
      + +

      +Here are the classes: + +

      +

      + +
      class MIMEBase(_maintype, _subtype, **_params)
      +
      +This is the base class for all the MIME-specific subclasses of +Message. Ordinarily you won't create instances specifically +of MIMEBase, although you could. MIMEBase is provided +primarily as a convenient base class for more specific MIME-aware +subclasses. + +

      +_maintype is the Content-Type: major type +(e.g. text or image), and _subtype is the +Content-Type: minor type +(e.g. plain or gif). _params is a parameter +key/value dictionary and is passed directly to +Message.add_header(). + +

      +The MIMEBase class always adds a Content-Type: header +(based on _maintype, _subtype, and _params), and a +MIME-Version: header (always set to 1.0). +

      + +

      +

      + +
      class MIMENonMultipart()
      +
      +A subclass of MIMEBase, this is an intermediate base class for +MIME messages that are not multipart. The primary purpose +of this class is to prevent the use of the attach() method, +which only makes sense for multipart messages. If +attach() is called, a MultipartConversionError +exception is raised. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      class MIMEMultipart([subtype[, + boundary[, _subparts[, _params]]]])
      +
      + +

      +A subclass of MIMEBase, this is an intermediate base class for +MIME messages that are multipart. Optional _subtype +defaults to mixed, but can be used to specify the subtype +of the message. A Content-Type: header of +multipart/_subtype will be added to the message +object. A MIME-Version: header will also be added. + +

      +Optional boundary is the multipart boundary string. When +None (the default), the boundary is calculated when needed. + +

      +_subparts is a sequence of initial subparts for the payload. It +must be possible to convert this sequence to a list. You can always +attach new subparts to the message by using the +Message.attach() method. + +

      +Additional parameters for the Content-Type: header are +taken from the keyword arguments, or passed into the _params +argument, which is a keyword dictionary. + +

      + +New in version 2.2.2. + +

      + +

      +

      + +
      class MIMEAudio(_audiodata[, _subtype[, + _encoder[, **_params]]])
      +
      + +

      +A subclass of MIMENonMultipart, the MIMEAudio class +is used to create MIME message objects of major type audio. +_audiodata is a string containing the raw audio data. If this +data can be decoded by the standard Python module sndhdr, +then the subtype will be automatically included in the +Content-Type: header. Otherwise you can explicitly specify the +audio subtype via the _subtype parameter. If the minor type could +not be guessed and _subtype was not given, then TypeError +is raised. + +

      +Optional _encoder is a callable (i.e. function) which will +perform the actual encoding of the audio data for transport. This +callable takes one argument, which is the MIMEAudio instance. +It should use get_payload() and set_payload() to +change the payload to encoded form. It should also add any +Content-Transfer-Encoding: or other headers to the message +object as necessary. The default encoding is base64. See the +email.Encoders module for a list of the built-in encoders. + +

      +_params are passed straight through to the base class constructor. +

      + +

      +

      + +
      class MIMEImage(_imagedata[, _subtype[, + _encoder[, **_params]]])
      +
      + +

      +A subclass of MIMENonMultipart, the MIMEImage class is +used to create MIME message objects of major type image. +_imagedata is a string containing the raw image data. If this +data can be decoded by the standard Python module imghdr, +then the subtype will be automatically included in the +Content-Type: header. Otherwise you can explicitly specify the +image subtype via the _subtype parameter. If the minor type could +not be guessed and _subtype was not given, then TypeError +is raised. + +

      +Optional _encoder is a callable (i.e. function) which will +perform the actual encoding of the image data for transport. This +callable takes one argument, which is the MIMEImage instance. +It should use get_payload() and set_payload() to +change the payload to encoded form. It should also add any +Content-Transfer-Encoding: or other headers to the message +object as necessary. The default encoding is base64. See the +email.Encoders module for a list of the built-in encoders. + +

      +_params are passed straight through to the MIMEBase +constructor. +

      + +

      +

      + +
      class MIMEMessage(_msg[, _subtype])
      +
      +A subclass of MIMENonMultipart, the MIMEMessage class +is used to create MIME objects of main type message. +_msg is used as the payload, and must be an instance of class +Message (or a subclass thereof), otherwise a +TypeError is raised. + +

      +Optional _subtype sets the subtype of the message; it defaults +to rfc822. +

      + +

      +

      + +
      class MIMEText(_text[, _subtype[, + _charset[, _encoder]]])
      +
      + +

      +A subclass of MIMENonMultipart, the MIMEText class is +used to create MIME objects of major type text. +_text is the string for the payload. _subtype is the +minor type and defaults to plain. _charset is the +character set of the text and is passed as a parameter to the +MIMENonMultipart constructor; it defaults to us-ascii. No +guessing or encoding is performed on the text data. + +

      +

      Deprecated since release 2.2.2. +The _encoding argument has been deprecated. +Encoding now happens implicitly based on the _charset argument.

      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node17.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node17.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,197 @@ + + + + + + + + + + + + +2.11 Differences from email v1 (up to Python 2.2.1) + + + + + +

      +2.11 Differences from email v1 (up to Python 2.2.1) +

      + +

      +Version 1 of the email package was bundled with Python +releases up to Python 2.2.1. Version 2 was developed for the Python +2.3 release, and backported to Python 2.2.2. It was also available as +a separate distutils based package. email version 2 is +almost entirely backward compatible with version 1, with the +following differences: + +

      + +

        +
      • The email.Header and email.Charset modules + have been added. + +

        +

      • +
      • The pickle format for Message instances has changed. + Since this was never (and still isn't) formally defined, this + isn't considered a backward incompatibility. However if your + application pickles and unpickles Message instances, be + aware that in email version 2, Message + instances now have private variables _charset and + _default_type. + +

        +

      • +
      • Several methods in the Message class have been + deprecated, or their signatures changed. Also, many new methods + have been added. See the documentation for the Message + class for details. The changes should be completely backward + compatible. + +

        +

      • +
      • The object structure has changed in the face of + message/rfc822 content types. In email + version 1, such a type would be represented by a scalar payload, + i.e. the container message's is_multipart() returned + false, get_payload() was not a list object, but a single + Message instance. + +

        +This structure was inconsistent with the rest of the package, so + the object representation for message/rfc822 content + types was changed. In email version 2, the container + does return True from is_multipart(), and + get_payload() returns a list containing a single + Message item. + +

        +Note that this is one place that backward compatibility could + not be completely maintained. However, if you're already + testing the return type of get_payload(), you should be + fine. You just need to make sure your code doesn't do a + set_payload() with a Message instance on a + container with a content type of message/rfc822. + +

        +

      • +
      • The Parser constructor's strict argument was + added, and its parse() and parsestr() methods + grew a headersonly argument. The strict flag was + also added to functions email.message_from_file() + and email.message_from_string(). + +

        +

      • +
      • Generator.__call__() is deprecated; use + Generator.flatten() instead. The Generator + class has also grown the clone() method. + +

        +

      • +
      • The DecodedGenerator class in the + email.Generator module was added. + +

        +

      • +
      • The intermediate base classes MIMENonMultipart and + MIMEMultipart have been added, and interposed in the + class hierarchy for most of the other MIME-related derived + classes. + +

        +

      • +
      • The _encoder argument to the MIMEText constructor + has been deprecated. Encoding now happens implicitly based + on the _charset argument. + +

        +

      • +
      • The following functions in the email.Utils module have + been deprecated: dump_address_pairs(), + decode(), and encode(). The following + functions have been added to the module: + make_msgid(), decode_rfc2231(), + encode_rfc2231(), and decode_params(). + +

        +

      • +
      • The non-public function email.Iterators._structure() + was added. +
      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node18.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node18.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,300 @@ + + + + + + + + + + + + +2.12 Differences from mimelib + + + + + +

      +2.12 Differences from mimelib +

      + +

      +The email package was originally prototyped as a separate +library called +mimelib. +Changes have been made so that +method names are more consistent, and some methods or modules have +either been added or removed. The semantics of some of the methods +have also changed. For the most part, any functionality available in +mimelib is still available in the email package, +albeit often in a different way. Backward compatibility between +the mimelib package and the email package was not a +priority. + +

      +Here is a brief description of the differences between the +mimelib and the email packages, along with hints on +how to port your applications. + +

      +Of course, the most visible difference between the two packages is +that the package name has been changed to email. In +addition, the top-level package has the following differences: + +

      + +

        +
      • messageFromString() has been renamed to + message_from_string(). + +

        +

      • +
      • messageFromFile() has been renamed to + message_from_file(). + +

        +

      • +
      + +

      +The Message class has the following differences: + +

      + +

        +
      • The method asString() was renamed to as_string(). + +

        +

      • +
      • The method ismultipart() was renamed to + is_multipart(). + +

        +

      • +
      • The get_payload() method has grown a decode + optional argument. + +

        +

      • +
      • The method getall() was renamed to get_all(). + +

        +

      • +
      • The method addheader() was renamed to add_header(). + +

        +

      • +
      • The method gettype() was renamed to get_type(). + +

        +

      • +
      • The methodgetmaintype() was renamed to + get_main_type(). + +

        +

      • +
      • The method getsubtype() was renamed to + get_subtype(). + +

        +

      • +
      • The method getparams() was renamed to + get_params(). + Also, whereas getparams() returned a list of strings, + get_params() returns a list of 2-tuples, effectively + the key/value pairs of the parameters, split on the "=" + sign. + +

        +

      • +
      • The method getparam() was renamed to get_param(). + +

        +

      • +
      • The method getcharsets() was renamed to + get_charsets(). + +

        +

      • +
      • The method getfilename() was renamed to + get_filename(). + +

        +

      • +
      • The method getboundary() was renamed to + get_boundary(). + +

        +

      • +
      • The method setboundary() was renamed to + set_boundary(). + +

        +

      • +
      • The method getdecodedpayload() was removed. To get + similar functionality, pass the value 1 to the decode flag + of the get_payload() method. + +

        +

      • +
      • The method getpayloadastext() was removed. Similar + functionality + is supported by the DecodedGenerator class in the + email.Generator module. + +

        +

      • +
      • The method getbodyastext() was removed. You can get + similar functionality by creating an iterator with + typed_subpart_iterator() in the + email.Iterators module. +
      • +
      + +

      +The Parser class has no differences in its public interface. +It does have some additional smarts to recognize +message/delivery-status type messages, which it represents as +a Message instance containing separate Message +subparts for each header block in the delivery status +notification3. + +

      +The Generator class has no differences in its public +interface. There is a new class in the email.Generator +module though, called DecodedGenerator which provides most of +the functionality previously available in the +Message.getpayloadastext() method. + +

      +The following modules and classes have been changed: + +

      + +

        +
      • The MIMEBase class constructor arguments _major + and _minor have changed to _maintype and + _subtype respectively. + +

        +

      • +
      • The Image class/module has been renamed to + MIMEImage. The _minor argument has been renamed to + _subtype. + +

        +

      • +
      • The Text class/module has been renamed to + MIMEText. The _minor argument has been renamed to + _subtype. + +

        +

      • +
      • The MessageRFC822 class/module has been renamed to + MIMEMessage. Note that an earlier version of + mimelib called this class/module RFC822, but + that clashed with the Python standard library module + rfc822 on some case-insensitive file systems. + +

        +Also, the MIMEMessage class now represents any kind of + MIME message with main type message. It takes an + optional argument _subtype which is used to set the MIME + subtype. _subtype defaults to rfc822. +

      • +
      + +

      +mimelib provided some utility functions in its +address and date modules. All of these functions +have been moved to the email.Utils module. + +

      +The MsgReader class/module has been removed. Its functionality +is most closely supported in the body_line_iterator() +function in the email.Iterators module. + +

      +


      Footnotes

      +
      +
      ... +notification3
      +
      Delivery Status Notifications (DSN) are defined +in RFC 1894. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node19.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node19.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,408 @@ + + + + + + + + + + + +2.13 Examples + + + + + +

      +2.13 Examples +

      + +

      +Here are a few examples of how to use the email package to +read, write, and send simple email messages, as well as more complex +MIME messages. + +

      +First, let's see how to create and send a simple text message: + +

      +

      +
      # Import smtplib for the actual sending function
      +import smtplib
      +
      +# Import the email modules we'll need
      +from email.MIMEText import MIMEText
      +
      +# Open a plain text file for reading.  For this example, assume that
      +# the text file contains only ASCII characters.
      +fp = open(textfile, 'rb')
      +# Create a text/plain message
      +msg = MIMEText(fp.read())
      +fp.close()
      +
      +# me == the sender's email address
      +# you == the recipient's email address
      +msg['Subject'] = 'The contents of %s' % textfile
      +msg['From'] = me
      +msg['To'] = you
      +
      +# Send the message via our own SMTP server, but don't include the
      +# envelope header.
      +s = smtplib.SMTP()
      +s.connect()
      +s.sendmail(me, [you], msg.as_string())
      +s.close()
      +
      +
      + +

      +Here's an example of how to send a MIME message containing a bunch of +family pictures that may be residing in a directory: + +

      +

      +
      # Import smtplib for the actual sending function
      +import smtplib
      +
      +# Here are the email pacakge modules we'll need
      +from email.MIMEImage import MIMEImage
      +from email.MIMEMultipart import MIMEMultipart
      +
      +COMMASPACE = ', '
      +
      +# Create the container (outer) email message.
      +msg = MIMEMultipart()
      +msg['Subject'] = 'Our family reunion'
      +# me == the sender's email address
      +# family = the list of all recipients' email addresses
      +msg['From'] = me
      +msg['To'] = COMMASPACE.join(family)
      +msg.preamble = 'Our family reunion'
      +# Guarantees the message ends in a newline
      +msg.epilogue = ''
      +
      +# Assume we know that the image files are all in PNG format
      +for file in pngfiles:
      +    # Open the files in binary mode.  Let the MIMEImage class automatically
      +    # guess the specific image type.
      +    fp = open(file, 'rb')
      +    img = MIMEImage(fp.read())
      +    fp.close()
      +    msg.attach(img)
      +
      +# Send the email via our own SMTP server.
      +s = smtplib.SMTP()
      +s.connect()
      +s.sendmail(me, family, msg.as_string())
      +s.close()
      +
      +
      + +

      +Here's an example of how to send the entire contents of a directory as +an email message: +4 +

      +

      +
      #!/usr/bin/env python
      +
      +"""Send the contents of a directory as a MIME message.
      +
      +Usage: dirmail [options] from to [to ...]*
      +
      +Options:
      +    -h / --help
      +        Print this message and exit.
      +
      +    -d directory
      +    --directory=directory
      +        Mail the contents of the specified directory, otherwise use the
      +        current directory.  Only the regular files in the directory are sent,
      +        and we don't recurse to subdirectories.
      +
      +`from' is the email address of the sender of the message.
      +
      +`to' is the email address of the recipient of the message, and multiple
      +recipients may be given.
      +
      +The email is sent by forwarding to your local SMTP server, which then does the
      +normal delivery process.  Your local machine must be running an SMTP server.
      +"""
      +
      +import sys
      +import os
      +import getopt
      +import smtplib
      +# For guessing MIME type based on file name extension
      +import mimetypes
      +
      +from email import Encoders
      +from email.Message import Message
      +from email.MIMEAudio import MIMEAudio
      +from email.MIMEBase import MIMEBase
      +from email.MIMEMultipart import MIMEMultipart
      +from email.MIMEImage import MIMEImage
      +from email.MIMEText import MIMEText
      +
      +COMMASPACE = ', '
      +
      +def usage(code, msg=''):
      +    print >> sys.stderr, __doc__
      +    if msg:
      +        print >> sys.stderr, msg
      +    sys.exit(code)
      +
      +def main():
      +    try:
      +        opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory='])
      +    except getopt.error, msg:
      +        usage(1, msg)
      +
      +    dir = os.curdir
      +    for opt, arg in opts:
      +        if opt in ('-h', '--help'):
      +            usage(0)
      +        elif opt in ('-d', '--directory'):
      +            dir = arg
      +
      +    if len(args) < 2:
      +        usage(1)
      +
      +    sender = args[0]
      +    recips = args[1:]
      +    
      +    # Create the enclosing (outer) message
      +    outer = MIMEMultipart()
      +    outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir)
      +    outer['To'] = COMMASPACE.join(recips)
      +    outer['From'] = sender
      +    outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
      +    # To guarantee the message ends with a newline
      +    outer.epilogue = ''
      +
      +    for filename in os.listdir(dir):
      +        path = os.path.join(dir, filename)
      +        if not os.path.isfile(path):
      +            continue
      +        # Guess the content type based on the file's extension.  Encoding
      +        # will be ignored, although we should check for simple things like
      +        # gzip'd or compressed files.
      +        ctype, encoding = mimetypes.guess_type(path)
      +        if ctype is None or encoding is not None:
      +            # No guess could be made, or the file is encoded (compressed), so
      +            # use a generic bag-of-bits type.
      +            ctype = 'application/octet-stream'
      +        maintype, subtype = ctype.split('/', 1)
      +        if maintype == 'text':
      +            fp = open(path)
      +            # Note: we should handle calculating the charset
      +            msg = MIMEText(fp.read(), _subtype=subtype)
      +            fp.close()
      +        elif maintype == 'image':
      +            fp = open(path, 'rb')
      +            msg = MIMEImage(fp.read(), _subtype=subtype)
      +            fp.close()
      +        elif maintype == 'audio':
      +            fp = open(path, 'rb')
      +            msg = MIMEAudio(fp.read(), _subtype=subtype)
      +            fp.close()
      +        else:
      +            fp = open(path, 'rb')
      +            msg = MIMEBase(maintype, subtype)
      +            msg.set_payload(fp.read())
      +            fp.close()
      +            # Encode the payload using Base64
      +            Encoders.encode_base64(msg)
      +        # Set the filename parameter
      +        msg.add_header('Content-Disposition', 'attachment', filename=filename)
      +        outer.attach(msg)
      +
      +    # Now send the message
      +    s = smtplib.SMTP()
      +    s.connect()
      +    s.sendmail(sender, recips, outer.as_string())
      +    s.close()
      +
      +if __name__ == '__main__':
      +    main()
      +
      +
      + +

      +And finally, here's an example of how to unpack a MIME message like +the one above, into a directory of files: + +

      +

      +
      #!/usr/bin/env python
      +
      +"""Unpack a MIME message into a directory of files.
      +
      +Usage: unpackmail [options] msgfile
      +
      +Options:
      +    -h / --help
      +        Print this message and exit.
      +
      +    -d directory
      +    --directory=directory
      +        Unpack the MIME message into the named directory, which will be
      +        created if it doesn't already exist.
      +
      +msgfile is the path to the file containing the MIME message.
      +"""
      +
      +import sys
      +import os
      +import getopt
      +import errno
      +import mimetypes
      +import email
      +
      +def usage(code, msg=''):
      +    print >> sys.stderr, __doc__
      +    if msg:
      +        print >> sys.stderr, msg
      +    sys.exit(code)
      +
      +def main():
      +    try:
      +        opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory='])
      +    except getopt.error, msg:
      +        usage(1, msg)
      +
      +    dir = os.curdir
      +    for opt, arg in opts:
      +        if opt in ('-h', '--help'):
      +            usage(0)
      +        elif opt in ('-d', '--directory'):
      +            dir = arg
      +
      +    try:
      +        msgfile = args[0]
      +    except IndexError:
      +        usage(1)
      +
      +    try:
      +        os.mkdir(dir)
      +    except OSError, e:
      +        # Ignore directory exists error
      +        if e.errno <> errno.EEXIST: raise
      +
      +    fp = open(msgfile)
      +    msg = email.message_from_file(fp)
      +    fp.close()
      +
      +    counter = 1
      +    for part in msg.walk():
      +        # multipart/* are just containers
      +        if part.get_content_maintype() == 'multipart':
      +            continue
      +        # Applications should really sanitize the given filename so that an
      +        # email message can't be used to overwrite important files
      +        filename = part.get_filename()
      +        if not filename:
      +            ext = mimetypes.guess_extension(part.get_type())
      +            if not ext:
      +                # Use a generic bag-of-bits extension
      +                ext = '.bin'
      +            filename = 'part-%03d%s' % (counter, ext)
      +        counter += 1
      +        fp = open(os.path.join(dir, filename), 'wb')
      +        fp.write(part.get_payload(decode=1))
      +        fp.close()
      +
      +if __name__ == '__main__':
      +    main()
      +
      +
      + +

      +


      Footnotes

      +
      +
      ... message:4
      +
      Thanks to Matthew Dixon Cowles for the original inspiration + and examples. + +
      +
      + + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node4.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node4.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,172 @@ + + + + + + + + + + + +2.1.1 Deprecated methods + + + + + +

      +2.1.1 Deprecated methods +

      + +

      +The following methods are deprecated in email version 2. +They are documented here for completeness. + +

      +

      + +
      add_payload(payload)
      +
      +Add payload to the message object's existing payload. If, prior +to calling this method, the object's payload was None +(i.e. never before set), then after this method is called, the payload +will be the argument payload. + +

      +If the object's payload was already a list +(i.e. is_multipart() returns 1), then payload is +appended to the end of the existing payload list. + +

      +For any other type of existing payload, add_payload() will +transform the new payload into a list consisting of the old payload +and payload, but only if the document is already a MIME +multipart document. This condition is satisfied if the message's +Content-Type: header's main type is either +multipart, or there is no Content-Type: +header. In any other situation, +MultipartConversionError is raised. + +

      +

      Deprecated since release 2.2.2. +Use the attach() method instead.

      +
      + +

      +

      + +
      get_type([failobj])
      +
      +Return the message's content type, as a string of the form +maintype/subtype as taken from the +Content-Type: header. +The returned string is coerced to lowercase. + +

      +If there is no Content-Type: header in the message, +failobj is returned (defaults to None). + +

      +

      Deprecated since release 2.2.2. +Use the get_content_type() method instead.

      +
      + +

      +

      + +
      get_main_type([failobj])
      +
      +Return the message's main content type. This essentially returns the +maintype part of the string returned by get_type(), with the +same semantics for failobj. + +

      +

      Deprecated since release 2.2.2. +Use the get_content_maintype() method instead.

      +
      + +

      +

      + +
      get_subtype([failobj])
      +
      +Return the message's sub-content type. This essentially returns the +subtype part of the string returned by get_type(), with the +same semantics for failobj. + +

      +

      Deprecated since release 2.2.2. +Use the get_content_subtype() method instead.

      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node6.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node6.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,227 @@ + + + + + + + + + + + + +2.2.1 Parser class API + + + + + +

      +2.2.1 Parser class API +

      + +

      +

      + +
      class Parser([_class[, strict]])
      +
      +The constructor for the Parser class takes an optional +argument _class. This must be a callable factory (such as a +function or a class), and it is used whenever a sub-message object +needs to be created. It defaults to Message (see +email.Message). The factory will be called without +arguments. + +

      +The optional strict flag specifies whether strict or lax parsing +should be performed. When things like MIME terminating +boundaries are missing, or when messages contain other formatting +problems, the Parser will raise a +MessageParseError, if the strict flag is True. +However, when lax parsing is enabled (i.e. strict is False), +the Parser will attempt to work around such broken formatting to +produce a usable message structure (this doesn't mean +MessageParseErrors are never raised; some ill-formatted +messages just can't be parsed). The strict flag defaults to +False since lax parsing usually provides the most convenient +behavior. + +

      + +Changed in version 2.2.2: +The strict flag was added. + +

      + +

      +The other public Parser methods are: + +

      +

      + +
      parse(fp[, headersonly])
      +
      +Read all the data from the file-like object fp, parse the +resulting text, and return the root message object. fp must +support both the readline() and the read() methods +on file-like objects. + +

      +The text contained in fp must be formatted as a block of RFC 2822 +style headers and header continuation lines, optionally preceded by a +envelope header. The header block is terminated either by the +end of the data or by a blank line. Following the header block is the +body of the message (which may contain MIME-encoded subparts). + +

      +Optional headersonly is as with the parse() method. + +

      + +Changed in version 2.2.2: +The headersonly flag was added. + +

      + +

      +

      + +
      parsestr(text[, headersonly])
      +
      +Similar to the parse() method, except it takes a string +object instead of a file-like object. Calling this method on a string +is exactly equivalent to wrapping text in a StringIO +instance first and calling parse(). + +

      +Optional headersonly is a flag specifying whether to stop +parsing after reading the headers or not. The default is False, +meaning it parses the entire contents of the file. + +

      + +Changed in version 2.2.2: +The headersonly flag was added. + +

      + +

      +Since creating a message object structure from a string or a file +object is such a common task, two functions are provided as a +convenience. They are available in the top-level email +package namespace. + +

      +

      + +
      message_from_string(s[, _class[, strict]])
      +
      +Return a message object structure from a string. This is exactly +equivalent to Parser().parsestr(s). Optional _class and +strict are interpreted as with the Parser class constructor. + +

      + +Changed in version 2.2.2: +The strict flag was added. + +

      + +

      +

      + +
      message_from_file(fp[, _class[, strict]])
      +
      +Return a message object structure tree from an open file object. This +is exactly equivalent to Parser().parse(fp). Optional +_class and strict are interpreted as with the +Parser class constructor. + +

      + +Changed in version 2.2.2: +The strict flag was added. + +

      + +

      +Here's an example of how you might use this at an interactive Python +prompt: + +

      +

      +>>> import email
      +>>> msg = email.message_from_string(myString)
      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node7.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node7.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,122 @@ + + + + + + + + + + + +2.2.2 Additional notes + + + + + +

      +2.2.2 Additional notes +

      + +

      +Here are some notes on the parsing semantics: + +

      + +

        +
      • Most non-multipart type messages are parsed as a single + message object with a string payload. These objects will return + False for is_multipart(). Their + get_payload() method will return a string object. + +

        +

      • +
      • All multipart type messages will be parsed as a + container message object with a list of sub-message objects for + their payload. The outer container message will return + True for is_multipart() and their + get_payload() method will return the list of + Message subparts. + +

        +

      • +
      • Most messages with a content type of message/* + (e.g. message/delivery-status and + message/rfc822) will also be parsed as container + object containing a list payload of length 1. Their + is_multipart() method will return True. The + single element in the list payload will be a sub-message object. +
      • +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/node9.html ============================================================================== --- (empty file) +++ sandbox/trunk/emailpkg/2_5/docs/node9.html Mon Mar 6 02:24:24 2006 @@ -0,0 +1,107 @@ + + + + + + + + + + + +2.3.1 Deprecated methods + + + + + +

      +2.3.1 Deprecated methods +

      + +

      +The following methods are deprecated in email version 2. +They are documented here for completeness. + +

      +

      + +
      __call__(msg[, unixfrom])
      +
      +This method is identical to the flatten() method. + +

      +

      Deprecated since release 2.2.2. +Use the flatten() method instead.

      +
      + +

      + +

      + + + + Added: sandbox/trunk/emailpkg/2_5/docs/previous.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/pyfav.png ============================================================================== Binary file. No diff available. Added: sandbox/trunk/emailpkg/2_5/docs/up.png ============================================================================== Binary file. No diff available. From python-checkins at python.org Mon Mar 6 03:08:05 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 03:08:05 +0100 (CET) Subject: [Python-checkins] r42863 - sandbox/tags/emailpkg Message-ID: <20060306020805.B8E511E4045@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 03:08:03 2006 New Revision: 42863 Added: sandbox/tags/emailpkg/ Log: A directory for email package release tags. From python-checkins at python.org Mon Mar 6 03:11:45 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 03:11:45 +0100 (CET) Subject: [Python-checkins] r42864 - sandbox/tags/emailpkg/4_0a2 Message-ID: <20060306021145.D9D461E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 03:11:45 2006 New Revision: 42864 Added: sandbox/tags/emailpkg/4_0a2/ - copied from r42862, sandbox/trunk/emailpkg/4_0/ Log: Tagging email 4.0a2 From python-checkins at python.org Mon Mar 6 03:12:23 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 03:12:23 +0100 (CET) Subject: [Python-checkins] r42865 - sandbox/tags/emailpkg/3_0_1 Message-ID: <20060306021223.7E7471E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 03:12:22 2006 New Revision: 42865 Added: sandbox/tags/emailpkg/3_0_1/ - copied from r42862, sandbox/trunk/emailpkg/3_0/ Log: Tagging email 3.0.1 From python-checkins at python.org Mon Mar 6 03:12:47 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 03:12:47 +0100 (CET) Subject: [Python-checkins] r42866 - sandbox/tags/emailpkg/2_5_7 Message-ID: <20060306021247.A9DB11E4007@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 03:12:46 2006 New Revision: 42866 Added: sandbox/tags/emailpkg/2_5_7/ - copied from r42862, sandbox/trunk/emailpkg/2_5/ Log: Tagging email 2.5.7 From python-checkins at python.org Mon Mar 6 03:23:10 2006 From: python-checkins at python.org (barry.warsaw) Date: Mon, 6 Mar 2006 03:23:10 +0100 (CET) Subject: [Python-checkins] r42867 - in sandbox/tags/emailpkg: 2_5_7 3_0_1 Message-ID: <20060306022310.A70271E4008@bag.python.org> Author: barry.warsaw Date: Mon Mar 6 03:23:09 2006 New Revision: 42867 Modified: sandbox/tags/emailpkg/2_5_7/ (props changed) sandbox/tags/emailpkg/3_0_1/ (props changed) Log: Update externals revision From python-checkins at python.org Mon Mar 6 08:51:23 2006 From: python-checkins at python.org (hyeshik.chang) Date: Mon, 6 Mar 2006 08:51:23 +0100 (CET) Subject: [Python-checkins] r42868 - python/trunk/Modules/cjkcodecs/cjkcodecs.h Message-ID: <20060306075123.E0ECE1E4007@bag.python.org> Author: hyeshik.chang Date: Mon Mar 6 08:51:19 2006 New Revision: 42868 Modified: python/trunk/Modules/cjkcodecs/cjkcodecs.h Log: Check NULL if Py_InitModule fails. Modified: python/trunk/Modules/cjkcodecs/cjkcodecs.h ============================================================================== --- python/trunk/Modules/cjkcodecs/cjkcodecs.h (original) +++ python/trunk/Modules/cjkcodecs/cjkcodecs.h Mon Mar 6 08:51:19 2006 @@ -388,7 +388,8 @@ init_codecs_##loc(void) \ { \ PyObject *m = Py_InitModule("_codecs_" #loc, __methods);\ - (void)register_maps(m); \ + if (m != NULL) \ + (void)register_maps(m); \ } #endif From python-checkins at python.org Mon Mar 6 09:59:12 2006 From: python-checkins at python.org (nick.coghlan) Date: Mon, 6 Mar 2006 09:59:12 +0100 (CET) Subject: [Python-checkins] r42869 - peps/trunk/pep-0338.txt Message-ID: <20060306085912.8D7841E4007@bag.python.org> Author: nick.coghlan Date: Mon Mar 6 09:59:10 2006 New Revision: 42869 Modified: peps/trunk/pep-0338.txt Log: Fix name of parameter in run_module signature Modified: peps/trunk/pep-0338.txt ============================================================================== --- peps/trunk/pep-0338.txt (original) +++ peps/trunk/pep-0338.txt Mon Mar 6 09:59:10 2006 @@ -132,11 +132,11 @@ ``runpy.run_module`` instead of trying to run the module directly. The delegation has the form:: - runpy.run_module(sys.argv[0], run_name="__main__", as_script=True) + runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True) ``run_module`` is the only function ``runpy`` exposes in its public API. -``run_module(mod_name[, init_globals][, run_name][, as_script])`` +``run_module(mod_name[, init_globals][, run_name][, alter_sys])`` Execute the code of the specified module and return the resulting module globals dictionary. The module's code is first located using From neal at metaslash.com Mon Mar 6 10:54:35 2006 From: neal at metaslash.com (Neal Norwitz) Date: Mon, 6 Mar 2006 04:54:35 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060306095435.GA3030@python.psfb.org> test_capi leaked [143, -143, 143] references test_charmapcodec leaked [-54, 0, 0] references test_cmd_line leaked [15, 0, 0] references test_compiler leaked [167, 73, 114] references test_generators leaked [255, 255, 255] references test_socket leaked [0, 0, 197] references test_threadedtempfile leaked [3, 4, 3] references test_threading_local leaked [25, 29, 35] references test_urllib2 leaked [80, -130, 70] references From python-checkins at python.org Mon Mar 6 17:30:27 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 6 Mar 2006 17:30:27 +0100 (CET) Subject: [Python-checkins] r42870 - python/trunk/PC/pyconfig.h Message-ID: <20060306163027.737DA1E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 6 17:30:25 2006 New Revision: 42870 Modified: python/trunk/PC/pyconfig.h Log: Patch #1437769: notice that time_t is a 64-bit type in VS2005 Modified: python/trunk/PC/pyconfig.h ============================================================================== --- python/trunk/PC/pyconfig.h (original) +++ python/trunk/PC/pyconfig.h Mon Mar 6 17:30:25 2006 @@ -272,11 +272,16 @@ # define PLATFORM "win32" # define HAVE_LARGEFILE_SUPPORT # define SIZEOF_VOID_P 4 -# define SIZEOF_TIME_T 4 # define SIZEOF_OFF_T 4 # define SIZEOF_FPOS_T 8 # define SIZEOF_HKEY 4 # define SIZEOF_SIZE_T 4 + /* MS VS2005 changes TIME_T to an 64-bit type on all platforms */ +# if defined(_MSC_VER) && _MSC_VER >= 1400 +# define SIZEOF_TIME_T 8 +# else +# define SIZEOF_TIME_T 4 +# endif #endif #ifdef _DEBUG From python-checkins at python.org Mon Mar 6 17:32:08 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 6 Mar 2006 17:32:08 +0100 (CET) Subject: [Python-checkins] r42871 - python/trunk/PC/pyconfig.h Message-ID: <20060306163208.A537F1E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 6 17:32:05 2006 New Revision: 42871 Modified: python/trunk/PC/pyconfig.h Log: lower-case time_t. Modified: python/trunk/PC/pyconfig.h ============================================================================== --- python/trunk/PC/pyconfig.h (original) +++ python/trunk/PC/pyconfig.h Mon Mar 6 17:32:05 2006 @@ -276,7 +276,7 @@ # define SIZEOF_FPOS_T 8 # define SIZEOF_HKEY 4 # define SIZEOF_SIZE_T 4 - /* MS VS2005 changes TIME_T to an 64-bit type on all platforms */ + /* MS VS2005 changes time_t to an 64-bit type on all platforms */ # if defined(_MSC_VER) && _MSC_VER >= 1400 # define SIZEOF_TIME_T 8 # else From neal at metaslash.com Mon Mar 6 22:54:06 2006 From: neal at metaslash.com (Neal Norwitz) Date: Mon, 6 Mar 2006 16:54:06 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060306215406.GA16431@python.psfb.org> test_capi leaked [-143, 0, 0] references test_charmapcodec leaked [-54, 0, 0] references test_cmd_line leaked [-15, 15, 0] references test_compiler leaked [42, 408, 16] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_socket leaked [0, 0, 197] references test_threadedtempfile leaked [3, 2, 2] references test_threading_local leaked [42, 42, 42] references test_urllib2 leaked [80, -130, 70] references From brett at python.org Mon Mar 6 23:32:49 2006 From: brett at python.org (Brett Cannon) Date: Mon, 6 Mar 2006 14:32:49 -0800 Subject: [Python-checkins] Python Regression Test Failures refleak (1) In-Reply-To: <20060306215406.GA16431@python.psfb.org> References: <20060306215406.GA16431@python.psfb.org> Message-ID: On 3/6/06, Neal Norwitz wrote: > test_capi leaked [-143, 0, 0] references > test_charmapcodec leaked [-54, 0, 0] references > test_cmd_line leaked [-15, 15, 0] references > test_compiler leaked [42, 408, 16] references > test_generators leaked [255, 255, 255] references > test_quopri leaked [17, 0, 0] references > test_socket leaked [0, 0, 197] references > test_threadedtempfile leaked [3, 2, 2] references > test_threading_local leaked [42, 42, 42] references > test_urllib2 leaked [80, -130, 70] references Should we be worrying about the ones that do not leak any references consistently in an extreme manner? Such as test_capi or test_cmd_line; they seem to have some import overhead or something that spikes references but they stabilize and do not leak anything in the end. And test_socket is just weird. =) -Brett From python-checkins at python.org Mon Mar 6 23:39:13 2006 From: python-checkins at python.org (walter.doerwald) Date: Mon, 6 Mar 2006 23:39:13 +0100 (CET) Subject: [Python-checkins] r42872 - in python/trunk/Lib: codecs.py test/test_codecs.py Message-ID: <20060306223913.8CB8B1E4007@bag.python.org> Author: walter.doerwald Date: Mon Mar 6 23:39:12 2006 New Revision: 42872 Modified: python/trunk/Lib/codecs.py python/trunk/Lib/test/test_codecs.py Log: If size is specified, try to read at least size characters. This is a alternative version of patch #1379332. Modified: python/trunk/Lib/codecs.py ============================================================================== --- python/trunk/Lib/codecs.py (original) +++ python/trunk/Lib/codecs.py Mon Mar 6 23:39:12 2006 @@ -274,7 +274,10 @@ while True: # can the request can be satisfied from the character buffer? if chars < 0: - if self.charbuffer: + if size < 0: + if self.charbuffer: + break + elif len(self.charbuffer) >= size: break else: if len(self.charbuffer) >= chars: Modified: python/trunk/Lib/test/test_codecs.py ============================================================================== --- python/trunk/Lib/test/test_codecs.py (original) +++ python/trunk/Lib/test/test_codecs.py Mon Mar 6 23:39:12 2006 @@ -46,19 +46,23 @@ stream = StringIO.StringIO(input.encode(self.encoding)) return codecs.getreader(self.encoding)(stream) - def readalllines(input, keepends=True): + def readalllines(input, keepends=True, size=None): reader = getreader(input) lines = [] while True: - line = reader.readline(keepends=keepends) + line = reader.readline(size=size, keepends=keepends) if not line: break lines.append(line) - return "".join(lines) + return "|".join(lines) s = u"foo\nbar\r\nbaz\rspam\u2028eggs" - self.assertEqual(readalllines(s, True), s) - self.assertEqual(readalllines(s, False), u"foobarbazspameggs") + sexpected = u"foo\n|bar\r\n|baz\r|spam\u2028|eggs" + sexpectednoends = u"foo|bar|baz|spam|eggs" + self.assertEqual(readalllines(s, True), sexpected) + self.assertEqual(readalllines(s, False), sexpectednoends) + self.assertEqual(readalllines(s, True, 10), sexpected) + self.assertEqual(readalllines(s, False, 10), sexpectednoends) # Test long lines (multiple calls to read() in readline()) vw = [] From python-checkins at python.org Mon Mar 6 23:44:03 2006 From: python-checkins at python.org (walter.doerwald) Date: Mon, 6 Mar 2006 23:44:03 +0100 (CET) Subject: [Python-checkins] r42873 - in python/branches/release24-maint/Lib: codecs.py test/test_codecs.py Message-ID: <20060306224403.DBDFB1E4007@bag.python.org> Author: walter.doerwald Date: Mon Mar 6 23:44:03 2006 New Revision: 42873 Modified: python/branches/release24-maint/Lib/codecs.py python/branches/release24-maint/Lib/test/test_codecs.py Log: Backport revision 42872: If size is specified, try to read at least size characters. This is a alternative version of patch #1379332. Modified: python/branches/release24-maint/Lib/codecs.py ============================================================================== --- python/branches/release24-maint/Lib/codecs.py (original) +++ python/branches/release24-maint/Lib/codecs.py Mon Mar 6 23:44:03 2006 @@ -274,7 +274,10 @@ while True: # can the request can be satisfied from the character buffer? if chars < 0: - if self.charbuffer: + if size < 0: + if self.charbuffer: + break + elif len(self.charbuffer) >= size: break else: if len(self.charbuffer) >= chars: Modified: python/branches/release24-maint/Lib/test/test_codecs.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_codecs.py (original) +++ python/branches/release24-maint/Lib/test/test_codecs.py Mon Mar 6 23:44:03 2006 @@ -57,19 +57,23 @@ stream = StringIO.StringIO(input.encode(self.encoding)) return codecs.getreader(self.encoding)(stream) - def readalllines(input, keepends=True): + def readalllines(input, keepends=True, size=None): reader = getreader(input) lines = [] while True: - line = reader.readline(keepends=keepends) + line = reader.readline(size=size, keepends=keepends) if not line: break lines.append(line) - return "".join(lines) + return "|".join(lines) s = u"foo\nbar\r\nbaz\rspam\u2028eggs" - self.assertEqual(readalllines(s, True), s) - self.assertEqual(readalllines(s, False), u"foobarbazspameggs") + sexpected = u"foo\n|bar\r\n|baz\r|spam\u2028|eggs" + sexpectednoends = u"foo|bar|baz|spam|eggs" + self.assertEqual(readalllines(s, True), sexpected) + self.assertEqual(readalllines(s, False), sexpectednoends) + self.assertEqual(readalllines(s, True, 10), sexpected) + self.assertEqual(readalllines(s, False, 10), sexpectednoends) # Test long lines (multiple calls to read() in readline()) vw = [] From python-checkins at python.org Tue Mar 7 00:04:08 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 00:04:08 +0100 (CET) Subject: [Python-checkins] r42874 - python/trunk/Misc/build.sh Message-ID: <20060306230408.0AC121E4007@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 00:04:04 2006 New Revision: 42874 Modified: python/trunk/Misc/build.sh Log: Ignore leaks from the socket test too. Sigh, this list is getting long. :-( Modified: python/trunk/Misc/build.sh ============================================================================== --- python/trunk/Misc/build.sh (original) +++ python/trunk/Misc/build.sh Tue Mar 7 00:04:04 2006 @@ -59,7 +59,7 @@ # test_generators really leaks. Since test_generators probably won't # be fixed real soon, disable warning about it for now. # The entire leak report will be mailed if any test not in this list leaks. -LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|quopri|threaded_import|threadedtempfile|threading|threading_local|urllib2)" +LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" # Change this flag to "yes" for old releases to just update/build the docs. BUILD_DISABLED="no" From python-checkins at python.org Tue Mar 7 00:07:34 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 00:07:34 +0100 (CET) Subject: [Python-checkins] r42875 - python/trunk/Python/modsupport.c Message-ID: <20060306230734.813401E4008@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 00:07:34 2006 New Revision: 42875 Modified: python/trunk/Python/modsupport.c Log: Try to cleanup the error handling a bit so there aren't false positives from static analysis. v was already checked for NULL above, so we don't need a second check. Modified: python/trunk/Python/modsupport.c ============================================================================== --- python/trunk/Python/modsupport.c (original) +++ python/trunk/Python/modsupport.c Tue Mar 7 00:07:34 2006 @@ -206,7 +206,8 @@ int itemfailed = 0; if (n < 0) return NULL; - if ((v = PyList_New(n)) == NULL) + v = PyList_New(n); + if (v == NULL) return NULL; /* Note that we can't bail immediately on error as this will leak refcounts on any 'N' arguments. */ @@ -219,18 +220,21 @@ } PyList_SetItem(v, i, w); } - if (v != NULL && **p_format != endchar) { + + if (itemfailed) { + /* do_mkvalue() should have already set an error */ + Py_DECREF(v); + return NULL; + } + if (**p_format != endchar) { Py_DECREF(v); - v = NULL; PyErr_SetString(PyExc_SystemError, "Unmatched paren in format"); + return NULL; } - else if (endchar) + + if (endchar) ++*p_format; - if (itemfailed) { - Py_DECREF(v); - v = NULL; - } return v; } From nnorwitz at gmail.com Tue Mar 7 00:14:56 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Mon, 6 Mar 2006 15:14:56 -0800 Subject: [Python-checkins] Python Regression Test Failures refleak (1) In-Reply-To: References: <20060306215406.GA16431@python.psfb.org> Message-ID: On 3/6/06, Brett Cannon wrote: > On 3/6/06, Neal Norwitz wrote: > > test_capi leaked [-143, 0, 0] references > > test_charmapcodec leaked [-54, 0, 0] references > > test_cmd_line leaked [-15, 15, 0] references > > test_compiler leaked [42, 408, 16] references > > test_generators leaked [255, 255, 255] references > > test_quopri leaked [17, 0, 0] references > > test_socket leaked [0, 0, 197] references > > test_threadedtempfile leaked [3, 2, 2] references > > test_threading_local leaked [42, 42, 42] references > > test_urllib2 leaked [80, -130, 70] references > > Should we be worrying about the ones that do not leak any references > consistently in an extreme manner? Such as test_capi or > test_cmd_line; they seem to have some import overhead or something > that spikes references but they stabilize and do not leak anything in > the end. And test_socket is just weird. =) If the number is inconsistent, it might mean there's no leak. The inconsistency is due to cacheing or some module somewhere else in the system holding references. Ideally all these cases would be handled (see the nested function cleanup() in regrtest.py). If you find places that references are being stored and should be cleaned up when running -R, please fix regrtest.py or send me a message and I'll try to fix it up. n n From python-checkins at python.org Tue Mar 7 00:31:31 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 00:31:31 +0100 (CET) Subject: [Python-checkins] r42876 - python/trunk/Python/pythonrun.c Message-ID: <20060306233131.7153F1E4007@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 00:31:27 2006 New Revision: 42876 Modified: python/trunk/Python/pythonrun.c Log: Fix warnings on x86 (32-bit). Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Tue Mar 7 00:31:27 2006 @@ -35,7 +35,8 @@ # if defined(MS_WIN64) # define PRINT_TOTAL_REFS() fprintf(stderr, "[%Id refs]\n", _Py_RefTotal); # else /* ! MS_WIN64 */ -# define PRINT_TOTAL_REFS() fprintf(stderr, "[%ld refs]\n", _Py_RefTotal); +# define PRINT_TOTAL_REFS() fprintf(stderr, "[%ld refs]\n", \ + Py_SAFE_DOWNCAST(_Py_RefTotal, Py_ssize_t, long)); # endif /* MS_WIN64 */ #endif From python-checkins at python.org Tue Mar 7 00:31:57 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 00:31:57 +0100 (CET) Subject: [Python-checkins] r42877 - python/trunk/Modules/gcmodule.c Message-ID: <20060306233157.A22C61E4007@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 00:31:56 2006 New Revision: 42877 Modified: python/trunk/Modules/gcmodule.c Log: Fix warnings on x86 (32-bit) and support Win64. Modified: python/trunk/Modules/gcmodule.c ============================================================================== --- python/trunk/Modules/gcmodule.c (original) +++ python/trunk/Modules/gcmodule.c Tue Mar 7 00:31:56 2006 @@ -742,7 +742,13 @@ generation); PySys_WriteStderr("gc: objects in each generation:"); for (i = 0; i < NUM_GENERATIONS; i++) { - PySys_WriteStderr(" %ld", gc_list_size(GEN_HEAD(i))); +#ifdef MS_WIN64 + PySys_WriteStderr(" %Id", gc_list_size(GEN_HEAD(i))); +#else + PySys_WriteStderr(" %ld", + Py_SAFE_DOWNCAST(gc_list_size(GEN_HEAD(i)), + Py_ssize_t, long)); +#endif } PySys_WriteStderr("\n"); } @@ -835,9 +841,16 @@ PySys_WriteStderr("gc: done.\n"); } else { +#ifdef MS_WIN64 PySys_WriteStderr( - "gc: done, %ld unreachable, %ld uncollectable.\n", + "gc: done, %Id unreachable, %Id uncollectable.\n", n+m, n); +#else + PySys_WriteStderr( + "gc: done, %ld unreachable, %ld uncollectable.\n", + Py_SAFE_DOWNCAST(n+m, Py_ssize_t, long), + Py_SAFE_DOWNCAST(n, Py_ssize_t, long)); +#endif } } From python-checkins at python.org Tue Mar 7 05:48:25 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 05:48:25 +0100 (CET) Subject: [Python-checkins] r42878 - in python/trunk: Lib/test/test_hotshot.py Modules/_hotshot.c Modules/_lsprof.c Modules/_sre.c Modules/audioop.c Modules/regexmodule.c Message-ID: <20060307044825.929271E4008@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 05:48:24 2006 New Revision: 42878 Modified: python/trunk/Lib/test/test_hotshot.py python/trunk/Modules/_hotshot.c python/trunk/Modules/_lsprof.c python/trunk/Modules/_sre.c python/trunk/Modules/audioop.c python/trunk/Modules/regexmodule.c Log: Thanks to Coverity, these were all reported by their Prevent tool. All of these (except _lsprof.c) should be backported. Particularly the hotshot change which validates sys.path. Can someone backport? Modified: python/trunk/Lib/test/test_hotshot.py ============================================================================== --- python/trunk/Lib/test/test_hotshot.py (original) +++ python/trunk/Lib/test/test_hotshot.py Tue Mar 7 05:48:24 2006 @@ -107,6 +107,19 @@ profiler.close() os.unlink(self.logfn) + def test_bad_sys_path(self): + import sys + orig_path = sys.path + coverage = hotshot._hotshot.coverage + try: + # verify we require a list for sys.path + sys.path = 'abc' + self.assertRaises(RuntimeError, coverage, test_support.TESTFN) + # verify sys.path exists + del sys.path + self.assertRaises(RuntimeError, coverage, test_support.TESTFN) + finally: + sys.path = orig_path def test_main(): test_support.run_unittest(HotShotTestCase) Modified: python/trunk/Modules/_hotshot.c ============================================================================== --- python/trunk/Modules/_hotshot.c (original) +++ python/trunk/Modules/_hotshot.c Tue Mar 7 05:48:24 2006 @@ -473,6 +473,8 @@ } 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) @@ -1455,6 +1457,10 @@ 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); Modified: python/trunk/Modules/_lsprof.c ============================================================================== --- python/trunk/Modules/_lsprof.c (original) +++ python/trunk/Modules/_lsprof.c Tue Mar 7 05:48:24 2006 @@ -850,6 +850,8 @@ { PyObject *module, *d; module = Py_InitModule3("_lsprof", moduleMethods, "Fast profiler"); + if (module == NULL) + return; d = PyModule_GetDict(module); if (PyType_Ready(&PyProfiler_Type) < 0) return; Modified: python/trunk/Modules/_sre.c ============================================================================== --- python/trunk/Modules/_sre.c (original) +++ python/trunk/Modules/_sre.c Tue Mar 7 05:48:24 2006 @@ -2983,7 +2983,7 @@ return result; failed: - Py_DECREF(keys); + Py_XDECREF(keys); Py_DECREF(result); return NULL; } Modified: python/trunk/Modules/audioop.c ============================================================================== --- python/trunk/Modules/audioop.c (original) +++ python/trunk/Modules/audioop.c Tue Mar 7 05:48:24 2006 @@ -1013,6 +1013,8 @@ while (d < 0) { if (len == 0) { samps = PyTuple_New(nchannels); + if (samps == NULL) + goto exit; for (chan = 0; chan < nchannels; chan++) PyTuple_SetItem(samps, chan, Py_BuildValue("(ii)", Modified: python/trunk/Modules/regexmodule.c ============================================================================== --- python/trunk/Modules/regexmodule.c (original) +++ python/trunk/Modules/regexmodule.c Tue Mar 7 05:48:24 2006 @@ -535,7 +535,7 @@ gdict = PyDict_New(); if (gdict == NULL || (npattern = symcomp(pattern, gdict)) == NULL) { - Py_DECREF(gdict); + Py_XDECREF(gdict); Py_DECREF(pattern); return NULL; } From python-checkins at python.org Tue Mar 7 06:01:02 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 7 Mar 2006 06:01:02 +0100 (CET) Subject: [Python-checkins] r42879 - python/trunk/Misc/NEWS Message-ID: <20060307050102.3DEF61E4008@bag.python.org> Author: neal.norwitz Date: Tue Mar 7 06:01:00 2006 New Revision: 42879 Modified: python/trunk/Misc/NEWS Log: Add a note about the bug fixes Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Mar 7 06:01:00 2006 @@ -12,6 +12,8 @@ Core and builtins ----------------- +- Fixed various bugs reported by Coverity's Prevent tool. + - PEP 352, patch #1104669: Make exceptions new-style objects. Introduced the new exception base class, BaseException, which has a new message attribute. KeyboardInterrupt and SystemExit to directly inherit from BaseException now. From python-checkins at python.org Tue Mar 7 10:46:05 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 7 Mar 2006 10:46:05 +0100 (CET) Subject: [Python-checkins] r42880 - in python/trunk: Doc/lib/libgc.tex Lib/test/test_gc.py Misc/NEWS Modules/gcmodule.c Message-ID: <20060307094605.78BFD1E4008@bag.python.org> Author: barry.warsaw Date: Tue Mar 7 10:46:03 2006 New Revision: 42880 Modified: python/trunk/Doc/lib/libgc.tex python/trunk/Lib/test/test_gc.py python/trunk/Misc/NEWS python/trunk/Modules/gcmodule.c Log: SF patch #1443865; gc.get_count() added and optional argument 'generation' added to gc.collect(). Updated docs, unit test, and NEWS entry. (Also, fixed a typo in NEWS.) Modified: python/trunk/Doc/lib/libgc.tex ============================================================================== --- python/trunk/Doc/lib/libgc.tex (original) +++ python/trunk/Doc/lib/libgc.tex Tue Mar 7 10:46:03 2006 @@ -32,9 +32,13 @@ Returns true if automatic collection is enabled. \end{funcdesc} -\begin{funcdesc}{collect}{} -Run a full collection. All generations are examined and the -number of unreachable objects found is returned. +\begin{funcdesc}{collect}{\optional{generation}} +With no arguments, run a full collection. The optional argument +\var{generation} may be an integer specifying which generation to collect +(from 0 to 2). A ValueError is raised if the generation number is invalid. +The number of unreachable objects found is returned. + +\versionchanged[The optional \var{generation} argument was added]{2.5} \end{funcdesc} \begin{funcdesc}{set_debug}{flags} @@ -76,6 +80,12 @@ \code{1} before collecting generation \code{2}. \end{funcdesc} +\begin{funcdesc}{get_count}{} +Return the current collection counts as a tuple of +\code{(\var{count0}, \var{count1}, \var{count2})}. +\versionadded{2.5} +\end{funcdesc} + \begin{funcdesc}{get_threshold}{} Return the current collection thresholds as a tuple of \code{(\var{threshold0}, \var{threshold1}, \var{threshold2})}. Modified: python/trunk/Lib/test/test_gc.py ============================================================================== --- python/trunk/Lib/test/test_gc.py (original) +++ python/trunk/Lib/test/test_gc.py Tue Mar 7 10:46:03 2006 @@ -219,6 +219,22 @@ gc.disable() gc.set_threshold(*thresholds) +def test_get_count(): + gc.collect() + expect(gc.get_count(), (0, 0, 0), "get_count()") + a = dict() + expect(gc.get_count(), (1, 0, 0), "get_count()") + +def test_collect_generations(): + gc.collect() + a = dict() + gc.collect(0) + expect(gc.get_count(), (0, 1, 0), "collect(0)") + gc.collect(1) + expect(gc.get_count(), (0, 0, 1), "collect(1)") + gc.collect(2) + expect(gc.get_count(), (0, 0, 0), "collect(1)") + class Ouch: n = 0 def __del__(self): @@ -571,6 +587,8 @@ run_test("finalizers (new class)", test_finalizer_newclass) run_test("__del__", test_del) run_test("__del__ (new class)", test_del_newclass) + run_test("get_count()", test_get_count) + run_test("collect(n)", test_collect_generations) run_test("saveall", test_saveall) run_test("trashcan", test_trashcan) run_test("boom", test_boom) Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Mar 7 10:46:03 2006 @@ -78,7 +78,7 @@ This was not portable. float('0x3') now raises a ValueError. - Patch #1382163: Expose Subversion revision number to Python. New C API - function Py_GetBuildNumber(). New attribute sys.build_number. Build number + function Py_GetBuildNumber(). New attribute sys.subversion. Build number is now displayed in interactive prompt banner. - Implementation of PEP 341 - Unification of try/except and try/finally. @@ -427,6 +427,9 @@ Library ------- +- The function get_count() has been added to the gc module, and gc.collect() + grew an optional 'generation' argument. + - A library msilib to generate Windows Installer files, and a distutils command bdist_msi have been added. Modified: python/trunk/Modules/gcmodule.c ============================================================================== --- python/trunk/Modules/gcmodule.c (original) +++ python/trunk/Modules/gcmodule.c Tue Mar 7 10:46:03 2006 @@ -925,20 +925,33 @@ } PyDoc_STRVAR(gc_collect__doc__, -"collect() -> n\n" +"collect([generation]) -> n\n" "\n" -"Run a full collection. The number of unreachable objects is returned.\n"); +"With no arguments, run a full collection. The optional argument\n" +"may be an integer specifying which generation to collect. A ValueError\n" +"is raised if the generation number is invalid.\n\n" +"The number of unreachable objects is returned.\n"); static PyObject * -gc_collect(PyObject *self, PyObject *noargs) +gc_collect(PyObject *self, PyObject *args, PyObject *kws) { + static char *keywords[] = {"generation", NULL}; + int genarg = NUM_GENERATIONS - 1; Py_ssize_t n; + if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg)) + return NULL; + + else if (genarg < 0 || genarg >= NUM_GENERATIONS) { + PyErr_SetString(PyExc_ValueError, "invalid generation"); + return NULL; + } + if (collecting) n = 0; /* already collecting, don't do anything */ else { collecting = 1; - n = collect(NUM_GENERATIONS - 1); + n = collect(genarg); collecting = 0; } @@ -1020,6 +1033,20 @@ generations[2].threshold); } +PyDoc_STRVAR(gc_get_count__doc__, +"get_count() -> (count0, count1, count2)\n" +"\n" +"Return the current collection counts\n"); + +static PyObject * +gc_get_count(PyObject *self, PyObject *noargs) +{ + return Py_BuildValue("(iii)", + generations[0].count, + generations[1].count, + generations[2].count); +} + static int referrersvisit(PyObject* obj, PyObject *objs) { @@ -1150,9 +1177,11 @@ {"isenabled", gc_isenabled, METH_NOARGS, gc_isenabled__doc__}, {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__}, {"get_debug", gc_get_debug, METH_NOARGS, gc_get_debug__doc__}, + {"get_count", gc_get_count, METH_NOARGS, gc_get_count__doc__}, {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__}, {"get_threshold", gc_get_thresh, METH_NOARGS, gc_get_thresh__doc__}, - {"collect", gc_collect, METH_NOARGS, gc_collect__doc__}, + {"collect", (PyCFunction)gc_collect, + METH_VARARGS | METH_KEYWORDS, gc_collect__doc__}, {"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__}, {"get_referrers", gc_get_referrers, METH_VARARGS, gc_get_referrers__doc__}, From neal at metaslash.com Tue Mar 7 10:56:12 2006 From: neal at metaslash.com (Neal Norwitz) Date: Tue, 7 Mar 2006 04:56:12 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060307095612.GA10545@python.psfb.org> test_cmd_line leaked [15, -15, 15] references test_compiler leaked [261, 78, 90] references test_generators leaked [255, 255, 255] references test_hotshot leaked [6, 6, 6] references test_socket leaked [0, 197, -197] references test_threadedtempfile leaked [1, 3, 0] references test_threading_local leaked [35, 27, 23] references test_urllib2 leaked [80, -130, 70] references From python-checkins at python.org Tue Mar 7 12:58:50 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 12:58:50 +0100 (CET) Subject: [Python-checkins] r42881 - python/trunk/Modules/regexmodule.c Message-ID: <20060307115850.B228A1E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 12:58:50 2006 New Revision: 42881 Modified: python/trunk/Modules/regexmodule.c Log: Don't DECREF a borrowed reference. Modified: python/trunk/Modules/regexmodule.c ============================================================================== --- python/trunk/Modules/regexmodule.c (original) +++ python/trunk/Modules/regexmodule.c Tue Mar 7 12:58:50 2006 @@ -536,7 +536,6 @@ gdict = PyDict_New(); if (gdict == NULL || (npattern = symcomp(pattern, gdict)) == NULL) { Py_XDECREF(gdict); - Py_DECREF(pattern); return NULL; } retval = newregexobject(npattern, tran, pattern, gdict); From python-checkins at python.org Tue Mar 7 13:08:43 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 13:08:43 +0100 (CET) Subject: [Python-checkins] r42882 - in python/branches/release24-maint: Lib/test/test_hotshot.py Modules/_hotshot.c Modules/_sre.c Modules/audioop.c Modules/regexmodule.c Message-ID: <20060307120843.65F291E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 13:08:42 2006 New Revision: 42882 Modified: python/branches/release24-maint/Lib/test/test_hotshot.py python/branches/release24-maint/Modules/_hotshot.c python/branches/release24-maint/Modules/_sre.c python/branches/release24-maint/Modules/audioop.c python/branches/release24-maint/Modules/regexmodule.c Log: Backport trunk's r42878 (neal.norwitz): Thanks to Coverity, these were all reported by their Prevent tool. and r42881 (thomas.wouters): Don't DECREF a borrowed reference. Modified: python/branches/release24-maint/Lib/test/test_hotshot.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_hotshot.py (original) +++ python/branches/release24-maint/Lib/test/test_hotshot.py Tue Mar 7 13:08:42 2006 @@ -107,6 +107,19 @@ profiler.close() os.unlink(self.logfn) + def test_bad_sys_path(self): + import sys + orig_path = sys.path + coverage = hotshot._hotshot.coverage + try: + # verify we require a list for sys.path + sys.path = 'abc' + self.assertRaises(RuntimeError, coverage, test_support.TESTFN) + # verify sys.path exists + del sys.path + self.assertRaises(RuntimeError, coverage, test_support.TESTFN) + finally: + sys.path = orig_path def test_main(): test_support.run_unittest(HotShotTestCase) Modified: python/branches/release24-maint/Modules/_hotshot.c ============================================================================== --- python/branches/release24-maint/Modules/_hotshot.c (original) +++ python/branches/release24-maint/Modules/_hotshot.c Tue Mar 7 13:08:42 2006 @@ -473,6 +473,8 @@ } 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) @@ -1486,6 +1488,10 @@ 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); Modified: python/branches/release24-maint/Modules/_sre.c ============================================================================== --- python/branches/release24-maint/Modules/_sre.c (original) +++ python/branches/release24-maint/Modules/_sre.c Tue Mar 7 13:08:42 2006 @@ -2980,7 +2980,7 @@ return result; failed: - Py_DECREF(keys); + Py_XDECREF(keys); Py_DECREF(result); return NULL; } Modified: python/branches/release24-maint/Modules/audioop.c ============================================================================== --- python/branches/release24-maint/Modules/audioop.c (original) +++ python/branches/release24-maint/Modules/audioop.c Tue Mar 7 13:08:42 2006 @@ -1013,6 +1013,8 @@ while (d < 0) { if (len == 0) { samps = PyTuple_New(nchannels); + if (samps == NULL) + goto exit; for (chan = 0; chan < nchannels; chan++) PyTuple_SetItem(samps, chan, Py_BuildValue("(ii)", Modified: python/branches/release24-maint/Modules/regexmodule.c ============================================================================== --- python/branches/release24-maint/Modules/regexmodule.c (original) +++ python/branches/release24-maint/Modules/regexmodule.c Tue Mar 7 13:08:42 2006 @@ -535,8 +535,7 @@ gdict = PyDict_New(); if (gdict == NULL || (npattern = symcomp(pattern, gdict)) == NULL) { - Py_DECREF(gdict); - Py_DECREF(pattern); + Py_XDECREF(gdict); return NULL; } retval = newregexobject(npattern, tran, pattern, gdict); From python-checkins at python.org Tue Mar 7 13:08:53 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 7 Mar 2006 13:08:53 +0100 (CET) Subject: [Python-checkins] r42883 - in python/trunk: Modules/posixmodule.c Objects/enumobject.c Objects/genobject.c Objects/object.c Objects/stringobject.c Objects/typeobject.c Python/bltinmodule.c Python/exceptions.c Python/import.c Python/marshal.c Python/sysmodule.c Message-ID: <20060307120853.A6FD61E4002@bag.python.org> Author: martin.v.loewis Date: Tue Mar 7 13:08:51 2006 New Revision: 42883 Modified: python/trunk/Modules/posixmodule.c python/trunk/Objects/enumobject.c python/trunk/Objects/genobject.c python/trunk/Objects/object.c python/trunk/Objects/stringobject.c python/trunk/Objects/typeobject.c python/trunk/Python/bltinmodule.c python/trunk/Python/exceptions.c python/trunk/Python/import.c python/trunk/Python/marshal.c python/trunk/Python/sysmodule.c Log: Change int to Py_ssize_t in several places. Add (int) casts to silence compiler warnings. Raise Python exceptions for overflows. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Tue Mar 7 13:08:51 2006 @@ -2317,9 +2317,9 @@ #if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) static void -free_string_array(char **array, int count) +free_string_array(char **array, Py_ssize_t count) { - int i; + Py_ssize_t i; for (i = 0; i < count; i++) PyMem_Free(array[i]); PyMem_DEL(array); @@ -2341,7 +2341,7 @@ char *path; PyObject *argv; char **argvlist; - int i, argc; + Py_ssize_t i, argc; PyObject *(*getitem)(PyObject *, Py_ssize_t); /* execv has two arguments: (path, argv), where @@ -2410,7 +2410,7 @@ char **argvlist; char **envlist; PyObject *key, *val, *keys=NULL, *vals=NULL; - int i, pos, argc, envc; + Py_ssize_t i, pos, argc, envc; PyObject *(*getitem)(PyObject *, Py_ssize_t); int lastarg = 0; Modified: python/trunk/Objects/enumobject.c ============================================================================== --- python/trunk/Objects/enumobject.c (original) +++ python/trunk/Objects/enumobject.c Tue Mar 7 13:08:51 2006 @@ -216,7 +216,7 @@ reversed_next(reversedobject *ro) { PyObject *item; - long index = ro->index; + Py_ssize_t index = ro->index; if (index >= 0) { item = PySequence_GetItem(ro->seq, index); Modified: python/trunk/Objects/genobject.c ============================================================================== --- python/trunk/Objects/genobject.c (original) +++ python/trunk/Objects/genobject.c Tue Mar 7 13:08:51 2006 @@ -177,7 +177,7 @@ * never happened. */ { - int refcnt = self->ob_refcnt; + Py_ssize_t refcnt = self->ob_refcnt; _Py_NewReference(self); self->ob_refcnt = refcnt; } Modified: python/trunk/Objects/object.c ============================================================================== --- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Tue Mar 7 13:08:51 2006 @@ -1172,7 +1172,7 @@ PyObject ** _PyObject_GetDictPtr(PyObject *obj) { - long dictoffset; + Py_ssize_t dictoffset; PyTypeObject *tp = obj->ob_type; if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS)) @@ -1212,7 +1212,7 @@ PyObject *descr = NULL; PyObject *res = NULL; descrgetfunc f; - long dictoffset; + Py_ssize_t dictoffset; PyObject **dictptr; if (!PyString_Check(name)){ Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Tue Mar 7 13:08:51 2006 @@ -3679,6 +3679,7 @@ Py_ssize_t i; int sign; /* 1 if '-', else 0 */ int len; /* number of characters */ + Py_ssize_t llen; int numdigits; /* len == numnondigits + numdigits */ int numnondigits = 0; @@ -3707,7 +3708,12 @@ return NULL; } buf = PyString_AsString(result); - len = PyString_Size(result); + llen = PyString_Size(result); + if (llen > INT_MAX) { + PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong"); + return NULL; + } + len = (int)llen; if (buf[len-1] == 'L') { --len; buf[len] = '\0'; @@ -3941,12 +3947,12 @@ PyObject *temp = NULL; char *pbuf; int sign; - int len; + Py_ssize_t len; char formatbuf[FORMATBUFLEN]; /* For format{float,int,char}() */ #ifdef Py_USING_UNICODE char *fmt_start = fmt; - int argidx_start = argidx; + Py_ssize_t argidx_start = argidx; #endif fmt++; @@ -4139,8 +4145,10 @@ if (c == 'i') c = 'd'; if (PyLong_Check(v)) { + int ilen; temp = _PyString_FormatLong(v, flags, - prec, c, &pbuf, &len); + prec, c, &pbuf, &ilen); + len = ilen; if (!temp) goto error; sign = 1; Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Tue Mar 7 13:08:51 2006 @@ -4244,7 +4244,8 @@ } } else if (! PyErr_Occurred()) { - result = _PySequence_IterSearch(self, value, + /* Possible results: -1 and 1 */ + result = (int)_PySequence_IterSearch(self, value, PY_ITERSEARCH_CONTAINS); } return result; @@ -4880,7 +4881,7 @@ * never happened. */ { - int refcnt = self->ob_refcnt; + Py_ssize_t refcnt = self->ob_refcnt; _Py_NewReference(self); self->ob_refcnt = refcnt; } Modified: python/trunk/Python/bltinmodule.c ============================================================================== --- python/trunk/Python/bltinmodule.c (original) +++ python/trunk/Python/bltinmodule.c Tue Mar 7 13:08:51 2006 @@ -2514,7 +2514,7 @@ filterunicode(PyObject *func, PyObject *strobj) { PyObject *result; - register int i, j; + register Py_ssize_t i, j; Py_ssize_t len = PyUnicode_GetSize(strobj); Py_ssize_t outlen = len; Modified: python/trunk/Python/exceptions.c ============================================================================== --- python/trunk/Python/exceptions.c (original) +++ python/trunk/Python/exceptions.c Tue Mar 7 13:08:51 2006 @@ -764,7 +764,7 @@ SyntaxError__init__(PyObject *self, PyObject *args) { PyObject *rtnval = NULL; - int lenargs; + Py_ssize_t lenargs; if (!(self = get_self(args))) return NULL; @@ -889,7 +889,7 @@ PyErr_Clear(); if (have_filename || have_lineno) { - int bufsize = PyString_GET_SIZE(str) + 64; + Py_ssize_t bufsize = PyString_GET_SIZE(str) + 64; if (have_filename) bufsize += PyString_GET_SIZE(filename); Modified: python/trunk/Python/import.c ============================================================================== --- python/trunk/Python/import.c (original) +++ python/trunk/Python/import.c Tue Mar 7 13:08:51 2006 @@ -853,7 +853,7 @@ /* Now write the true mtime */ fseek(fp, 4L, 0); assert(mtime < LONG_MAX); - PyMarshal_WriteLongToFile(mtime, fp, Py_MARSHAL_VERSION); + PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); fflush(fp); fclose(fp); if (Py_VerboseFlag) @@ -1016,7 +1016,7 @@ PyObject *p) { PyObject *importer; - int j, nhooks; + Py_ssize_t j, nhooks; /* These conditions are the caller's responsibility: */ assert(PyList_Check(path_hooks)); @@ -1075,7 +1075,7 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf, size_t buflen, FILE **p_fp, PyObject **p_loader) { - int i, npath; + Py_ssize_t i, npath; size_t len, namelen; struct filedescr *fdp = NULL; char *filemode; @@ -2028,7 +2028,7 @@ modpath = PyDict_GetItem(globals, pathstr); if (modpath != NULL) { - int len = PyString_GET_SIZE(modname); + Py_ssize_t len = PyString_GET_SIZE(modname); if (len > MAXPATHLEN) { PyErr_SetString(PyExc_ValueError, "Module name too long"); Modified: python/trunk/Python/marshal.c ============================================================================== --- python/trunk/Python/marshal.c (original) +++ python/trunk/Python/marshal.c Tue Mar 7 13:08:51 2006 @@ -186,7 +186,7 @@ n = strlen(buf); w_byte(TYPE_FLOAT, p); w_byte((int)n, p); - w_string(buf, n, p); + w_string(buf, (int)n, p); } } #ifndef WITHOUT_COMPLEX @@ -215,16 +215,16 @@ PyComplex_RealAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + n = strlen(buf); + w_byte((int)n, p); + w_string(buf, (int)n, p); temp = (PyFloatObject*)PyFloat_FromDouble( PyComplex_ImagAsDouble(v)); PyFloat_AsReprString(buf, temp); Py_DECREF(temp); - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + n = strlen(buf); + w_byte((int)n, p); + w_string(buf, (int)n, p); } } #endif @@ -248,8 +248,14 @@ w_byte(TYPE_STRING, p); } n = PyString_GET_SIZE(v); + if (n > INT_MAX) { + /* huge strings are not supported */ + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(PyString_AS_STRING(v), n, p); + w_string(PyString_AS_STRING(v), (int)n, p); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(v)) { @@ -262,8 +268,13 @@ } w_byte(TYPE_UNICODE, p); n = PyString_GET_SIZE(utf8); + if (n > INT_MAX) { + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(PyString_AS_STRING(utf8), n, p); + w_string(PyString_AS_STRING(utf8), (int)n, p); Py_DECREF(utf8); } #endif @@ -350,8 +361,13 @@ PyBufferProcs *pb = v->ob_type->tp_as_buffer; w_byte(TYPE_STRING, p); n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s); + if (n > INT_MAX) { + p->depth--; + p->error = 1; + return; + } w_long((long)n, p); - w_string(s, n, p); + w_string(s, (int)n, p); } else { w_byte(TYPE_UNKNOWN, p); Modified: python/trunk/Python/sysmodule.c ============================================================================== --- python/trunk/Python/sysmodule.c (original) +++ python/trunk/Python/sysmodule.c Tue Mar 7 13:08:51 2006 @@ -597,7 +597,7 @@ static PyObject * sys_getrefcount(PyObject *self, PyObject *arg) { - return PyInt_FromLong(arg->ob_refcnt); + return PyInt_FromSsize_t(arg->ob_refcnt); } #ifdef Py_REF_DEBUG From python-checkins at python.org Tue Mar 7 13:48:04 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 7 Mar 2006 13:48:04 +0100 (CET) Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c Message-ID: <20060307124804.763511E4002@bag.python.org> Author: georg.brandl Date: Tue Mar 7 13:48:03 2006 New Revision: 42884 Modified: python/trunk/Modules/posixmodule.c Log: Bug #1432525: os.listdir now releases the GIL while calling readdir(). Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Tue Mar 7 13:48:03 2006 @@ -1640,6 +1640,7 @@ PyObject *d, *v; HANDLE hFindFile; + BOOL result; WIN32_FIND_DATA FileData; /* MAX_PATH characters could mean a bigger encoded string */ char namebuf[MAX_PATH*2+5]; @@ -1692,7 +1693,10 @@ break; } Py_DECREF(v); - } while (FindNextFileW(hFindFile, &wFileData) == TRUE); + Py_BEGIN_ALLOW_THREADS + result = FindNextFileW(hFindFile, &wFileData); + Py_END_ALLOW_THREADS + } while (result == TRUE); if (FindClose(hFindFile) == FALSE) { Py_DECREF(d); @@ -1746,7 +1750,10 @@ break; } Py_DECREF(v); - } while (FindNextFile(hFindFile, &FileData) == TRUE); + Py_BEGIN_ALLOW_THREADS + result = FindNextFile(hFindFile, &FileData); + Py_END_ALLOW_THREADS + } while (result == TRUE); if (FindClose(hFindFile) == FALSE) { Py_DECREF(d); @@ -1848,7 +1855,12 @@ PyMem_Free(name); return NULL; } - while ((ep = readdir(dirp)) != NULL) { + for (;;) { + Py_BEGIN_ALLOW_THREADS + ep = readdir(dirp); + Py_END_ALLOW_THREADS + if (ep == NULL) + break; if (ep->d_name[0] == '.' && (NAMLEN(ep) == 1 || (ep->d_name[1] == '.' && NAMLEN(ep) == 2))) From python-checkins at python.org Tue Mar 7 14:38:14 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 14:38:14 +0100 (CET) Subject: [Python-checkins] r42885 - python/trunk/Modules/_curses_panel.c Message-ID: <20060307133814.9A4231E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 14:38:14 2006 New Revision: 42885 Modified: python/trunk/Modules/_curses_panel.c Log: Coverity-found bug: don't use temp->next *before* checking it for NULL. Also return rather than use it again. Modified: python/trunk/Modules/_curses_panel.c ============================================================================== --- python/trunk/Modules/_curses_panel.c (original) +++ python/trunk/Modules/_curses_panel.c Tue Mar 7 14:38:14 2006 @@ -111,10 +111,12 @@ free(temp); return; } - while (temp->next->po != po) { - if (temp->next == NULL) + while (temp->next == NULL || temp->next->po != po) { + if (temp->next == NULL) { PyErr_SetString(PyExc_RuntimeError, "remove_lop: can't find Panel Object"); + return; + } temp = temp->next; } n = temp->next->next; From python-checkins at python.org Tue Mar 7 14:39:26 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 14:39:26 +0100 (CET) Subject: [Python-checkins] r42886 - python/branches/release24-maint/Modules/_curses_panel.c Message-ID: <20060307133926.BB5E51E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 14:39:26 2006 New Revision: 42886 Modified: python/branches/release24-maint/Modules/_curses_panel.c Log: Backport trunk's r42885 (thomas.wouters): Coverity-found bug: don't use temp->next *before* checking it for NULL. Also return rather than use it again. Modified: python/branches/release24-maint/Modules/_curses_panel.c ============================================================================== --- python/branches/release24-maint/Modules/_curses_panel.c (original) +++ python/branches/release24-maint/Modules/_curses_panel.c Tue Mar 7 14:39:26 2006 @@ -111,10 +111,12 @@ free(temp); return; } - while (temp->next->po != po) { - if (temp->next == NULL) + while (temp->next == NULL || temp->next->po != po) { + if (temp->next == NULL) { PyErr_SetString(PyExc_RuntimeError, "remove_lop: can't find Panel Object"); + return; + } temp = temp->next; } n = temp->next->next; From python-checkins at python.org Tue Mar 7 14:47:23 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 7 Mar 2006 14:47:23 +0100 (CET) Subject: [Python-checkins] r42887 - python/trunk/Doc/lib/libcsv.tex Message-ID: <20060307134723.4FB141E4002@bag.python.org> Author: georg.brandl Date: Tue Mar 7 14:47:22 2006 New Revision: 42887 Modified: python/trunk/Doc/lib/libcsv.tex Log: Bug #1440831: fix csv UnicodeWriter example Modified: python/trunk/Doc/lib/libcsv.tex ============================================================================== --- python/trunk/Doc/lib/libcsv.tex (original) +++ python/trunk/Doc/lib/libcsv.tex Tue Mar 7 14:47:22 2006 @@ -428,7 +428,7 @@ The \module{csv} module doesn't directly support reading and writing Unicode, but it is 8-bit clean save for some problems with \ASCII{} NUL characters, so you can write classes that handle the encoding and decoding -for you as long as you avoid encodings like utf-16 that use NULs. +for you as long as you avoid encodings like utf-16 that use NULs: \begin{verbatim} import csv @@ -451,7 +451,7 @@ self.encoding = encoding def writerow(self, row): - self.writer.writerow([s.encode("utf-8") for s in row]) + self.writer.writerow([s.encode(self.encoding) for s in row]) def writerows(self, rows): for row in rows: From python-checkins at python.org Tue Mar 7 15:04:31 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 15:04:31 +0100 (CET) Subject: [Python-checkins] r42888 - python/trunk/Modules/_tkinter.c Message-ID: <20060307140431.D06131E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 15:04:31 2006 New Revision: 42888 Modified: python/trunk/Modules/_tkinter.c Log: Coverity found refleak: need to free 'v' after calling Tkinter_Error(). Will backport to release24. Modified: python/trunk/Modules/_tkinter.c ============================================================================== --- python/trunk/Modules/_tkinter.c (original) +++ python/trunk/Modules/_tkinter.c Tue Mar 7 15:04:31 2006 @@ -686,8 +686,11 @@ ckfree(args); } - if (Tcl_AppInit(v->interp) != TCL_OK) - return (TkappObject *)Tkinter_Error((PyObject *)v); + if (Tcl_AppInit(v->interp) != TCL_OK) { + PyObject *result = Tkinter_Error((PyObject *)v); + Py_DECREF((PyObject *)v); + return (TkappObject *)result; + } EnableEventHook(); From python-checkins at python.org Tue Mar 7 15:06:31 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 15:06:31 +0100 (CET) Subject: [Python-checkins] r42889 - python/branches/release24-maint/Modules/_tkinter.c Message-ID: <20060307140631.C8AB21E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 15:06:31 2006 New Revision: 42889 Modified: python/branches/release24-maint/Modules/_tkinter.c Log: Backport trunk's r42888 (thomas.wouters): Coverity found refleak: need to free 'v' after calling Tkinter_Error(). Modified: python/branches/release24-maint/Modules/_tkinter.c ============================================================================== --- python/branches/release24-maint/Modules/_tkinter.c (original) +++ python/branches/release24-maint/Modules/_tkinter.c Tue Mar 7 15:06:31 2006 @@ -676,8 +676,11 @@ ckfree(args); } - if (Tcl_AppInit(v->interp) != TCL_OK) - return (TkappObject *)Tkinter_Error((PyObject *)v); + if (Tcl_AppInit(v->interp) != TCL_OK) { + PyObject *result = Tkinter_Error((PyObject *)v); + Py_DECREF((PyObject *)v); + return (TkappObject *)result; + } EnableEventHook(); From python-checkins at python.org Tue Mar 7 15:13:18 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 15:13:18 +0100 (CET) Subject: [Python-checkins] r42890 - python/trunk/Modules/_bsddb.c Message-ID: <20060307141318.7C8ED1E4013@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 15:13:17 2006 New Revision: 42890 Modified: python/trunk/Modules/_bsddb.c Log: Coverity found bug: test result of PyTuple_New() against NULL before use. Will backport. Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Tue Mar 7 15:13:17 2006 @@ -1084,12 +1084,12 @@ } data = PyString_FromStringAndSize(priData->data, priData->size); args = PyTuple_New(2); - PyTuple_SET_ITEM(args, 0, key); /* steals reference */ - PyTuple_SET_ITEM(args, 1, data); /* steals reference */ - - result = PyEval_CallObject(callback, args); - - if (result == NULL) { + if (args != NULL) { + PyTuple_SET_ITEM(args, 0, key); /* steals reference */ + PyTuple_SET_ITEM(args, 1, data); /* steals reference */ + result = PyEval_CallObject(callback, args); + } + if (args == NULL || result == NULL) { PyErr_Print(); } else if (result == Py_None) { From python-checkins at python.org Tue Mar 7 15:14:51 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 15:14:51 +0100 (CET) Subject: [Python-checkins] r42891 - python/trunk/Modules/_bsddb.c Message-ID: <20060307141451.BE0161E4002@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 15:14:51 2006 New Revision: 42891 Modified: python/trunk/Modules/_bsddb.c Log: Fix gcc 4.0.x warning about use of uninitialized value. Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Tue Mar 7 15:14:51 2006 @@ -1070,7 +1070,7 @@ PyObject* key; PyObject* data; PyObject* args; - PyObject* result; + PyObject* result = NULL; if (callback != NULL) { From python-checkins at python.org Tue Mar 7 15:16:03 2006 From: python-checkins at python.org (thomas.wouters) Date: Tue, 7 Mar 2006 15:16:03 +0100 (CET) Subject: [Python-checkins] r42892 - python/branches/release24-maint/Modules/_bsddb.c Message-ID: <20060307141603.8877E1E4008@bag.python.org> Author: thomas.wouters Date: Tue Mar 7 15:16:02 2006 New Revision: 42892 Modified: python/branches/release24-maint/Modules/_bsddb.c Log: Backport trunk's r42890 (thomas.wouters): Coverity found bug: test result of PyTuple_New() against NULL before use. and r42891 (thomas.wouters): Fix gcc 4.0.x warning about use of uninitialized value. Modified: python/branches/release24-maint/Modules/_bsddb.c ============================================================================== --- python/branches/release24-maint/Modules/_bsddb.c (original) +++ python/branches/release24-maint/Modules/_bsddb.c Tue Mar 7 15:16:02 2006 @@ -1063,7 +1063,7 @@ PyObject* key; PyObject* data; PyObject* args; - PyObject* result; + PyObject* result = NULL; if (callback != NULL) { @@ -1077,12 +1077,12 @@ } data = PyString_FromStringAndSize(priData->data, priData->size); args = PyTuple_New(2); - PyTuple_SET_ITEM(args, 0, key); /* steals reference */ - PyTuple_SET_ITEM(args, 1, data); /* steals reference */ - - result = PyEval_CallObject(callback, args); - - if (result == NULL) { + if (args != NULL) { + PyTuple_SET_ITEM(args, 0, key); /* steals reference */ + PyTuple_SET_ITEM(args, 1, data); /* steals reference */ + result = PyEval_CallObject(callback, args); + } + if (args == NULL || result == NULL) { PyErr_Print(); } else if (result == Py_None) { From python-checkins at python.org Tue Mar 7 15:57:49 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 7 Mar 2006 15:57:49 +0100 (CET) Subject: [Python-checkins] r42893 - python/trunk/Modules/_bsddb.c Message-ID: <20060307145749.89E921E4002@bag.python.org> Author: georg.brandl Date: Tue Mar 7 15:57:48 2006 New Revision: 42893 Modified: python/trunk/Modules/_bsddb.c Log: Add additional missing checks for return vals of PyTuple_New(). Normalize coding style. Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Tue Mar 7 15:57:48 2006 @@ -1986,14 +1986,14 @@ #if (DBVER >= 33) static int -_default_cmp (const DBT *leftKey, - const DBT *rightKey) +_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); + res = memcmp(leftKey->data, rightKey->data, + lsize < rsize ? lsize : rsize); if (res == 0) { if (lsize < rsize) { @@ -2007,58 +2007,56 @@ } static int -_db_compareCallback (DB* db, - const DBT *leftKey, - const DBT *rightKey) +_db_compareCallback(DB* db, + const DBT *leftKey, + const DBT *rightKey) { int res = 0; PyObject *args; PyObject *result; PyObject *leftObject; PyObject *rightObject; - DBObject *self = (DBObject *) db->app_private; + 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.")); + 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); + PyErr_Print(); + res = _default_cmp(leftKey, rightKey); MYDB_END_BLOCK_THREADS; - } - else { + } else { MYDB_BEGIN_BLOCK_THREADS; - leftObject = PyString_FromStringAndSize (leftKey->data, leftKey->size); - rightObject = PyString_FromStringAndSize (rightKey->data, rightKey->size); + leftObject = PyString_FromStringAndSize(leftKey->data, leftKey->size); + rightObject = PyString_FromStringAndSize(rightKey->data, rightKey->size); - args = PyTuple_New (2); - Py_INCREF (self); - PyTuple_SET_ITEM (args, 0, leftObject); /* steals reference */ - PyTuple_SET_ITEM (args, 1, rightObject); /* steals reference */ - - result = PyEval_CallObject (self->btCompareCallback, args); - if (result == 0) { - /* we're in a callback within the DB code, we can't raise */ - PyErr_Print (); - res = _default_cmp (leftKey, rightKey); - } - else if (PyInt_Check (result)) { - res = PyInt_AsLong (result); + args = PyTuple_New(2); + if (args != NULL) { + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, leftObject); /* steals reference */ + PyTuple_SET_ITEM(args, 1, rightObject); /* steals reference */ + result = PyEval_CallObject(self->btCompareCallback, args); } - else { - PyErr_SetString (PyExc_TypeError, - "DB_bt_compare callback MUST return an int."); + 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 (PyInt_Check(result)) { + res = PyInt_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); + PyErr_Print(); + res = _default_cmp(leftKey, rightKey); } - Py_DECREF (args); - Py_XDECREF (result); + Py_DECREF(args); + Py_XDECREF(result); MYDB_END_BLOCK_THREADS; } @@ -2066,19 +2064,19 @@ } static PyObject* -DB_set_bt_compare (DBObject* self, PyObject* args) +DB_set_bt_compare(DBObject* self, PyObject* args) { int err; PyObject *comparator; PyObject *tuple, *emptyStr, *result; - if (!PyArg_ParseTuple(args,"O:set_bt_compare", &comparator )) + if (!PyArg_ParseTuple(args, "O:set_bt_compare", &comparator)) return NULL; - CHECK_DB_NOT_CLOSED (self); + CHECK_DB_NOT_CLOSED(self); - if (! PyCallable_Check (comparator)) { - makeTypeError ("Callable", comparator); + if (!PyCallable_Check(comparator)) { + makeTypeError("Callable", comparator); return NULL; } @@ -2087,22 +2085,23 @@ * string objects here. verify that it returns an int (0). * err if not. */ - tuple = PyTuple_New (2); - - emptyStr = PyString_FromStringAndSize (NULL, 0); - Py_INCREF(emptyStr); - PyTuple_SET_ITEM (tuple, 0, emptyStr); - PyTuple_SET_ITEM (tuple, 1, emptyStr); /* steals reference */ - result = PyEval_CallObject (comparator, tuple); - Py_DECREF (tuple); - if (result == 0 || !PyInt_Check(result)) { - PyErr_SetString (PyExc_TypeError, - "callback MUST return an int"); + tuple = PyTuple_New(2); + emptyStr = PyString_FromStringAndSize(NULL, 0); + if (tuple == NULL || emptyStr == NULL) + return NULL; + + Py_INCREF(emptyStr); /* now we have two references */ + PyTuple_SET_ITEM(tuple, 0, emptyStr); /* steals reference */ + PyTuple_SET_ITEM(tuple, 1, emptyStr); /* steals reference */ + result = PyEval_CallObject(comparator, tuple); + Py_DECREF(tuple); + if (result == NULL || !PyInt_Check(result)) { + PyErr_SetString(PyExc_TypeError, + "callback MUST return an int"); return NULL; - } - else if (PyInt_AsLong(result) != 0) { - PyErr_SetString (PyExc_TypeError, - "callback failed to return 0 on two empty strings"); + } else if (PyInt_AsLong(result) != 0) { + PyErr_SetString(PyExc_TypeError, + "callback failed to return 0 on two empty strings"); return NULL; } @@ -2110,11 +2109,11 @@ * 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"); + PyErr_SetString(PyExc_RuntimeError, "set_bt_compare() cannot be called more than once"); return NULL; } - Py_INCREF (comparator); + Py_INCREF(comparator); self->btCompareCallback = comparator; /* This is to workaround a problem with un-initialized threads (see @@ -2123,18 +2122,18 @@ PyEval_InitThreads(); #endif - err = self->db->set_bt_compare (self->db, - (comparator != NULL ? - _db_compareCallback : NULL)); + err = self->db->set_bt_compare(self->db, + (comparator != NULL ? + _db_compareCallback : NULL)); if (err) { /* restore the old state in case of error */ - Py_DECREF (comparator); + Py_DECREF(comparator); self->btCompareCallback = NULL; } - RETURN_IF_ERR (); - RETURN_NONE (); + RETURN_IF_ERR(); + RETURN_NONE(); } #endif /* DBVER >= 33 */ From python-checkins at python.org Tue Mar 7 16:39:24 2006 From: python-checkins at python.org (hyeshik.chang) Date: Tue, 7 Mar 2006 16:39:24 +0100 (CET) Subject: [Python-checkins] r42894 - in python/trunk: Modules/arraymodule.c Modules/cStringIO.c Modules/zipimport.c Objects/longobject.c Objects/stringobject.c Objects/unicodeobject.c Objects/weakrefobject.c Parser/firstsets.c Python/ast.c Python/ceval.c Python/traceback.c Message-ID: <20060307153924.2AB6A1E4002@bag.python.org> Author: hyeshik.chang Date: Tue Mar 7 16:39:21 2006 New Revision: 42894 Modified: python/trunk/Modules/arraymodule.c python/trunk/Modules/cStringIO.c python/trunk/Modules/zipimport.c python/trunk/Objects/longobject.c python/trunk/Objects/stringobject.c python/trunk/Objects/unicodeobject.c python/trunk/Objects/weakrefobject.c python/trunk/Parser/firstsets.c python/trunk/Python/ast.c python/trunk/Python/ceval.c python/trunk/Python/traceback.c Log: SF #1444030: Fix several potential defects found by Coverity. (reviewed by Neal Norwitz) Modified: python/trunk/Modules/arraymodule.c ============================================================================== --- python/trunk/Modules/arraymodule.c (original) +++ python/trunk/Modules/arraymodule.c Tue Mar 7 16:39:21 2006 @@ -1852,10 +1852,13 @@ Py_DECREF(v); } } else if (initial != NULL && PyString_Check(initial)) { - PyObject *t_initial = PyTuple_Pack(1, - initial); - PyObject *v = - array_fromstring((arrayobject *)a, + PyObject *t_initial, *v; + t_initial = PyTuple_Pack(1, initial); + if (t_initial == NULL) { + Py_DECREF(a); + return NULL; + } + v = array_fromstring((arrayobject *)a, t_initial); Py_DECREF(t_initial); if (v == NULL) { Modified: python/trunk/Modules/cStringIO.c ============================================================================== --- python/trunk/Modules/cStringIO.c (original) +++ python/trunk/Modules/cStringIO.c Tue Mar 7 16:39:21 2006 @@ -544,6 +544,7 @@ if (!self->buf) { PyErr_SetString(PyExc_MemoryError,"out of memory"); self->buf_size = 0; + Py_DECREF(self); return NULL; } Modified: python/trunk/Modules/zipimport.c ============================================================================== --- python/trunk/Modules/zipimport.c (original) +++ python/trunk/Modules/zipimport.c Tue Mar 7 16:39:21 2006 @@ -1167,6 +1167,8 @@ mod = Py_InitModule4("zipimport", NULL, zipimport_doc, NULL, PYTHON_API_VERSION); + if (mod == NULL) + return; ZipImportError = PyErr_NewException("zipimport.ZipImportError", PyExc_ImportError, NULL); Modified: python/trunk/Objects/longobject.c ============================================================================== --- python/trunk/Objects/longobject.c (original) +++ python/trunk/Objects/longobject.c Tue Mar 7 16:39:21 2006 @@ -2809,6 +2809,8 @@ if (a->ob_size < 0) { a = (PyLongObject *) long_invert(a); + if (a == NULL) + return NULL; maska = MASK; } else { @@ -2817,6 +2819,10 @@ } if (b->ob_size < 0) { b = (PyLongObject *) long_invert(b); + if (b == NULL) { + Py_DECREF(a); + return NULL; + } maskb = MASK; } else { @@ -2868,7 +2874,7 @@ : (maskb ? size_a : MIN(size_a, size_b))) : MAX(size_a, size_b); z = _PyLong_New(size_z); - if (a == NULL || b == NULL || z == NULL) { + if (z == NULL) { Py_XDECREF(a); Py_XDECREF(b); Py_XDECREF(z); Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Tue Mar 7 16:39:21 2006 @@ -3276,7 +3276,7 @@ return list; onError: - Py_DECREF(list); + Py_XDECREF(list); return NULL; } Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Tue Mar 7 16:39:21 2006 @@ -1876,16 +1876,16 @@ message = "malformed \\N character escape"; if (ucnhash_CAPI == NULL) { /* load the unicode data module */ - PyObject *m, *v; + PyObject *m, *api; m = PyImport_ImportModule("unicodedata"); if (m == NULL) goto ucnhashError; - v = PyObject_GetAttrString(m, "ucnhash_CAPI"); + api = PyObject_GetAttrString(m, "ucnhash_CAPI"); Py_DECREF(m); - if (v == NULL) + if (api == NULL) goto ucnhashError; - ucnhash_CAPI = PyCObject_AsVoidPtr(v); - Py_DECREF(v); + ucnhash_CAPI = PyCObject_AsVoidPtr(api); + Py_DECREF(api); if (ucnhash_CAPI == NULL) goto ucnhashError; } @@ -1945,6 +1945,7 @@ PyExc_UnicodeError, "\\N escapes not supported (can't load unicodedata module)" ); + Py_XDECREF(v); Py_XDECREF(errorHandler); Py_XDECREF(exc); return NULL; @@ -3962,7 +3963,7 @@ return -1; substr = PyUnicode_FromObject(substr); if (substr == NULL) { - Py_DECREF(substr); + Py_DECREF(str); return -1; } @@ -4429,7 +4430,7 @@ return list; onError: - Py_DECREF(list); + Py_XDECREF(list); Py_DECREF(string); return NULL; } @@ -6679,6 +6680,10 @@ if (!str) return NULL; result = _PyUnicode_New(len); + if (!result) { + Py_DECREF(str); + return NULL; + } for (i = 0; i < len; i++) result->str[i] = buf[i]; result->str[len] = 0; @@ -6865,7 +6870,7 @@ rescnt = fmtcnt + 100; reslen += rescnt; if (_PyUnicode_Resize(&result, reslen) < 0) - return NULL; + goto onError; res = PyUnicode_AS_UNICODE(result) + reslen - rescnt; --rescnt; } @@ -7163,6 +7168,7 @@ rescnt = width + fmtcnt + 100; reslen += rescnt; if (reslen < 0) { + Py_XDECREF(temp); Py_DECREF(result); return PyErr_NoMemory(); } Modified: python/trunk/Objects/weakrefobject.c ============================================================================== --- python/trunk/Objects/weakrefobject.c (original) +++ python/trunk/Objects/weakrefobject.c Tue Mar 7 16:39:21 2006 @@ -903,8 +903,15 @@ } } else { - PyObject *tuple = PyTuple_New(count * 2); + PyObject *tuple; Py_ssize_t i = 0; + + tuple = PyTuple_New(count * 2); + if (tuple == NULL) { + if (restore_error) + PyErr_Fetch(&err_type, &err_value, &err_tb); + return; + } for (i = 0; i < count; ++i) { PyWeakReference *next = current->wr_next; Modified: python/trunk/Parser/firstsets.c ============================================================================== --- python/trunk/Parser/firstsets.c (original) +++ python/trunk/Parser/firstsets.c Tue Mar 7 16:39:21 2006 @@ -107,4 +107,6 @@ } printf(" }\n"); } + + PyMem_FREE(sym); } Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Tue Mar 7 16:39:21 2006 @@ -1438,6 +1438,8 @@ } /* extract Index values and put them in a Tuple */ elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); + if (!elts) + return NULL; for (j = 0; j < asdl_seq_LEN(slices); ++j) { slc = (slice_ty)asdl_seq_GET(slices, j); assert(slc->kind == Index_kind && slc->v.Index.value); Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Tue Mar 7 16:39:21 2006 @@ -3477,8 +3477,11 @@ { PyObject *result; - if (arg == NULL) + if (arg == NULL) { arg = PyTuple_New(0); + if (arg == NULL) + return NULL; + } else if (!PyTuple_Check(arg)) { PyErr_SetString(PyExc_TypeError, "argument list must be a tuple"); Modified: python/trunk/Python/traceback.c ============================================================================== --- python/trunk/Python/traceback.c (original) +++ python/trunk/Python/traceback.c Tue Mar 7 16:39:21 2006 @@ -185,8 +185,12 @@ } PyOS_snprintf(linebuf, sizeof(linebuf), FMT, filename, lineno, name); err = PyFile_WriteString(linebuf, f); - if (xfp == NULL || err != 0) + if (xfp == NULL) return err; + else if (err != 0) { + fclose(xfp); + return err; + } for (i = 0; i < lineno; i++) { char* pLastChar = &linebuf[sizeof(linebuf)-2]; do { From python-checkins at python.org Tue Mar 7 16:59:13 2006 From: python-checkins at python.org (hyeshik.chang) Date: Tue, 7 Mar 2006 16:59:13 +0100 (CET) Subject: [Python-checkins] r42895 - in python/branches/release24-maint: Modules/arraymodule.c Modules/cStringIO.c Modules/zipimport.c Objects/longobject.c Objects/stringobject.c Objects/unicodeobject.c Objects/weakrefobject.c Parser/firstsets.c Python/ceval.c Python/traceback.c Message-ID: <20060307155913.403951E4002@bag.python.org> Author: hyeshik.chang Date: Tue Mar 7 16:59:09 2006 New Revision: 42895 Modified: python/branches/release24-maint/Modules/arraymodule.c python/branches/release24-maint/Modules/cStringIO.c python/branches/release24-maint/Modules/zipimport.c python/branches/release24-maint/Objects/longobject.c python/branches/release24-maint/Objects/stringobject.c python/branches/release24-maint/Objects/unicodeobject.c python/branches/release24-maint/Objects/weakrefobject.c python/branches/release24-maint/Parser/firstsets.c python/branches/release24-maint/Python/ceval.c python/branches/release24-maint/Python/traceback.c Log: Backport r42894: SF #1444030 Fix several potential defects found by Coverity. Modified: python/branches/release24-maint/Modules/arraymodule.c ============================================================================== --- python/branches/release24-maint/Modules/arraymodule.c (original) +++ python/branches/release24-maint/Modules/arraymodule.c Tue Mar 7 16:59:09 2006 @@ -1826,10 +1826,13 @@ Py_DECREF(v); } } else if (initial != NULL && PyString_Check(initial)) { - PyObject *t_initial = PyTuple_Pack(1, - initial); - PyObject *v = - array_fromstring((arrayobject *)a, + PyObject *t_initial, *v; + t_initial = PyTuple_Pack(1, initial); + if (t_initial == NULL) { + Py_DECREF(a); + return NULL; + } + v = array_fromstring((arrayobject *)a, t_initial); Py_DECREF(t_initial); if (v == NULL) { Modified: python/branches/release24-maint/Modules/cStringIO.c ============================================================================== --- python/branches/release24-maint/Modules/cStringIO.c (original) +++ python/branches/release24-maint/Modules/cStringIO.c Tue Mar 7 16:59:09 2006 @@ -541,6 +541,7 @@ UNLESS (self->buf = (char *)malloc(size)) { PyErr_SetString(PyExc_MemoryError,"out of memory"); self->buf_size = 0; + Py_DECREF(self); return NULL; } Modified: python/branches/release24-maint/Modules/zipimport.c ============================================================================== --- python/branches/release24-maint/Modules/zipimport.c (original) +++ python/branches/release24-maint/Modules/zipimport.c Tue Mar 7 16:59:09 2006 @@ -1165,6 +1165,8 @@ mod = Py_InitModule4("zipimport", NULL, zipimport_doc, NULL, PYTHON_API_VERSION); + if (mod == NULL) + return; ZipImportError = PyErr_NewException("zipimport.ZipImportError", PyExc_ImportError, NULL); Modified: python/branches/release24-maint/Objects/longobject.c ============================================================================== --- python/branches/release24-maint/Objects/longobject.c (original) +++ python/branches/release24-maint/Objects/longobject.c Tue Mar 7 16:59:09 2006 @@ -2723,6 +2723,8 @@ if (a->ob_size < 0) { a = (PyLongObject *) long_invert(a); + if (a == NULL) + return NULL; maska = MASK; } else { @@ -2731,6 +2733,10 @@ } if (b->ob_size < 0) { b = (PyLongObject *) long_invert(b); + if (b == NULL) { + Py_DECREF(a); + return NULL; + } maskb = MASK; } else { @@ -2782,7 +2788,7 @@ : (maskb ? size_a : MIN(size_a, size_b))) : MAX(size_a, size_b); z = _PyLong_New(size_z); - if (a == NULL || b == NULL || z == NULL) { + if (z == NULL) { Py_XDECREF(a); Py_XDECREF(b); Py_XDECREF(z); Modified: python/branches/release24-maint/Objects/stringobject.c ============================================================================== --- python/branches/release24-maint/Objects/stringobject.c (original) +++ python/branches/release24-maint/Objects/stringobject.c Tue Mar 7 16:59:09 2006 @@ -3240,7 +3240,7 @@ return list; onError: - Py_DECREF(list); + Py_XDECREF(list); return NULL; } Modified: python/branches/release24-maint/Objects/unicodeobject.c ============================================================================== --- python/branches/release24-maint/Objects/unicodeobject.c (original) +++ python/branches/release24-maint/Objects/unicodeobject.c Tue Mar 7 16:59:09 2006 @@ -1866,16 +1866,16 @@ message = "malformed \\N character escape"; if (ucnhash_CAPI == NULL) { /* load the unicode data module */ - PyObject *m, *v; + PyObject *m, *api; m = PyImport_ImportModule("unicodedata"); if (m == NULL) goto ucnhashError; - v = PyObject_GetAttrString(m, "ucnhash_CAPI"); + api = PyObject_GetAttrString(m, "ucnhash_CAPI"); Py_DECREF(m); - if (v == NULL) + if (api == NULL) goto ucnhashError; - ucnhash_CAPI = PyCObject_AsVoidPtr(v); - Py_DECREF(v); + ucnhash_CAPI = PyCObject_AsVoidPtr(api); + Py_DECREF(api); if (ucnhash_CAPI == NULL) goto ucnhashError; } @@ -1935,6 +1935,7 @@ PyExc_UnicodeError, "\\N escapes not supported (can't load unicodedata module)" ); + Py_XDECREF(v); Py_XDECREF(errorHandler); Py_XDECREF(exc); return NULL; @@ -3911,7 +3912,7 @@ return -1; substr = PyUnicode_FromObject(substr); if (substr == NULL) { - Py_DECREF(substr); + Py_DECREF(str); return -1; } @@ -4382,7 +4383,7 @@ return list; onError: - Py_DECREF(list); + Py_XDECREF(list); Py_DECREF(string); return NULL; } @@ -6627,6 +6628,10 @@ if (!str) return NULL; result = _PyUnicode_New(len); + if (!result) { + Py_DECREF(str); + return NULL; + } for (i = 0; i < len; i++) result->str[i] = buf[i]; result->str[len] = 0; @@ -6813,7 +6818,7 @@ rescnt = fmtcnt + 100; reslen += rescnt; if (_PyUnicode_Resize(&result, reslen) < 0) - return NULL; + goto onError; res = PyUnicode_AS_UNICODE(result) + reslen - rescnt; --rescnt; } @@ -7111,6 +7116,7 @@ rescnt = width + fmtcnt + 100; reslen += rescnt; if (reslen < 0) { + Py_XDECREF(temp); Py_DECREF(result); return PyErr_NoMemory(); } Modified: python/branches/release24-maint/Objects/weakrefobject.c ============================================================================== --- python/branches/release24-maint/Objects/weakrefobject.c (original) +++ python/branches/release24-maint/Objects/weakrefobject.c Tue Mar 7 16:59:09 2006 @@ -903,9 +903,16 @@ } } else { - PyObject *tuple = PyTuple_New(count * 2); + PyObject *tuple; int i = 0; + tuple = PyTuple_New(count * 2); + if (tuple == NULL) { + if (restore_error) + PyErr_Fetch(&err_type, &err_value, &err_tb); + return; + } + for (i = 0; i < count; ++i) { PyWeakReference *next = current->wr_next; Modified: python/branches/release24-maint/Parser/firstsets.c ============================================================================== --- python/branches/release24-maint/Parser/firstsets.c (original) +++ python/branches/release24-maint/Parser/firstsets.c Tue Mar 7 16:59:09 2006 @@ -107,4 +107,6 @@ } printf(" }\n"); } + + PyMem_FREE(sym); } Modified: python/branches/release24-maint/Python/ceval.c ============================================================================== --- python/branches/release24-maint/Python/ceval.c (original) +++ python/branches/release24-maint/Python/ceval.c Tue Mar 7 16:59:09 2006 @@ -3407,8 +3407,11 @@ { PyObject *result; - if (arg == NULL) + if (arg == NULL) { arg = PyTuple_New(0); + if (arg == NULL) + return NULL; + } else if (!PyTuple_Check(arg)) { PyErr_SetString(PyExc_TypeError, "argument list must be a tuple"); Modified: python/branches/release24-maint/Python/traceback.c ============================================================================== --- python/branches/release24-maint/Python/traceback.c (original) +++ python/branches/release24-maint/Python/traceback.c Tue Mar 7 16:59:09 2006 @@ -184,8 +184,12 @@ } PyOS_snprintf(linebuf, sizeof(linebuf), FMT, filename, lineno, name); err = PyFile_WriteString(linebuf, f); - if (xfp == NULL || err != 0) + if (xfp == NULL) return err; + else if (err != 0) { + fclose(xfp); + return err; + } for (i = 0; i < lineno; i++) { char* pLastChar = &linebuf[sizeof(linebuf)-2]; do { From python-checkins at python.org Tue Mar 7 17:16:08 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 7 Mar 2006 17:16:08 +0100 (CET) Subject: [Python-checkins] r42896 - python/trunk/Lib/BaseHTTPServer.py Message-ID: <20060307161608.A83A71E4002@bag.python.org> Author: andrew.kuchling Date: Tue Mar 7 17:16:07 2006 New Revision: 42896 Modified: python/trunk/Lib/BaseHTTPServer.py Log: Typo fix Modified: python/trunk/Lib/BaseHTTPServer.py ============================================================================== --- python/trunk/Lib/BaseHTTPServer.py (original) +++ python/trunk/Lib/BaseHTTPServer.py Tue Mar 7 17:16:07 2006 @@ -389,7 +389,7 @@ def log_request(self, code='-', size='-'): """Log an accepted request. - This is called by send_reponse(). + This is called by send_response(). """ From python-checkins at python.org Tue Mar 7 17:17:10 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 7 Mar 2006 17:17:10 +0100 (CET) Subject: [Python-checkins] r42897 - python/branches/release24-maint/Lib/BaseHTTPServer.py Message-ID: <20060307161710.4906B1E4002@bag.python.org> Author: andrew.kuchling Date: Tue Mar 7 17:17:09 2006 New Revision: 42897 Modified: python/branches/release24-maint/Lib/BaseHTTPServer.py Log: Typo fix Modified: python/branches/release24-maint/Lib/BaseHTTPServer.py ============================================================================== --- python/branches/release24-maint/Lib/BaseHTTPServer.py (original) +++ python/branches/release24-maint/Lib/BaseHTTPServer.py Tue Mar 7 17:17:09 2006 @@ -389,7 +389,7 @@ def log_request(self, code='-', size='-'): """Log an accepted request. - This is called by send_reponse(). + This is called by send_response(). """ From python-checkins at python.org Tue Mar 7 19:31:45 2006 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 7 Mar 2006 19:31:45 +0100 (CET) Subject: [Python-checkins] r42898 - python/trunk/Python/pythonrun.c Message-ID: <20060307183145.343FA1E4002@bag.python.org> Author: guido.van.rossum Date: Tue Mar 7 19:31:44 2006 New Revision: 42898 Modified: python/trunk/Python/pythonrun.c Log: Address an coverity issue. Coverity was complaining about a line that's fine, but an earlier line checked for v != NULL unnecessarily. Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Tue Mar 7 19:31:44 2006 @@ -1026,6 +1026,7 @@ PyErr_NormalizeException(&exception, &v, &tb); if (exception == NULL) return; + /* Now we know v != NULL too */ if (set_sys_last_vars) { PySys_SetObject("last_type", exception); PySys_SetObject("last_value", v); @@ -1034,7 +1035,7 @@ hook = PySys_GetObject("excepthook"); if (hook) { PyObject *args = PyTuple_Pack(3, - exception, v ? v : Py_None, tb ? tb : Py_None); + exception, v, tb ? tb : Py_None); PyObject *result = PyEval_CallObject(hook, args); if (result == NULL) { PyObject *exception2, *v2, *tb2; From python-checkins at python.org Tue Mar 7 19:51:13 2006 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 7 Mar 2006 19:51:13 +0100 (CET) Subject: [Python-checkins] r42899 - in python/trunk: Doc/api/abstract.tex Doc/lib/liboperator.tex Doc/ref/ref3.tex Include/abstract.h Include/object.h Lib/test/test_index.py Modules/arraymodule.c Modules/mmapmodule.c Modules/operator.c Objects/abstract.c Objects/classobject.c Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/stringobject.c Objects/tupleobject.c Objects/typeobject.c Objects/unicodeobject.c Python/ceval.c Message-ID: <20060307185113.5221A1E4002@bag.python.org> Author: guido.van.rossum Date: Tue Mar 7 19:50:55 2006 New Revision: 42899 Added: python/trunk/Lib/test/test_index.py (contents, props changed) Modified: python/trunk/Doc/api/abstract.tex python/trunk/Doc/lib/liboperator.tex python/trunk/Doc/ref/ref3.tex python/trunk/Include/abstract.h python/trunk/Include/object.h python/trunk/Modules/arraymodule.c python/trunk/Modules/mmapmodule.c python/trunk/Modules/operator.c python/trunk/Objects/abstract.c python/trunk/Objects/classobject.c python/trunk/Objects/intobject.c python/trunk/Objects/listobject.c python/trunk/Objects/longobject.c python/trunk/Objects/stringobject.c python/trunk/Objects/tupleobject.c python/trunk/Objects/typeobject.c python/trunk/Objects/unicodeobject.c python/trunk/Python/ceval.c Log: Checking in the code for PEP 357. This was mostly written by Travis Oliphant. I've inspected it all; Neal Norwitz and MvL have also looked at it (in an earlier incarnation). Modified: python/trunk/Doc/api/abstract.tex ============================================================================== --- python/trunk/Doc/api/abstract.tex (original) +++ python/trunk/Doc/api/abstract.tex Tue Mar 7 19:50:55 2006 @@ -346,6 +346,7 @@ either the sequence and mapping protocols, the sequence length is returned. On error, \code{-1} is returned. This is the equivalent to the Python expression \samp{len(\var{o})}.\bifuncindex{len} + \versionadded{2.5} \end{cfuncdesc} @@ -689,6 +690,10 @@ \samp{float(\var{o})}.\bifuncindex{float} \end{cfuncdesc} +\begin{cfuncdesc}{Py_ssize_t}{PyNumber_Index}{PyObject *o} + Returns the \var{o} converted to a Py_ssize_t integer on success, or + -1 with an exception raised on failure. +\end{cfuncdesc} \section{Sequence Protocol \label{sequence}} Modified: python/trunk/Doc/lib/liboperator.tex ============================================================================== --- python/trunk/Doc/lib/liboperator.tex (original) +++ python/trunk/Doc/lib/liboperator.tex Tue Mar 7 19:50:55 2006 @@ -171,6 +171,11 @@ Return the bitwise exclusive or of \var{a} and \var{b}. \end{funcdesc} +\begin{funcdesc}{index}{a} +\funcline{__index__}{a} +Return \var{a} converted to an integer. Equivalent to \var{a}\code{.__index__()}. +\versionadded{2.5} +\end{funcdesc} Operations which work with sequences include: Modified: python/trunk/Doc/ref/ref3.tex ============================================================================== --- python/trunk/Doc/ref/ref3.tex (original) +++ python/trunk/Doc/ref/ref3.tex Tue Mar 7 19:50:55 2006 @@ -1978,6 +1978,13 @@ \function{hex()}\bifuncindex{hex}. Should return a string value. \end{methoddesc} +\begin{methoddesc}[numeric object]{__index__}{self} +Called to implement operator.index(). Also called whenever Python +needs an integer object (such as in slicing). Must return an integer +(int or long). +\versionadded{2.5} +\end{methoddesc} + \begin{methoddesc}[numeric object]{__coerce__}{self, other} Called to implement ``mixed-mode'' numeric arithmetic. Should either return a 2-tuple containing \var{self} and \var{other} converted to Modified: python/trunk/Include/abstract.h ============================================================================== --- python/trunk/Include/abstract.h (original) +++ python/trunk/Include/abstract.h Tue Mar 7 19:50:55 2006 @@ -748,6 +748,14 @@ */ + PyAPI_FUNC(Py_ssize_t) PyNumber_Index(PyObject *); + + /* + Returns the object converted to Py_ssize_t on success + or -1 with an error raised on failure. + */ + + PyAPI_FUNC(PyObject *) PyNumber_Int(PyObject *o); /* Modified: python/trunk/Include/object.h ============================================================================== --- python/trunk/Include/object.h (original) +++ python/trunk/Include/object.h Tue Mar 7 19:50:55 2006 @@ -206,6 +206,9 @@ binaryfunc nb_true_divide; binaryfunc nb_inplace_floor_divide; binaryfunc nb_inplace_true_divide; + + /* Added in release 2.5 */ + lenfunc nb_index; } PyNumberMethods; typedef struct { @@ -503,13 +506,16 @@ /* Objects support garbage collection (see objimp.h) */ #define Py_TPFLAGS_HAVE_GC (1L<<14) -/* These two bits are preserved for Stackless Python, next after this is 16 */ +/* These two bits are preserved for Stackless Python, next after this is 17 */ #ifdef STACKLESS #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION (3L<<15) #else #define Py_TPFLAGS_HAVE_STACKLESS_EXTENSION 0 #endif +/* Objects support nb_index in PyNumberMethods */ +#define Py_TPFLAGS_HAVE_INDEX (1L<<17) + #define Py_TPFLAGS_DEFAULT ( \ Py_TPFLAGS_HAVE_GETCHARBUFFER | \ Py_TPFLAGS_HAVE_SEQUENCE_IN | \ @@ -519,6 +525,7 @@ Py_TPFLAGS_HAVE_ITER | \ Py_TPFLAGS_HAVE_CLASS | \ Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ + Py_TPFLAGS_HAVE_INDEX | \ 0) #define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) Added: python/trunk/Lib/test/test_index.py ============================================================================== Modified: python/trunk/Modules/arraymodule.c ============================================================================== --- python/trunk/Modules/arraymodule.c (original) +++ python/trunk/Modules/arraymodule.c Tue Mar 7 19:50:55 2006 @@ -1569,19 +1569,17 @@ return s; } +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + static PyObject* array_subscr(arrayobject* self, PyObject* item) { - if (PyInt_Check(item)) { - Py_ssize_t i = PyInt_AS_LONG(item); - if (i < 0) - i += self->ob_size; - return array_item(self, i); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); - if (i == -1 && PyErr_Occurred()) + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); + if (i==-1 && PyErr_Occurred()) { return NULL; + } if (i < 0) i += self->ob_size; return array_item(self, i); @@ -1626,15 +1624,10 @@ static int array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) { - if (PyInt_Check(item)) { - Py_ssize_t i = PyInt_AS_LONG(item); - if (i < 0) - i += self->ob_size; - return array_ass_item(self, i, value); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); - if (i == -1 && PyErr_Occurred()) + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); + if (i==-1 && PyErr_Occurred()) return -1; if (i < 0) i += self->ob_size; Modified: python/trunk/Modules/mmapmodule.c ============================================================================== --- python/trunk/Modules/mmapmodule.c (original) +++ python/trunk/Modules/mmapmodule.c Tue Mar 7 19:50:55 2006 @@ -815,6 +815,8 @@ }; +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + /* extract the map size from the given PyObject Returns -1 on error, with an appropriate Python exception raised. On @@ -822,26 +824,15 @@ static Py_ssize_t _GetMapSize(PyObject *o) { - if (PyInt_Check(o)) { - long i = PyInt_AsLong(o); - if (PyErr_Occurred()) + PyNumberMethods *nb = o->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(o) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(o); + if (i==-1 && PyErr_Occurred()) return -1; if (i < 0) goto onnegoverflow; - return i; - } - else if (PyLong_Check(o)) { - Py_ssize_t i = PyInt_AsSsize_t(o); - if (PyErr_Occurred()) { - /* yes negative overflow is mistaken for positive overflow - but not worth the trouble to check sign of 'i' */ - if (PyErr_ExceptionMatches(PyExc_OverflowError)) - goto onposoverflow; - else - return -1; - } - if (i < 0) - goto onnegoverflow; + if (i==PY_SSIZE_T_MAX) + goto onposoverflow; return i; } else { Modified: python/trunk/Modules/operator.c ============================================================================== --- python/trunk/Modules/operator.c (original) +++ python/trunk/Modules/operator.c Tue Mar 7 19:50:55 2006 @@ -130,6 +130,20 @@ return NULL; } +static PyObject * +op_index(PyObject *s, PyObject *a) +{ + Py_ssize_t i; + PyObject *a1; + if (!PyArg_UnpackTuple(a,"index", 1, 1, &a1)) + return NULL; + i = PyNumber_Index(a1); + if (i == -1 && PyErr_Occurred()) + return NULL; + else + return PyInt_FromSsize_t(i); +} + static PyObject* is_(PyObject *s, PyObject *a) { @@ -229,6 +243,7 @@ spam1(is_, "is_(a, b) -- Same as a is b.") spam1(is_not, "is_not(a, b) -- Same as a is not b.") +spam2(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.") Modified: python/trunk/Objects/abstract.c ============================================================================== --- python/trunk/Objects/abstract.c (original) +++ python/trunk/Objects/abstract.c Tue Mar 7 19:50:55 2006 @@ -8,6 +8,8 @@ #define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \ Py_TPFLAGS_CHECKTYPES) +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + /* Shorthands to return certain errors */ static PyObject * @@ -119,10 +121,9 @@ return m->mp_subscript(o, key); if (o->ob_type->tp_as_sequence) { - if (PyInt_Check(key)) - return PySequence_GetItem(o, PyInt_AsLong(key)); - else if (PyLong_Check(key)) { - long key_value = PyLong_AsLong(key); + PyNumberMethods *nb = key->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) { + Py_ssize_t key_value = nb->nb_index(key); if (key_value == -1 && PyErr_Occurred()) return NULL; return PySequence_GetItem(o, key_value); @@ -148,10 +149,9 @@ return m->mp_ass_subscript(o, key, value); if (o->ob_type->tp_as_sequence) { - if (PyInt_Check(key)) - return PySequence_SetItem(o, PyInt_AsLong(key), value); - else if (PyLong_Check(key)) { - long key_value = PyLong_AsLong(key); + PyNumberMethods *nb = key->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) { + Py_ssize_t key_value = nb->nb_index(key); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_SetItem(o, key_value, value); @@ -180,10 +180,9 @@ return m->mp_ass_subscript(o, key, (PyObject*)NULL); if (o->ob_type->tp_as_sequence) { - if (PyInt_Check(key)) - return PySequence_DelItem(o, PyInt_AsLong(key)); - else if (PyLong_Check(key)) { - long key_value = PyLong_AsLong(key); + PyNumberMethods *nb = key->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(key) && nb->nb_index != NULL) { + Py_ssize_t key_value = nb->nb_index(key); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_DelItem(o, key_value); @@ -647,12 +646,10 @@ static PyObject * sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) { - long count; - if (PyInt_Check(n)) { - count = PyInt_AsLong(n); - } - else if (PyLong_Check(n)) { - count = PyLong_AsLong(n); + Py_ssize_t count; + PyNumberMethods *nb = n->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(n) && nb->nb_index != NULL) { + count = nb->nb_index(n); if (count == -1 && PyErr_Occurred()) return NULL; } @@ -660,32 +657,7 @@ return type_error( "can't multiply sequence by non-int"); } -#if LONG_MAX != INT_MAX - if (count > INT_MAX) { - PyErr_SetString(PyExc_ValueError, - "sequence repeat count too large"); - return NULL; - } - else if (count < INT_MIN) - count = INT_MIN; - /* XXX Why don't I either - - - set count to -1 whenever it's negative (after all, - sequence repeat usually treats negative numbers - as zero(); or - - - raise an exception when it's less than INT_MIN? - - I'm thinking about a hypothetical use case where some - sequence type might use a negative value as a flag of - some kind. In those cases I don't want to break the - code by mapping all negative values to -1. But I also - don't want to break e.g. []*(-sys.maxint), which is - perfectly safe, returning []. As a compromise, I do - map out-of-range negative values. - */ -#endif - return (*repeatfunc)(seq, (int)count); + return (*repeatfunc)(seq, count); } PyObject * @@ -960,6 +932,22 @@ return x; } +/* Return a Py_ssize_t integer from the object item */ +Py_ssize_t +PyNumber_Index(PyObject *item) +{ + Py_ssize_t value = -1; + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + value = nb->nb_index(item); + } + else { + PyErr_SetString(PyExc_IndexError, + "object cannot be interpreted as an index"); + } + return value; +} + PyObject * PyNumber_Int(PyObject *o) { Modified: python/trunk/Objects/classobject.c ============================================================================== --- python/trunk/Objects/classobject.c (original) +++ python/trunk/Objects/classobject.c Tue Mar 7 19:50:55 2006 @@ -1733,6 +1733,43 @@ return outcome > 0; } +static Py_ssize_t +instance_index(PyInstanceObject *self) +{ + PyObject *func, *res; + Py_ssize_t outcome; + static PyObject *indexstr = NULL; + + if (indexstr == NULL) { + indexstr = PyString_InternFromString("__index__"); + if (indexstr == NULL) + return -1; + } + if ((func = instance_getattr(self, indexstr)) == NULL) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) + return -1; + PyErr_Clear(); + PyErr_SetString(PyExc_TypeError, + "object cannot be interpreted as an index"); + return -1; + } + res = PyEval_CallObject(func, (PyObject *)NULL); + Py_DECREF(func); + if (res == NULL) + return -1; + if (PyInt_Check(res) || PyLong_Check(res)) { + outcome = res->ob_type->tp_as_number->nb_index(res); + } + else { + PyErr_SetString(PyExc_TypeError, + "__index__ must return an int or a long"); + outcome = -1; + } + Py_DECREF(res); + return outcome; +} + + UNARY(instance_invert, "__invert__") UNARY(instance_int, "__int__") UNARY(instance_long, "__long__") @@ -2052,6 +2089,7 @@ (binaryfunc)instance_truediv, /* nb_true_divide */ (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */ (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */ + (lenfunc)instance_index, /* nb_index */ }; PyTypeObject PyInstance_Type = { Modified: python/trunk/Objects/intobject.c ============================================================================== --- python/trunk/Objects/intobject.c (original) +++ python/trunk/Objects/intobject.c Tue Mar 7 19:50:55 2006 @@ -1069,6 +1069,7 @@ int_true_divide, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ + (lenfunc)PyInt_AsSsize_t, /* nb_index */ }; PyTypeObject PyInt_Type = { Modified: python/trunk/Objects/listobject.c ============================================================================== --- python/trunk/Objects/listobject.c (original) +++ python/trunk/Objects/listobject.c Tue Mar 7 19:50:55 2006 @@ -2452,11 +2452,14 @@ "list() -> new list\n" "list(sequence) -> new list initialized from sequence's items"); +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + static PyObject * list_subscript(PyListObject* self, PyObject* item) { - if (PyInt_Check(item) || PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) @@ -2503,14 +2506,9 @@ static int list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) { - if (PyInt_Check(item)) { - Py_ssize_t i = PyInt_AS_LONG(item); - if (i < 0) - i += PyList_GET_SIZE(self); - return list_ass_item(self, i, value); - } - else if (PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); if (i == -1 && PyErr_Occurred()) return -1; if (i < 0) Modified: python/trunk/Objects/longobject.c ============================================================================== --- python/trunk/Objects/longobject.c (original) +++ python/trunk/Objects/longobject.c Tue Mar 7 19:50:55 2006 @@ -241,12 +241,8 @@ return -1; } -/* Get a Py_ssize_t from a long int object. - Returns -1 and sets an error condition if overflow occurs. */ - -Py_ssize_t -_PyLong_AsSsize_t(PyObject *vv) -{ +static Py_ssize_t +_long_as_ssize_t(PyObject *vv) { register PyLongObject *v; size_t x, prev; Py_ssize_t i; @@ -282,7 +278,45 @@ overflow: PyErr_SetString(PyExc_OverflowError, "long int too large to convert to int"); - return -1; + if (sign > 0) + return PY_SSIZE_T_MAX; + else + return -PY_SSIZE_T_MAX-1; +} + +/* Get a Py_ssize_t from a long int object. + Returns -1 and sets an error condition if overflow occurs. */ + +Py_ssize_t +_PyLong_AsSsize_t(PyObject *vv) +{ + Py_ssize_t x; + + x = _long_as_ssize_t(vv); + if (PyErr_Occurred()) return -1; + return x; +} + + +/* Get a Py_ssize_t from a long int object. + Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, + and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. + Return 0 on error, 1 on success. +*/ + +static Py_ssize_t +long_index(PyObject *vv) +{ + Py_ssize_t x; + + x = _long_as_ssize_t(vv); + if (PyErr_Occurred()) { + /* If overflow error, ignore the error */ + if (x != -1) { + PyErr_Clear(); + } + } + return x; } /* Get a C unsigned long int from a long int object. @@ -3131,6 +3165,7 @@ long_true_divide, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ + (lenfunc)long_index, /* nb_index */ }; PyTypeObject PyLong_Type = { Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Tue Mar 7 19:50:55 2006 @@ -1187,16 +1187,19 @@ return x; } +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + static PyObject* string_subscript(PyStringObject* self, PyObject* item) { - if (PyInt_Check(item) || PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) i += PyString_GET_SIZE(self); - return string_item(self,i); + return string_item(self, i); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, cur, i; Modified: python/trunk/Objects/tupleobject.c ============================================================================== --- python/trunk/Objects/tupleobject.c (original) +++ python/trunk/Objects/tupleobject.c Tue Mar 7 19:50:55 2006 @@ -584,11 +584,14 @@ (objobjproc)tuplecontains, /* sq_contains */ }; +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + static PyObject* tuplesubscript(PyTupleObject* self, PyObject* item) { - if (PyInt_Check(item) || PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Tue Mar 7 19:50:55 2006 @@ -3051,6 +3051,9 @@ COPYNUM(nb_inplace_true_divide); COPYNUM(nb_inplace_floor_divide); } + if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) { + COPYNUM(nb_index); + } } if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) { @@ -4344,6 +4347,44 @@ return result; } + +static Py_ssize_t +slot_nb_index(PyObject *self) +{ + PyObject *func, *args; + static PyObject *index_str; + Py_ssize_t result = -1; + + func = lookup_maybe(self, "__index__", &index_str); + if (func == NULL) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "object cannot be interpreted as an index"); + } + return -1; + } + args = PyTuple_New(0); + if (args != NULL) { + PyObject *temp = PyObject_Call(func, args, NULL); + Py_DECREF(args); + if (temp != NULL) { + if (PyInt_Check(temp) || PyLong_Check(temp)) { + result = + temp->ob_type->tp_as_number->nb_index(temp); + } + else { + PyErr_SetString(PyExc_TypeError, + "__index__ must return an int or a long"); + result = -1; + } + Py_DECREF(temp); + } + } + Py_DECREF(func); + return result; +} + + SLOT0(slot_nb_invert, "__invert__") SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__") SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__") @@ -5069,6 +5110,8 @@ "oct(x)"), UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc, "hex(x)"), + NBSLOT("__index__", nb_index, slot_nb_index, wrap_lenfunc, + "x[y:z] <==> x[y.__index__():z.__index__()]"), IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add, wrap_binaryfunc, "+"), IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract, Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Tue Mar 7 19:50:55 2006 @@ -6460,11 +6460,14 @@ (objobjproc)PyUnicode_Contains, /*sq_contains*/ }; +#define HASINDEX(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_HAVE_INDEX) + static PyObject* unicode_subscript(PyUnicodeObject* self, PyObject* item) { - if (PyInt_Check(item) || PyLong_Check(item)) { - Py_ssize_t i = PyInt_AsSsize_t(item); + PyNumberMethods *nb = item->ob_type->tp_as_number; + if (nb != NULL && HASINDEX(item) && nb->nb_index != NULL) { + Py_ssize_t i = nb->nb_index(item); if (i == -1 && PyErr_Occurred()) return NULL; if (i < 0) Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Tue Mar 7 19:50:55 2006 @@ -3916,9 +3916,10 @@ return result; } -/* Extract a slice index from a PyInt or PyLong, and store in *pi. - Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, - and silently boost values less than -PY_SSIZE_T_MAX to 0. +/* Extract a slice index from a PyInt or PyLong or an object with the + nb_index slot defined, and store in *pi. + Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, + and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. Return 0 on error, 1 on success. */ /* Note: If v is NULL, return success without storing into *pi. This @@ -3932,46 +3933,18 @@ Py_ssize_t x; if (PyInt_Check(v)) { x = PyInt_AsLong(v); - } else if (PyLong_Check(v)) { - x = PyInt_AsSsize_t(v); - if (x==-1 && PyErr_Occurred()) { - PyObject *long_zero; - int cmp; - - if (!PyErr_ExceptionMatches( - PyExc_OverflowError)) { - /* It's not an overflow error, so just - signal an error */ - return 0; - } - - /* Clear the OverflowError */ - PyErr_Clear(); - - /* It's an overflow error, so we need to - check the sign of the long integer, - set the value to PY_SSIZE_T_MAX or - -PY_SSIZE_T_MAX, and clear the error. */ - - /* Create a long integer with a value of 0 */ - long_zero = PyLong_FromLong(0L); - if (long_zero == NULL) - return 0; - - /* Check sign */ - cmp = PyObject_RichCompareBool(v, long_zero, - Py_GT); - Py_DECREF(long_zero); - if (cmp < 0) - return 0; - else if (cmp) - x = PY_SSIZE_T_MAX; - else - x = -PY_SSIZE_T_MAX; - } - } else { + } + else if (v->ob_type->tp_as_number && + PyType_HasFeature(v->ob_type, Py_TPFLAGS_HAVE_INDEX) + && v->ob_type->tp_as_number->nb_index) { + x = v->ob_type->tp_as_number->nb_index(v); + if (x == -1 && PyErr_Occurred()) + return 0; + } + else { PyErr_SetString(PyExc_TypeError, - "slice indices must be integers or None"); + "slice indices must be integers or " + "None or have an __index__ method"); return 0; } *pi = x; @@ -3979,8 +3952,11 @@ return 1; } -#undef ISINT -#define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x)) +#undef ISINDEX +#define ISINDEX(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x) || \ + ((x)->ob_type->tp_as_number && \ + PyType_HasFeature((x)->ob_type, Py_TPFLAGS_HAVE_INDEX) \ + && (x)->ob_type->tp_as_number->nb_index)) static PyObject * apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */ @@ -3988,7 +3964,7 @@ PyTypeObject *tp = u->ob_type; PySequenceMethods *sq = tp->tp_as_sequence; - if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { + if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) { Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; if (!_PyEval_SliceIndex(v, &ilow)) return NULL; @@ -4015,7 +3991,7 @@ PyTypeObject *tp = u->ob_type; PySequenceMethods *sq = tp->tp_as_sequence; - if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { + if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) { Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; if (!_PyEval_SliceIndex(v, &ilow)) return -1; From python-checkins at python.org Tue Mar 7 19:54:10 2006 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 7 Mar 2006 19:54:10 +0100 (CET) Subject: [Python-checkins] r42900 - python/trunk/Misc/NEWS Message-ID: <20060307185410.D0A591E4002@bag.python.org> Author: guido.van.rossum Date: Tue Mar 7 19:54:08 2006 New Revision: 42900 Modified: python/trunk/Misc/NEWS Log: Add note about PEP 357. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Tue Mar 7 19:54:08 2006 @@ -12,6 +12,11 @@ Core and builtins ----------------- +- PEP 357, patch 1436368: add an __index__ method to int/long and a matching + nb_index slot to the PyNumberMethods struct. The slot is consulted instead + of requiring an int or long in slicing and a few other contexts, enabling + other objects (e.g. Numeric Python's integers) to be used as slice indices. + - Fixed various bugs reported by Coverity's Prevent tool. - PEP 352, patch #1104669: Make exceptions new-style objects. Introduced the From python-checkins at python.org Tue Mar 7 19:58:55 2006 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 7 Mar 2006 19:58:55 +0100 (CET) Subject: [Python-checkins] r42901 - peps/trunk/pep-0000.txt peps/trunk/pep-0357.txt Message-ID: <20060307185855.4B4F11E4008@bag.python.org> Author: guido.van.rossum Date: Tue Mar 7 19:58:54 2006 New Revision: 42901 Modified: peps/trunk/pep-0000.txt peps/trunk/pep-0357.txt Log: Accept and finalize PEP 357. __index__ is all checked in. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Tue Mar 7 19:58:54 2006 @@ -103,7 +103,6 @@ I 350 Codetags Elliott S 354 Enumerations in Python Finney S 355 Path - Object oriented filesystem paths Lindqvist - S 357 Allowing Any Object to be Used for Slicing Oliphant S 358 The "bytes" Object Schemenauer S 754 IEEE 754 Floating Point Special Values Warnes @@ -167,6 +166,7 @@ SF 342 Coroutines via Enhanced Generators GvR, Eby SF 352 Required Superclass for Exceptions GvR, Cannon SF 353 Using ssize_t as the index type von Loewis + SF 357 Allowing Any Object to be Used for Slicing Oliphant Empty PEPs (or containing only an abstract) @@ -410,7 +410,7 @@ S 354 Enumerations in Python Finney S 355 Path - Object oriented filesystem paths Lindqvist I 356 Python 2.5 Release Schedule Norwitz, et al - S 357 Allowing Any Object to be Used for Slicing Oliphant + SF 357 Allowing Any Object to be Used for Slicing Oliphant S 358 The "bytes" Object Schemenauer SR 666 Reject Foolish Indentation Creighton S 754 IEEE 754 Floating Point Special Values Warnes Modified: peps/trunk/pep-0357.txt ============================================================================== --- peps/trunk/pep-0357.txt (original) +++ peps/trunk/pep-0357.txt Tue Mar 7 19:58:54 2006 @@ -3,7 +3,7 @@ Version: $Revision$ Last Modified: $Date$ Author: Travis Oliphant -Status: Draft +Status: Final Type: Standards Track Created: 09-Feb-2006 Python-Version: 2.5 From theller at python.net Tue Mar 7 21:09:30 2006 From: theller at python.net (Thomas Heller) Date: Tue, 07 Mar 2006 21:09:30 +0100 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: <20060307124804.763511E4002@bag.python.org> References: <20060307124804.763511E4002@bag.python.org> Message-ID: <440DE87A.5040100@python.net> georg.brandl wrote: > Author: georg.brandl > Date: Tue Mar 7 13:48:03 2006 > New Revision: 42884 > > Modified: > python/trunk/Modules/posixmodule.c > Log: > Bug #1432525: os.listdir now releases the GIL while calling > readdir(). This checkin broke os.listdir(). It returns an empty list now in most cases, on Windows XP at least. Thomas From theller at python.net Tue Mar 7 21:09:30 2006 From: theller at python.net (Thomas Heller) Date: Tue, 07 Mar 2006 21:09:30 +0100 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: <20060307124804.763511E4002@bag.python.org> References: <20060307124804.763511E4002@bag.python.org> Message-ID: <440DE87A.5040100@python.net> georg.brandl wrote: > Author: georg.brandl > Date: Tue Mar 7 13:48:03 2006 > New Revision: 42884 > > Modified: > python/trunk/Modules/posixmodule.c > Log: > Bug #1432525: os.listdir now releases the GIL while calling > readdir(). This checkin broke os.listdir(). It returns an empty list now in most cases, on Windows XP at least. Thomas From g.brandl at gmx.net Tue Mar 7 21:20:21 2006 From: g.brandl at gmx.net (Georg Brandl) Date: Tue, 07 Mar 2006 21:20:21 +0100 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: <440DE87A.5040100@python.net> References: <20060307124804.763511E4002@bag.python.org> <440DE87A.5040100@python.net> Message-ID: Thomas Heller wrote: > georg.brandl wrote: >> Author: georg.brandl >> Date: Tue Mar 7 13:48:03 2006 >> New Revision: 42884 >> >> Modified: >> python/trunk/Modules/posixmodule.c >> Log: >> Bug #1432525: os.listdir now releases the GIL while calling >> readdir(). > > This checkin broke os.listdir(). It returns an empty list now in most cases, > on Windows XP at least. Could you help me find the cause? I'm not able to see why this should change the behavior of listdir(). Georg From theller at python.net Tue Mar 7 21:31:00 2006 From: theller at python.net (Thomas Heller) Date: Tue, 07 Mar 2006 21:31:00 +0100 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: References: <20060307124804.763511E4002@bag.python.org> <440DE87A.5040100@python.net> Message-ID: <440DED84.5060701@python.net> Georg Brandl wrote: > Thomas Heller wrote: >> georg.brandl wrote: >>> Author: georg.brandl >>> Date: Tue Mar 7 13:48:03 2006 >>> New Revision: 42884 >>> >>> Modified: >>> python/trunk/Modules/posixmodule.c >>> Log: >>> Bug #1432525: os.listdir now releases the GIL while calling >>> readdir(). >> This checkin broke os.listdir(). It returns an empty list now in most cases, >> on Windows XP at least. > > Could you help me find the cause? I'm not able to see why this should change > the behavior of listdir(). > > Georg First, 'result' may be uninitialized in the do { } while(result == TRUE); loop ending on line 1756 when the 'continue' in the loop has been executed. Since result is not 'TRUE' in most cases, the function returns not finding any files. When I initialize result to TRUE at the top of the function, it gets worse. because the 'continue' statement keeps looping forever. Hope that helps (sorry I don't have time to fix this myself). Thomas From guido at python.org Tue Mar 7 21:37:05 2006 From: guido at python.org (Guido van Rossum) Date: Tue, 7 Mar 2006 12:37:05 -0800 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: <440DED84.5060701@python.net> References: <20060307124804.763511E4002@bag.python.org> <440DE87A.5040100@python.net> <440DED84.5060701@python.net> Message-ID: On 3/7/06, Thomas Heller wrote: > Georg Brandl wrote: > > Thomas Heller wrote: > >> georg.brandl wrote: > >>> Author: georg.brandl > >>> Date: Tue Mar 7 13:48:03 2006 > >>> New Revision: 42884 > >>> > >>> Modified: > >>> python/trunk/Modules/posixmodule.c > >>> Log: > >>> Bug #1432525: os.listdir now releases the GIL while calling > >>> readdir(). > >> This checkin broke os.listdir(). It returns an empty list now in most cases, > >> on Windows XP at least. > > > > Could you help me find the cause? I'm not able to see why this should change > > the behavior of listdir(). > > > > Georg > First, 'result' may be uninitialized in the > do { } while(result == TRUE); > loop ending on line 1756 when the 'continue' in the loop has been executed. > Since result is not 'TRUE' in most cases, the function returns not finding > any files. > > When I initialize result to TRUE at the top of the function, it gets worse. > because the 'continue' statement keeps looping forever. > > Hope that helps (sorry I don't have time to fix this myself). This suggests that the checked-in code is hopelessly broken. Rolling back is probably the best course of action at this point. What was the motivation anyway? -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Tue Mar 7 21:48:57 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 7 Mar 2006 21:48:57 +0100 (CET) Subject: [Python-checkins] r42902 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060307204857.4376E1E4002@bag.python.org> Author: andrew.kuchling Date: Tue Mar 7 21:48:55 2006 New Revision: 42902 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Some edits; add empty sections Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Tue Mar 7 21:48:55 2006 @@ -16,23 +16,29 @@ for Python 2.5 has been set; it will probably be released in the autumn of 2006. -% Compare with previous release in 2 - 3 sentences here. +% XXX Compare with previous release in 2 - 3 sentences here. This article doesn't attempt to provide a complete specification of the new features, but instead provides a convenient overview. For full details, you should refer to the documentation for Python 2.5. -% add hyperlink when the documentation becomes available online. +% XXX add hyperlink when the documentation becomes available online. If you want to understand the complete implementation and design rationale, refer to the PEP for a particular new feature. %====================================================================== +\section{PEP 308: Conditional Expressions} + +% XXX write this + + +%====================================================================== \section{PEP 309: Partial Function Application} The \module{functional} module is intended to contain tools for -functional-style programming. Currently it only contains -\class{partial}, but new functions will probably be added in future -versions of Python. +functional-style programming. Currently it only contains a +\class{partial()} function, but new functions will probably be added +in future versions of Python. For programs written in a functional style, it can be useful to construct variants of existing functions that have some of the @@ -59,6 +65,7 @@ ... server_log = functional.partial(log, subsystem='server') +server_log('Unable to open socket') \end{verbatim} Here's another example, from a program that uses PyGTk. Here a @@ -91,15 +98,15 @@ \section{PEP 314: Metadata for Python Software Packages v1.1} Some simple dependency support was added to Distutils. The -\function{setup()} function now has \code{requires},\code{provides}, -and \code{obsoletes}. When you build a source distribution using the -\code{sdist} command, the dependency information will be recorded in -the \file{PKG-INFO} file. - -Another new keyword is \code{download_url}, which should be set to a -URL for the package's source code. This means it's now possible to -look up an entry in the package index, determine the dependencies for -a package, and download the required packages. +\function{setup()} function now has \code{requires}, \code{provides}, +and \code{obsoletes} keyword parameters. When you build a source +distribution using the \code{sdist} command, the dependency +information will be recorded in the \file{PKG-INFO} file. + +Another new keyword parameter is \code{download_url}, which should be +set to a URL for the package's source code. This means it's now +possible to look up an entry in the package index, determine the +dependencies for a package, and download the required packages. % XXX put example here @@ -113,15 +120,27 @@ %====================================================================== +\section{PEP 328: Absolute and Relative Imports} + +% XXX write this + + +%====================================================================== +\section{PEP 341: Unified try/except/finally} + +% XXX write this + + +%====================================================================== \section{PEP 342: New Generator Features} As introduced in Python 2.3, generators only produce output; once a -generator's code was invoked to create an iterator, there's no way to -pass new parameters into the function when its execution is resumed. -Hackish solutions to this include making the generator's code look at -a global variable and then changing the global variable's value, or -passing in some mutable object that callers then modify. Python -2.5 adds the ability to pass values \emph{into} a generator. +generator's code is invoked to create an iterator, there's no way to +pass any new information into the function when its execution is +resumed. Hackish solutions to this include making the generator's +code look at a global variable and then changing the global variable's +value, or passing in some mutable object that callers then modify. +Python 2.5 adds the ability to pass values \emph{into} a generator. To refresh your memory of basic generators, here's a simple example: @@ -138,7 +157,7 @@ \keyword{yield} statement, the iterator returns the provided value and suspends the function's execution, preserving the local variables. Execution resumes on the following call to the iterator's -\method{next()} method, picking up after the \keyword{yield}. +\method{next()} method, picking up after the \keyword{yield} statement. In Python 2.3, \keyword{yield} was a statement; it didn't return any value. In 2.5, \keyword{yield} is now an expression, returning a @@ -152,17 +171,17 @@ expression when you're doing something with the returned value, as in the above example. The parentheses aren't always necessary, but it's easier to always add them instead of having to remember when they're -needed. The exact rules are that a \keyword{yield}-expression must +needed.\footnote{The exact rules are that a \keyword{yield}-expression must always be parenthesized except when it occurs at the top-level -expression on the right-hand side of an assignment, meaning -you can to write \code{val = yield i} but \code{val = (yield i) + 12}. -% XXX ending of last para makes no sense +expression on the right-hand side of an assignment, meaning you can +write \code{val = yield i} but have to use parentheses when there's an +operation, as in \code{val = (yield i) + 12}.} Values are sent into a generator by calling its \method{send(\var{value})} method. The generator's code is then -resumed and the \keyword{yield} expression produces \var{value}. -If the regular \method{next()} method is called, the \keyword{yield} -returns \constant{None}. +resumed and the \keyword{yield} expression returns the specified +\var{value}. If the regular \method{next()} method is called, the +\keyword{yield} returns \constant{None}. Here's the previous example, modified to allow changing the value of the internal counter. @@ -198,12 +217,13 @@ StopIteration \end{verbatim} -Because \keyword{yield} will often be returning \constant{None}, -you shouldn't just use its value in expressions unless you're sure -that only the \method{send()} method will be used. +Because \keyword{yield} will often be returning \constant{None}, you +should always check for this case. Don't just use its value in +expressions unless you're sure that the \method{send()} method +will be the only method used resume your generator function. -There are two other new methods on generators in addition to -\method{send()}: +In addition to \method{send()}, there are two other new methods on +generators: \begin{itemize} @@ -229,13 +249,14 @@ The cumulative effect of these changes is to turn generators from one-way producers of information into both producers and consumers. + Generators also become \emph{coroutines}, a more generalized form of -subroutines; subroutines are entered at one point and exited at +subroutines. Subroutines are entered at one point and exited at another point (the top of the function, and a \keyword{return statement}), but coroutines can be entered, exited, and resumed at -many different points (the \keyword{yield} statements).science term +many different points (the \keyword{yield} statements). + - \begin{seealso} \seepep{342}{Coroutines via Enhanced Generators}{PEP written by @@ -254,6 +275,18 @@ %====================================================================== +\section{PEP 343: The 'with' statement} + +% XXX write this + + +%====================================================================== +\section{PEP 357: The '__index__' method} + +% XXX write this + + +%====================================================================== \section{Other Language Changes} Here are all of the changes that Python 2.5 makes to the core Python From martin at v.loewis.de Tue Mar 7 21:50:47 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Tue, 07 Mar 2006 21:50:47 +0100 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: References: <20060307124804.763511E4002@bag.python.org> <440DE87A.5040100@python.net> <440DED84.5060701@python.net> Message-ID: <440DF227.7020609@v.loewis.de> Guido van Rossum wrote: > This suggests that the checked-in code is hopelessly broken. Rolling > back is probably the best course of action at this point. > > What was the motivation anyway? The goal was to release the GIL around the API call, see python.org/sf/1432525 I reviewed it, and missed that there is a continue statement in the do-while-loop; I find a continue quite strange there. One way to fix the code would be to add a label _continue just before the new block. Regards, Martin From python-checkins at python.org Tue Mar 7 21:56:03 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 7 Mar 2006 21:56:03 +0100 (CET) Subject: [Python-checkins] r42903 - python/trunk/Modules/posixmodule.c Message-ID: <20060307205603.35DC81E4002@bag.python.org> Author: georg.brandl Date: Tue Mar 7 21:56:02 2006 New Revision: 42903 Modified: python/trunk/Modules/posixmodule.c Log: Fix bug introduced in rev. 42884. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Tue Mar 7 21:56:02 2006 @@ -1640,7 +1640,7 @@ PyObject *d, *v; HANDLE hFindFile; - BOOL result; + BOOL result = FALSE; WIN32_FIND_DATA FileData; /* MAX_PATH characters could mean a bigger encoded string */ char namebuf[MAX_PATH*2+5]; @@ -1679,7 +1679,7 @@ (wFileData.cFileName[1] == L'\0' || wFileData.cFileName[1] == L'.' && wFileData.cFileName[2] == L'\0')) - continue; + goto loop_w; v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName)); if (v == NULL) { Py_DECREF(d); @@ -1693,6 +1693,7 @@ break; } Py_DECREF(v); +loop_w: Py_BEGIN_ALLOW_THREADS result = FindNextFileW(hFindFile, &wFileData); Py_END_ALLOW_THREADS @@ -1736,7 +1737,7 @@ (FileData.cFileName[1] == '\0' || FileData.cFileName[1] == '.' && FileData.cFileName[2] == '\0')) - continue; + goto loop_a; v = PyString_FromString(FileData.cFileName); if (v == NULL) { Py_DECREF(d); @@ -1750,6 +1751,7 @@ break; } Py_DECREF(v); +loop_a: Py_BEGIN_ALLOW_THREADS result = FindNextFile(hFindFile, &FileData); Py_END_ALLOW_THREADS From guido at python.org Tue Mar 7 22:05:00 2006 From: guido at python.org (Guido van Rossum) Date: Tue, 7 Mar 2006 13:05:00 -0800 Subject: [Python-checkins] r42884 - python/trunk/Modules/posixmodule.c In-Reply-To: <440DF227.7020609@v.loewis.de> References: <20060307124804.763511E4002@bag.python.org> <440DE87A.5040100@python.net> <440DED84.5060701@python.net> <440DF227.7020609@v.loewis.de> Message-ID: On 3/7/06, "Martin v. L?wis" wrote: > Guido van Rossum wrote: > > This suggests that the checked-in code is hopelessly broken. Rolling > > back is probably the best course of action at this point. > > > > What was the motivation anyway? > > The goal was to release the GIL around the API call, see > python.org/sf/1432525 > > I reviewed it, and missed that there is a continue statement in the > do-while-loop; I find a continue quite strange there. One way to > fix the code would be to add a label _continue just before the > new block. The resulting spaghetti is a bit much. I suggest a better refactoring. -- --Guido van Rossum (home page: http://www.python.org/~guido/) From neal at metaslash.com Tue Mar 7 22:19:35 2006 From: neal at metaslash.com (Neal Norwitz) Date: Tue, 7 Mar 2006 16:19:35 -0500 Subject: [Python-checkins] Python Regression Test Failures basics (1) Message-ID: <20060307211935.GA26548@python.psfb.org> case $MAKEFLAGS in \ *-s*) CC='gcc -pthread' LDSHARED='gcc -pthread -shared' OPT='-g -Wall -Wstrict-prototypes' ./python -E ./setup.py -q build;; \ *) CC='gcc -pthread' LDSHARED='gcc -pthread -shared' OPT='-g -Wall -Wstrict-prototypes' ./python -E ./setup.py build;; \ esac running build running build_ext db.h: found (4, 1) in /usr/include db lib: using (4, 1) db-4.1 INFO: Can't locate Tcl/Tk libs and/or headers running build_scripts [34890 refs] ./python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform [9161 refs] find ./Lib -name '*.py[co]' -print | xargs rm -f ./python -E -tt ./Lib/test/regrtest.py -l test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bsddb3 skipped -- Use of the `bsddb' resource not enabled test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_curses test_curses skipped -- Use of the `curses' resource not enabled test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_linuxaudiodev test_linuxaudiodev skipped -- Use of the `audio' resource not enabled test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_ossaudiodev test_ossaudiodev skipped -- Use of the `audio' resource not enabled test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9166 refs] [9166 refs] [9166 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9361 refs] [9361 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test test_socket failed -- errors occurred; run in verbose mode for details test_socket_ssl test_socket_ssl skipped -- Use of the `network' resource not enabled test_socketserver test_socketserver skipped -- Use of the `network' resource not enabled test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9161 refs] [9163 refs] [9161 refs] [9161 refs] [9161 refs] [9161 refs] [9161 refs] [9162 refs] [9162 refs] [9161 refs] [9162 refs] [9161 refs] [9378 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] this bit of output is from a test of stdout in a different process ... [9162 refs] [9161 refs] [9378 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9161 refs] [9161 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9163 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_timeout skipped -- Use of the `network' resource not enabled test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllib2net skipped -- Use of the `network' resource not enabled test_urllibnet test_urllibnet skipped -- Use of the `network' resource not enabled test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 277 tests OK. 1 test failed: test_socket 30 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_bsddb3 test_cd test_cl test_curses test_gl test_hashlib_speed test_imgfile test_ioctl test_linuxaudiodev test_macfs test_macostools test_nis test_ossaudiodev test_pep277 test_plistlib test_scriptpackages test_socket_ssl test_socketserver test_sunaudiodev test_tcl test_timeout test_unicode_file test_urllib2net test_urllibnet test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [361118 refs] make: [test] Error 1 (ignored) ./python -E -tt ./Lib/test/regrtest.py -l test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bsddb3 skipped -- Use of the `bsddb' resource not enabled test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_curses test_curses skipped -- Use of the `curses' resource not enabled test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_linuxaudiodev test_linuxaudiodev skipped -- Use of the `audio' resource not enabled test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_ossaudiodev test_ossaudiodev skipped -- Use of the `audio' resource not enabled test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9166 refs] [9166 refs] [9166 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9361 refs] [9361 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socket_ssl skipped -- Use of the `network' resource not enabled test_socketserver test_socketserver skipped -- Use of the `network' resource not enabled test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9161 refs] [9163 refs] [9161 refs] [9161 refs] [9161 refs] [9161 refs] [9161 refs] [9162 refs] [9162 refs] [9161 refs] [9162 refs] [9161 refs] [9378 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] [9162 refs] this bit of output is from a test of stdout in a different process ... [9162 refs] [9161 refs] [9378 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9161 refs] [9161 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9163 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_timeout skipped -- Use of the `network' resource not enabled test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllib2net skipped -- Use of the `network' resource not enabled test_urllibnet test_urllibnet skipped -- Use of the `network' resource not enabled test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 278 tests OK. 30 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_bsddb3 test_cd test_cl test_curses test_gl test_hashlib_speed test_imgfile test_ioctl test_linuxaudiodev test_macfs test_macostools test_nis test_ossaudiodev test_pep277 test_plistlib test_scriptpackages test_socket_ssl test_socketserver test_sunaudiodev test_tcl test_timeout test_unicode_file test_urllib2net test_urllibnet test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [353593 refs] From python-checkins at python.org Wed Mar 8 00:53:34 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 8 Mar 2006 00:53:34 +0100 (CET) Subject: [Python-checkins] r42904 - in python/trunk: Lib/test/test_hotshot.py Modules/_hotshot.c Message-ID: <20060307235334.31D751E4002@bag.python.org> Author: tim.peters Date: Wed Mar 8 00:53:32 2006 New Revision: 42904 Modified: python/trunk/Lib/test/test_hotshot.py python/trunk/Modules/_hotshot.c Log: _hotshot hotshot_profiler(): If write_header() returned an error code, this let `self` leak. This is a disaster on Windows, since `self` already points to a newly-opened file object, and it was impossible for Python code to close the thing since the only reference to it was in a blob of leaked C memory. test_hotshot test_bad_sys_path(): This new test provoked the C bug above. This test passed, but left an open "@test" file behind, which caused a massive cascade of bogus test failures in later, unrelated tests on Windows. Changed the test code to remove the @test file it leaves behind, which relies on the change above to close that file first. Modified: python/trunk/Lib/test/test_hotshot.py ============================================================================== --- python/trunk/Lib/test/test_hotshot.py (original) +++ python/trunk/Lib/test/test_hotshot.py Wed Mar 8 00:53:32 2006 @@ -109,17 +109,20 @@ def test_bad_sys_path(self): import sys + import os orig_path = sys.path coverage = hotshot._hotshot.coverage try: # verify we require a list for sys.path sys.path = 'abc' self.assertRaises(RuntimeError, coverage, test_support.TESTFN) - # verify sys.path exists + # verify that we require sys.path exists del sys.path self.assertRaises(RuntimeError, coverage, test_support.TESTFN) finally: sys.path = orig_path + if os.path.exists(test_support.TESTFN): + os.remove(test_support.TESTFN) def test_main(): test_support.run_unittest(HotShotTestCase) Modified: python/trunk/Modules/_hotshot.c ============================================================================== --- python/trunk/Modules/_hotshot.c (original) +++ python/trunk/Modules/_hotshot.c Wed Mar 8 00:53:32 2006 @@ -1525,9 +1525,11 @@ calibrate(); calibrate(); } - if (write_header(self)) + if (write_header(self)) { /* some error occurred, exception has been set */ + Py_DECREF(self); self = NULL; + } } return (PyObject *) self; } From python-checkins at python.org Wed Mar 8 00:59:38 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 8 Mar 2006 00:59:38 +0100 (CET) Subject: [Python-checkins] r42905 - python/trunk/Modules/posixmodule.c Message-ID: <20060307235938.95C0E1E4002@bag.python.org> Author: martin.v.loewis Date: Wed Mar 8 00:59:33 2006 New Revision: 42905 Modified: python/trunk/Modules/posixmodule.c Log: Reformulate 42903 using an if statement. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Wed Mar 8 00:59:33 2006 @@ -1640,7 +1640,7 @@ PyObject *d, *v; HANDLE hFindFile; - BOOL result = FALSE; + BOOL result; WIN32_FIND_DATA FileData; /* MAX_PATH characters could mean a bigger encoded string */ char namebuf[MAX_PATH*2+5]; @@ -1675,25 +1675,23 @@ return win32_error_unicode("FindFirstFileW", wnamebuf); } do { - if (wFileData.cFileName[0] == L'.' && - (wFileData.cFileName[1] == L'\0' || - wFileData.cFileName[1] == L'.' && - wFileData.cFileName[2] == L'\0')) - goto loop_w; - v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName)); - if (v == NULL) { - Py_DECREF(d); - d = NULL; - break; - } - if (PyList_Append(d, v) != 0) { + /* Skip over . and .. */ + if (wcscmp(wFileData.cFileName, L".") != 0 && + wcscmp(wFileData.cFileName, L"..") != 0) { + v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName)); + if (v == NULL) { + Py_DECREF(d); + d = NULL; + break; + } + if (PyList_Append(d, v) != 0) { + Py_DECREF(v); + Py_DECREF(d); + d = NULL; + break; + } Py_DECREF(v); - Py_DECREF(d); - d = NULL; - break; } - Py_DECREF(v); -loop_w: Py_BEGIN_ALLOW_THREADS result = FindNextFileW(hFindFile, &wFileData); Py_END_ALLOW_THREADS @@ -1733,25 +1731,23 @@ return win32_error("FindFirstFile", namebuf); } do { - if (FileData.cFileName[0] == '.' && - (FileData.cFileName[1] == '\0' || - FileData.cFileName[1] == '.' && - FileData.cFileName[2] == '\0')) - goto loop_a; - v = PyString_FromString(FileData.cFileName); - if (v == NULL) { - Py_DECREF(d); - d = NULL; - break; - } - if (PyList_Append(d, v) != 0) { + /* Skip over . and .. */ + if (strcmp(FileData.cFileName, ".") != 0 && + strcmp(FileData.cFileName, "..") != 0) { + v = PyString_FromString(FileData.cFileName); + if (v == NULL) { + Py_DECREF(d); + d = NULL; + break; + } + if (PyList_Append(d, v) != 0) { + Py_DECREF(v); + Py_DECREF(d); + d = NULL; + break; + } Py_DECREF(v); - Py_DECREF(d); - d = NULL; - break; } - Py_DECREF(v); -loop_a: Py_BEGIN_ALLOW_THREADS result = FindNextFile(hFindFile, &FileData); Py_END_ALLOW_THREADS From python-checkins at python.org Wed Mar 8 02:47:20 2006 From: python-checkins at python.org (thomas.wouters) Date: Wed, 8 Mar 2006 02:47:20 +0100 (CET) Subject: [Python-checkins] r42906 - python/trunk/Modules/_bsddb.c Message-ID: <20060308014720.9BAEE1E4002@bag.python.org> Author: thomas.wouters Date: Wed Mar 8 02:47:19 2006 New Revision: 42906 Modified: python/trunk/Modules/_bsddb.c Log: Clean up _bsddb.c: add a couple dozen missing Py_DECREF()'s, a handful of missing PyObject_Del()'s, simplify some code by using Py_BuildValue() instead of creating a tuple with items manually, stop clobbering builtin exceptions in a few places, and guard against NULL-returning functions some more. This fixes 117 of the 780 (!?!#%@#$!!) reference leaks in test_bsddb3. I ain't not done yet, although this review of 5kloc was just the easy part. Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Wed Mar 8 02:47:19 2006 @@ -779,6 +779,7 @@ Py_DECREF(self->myenvobj); self->myenvobj = NULL; } + PyObject_Del(self); self = NULL; } return self; @@ -895,6 +896,7 @@ err = db_env_create(&self->db_env, flags); MYDB_END_ALLOW_THREADS; if (makeDBError(err)) { + PyObject_Del(self); self = NULL; } else { @@ -1001,6 +1003,7 @@ #endif MYDB_END_ALLOW_THREADS; if (makeDBError(err)) { + PyObject_Del(self); self = NULL; } @@ -1067,8 +1070,6 @@ DBObject* secondaryDB = (DBObject*)db->app_private; PyObject* callback = secondaryDB->associateCallback; int type = secondaryDB->primaryDBType; - PyObject* key; - PyObject* data; PyObject* args; PyObject* result = NULL; @@ -1076,17 +1077,13 @@ if (callback != NULL) { MYDB_BEGIN_BLOCK_THREADS; - if (type == DB_RECNO || type == DB_QUEUE) { - key = PyInt_FromLong( *((db_recno_t*)priKey->data)); - } - else { - key = PyString_FromStringAndSize(priKey->data, priKey->size); - } - data = PyString_FromStringAndSize(priData->data, priData->size); - args = PyTuple_New(2); + if (type == DB_RECNO || type == DB_QUEUE) + args = Py_BuildValue("(ls#)", *((db_recno_t*)priKey->data), + priData->data, priData->size); + else + args = Py_BuildValue("(s#s#)", priKey->data, priKey->size, + priData->data, priData->size); if (args != NULL) { - PyTuple_SET_ITEM(args, 0, key); /* steals reference */ - PyTuple_SET_ITEM(args, 1, data); /* steals reference */ result = PyEval_CallObject(callback, args); } if (args == NULL || result == NULL) { @@ -1130,10 +1127,8 @@ PyErr_Print(); } - Py_DECREF(args); - if (result) { - Py_DECREF(result); - } + Py_XDECREF(args); + Py_XDECREF(result); MYDB_END_BLOCK_THREADS; } @@ -1187,7 +1182,7 @@ /* Save a reference to the callback in the secondary DB. */ Py_XDECREF(secondaryDB->associateCallback); - Py_INCREF(callback); + Py_XINCREF(callback); secondaryDB->associateCallback = callback; secondaryDB->primaryDBType = _DB_get_type(self); @@ -1542,6 +1537,7 @@ #else retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj); #endif + Py_DECREF(keyObj); } else /* return just the pkey and data */ { @@ -1551,6 +1547,8 @@ retval = Py_BuildValue("OO", pkeyObj, dataObj); #endif } + Py_DECREF(dataObj); + Py_DECREF(pkeyObj); FREE_DBT(pkey); FREE_DBT(data); } @@ -1733,6 +1731,10 @@ cursors[length] = NULL; for (x=0; xdb) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "Cannot call open() twice for DB object")); + PyObject *t = Py_BuildValue("(is)", 0, + "Cannot call open() twice for DB object"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } @@ -2014,8 +2018,6 @@ int res = 0; PyObject *args; PyObject *result; - PyObject *leftObject; - PyObject *rightObject; DBObject *self = (DBObject *)db->app_private; if (self == NULL || self->btCompareCallback == NULL) { @@ -2031,14 +2033,11 @@ } else { MYDB_BEGIN_BLOCK_THREADS; - leftObject = PyString_FromStringAndSize(leftKey->data, leftKey->size); - rightObject = PyString_FromStringAndSize(rightKey->data, rightKey->size); - - args = PyTuple_New(2); + args = Py_BuildValue("s#s#", leftKey->data, leftKey->size, + rightKey->data, rightKey->size); if (args != NULL) { + /* XXX(twouters) I highly doubt this INCREF is correct */ Py_INCREF(self); - PyTuple_SET_ITEM(args, 0, leftObject); /* steals reference */ - PyTuple_SET_ITEM(args, 1, rightObject); /* steals reference */ result = PyEval_CallObject(self->btCompareCallback, args); } if (args == NULL || result == NULL) { @@ -2055,7 +2054,7 @@ res = _default_cmp(leftKey, rightKey); } - Py_DECREF(args); + Py_XDECREF(args); Py_XDECREF(result); MYDB_END_BLOCK_THREADS; @@ -2068,7 +2067,7 @@ { int err; PyObject *comparator; - PyObject *tuple, *emptyStr, *result; + PyObject *tuple, *result; if (!PyArg_ParseTuple(args, "O:set_bt_compare", &comparator)) return NULL; @@ -2085,17 +2084,12 @@ * string objects here. verify that it returns an int (0). * err if not. */ - tuple = PyTuple_New(2); - emptyStr = PyString_FromStringAndSize(NULL, 0); - if (tuple == NULL || emptyStr == NULL) - return NULL; - - Py_INCREF(emptyStr); /* now we have two references */ - PyTuple_SET_ITEM(tuple, 0, emptyStr); /* steals reference */ - PyTuple_SET_ITEM(tuple, 1, emptyStr); /* steals reference */ + tuple = Py_BuildValue("(ss)", "", ""); result = PyEval_CallObject(comparator, tuple); Py_DECREF(tuple); - if (result == NULL || !PyInt_Check(result)) { + if (result == NULL) + return NULL; + if (!PyInt_Check(result)) { PyErr_SetString(PyExc_TypeError, "callback MUST return an int"); return NULL; @@ -2104,6 +2098,7 @@ "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 @@ -2122,9 +2117,7 @@ PyEval_InitThreads(); #endif - err = self->db->set_bt_compare(self->db, - (comparator != NULL ? - _db_compareCallback : NULL)); + err = self->db->set_bt_compare(self->db, _db_compareCallback); if (err) { /* restore the old state in case of error */ @@ -2621,8 +2614,9 @@ void* sp; if (self->db == NULL) { - PyErr_SetObject(DBError, - Py_BuildValue("(is)", 0, "DB object has been closed")); + PyObject *t = Py_BuildValue("(is)", 0, "DB object has been closed"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return -1; } @@ -2698,8 +2692,9 @@ int flags = 0; if (self->db == NULL) { - PyErr_SetObject(DBError, - Py_BuildValue("(is)", 0, "DB object has been closed")); + PyObject *t = Py_BuildValue("(is)", 0, "DB object has been closed"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return -1; } @@ -2798,16 +2793,17 @@ return NULL; list = PyList_New(0); - if (list == NULL) { - PyErr_SetString(PyExc_MemoryError, "PyList_New failed"); + 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; - RETURN_IF_ERR(); + if (makeDBError(err)) { + Py_DECREF(list); + return NULL; + } if (CHECK_DBFLAG(self, DB_THREAD)) { key.flags = DB_DBT_REALLOC; @@ -2858,10 +2854,13 @@ break; } break; + default: + PyErr_Format(PyExc_ValueError, "Unknown key type 0x%x", type); + item = NULL; + break; } if (item == NULL) { Py_DECREF(list); - PyErr_SetString(PyExc_MemoryError, "List item creation failed"); list = NULL; goto done; } @@ -3199,6 +3198,7 @@ #else retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj); #endif + Py_DECREF(keyObj); FREE_DBT(key); } else /* return just the pkey and data */ @@ -3209,6 +3209,8 @@ retval = Py_BuildValue("OO", pkeyObj, dataObj); #endif } + Py_DECREF(dataObj); + Py_DECREF(pkeyObj); FREE_DBT(pkey); FREE_DBT(data); } @@ -4384,18 +4386,14 @@ RETURN_IF_ERR(); list = PyList_New(0); - if (list == NULL) { - PyErr_SetString(PyExc_MemoryError, "PyList_New failed"); + if (list == NULL) return NULL; - } if (log_list) { for (log_list_start = log_list; *log_list != NULL; ++log_list) { item = PyString_FromString (*log_list); if (item == NULL) { Py_DECREF(list); - PyErr_SetString(PyExc_MemoryError, - "List item creation failed"); list = NULL; break; } @@ -4492,8 +4490,10 @@ return NULL; if (!self->txn) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "DBTxn must not be used after txn_commit or txn_abort")); + PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " + "after txn_commit or txn_abort"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } txn = self->txn; @@ -4527,8 +4527,10 @@ } if (!self->txn) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "DBTxn must not be used after txn_commit or txn_abort")); + PyObject *t = Py_BuildValue("(is)", 0,"DBTxn must not be used " + "after txn_commit or txn_abort"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } MYDB_BEGIN_ALLOW_THREADS; @@ -4547,8 +4549,10 @@ return NULL; if (!self->txn) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "DBTxn must not be used after txn_commit or txn_abort")); + PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " + "after txn_commit or txn_abort"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } MYDB_BEGIN_ALLOW_THREADS; @@ -4570,8 +4574,10 @@ return NULL; if (!self->txn) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "DBTxn must not be used after txn_commit or txn_abort")); + PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " + "after txn_commit or txn_abort"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } txn = self->txn; @@ -4597,8 +4603,10 @@ return NULL; if (!self->txn) { - PyErr_SetObject(DBError, Py_BuildValue("(is)", 0, - "DBTxn must not be used after txn_commit or txn_abort")); + PyObject *t = Py_BuildValue("(is)", 0, "DBTxn must not be used " + "after txn_commit or txn_abort"); + PyErr_SetObject(DBError, t); + Py_DECREF(t); return NULL; } MYDB_BEGIN_ALLOW_THREADS; From python-checkins at python.org Wed Mar 8 02:50:22 2006 From: python-checkins at python.org (andrew.kuchling) Date: Wed, 8 Mar 2006 02:50:22 +0100 (CET) Subject: [Python-checkins] r42907 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060308015022.8C4EA1E4023@bag.python.org> Author: andrew.kuchling Date: Wed Mar 8 02:50:20 2006 New Revision: 42907 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Add section Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Wed Mar 8 02:50:20 2006 @@ -281,6 +281,12 @@ %====================================================================== +\section{PEP 352: Exceptions as New-Style Classes} + +% XXX write this + + +%====================================================================== \section{PEP 357: The '__index__' method} % XXX write this From python-checkins at python.org Wed Mar 8 06:29:18 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 8 Mar 2006 06:29:18 +0100 (CET) Subject: [Python-checkins] r42908 - python/trunk/Doc/api/abstract.tex Message-ID: <20060308052918.D94CA1E4002@bag.python.org> Author: neal.norwitz Date: Wed Mar 8 06:29:18 2006 New Revision: 42908 Modified: python/trunk/Doc/api/abstract.tex Log: Move version added tag from PyObject_Length/Size to PyNumber_Index. Modified: python/trunk/Doc/api/abstract.tex ============================================================================== --- python/trunk/Doc/api/abstract.tex (original) +++ python/trunk/Doc/api/abstract.tex Wed Mar 8 06:29:18 2006 @@ -346,7 +346,6 @@ either the sequence and mapping protocols, the sequence length is returned. On error, \code{-1} is returned. This is the equivalent to the Python expression \samp{len(\var{o})}.\bifuncindex{len} - \versionadded{2.5} \end{cfuncdesc} @@ -693,6 +692,7 @@ \begin{cfuncdesc}{Py_ssize_t}{PyNumber_Index}{PyObject *o} Returns the \var{o} converted to a Py_ssize_t integer on success, or -1 with an exception raised on failure. + \versionadded{2.5} \end{cfuncdesc} \section{Sequence Protocol \label{sequence}} From python-checkins at python.org Wed Mar 8 06:33:35 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 8 Mar 2006 06:33:35 +0100 (CET) Subject: [Python-checkins] r42909 - peps/trunk/pep-0356.txt Message-ID: <20060308053335.1A1921E4002@bag.python.org> Author: neal.norwitz Date: Wed Mar 8 06:33:34 2006 New Revision: 42909 Modified: peps/trunk/pep-0356.txt Log: Update the PEPs/features that were implemented Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Wed Mar 8 06:33:34 2006 @@ -51,8 +51,12 @@ PEP 341: Unified try-except/try-finally to try-except-finally PEP 342: Coroutines via Enhanced Generators PEP 343: The "with" Statement - (still Doc/ref updates) + (still need Doc/ref updates) + PEP 352: Required Superclass for Exceptions PEP 353: Using ssize_t as the index type + PEP 357: Allowing Any Object to be Used for Slicing + + - ASCII is the default coding - AST-based compiler - Access to C AST from Python through new _ast module @@ -82,11 +86,6 @@ Add builtin @deprecated decorator? - PEP 352: Required Superclass for Exceptions - (Brett Cannon is expected to implement this.) - - - ASCII is the default coding - Add bdist_msi to the distutils package. (MvL plans to import after pycon) Add bdist_deb to the distutils package? @@ -118,7 +117,7 @@ - Review PEP 4: Deprecate and/or remove the modules - Should PEP 338 or 357 be accepted and implemented. + Should PEP 338 be accepted and implemented. Copyright From python-checkins at python.org Wed Mar 8 07:36:46 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 8 Mar 2006 07:36:46 +0100 (CET) Subject: [Python-checkins] r42910 - python/trunk/Modules/pyexpat.c Message-ID: <20060308063646.889011E4002@bag.python.org> Author: neal.norwitz Date: Wed Mar 8 07:36:45 2006 New Revision: 42910 Modified: python/trunk/Modules/pyexpat.c Log: Fix logic error and DECREF reported by Coverity. Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Wed Mar 8 07:36:45 2006 @@ -106,8 +106,8 @@ { PyObject *v = PyInt_FromLong(value); - if (v != NULL && PyObject_SetAttrString(err, name, v) == -1) { - Py_DECREF(v); + if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) { + Py_XDECREF(v); return 0; } Py_DECREF(v); @@ -137,7 +137,7 @@ && set_error_attr(err, "lineno", lineno)) { PyErr_SetObject(ErrorObject, err); } - Py_DECREF(err); + Py_XDECREF(err); return NULL; } @@ -994,7 +994,7 @@ if (PyFile_Check(f)) { fp = PyFile_AsFile(f); } - else{ + else { fp = NULL; readmethod = PyObject_GetAttrString(f, "read"); if (readmethod == NULL) { From python-checkins at python.org Wed Mar 8 07:39:50 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 8 Mar 2006 07:39:50 +0100 (CET) Subject: [Python-checkins] r42911 - python/branches/release24-maint/Modules/pyexpat.c Message-ID: <20060308063950.EA80E1E4002@bag.python.org> Author: neal.norwitz Date: Wed Mar 8 07:39:50 2006 New Revision: 42911 Modified: python/branches/release24-maint/Modules/pyexpat.c Log: Backport fixes reported by Coverity. Modified: python/branches/release24-maint/Modules/pyexpat.c ============================================================================== --- python/branches/release24-maint/Modules/pyexpat.c (original) +++ python/branches/release24-maint/Modules/pyexpat.c Wed Mar 8 07:39:50 2006 @@ -105,8 +105,8 @@ { PyObject *v = PyInt_FromLong(value); - if (v != NULL && PyObject_SetAttrString(err, name, v) == -1) { - Py_DECREF(v); + if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) { + Py_XDECREF(v); return 0; } Py_DECREF(v); @@ -136,7 +136,7 @@ && set_error_attr(err, "lineno", lineno)) { PyErr_SetObject(ErrorObject, err); } - Py_DECREF(err); + Py_XDECREF(err); return NULL; } @@ -993,7 +993,7 @@ if (PyFile_Check(f)) { fp = PyFile_AsFile(f); } - else{ + else { fp = NULL; readmethod = PyObject_GetAttrString(f, "read"); if (readmethod == NULL) { From python-checkins at python.org Wed Mar 8 10:34:54 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 10:34:54 +0100 (CET) Subject: [Python-checkins] r42912 - python/trunk/Lib/pydoc.py Message-ID: <20060308093454.2ACCF1E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 10:34:53 2006 New Revision: 42912 Modified: python/trunk/Lib/pydoc.py Log: Fix pydoc.synopsis() so that it doesn't error out with an unreadable module. Modified: python/trunk/Lib/pydoc.py ============================================================================== --- python/trunk/Lib/pydoc.py (original) +++ python/trunk/Lib/pydoc.py Wed Mar 8 10:34:53 2006 @@ -188,7 +188,11 @@ lastupdate, result = cache.get(filename, (0, None)) if lastupdate < mtime: info = inspect.getmoduleinfo(filename) - file = open(filename) + try: + file = open(filename) + except IOError: + # module can't be opened, so skip it + return None if info and 'b' in info[2]: # binary modules have to be imported try: module = imp.load_module('__temp__', file, filename, info[1:]) except: return None From python-checkins at python.org Wed Mar 8 10:34:57 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 10:34:57 +0100 (CET) Subject: [Python-checkins] r42913 - python/branches/release24-maint/Lib/pydoc.py Message-ID: <20060308093457.D5D481E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 10:34:57 2006 New Revision: 42913 Modified: python/branches/release24-maint/Lib/pydoc.py Log: Fix pydoc.synopsis() so that it doesn't error out with an unreadable module. (backport from rev. 42912) Modified: python/branches/release24-maint/Lib/pydoc.py ============================================================================== --- python/branches/release24-maint/Lib/pydoc.py (original) +++ python/branches/release24-maint/Lib/pydoc.py Wed Mar 8 10:34:57 2006 @@ -179,7 +179,11 @@ lastupdate, result = cache.get(filename, (0, None)) if lastupdate < mtime: info = inspect.getmoduleinfo(filename) - file = open(filename) + try: + file = open(filename) + except IOError: + # module can't be opened, so skip it + return None if info and 'b' in info[2]: # binary modules have to be imported try: module = imp.load_module('__temp__', file, filename, info[1:]) except: return None From python-checkins at python.org Wed Mar 8 13:24:34 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 13:24:34 +0100 (CET) Subject: [Python-checkins] r42914 - python/trunk/Modules/threadmodule.c Message-ID: <20060308122434.B362D1E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 13:24:33 2006 New Revision: 42914 Modified: python/trunk/Modules/threadmodule.c Log: typo Modified: python/trunk/Modules/threadmodule.c ============================================================================== --- python/trunk/Modules/threadmodule.c (original) +++ python/trunk/Modules/threadmodule.c Wed Mar 8 13:24:33 2006 @@ -309,7 +309,7 @@ return NULL; else { int i = PyDict_SetItem(tdict, self->key, ldict); - Py_DECREF(ldict); /* now ldict is borowed */ + Py_DECREF(ldict); /* now ldict is borrowed */ if (i < 0) return NULL; } From python-checkins at python.org Wed Mar 8 16:37:33 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 16:37:33 +0100 (CET) Subject: [Python-checkins] r42915 - peps/trunk/pep-0225.txt Message-ID: <20060308153733.D7A8F1E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 16:37:33 2006 New Revision: 42915 Modified: peps/trunk/pep-0225.txt Log: typo Modified: peps/trunk/pep-0225.txt ============================================================================== --- peps/trunk/pep-0225.txt (original) +++ peps/trunk/pep-0225.txt Wed Mar 8 16:37:33 2006 @@ -106,7 +106,7 @@ For example, __tadd__ and __rtadd__ work for ~+ just as __add__ and __radd__ work for +. - - As with exiting operators, the __r*__() methods are invoked when + - As with existing operators, the __r*__() methods are invoked when the left operand does not provide the appropriate method. It is intended that one set of op or ~op is used for elementwise From python-checkins at python.org Wed Mar 8 19:09:29 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 19:09:29 +0100 (CET) Subject: [Python-checkins] r42916 - in python/trunk: Doc/lib/libfuncs.tex Lib/test/test_descr.py Misc/NEWS Objects/descrobject.c Message-ID: <20060308180929.496BB1E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 19:09:27 2006 New Revision: 42916 Modified: python/trunk/Doc/lib/libfuncs.tex python/trunk/Lib/test/test_descr.py python/trunk/Misc/NEWS python/trunk/Objects/descrobject.c Log: Patch #1434038: property() now uses the getter's docstring if there is no "doc" argument given. This makes it possible to legitimately use property() as a decorator to produce a read-only property. Modified: python/trunk/Doc/lib/libfuncs.tex ============================================================================== --- python/trunk/Doc/lib/libfuncs.tex (original) +++ python/trunk/Doc/lib/libfuncs.tex Wed Mar 8 19:09:27 2006 @@ -771,7 +771,12 @@ x = property(getx, setx, delx, "I'm the 'x' property.") \end{verbatim} + If given, \var{doc} will be the docstring of the property attribute. + Otherwise, the property will copy \var{fget}'s docstring (if it + exists). + \versionadded{2.2} + \versionchanged[Use \var{fget}'s docstring if no \var{doc} given]{2.5} \end{funcdesc} \begin{funcdesc}{range}{\optional{start,} stop\optional{, step}} Modified: python/trunk/Lib/test/test_descr.py ============================================================================== --- python/trunk/Lib/test/test_descr.py (original) +++ python/trunk/Lib/test/test_descr.py Wed Mar 8 19:09:27 2006 @@ -2008,6 +2008,18 @@ else: raise TestFailed, "expected ZeroDivisionError from bad property" + class E(object): + def getter(self): + "getter method" + return 0 + def setter(self, value): + "setter method" + pass + prop = property(getter) + vereq(prop.__doc__, "getter method") + prop2 = property(fset=setter) + vereq(prop2.__doc__, None) + def supers(): if verbose: print "Testing super..." Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 8 19:09:27 2006 @@ -12,6 +12,10 @@ Core and builtins ----------------- +- Patch #1434038: property() now uses the getter's docstring if there is + no "doc" argument given. This makes it possible to legitimately use + property() as a decorator to produce a read-only property. + - PEP 357, patch 1436368: add an __index__ method to int/long and a matching nb_index slot to the PyNumberMethods struct. The slot is consulted instead of requiring an int or long in slicing and a few other contexts, enabling Modified: python/trunk/Objects/descrobject.c ============================================================================== --- python/trunk/Objects/descrobject.c (original) +++ python/trunk/Objects/descrobject.c Wed Mar 8 19:09:27 2006 @@ -1081,6 +1081,8 @@ class property(object): def __init__(self, fget=None, fset=None, fdel=None, doc=None): + if doc is None and fget is not None and hasattr(fget, "__doc__"): + doc = fget.__doc__ self.__get = fget self.__set = fset self.__del = fdel @@ -1182,6 +1184,7 @@ property_init(PyObject *self, PyObject *args, PyObject *kwds) { PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL; + PyObject *get_doc = NULL; static char *kwlist[] = {"fget", "fset", "fdel", "doc", 0}; propertyobject *gs = (propertyobject *)self; @@ -1196,6 +1199,15 @@ if (del == Py_None) del = NULL; + /* if no docstring given and the getter has one, use that one */ + if ((doc == NULL || doc == Py_None) && get != NULL && + PyObject_HasAttrString(get, "__doc__")) { + if (!(get_doc = PyObject_GetAttrString(get, "__doc__"))) + return -1; + Py_DECREF(get_doc); /* it is INCREF'd again below */ + doc = get_doc; + } + Py_XINCREF(get); Py_XINCREF(set); Py_XINCREF(del); From python-checkins at python.org Wed Mar 8 20:35:13 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 8 Mar 2006 20:35:13 +0100 (CET) Subject: [Python-checkins] r42918 - python/trunk/Modules/_ctypes Message-ID: <20060308193513.2C20A1E4002@bag.python.org> Author: thomas.heller Date: Wed Mar 8 20:35:11 2006 New Revision: 42918 Added: python/trunk/Modules/_ctypes/ - copied from r42917, external/ctypes-0.9.9.4/source/ Log: Copy ctypes-0.9.9.4 sources from external into the trunk. From python-checkins at python.org Wed Mar 8 20:52:01 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 8 Mar 2006 20:52:01 +0100 (CET) Subject: [Python-checkins] r42919 - python/trunk/Makefile.pre.in python/trunk/setup.py Message-ID: <20060308195201.7CE831E4002@bag.python.org> Author: thomas.heller Date: Wed Mar 8 20:51:58 2006 New Revision: 42919 Modified: python/trunk/Makefile.pre.in python/trunk/setup.py Log: Changes to build the _ctypes extension module. Based on a patch from Hye-Shik Chang. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Wed Mar 8 20:51:58 2006 @@ -677,7 +677,7 @@ LIBSUBDIRS= lib-old lib-tk site-packages test test/output test/data \ test/decimaltestdata \ encodings email email/test email/test/data compiler hotshot \ - logging bsddb bsddb/test csv idlelib idlelib/Icons \ + logging bsddb bsddb/test csv ctypes idlelib idlelib/Icons \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ curses $(MACHDEPS) libinstall: $(BUILDPYTHON) $(srcdir)/Lib/$(PLATDIR) Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Wed Mar 8 20:51:58 2006 @@ -888,6 +888,9 @@ if (dl_inc is not None) and (platform not in ['atheos', 'darwin']): exts.append( Extension('dl', ['dlmodule.c']) ) + # Thomas Heller's _ctypes module + self.detect_ctypes() + # Platform-specific libraries if platform == 'linux2': # Linux-specific modules @@ -1180,6 +1183,61 @@ # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ + def detect_ctypes(self): + (srcdir,) = sysconfig.get_config_vars('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) + ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py') + + if self.force or not os.path.exists(ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) + config_args = [] + + # Pass empty CFLAGS because we'll just append the resulting CFLAGS + # to Python's; -g or -O2 is to be avoided. + cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \ + % (ffi_builddir, ffi_srcdir, " ".join(config_args)) + + res = os.system(cmd) + if res or not os.path.exists(ffi_configfile): + print "Failed to configure _ctypes module" + return + + fficonfig = {} + execfile(ffi_configfile, globals(), fficonfig) + ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src') + + # Add .S (preprocessed assembly) to C compiler source extensions. + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), + ffi_builddir, ffi_srcdir] + extra_compile_args = fficonfig['ffi_cflags'].split() + sources = ['_ctypes/_ctypes.c', + '_ctypes/callbacks.c', + '_ctypes/callproc.c', + '_ctypes/stgdict.c', + '_ctypes/cfield.c', + '_ctypes/malloc_closure.c'] + fficonfig['ffi_sources'] + depends = ['_ctypes/ctypes.h'] + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') + include_dirs.append('_ctypes/darwin') +# XXX Is this still needed? +## extra_link_args.extend(['-read_only_relocs', 'warning']) + + ext = Extension('_ctypes', + include_dirs=include_dirs, + extra_compile_args=extra_compile_args, + sources=sources, + depends=depends) + ext_test = Extension('_ctypes_test', + sources=['_ctypes/_ctypes_test.c']) + self.extensions.extend([ext, ext_test]) + class PyBuildInstall(install): # Suppress the warning about installation into the lib_dynload # directory, which is not in sys.path when running Python during From python-checkins at python.org Wed Mar 8 20:56:56 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 8 Mar 2006 20:56:56 +0100 (CET) Subject: [Python-checkins] r42920 - python/trunk/Lib/ctypes Message-ID: <20060308195656.646351E4002@bag.python.org> Author: thomas.heller Date: Wed Mar 8 20:56:54 2006 New Revision: 42920 Added: python/trunk/Lib/ctypes/ - copied from r42919, external/ctypes-0.9.9.4/ctypes/ Log: Copy ctypes-0.9.9.4 Python modules from external into the trunk. From python-checkins at python.org Wed Mar 8 21:38:12 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 8 Mar 2006 21:38:12 +0100 (CET) Subject: [Python-checkins] r42921 - python/trunk/Lib/test/test_ctypes.py Message-ID: <20060308203812.C5AF61E4002@bag.python.org> Author: thomas.heller Date: Wed Mar 8 21:38:11 2006 New Revision: 42921 Added: python/trunk/Lib/test/test_ctypes.py (contents, props changed) Log: Trivial test for ctypes, more to come Added: python/trunk/Lib/test/test_ctypes.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_ctypes.py Wed Mar 8 21:38:11 2006 @@ -0,0 +1,4 @@ +# trivial test + +import _ctypes +import ctypes From python-checkins at python.org Wed Mar 8 21:53:15 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 8 Mar 2006 21:53:15 +0100 (CET) Subject: [Python-checkins] r42922 - sandbox/trunk/datetime/PSF.py Message-ID: <20060308205315.1D9CB1E4009@bag.python.org> Author: tim.peters Date: Wed Mar 8 21:53:14 2006 New Revision: 42922 Modified: sandbox/trunk/datetime/PSF.py Log: PSF board mtgs are now on Mondays. Modified: sandbox/trunk/datetime/PSF.py ============================================================================== --- sandbox/trunk/datetime/PSF.py (original) +++ sandbox/trunk/datetime/PSF.py Wed Mar 8 21:53:14 2006 @@ -7,7 +7,7 @@ """ from datetime import datetime -from dateutil import TUESDAY, weekday_of_month +from dateutil import MONDAY, weekday_of_month from US import Eastern, Central, Mountain, Pacific from EU import UTC, London, Amsterdam @@ -23,9 +23,9 @@ # A vector of 12 datetimes, all in Eastern. def psf_times_for_a_year(year): - # 1pm Eastern on the second Tuesday of the month. + # 1pm Eastern on the second Monday of the month. base = datetime(year, 1, 1, 13, tzinfo=Eastern) - return [weekday_of_month(TUESDAY, base.replace(month=i), 1) + return [weekday_of_month(MONDAY, base.replace(month=i), 1) for i in range(1, 13)] # Eastern is always displayed first. From python-checkins at python.org Wed Mar 8 21:59:09 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 21:59:09 +0100 (CET) Subject: [Python-checkins] r42923 - python/trunk/Doc/lib/libposixpath.tex Message-ID: <20060308205909.8ABD01E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 21:59:09 2006 New Revision: 42923 Modified: python/trunk/Doc/lib/libposixpath.tex Log: Bug #1445901: os.path.realpath() is available on Win/Mac too. Modified: python/trunk/Doc/lib/libposixpath.tex ============================================================================== --- python/trunk/Doc/lib/libposixpath.tex (original) +++ python/trunk/Doc/lib/libposixpath.tex Wed Mar 8 21:59:09 2006 @@ -175,8 +175,8 @@ \begin{funcdesc}{realpath}{path} Return the canonical path of the specified filename, eliminating any -symbolic links encountered in the path. -Availability: \UNIX. +symbolic links encountered in the path (if they are supported by the +operating system). \versionadded{2.2} \end{funcdesc} From python-checkins at python.org Wed Mar 8 21:59:12 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 8 Mar 2006 21:59:12 +0100 (CET) Subject: [Python-checkins] r42924 - python/branches/release24-maint/Doc/lib/libposixpath.tex Message-ID: <20060308205912.BC0601E4002@bag.python.org> Author: georg.brandl Date: Wed Mar 8 21:59:12 2006 New Revision: 42924 Modified: python/branches/release24-maint/Doc/lib/libposixpath.tex Log: Bug #1445901: os.path.realpath() is available on Win/Mac too. (backport from rev. 42923) Modified: python/branches/release24-maint/Doc/lib/libposixpath.tex ============================================================================== --- python/branches/release24-maint/Doc/lib/libposixpath.tex (original) +++ python/branches/release24-maint/Doc/lib/libposixpath.tex Wed Mar 8 21:59:12 2006 @@ -175,8 +175,8 @@ \begin{funcdesc}{realpath}{path} Return the canonical path of the specified filename, eliminating any -symbolic links encountered in the path. -Availability: \UNIX. +symbolic links encountered in the path (if they are supported by the +operating system). \versionadded{2.2} \end{funcdesc} From python-checkins at python.org Thu Mar 9 00:31:18 2006 From: python-checkins at python.org (hyeshik.chang) Date: Thu, 9 Mar 2006 00:31:18 +0100 (CET) Subject: [Python-checkins] r42925 - in python/trunk/Lib/ctypes: .cvsignore macholib macholib/.cvsignore test test/.cvsignore Message-ID: <20060308233118.674DD1E401A@bag.python.org> Author: hyeshik.chang Date: Thu Mar 9 00:31:17 2006 New Revision: 42925 Removed: python/trunk/Lib/ctypes/.cvsignore python/trunk/Lib/ctypes/macholib/.cvsignore python/trunk/Lib/ctypes/test/.cvsignore Modified: python/trunk/Lib/ctypes/ (props changed) python/trunk/Lib/ctypes/macholib/ (props changed) python/trunk/Lib/ctypes/test/ (props changed) Log: Remove .cvsignore and set svn:ignore for *.pyc *.pyo. Deleted: /python/trunk/Lib/ctypes/.cvsignore ============================================================================== --- /python/trunk/Lib/ctypes/.cvsignore Thu Mar 9 00:31:17 2006 +++ (empty file) @@ -1,4 +0,0 @@ - -*.pyc -*.pyo -com Deleted: /python/trunk/Lib/ctypes/macholib/.cvsignore ============================================================================== --- /python/trunk/Lib/ctypes/macholib/.cvsignore Thu Mar 9 00:31:17 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.pyc -*.pyo -.svn Deleted: /python/trunk/Lib/ctypes/test/.cvsignore ============================================================================== --- /python/trunk/Lib/ctypes/test/.cvsignore Thu Mar 9 00:31:17 2006 +++ (empty file) @@ -1,4 +0,0 @@ -*.pyc -*.pyo -_testfile.py -_testfile.xml From python-checkins at python.org Thu Mar 9 02:07:27 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 9 Mar 2006 02:07:27 +0100 (CET) Subject: [Python-checkins] r42926 - in python/trunk/Lib/ctypes: __init__.py _endian.py _loader.py macholib/__init__.py macholib/dyld.py macholib/dylib.py macholib/framework.py test/__init__.py test/runtests.py test/test_array_in_pointer.py test/test_arrays.py test/test_bitfields.py test/test_buffers.py test/test_byteswap.py test/test_callbacks.py test/test_cast.py test/test_cfuncs.py test/test_checkretval.py test/test_errcheck.py test/test_funcptr.py test/test_functions.py test/test_incomplete.py test/test_init.py test/test_integers.py test/test_internals.py test/test_keeprefs.py test/test_leaks.py test/test_libc.py test/test_loading.py test/test_macholib.py test/test_memfunctions.py test/test_numbers.py test/test_parameters.py test/test_pointers.py test/test_posix.py test/test_prototypes.py test/test_python_api.py test/test_random_things.py test/test_refcounts.py test/test_repr.py test/test_returnfuncptrs.py test/test_simplesubclasses.py test/test_sizes.py test/test_slicing.py test/test_stringptr.py test/test_strings.py test/test_struct_fields.py test/test_structures.py test/test_unicode.py test/test_values.py test/test_win32.py wintypes.py Message-ID: <20060309010727.076491E4002@bag.python.org> Author: tim.peters Date: Thu Mar 9 02:07:25 2006 New Revision: 42926 Modified: python/trunk/Lib/ctypes/__init__.py (props changed) python/trunk/Lib/ctypes/_endian.py (props changed) python/trunk/Lib/ctypes/_loader.py (props changed) python/trunk/Lib/ctypes/macholib/__init__.py (props changed) python/trunk/Lib/ctypes/macholib/dyld.py (props changed) python/trunk/Lib/ctypes/macholib/dylib.py (props changed) python/trunk/Lib/ctypes/macholib/framework.py (props changed) python/trunk/Lib/ctypes/test/__init__.py (props changed) python/trunk/Lib/ctypes/test/runtests.py (props changed) python/trunk/Lib/ctypes/test/test_array_in_pointer.py (props changed) python/trunk/Lib/ctypes/test/test_arrays.py (props changed) python/trunk/Lib/ctypes/test/test_bitfields.py (props changed) python/trunk/Lib/ctypes/test/test_buffers.py (props changed) python/trunk/Lib/ctypes/test/test_byteswap.py (props changed) python/trunk/Lib/ctypes/test/test_callbacks.py (props changed) python/trunk/Lib/ctypes/test/test_cast.py (props changed) python/trunk/Lib/ctypes/test/test_cfuncs.py (props changed) python/trunk/Lib/ctypes/test/test_checkretval.py (props changed) python/trunk/Lib/ctypes/test/test_errcheck.py (props changed) python/trunk/Lib/ctypes/test/test_funcptr.py (props changed) python/trunk/Lib/ctypes/test/test_functions.py (props changed) python/trunk/Lib/ctypes/test/test_incomplete.py (props changed) python/trunk/Lib/ctypes/test/test_init.py (props changed) python/trunk/Lib/ctypes/test/test_integers.py (props changed) python/trunk/Lib/ctypes/test/test_internals.py (props changed) python/trunk/Lib/ctypes/test/test_keeprefs.py (props changed) python/trunk/Lib/ctypes/test/test_leaks.py (props changed) python/trunk/Lib/ctypes/test/test_libc.py (props changed) python/trunk/Lib/ctypes/test/test_loading.py (props changed) python/trunk/Lib/ctypes/test/test_macholib.py (props changed) python/trunk/Lib/ctypes/test/test_memfunctions.py (props changed) python/trunk/Lib/ctypes/test/test_numbers.py (props changed) python/trunk/Lib/ctypes/test/test_parameters.py (props changed) python/trunk/Lib/ctypes/test/test_pointers.py (props changed) python/trunk/Lib/ctypes/test/test_posix.py (props changed) python/trunk/Lib/ctypes/test/test_prototypes.py (props changed) python/trunk/Lib/ctypes/test/test_python_api.py (props changed) python/trunk/Lib/ctypes/test/test_random_things.py (props changed) python/trunk/Lib/ctypes/test/test_refcounts.py (props changed) python/trunk/Lib/ctypes/test/test_repr.py (props changed) python/trunk/Lib/ctypes/test/test_returnfuncptrs.py (props changed) python/trunk/Lib/ctypes/test/test_simplesubclasses.py (props changed) python/trunk/Lib/ctypes/test/test_sizes.py (props changed) python/trunk/Lib/ctypes/test/test_slicing.py (props changed) python/trunk/Lib/ctypes/test/test_stringptr.py (props changed) python/trunk/Lib/ctypes/test/test_strings.py (props changed) python/trunk/Lib/ctypes/test/test_struct_fields.py (props changed) python/trunk/Lib/ctypes/test/test_structures.py (props changed) python/trunk/Lib/ctypes/test/test_unicode.py (props changed) python/trunk/Lib/ctypes/test/test_values.py (props changed) python/trunk/Lib/ctypes/test/test_win32.py (props changed) python/trunk/Lib/ctypes/wintypes.py (props changed) Log: These text files were all missing the svn:eol-style property. From python-checkins at python.org Thu Mar 9 02:15:08 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 9 Mar 2006 02:15:08 +0100 (CET) Subject: [Python-checkins] r42927 - in python/trunk/Lib: ctypes/__init__.py ctypes/_endian.py ctypes/_loader.py ctypes/test/__init__.py ctypes/test/test_array_in_pointer.py ctypes/test/test_bitfields.py ctypes/test/test_buffers.py ctypes/test/test_byteswap.py ctypes/test/test_callbacks.py ctypes/test/test_funcptr.py ctypes/test/test_functions.py ctypes/test/test_keeprefs.py ctypes/test/test_macholib.py ctypes/test/test_numbers.py ctypes/test/test_parameters.py ctypes/test/test_pointers.py ctypes/test/test_posix.py ctypes/test/test_prototypes.py ctypes/test/test_refcounts.py ctypes/test/test_returnfuncptrs.py ctypes/test/test_strings.py ctypes/test/test_structures.py ctypes/test/test_win32.py distutils/command/bdist_msi.py test/test_importhooks.py Message-ID: <20060309011508.9DB1F1E4010@bag.python.org> Author: tim.peters Date: Thu Mar 9 02:15:05 2006 New Revision: 42927 Modified: python/trunk/Lib/ctypes/__init__.py python/trunk/Lib/ctypes/_endian.py python/trunk/Lib/ctypes/_loader.py python/trunk/Lib/ctypes/test/__init__.py python/trunk/Lib/ctypes/test/test_array_in_pointer.py python/trunk/Lib/ctypes/test/test_bitfields.py python/trunk/Lib/ctypes/test/test_buffers.py python/trunk/Lib/ctypes/test/test_byteswap.py python/trunk/Lib/ctypes/test/test_callbacks.py python/trunk/Lib/ctypes/test/test_funcptr.py python/trunk/Lib/ctypes/test/test_functions.py python/trunk/Lib/ctypes/test/test_keeprefs.py python/trunk/Lib/ctypes/test/test_macholib.py python/trunk/Lib/ctypes/test/test_numbers.py python/trunk/Lib/ctypes/test/test_parameters.py python/trunk/Lib/ctypes/test/test_pointers.py python/trunk/Lib/ctypes/test/test_posix.py python/trunk/Lib/ctypes/test/test_prototypes.py python/trunk/Lib/ctypes/test/test_refcounts.py python/trunk/Lib/ctypes/test/test_returnfuncptrs.py python/trunk/Lib/ctypes/test/test_strings.py python/trunk/Lib/ctypes/test/test_structures.py python/trunk/Lib/ctypes/test/test_win32.py python/trunk/Lib/distutils/command/bdist_msi.py python/trunk/Lib/test/test_importhooks.py Log: Whitespace normalization. Modified: python/trunk/Lib/ctypes/__init__.py ============================================================================== --- python/trunk/Lib/ctypes/__init__.py (original) +++ python/trunk/Lib/ctypes/__init__.py Thu Mar 9 02:15:05 2006 @@ -76,13 +76,13 @@ _c_functype_cache = {} def CFUNCTYPE(restype, *argtypes): """CFUNCTYPE(restype, *argtypes) -> function prototype. - + restype: the result type argtypes: a sequence specifying the argument types - + The function prototype can be called in three ways to create a callable object: - + prototype(funct) - returns a C callable function calling funct prototype(vtbl_index, method_name[, paramflags]) - a Python callable that calls a COM method prototype(funct_name, dll[, paramflags]) - a Python callable that calls an exported function in a dll @@ -139,7 +139,7 @@ class c_ulong(_SimpleCData): _type_ = "L" - + if _calcsize("i") == _calcsize("l"): # if int and long have the same size, make c_int an alias for c_long c_int = c_long @@ -153,7 +153,7 @@ class c_float(_SimpleCData): _type_ = "f" - + class c_double(_SimpleCData): _type_ = "d" @@ -327,7 +327,7 @@ _restype_ = c_int # default, can be overridden in instances if _os.name in ("nt", "ce"): - + class WinDLL(CDLL): """This class represents a dll exporting functions using the Windows stdcall calling convention. @@ -351,7 +351,7 @@ # doesn't have a way to raise an exception in the caller's # frame). _check_retval_ = _check_HRESULT - + class OleDLL(CDLL): """This class represents a dll exporting functions using the Windows stdcall calling convention, and returning HRESULT. @@ -424,7 +424,7 @@ Return the string at addr.""" return _wstring_at(ptr, size) - + if _os.name == "nt": # COM stuff def DllGetClassObject(rclsid, riid, ppv): Modified: python/trunk/Lib/ctypes/_endian.py ============================================================================== --- python/trunk/Lib/ctypes/_endian.py (original) +++ python/trunk/Lib/ctypes/_endian.py Thu Mar 9 02:15:05 2006 @@ -55,4 +55,3 @@ else: raise RuntimeError("Invalid byteorder") - Modified: python/trunk/Lib/ctypes/_loader.py ============================================================================== --- python/trunk/Lib/ctypes/_loader.py (original) +++ python/trunk/Lib/ctypes/_loader.py Thu Mar 9 02:15:05 2006 @@ -151,7 +151,7 @@ except ValueError: raise OSError("Library %s could not be found" % libname) return self.load_library(pathname, mode) - + elif os.name == "posix": # Posix def _plat_load_version(self, name, version, mode): Modified: python/trunk/Lib/ctypes/test/__init__.py ============================================================================== --- python/trunk/Lib/ctypes/test/__init__.py (original) +++ python/trunk/Lib/ctypes/test/__init__.py Thu Mar 9 02:15:05 2006 @@ -83,7 +83,7 @@ ptc = ctypes._pointer_type_cache.copy() cfc = ctypes._c_functype_cache.copy() wfc = ctypes._win_functype_cache.copy() - + # when searching for refcount leaks, we have to manually reset any # caches that ctypes has. def cleanup(): Modified: python/trunk/Lib/ctypes/test/test_array_in_pointer.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_array_in_pointer.py (original) +++ python/trunk/Lib/ctypes/test/test_array_in_pointer.py Thu Mar 9 02:15:05 2006 @@ -8,7 +8,7 @@ # between the bytes. h = hexlify(buffer(obj)) return re.sub(r"(..)", r"\1-", h)[:-1] - + class Value(Structure): _fields_ = [("val", c_byte)] Modified: python/trunk/Lib/ctypes/test/test_bitfields.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_bitfields.py (original) +++ python/trunk/Lib/ctypes/test/test_bitfields.py Thu Mar 9 02:15:05 2006 @@ -15,7 +15,7 @@ ("G", c_int, 7), ("H", c_int, 8), ("I", c_int, 9), - + ("M", c_short, 1), ("N", c_short, 2), ("O", c_short, 3), @@ -62,7 +62,7 @@ x = X() x.a, x.b, x.c = -1, 7, -1 self.failUnlessEqual((x.a, x.b, x.c), (-1, 7, -1)) - + def test_ulonglong(self): class X(Structure): _fields_ = [("a", c_ulonglong, 1), @@ -79,7 +79,7 @@ for c_typ in signed_int_types: class X(Structure): _fields_ = [("dummy", c_typ), - ("a", c_typ, 3), + ("a", c_typ, 3), ("b", c_typ, 3), ("c", c_typ, 1)] self.failUnlessEqual(sizeof(X), sizeof(c_typ)*2) Modified: python/trunk/Lib/ctypes/test/test_buffers.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_buffers.py (original) +++ python/trunk/Lib/ctypes/test/test_buffers.py Thu Mar 9 02:15:05 2006 @@ -8,14 +8,14 @@ self.failUnlessEqual(len(b), 32) self.failUnlessEqual(sizeof(b), 32 * sizeof(c_char)) self.failUnless(type(b[0]) is str) - + b = create_string_buffer("abc") self.failUnlessEqual(len(b), 4) # trailing nul char self.failUnlessEqual(sizeof(b), 4 * sizeof(c_char)) self.failUnless(type(b[0]) is str) self.failUnlessEqual(b[0], "a") self.failUnlessEqual(b[:], "abc\0") - + def test_string_conversion(self): b = create_string_buffer(u"abc") self.failUnlessEqual(len(b), 4) # trailing nul char Modified: python/trunk/Lib/ctypes/test/test_byteswap.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_byteswap.py (original) +++ python/trunk/Lib/ctypes/test/test_byteswap.py Thu Mar 9 02:15:05 2006 @@ -11,7 +11,7 @@ # byte order, and a __ctype_le__ attribute that is the same type in # LITTLE ENDIAN byte order. # -# For Structures and Unions, these types are created on demand. +# For Structures and Unions, these types are created on demand. class Test(unittest.TestCase): def X_test(self): Modified: python/trunk/Lib/ctypes/test/test_callbacks.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_callbacks.py (original) +++ python/trunk/Lib/ctypes/test/test_callbacks.py Thu Mar 9 02:15:05 2006 @@ -3,7 +3,7 @@ import _ctypes_test class Callbacks(unittest.TestCase): - functype = CFUNCTYPE + functype = CFUNCTYPE ## def tearDown(self): ## import gc @@ -130,7 +130,7 @@ result = integrate(0.0, 1.0, CALLBACK(func), 10) diff = abs(result - 1./3.) - + self.failUnless(diff < 0.01, "%s not less than 0.01" % diff) ################################################################ Modified: python/trunk/Lib/ctypes/test/test_funcptr.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_funcptr.py (original) +++ python/trunk/Lib/ctypes/test/test_funcptr.py Thu Mar 9 02:15:05 2006 @@ -122,6 +122,6 @@ self.failUnlessEqual(strtok(None, "\n"), "b") self.failUnlessEqual(strtok(None, "\n"), "c") self.failUnlessEqual(strtok(None, "\n"), None) - + if __name__ == '__main__': unittest.main() Modified: python/trunk/Lib/ctypes/test/test_functions.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_functions.py (original) +++ python/trunk/Lib/ctypes/test/test_functions.py Thu Mar 9 02:15:05 2006 @@ -28,14 +28,14 @@ # But in early versions of _ctypes.c, the result of tp_new # wasn't checked, and it even crashed Python. # Found by Greg Chapman. - + try: class X(object, Array): _length_ = 5 _type_ = "i" except TypeError: pass - + from _ctypes import _Pointer try: @@ -105,7 +105,7 @@ result = f(1, 2, 3, 4, 5.0, 6.0) self.failUnlessEqual(result, 21) self.failUnlessEqual(type(result), int) - + result = f(1, 2, 3, 0x10004, 5.0, 6.0) self.failUnlessEqual(result, 21) self.failUnlessEqual(type(result), int) @@ -124,7 +124,7 @@ result = f(-1, -2, -3, -4, -5.0, -6.0) self.failUnlessEqual(result, -21) self.failUnlessEqual(type(result), float) - + def test_doubleresult(self): f = dll._testfunc_d_bhilfd f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double] @@ -136,7 +136,7 @@ result = f(-1, -2, -3, -4, -5.0, -6.0) self.failUnlessEqual(result, -21) self.failUnlessEqual(type(result), float) - + def test_longlongresult(self): try: c_longlong @@ -226,7 +226,7 @@ self.failUnlessEqual(args, expected) ################################################################ - + def test_callbacks(self): f = dll._testfunc_callback_i_if @@ -237,7 +237,7 @@ def callback(value): #print "called back with", value return value - + cb = MyCallback(callback) result = f(-10, cb) self.failUnlessEqual(result, -18) @@ -247,7 +247,7 @@ cb = MyCallback(callback) result = f(-10, cb) self.failUnlessEqual(result, -18) - + AnotherCallback = WINFUNCTYPE(c_int, c_int, c_int, c_int, c_int) # check that the prototype works: we call f with wrong @@ -271,7 +271,7 @@ #print "called back with", value self.failUnlessEqual(type(value), int) return value - + cb = MyCallback(callback) result = f(-10, cb) self.failUnlessEqual(result, -18) Modified: python/trunk/Lib/ctypes/test/test_keeprefs.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_keeprefs.py (original) +++ python/trunk/Lib/ctypes/test/test_keeprefs.py Thu Mar 9 02:15:05 2006 @@ -130,7 +130,7 @@ ("b", POINTER(POINT))] r = RECT() p1 = POINT(1, 2) - + r.a = pointer(p1) r.b = pointer(p1) ## from pprint import pprint as pp Modified: python/trunk/Lib/ctypes/test/test_macholib.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_macholib.py (original) +++ python/trunk/Lib/ctypes/test/test_macholib.py Thu Mar 9 02:15:05 2006 @@ -36,13 +36,13 @@ from ctypes.macholib.dyld import dyld_find def find_lib(name): - possible = ['lib'+name+'.dylib', name+'.dylib', name+'.framework/'+name] - for dylib in possible: - try: - return os.path.realpath(dyld_find(dylib)) - except ValueError: - pass - raise ValueError, "%s not found" % (name,) + possible = ['lib'+name+'.dylib', name+'.dylib', name+'.framework/'+name] + for dylib in possible: + try: + return os.path.realpath(dyld_find(dylib)) + except ValueError: + pass + raise ValueError, "%s not found" % (name,) class MachOTest(unittest.TestCase): if sys.platform == "darwin": Modified: python/trunk/Lib/ctypes/test/test_numbers.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_numbers.py (original) +++ python/trunk/Lib/ctypes/test/test_numbers.py Thu Mar 9 02:15:05 2006 @@ -34,14 +34,14 @@ else: unsigned_types.append(c_ulonglong) signed_types.append(c_longlong) - + unsigned_ranges = valid_ranges(*unsigned_types) signed_ranges = valid_ranges(*signed_types) ################################################################ class NumberTestCase(unittest.TestCase): - + def test_default_init(self): # default values are set to zero for t in signed_types + unsigned_types + float_types: @@ -132,7 +132,7 @@ # and alignment of an instance self.failUnlessEqual((code, alignment(t())), (code, align)) - + def test_int_from_address(self): from array import array for t in signed_types + unsigned_types: @@ -152,7 +152,7 @@ # changing the value at the memory location changes v's value also a[0] = 42 self.failUnlessEqual(v.value, a[0]) - + def test_float_from_address(self): from array import array @@ -168,7 +168,7 @@ def test_char_from_address(self): from ctypes import c_char from array import array - + a = array('c', 'x') v = c_char.from_address(a.buffer_info()[0]) self.failUnlessEqual(v.value, a[0]) @@ -185,7 +185,7 @@ ## def test_perf(self): ## check_perf() - + from ctypes import _SimpleCData class c_int_S(_SimpleCData): _type_ = "i" @@ -227,7 +227,7 @@ # c_int(): 3.35 us # c_int(999): 3.34 us # c_int_S(): 3.23 us -# c_int_S(999): 3.24 us +# c_int_S(999): 3.24 us # Python 2.2 -OO, win2k, P4 700 MHz: # Modified: python/trunk/Lib/ctypes/test/test_parameters.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_parameters.py (original) +++ python/trunk/Lib/ctypes/test/test_parameters.py Thu Mar 9 02:15:05 2006 @@ -18,7 +18,7 @@ pass else: set_conversion_mode(*self.prev_conv_mode) - + def test_subclasses(self): from ctypes import c_void_p, c_char_p Modified: python/trunk/Lib/ctypes/test/test_pointers.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_pointers.py (original) +++ python/trunk/Lib/ctypes/test/test_pointers.py Thu Mar 9 02:15:05 2006 @@ -11,7 +11,7 @@ class PointersTestCase(unittest.TestCase): def test_pointer_crash(self): - + class A(POINTER(c_ulong)): pass @@ -84,7 +84,7 @@ ## print self.result doit(callback) ## print self.result - + def test_basics(self): from operator import delitem for ct, pt in zip(ctype_types, python_types): @@ -132,7 +132,7 @@ self.assertRaises(TypeError, len, p) self.failUnlessEqual(p[0], 42) self.failUnlessEqual(p.contents.value, 42) - + def test_incomplete(self): lpcell = POINTER("cell") class cell(Structure): @@ -166,6 +166,6 @@ result = func( byref(argc), argv ) assert result == 'world', result - + if __name__ == '__main__': unittest.main() Modified: python/trunk/Lib/ctypes/test/test_posix.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_posix.py (original) +++ python/trunk/Lib/ctypes/test/test_posix.py Thu Mar 9 02:15:05 2006 @@ -10,7 +10,7 @@ def test_GL(self): cdll.load('libGL.so', mode=RTLD_GLOBAL) cdll.load('libGLU.so') - + ##if os.name == "posix" and sys.platform != "darwin": ## # On platforms where the default shared library suffix is '.so', Modified: python/trunk/Lib/ctypes/test/test_prototypes.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_prototypes.py (original) +++ python/trunk/Lib/ctypes/test/test_prototypes.py Thu Mar 9 02:15:05 2006 @@ -44,7 +44,7 @@ func.argtypes = POINTER(c_int), self.failUnlessEqual(addressof(ci), func(byref(ci))) - + func.argtypes = c_char_p, self.assertRaises(ArgumentError, func, byref(ci)) @@ -73,7 +73,7 @@ func = testdll._testfunc_p_p func.restype = c_char_p func.argtypes = c_char_p, - + self.failUnlessEqual(None, func(None)) self.failUnlessEqual("123", func("123")) self.failUnlessEqual(None, func(c_char_p(None))) Modified: python/trunk/Lib/ctypes/test/test_refcounts.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_refcounts.py (original) +++ python/trunk/Lib/ctypes/test/test_refcounts.py Thu Mar 9 02:15:05 2006 @@ -48,7 +48,7 @@ # and may release it again del f self.failUnless(grc(func) >= 2) - + # but now it must be gone gc.collect() self.failUnless(grc(func) == 2) @@ -57,14 +57,14 @@ _fields_ = [("a", OtherCallback)] x = X() x.a = OtherCallback(func) - + # the CFuncPtr instance holds atr least one refcount on func: self.failUnless(grc(func) > 2) # and may release it again del x self.failUnless(grc(func) >= 2) - + # and now it must be gone again gc.collect() self.failUnlessEqual(grc(func), 2) @@ -80,7 +80,7 @@ del f gc.collect() self.failUnlessEqual(grc(func), 2) - + class AnotherLeak(unittest.TestCase): def test_callback(self): import sys @@ -89,7 +89,7 @@ def func(a, b): return a * b * 2 f = proto(func) - + a = sys.getrefcount(ctypes.c_int) f(1, 2) self.failUnlessEqual(sys.getrefcount(ctypes.c_int), a) Modified: python/trunk/Lib/ctypes/test/test_returnfuncptrs.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_returnfuncptrs.py (original) +++ python/trunk/Lib/ctypes/test/test_returnfuncptrs.py Thu Mar 9 02:15:05 2006 @@ -16,7 +16,7 @@ self.failUnlessEqual(strchr("abcdef", "x"), None) self.assertRaises(ArgumentError, strchr, "abcdef", 3) self.assertRaises(TypeError, strchr, "abcdef") - + def test_without_prototype(self): dll = cdll.load(_ctypes_test.__file__) get_strchr = dll.get_strchr Modified: python/trunk/Lib/ctypes/test/test_strings.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_strings.py (original) +++ python/trunk/Lib/ctypes/test/test_strings.py Thu Mar 9 02:15:05 2006 @@ -46,7 +46,7 @@ BUF = c_char * 4 buf = BUF() ## print c_char_p.from_param(buf) - + def test_param_2(self): BUF = c_char * 4 buf = BUF() @@ -103,9 +103,9 @@ def XX_test_sized_strings(self): - # New in releases later than 0.4.0: + # New in releases later than 0.4.0: self.assertRaises(TypeError, c_string, None) - + # New in releases later than 0.4.0: # c_string(number) returns an empty string of size number self.failUnless(len(c_string(32).raw) == 32) @@ -181,7 +181,7 @@ # One char too long values: self.assertRaises(ValueError, setattr, cs, "value", u"1234567") - + def run_test(rep, msg, func, arg): items = range(rep) from time import clock Modified: python/trunk/Lib/ctypes/test/test_structures.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_structures.py (original) +++ python/trunk/Lib/ctypes/test/test_structures.py Thu Mar 9 02:15:05 2006 @@ -56,7 +56,7 @@ "f": c_float, "d": c_double, } - + def test_simple_structs(self): for code, tp in self.formats.items(): class X(Structure): @@ -90,7 +90,7 @@ ("b", Y)] self.failUnlessEqual(alignment(SI), max(alignment(Y), alignment(X))) self.failUnlessEqual(sizeof(SI), calcsize("3s0i 3si 0i")) - + class IS(Structure): _fields_ = [("b", Y), ("a", X)] @@ -215,7 +215,7 @@ # too long self.assertRaises(ValueError, Person, "1234567", 5) - + def test_keyword_initializers(self): class POINT(Structure): _fields_ = [("x", c_int), ("y", c_int)] @@ -315,7 +315,7 @@ func(*args) except Exception, detail: return detail.__class__, str(detail) - + ## def test_subclass_creation(self): ## meta = type(Structure) @@ -373,4 +373,3 @@ if __name__ == '__main__': unittest.main() - Modified: python/trunk/Lib/ctypes/test/test_win32.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_win32.py (original) +++ python/trunk/Lib/ctypes/test/test_win32.py Thu Mar 9 02:15:05 2006 @@ -43,22 +43,22 @@ class Structures(unittest.TestCase): - def test_struct_by_value(self): - class POINT(Structure): - _fields_ = [("x", c_long), - ("y", c_long)] - - class RECT(Structure): - _fields_ = [("left", c_long), - ("top", c_long), - ("right", c_long), - ("bottom", c_long)] - - dll = cdll.load(_ctypes_test.__file__) - - pt = POINT(10, 10) - rect = RECT(0, 0, 20, 20) - self.failUnlessEqual(1, dll.PointInRect(byref(rect), pt)) + def test_struct_by_value(self): + class POINT(Structure): + _fields_ = [("x", c_long), + ("y", c_long)] + + class RECT(Structure): + _fields_ = [("left", c_long), + ("top", c_long), + ("right", c_long), + ("bottom", c_long)] + + dll = cdll.load(_ctypes_test.__file__) + + pt = POINT(10, 10) + rect = RECT(0, 0, 20, 20) + self.failUnlessEqual(1, dll.PointInRect(byref(rect), pt)) if __name__ == '__main__': unittest.main() Modified: python/trunk/Lib/distutils/command/bdist_msi.py ============================================================================== --- python/trunk/Lib/distutils/command/bdist_msi.py (original) +++ python/trunk/Lib/distutils/command/bdist_msi.py Thu Mar 9 02:15:05 2006 @@ -216,10 +216,10 @@ # Prefix ProductName with Python x.y, so that # it sorts together with the other Python packages # in Add-Remove-Programs (APR) - product_name = "Python %s %s" % (self.target_version, + product_name = "Python %s %s" % (self.target_version, self.distribution.get_fullname()) self.db = msilib.init_database(installer_name, schema, - product_name, msilib.gen_uuid(), + product_name, msilib.gen_uuid(), sversion, author) msilib.add_tables(self.db, sequence) props = [('DistVersion', version)] @@ -238,7 +238,7 @@ self.db.Commit() if hasattr(self.distribution, 'dist_files'): - self.distribution.dist_files.append(('bdist_msi', self.target_version, fullname)) + self.distribution.dist_files.append(('bdist_msi', self.target_version, fullname)) if not self.keep_temp: remove_tree(self.bdist_dir, dry_run=self.dry_run) @@ -265,14 +265,14 @@ if self.install_script_key: raise DistutilsOptionError, "Multiple files with name %s" % file self.install_script_key = '[#%s]' % key - + cab.commit(db) def add_find_python(self): """Adds code to the installer to compute the location of Python. Properties PYTHON.MACHINE, PYTHON.USER, PYTHONDIR and PYTHON will be set in both the execute and UI sequences; PYTHONDIR will be set from - PYTHON.USER if defined, else from PYTHON.MACHINE. + PYTHON.USER if defined, else from PYTHON.MACHINE. PYTHON is PYTHONDIR\python.exe""" install_path = r"SOFTWARE\Python\PythonCore\%s\InstallPath" % self.target_version add_data(self.db, "RegLocator", @@ -497,7 +497,7 @@ seldlg.title("Select Destination Directory") version = sys.version[:3]+" " - seldlg.text("Hint", 15, 30, 300, 40, 3, + seldlg.text("Hint", 15, 30, 300, 40, 3, "The destination directory should contain a Python %sinstallation" % version) seldlg.back("< Back", None, active=0) Modified: python/trunk/Lib/test/test_importhooks.py ============================================================================== --- python/trunk/Lib/test/test_importhooks.py (original) +++ python/trunk/Lib/test/test_importhooks.py Thu Mar 9 02:15:05 2006 @@ -252,7 +252,7 @@ for mname in mnames: m = __import__(mname, globals(), locals(), ["__dummy__"]) m.__loader__ # to make sure we actually handled the import - # Delete urllib from modules because urlparse was imported above. + # Delete urllib from modules because urlparse was imported above. # Without this hack, test_socket_ssl fails if run in this order: # regrtest.py test_codecmaps_tw test_importhooks test_socket_ssl try: From python-checkins at python.org Thu Mar 9 02:35:34 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 9 Mar 2006 02:35:34 +0100 (CET) Subject: [Python-checkins] r42928 - in python/trunk: Lib/ctypes/.CTYPES_DEVEL Lib/ctypes/__init__.py Lib/ctypes/_endian.py Lib/ctypes/_loader.py Lib/ctypes/macholib/README.ctypes Lib/ctypes/macholib/__init__.py Lib/ctypes/macholib/dyld.py Lib/ctypes/macholib/dylib.py Lib/ctypes/macholib/fetch_macholib Lib/ctypes/macholib/fetch_macholib.bat Lib/ctypes/macholib/framework.py Lib/ctypes/test/__init__.py Lib/ctypes/test/runtests.py Lib/ctypes/test/test_array_in_pointer.py Lib/ctypes/test/test_arrays.py Lib/ctypes/test/test_bitfields.py Lib/ctypes/test/test_buffers.py Lib/ctypes/test/test_byteswap.py Lib/ctypes/test/test_callbacks.py Lib/ctypes/test/test_cast.py Lib/ctypes/test/test_cfuncs.py Lib/ctypes/test/test_checkretval.py Lib/ctypes/test/test_errcheck.py Lib/ctypes/test/test_funcptr.py Lib/ctypes/test/test_functions.py Lib/ctypes/test/test_incomplete.py Lib/ctypes/test/test_init.py Lib/ctypes/test/test_integers.py Lib/ctypes/test/test_internals.py Lib/ctypes/test/test_keeprefs.py Lib/ctypes/test/test_leaks.py Lib/ctypes/test/test_libc.py Lib/ctypes/test/test_loading.py Lib/ctypes/test/test_macholib.py Lib/ctypes/test/test_memfunctions.py Lib/ctypes/test/test_numbers.py Lib/ctypes/test/test_parameters.py Lib/ctypes/test/test_pointers.py Lib/ctypes/test/test_posix.py Lib/ctypes/test/test_prototypes.py Lib/ctypes/test/test_python_api.py Lib/ctypes/test/test_random_things.py Lib/ctypes/test/test_refcounts.py Lib/ctypes/test/test_repr.py Lib/ctypes/test/test_returnfuncptrs.py Lib/ctypes/test/test_simplesubclasses.py Lib/ctypes/test/test_sizes.py Lib/ctypes/test/test_slicing.py Lib/ctypes/test/test_stringptr.py Lib/ctypes/test/test_strings.py Lib/ctypes/test/test_struct_fields.py Lib/ctypes/test/test_structures.py Lib/ctypes/test/test_unicode.py Lib/ctypes/test/test_values.py Lib/ctypes/test/test_win32.py Lib/ctypes/wintypes.py Modules/_ctypes/_ctypes.c Modules/_ctypes/_ctypes_test.c Modules/_ctypes/_ctypes_test.h Modules/_ctypes/callbacks.c Modules/_ctypes/callproc.c Modules/_ctypes/cfield.c Modules/_ctypes/ctypes.h Modules/_ctypes/ctypes_dlfcn.h Modules/_ctypes/darwin/LICENSE Modules/_ctypes/darwin/README Modules/_ctypes/darwin/README.ctypes Modules/_ctypes/darwin/dlfcn.h Modules/_ctypes/darwin/dlfcn_simple.c Modules/_ctypes/libffi/LICENSE Modules/_ctypes/libffi/README Modules/_ctypes/libffi/aclocal.m4 Modules/_ctypes/libffi/config.guess Modules/_ctypes/libffi/config.sub Modules/_ctypes/libffi/configure Modules/_ctypes/libffi/configure.ac Modules/_ctypes/libffi/fficonfig.h.in Modules/_ctypes/libffi/fficonfig.py.in Modules/_ctypes/libffi/include/ffi.h.in Modules/_ctypes/libffi/include/ffi_common.h Modules/_ctypes/libffi/src/alpha/ffi.c Modules/_ctypes/libffi/src/alpha/ffitarget.h Modules/_ctypes/libffi/src/alpha/osf.S Modules/_ctypes/libffi/src/arm/ffi.c Modules/_ctypes/libffi/src/arm/ffitarget.h Modules/_ctypes/libffi/src/arm/sysv.S Modules/_ctypes/libffi/src/cris/ffi.c Modules/_ctypes/libffi/src/cris/ffitarget.h Modules/_ctypes/libffi/src/cris/sysv.S Modules/_ctypes/libffi/src/frv/eabi.S Modules/_ctypes/libffi/src/frv/ffi.c Modules/_ctypes/libffi/src/frv/ffitarget.h Modules/_ctypes/libffi/src/ia64/ffi.c Modules/_ctypes/libffi/src/ia64/ffitarget.h Modules/_ctypes/libffi/src/ia64/ia64_flags.h Modules/_ctypes/libffi/src/ia64/unix.S Modules/_ctypes/libffi/src/m32r/ffi.c Modules/_ctypes/libffi/src/m32r/ffitarget.h Modules/_ctypes/libffi/src/m32r/sysv.S Modules/_ctypes/libffi/src/m68k/ffi.c Modules/_ctypes/libffi/src/m68k/ffitarget.h Modules/_ctypes/libffi/src/m68k/sysv.S Modules/_ctypes/libffi/src/mips/ffi.c Modules/_ctypes/libffi/src/mips/ffitarget.h Modules/_ctypes/libffi/src/mips/n32.S Modules/_ctypes/libffi/src/mips/o32.S Modules/_ctypes/libffi/src/pa/ffi.c Modules/_ctypes/libffi/src/pa/ffitarget.h Modules/_ctypes/libffi/src/pa/linux.S Modules/_ctypes/libffi/src/powerpc/aix.S Modules/_ctypes/libffi/src/powerpc/aix_closure.S Modules/_ctypes/libffi/src/powerpc/asm.h Modules/_ctypes/libffi/src/powerpc/darwin.S Modules/_ctypes/libffi/src/powerpc/darwin_closure.S Modules/_ctypes/libffi/src/powerpc/ffi.c Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c Modules/_ctypes/libffi/src/powerpc/ffitarget.h Modules/_ctypes/libffi/src/powerpc/linux64.S Modules/_ctypes/libffi/src/powerpc/linux64_closure.S Modules/_ctypes/libffi/src/powerpc/ppc_closure.S Modules/_ctypes/libffi/src/powerpc/sysv.S Modules/_ctypes/libffi/src/prep_cif.c Modules/_ctypes/libffi/src/s390/ffi.c Modules/_ctypes/libffi/src/s390/ffitarget.h Modules/_ctypes/libffi/src/s390/sysv.S Modules/_ctypes/libffi/src/sh/ffi.c Modules/_ctypes/libffi/src/sh/ffitarget.h Modules/_ctypes/libffi/src/sh/sysv.S Modules/_ctypes/libffi/src/sh64/ffi.c Modules/_ctypes/libffi/src/sh64/ffitarget.h Modules/_ctypes/libffi/src/sh64/sysv.S Modules/_ctypes/libffi/src/sparc/ffi.c Modules/_ctypes/libffi/src/sparc/ffitarget.h Modules/_ctypes/libffi/src/sparc/v8.S Modules/_ctypes/libffi/src/sparc/v9.S Modules/_ctypes/libffi/src/x86/ffi.c Modules/_ctypes/libffi/src/x86/ffi64.c Modules/_ctypes/libffi/src/x86/ffitarget.h Modules/_ctypes/libffi/src/x86/sysv.S Modules/_ctypes/libffi/src/x86/unix64.S Modules/_ctypes/libffi/src/x86/win32.S Modules/_ctypes/libffi_arm_wince/debug.c Modules/_ctypes/libffi_arm_wince/ffi.c Modules/_ctypes/libffi_arm_wince/ffi.h Modules/_ctypes/libffi_arm_wince/ffi_common.h Modules/_ctypes/libffi_arm_wince/fficonfig.h Modules/_ctypes/libffi_arm_wince/ffitarget.h Modules/_ctypes/libffi_arm_wince/prep_cif.c Modules/_ctypes/libffi_arm_wince/sysv.asm Modules/_ctypes/libffi_msvc/LICENSE Modules/_ctypes/libffi_msvc/README Modules/_ctypes/libffi_msvc/README.ctypes Modules/_ctypes/libffi_msvc/ffi.c Modules/_ctypes/libffi_msvc/ffi.h Modules/_ctypes/libffi_msvc/ffi_common.h Modules/_ctypes/libffi_msvc/fficonfig.h Modules/_ctypes/libffi_msvc/ffitarget.h Modules/_ctypes/libffi_msvc/prep_cif.c Modules/_ctypes/libffi_msvc/types.c Modules/_ctypes/libffi_msvc/win32.S Modules/_ctypes/libffi_msvc/win32.c Modules/_ctypes/malloc_closure.c Modules/_ctypes/stgdict.c Message-ID: <20060309013534.224391E4002@bag.python.org> Author: martin.v.loewis Date: Thu Mar 9 02:35:32 2006 New Revision: 42928 Modified: python/trunk/Lib/ctypes/.CTYPES_DEVEL (props changed) python/trunk/Lib/ctypes/__init__.py (props changed) python/trunk/Lib/ctypes/_endian.py (props changed) python/trunk/Lib/ctypes/_loader.py (props changed) python/trunk/Lib/ctypes/macholib/README.ctypes (props changed) python/trunk/Lib/ctypes/macholib/__init__.py (props changed) python/trunk/Lib/ctypes/macholib/dyld.py (props changed) python/trunk/Lib/ctypes/macholib/dylib.py (props changed) python/trunk/Lib/ctypes/macholib/fetch_macholib (props changed) python/trunk/Lib/ctypes/macholib/fetch_macholib.bat (props changed) python/trunk/Lib/ctypes/macholib/framework.py (props changed) python/trunk/Lib/ctypes/test/__init__.py (props changed) python/trunk/Lib/ctypes/test/runtests.py (props changed) python/trunk/Lib/ctypes/test/test_array_in_pointer.py (props changed) python/trunk/Lib/ctypes/test/test_arrays.py (props changed) python/trunk/Lib/ctypes/test/test_bitfields.py (props changed) python/trunk/Lib/ctypes/test/test_buffers.py (props changed) python/trunk/Lib/ctypes/test/test_byteswap.py (props changed) python/trunk/Lib/ctypes/test/test_callbacks.py (props changed) python/trunk/Lib/ctypes/test/test_cast.py (props changed) python/trunk/Lib/ctypes/test/test_cfuncs.py (props changed) python/trunk/Lib/ctypes/test/test_checkretval.py (props changed) python/trunk/Lib/ctypes/test/test_errcheck.py (props changed) python/trunk/Lib/ctypes/test/test_funcptr.py (props changed) python/trunk/Lib/ctypes/test/test_functions.py (props changed) python/trunk/Lib/ctypes/test/test_incomplete.py (props changed) python/trunk/Lib/ctypes/test/test_init.py (props changed) python/trunk/Lib/ctypes/test/test_integers.py (props changed) python/trunk/Lib/ctypes/test/test_internals.py (props changed) python/trunk/Lib/ctypes/test/test_keeprefs.py (props changed) python/trunk/Lib/ctypes/test/test_leaks.py (props changed) python/trunk/Lib/ctypes/test/test_libc.py (props changed) python/trunk/Lib/ctypes/test/test_loading.py (props changed) python/trunk/Lib/ctypes/test/test_macholib.py (props changed) python/trunk/Lib/ctypes/test/test_memfunctions.py (props changed) python/trunk/Lib/ctypes/test/test_numbers.py (props changed) python/trunk/Lib/ctypes/test/test_parameters.py (props changed) python/trunk/Lib/ctypes/test/test_pointers.py (props changed) python/trunk/Lib/ctypes/test/test_posix.py (props changed) python/trunk/Lib/ctypes/test/test_prototypes.py (props changed) python/trunk/Lib/ctypes/test/test_python_api.py (props changed) python/trunk/Lib/ctypes/test/test_random_things.py (props changed) python/trunk/Lib/ctypes/test/test_refcounts.py (props changed) python/trunk/Lib/ctypes/test/test_repr.py (props changed) python/trunk/Lib/ctypes/test/test_returnfuncptrs.py (props changed) python/trunk/Lib/ctypes/test/test_simplesubclasses.py (props changed) python/trunk/Lib/ctypes/test/test_sizes.py (props changed) python/trunk/Lib/ctypes/test/test_slicing.py (props changed) python/trunk/Lib/ctypes/test/test_stringptr.py (props changed) python/trunk/Lib/ctypes/test/test_strings.py (props changed) python/trunk/Lib/ctypes/test/test_struct_fields.py (props changed) python/trunk/Lib/ctypes/test/test_structures.py (props changed) python/trunk/Lib/ctypes/test/test_unicode.py (props changed) python/trunk/Lib/ctypes/test/test_values.py (props changed) python/trunk/Lib/ctypes/test/test_win32.py (props changed) python/trunk/Lib/ctypes/wintypes.py (props changed) python/trunk/Modules/_ctypes/_ctypes.c (props changed) python/trunk/Modules/_ctypes/_ctypes_test.c (props changed) python/trunk/Modules/_ctypes/_ctypes_test.h (props changed) python/trunk/Modules/_ctypes/callbacks.c (props changed) python/trunk/Modules/_ctypes/callproc.c (props changed) python/trunk/Modules/_ctypes/cfield.c (props changed) python/trunk/Modules/_ctypes/ctypes.h (props changed) python/trunk/Modules/_ctypes/ctypes_dlfcn.h (props changed) python/trunk/Modules/_ctypes/darwin/LICENSE (props changed) python/trunk/Modules/_ctypes/darwin/README (props changed) python/trunk/Modules/_ctypes/darwin/README.ctypes (props changed) python/trunk/Modules/_ctypes/darwin/dlfcn.h (props changed) python/trunk/Modules/_ctypes/darwin/dlfcn_simple.c (props changed) python/trunk/Modules/_ctypes/libffi/LICENSE (props changed) python/trunk/Modules/_ctypes/libffi/README (props changed) python/trunk/Modules/_ctypes/libffi/aclocal.m4 (props changed) python/trunk/Modules/_ctypes/libffi/config.guess (props changed) python/trunk/Modules/_ctypes/libffi/config.sub (props changed) python/trunk/Modules/_ctypes/libffi/configure (props changed) python/trunk/Modules/_ctypes/libffi/configure.ac (props changed) python/trunk/Modules/_ctypes/libffi/fficonfig.h.in (props changed) python/trunk/Modules/_ctypes/libffi/fficonfig.py.in (props changed) python/trunk/Modules/_ctypes/libffi/include/ffi.h.in (props changed) python/trunk/Modules/_ctypes/libffi/include/ffi_common.h (props changed) python/trunk/Modules/_ctypes/libffi/src/alpha/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/alpha/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/alpha/osf.S (props changed) python/trunk/Modules/_ctypes/libffi/src/arm/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/arm/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/arm/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/cris/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/cris/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/cris/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/frv/eabi.S (props changed) python/trunk/Modules/_ctypes/libffi/src/frv/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/frv/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/ia64/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/ia64/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/ia64/ia64_flags.h (props changed) python/trunk/Modules/_ctypes/libffi/src/ia64/unix.S (props changed) python/trunk/Modules/_ctypes/libffi/src/m32r/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/m32r/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/m32r/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/m68k/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/m68k/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/m68k/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/mips/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/mips/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/mips/n32.S (props changed) python/trunk/Modules/_ctypes/libffi/src/mips/o32.S (props changed) python/trunk/Modules/_ctypes/libffi/src/pa/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/pa/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/pa/linux.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/aix.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/aix_closure.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/asm.h (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/darwin.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/darwin_closure.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/ffi_darwin.c (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/linux64.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/linux64_closure.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/ppc_closure.S (props changed) python/trunk/Modules/_ctypes/libffi/src/powerpc/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/prep_cif.c (props changed) python/trunk/Modules/_ctypes/libffi/src/s390/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/s390/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/s390/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/sh/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/sh/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/sh/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/sh64/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/sh64/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/sh64/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/sparc/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/sparc/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/sparc/v8.S (props changed) python/trunk/Modules/_ctypes/libffi/src/sparc/v9.S (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/ffi64.c (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/sysv.S (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/unix64.S (props changed) python/trunk/Modules/_ctypes/libffi/src/x86/win32.S (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/debug.c (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/ffi.h (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/ffi_common.h (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/fficonfig.h (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/prep_cif.c (props changed) python/trunk/Modules/_ctypes/libffi_arm_wince/sysv.asm (props changed) python/trunk/Modules/_ctypes/libffi_msvc/LICENSE (props changed) python/trunk/Modules/_ctypes/libffi_msvc/README (props changed) python/trunk/Modules/_ctypes/libffi_msvc/README.ctypes (props changed) python/trunk/Modules/_ctypes/libffi_msvc/ffi.c (props changed) python/trunk/Modules/_ctypes/libffi_msvc/ffi.h (props changed) python/trunk/Modules/_ctypes/libffi_msvc/ffi_common.h (props changed) python/trunk/Modules/_ctypes/libffi_msvc/fficonfig.h (props changed) python/trunk/Modules/_ctypes/libffi_msvc/ffitarget.h (props changed) python/trunk/Modules/_ctypes/libffi_msvc/prep_cif.c (props changed) python/trunk/Modules/_ctypes/libffi_msvc/types.c (props changed) python/trunk/Modules/_ctypes/libffi_msvc/win32.S (props changed) python/trunk/Modules/_ctypes/libffi_msvc/win32.c (props changed) python/trunk/Modules/_ctypes/malloc_closure.c (props changed) python/trunk/Modules/_ctypes/stgdict.c (props changed) Log: Set auto-props From python-checkins at python.org Thu Mar 9 02:42:25 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 9 Mar 2006 02:42:25 +0100 (CET) Subject: [Python-checkins] r42929 - python/trunk/Tools/scripts/svneol.py Message-ID: <20060309014225.418ED1E4002@bag.python.org> Author: tim.peters Date: Thu Mar 9 02:42:24 2006 New Revision: 42929 Added: python/trunk/Tools/scripts/svneol.py (contents, props changed) Log: Simple utility to add svn:eol-style to text files under SVN control. Like reindent.py, I expect to run this mindlessly from time to time, checking in whatever it happens to do ;-) Added: python/trunk/Tools/scripts/svneol.py ============================================================================== --- (empty file) +++ python/trunk/Tools/scripts/svneol.py Thu Mar 9 02:42:24 2006 @@ -0,0 +1,48 @@ +#! /usr/bin/env python + +""" +SVN helper script. + +Try to set the svn:eol-style property to "native" on every .py and .txt file +in the directory tree rooted at the current directory. + +Files with the svn:eol-style property already set (to anything) are skipped. + +svn will itself refuse to set this property on a file that's not under SVN +control, or that has a binary mime-type property set. This script inherits +that behavior, and passes on whatever warning message the failing "svn +propset" command produces. + +In the Python project, it's safe to invoke this script from the root of +a checkout. + +No output is produced for files that are ignored. For a file that gets +svn:eol-style set, output looks like: + + property 'svn:eol-style' set on 'Lib\ctypes\__init__.py' + +For a file not under version control: + + svn: warning: 'patch-finalizer.txt' is not under version control + +and for a file with a binary mime-type property: + + svn: File 'Lib\test\test_pep263.py' has binary mime type property + +TODO: This is slow, and especially on Windows, because it invokes a new svn +command-line operation for every .py and .txt file. +""" + +import os + +for root, dirs, files in os.walk('.'): + if '.svn' in dirs: + dirs.remove('.svn') + for fn in files: + if fn.endswith('.py') or fn.endswith('.txt'): + path = os.path.join(root, fn) + p = os.popen('svn proplist "%s"' % path) + guts = p.read() + p.close() + if 'eol-style' not in guts: + os.system('svn propset svn:eol-style native "%s"' % path) From python-checkins at python.org Thu Mar 9 02:59:28 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 9 Mar 2006 02:59:28 +0100 (CET) Subject: [Python-checkins] r42930 - in python/trunk: Include/pyarena.h Include/pyexpat.h Modules/_ctypes/libffi/src/prep_cif.c Modules/_ctypes/malloc_closure.c Modules/_ctypes/stgdict.c Modules/_elementtree.c Modules/zlib/adler32.c Modules/zlib/compress.c Modules/zlib/crc32.c Modules/zlib/crc32.h Modules/zlib/deflate.c Modules/zlib/deflate.h Modules/zlib/example.c Modules/zlib/gzio.c Modules/zlib/infback.c Modules/zlib/inffast.c Modules/zlib/inffast.h Modules/zlib/inffixed.h Modules/zlib/inflate.c Modules/zlib/inflate.h Modules/zlib/inftrees.c Modules/zlib/inftrees.h Modules/zlib/minigzip.c Modules/zlib/trees.c Modules/zlib/trees.h Modules/zlib/uncompr.c Modules/zlib/zconf.h Modules/zlib/zconf.in.h Modules/zlib/zlib.h Modules/zlib/zutil.c Modules/zlib/zutil.h PCbuild/make_buildinfo.c Python/pyarena.c Tools/scripts/svneol.py Message-ID: <20060309015928.C85631E4002@bag.python.org> Author: tim.peters Date: Thu Mar 9 02:59:27 2006 New Revision: 42930 Modified: python/trunk/Include/pyarena.h (props changed) python/trunk/Include/pyexpat.h (props changed) python/trunk/Modules/_ctypes/libffi/src/prep_cif.c (props changed) python/trunk/Modules/_ctypes/malloc_closure.c (props changed) python/trunk/Modules/_ctypes/stgdict.c (props changed) python/trunk/Modules/_elementtree.c (props changed) python/trunk/Modules/zlib/adler32.c (props changed) python/trunk/Modules/zlib/compress.c (props changed) python/trunk/Modules/zlib/crc32.c (props changed) python/trunk/Modules/zlib/crc32.h (props changed) python/trunk/Modules/zlib/deflate.c (props changed) python/trunk/Modules/zlib/deflate.h (props changed) python/trunk/Modules/zlib/example.c (props changed) python/trunk/Modules/zlib/gzio.c (props changed) python/trunk/Modules/zlib/infback.c (props changed) python/trunk/Modules/zlib/inffast.c (props changed) python/trunk/Modules/zlib/inffast.h (props changed) python/trunk/Modules/zlib/inffixed.h (props changed) python/trunk/Modules/zlib/inflate.c (props changed) python/trunk/Modules/zlib/inflate.h (props changed) python/trunk/Modules/zlib/inftrees.c (props changed) python/trunk/Modules/zlib/inftrees.h (props changed) python/trunk/Modules/zlib/minigzip.c (props changed) python/trunk/Modules/zlib/trees.c (props changed) python/trunk/Modules/zlib/trees.h (props changed) python/trunk/Modules/zlib/uncompr.c (props changed) python/trunk/Modules/zlib/zconf.h (props changed) python/trunk/Modules/zlib/zconf.in.h (props changed) python/trunk/Modules/zlib/zlib.h (props changed) python/trunk/Modules/zlib/zutil.c (props changed) python/trunk/Modules/zlib/zutil.h (props changed) python/trunk/PCbuild/make_buildinfo.c (contents, props changed) python/trunk/Python/pyarena.c (props changed) python/trunk/Tools/scripts/svneol.py Log: Taught svneol to look at .c and .h files too, and it found a bunch more in need of svn:eol-style. Modified: python/trunk/PCbuild/make_buildinfo.c ============================================================================== --- python/trunk/PCbuild/make_buildinfo.c (original) +++ python/trunk/PCbuild/make_buildinfo.c Thu Mar 9 02:59:27 2006 @@ -1,89 +1,89 @@ -#include -#include -#include -#include - -/* This file creates the getbuildinfo.o object, by first - invoking subwcrev.exe (if found), and then invoking cl.exe. - As a side effect, it might generate PCBuild\getbuildinfo2.c - also. If this isn't a subversion checkout, or subwcrev isn't - found, it compiles ..\\Modules\\getbuildinfo.c instead. - - Currently, subwcrev.exe is found from the registry entries - of TortoiseSVN. - - No attempt is made to place getbuildinfo.o into the proper - binary directory. This isn't necessary, as this tool is - invoked as a pre-link step for pythoncore, so that overwrites - any previous getbuildinfo.o. - -*/ - -int make_buildinfo2() -{ - struct _stat st; - HKEY hTortoise; - char command[500]; - DWORD type, size; - if (_stat(".svn", &st) < 0) - return 0; - if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS && - RegOpenKey(HKEY_CURRENT_USER, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS) - /* Tortoise not installed */ - return 0; - command[0] = '"'; /* quote the path to the executable */ - size = sizeof(command) - 1; - if (RegQueryValueEx(hTortoise, "Directory", 0, &type, command+1, &size) != ERROR_SUCCESS || - type != REG_SZ) - /* Registry corrupted */ - return 0; - strcat(command, "bin\\subwcrev.exe"); - if (_stat(command+1, &st) < 0) - /* subwcrev.exe not part of the release */ - return 0; - strcat(command, "\" .. ..\\Modules\\getbuildinfo.c getbuildinfo2.c"); - puts(command); fflush(stdout); - if (system(command) < 0) - return 0; - return 1; -} - -int main(int argc, char*argv[]) -{ - char command[500] = "cl.exe -c -D_WIN32 -DUSE_DL_EXPORT -D_WINDOWS -DWIN32 -D_WINDLL "; - int do_unlink, result; - if (argc != 2) { - fprintf(stderr, "make_buildinfo $(ConfigurationName)\n"); - return EXIT_FAILURE; - } - if (strcmp(argv[1], "Release") == 0) { - strcat(command, "-MD "); - } - else if (strcmp(argv[1], "Debug") == 0) { - strcat(command, "-D_DEBUG -MDd "); - } - else if (strcmp(argv[1], "ReleaseItanium") == 0) { - strcat(command, "-MD /USECL:MS_ITANIUM "); - } - else if (strcmp(argv[1], "ReleaseAMD64") == 0) { - strcat(command, "-MD "); - strcat(command, "-MD /USECL:MS_OPTERON "); - } - else { - fprintf(stderr, "unsupported configuration %s\n", argv[1]); - return EXIT_FAILURE; - } - - if ((do_unlink = make_buildinfo2())) - strcat(command, "getbuildinfo2.c -DSUBWCREV "); - else - strcat(command, "..\\Modules\\getbuildinfo.c"); - strcat(command, " -Fogetbuildinfo.o -I..\\Include -I..\\PC"); - puts(command); fflush(stdout); - result = system(command); - if (do_unlink) - unlink("getbuildinfo2.c"); - if (result < 0) - return EXIT_FAILURE; - return 0; +#include +#include +#include +#include + +/* This file creates the getbuildinfo.o object, by first + invoking subwcrev.exe (if found), and then invoking cl.exe. + As a side effect, it might generate PCBuild\getbuildinfo2.c + also. If this isn't a subversion checkout, or subwcrev isn't + found, it compiles ..\\Modules\\getbuildinfo.c instead. + + Currently, subwcrev.exe is found from the registry entries + of TortoiseSVN. + + No attempt is made to place getbuildinfo.o into the proper + binary directory. This isn't necessary, as this tool is + invoked as a pre-link step for pythoncore, so that overwrites + any previous getbuildinfo.o. + +*/ + +int make_buildinfo2() +{ + struct _stat st; + HKEY hTortoise; + char command[500]; + DWORD type, size; + if (_stat(".svn", &st) < 0) + return 0; + if (RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS && + RegOpenKey(HKEY_CURRENT_USER, "Software\\TortoiseSVN", &hTortoise) != ERROR_SUCCESS) + /* Tortoise not installed */ + return 0; + command[0] = '"'; /* quote the path to the executable */ + size = sizeof(command) - 1; + if (RegQueryValueEx(hTortoise, "Directory", 0, &type, command+1, &size) != ERROR_SUCCESS || + type != REG_SZ) + /* Registry corrupted */ + return 0; + strcat(command, "bin\\subwcrev.exe"); + if (_stat(command+1, &st) < 0) + /* subwcrev.exe not part of the release */ + return 0; + strcat(command, "\" .. ..\\Modules\\getbuildinfo.c getbuildinfo2.c"); + puts(command); fflush(stdout); + if (system(command) < 0) + return 0; + return 1; +} + +int main(int argc, char*argv[]) +{ + char command[500] = "cl.exe -c -D_WIN32 -DUSE_DL_EXPORT -D_WINDOWS -DWIN32 -D_WINDLL "; + int do_unlink, result; + if (argc != 2) { + fprintf(stderr, "make_buildinfo $(ConfigurationName)\n"); + return EXIT_FAILURE; + } + if (strcmp(argv[1], "Release") == 0) { + strcat(command, "-MD "); + } + else if (strcmp(argv[1], "Debug") == 0) { + strcat(command, "-D_DEBUG -MDd "); + } + else if (strcmp(argv[1], "ReleaseItanium") == 0) { + strcat(command, "-MD /USECL:MS_ITANIUM "); + } + else if (strcmp(argv[1], "ReleaseAMD64") == 0) { + strcat(command, "-MD "); + strcat(command, "-MD /USECL:MS_OPTERON "); + } + else { + fprintf(stderr, "unsupported configuration %s\n", argv[1]); + return EXIT_FAILURE; + } + + if ((do_unlink = make_buildinfo2())) + strcat(command, "getbuildinfo2.c -DSUBWCREV "); + else + strcat(command, "..\\Modules\\getbuildinfo.c"); + strcat(command, " -Fogetbuildinfo.o -I..\\Include -I..\\PC"); + puts(command); fflush(stdout); + result = system(command); + if (do_unlink) + unlink("getbuildinfo2.c"); + if (result < 0) + return EXIT_FAILURE; + return 0; } \ No newline at end of file Modified: python/trunk/Tools/scripts/svneol.py ============================================================================== --- python/trunk/Tools/scripts/svneol.py (original) +++ python/trunk/Tools/scripts/svneol.py Thu Mar 9 02:59:27 2006 @@ -3,8 +3,8 @@ """ SVN helper script. -Try to set the svn:eol-style property to "native" on every .py and .txt file -in the directory tree rooted at the current directory. +Try to set the svn:eol-style property to "native" on every .py, .txt, .c and +.h file in the directory tree rooted at the current directory. Files with the svn:eol-style property already set (to anything) are skipped. @@ -30,16 +30,19 @@ svn: File 'Lib\test\test_pep263.py' has binary mime type property TODO: This is slow, and especially on Windows, because it invokes a new svn -command-line operation for every .py and .txt file. +command-line operation for every file with the right extension. """ +import re import os +possible_text_file = re.compile(r"\.([hc]|py|txt)$").search + for root, dirs, files in os.walk('.'): if '.svn' in dirs: dirs.remove('.svn') for fn in files: - if fn.endswith('.py') or fn.endswith('.txt'): + if possible_text_file(fn): path = os.path.join(root, fn) p = os.popen('svn proplist "%s"' % path) guts = p.read() From python-checkins at python.org Thu Mar 9 03:20:10 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 9 Mar 2006 03:20:10 +0100 (CET) Subject: [Python-checkins] r42931 - python/trunk/Tools/scripts/svneol.py Message-ID: <20060309022010.187361E4002@bag.python.org> Author: martin.v.loewis Date: Thu Mar 9 03:20:05 2006 New Revision: 42931 Modified: python/trunk/Tools/scripts/svneol.py Log: Directly read working copy data to obtain list of properties. Modified: python/trunk/Tools/scripts/svneol.py ============================================================================== --- python/trunk/Tools/scripts/svneol.py (original) +++ python/trunk/Tools/scripts/svneol.py Thu Mar 9 03:20:05 2006 @@ -28,14 +28,43 @@ and for a file with a binary mime-type property: svn: File 'Lib\test\test_pep263.py' has binary mime type property - -TODO: This is slow, and especially on Windows, because it invokes a new svn -command-line operation for every file with the right extension. """ import re import os +def proplist(root, fn): + "Return a list of property names for file fn in directory root" + path = os.path.join(root, ".svn", "props", fn+".svn-work") + try: + f = open(path) + except IOError: + # no properties file: not under version control + return [] + result = [] + while 1: + # key-value pairs, of the form + # K + # NL + # V length + # NL + # END + line = f.readline() + if line.startswith("END"): + break + assert line.startswith("K ") + L = int(line.split()[1]) + key = f.read(L) + result.append(key) + f.readline() + line = f.readline() + assert line.startswith("V ") + L = int(line.split()[1]) + value = f.read(L) + f.readline() + f.close() + return result + possible_text_file = re.compile(r"\.([hc]|py|txt)$").search for root, dirs, files in os.walk('.'): @@ -43,9 +72,6 @@ dirs.remove('.svn') for fn in files: if possible_text_file(fn): - path = os.path.join(root, fn) - p = os.popen('svn proplist "%s"' % path) - guts = p.read() - p.close() - if 'eol-style' not in guts: + if 'svn:eol-style' not in proplist(root, fn): + path = os.path.join(root, fn) os.system('svn propset svn:eol-style native "%s"' % path) From tim.peters at gmail.com Thu Mar 9 03:39:20 2006 From: tim.peters at gmail.com (Tim Peters) Date: Wed, 8 Mar 2006 21:39:20 -0500 Subject: [Python-checkins] r42931 - python/trunk/Tools/scripts/svneol.py In-Reply-To: <20060309022010.187361E4002@bag.python.org> References: <20060309022010.187361E4002@bag.python.org> Message-ID: <1f7befae0603081839i70404664n1b6b7262212e5d5f@mail.gmail.com> > Author: martin.v.loewis > Date: Thu Mar 9 03:20:05 2006 > New Revision: 42931 > > Modified: > python/trunk/Tools/scripts/svneol.py > Log: > Directly read working copy data to obtain list of properties. Bravo! This makes it _enormously_ faster on WinXP. I can afford to run it every 10 seconds now ;-) From python-checkins at python.org Thu Mar 9 06:58:12 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 9 Mar 2006 06:58:12 +0100 (CET) Subject: [Python-checkins] r42932 - in python/trunk: Lib/test/test_cmd_line.py Modules/main.c Python/sysmodule.c Message-ID: <20060309055812.A18E11E4002@bag.python.org> Author: neal.norwitz Date: Thu Mar 9 06:58:11 2006 New Revision: 42932 Modified: python/trunk/Lib/test/test_cmd_line.py python/trunk/Modules/main.c python/trunk/Python/sysmodule.c Log: Try to be a bit more consistent on all platforms: python . python < . both print a message, return non-zero and do not core dump. Modified: python/trunk/Lib/test/test_cmd_line.py ============================================================================== --- python/trunk/Lib/test/test_cmd_line.py (original) +++ python/trunk/Lib/test/test_cmd_line.py Thu Mar 9 06:58:11 2006 @@ -16,19 +16,8 @@ return subprocess.call([sys.executable, cmd_line], stderr=subprocess.PIPE) def test_directories(self): - if sys.platform == 'win32': - # Exit code for "python .", Error 13: permission denied = 2 - expected_exit_code = 2 - elif sys.platform.startswith('freebsd'): - # On FreeBSD, it more likely raise SyntaxError for binary - # directory data. - expected_exit_code = 1 - else: - # Linux has no problem with "python .", Exit code = 0 - expected_exit_code = 0 - self.assertEqual(self.exit_code('.'), expected_exit_code) - - self.assertTrue(self.exit_code('< .') != 0) + self.assertNotEqual(self.exit_code('.'), 0) + self.assertNotEqual(self.exit_code('< .'), 0) def verify_valid_flag(self, cmd_line): data = self.start_python(cmd_line) Modified: python/trunk/Modules/main.c ============================================================================== --- python/trunk/Modules/main.c (original) +++ python/trunk/Modules/main.c Thu Mar 9 06:58:11 2006 @@ -364,7 +364,8 @@ struct stat sb; if (fstat(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) { - fprintf(stderr, "%s: warning '%s' is a directory\n", argv[0], filename); + fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename); + return 1; } } } Modified: python/trunk/Python/sysmodule.c ============================================================================== --- python/trunk/Python/sysmodule.c (original) +++ python/trunk/Python/sysmodule.c Thu Mar 9 06:58:11 2006 @@ -1037,7 +1037,10 @@ struct stat sb; if (fstat(fileno(stdin), &sb) == 0 && S_ISDIR(sb.st_mode)) { - Py_FatalError(" is a directory"); + /* There's nothing more we can do. */ + /* Py_FatalError() will core dump, so just exit. */ + PySys_WriteStderr("Python error: is a directory, cannot continue\n"); + exit(EXIT_FAILURE); } } From python-checkins at python.org Thu Mar 9 07:45:26 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 9 Mar 2006 07:45:26 +0100 (CET) Subject: [Python-checkins] r42933 - peps/trunk/pep-0356.txt Message-ID: <20060309064526.1D9DF1E4038@bag.python.org> Author: neal.norwitz Date: Thu Mar 9 07:45:25 2006 New Revision: 42933 Modified: peps/trunk/pep-0356.txt Log: ctypes was moved into the stdlib Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Thu Mar 9 07:45:25 2006 @@ -73,6 +73,9 @@ - Fredrik Lundh's ElementTree and cElementTree + - Add ctypes to the standard library, make it an optional component + in the windows installer. Thomas Heller will maintain it. + Planned features for 2.5 @@ -98,9 +101,6 @@ Add wsgiref to the standard library. (Phillip Eby has volunteered to maintain it.) - Add ctypes to the standard library, make it an optional component - in the windows installer. Thomas Heller will maintain it. - Add pure python pgen module. Add support for the Unicode 4.1 UCD. From python-checkins at python.org Thu Mar 9 08:21:39 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 08:21:39 +0100 (CET) Subject: [Python-checkins] r42934 - python/trunk/Lib/test/test_ctypes.py Message-ID: <20060309072139.431421E400A@bag.python.org> Author: thomas.heller Date: Thu Mar 9 08:21:33 2006 New Revision: 42934 Modified: python/trunk/Lib/test/test_ctypes.py Log: Replace the trivial ctypes test (did only an import) with the real test suite. Modified: python/trunk/Lib/test/test_ctypes.py ============================================================================== --- python/trunk/Lib/test/test_ctypes.py (original) +++ python/trunk/Lib/test/test_ctypes.py Thu Mar 9 08:21:33 2006 @@ -1,4 +1,12 @@ -# trivial test +import unittest -import _ctypes -import ctypes +from test.test_support import run_suite +import ctypes.test + +def test_main(): + skipped, testcases = ctypes.test.get_tests(ctypes.test, "test_*.py", verbosity=0) + suites = [unittest.makeSuite(t) for t in testcases] + run_suite(unittest.TestSuite(suites)) + +if __name__ == "__main__": + test_main() From python-checkins at python.org Thu Mar 9 08:32:28 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 08:32:28 +0100 (CET) Subject: [Python-checkins] r42935 - peps/trunk/pep-0291.txt Message-ID: <20060309073228.E4F771E4009@bag.python.org> Author: thomas.heller Date: Thu Mar 9 08:32:28 2006 New Revision: 42935 Modified: peps/trunk/pep-0291.txt Log: Added note about ctypes backwards compatibility. Modified: peps/trunk/pep-0291.txt ============================================================================== --- peps/trunk/pep-0291.txt (original) +++ peps/trunk/pep-0291.txt Thu Mar 9 08:32:28 2006 @@ -95,7 +95,7 @@ modulefinder Thomas Heller 2.2 Just van Rossum platform Marc-Andre Lemburg 1.5.2 - + ctypes Thomas Heller 2.3 Tool Maintainer(s) Python Version ---- ------------- -------------- From python-checkins at python.org Thu Mar 9 10:43:54 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 10:43:54 +0100 (CET) Subject: [Python-checkins] r42936 - python/trunk/Lib/ctypes/test/test_byteswap.py Message-ID: <20060309094354.190F41E400A@bag.python.org> Author: thomas.heller Date: Thu Mar 9 10:43:53 2006 New Revision: 42936 Modified: python/trunk/Lib/ctypes/test/test_byteswap.py Log: Disable the testcase that crashes solaris. Modified: python/trunk/Lib/ctypes/test/test_byteswap.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_byteswap.py (original) +++ python/trunk/Lib/ctypes/test/test_byteswap.py Thu Mar 9 10:43:53 2006 @@ -198,7 +198,8 @@ pass self.assertRaises(TypeError, setattr, S, "_fields_", [("s", T)]) - def test_struct_fields(self): + # crashes on solaris with a core dump. + def X_test_struct_fields(self): if sys.byteorder == "little": base = BigEndianStructure fmt = ">bhid" From python-checkins at python.org Thu Mar 9 11:16:42 2006 From: python-checkins at python.org (georg.brandl) Date: Thu, 9 Mar 2006 11:16:42 +0100 (CET) Subject: [Python-checkins] r42937 - python/trunk/Doc/lib/libcodecs.tex Message-ID: <20060309101642.C7C661E400A@bag.python.org> Author: georg.brandl Date: Thu Mar 9 11:16:42 2006 New Revision: 42937 Modified: python/trunk/Doc/lib/libcodecs.tex Log: typo Modified: python/trunk/Doc/lib/libcodecs.tex ============================================================================== --- python/trunk/Doc/lib/libcodecs.tex (original) +++ python/trunk/Doc/lib/libcodecs.tex Thu Mar 9 11:16:42 2006 @@ -1080,7 +1080,7 @@ \lineiv{undefined} {} {any} - {Raise an exception for all conversion. Can be used as the + {Raise an exception for all conversions. Can be used as the system encoding if no automatic coercion between byte and Unicode strings is desired.} From python-checkins at python.org Thu Mar 9 14:27:15 2006 From: python-checkins at python.org (georg.brandl) Date: Thu, 9 Mar 2006 14:27:15 +0100 (CET) Subject: [Python-checkins] r42938 - in python/trunk/Lib: markupbase.py test/test_htmlparser.py Message-ID: <20060309132715.B11091E400A@bag.python.org> Author: georg.brandl Date: Thu Mar 9 14:27:14 2006 New Revision: 42938 Modified: python/trunk/Lib/markupbase.py python/trunk/Lib/test/test_htmlparser.py Log: Bug #1442874: handle "", the empty SGML comment Modified: python/trunk/Lib/markupbase.py ============================================================================== --- python/trunk/Lib/markupbase.py (original) +++ python/trunk/Lib/markupbase.py Thu Mar 9 14:27:14 2006 @@ -76,13 +76,16 @@ rawdata = self.rawdata j = i + 2 assert rawdata[i:j] == "": + # the empty comment + return j + 1 if rawdata[j:j+1] in ("-", ""): # Start of comment followed by buffer boundary, # or just a buffer boundary. return -1 # A simple, practical version could look like: ((name|stringlit) S*) + '>' n = len(rawdata) - if rawdata[j:j+1] == '--': #comment + if rawdata[j:j+2] == '--': #comment # Locate --.*-- as the body of the comment return self.parse_comment(i) elif rawdata[j] == '[': #marked section Modified: python/trunk/Lib/test/test_htmlparser.py ============================================================================== --- python/trunk/Lib/test/test_htmlparser.py (original) +++ python/trunk/Lib/test/test_htmlparser.py Thu Mar 9 14:27:14 2006 @@ -115,7 +115,7 @@ sample text “ - + """, [ ("data", "\n"), From python-checkins at python.org Thu Mar 9 14:56:26 2006 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 9 Mar 2006 14:56:26 +0100 (CET) Subject: [Python-checkins] r42939 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060309135626.8A1E91E400A@bag.python.org> Author: andrew.kuchling Date: Thu Mar 9 14:56:25 2006 New Revision: 42939 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Write a section Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Thu Mar 9 14:56:25 2006 @@ -29,7 +29,91 @@ %====================================================================== \section{PEP 308: Conditional Expressions} -% XXX write this +For a long time, people have been requesting a way to write +conditional expressions, expressions that return value A or value B +depending on whether a Boolean value is true or false. A conditional +expression lets you write a single assignment statement that has the +same effect as the following: + +\begin{verbatim} +if condition: + x = true_value +else: + x = false_value +\end{verbatim} + +There have been endless tedious discussions of syntax on both +python-dev and comp.lang.python, and even a vote that found the +majority of voters wanted some way to write conditional expressions, +but there was no syntax that was clearly preferred by a majority. +Candidates include C's \code{cond ? true_v : false_v}, +\code{if cond then true_v else false_v}, and 16 other variations. + +GvR eventually chose a surprising syntax: + +\begin{verbatim} +x = true_value if condition else false_value +\end{verbatim} + +Evaluation is still lazy as in existing Boolean expression, so the +evaluation jumps around a bit. The \var{condition} expression is +evaluated first, and the \var{true_value} expression is evaluated only +if the condition was true. Similarly, the \var{false_value} +expression is only evaluated when the condition is false. + +This syntax may seem strange and backwards; why does the condition go +in the \emph{middle} of the expression, and not in the front as in C's +\code{c ? x : y}? The decision was checked by applying the new syntax +to the modules in the standard library and seeing how the resulting +code read. In many cases where a conditional expression is used, one +value seems to be the 'common case' and one value is an 'exceptional +case', used only on rarer occasions when the condition isn't met. The +conditional syntax makes this pattern a bit more obvious: + +\begin{verbatim} +contents = ((doc + '\n') if doc else '') +\end{verbatim} + +I read the above statement as meaning ``here \var{contents} is +usually assigned a value of \code{doc+'\n'}; sometimes +\var{doc} is empty, in which special case an empty string is returned.'' +I doubt I will use conditional expressions very often where there +isn't a clear common and uncommon case. + +There was some discussion of whether the language should require +surrounding conditional expressions with parentheses. The decision +was made to \emph{not} require parentheses in the Python language's +grammar, but as a matter of style I think you should always use them. +Consider these two statements: + +\begin{verbatim} +# First version -- no parens +level = 1 if logging else 0 + +# Second version -- with parens +level = (1 if logging else 0) +\end{verbatim} + +In the first version, I think a reader's eye might group the statement +into 'level = 1', 'if logging', 'else 0', and think that the condition +decides whether the assignment to \var{level} is performed. The +second version reads better, in my opinion, because it makes it clear +that the assignment is always performed and the choice is being made +between two values. + +Another reason for including the brackets: a few odd combinations of +list comprehensions and lambdas could look like incorrect conditional +expressions. See \pep{308} for some examples. If you put parentheses +around your conditional expressions, you won't run into this case. + + +\begin{seealso} + +\seepep{308}{Conditional Expressions}{PEP written by +Guido van Rossum and Raymond D. Hettinger; implemented by Thomas +Wouters.} + +\end{seealso} %====================================================================== From python-checkins at python.org Thu Mar 9 14:57:28 2006 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 9 Mar 2006 14:57:28 +0100 (CET) Subject: [Python-checkins] r42940 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060309135728.C7F631E400A@bag.python.org> Author: andrew.kuchling Date: Thu Mar 9 14:57:28 2006 New Revision: 42940 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Markup fix Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Thu Mar 9 14:57:28 2006 @@ -75,7 +75,7 @@ \end{verbatim} I read the above statement as meaning ``here \var{contents} is -usually assigned a value of \code{doc+'\n'}; sometimes +usually assigned a value of \code{doc+'\e n'}; sometimes \var{doc} is empty, in which special case an empty string is returned.'' I doubt I will use conditional expressions very often where there isn't a clear common and uncommon case. From jimjjewett at gmail.com Thu Mar 9 15:52:05 2006 From: jimjjewett at gmail.com (Jim Jewett) Date: Thu, 9 Mar 2006 09:52:05 -0500 Subject: [Python-checkins] r42931 - python/trunk/Tools/scripts/svneol.py In-Reply-To: <20060309022010.187361E4002@bag.python.org> References: <20060309022010.187361E4002@bag.python.org> Message-ID: Is it OK (in this case) to mix f.readline() and f.read()? Would it be safer to just readline the data lines as well, but assert their length? On 3/8/06, martin.v.loewis wrote: > Author: martin.v.loewis > Date: Thu Mar 9 03:20:05 2006 > New Revision: 42931 > > Modified: > python/trunk/Tools/scripts/svneol.py > Log: > Directly read working copy data to obtain list of properties. > > > Modified: python/trunk/Tools/scripts/svneol.py > ============================================================================== > --- python/trunk/Tools/scripts/svneol.py (original) > +++ python/trunk/Tools/scripts/svneol.py Thu Mar 9 03:20:05 2006 > @@ -28,14 +28,43 @@ > and for a file with a binary mime-type property: > > svn: File 'Lib\test\test_pep263.py' has binary mime type property > - > -TODO: This is slow, and especially on Windows, because it invokes a new svn > -command-line operation for every file with the right extension. > """ > > import re > import os > > +def proplist(root, fn): > + "Return a list of property names for file fn in directory root" > + path = os.path.join(root, ".svn", "props", fn+".svn-work") > + try: > + f = open(path) > + except IOError: > + # no properties file: not under version control > + return [] > + result = [] > + while 1: > + # key-value pairs, of the form > + # K > + # NL > + # V length > + # NL > + # END > + line = f.readline() > + if line.startswith("END"): > + break > + assert line.startswith("K ") > + L = int(line.split()[1]) > + key = f.read(L) > + result.append(key) > + f.readline() > + line = f.readline() > + assert line.startswith("V ") > + L = int(line.split()[1]) > + value = f.read(L) > + f.readline() > + f.close() > + return result > + > possible_text_file = re.compile(r"\.([hc]|py|txt)$").search > > for root, dirs, files in os.walk('.'): > @@ -43,9 +72,6 @@ > dirs.remove('.svn') > for fn in files: > if possible_text_file(fn): > - path = os.path.join(root, fn) > - p = os.popen('svn proplist "%s"' % path) > - guts = p.read() > - p.close() > - if 'eol-style' not in guts: > + if 'svn:eol-style' not in proplist(root, fn): > + path = os.path.join(root, fn) > os.system('svn propset svn:eol-style native "%s"' % path) > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From theller at python.net Thu Mar 9 18:13:05 2006 From: theller at python.net (Thomas Heller) Date: Thu, 09 Mar 2006 18:13:05 +0100 Subject: [Python-checkins] r42929 - python/trunk/Tools/scripts/svneol.py In-Reply-To: <20060309014225.418ED1E4002@bag.python.org> References: <20060309014225.418ED1E4002@bag.python.org> Message-ID: <44106221.3090001@python.net> tim.peters wrote: > Author: tim.peters > Date: Thu Mar 9 02:42:24 2006 > New Revision: 42929 > > Added: > python/trunk/Tools/scripts/svneol.py (contents, props changed) > Log: > Simple utility to add svn:eol-style to text files under > SVN control. Like reindent.py, I expect to run this > mindlessly from time to time, checking in whatever it > happens to do ;-) Should 'sln' and 'vcproj' be added to the extensions list? I think these are text-files too. Although PCBuild\pcbuild.sln has a binary mime-type property, so the script would not change that. From theller at python.net Thu Mar 9 18:13:05 2006 From: theller at python.net (Thomas Heller) Date: Thu, 09 Mar 2006 18:13:05 +0100 Subject: [Python-checkins] r42929 - python/trunk/Tools/scripts/svneol.py In-Reply-To: <20060309014225.418ED1E4002@bag.python.org> References: <20060309014225.418ED1E4002@bag.python.org> Message-ID: <44106221.3090001@python.net> tim.peters wrote: > Author: tim.peters > Date: Thu Mar 9 02:42:24 2006 > New Revision: 42929 > > Added: > python/trunk/Tools/scripts/svneol.py (contents, props changed) > Log: > Simple utility to add svn:eol-style to text files under > SVN control. Like reindent.py, I expect to run this > mindlessly from time to time, checking in whatever it > happens to do ;-) Should 'sln' and 'vcproj' be added to the extensions list? I think these are text-files too. Although PCBuild\pcbuild.sln has a binary mime-type property, so the script would not change that. From python-checkins at python.org Thu Mar 9 18:35:21 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 18:35:21 +0100 (CET) Subject: [Python-checkins] r42941 - python/trunk/PCbuild/_ctypes.vcproj python/trunk/PCbuild/_ctypes_test.vcproj python/trunk/PCbuild/pcbuild.sln Message-ID: <20060309173521.468E21E4049@bag.python.org> Author: thomas.heller Date: Thu Mar 9 18:35:20 2006 New Revision: 42941 Added: python/trunk/PCbuild/_ctypes.vcproj (contents, props changed) python/trunk/PCbuild/_ctypes_test.vcproj (contents, props changed) Modified: python/trunk/PCbuild/pcbuild.sln Log: Added VC project files to build _ctypes.pyd and _ctypes_test.pyd on Windows. Settings for 64-bit Windows are missing. I've left in the 64-bit warnings to remind me to port ctypes to Py_ssize_t. Added: python/trunk/PCbuild/_ctypes.vcproj ============================================================================== --- (empty file) +++ python/trunk/PCbuild/_ctypes.vcproj Thu Mar 9 18:35:20 2006 @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: python/trunk/PCbuild/_ctypes_test.vcproj ============================================================================== --- (empty file) +++ python/trunk/PCbuild/_ctypes_test.vcproj Thu Mar 9 18:35:20 2006 @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: python/trunk/PCbuild/pcbuild.sln ============================================================================== Binary files. No diff available. From python-checkins at python.org Thu Mar 9 18:39:53 2006 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 9 Mar 2006 18:39:53 +0100 (CET) Subject: [Python-checkins] r42942 - peps/trunk/pep-0343.txt Message-ID: <20060309173953.DA1CA1E400B@bag.python.org> Author: guido.van.rossum Date: Thu Mar 9 18:39:53 2006 New Revision: 42942 Modified: peps/trunk/pep-0343.txt Log: Update this PEP to reflect the new design: exceptions are swallowed only when __exit__ returns a true value. Modified: peps/trunk/pep-0343.txt ============================================================================== --- peps/trunk/pep-0343.txt (original) +++ peps/trunk/pep-0343.txt Thu Mar 9 18:39:53 2006 @@ -236,7 +236,9 @@ except: # The exceptional case is handled here exc = False - exit(*sys.exc_info()) + if not exit(*sys.exc_info()): + raise + # The exception is swallowed if exit() returns true finally: # The normal and non-local-goto cases are handled here if exc: @@ -277,17 +279,21 @@ BLOCK, ctx.__exit__() is called with three arguments representing the exception type, value, and traceback. - IMPORTANT: if ctx.__exit__() is passed exception information, it - *must* re-raise the exception, unless it wants the exception to be - ignored. That is, if ctx.__exit__() returns normally, execution + IMPORTANT: if ctx.__exit__() returns a "true" value, the exception + is "swallowed". That is, if it returns "true", execution continues at the next statement after the with-statement, even if an exception happened inside the with-statement. However, if the with-statement was left via a non-local goto (break, continue or return), this non-local return is resumed when ctx.__exit__() - returns normally. The motivation for this detail is to make a - try/except block in a context manager created from a decorated - generator behave exactly as if the body of the generator were - expanded in-line at the place of the with-statement. + returns regardless of the return value. The motivation for this + detail is to make it possible for ctx.__exit__() to swallow + exceptions, without making it too easy (since the default return + value, None, is false and this causes the exception to be + re-raised). The main use case for swallowing exceptions is to + make it possible to write the @contextmanager decorator so thatn + that a try/except block in a decorated generator behaves exactly + as if the body of the generator were expanded in-line at the place + of the with-statement. The motivation for passing the exception details to __exit__(), as opposed to the argument-less __exit__() from PEP 310, was given by @@ -351,10 +357,9 @@ else: try: self.gen.throw(type, value, traceback) - except (type, StopIteration): - return - else: - raise RuntimeError("generator caught exception") + return True + except StopIteration: + return True def contextmanager(func): def helper(*args, **kwds): From python-checkins at python.org Thu Mar 9 19:22:06 2006 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 9 Mar 2006 19:22:06 +0100 (CET) Subject: [Python-checkins] r42943 - peps/trunk/pep-0352.txt Message-ID: <20060309182206.E4A4B1E400C@bag.python.org> Author: andrew.kuchling Date: Thu Mar 9 19:22:01 2006 New Revision: 42943 Modified: peps/trunk/pep-0352.txt Log: Various edits to improve sentences Modified: peps/trunk/pep-0352.txt ============================================================================== --- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Thu Mar 9 19:22:01 2006 @@ -17,11 +17,11 @@ In Python 2.4 and before, any (classic) class can be raised as an exception. The plan is to allow new-style classes starting in Python 2.5, but this makes the problem worse -- it would mean *any* class (or -instance) can be raised (this is not the case in the final version; +instance) can be raised! (This is not the case in the final version; only built-in exceptions can be new-style which means you need to inherit from a built-in exception to have user-defined exceptions also -by new-style)! This is a problem since it -prevents any guarantees to be made about the interface of exceptions. +be new-style) This is a problem because it +prevents any guarantees from being made about the interface of exceptions. This PEP proposes introducing a new superclass that all raised objects must inherit from. Imposing the restriction will allow a standard interface for exceptions to exist that can be relied upon. @@ -159,8 +159,7 @@ SystemExit has been moved for similar reasons. Since the exception is raised when ``sys.exit()`` is called the interpreter should normally be allowed to terminate. Unfortunately overly broad ``except`` -clauses can prevent the exit to occur which had been explicitly -requested. +clauses can prevent the explicitly requested exit from occurring. To make sure that people catch Exception most of the time, various parts of the documentation and tutorials will need to be updated to From martin at v.loewis.de Thu Mar 9 19:31:17 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Thu, 09 Mar 2006 19:31:17 +0100 Subject: [Python-checkins] r42931 - python/trunk/Tools/scripts/svneol.py In-Reply-To: References: <20060309022010.187361E4002@bag.python.org> Message-ID: <44107475.3010803@v.loewis.de> Jim Jewett wrote: > Is it OK (in this case) to mix f.readline() and f.read()? Yes. > Would it be safer to just readline the data lines as well, but assert > their length? That assertion would fail: the line break is not counted in the data length, plus there might be multi-line values. Regards, Martin From martin at v.loewis.de Thu Mar 9 19:35:09 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Thu, 09 Mar 2006 19:35:09 +0100 Subject: [Python-checkins] r42929 - python/trunk/Tools/scripts/svneol.py In-Reply-To: <44106221.3090001@python.net> References: <20060309014225.418ED1E4002@bag.python.org> <44106221.3090001@python.net> Message-ID: <4410755D.8010402@v.loewis.de> Thomas Heller wrote: > Should 'sln' and 'vcproj' be added to the extensions list? I think these are text-files > too. Although PCBuild\pcbuild.sln has a binary mime-type property, so the script > would not change that. Sure: just go ahead and do that. Martin From python-checkins at python.org Thu Mar 9 19:49:35 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 19:49:35 +0100 (CET) Subject: [Python-checkins] r42944 - in python/trunk: PCbuild/make_buildinfo.vcproj PCbuild/pcbuild.sln Tools/scripts/svneol.py Message-ID: <20060309184935.F36F81E4035@bag.python.org> Author: thomas.heller Date: Thu Mar 9 19:49:35 2006 New Revision: 42944 Modified: python/trunk/PCbuild/make_buildinfo.vcproj (contents, props changed) python/trunk/PCbuild/pcbuild.sln (contents, props changed) python/trunk/Tools/scripts/svneol.py Log: Deleted the svn_mime-type application/octet-stream from PCBuild/pcbuild.sln. Tools/scripts/svneol.py: added the .sln and .vcproj extensions because these are text files. Ran svneol.py over the source tree. Modified: python/trunk/PCbuild/make_buildinfo.vcproj ============================================================================== --- python/trunk/PCbuild/make_buildinfo.vcproj (original) +++ python/trunk/PCbuild/make_buildinfo.vcproj Thu Mar 9 19:49:35 2006 @@ -1,122 +1,122 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: python/trunk/PCbuild/pcbuild.sln ============================================================================== Binary files. No diff available. Modified: python/trunk/Tools/scripts/svneol.py ============================================================================== --- python/trunk/Tools/scripts/svneol.py (original) +++ python/trunk/Tools/scripts/svneol.py Thu Mar 9 19:49:35 2006 @@ -65,7 +65,7 @@ f.close() return result -possible_text_file = re.compile(r"\.([hc]|py|txt)$").search +possible_text_file = re.compile(r"\.([hc]|py|txt|sln|vcproj)$").search for root, dirs, files in os.walk('.'): if '.svn' in dirs: From python-checkins at python.org Thu Mar 9 20:06:06 2006 From: python-checkins at python.org (andrew.kuchling) Date: Thu, 9 Mar 2006 20:06:06 +0100 (CET) Subject: [Python-checkins] r42945 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060309190606.CE5151E4079@bag.python.org> Author: andrew.kuchling Date: Thu Mar 9 20:06:05 2006 New Revision: 42945 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Write a section Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Thu Mar 9 20:06:05 2006 @@ -367,7 +367,65 @@ %====================================================================== \section{PEP 352: Exceptions as New-Style Classes} -% XXX write this +Exception classes can now be new-style classes, not just classic classes, +and the built-in \exception{Exception} class and all + +The inheritance hierarchy for exceptions has been rearranged a bit. +In 2.5, the inheritance relationships are: + +\begin{verbatim} +BaseException # New in Python 2.5 +|- KeyboardInterrupt +|- SystemExit +|- Exception + |- (all other current built-in exceptions) +\end{verbatim} + +This rearrangement was done because people often want to catch all +exceptions that indicate program errors. \exception{KeyboardInterrupt} and +\exception{SystemExit} aren't errors, though, and usually represent an explicit +action such as the user hitting Control-C or code calling +\function{sys.exit()}. A bare \code{except:} will catch all exceptions, +so you commonly need to list \exception{KeyboardInterrupt} and +\exception{SystemExit} in order to re-raise them. The usual pattern is: + +\begin{verbatim} +try: + ... +except (KeyboardInterrupt, SystemExit): + raise +except: + # Log error... + # Continue running program... +\end{verbatim} + +In Python 2.5, you can now write \code{except Exception} to achieve +the same result, catching all the exceptions that usually indicate errors +but leaving \exception{KeyboardInterrupt} and +\exception{SystemExit} alone. As in previous versions, +a bare \code{except:} still catches all exceptions. + +The goal for Python 3.0 is to require any class raised as an exception +to derive from \exception{BaseException} or some descendant of +\exception{BaseException}, and future releases in the +Python 2.x series may begin to enforce this constraint. Therefore, I +suggest you begin making all your exception classes derive from +\exception{Exception} now. It's been suggested that the bare +\code{except:} form should be removed in Python 3.0, but Guido van~Rossum +hasn't decided whether to do this or not. + +Raising of strings as exceptions, as in the statement \code{raise +"Error occurred"}, is deprecated in Python 2.5 and will trigger a +warning. The aim is to be able to remove the string-exception feature +in a few releases. + + +\begin{seealso} + +\seepep{352}{}{PEP written by +Brett Cannon and Guido van Rossum; implemented by Brett Cannon.} + +\end{seealso} %====================================================================== @@ -454,6 +512,8 @@ \begin{itemize} +% ctypes added + % collections.deque now has .remove() % the cPickle module no longer accepts the deprecated None option in the From python-checkins at python.org Thu Mar 9 20:40:01 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 9 Mar 2006 20:40:01 +0100 (CET) Subject: [Python-checkins] r42946 - python/trunk/Lib/ctypes/.CTYPES_DEVEL python/trunk/Lib/ctypes/__init__.py Message-ID: <20060309194001.A189A1E4003@bag.python.org> Author: thomas.heller Date: Thu Mar 9 20:40:00 2006 New Revision: 42946 Removed: python/trunk/Lib/ctypes/.CTYPES_DEVEL Modified: python/trunk/Lib/ctypes/__init__.py Log: Remove the magic to run an uninstalled ctypes version from a CVS sandbox. Deleted: /python/trunk/Lib/ctypes/.CTYPES_DEVEL ============================================================================== --- /python/trunk/Lib/ctypes/.CTYPES_DEVEL Thu Mar 9 20:40:00 2006 +++ (empty file) @@ -1,14 +0,0 @@ -# -*- python -*- -def install(): - import sys, os - - from distutils.util import get_platform - plat_specifier = ".%s-%s" % (get_platform(), sys.version[0:3]) - build_dir = os.path.join("..", 'build', 'lib' + plat_specifier) - - p = os.path.abspath(os.path.join(os.path.dirname(__file__), build_dir)) - sys.path.insert(0, p) - del sys - -install() -del install Modified: python/trunk/Lib/ctypes/__init__.py ============================================================================== --- python/trunk/Lib/ctypes/__init__.py (original) +++ python/trunk/Lib/ctypes/__init__.py Thu Mar 9 20:40:00 2006 @@ -1,15 +1,8 @@ """create and manipulate C data types in Python""" -# special developer support to use ctypes from the CVS sandbox, -# without installing it import os as _os, sys as _sys from itertools import chain as _chain -_magicfile = _os.path.join(_os.path.dirname(__file__), ".CTYPES_DEVEL") -if _os.path.isfile(_magicfile): - execfile(_magicfile) -del _magicfile - __version__ = "0.9.9.4" from _ctypes import Union, Structure, Array From python-checkins at python.org Thu Mar 9 23:31:48 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 9 Mar 2006 23:31:48 +0100 (CET) Subject: [Python-checkins] r42947 - python/trunk/Tools/compiler/astgen.py Message-ID: <20060309223148.2157B1E4003@bag.python.org> Author: tim.peters Date: Thu Mar 9 23:31:45 2006 New Revision: 42947 Modified: python/trunk/Tools/compiler/astgen.py Log: NodeInfo.__gen_init(): Fiddle so that reindent.py is happy with the output as-is. This incidentally also gets rid of "an extra" blank line at the end of the output block that probably wasn't intended (although it doesn't matter one way or the other). Modified: python/trunk/Tools/compiler/astgen.py ============================================================================== --- python/trunk/Tools/compiler/astgen.py (original) +++ python/trunk/Tools/compiler/astgen.py Thu Mar 9 23:31:45 2006 @@ -113,8 +113,11 @@ for name in self.argnames: print >> buf, " self.%s = %s" % (name, name) print >> buf, " self.lineno = lineno" - if self.init: - print >> buf, "".join([" " + line for line in self.init]) + # Copy the lines in self.init, indented four spaces. The rstrip() + # business is to get rid of the four spaces if line happens to be + # empty, so that reindent.py is happy with the output. + for line in self.init: + print >> buf, (" " + line).rstrip() def _gen_getChildren(self, buf): print >> buf, " def getChildren(self):" From python-checkins at python.org Fri Mar 10 00:22:08 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 10 Mar 2006 00:22:08 +0100 (CET) Subject: [Python-checkins] r42948 - in python/trunk: Lib/site.py Misc/NEWS Message-ID: <20060309232208.7E38A1E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 10 00:22:06 2006 New Revision: 42948 Modified: python/trunk/Lib/site.py python/trunk/Misc/NEWS Log: Patch #1446372: quit and exit can now be called from the interactive interpreter to exit. Modified: python/trunk/Lib/site.py ============================================================================== --- python/trunk/Lib/site.py (original) +++ python/trunk/Lib/site.py Fri Mar 10 00:22:06 2006 @@ -227,12 +227,21 @@ """ if os.sep == ':': - exit = 'Use Cmd-Q to quit.' + eof = 'Cmd-Q' elif os.sep == '\\': - exit = 'Use Ctrl-Z plus Return to exit.' + eof = 'Ctrl-Z plus Return' else: - exit = 'Use Ctrl-D (i.e. EOF) to exit.' - __builtin__.quit = __builtin__.exit = exit + eof = 'Ctrl-D (i.e. EOF)' + + class Quitter(object): + def __init__(self, name): + self.name = name + def __repr__(self): + return 'Use %s() or %s to exit' % (self.name, eof) + def __call__(self, code=None): + raise SystemExit(code) + __builtin__.quit = Quitter('quit') + __builtin__.exit = Quitter('exit') class _Printer(object): Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 10 00:22:06 2006 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Patch #1446372: quit and exit can now be called from the interactive + interpreter to exit. + - Patch #1434038: property() now uses the getter's docstring if there is no "doc" argument given. This makes it possible to legitimately use property() as a decorator to produce a read-only property. From python-checkins at python.org Fri Mar 10 00:22:43 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 10 Mar 2006 00:22:43 +0100 (CET) Subject: [Python-checkins] r42949 - python/trunk/Misc/NEWS Message-ID: <20060309232243.E52D01E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 10 00:22:43 2006 New Revision: 42949 Modified: python/trunk/Misc/NEWS Log: Move entry to correct section. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 10 00:22:43 2006 @@ -12,9 +12,6 @@ Core and builtins ----------------- -- Patch #1446372: quit and exit can now be called from the interactive - interpreter to exit. - - Patch #1434038: property() now uses the getter's docstring if there is no "doc" argument given. This makes it possible to legitimately use property() as a decorator to produce a read-only property. @@ -439,6 +436,9 @@ Library ------- +- Patch #1446372: quit and exit can now be called from the interactive + interpreter to exit. + - The function get_count() has been added to the gc module, and gc.collect() grew an optional 'generation' argument. From python-checkins at python.org Fri Mar 10 00:39:20 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 00:39:20 +0100 (CET) Subject: [Python-checkins] r42950 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Lib/test/test_unicodedata.py Misc/NEWS Modules/unicodedata.c Modules/unicodedata_db.h Modules/unicodename_db.h Objects/unicodeobject.c Objects/unicodetype_db.h Tools/unicode/makeunicodedata.py Message-ID: <20060309233920.473B01E4003@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 00:38:20 2006 New Revision: 42950 Modified: python/trunk/Doc/lib/libunicodedata.tex python/trunk/Include/ucnhash.h python/trunk/Lib/encodings/idna.py python/trunk/Lib/stringprep.py python/trunk/Lib/test/test_unicodedata.py python/trunk/Misc/NEWS python/trunk/Modules/unicodedata.c python/trunk/Modules/unicodedata_db.h python/trunk/Modules/unicodename_db.h python/trunk/Objects/unicodeobject.c python/trunk/Objects/unicodetype_db.h python/trunk/Tools/unicode/makeunicodedata.py Log: Update Unicode database to Unicode 4.1. Modified: python/trunk/Doc/lib/libunicodedata.tex ============================================================================== --- python/trunk/Doc/lib/libunicodedata.tex (original) +++ python/trunk/Doc/lib/libunicodedata.tex Fri Mar 10 00:38:20 2006 @@ -14,11 +14,11 @@ This module provides access to the Unicode Character Database which defines character properties for all Unicode characters. The data in this database is based on the \file{UnicodeData.txt} file version -3.2.0 which is publically available from \url{ftp://ftp.unicode.org/}. +4.1.0 which is publically available from \url{ftp://ftp.unicode.org/}. The module uses the same names and symbols as defined by the -UnicodeData File Format 3.2.0 (see -\url{http://www.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.html}). It +UnicodeData File Format 4.1.0 (see +\url{http://www.unicode.org/Public/4.1-Update/UnicodeData-4.1.0.html}). It defines the following functions: \begin{funcdesc}{lookup}{name} @@ -130,3 +130,12 @@ \versionadded{2.3} \end{datadesc} + +\begin{datadesc}{db_3_2_0} +This is an object that has the same methods as the entire +module, but uses the Unicode database version 3.2 instead, +for applications that require this specific version of +the Unicode database (such as IDNA). + +\versionadded{2.5} +\end{datadesc} Modified: python/trunk/Include/ucnhash.h ============================================================================== --- python/trunk/Include/ucnhash.h (original) +++ python/trunk/Include/ucnhash.h Fri Mar 10 00:38:20 2006 @@ -14,12 +14,14 @@ int size; /* Get name for a given character code. Returns non-zero if - success, zero if not. Does not set Python exceptions. */ - int (*getname)(Py_UCS4 code, char* buffer, int buflen); + success, zero if not. Does not set Python exceptions. + If self is NULL, data come from the default version of the database. + If it is not NULL, it should be a unicodedata.db_X_Y_Z object */ + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); /* Get character code for a given name. Same error handling as for getname. */ - int (*getcode)(const char* name, int namelen, Py_UCS4* code); + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code); } _PyUnicode_Name_CAPI; Modified: python/trunk/Lib/encodings/idna.py ============================================================================== --- python/trunk/Lib/encodings/idna.py (original) +++ python/trunk/Lib/encodings/idna.py Fri Mar 10 00:38:20 2006 @@ -1,6 +1,7 @@ # This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) -import stringprep, unicodedata, re, codecs +import stringprep, re, codecs +from unicodedata import db_3_2_0 as unicodedata # IDNA section 3.1 dots = re.compile(u"[\u002E\u3002\uFF0E\uFF61]") Modified: python/trunk/Lib/stringprep.py ============================================================================== --- python/trunk/Lib/stringprep.py (original) +++ python/trunk/Lib/stringprep.py Fri Mar 10 00:38:20 2006 @@ -5,7 +5,7 @@ and mappings, for which a mapping function is provided. """ -import unicodedata +from unicodedata import db_3_2_0 as unicodedata assert unicodedata.unidata_version == '3.2.0' Modified: python/trunk/Lib/test/test_unicodedata.py ============================================================================== --- python/trunk/Lib/test/test_unicodedata.py (original) +++ python/trunk/Lib/test/test_unicodedata.py Fri Mar 10 00:38:20 2006 @@ -16,7 +16,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = 'a37276dc2c158bef6dfd908ad34525c97180fad9' + expectedchecksum = 'a6555cd209d960dcfa17bfdce0c96d91cfa9a9ba' def test_method_checksum(self): h = sha.sha() @@ -75,7 +75,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # update this, if the database changes - expectedchecksum = 'cfe20a967a450ebc82ca68c3e4eed344164e11af' + expectedchecksum = 'b45b79f3203ee1a896d9b5655484adaff5d4964b' def test_function_checksum(self): data = [] Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 10 00:38:20 2006 @@ -279,6 +279,10 @@ Extension Modules ----------------- +- The unicodedata module was updated to the 4.1 version of the Unicode + database. The 3.2 version is still available as unicodedata.db_3_2_0 + for applications that require this specific version (such as IDNA). + - The timing module is no longer built by default. It was deprecated in PEP 4 in Python 2.0 or earlier. Modified: python/trunk/Modules/unicodedata.c ============================================================================== --- python/trunk/Modules/unicodedata.c (original) +++ python/trunk/Modules/unicodedata.c Fri Mar 10 00:38:20 2006 @@ -14,6 +14,7 @@ #include "Python.h" #include "ucnhash.h" +#include "structmember.h" /* character properties */ @@ -28,6 +29,14 @@ _PyUnicode_EastAsianWidth */ } _PyUnicode_DatabaseRecord; +typedef struct change_record { + /* sequence of fields should be the same as in merge_old_version */ + const unsigned char bidir_changed; + const unsigned char category_changed; + const unsigned char decimal_changed; + const int numeric_changed; +} change_record; + /* data file generated by Tools/unicode/makeunicodedata.py */ #include "unicodedata_db.h" @@ -51,6 +60,85 @@ return _getrecord_ex(*PyUnicode_AS_UNICODE(v)); } +/* ------------- Previous-version API ------------------------------------- */ +typedef struct previous_version { + PyObject_HEAD + const char *name; + const change_record* (*getrecord)(Py_UCS4); + Py_UCS4 (*normalization)(Py_UCS4); +} PreviousDBVersion; + +#define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v)) + +/* Forward declaration */ +static PyMethodDef unicodedata_functions[]; + +static PyMemberDef DB_members[] = { + {"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY}, + {NULL} +}; + +static PyTypeObject Xxo_Type = { + /* The ob_type field must be initialized in the module init function + * to be portable to Windows without using C++. */ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "unicodedata.DB", /*tp_name*/ + sizeof(PreviousDBVersion), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyObject_Del, /*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*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + unicodedata_functions, /*tp_methods*/ + DB_members, /*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*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ +}; + +static PyObject* +new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), + Py_UCS4 (*normalization)(Py_UCS4)) +{ + PreviousDBVersion *self; + self = PyObject_New(PreviousDBVersion, &Xxo_Type); + if (self == NULL) + return NULL; + self->name = name; + self->getrecord = getrecord; + self->normalization = normalization; + return (PyObject*)self; +} + /* --- Module API --------------------------------------------------------- */ PyDoc_STRVAR(unicodedata_decimal__doc__, @@ -65,6 +153,7 @@ { PyUnicodeObject *v; PyObject *defobj = NULL; + int have_old = 0; long rc; if (!PyArg_ParseTuple(args, "O!|O:decimal", &PyUnicode_Type, &v, &defobj)) @@ -74,7 +163,22 @@ "need a single Unicode character as parameter"); return NULL; } - rc = Py_UNICODE_TODECIMAL(*PyUnicode_AS_UNICODE(v)); + + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) { + /* unassigned */ + have_old = 1; + rc = -1; + } + else if (old->decimal_changed != 0xFF) { + have_old = 1; + rc = old->decimal_changed; + } + } + + if (!have_old) + rc = Py_UNICODE_TODECIMAL(*PyUnicode_AS_UNICODE(v)); if (rc < 0) { if (defobj == NULL) { PyErr_SetString(PyExc_ValueError, @@ -136,6 +240,7 @@ { PyUnicodeObject *v; PyObject *defobj = NULL; + int have_old = 0; double rc; if (!PyArg_ParseTuple(args, "O!|O:numeric", &PyUnicode_Type, &v, &defobj)) @@ -145,7 +250,22 @@ "need a single Unicode character as parameter"); return NULL; } - rc = Py_UNICODE_TONUMERIC(*PyUnicode_AS_UNICODE(v)); + + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) { + /* unassigned */ + have_old = 1; + rc = -1; + } + else if (old->decimal_changed != 0xFF) { + have_old = 1; + rc = old->decimal_changed; + } + } + + if (!have_old) + rc = Py_UNICODE_TONUMERIC(*PyUnicode_AS_UNICODE(v)); if (rc < 0) { if (defobj == NULL) { PyErr_SetString(PyExc_ValueError, "not a numeric character"); @@ -180,6 +300,11 @@ return NULL; } index = (int) _getrecord(v)->category; + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed != 0xFF) + index = old->category_changed; + } return PyString_FromString(_PyUnicode_CategoryNames[index]); } @@ -205,6 +330,13 @@ return NULL; } index = (int) _getrecord(v)->bidirectional; + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) + index = 0; /* unassigned */ + else if (old->bidir_changed != 0xFF) + index = old->bidir_changed; + } return PyString_FromString(_PyUnicode_BidirectionalNames[index]); } @@ -219,6 +351,7 @@ unicodedata_combining(PyObject *self, PyObject *args) { PyUnicodeObject *v; + int index; if (!PyArg_ParseTuple(args, "O!:combining", &PyUnicode_Type, &v)) @@ -228,7 +361,13 @@ "need a single Unicode character as parameter"); return NULL; } - return PyInt_FromLong((int) _getrecord(v)->combining); + index = (int) _getrecord(v)->combining; + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) + index = 0; /* unassigned */ + } + return PyInt_FromLong(index); } PyDoc_STRVAR(unicodedata_mirrored__doc__, @@ -242,6 +381,7 @@ unicodedata_mirrored(PyObject *self, PyObject *args) { PyUnicodeObject *v; + int index; if (!PyArg_ParseTuple(args, "O!:mirrored", &PyUnicode_Type, &v)) @@ -251,7 +391,13 @@ "need a single Unicode character as parameter"); return NULL; } - return PyInt_FromLong((int) _getrecord(v)->mirrored); + index = (int) _getrecord(v)->mirrored; + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) + index = 0; /* unassigned */ + } + return PyInt_FromLong(index); } PyDoc_STRVAR(unicodedata_east_asian_width__doc__, @@ -275,6 +421,11 @@ return NULL; } index = (int) _getrecord(v)->east_asian_width; + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) + index = 0; /* unassigned */ + } return PyString_FromString(_PyUnicode_EastAsianWidthNames[index]); } @@ -303,6 +454,12 @@ code = (int) *PyUnicode_AS_UNICODE(v); + if (self) { + const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); + if (old->category_changed == 0) + return PyString_FromString(""); /* unassigned */ + } + if (code < 0 || code >= 0x110000) index = 0; else { @@ -337,11 +494,14 @@ } void -get_decomp_record(Py_UCS4 code, int *index, int *prefix, int *count) +get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *count) { if (code >= 0x110000) { *index = 0; - } + } else if (self && get_old_record(self, code)->category_changed==0) { + /* unassigned in old version */ + *index = 0; + } else { *index = decomp_index1[(code>>DECOMP_SHIFT)]; *index = decomp_index2[(*index<normalization(code); + if (value != 0) { + stack[stackptr++] = value; + continue; + } + } + + /* Other decompositions. */ + get_decomp_record(self, code, &index, &prefix, &count); /* Copy character if it is not decomposable, or has a compatibility decomposition, but we do NFD. */ @@ -467,7 +636,7 @@ } static int -find_nfc_index(struct reindex* nfc, Py_UNICODE code) +find_nfc_index(PyObject *self, struct reindex* nfc, Py_UNICODE code) { int index; for (index = 0; nfc[index].start; index++) { @@ -483,7 +652,7 @@ } static PyObject* -nfc_nfkc(PyObject *input, int k) +nfc_nfkc(PyObject *self, PyObject *input, int k) { PyObject *result; Py_UNICODE *i, *i1, *o, *end; @@ -492,7 +661,7 @@ Py_UNICODE *skipped[20]; int cskipped = 0; - result = nfd_nfkd(input, k); + result = nfd_nfkd(self, input, k); if (!result) return NULL; @@ -536,7 +705,7 @@ continue; } - f = find_nfc_index(nfc_first, *i); + f = find_nfc_index(self, nfc_first, *i); if (f == -1) { *o++ = *i++; continue; @@ -551,7 +720,7 @@ i1++; continue; } - l = find_nfc_index(nfc_last, *i1); + l = find_nfc_index(self, nfc_last, *i1); /* *i1 cannot be combined with *i. If *i1 is a starter, we don't need to look further. Otherwise, record the combining class. */ @@ -575,7 +744,7 @@ /* Mark the second character unused. */ skipped[cskipped++] = i1; i1++; - f = find_nfc_index(nfc_first, *i); + f = find_nfc_index(self, nfc_first, *i); if (f == -1) break; } @@ -610,13 +779,13 @@ } if (strcmp(form, "NFC") == 0) - return nfc_nfkc(input, 0); + return nfc_nfkc(self, input, 0); if (strcmp(form, "NFKC") == 0) - return nfc_nfkc(input, 1); + return nfc_nfkc(self, input, 1); if (strcmp(form, "NFD") == 0) - return nfd_nfkd(input, 0); + return nfd_nfkd(self, input, 0); if (strcmp(form, "NFKD") == 0) - return nfd_nfkd(input, 1); + return nfd_nfkd(self, input, 1); PyErr_SetString(PyExc_ValueError, "invalid normalization form"); return NULL; } @@ -686,7 +855,7 @@ } static int -_getucname(Py_UCS4 code, char* buffer, int buflen) +_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen) { int offset; int i; @@ -726,6 +895,15 @@ if (code >= 0x110000) return 0; + if (self) { + const change_record *old = get_old_record(self, code); + if (old->category_changed == 0) { + /* unassigned */ + return 0; + } + } + + /* get offset into phrasebook */ offset = phrasebook_offset1[(code>>phrasebook_shift)]; offset = phrasebook_offset2[(offset<= 0x110000) index = 0; + else { + index = changes_3_2_0_index[n>>7]; + index = changes_3_2_0_data[(index<<7)+(n & 127)]; + } + return change_records_3_2_0+index; +} + +static Py_UCS4 normalization_3_2_0(Py_UCS4 n) +{ + switch(n) { + case 0x2f868: return 0x2136A; + case 0x2f874: return 0x5F33; + case 0x2f91f: return 0x43AB; + case 0x2f95f: return 0x7AAE; + case 0x2f9bf: return 0x4D57; + default: return 0; + } +} + Modified: python/trunk/Modules/unicodename_db.h ============================================================================== --- python/trunk/Modules/unicodename_db.h (original) +++ python/trunk/Modules/unicodename_db.h Fri Mar 10 00:38:20 2006 @@ -1,4 +1,4 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 2.3 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 2.5 */ #define NAME_MAXLEN 256 @@ -6,1004 +6,1221 @@ static unsigned char lexicon[] = { 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 77, 65, 76, 204, 83, 89, 76, 76, 65, 66, 76, 197, 67, 65, 80, 73, 84, 65, 204, 89, 201, 67, 74, - 203, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 76, 65, 84, 73, - 206, 65, 82, 65, 66, 73, 195, 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, - 84, 217, 70, 79, 82, 77, 128, 83, 89, 77, 66, 79, 204, 67, 65, 78, 65, - 68, 73, 65, 206, 83, 89, 76, 76, 65, 66, 73, 67, 211, 66, 79, 76, 196, - 76, 73, 71, 65, 84, 85, 82, 197, 65, 78, 196, 77, 85, 83, 73, 67, 65, - 204, 72, 65, 78, 71, 85, 204, 73, 84, 65, 76, 73, 195, 82, 65, 68, 73, - 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 69, 84, 72, 73, 79, - 80, 73, 195, 83, 73, 71, 206, 71, 82, 69, 69, 203, 68, 73, 71, 73, 212, - 67, 73, 82, 67, 76, 69, 196, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, - 197, 67, 89, 82, 73, 76, 76, 73, 195, 66, 82, 65, 73, 76, 76, 197, 80, - 65, 84, 84, 69, 82, 206, 66, 89, 90, 65, 78, 84, 73, 78, 197, 73, 83, 79, - 76, 65, 84, 69, 196, 76, 69, 70, 212, 82, 73, 71, 72, 212, 86, 79, 87, - 69, 204, 75, 65, 84, 65, 75, 65, 78, 193, 75, 65, 78, 71, 88, 201, 84, - 73, 66, 69, 84, 65, 206, 68, 79, 85, 66, 76, 197, 77, 69, 69, 205, 67, - 65, 82, 82, 73, 69, 210, 66, 69, 76, 79, 87, 128, 73, 78, 73, 84, 73, 65, - 204, 65, 66, 79, 86, 69, 128, 67, 79, 77, 66, 73, 78, 73, 78, 199, 68, - 79, 212, 89, 69, 200, 77, 79, 78, 71, 79, 76, 73, 65, 206, 65, 82, 82, - 79, 87, 128, 65, 66, 79, 86, 197, 70, 79, 210, 86, 69, 82, 84, 73, 67, - 65, 204, 66, 79, 216, 83, 73, 71, 78, 128, 87, 72, 73, 84, 197, 65, 82, - 82, 79, 215, 68, 82, 65, 87, 73, 78, 71, 211, 72, 69, 66, 82, 69, 215, - 72, 65, 76, 70, 87, 73, 68, 84, 200, 82, 73, 71, 72, 84, 87, 65, 82, 68, - 211, 65, 128, 77, 65, 82, 75, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 73, 195, 65, 76, 69, 198, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, - 196, 73, 128, 83, 67, 82, 73, 80, 212, 68, 69, 86, 65, 78, 65, 71, 65, - 82, 201, 70, 85, 76, 76, 87, 73, 68, 84, 200, 75, 72, 77, 69, 210, 85, - 208, 84, 79, 128, 70, 82, 65, 75, 84, 85, 210, 68, 79, 87, 206, 69, 81, - 85, 65, 204, 72, 65, 200, 72, 69, 65, 86, 217, 78, 85, 77, 66, 69, 210, - 85, 128, 84, 65, 199, 66, 76, 65, 67, 203, 65, 82, 77, 69, 78, 73, 65, - 206, 67, 72, 79, 83, 69, 79, 78, 199, 74, 69, 69, 205, 83, 89, 77, 66, - 79, 76, 128, 66, 69, 78, 71, 65, 76, 201, 67, 72, 65, 82, 65, 67, 84, 69, - 210, 72, 73, 82, 65, 71, 65, 78, 193, 87, 69, 83, 84, 45, 67, 82, 69, - 197, 84, 72, 65, 201, 67, 72, 69, 82, 79, 75, 69, 197, 73, 68, 69, 79, - 71, 82, 65, 80, 200, 77, 69, 68, 73, 65, 204, 74, 79, 78, 71, 83, 69, 79, - 78, 199, 82, 85, 78, 73, 195, 71, 69, 79, 82, 71, 73, 65, 206, 75, 65, - 78, 78, 65, 68, 193, 83, 73, 78, 72, 65, 76, 193, 84, 69, 76, 85, 71, - 213, 79, 82, 73, 89, 193, 71, 85, 74, 65, 82, 65, 84, 201, 77, 65, 76, - 65, 89, 65, 76, 65, 205, 77, 89, 65, 78, 77, 65, 210, 207, 66, 82, 65, - 67, 75, 69, 84, 128, 68, 69, 83, 69, 82, 69, 212, 71, 85, 82, 77, 85, 75, - 72, 201, 84, 87, 79, 128, 65, 67, 85, 84, 69, 128, 76, 73, 71, 72, 212, - 83, 89, 82, 73, 65, 195, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, - 203, 79, 78, 69, 128, 83, 84, 82, 79, 75, 69, 128, 65, 80, 204, 70, 85, - 78, 67, 84, 73, 79, 78, 65, 204, 72, 65, 77, 90, 193, 76, 69, 70, 84, 87, - 65, 82, 68, 211, 84, 69, 76, 69, 71, 82, 65, 80, 200, 72, 79, 79, 75, - 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 68, 65, 83, 73, 193, 77, 65, - 75, 83, 85, 82, 193, 76, 65, 207, 66, 65, 82, 194, 66, 79, 80, 79, 77, - 79, 70, 207, 82, 128, 72, 65, 76, 198, 79, 198, 80, 83, 73, 76, 201, 84, - 207, 77, 79, 78, 79, 83, 80, 65, 67, 197, 78, 79, 212, 84, 65, 77, 73, - 204, 66, 65, 82, 128, 75, 72, 65, 200, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 204, 77, 79, 68, 73, 70, 73, 69, 210, 76, 79, 87, 69, 210, 68, 73, - 65, 69, 82, 69, 83, 73, 83, 128, 78, 85, 77, 69, 82, 65, 204, 86, 79, 67, - 65, 76, 73, 195, 84, 72, 82, 69, 69, 128, 72, 65, 82, 80, 79, 79, 206, - 85, 80, 80, 69, 210, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 71, 82, 65, - 86, 69, 128, 65, 78, 71, 76, 197, 84, 72, 65, 65, 78, 193, 65, 76, 80, - 72, 193, 70, 79, 85, 82, 128, 72, 128, 76, 79, 78, 199, 77, 65, 67, 82, - 79, 78, 128, 77, 65, 82, 203, 70, 73, 86, 69, 128, 83, 73, 88, 128, 79, - 77, 69, 71, 193, 79, 88, 73, 65, 128, 86, 65, 82, 73, 65, 128, 67, 73, - 82, 67, 76, 197, 69, 73, 71, 72, 84, 128, 78, 79, 79, 206, 78, 73, 78, - 69, 128, 83, 69, 86, 69, 78, 128, 84, 73, 76, 68, 69, 128, 89, 128, 69, - 84, 193, 82, 73, 71, 72, 84, 128, 83, 85, 66, 74, 79, 73, 78, 69, 196, - 86, 128, 68, 128, 72, 69, 200, 83, 84, 79, 80, 128, 84, 69, 200, 67, 65, - 82, 79, 78, 128, 71, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, - 206, 66, 128, 74, 128, 90, 128, 67, 128, 70, 128, 76, 69, 83, 83, 45, 84, - 72, 65, 206, 83, 72, 79, 82, 212, 75, 65, 128, 81, 128, 85, 80, 87, 65, - 82, 68, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 66, - 82, 69, 86, 69, 128, 70, 85, 76, 204, 83, 69, 69, 206, 83, 72, 69, 69, - 206, 89, 65, 128, 76, 73, 78, 197, 82, 79, 77, 65, 206, 84, 82, 73, 65, - 78, 71, 76, 69, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 77, 65, 128, - 79, 80, 69, 82, 65, 84, 79, 82, 128, 82, 69, 86, 69, 82, 83, 69, 196, 84, - 87, 207, 66, 82, 65, 67, 75, 69, 212, 68, 79, 84, 128, 73, 79, 84, 193, - 84, 73, 76, 68, 197, 65, 67, 67, 69, 78, 212, 66, 76, 65, 67, 75, 128, - 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, - 79, 85, 84, 80, 85, 212, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, - 45, 85, 75, 82, 65, 73, 78, 73, 65, 206, 67, 69, 79, 78, 71, 67, 72, 73, - 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 80, 65, 83, 83, - 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, - 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, - 84, 69, 196, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, - 71, 83, 73, 79, 83, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, - 75, 65, 76, 69, 83, 77, 65, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, - 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, - 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 79, 80, 69, 78, 45, 67, 73, - 82, 67, 85, 73, 84, 45, 79, 85, 84, 80, 85, 212, 67, 69, 79, 78, 71, 67, - 72, 73, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 84, 85, - 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 75, 73, 89, 69, - 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 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, 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, 84, - 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 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, 84, 73, 75, 69, 85, 84, 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, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, - 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, - 73, 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, - 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, - 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, - 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, - 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, - 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, - 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 82, - 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 89, 69, - 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 67, 69, 79, - 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, 85, 67, 128, 77, 65, 82, 67, - 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 80, 73, 69, 85, 80, - 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, - 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 77, - 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 83, 72, 79, 82, 84, 45, 84, 87, - 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 79, 70, 84, 87, 65, 82, 69, 45, - 70, 85, 78, 67, 84, 73, 79, 206, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, - 70, 73, 83, 84, 79, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, - 69, 85, 80, 72, 128, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, - 79, 78, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, 65, 84, 79, - 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 67, - 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, - 69, 85, 67, 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 84, 85, - 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 48, 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, 50, 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, 52, - 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 49, 48, 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, 50, 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, 52, 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, 54, - 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, 56, 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, 65, 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, 67, 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, 69, 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, 50, 48, 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, 50, 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, 52, 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, 54, 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, 56, - 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, 65, 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, 67, 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, 69, 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, - 51, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, - 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, 67, 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, 69, 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, 52, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, - 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, 69, 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, 53, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, - 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, 54, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 55, 48, - 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 56, 48, 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, 50, - 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 57, 48, 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, 50, 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, 52, - 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 65, 48, 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, 50, 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, 52, 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, 54, - 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, 56, 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, 65, 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, 67, 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, 69, 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, 66, 48, 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, 50, 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, 52, 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, 54, 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, 56, - 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, 65, 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, 67, 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, 69, 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, - 67, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, - 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, 67, 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, 69, 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, 68, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, - 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, 69, 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, 69, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, - 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, 70, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 57, 48, 48, - 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 49, 48, 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, 50, - 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 50, 48, 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, 50, 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, 52, - 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 51, 48, 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, 50, 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, 52, 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, 54, - 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, 56, 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, 65, 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, 67, 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, 69, 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, 52, 48, 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, 50, 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, 52, 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, 54, 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, 56, - 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, 65, 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, 67, 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, 69, 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, - 53, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, - 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, 67, 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, 69, 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, 54, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, - 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, 69, 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, 55, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, - 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, 56, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 57, 48, - 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 65, 48, 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, 50, - 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 66, 48, 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, 50, 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, 52, - 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 67, 48, 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, 50, 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, 52, 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, 54, - 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, 56, 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, 65, 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, 67, 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, 69, 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, 68, 48, 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, 50, 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, 52, 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, 54, 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, 56, - 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, 65, 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, 67, 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, 69, 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, - 69, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, - 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, 67, 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, 69, 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, 70, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, - 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, 69, 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, 65, 48, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, - 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, 49, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 68, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, - 85, 72, 79, 85, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79, 85, 70, 73, 83, - 77, 65, 128, 75, 82, 65, 84, 73, 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, - 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 77, - 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 69, 84, - 65, 83, 84, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 80, 73, 69, 85, 80, - 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 83, 73, 70, 73, 83, 84, - 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, - 89, 78, 65, 71, 77, 65, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, - 83, 73, 79, 83, 128, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, - 75, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, - 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, 66, 76, 65, - 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 84, 82, 73, 65, 78, 71, - 76, 69, 45, 72, 69, 65, 68, 69, 196, 67, 79, 78, 71, 82, 65, 84, 85, 76, - 65, 84, 73, 79, 78, 128, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, - 68, 45, 185, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, - 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 67, 79, 78, - 67, 65, 86, 69, 45, 80, 79, 73, 78, 84, 69, 196, 71, 79, 82, 71, 79, 83, - 89, 78, 84, 72, 69, 84, 79, 78, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, - 65, 84, 73, 79, 78, 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, 70, 57, 48, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 49, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 50, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 51, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 52, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 53, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 54, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 55, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 56, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 57, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 65, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 66, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 67, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 68, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 69, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 70, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 65, 48, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 49, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 50, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 51, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 52, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 53, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 54, 49, 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, 51, 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, 53, 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, 55, 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, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 65, 128, 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, 83, 79, 204, 76, 79, 78, - 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 77, 85, 76, 84, 73, 80, - 76, 73, 67, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, - 65, 84, 73, 79, 78, 128, 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, 78, 65, 85, 196, - 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 84, 69, 65, - 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 82, 79, 77, 73, 75, - 79, 76, 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, - 78, 65, 71, 77, 65, 128, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, - 82, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 77, - 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 82, 73, 71, 72, 84, - 45, 83, 72, 65, 68, 79, 87, 69, 196, 66, 65, 76, 76, 79, 79, 78, 45, 83, - 80, 79, 75, 69, 196, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, - 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, - 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 65, 82, 71, 79, 83, 89, 78, - 84, 72, 69, 84, 79, 78, 128, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, - 76, 76, 217, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, - 73, 69, 85, 78, 45, 80, 65, 78, 83, 73, 79, 83, 128, 80, 65, 82, 65, 76, - 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, - 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, - 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, - 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 84, 69, 84, 65, 82, 84, 73, - 77, 79, 82, 73, 79, 78, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, 69, - 79, 75, 128, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 89, - 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 65, 86, 65, 75, 82, - 65, 72, 65, 83, 65, 78, 89, 65, 128, 66, 79, 84, 84, 79, 77, 45, 76, 73, - 71, 72, 84, 69, 196, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, 85, 72, - 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, 73, 69, 85, 78, 71, 45, 67, - 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, - 75, 72, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, - 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 75, 65, 80, 89, 69, - 79, 85, 78, 82, 73, 69, 85, 76, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, - 67, 72, 45, 65, 210, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 78, 73, 69, 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 69, 82, - 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, 73, 69, 85, 80, 45, 67, + 203, 76, 65, 84, 73, 206, 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, 65, 82, 65, 66, 73, + 195, 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, 66, 79, 76, 196, 71, + 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 65, 78, 196, 77, 85, + 83, 73, 67, 65, 204, 83, 73, 71, 206, 69, 84, 72, 73, 79, 80, 73, 195, + 72, 65, 78, 71, 85, 204, 73, 84, 65, 76, 73, 195, 82, 65, 68, 73, 67, 65, + 204, 68, 73, 71, 73, 212, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 70, + 79, 210, 67, 73, 82, 67, 76, 69, 196, 70, 73, 78, 65, 204, 83, 81, 85, + 65, 82, 197, 67, 89, 82, 73, 76, 76, 73, 195, 86, 79, 87, 69, 204, 86, + 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, + 84, 69, 82, 206, 66, 89, 90, 65, 78, 84, 73, 78, 197, 82, 73, 71, 72, + 212, 73, 83, 79, 76, 65, 84, 69, 196, 76, 69, 70, 212, 194, 75, 65, 84, + 65, 75, 65, 78, 193, 75, 65, 78, 71, 88, 201, 76, 73, 78, 69, 65, 210, + 68, 79, 85, 66, 76, 197, 66, 69, 76, 79, 87, 128, 84, 73, 66, 69, 84, 65, + 206, 65, 66, 79, 86, 69, 128, 77, 79, 68, 73, 70, 73, 69, 210, 67, 79, + 77, 66, 73, 78, 73, 78, 199, 77, 69, 69, 205, 83, 73, 71, 78, 128, 68, + 79, 212, 73, 78, 73, 84, 73, 65, 204, 67, 65, 82, 82, 73, 69, 210, 65, + 82, 82, 79, 87, 128, 89, 69, 200, 77, 79, 78, 71, 79, 76, 73, 65, 206, + 86, 69, 82, 84, 73, 67, 65, 204, 65, 66, 79, 86, 197, 78, 85, 77, 66, 69, + 210, 67, 79, 80, 84, 73, 195, 75, 72, 77, 69, 210, 87, 72, 73, 84, 197, + 65, 82, 82, 79, 215, 66, 79, 216, 65, 128, 72, 69, 66, 82, 69, 215, 77, + 65, 82, 75, 128, 68, 82, 65, 87, 73, 78, 71, 211, 73, 128, 79, 128, 72, + 65, 76, 70, 87, 73, 68, 84, 200, 71, 69, 79, 82, 71, 73, 65, 206, 82, 73, + 71, 72, 84, 87, 65, 82, 68, 211, 73, 68, 69, 79, 71, 82, 65, 205, 85, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 84, 65, 201, 80, 65, + 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 65, 76, 69, 198, 83, 67, 82, + 73, 80, 212, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, + 203, 84, 79, 128, 85, 208, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, 79, + 79, 75, 128, 83, 89, 77, 66, 79, 76, 128, 68, 79, 87, 206, 70, 82, 65, + 75, 84, 85, 210, 72, 65, 200, 69, 81, 85, 65, 204, 72, 69, 65, 86, 217, + 84, 65, 199, 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, + 67, 84, 69, 210, 65, 82, 77, 69, 78, 73, 65, 206, 66, 69, 78, 71, 65, 76, + 201, 67, 72, 79, 83, 69, 79, 78, 199, 74, 69, 69, 205, 66, 82, 65, 67, + 75, 69, 84, 128, 72, 73, 82, 65, 71, 65, 78, 193, 87, 69, 83, 84, 45, 67, + 82, 69, 197, 84, 72, 65, 201, 83, 84, 82, 79, 75, 69, 128, 67, 72, 69, + 82, 79, 75, 69, 197, 73, 68, 69, 79, 71, 82, 65, 80, 200, 84, 87, 79, + 128, 71, 85, 74, 65, 82, 65, 84, 201, 77, 69, 68, 73, 65, 204, 74, 79, + 78, 71, 83, 69, 79, 78, 199, 75, 65, 78, 78, 65, 68, 193, 78, 69, 215, + 207, 79, 82, 73, 89, 193, 82, 85, 78, 73, 195, 84, 69, 84, 82, 65, 71, + 82, 65, 205, 68, 69, 83, 69, 82, 69, 212, 76, 85, 197, 83, 73, 78, 72, + 65, 76, 193, 84, 69, 76, 85, 71, 213, 66, 65, 82, 128, 78, 79, 84, 65, + 84, 73, 79, 206, 79, 78, 69, 128, 83, 89, 82, 73, 65, 195, 77, 65, 76, + 65, 89, 65, 76, 65, 205, 77, 89, 65, 78, 77, 65, 210, 71, 85, 82, 77, 85, + 75, 72, 201, 65, 67, 85, 84, 69, 128, 76, 73, 71, 72, 212, 72, 65, 76, + 198, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 76, 69, 70, 84, + 87, 65, 82, 68, 211, 84, 65, 77, 73, 204, 65, 80, 204, 70, 85, 78, 67, + 84, 73, 79, 78, 65, 204, 72, 65, 77, 90, 193, 84, 69, 76, 69, 71, 82, 65, + 80, 200, 74, 85, 78, 71, 83, 69, 79, 78, 199, 79, 198, 68, 65, 83, 73, + 193, 76, 73, 77, 66, 213, 77, 65, 75, 83, 85, 82, 193, 75, 72, 65, 82, + 79, 83, 72, 84, 72, 201, 76, 65, 207, 84, 207, 66, 65, 82, 194, 66, 79, + 80, 79, 77, 79, 70, 207, 72, 69, 88, 65, 71, 82, 65, 205, 77, 65, 82, + 203, 80, 83, 73, 76, 201, 77, 79, 78, 79, 83, 80, 65, 67, 197, 78, 79, + 212, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 75, 72, 65, 200, 86, 79, + 67, 65, 76, 73, 195, 84, 72, 82, 69, 69, 128, 65, 69, 71, 69, 65, 206, + 76, 79, 87, 69, 210, 84, 73, 76, 68, 69, 128, 76, 79, 215, 84, 87, 207, + 67, 89, 80, 82, 73, 79, 212, 84, 73, 70, 73, 78, 65, 71, 200, 68, 73, 65, + 69, 82, 69, 83, 73, 83, 128, 70, 73, 86, 69, 128, 70, 79, 85, 82, 128, + 78, 85, 77, 69, 82, 65, 204, 86, 128, 65, 67, 82, 79, 80, 72, 79, 78, 73, + 195, 68, 79, 84, 211, 76, 79, 78, 199, 80, 69, 82, 83, 73, 65, 206, 65, + 78, 71, 76, 197, 72, 65, 82, 80, 79, 79, 206, 83, 73, 88, 128, 84, 79, + 78, 197, 85, 80, 80, 69, 210, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, + 71, 82, 65, 86, 69, 128, 72, 128, 65, 76, 80, 72, 193, 69, 73, 71, 72, + 84, 128, 77, 65, 67, 82, 79, 78, 128, 78, 79, 79, 206, 84, 72, 65, 65, + 78, 193, 72, 73, 71, 200, 75, 65, 128, 78, 73, 78, 69, 128, 83, 69, 86, + 69, 78, 128, 84, 72, 82, 69, 197, 84, 85, 82, 78, 69, 196, 83, 72, 65, + 86, 73, 65, 206, 83, 84, 79, 80, 128, 68, 128, 71, 128, 79, 77, 69, 71, + 193, 79, 88, 73, 65, 128, 83, 85, 66, 74, 79, 73, 78, 69, 196, 86, 65, + 82, 73, 65, 128, 89, 65, 128, 66, 128, 67, 73, 82, 67, 76, 197, 72, 65, + 128, 74, 128, 77, 65, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 73, 71, + 72, 84, 128, 85, 80, 87, 65, 82, 68, 211, 80, 65, 83, 83, 73, 86, 69, 45, + 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 66, 89, + 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, + 65, 206, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, + 67, 73, 69, 85, 67, 128, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, + 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 65, 78, 84, 73, 67, 76, 79, 67, + 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 67, 69, 79, 78, 71, + 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 83, + 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, + 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, + 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, + 85, 80, 128, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, 85, + 84, 80, 85, 212, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, + 69, 85, 67, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, + 67, 73, 69, 85, 67, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, + 75, 73, 89, 69, 79, 75, 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, 84, 73, 75, 69, + 85, 84, 45, 72, 73, 69, 85, 72, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, + 82, 65, 75, 65, 76, 69, 83, 77, 65, 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, 84, 73, 75, 69, 85, 84, 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, 89, 69, + 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, + 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 73, 69, 85, 78, 71, 45, 83, 83, + 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 76, 79, 78, 71, 45, 66, 82, 65, + 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 80, 65, 82, 84, 73, 65, 76, 76, + 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 82, 73, 69, 85, 76, 45, 80, 73, + 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 83, 72, 79, 82, 84, 45, 84, 87, + 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 73, 79, 83, 45, 80, 73, 69, + 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 75, 65, 84, 65, 75, 65, 78, 65, + 45, 72, 73, 82, 65, 71, 65, 78, 193, 82, 73, 69, 85, 76, 45, 80, 73, 69, + 85, 80, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, + 65, 78, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, + 67, 73, 69, 85, 67, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, + 67, 65, 84, 79, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, + 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, + 85, 80, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, 79, + 83, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, + 204, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, + 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 75, + 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 65, 78, 84, + 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, 67, 67, 69, 78, + 84, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 65, 78, 84, 73, 75, 69, 78, + 79, 75, 89, 76, 73, 83, 77, 65, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, + 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, 69, 85, 67, 72, 45, 75, 72, 73, + 69, 85, 75, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 72, 73, 69, 85, + 67, 72, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, + 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 49, 48, 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, 50, + 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 50, 48, 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, 50, 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, 52, + 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 51, 48, 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, 50, 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, 52, 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, 54, + 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, 56, 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, 65, 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, 67, 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, 69, 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, 52, 48, 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, 50, 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, 52, 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, 54, 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, 56, + 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, 65, 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, 67, 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, 69, 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, + 53, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, + 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, 67, 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, 69, 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, 54, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, + 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, 69, 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, 55, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, + 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, 56, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 57, 48, + 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 65, 48, 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, 50, + 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 66, 48, 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, 50, 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, 52, + 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 67, 48, 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, 50, 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, 52, 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, 54, + 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, 56, 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, 65, 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, 67, 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, 69, 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, 68, 48, 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, 50, 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, 52, 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, 54, 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, 56, + 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, 65, 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, 67, 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, 69, 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, + 69, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, + 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, 67, 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, 69, 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, 70, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, + 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, 69, 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, 57, 48, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, + 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, 49, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 50, 48, + 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 51, 48, 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, 50, + 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 52, 48, 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, 50, 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, 52, + 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 53, 48, 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, 50, 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, 52, 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, 54, + 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, 56, 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, 65, 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, 67, 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, 69, 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, 54, 48, 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, 50, 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, 52, 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, 54, 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, 56, + 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, 65, 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, 67, 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, 69, 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, + 55, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, + 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, 67, 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, 69, 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, 56, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, + 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, 69, 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, 57, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, + 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, 65, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 66, 48, + 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 67, 48, 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, 50, + 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 68, 48, 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, 50, 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, 52, + 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 69, 48, 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, 50, 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, 52, 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, 54, + 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, 56, 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, 65, 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, 67, 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, 69, 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, 70, 48, 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, 50, 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, 52, 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, 54, 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, 56, + 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, 65, 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, 67, 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, 69, 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, 65, + 48, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, + 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, 67, 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, 69, 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, 49, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 74, + 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 75, 82, 65, + 84, 73, 77, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, + 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 76, 79, 78, 71, 45, 66, 82, + 65, 78, 67, 72, 45, 77, 65, 68, 210, 77, 73, 69, 85, 77, 45, 83, 83, 65, + 78, 71, 83, 73, 79, 83, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, 70, + 73, 83, 77, 65, 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, + 79, 83, 128, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 82, + 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 84, 69, 65, + 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 80, 82, 79, 83, 71, + 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 84, 69, 65, 82, 68, 82, 79, 80, + 45, 83, 80, 79, 75, 69, 196, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, + 69, 82, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, + 196, 67, 79, 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 72, 73, + 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 65, 70, 79, 82, 69, + 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 82, 79, 85, 78, 68, 45, 80, + 82, 79, 70, 73, 76, 69, 128, 67, 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, + 78, 84, 69, 196, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, + 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 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, 70, 57, 48, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 49, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 50, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 51, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 52, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 53, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 54, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 55, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 56, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 57, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 65, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 66, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 67, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 68, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 69, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 70, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 65, 48, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 49, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 50, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 51, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 52, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 53, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 66, 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, 68, 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, 70, 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, 54, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 55, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 56, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 57, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 65, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 66, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 67, 48, 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, 50, 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, 52, 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, 54, 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, 56, 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, 65, 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, 67, 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, 69, 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, 68, 48, 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, 50, 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, 52, 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, 54, 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, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, + 128, 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, 83, 79, 204, 76, 79, 78, 71, 45, + 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 77, 85, 76, 84, 73, 80, 76, 73, + 67, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, + 73, 79, 78, 128, 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, 78, 65, 85, 196, 83, 73, + 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 84, 69, 65, 82, 68, + 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 82, 79, 77, 73, 75, 79, 76, + 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, + 71, 77, 65, 128, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, + 196, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 82, 73, 71, + 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 77, 85, 76, 84, 73, 80, 76, + 73, 67, 65, 84, 73, 79, 206, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, + 87, 69, 196, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 75, + 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, + 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, + 69, 85, 84, 72, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, + 128, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 77, 73, 69, + 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 80, + 65, 78, 83, 73, 79, 83, 128, 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, + 65, 77, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, + 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, + 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, + 69, 85, 84, 72, 128, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, 69, + 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 84, 69, 84, + 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 73, 75, 69, 85, 84, 45, + 75, 73, 89, 69, 79, 75, 128, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, + 85, 78, 196, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 65, + 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, 128, 66, 79, 84, 84, 79, + 77, 45, 76, 73, 71, 72, 84, 69, 196, 67, 72, 73, 69, 85, 67, 72, 45, 72, + 73, 69, 85, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, + 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, 78, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, 69, 77, 66, 69, 76, 76, 73, + 83, 72, 77, 69, 78, 84, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, + 67, 72, 128, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 73, + 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, 71, + 45, 84, 72, 73, 69, 85, 84, 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, + 73, 69, 85, 76, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, + 210, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, 78, 73, 69, + 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 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, 83, 79, 204, 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, 89, 82, 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, - 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 89, 85, 85, - 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 71, 82, 69, 65, 84, 69, 82, - 45, 84, 72, 65, 78, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, - 197, 76, 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 73, 78, 84, 69, - 82, 83, 69, 67, 84, 73, 79, 78, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, - 84, 69, 76, 217, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, - 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, 80, 65, 82, 69, 83, 84, - 73, 71, 77, 69, 78, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, - 83, 128, 67, 79, 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 76, 69, 70, - 84, 45, 84, 79, 45, 82, 73, 71, 72, 212, 78, 73, 69, 85, 78, 45, 84, 73, - 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, - 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, 212, 68, 73, 77, 73, 78, - 85, 84, 73, 79, 78, 45, 49, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, - 87, 69, 196, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, 128, 71, 69, - 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 73, 69, 85, 78, 71, 45, 75, - 73, 89, 69, 79, 75, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, - 128, 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, - 76, 45, 84, 73, 75, 69, 85, 84, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, - 67, 79, 78, 196, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, - 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 65, 78, 65, 84, 82, 73, - 67, 72, 73, 83, 77, 65, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, - 83, 128, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 89, 76, - 73, 78, 68, 82, 73, 67, 73, 84, 89, 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, 51, 128, - 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, 211, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, - 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 50, 51, 52, 53, 54, 55, 56, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, - 69, 78, 67, 217, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 73, - 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128, 73, 69, 85, 78, 71, 45, - 84, 73, 75, 69, 85, 84, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, - 73, 195, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 75, 73, 89, - 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 77, 73, 78, 85, 83, 45, 79, 82, - 45, 80, 76, 85, 211, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, - 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 82, 85, 76, 69, 45, - 68, 69, 76, 65, 89, 69, 68, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 128, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 69, + 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 89, 85, 85, 75, 65, 76, 69, + 65, 80, 73, 78, 84, 85, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, + 78, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 76, 69, 70, + 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 73, 78, 84, 69, 82, 83, 69, 67, + 84, 73, 79, 78, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, + 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 79, 87, 78, 45, + 80, 79, 73, 78, 84, 73, 78, 199, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, + 78, 79, 206, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 72, 89, + 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 67, 79, 78, 67, 65, 86, 69, + 45, 83, 73, 68, 69, 196, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, + 212, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, + 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 71, 72, 84, 45, 84, 79, 45, + 76, 69, 70, 212, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 67, + 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 68, 73, 77, 73, 78, 85, + 84, 73, 79, 78, 45, 49, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, 87, + 69, 196, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, 128, 71, 69, 79, + 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 73, 69, 85, 78, 71, 45, 75, 73, + 89, 69, 79, 75, 128, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, + 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, + 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, + 85, 84, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 87, + 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, + 84, 72, 82, 69, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, + 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 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, 72, 65, 128, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 89, 76, 73, 78, 68, + 82, 73, 67, 73, 84, 89, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, + 83, 128, 68, 69, 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 73, 70, + 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, 77, 73, 78, 73, 83, 72, + 77, 69, 78, 84, 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, 51, 128, 68, 73, 83, 67, 79, + 78, 84, 73, 78, 85, 79, 85, 211, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, + 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, + 54, 55, 56, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 70, + 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, 71, 82, 79, 78, 84, 72, + 73, 83, 77, 65, 84, 65, 128, 72, 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, + 69, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128, 73, 69, 85, + 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 78, 84, 69, 82, 83, 89, 76, + 76, 65, 66, 73, 195, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, + 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 76, 65, 66, 73, 65, + 76, 73, 90, 65, 84, 73, 79, 206, 77, 73, 78, 85, 83, 45, 79, 82, 45, 80, + 76, 85, 211, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 79, 80, + 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 80, 69, 82, 80, 69, 78, 68, + 73, 67, 85, 76, 65, 210, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, + 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, + 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, + 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, + 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, + 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, + 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, + 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, + 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, + 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, 53, 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, 55, 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, 57, 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, 49, 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, 51, 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, 53, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 53, 54, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, @@ -1011,896 +1228,1148 @@ 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, - 45, 83, 69, 86, 69, 78, 128, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, - 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 80, 82, 69, 83, 69, - 78, 84, 65, 84, 73, 79, 206, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, - 195, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 83, 128, 73, 78, 84, 69, 82, - 83, 69, 67, 84, 73, 79, 206, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, - 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 66, 76, 65, 67, 75, - 45, 76, 69, 84, 84, 69, 210, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, - 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 67, 65, 78, 84, 73, - 76, 76, 65, 84, 73, 79, 206, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, - 128, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 82, 73, 69, 85, 76, - 45, 72, 73, 69, 85, 72, 128, 83, 79, 85, 84, 72, 45, 83, 76, 65, 86, 69, - 217, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 83, 84, 82, 79, - 76, 79, 71, 73, 67, 65, 204, 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65, - 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, - 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 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, 80, 73, 69, 85, 80, 128, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, - 210, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 65, 67, 75, 78, 79, - 87, 76, 69, 68, 71, 69, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, - 128, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 80, 73, 69, 85, 80, - 45, 67, 73, 69, 85, 67, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, - 193, 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 83, 73, 88, 84, 89, - 45, 70, 79, 85, 82, 84, 200, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, - 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 87, 69, 68, 71, 69, - 45, 84, 65, 73, 76, 69, 196, 65, 77, 65, 76, 71, 65, 77, 65, 84, 73, 79, - 206, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 85, 71, 77, 69, - 78, 84, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, - 206, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, 128, 67, 79, 78, 74, 85, - 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, - 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 85, 78, 84, - 69, 82, 66, 79, 82, 69, 128, 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, - 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 78, 79, 77, - 73, 78, 65, 84, 79, 82, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, 83, 72, - 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, - 51, 52, 53, 54, 55, 56, 128, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, 69, - 196, 69, 65, 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 70, 73, 78, 71, 69, - 82, 78, 65, 73, 76, 83, 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, 69, - 196, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 73, 69, 85, 72, - 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, - 128, 72, 73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, - 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, - 128, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 73, 69, 85, 78, 71, - 45, 80, 73, 69, 85, 80, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, - 128, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 82, - 82, 79, 66, 65, 78, 71, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, - 128, 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, 77, 73, 69, 85, 77, - 45, 72, 73, 69, 85, 72, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, - 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 78, 65, 65, 75, 83, - 73, 75, 89, 65, 89, 65, 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, - 128, 78, 73, 69, 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 79, 78, 45, 66, - 82, 69, 65, 75, 73, 78, 199, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, - 128, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 73, 69, 85, 80, - 45, 78, 73, 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, - 128, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 82, 69, 83, 67, - 82, 73, 80, 84, 73, 79, 206, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, - 204, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 78, 70, 79, - 82, 90, 65, 78, 68, 79, 128, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, - 196, 83, 65, 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 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, 50, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 54, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, - 199, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 84, 69, 84, 82, 65, - 70, 79, 78, 73, 65, 83, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, - 128, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 79, 65, 78, 68, - 65, 75, 72, 73, 65, 84, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, - 206, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, - 89, 45, 78, 73, 78, 69, 128, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, - 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, 128, 83, 85, 80, 69, 82, 83, - 67, 82, 73, 80, 212, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 128, 73, 78, - 68, 69, 80, 69, 78, 68, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, - 78, 201, 68, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 69, 88, 67, 76, 65, - 77, 65, 84, 73, 79, 206, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 68, - 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 77, 65, 72, 65, 65, 80, 82, 65, - 65, 78, 193, 65, 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 80, 85, 78, 67, - 84, 85, 65, 84, 73, 79, 206, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, - 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 73, 77, 80, 69, 82, 70, 69, - 67, 84, 85, 205, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 65, 82, 82, - 79, 87, 45, 84, 65, 73, 76, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, - 197, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 76, 84, 69, 82, 78, - 65, 84, 73, 86, 197, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, - 84, 69, 82, 76, 73, 78, 69, 65, 210, 79, 80, 69, 78, 45, 72, 69, 65, 68, - 69, 196, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 83, 69, 77, 73, 45, - 86, 79, 73, 67, 69, 196, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, - 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 65, 69, 68, 65, 45, 80, 73, 76, - 76, 65, 128, 67, 79, 78, 83, 69, 67, 85, 84, 73, 86, 197, 68, 73, 86, 73, - 78, 65, 84, 73, 79, 78, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, - 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 77, 79, 78, 79, 70, 79, 78, - 73, 65, 83, 128, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 78, 65, 65, - 83, 73, 75, 89, 65, 89, 65, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, 83, - 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 80, 65, 82, 65, 75, 65, - 76, 69, 83, 77, 193, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 69, + 45, 83, 69, 86, 69, 78, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, + 69, 210, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 89, 79, 85, + 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, + 84, 72, 65, 206, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, 80, 82, + 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 69, 82, 73, 83, 80, 79, 77, + 69, 78, 73, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 65, 82, + 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 80, 65, 82, 69, 78, 84, 72, 69, + 83, 73, 83, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 73, 78, + 84, 69, 82, 83, 69, 67, 84, 73, 79, 206, 67, 65, 78, 68, 82, 65, 66, 73, + 78, 68, 85, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 83, 85, + 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 66, 76, 65, 67, 75, 45, 76, 69, + 84, 84, 69, 210, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 67, 65, + 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 69, 75, 70, 79, 78, 73, 84, 73, + 75, 79, 78, 128, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 82, 73, + 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 83, 79, 85, 84, 72, 45, 83, 76, + 65, 86, 69, 217, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 83, + 84, 82, 79, 76, 79, 71, 73, 67, 65, 204, 71, 65, 89, 65, 78, 85, 75, 73, + 84, 84, 65, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 78, 73, + 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 72, 73, + 69, 85, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 82, 73, + 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 80, 73, + 69, 85, 80, 128, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 83, + 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 65, 67, 75, 78, 79, 87, 76, 69, + 68, 71, 69, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 73, 78, + 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 80, 73, 69, 85, 80, 45, 67, 73, + 69, 85, 67, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 82, 73, + 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 83, 73, 88, 84, 89, 45, 70, 79, + 85, 82, 84, 200, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 87, + 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 87, 69, 68, 71, 69, 45, 84, 65, + 73, 76, 69, 196, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 71, + 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 77, 65, 76, 71, 65, 77, 65, + 84, 73, 79, 206, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 85, + 71, 77, 69, 78, 84, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 76, 65, + 84, 73, 79, 206, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, 128, 67, 79, + 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 84, 82, 65, 67, 84, + 73, 79, 78, 128, 67, 79, 78, 84, 82, 65, 82, 73, 69, 84, 89, 128, 67, 79, + 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 85, 78, 84, 69, 82, 66, + 79, 82, 69, 128, 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 68, 65, + 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, 69, 67, 82, 69, 83, 67, 69, + 78, 68, 79, 128, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, + 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, + 68, 69, 84, 128, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, 128, 68, 73, + 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 79, 65, 67, 72, 65, 83, 72, + 77, 69, 69, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, + 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, + 84, 83, 45, 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, + 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, + 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, + 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 128, 68, 79, + 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 56, 128, 68, 79, + 84, 83, 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, + 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, 69, 65, 77, 72, 65, 78, 67, 72, + 79, 76, 76, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 70, 73, + 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 82, 79, 78, 84, 45, 84, 73, + 76, 84, 69, 196, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 72, 65, + 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 73, 69, 85, 72, 45, 77, 73, + 69, 85, 77, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, + 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 82, 73, + 69, 85, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, 73, 69, + 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 77, 73, + 69, 85, 77, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, 73, 78, + 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 67, 65, 76, + 65, 84, 69, 128, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 75, 73, + 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 76, 65, 75, 75, 72, 65, 78, 71, + 89, 65, 79, 128, 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 77, 73, + 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 85, 85, 83, 73, 75, 65, 84, + 79, 65, 78, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 69, + 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 73, 69, 85, 78, 45, 80, 73, + 69, 85, 80, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 79, 66, + 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 80, 65, 82, 65, 75, 76, 73, 84, + 73, 75, 73, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, + 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 73, 69, 85, 80, 45, 78, 73, + 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 79, + 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, + 84, 73, 79, 206, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 82, 73, + 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 78, 70, 79, 82, 90, 65, + 78, 68, 79, 128, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, 196, 83, 65, + 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 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, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 57, 128, 83, 80, 82, 69, 67, 72, 71, 69, + 83, 65, 78, 199, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 84, 69, + 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, 72, 65, 78, 84, 72, 65, 75, + 72, 65, 84, 128, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 79, + 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 82, 65, 78, 83, 77, 73, 83, + 83, 73, 79, 206, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, + 69, 78, 84, 89, 45, 78, 73, 78, 69, 128, 85, 78, 65, 83, 80, 73, 82, 65, + 84, 69, 68, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, 128, 83, 85, 80, + 69, 82, 83, 67, 82, 73, 80, 212, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 73, 78, 68, 69, 80, 69, + 78, 68, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 69, 88, + 67, 76, 65, 77, 65, 84, 73, 79, 206, 68, 69, 83, 67, 82, 73, 80, 84, 73, + 79, 206, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 68, 79, 85, 66, 76, + 69, 45, 76, 73, 78, 197, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 65, + 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 85, 80, 45, 80, 79, 73, 78, 84, + 73, 78, 199, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 73, 77, 80, 69, + 82, 70, 69, 67, 84, 85, 205, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, + 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 68, 79, 65, 67, 72, 65, 83, + 72, 77, 69, 197, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 76, 84, + 69, 82, 78, 65, 84, 73, 86, 197, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, + 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, + 73, 78, 69, 65, 210, 79, 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, + 80, 79, 83, 73, 84, 73, 79, 78, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, + 83, 128, 83, 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 83, 65, 78, 71, + 73, 69, 85, 78, 71, 128, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 65, + 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 67, 79, 78, 83, 69, 67, 85, 84, + 73, 86, 197, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 69, 78, 84, 69, + 82, 80, 82, 73, 83, 69, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, + 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 71, 82, 65, + 77, 77, 79, 211, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 73, 69, + 85, 78, 45, 83, 73, 79, 83, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, + 199, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 75, 76, + 73, 84, 73, 75, 201, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 83, - 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 82, 73, 69, - 85, 76, 128, 83, 83, 65, 78, 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, - 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 128, - 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 69, 84, 82, 65, 83, 73, - 77, 79, 85, 128, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 87, 69, - 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, - 128, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 78, 71, 75, 72, 65, - 78, 75, 72, 85, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, - 85, 83, 86, 65, 82, 65, 89, 65, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, - 83, 128, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 66, 65, 67, 75, 45, - 84, 73, 76, 84, 69, 196, 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, - 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 67, 73, 82, 67, 85, 76, 65, 84, - 73, 79, 206, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 79, 77, 80, - 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, - 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 82, 79, 83, 83, 66, 79, - 78, 69, 83, 128, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, 78, - 79, 77, 73, 78, 65, 84, 79, 210, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, - 204, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, - 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 128, 68, 79, 84, 83, - 45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, - 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, - 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, - 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, - 68, 79, 84, 83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, - 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, - 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, - 84, 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, - 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, - 79, 84, 83, 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, - 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, 68, 79, 84, - 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, - 53, 54, 55, 56, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, 78, 128, 69, 77, - 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, - 65, 210, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 79, 82, 77, 65, - 84, 84, 73, 78, 71, 128, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, - 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 72, 66, 65, 83, 65, 45, 69, 83, - 65, 83, 193, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 89, 80, 72, - 69, 78, 65, 84, 73, 79, 206, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, - 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 78, 70, 79, 82, 77, 65, - 84, 73, 79, 206, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 85, 78, - 68, 68, 65, 76, 73, 89, 65, 128, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, - 196, 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 78, 65, 78, 71, 77, 79, - 78, 84, 72, 79, 128, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, - 78, 70, 79, 82, 75, 73, 78, 71, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, - 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 82, 79, 74, 69, - 67, 84, 73, 79, 78, 128, 80, 82, 79, 74, 69, 67, 84, 73, 86, 69, 128, 82, - 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 83, 65, 67, 82, 73, 70, 73, 67, - 73, 65, 204, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 57, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 73, - 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, 73, 69, 85, 78, - 71, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, 83, 65, 78, 71, - 65, 82, 65, 69, 65, 128, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, - 85, 66, 83, 84, 73, 84, 85, 84, 69, 128, 83, 89, 78, 67, 72, 82, 79, 78, - 79, 85, 211, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 72, 73, 82, - 84, 89, 45, 79, 78, 69, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, - 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 87, 69, 78, 84, 89, 45, - 83, 73, 88, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 87, 73, 68, - 69, 45, 72, 69, 65, 68, 69, 196, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, - 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 68, 69, 83, 67, 69, 78, 68, 69, - 82, 128, 69, 81, 85, 73, 86, 65, 76, 69, 78, 212, 83, 69, 80, 65, 82, 65, - 84, 79, 82, 128, 65, 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 82, 82, 79, - 87, 72, 69, 65, 68, 128, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, 82, - 79, 76, 65, 84, 73, 79, 78, 197, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, - 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 68, 79, 87, 78, 87, 65, 82, 68, - 83, 128, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 83, 69, 77, 73, 67, 79, - 76, 79, 78, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 76, 69, 70, 84, - 87, 65, 82, 68, 83, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 67, 79, - 77, 77, 69, 82, 67, 73, 65, 204, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, - 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 87, 79, 79, 68, 83, 45, 67, 82, - 69, 197, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 68, 73, 65, 76, 89, 84, - 73, 75, 65, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 73, 77, 80, 69, - 82, 70, 69, 67, 84, 193, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 82, 69, - 67, 84, 65, 78, 71, 76, 69, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, - 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 83, 69, 77, 73, 66, 82, 69, 86, - 73, 211, 83, 69, 77, 73, 77, 73, 78, 73, 77, 193, 83, 78, 79, 87, 70, 76, - 65, 75, 69, 128, 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 65, 80, 79, 83, - 84, 82, 79, 70, 79, 201, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 82, - 80, 69, 71, 71, 73, 65, 84, 207, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, - 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 72, 65, 82, 65, 67, 84, 69, - 82, 128, 67, 79, 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 80, 82, 79, 68, - 85, 67, 84, 128, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 69, 77, 66, 69, - 68, 68, 73, 78, 71, 128, 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 82, - 69, 84, 66, 79, 65, 82, 68, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, - 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 73, 67, 72, 73, 77, 65, 84, 79, - 83, 128, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, 80, 65, 65, 45, 80, 73, - 76, 76, 65, 128, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 83, 69, 77, 73, - 67, 73, 82, 67, 76, 197, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, - 80, 69, 82, 86, 73, 83, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, - 84, 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 77, 79, 76, 79, 45, - 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, 82, 73, 71, 82, 65, - 77, 77, 79, 211, 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 76, 45, 76, - 65, 75, 85, 78, 65, 128, 65, 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 80, - 80, 82, 79, 65, 67, 72, 69, 211, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, - 65, 84, 84, 69, 78, 84, 73, 79, 78, 128, 66, 65, 67, 75, 83, 80, 65, 67, - 69, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 67, 65, 80, 82, 73, 67, - 79, 82, 78, 128, 67, 72, 65, 86, 73, 89, 65, 78, 73, 128, 67, 79, 77, 80, - 76, 69, 84, 69, 68, 128, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128, 68, 69, - 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, - 68, 73, 70, 70, 69, 82, 69, 78, 67, 197, 68, 79, 84, 83, 45, 49, 50, 51, - 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84, 83, - 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, 128, - 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, - 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, - 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, 79, 84, 83, - 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, - 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, - 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, - 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, - 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, 128, 68, 79, - 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 128, - 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, - 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, 128, 68, 79, - 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, - 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 50, - 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, - 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128, 68, 79, - 84, 83, 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, - 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, - 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 128, 68, 79, 84, 83, - 45, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, - 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, - 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 51, - 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, 79, 84, 83, - 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, 68, 79, - 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, - 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, - 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 53, 54, 55, 56, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128, - 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 78, 68, 79, 70, 79, 78, 79, - 78, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 88, 67, 69, 76, 76, - 69, 78, 84, 128, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, 69, 89, 66, 69, - 89, 70, 73, 76, 73, 128, 70, 82, 73, 67, 65, 84, 73, 86, 69, 128, 71, 78, - 65, 86, 73, 89, 65, 78, 73, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, 128, - 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 72, 69, 75, 85, 84, 65, 65, 82, - 85, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 89, 83, 84, 69, 82, - 69, 83, 73, 211, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 77, 73, 70, - 84, 72, 79, 82, 65, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, - 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, - 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 74, 69, 82, 85, 83, 65, 76, 69, - 77, 128, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 69, 78, 84, 73, 77, - 65, 84, 65, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 82, 65, 84, - 73, 77, 65, 84, 65, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, 128, 76, 72, - 65, 86, 73, 89, 65, 78, 73, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, - 77, 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, 84, 69, 82, 73, 65, 76, - 83, 128, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 73, 82, 73, 66, 65, - 65, 82, 85, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 79, 83, - 69, 45, 67, 82, 69, 197, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 79, 65, - 66, 79, 65, 70, 73, 76, 73, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, - 79, 82, 84, 72, 79, 71, 79, 78, 65, 204, 80, 65, 73, 89, 65, 78, 78, 79, - 73, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 128, 80, 73, 65, 83, 85, 84, - 79, 82, 85, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 90, 90, - 73, 67, 65, 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 79, - 82, 82, 69, 67, 84, 85, 83, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, - 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 69, 83, 84, 73, 79, 78, - 69, 196, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, 82, 69, 71, 73, 83, 84, - 69, 82, 69, 196, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 80, 82, - 69, 83, 69, 78, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 73, - 71, 72, 84, 45, 83, 73, 68, 197, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, - 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, 72, 65, 86, 73, 89, 65, 78, - 73, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, 73, 88, 45, 80, 69, - 82, 45, 69, 205, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 84, 82, 79, - 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 85, - 66, 83, 84, 73, 84, 85, 84, 197, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, - 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 82, 69, 69, 45, 76, 73, - 78, 197, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 70, 79, 78, - 73, 65, 83, 128, 84, 82, 73, 71, 79, 82, 71, 79, 78, 128, 86, 73, 83, 65, - 82, 71, 65, 89, 65, 128, 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 89, 80, - 79, 75, 82, 73, 83, 73, 83, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 81, - 85, 79, 84, 65, 84, 73, 79, 206, 65, 83, 84, 69, 82, 73, 83, 75, 128, 79, - 82, 78, 65, 77, 69, 78, 84, 128, 86, 65, 82, 73, 65, 84, 73, 79, 206, 65, - 82, 67, 72, 65, 73, 79, 78, 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 66, - 76, 65, 67, 75, 70, 79, 79, 212, 83, 85, 66, 83, 67, 82, 73, 80, 212, 68, - 69, 78, 84, 73, 83, 84, 82, 217, 68, 73, 65, 76, 89, 84, 73, 75, 193, 73, - 78, 84, 69, 71, 82, 65, 76, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 82, - 69, 67, 89, 67, 76, 73, 78, 199, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, - 66, 75, 72, 65, 83, 73, 65, 206, 68, 79, 68, 69, 75, 65, 84, 65, 128, 81, - 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 85, 80, 76, 197, 68, - 73, 65, 84, 79, 78, 73, 75, 201, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, - 78, 67, 76, 79, 83, 73, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 80, - 76, 65, 83, 84, 73, 67, 83, 128, 82, 69, 84, 82, 79, 70, 76, 69, 216, 73, - 84, 69, 82, 65, 84, 73, 79, 206, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, - 85, 77, 69, 82, 65, 84, 79, 210, 84, 72, 79, 85, 83, 65, 78, 68, 128, 69, - 73, 71, 72, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 78, 128, 78, - 73, 78, 69, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 78, 128, 68, - 73, 65, 71, 79, 78, 65, 76, 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 73, - 68, 69, 78, 84, 73, 67, 65, 204, 75, 69, 78, 84, 73, 77, 65, 84, 193, 80, - 65, 82, 65, 71, 82, 65, 80, 200, 82, 69, 76, 65, 84, 73, 79, 78, 128, 83, - 67, 73, 83, 83, 79, 82, 83, 128, 83, 85, 80, 69, 82, 83, 69, 84, 128, 65, - 86, 65, 71, 82, 65, 72, 65, 128, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, - 69, 80, 65, 82, 84, 73, 78, 199, 70, 65, 78, 69, 82, 79, 83, 73, 211, 73, - 78, 70, 73, 78, 73, 84, 89, 128, 77, 85, 76, 84, 73, 77, 65, 80, 128, 77, - 85, 85, 82, 68, 72, 65, 74, 193, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, - 82, 69, 67, 69, 68, 69, 83, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, - 80, 72, 69, 82, 73, 67, 65, 204, 83, 85, 66, 76, 73, 78, 69, 65, 210, 83, - 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 84, - 69, 76, 69, 80, 72, 79, 78, 197, 84, 72, 79, 85, 83, 65, 78, 68, 211, 89, - 69, 83, 73, 69, 85, 78, 71, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 67, - 79, 78, 83, 84, 65, 78, 84, 128, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, - 73, 71, 82, 65, 77, 77, 79, 211, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, - 76, 65, 84, 84, 69, 78, 69, 196, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, - 76, 73, 83, 83, 65, 78, 68, 207, 71, 82, 69, 71, 79, 82, 73, 65, 206, 73, - 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, - 83, 45, 80, 73, 76, 76, 65, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 79, - 86, 69, 82, 82, 73, 68, 69, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 80, - 69, 68, 69, 83, 84, 65, 76, 128, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, - 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 80, 69, 76, 76, 69, 210, 82, - 69, 83, 79, 85, 82, 67, 69, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 83, - 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 80, 65, 82, 65, 84, 79, 210, 83, - 85, 66, 71, 82, 79, 85, 80, 128, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, - 89, 77, 77, 69, 84, 82, 73, 195, 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, - 84, 65, 89, 65, 78, 78, 65, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, - 78, 73, 86, 69, 82, 83, 65, 204, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, - 69, 69, 89, 65, 78, 78, 65, 128, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, - 78, 85, 68, 65, 84, 84, 65, 128, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, - 80, 79, 84, 72, 69, 77, 65, 128, 65, 81, 85, 65, 82, 73, 85, 83, 128, 65, - 82, 65, 69, 65, 45, 69, 79, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, - 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, - 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 84, 69, 82, 73, 83, 75, 211, 65, - 83, 84, 69, 82, 73, 83, 77, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, - 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, - 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 83, 83, 89, 69, 82, 85, 128, 67, - 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, - 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 84, 84, 65, 87, 65, 128, 67, - 73, 86, 73, 76, 73, 65, 78, 128, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, - 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 74, 85, 71, 65, 84, 197, 67, - 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, - 82, 69, 83, 67, 69, 78, 84, 128, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, - 65, 86, 73, 89, 65, 78, 73, 128, 68, 69, 67, 69, 77, 66, 69, 82, 128, 68, - 69, 76, 73, 77, 73, 84, 69, 210, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, - 73, 71, 79, 82, 71, 79, 78, 128, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, - 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, - 79, 84, 83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, - 79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, - 79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, - 79, 84, 83, 45, 49, 51, 54, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, - 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, - 79, 84, 83, 45, 49, 52, 54, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, - 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, - 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, - 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, - 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, - 79, 84, 83, 45, 50, 51, 53, 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, - 79, 84, 83, 45, 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, - 79, 84, 83, 45, 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, - 79, 84, 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, - 79, 84, 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 55, 128, 68, - 79, 84, 83, 45, 50, 53, 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, 128, 68, - 79, 84, 83, 45, 50, 54, 56, 128, 68, 79, 84, 83, 45, 50, 55, 56, 128, 68, - 79, 84, 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, - 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, - 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, - 79, 84, 83, 45, 51, 53, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, - 79, 84, 83, 45, 51, 54, 56, 128, 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, - 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, - 79, 84, 83, 45, 52, 53, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, - 79, 84, 83, 45, 52, 54, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, - 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, - 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, - 79, 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, - 79, 84, 84, 69, 68, 45, 80, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, 69, - 80, 69, 71, 69, 82, 77, 65, 128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, - 83, 85, 75, 85, 85, 68, 79, 128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 70, - 65, 84, 72, 65, 84, 65, 78, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, - 69, 83, 84, 73, 86, 65, 76, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, - 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, - 73, 86, 69, 45, 76, 73, 78, 197, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, - 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, - 85, 78, 67, 84, 73, 79, 78, 128, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, - 69, 79, 77, 69, 84, 82, 73, 195, 72, 65, 78, 45, 65, 75, 65, 84, 128, 72, - 65, 82, 77, 79, 78, 73, 67, 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, - 85, 65, 82, 65, 68, 68, 79, 128, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, - 77, 73, 70, 79, 78, 79, 78, 128, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, - 78, 67, 82, 69, 65, 83, 69, 211, 73, 82, 85, 89, 65, 78, 78, 65, 128, 74, - 65, 86, 73, 89, 65, 78, 73, 128, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, - 65, 84, 72, 73, 83, 84, 73, 128, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, - 79, 78, 84, 69, 86, 77, 65, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 76, - 69, 70, 84, 45, 83, 73, 68, 197, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, - 79, 82, 82, 65, 73, 78, 69, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, - 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, - 65, 83, 67, 85, 76, 73, 78, 197, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, - 73, 78, 73, 83, 84, 69, 82, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 78, - 73, 75, 72, 65, 72, 73, 84, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, - 79, 86, 69, 77, 66, 69, 82, 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 80, - 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, - 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, - 65, 82, 73, 67, 72, 79, 78, 128, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, - 69, 76, 65, 83, 84, 79, 78, 128, 80, 73, 84, 67, 72, 70, 79, 82, 203, 80, - 79, 82, 82, 69, 67, 84, 85, 211, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, - 83, 73, 70, 73, 83, 84, 79, 206, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, - 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 69, 83, 84, 73, 79, 78, 128, 82, - 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, - 69, 67, 84, 65, 78, 71, 76, 197, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, - 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, - 69, 83, 80, 79, 78, 83, 69, 128, 82, 73, 71, 72, 84, 72, 65, 78, 196, 82, - 85, 75, 75, 65, 75, 72, 65, 128, 83, 65, 78, 84, 73, 73, 77, 85, 128, 83, - 65, 88, 73, 77, 65, 84, 65, 128, 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, - 67, 79, 82, 80, 73, 85, 83, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, - 69, 86, 69, 78, 84, 69, 69, 206, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, - 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83, - 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, - 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, - 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, - 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, - 84, 82, 79, 75, 69, 45, 57, 128, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, - 85, 82, 82, 79, 85, 78, 68, 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, - 89, 78, 68, 69, 83, 77, 79, 211, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, - 69, 84, 82, 65, 80, 76, 73, 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, - 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 85, - 73, 76, 76, 69, 65, 78, 78, 128, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, - 78, 68, 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 84, 73, 69, 128, 86, - 69, 82, 83, 73, 67, 76, 69, 128, 87, 65, 83, 65, 76, 76, 65, 77, 128, 89, - 65, 77, 65, 75, 75, 65, 78, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 90, - 65, 86, 73, 89, 65, 78, 73, 128, 78, 69, 71, 65, 84, 73, 86, 197, 73, 78, - 86, 69, 82, 84, 69, 196, 67, 69, 68, 73, 76, 76, 65, 128, 84, 82, 73, 65, + 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 73, 79, 83, 45, 78, 73, 69, + 85, 78, 128, 83, 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, + 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, + 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 128, 84, 65, 66, 85, 76, 65, 84, + 73, 79, 78, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 72, 69, + 77, 65, 84, 73, 83, 77, 79, 211, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, + 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 65, 76, 84, 69, 82, 78, + 65, 84, 73, 79, 206, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, + 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, + 65, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 83, 84, 69, 82, + 73, 83, 67, 85, 83, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 66, + 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, 65, 82, 73, 89, 79, 79, 83, + 65, 78, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 67, 73, 82, 67, + 85, 76, 65, 84, 73, 79, 206, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, + 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 76, 73, 65, + 78, 67, 69, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 78, + 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, + 211, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 68, 69, 70, 73, 78, 73, + 84, 73, 79, 78, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 73, + 65, 69, 82, 69, 83, 73, 90, 69, 196, 68, 73, 77, 69, 78, 83, 73, 79, 78, + 65, 204, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 83, 80, 69, + 82, 83, 73, 79, 78, 128, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, + 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, 79, 84, 83, + 45, 49, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, + 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, + 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, + 68, 79, 84, 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, + 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, 68, 79, 84, + 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, + 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, + 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, 79, + 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, + 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 49, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 56, 128, + 68, 79, 84, 83, 45, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, + 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, + 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, + 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 56, 128, 69, 75, 83, 84, + 82, 69, 80, 84, 79, 78, 128, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, + 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 84, 72, 85, 83, 73, + 65, 83, 77, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 88, 72, + 65, 85, 83, 84, 73, 79, 78, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, + 128, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 79, 82, 77, 65, 84, + 84, 73, 78, 71, 128, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, + 85, 82, 45, 83, 84, 82, 73, 78, 199, 72, 66, 65, 83, 65, 45, 69, 83, 65, + 83, 193, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 89, 80, 72, 69, + 78, 65, 84, 73, 79, 206, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, + 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 78, 70, 79, 82, 77, 65, 84, + 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, 69, 196, 75, 73, 82, 79, + 71, 85, 82, 65, 77, 85, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, + 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 73, 77, 73, 84, 65, 84, + 73, 79, 78, 128, 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 78, 65, 78, + 71, 77, 79, 78, 84, 72, 79, 128, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, + 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 79, 80, 80, 82, 69, 83, + 83, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, + 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, + 78, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 74, 69, + 67, 84, 73, 86, 69, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, + 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 69, 83, 73, 83, 84, 65, 78, + 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 79, + 76, 85, 84, 73, 79, 78, 128, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, + 84, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, + 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, + 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 84, 65, 78, 68, 83, 84, 73, + 76, 76, 128, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 83, + 84, 73, 84, 85, 84, 69, 128, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, + 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 72, 73, 82, 84, 89, 45, + 79, 78, 69, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 82, 65, + 78, 83, 86, 69, 82, 83, 65, 204, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88, + 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 87, 73, 68, 69, 45, 72, + 69, 65, 68, 69, 196, 68, 69, 83, 67, 69, 78, 68, 69, 82, 128, 76, 69, 83, + 83, 45, 84, 72, 65, 78, 128, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 69, + 81, 85, 73, 86, 65, 76, 69, 78, 212, 83, 69, 80, 65, 82, 65, 84, 79, 82, + 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 76, 80, 65, 80, 82, 65, + 65, 78, 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 69, 88, 84, 69, 78, + 83, 73, 79, 78, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 80, 72, 65, + 82, 89, 78, 71, 69, 65, 204, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 83, + 69, 77, 73, 67, 79, 76, 79, 78, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, + 128, 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 65, 77, 80, 69, 82, 83, 65, + 78, 68, 128, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 84, 82, 79, 69, 90, + 69, 78, 73, 65, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 83, 69, 77, + 73, 68, 73, 82, 69, 67, 212, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 87, + 79, 79, 68, 83, 45, 67, 82, 69, 197, 66, 65, 67, 75, 83, 76, 65, 83, 72, + 128, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 69, 88, 84, 82, 65, 45, 72, + 73, 71, 200, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 73, 77, 80, 69, 82, + 70, 69, 67, 84, 193, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 82, 69, 67, + 84, 65, 78, 71, 76, 69, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 67, + 79, 78, 84, 65, 73, 78, 73, 78, 199, 68, 69, 76, 73, 77, 73, 84, 69, 82, + 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 80, 73, 68, 65, 85, 82, + 69, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 79, 85, 82, 71, + 76, 65, 83, 83, 128, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, + 73, 77, 73, 78, 73, 77, 193, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 84, + 82, 73, 65, 78, 71, 85, 76, 65, 210, 65, 80, 79, 83, 84, 82, 79, 70, 79, + 201, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 82, 80, 69, 71, 71, 73, + 65, 84, 207, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 67, 69, 78, 84, 82, + 69, 76, 73, 78, 197, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, 67, 79, 80, + 82, 79, 68, 85, 67, 84, 128, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 69, + 77, 66, 69, 68, 68, 73, 78, 71, 128, 70, 73, 78, 65, 78, 67, 73, 65, 76, + 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 82, 69, 84, 66, 79, 65, + 82, 68, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 79, 82, 84, 72, + 77, 73, 75, 79, 206, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, 75, 72, 65, + 75, 65, 83, 83, 73, 65, 206, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, + 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 69, 78, 84, 65, 83, 69, 77, 69, + 128, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 83, 69, 77, 73, 67, 73, 82, + 67, 76, 197, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 80, 69, 82, + 86, 73, 83, 69, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, 89, 77, + 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, 79, + 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, + 66, 79, 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, + 89, 77, 66, 79, 76, 45, 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, + 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 84, 82, 65, 83, 69, + 77, 69, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 77, 79, + 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, 82, 73, + 71, 82, 65, 77, 77, 79, 211, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 65, + 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 66, 85, 78, 68, 65, 78, 67, 69, + 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 78, 84, 73, 70, 79, 78, + 73, 65, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, 82, 45, 82, 65, + 72, 69, 69, 77, 128, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 84, 84, + 69, 78, 84, 73, 79, 78, 128, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, + 69, 71, 73, 78, 78, 73, 78, 71, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, + 197, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 72, 65, 86, 73, 89, 65, + 78, 73, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, 79, 77, 80, 76, + 69, 84, 69, 68, 128, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 80, + 89, 82, 73, 71, 72, 84, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, + 65, 82, 75, 69, 78, 73, 78, 71, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, + 128, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 73, 70, 70, 69, 82, 69, + 78, 67, 197, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 79, 84, 83, 45, + 49, 50, 51, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, + 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, + 49, 50, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, + 83, 45, 49, 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, + 52, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, + 49, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, + 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, + 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, + 128, 68, 79, 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, + 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, + 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, + 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, + 79, 84, 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, + 128, 68, 79, 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, + 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, + 79, 84, 83, 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, + 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, + 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, + 83, 45, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 128, 68, + 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, + 54, 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, + 79, 84, 83, 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, + 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, + 54, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, + 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, + 79, 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 69, 69, 66, 69, 69, 70, 73, + 76, 73, 128, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 78, 68, 69, 65, + 86, 79, 85, 82, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 83, 84, + 73, 77, 65, 84, 69, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, + 89, 66, 69, 89, 70, 73, 76, 73, 128, 70, 79, 79, 84, 83, 84, 79, 79, 76, + 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 82, 73, 67, 65, 84, 73, + 86, 69, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 69, 77, 73, 78, + 65, 84, 73, 79, 206, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 79, 82, + 71, 79, 84, 69, 82, 73, 128, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, + 85, 82, 65, 77, 85, 84, 79, 78, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, + 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 89, 83, 84, 69, 82, 69, + 83, 73, 211, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 77, 73, 70, 84, + 72, 79, 82, 65, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, + 82, 69, 77, 69, 78, 84, 128, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, + 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 78, 79, 67, 69, 78, 67, 69, + 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 74, 69, 82, 85, 83, 65, 76, + 69, 77, 128, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 69, 77, 80, 72, + 82, 69, 78, 71, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 73, 82, + 79, 87, 65, 84, 84, 79, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, + 85, 82, 85, 90, 69, 73, 82, 79, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, + 128, 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 73, 71, 72, 84, 78, 73, + 78, 71, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, 84, 69, 82, + 73, 65, 76, 83, 128, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 73, 82, + 73, 66, 65, 65, 82, 85, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, + 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 85, 75, 80, 72, 82, 69, 78, 71, + 128, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 79, 65, 66, 79, 65, 70, 73, + 76, 73, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 82, 84, 72, 79, + 71, 79, 78, 65, 204, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 82, + 65, 71, 82, 65, 80, 72, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, + 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, + 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 79, 82, 82, 69, 67, 84, + 85, 83, 128, 80, 82, 65, 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, + 77, 85, 79, 89, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 81, 85, 65, + 84, 69, 82, 78, 73, 79, 206, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, + 85, 83, 72, 83, 72, 65, 89, 65, 128, 82, 69, 71, 73, 83, 84, 69, 82, 69, + 196, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 80, 82, 69, 83, 69, + 78, 84, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 85, 80, + 73, 78, 85, 83, 128, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 83, 67, 65, + 78, 68, 73, 67, 85, 83, 128, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, + 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, + 128, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, + 82, 69, 196, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 83, + 84, 82, 73, 78, 199, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, + 79, 75, 69, 45, 49, 49, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, + 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 89, 77, 66, 79, 76, 45, 49, 48, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, + 76, 45, 50, 49, 128, 83, 89, 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, + 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, 45, 50, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, + 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, 89, 77, 66, 79, 76, 45, + 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 52, 48, 128, 83, + 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, + 128, 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, + 52, 55, 128, 83, 89, 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, + 76, 45, 52, 57, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 84, 65, 75, + 72, 65, 76, 76, 85, 83, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, + 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 82, 69, 69, 45, 76, 73, 78, + 197, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 70, 79, 78, 73, + 65, 83, 128, 84, 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 85, 84, 69, 89, + 65, 83, 65, 84, 128, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 87, 65, 83, + 83, 65, 76, 76, 65, 77, 128, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, + 79, 82, 68, 83, 80, 65, 67, 69, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, + 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 68, 79, 87, 78, 87, 65, 82, 68, + 211, 84, 82, 73, 65, 78, 71, 76, 69, 128, 79, 80, 69, 82, 65, 84, 79, 82, + 128, 83, 85, 66, 83, 67, 82, 73, 80, 212, 84, 72, 79, 85, 83, 65, 78, 68, + 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 81, 85, 79, 84, 65, 84, 73, 79, + 206, 65, 83, 84, 69, 82, 73, 83, 75, 128, 79, 82, 78, 65, 77, 69, 78, 84, + 128, 82, 69, 84, 82, 79, 70, 76, 69, 216, 65, 82, 67, 72, 65, 73, 79, 78, + 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 66, 76, 65, 67, 75, 70, 79, 79, + 212, 68, 69, 78, 84, 73, 83, 84, 82, 217, 68, 73, 65, 76, 89, 84, 73, 75, + 193, 73, 78, 84, 69, 71, 82, 65, 76, 128, 65, 78, 85, 83, 86, 65, 82, 65, + 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 76, 69, 70, 84, 45, 83, 84, 69, + 205, 82, 69, 67, 89, 67, 76, 73, 78, 199, 65, 66, 75, 72, 65, 83, 73, 65, + 206, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 79, 68, 69, 75, 65, 84, 65, + 128, 69, 76, 76, 73, 80, 83, 73, 83, 128, 81, 85, 65, 68, 82, 65, 78, 84, + 128, 81, 85, 65, 68, 82, 85, 80, 76, 197, 68, 73, 65, 84, 79, 78, 73, 75, + 201, 69, 78, 67, 76, 79, 83, 73, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, + 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, + 196, 73, 84, 69, 82, 65, 84, 73, 79, 206, 78, 79, 84, 69, 72, 69, 65, 68, + 128, 78, 85, 77, 69, 82, 65, 84, 79, 210, 65, 86, 65, 71, 82, 65, 72, 65, + 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 78, + 128, 78, 73, 78, 69, 84, 69, 69, 78, 128, 83, 85, 80, 69, 82, 83, 69, 84, + 128, 84, 72, 73, 82, 84, 69, 69, 78, 128, 68, 73, 65, 71, 79, 78, 65, 76, + 128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 70, 76, 79, 82, 69, 84, 84, 69, + 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 75, 69, 78, 84, 73, 77, 65, 84, + 193, 80, 65, 82, 65, 71, 82, 65, 80, 200, 82, 69, 76, 65, 84, 73, 79, 78, + 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 69, 66, 65, 84, 66, 69, 73, + 212, 83, 69, 80, 65, 82, 65, 84, 79, 210, 65, 76, 84, 69, 82, 78, 65, 84, + 197, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 69, 80, 65, 82, 84, 73, 78, + 199, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 73, 83, 72, 72, 79, 79, 75, + 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 77, 79, 85, 78, 84, 65, 73, 78, + 128, 77, 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 85, 82, 68, 72, 65, 74, + 193, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 82, 69, 67, 69, 68, 69, 83, + 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 80, 72, 69, 82, 73, 67, 65, + 204, 83, 85, 66, 76, 73, 78, 69, 65, 210, 83, 85, 67, 67, 69, 69, 68, 83, + 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 84, 69, 76, 69, 80, 72, 79, 78, + 197, 84, 72, 79, 85, 83, 65, 78, 68, 211, 89, 69, 83, 73, 69, 85, 78, 71, + 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 67, 65, 85, 76, 68, 82, 79, 78, + 128, 67, 79, 78, 83, 84, 65, 78, 84, 128, 68, 73, 70, 79, 78, 73, 65, 83, + 128, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 82, 65, 67, 72, 77, 65, 83, + 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 71, 65, 82, 83, 72, 85, 78, 73, + 128, 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 76, 73, 83, 83, 65, 78, 68, + 207, 71, 82, 69, 71, 79, 82, 73, 65, 206, 73, 78, 67, 82, 69, 65, 83, 69, + 128, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 86, 73, 83, 73, 66, 76, + 197, 73, 83, 45, 80, 73, 76, 76, 65, 128, 79, 86, 69, 82, 82, 73, 68, 69, + 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 80, 69, 68, 69, 83, 84, 65, 76, + 128, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 82, 65, 77, 45, 66, 85, 79, + 206, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 79, 76, 79, 78, 71, 69, + 196, 80, 82, 79, 80, 69, 76, 76, 69, 210, 82, 69, 83, 79, 85, 82, 67, 69, + 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 86, 69, 82, 83, 69, 68, + 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 85, 66, 71, 82, 79, 85, 80, + 128, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 89, 77, 66, 79, 76, 45, 49, + 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 55, + 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, 89, 77, 77, 69, 84, 82, 73, + 195, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 82, 73, 83, 73, 77, 79, 85, + 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 85, 78, 68, 69, 82, 76, 73, 78, + 197, 85, 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 73, 86, 69, 82, 83, 65, + 204, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 69, 69, 89, 65, 78, 78, 65, + 128, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 78, 85, 68, 65, 84, 84, 65, + 128, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 84, 72, 69, 77, 65, + 128, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, 81, 85, 65, 82, 73, 85, 83, + 128, 65, 82, 45, 82, 65, 72, 77, 65, 206, 65, 82, 65, 69, 65, 45, 69, 79, + 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 73, 83, 84, 69, 82, 65, + 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 84, 69, 82, 73, 83, 75, + 211, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 84, 84, 72, 65, 67, 65, 78, + 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 69, 86, 69, 82, 65, 71, 69, + 128, 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 83, 69, 67, 84, 73, 78, + 199, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 82, 65, 78, 67, 72, 73, 78, + 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 83, 83, 89, 69, 82, 85, + 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 82, 89, 83, 84, 73, 65, + 206, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 84, 84, 65, 87, 65, + 128, 67, 73, 86, 73, 76, 73, 65, 78, 128, 67, 76, 73, 77, 65, 67, 85, 83, + 128, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 71, 82, 85, 69, 78, + 212, 67, 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 84, 79, 85, 82, 69, + 196, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 82, 69, 83, 67, 69, 78, 84, + 128, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 82, 75, 69, 78, 73, 78, + 199, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 69, 67, 69, 77, 66, 69, 82, + 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 76, 73, 77, 73, 84, 69, + 210, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 71, 79, 82, 71, 79, 78, + 128, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, 79, 84, 83, 45, 49, 50, 51, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, 79, 84, 83, 45, 49, 50, 53, + 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, 50, 55, + 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, + 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, 51, 54, + 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, 45, 49, 51, 56, + 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, 45, 49, 52, 54, + 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, 84, 83, 45, 49, 52, 56, + 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, 84, 83, 45, 49, 53, 55, + 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, + 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, 84, 83, 45, 50, 51, 53, + 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 55, + 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 55, + 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, + 128, 68, 79, 84, 83, 45, 50, 53, 55, 128, 68, 79, 84, 83, 45, 50, 53, 56, + 128, 68, 79, 84, 83, 45, 50, 54, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, + 128, 68, 79, 84, 83, 45, 50, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, + 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, 52, 55, + 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, + 128, 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, 56, + 128, 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, 56, + 128, 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, + 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 56, + 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, + 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, + 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, + 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, 84, 84, 69, 68, 45, 76, + 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 80, + 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 86, 73, 83, 86, 65, 82, 65, + 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 78, 86, 69, 76, 79, 80, 69, + 128, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 83, 84, 73, 77, 65, 84, 69, + 196, 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 84, 69, 82, 78, 73, 84, 89, + 128, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 84, 72, 65, 84, 65, 78, + 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 83, 84, 73, 86, 65, 76, + 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 69, 45, 50, + 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 86, 69, 45, 76, 73, 78, + 197, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 82, 65, 71, 77, 69, 78, 84, + 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 85, 76, 76, 78, 69, 83, 83, + 128, 70, 85, 78, 67, 84, 73, 79, 78, 128, 71, 69, 78, 73, 84, 73, 86, 69, + 128, 71, 69, 79, 77, 69, 84, 82, 73, 195, 72, 65, 78, 45, 65, 75, 65, 84, + 128, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 77, 79, 78, 73, 67, + 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, 85, 65, 82, 65, 68, 68, 79, + 128, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, + 128, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, 67, 82, 69, 65, 83, 69, + 211, 73, 82, 85, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, 89, 65, 78, 73, + 128, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 84, 72, 73, 83, 84, 73, + 128, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 79, 78, 84, 69, 86, 77, 65, + 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 76, 65, 82, 89, 78, 71, 69, 65, + 204, 76, 69, 70, 84, 45, 83, 73, 68, 197, 76, 73, 65, 66, 73, 76, 73, 84, + 217, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 82, 82, 65, 73, 78, 69, + 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 73, 77, 65, 76, 65, 73, + 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 78, 71, 65, 76, 65, 77, + 128, 77, 65, 83, 67, 85, 76, 73, 78, 197, 77, 69, 68, 73, 67, 73, 78, 69, + 128, 77, 69, 83, 83, 69, 78, 73, 65, 206, 77, 73, 78, 73, 83, 84, 69, 82, + 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 78, 73, 75, 72, 65, 72, 73, 84, + 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 86, 69, 77, 66, 69, 82, + 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 80, 65, 65, 83, 69, 78, 84, 79, + 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 76, 79, 67, 72, 75, 65, + 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 82, 73, 67, 72, 79, 78, + 128, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 69, 76, 65, 83, 84, 79, 78, + 128, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80, 73, 84, 67, 72, 70, 79, 82, + 203, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 79, 82, 82, 69, 67, 84, 85, + 211, 80, 82, 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 80, 73, 73, + 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 71, 82, 69, 83, 83, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 81, 65, 73, 82, 84, 72, 82, 65, + 128, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 69, 83, 84, 73, 79, 78, + 128, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 79, 82, 68, 69, 82, + 128, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 84, 65, 78, 71, 76, + 197, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, 76, 73, 71, 73, 79, 78, + 128, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 73, 71, 72, 84, 72, 65, 78, + 196, 82, 85, 75, 75, 65, 75, 72, 65, 128, 83, 65, 78, 84, 73, 73, 77, 85, + 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 67, 65, 78, 68, 73, 67, 85, + 211, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 69, 77, 73, 67, 79, 76, 79, + 206, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 72, 65, 77, 82, 79, 67, 75, + 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 73, 67, 75, 78, 69, 83, 83, + 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, 84, 65, 76, 76, 73, 79, 78, + 128, 83, 84, 79, 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 80, 73, 78, 71, + 128, 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 84, 67, 72, 69, + 196, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, 69, 45, 50, + 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 52, + 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 54, + 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 56, + 128, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 85, 73, 84, 65, 66, 76, 69, + 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 89, 77, 66, 79, 76, 45, 51, + 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, 89, 77, 66, 79, 76, 45, 57, + 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 78, 68, 69, 83, 77, 79, + 211, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 69, 84, 82, 65, 80, 76, 73, + 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 82, 69, 65, 68, 73, 78, 71, + 128, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 78, + 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 85, 73, 76, 76, 69, 65, 78, 78, + 128, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 78, 68, 69, 82, 68, 79, 84, + 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 86, 69, 82, 83, 73, 67, 76, 69, + 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 83, 65, 76, 76, 65, 77, + 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 80, 79, 75, 82, 73, 83, 73, + 211, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 87, 65, 82, 65, 75, 65, 89, + 128, 73, 78, 86, 69, 82, 84, 69, 196, 78, 69, 71, 65, 84, 73, 86, 197, + 85, 71, 65, 82, 73, 84, 73, 195, 66, 85, 71, 73, 78, 69, 83, 197, 72, 85, + 78, 68, 82, 69, 68, 128, 67, 69, 68, 73, 76, 76, 65, 128, 84, 82, 73, 65, 78, 71, 76, 197, 78, 79, 84, 69, 72, 69, 65, 196, 83, 85, 80, 69, 82, 83, - 69, 212, 84, 65, 71, 66, 65, 78, 87, 193, 70, 82, 65, 67, 84, 73, 79, - 206, 81, 85, 65, 68, 82, 65, 78, 212, 68, 73, 65, 71, 79, 78, 65, 204, - 81, 85, 69, 83, 84, 73, 79, 206, 85, 80, 83, 73, 76, 79, 78, 128, 77, 65, - 82, 84, 89, 82, 73, 193, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 69, 82, - 76, 65, 89, 128, 68, 73, 65, 77, 79, 78, 68, 128, 69, 80, 83, 73, 76, 79, + 69, 212, 70, 82, 65, 67, 84, 73, 79, 206, 81, 85, 69, 83, 84, 73, 79, + 206, 84, 65, 71, 66, 65, 78, 87, 193, 81, 85, 65, 68, 82, 65, 78, 212, + 68, 73, 65, 71, 79, 78, 65, 204, 85, 80, 83, 73, 76, 79, 78, 128, 79, 86, + 69, 82, 76, 65, 89, 128, 77, 65, 82, 84, 89, 82, 73, 193, 79, 86, 69, 82, + 66, 65, 82, 128, 68, 73, 65, 77, 79, 78, 68, 128, 69, 80, 83, 73, 76, 79, 78, 128, 72, 65, 78, 71, 90, 72, 79, 213, 73, 78, 84, 69, 71, 82, 65, 204, 77, 69, 65, 83, 85, 82, 69, 196, 79, 77, 73, 67, 82, 79, 78, 128, - 84, 79, 82, 84, 79, 73, 83, 197, 79, 82, 78, 65, 77, 69, 78, 212, 69, 88, - 84, 69, 78, 68, 69, 196, 72, 65, 82, 80, 79, 79, 78, 128, 80, 82, 69, 67, - 69, 68, 69, 211, 83, 79, 76, 73, 68, 85, 83, 128, 83, 85, 67, 67, 69, 69, - 68, 211, 67, 79, 78, 84, 65, 73, 78, 211, 86, 73, 83, 65, 82, 71, 65, - 128, 67, 82, 79, 83, 83, 73, 78, 199, 72, 85, 78, 68, 82, 69, 68, 128, - 83, 73, 77, 65, 78, 83, 73, 211, 68, 73, 71, 82, 65, 80, 72, 128, 66, 65, - 82, 76, 73, 78, 69, 128, 68, 73, 86, 73, 83, 73, 79, 206, 73, 79, 84, 73, - 70, 73, 69, 196, 80, 65, 82, 65, 76, 76, 69, 204, 83, 73, 88, 84, 69, 69, - 78, 128, 83, 81, 85, 65, 82, 69, 68, 128, 83, 85, 66, 71, 82, 79, 85, - 208, 83, 85, 82, 82, 79, 85, 78, 196, 70, 73, 70, 84, 69, 69, 78, 128, - 79, 80, 69, 82, 65, 84, 79, 210, 79, 82, 73, 71, 73, 78, 65, 204, 68, 73, - 65, 83, 84, 79, 76, 201, 70, 65, 84, 72, 65, 84, 65, 206, 80, 79, 73, 78, - 84, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 212, 85, 80, 87, 65, 82, 68, - 83, 128, 66, 65, 89, 65, 78, 78, 65, 128, 67, 72, 82, 79, 78, 79, 78, + 84, 79, 82, 84, 79, 73, 83, 197, 79, 82, 78, 65, 77, 69, 78, 212, 86, 73, + 83, 65, 82, 71, 65, 128, 69, 88, 84, 69, 78, 68, 69, 196, 72, 65, 82, 80, + 79, 79, 78, 128, 80, 82, 69, 67, 69, 68, 69, 211, 83, 79, 76, 73, 68, 85, + 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 84, 72, 69, 83, 80, 73, 65, + 206, 67, 79, 78, 84, 65, 73, 78, 211, 68, 73, 71, 82, 65, 80, 72, 128, + 77, 69, 84, 82, 73, 67, 65, 204, 77, 79, 78, 79, 71, 82, 65, 205, 67, 82, + 79, 83, 83, 73, 78, 199, 83, 73, 77, 65, 78, 83, 73, 211, 83, 84, 65, 84, + 69, 82, 83, 128, 83, 85, 66, 85, 78, 73, 84, 128, 83, 73, 68, 69, 87, 65, + 89, 211, 83, 81, 85, 65, 82, 69, 68, 128, 84, 65, 76, 69, 78, 84, 83, + 128, 84, 72, 79, 85, 83, 65, 78, 196, 66, 65, 82, 76, 73, 78, 69, 128, + 68, 73, 86, 73, 83, 73, 79, 206, 73, 79, 84, 73, 70, 73, 69, 196, 80, 65, + 82, 65, 76, 76, 69, 204, 83, 73, 88, 84, 69, 69, 78, 128, 83, 85, 66, 71, + 82, 79, 85, 208, 83, 85, 82, 82, 79, 85, 78, 196, 85, 80, 87, 65, 82, 68, + 83, 128, 70, 73, 70, 84, 69, 69, 78, 128, 79, 80, 69, 82, 65, 84, 79, + 210, 79, 82, 73, 71, 73, 78, 65, 204, 68, 73, 65, 83, 84, 79, 76, 201, + 68, 73, 86, 73, 68, 69, 82, 128, 70, 65, 84, 72, 65, 84, 65, 206, 73, 90, + 72, 73, 84, 83, 65, 128, 77, 89, 83, 76, 73, 84, 69, 128, 80, 79, 73, 78, + 84, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 212, 65, 83, 84, 69, 82, 73, + 83, 203, 66, 65, 89, 65, 78, 78, 65, 128, 67, 72, 82, 79, 78, 79, 78, 128, 68, 73, 71, 79, 82, 71, 79, 206, 69, 73, 71, 72, 84, 72, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 71, 65, 89, 65, 78, 78, 65, 128, 72, 65, 82, 75, 76, 69, 65, 206, 74, 65, 89, 65, 78, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 79, 90, 69, 78, 71, 69, 128, 77, 65, 75, 83, 85, 82, 65, 128, 78, 79, 45, 66, 82, 69, 65, - 203, 80, 73, 78, 87, 72, 69, 69, 204, 82, 69, 80, 69, 65, 84, 69, 196, - 83, 65, 89, 65, 78, 78, 65, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 81, - 85, 73, 71, 71, 76, 197, 84, 69, 84, 65, 82, 84, 79, 211, 84, 82, 79, 77, - 73, 75, 79, 206, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 84, 85, 65, 76, - 76, 217, 65, 80, 79, 68, 69, 82, 77, 193, 65, 82, 73, 83, 84, 69, 82, - 193, 65, 83, 84, 69, 82, 73, 83, 203, 66, 69, 84, 87, 69, 69, 78, 128, - 66, 73, 76, 65, 66, 73, 65, 204, 67, 65, 89, 65, 78, 78, 65, 128, 67, 69, - 73, 76, 73, 78, 71, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 82, 79, - 78, 79, 85, 128, 67, 76, 79, 84, 72, 69, 83, 128, 68, 65, 77, 77, 65, 84, - 65, 206, 68, 69, 89, 84, 69, 82, 79, 211, 68, 73, 71, 65, 77, 77, 65, - 128, 68, 73, 83, 73, 77, 79, 85, 128, 69, 77, 80, 72, 65, 83, 73, 211, - 70, 69, 77, 73, 78, 73, 78, 197, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, - 84, 69, 82, 73, 79, 210, 73, 90, 72, 73, 84, 83, 65, 128, 75, 65, 83, 82, - 65, 84, 65, 206, 75, 65, 89, 65, 78, 78, 65, 128, 75, 79, 77, 66, 85, 86, - 65, 128, 76, 65, 89, 65, 78, 78, 65, 128, 76, 79, 71, 79, 84, 89, 80, - 197, 77, 85, 76, 84, 73, 83, 69, 212, 78, 65, 89, 65, 78, 78, 65, 128, - 80, 65, 89, 65, 78, 78, 65, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, - 84, 65, 76, 76, 69, 196, 81, 85, 65, 82, 84, 69, 82, 211, 82, 71, 89, 73, - 78, 71, 83, 128, 83, 69, 77, 73, 83, 79, 70, 212, 83, 69, 77, 75, 65, 84, - 72, 128, 83, 72, 65, 80, 73, 78, 71, 128, 83, 79, 67, 73, 69, 84, 89, - 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 69, 67, 73, 65, 76, 128, - 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 82, 79, 75, 69, 83, 128, 84, 72, - 69, 83, 69, 79, 83, 128, 84, 72, 79, 85, 83, 65, 78, 196, 85, 66, 65, 68, - 65, 77, 65, 128, 65, 65, 89, 65, 78, 78, 65, 128, 65, 66, 65, 70, 73, 76, - 73, 128, 65, 69, 89, 65, 78, 78, 65, 128, 65, 73, 89, 65, 78, 78, 65, - 128, 65, 76, 86, 69, 79, 76, 65, 210, 65, 78, 71, 83, 84, 82, 79, 205, - 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 85, 83, 86, 65, 82, 193, 65, 80, - 79, 84, 72, 69, 83, 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, - 65, 45, 85, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, 85, 89, 65, 78, 78, - 65, 128, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 73, 82, 75, 65, 78, - 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 69, 67, 65, 85, 83, 69, 128, - 66, 69, 76, 71, 84, 72, 79, 210, 66, 69, 82, 75, 65, 78, 65, 206, 66, 73, - 68, 69, 78, 84, 65, 204, 66, 79, 85, 78, 68, 65, 82, 217, 66, 82, 73, 83, - 84, 76, 69, 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 80, 73, 84, 65, - 76, 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 69, 76, 83, 73, 85, 83, - 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 79, 77, 80, 65, 82, 69, 128, - 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 82, 78, 69, 82, 83, 128, 67, 79, - 82, 82, 69, 67, 84, 128, 67, 82, 85, 90, 69, 73, 82, 207, 67, 85, 83, 84, - 79, 77, 69, 210, 67, 87, 69, 79, 82, 84, 72, 128, 68, 65, 71, 65, 76, 71, - 65, 128, 68, 69, 89, 84, 69, 82, 79, 213, 68, 73, 65, 77, 69, 84, 69, - 210, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 71, 82, 65, 77, 77, 193, - 68, 73, 80, 76, 79, 85, 78, 128, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, - 86, 73, 68, 69, 83, 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, - 45, 49, 51, 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, - 53, 128, 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 55, - 128, 68, 79, 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 50, 51, 128, - 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, - 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, - 45, 50, 56, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, - 53, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 55, - 128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 52, 53, 128, - 68, 79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79, - 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, - 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 54, - 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 55, 56, - 128, 68, 82, 65, 70, 84, 73, 78, 199, 69, 65, 66, 72, 65, 68, 72, 128, - 69, 65, 68, 72, 65, 68, 72, 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 73, - 71, 72, 84, 69, 69, 206, 69, 76, 65, 70, 82, 79, 78, 128, 69, 76, 69, 67, - 84, 82, 73, 195, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 84, 69, 82, 73, - 78, 199, 69, 84, 78, 65, 72, 84, 65, 128, 69, 86, 69, 78, 73, 78, 71, - 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 69, 65, 84, 72, 69, 82, 128, - 70, 69, 82, 77, 65, 84, 65, 128, 70, 73, 83, 72, 69, 89, 69, 128, 70, 79, - 78, 71, 77, 65, 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 82, 79, 87, - 78, 73, 78, 199, 71, 73, 82, 85, 68, 65, 65, 128, 71, 82, 65, 80, 72, 69, - 77, 197, 72, 65, 76, 65, 78, 84, 65, 128, 72, 65, 76, 66, 69, 82, 68, - 128, 72, 65, 89, 65, 78, 78, 65, 128, 72, 69, 65, 68, 73, 78, 71, 128, - 73, 45, 65, 82, 65, 69, 65, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 67, - 72, 65, 68, 73, 78, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 78, 70, 73, + 203, 80, 73, 78, 87, 72, 69, 69, 204, 81, 85, 65, 82, 84, 69, 82, 211, + 82, 69, 80, 69, 65, 84, 69, 196, 83, 65, 89, 65, 78, 78, 65, 128, 83, 69, + 76, 69, 67, 84, 79, 210, 83, 81, 85, 73, 71, 71, 76, 197, 84, 69, 84, 65, + 82, 84, 79, 211, 84, 82, 79, 77, 73, 75, 79, 206, 65, 67, 84, 73, 86, 65, + 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 75, 72, 77, 73, 77, 73, + 195, 65, 80, 79, 68, 69, 82, 77, 193, 65, 82, 73, 83, 84, 69, 82, 193, + 66, 69, 84, 87, 69, 69, 78, 128, 66, 73, 76, 65, 66, 73, 65, 204, 67, 65, + 89, 65, 78, 78, 65, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 72, 65, 82, + 73, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 82, 79, 78, 79, + 85, 128, 67, 76, 79, 84, 72, 69, 83, 128, 67, 79, 82, 78, 69, 82, 83, + 128, 68, 65, 77, 77, 65, 84, 65, 206, 68, 65, 80, 45, 66, 85, 79, 206, + 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, 80, 82, 65, 205, 68, 69, + 89, 84, 69, 82, 79, 211, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 83, 73, + 77, 79, 85, 128, 69, 77, 80, 72, 65, 83, 73, 211, 70, 69, 77, 73, 78, 73, + 78, 197, 70, 69, 82, 77, 65, 84, 65, 128, 70, 73, 83, 72, 72, 79, 79, + 203, 71, 76, 65, 71, 79, 76, 73, 128, 73, 78, 72, 69, 82, 69, 78, 212, + 73, 78, 84, 69, 82, 73, 79, 210, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, + 89, 65, 78, 78, 65, 128, 75, 79, 77, 66, 85, 86, 65, 128, 76, 45, 83, 72, + 65, 80, 69, 196, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 89, 65, 78, 78, + 65, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 79, 71, 79, 84, 89, 80, + 197, 77, 69, 65, 83, 85, 82, 69, 128, 77, 85, 76, 84, 73, 83, 69, 212, + 78, 65, 89, 65, 78, 78, 65, 128, 79, 77, 73, 83, 83, 73, 79, 206, 80, 65, + 89, 65, 78, 78, 65, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 84, 65, + 76, 76, 69, 196, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 45, 80, + 73, 201, 81, 85, 65, 82, 84, 69, 82, 128, 82, 71, 89, 73, 78, 71, 83, + 128, 83, 45, 83, 72, 65, 80, 69, 196, 83, 69, 77, 73, 83, 79, 70, 212, + 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 72, + 65, 80, 73, 78, 71, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 79, 67, 73, + 69, 84, 89, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 69, 67, 73, 65, + 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 82, 79, 75, 69, 83, + 128, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 85, 78, 68, 69, 82, 128, + 84, 82, 73, 83, 69, 77, 69, 128, 85, 66, 65, 68, 65, 77, 65, 128, 87, 65, + 73, 84, 73, 78, 71, 128, 90, 72, 73, 86, 69, 84, 69, 128, 65, 65, 89, 65, + 78, 78, 65, 128, 65, 66, 65, 70, 73, 76, 73, 128, 65, 68, 86, 65, 78, 67, + 69, 128, 65, 69, 89, 65, 78, 78, 65, 128, 65, 73, 89, 65, 78, 78, 65, + 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, 76, 86, 69, 79, 76, 65, 210, + 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, + 85, 83, 86, 65, 82, 193, 65, 80, 79, 84, 72, 69, 83, 128, 65, 82, 65, 69, + 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 85, 128, 65, 82, 67, 72, 65, 73, + 79, 206, 65, 82, 79, 85, 83, 73, 78, 199, 65, 85, 89, 65, 78, 78, 65, + 128, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 73, 82, 75, 65, 78, 128, + 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, + 84, 72, 84, 85, 66, 128, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 76, 71, + 84, 72, 79, 210, 66, 69, 82, 75, 65, 78, 65, 206, 66, 73, 68, 69, 78, 84, + 65, 204, 66, 79, 85, 78, 68, 65, 82, 217, 66, 82, 65, 75, 67, 69, 84, + 128, 66, 82, 73, 83, 84, 76, 69, 128, 66, 85, 85, 77, 73, 83, 72, 128, + 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, + 82, 82, 73, 65, 71, 197, 67, 69, 76, 83, 73, 85, 83, 128, 67, 72, 65, 77, + 73, 76, 73, 128, 67, 76, 73, 78, 71, 73, 78, 199, 67, 79, 77, 80, 65, 82, + 69, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 84, 65, 67, 84, + 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 82, 69, 67, 84, 128, + 67, 82, 69, 65, 84, 73, 86, 197, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, + 85, 90, 69, 73, 82, 207, 67, 85, 83, 84, 79, 77, 69, 210, 67, 87, 69, 79, + 82, 84, 72, 128, 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 82, 69, 78, 65, + 73, 195, 68, 65, 71, 65, 76, 71, 65, 128, 68, 69, 67, 65, 89, 69, 68, + 128, 68, 69, 89, 84, 69, 82, 79, 213, 68, 72, 65, 76, 65, 84, 72, 128, + 68, 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, + 71, 82, 65, 77, 77, 193, 68, 73, 77, 77, 73, 78, 71, 128, 68, 73, 80, 76, + 79, 85, 78, 128, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 86, 73, 68, 69, + 83, 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 51, + 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 53, 128, + 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 55, 128, 68, 79, + 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, + 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, 45, 50, + 54, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 56, + 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, 53, 128, + 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, + 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, + 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, + 56, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 55, + 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, + 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, 82, + 65, 67, 72, 77, 65, 128, 68, 82, 65, 70, 84, 73, 78, 199, 69, 65, 66, 72, + 65, 68, 72, 128, 69, 65, 68, 72, 65, 68, 72, 128, 69, 66, 69, 70, 73, 76, + 73, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 76, 65, 70, 82, 79, 78, + 128, 69, 76, 69, 67, 84, 82, 73, 195, 69, 78, 81, 85, 73, 82, 89, 128, + 69, 78, 84, 69, 82, 73, 78, 199, 69, 84, 78, 65, 72, 84, 65, 128, 69, 86, + 69, 78, 73, 78, 71, 128, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 89, 65, + 78, 78, 65, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 73, 83, 72, 69, 89, + 69, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, 79, 84, 78, 79, 84, + 197, 70, 79, 85, 82, 84, 69, 69, 206, 70, 82, 79, 87, 78, 73, 78, 199, + 71, 65, 82, 77, 69, 78, 84, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 82, + 65, 80, 72, 69, 77, 197, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 76, 65, + 78, 84, 65, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 83, 65, 78, 84, + 65, 128, 72, 65, 89, 65, 78, 78, 65, 128, 72, 69, 65, 68, 73, 78, 71, + 128, 72, 69, 65, 86, 69, 78, 76, 217, 73, 45, 65, 82, 65, 69, 65, 128, + 73, 66, 73, 70, 73, 76, 73, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 73, + 89, 65, 78, 78, 65, 128, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 84, 69, 82, 69, 83, 212, 73, 79, 68, 72, 65, 68, 72, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 85, 80, 73, 84, 69, 82, 128, 75, 65, 75, 65, 66, 65, 84, 128, - 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 79, - 78, 84, 69, 86, 77, 193, 75, 79, 79, 77, 85, 85, 84, 128, 75, 85, 82, 79, - 79, 78, 69, 128, 76, 65, 78, 71, 85, 65, 71, 197, 76, 79, 67, 65, 84, 73, - 79, 206, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 77, 85, 65, 78, - 128, 77, 65, 78, 83, 89, 79, 78, 128, 77, 65, 82, 66, 85, 84, 65, 128, - 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 89, 65, 78, 78, 65, 128, 77, 69, - 71, 65, 84, 79, 78, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 73, 75, 85, - 82, 79, 78, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 79, 72, 65, 77, 77, - 65, 196, 77, 79, 82, 78, 73, 78, 71, 128, 77, 85, 76, 84, 73, 80, 76, - 197, 78, 65, 84, 73, 79, 78, 65, 204, 78, 69, 71, 65, 84, 73, 79, 206, - 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 71, - 69, 65, 68, 65, 76, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 78, 69, - 84, 69, 69, 206, 79, 66, 79, 70, 73, 76, 73, 128, 79, 67, 84, 79, 66, 69, - 82, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 69, 83, 69, 76, 70, - 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 82, 84, 72, 79, 68, 79, 216, - 79, 85, 84, 76, 73, 78, 69, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, - 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 72, 73, 78, - 84, 72, 85, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 79, 68, 65, 84, 85, - 83, 128, 80, 82, 69, 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 69, - 196, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 73, 86, 65, 84, 69, 128, - 80, 82, 79, 80, 69, 82, 84, 217, 81, 85, 65, 82, 84, 69, 82, 128, 82, 65, - 75, 72, 65, 78, 71, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 89, 65, - 78, 78, 65, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 73, 84, 84, 79, 82, - 85, 128, 82, 85, 85, 66, 85, 82, 85, 128, 83, 65, 73, 75, 85, 82, 85, - 128, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 77, 80, 72, 65, 79, 128, - 83, 65, 78, 89, 79, 79, 71, 193, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, - 82, 85, 80, 76, 69, 128, 83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 86, 69, - 78, 84, 89, 128, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 82, 73, 78, 71, - 85, 128, 83, 73, 88, 45, 76, 73, 78, 197, 83, 78, 79, 87, 77, 65, 78, + 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 73, + 78, 83, 72, 73, 80, 128, 75, 79, 78, 84, 69, 86, 77, 193, 75, 79, 79, 77, + 85, 85, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 76, 65, 78, 71, 85, 65, + 71, 197, 76, 79, 67, 65, 84, 73, 79, 206, 77, 65, 73, 75, 85, 82, 79, + 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, 78, 83, 89, 79, 78, 128, + 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, + 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 89, 73, 78, 199, 77, 65, 83, 83, + 73, 78, 71, 128, 77, 65, 89, 65, 78, 78, 65, 128, 77, 69, 71, 65, 84, 79, + 78, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 84, 82, 69, 84, 69, + 211, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 76, 76, 73, 79, 78, 211, + 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, + 82, 78, 73, 78, 71, 128, 77, 85, 76, 84, 73, 80, 76, 197, 78, 65, 84, 73, + 79, 78, 65, 204, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 80, 84, 85, 78, + 69, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 71, 69, 65, 68, 65, 76, + 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 78, 69, 84, 69, 69, 206, + 79, 66, 79, 70, 73, 76, 73, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 78, + 69, 45, 76, 73, 78, 197, 79, 78, 69, 83, 69, 76, 70, 128, 79, 79, 89, 65, + 78, 78, 65, 128, 79, 82, 84, 72, 79, 68, 79, 216, 79, 85, 84, 76, 73, 78, + 69, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 76, 76, 65, 87, 65, + 128, 80, 65, 84, 84, 69, 82, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, + 80, 69, 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 72, + 73, 78, 84, 72, 85, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 79, 68, 65, + 84, 85, 83, 128, 80, 82, 69, 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, + 69, 196, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 73, 86, 65, 84, 69, + 128, 80, 82, 79, 80, 69, 82, 84, 217, 82, 65, 75, 72, 65, 78, 71, 128, + 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 89, 65, 78, 78, 65, 128, 82, 69, + 65, 72, 77, 85, 75, 128, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 84, 82, + 69, 65, 84, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 85, 85, 66, 85, 82, + 85, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 76, 84, 73, 82, 69, + 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 78, 89, 79, 79, 71, 193, + 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 69, + 71, 77, 69, 78, 84, 128, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 78, 75, + 73, 78, 71, 128, 83, 73, 82, 73, 78, 71, 85, 128, 83, 73, 88, 45, 76, 73, + 78, 197, 83, 78, 79, 87, 77, 65, 78, 128, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, 81, 85, 65, 82, 69, 83, 128, - 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 85, 128, 83, 84, - 82, 73, 67, 84, 76, 217, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 67, 67, - 69, 69, 68, 128, 83, 89, 78, 69, 86, 77, 65, 128, 84, 65, 73, 83, 89, 79, - 85, 128, 84, 65, 84, 87, 69, 69, 76, 128, 84, 67, 72, 69, 72, 69, 72, - 128, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 83, 69, 82, 65, 128, - 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 85, 78, 68, 69, 82, 128, 84, 72, - 85, 82, 73, 83, 65, 218, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 82, 79, - 78, 73, 65, 206, 84, 79, 82, 67, 85, 76, 85, 211, 84, 82, 73, 73, 83, 65, - 80, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 87, 79, 45, 76, 73, 78, - 197, 85, 45, 69, 79, 45, 69, 85, 128, 85, 66, 85, 70, 73, 76, 73, 128, - 86, 65, 89, 65, 78, 78, 65, 128, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, - 76, 76, 65, 71, 69, 128, 86, 79, 73, 67, 73, 78, 71, 128, 87, 65, 83, 65, - 76, 76, 65, 205, 89, 65, 89, 65, 78, 78, 65, 128, 89, 80, 79, 82, 82, 79, - 73, 128, 85, 80, 83, 73, 76, 79, 206, 67, 73, 82, 67, 76, 69, 128, 68, - 73, 78, 71, 66, 65, 212, 65, 67, 67, 69, 78, 84, 128, 69, 80, 83, 73, 76, - 79, 206, 83, 76, 65, 78, 84, 69, 196, 72, 65, 78, 85, 78, 79, 207, 83, - 81, 85, 65, 82, 69, 128, 68, 65, 71, 69, 83, 72, 128, 84, 65, 71, 65, 76, - 79, 199, 79, 77, 73, 67, 82, 79, 206, 71, 76, 79, 84, 84, 65, 204, 78, - 65, 83, 75, 65, 80, 201, 67, 79, 82, 78, 69, 82, 128, 69, 76, 69, 77, 69, - 78, 212, 66, 85, 76, 76, 69, 84, 128, 79, 71, 79, 78, 69, 75, 128, 75, - 73, 82, 71, 72, 73, 218, 82, 69, 86, 69, 82, 83, 197, 86, 73, 82, 65, 77, - 65, 128, 68, 73, 65, 77, 79, 78, 196, 68, 79, 85, 66, 76, 69, 128, 78, - 69, 73, 84, 72, 69, 210, 81, 85, 65, 82, 84, 69, 210, 83, 73, 77, 73, 76, - 65, 210, 83, 73, 78, 71, 76, 69, 128, 83, 81, 85, 65, 82, 69, 196, 68, - 79, 84, 76, 69, 83, 211, 78, 85, 78, 65, 86, 73, 203, 83, 79, 76, 73, 68, - 85, 211, 84, 72, 45, 67, 82, 69, 197, 84, 82, 73, 71, 82, 65, 205, 65, - 82, 75, 84, 73, 75, 207, 69, 76, 69, 86, 69, 78, 128, 73, 78, 83, 73, 68, - 69, 128, 79, 80, 69, 78, 73, 78, 199, 83, 85, 66, 83, 69, 84, 128, 84, - 87, 69, 76, 86, 69, 128, 84, 87, 69, 78, 84, 89, 128, 69, 73, 71, 72, 84, - 72, 211, 72, 89, 80, 72, 69, 78, 128, 80, 65, 82, 84, 73, 65, 204, 86, - 82, 65, 67, 72, 89, 128, 65, 82, 82, 79, 87, 83, 128, 70, 65, 76, 76, 73, - 78, 199, 80, 69, 82, 67, 69, 78, 212, 84, 72, 82, 79, 85, 71, 200, 67, - 69, 68, 73, 76, 76, 193, 67, 79, 78, 84, 82, 79, 204, 67, 85, 82, 86, 73, - 78, 199, 68, 73, 71, 82, 65, 80, 200, 69, 81, 85, 65, 76, 83, 128, 70, - 73, 76, 76, 69, 82, 128, 73, 78, 86, 69, 82, 83, 197, 75, 69, 78, 84, 73, - 77, 193, 79, 66, 76, 73, 81, 85, 197, 82, 79, 85, 78, 68, 69, 196, 83, - 65, 78, 89, 65, 75, 193, 84, 67, 72, 69, 72, 69, 200, 84, 72, 73, 82, 84, - 89, 128, 84, 79, 80, 66, 65, 82, 128, 84, 85, 82, 84, 76, 69, 128, 89, - 73, 68, 68, 73, 83, 200, 45, 75, 72, 89, 73, 76, 128, 66, 79, 84, 84, 79, - 77, 128, 67, 69, 78, 84, 82, 69, 196, 67, 79, 78, 84, 65, 73, 206, 67, - 79, 78, 84, 79, 85, 210, 68, 65, 78, 84, 65, 74, 193, 68, 73, 86, 73, 68, - 69, 196, 68, 79, 84, 84, 69, 68, 128, 68, 82, 65, 71, 79, 78, 128, 70, - 73, 70, 84, 72, 83, 128, 72, 85, 78, 68, 82, 69, 196, 75, 79, 77, 66, 85, - 86, 193, 75, 82, 65, 84, 73, 77, 193, 76, 69, 65, 68, 69, 82, 128, 77, - 65, 82, 66, 85, 84, 193, 77, 69, 77, 66, 69, 82, 128, 78, 65, 84, 85, 82, - 65, 204, 80, 69, 78, 67, 73, 76, 128, 81, 65, 77, 65, 84, 83, 128, 83, - 75, 76, 73, 82, 79, 206, 83, 84, 73, 71, 77, 65, 128, 83, 89, 78, 65, 71, - 77, 193, 84, 65, 65, 76, 85, 74, 193, 84, 72, 69, 83, 69, 79, 211, 84, - 79, 78, 71, 85, 69, 128, 65, 67, 67, 79, 85, 78, 212, 65, 80, 76, 79, 85, - 78, 128, 65, 82, 67, 72, 65, 73, 195, 66, 65, 76, 85, 68, 65, 128, 66, - 65, 77, 66, 79, 79, 128, 66, 65, 83, 72, 75, 73, 210, 66, 73, 78, 68, 73, - 78, 199, 66, 73, 83, 72, 79, 80, 128, 66, 79, 87, 84, 73, 69, 128, 67, - 69, 78, 84, 82, 69, 128, 67, 72, 73, 69, 85, 67, 200, 67, 76, 85, 83, 84, - 69, 210, 68, 65, 71, 71, 69, 82, 128, 68, 69, 67, 73, 77, 65, 204, 68, - 73, 86, 73, 68, 69, 128, 69, 83, 67, 65, 80, 69, 128, 70, 69, 65, 84, 72, - 69, 210, 70, 76, 69, 88, 85, 83, 128, 71, 65, 78, 71, 73, 65, 128, 71, - 69, 82, 69, 83, 72, 128, 73, 78, 72, 73, 66, 73, 212, 73, 83, 83, 72, 65, - 82, 128, 73, 90, 72, 73, 84, 83, 193, 75, 72, 73, 69, 85, 75, 200, 75, - 76, 65, 83, 77, 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 79, 82, 65, 78, - 73, 195, 76, 69, 71, 69, 84, 79, 211, 77, 65, 76, 65, 75, 79, 206, 77, - 79, 82, 84, 65, 82, 128, 78, 69, 71, 65, 84, 69, 196, 78, 73, 78, 69, 84, - 89, 128, 78, 79, 84, 67, 72, 69, 196, 79, 82, 68, 73, 78, 65, 204, 80, - 72, 73, 69, 85, 80, 200, 80, 72, 82, 65, 83, 69, 128, 80, 73, 76, 67, 82, - 79, 215, 80, 76, 65, 71, 73, 79, 211, 83, 69, 82, 73, 70, 83, 128, 83, - 72, 65, 80, 69, 83, 128, 83, 73, 88, 84, 69, 69, 206, 83, 76, 79, 80, 73, - 78, 199, 83, 77, 65, 76, 76, 69, 210, 83, 77, 73, 76, 73, 78, 199, 83, - 80, 69, 69, 67, 72, 128, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, 73, 83, - 72, 193, 84, 69, 83, 83, 69, 82, 193, 84, 72, 73, 69, 85, 84, 200, 84, - 72, 82, 69, 65, 68, 128, 84, 72, 82, 69, 69, 45, 196, 85, 80, 84, 85, 82, - 78, 128, 89, 69, 76, 76, 79, 87, 128, 89, 79, 45, 89, 65, 69, 128, 89, - 85, 45, 89, 69, 79, 128, 65, 70, 82, 73, 67, 65, 206, 65, 73, 72, 86, 85, - 83, 128, 65, 73, 86, 73, 76, 73, 203, 65, 76, 73, 71, 78, 69, 196, 65, - 78, 67, 72, 79, 82, 128, 65, 78, 78, 85, 73, 84, 217, 65, 80, 65, 65, 84, - 79, 128, 65, 82, 65, 69, 65, 69, 128, 65, 82, 82, 73, 86, 69, 128, 65, - 82, 83, 69, 79, 83, 128, 65, 82, 85, 72, 85, 65, 128, 65, 85, 71, 85, 83, - 84, 128, 65, 86, 69, 82, 65, 71, 197, 66, 65, 68, 71, 69, 82, 128, 66, - 65, 73, 77, 65, 73, 128, 66, 65, 78, 84, 79, 67, 128, 66, 65, 82, 82, 69, - 69, 128, 66, 69, 78, 90, 69, 78, 197, 66, 69, 84, 87, 69, 69, 206, 66, - 69, 89, 89, 65, 76, 128, 66, 73, 84, 84, 69, 82, 128, 66, 79, 82, 85, 84, - 79, 128, 66, 82, 65, 78, 67, 72, 128, 66, 82, 69, 86, 73, 83, 128, 66, - 85, 67, 75, 76, 69, 128, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, - 82, 128, 67, 65, 84, 65, 87, 65, 128, 67, 65, 85, 84, 73, 79, 206, 67, - 72, 69, 86, 82, 79, 206, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 45, - 50, 128, 67, 76, 73, 86, 73, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, - 79, 78, 73, 67, 65, 204, 67, 79, 82, 80, 83, 69, 128, 67, 85, 82, 82, 69, - 78, 212, 68, 65, 65, 68, 72, 85, 128, 68, 65, 76, 65, 84, 72, 128, 68, - 65, 77, 65, 82, 85, 128, 68, 65, 83, 69, 73, 65, 128, 68, 68, 65, 72, 65, - 76, 128, 68, 69, 76, 69, 84, 69, 128, 68, 72, 65, 65, 76, 85, 128, 68, - 72, 65, 82, 77, 65, 128, 68, 73, 69, 83, 73, 83, 128, 68, 73, 80, 80, 69, - 82, 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 45, 50, 128, 68, - 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, - 53, 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 55, 128, 68, - 79, 84, 83, 45, 56, 128, 68, 82, 65, 67, 72, 77, 193, 69, 73, 71, 72, 84, - 72, 128, 69, 73, 71, 72, 84, 89, 128, 69, 78, 65, 82, 88, 73, 211, 69, - 88, 67, 69, 83, 83, 128, 69, 88, 73, 83, 84, 83, 128, 70, 65, 67, 69, 45, - 49, 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 51, 128, 70, - 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, - 54, 128, 70, 65, 84, 72, 69, 82, 128, 70, 69, 77, 65, 76, 69, 128, 70, - 69, 82, 77, 65, 84, 193, 70, 73, 70, 84, 69, 69, 206, 70, 76, 65, 71, 45, - 49, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 51, 128, 70, - 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 53, 128, 70, 79, 82, 67, 69, - 83, 128, 71, 69, 68, 79, 76, 65, 128, 71, 69, 77, 73, 78, 73, 128, 71, - 69, 78, 69, 82, 73, 195, 71, 72, 65, 73, 78, 85, 128, 71, 72, 85, 78, 78, - 65, 128, 72, 69, 65, 86, 69, 78, 128, 72, 69, 73, 83, 69, 73, 128, 72, - 69, 82, 85, 84, 85, 128, 72, 85, 73, 73, 84, 79, 128, 73, 45, 66, 69, 65, - 77, 128, 73, 77, 73, 83, 69, 79, 211, 73, 78, 71, 87, 65, 90, 128, 73, - 78, 73, 78, 71, 85, 128, 73, 78, 83, 69, 67, 84, 128, 75, 65, 78, 84, 65, - 74, 193, 75, 69, 70, 85, 76, 65, 128, 75, 69, 89, 67, 65, 80, 128, 75, - 72, 79, 77, 85, 84, 128, 75, 76, 73, 84, 79, 78, 128, 75, 79, 82, 85, 78, - 65, 128, 75, 89, 85, 82, 73, 73, 128, 76, 65, 77, 65, 68, 72, 128, 76, - 65, 84, 69, 82, 65, 204, 76, 73, 78, 69, 45, 49, 128, 76, 73, 78, 69, 45, - 51, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 57, 128, 76, - 73, 78, 75, 73, 78, 199, 76, 79, 90, 69, 78, 71, 197, 77, 65, 76, 84, 69, - 83, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 85, 75, 85, 128, 77, - 65, 84, 82, 73, 88, 128, 77, 65, 88, 73, 77, 65, 128, 77, 69, 68, 73, 85, - 77, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 82, 75, 72, 65, 128, 77, - 69, 84, 82, 73, 65, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 76, 76, 69, - 84, 128, 77, 73, 78, 73, 77, 65, 128, 77, 79, 68, 69, 76, 83, 128, 77, - 79, 84, 72, 69, 82, 128, 77, 85, 81, 68, 65, 77, 128, 78, 65, 85, 84, 72, - 83, 128, 78, 69, 78, 65, 78, 79, 128, 78, 73, 82, 85, 71, 85, 128, 78, - 79, 75, 72, 85, 75, 128, 78, 79, 77, 73, 78, 65, 204, 78, 85, 77, 66, 69, - 82, 128, 78, 85, 78, 65, 86, 85, 212, 79, 77, 65, 76, 79, 78, 128, 79, - 80, 69, 78, 45, 80, 128, 79, 80, 80, 79, 83, 69, 128, 79, 82, 73, 71, 73, - 78, 128, 79, 84, 72, 65, 76, 65, 206, 80, 65, 76, 65, 84, 65, 204, 80, - 65, 76, 85, 84, 65, 128, 80, 65, 83, 72, 84, 65, 128, 80, 69, 78, 73, 72, - 73, 128, 80, 69, 82, 83, 79, 78, 128, 80, 73, 75, 85, 82, 85, 128, 80, - 73, 80, 73, 78, 71, 128, 80, 73, 83, 67, 69, 83, 128, 80, 79, 73, 78, 84, - 79, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 69, 70, 65, 67, 197, 80, - 82, 79, 68, 85, 67, 212, 81, 69, 84, 65, 78, 65, 128, 81, 85, 66, 85, 84, - 83, 128, 82, 69, 80, 69, 65, 84, 128, 82, 69, 84, 85, 82, 78, 128, 82, - 85, 78, 79, 85, 84, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 74, 68, 65, - 72, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 78, 78, 89, 65, 128, 83, - 65, 84, 85, 82, 78, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 73, 80, - 84, 128, 83, 69, 65, 71, 85, 76, 204, 83, 69, 67, 79, 78, 68, 128, 83, - 69, 67, 82, 69, 84, 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 73, 83, 77, - 65, 128, 83, 69, 82, 86, 73, 67, 197, 83, 72, 65, 68, 68, 65, 128, 83, - 72, 65, 75, 84, 73, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 85, 70, 70, - 76, 197, 83, 73, 67, 75, 76, 69, 128, 83, 73, 88, 84, 72, 83, 128, 83, - 76, 79, 87, 76, 89, 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 73, 82, 73, - 84, 128, 83, 80, 82, 79, 85, 84, 128, 83, 84, 65, 86, 82, 79, 211, 83, - 84, 82, 65, 73, 70, 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 79, 75, - 69, 211, 83, 85, 66, 73, 84, 79, 128, 83, 85, 67, 67, 69, 69, 196, 83, - 85, 82, 70, 65, 67, 197, 83, 89, 78, 65, 70, 73, 128, 83, 89, 79, 85, 87, - 65, 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 85, 82, 85, 83, 128, 84, - 69, 78, 85, 84, 79, 128, 84, 72, 65, 65, 76, 85, 128, 84, 72, 65, 72, 65, - 78, 128, 84, 72, 73, 82, 68, 83, 128, 84, 72, 73, 85, 84, 72, 128, 84, - 73, 80, 69, 72, 65, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 79, - 68, 128, 84, 83, 72, 85, 71, 83, 128, 84, 84, 69, 72, 69, 72, 128, 84, - 85, 82, 66, 65, 78, 128, 85, 80, 82, 73, 71, 72, 212, 85, 82, 65, 78, 85, - 83, 128, 86, 65, 76, 76, 69, 89, 128, 86, 65, 82, 69, 73, 65, 201, 86, - 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 75, 65, 128, 86, 73, 67, 84, 79, - 82, 217, 86, 73, 82, 73, 65, 77, 128, 86, 73, 83, 65, 82, 71, 193, 87, - 69, 65, 80, 79, 78, 128, 87, 82, 73, 84, 73, 78, 199, 89, 70, 69, 83, 73, - 83, 128, 89, 79, 45, 89, 69, 79, 128, 89, 80, 83, 73, 76, 73, 128, 84, - 82, 73, 80, 76, 197, 84, 85, 82, 78, 69, 196, 69, 81, 85, 65, 76, 211, - 71, 79, 84, 72, 73, 195, 76, 73, 71, 72, 84, 128, 72, 69, 65, 86, 89, - 128, 77, 73, 68, 68, 76, 197, 83, 73, 78, 71, 76, 197, 66, 76, 79, 67, - 75, 128, 77, 65, 78, 67, 72, 213, 84, 79, 78, 79, 83, 128, 70, 84, 72, - 79, 82, 193, 79, 77, 69, 71, 65, 128, 83, 73, 71, 77, 65, 128, 68, 65, - 83, 73, 65, 128, 83, 85, 66, 83, 69, 212, 67, 76, 79, 83, 69, 196, 65, - 76, 80, 72, 65, 128, 66, 79, 84, 84, 79, 205, 77, 69, 68, 73, 85, 205, - 86, 85, 76, 71, 65, 210, 67, 79, 77, 77, 65, 128, 67, 79, 80, 84, 73, - 195, 67, 79, 82, 78, 69, 210, 68, 69, 76, 84, 65, 128, 69, 81, 85, 65, - 76, 128, 73, 67, 72, 79, 83, 128, 83, 65, 89, 73, 83, 201, 87, 72, 73, - 84, 69, 128, 65, 76, 77, 79, 83, 212, 67, 82, 79, 83, 83, 128, 75, 65, - 80, 80, 65, 128, 76, 65, 77, 68, 65, 128, 84, 72, 69, 84, 65, 128, 89, - 45, 67, 82, 69, 197, 66, 69, 83, 73, 68, 197, 67, 69, 78, 84, 82, 197, - 77, 65, 67, 82, 79, 206, 83, 72, 65, 68, 68, 193, 78, 79, 82, 77, 65, - 204, 84, 87, 69, 78, 84, 217, 68, 65, 83, 72, 69, 196, 76, 69, 78, 71, - 84, 200, 80, 82, 73, 77, 69, 128, 84, 72, 73, 82, 84, 217, 85, 78, 73, - 79, 78, 128, 67, 65, 78, 68, 82, 193, 82, 69, 80, 69, 65, 212, 83, 84, - 82, 79, 75, 197, 84, 69, 77, 80, 85, 211, 68, 79, 84, 84, 69, 196, 82, - 73, 83, 73, 78, 199, 82, 84, 65, 71, 83, 128, 68, 73, 69, 83, 73, 211, - 68, 73, 80, 76, 73, 128, 73, 78, 68, 69, 88, 128, 75, 79, 80, 80, 65, - 128, 78, 65, 66, 76, 65, 128, 79, 84, 84, 65, 86, 193, 83, 84, 65, 70, - 70, 128, 89, 70, 69, 83, 73, 211, 66, 65, 76, 76, 79, 212, 66, 65, 82, - 82, 69, 197, 67, 76, 73, 67, 75, 128, 67, 85, 82, 86, 69, 196, 69, 65, - 82, 84, 72, 128, 70, 69, 78, 67, 69, 128, 70, 73, 70, 84, 89, 128, 76, - 69, 73, 77, 77, 193, 76, 73, 84, 84, 76, 197, 78, 69, 83, 84, 69, 196, - 78, 85, 75, 84, 65, 128, 85, 73, 71, 72, 85, 210, 66, 65, 83, 83, 65, - 128, 66, 82, 73, 68, 71, 197, 67, 72, 82, 79, 77, 193, 67, 85, 66, 69, - 68, 128, 68, 69, 71, 82, 69, 197, 68, 69, 86, 73, 67, 197, 68, 79, 76, - 76, 65, 210, 80, 65, 73, 82, 69, 196, 80, 65, 84, 65, 72, 128, 80, 73, - 69, 67, 69, 128, 83, 67, 72, 87, 65, 128, 83, 75, 69, 87, 69, 196, 84, - 73, 77, 69, 83, 128, 84, 84, 69, 72, 69, 200, 87, 65, 84, 69, 82, 128, - 87, 73, 71, 71, 76, 217, 65, 82, 79, 85, 78, 196, 65, 82, 83, 69, 79, - 211, 66, 82, 79, 75, 69, 206, 67, 65, 82, 69, 84, 128, 67, 76, 73, 70, - 70, 128, 68, 65, 71, 69, 83, 200, 70, 76, 79, 82, 65, 204, 72, 69, 65, - 82, 84, 128, 76, 65, 77, 69, 68, 128, 76, 85, 78, 65, 84, 197, 77, 65, - 80, 73, 81, 128, 78, 45, 67, 82, 69, 197, 80, 79, 83, 84, 65, 204, 80, - 84, 72, 65, 72, 193, 83, 67, 72, 69, 77, 193, 83, 69, 71, 79, 76, 128, - 83, 72, 65, 68, 69, 128, 83, 84, 82, 69, 83, 211, 84, 72, 79, 82, 78, - 128, 84, 73, 84, 76, 79, 128, 84, 79, 79, 84, 72, 128, 86, 65, 82, 69, - 73, 193, 90, 73, 71, 90, 65, 199, 90, 81, 65, 80, 72, 193, 65, 76, 65, - 80, 72, 128, 65, 76, 65, 89, 72, 197, 66, 69, 65, 77, 69, 196, 66, 73, - 78, 65, 82, 217, 66, 79, 87, 84, 73, 197, 67, 72, 69, 67, 75, 128, 67, - 76, 79, 84, 72, 128, 67, 85, 82, 86, 69, 128, 68, 65, 76, 69, 84, 128, - 68, 65, 78, 68, 65, 128, 68, 68, 65, 72, 65, 204, 68, 69, 65, 84, 72, - 128, 69, 84, 69, 82, 79, 206, 70, 65, 67, 84, 79, 210, 70, 73, 71, 85, - 82, 197, 70, 76, 79, 79, 82, 128, 70, 79, 82, 84, 89, 128, 71, 65, 80, - 80, 69, 196, 71, 69, 78, 73, 75, 201, 71, 72, 79, 83, 84, 128, 71, 72, - 85, 78, 78, 193, 71, 78, 89, 73, 83, 128, 71, 79, 82, 71, 73, 128, 72, - 65, 77, 90, 65, 128, 72, 73, 82, 73, 81, 128, 72, 79, 76, 65, 77, 128, - 72, 79, 82, 83, 69, 128, 72, 87, 65, 73, 82, 128, 75, 65, 90, 65, 75, - 200, 75, 73, 89, 69, 79, 203, 75, 76, 65, 83, 77, 193, 76, 65, 66, 79, - 82, 128, 76, 65, 82, 71, 69, 210, 77, 69, 84, 65, 76, 128, 78, 79, 84, - 69, 83, 128, 79, 71, 79, 78, 69, 203, 79, 76, 73, 71, 79, 206, 79, 82, - 78, 65, 84, 197, 80, 73, 65, 83, 77, 193, 80, 76, 65, 78, 67, 203, 80, - 79, 73, 78, 84, 128, 80, 82, 79, 84, 79, 211, 81, 85, 69, 69, 78, 128, - 81, 85, 73, 76, 76, 128, 83, 65, 77, 80, 73, 128, 83, 67, 82, 69, 69, - 206, 83, 69, 71, 78, 79, 128, 83, 69, 82, 73, 70, 211, 83, 69, 83, 65, - 77, 197, 83, 72, 65, 82, 80, 128, 83, 72, 67, 72, 65, 128, 83, 72, 69, - 69, 80, 128, 83, 72, 69, 76, 76, 128, 83, 72, 73, 77, 65, 128, 83, 72, - 87, 65, 65, 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 79, 79, 128, 83, - 73, 71, 78, 83, 128, 83, 73, 78, 68, 72, 201, 83, 77, 65, 76, 76, 128, - 83, 80, 73, 82, 73, 212, 83, 84, 79, 67, 75, 128, 83, 84, 85, 68, 89, - 128, 83, 85, 75, 85, 78, 128, 84, 65, 78, 78, 69, 196, 84, 69, 76, 79, - 85, 211, 84, 72, 87, 65, 65, 128, 84, 73, 71, 69, 82, 128, 84, 73, 75, - 69, 85, 212, 84, 82, 85, 78, 75, 128, 84, 83, 65, 68, 73, 128, 84, 83, - 72, 69, 71, 128, 84, 83, 72, 69, 83, 128, 84, 87, 69, 76, 86, 197, 87, - 72, 69, 65, 84, 128, 89, 79, 45, 89, 65, 128, 89, 85, 45, 89, 69, 128, - 90, 90, 73, 69, 84, 128, 45, 67, 72, 65, 76, 128, 45, 75, 72, 89, 85, - 196, 45, 80, 72, 82, 85, 128, 65, 68, 68, 65, 75, 128, 65, 71, 65, 73, - 78, 128, 65, 72, 83, 68, 65, 128, 65, 76, 73, 70, 85, 128, 65, 77, 79, - 85, 78, 212, 65, 78, 80, 69, 65, 128, 65, 80, 82, 73, 76, 128, 65, 82, - 73, 69, 83, 128, 65, 82, 76, 65, 85, 199, 66, 66, 73, 69, 80, 128, 66, + 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, + 65, 86, 82, 79, 85, 128, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 73, + 67, 84, 76, 217, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 67, 67, 69, 69, + 68, 128, 83, 89, 78, 69, 86, 77, 65, 128, 84, 65, 73, 83, 89, 79, 85, + 128, 84, 65, 84, 87, 69, 69, 76, 128, 84, 67, 72, 69, 72, 69, 72, 128, + 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 83, 69, 82, 65, 128, 84, 72, + 73, 82, 84, 69, 69, 206, 84, 72, 85, 82, 73, 83, 65, 218, 84, 73, 78, 65, + 71, 77, 65, 128, 84, 73, 82, 79, 78, 73, 65, 206, 84, 79, 82, 67, 85, 76, + 85, 211, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 89, 66, 76, 73, 79, + 206, 84, 86, 73, 77, 65, 68, 85, 210, 84, 87, 79, 45, 76, 73, 78, 197, + 85, 45, 69, 79, 45, 69, 85, 128, 85, 66, 85, 70, 73, 76, 73, 128, 85, 77, + 66, 82, 69, 76, 76, 193, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 89, 65, + 78, 78, 65, 128, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, 76, 76, 65, 71, + 69, 128, 86, 79, 73, 67, 73, 78, 71, 128, 87, 65, 83, 65, 76, 76, 65, + 205, 87, 65, 83, 84, 73, 78, 71, 128, 89, 65, 89, 65, 78, 78, 65, 128, + 89, 79, 85, 84, 72, 70, 85, 204, 89, 80, 79, 82, 82, 79, 73, 128, 79, 83, + 77, 65, 78, 89, 193, 67, 73, 82, 67, 76, 69, 128, 66, 82, 65, 67, 75, 69, + 212, 85, 80, 83, 73, 76, 79, 206, 65, 67, 67, 69, 78, 84, 128, 68, 73, + 78, 71, 66, 65, 212, 69, 80, 83, 73, 76, 79, 206, 83, 76, 65, 78, 84, 69, + 196, 83, 81, 85, 65, 82, 69, 128, 72, 65, 78, 85, 78, 79, 207, 68, 65, + 71, 69, 83, 72, 128, 71, 76, 79, 84, 84, 65, 204, 84, 65, 71, 65, 76, 79, + 199, 79, 77, 73, 67, 82, 79, 206, 80, 65, 76, 65, 84, 65, 204, 78, 65, + 83, 75, 65, 80, 201, 67, 79, 82, 78, 69, 82, 128, 69, 76, 69, 77, 69, 78, + 212, 66, 85, 76, 76, 69, 84, 128, 68, 79, 84, 76, 69, 83, 211, 79, 71, + 79, 78, 69, 75, 128, 86, 73, 82, 65, 77, 65, 128, 75, 73, 82, 71, 72, 73, + 218, 82, 69, 86, 69, 82, 83, 197, 68, 73, 65, 77, 79, 78, 196, 84, 87, + 69, 78, 84, 89, 128, 68, 79, 85, 66, 76, 69, 128, 78, 69, 73, 84, 72, 69, + 210, 81, 85, 65, 82, 84, 69, 210, 83, 73, 77, 73, 76, 65, 210, 83, 73, + 78, 71, 76, 69, 128, 83, 79, 76, 73, 68, 85, 211, 83, 81, 85, 65, 82, 69, + 196, 67, 72, 73, 78, 69, 83, 197, 78, 85, 78, 65, 86, 73, 203, 83, 85, + 66, 83, 69, 84, 128, 84, 72, 45, 67, 82, 69, 197, 84, 82, 73, 71, 82, 65, + 205, 65, 82, 75, 84, 73, 75, 207, 69, 76, 69, 86, 69, 78, 128, 72, 85, + 78, 68, 82, 69, 196, 72, 89, 80, 72, 69, 78, 128, 73, 78, 83, 73, 68, 69, + 128, 77, 65, 82, 75, 69, 82, 128, 79, 80, 69, 78, 73, 78, 199, 84, 87, + 69, 76, 86, 69, 128, 69, 73, 71, 72, 84, 72, 211, 80, 65, 82, 84, 73, 65, + 204, 84, 72, 73, 82, 84, 89, 128, 86, 82, 65, 67, 72, 89, 128, 65, 82, + 82, 79, 87, 83, 128, 70, 65, 76, 76, 73, 78, 199, 79, 66, 76, 73, 81, 85, + 197, 80, 69, 82, 67, 69, 78, 212, 84, 72, 82, 79, 85, 71, 200, 67, 69, + 68, 73, 76, 76, 193, 67, 79, 78, 84, 82, 79, 204, 67, 85, 82, 86, 73, 78, + 199, 68, 73, 71, 82, 65, 80, 200, 69, 81, 85, 65, 76, 83, 128, 70, 73, + 76, 76, 69, 82, 128, 71, 65, 78, 71, 73, 65, 128, 73, 78, 86, 69, 82, 83, + 197, 73, 79, 84, 65, 84, 69, 196, 75, 69, 78, 84, 73, 77, 193, 77, 69, + 65, 83, 85, 82, 197, 82, 79, 85, 78, 68, 69, 196, 83, 65, 78, 89, 65, 75, + 193, 84, 67, 72, 69, 72, 69, 200, 84, 79, 80, 66, 65, 82, 128, 84, 85, + 82, 84, 76, 69, 128, 89, 73, 68, 68, 73, 83, 200, 45, 75, 72, 89, 73, 76, + 128, 66, 79, 84, 84, 79, 77, 128, 67, 69, 78, 84, 82, 69, 128, 67, 69, + 78, 84, 82, 69, 196, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 79, 85, + 210, 67, 82, 79, 83, 83, 69, 196, 68, 65, 78, 84, 65, 74, 193, 68, 73, + 86, 73, 68, 69, 196, 68, 79, 84, 84, 69, 68, 128, 68, 82, 65, 71, 79, 78, + 128, 70, 73, 70, 84, 72, 83, 128, 72, 69, 65, 86, 69, 78, 128, 75, 79, + 77, 66, 85, 86, 193, 75, 82, 65, 84, 73, 77, 193, 76, 69, 65, 68, 69, 82, + 128, 77, 65, 82, 66, 85, 84, 193, 77, 69, 77, 66, 69, 82, 128, 78, 65, + 84, 85, 82, 65, 204, 78, 73, 78, 69, 84, 89, 128, 80, 69, 78, 67, 73, 76, + 128, 81, 65, 77, 65, 84, 83, 128, 83, 75, 76, 73, 82, 79, 206, 83, 79, + 71, 68, 73, 65, 206, 83, 84, 73, 71, 77, 65, 128, 83, 89, 78, 65, 71, 77, + 193, 84, 65, 65, 76, 85, 74, 193, 84, 72, 69, 83, 69, 79, 211, 84, 79, + 78, 71, 85, 69, 128, 65, 67, 65, 68, 69, 77, 217, 65, 67, 67, 79, 85, 78, + 212, 65, 78, 67, 72, 79, 82, 128, 65, 78, 67, 79, 82, 65, 128, 65, 80, + 76, 79, 85, 78, 128, 65, 82, 67, 72, 65, 73, 195, 66, 65, 76, 85, 68, 65, + 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 83, 72, 75, 73, 210, 66, 73, + 78, 68, 73, 78, 199, 66, 73, 83, 72, 79, 80, 128, 66, 79, 87, 84, 73, 69, + 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 82, 73, 86, 73, 128, 67, 76, + 85, 83, 84, 69, 210, 68, 65, 71, 71, 69, 82, 128, 68, 65, 80, 45, 66, 69, + 201, 68, 65, 80, 45, 80, 73, 201, 68, 69, 67, 73, 77, 65, 204, 68, 73, + 86, 73, 68, 69, 128, 68, 74, 69, 82, 86, 73, 128, 68, 79, 85, 66, 76, 69, + 196, 68, 82, 65, 67, 72, 77, 193, 69, 65, 82, 84, 72, 76, 217, 69, 73, + 71, 72, 84, 89, 128, 69, 83, 67, 65, 80, 69, 128, 70, 69, 65, 84, 72, 69, + 210, 70, 76, 69, 88, 85, 83, 128, 71, 69, 82, 69, 83, 72, 128, 71, 72, + 85, 78, 78, 65, 128, 71, 82, 69, 65, 84, 69, 210, 72, 79, 76, 68, 73, 78, + 199, 73, 78, 72, 73, 66, 73, 212, 73, 83, 83, 72, 65, 82, 128, 73, 90, + 72, 73, 84, 83, 193, 75, 69, 69, 80, 73, 78, 199, 75, 72, 73, 69, 85, 75, + 200, 75, 76, 65, 83, 77, 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 79, + 82, 65, 78, 73, 195, 76, 69, 71, 69, 84, 79, 211, 77, 65, 76, 65, 75, 79, + 206, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 75, 45, 50, 128, 77, 79, + 82, 84, 65, 82, 128, 78, 69, 71, 65, 84, 69, 196, 78, 79, 84, 67, 72, 69, + 196, 79, 82, 68, 73, 78, 65, 204, 80, 72, 73, 69, 85, 80, 200, 80, 72, + 82, 65, 83, 69, 128, 80, 73, 76, 67, 82, 79, 215, 80, 76, 65, 71, 73, 79, + 211, 80, 79, 75, 79, 74, 73, 128, 82, 69, 84, 85, 82, 78, 128, 82, 73, + 75, 82, 73, 75, 128, 83, 69, 82, 73, 70, 83, 128, 83, 72, 65, 80, 69, 83, + 128, 83, 73, 88, 84, 69, 69, 206, 83, 76, 79, 80, 73, 78, 199, 83, 77, + 65, 76, 76, 69, 210, 83, 77, 73, 76, 73, 78, 199, 83, 80, 69, 69, 67, 72, + 128, 83, 80, 73, 68, 69, 82, 217, 84, 65, 77, 73, 78, 71, 128, 84, 69, + 76, 69, 73, 65, 128, 84, 69, 76, 73, 83, 72, 193, 84, 69, 83, 83, 69, 82, + 193, 84, 72, 69, 84, 72, 69, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, + 82, 69, 65, 68, 128, 84, 72, 82, 69, 69, 45, 196, 84, 86, 82, 73, 68, 79, + 128, 85, 80, 84, 85, 82, 78, 128, 89, 69, 76, 76, 79, 87, 128, 89, 79, + 45, 89, 65, 69, 128, 89, 85, 45, 89, 69, 79, 128, 90, 69, 77, 76, 74, 65, + 128, 65, 66, 89, 83, 77, 65, 204, 65, 70, 71, 72, 65, 78, 201, 65, 70, + 82, 73, 67, 65, 206, 65, 72, 65, 71, 71, 65, 210, 65, 73, 72, 86, 85, 83, + 128, 65, 73, 86, 73, 76, 73, 203, 65, 76, 65, 89, 72, 69, 128, 65, 76, + 73, 71, 78, 69, 196, 65, 78, 78, 85, 73, 84, 217, 65, 80, 65, 65, 84, 79, + 128, 65, 82, 65, 69, 65, 69, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, + 82, 73, 86, 69, 128, 65, 82, 83, 69, 79, 83, 128, 65, 82, 85, 72, 85, 65, + 128, 65, 83, 67, 69, 78, 84, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, + 83, 84, 82, 65, 204, 65, 86, 69, 82, 65, 71, 197, 66, 65, 68, 71, 69, 82, + 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 78, 84, 79, 67, 128, 66, 65, + 82, 76, 69, 89, 128, 66, 65, 82, 82, 69, 69, 128, 66, 69, 78, 90, 69, 78, + 197, 66, 69, 84, 87, 69, 69, 206, 66, 69, 89, 89, 65, 76, 128, 66, 73, + 84, 84, 69, 82, 128, 66, 79, 82, 85, 84, 79, 128, 66, 82, 65, 78, 67, 72, + 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 79, 78, 90, 69, 128, 66, 85, + 67, 75, 76, 69, 128, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, 82, + 128, 67, 65, 84, 65, 87, 65, 128, 67, 65, 85, 84, 73, 79, 206, 67, 72, + 65, 77, 75, 79, 128, 67, 72, 65, 78, 71, 69, 128, 67, 72, 65, 82, 73, 79, + 212, 67, 72, 69, 86, 82, 79, 206, 67, 72, 73, 82, 69, 84, 128, 67, 72, + 85, 82, 67, 72, 128, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 45, 50, + 128, 67, 76, 73, 86, 73, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 79, + 70, 70, 73, 78, 128, 67, 79, 78, 73, 67, 65, 204, 67, 79, 82, 80, 83, 69, + 128, 67, 85, 82, 82, 69, 78, 212, 68, 65, 65, 68, 72, 85, 128, 68, 65, + 76, 65, 84, 72, 128, 68, 65, 77, 65, 82, 85, 128, 68, 65, 83, 69, 73, 65, + 128, 68, 68, 65, 72, 65, 76, 128, 68, 69, 76, 69, 84, 69, 128, 68, 69, + 76, 80, 72, 73, 195, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 82, 77, 65, + 128, 68, 73, 69, 83, 73, 83, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, + 86, 79, 82, 67, 197, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 45, 50, + 128, 68, 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, + 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 55, + 128, 68, 79, 84, 83, 45, 56, 128, 68, 85, 84, 73, 69, 83, 128, 69, 73, + 71, 72, 84, 72, 128, 69, 78, 65, 82, 88, 73, 211, 69, 88, 67, 69, 83, 83, + 128, 69, 88, 73, 83, 84, 83, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, + 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 52, + 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, + 77, 73, 76, 89, 128, 70, 65, 84, 72, 69, 82, 128, 70, 69, 77, 65, 76, 69, + 128, 70, 69, 82, 77, 65, 84, 193, 70, 73, 70, 84, 69, 69, 206, 70, 76, + 65, 71, 45, 49, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 51, + 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, + 73, 71, 72, 84, 128, 70, 76, 79, 87, 69, 82, 128, 70, 79, 82, 67, 69, 83, + 128, 70, 85, 78, 69, 82, 65, 204, 71, 69, 68, 79, 76, 65, 128, 71, 69, + 77, 73, 78, 73, 128, 71, 69, 78, 69, 82, 73, 195, 71, 72, 65, 73, 78, 85, + 128, 71, 72, 65, 77, 65, 76, 128, 71, 82, 79, 85, 78, 68, 128, 71, 85, + 65, 82, 65, 78, 201, 72, 65, 70, 85, 75, 72, 128, 72, 69, 73, 83, 69, 73, + 128, 72, 69, 76, 77, 69, 84, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, + 82, 77, 69, 83, 128, 72, 69, 82, 85, 84, 85, 128, 72, 82, 89, 86, 78, 73, + 193, 72, 85, 73, 73, 84, 79, 128, 73, 45, 66, 69, 65, 77, 128, 73, 77, + 73, 83, 69, 79, 211, 73, 78, 71, 87, 65, 90, 128, 73, 78, 73, 78, 71, 85, + 128, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 85, 76, 65, 210, 74, 79, + 73, 78, 69, 68, 128, 75, 65, 78, 65, 75, 79, 128, 75, 65, 78, 84, 65, 74, + 193, 75, 69, 70, 85, 76, 65, 128, 75, 69, 89, 67, 65, 80, 128, 75, 72, + 79, 77, 85, 84, 128, 75, 76, 73, 84, 79, 78, 128, 75, 79, 82, 85, 78, 65, + 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 85, 82, 73, 73, 128, 76, 65, + 77, 65, 68, 72, 128, 76, 65, 84, 69, 82, 65, 204, 76, 69, 71, 73, 79, 78, + 128, 76, 69, 73, 77, 77, 65, 128, 76, 69, 84, 84, 69, 82, 128, 76, 73, + 77, 73, 84, 69, 196, 76, 73, 78, 69, 45, 49, 128, 76, 73, 78, 69, 45, 51, + 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 57, 128, 76, 73, + 78, 75, 73, 78, 199, 76, 79, 90, 69, 78, 71, 197, 77, 65, 73, 68, 69, 78, + 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 82, 75, 45, 51, 128, 77, 65, + 82, 75, 45, 52, 128, 77, 65, 82, 85, 75, 85, 128, 77, 65, 84, 82, 73, 88, + 128, 77, 65, 88, 73, 77, 65, 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, + 71, 65, 76, 73, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 84, 82, 73, 65, + 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 76, 76, 69, 84, 128, 77, 73, + 78, 73, 77, 65, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 84, 72, 69, 82, + 128, 77, 85, 81, 68, 65, 77, 128, 78, 65, 85, 84, 72, 83, 128, 78, 69, + 78, 65, 78, 79, 128, 78, 73, 82, 85, 71, 85, 128, 78, 79, 75, 72, 85, 75, + 128, 78, 79, 77, 73, 78, 65, 204, 78, 85, 77, 66, 69, 82, 128, 78, 85, + 78, 65, 86, 85, 212, 79, 66, 69, 76, 79, 83, 128, 79, 77, 65, 76, 79, 78, + 128, 79, 80, 69, 78, 45, 80, 128, 79, 80, 80, 79, 83, 69, 128, 79, 82, + 73, 71, 73, 78, 128, 79, 84, 72, 65, 76, 65, 206, 80, 65, 76, 85, 84, 65, + 128, 80, 65, 83, 72, 84, 65, 128, 80, 69, 78, 73, 72, 73, 128, 80, 69, + 82, 83, 79, 78, 128, 80, 73, 75, 85, 82, 85, 128, 80, 73, 80, 73, 78, 71, + 128, 80, 73, 83, 67, 69, 83, 128, 80, 79, 73, 78, 84, 79, 128, 80, 82, + 69, 67, 69, 68, 197, 80, 82, 69, 70, 65, 67, 197, 80, 82, 79, 68, 85, 67, + 212, 80, 85, 82, 73, 84, 89, 128, 80, 85, 83, 72, 73, 78, 199, 81, 69, + 84, 65, 78, 65, 128, 81, 85, 66, 85, 84, 83, 128, 82, 69, 80, 69, 65, 84, + 128, 82, 73, 84, 85, 65, 76, 128, 82, 85, 78, 79, 85, 84, 128, 83, 65, + 65, 68, 72, 85, 128, 83, 65, 74, 68, 65, 72, 128, 83, 65, 77, 69, 75, 72, + 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 84, 85, 82, 78, 128, 83, 67, + 65, 76, 69, 83, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 73, 80, 84, + 128, 83, 69, 65, 71, 85, 76, 204, 83, 69, 67, 79, 78, 68, 128, 83, 69, + 67, 82, 69, 84, 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 73, 83, 77, 65, + 128, 83, 69, 82, 86, 73, 67, 197, 83, 69, 86, 69, 78, 84, 217, 83, 72, + 65, 68, 68, 65, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 69, 69, 78, 85, + 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 85, 70, 70, 76, 197, 83, 73, + 67, 75, 76, 69, 128, 83, 73, 88, 84, 72, 83, 128, 83, 76, 79, 87, 76, 89, + 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 73, 82, 73, 84, 128, 83, 80, + 82, 79, 85, 84, 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 82, 65, 73, 70, + 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 79, 75, 69, 211, 83, 85, + 66, 73, 84, 79, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 82, 70, 65, 67, + 197, 83, 87, 79, 82, 68, 83, 128, 83, 89, 78, 65, 70, 73, 128, 83, 89, + 79, 85, 87, 65, 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 85, 82, 85, 83, + 128, 84, 69, 78, 85, 84, 79, 128, 84, 72, 65, 65, 76, 85, 128, 84, 72, + 65, 72, 65, 78, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 73, 82, 68, 83, + 128, 84, 72, 73, 85, 84, 72, 128, 84, 73, 80, 69, 72, 65, 128, 84, 79, + 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 52, + 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 54, 128, 84, 82, + 73, 80, 76, 73, 128, 84, 82, 73, 80, 79, 68, 128, 84, 83, 72, 85, 71, 83, + 128, 84, 84, 69, 72, 69, 72, 128, 84, 85, 82, 66, 65, 78, 128, 85, 80, + 82, 73, 71, 72, 212, 85, 80, 87, 65, 82, 68, 128, 85, 82, 65, 78, 85, 83, + 128, 86, 65, 76, 76, 69, 89, 128, 86, 65, 82, 69, 73, 65, 201, 86, 65, + 82, 73, 65, 78, 212, 86, 65, 82, 73, 75, 65, 128, 86, 73, 67, 84, 79, 82, + 217, 86, 73, 82, 73, 65, 77, 128, 86, 73, 83, 65, 82, 71, 193, 86, 79, + 76, 84, 65, 71, 197, 87, 65, 82, 78, 73, 78, 199, 87, 69, 65, 80, 79, 78, + 128, 87, 72, 69, 69, 76, 69, 196, 87, 82, 73, 84, 73, 78, 199, 89, 70, + 69, 83, 73, 83, 128, 89, 79, 45, 89, 69, 79, 128, 89, 80, 83, 73, 76, 73, + 128, 83, 89, 76, 79, 84, 201, 67, 65, 82, 79, 78, 128, 66, 82, 69, 86, + 69, 128, 66, 76, 65, 67, 75, 128, 77, 73, 68, 68, 76, 197, 65, 67, 67, + 69, 78, 212, 84, 82, 73, 80, 76, 197, 68, 79, 84, 84, 69, 196, 83, 84, + 82, 79, 75, 197, 86, 69, 83, 83, 69, 204, 69, 81, 85, 65, 76, 211, 71, + 79, 84, 72, 73, 195, 72, 69, 65, 86, 89, 128, 83, 73, 78, 71, 76, 197, + 66, 76, 79, 67, 75, 128, 77, 65, 78, 67, 72, 213, 84, 79, 78, 79, 83, + 128, 66, 79, 84, 84, 79, 205, 70, 84, 72, 79, 82, 193, 77, 69, 68, 73, + 85, 205, 79, 77, 69, 71, 65, 128, 83, 73, 71, 77, 65, 128, 65, 76, 80, + 72, 65, 128, 67, 76, 79, 83, 69, 196, 68, 65, 83, 73, 65, 128, 83, 85, + 66, 83, 69, 212, 67, 79, 77, 77, 65, 128, 68, 69, 76, 84, 65, 128, 86, + 85, 76, 71, 65, 210, 67, 79, 82, 78, 69, 210, 69, 81, 85, 65, 76, 128, + 76, 65, 77, 68, 65, 128, 67, 82, 79, 83, 83, 128, 73, 67, 72, 79, 83, + 128, 83, 65, 89, 73, 83, 201, 84, 72, 69, 84, 65, 128, 87, 72, 73, 84, + 69, 128, 65, 76, 77, 79, 83, 212, 75, 65, 80, 80, 65, 128, 77, 65, 67, + 82, 79, 206, 78, 85, 66, 73, 65, 206, 89, 45, 67, 82, 69, 197, 66, 69, + 83, 73, 68, 197, 67, 69, 78, 84, 82, 197, 83, 72, 65, 68, 68, 193, 84, + 87, 69, 78, 84, 217, 69, 65, 82, 84, 72, 128, 70, 73, 70, 84, 89, 128, + 76, 69, 78, 71, 84, 200, 78, 79, 82, 77, 65, 204, 84, 72, 73, 82, 84, + 217, 68, 65, 83, 72, 69, 196, 68, 73, 71, 82, 65, 205, 80, 82, 73, 77, + 69, 128, 85, 78, 73, 79, 78, 128, 67, 65, 78, 68, 82, 193, 82, 69, 80, + 69, 65, 212, 84, 69, 77, 80, 85, 211, 84, 85, 65, 82, 69, 199, 76, 85, + 78, 65, 84, 197, 82, 73, 83, 73, 78, 199, 82, 84, 65, 71, 83, 128, 68, + 73, 69, 83, 73, 211, 68, 73, 80, 76, 73, 128, 73, 78, 68, 69, 88, 128, + 75, 79, 80, 80, 65, 128, 78, 65, 66, 76, 65, 128, 78, 85, 75, 84, 65, + 128, 79, 84, 84, 65, 86, 193, 82, 65, 73, 83, 69, 196, 83, 67, 72, 87, + 65, 128, 83, 72, 73, 77, 65, 128, 83, 84, 65, 70, 70, 128, 89, 70, 69, + 83, 73, 211, 66, 65, 76, 76, 79, 212, 66, 65, 82, 82, 69, 197, 67, 76, + 73, 67, 75, 128, 67, 85, 66, 69, 68, 128, 67, 85, 82, 86, 69, 196, 70, + 69, 77, 65, 76, 197, 70, 69, 78, 67, 69, 128, 75, 79, 82, 69, 65, 206, + 76, 69, 73, 77, 77, 193, 76, 73, 84, 84, 76, 197, 78, 69, 83, 84, 69, + 196, 85, 73, 71, 72, 85, 210, 87, 65, 84, 69, 82, 128, 87, 69, 73, 71, + 72, 212, 65, 76, 65, 89, 72, 197, 66, 65, 83, 83, 65, 128, 66, 82, 73, + 68, 71, 197, 67, 72, 82, 79, 77, 193, 68, 65, 78, 68, 65, 128, 68, 69, + 71, 82, 69, 197, 68, 69, 86, 73, 67, 197, 68, 79, 76, 76, 65, 210, 80, + 65, 73, 82, 69, 196, 80, 65, 84, 65, 72, 128, 80, 73, 69, 67, 69, 128, + 80, 79, 69, 84, 82, 217, 83, 65, 77, 80, 73, 128, 83, 75, 69, 87, 69, + 196, 84, 73, 77, 69, 83, 128, 84, 84, 69, 72, 69, 200, 87, 73, 71, 71, + 76, 217, 90, 73, 71, 90, 65, 199, 65, 82, 79, 85, 78, 196, 65, 82, 83, + 69, 79, 211, 66, 82, 79, 75, 69, 206, 67, 65, 82, 69, 84, 128, 67, 76, + 73, 70, 70, 128, 67, 76, 79, 84, 72, 128, 68, 65, 71, 69, 83, 200, 68, + 65, 77, 77, 65, 128, 70, 76, 79, 82, 65, 204, 70, 79, 82, 84, 89, 128, + 72, 69, 65, 82, 84, 128, 76, 65, 77, 69, 68, 128, 77, 65, 80, 73, 81, + 128, 78, 45, 67, 82, 69, 197, 80, 79, 83, 84, 65, 204, 80, 84, 72, 65, + 72, 193, 83, 67, 72, 69, 77, 193, 83, 69, 71, 79, 76, 128, 83, 72, 65, + 68, 69, 128, 83, 77, 65, 76, 76, 128, 83, 84, 82, 69, 83, 211, 84, 72, + 79, 82, 78, 128, 84, 73, 84, 76, 79, 128, 84, 79, 79, 84, 72, 128, 86, + 65, 82, 69, 73, 193, 87, 72, 69, 65, 84, 128, 90, 81, 65, 80, 72, 193, + 65, 76, 65, 80, 72, 128, 66, 69, 65, 77, 69, 196, 66, 69, 82, 66, 69, + 210, 66, 73, 78, 65, 82, 217, 66, 73, 78, 68, 73, 128, 66, 79, 87, 84, + 73, 197, 67, 72, 69, 67, 75, 128, 67, 85, 82, 86, 69, 128, 68, 65, 76, + 68, 65, 128, 68, 65, 76, 69, 84, 128, 68, 68, 65, 72, 65, 204, 68, 69, + 65, 84, 72, 128, 68, 79, 66, 82, 79, 128, 68, 90, 69, 76, 79, 128, 69, + 84, 69, 82, 79, 206, 70, 65, 67, 84, 79, 210, 70, 73, 71, 85, 82, 197, + 70, 76, 79, 79, 82, 128, 70, 79, 82, 75, 69, 196, 70, 82, 73, 84, 85, + 128, 71, 65, 80, 80, 69, 196, 71, 69, 78, 73, 75, 201, 71, 72, 65, 73, + 78, 128, 71, 72, 79, 83, 84, 128, 71, 72, 85, 78, 78, 193, 71, 78, 89, + 73, 83, 128, 71, 79, 82, 71, 73, 128, 72, 65, 77, 77, 69, 210, 72, 65, + 77, 90, 65, 128, 72, 73, 82, 73, 81, 128, 72, 79, 76, 65, 77, 128, 72, + 79, 82, 83, 69, 128, 72, 87, 65, 73, 82, 128, 73, 65, 85, 68, 65, 128, + 75, 65, 90, 65, 75, 200, 75, 73, 89, 69, 79, 203, 75, 76, 65, 83, 77, + 193, 76, 65, 66, 79, 82, 128, 76, 65, 82, 71, 69, 210, 76, 65, 85, 76, + 65, 128, 76, 69, 83, 83, 69, 210, 77, 69, 84, 65, 76, 128, 77, 79, 85, + 84, 72, 128, 78, 65, 83, 72, 73, 128, 78, 79, 84, 69, 83, 128, 79, 71, + 79, 78, 69, 203, 79, 76, 73, 71, 79, 206, 79, 82, 78, 65, 84, 197, 80, + 73, 65, 83, 77, 193, 80, 76, 65, 78, 67, 203, 80, 79, 73, 78, 84, 128, + 80, 79, 87, 69, 82, 128, 80, 82, 79, 84, 79, 211, 81, 65, 84, 65, 78, + 128, 81, 85, 69, 69, 78, 128, 81, 85, 73, 76, 76, 128, 82, 69, 65, 67, + 72, 128, 82, 71, 89, 65, 78, 128, 82, 73, 84, 83, 73, 128, 83, 67, 82, + 69, 69, 206, 83, 69, 71, 78, 79, 128, 83, 69, 82, 73, 70, 211, 83, 69, + 83, 65, 77, 197, 83, 72, 65, 78, 71, 128, 83, 72, 65, 82, 80, 128, 83, + 72, 67, 72, 65, 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 76, 70, 128, + 83, 72, 69, 76, 76, 128, 83, 72, 79, 82, 84, 211, 83, 72, 87, 65, 65, + 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 79, 79, 128, 83, 73, 71, 78, + 83, 128, 83, 73, 78, 68, 72, 201, 83, 73, 88, 84, 89, 128, 83, 76, 79, + 86, 79, 128, 83, 80, 69, 65, 82, 128, 83, 80, 73, 82, 73, 212, 83, 84, + 79, 67, 75, 128, 83, 84, 85, 68, 89, 128, 83, 85, 75, 85, 78, 128, 84, + 65, 78, 78, 69, 196, 84, 69, 76, 79, 85, 211, 84, 72, 87, 65, 65, 128, + 84, 73, 71, 69, 82, 128, 84, 73, 75, 69, 85, 212, 84, 82, 85, 78, 75, + 128, 84, 83, 65, 68, 73, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, + 83, 128, 84, 87, 69, 76, 86, 197, 87, 65, 84, 67, 72, 128, 87, 79, 77, + 65, 78, 128, 89, 69, 83, 84, 85, 128, 89, 79, 45, 89, 65, 128, 89, 85, + 45, 89, 69, 128, 90, 90, 73, 69, 84, 128, 45, 67, 72, 65, 76, 128, 45, + 75, 72, 89, 85, 196, 45, 80, 72, 82, 85, 128, 65, 68, 68, 65, 75, 128, + 65, 71, 65, 73, 78, 128, 65, 72, 83, 68, 65, 128, 65, 76, 73, 70, 85, + 128, 65, 77, 79, 85, 78, 212, 65, 78, 80, 69, 65, 128, 65, 80, 65, 82, + 84, 128, 65, 80, 82, 73, 76, 128, 65, 82, 69, 80, 65, 128, 65, 82, 73, + 69, 83, 128, 65, 82, 76, 65, 85, 199, 65, 82, 79, 85, 82, 193, 65, 82, + 82, 65, 89, 128, 65, 82, 84, 65, 66, 197, 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 82, 88, 128, 66, 69, 69, 84, 65, - 128, 66, 69, 72, 69, 72, 128, 66, 69, 73, 84, 72, 128, 66, 73, 78, 68, - 73, 128, 66, 73, 82, 71, 65, 128, 66, 76, 65, 78, 75, 128, 66, 76, 79, - 79, 68, 128, 66, 82, 65, 67, 69, 128, 66, 82, 65, 78, 67, 200, 66, 82, - 69, 65, 84, 200, 66, 82, 85, 83, 72, 128, 66, 83, 84, 65, 82, 128, 66, - 85, 76, 76, 69, 212, 67, 65, 77, 78, 85, 195, 67, 65, 78, 67, 69, 204, - 67, 69, 65, 76, 67, 128, 67, 69, 73, 82, 84, 128, 67, 72, 65, 68, 65, - 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 78, 71, 128, 67, 72, 73, 76, - 68, 128, 67, 72, 73, 78, 71, 128, 67, 72, 79, 75, 69, 128, 67, 72, 85, - 76, 65, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 84, 128, 67, 72, - 85, 79, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 89, 82, 88, 128, 67, - 76, 79, 85, 68, 128, 67, 79, 69, 78, 71, 128, 67, 79, 76, 79, 82, 128, - 67, 79, 77, 69, 84, 128, 67, 79, 77, 77, 79, 206, 67, 79, 86, 69, 82, - 128, 67, 82, 79, 73, 88, 128, 68, 65, 65, 83, 85, 128, 68, 65, 76, 65, - 84, 200, 68, 65, 77, 77, 65, 128, 68, 65, 82, 71, 65, 128, 68, 65, 86, - 73, 68, 128, 68, 68, 68, 72, 65, 128, 68, 68, 73, 69, 80, 128, 68, 68, - 73, 69, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, 88, 128, 68, - 68, 85, 82, 88, 128, 68, 69, 76, 69, 84, 197, 68, 73, 86, 73, 68, 197, - 68, 79, 77, 65, 73, 206, 68, 82, 73, 86, 69, 128, 69, 69, 75, 65, 65, - 128, 69, 76, 69, 86, 69, 206, 69, 76, 73, 70, 73, 128, 69, 78, 84, 69, - 82, 128, 69, 79, 76, 72, 88, 128, 69, 85, 45, 69, 85, 128, 69, 88, 73, - 83, 84, 128, 70, 65, 65, 70, 85, 128, 70, 65, 73, 72, 85, 128, 70, 65, - 84, 72, 65, 128, 70, 69, 65, 82, 78, 128, 70, 69, 77, 65, 76, 197, 70, - 72, 84, 79, 82, 193, 70, 73, 69, 76, 68, 128, 70, 73, 70, 84, 72, 128, - 70, 73, 71, 72, 84, 128, 70, 73, 76, 76, 69, 196, 70, 73, 78, 73, 84, - 197, 70, 76, 85, 84, 69, 128, 70, 79, 82, 67, 69, 128, 70, 79, 82, 84, - 69, 128, 70, 82, 69, 78, 67, 200, 70, 82, 79, 87, 78, 128, 71, 65, 65, - 70, 85, 128, 71, 65, 68, 79, 76, 128, 71, 65, 77, 65, 76, 128, 71, 65, - 78, 77, 65, 128, 71, 65, 82, 79, 78, 128, 71, 69, 82, 69, 83, 200, 71, + 128, 66, 69, 70, 79, 82, 197, 66, 69, 72, 69, 72, 128, 66, 69, 73, 84, + 72, 128, 66, 72, 69, 84, 72, 128, 66, 73, 82, 71, 65, 128, 66, 73, 84, + 73, 78, 199, 66, 76, 65, 78, 75, 128, 66, 76, 79, 79, 68, 128, 66, 82, + 65, 67, 69, 128, 66, 82, 65, 78, 67, 200, 66, 82, 69, 65, 84, 200, 66, + 82, 85, 83, 72, 128, 66, 83, 84, 65, 82, 128, 66, 85, 76, 76, 69, 212, + 67, 65, 77, 78, 85, 195, 67, 65, 78, 67, 69, 204, 67, 65, 85, 68, 65, + 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 69, 69, 128, 67, 69, 65, 76, + 67, 128, 67, 69, 73, 82, 84, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, + 73, 82, 128, 67, 72, 65, 78, 71, 128, 67, 72, 73, 76, 68, 128, 67, 72, + 73, 78, 71, 128, 67, 72, 79, 75, 69, 128, 67, 72, 85, 76, 65, 128, 67, + 72, 85, 79, 80, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 88, 128, + 67, 72, 85, 82, 88, 128, 67, 72, 89, 82, 88, 128, 67, 76, 79, 85, 68, + 128, 67, 79, 69, 78, 71, 128, 67, 79, 76, 79, 82, 128, 67, 79, 77, 69, + 84, 128, 67, 79, 77, 73, 78, 199, 67, 79, 77, 77, 79, 206, 67, 79, 86, + 69, 82, 128, 67, 82, 69, 68, 73, 212, 67, 82, 79, 73, 88, 128, 68, 65, + 65, 83, 85, 128, 68, 65, 76, 65, 84, 200, 68, 65, 82, 71, 65, 128, 68, + 65, 86, 73, 68, 128, 68, 68, 68, 72, 65, 128, 68, 68, 73, 69, 80, 128, + 68, 68, 73, 69, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, 88, + 128, 68, 68, 85, 82, 88, 128, 68, 69, 76, 69, 84, 197, 68, 69, 82, 69, + 84, 128, 68, 73, 70, 65, 84, 128, 68, 73, 80, 84, 69, 128, 68, 73, 86, + 73, 68, 197, 68, 79, 77, 65, 73, 206, 68, 79, 85, 66, 84, 128, 68, 82, + 73, 86, 69, 128, 68, 82, 79, 80, 83, 128, 69, 69, 75, 65, 65, 128, 69, + 73, 71, 72, 84, 217, 69, 76, 69, 86, 69, 206, 69, 76, 73, 70, 73, 128, + 69, 78, 84, 69, 82, 128, 69, 79, 76, 72, 88, 128, 69, 81, 85, 73, 68, + 128, 69, 85, 45, 69, 85, 128, 69, 88, 73, 83, 84, 128, 70, 65, 65, 70, + 85, 128, 70, 65, 73, 72, 85, 128, 70, 65, 84, 72, 65, 128, 70, 69, 65, + 82, 78, 128, 70, 72, 84, 79, 82, 193, 70, 73, 69, 76, 68, 128, 70, 73, + 70, 84, 72, 128, 70, 73, 71, 72, 84, 128, 70, 73, 76, 76, 69, 196, 70, + 73, 78, 73, 84, 197, 70, 76, 79, 87, 69, 210, 70, 76, 85, 84, 69, 128, + 70, 79, 76, 76, 89, 128, 70, 79, 82, 67, 69, 128, 70, 79, 82, 84, 69, + 128, 70, 82, 65, 77, 69, 128, 70, 82, 69, 78, 67, 200, 70, 82, 79, 87, + 78, 128, 71, 65, 65, 70, 85, 128, 71, 65, 68, 79, 76, 128, 71, 65, 77, + 65, 76, 128, 71, 65, 77, 76, 65, 128, 71, 65, 78, 77, 65, 128, 71, 65, + 82, 79, 78, 128, 71, 69, 78, 84, 76, 197, 71, 69, 82, 69, 83, 200, 71, 69, 82, 77, 65, 206, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 88, 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 88, - 128, 71, 71, 85, 82, 88, 128, 71, 72, 65, 73, 78, 128, 71, 73, 77, 69, - 76, 128, 71, 73, 78, 73, 73, 128, 71, 76, 69, 73, 67, 200, 71, 82, 65, - 73, 78, 128, 71, 82, 65, 83, 83, 128, 72, 45, 84, 89, 80, 197, 72, 65, - 71, 76, 65, 218, 72, 65, 73, 84, 85, 128, 72, 65, 77, 77, 69, 210, 72, - 65, 78, 68, 83, 128, 72, 69, 65, 86, 69, 206, 72, 73, 68, 73, 78, 199, - 72, 76, 73, 69, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 85, 79, 80, - 128, 72, 76, 85, 79, 88, 128, 72, 76, 85, 82, 88, 128, 72, 76, 89, 82, - 88, 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 85, - 79, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 82, 88, 128, 72, 77, - 89, 82, 88, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 84, 128, 72, - 78, 73, 69, 88, 128, 72, 78, 85, 79, 88, 128, 72, 79, 79, 82, 85, 128, - 72, 79, 85, 83, 69, 128, 72, 85, 82, 65, 78, 128, 72, 88, 73, 69, 80, - 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 88, 128, 72, 88, 85, 79, - 80, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 88, 128, 72, 89, 80, - 72, 69, 206, 73, 67, 72, 79, 85, 128, 73, 71, 71, 87, 83, 128, 73, 83, - 65, 75, 73, 193, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 84, 128, 74, - 74, 73, 69, 88, 128, 74, 74, 85, 79, 80, 128, 74, 74, 85, 79, 88, 128, - 74, 74, 85, 82, 88, 128, 75, 65, 65, 70, 85, 128, 75, 65, 73, 82, 73, - 128, 75, 65, 83, 82, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, 85, 78, - 65, 128, 75, 69, 69, 83, 85, 128, 75, 69, 72, 69, 72, 128, 75, 69, 76, - 86, 73, 206, 75, 72, 85, 65, 84, 128, 75, 72, 87, 65, 73, 128, 75, 78, - 73, 70, 69, 128, 75, 79, 79, 80, 79, 128, 75, 79, 82, 69, 65, 206, 75, - 85, 83, 77, 65, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, 69, 69, 128, - 76, 45, 84, 89, 80, 197, 76, 65, 65, 77, 85, 128, 76, 65, 71, 85, 83, - 128, 76, 65, 77, 66, 68, 193, 76, 65, 85, 75, 65, 218, 76, 69, 77, 79, - 73, 128, 76, 73, 66, 82, 65, 128, 76, 73, 77, 73, 84, 128, 76, 79, 78, - 71, 65, 128, 76, 79, 85, 82, 69, 128, 77, 65, 68, 68, 65, 128, 77, 65, - 68, 68, 65, 200, 77, 65, 72, 72, 65, 128, 77, 65, 73, 82, 85, 128, 77, - 65, 78, 78, 65, 128, 77, 65, 78, 78, 65, 218, 77, 65, 81, 65, 70, 128, - 77, 65, 82, 67, 72, 128, 77, 65, 83, 79, 82, 193, 77, 69, 69, 77, 85, - 128, 77, 69, 73, 90, 73, 128, 77, 69, 76, 79, 78, 128, 77, 69, 77, 66, - 69, 210, 77, 69, 82, 75, 72, 193, 77, 69, 84, 69, 71, 128, 77, 69, 90, - 90, 79, 128, 77, 71, 73, 69, 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, - 85, 79, 88, 128, 77, 71, 85, 82, 88, 128, 77, 73, 75, 82, 73, 128, 77, - 73, 75, 82, 79, 206, 77, 79, 68, 85, 76, 207, 77, 79, 85, 78, 68, 128, - 77, 79, 85, 84, 72, 128, 77, 85, 78, 65, 72, 128, 77, 85, 83, 73, 67, - 128, 78, 65, 82, 82, 79, 215, 78, 65, 85, 68, 73, 218, 78, 66, 73, 69, - 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 85, 82, 88, 128, 78, 66, 89, - 82, 88, 128, 78, 68, 73, 69, 88, 128, 78, 68, 85, 82, 88, 128, 78, 71, - 65, 65, 73, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 88, 128, 78, - 71, 79, 69, 72, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 88, 128, + 128, 71, 71, 85, 82, 88, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 69, + 69, 128, 71, 73, 77, 69, 76, 128, 71, 73, 78, 73, 73, 128, 71, 76, 69, + 73, 67, 200, 71, 82, 65, 67, 69, 128, 71, 82, 65, 73, 78, 128, 71, 82, + 65, 83, 83, 128, 72, 45, 84, 89, 80, 197, 72, 65, 45, 72, 65, 128, 72, + 65, 71, 76, 65, 218, 72, 65, 73, 84, 85, 128, 72, 65, 78, 68, 83, 128, + 72, 69, 65, 86, 69, 206, 72, 73, 68, 73, 78, 199, 72, 76, 73, 69, 80, + 128, 72, 76, 73, 69, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, + 88, 128, 72, 76, 85, 82, 88, 128, 72, 76, 89, 82, 88, 128, 72, 77, 73, + 69, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, + 85, 79, 88, 128, 72, 77, 85, 82, 88, 128, 72, 77, 89, 82, 88, 128, 72, + 78, 73, 69, 80, 128, 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 88, 128, + 72, 78, 85, 79, 88, 128, 72, 79, 79, 82, 85, 128, 72, 79, 85, 83, 69, + 128, 72, 85, 77, 65, 78, 128, 72, 85, 82, 65, 78, 128, 72, 88, 73, 69, + 80, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 88, 128, 72, 88, 85, + 79, 80, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 88, 128, 72, 89, + 80, 72, 69, 206, 73, 67, 72, 79, 85, 128, 73, 71, 71, 87, 83, 128, 73, + 78, 78, 69, 82, 128, 73, 83, 65, 75, 73, 193, 74, 74, 73, 69, 80, 128, + 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 88, 128, 74, 74, 85, 79, 80, + 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 82, 88, 128, 74, 79, 89, 79, + 85, 211, 74, 85, 68, 71, 69, 128, 74, 85, 69, 85, 73, 128, 75, 65, 65, + 70, 85, 128, 75, 65, 73, 82, 73, 128, 75, 65, 83, 82, 65, 128, 75, 65, + 84, 65, 86, 193, 75, 65, 85, 78, 65, 128, 75, 69, 69, 83, 85, 128, 75, + 69, 72, 69, 72, 128, 75, 69, 76, 86, 73, 206, 75, 69, 78, 65, 84, 128, + 75, 72, 65, 78, 68, 193, 75, 72, 65, 80, 72, 128, 75, 72, 85, 65, 84, + 128, 75, 72, 87, 65, 73, 128, 75, 78, 73, 70, 69, 128, 75, 79, 79, 80, + 79, 128, 75, 85, 83, 77, 65, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, + 69, 69, 128, 76, 45, 84, 89, 80, 197, 76, 65, 65, 77, 85, 128, 76, 65, + 71, 85, 83, 128, 76, 65, 77, 66, 68, 193, 76, 65, 85, 75, 65, 218, 76, + 69, 77, 79, 73, 128, 76, 73, 66, 82, 65, 128, 76, 73, 77, 73, 84, 128, + 76, 73, 78, 69, 83, 128, 76, 73, 81, 85, 73, 196, 76, 79, 78, 71, 65, + 128, 76, 79, 84, 85, 83, 128, 76, 79, 85, 82, 69, 128, 77, 65, 68, 68, + 65, 128, 77, 65, 68, 68, 65, 200, 77, 65, 72, 72, 65, 128, 77, 65, 73, + 82, 85, 128, 77, 65, 78, 78, 65, 128, 77, 65, 78, 78, 65, 218, 77, 65, + 81, 65, 70, 128, 77, 65, 82, 67, 72, 128, 77, 65, 83, 79, 82, 193, 77, + 69, 69, 77, 85, 128, 77, 69, 73, 90, 73, 128, 77, 69, 76, 79, 78, 128, + 77, 69, 77, 66, 69, 210, 77, 69, 82, 75, 72, 193, 77, 69, 84, 69, 71, + 128, 77, 69, 90, 90, 79, 128, 77, 71, 73, 69, 88, 128, 77, 71, 85, 79, + 80, 128, 77, 71, 85, 79, 88, 128, 77, 71, 85, 82, 88, 128, 77, 73, 75, + 82, 73, 128, 77, 73, 75, 82, 79, 206, 77, 73, 82, 69, 68, 128, 77, 73, + 83, 82, 65, 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 85, 76, 207, 77, + 79, 78, 84, 72, 128, 77, 79, 85, 78, 68, 128, 77, 85, 78, 65, 72, 128, + 77, 85, 83, 73, 67, 128, 78, 65, 82, 82, 79, 215, 78, 65, 85, 68, 73, + 218, 78, 65, 88, 73, 65, 206, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, + 88, 128, 78, 66, 85, 82, 88, 128, 78, 66, 89, 82, 88, 128, 78, 68, 73, + 69, 88, 128, 78, 68, 85, 82, 88, 128, 78, 71, 65, 65, 73, 128, 78, 71, + 73, 69, 80, 128, 78, 71, 73, 69, 88, 128, 78, 71, 79, 69, 72, 128, 78, + 71, 85, 79, 84, 128, 78, 71, 85, 79, 88, 128, 78, 73, 78, 69, 84, 217, 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 88, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 89, 82, 88, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, @@ -1910,253 +2379,317 @@ 78, 89, 73, 69, 88, 128, 78, 89, 85, 79, 80, 128, 78, 89, 85, 79, 88, 128, 78, 90, 73, 69, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 85, 79, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 89, 82, 88, 128, 79, 66, 74, - 69, 67, 212, 79, 78, 75, 65, 82, 128, 79, 80, 84, 73, 79, 206, 79, 84, - 72, 65, 76, 128, 79, 88, 69, 73, 65, 201, 80, 65, 65, 84, 85, 128, 80, - 65, 83, 69, 81, 128, 80, 65, 83, 85, 81, 128, 80, 65, 84, 65, 75, 128, - 80, 65, 90, 69, 82, 128, 80, 69, 69, 90, 73, 128, 80, 69, 72, 69, 72, - 128, 80, 69, 73, 84, 72, 128, 80, 69, 78, 83, 85, 128, 80, 69, 79, 82, - 84, 200, 80, 69, 82, 84, 72, 207, 80, 69, 83, 69, 84, 193, 80, 72, 78, - 65, 69, 203, 80, 72, 85, 78, 71, 128, 80, 73, 65, 78, 79, 128, 80, 76, - 85, 84, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 87, 69, 82, 128, 80, - 82, 73, 78, 84, 128, 80, 82, 79, 79, 70, 128, 80, 82, 79, 86, 69, 128, - 81, 65, 65, 70, 85, 128, 81, 65, 68, 77, 65, 128, 81, 65, 82, 78, 69, - 217, 81, 65, 84, 65, 78, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 69, - 69, 128, 82, 45, 67, 82, 69, 197, 82, 65, 73, 68, 65, 128, 82, 65, 83, - 79, 85, 204, 82, 65, 84, 73, 79, 128, 82, 69, 65, 67, 72, 128, 82, 69, - 67, 79, 82, 196, 82, 69, 84, 85, 82, 206, 82, 69, 86, 73, 65, 128, 82, - 69, 86, 77, 65, 128, 82, 72, 79, 84, 73, 195, 82, 73, 86, 69, 82, 128, - 82, 78, 79, 79, 78, 128, 82, 79, 66, 65, 84, 128, 82, 82, 85, 79, 88, - 128, 82, 82, 85, 82, 88, 128, 82, 82, 89, 82, 88, 128, 82, 85, 80, 73, - 73, 128, 82, 87, 65, 72, 65, 128, 83, 65, 68, 72, 69, 128, 83, 65, 77, - 69, 75, 200, 83, 65, 77, 89, 79, 203, 83, 65, 85, 73, 76, 128, 83, 69, - 69, 78, 85, 128, 83, 69, 73, 83, 77, 193, 83, 69, 78, 84, 73, 128, 83, - 72, 69, 69, 78, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 86, 65, 128, - 83, 72, 79, 79, 84, 128, 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 88, - 128, 83, 72, 85, 82, 88, 128, 83, 72, 89, 82, 88, 128, 83, 73, 88, 84, - 72, 128, 83, 73, 88, 84, 89, 128, 83, 76, 65, 86, 69, 128, 83, 76, 73, - 67, 69, 128, 83, 76, 79, 80, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, - 73, 76, 69, 128, 83, 78, 65, 75, 69, 128, 83, 78, 79, 85, 84, 128, 83, - 79, 85, 78, 68, 128, 83, 79, 87, 73, 76, 207, 83, 80, 69, 65, 82, 128, - 83, 80, 79, 79, 78, 128, 83, 80, 85, 78, 71, 211, 83, 81, 85, 73, 83, - 200, 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 89, 82, - 88, 128, 83, 84, 65, 78, 68, 128, 83, 84, 65, 82, 75, 128, 83, 84, 69, - 65, 77, 128, 83, 84, 79, 78, 69, 128, 83, 87, 69, 69, 84, 128, 83, 89, - 82, 77, 65, 128, 84, 65, 80, 69, 82, 128, 84, 67, 72, 69, 72, 128, 84, - 69, 73, 87, 83, 128, 84, 69, 86, 73, 82, 128, 84, 72, 73, 82, 68, 128, - 84, 72, 73, 84, 65, 128, 84, 72, 79, 78, 71, 128, 84, 72, 85, 78, 71, - 128, 84, 73, 78, 78, 69, 128, 84, 73, 80, 80, 73, 128, 84, 76, 72, 69, - 69, 128, 84, 82, 65, 67, 75, 128, 84, 82, 73, 84, 79, 211, 84, 83, 69, - 82, 69, 128, 84, 84, 83, 69, 69, 128, 84, 85, 71, 82, 73, 203, 84, 89, - 80, 69, 45, 177, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 179, 84, - 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 182, - 84, 89, 80, 69, 45, 183, 85, 80, 87, 65, 82, 196, 86, 65, 65, 86, 85, + 69, 67, 212, 79, 74, 69, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 78, + 75, 65, 82, 128, 79, 80, 84, 73, 79, 206, 79, 84, 72, 65, 76, 128, 79, + 85, 78, 75, 73, 193, 79, 88, 69, 73, 65, 201, 80, 65, 65, 84, 85, 128, + 80, 65, 83, 69, 81, 128, 80, 65, 83, 85, 81, 128, 80, 65, 84, 65, 75, + 128, 80, 65, 90, 69, 82, 128, 80, 69, 65, 67, 69, 128, 80, 69, 69, 90, + 73, 128, 80, 69, 72, 69, 72, 128, 80, 69, 73, 84, 72, 128, 80, 69, 78, + 83, 85, 128, 80, 69, 79, 82, 84, 200, 80, 69, 82, 84, 72, 207, 80, 69, + 83, 69, 84, 193, 80, 72, 78, 65, 69, 203, 80, 72, 85, 78, 71, 128, 80, + 73, 65, 78, 79, 128, 80, 76, 85, 84, 79, 128, 80, 79, 69, 84, 73, 195, + 80, 79, 78, 68, 79, 128, 80, 82, 73, 78, 84, 128, 80, 82, 79, 79, 70, + 128, 80, 82, 79, 86, 69, 128, 81, 65, 65, 70, 85, 128, 81, 65, 68, 77, + 65, 128, 81, 65, 77, 65, 84, 211, 81, 65, 82, 78, 69, 217, 81, 72, 87, + 65, 65, 128, 81, 72, 87, 69, 69, 128, 82, 45, 67, 82, 69, 197, 82, 65, + 73, 68, 65, 128, 82, 65, 83, 72, 65, 128, 82, 65, 83, 79, 85, 204, 82, + 65, 84, 73, 79, 128, 82, 69, 67, 79, 82, 196, 82, 69, 84, 85, 82, 206, + 82, 69, 86, 73, 65, 128, 82, 69, 86, 77, 65, 128, 82, 72, 79, 84, 73, + 195, 82, 73, 86, 69, 82, 128, 82, 78, 79, 79, 78, 128, 82, 79, 66, 65, + 84, 128, 82, 82, 85, 79, 88, 128, 82, 82, 85, 82, 88, 128, 82, 82, 89, + 82, 88, 128, 82, 85, 80, 73, 73, 128, 82, 87, 65, 72, 65, 128, 83, 65, + 68, 72, 69, 128, 83, 65, 70, 72, 65, 128, 83, 65, 77, 69, 75, 200, 83, + 65, 77, 75, 65, 128, 83, 65, 77, 89, 79, 203, 83, 65, 78, 65, 72, 128, + 83, 65, 85, 73, 76, 128, 83, 69, 69, 78, 85, 128, 83, 69, 73, 83, 77, + 193, 83, 69, 78, 84, 73, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 81, + 69, 204, 83, 72, 69, 86, 65, 128, 83, 72, 73, 73, 78, 128, 83, 72, 79, + 79, 84, 128, 83, 72, 79, 82, 84, 128, 83, 72, 85, 79, 80, 128, 83, 72, + 85, 79, 88, 128, 83, 72, 85, 82, 88, 128, 83, 72, 89, 82, 88, 128, 83, + 73, 88, 84, 72, 128, 83, 76, 65, 86, 69, 128, 83, 76, 73, 67, 69, 128, + 83, 76, 79, 80, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 73, 76, 69, + 128, 83, 78, 65, 75, 69, 128, 83, 78, 79, 85, 84, 128, 83, 79, 85, 78, + 68, 128, 83, 79, 87, 73, 76, 207, 83, 80, 73, 67, 69, 128, 83, 80, 79, + 79, 78, 128, 83, 80, 85, 78, 71, 211, 83, 81, 85, 73, 83, 200, 83, 83, + 73, 69, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 89, 82, 88, 128, 83, + 84, 65, 78, 68, 128, 83, 84, 65, 82, 75, 128, 83, 84, 69, 65, 77, 128, + 83, 84, 79, 78, 69, 128, 83, 84, 79, 86, 69, 128, 83, 87, 69, 69, 84, + 128, 83, 87, 79, 82, 68, 128, 83, 89, 82, 77, 65, 128, 84, 65, 76, 69, + 78, 212, 84, 65, 80, 69, 82, 128, 84, 67, 72, 69, 72, 128, 84, 69, 73, + 87, 83, 128, 84, 69, 86, 73, 82, 128, 84, 72, 73, 71, 72, 128, 84, 72, + 73, 82, 68, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 84, 65, 128, 84, + 72, 79, 78, 71, 128, 84, 72, 85, 78, 71, 128, 84, 73, 78, 78, 69, 128, + 84, 73, 80, 80, 73, 128, 84, 76, 72, 69, 69, 128, 84, 82, 65, 67, 75, + 128, 84, 82, 73, 84, 79, 211, 84, 82, 85, 84, 72, 128, 84, 83, 69, 82, + 69, 128, 84, 84, 83, 69, 69, 128, 84, 84, 84, 72, 65, 128, 84, 85, 71, + 82, 73, 203, 84, 85, 82, 79, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, + 80, 69, 45, 178, 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 180, 84, + 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 182, 84, 89, 80, 69, 45, 183, + 85, 78, 73, 84, 89, 128, 85, 80, 87, 65, 82, 196, 86, 65, 65, 86, 85, 128, 86, 65, 83, 73, 83, 128, 86, 65, 84, 72, 89, 128, 86, 69, 67, 84, - 79, 210, 86, 73, 82, 71, 65, 128, 86, 73, 82, 71, 79, 128, 86, 79, 76, - 85, 77, 197, 87, 65, 65, 86, 85, 128, 87, 65, 83, 76, 65, 128, 87, 65, - 84, 67, 72, 128, 87, 73, 78, 74, 65, 128, 87, 79, 77, 65, 78, 128, 87, - 82, 69, 65, 84, 200, 87, 82, 79, 78, 71, 128, 89, 65, 45, 89, 79, 128, - 89, 65, 65, 68, 79, 128, 89, 65, 65, 82, 85, 128, 89, 69, 79, 45, 79, - 128, 89, 69, 79, 45, 85, 128, 89, 69, 84, 73, 86, 128, 89, 85, 45, 69, - 79, 128, 90, 65, 82, 81, 65, 128, 90, 65, 89, 73, 78, 128, 90, 72, 85, - 79, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 82, 88, 128, 90, 72, - 89, 82, 88, 128, 90, 73, 76, 68, 69, 128, 90, 73, 78, 79, 82, 128, 90, - 89, 71, 79, 83, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 88, 128, - 90, 90, 85, 82, 88, 128, 90, 90, 89, 82, 88, 128, 84, 72, 82, 69, 197, - 76, 69, 70, 84, 128, 90, 69, 82, 79, 128, 79, 71, 72, 65, 205, 67, 85, - 82, 76, 217, 78, 79, 82, 84, 200, 66, 85, 72, 73, 196, 80, 79, 73, 78, - 212, 83, 79, 85, 84, 200, 82, 73, 78, 71, 128, 84, 65, 67, 75, 128, 68, - 79, 87, 78, 128, 78, 45, 65, 82, 217, 82, 69, 83, 84, 128, 66, 69, 76, - 79, 215, 68, 65, 83, 72, 128, 71, 72, 65, 73, 206, 73, 79, 84, 65, 128, - 67, 79, 77, 77, 193, 86, 65, 82, 73, 193, 66, 82, 69, 86, 197, 84, 84, - 72, 65, 128, 65, 67, 85, 84, 197, 66, 69, 84, 65, 128, 67, 72, 69, 83, - 211, 71, 82, 65, 86, 197, 83, 72, 69, 76, 204, 84, 72, 69, 84, 193, 90, - 69, 84, 65, 128, 83, 79, 85, 78, 196, 85, 78, 73, 79, 206, 69, 73, 71, - 72, 212, 78, 79, 84, 69, 128, 70, 79, 82, 84, 217, 73, 77, 65, 71, 197, - 80, 76, 85, 83, 128, 65, 71, 79, 71, 201, 68, 79, 84, 83, 128, 69, 77, - 80, 84, 217, 72, 65, 76, 70, 128, 72, 69, 65, 82, 212, 83, 85, 73, 84, - 128, 70, 73, 76, 76, 128, 75, 65, 84, 79, 128, 76, 65, 82, 71, 197, 83, - 72, 65, 68, 128, 65, 76, 69, 70, 128, 67, 65, 82, 69, 212, 67, 85, 82, - 76, 128, 70, 65, 82, 83, 201, 75, 65, 80, 80, 193, 77, 79, 79, 78, 128, - 83, 85, 78, 71, 128, 84, 73, 67, 75, 128, 67, 76, 69, 70, 128, 67, 82, - 79, 83, 211, 70, 65, 67, 69, 128, 70, 73, 82, 69, 128, 77, 65, 68, 68, - 193, 81, 85, 65, 68, 128, 83, 84, 69, 77, 128, 84, 67, 72, 69, 200, 84, - 73, 77, 69, 211, 84, 83, 72, 69, 199, 65, 76, 84, 65, 128, 66, 69, 71, - 73, 206, 66, 69, 72, 69, 200, 67, 72, 69, 69, 128, 67, 82, 79, 80, 128, - 68, 65, 77, 77, 193, 70, 65, 84, 72, 193, 72, 65, 78, 68, 128, 74, 79, - 73, 78, 128, 75, 65, 83, 82, 193, 75, 69, 72, 69, 200, 75, 87, 65, 65, - 128, 78, 71, 79, 69, 200, 80, 69, 72, 69, 200, 82, 65, 70, 69, 128, 82, - 78, 79, 79, 206, 82, 84, 65, 71, 211, 83, 69, 86, 69, 206, 83, 72, 65, - 82, 208, 83, 72, 73, 78, 128, 84, 72, 65, 65, 128, 84, 72, 69, 69, 128, - 86, 65, 78, 69, 128, 87, 65, 86, 69, 128, 65, 76, 76, 79, 128, 66, 73, - 82, 68, 128, 67, 65, 82, 79, 206, 67, 72, 69, 67, 203, 67, 72, 82, 79, - 193, 67, 73, 69, 85, 195, 67, 87, 65, 65, 128, 68, 69, 76, 84, 193, 70, - 79, 79, 84, 128, 71, 82, 65, 83, 211, 72, 65, 84, 65, 198, 75, 69, 84, - 84, 201, 76, 76, 76, 65, 128, 76, 79, 79, 80, 128, 77, 85, 83, 73, 195, - 77, 87, 65, 65, 128, 78, 87, 65, 65, 128, 79, 85, 84, 69, 210, 79, 88, - 69, 73, 193, 80, 69, 68, 65, 204, 80, 79, 76, 69, 128, 80, 82, 73, 77, - 197, 80, 87, 65, 65, 128, 82, 79, 79, 84, 128, 82, 85, 80, 69, 197, 83, - 67, 72, 87, 193, 83, 69, 69, 78, 128, 83, 72, 87, 65, 128, 83, 73, 76, - 75, 128, 83, 84, 65, 82, 212, 83, 87, 65, 65, 128, 84, 72, 73, 73, 128, - 84, 87, 65, 65, 128, 87, 73, 78, 68, 128, 89, 73, 87, 78, 128, 89, 87, - 65, 65, 128, 90, 72, 69, 69, 128, 45, 68, 90, 85, 196, 65, 80, 69, 83, + 79, 210, 86, 69, 82, 71, 69, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, + 71, 79, 128, 86, 79, 76, 85, 77, 197, 87, 65, 65, 86, 85, 128, 87, 65, + 83, 76, 65, 128, 87, 72, 69, 69, 76, 128, 87, 73, 78, 74, 65, 128, 87, + 82, 69, 65, 84, 200, 87, 82, 79, 78, 71, 128, 88, 69, 83, 84, 69, 211, + 89, 65, 45, 89, 79, 128, 89, 65, 65, 68, 79, 128, 89, 65, 65, 82, 85, + 128, 89, 65, 68, 68, 72, 128, 89, 65, 71, 72, 72, 128, 89, 65, 75, 72, + 72, 128, 89, 69, 79, 45, 79, 128, 89, 69, 79, 45, 85, 128, 89, 69, 84, + 73, 86, 128, 89, 73, 90, 69, 84, 128, 89, 85, 45, 69, 79, 128, 90, 65, + 82, 81, 65, 128, 90, 65, 89, 73, 78, 128, 90, 72, 65, 73, 78, 128, 90, + 72, 85, 79, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 82, 88, 128, + 90, 72, 89, 82, 88, 128, 90, 73, 76, 68, 69, 128, 90, 73, 78, 79, 82, + 128, 90, 89, 71, 79, 83, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, + 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 89, 82, 88, 128, 78, 65, 71, + 82, 201, 83, 72, 79, 82, 212, 83, 72, 69, 69, 206, 90, 69, 82, 79, 128, + 82, 79, 77, 65, 206, 84, 73, 76, 68, 197, 76, 69, 70, 84, 128, 79, 71, + 72, 65, 205, 86, 79, 67, 65, 204, 78, 79, 82, 84, 200, 67, 85, 82, 76, + 217, 65, 84, 84, 73, 195, 83, 79, 85, 84, 200, 66, 69, 76, 79, 215, 66, + 85, 72, 73, 196, 80, 79, 73, 78, 212, 84, 65, 67, 75, 128, 68, 65, 83, + 72, 128, 68, 79, 87, 78, 128, 73, 79, 84, 65, 128, 78, 45, 65, 82, 217, + 82, 69, 83, 84, 128, 71, 72, 65, 73, 206, 65, 67, 85, 84, 197, 66, 69, + 84, 65, 128, 66, 82, 69, 86, 197, 67, 79, 77, 77, 193, 71, 82, 65, 86, + 197, 75, 79, 69, 84, 128, 86, 65, 82, 73, 193, 90, 69, 84, 65, 128, 67, + 72, 69, 83, 211, 67, 85, 82, 76, 128, 83, 72, 69, 76, 204, 84, 72, 69, + 84, 193, 83, 79, 85, 78, 196, 85, 78, 73, 79, 206, 65, 76, 69, 70, 128, + 65, 84, 84, 65, 203, 68, 79, 84, 83, 128, 70, 79, 82, 84, 217, 72, 65, + 76, 70, 128, 78, 79, 84, 69, 128, 84, 79, 78, 65, 204, 73, 77, 65, 71, + 197, 80, 76, 85, 83, 128, 65, 71, 79, 71, 201, 69, 77, 80, 84, 217, 72, + 69, 65, 82, 212, 83, 85, 73, 84, 128, 70, 73, 70, 84, 217, 70, 73, 76, + 76, 128, 75, 65, 84, 79, 128, 75, 69, 72, 69, 200, 76, 65, 82, 71, 197, + 83, 72, 65, 68, 128, 66, 69, 71, 73, 206, 67, 65, 82, 69, 212, 70, 65, + 82, 83, 201, 70, 73, 82, 69, 128, 72, 79, 82, 73, 128, 75, 65, 80, 80, + 193, 77, 79, 79, 78, 128, 83, 69, 86, 69, 206, 83, 72, 69, 73, 128, 83, + 72, 73, 78, 128, 83, 85, 78, 71, 128, 84, 73, 67, 75, 128, 67, 76, 69, + 70, 128, 67, 82, 79, 83, 211, 70, 65, 84, 72, 193, 70, 73, 82, 83, 212, + 77, 65, 68, 68, 193, 81, 85, 65, 68, 128, 82, 85, 80, 69, 197, 83, 73, + 71, 77, 193, 83, 84, 69, 77, 128, 84, 67, 72, 69, 200, 84, 73, 77, 69, + 211, 84, 83, 72, 69, 199, 89, 65, 78, 71, 128, 65, 76, 84, 65, 128, 66, + 69, 72, 69, 200, 67, 72, 69, 67, 203, 67, 82, 79, 80, 128, 68, 65, 77, + 77, 193, 70, 73, 84, 65, 128, 71, 82, 69, 65, 212, 72, 65, 78, 68, 128, + 73, 90, 72, 69, 128, 74, 79, 73, 78, 128, 75, 65, 80, 65, 128, 75, 65, + 83, 82, 193, 75, 72, 69, 73, 128, 75, 87, 65, 65, 128, 76, 79, 78, 71, + 128, 78, 71, 79, 69, 200, 79, 66, 79, 76, 211, 80, 69, 72, 69, 200, 82, + 65, 70, 69, 128, 82, 78, 79, 79, 206, 82, 84, 65, 71, 211, 83, 67, 72, + 87, 193, 83, 72, 65, 82, 208, 84, 72, 65, 65, 128, 84, 72, 69, 69, 128, + 86, 65, 78, 69, 128, 87, 65, 86, 69, 128, 87, 73, 78, 68, 128, 65, 76, + 76, 79, 128, 66, 73, 82, 68, 128, 67, 65, 82, 79, 206, 67, 72, 65, 82, + 128, 67, 72, 73, 78, 128, 67, 72, 82, 79, 193, 67, 73, 69, 85, 195, 67, + 87, 65, 65, 128, 68, 69, 76, 84, 193, 70, 79, 79, 84, 128, 71, 72, 65, + 78, 128, 71, 79, 76, 68, 128, 71, 82, 65, 83, 211, 72, 65, 84, 65, 198, + 73, 69, 85, 78, 199, 74, 72, 65, 78, 128, 75, 69, 84, 84, 201, 75, 72, + 65, 82, 128, 76, 76, 76, 65, 128, 76, 79, 79, 80, 128, 77, 78, 65, 83, + 128, 77, 85, 83, 73, 195, 77, 87, 65, 65, 128, 78, 87, 65, 65, 128, 79, + 85, 84, 69, 210, 79, 88, 69, 73, 193, 80, 65, 80, 69, 210, 80, 69, 68, + 65, 204, 80, 72, 65, 82, 128, 80, 79, 76, 69, 128, 80, 82, 73, 77, 197, + 80, 87, 65, 65, 128, 82, 79, 79, 84, 128, 83, 69, 69, 78, 128, 83, 72, + 87, 65, 128, 83, 73, 76, 75, 128, 83, 73, 77, 65, 128, 83, 84, 65, 82, + 212, 83, 87, 65, 65, 128, 83, 87, 65, 83, 200, 84, 72, 73, 73, 128, 84, + 72, 73, 82, 196, 84, 83, 72, 65, 128, 84, 84, 72, 79, 128, 84, 87, 65, + 65, 128, 87, 73, 78, 69, 128, 89, 65, 71, 72, 128, 89, 65, 90, 72, 128, + 89, 73, 87, 78, 128, 89, 87, 65, 65, 128, 90, 72, 65, 82, 128, 90, 72, + 69, 69, 128, 45, 68, 90, 85, 196, 65, 76, 70, 65, 128, 65, 80, 69, 83, 207, 65, 82, 71, 73, 128, 66, 66, 85, 84, 128, 66, 69, 65, 84, 128, 66, 76, 65, 68, 197, 66, 76, 85, 69, 128, 66, 79, 78, 69, 128, 66, 82, 85, - 83, 200, 66, 90, 85, 78, 199, 67, 65, 82, 84, 128, 67, 72, 65, 82, 128, - 67, 72, 73, 78, 128, 67, 85, 79, 80, 128, 67, 85, 82, 86, 197, 67, 87, - 73, 73, 128, 67, 87, 79, 79, 128, 68, 65, 76, 69, 212, 68, 68, 85, 82, + 83, 200, 66, 85, 75, 89, 128, 66, 90, 85, 78, 199, 67, 65, 82, 84, 128, + 67, 85, 79, 80, 128, 67, 85, 82, 86, 197, 67, 87, 73, 73, 128, 67, 87, + 79, 79, 128, 68, 65, 76, 69, 212, 68, 68, 85, 82, 128, 68, 69, 69, 82, 128, 68, 90, 72, 65, 128, 68, 90, 72, 69, 128, 68, 90, 74, 69, 128, 69, - 82, 65, 83, 197, 70, 69, 69, 68, 128, 70, 73, 82, 83, 212, 70, 73, 83, - 72, 128, 70, 73, 84, 65, 128, 70, 76, 65, 84, 128, 70, 82, 79, 71, 128, + 65, 82, 84, 200, 69, 82, 65, 83, 197, 70, 69, 69, 68, 128, 70, 73, 83, + 72, 128, 70, 76, 65, 71, 128, 70, 76, 65, 84, 128, 70, 82, 79, 71, 128, 70, 87, 65, 65, 128, 71, 65, 84, 69, 128, 71, 67, 73, 71, 128, 71, 71, - 79, 80, 128, 71, 71, 85, 79, 128, 71, 72, 65, 68, 128, 71, 72, 65, 78, - 128, 71, 72, 72, 65, 128, 71, 73, 77, 69, 204, 71, 79, 65, 76, 128, 71, - 79, 76, 68, 128, 71, 82, 65, 67, 197, 71, 83, 85, 77, 128, 71, 89, 65, - 83, 128, 71, 89, 79, 78, 128, 72, 65, 86, 69, 128, 72, 66, 65, 83, 193, - 72, 72, 65, 65, 128, 72, 73, 69, 85, 200, 72, 79, 82, 73, 128, 72, 88, - 73, 84, 128, 72, 88, 79, 80, 128, 72, 88, 85, 79, 128, 73, 69, 85, 78, - 199, 74, 65, 68, 69, 128, 74, 69, 69, 77, 128, 74, 72, 65, 78, 128, 74, - 72, 69, 72, 128, 74, 74, 73, 69, 128, 74, 74, 85, 84, 128, 75, 72, 65, - 72, 128, 75, 72, 65, 78, 199, 75, 72, 65, 82, 128, 75, 72, 69, 73, 128, - 75, 72, 72, 65, 128, 75, 78, 73, 70, 197, 75, 83, 83, 65, 128, 75, 87, - 73, 73, 128, 75, 87, 79, 79, 128, 76, 69, 65, 70, 128, 76, 73, 87, 78, - 128, 76, 79, 78, 71, 128, 76, 79, 78, 71, 193, 76, 79, 87, 45, 185, 76, - 87, 65, 65, 128, 76, 87, 73, 73, 128, 76, 87, 79, 79, 128, 77, 69, 65, - 84, 128, 77, 69, 69, 77, 128, 77, 69, 83, 79, 128, 77, 73, 69, 85, 205, - 77, 79, 85, 78, 196, 77, 87, 73, 73, 128, 77, 87, 79, 79, 128, 78, 65, - 77, 69, 128, 78, 65, 78, 65, 128, 78, 66, 73, 69, 128, 78, 73, 69, 85, - 206, 78, 78, 78, 65, 128, 78, 79, 68, 69, 128, 78, 89, 73, 80, 128, 78, - 89, 79, 80, 128, 78, 90, 85, 80, 128, 80, 65, 71, 69, 128, 80, 65, 80, - 69, 210, 80, 65, 87, 78, 128, 80, 72, 65, 82, 128, 80, 73, 69, 85, 208, - 80, 73, 87, 82, 128, 80, 76, 65, 67, 197, 80, 79, 85, 78, 196, 80, 87, - 73, 73, 128, 80, 87, 79, 79, 128, 81, 85, 79, 84, 197, 82, 65, 89, 83, - 128, 82, 66, 65, 83, 193, 82, 73, 69, 85, 204, 82, 73, 83, 72, 128, 82, - 79, 79, 75, 128, 82, 87, 65, 65, 128, 83, 65, 76, 76, 193, 83, 65, 76, - 84, 128, 83, 69, 65, 76, 128, 83, 72, 65, 65, 128, 83, 72, 65, 84, 128, - 83, 72, 69, 69, 128, 83, 72, 69, 73, 128, 83, 72, 72, 65, 128, 83, 72, - 73, 70, 212, 83, 72, 79, 71, 201, 83, 72, 85, 82, 128, 83, 72, 87, 69, - 128, 83, 72, 87, 73, 128, 83, 72, 87, 79, 128, 83, 76, 85, 82, 128, 83, - 77, 65, 83, 200, 83, 78, 79, 85, 212, 83, 80, 65, 68, 197, 83, 81, 85, - 65, 212, 83, 85, 75, 85, 206, 83, 87, 73, 73, 128, 83, 87, 79, 79, 128, - 84, 69, 88, 84, 128, 84, 72, 69, 82, 197, 84, 72, 79, 79, 128, 84, 73, - 77, 69, 128, 84, 73, 87, 78, 128, 84, 76, 72, 65, 128, 84, 76, 72, 69, - 128, 84, 76, 72, 73, 128, 84, 76, 72, 79, 128, 84, 82, 85, 69, 128, 84, - 83, 72, 65, 128, 84, 83, 72, 69, 128, 84, 84, 72, 79, 128, 84, 87, 73, - 73, 128, 84, 87, 79, 79, 128, 85, 78, 68, 69, 210, 87, 65, 76, 75, 128, - 87, 65, 83, 76, 193, 87, 65, 84, 69, 210, 87, 72, 79, 76, 197, 87, 73, - 78, 69, 128, 87, 79, 79, 68, 128, 87, 89, 78, 78, 128, 89, 79, 45, 73, - 128, 89, 79, 71, 72, 128, 89, 85, 45, 73, 128, 89, 87, 73, 73, 128, 89, - 87, 79, 79, 128, 90, 65, 73, 78, 128, 90, 65, 81, 69, 198, 90, 72, 65, - 82, 128, 90, 76, 65, 77, 193, 45, 67, 72, 65, 210, 65, 69, 83, 67, 128, - 65, 72, 83, 65, 128, 65, 73, 76, 77, 128, 65, 73, 78, 78, 128, 65, 75, - 66, 65, 210, 65, 76, 71, 73, 218, 65, 76, 76, 65, 200, 65, 77, 80, 83, - 128, 65, 78, 75, 72, 128, 65, 78, 83, 85, 218, 65, 85, 78, 78, 128, 65, - 89, 65, 72, 128, 66, 65, 72, 84, 128, 66, 65, 82, 83, 128, 66, 65, 83, - 69, 128, 66, 66, 65, 80, 128, 66, 66, 65, 84, 128, 66, 66, 65, 88, 128, - 66, 66, 69, 80, 128, 66, 66, 69, 88, 128, 66, 66, 73, 69, 128, 66, 66, - 73, 80, 128, 66, 66, 73, 84, 128, 66, 66, 73, 88, 128, 66, 66, 79, 80, - 128, 66, 66, 79, 84, 128, 66, 66, 79, 88, 128, 66, 66, 85, 79, 128, 66, - 66, 85, 80, 128, 66, 66, 85, 82, 128, 66, 66, 85, 88, 128, 66, 66, 89, - 80, 128, 66, 66, 89, 84, 128, 66, 66, 89, 88, 128, 66, 67, 65, 68, 128, - 66, 69, 65, 78, 128, 66, 69, 69, 72, 128, 66, 69, 76, 76, 128, 66, 69, - 76, 84, 128, 66, 69, 78, 68, 128, 66, 69, 79, 82, 195, 66, 69, 84, 72, - 128, 66, 73, 82, 85, 128, 66, 76, 65, 78, 203, 66, 79, 65, 84, 128, 66, - 79, 68, 89, 128, 66, 83, 68, 85, 211, 66, 83, 75, 85, 210, 66, 85, 77, - 80, 217, 67, 65, 65, 73, 128, 67, 65, 76, 67, 128, 67, 65, 76, 76, 128, - 67, 65, 80, 79, 128, 67, 65, 86, 69, 128, 67, 72, 65, 65, 128, 67, 72, - 65, 78, 128, 67, 72, 65, 80, 128, 67, 72, 65, 84, 128, 67, 72, 65, 88, - 128, 67, 72, 69, 80, 128, 67, 72, 69, 84, 128, 67, 72, 69, 88, 128, 67, - 72, 79, 69, 128, 67, 72, 79, 80, 128, 67, 72, 79, 84, 128, 67, 72, 79, - 88, 128, 67, 72, 85, 79, 128, 67, 72, 85, 80, 128, 67, 72, 85, 82, 128, - 67, 72, 85, 88, 128, 67, 72, 89, 80, 128, 67, 72, 89, 82, 128, 67, 72, - 89, 84, 128, 67, 72, 89, 88, 128, 67, 73, 69, 80, 128, 67, 73, 69, 84, - 128, 67, 73, 69, 88, 128, 67, 76, 65, 78, 128, 67, 76, 65, 87, 128, 67, - 76, 69, 65, 210, 67, 76, 79, 83, 197, 67, 79, 68, 65, 128, 67, 79, 76, - 76, 128, 67, 79, 80, 89, 128, 67, 85, 79, 88, 128, 67, 85, 82, 88, 128, - 67, 89, 82, 88, 128, 68, 65, 71, 65, 218, 68, 65, 71, 83, 128, 68, 65, - 73, 82, 128, 68, 65, 77, 80, 128, 68, 68, 65, 65, 128, 68, 68, 65, 76, - 128, 68, 68, 65, 80, 128, 68, 68, 65, 84, 128, 68, 68, 65, 88, 128, 68, - 68, 69, 69, 128, 68, 68, 69, 80, 128, 68, 68, 69, 88, 128, 68, 68, 73, - 69, 128, 68, 68, 73, 80, 128, 68, 68, 73, 84, 128, 68, 68, 73, 88, 128, + 79, 80, 128, 71, 71, 85, 79, 128, 71, 72, 65, 68, 128, 71, 72, 72, 65, + 128, 71, 73, 77, 69, 204, 71, 79, 65, 76, 128, 71, 82, 65, 67, 197, 71, + 83, 85, 77, 128, 71, 89, 65, 83, 128, 71, 89, 79, 78, 128, 72, 65, 84, + 69, 128, 72, 65, 86, 69, 128, 72, 66, 65, 83, 193, 72, 69, 82, 85, 128, + 72, 72, 65, 65, 128, 72, 73, 69, 85, 200, 72, 88, 73, 84, 128, 72, 88, + 79, 80, 128, 72, 88, 85, 79, 128, 74, 65, 68, 69, 128, 74, 69, 69, 77, + 128, 74, 72, 69, 72, 128, 74, 74, 73, 69, 128, 74, 74, 85, 84, 128, 75, + 65, 75, 79, 128, 75, 72, 65, 72, 128, 75, 72, 65, 78, 199, 75, 72, 72, + 65, 128, 75, 78, 73, 70, 197, 75, 83, 83, 65, 128, 75, 87, 73, 73, 128, + 75, 87, 79, 79, 128, 76, 69, 65, 70, 128, 76, 73, 87, 78, 128, 76, 79, + 78, 71, 193, 76, 79, 87, 45, 185, 76, 87, 65, 65, 128, 76, 87, 73, 73, + 128, 76, 87, 79, 79, 128, 77, 69, 65, 84, 128, 77, 69, 69, 77, 128, 77, + 69, 69, 84, 128, 77, 69, 83, 79, 128, 77, 73, 69, 85, 205, 77, 79, 85, + 78, 196, 77, 87, 73, 73, 128, 77, 87, 79, 79, 128, 78, 65, 77, 69, 128, + 78, 65, 78, 65, 128, 78, 66, 73, 69, 128, 78, 73, 69, 85, 206, 78, 78, + 78, 65, 128, 78, 79, 68, 69, 128, 78, 89, 73, 80, 128, 78, 89, 79, 80, + 128, 78, 90, 85, 80, 128, 80, 65, 87, 78, 128, 80, 73, 69, 85, 208, 80, + 73, 87, 82, 128, 80, 76, 65, 67, 197, 80, 79, 85, 78, 196, 80, 87, 73, + 73, 128, 80, 87, 79, 79, 128, 81, 85, 79, 84, 197, 82, 65, 89, 83, 128, + 82, 66, 65, 83, 193, 82, 73, 69, 85, 204, 82, 73, 83, 72, 128, 82, 79, + 79, 75, 128, 82, 87, 65, 65, 128, 83, 65, 76, 76, 193, 83, 65, 76, 84, + 128, 83, 69, 65, 76, 128, 83, 72, 65, 65, 128, 83, 72, 65, 84, 128, 83, + 72, 69, 69, 128, 83, 72, 72, 65, 128, 83, 72, 73, 70, 212, 83, 72, 79, + 71, 201, 83, 72, 85, 82, 128, 83, 72, 87, 69, 128, 83, 72, 87, 73, 128, + 83, 72, 87, 79, 128, 83, 76, 85, 82, 128, 83, 77, 65, 83, 200, 83, 78, + 79, 85, 212, 83, 80, 65, 68, 197, 83, 81, 85, 65, 212, 83, 84, 65, 70, + 198, 83, 85, 75, 85, 206, 83, 87, 73, 73, 128, 83, 87, 79, 79, 128, 84, + 69, 88, 84, 128, 84, 72, 69, 82, 197, 84, 72, 79, 79, 128, 84, 73, 77, + 69, 128, 84, 73, 87, 78, 128, 84, 76, 72, 65, 128, 84, 76, 72, 69, 128, + 84, 76, 72, 73, 128, 84, 76, 72, 79, 128, 84, 82, 69, 69, 128, 84, 82, + 85, 69, 128, 84, 83, 72, 69, 128, 84, 87, 73, 73, 128, 84, 87, 79, 79, + 128, 85, 78, 68, 69, 210, 86, 69, 68, 69, 128, 86, 73, 68, 65, 128, 87, + 65, 76, 75, 128, 87, 65, 83, 76, 193, 87, 65, 84, 69, 210, 87, 72, 79, + 76, 197, 87, 79, 79, 68, 128, 87, 79, 79, 76, 128, 87, 89, 78, 78, 128, + 89, 65, 75, 72, 128, 89, 65, 84, 73, 128, 89, 69, 82, 73, 128, 89, 79, + 45, 73, 128, 89, 79, 71, 72, 128, 89, 85, 45, 73, 128, 89, 87, 73, 73, + 128, 89, 87, 79, 79, 128, 90, 65, 73, 78, 128, 90, 65, 81, 69, 198, 90, + 65, 84, 65, 128, 90, 76, 65, 77, 193, 45, 67, 72, 65, 210, 65, 69, 83, + 67, 128, 65, 70, 84, 69, 210, 65, 72, 83, 65, 128, 65, 73, 76, 77, 128, + 65, 73, 78, 78, 128, 65, 75, 66, 65, 210, 65, 76, 71, 73, 218, 65, 76, + 76, 65, 200, 65, 76, 80, 65, 128, 65, 77, 80, 83, 128, 65, 78, 72, 85, + 128, 65, 78, 75, 72, 128, 65, 78, 83, 85, 218, 65, 82, 77, 89, 128, 65, + 84, 78, 65, 200, 65, 85, 78, 78, 128, 65, 89, 65, 72, 128, 66, 48, 49, + 56, 128, 66, 48, 49, 57, 128, 66, 48, 50, 50, 128, 66, 48, 51, 52, 128, + 66, 48, 52, 55, 128, 66, 48, 52, 57, 128, 66, 48, 53, 54, 128, 66, 48, + 54, 51, 128, 66, 48, 54, 52, 128, 66, 48, 55, 57, 128, 66, 48, 56, 50, + 128, 66, 48, 56, 51, 128, 66, 48, 56, 54, 128, 66, 48, 56, 57, 128, 66, + 49, 48, 53, 198, 66, 49, 48, 53, 205, 66, 49, 48, 54, 198, 66, 49, 48, + 54, 205, 66, 49, 48, 55, 198, 66, 49, 48, 55, 205, 66, 49, 48, 56, 198, + 66, 49, 48, 56, 205, 66, 49, 48, 57, 198, 66, 49, 48, 57, 205, 66, 49, + 51, 50, 128, 66, 49, 52, 50, 128, 66, 49, 52, 54, 128, 66, 49, 53, 48, + 128, 66, 49, 53, 50, 128, 66, 49, 53, 51, 128, 66, 49, 53, 52, 128, 66, + 49, 53, 53, 128, 66, 49, 53, 55, 128, 66, 49, 53, 56, 128, 66, 49, 54, + 48, 128, 66, 49, 54, 49, 128, 66, 49, 54, 52, 128, 66, 49, 54, 53, 128, + 66, 49, 54, 54, 128, 66, 49, 54, 55, 128, 66, 49, 54, 56, 128, 66, 49, + 54, 57, 128, 66, 49, 55, 48, 128, 66, 49, 55, 49, 128, 66, 49, 55, 50, + 128, 66, 49, 55, 52, 128, 66, 49, 55, 55, 128, 66, 49, 55, 56, 128, 66, + 49, 55, 57, 128, 66, 49, 56, 48, 128, 66, 49, 56, 49, 128, 66, 49, 56, + 50, 128, 66, 49, 56, 51, 128, 66, 49, 56, 52, 128, 66, 49, 56, 53, 128, + 66, 49, 56, 57, 128, 66, 49, 57, 48, 128, 66, 50, 48, 48, 128, 66, 50, + 48, 49, 128, 66, 50, 48, 50, 128, 66, 50, 48, 51, 128, 66, 50, 48, 52, + 128, 66, 50, 48, 53, 128, 66, 50, 48, 54, 128, 66, 50, 48, 55, 128, 66, + 50, 48, 56, 128, 66, 50, 48, 57, 128, 66, 50, 49, 48, 128, 66, 50, 49, + 49, 128, 66, 50, 49, 50, 128, 66, 50, 49, 51, 128, 66, 50, 49, 52, 128, + 66, 50, 49, 53, 128, 66, 50, 49, 54, 128, 66, 50, 49, 55, 128, 66, 50, + 49, 56, 128, 66, 50, 49, 57, 128, 66, 50, 50, 49, 128, 66, 50, 50, 50, + 128, 66, 50, 50, 54, 128, 66, 50, 50, 55, 128, 66, 50, 50, 56, 128, 66, + 50, 50, 57, 128, 66, 50, 51, 50, 128, 66, 50, 51, 52, 128, 66, 50, 51, + 54, 128, 66, 50, 52, 53, 128, 66, 50, 52, 54, 128, 66, 50, 52, 56, 128, + 66, 50, 52, 57, 128, 66, 50, 53, 48, 128, 66, 50, 53, 49, 128, 66, 50, + 53, 50, 128, 66, 50, 53, 51, 128, 66, 50, 53, 53, 128, 66, 50, 53, 54, + 128, 66, 50, 53, 55, 128, 66, 50, 53, 56, 128, 66, 50, 53, 57, 128, 66, + 51, 48, 53, 128, 66, 65, 67, 75, 128, 66, 65, 71, 65, 128, 66, 65, 72, + 84, 128, 66, 65, 82, 83, 128, 66, 65, 83, 69, 128, 66, 66, 65, 80, 128, + 66, 66, 65, 84, 128, 66, 66, 65, 88, 128, 66, 66, 69, 80, 128, 66, 66, + 69, 88, 128, 66, 66, 73, 69, 128, 66, 66, 73, 80, 128, 66, 66, 73, 84, + 128, 66, 66, 73, 88, 128, 66, 66, 79, 80, 128, 66, 66, 79, 84, 128, 66, + 66, 79, 88, 128, 66, 66, 85, 79, 128, 66, 66, 85, 80, 128, 66, 66, 85, + 82, 128, 66, 66, 85, 88, 128, 66, 66, 89, 80, 128, 66, 66, 89, 84, 128, + 66, 66, 89, 88, 128, 66, 67, 65, 68, 128, 66, 69, 65, 78, 128, 66, 69, + 69, 72, 128, 66, 69, 76, 76, 128, 66, 69, 76, 84, 128, 66, 69, 78, 68, + 128, 66, 69, 79, 82, 195, 66, 69, 84, 72, 128, 66, 73, 82, 85, 128, 66, + 76, 65, 78, 203, 66, 79, 65, 82, 128, 66, 79, 65, 84, 128, 66, 79, 68, + 89, 128, 66, 83, 68, 85, 211, 66, 83, 75, 65, 173, 66, 83, 75, 85, 210, + 66, 85, 76, 76, 128, 66, 85, 77, 80, 217, 66, 87, 69, 69, 128, 67, 65, + 65, 73, 128, 67, 65, 76, 67, 128, 67, 65, 76, 76, 128, 67, 65, 80, 79, + 128, 67, 65, 86, 69, 128, 67, 65, 89, 78, 128, 67, 67, 65, 65, 128, 67, + 67, 69, 69, 128, 67, 67, 72, 65, 128, 67, 67, 72, 69, 128, 67, 67, 72, + 73, 128, 67, 67, 72, 79, 128, 67, 67, 72, 85, 128, 67, 72, 65, 78, 128, + 67, 72, 65, 80, 128, 67, 72, 65, 84, 128, 67, 72, 65, 88, 128, 67, 72, + 69, 80, 128, 67, 72, 69, 84, 128, 67, 72, 69, 88, 128, 67, 72, 79, 65, + 128, 67, 72, 79, 69, 128, 67, 72, 79, 80, 128, 67, 72, 79, 84, 128, 67, + 72, 79, 88, 128, 67, 72, 85, 79, 128, 67, 72, 85, 80, 128, 67, 72, 85, + 82, 128, 67, 72, 85, 88, 128, 67, 72, 89, 80, 128, 67, 72, 89, 82, 128, + 67, 72, 89, 84, 128, 67, 72, 89, 88, 128, 67, 73, 69, 80, 128, 67, 73, + 69, 84, 128, 67, 73, 69, 88, 128, 67, 76, 65, 78, 128, 67, 76, 65, 87, + 128, 67, 76, 69, 65, 210, 67, 76, 79, 83, 197, 67, 79, 68, 65, 128, 67, + 79, 76, 76, 128, 67, 79, 80, 89, 128, 67, 85, 79, 88, 128, 67, 85, 82, + 88, 128, 67, 89, 82, 88, 128, 68, 65, 71, 65, 218, 68, 65, 71, 83, 128, + 68, 65, 73, 82, 128, 68, 65, 77, 80, 128, 68, 65, 82, 84, 128, 68, 68, + 65, 65, 128, 68, 68, 65, 76, 128, 68, 68, 65, 80, 128, 68, 68, 65, 84, + 128, 68, 68, 65, 88, 128, 68, 68, 69, 69, 128, 68, 68, 69, 80, 128, 68, + 68, 69, 88, 128, 68, 68, 72, 79, 128, 68, 68, 73, 69, 128, 68, 68, 73, + 80, 128, 68, 68, 73, 84, 128, 68, 68, 73, 88, 128, 68, 68, 79, 65, 128, 68, 68, 79, 80, 128, 68, 68, 79, 84, 128, 68, 68, 79, 88, 128, 68, 68, 85, 79, 128, 68, 68, 85, 80, 128, 68, 68, 85, 84, 128, 68, 68, 85, 88, - 128, 68, 68, 87, 65, 128, 68, 69, 69, 82, 128, 68, 69, 72, 73, 128, 68, - 69, 75, 65, 128, 68, 69, 83, 73, 128, 68, 73, 80, 76, 201, 68, 73, 83, - 72, 128, 68, 73, 84, 84, 207, 68, 76, 69, 69, 128, 68, 79, 73, 84, 128, - 68, 79, 79, 82, 128, 68, 79, 82, 85, 128, 68, 82, 85, 77, 128, 68, 89, - 69, 72, 128, 68, 90, 69, 69, 128, 69, 65, 82, 84, 200, 69, 72, 87, 65, - 218, 69, 78, 84, 69, 210, 69, 84, 72, 69, 204, 69, 85, 45, 85, 128, 69, - 85, 76, 69, 210, 70, 65, 65, 73, 128, 70, 65, 78, 71, 128, 70, 76, 73, - 80, 128, 70, 79, 82, 77, 211, 70, 82, 65, 78, 195, 70, 85, 82, 88, 128, - 71, 65, 77, 65, 204, 71, 68, 65, 78, 128, 71, 71, 65, 65, 128, 71, 71, - 65, 80, 128, 71, 71, 65, 84, 128, 71, 71, 65, 88, 128, 71, 71, 69, 69, - 128, 71, 71, 69, 80, 128, 71, 71, 69, 84, 128, 71, 71, 69, 88, 128, 71, - 71, 73, 69, 128, 71, 71, 73, 84, 128, 71, 71, 73, 88, 128, 71, 71, 79, - 84, 128, 71, 71, 79, 88, 128, 71, 71, 85, 80, 128, 71, 71, 85, 82, 128, - 71, 71, 85, 84, 128, 71, 71, 85, 88, 128, 71, 72, 69, 69, 128, 71, 73, - 66, 65, 128, 71, 73, 69, 84, 128, 71, 73, 71, 65, 128, 71, 79, 82, 84, - 128, 71, 85, 69, 72, 128, 71, 87, 65, 65, 128, 71, 87, 69, 69, 128, 72, - 65, 69, 71, 204, 72, 65, 71, 76, 128, 72, 69, 77, 80, 128, 72, 69, 84, - 72, 128, 72, 72, 69, 69, 128, 72, 72, 87, 65, 128, 72, 73, 69, 88, 128, - 72, 73, 71, 72, 128, 72, 73, 90, 66, 128, 72, 76, 65, 80, 128, 72, 76, - 65, 84, 128, 72, 76, 65, 88, 128, 72, 76, 69, 80, 128, 72, 76, 69, 88, - 128, 72, 76, 73, 69, 128, 72, 76, 73, 80, 128, 72, 76, 73, 84, 128, 72, - 76, 73, 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 88, 128, 72, 76, 85, - 79, 128, 72, 76, 85, 80, 128, 72, 76, 85, 82, 128, 72, 76, 85, 84, 128, - 72, 76, 85, 88, 128, 72, 76, 89, 80, 128, 72, 76, 89, 82, 128, 72, 76, - 89, 84, 128, 72, 76, 89, 88, 128, 72, 77, 65, 80, 128, 72, 77, 65, 84, - 128, 72, 77, 65, 88, 128, 72, 77, 73, 69, 128, 72, 77, 73, 80, 128, 72, - 77, 73, 84, 128, 72, 77, 73, 88, 128, 72, 77, 79, 80, 128, 72, 77, 79, - 84, 128, 72, 77, 79, 88, 128, 72, 77, 85, 79, 128, 72, 77, 85, 80, 128, - 72, 77, 85, 82, 128, 72, 77, 85, 84, 128, 72, 77, 85, 88, 128, 72, 77, - 89, 80, 128, 72, 77, 89, 82, 128, 72, 77, 89, 88, 128, 72, 78, 65, 80, - 128, 72, 78, 65, 84, 128, 72, 78, 65, 88, 128, 72, 78, 69, 80, 128, 72, - 78, 69, 88, 128, 72, 78, 73, 69, 128, 72, 78, 73, 80, 128, 72, 78, 73, - 84, 128, 72, 78, 73, 88, 128, 72, 78, 79, 80, 128, 72, 78, 79, 84, 128, - 72, 78, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 84, 128, 72, 79, - 79, 78, 128, 72, 88, 65, 80, 128, 72, 88, 65, 84, 128, 72, 88, 65, 88, - 128, 72, 88, 69, 80, 128, 72, 88, 69, 88, 128, 72, 88, 73, 69, 128, 72, - 88, 73, 80, 128, 72, 88, 73, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, - 88, 128, 73, 45, 69, 85, 128, 73, 45, 89, 65, 128, 73, 68, 76, 69, 128, - 73, 70, 73, 78, 128, 73, 76, 85, 89, 128, 73, 78, 67, 72, 128, 73, 78, - 78, 78, 128, 73, 78, 84, 73, 128, 73, 83, 79, 78, 128, 73, 84, 69, 77, - 128, 73, 85, 74, 65, 128, 74, 69, 82, 65, 206, 74, 74, 69, 69, 128, 74, - 74, 73, 80, 128, 74, 74, 73, 84, 128, 74, 74, 73, 88, 128, 74, 74, 79, - 80, 128, 74, 74, 79, 84, 128, 74, 74, 79, 88, 128, 74, 74, 85, 79, 128, - 74, 74, 85, 80, 128, 74, 74, 85, 82, 128, 74, 74, 85, 88, 128, 74, 74, - 89, 80, 128, 74, 74, 89, 84, 128, 74, 74, 89, 88, 128, 74, 85, 76, 89, - 128, 74, 85, 78, 69, 128, 74, 85, 79, 84, 128, 75, 65, 65, 73, 128, 75, - 65, 80, 72, 128, 75, 67, 65, 76, 128, 75, 72, 65, 65, 128, 75, 72, 65, + 128, 68, 68, 87, 65, 128, 68, 69, 65, 68, 128, 68, 69, 66, 73, 212, 68, + 69, 69, 76, 128, 68, 69, 72, 73, 128, 68, 69, 75, 65, 128, 68, 69, 83, + 73, 128, 68, 72, 65, 76, 128, 68, 73, 80, 76, 201, 68, 73, 83, 72, 128, + 68, 73, 84, 84, 207, 68, 76, 69, 69, 128, 68, 79, 73, 84, 128, 68, 79, + 79, 82, 128, 68, 79, 82, 85, 128, 68, 82, 85, 77, 128, 68, 89, 69, 72, + 128, 68, 90, 69, 69, 128, 69, 72, 87, 65, 218, 69, 74, 69, 67, 212, 69, + 78, 84, 69, 210, 69, 84, 72, 69, 204, 69, 85, 45, 85, 128, 69, 85, 76, + 69, 210, 70, 65, 65, 73, 128, 70, 65, 78, 71, 128, 70, 76, 73, 80, 128, + 70, 79, 82, 77, 211, 70, 82, 65, 78, 195, 70, 85, 82, 88, 128, 70, 85, + 83, 69, 128, 70, 87, 69, 69, 128, 71, 65, 77, 65, 204, 71, 68, 65, 78, + 128, 71, 69, 65, 82, 128, 71, 71, 65, 65, 128, 71, 71, 65, 80, 128, 71, + 71, 65, 84, 128, 71, 71, 65, 88, 128, 71, 71, 69, 69, 128, 71, 71, 69, + 80, 128, 71, 71, 69, 84, 128, 71, 71, 69, 88, 128, 71, 71, 73, 69, 128, + 71, 71, 73, 84, 128, 71, 71, 73, 88, 128, 71, 71, 79, 84, 128, 71, 71, + 79, 88, 128, 71, 71, 85, 80, 128, 71, 71, 85, 82, 128, 71, 71, 85, 84, + 128, 71, 71, 85, 88, 128, 71, 71, 87, 65, 128, 71, 71, 87, 69, 128, 71, + 71, 87, 73, 128, 71, 72, 69, 69, 128, 71, 73, 66, 65, 128, 71, 73, 69, + 84, 128, 71, 73, 71, 65, 128, 71, 79, 73, 78, 199, 71, 79, 82, 84, 128, + 71, 85, 69, 72, 128, 71, 89, 65, 65, 128, 71, 89, 69, 69, 128, 72, 65, + 69, 71, 204, 72, 65, 71, 76, 128, 72, 69, 77, 80, 128, 72, 72, 69, 69, + 128, 72, 72, 87, 65, 128, 72, 73, 69, 88, 128, 72, 73, 90, 66, 128, 72, + 76, 65, 80, 128, 72, 76, 65, 84, 128, 72, 76, 65, 88, 128, 72, 76, 69, + 80, 128, 72, 76, 69, 88, 128, 72, 76, 73, 69, 128, 72, 76, 73, 80, 128, + 72, 76, 73, 84, 128, 72, 76, 73, 88, 128, 72, 76, 79, 80, 128, 72, 76, + 79, 88, 128, 72, 76, 85, 79, 128, 72, 76, 85, 80, 128, 72, 76, 85, 82, + 128, 72, 76, 85, 84, 128, 72, 76, 85, 88, 128, 72, 76, 89, 80, 128, 72, + 76, 89, 82, 128, 72, 76, 89, 84, 128, 72, 76, 89, 88, 128, 72, 77, 65, + 80, 128, 72, 77, 65, 84, 128, 72, 77, 65, 88, 128, 72, 77, 73, 69, 128, + 72, 77, 73, 80, 128, 72, 77, 73, 84, 128, 72, 77, 73, 88, 128, 72, 77, + 79, 80, 128, 72, 77, 79, 84, 128, 72, 77, 79, 88, 128, 72, 77, 85, 79, + 128, 72, 77, 85, 80, 128, 72, 77, 85, 82, 128, 72, 77, 85, 84, 128, 72, + 77, 85, 88, 128, 72, 77, 89, 80, 128, 72, 77, 89, 82, 128, 72, 77, 89, + 88, 128, 72, 78, 65, 80, 128, 72, 78, 65, 84, 128, 72, 78, 65, 88, 128, + 72, 78, 69, 80, 128, 72, 78, 69, 88, 128, 72, 78, 73, 69, 128, 72, 78, + 73, 80, 128, 72, 78, 73, 84, 128, 72, 78, 73, 88, 128, 72, 78, 79, 80, + 128, 72, 78, 79, 84, 128, 72, 78, 79, 88, 128, 72, 78, 85, 79, 128, 72, + 78, 85, 84, 128, 72, 79, 79, 78, 128, 72, 79, 84, 65, 128, 72, 80, 87, + 71, 128, 72, 85, 77, 65, 206, 72, 88, 65, 80, 128, 72, 88, 65, 84, 128, + 72, 88, 65, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 88, 128, 72, 88, + 73, 69, 128, 72, 88, 73, 80, 128, 72, 88, 73, 88, 128, 72, 88, 79, 84, + 128, 72, 88, 79, 88, 128, 72, 90, 87, 71, 128, 72, 90, 90, 80, 128, 72, + 90, 90, 90, 128, 73, 45, 69, 85, 128, 73, 45, 89, 65, 128, 73, 68, 76, + 69, 128, 73, 70, 73, 78, 128, 73, 76, 85, 89, 128, 73, 78, 67, 72, 128, + 73, 78, 78, 69, 210, 73, 78, 78, 78, 128, 73, 78, 84, 73, 128, 73, 83, + 79, 78, 128, 73, 84, 69, 77, 128, 73, 85, 74, 65, 128, 74, 69, 82, 65, + 206, 74, 74, 69, 69, 128, 74, 74, 73, 80, 128, 74, 74, 73, 84, 128, 74, + 74, 73, 88, 128, 74, 74, 79, 80, 128, 74, 74, 79, 84, 128, 74, 74, 79, + 88, 128, 74, 74, 85, 79, 128, 74, 74, 85, 80, 128, 74, 74, 85, 82, 128, + 74, 74, 85, 88, 128, 74, 74, 89, 80, 128, 74, 74, 89, 84, 128, 74, 74, + 89, 88, 128, 74, 85, 76, 89, 128, 74, 85, 78, 69, 128, 74, 85, 79, 84, + 128, 75, 65, 65, 70, 128, 75, 65, 65, 73, 128, 75, 65, 80, 72, 128, 75, + 65, 80, 79, 128, 75, 67, 65, 76, 128, 75, 72, 65, 65, 128, 75, 72, 65, 73, 128, 75, 72, 65, 78, 128, 75, 72, 69, 69, 128, 75, 72, 79, 78, 128, - 75, 73, 69, 80, 128, 75, 73, 69, 88, 128, 75, 73, 82, 79, 128, 75, 75, - 69, 69, 128, 75, 79, 77, 66, 213, 75, 79, 84, 79, 128, 75, 85, 79, 80, - 128, 75, 85, 79, 88, 128, 75, 85, 82, 88, 128, 75, 85, 85, 72, 128, 75, - 87, 69, 69, 128, 75, 88, 65, 65, 128, 75, 88, 69, 69, 128, 75, 88, 87, - 65, 128, 75, 88, 87, 69, 128, 75, 88, 87, 73, 128, 76, 65, 65, 73, 128, - 76, 65, 77, 69, 128, 76, 65, 77, 69, 196, 76, 68, 65, 78, 128, 76, 69, - 69, 75, 128, 76, 69, 71, 83, 128, 76, 69, 86, 69, 204, 76, 69, 90, 72, - 128, 76, 72, 65, 65, 128, 76, 72, 73, 73, 128, 76, 72, 79, 79, 128, 76, - 73, 69, 84, 128, 76, 73, 70, 69, 128, 76, 79, 79, 84, 128, 76, 85, 73, - 83, 128, 76, 85, 79, 84, 128, 77, 65, 65, 73, 128, 77, 69, 83, 72, 128, - 77, 69, 83, 73, 128, 77, 71, 65, 80, 128, 77, 71, 65, 84, 128, 77, 71, - 65, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 88, 128, 77, 71, 73, 69, - 128, 77, 71, 79, 80, 128, 77, 71, 79, 84, 128, 77, 71, 79, 88, 128, 77, - 71, 85, 79, 128, 77, 71, 85, 80, 128, 77, 71, 85, 82, 128, 77, 71, 85, - 84, 128, 77, 71, 85, 88, 128, 77, 73, 67, 82, 207, 77, 73, 76, 76, 197, - 77, 73, 78, 89, 128, 77, 73, 82, 73, 128, 77, 79, 86, 69, 196, 77, 85, - 73, 78, 128, 77, 85, 76, 84, 201, 77, 85, 79, 84, 128, 78, 65, 65, 73, - 128, 78, 65, 73, 82, 193, 78, 65, 78, 68, 128, 78, 66, 65, 80, 128, 78, - 66, 65, 84, 128, 78, 66, 65, 88, 128, 78, 66, 73, 80, 128, 78, 66, 73, - 84, 128, 78, 66, 73, 88, 128, 78, 66, 79, 80, 128, 78, 66, 79, 84, 128, - 78, 66, 79, 88, 128, 78, 66, 85, 80, 128, 78, 66, 85, 82, 128, 78, 66, - 85, 84, 128, 78, 66, 85, 88, 128, 78, 66, 89, 80, 128, 78, 66, 89, 82, - 128, 78, 66, 89, 84, 128, 78, 66, 89, 88, 128, 78, 68, 65, 80, 128, 78, - 68, 65, 84, 128, 78, 68, 65, 88, 128, 78, 68, 69, 80, 128, 78, 68, 73, - 69, 128, 78, 68, 73, 80, 128, 78, 68, 73, 84, 128, 78, 68, 73, 88, 128, - 78, 68, 79, 80, 128, 78, 68, 79, 84, 128, 78, 68, 79, 88, 128, 78, 68, - 85, 80, 128, 78, 68, 85, 82, 128, 78, 68, 85, 84, 128, 78, 68, 85, 88, - 128, 78, 71, 65, 73, 128, 78, 71, 65, 80, 128, 78, 71, 65, 84, 128, 78, - 71, 65, 88, 128, 78, 71, 69, 80, 128, 78, 71, 69, 88, 128, 78, 71, 73, - 69, 128, 78, 71, 79, 80, 128, 78, 71, 79, 84, 128, 78, 71, 79, 88, 128, + 75, 73, 67, 75, 128, 75, 73, 69, 80, 128, 75, 73, 69, 88, 128, 75, 73, + 82, 79, 128, 75, 75, 69, 69, 128, 75, 79, 77, 66, 213, 75, 79, 84, 79, + 128, 75, 85, 79, 80, 128, 75, 85, 79, 88, 128, 75, 85, 82, 84, 128, 75, + 85, 82, 88, 128, 75, 85, 85, 72, 128, 75, 87, 69, 69, 128, 75, 88, 65, + 65, 128, 75, 88, 69, 69, 128, 75, 88, 87, 65, 128, 75, 88, 87, 69, 128, + 75, 88, 87, 73, 128, 75, 89, 65, 65, 128, 75, 89, 69, 69, 128, 76, 65, + 65, 73, 128, 76, 65, 65, 78, 128, 76, 65, 69, 86, 128, 76, 65, 77, 69, + 128, 76, 65, 77, 69, 196, 76, 68, 65, 78, 128, 76, 69, 69, 75, 128, 76, + 69, 71, 83, 128, 76, 69, 86, 69, 204, 76, 69, 90, 72, 128, 76, 72, 65, + 65, 128, 76, 72, 73, 73, 128, 76, 72, 79, 79, 128, 76, 73, 69, 84, 128, + 76, 73, 70, 69, 128, 76, 73, 84, 82, 193, 76, 79, 76, 76, 128, 76, 79, + 79, 84, 128, 76, 85, 73, 83, 128, 76, 85, 79, 84, 128, 77, 65, 65, 73, + 128, 77, 65, 82, 69, 128, 77, 69, 82, 73, 128, 77, 69, 83, 72, 128, 77, + 69, 83, 73, 128, 77, 71, 65, 80, 128, 77, 71, 65, 84, 128, 77, 71, 65, + 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 88, 128, 77, 71, 73, 69, 128, + 77, 71, 79, 80, 128, 77, 71, 79, 84, 128, 77, 71, 79, 88, 128, 77, 71, + 85, 79, 128, 77, 71, 85, 80, 128, 77, 71, 85, 82, 128, 77, 71, 85, 84, + 128, 77, 71, 85, 88, 128, 77, 73, 67, 82, 207, 77, 73, 73, 78, 128, 77, + 73, 76, 76, 197, 77, 73, 77, 69, 128, 77, 73, 78, 89, 128, 77, 73, 82, + 73, 128, 77, 78, 89, 65, 205, 77, 79, 78, 84, 200, 77, 79, 85, 84, 200, + 77, 79, 86, 69, 196, 77, 85, 73, 78, 128, 77, 85, 76, 84, 201, 77, 85, + 79, 84, 128, 77, 87, 69, 69, 128, 78, 65, 65, 73, 128, 78, 65, 73, 82, + 193, 78, 65, 78, 68, 128, 78, 66, 65, 80, 128, 78, 66, 65, 84, 128, 78, + 66, 65, 88, 128, 78, 66, 73, 80, 128, 78, 66, 73, 84, 128, 78, 66, 73, + 88, 128, 78, 66, 79, 80, 128, 78, 66, 79, 84, 128, 78, 66, 79, 88, 128, + 78, 66, 85, 80, 128, 78, 66, 85, 82, 128, 78, 66, 85, 84, 128, 78, 66, + 85, 88, 128, 78, 66, 89, 80, 128, 78, 66, 89, 82, 128, 78, 66, 89, 84, + 128, 78, 66, 89, 88, 128, 78, 68, 65, 80, 128, 78, 68, 65, 84, 128, 78, + 68, 65, 88, 128, 78, 68, 69, 80, 128, 78, 68, 73, 69, 128, 78, 68, 73, + 80, 128, 78, 68, 73, 84, 128, 78, 68, 73, 88, 128, 78, 68, 79, 80, 128, + 78, 68, 79, 84, 128, 78, 68, 79, 88, 128, 78, 68, 85, 80, 128, 78, 68, + 85, 82, 128, 78, 68, 85, 84, 128, 78, 68, 85, 88, 128, 78, 71, 65, 73, + 128, 78, 71, 65, 80, 128, 78, 71, 65, 84, 128, 78, 71, 65, 88, 128, 78, + 71, 69, 80, 128, 78, 71, 69, 88, 128, 78, 71, 73, 69, 128, 78, 71, 75, + 65, 128, 78, 71, 79, 80, 128, 78, 71, 79, 84, 128, 78, 71, 79, 88, 128, 78, 71, 85, 79, 128, 78, 74, 73, 69, 128, 78, 74, 73, 80, 128, 78, 74, 73, 84, 128, 78, 74, 73, 88, 128, 78, 74, 79, 80, 128, 78, 74, 79, 84, 128, 78, 74, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 80, 128, 78, @@ -2168,8120 +2701,9841 @@ 82, 79, 88, 128, 78, 82, 85, 80, 128, 78, 82, 85, 82, 128, 78, 82, 85, 84, 128, 78, 82, 85, 88, 128, 78, 82, 89, 80, 128, 78, 82, 89, 82, 128, 78, 82, 89, 84, 128, 78, 82, 89, 88, 128, 78, 85, 76, 76, 128, 78, 85, - 79, 80, 128, 78, 85, 82, 88, 128, 78, 89, 65, 65, 128, 78, 89, 69, 69, - 128, 78, 89, 69, 72, 128, 78, 89, 73, 69, 128, 78, 89, 73, 84, 128, 78, - 89, 73, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 88, 128, 78, 89, 85, - 79, 128, 78, 89, 85, 80, 128, 78, 89, 85, 84, 128, 78, 89, 85, 88, 128, - 78, 89, 87, 65, 128, 78, 90, 65, 80, 128, 78, 90, 65, 84, 128, 78, 90, - 65, 88, 128, 78, 90, 69, 88, 128, 78, 90, 73, 69, 128, 78, 90, 73, 80, - 128, 78, 90, 73, 84, 128, 78, 90, 73, 88, 128, 78, 90, 79, 80, 128, 78, - 90, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 82, 128, 78, 90, 85, - 88, 128, 78, 90, 89, 80, 128, 78, 90, 89, 82, 128, 78, 90, 89, 84, 128, - 78, 90, 89, 88, 128, 79, 45, 69, 79, 128, 79, 45, 89, 69, 128, 79, 78, - 83, 85, 128, 79, 79, 77, 85, 128, 79, 85, 78, 67, 197, 80, 65, 65, 73, - 128, 80, 65, 68, 77, 193, 80, 65, 82, 65, 128, 80, 69, 65, 67, 197, 80, - 69, 78, 78, 217, 80, 69, 83, 79, 128, 80, 72, 65, 65, 128, 80, 72, 65, - 78, 128, 80, 72, 69, 69, 128, 80, 72, 87, 65, 128, 80, 73, 69, 80, 128, - 80, 73, 69, 88, 128, 80, 73, 75, 79, 128, 80, 76, 79, 87, 128, 80, 82, - 73, 78, 212, 80, 85, 79, 80, 128, 80, 85, 79, 88, 128, 80, 85, 82, 88, - 128, 80, 89, 82, 88, 128, 81, 65, 65, 73, 128, 81, 65, 80, 72, 128, 81, - 72, 65, 65, 128, 81, 72, 69, 69, 128, 81, 72, 87, 65, 128, 81, 72, 87, - 69, 128, 81, 72, 87, 73, 128, 81, 73, 69, 80, 128, 81, 73, 69, 84, 128, - 81, 73, 69, 88, 128, 81, 85, 79, 80, 128, 81, 85, 79, 84, 128, 81, 85, - 79, 88, 128, 81, 85, 82, 88, 128, 81, 85, 85, 86, 128, 81, 87, 65, 65, - 128, 81, 87, 69, 69, 128, 81, 89, 82, 88, 128, 82, 65, 65, 73, 128, 82, - 65, 73, 68, 207, 82, 65, 78, 71, 197, 82, 69, 77, 85, 128, 82, 73, 67, - 69, 128, 82, 73, 69, 76, 128, 82, 73, 82, 65, 128, 82, 82, 65, 88, 128, - 82, 82, 69, 72, 128, 82, 82, 69, 80, 128, 82, 82, 69, 84, 128, 82, 82, - 69, 88, 128, 82, 82, 79, 80, 128, 82, 82, 79, 84, 128, 82, 82, 79, 88, - 128, 82, 82, 85, 79, 128, 82, 82, 85, 80, 128, 82, 82, 85, 82, 128, 82, - 82, 85, 84, 128, 82, 82, 85, 88, 128, 82, 82, 89, 80, 128, 82, 82, 89, - 82, 128, 82, 82, 89, 84, 128, 82, 82, 89, 88, 128, 82, 85, 73, 83, 128, - 82, 85, 76, 69, 128, 82, 85, 79, 80, 128, 82, 85, 83, 73, 128, 83, 65, - 65, 73, 128, 83, 65, 73, 76, 128, 83, 65, 76, 65, 128, 83, 65, 76, 65, - 205, 83, 66, 82, 85, 204, 83, 67, 87, 65, 128, 83, 68, 79, 78, 199, 83, - 72, 65, 80, 128, 83, 72, 65, 88, 128, 83, 72, 69, 80, 128, 83, 72, 69, - 84, 128, 83, 72, 69, 88, 128, 83, 72, 73, 73, 128, 83, 72, 79, 79, 128, - 83, 72, 79, 84, 128, 83, 72, 79, 88, 128, 83, 72, 85, 79, 128, 83, 72, - 85, 80, 128, 83, 72, 85, 84, 128, 83, 72, 85, 88, 128, 83, 72, 89, 80, - 128, 83, 72, 89, 82, 128, 83, 72, 89, 84, 128, 83, 72, 89, 88, 128, 83, - 73, 71, 69, 204, 83, 73, 71, 77, 193, 83, 75, 73, 78, 128, 83, 75, 85, - 76, 204, 83, 75, 87, 65, 128, 83, 80, 79, 84, 128, 83, 80, 87, 65, 128, - 83, 83, 65, 80, 128, 83, 83, 65, 84, 128, 83, 83, 65, 88, 128, 83, 83, - 69, 80, 128, 83, 83, 69, 88, 128, 83, 83, 73, 69, 128, 83, 83, 73, 80, - 128, 83, 83, 73, 84, 128, 83, 83, 73, 88, 128, 83, 83, 79, 80, 128, 83, - 83, 79, 84, 128, 83, 83, 79, 88, 128, 83, 83, 85, 80, 128, 83, 83, 85, - 84, 128, 83, 83, 85, 88, 128, 83, 83, 89, 80, 128, 83, 83, 89, 82, 128, - 83, 83, 89, 84, 128, 83, 83, 89, 88, 128, 83, 84, 65, 78, 128, 83, 84, - 69, 80, 128, 83, 84, 73, 76, 197, 83, 84, 87, 65, 128, 83, 85, 79, 80, - 128, 83, 85, 79, 88, 128, 83, 85, 82, 88, 128, 83, 87, 65, 83, 200, 83, - 90, 65, 65, 128, 83, 90, 69, 69, 128, 83, 90, 87, 65, 128, 84, 65, 65, - 73, 128, 84, 65, 75, 69, 128, 84, 65, 76, 76, 128, 84, 69, 45, 85, 128, - 84, 69, 78, 84, 128, 84, 69, 84, 72, 128, 84, 72, 69, 72, 128, 84, 72, - 69, 77, 193, 84, 72, 73, 82, 196, 84, 72, 85, 82, 211, 84, 72, 87, 65, - 128, 84, 73, 69, 80, 128, 84, 73, 69, 88, 128, 84, 73, 71, 72, 212, 84, - 73, 78, 89, 128, 84, 73, 87, 65, 218, 84, 76, 69, 69, 128, 84, 76, 72, - 85, 128, 84, 79, 84, 65, 204, 84, 82, 65, 68, 197, 84, 82, 69, 69, 128, - 84, 82, 73, 79, 206, 84, 83, 65, 65, 128, 84, 83, 65, 68, 201, 84, 83, - 87, 65, 128, 84, 84, 65, 65, 128, 84, 84, 69, 69, 128, 84, 84, 69, 72, - 128, 84, 84, 72, 69, 128, 84, 84, 72, 73, 128, 84, 84, 83, 65, 128, 84, - 84, 83, 69, 128, 84, 84, 83, 73, 128, 84, 84, 83, 79, 128, 84, 84, 83, - 85, 128, 84, 85, 79, 80, 128, 84, 85, 79, 84, 128, 84, 85, 79, 88, 128, - 84, 85, 82, 88, 128, 84, 90, 65, 65, 128, 84, 90, 69, 69, 128, 85, 45, - 65, 69, 128, 85, 65, 84, 72, 128, 86, 73, 69, 80, 128, 86, 73, 69, 84, - 128, 86, 73, 69, 88, 128, 86, 85, 82, 88, 128, 86, 89, 82, 88, 128, 87, - 65, 69, 78, 128, 87, 65, 76, 76, 128, 87, 69, 83, 84, 128, 87, 79, 82, - 75, 128, 87, 82, 65, 80, 128, 87, 85, 78, 74, 207, 87, 85, 79, 80, 128, - 87, 85, 79, 88, 128, 88, 73, 82, 79, 206, 88, 89, 82, 88, 128, 89, 65, - 45, 79, 128, 89, 65, 65, 73, 128, 89, 65, 78, 71, 128, 89, 69, 82, 65, - 200, 89, 73, 45, 85, 128, 89, 73, 78, 71, 128, 89, 79, 45, 79, 128, 89, - 79, 77, 79, 128, 89, 79, 82, 73, 128, 89, 85, 45, 65, 128, 89, 85, 45, - 69, 128, 89, 85, 45, 85, 128, 89, 85, 65, 78, 128, 89, 85, 68, 72, 128, - 89, 85, 79, 84, 128, 89, 85, 82, 88, 128, 89, 89, 82, 88, 128, 90, 65, - 89, 73, 206, 90, 72, 65, 65, 128, 90, 72, 65, 80, 128, 90, 72, 65, 84, - 128, 90, 72, 65, 88, 128, 90, 72, 69, 80, 128, 90, 72, 69, 84, 128, 90, - 72, 69, 88, 128, 90, 72, 79, 80, 128, 90, 72, 79, 84, 128, 90, 72, 79, - 88, 128, 90, 72, 85, 79, 128, 90, 72, 85, 80, 128, 90, 72, 85, 82, 128, - 90, 72, 85, 84, 128, 90, 72, 85, 88, 128, 90, 72, 87, 65, 128, 90, 72, - 89, 80, 128, 90, 72, 89, 82, 128, 90, 72, 89, 84, 128, 90, 72, 89, 88, - 128, 90, 85, 79, 80, 128, 90, 90, 65, 80, 128, 90, 90, 65, 84, 128, 90, - 90, 65, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 88, 128, 90, 90, 73, - 69, 128, 90, 90, 73, 80, 128, 90, 90, 73, 84, 128, 90, 90, 73, 88, 128, - 90, 90, 79, 80, 128, 90, 90, 79, 88, 128, 90, 90, 85, 80, 128, 90, 90, - 85, 82, 128, 90, 90, 85, 88, 128, 90, 90, 89, 80, 128, 90, 90, 89, 82, - 128, 90, 90, 89, 84, 128, 90, 90, 89, 88, 128, 68, 79, 84, 211, 70, 82, - 79, 205, 72, 79, 79, 203, 79, 80, 69, 206, 84, 79, 68, 207, 69, 65, 83, - 212, 84, 79, 78, 197, 72, 79, 85, 210, 83, 73, 66, 197, 72, 79, 82, 206, - 81, 85, 65, 196, 68, 65, 83, 200, 78, 69, 79, 128, 84, 69, 78, 128, 84, - 72, 69, 200, 75, 79, 77, 201, 67, 72, 73, 128, 79, 86, 69, 210, 79, 88, - 73, 193, 70, 79, 85, 210, 80, 72, 73, 128, 80, 83, 73, 128, 82, 72, 79, - 128, 83, 65, 82, 193, 84, 65, 67, 203, 71, 72, 65, 128, 66, 72, 65, 128, - 68, 79, 69, 211, 84, 65, 85, 128, 67, 72, 69, 128, 74, 72, 65, 128, 70, - 73, 86, 197, 82, 82, 65, 128, 87, 73, 68, 197, 82, 68, 69, 204, 83, 72, - 73, 206, 87, 65, 86, 217, 89, 85, 83, 128, 90, 65, 73, 206, 67, 65, 78, - 128, 68, 73, 71, 193, 65, 82, 67, 128, 83, 84, 79, 208, 84, 65, 77, 128, - 68, 90, 69, 128, 71, 72, 69, 128, 71, 79, 65, 204, 71, 84, 69, 210, 75, - 65, 70, 128, 76, 69, 71, 128, 78, 89, 79, 128, 83, 72, 79, 128, 83, 84, - 65, 210, 83, 85, 78, 128, 84, 65, 73, 204, 87, 65, 86, 197, 65, 80, 76, - 201, 66, 69, 69, 200, 67, 72, 79, 128, 67, 76, 69, 198, 68, 74, 69, 128, - 68, 75, 65, 210, 68, 89, 69, 200, 68, 90, 65, 128, 70, 69, 72, 128, 70, - 73, 83, 200, 71, 85, 69, 200, 76, 65, 77, 197, 76, 74, 69, 128, 77, 71, - 79, 128, 77, 85, 67, 200, 78, 65, 77, 197, 78, 74, 69, 128, 78, 79, 87, - 128, 78, 89, 69, 200, 80, 69, 69, 128, 82, 65, 65, 128, 83, 72, 73, 128, - 84, 72, 69, 206, 84, 73, 67, 203, 84, 84, 69, 200, 87, 65, 87, 128, 90, - 69, 82, 207, 66, 69, 69, 128, 66, 79, 87, 128, 66, 90, 72, 201, 67, 72, - 85, 128, 70, 76, 65, 212, 70, 82, 69, 197, 72, 73, 69, 128, 75, 69, 72, - 128, 75, 87, 69, 128, 75, 87, 73, 128, 76, 87, 65, 128, 77, 69, 77, 128, - 77, 69, 78, 128, 77, 87, 65, 128, 78, 65, 65, 128, 78, 85, 78, 128, 78, - 87, 65, 128, 78, 89, 73, 211, 80, 69, 72, 128, 81, 65, 65, 128, 82, 72, - 65, 128, 83, 72, 79, 197, 83, 72, 85, 128, 84, 72, 65, 204, 84, 79, 79, - 128, 86, 69, 69, 128, 87, 65, 69, 128, 87, 65, 76, 203, 87, 69, 79, 128, - 88, 69, 72, 128, 89, 79, 68, 128, 89, 89, 65, 128, 65, 76, 76, 201, 65, - 89, 66, 128, 66, 65, 65, 128, 66, 69, 72, 128, 66, 69, 78, 128, 66, 79, - 76, 212, 67, 65, 65, 128, 67, 73, 80, 128, 67, 76, 85, 194, 67, 79, 79, - 128, 67, 79, 87, 128, 67, 85, 80, 128, 67, 87, 69, 128, 67, 87, 73, 128, - 67, 87, 79, 128, 67, 89, 80, 128, 67, 89, 84, 128, 68, 68, 65, 204, 68, - 68, 69, 128, 68, 68, 73, 128, 68, 68, 85, 128, 68, 69, 73, 128, 68, 76, - 65, 128, 68, 79, 71, 128, 68, 79, 78, 128, 68, 82, 85, 205, 70, 65, 65, - 128, 70, 69, 73, 128, 70, 76, 89, 128, 70, 85, 82, 128, 70, 85, 83, 193, - 71, 65, 78, 128, 71, 65, 89, 128, 71, 71, 65, 128, 71, 71, 69, 128, 71, - 71, 73, 128, 71, 71, 79, 128, 71, 71, 85, 128, 71, 73, 77, 128, 71, 74, - 69, 128, 72, 65, 69, 128, 72, 65, 82, 196, 72, 77, 79, 128, 72, 78, 65, - 128, 73, 83, 79, 206, 74, 73, 76, 128, 74, 74, 73, 128, 74, 74, 79, 128, - 74, 74, 85, 128, 74, 74, 89, 128, 75, 65, 89, 128, 75, 69, 78, 128, 75, - 72, 69, 128, 75, 72, 79, 128, 75, 73, 84, 128, 75, 74, 69, 128, 75, 79, - 79, 128, 75, 83, 73, 128, 75, 87, 79, 128, 76, 65, 65, 128, 76, 65, 83, - 128, 76, 79, 79, 128, 76, 87, 69, 128, 76, 87, 73, 128, 76, 87, 79, 128, - 77, 65, 65, 128, 77, 79, 79, 128, 77, 79, 79, 206, 77, 87, 69, 128, 77, - 87, 73, 128, 77, 87, 79, 128, 78, 65, 82, 128, 78, 69, 69, 128, 78, 71, - 65, 211, 78, 73, 66, 128, 78, 79, 79, 128, 78, 79, 84, 197, 78, 87, 69, - 128, 78, 89, 73, 128, 78, 89, 85, 128, 79, 72, 77, 128, 79, 75, 84, 207, - 79, 78, 78, 128, 80, 65, 65, 128, 80, 65, 82, 128, 80, 65, 82, 212, 80, - 65, 84, 200, 80, 72, 79, 128, 80, 72, 85, 210, 80, 79, 76, 201, 80, 79, - 79, 128, 80, 85, 84, 128, 80, 87, 69, 128, 80, 87, 73, 128, 80, 87, 79, - 128, 80, 89, 84, 128, 81, 65, 73, 128, 81, 65, 82, 128, 81, 73, 73, 128, - 81, 79, 84, 128, 81, 85, 79, 128, 81, 85, 85, 128, 82, 65, 69, 128, 82, - 71, 89, 193, 82, 78, 65, 205, 82, 82, 69, 200, 83, 69, 72, 128, 83, 72, - 65, 196, 83, 72, 89, 128, 83, 73, 79, 211, 83, 74, 69, 128, 83, 79, 79, - 128, 83, 83, 73, 128, 83, 83, 79, 128, 83, 87, 69, 128, 83, 87, 73, 128, - 83, 87, 79, 128, 84, 65, 71, 128, 84, 65, 84, 128, 84, 65, 86, 128, 84, - 74, 69, 128, 84, 76, 65, 128, 84, 76, 73, 128, 84, 76, 85, 128, 84, 82, - 69, 197, 84, 84, 73, 128, 84, 87, 69, 128, 84, 87, 73, 128, 85, 83, 69, - 196, 86, 65, 86, 128, 86, 69, 80, 128, 86, 69, 82, 217, 86, 69, 87, 128, - 86, 73, 78, 128, 86, 79, 85, 128, 86, 85, 82, 128, 88, 65, 78, 128, 89, - 65, 78, 199, 89, 65, 84, 128, 89, 69, 82, 213, 89, 70, 69, 206, 89, 79, - 79, 128, 89, 87, 69, 128, 89, 87, 73, 128, 89, 87, 79, 128, 90, 69, 78, - 128, 90, 72, 73, 128, 90, 72, 79, 128, 90, 72, 85, 128, 90, 79, 84, 128, - 65, 77, 66, 193, 65, 82, 67, 200, 65, 88, 69, 128, 66, 65, 78, 203, 66, - 66, 65, 128, 66, 66, 69, 128, 66, 66, 73, 128, 66, 66, 79, 128, 66, 66, - 85, 128, 66, 66, 89, 128, 66, 67, 65, 196, 66, 69, 76, 204, 66, 69, 76, - 212, 66, 69, 84, 128, 66, 69, 84, 193, 66, 73, 71, 128, 66, 75, 65, 173, - 66, 87, 65, 128, 67, 65, 68, 193, 67, 65, 78, 199, 67, 65, 82, 197, 67, - 65, 84, 128, 67, 65, 88, 128, 67, 69, 69, 128, 67, 69, 78, 128, 67, 69, - 80, 128, 67, 69, 88, 128, 67, 72, 65, 196, 67, 72, 69, 206, 67, 73, 69, - 128, 67, 73, 73, 128, 67, 73, 84, 128, 67, 73, 88, 128, 67, 79, 80, 128, - 67, 79, 84, 128, 67, 79, 88, 128, 67, 85, 66, 197, 67, 85, 79, 128, 67, - 85, 82, 128, 67, 85, 84, 128, 67, 85, 88, 128, 67, 89, 65, 128, 67, 89, - 82, 128, 67, 89, 88, 128, 68, 65, 68, 128, 68, 65, 69, 199, 68, 65, 77, - 208, 68, 65, 82, 203, 68, 69, 75, 128, 68, 69, 76, 128, 68, 69, 90, 200, - 68, 76, 73, 128, 68, 76, 79, 128, 68, 76, 85, 128, 68, 82, 73, 204, 68, - 82, 89, 128, 68, 85, 76, 128, 68, 89, 79, 128, 68, 90, 73, 128, 68, 90, - 79, 128, 68, 90, 85, 128, 69, 73, 83, 128, 69, 75, 83, 128, 69, 78, 78, - 128, 69, 78, 79, 211, 69, 79, 72, 128, 69, 85, 82, 207, 69, 87, 69, 128, - 69, 88, 79, 128, 70, 65, 78, 128, 70, 65, 80, 128, 70, 65, 84, 128, 70, - 65, 88, 128, 70, 69, 69, 128, 70, 69, 69, 196, 70, 69, 72, 213, 70, 69, - 78, 199, 70, 69, 79, 200, 70, 70, 73, 128, 70, 70, 76, 128, 70, 73, 73, - 128, 70, 73, 76, 197, 70, 73, 76, 204, 70, 73, 80, 128, 70, 73, 84, 128, - 70, 73, 88, 128, 70, 79, 79, 128, 70, 79, 80, 128, 70, 79, 88, 128, 70, - 85, 80, 128, 70, 85, 84, 128, 70, 85, 88, 128, 70, 87, 65, 128, 70, 89, - 65, 128, 70, 89, 80, 128, 70, 89, 84, 128, 70, 89, 88, 128, 71, 65, 70, - 128, 71, 65, 82, 128, 71, 67, 65, 206, 71, 69, 66, 207, 71, 69, 84, 193, - 71, 72, 73, 128, 71, 72, 79, 128, 71, 72, 85, 128, 71, 72, 90, 128, 71, - 73, 80, 128, 71, 80, 65, 128, 71, 83, 85, 205, 71, 87, 65, 128, 71, 87, - 69, 128, 71, 87, 73, 128, 71, 89, 70, 213, 72, 65, 73, 210, 72, 69, 76, - 205, 72, 69, 78, 199, 72, 72, 69, 128, 72, 72, 73, 128, 72, 72, 79, 128, - 72, 72, 85, 128, 72, 76, 65, 128, 72, 76, 69, 128, 72, 76, 73, 128, 72, - 76, 79, 128, 72, 76, 85, 128, 72, 76, 89, 128, 72, 77, 65, 128, 72, 77, - 73, 128, 72, 77, 85, 128, 72, 77, 89, 128, 72, 78, 69, 128, 72, 78, 73, - 128, 72, 80, 65, 128, 72, 87, 85, 128, 72, 88, 65, 128, 72, 88, 69, 128, - 72, 88, 73, 128, 72, 88, 79, 128, 73, 45, 65, 128, 73, 45, 79, 128, 73, - 79, 82, 128, 74, 65, 65, 128, 74, 65, 82, 128, 74, 69, 72, 128, 74, 69, - 82, 128, 74, 73, 65, 128, 74, 74, 65, 128, 74, 74, 69, 128, 74, 87, 65, - 128, 75, 65, 72, 128, 75, 65, 73, 128, 75, 65, 80, 128, 75, 65, 85, 206, - 75, 65, 88, 128, 75, 69, 80, 128, 75, 69, 88, 128, 75, 69, 89, 128, 75, - 72, 73, 128, 75, 72, 90, 128, 75, 73, 69, 128, 75, 73, 72, 128, 75, 73, - 73, 128, 75, 73, 80, 128, 75, 73, 88, 128, 75, 75, 65, 128, 75, 75, 69, - 128, 75, 75, 73, 128, 75, 75, 79, 128, 75, 75, 85, 128, 75, 79, 72, 128, - 75, 79, 80, 128, 75, 79, 84, 128, 75, 79, 88, 128, 75, 80, 65, 128, 75, - 82, 65, 128, 75, 85, 79, 128, 75, 85, 80, 128, 75, 85, 82, 128, 75, 85, - 84, 128, 75, 85, 88, 128, 75, 88, 65, 128, 75, 88, 69, 128, 75, 88, 73, - 128, 75, 88, 79, 128, 75, 88, 85, 128, 76, 65, 71, 213, 76, 65, 83, 212, - 76, 65, 90, 217, 76, 69, 79, 128, 76, 72, 65, 199, 76, 73, 68, 128, 76, - 73, 73, 128, 76, 73, 78, 203, 76, 73, 82, 193, 76, 79, 71, 128, 76, 79, - 71, 210, 76, 79, 84, 128, 76, 89, 89, 128, 77, 65, 83, 213, 77, 65, 89, - 128, 77, 67, 72, 213, 77, 68, 85, 206, 77, 69, 84, 193, 77, 69, 88, 128, - 77, 71, 65, 128, 77, 71, 69, 128, 77, 71, 85, 128, 77, 72, 90, 128, 77, - 73, 73, 128, 77, 73, 76, 128, 77, 73, 76, 204, 77, 73, 77, 128, 77, 79, - 76, 128, 77, 80, 65, 128, 77, 89, 65, 128, 77, 89, 84, 128, 78, 65, 71, - 128, 78, 65, 79, 211, 78, 66, 65, 128, 78, 66, 73, 128, 78, 66, 79, 128, - 78, 66, 85, 128, 78, 66, 89, 128, 78, 68, 69, 128, 78, 69, 78, 128, 78, - 69, 84, 128, 78, 69, 88, 212, 78, 71, 71, 128, 78, 74, 73, 128, 78, 74, - 79, 128, 78, 74, 85, 128, 78, 74, 89, 128, 78, 78, 71, 128, 78, 78, 79, - 128, 78, 82, 65, 128, 78, 82, 69, 128, 78, 82, 79, 128, 78, 82, 85, 128, - 78, 82, 89, 128, 78, 85, 76, 204, 78, 85, 80, 128, 78, 85, 82, 128, 78, - 85, 88, 128, 78, 89, 69, 128, 78, 90, 65, 128, 78, 90, 69, 128, 78, 90, - 73, 128, 78, 90, 85, 128, 78, 90, 89, 128, 79, 45, 69, 128, 80, 65, 80, - 128, 80, 65, 84, 128, 80, 65, 88, 128, 80, 72, 85, 128, 80, 73, 69, 128, - 80, 73, 71, 128, 80, 73, 80, 128, 80, 73, 84, 128, 80, 73, 88, 128, 80, - 76, 65, 128, 80, 79, 80, 128, 80, 79, 88, 128, 80, 80, 77, 128, 80, 85, - 79, 128, 80, 85, 80, 128, 80, 85, 82, 128, 80, 85, 88, 128, 80, 89, 80, - 128, 80, 89, 82, 128, 80, 89, 88, 128, 81, 65, 76, 193, 81, 65, 81, 128, - 81, 65, 85, 128, 81, 69, 69, 128, 81, 72, 65, 128, 81, 72, 69, 128, 81, - 72, 73, 128, 81, 72, 79, 128, 81, 72, 85, 128, 81, 73, 69, 128, 81, 73, - 80, 128, 81, 73, 84, 128, 81, 73, 88, 128, 81, 79, 70, 128, 81, 79, 79, - 128, 81, 79, 80, 128, 81, 79, 88, 128, 81, 85, 65, 128, 81, 85, 69, 128, - 81, 85, 73, 128, 81, 85, 75, 128, 81, 85, 80, 128, 81, 85, 82, 128, 81, - 85, 84, 128, 81, 85, 86, 128, 81, 85, 88, 128, 81, 87, 65, 128, 81, 87, - 69, 128, 81, 87, 73, 128, 81, 89, 80, 128, 81, 89, 82, 128, 81, 89, 84, - 128, 81, 89, 88, 128, 82, 65, 68, 128, 82, 65, 77, 211, 82, 69, 73, 196, - 82, 73, 80, 128, 82, 74, 69, 128, 82, 74, 69, 211, 82, 79, 79, 128, 82, - 82, 69, 128, 82, 82, 79, 128, 82, 82, 85, 128, 82, 82, 89, 128, 82, 85, + 79, 80, 128, 78, 85, 82, 88, 128, 78, 85, 85, 78, 128, 78, 89, 65, 65, + 128, 78, 89, 67, 65, 128, 78, 89, 69, 69, 128, 78, 89, 69, 72, 128, 78, + 89, 73, 69, 128, 78, 89, 73, 84, 128, 78, 89, 73, 88, 128, 78, 89, 79, + 65, 128, 78, 89, 79, 84, 128, 78, 89, 79, 88, 128, 78, 89, 85, 79, 128, + 78, 89, 85, 80, 128, 78, 89, 85, 84, 128, 78, 89, 85, 88, 128, 78, 89, + 87, 65, 128, 78, 90, 65, 80, 128, 78, 90, 65, 84, 128, 78, 90, 65, 88, + 128, 78, 90, 69, 88, 128, 78, 90, 73, 69, 128, 78, 90, 73, 80, 128, 78, + 90, 73, 84, 128, 78, 90, 73, 88, 128, 78, 90, 79, 80, 128, 78, 90, 79, + 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 82, 128, 78, 90, 85, 88, 128, + 78, 90, 89, 80, 128, 78, 90, 89, 82, 128, 78, 90, 89, 84, 128, 78, 90, + 89, 88, 128, 79, 45, 69, 79, 128, 79, 45, 89, 69, 128, 79, 78, 83, 85, + 128, 79, 79, 77, 85, 128, 79, 79, 90, 69, 128, 79, 85, 78, 67, 197, 80, + 65, 65, 73, 128, 80, 65, 68, 77, 193, 80, 65, 82, 65, 128, 80, 69, 65, + 67, 197, 80, 69, 69, 80, 128, 80, 69, 78, 78, 217, 80, 69, 83, 79, 128, + 80, 72, 65, 65, 128, 80, 72, 65, 78, 128, 80, 72, 69, 69, 128, 80, 72, + 79, 65, 128, 80, 72, 87, 65, 128, 80, 73, 67, 75, 128, 80, 73, 69, 80, + 128, 80, 73, 69, 88, 128, 80, 73, 75, 79, 128, 80, 76, 79, 87, 128, 80, + 82, 65, 77, 128, 80, 82, 73, 78, 212, 80, 85, 79, 80, 128, 80, 85, 79, + 88, 128, 80, 85, 82, 88, 128, 80, 87, 69, 69, 128, 80, 89, 82, 88, 128, + 81, 65, 65, 70, 128, 81, 65, 65, 73, 128, 81, 65, 80, 72, 128, 81, 72, + 65, 65, 128, 81, 72, 69, 69, 128, 81, 72, 87, 65, 128, 81, 72, 87, 69, + 128, 81, 72, 87, 73, 128, 81, 73, 69, 80, 128, 81, 73, 69, 84, 128, 81, + 73, 69, 88, 128, 81, 79, 80, 65, 128, 81, 85, 79, 80, 128, 81, 85, 79, + 84, 128, 81, 85, 79, 88, 128, 81, 85, 82, 88, 128, 81, 85, 85, 86, 128, + 81, 87, 65, 65, 128, 81, 87, 69, 69, 128, 81, 89, 65, 65, 128, 81, 89, + 69, 69, 128, 81, 89, 82, 88, 128, 82, 65, 65, 73, 128, 82, 65, 73, 68, + 207, 82, 65, 78, 71, 197, 82, 69, 77, 85, 128, 82, 73, 67, 69, 128, 82, + 73, 69, 76, 128, 82, 73, 82, 65, 128, 82, 79, 65, 82, 128, 82, 82, 65, + 88, 128, 82, 82, 69, 72, 128, 82, 82, 69, 80, 128, 82, 82, 69, 84, 128, + 82, 82, 69, 88, 128, 82, 82, 79, 80, 128, 82, 82, 79, 84, 128, 82, 82, + 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 80, 128, 82, 82, 85, 82, + 128, 82, 82, 85, 84, 128, 82, 82, 85, 88, 128, 82, 82, 89, 80, 128, 82, + 82, 89, 82, 128, 82, 82, 89, 84, 128, 82, 82, 89, 88, 128, 82, 85, 73, + 83, 128, 82, 85, 76, 69, 128, 82, 85, 79, 80, 128, 82, 85, 83, 73, 128, + 83, 65, 45, 73, 128, 83, 65, 65, 73, 128, 83, 65, 68, 69, 128, 83, 65, + 73, 76, 128, 83, 65, 76, 65, 128, 83, 65, 76, 65, 205, 83, 66, 82, 85, + 204, 83, 67, 87, 65, 128, 83, 68, 79, 78, 199, 83, 72, 65, 80, 128, 83, + 72, 65, 88, 128, 83, 72, 69, 80, 128, 83, 72, 69, 84, 128, 83, 72, 69, + 88, 128, 83, 72, 73, 73, 128, 83, 72, 73, 77, 193, 83, 72, 79, 65, 128, + 83, 72, 79, 79, 128, 83, 72, 79, 84, 128, 83, 72, 79, 88, 128, 83, 72, + 85, 79, 128, 83, 72, 85, 80, 128, 83, 72, 85, 84, 128, 83, 72, 85, 88, + 128, 83, 72, 89, 80, 128, 83, 72, 89, 82, 128, 83, 72, 89, 84, 128, 83, + 72, 89, 88, 128, 83, 73, 71, 69, 204, 83, 73, 88, 84, 217, 83, 75, 73, + 78, 128, 83, 75, 85, 76, 204, 83, 75, 87, 65, 128, 83, 78, 65, 75, 197, + 83, 80, 79, 84, 128, 83, 80, 87, 65, 128, 83, 83, 65, 65, 128, 83, 83, + 65, 80, 128, 83, 83, 65, 84, 128, 83, 83, 65, 88, 128, 83, 83, 69, 69, + 128, 83, 83, 69, 80, 128, 83, 83, 69, 88, 128, 83, 83, 73, 69, 128, 83, + 83, 73, 80, 128, 83, 83, 73, 84, 128, 83, 83, 73, 88, 128, 83, 83, 79, + 80, 128, 83, 83, 79, 84, 128, 83, 83, 79, 88, 128, 83, 83, 85, 80, 128, + 83, 83, 85, 84, 128, 83, 83, 85, 88, 128, 83, 83, 89, 80, 128, 83, 83, + 89, 82, 128, 83, 83, 89, 84, 128, 83, 83, 89, 88, 128, 83, 84, 65, 78, + 128, 83, 84, 69, 80, 128, 83, 84, 73, 76, 197, 83, 84, 73, 76, 204, 83, + 84, 87, 65, 128, 83, 85, 79, 80, 128, 83, 85, 79, 88, 128, 83, 85, 82, + 88, 128, 83, 87, 85, 78, 199, 83, 90, 65, 65, 128, 83, 90, 69, 69, 128, + 83, 90, 87, 65, 128, 83, 90, 87, 71, 128, 84, 65, 65, 73, 128, 84, 65, + 75, 69, 128, 84, 65, 76, 76, 128, 84, 69, 45, 85, 128, 84, 69, 78, 84, + 128, 84, 69, 84, 72, 128, 84, 72, 69, 72, 128, 84, 72, 69, 77, 193, 84, + 72, 69, 89, 128, 84, 72, 79, 65, 128, 84, 72, 85, 82, 211, 84, 72, 87, + 65, 128, 84, 73, 69, 80, 128, 84, 73, 69, 88, 128, 84, 73, 71, 72, 212, + 84, 73, 78, 89, 128, 84, 73, 87, 65, 218, 84, 76, 69, 69, 128, 84, 76, + 72, 85, 128, 84, 79, 84, 65, 204, 84, 82, 65, 68, 197, 84, 82, 73, 79, + 206, 84, 83, 65, 65, 128, 84, 83, 65, 68, 201, 84, 83, 87, 65, 128, 84, + 84, 65, 65, 128, 84, 84, 69, 69, 128, 84, 84, 69, 72, 128, 84, 84, 72, + 69, 128, 84, 84, 72, 73, 128, 84, 84, 83, 65, 128, 84, 84, 83, 69, 128, + 84, 84, 83, 73, 128, 84, 84, 83, 79, 128, 84, 84, 83, 85, 128, 84, 85, + 79, 80, 128, 84, 85, 79, 84, 128, 84, 85, 79, 88, 128, 84, 85, 82, 88, + 128, 84, 90, 65, 65, 128, 84, 90, 69, 69, 128, 84, 90, 79, 65, 128, 85, + 45, 65, 69, 128, 85, 65, 84, 72, 128, 86, 73, 69, 80, 128, 86, 73, 69, + 84, 128, 86, 73, 69, 88, 128, 86, 85, 82, 88, 128, 86, 89, 82, 88, 128, + 87, 65, 69, 78, 128, 87, 65, 76, 76, 128, 87, 69, 76, 76, 128, 87, 69, + 83, 84, 128, 87, 79, 82, 75, 128, 87, 82, 65, 80, 128, 87, 85, 78, 74, + 207, 87, 85, 79, 80, 128, 87, 85, 79, 88, 128, 88, 73, 82, 79, 206, 88, + 89, 65, 65, 128, 88, 89, 69, 69, 128, 88, 89, 82, 88, 128, 89, 65, 45, + 79, 128, 89, 65, 65, 73, 128, 89, 65, 66, 72, 128, 89, 65, 67, 72, 128, + 89, 65, 68, 68, 128, 89, 65, 68, 72, 128, 89, 65, 71, 78, 128, 89, 65, + 72, 72, 128, 89, 65, 82, 82, 128, 89, 65, 83, 72, 128, 89, 65, 83, 83, + 128, 89, 65, 84, 72, 128, 89, 65, 84, 84, 128, 89, 65, 90, 90, 128, 89, + 69, 82, 65, 200, 89, 73, 45, 85, 128, 89, 73, 78, 71, 128, 89, 79, 45, + 79, 128, 89, 79, 77, 79, 128, 89, 79, 82, 73, 128, 89, 85, 45, 65, 128, + 89, 85, 45, 69, 128, 89, 85, 45, 85, 128, 89, 85, 65, 78, 128, 89, 85, + 68, 72, 128, 89, 85, 79, 84, 128, 89, 85, 82, 88, 128, 89, 89, 82, 88, + 128, 90, 65, 89, 73, 206, 90, 72, 65, 65, 128, 90, 72, 65, 80, 128, 90, + 72, 65, 84, 128, 90, 72, 65, 88, 128, 90, 72, 69, 80, 128, 90, 72, 69, + 84, 128, 90, 72, 69, 88, 128, 90, 72, 79, 80, 128, 90, 72, 79, 84, 128, + 90, 72, 79, 88, 128, 90, 72, 85, 79, 128, 90, 72, 85, 80, 128, 90, 72, + 85, 82, 128, 90, 72, 85, 84, 128, 90, 72, 85, 88, 128, 90, 72, 87, 65, + 128, 90, 72, 89, 80, 128, 90, 72, 89, 82, 128, 90, 72, 89, 84, 128, 90, + 72, 89, 88, 128, 90, 85, 79, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, + 80, 128, 90, 90, 65, 84, 128, 90, 90, 65, 88, 128, 90, 90, 69, 69, 128, + 90, 90, 69, 80, 128, 90, 90, 69, 88, 128, 90, 90, 73, 69, 128, 90, 90, + 73, 80, 128, 90, 90, 73, 84, 128, 90, 90, 73, 88, 128, 90, 90, 79, 80, + 128, 90, 90, 79, 88, 128, 90, 90, 85, 80, 128, 90, 90, 85, 82, 128, 90, + 90, 85, 88, 128, 90, 90, 89, 80, 128, 90, 90, 89, 82, 128, 90, 90, 89, + 84, 128, 90, 90, 89, 88, 128, 79, 80, 69, 206, 70, 85, 76, 204, 83, 69, + 69, 206, 73, 79, 84, 193, 69, 65, 83, 212, 70, 82, 79, 205, 84, 79, 68, + 207, 70, 73, 86, 197, 72, 79, 85, 210, 84, 69, 78, 128, 83, 73, 66, 197, + 70, 79, 85, 210, 79, 86, 69, 210, 72, 79, 82, 206, 81, 85, 65, 196, 68, + 65, 83, 200, 78, 69, 79, 128, 80, 72, 73, 128, 80, 83, 73, 128, 84, 72, + 69, 200, 75, 79, 77, 201, 82, 72, 79, 128, 89, 85, 83, 128, 71, 72, 65, + 128, 79, 88, 73, 193, 82, 79, 67, 128, 66, 72, 65, 128, 83, 65, 82, 193, + 84, 65, 67, 203, 84, 65, 85, 128, 68, 79, 69, 211, 74, 72, 65, 128, 82, + 82, 65, 128, 87, 73, 68, 197, 82, 68, 69, 204, 83, 72, 73, 206, 87, 65, + 86, 217, 90, 65, 73, 206, 68, 73, 71, 193, 83, 72, 79, 128, 65, 82, 67, + 128, 75, 65, 70, 128, 76, 69, 71, 128, 83, 84, 79, 208, 84, 65, 77, 128, + 89, 65, 78, 199, 68, 90, 69, 128, 71, 72, 69, 128, 71, 79, 65, 204, 71, + 84, 69, 210, 78, 85, 78, 128, 78, 89, 79, 128, 83, 84, 65, 210, 83, 85, + 78, 128, 84, 65, 73, 204, 87, 65, 86, 197, 87, 65, 87, 128, 87, 79, 82, + 196, 90, 69, 82, 207, 65, 80, 76, 201, 66, 69, 69, 200, 67, 76, 69, 198, + 68, 74, 69, 128, 68, 75, 65, 210, 68, 89, 69, 200, 68, 90, 65, 128, 69, + 73, 69, 128, 70, 69, 72, 128, 70, 73, 83, 200, 71, 65, 78, 128, 71, 85, + 69, 200, 72, 73, 69, 128, 75, 83, 73, 128, 76, 65, 77, 197, 76, 74, 69, + 128, 77, 69, 77, 128, 77, 71, 79, 128, 77, 85, 67, 200, 77, 87, 65, 128, + 78, 65, 77, 197, 78, 65, 82, 128, 78, 74, 69, 128, 78, 79, 87, 128, 78, + 87, 65, 128, 78, 89, 69, 200, 78, 89, 73, 128, 79, 79, 85, 128, 80, 69, + 69, 128, 82, 65, 65, 128, 84, 72, 69, 206, 84, 73, 67, 203, 84, 84, 69, + 200, 89, 79, 68, 128, 66, 65, 83, 197, 66, 69, 69, 128, 66, 79, 87, 128, + 66, 90, 72, 201, 67, 79, 87, 128, 68, 79, 78, 128, 70, 76, 65, 212, 70, + 82, 69, 197, 72, 65, 69, 128, 74, 73, 76, 128, 75, 69, 72, 128, 75, 72, + 73, 128, 75, 72, 79, 128, 75, 87, 69, 128, 75, 87, 73, 128, 76, 65, 83, + 128, 76, 79, 79, 128, 76, 87, 65, 128, 77, 69, 78, 128, 77, 87, 69, 128, + 77, 87, 73, 128, 78, 65, 65, 128, 78, 89, 73, 211, 80, 65, 82, 128, 80, + 69, 72, 128, 80, 72, 79, 128, 80, 87, 69, 128, 80, 87, 73, 128, 81, 65, + 65, 128, 81, 65, 82, 128, 82, 65, 69, 128, 82, 72, 65, 128, 83, 72, 79, + 197, 83, 72, 85, 128, 83, 83, 73, 128, 83, 83, 79, 128, 83, 83, 85, 128, + 84, 72, 65, 204, 84, 79, 79, 128, 84, 87, 69, 128, 86, 69, 69, 128, 86, + 73, 78, 128, 87, 65, 69, 128, 87, 65, 76, 203, 87, 69, 79, 128, 88, 65, + 78, 128, 88, 69, 72, 128, 89, 65, 75, 128, 89, 65, 84, 128, 89, 89, 65, + 128, 90, 69, 78, 128, 65, 76, 76, 201, 65, 89, 66, 128, 65, 90, 85, 128, + 66, 65, 65, 128, 66, 69, 72, 128, 66, 69, 78, 128, 66, 79, 76, 212, 66, + 87, 65, 128, 67, 73, 80, 128, 67, 76, 85, 194, 67, 79, 79, 128, 67, 85, + 80, 128, 67, 87, 69, 128, 67, 87, 73, 128, 67, 87, 79, 128, 67, 89, 80, + 128, 67, 89, 84, 128, 68, 68, 65, 204, 68, 68, 69, 128, 68, 68, 73, 128, + 68, 68, 85, 128, 68, 69, 73, 128, 68, 74, 65, 128, 68, 76, 65, 128, 68, + 79, 71, 128, 68, 82, 85, 205, 69, 87, 69, 128, 70, 65, 65, 128, 70, 69, + 69, 128, 70, 69, 73, 128, 70, 76, 89, 128, 70, 85, 82, 128, 70, 85, 83, + 193, 70, 87, 65, 128, 71, 65, 89, 128, 71, 71, 65, 128, 71, 71, 69, 128, + 71, 71, 73, 128, 71, 71, 79, 128, 71, 71, 85, 128, 71, 72, 79, 128, 71, + 73, 77, 128, 71, 74, 69, 128, 72, 65, 82, 196, 72, 77, 79, 128, 72, 78, + 65, 128, 73, 83, 79, 206, 74, 74, 73, 128, 74, 74, 79, 128, 74, 74, 85, + 128, 74, 74, 89, 128, 75, 65, 73, 128, 75, 69, 78, 128, 75, 72, 69, 128, + 75, 73, 84, 128, 75, 74, 69, 128, 75, 75, 65, 128, 75, 79, 79, 128, 75, + 86, 65, 128, 75, 87, 79, 128, 76, 65, 65, 128, 76, 87, 69, 128, 76, 87, + 73, 128, 76, 87, 79, 128, 77, 65, 65, 128, 77, 79, 79, 128, 77, 79, 79, + 206, 77, 80, 65, 128, 77, 87, 79, 128, 78, 69, 69, 128, 78, 71, 65, 211, + 78, 73, 66, 128, 78, 79, 79, 128, 78, 82, 65, 128, 78, 87, 69, 128, 78, + 89, 85, 128, 79, 72, 77, 128, 79, 73, 76, 128, 79, 75, 84, 207, 79, 78, + 78, 128, 79, 84, 85, 128, 80, 65, 65, 128, 80, 65, 82, 212, 80, 65, 84, + 200, 80, 72, 85, 210, 80, 79, 76, 201, 80, 79, 79, 128, 80, 85, 84, 128, + 80, 87, 79, 128, 80, 89, 84, 128, 81, 65, 73, 128, 81, 73, 73, 128, 81, + 79, 84, 128, 81, 85, 79, 128, 81, 85, 85, 128, 82, 71, 89, 193, 82, 78, + 65, 205, 82, 82, 69, 200, 82, 82, 79, 128, 83, 69, 72, 128, 83, 72, 65, + 196, 83, 72, 79, 199, 83, 72, 89, 128, 83, 73, 79, 211, 83, 74, 69, 128, + 83, 79, 79, 128, 83, 79, 85, 128, 83, 83, 69, 128, 83, 87, 69, 128, 83, + 87, 73, 128, 83, 87, 79, 128, 84, 65, 71, 128, 84, 65, 84, 128, 84, 65, + 86, 128, 84, 69, 84, 128, 84, 74, 69, 128, 84, 76, 65, 128, 84, 76, 73, + 128, 84, 76, 85, 128, 84, 79, 84, 128, 84, 82, 69, 197, 84, 84, 73, 128, + 84, 87, 73, 128, 85, 83, 69, 196, 86, 65, 86, 128, 86, 69, 80, 128, 86, + 69, 82, 217, 86, 69, 87, 128, 86, 79, 85, 128, 86, 85, 82, 128, 87, 65, + 85, 128, 88, 86, 65, 128, 89, 65, 74, 128, 89, 65, 81, 128, 89, 65, 90, + 128, 89, 69, 65, 210, 89, 69, 82, 213, 89, 70, 69, 206, 89, 79, 79, 128, + 89, 87, 69, 128, 89, 87, 73, 128, 89, 87, 79, 128, 90, 72, 73, 128, 90, + 72, 79, 128, 90, 72, 85, 128, 90, 79, 84, 128, 90, 90, 65, 128, 90, 90, + 69, 128, 90, 90, 73, 128, 90, 90, 85, 128, 65, 65, 89, 128, 65, 68, 65, + 203, 65, 77, 66, 193, 65, 82, 67, 200, 65, 84, 79, 205, 65, 85, 69, 128, + 65, 87, 69, 128, 65, 88, 69, 128, 65, 89, 69, 210, 66, 48, 48, 177, 66, + 48, 48, 178, 66, 48, 48, 179, 66, 48, 48, 180, 66, 48, 48, 181, 66, 48, + 48, 182, 66, 48, 48, 183, 66, 48, 48, 184, 66, 48, 48, 185, 66, 48, 49, + 176, 66, 48, 49, 177, 66, 48, 49, 178, 66, 48, 49, 179, 66, 48, 49, 180, + 66, 48, 49, 181, 66, 48, 49, 182, 66, 48, 49, 183, 66, 48, 50, 176, 66, + 48, 50, 177, 66, 48, 50, 179, 66, 48, 50, 180, 66, 48, 50, 181, 66, 48, + 50, 182, 66, 48, 50, 183, 66, 48, 50, 184, 66, 48, 50, 185, 66, 48, 51, + 176, 66, 48, 51, 177, 66, 48, 51, 178, 66, 48, 51, 179, 66, 48, 51, 182, + 66, 48, 51, 183, 66, 48, 51, 184, 66, 48, 51, 185, 66, 48, 52, 176, 66, + 48, 52, 177, 66, 48, 52, 178, 66, 48, 52, 179, 66, 48, 52, 180, 66, 48, + 52, 181, 66, 48, 52, 182, 66, 48, 52, 184, 66, 48, 53, 176, 66, 48, 53, + 177, 66, 48, 53, 178, 66, 48, 53, 179, 66, 48, 53, 180, 66, 48, 53, 181, + 66, 48, 53, 183, 66, 48, 53, 184, 66, 48, 53, 185, 66, 48, 54, 176, 66, + 48, 54, 177, 66, 48, 54, 178, 66, 48, 54, 181, 66, 48, 54, 182, 66, 48, + 54, 183, 66, 48, 54, 184, 66, 48, 54, 185, 66, 48, 55, 176, 66, 48, 55, + 177, 66, 48, 55, 178, 66, 48, 55, 179, 66, 48, 55, 180, 66, 48, 55, 181, + 66, 48, 55, 182, 66, 48, 55, 183, 66, 48, 55, 184, 66, 48, 56, 176, 66, + 48, 56, 177, 66, 48, 56, 181, 66, 48, 56, 183, 66, 48, 57, 176, 66, 48, + 57, 177, 66, 49, 48, 176, 66, 49, 48, 178, 66, 49, 48, 180, 66, 49, 48, + 181, 66, 49, 50, 176, 66, 49, 50, 177, 66, 49, 50, 178, 66, 49, 50, 179, + 66, 49, 50, 181, 66, 49, 50, 183, 66, 49, 50, 184, 66, 49, 51, 176, 66, + 49, 51, 177, 66, 49, 51, 179, 66, 49, 51, 181, 66, 49, 52, 176, 66, 49, + 52, 177, 66, 49, 52, 181, 66, 49, 53, 177, 66, 49, 53, 182, 66, 49, 53, + 185, 66, 49, 54, 178, 66, 49, 54, 179, 66, 49, 55, 179, 66, 49, 55, 182, + 66, 49, 57, 177, 66, 50, 50, 176, 66, 50, 50, 181, 66, 50, 51, 176, 66, + 50, 51, 177, 66, 50, 51, 179, 66, 50, 52, 176, 66, 50, 52, 177, 66, 50, + 52, 178, 66, 50, 52, 179, 66, 50, 52, 183, 66, 50, 53, 180, 66, 65, 78, + 203, 66, 66, 65, 128, 66, 66, 69, 128, 66, 66, 73, 128, 66, 66, 79, 128, + 66, 66, 85, 128, 66, 66, 89, 128, 66, 67, 65, 196, 66, 69, 76, 204, 66, + 69, 76, 212, 66, 69, 84, 128, 66, 69, 84, 193, 66, 72, 79, 128, 66, 73, + 66, 128, 66, 73, 71, 128, 66, 75, 65, 173, 66, 79, 65, 128, 66, 87, 69, + 128, 66, 87, 73, 128, 66, 88, 71, 128, 67, 65, 68, 193, 67, 65, 78, 199, + 67, 65, 82, 197, 67, 65, 84, 128, 67, 65, 88, 128, 67, 67, 65, 128, 67, + 67, 69, 128, 67, 67, 73, 128, 67, 67, 79, 128, 67, 67, 85, 128, 67, 69, + 68, 201, 67, 69, 78, 128, 67, 69, 80, 128, 67, 69, 88, 128, 67, 72, 65, + 196, 67, 72, 69, 206, 67, 73, 69, 128, 67, 73, 73, 128, 67, 73, 84, 128, + 67, 73, 88, 128, 67, 79, 65, 128, 67, 79, 80, 128, 67, 79, 84, 128, 67, + 79, 88, 128, 67, 85, 66, 197, 67, 85, 79, 128, 67, 85, 82, 128, 67, 85, + 84, 128, 67, 85, 88, 128, 67, 89, 65, 128, 67, 89, 82, 128, 67, 89, 88, + 128, 68, 65, 68, 128, 68, 65, 69, 199, 68, 65, 77, 208, 68, 65, 82, 203, + 68, 65, 84, 197, 68, 69, 75, 128, 68, 69, 90, 200, 68, 76, 73, 128, 68, + 76, 79, 128, 68, 76, 85, 128, 68, 82, 73, 204, 68, 82, 89, 128, 68, 85, + 76, 128, 68, 87, 69, 128, 68, 87, 79, 128, 68, 89, 79, 128, 68, 90, 73, + 128, 68, 90, 79, 128, 68, 90, 85, 128, 69, 71, 71, 128, 69, 73, 83, 128, + 69, 75, 83, 128, 69, 78, 78, 128, 69, 78, 79, 211, 69, 79, 72, 128, 69, + 82, 71, 128, 69, 82, 82, 128, 69, 85, 82, 207, 69, 88, 79, 128, 70, 65, + 78, 128, 70, 65, 80, 128, 70, 65, 88, 128, 70, 69, 69, 196, 70, 69, 72, + 213, 70, 69, 78, 199, 70, 69, 79, 200, 70, 70, 73, 128, 70, 70, 76, 128, + 70, 73, 73, 128, 70, 73, 76, 197, 70, 73, 76, 204, 70, 73, 80, 128, 70, + 73, 84, 128, 70, 73, 88, 128, 70, 79, 79, 128, 70, 79, 80, 128, 70, 79, + 88, 128, 70, 85, 80, 128, 70, 85, 84, 128, 70, 85, 88, 128, 70, 87, 69, + 128, 70, 87, 73, 128, 70, 89, 65, 128, 70, 89, 80, 128, 70, 89, 84, 128, + 70, 89, 88, 128, 71, 65, 70, 128, 71, 65, 71, 128, 71, 65, 76, 128, 71, + 65, 82, 128, 71, 67, 65, 206, 71, 69, 66, 207, 71, 69, 84, 193, 71, 72, + 73, 128, 71, 72, 85, 128, 71, 72, 90, 128, 71, 73, 80, 128, 71, 79, 65, + 128, 71, 80, 65, 128, 71, 83, 85, 205, 71, 89, 65, 128, 71, 89, 69, 128, + 71, 89, 70, 213, 71, 89, 73, 128, 71, 89, 79, 128, 71, 89, 85, 128, 72, + 69, 76, 205, 72, 69, 78, 199, 72, 72, 69, 128, 72, 72, 73, 128, 72, 72, + 79, 128, 72, 72, 85, 128, 72, 76, 65, 128, 72, 76, 69, 128, 72, 76, 73, + 128, 72, 76, 79, 128, 72, 76, 85, 128, 72, 76, 89, 128, 72, 77, 73, 128, + 72, 77, 85, 128, 72, 77, 89, 128, 72, 78, 69, 128, 72, 78, 73, 128, 72, + 80, 65, 128, 72, 87, 85, 128, 72, 88, 65, 128, 72, 88, 69, 128, 72, 88, + 73, 128, 72, 88, 79, 128, 72, 90, 71, 128, 72, 90, 84, 128, 72, 90, 87, + 128, 72, 90, 90, 128, 73, 45, 65, 128, 73, 45, 79, 128, 73, 79, 82, 128, + 74, 65, 65, 128, 74, 65, 82, 128, 74, 69, 72, 128, 74, 69, 82, 128, 74, + 72, 79, 128, 74, 73, 65, 128, 74, 74, 65, 128, 74, 74, 69, 128, 74, 79, + 65, 128, 74, 79, 89, 128, 74, 87, 65, 128, 75, 65, 72, 128, 75, 65, 80, + 128, 75, 65, 85, 206, 75, 65, 88, 128, 75, 69, 80, 128, 75, 69, 88, 128, + 75, 69, 89, 128, 75, 72, 90, 128, 75, 73, 69, 128, 75, 73, 72, 128, 75, + 73, 73, 128, 75, 73, 80, 128, 75, 73, 88, 128, 75, 75, 69, 128, 75, 75, + 73, 128, 75, 75, 79, 128, 75, 75, 85, 128, 75, 79, 65, 128, 75, 79, 72, + 128, 75, 79, 80, 128, 75, 79, 84, 128, 75, 79, 88, 128, 75, 80, 65, 128, + 75, 82, 65, 128, 75, 85, 79, 128, 75, 85, 80, 128, 75, 85, 82, 128, 75, + 85, 84, 128, 75, 85, 88, 128, 75, 88, 65, 128, 75, 88, 69, 128, 75, 88, + 73, 128, 75, 88, 79, 128, 75, 88, 85, 128, 75, 89, 65, 128, 75, 89, 69, + 128, 75, 89, 73, 128, 75, 89, 79, 128, 75, 89, 85, 128, 76, 65, 69, 128, + 76, 65, 71, 213, 76, 65, 83, 212, 76, 65, 90, 217, 76, 69, 79, 128, 76, + 72, 65, 199, 76, 73, 68, 128, 76, 73, 73, 128, 76, 73, 78, 203, 76, 73, + 82, 193, 76, 79, 65, 128, 76, 79, 71, 128, 76, 79, 71, 210, 76, 79, 84, + 128, 76, 89, 89, 128, 77, 65, 83, 213, 77, 65, 89, 128, 77, 67, 72, 213, + 77, 68, 85, 206, 77, 69, 84, 193, 77, 69, 88, 128, 77, 71, 65, 128, 77, + 71, 69, 128, 77, 71, 85, 128, 77, 72, 90, 128, 77, 73, 73, 128, 77, 73, + 76, 128, 77, 73, 76, 204, 77, 73, 77, 128, 77, 79, 65, 128, 77, 79, 76, + 128, 77, 89, 65, 128, 77, 89, 84, 128, 78, 65, 71, 128, 78, 65, 79, 211, + 78, 66, 65, 128, 78, 66, 73, 128, 78, 66, 79, 128, 78, 66, 85, 128, 78, + 66, 89, 128, 78, 68, 69, 128, 78, 69, 78, 128, 78, 69, 84, 128, 78, 69, + 88, 212, 78, 71, 71, 128, 78, 74, 73, 128, 78, 74, 79, 128, 78, 74, 85, + 128, 78, 74, 89, 128, 78, 78, 71, 128, 78, 78, 79, 128, 78, 79, 65, 128, + 78, 82, 69, 128, 78, 82, 79, 128, 78, 82, 85, 128, 78, 82, 89, 128, 78, + 85, 76, 204, 78, 85, 80, 128, 78, 85, 82, 128, 78, 85, 88, 128, 78, 89, + 69, 128, 78, 90, 65, 128, 78, 90, 73, 128, 78, 90, 85, 128, 78, 90, 89, + 128, 79, 45, 69, 128, 79, 65, 75, 128, 79, 65, 89, 128, 79, 66, 79, 204, + 80, 65, 80, 128, 80, 65, 84, 128, 80, 65, 88, 128, 80, 72, 85, 128, 80, + 73, 69, 128, 80, 73, 71, 128, 80, 73, 80, 128, 80, 73, 84, 128, 80, 73, + 88, 128, 80, 76, 65, 128, 80, 79, 65, 128, 80, 79, 80, 128, 80, 79, 88, + 128, 80, 80, 77, 128, 80, 85, 50, 128, 80, 85, 79, 128, 80, 85, 80, 128, + 80, 85, 82, 128, 80, 85, 88, 128, 80, 89, 80, 128, 80, 89, 82, 128, 80, + 89, 88, 128, 81, 65, 76, 193, 81, 65, 81, 128, 81, 65, 85, 128, 81, 69, + 69, 128, 81, 72, 65, 128, 81, 72, 69, 128, 81, 72, 73, 128, 81, 72, 79, + 128, 81, 72, 85, 128, 81, 73, 69, 128, 81, 73, 80, 128, 81, 73, 84, 128, + 81, 73, 88, 128, 81, 79, 65, 128, 81, 79, 70, 128, 81, 79, 79, 128, 81, + 79, 80, 128, 81, 79, 88, 128, 81, 85, 65, 128, 81, 85, 69, 128, 81, 85, + 73, 128, 81, 85, 75, 128, 81, 85, 80, 128, 81, 85, 82, 128, 81, 85, 84, + 128, 81, 85, 86, 128, 81, 85, 88, 128, 81, 87, 65, 128, 81, 87, 69, 128, + 81, 87, 73, 128, 81, 89, 65, 128, 81, 89, 69, 128, 81, 89, 73, 128, 81, + 89, 79, 128, 81, 89, 80, 128, 81, 89, 82, 128, 81, 89, 84, 128, 81, 89, + 85, 128, 81, 89, 88, 128, 82, 65, 50, 128, 82, 65, 51, 128, 82, 65, 68, + 128, 82, 65, 68, 201, 82, 65, 73, 206, 82, 65, 77, 211, 82, 69, 73, 196, + 82, 73, 80, 128, 82, 74, 69, 128, 82, 74, 69, 211, 82, 79, 65, 128, 82, + 79, 79, 128, 82, 82, 69, 128, 82, 82, 85, 128, 82, 82, 89, 128, 82, 85, 65, 128, 82, 85, 78, 128, 82, 87, 65, 128, 82, 89, 65, 128, 82, 89, 89, 128, 83, 45, 87, 128, 83, 65, 68, 128, 83, 65, 89, 128, 83, 66, 85, 194, - 83, 71, 65, 194, 83, 71, 79, 210, 83, 71, 82, 193, 83, 72, 79, 199, 83, - 73, 73, 128, 83, 73, 78, 197, 83, 75, 87, 128, 83, 78, 65, 208, 83, 83, - 69, 128, 83, 83, 85, 128, 83, 83, 89, 128, 83, 84, 69, 205, 83, 85, 65, - 128, 83, 85, 79, 128, 83, 85, 82, 128, 83, 90, 65, 128, 83, 90, 69, 128, - 83, 90, 73, 128, 83, 90, 79, 128, 83, 90, 85, 128, 84, 65, 79, 128, 84, - 65, 80, 128, 84, 65, 80, 197, 84, 65, 87, 128, 84, 65, 88, 128, 84, 69, - 83, 200, 84, 69, 84, 128, 84, 69, 84, 200, 84, 69, 88, 128, 84, 72, 69, - 211, 84, 72, 73, 206, 84, 72, 90, 128, 84, 73, 73, 128, 84, 73, 80, 128, - 84, 73, 84, 128, 84, 73, 88, 128, 84, 76, 86, 128, 84, 79, 84, 128, 84, - 79, 88, 128, 84, 82, 73, 128, 84, 83, 86, 128, 84, 84, 72, 128, 84, 84, - 85, 128, 84, 85, 79, 128, 84, 85, 80, 128, 84, 85, 82, 128, 84, 85, 84, - 128, 84, 85, 88, 128, 84, 89, 65, 128, 84, 89, 69, 128, 84, 89, 73, 128, - 84, 89, 79, 128, 84, 90, 65, 128, 84, 90, 69, 128, 84, 90, 73, 128, 84, - 90, 79, 128, 84, 90, 85, 128, 85, 69, 69, 128, 85, 78, 68, 207, 85, 78, - 73, 212, 85, 79, 78, 128, 85, 82, 85, 218, 86, 65, 65, 128, 86, 65, 80, - 128, 86, 65, 84, 128, 86, 65, 88, 128, 86, 69, 72, 128, 86, 69, 88, 128, - 86, 73, 69, 128, 86, 73, 80, 128, 86, 73, 84, 128, 86, 73, 88, 128, 86, - 79, 73, 196, 86, 79, 80, 128, 86, 79, 84, 128, 86, 79, 88, 128, 86, 85, - 80, 128, 86, 85, 84, 128, 86, 85, 88, 128, 86, 87, 65, 128, 86, 89, 80, - 128, 86, 89, 82, 128, 86, 89, 84, 128, 86, 89, 88, 128, 87, 65, 80, 128, - 87, 65, 84, 128, 87, 65, 88, 128, 87, 69, 80, 128, 87, 69, 88, 128, 87, - 79, 80, 128, 87, 79, 82, 196, 87, 79, 88, 128, 87, 85, 79, 128, 87, 89, - 78, 206, 88, 79, 82, 128, 88, 89, 80, 128, 88, 89, 82, 128, 88, 89, 84, - 128, 88, 89, 88, 128, 89, 65, 75, 128, 89, 73, 73, 128, 89, 85, 68, 200, - 89, 85, 82, 128, 89, 89, 80, 128, 89, 89, 82, 128, 89, 89, 84, 128, 89, - 89, 88, 128, 90, 65, 72, 128, 90, 72, 89, 128, 90, 76, 65, 128, 90, 82, - 65, 128, 90, 85, 84, 128, 90, 90, 65, 128, 90, 90, 69, 128, 90, 90, 73, - 128, 90, 90, 85, 128, 90, 90, 89, 128, 75, 65, 198, 68, 65, 217, 66, 69, - 200, 68, 65, 196, 83, 65, 196, 70, 69, 200, 81, 65, 198, 84, 65, 200, 69, - 78, 196, 82, 82, 128, 65, 82, 195, 78, 79, 210, 77, 65, 201, 79, 67, 210, - 87, 65, 215, 67, 72, 197, 82, 72, 207, 84, 72, 197, 89, 73, 199, 65, 82, - 205, 66, 85, 212, 67, 79, 128, 67, 85, 205, 78, 69, 207, 71, 65, 198, 75, - 72, 207, 77, 71, 207, 90, 65, 200, 66, 73, 199, 68, 73, 197, 71, 72, 197, - 80, 72, 201, 86, 79, 128, 90, 72, 197, 80, 72, 207, 80, 85, 128, 67, 72, - 207, 77, 69, 206, 78, 69, 212, 80, 69, 200, 81, 73, 128, 84, 69, 206, 84, - 73, 208, 86, 69, 200, 89, 79, 196, 66, 69, 212, 67, 73, 128, 68, 89, 207, - 70, 79, 128, 72, 65, 193, 75, 65, 201, 78, 65, 199, 81, 79, 128, 81, 85, - 128, 82, 65, 196, 83, 73, 206, 83, 73, 216, 86, 65, 214, 86, 73, 128, 45, - 85, 205, 67, 72, 201, 67, 85, 128, 67, 89, 128, 68, 85, 204, 68, 90, 128, - 69, 88, 207, 71, 82, 213, 71, 85, 199, 72, 86, 128, 73, 74, 128, 74, 69, - 200, 74, 79, 212, 75, 69, 217, 75, 71, 128, 75, 75, 128, 76, 74, 128, 77, - 73, 199, 78, 74, 128, 78, 86, 128, 78, 89, 201, 79, 72, 205, 80, 65, 215, - 81, 69, 128, 81, 79, 207, 82, 68, 207, 83, 85, 206, 87, 79, 206, 89, 69, - 206, 65, 78, 207, 66, 65, 199, 66, 69, 206, 66, 79, 215, 66, 81, 128, 67, - 77, 128, 67, 85, 212, 68, 76, 128, 68, 86, 128, 69, 67, 200, 70, 77, 128, - 70, 89, 128, 71, 66, 128, 71, 86, 128, 71, 89, 128, 72, 75, 128, 72, 79, - 212, 72, 80, 128, 73, 83, 211, 73, 85, 128, 73, 89, 128, 75, 66, 128, 75, - 73, 208, 75, 76, 128, 75, 77, 128, 75, 84, 128, 75, 86, 128, 76, 67, 197, - 76, 67, 201, 76, 69, 203, 76, 72, 128, 76, 78, 128, 76, 88, 128, 77, 66, - 128, 77, 69, 205, 77, 71, 128, 77, 72, 128, 77, 73, 196, 77, 76, 128, 77, - 77, 128, 77, 83, 128, 77, 86, 128, 77, 87, 128, 78, 65, 193, 78, 69, 215, - 78, 70, 128, 78, 71, 207, 78, 72, 128, 78, 77, 128, 78, 85, 206, 78, 87, - 128, 78, 89, 196, 79, 86, 128, 80, 67, 128, 80, 69, 211, 80, 70, 128, 80, - 73, 201, 80, 79, 208, 80, 82, 128, 80, 86, 128, 80, 87, 128, 81, 79, 198, - 81, 89, 128, 82, 73, 206, 82, 74, 197, 82, 85, 194, 83, 78, 193, 83, 79, - 198, 83, 82, 128, 83, 87, 128, 84, 65, 214, 84, 69, 197, 84, 69, 212, 84, - 73, 210, 84, 82, 128, 86, 69, 197, 86, 69, 215, 87, 66, 128, 87, 86, 128, - 88, 89, 128, 89, 65, 210, 89, 78, 128, 89, 86, 128, 90, 76, 193, 66, 217, - 77, 213, 65, 197, 89, 213, 65, 213, 68, 218, 90, 197, 75, 205, 67, 205, - 75, 213, 77, 205, 76, 218, 77, 194, 77, 207, 77, 214, 77, 215, 80, 207, - 84, 195, 202, 209, + 83, 71, 65, 194, 83, 71, 79, 210, 83, 71, 82, 193, 83, 73, 73, 128, 83, + 73, 78, 197, 83, 75, 87, 128, 83, 78, 65, 208, 83, 79, 65, 128, 83, 79, + 87, 128, 83, 83, 89, 128, 83, 85, 65, 128, 83, 85, 79, 128, 83, 85, 82, + 128, 83, 90, 65, 128, 83, 90, 69, 128, 83, 90, 73, 128, 83, 90, 79, 128, + 83, 90, 85, 128, 84, 65, 50, 128, 84, 65, 79, 128, 84, 65, 80, 128, 84, + 65, 80, 197, 84, 65, 87, 128, 84, 65, 88, 128, 84, 69, 83, 200, 84, 69, + 84, 200, 84, 69, 88, 128, 84, 72, 69, 211, 84, 72, 73, 206, 84, 72, 90, + 128, 84, 73, 73, 128, 84, 73, 80, 128, 84, 73, 84, 128, 84, 73, 88, 128, + 84, 76, 86, 128, 84, 79, 65, 128, 84, 79, 88, 128, 84, 82, 73, 128, 84, + 83, 86, 128, 84, 84, 72, 128, 84, 84, 85, 128, 84, 85, 79, 128, 84, 85, + 80, 128, 84, 85, 82, 128, 84, 85, 84, 128, 84, 85, 88, 128, 84, 89, 65, + 128, 84, 89, 69, 128, 84, 89, 73, 128, 84, 89, 79, 128, 84, 90, 65, 128, + 84, 90, 69, 128, 84, 90, 73, 128, 84, 90, 79, 128, 84, 90, 85, 128, 85, + 69, 69, 128, 85, 69, 89, 128, 85, 78, 68, 207, 85, 78, 73, 212, 85, 82, + 85, 218, 86, 65, 65, 128, 86, 65, 80, 128, 86, 65, 84, 128, 86, 65, 88, + 128, 86, 69, 72, 128, 86, 69, 88, 128, 86, 73, 69, 128, 86, 73, 80, 128, + 86, 73, 84, 128, 86, 73, 88, 128, 86, 79, 73, 196, 86, 79, 80, 128, 86, + 79, 84, 128, 86, 79, 87, 128, 86, 79, 88, 128, 86, 85, 80, 128, 86, 85, + 84, 128, 86, 85, 88, 128, 86, 87, 65, 128, 86, 89, 80, 128, 86, 89, 82, + 128, 86, 89, 84, 128, 86, 89, 88, 128, 87, 65, 80, 128, 87, 65, 84, 128, + 87, 65, 88, 128, 87, 69, 80, 128, 87, 69, 88, 128, 87, 79, 65, 128, 87, + 79, 69, 128, 87, 79, 80, 128, 87, 79, 82, 203, 87, 79, 88, 128, 87, 85, + 79, 128, 87, 89, 78, 206, 88, 79, 65, 128, 88, 79, 82, 128, 88, 89, 65, + 128, 88, 89, 69, 128, 88, 89, 73, 128, 88, 89, 79, 128, 88, 89, 80, 128, + 88, 89, 82, 128, 88, 89, 84, 128, 88, 89, 85, 128, 88, 89, 88, 128, 89, + 65, 66, 128, 89, 65, 68, 128, 89, 65, 70, 128, 89, 65, 71, 128, 89, 65, + 77, 128, 89, 65, 80, 128, 89, 65, 82, 128, 89, 65, 86, 128, 89, 65, 87, + 128, 89, 65, 89, 128, 89, 69, 65, 128, 89, 69, 87, 128, 89, 69, 89, 128, + 89, 73, 73, 128, 89, 85, 68, 200, 89, 85, 82, 128, 89, 89, 80, 128, 89, + 89, 82, 128, 89, 89, 84, 128, 89, 89, 88, 128, 90, 65, 72, 128, 90, 72, + 89, 128, 90, 76, 65, 128, 90, 79, 79, 128, 90, 82, 65, 128, 90, 85, 84, + 128, 90, 90, 89, 128, 75, 65, 198, 66, 69, 200, 68, 65, 217, 84, 72, 197, + 70, 69, 200, 68, 65, 196, 83, 65, 196, 69, 78, 196, 81, 65, 198, 84, 65, + 200, 65, 82, 195, 78, 79, 210, 76, 69, 203, 77, 65, 201, 79, 67, 210, 66, + 73, 199, 82, 72, 207, 84, 69, 206, 87, 65, 215, 89, 73, 199, 67, 72, 197, + 77, 71, 207, 65, 82, 205, 66, 85, 212, 67, 85, 205, 71, 72, 197, 78, 69, + 207, 80, 85, 128, 84, 73, 208, 71, 65, 198, 75, 72, 207, 90, 65, 200, 68, + 73, 197, 80, 72, 201, 90, 72, 197, 80, 72, 207, 81, 73, 128, 81, 85, 128, + 83, 73, 216, 67, 72, 207, 77, 69, 206, 77, 73, 196, 78, 69, 212, 80, 69, + 200, 81, 79, 128, 86, 69, 200, 89, 79, 196, 66, 65, 199, 66, 69, 212, 68, + 89, 207, 70, 79, 128, 72, 65, 193, 75, 65, 201, 78, 65, 199, 81, 69, 128, + 82, 65, 196, 83, 73, 206, 86, 65, 214, 45, 85, 205, 67, 72, 201, 68, 65, + 208, 68, 85, 204, 68, 90, 128, 69, 88, 207, 71, 82, 213, 71, 85, 199, 72, + 79, 212, 72, 80, 128, 72, 86, 128, 73, 74, 128, 73, 85, 128, 73, 89, 128, + 74, 69, 200, 74, 79, 212, 75, 69, 217, 75, 71, 128, 75, 75, 128, 76, 74, + 128, 77, 73, 199, 78, 74, 128, 78, 85, 206, 78, 86, 128, 78, 89, 201, 79, + 72, 205, 80, 65, 215, 81, 79, 207, 82, 68, 207, 83, 85, 206, 83, 87, 128, + 87, 79, 206, 89, 69, 206, 89, 85, 211, 65, 78, 207, 66, 69, 206, 66, 79, + 215, 66, 81, 128, 67, 77, 128, 67, 85, 212, 68, 76, 128, 68, 77, 128, 68, + 82, 217, 68, 86, 128, 69, 67, 200, 70, 77, 128, 70, 89, 128, 71, 66, 128, + 71, 86, 128, 71, 89, 128, 72, 71, 128, 72, 75, 128, 73, 83, 211, 75, 66, + 128, 75, 73, 208, 75, 76, 128, 75, 77, 128, 75, 84, 128, 75, 86, 128, 76, + 65, 215, 76, 67, 197, 76, 67, 201, 76, 72, 128, 76, 78, 128, 76, 88, 128, + 77, 66, 128, 77, 69, 205, 77, 71, 128, 77, 72, 128, 77, 76, 128, 77, 77, + 128, 77, 83, 128, 77, 86, 128, 77, 87, 128, 78, 65, 193, 78, 70, 128, 78, + 71, 207, 78, 72, 128, 78, 77, 128, 78, 87, 128, 78, 89, 196, 79, 86, 128, + 80, 67, 128, 80, 69, 211, 80, 70, 128, 80, 79, 208, 80, 82, 128, 80, 86, + 128, 80, 87, 128, 81, 79, 198, 81, 89, 128, 82, 73, 206, 82, 74, 197, 82, + 85, 194, 83, 78, 193, 83, 79, 198, 83, 82, 128, 84, 65, 213, 84, 65, 214, + 84, 69, 197, 84, 69, 212, 84, 73, 210, 84, 82, 128, 86, 69, 197, 86, 69, + 215, 87, 66, 128, 87, 86, 128, 88, 89, 128, 89, 65, 210, 89, 86, 128, 90, + 76, 193, 66, 217, 77, 213, 65, 197, 89, 213, 68, 218, 90, 197, 75, 205, + 67, 205, 68, 205, 75, 213, 77, 205, 68, 194, 76, 218, 77, 194, 77, 207, + 77, 214, 77, 215, 80, 207, 81, 208, 84, 195, 202, 209, }; static unsigned short lexicon_offset[] = { - 0, 0, 6, 10, 15, 23, 30, 32, 35, 47, 52, 58, 71, 76, 82, 90, 99, 103, - 111, 114, 121, 127, 133, 140, 150, 158, 162, 167, 172, 179, 184, 190, - 198, 205, 212, 221, 229, 233, 238, 243, 251, 257, 264, 270, 274, 281, - 287, 294, 300, 309, 312, 315, 324, 330, 335, 338, 346, 349, 354, 359, - 364, 372, 378, 387, 397, 399, 404, 415, 419, 432, 298, 434, 440, 450, - 459, 464, 466, 469, 467, 476, 480, 485, 488, 493, 499, 501, 504, 509, - 517, 525, 529, 536, 543, 552, 560, 569, 573, 581, 590, 596, 605, 610, - 618, 625, 632, 638, 643, 651, 660, 667, 668, 676, 336, 683, 691, 637, - 695, 701, 706, 250, 712, 725, 729, 736, 739, 749, 754, 763, 772, 777, - 786, 791, 798, 801, 805, 813, 815, 819, 821, 826, 828, 837, 840, 845, 22, - 849, 853, 863, 534, 871, 876, 886, 893, 900, 906, 657, 913, 918, 928, - 884, 934, 939, 945, 950, 955, 957, 961, 968, 972, 977, 979, 74, 981, 986, - 991, 997, 1003, 1009, 1013, 1018, 1024, 1030, 1032, 352, 1035, 1041, - 1050, 1052, 1054, 1057, 674, 1062, 540, 1065, 1071, 539, 1073, 31, 1060, - 1085, 1087, 285, 1089, 1091, 1093, 402, 1095, 1104, 1109, 1112, 1114, - 1121, 1135, 1141, 1145, 1149, 1154, 1157, 1161, 1166, 1175, 1184, 100, - 1187, 1196, 1204, 1207, 1214, 1218, 1222, 1227, 1233, 1239, 1263, 1285, - 1307, 1329, 1350, 1371, 1391, 1411, 1430, 1449, 1468, 1487, 1506, 1525, - 1544, 1563, 1581, 1599, 1617, 1635, 1653, 1671, 1689, 1707, 1725, 1743, - 1761, 1778, 1795, 1812, 1829, 1846, 1863, 1880, 1897, 1914, 1931, 1948, - 1964, 1980, 1996, 2012, 2028, 2044, 2060, 2076, 2092, 2108, 2124, 2140, - 2156, 2172, 2188, 2204, 2220, 2236, 2252, 2268, 2284, 2300, 2316, 2332, - 2348, 2364, 2380, 2396, 2412, 2428, 2444, 2460, 2476, 2492, 2508, 2524, - 2540, 2556, 2572, 2588, 2604, 2620, 2636, 2652, 2668, 2684, 2700, 2716, - 2732, 2748, 2764, 2780, 2796, 2812, 2828, 2844, 2860, 2876, 2892, 2908, - 2924, 2940, 2956, 2972, 2988, 3004, 3020, 3036, 3052, 3068, 3084, 3100, - 3116, 3132, 3148, 3164, 3180, 3196, 3212, 3228, 3244, 3260, 3276, 3292, - 3308, 3324, 3340, 3356, 3372, 3388, 3404, 3420, 3436, 3452, 3468, 3484, - 3500, 3516, 3532, 3548, 3564, 3580, 3596, 3612, 3628, 3644, 3660, 3676, - 3692, 3708, 3724, 3740, 3756, 3772, 3788, 3804, 3820, 3836, 3852, 3868, - 3884, 3900, 3916, 3932, 3948, 3964, 3980, 3996, 4012, 4028, 4044, 4060, - 4076, 4092, 4108, 4124, 4140, 4156, 4172, 4188, 4204, 4220, 4236, 4252, - 4268, 4284, 4300, 4316, 4332, 4348, 4364, 4380, 4396, 4412, 4428, 4444, - 4460, 4476, 4492, 4508, 4524, 4540, 4556, 4572, 4588, 4604, 4620, 4636, - 4652, 4668, 4684, 4700, 4716, 4732, 4748, 4764, 4780, 4796, 4812, 4828, - 4844, 4860, 4876, 4892, 4908, 4924, 4940, 4956, 4972, 4988, 5004, 5020, - 5036, 5052, 5068, 5084, 5100, 5116, 5132, 5148, 5164, 5180, 5196, 5212, - 5228, 5244, 5260, 5276, 5292, 5308, 5324, 5340, 5356, 5372, 5388, 5404, - 5420, 5436, 5452, 5468, 5484, 5500, 5516, 5532, 5548, 5564, 5580, 5596, - 5612, 5628, 5644, 5660, 5676, 5692, 5708, 5724, 5740, 5756, 5772, 5788, - 5804, 5820, 5836, 5852, 5868, 5884, 5900, 5916, 5932, 5948, 5964, 5980, - 5996, 6012, 6028, 6044, 6060, 6076, 6092, 6108, 6124, 6140, 6156, 6172, - 6188, 6204, 6220, 6236, 6252, 6268, 6284, 6300, 6316, 6332, 6348, 6364, - 6380, 6396, 6412, 6428, 6444, 6460, 6476, 6492, 6508, 6524, 6540, 6556, - 6572, 6588, 6604, 6620, 6636, 6652, 6668, 6684, 6700, 6716, 6732, 6748, - 6764, 6780, 6796, 6812, 6828, 6844, 6860, 6876, 6892, 6908, 6924, 6940, - 6956, 6972, 6988, 7004, 7020, 7036, 7052, 7068, 7084, 7100, 7116, 7132, - 7148, 7164, 7180, 7196, 7212, 7228, 7244, 7260, 7276, 7292, 7308, 7324, - 7340, 7356, 7372, 7388, 7404, 7420, 7436, 7452, 7468, 7484, 7500, 7516, - 7532, 7548, 7564, 7580, 7596, 7612, 7628, 7644, 7660, 7676, 7692, 7708, - 7724, 7740, 7756, 7772, 7788, 7804, 7820, 7836, 7852, 7868, 7884, 7900, - 7916, 7932, 7948, 7964, 7980, 7996, 8012, 8028, 8044, 8060, 8076, 8092, - 8108, 8124, 8140, 8156, 8172, 8188, 8204, 8220, 8236, 8252, 8268, 8284, - 8300, 8316, 8332, 8348, 8364, 8380, 8396, 8412, 8428, 8444, 8460, 8476, - 8492, 8508, 8524, 8540, 8556, 8572, 8588, 8604, 8620, 8636, 8652, 8668, - 8684, 8700, 8716, 8732, 8748, 8764, 8780, 8796, 8812, 8828, 8844, 8860, - 8876, 8892, 8908, 8924, 8940, 8956, 8972, 8988, 9004, 9020, 9036, 9052, - 9068, 9084, 9100, 9116, 9132, 9148, 9164, 9180, 9196, 9212, 9228, 9244, - 9260, 9276, 9292, 9308, 9324, 9340, 9356, 9372, 9388, 9404, 9420, 9436, - 9452, 9468, 9484, 9500, 9516, 9532, 9548, 9564, 9580, 9596, 9612, 9628, - 9644, 9660, 9676, 9692, 9708, 9724, 9740, 9756, 9772, 9788, 9804, 9820, - 9836, 9852, 9868, 9884, 9900, 9916, 9932, 9948, 9964, 9980, 9996, 10012, - 10028, 10044, 10060, 10076, 10092, 10108, 10124, 10140, 10156, 10172, - 10188, 10204, 10220, 10236, 10252, 10268, 10284, 10300, 10316, 10332, - 10348, 10364, 10380, 10396, 10412, 10428, 10444, 10460, 10476, 10492, - 10508, 10524, 10540, 10556, 10572, 10588, 10604, 10620, 10636, 10652, - 10668, 10684, 10700, 10716, 10732, 10748, 10764, 10780, 10796, 10812, - 10828, 10844, 10860, 10876, 10892, 10908, 10923, 10938, 10953, 10968, - 10983, 10998, 11013, 11028, 11043, 11058, 11073, 11088, 11103, 11118, - 11133, 11148, 11163, 11178, 11193, 11208, 11223, 11238, 11253, 11268, - 11283, 11298, 11313, 11328, 11343, 11358, 11373, 11388, 11403, 11418, - 11433, 11448, 11463, 11478, 11493, 11508, 11523, 11538, 11553, 11568, - 11583, 11598, 11613, 11628, 11643, 11658, 11673, 11688, 11703, 11718, - 11733, 11748, 11763, 11778, 11793, 11808, 11823, 11838, 11853, 11868, - 11883, 11898, 11913, 11928, 11943, 11958, 11973, 11988, 12003, 12018, - 12033, 12048, 12063, 12078, 12093, 12108, 12123, 12138, 12153, 12168, - 12183, 12198, 12213, 12228, 12243, 12258, 12273, 12288, 12303, 12318, - 12333, 12348, 12363, 12378, 12393, 12408, 12423, 12438, 12453, 12468, - 12483, 12498, 12513, 12528, 12543, 12558, 12573, 12588, 12603, 12618, - 12633, 12648, 12663, 12678, 12693, 12708, 12723, 12738, 12753, 12768, - 12783, 12798, 12813, 12828, 12843, 12858, 12873, 12888, 12903, 12918, - 12933, 12948, 12963, 12978, 12993, 13008, 13023, 13038, 13053, 13068, - 13083, 13098, 13113, 13128, 13143, 13158, 13173, 13188, 13203, 13218, - 13233, 13248, 13263, 13278, 13293, 13308, 13323, 13338, 13353, 13368, - 13383, 13398, 13413, 13428, 13443, 13458, 13473, 13488, 13503, 13518, - 13533, 13548, 13563, 13578, 13593, 13608, 13623, 13638, 13653, 13668, - 13683, 13698, 13713, 13728, 13743, 13758, 13773, 13788, 13803, 13818, - 13833, 13848, 13863, 13878, 13893, 13908, 13923, 13938, 13953, 13968, - 13983, 13998, 14013, 14028, 14043, 14058, 14073, 14088, 14103, 14118, - 14133, 14148, 14163, 14178, 14193, 14208, 14223, 14238, 14253, 14268, - 14283, 14298, 14313, 14328, 14343, 14358, 14373, 14388, 14403, 14418, - 14433, 14448, 14463, 14478, 14493, 14508, 14523, 14538, 14553, 14568, - 14583, 14598, 14613, 14628, 14643, 14658, 14673, 14688, 14703, 14718, - 14733, 14748, 14763, 14778, 14793, 14808, 14823, 14838, 14853, 14868, - 14883, 14898, 14913, 14928, 14943, 14958, 14973, 14988, 15003, 15018, - 15033, 15048, 15063, 15078, 15093, 15108, 15123, 15138, 15153, 15168, - 15183, 15198, 15213, 15228, 15243, 15258, 15273, 15288, 15303, 15318, - 15333, 15348, 15363, 15378, 15393, 15408, 15423, 15438, 15453, 15468, - 15483, 15498, 15513, 15528, 15543, 15558, 15573, 15588, 15603, 15618, - 15633, 15648, 15663, 15678, 15693, 15708, 15723, 15738, 15753, 15768, - 15783, 15798, 15813, 15828, 15843, 15858, 15873, 15888, 15903, 15918, - 15933, 15948, 15963, 15978, 15993, 16008, 16023, 16038, 16053, 16068, - 16083, 16098, 16113, 16128, 16143, 16158, 16173, 16188, 16203, 16218, - 16233, 16248, 16263, 16278, 16293, 16308, 16323, 16338, 16353, 16368, - 16383, 16398, 16413, 16428, 16443, 16458, 16473, 16488, 16503, 16518, - 16533, 16548, 16563, 16578, 16593, 16608, 16623, 16638, 16653, 16668, - 16682, 16696, 16710, 16724, 1397, 16738, 16752, 16766, 16780, 16794, - 16808, 16822, 16836, 16850, 16864, 16878, 16892, 16906, 16920, 16934, - 16948, 16962, 16976, 16990, 17004, 17018, 17032, 1798, 17046, 17060, - 17074, 17088, 17102, 17116, 17130, 17144, 17158, 17172, 17186, 17200, - 17214, 17228, 17242, 17256, 17270, 17283, 17296, 17309, 17322, 17335, - 17348, 17361, 17374, 17387, 17400, 17413, 17426, 17439, 17452, 17465, - 17478, 17491, 17504, 17517, 1748, 17530, 17543, 17556, 17569, 17582, - 17595, 17608, 17621, 17634, 17647, 17660, 17673, 17686, 17699, 17712, - 17725, 17738, 17751, 17764, 17777, 17790, 17803, 17816, 17829, 17842, - 17855, 17868, 1512, 17881, 17894, 17907, 17920, 17933, 17946, 17959, - 17972, 17985, 17998, 18011, 18024, 18037, 18050, 18063, 18076, 18088, - 18100, 18112, 18124, 18136, 18148, 18160, 18172, 18184, 18196, 18208, - 18220, 18232, 18244, 18256, 1659, 18268, 18280, 18292, 1605, 18304, - 18316, 18328, 18340, 18352, 18364, 1494, 1587, 18376, 1623, 18388, 18400, - 18412, 18424, 18436, 18448, 18460, 18472, 18484, 18496, 18508, 18520, - 18532, 18544, 18556, 18568, 18580, 18592, 18604, 18616, 18628, 18640, - 18652, 18664, 18676, 18688, 18700, 18712, 18724, 18736, 18748, 18760, - 18772, 18784, 18796, 18808, 18820, 18832, 18844, 18856, 18868, 18880, - 18892, 18904, 18916, 18928, 18940, 18952, 18964, 18976, 18988, 19000, - 19012, 19024, 19036, 19048, 19060, 19072, 19084, 19096, 19108, 19120, - 19132, 19144, 19156, 19168, 19180, 19192, 19204, 19216, 19228, 19240, - 19252, 19264, 19276, 19288, 1379, 19300, 19312, 1713, 19324, 19336, - 19348, 19360, 19372, 19384, 19396, 19408, 19420, 19432, 19444, 19456, - 19468, 19480, 19492, 19504, 19516, 19528, 19540, 19552, 19564, 19576, - 19588, 19600, 19612, 19624, 19636, 19647, 19658, 19669, 19680, 19691, - 19702, 19713, 19724, 19735, 19746, 19757, 19768, 19779, 19790, 19801, - 19812, 19823, 1784, 19834, 19845, 19856, 19867, 19878, 19889, 19900, - 1869, 1296, 19911, 1419, 19922, 19933, 19944, 19955, 19966, 19977, 1886, - 19988, 19999, 20010, 20021, 20032, 20043, 20054, 20065, 20076, 20087, - 20098, 20109, 1852, 20120, 20131, 20142, 20153, 20164, 20175, 20186, - 20197, 20208, 20219, 20230, 20241, 20252, 20263, 20274, 20285, 20296, - 20307, 20318, 20329, 20340, 20351, 20362, 20373, 20384, 20395, 20406, - 20417, 20428, 20439, 20450, 20461, 20472, 20483, 20494, 20505, 20516, - 20527, 20538, 20549, 20560, 20571, 20582, 20593, 20604, 20615, 20626, - 20637, 20648, 20659, 20670, 20681, 20692, 20703, 20714, 20725, 20736, - 20747, 20758, 20769, 20780, 20791, 20802, 20813, 20824, 20835, 20846, - 20857, 20868, 20879, 20890, 20901, 20912, 20923, 20934, 20945, 20956, - 20967, 20978, 20989, 21000, 21011, 21022, 21033, 21044, 21055, 21066, - 21077, 21088, 21099, 21110, 21121, 21132, 21143, 16937, 21154, 21165, - 21176, 21187, 21198, 21209, 21220, 21231, 21242, 21253, 21264, 21275, - 21286, 21297, 21308, 21319, 21330, 21341, 21352, 21363, 21374, 21385, - 21396, 21407, 21418, 21429, 21440, 21451, 21462, 21473, 21484, 21495, - 21506, 21517, 21528, 21539, 21550, 21561, 21572, 21583, 21594, 21605, - 21615, 21625, 21635, 21645, 21655, 21665, 21675, 21685, 21695, 21705, - 21715, 21725, 21735, 21745, 21755, 21765, 21775, 21785, 21795, 18090, - 21805, 21815, 21825, 21835, 21845, 21855, 21865, 1361, 21875, 21885, - 21895, 21905, 21915, 21925, 21935, 21945, 21955, 21965, 21975, 21985, - 21995, 22005, 22015, 22025, 22035, 22045, 22055, 22065, 22075, 22085, - 22095, 22105, 22115, 22125, 22135, 22145, 22155, 22165, 22175, 22185, - 22195, 22205, 22215, 22225, 22235, 22245, 22255, 22265, 22275, 22285, - 22295, 17676, 22305, 18630, 22315, 22325, 22335, 22345, 22355, 22365, - 22375, 22385, 22395, 22405, 22415, 22425, 22435, 22445, 22455, 22465, - 22475, 22485, 22495, 22505, 22515, 22525, 22535, 22545, 22555, 22565, - 22575, 22585, 22595, 22605, 22615, 22625, 22635, 22645, 22655, 22665, - 22675, 22685, 22695, 22705, 22715, 22725, 22735, 22745, 22755, 22765, - 22775, 22785, 22795, 22805, 22815, 22825, 22835, 22845, 22855, 22865, - 22875, 22885, 22895, 22905, 22915, 22925, 22935, 22945, 22955, 22965, - 22975, 22985, 22995, 23005, 23015, 23025, 23035, 23045, 23055, 23065, - 23075, 23085, 23095, 23105, 23115, 23125, 23135, 23145, 23155, 23165, - 23175, 23185, 23195, 23205, 23215, 23225, 23235, 23245, 23255, 23265, - 23275, 23285, 23295, 23305, 23315, 23325, 23335, 23345, 23355, 23365, - 23375, 23385, 23395, 23405, 23415, 23425, 23435, 23445, 23455, 23465, - 23475, 23485, 23495, 1938, 23505, 23515, 23525, 23535, 23545, 23555, - 23565, 23575, 23585, 23595, 23605, 23615, 23625, 23635, 23645, 23655, - 23665, 23675, 23685, 23695, 23705, 23715, 23725, 23735, 23745, 23755, - 23765, 23774, 23783, 23792, 23801, 23810, 23819, 23828, 23837, 23846, - 23855, 23864, 17287, 23873, 23882, 23891, 23900, 23909, 23918, 23927, - 23936, 23945, 23954, 23963, 23972, 23981, 23990, 23999, 24008, 24017, - 24026, 24035, 24044, 24053, 24062, 24071, 24080, 24089, 24098, 24107, - 24116, 24125, 24134, 24143, 24152, 24161, 24170, 24179, 24188, 24197, - 19792, 24206, 24215, 24224, 24233, 24242, 24251, 24260, 24269, 24278, - 24287, 24296, 24305, 24314, 24323, 24332, 24341, 24350, 24359, 24368, - 24377, 24386, 24395, 24404, 24413, 24422, 19979, 24431, 24440, 24449, - 24458, 24467, 24476, 24485, 24494, 24503, 24512, 24521, 24530, 1276, - 24539, 24548, 24557, 24566, 24575, 24584, 24593, 24602, 24611, 24620, - 24629, 24638, 24647, 24656, 24665, 24674, 24683, 24692, 24701, 24710, - 24719, 24728, 24737, 24746, 24755, 24764, 24773, 24782, 24791, 24800, - 24809, 24818, 24827, 24836, 24845, 24854, 24863, 24872, 24881, 24890, - 24899, 24908, 24917, 24926, 24935, 24944, 24953, 24962, 24971, 24980, - 24989, 24998, 25007, 25016, 25025, 25034, 25043, 25052, 25061, 25070, - 25079, 25088, 25097, 25106, 25115, 25124, 25133, 25142, 25151, 25160, - 25169, 25178, 25187, 25196, 25205, 25214, 25223, 25232, 25241, 25250, - 25259, 25268, 25277, 25286, 25295, 25304, 25313, 25322, 25331, 25340, - 25349, 25358, 25367, 25376, 25385, 25394, 25403, 25412, 25421, 25430, - 25439, 25448, 25457, 25466, 25475, 25484, 25493, 25502, 25511, 25520, - 25529, 25538, 25547, 25556, 25565, 25574, 25583, 25592, 25601, 25610, - 25619, 25628, 25637, 25646, 25655, 25664, 25673, 25682, 25691, 25700, - 10755, 25709, 25718, 25727, 25736, 25745, 25754, 25763, 25772, 25781, - 25790, 25799, 25808, 25817, 25826, 25835, 25844, 25853, 25862, 25871, - 25880, 25889, 25898, 25907, 25916, 25925, 25934, 25943, 25952, 25961, - 25970, 25979, 25988, 25997, 26006, 26015, 26024, 26033, 26042, 26051, - 26060, 26069, 26078, 26087, 26096, 26105, 1837, 26114, 26123, 26132, - 26141, 26150, 26159, 26168, 26177, 26186, 26195, 26204, 26213, 26222, - 26231, 26240, 26249, 26258, 26267, 26276, 26285, 26294, 26303, 26312, - 26321, 26330, 26339, 26348, 26357, 26366, 26375, 26383, 26391, 26399, - 16674, 26407, 26415, 26423, 26431, 26439, 26447, 26455, 26463, 26471, - 21617, 26479, 26487, 26495, 26503, 26511, 26519, 26527, 26535, 22007, - 26543, 26551, 26559, 26567, 26575, 26583, 26591, 26599, 17795, 26607, - 26615, 26623, 26631, 26639, 16702, 26647, 1460, 26655, 26663, 2036, - 17899, 26671, 1956, 26679, 26687, 26695, 26703, 16758, 26711, 26719, - 26727, 18368, 26735, 26743, 26751, 17314, 26759, 26767, 26775, 26783, - 24144, 26791, 26799, 26807, 26815, 26823, 26831, 26839, 26847, 26855, - 26863, 26871, 1804, 26879, 26887, 26895, 26903, 26911, 26919, 26927, - 26935, 26943, 26951, 26959, 26967, 26975, 26983, 26991, 26999, 27007, - 27015, 27023, 27031, 27039, 27047, 27055, 27063, 27071, 27079, 27087, - 27095, 27103, 27111, 27119, 27127, 27135, 27143, 27151, 27159, 27167, - 21847, 27175, 27183, 27191, 27199, 27207, 27215, 27223, 27231, 27239, - 27247, 27255, 24531, 27263, 27271, 27279, 27287, 27295, 27303, 27311, - 27319, 27327, 27335, 27343, 27351, 27359, 27367, 27375, 27383, 27391, - 27399, 27407, 27415, 27423, 27431, 27439, 27447, 27455, 27463, 27471, - 27479, 27487, 27495, 27503, 27511, 27519, 27527, 27535, 27543, 27551, - 27559, 27567, 27575, 21157, 27583, 27591, 27599, 27607, 27615, 27623, - 27631, 27639, 27647, 27655, 27663, 27671, 27679, 27687, 27695, 27703, - 27711, 27719, 27727, 27735, 27743, 27751, 27759, 27767, 27775, 27783, - 27791, 27799, 27807, 27815, 27823, 27831, 27839, 27847, 27855, 27863, - 27871, 24567, 27879, 27887, 27895, 27903, 27911, 27919, 27927, 27935, - 27943, 27951, 27959, 27967, 21256, 27975, 27983, 1923, 27991, 27999, - 28007, 28015, 28023, 28031, 28039, 28047, 28055, 28063, 28071, 28079, - 28087, 28095, 28103, 28111, 28119, 28127, 28135, 28143, 28151, 28159, - 2004, 28167, 28175, 10852, 28183, 28191, 28199, 28207, 28215, 28223, - 19196, 28231, 28239, 28247, 28255, 28263, 28271, 28279, 28287, 28295, - 28303, 28311, 28319, 28327, 28335, 28343, 28351, 28359, 28367, 28375, - 28383, 28391, 28399, 28407, 28415, 28423, 28431, 28439, 19352, 28447, - 28455, 28463, 28471, 28479, 28487, 28495, 28503, 28511, 28519, 1699, - 28527, 28535, 28543, 28551, 28559, 28567, 28575, 28583, 28591, 28599, - 28607, 28615, 28623, 28631, 28639, 28647, 28655, 28663, 28671, 28679, - 28687, 28695, 28703, 28711, 28719, 28727, 28735, 28743, 28751, 28759, - 28767, 28775, 28783, 28791, 28799, 28807, 28815, 28823, 23187, 28831, - 28839, 28847, 28855, 28863, 28871, 28879, 28887, 28894, 28901, 18285, - 28908, 28915, 28922, 28929, 28936, 28943, 28950, 28957, 28964, 28971, - 28978, 28985, 28992, 28999, 29006, 11036, 29013, 29020, 29027, 29034, - 29041, 29048, 29055, 29062, 29069, 29076, 29083, 29090, 29097, 29104, - 29111, 29118, 29125, 29132, 29139, 29146, 29153, 29160, 29167, 1499, - 29174, 1592, 29181, 29188, 29195, 29202, 29209, 29216, 29223, 29230, - 29237, 29244, 29251, 29258, 29265, 29272, 1343, 29279, 29286, 29293, - 29300, 29307, 29314, 29321, 29328, 29335, 29342, 29349, 29356, 29363, - 29370, 29377, 29384, 29391, 29398, 21246, 29405, 29412, 29419, 29426, - 29433, 29440, 29447, 29454, 29461, 29468, 29475, 29482, 29489, 29496, - 29503, 29510, 29517, 29524, 29531, 29538, 29545, 29552, 29559, 29566, - 29573, 23956, 29580, 29587, 29594, 29601, 29608, 29615, 29622, 29629, - 29636, 29643, 29650, 29657, 29664, 29671, 29678, 29685, 29692, 29699, - 29706, 29713, 29720, 29727, 29734, 29741, 29748, 29755, 29762, 29769, - 29776, 29783, 29790, 29797, 29804, 29811, 29818, 29825, 29832, 29839, - 29846, 29853, 29860, 29867, 29874, 29881, 29888, 29895, 29902, 29909, - 29916, 29923, 29930, 29937, 29944, 29951, 29958, 29965, 29972, 24145, - 29979, 29986, 29993, 30000, 30007, 30014, 30021, 30028, 1736, 30035, - 30042, 30049, 30056, 30063, 30070, 30077, 30084, 30091, 30098, 30105, - 30112, 30119, 30126, 30133, 30140, 30147, 30154, 30161, 30168, 30175, - 30182, 30189, 30196, 30203, 30210, 30217, 30224, 30231, 30238, 30245, - 30252, 30259, 30266, 30273, 30280, 30287, 30294, 30301, 30308, 24568, - 30315, 30322, 30329, 30336, 30343, 30350, 30357, 30364, 30371, 30378, - 30385, 30392, 30399, 30406, 30413, 30420, 30427, 30434, 30441, 30448, - 30455, 21191, 30462, 30469, 30476, 30483, 30490, 30497, 30504, 30511, - 30518, 27312, 30525, 30532, 30539, 30546, 30553, 30560, 30567, 30574, - 30581, 30588, 30595, 30602, 30609, 30616, 30623, 30630, 30637, 30644, - 30651, 30658, 30665, 30672, 30679, 30686, 30693, 30700, 30707, 30714, - 30721, 30728, 30735, 30742, 30749, 30756, 30763, 30770, 30777, 23348, - 30784, 30791, 30798, 30805, 30812, 28376, 30819, 30826, 30833, 30840, - 30847, 30854, 30861, 30868, 30875, 30882, 30889, 30896, 26464, 30903, - 30910, 30917, 30924, 30931, 30938, 30945, 30952, 30959, 30966, 30973, - 30980, 30987, 30994, 31001, 18141, 31008, 31015, 31022, 31029, 31036, - 31043, 31050, 31057, 31064, 31071, 24460, 31078, 31085, 31092, 31099, - 19065, 31106, 31113, 31120, 31127, 31134, 31141, 31148, 31155, 31162, - 31169, 31176, 31183, 31190, 31197, 31204, 31211, 31218, 31225, 31232, - 31239, 31246, 24586, 31253, 31260, 23188, 31267, 31274, 31281, 31288, - 31295, 31302, 31309, 31316, 31323, 31330, 31337, 31344, 31351, 31357, - 31363, 31369, 31375, 31381, 31387, 31393, 31399, 31405, 22259, 31411, - 31417, 31423, 31429, 31435, 27049, 31441, 31447, 31345, 31453, 31459, - 21739, 31465, 31471, 31477, 31483, 31489, 31495, 31501, 31507, 31513, - 21819, 31519, 31525, 31531, 31537, 31543, 31549, 31555, 31561, 31567, - 31573, 31579, 31585, 31591, 31597, 31603, 31609, 31615, 31621, 31627, - 17576, 22329, 31633, 31639, 31645, 19905, 1169, 31651, 17381, 31657, - 31663, 1301, 31669, 31675, 1538, 18562, 31681, 31687, 16732, 31693, - 18454, 31699, 1405, 17082, 31705, 31711, 31717, 18166, 31723, 31729, - 31735, 31741, 31747, 31753, 26793, 31759, 31765, 31771, 31777, 21699, - 31783, 31789, 31795, 31801, 31807, 31813, 31819, 31825, 10962, 1044, - 31831, 31837, 31843, 31849, 17563, 31855, 31861, 31867, 31873, 31879, - 31885, 31891, 31897, 31903, 31909, 31915, 31921, 31927, 31933, 31939, - 31945, 31951, 31957, 31963, 31969, 31975, 31981, 31987, 31993, 31999, - 32005, 32011, 32017, 32023, 32029, 32035, 21489, 32041, 32047, 32053, - 32059, 32065, 32071, 32077, 32083, 32089, 32095, 24596, 32101, 32107, - 32113, 32119, 32125, 18466, 32131, 32137, 32143, 32149, 32155, 32161, - 32167, 32173, 32179, 32185, 32191, 32197, 32203, 32209, 32215, 32221, - 32227, 21909, 32233, 32239, 32245, 32251, 32257, 32263, 32269, 32275, - 32281, 32287, 32293, 32299, 32305, 32311, 32317, 32323, 32329, 32335, - 32341, 32347, 32353, 32359, 32365, 32371, 32377, 32383, 32389, 32395, - 32401, 32407, 26216, 32413, 32419, 32425, 32431, 32437, 32443, 32449, - 32455, 32461, 32467, 32473, 32479, 32485, 32491, 32497, 32503, 32509, - 32515, 32521, 32527, 32533, 32539, 32545, 32551, 21159, 32557, 32563, - 32569, 32575, 32581, 32587, 32593, 32599, 32605, 32611, 32617, 32623, - 32629, 32635, 32641, 32647, 32653, 32659, 21899, 32665, 32671, 32677, - 32683, 32689, 32695, 32701, 32707, 32713, 32719, 32725, 32731, 32737, - 32743, 32749, 32755, 32761, 32767, 32773, 32779, 32785, 32791, 32797, - 32803, 32809, 32815, 32821, 30176, 32827, 32833, 32839, 32845, 32851, - 32857, 32863, 32869, 32875, 32881, 32887, 27441, 21789, 32893, 32899, - 32905, 32911, 32917, 32923, 32929, 28817, 32935, 32941, 32947, 32953, - 32959, 32965, 32971, 32977, 32983, 32989, 32995, 33001, 33007, 33013, - 33019, 33025, 33031, 33037, 33043, 33049, 33055, 33061, 33067, 33073, - 33079, 33085, 33091, 33097, 33103, 33109, 33115, 33121, 33127, 33133, - 33139, 33145, 33151, 33157, 33163, 33169, 33175, 33181, 33187, 33193, - 33199, 33205, 33211, 33217, 33223, 33229, 33235, 33241, 33247, 33253, - 33259, 33265, 33271, 33277, 33283, 33289, 33295, 33301, 33307, 33313, - 33319, 33325, 33331, 33337, 33343, 33349, 33355, 33361, 33367, 33373, - 33379, 33385, 33391, 33397, 33403, 33409, 33415, 33421, 33427, 33433, - 33439, 33445, 33451, 33457, 33463, 33469, 33475, 33481, 33487, 33493, - 33499, 33505, 33511, 33517, 33523, 33529, 33535, 33541, 33547, 33553, - 33559, 33565, 33571, 33577, 33583, 33589, 33595, 33601, 33607, 33613, - 33619, 33625, 33631, 33637, 33643, 33649, 33655, 33661, 33667, 33673, - 33679, 33685, 33691, 33697, 33703, 33709, 33715, 33721, 33727, 33733, - 33739, 33745, 33751, 33757, 33763, 33769, 33775, 33781, 33787, 33793, - 33799, 33805, 33811, 29679, 33817, 33823, 33829, 33835, 33841, 33847, - 33853, 33859, 33865, 33871, 33877, 33883, 33889, 33895, 33901, 33907, - 33913, 33919, 33925, 33931, 33937, 33943, 33949, 33955, 33961, 33967, - 33973, 33979, 33985, 33991, 33997, 34003, 34009, 34015, 34021, 34027, - 34033, 34039, 34045, 34051, 34057, 34063, 34069, 34075, 34081, 34087, - 34093, 34099, 34105, 34111, 34117, 34123, 34129, 34135, 34141, 34147, - 34153, 34159, 34165, 34171, 34177, 34183, 34189, 34195, 34201, 34207, - 34213, 34219, 34225, 34231, 34237, 34243, 34249, 34255, 34261, 34267, - 34273, 34279, 34285, 34291, 34297, 34303, 25847, 34309, 34315, 34321, - 34327, 34333, 34339, 34345, 34351, 34357, 34363, 34369, 34375, 34381, - 34387, 34393, 34399, 34405, 34411, 34417, 34423, 10932, 34429, 34435, - 34441, 34447, 34453, 34459, 34465, 34471, 34477, 34483, 34489, 34495, - 18502, 34501, 34507, 31240, 34513, 34519, 24605, 34525, 34531, 34537, - 34543, 34549, 34555, 34561, 34567, 34573, 34579, 34585, 34591, 34597, - 34603, 34609, 34615, 34621, 34627, 34633, 34639, 34645, 34651, 34657, - 34663, 34669, 34675, 34681, 34687, 34693, 34699, 23279, 34705, 34711, - 34717, 34723, 34729, 34735, 34741, 34747, 34753, 34759, 34765, 34771, - 34777, 34783, 34789, 34795, 34801, 34807, 34813, 34819, 34825, 34831, - 34837, 34843, 34849, 34854, 34859, 34864, 34869, 23967, 34874, 32672, - 34879, 34884, 34889, 17629, 34894, 34899, 34904, 34909, 34914, 34919, - 34924, 34929, 34934, 34939, 34944, 34949, 34954, 34959, 23480, 34964, - 34969, 32852, 34974, 34979, 34984, 34989, 34994, 34999, 35004, 35009, - 35014, 31994, 35019, 35024, 35029, 26091, 35034, 35039, 35044, 35049, - 35054, 35059, 35064, 35069, 35074, 35079, 35084, 35089, 35094, 35099, - 35104, 1366, 35109, 35114, 35119, 35124, 35129, 35134, 35139, 35144, - 35149, 35154, 35159, 35164, 35169, 35174, 35179, 35184, 35189, 35194, - 35199, 35204, 35209, 35214, 35219, 35224, 35229, 35234, 35239, 35244, - 35249, 35254, 35259, 35264, 31868, 35269, 35274, 35279, 35284, 382, - 35289, 35294, 35299, 35304, 35309, 35314, 35319, 35324, 1019, 35329, - 35334, 35339, 21670, 35344, 35349, 35354, 31424, 35359, 35364, 35369, - 35374, 35379, 35384, 35389, 35394, 35399, 35404, 35409, 35414, 35419, - 35424, 35429, 35434, 35439, 17278, 35444, 35449, 35454, 35459, 35464, - 35469, 35474, 35479, 35484, 34778, 35489, 30492, 35494, 35499, 35504, - 35509, 35514, 35519, 35524, 35529, 34508, 35534, 17642, 35539, 35544, - 35549, 35554, 32090, 35559, 35564, 35569, 35574, 35579, 35584, 21127, - 35589, 35594, 35599, 35604, 35609, 23460, 35614, 35619, 35624, 35629, - 35634, 35639, 35644, 35649, 35654, 35659, 35664, 35669, 35674, 35679, - 35684, 35689, 35694, 35699, 35704, 35709, 35714, 35719, 35724, 35729, - 35734, 35739, 35744, 35749, 35754, 35759, 35764, 35769, 35774, 35779, - 35784, 35789, 21259, 35794, 35799, 35804, 35809, 35814, 27002, 35819, - 35824, 35829, 35834, 35839, 35844, 35849, 35854, 35859, 35864, 35869, - 35874, 35879, 35884, 35889, 35894, 35899, 35904, 35909, 35914, 34226, - 35919, 35924, 35929, 35934, 35939, 35944, 35949, 35954, 35959, 35964, - 35969, 35974, 35979, 35984, 33152, 35989, 35994, 29638, 35999, 36004, - 36009, 16929, 36014, 36019, 36024, 36029, 28370, 36034, 36039, 36044, - 36049, 36054, 36059, 36064, 29554, 36069, 36074, 36079, 36084, 36089, - 36094, 36099, 36104, 36109, 36114, 36119, 36124, 36129, 36134, 36139, - 36144, 36149, 36154, 36159, 36164, 36169, 36174, 34586, 36179, 36184, - 36189, 29862, 36194, 36199, 36204, 36209, 36214, 36219, 36224, 36229, - 36234, 36239, 24723, 36244, 36249, 36254, 36259, 36264, 36269, 36274, - 36279, 36284, 36289, 23160, 36294, 36299, 36304, 36309, 30450, 36314, - 36319, 36324, 36329, 36334, 36339, 26262, 36344, 36349, 36354, 36359, - 36364, 36369, 36374, 36379, 36384, 36389, 36394, 36399, 36404, 36409, - 36414, 36419, 36424, 36429, 36434, 36439, 36444, 36449, 36454, 36459, - 36464, 36469, 36474, 36479, 36484, 36489, 36494, 36499, 32570, 32576, - 32582, 36504, 36509, 36514, 36519, 36524, 36529, 36534, 32588, 32594, - 32600, 33764, 36539, 36544, 36549, 36554, 36559, 36564, 36569, 36574, - 36579, 36584, 36589, 36594, 36599, 36604, 36609, 36614, 36619, 36624, - 36629, 36634, 36639, 31850, 36644, 36649, 36654, 36659, 36664, 36669, - 36674, 36679, 36684, 36689, 36694, 36699, 36704, 36709, 36714, 36719, - 36724, 36729, 36734, 36739, 36744, 36749, 36754, 36759, 36764, 36769, - 36774, 36779, 36784, 36789, 36794, 36799, 36804, 36809, 36814, 36819, - 36824, 36829, 36834, 36839, 36844, 36849, 36854, 36859, 36864, 32858, - 32864, 36869, 36874, 36879, 36884, 36889, 36894, 36899, 36904, 32876, - 32882, 36909, 36914, 36919, 36924, 36929, 34748, 34754, 36934, 36939, - 36944, 36949, 36954, 36959, 36964, 36969, 36974, 36979, 36984, 36989, - 36994, 36999, 37004, 37009, 37014, 37019, 37024, 37029, 37034, 37039, - 37044, 37049, 37054, 37059, 37064, 37069, 37074, 37079, 33092, 37084, - 33098, 37089, 37094, 16831, 26698, 37099, 33104, 33110, 33116, 33122, - 37104, 37109, 37114, 37119, 32714, 37124, 37129, 37134, 37139, 37144, - 37149, 37154, 37159, 37164, 37169, 37174, 37179, 37184, 37189, 37194, - 37199, 37204, 37209, 37214, 37219, 37224, 37229, 37234, 37239, 37244, - 37249, 37254, 37259, 37264, 37269, 37274, 37279, 37284, 37289, 37294, - 37299, 37304, 37309, 37314, 37319, 37324, 37329, 37334, 37339, 37344, - 37349, 37354, 37359, 37364, 37369, 37374, 37379, 37384, 37389, 37394, - 37399, 37404, 37409, 37414, 37419, 32750, 32756, 32762, 34154, 37424, - 37429, 37434, 37439, 37444, 37449, 37454, 37459, 37464, 37469, 37474, - 37479, 37484, 37489, 37494, 37499, 37504, 37509, 37514, 37519, 37524, - 37529, 33380, 33386, 33392, 37534, 37539, 37544, 37549, 37554, 37559, - 37564, 37569, 37574, 37579, 37584, 37589, 37594, 37599, 37604, 37609, - 33398, 37614, 33404, 33410, 33848, 37619, 37624, 37629, 37634, 37639, - 37644, 37649, 37654, 37659, 37664, 37669, 37674, 37679, 37684, 37689, - 37694, 37699, 37704, 37709, 37714, 37719, 37724, 37729, 37734, 37739, - 1234, 21920, 37744, 37749, 37754, 37759, 37764, 37769, 37774, 37779, - 34562, 37784, 37789, 33206, 37794, 33212, 37799, 37804, 37809, 33218, - 37814, 33224, 33230, 33236, 37819, 30366, 37824, 37829, 37834, 37839, - 37844, 37849, 37854, 37859, 37864, 37869, 37874, 37879, 37884, 37889, - 37894, 37899, 37904, 33242, 33248, 37909, 37914, 37919, 37924, 28194, - 37929, 37934, 33254, 37939, 33260, 33266, 37944, 37949, 37954, 30744, - 37959, 37964, 37969, 37974, 37979, 37984, 37989, 37994, 37999, 38004, - 38009, 38014, 38019, 38024, 38029, 38034, 38039, 38044, 38049, 38054, - 38059, 31682, 38064, 38069, 38074, 38079, 38084, 38089, 38094, 38099, - 38104, 38109, 38114, 33854, 38119, 38124, 38129, 38134, 38139, 38144, - 38149, 33860, 33866, 38154, 38159, 38164, 38169, 33278, 33290, 31622, - 38174, 38179, 38184, 38189, 38194, 38199, 38204, 38209, 38214, 38219, - 38224, 38229, 38234, 38239, 38244, 38249, 38254, 38259, 30961, 38264, - 38269, 38274, 38279, 38284, 38289, 38294, 38299, 38304, 38309, 38314, - 38319, 38324, 38329, 38334, 38339, 38344, 38349, 38354, 33296, 38359, - 38364, 38369, 38374, 38379, 38384, 38389, 38394, 38399, 38404, 38409, - 38414, 38419, 38424, 38429, 38434, 38439, 38444, 38449, 38454, 38459, - 38464, 38469, 38474, 38479, 38484, 38489, 38494, 38499, 38504, 38509, - 38514, 38519, 38524, 38529, 38534, 38539, 38544, 38549, 38554, 38559, - 38564, 38569, 38574, 38579, 38584, 38589, 38594, 38599, 38604, 38609, - 38614, 38619, 38624, 38629, 38634, 38639, 38644, 38649, 38654, 38659, - 38664, 38669, 38674, 38679, 38684, 38689, 38694, 38699, 38704, 38709, - 38714, 38719, 38724, 38729, 38734, 38739, 38744, 38749, 38754, 34112, - 38759, 38764, 38769, 38774, 38779, 38784, 38789, 38794, 38799, 38804, - 38809, 38814, 38819, 38824, 38829, 38834, 38839, 38844, 38849, 38854, - 34238, 33890, 38859, 33896, 38864, 38869, 38874, 38879, 38884, 38889, - 38894, 38899, 38904, 38909, 38914, 38919, 38924, 38929, 38934, 38939, - 38944, 38949, 38954, 38959, 38964, 38969, 38974, 38979, 34448, 34454, - 38984, 38989, 38994, 38999, 39004, 24687, 832, 39009, 39014, 39019, - 39024, 39029, 39034, 39039, 39044, 39049, 39054, 39059, 39064, 39069, - 39074, 39079, 39084, 39089, 39094, 39099, 39104, 39109, 39114, 39119, - 39124, 39129, 39134, 39139, 39144, 39149, 34460, 39154, 39159, 39164, - 39169, 39174, 39179, 39184, 39189, 39194, 33986, 39199, 39204, 39209, - 39214, 39219, 39224, 39229, 39234, 21700, 39239, 39244, 39249, 39254, - 39259, 39264, 39269, 30688, 39274, 39279, 39284, 39289, 39294, 39299, - 39304, 39309, 39314, 39319, 39324, 39329, 39334, 39339, 39344, 39349, - 39354, 39359, 39364, 39369, 39374, 32486, 39379, 31171, 23500, 39384, - 39389, 39394, 39399, 39404, 39409, 39414, 39419, 26882, 39424, 39429, - 39434, 39439, 39444, 33320, 33326, 33332, 39449, 33350, 33500, 33506, - 39454, 39459, 39464, 39469, 39474, 39479, 33908, 33914, 33920, 39484, - 39489, 39494, 39499, 39504, 39509, 39514, 39519, 39524, 33926, 39529, - 33932, 39534, 39539, 39544, 39549, 39554, 39559, 39564, 39569, 39574, - 39579, 39584, 39589, 39594, 39599, 39604, 39609, 39614, 39619, 39624, - 39629, 39634, 39639, 39644, 33938, 33944, 39649, 33950, 33956, 33962, - 39654, 39659, 39664, 39669, 39674, 39679, 39684, 39689, 39694, 39699, - 39704, 39709, 39714, 39719, 39724, 39729, 39734, 39739, 39744, 39748, - 39752, 39756, 39760, 39764, 21841, 17890, 39768, 39772, 36180, 39776, - 21117, 23101, 32331, 39780, 33561, 39784, 39788, 39792, 25822, 39796, - 32967, 39800, 39804, 18300, 39808, 26047, 39812, 39816, 31032, 39820, - 31455, 39824, 39828, 39832, 39836, 31791, 39840, 39844, 23191, 16958, - 39848, 32853, 39852, 31551, 39856, 39860, 39864, 21751, 36425, 39868, - 17487, 39872, 39876, 35570, 39880, 39884, 21238, 27099, 39888, 39892, - 39896, 30745, 39900, 39904, 39310, 39325, 39908, 32787, 28946, 35270, - 37560, 36185, 39912, 39916, 31081, 35575, 19188, 39920, 36500, 39924, - 39928, 39932, 39936, 247, 39940, 39944, 39948, 39952, 39956, 39960, - 26326, 39964, 36910, 39968, 39972, 39976, 39980, 36775, 39984, 39988, - 39992, 39996, 40000, 40004, 40008, 37535, 40012, 40016, 40020, 40024, - 40028, 38260, 40032, 40036, 40040, 40044, 40048, 21971, 34587, 40052, - 27203, 40056, 40060, 40064, 32355, 40068, 38370, 36915, 40072, 40076, - 40080, 40084, 40088, 38890, 29814, 40092, 40096, 33855, 40100, 30437, - 26353, 40104, 39005, 40108, 40112, 36155, 40116, 27971, 40120, 40124, - 40128, 40132, 37400, 40136, 40140, 40144, 40148, 39015, 40152, 38270, - 38765, 40156, 40160, 40164, 39290, 39300, 40168, 1081, 40172, 1058, - 39330, 39335, 39340, 39130, 27139, 40176, 40180, 40184, 40188, 32367, - 40192, 38365, 29877, 29884, 40196, 40200, 32385, 40204, 40208, 40212, - 31249, 40216, 40220, 40224, 36440, 40228, 30542, 1229, 29450, 40232, - 40236, 40240, 40244, 40248, 40252, 40256, 40260, 40264, 40268, 40272, - 40276, 40280, 25615, 40284, 40288, 40292, 40296, 40300, 40304, 34389, - 30920, 24715, 37775, 40308, 40312, 40316, 40320, 40324, 40328, 40332, - 37010, 37015, 40336, 40340, 40344, 40348, 40352, 40356, 40360, 37045, - 40364, 29653, 40368, 34563, 40372, 40376, 36605, 40380, 40384, 40388, - 40392, 40396, 40400, 32913, 40404, 40408, 40412, 40416, 40420, 40424, - 40428, 40432, 40436, 40440, 40444, 36885, 36165, 36170, 37185, 40448, - 40452, 40456, 40460, 37245, 40464, 18672, 40468, 40472, 37295, 40476, - 40480, 40484, 40488, 40492, 40496, 40500, 27075, 40504, 40508, 40512, - 40516, 40520, 40524, 40528, 35670, 40532, 40536, 40540, 40544, 40548, - 19753, 40552, 40556, 40560, 40564, 40568, 40572, 40576, 40580, 40584, - 33609, 40588, 40592, 40596, 40600, 40604, 40608, 40612, 38275, 902, - 40616, 40620, 40624, 39280, 20314, 40628, 24130, 40632, 40636, 40640, - 40644, 40648, 40652, 40656, 40660, 40664, 40668, 39295, 40672, 31839, - 24832, 29709, 40676, 40680, 28427, 40684, 40688, 27459, 40692, 32001, - 40696, 40700, 24076, 40704, 23281, 34197, 40708, 40712, 40716, 40720, - 40724, 40728, 40732, 40736, 40740, 40744, 33507, 32361, 40748, 40752, - 40756, 40760, 40764, 38385, 40768, 38395, 38425, 40772, 40776, 40780, - 39155, 40784, 40788, 40792, 40796, 35580, 40800, 35930, 38485, 39460, - 27371, 33783, 24400, 40804, 26299, 40808, 40812, 40816, 36370, 28123, - 36380, 40820, 40824, 40828, 40832, 40836, 40840, 40844, 40848, 40852, - 36385, 40856, 40860, 36390, 35900, 40864, 36400, 36405, 36410, 40868, - 36415, 36420, 36430, 36435, 35490, 36445, 40872, 36450, 38030, 36455, - 36460, 40876, 23878, 40880, 40884, 40888, 40892, 40896, 40900, 40904, - 40908, 40912, 40916, 29184, 40920, 40924, 40928, 40932, 40936, 40940, - 40944, 40948, 40952, 40956, 40960, 40964, 40968, 40972, 40976, 27995, - 40980, 40984, 28323, 40988, 36760, 40992, 36765, 28843, 36770, 40996, - 41000, 36780, 31683, 41004, 36790, 36795, 36800, 36805, 37485, 41008, - 41012, 41016, 38895, 36810, 36820, 41020, 41024, 41028, 36825, 36830, - 35565, 36835, 36840, 36845, 41032, 41036, 41040, 41044, 41048, 41052, - 41056, 41060, 41064, 25957, 35865, 41068, 41072, 41076, 41080, 41084, - 41088, 41092, 41096, 41100, 41104, 41108, 41112, 41116, 41120, 41124, - 41128, 41132, 41136, 41140, 41144, 41148, 41152, 41156, 41160, 41164, - 41168, 41172, 41176, 41180, 41184, 41188, 41192, 36995, 41196, 37000, - 37005, 41200, 41204, 29590, 37020, 41208, 37025, 41212, 41216, 41220, - 41224, 37030, 41228, 37035, 37040, 35635, 37050, 41232, 29107, 41236, - 35640, 37055, 37060, 37065, 37070, 41240, 41244, 41248, 41252, 35770, - 41256, 36575, 19560, 36585, 24652, 28723, 41260, 41264, 36590, 36595, - 36600, 33585, 41268, 41272, 41276, 41280, 35445, 21227, 25813, 41284, - 41288, 41292, 41296, 41300, 41304, 41308, 41312, 41316, 41320, 41324, - 41328, 25885, 36140, 29555, 36615, 36620, 41332, 36625, 31851, 36075, - 36080, 36085, 41336, 41340, 41344, 41348, 41352, 41356, 41360, 39480, - 34377, 32571, 32493, 32583, 21095, 36310, 41364, 33423, 28763, 39245, - 41368, 41372, 41376, 41380, 41384, 35760, 37540, 37545, 37550, 41388, - 41392, 37555, 37565, 37570, 37575, 37580, 35765, 37585, 41396, 37590, - 38235, 37595, 37600, 41400, 41404, 41408, 25588, 41412, 41416, 37675, - 41420, 672, 41424, 41428, 41432, 20248, 41436, 41440, 41444, 41448, - 41452, 41456, 41460, 41464, 41468, 41472, 41476, 41480, 18228, 41484, - 41488, 41492, 41496, 41500, 41504, 41508, 41512, 41516, 41520, 41524, - 41528, 41532, 41536, 41540, 41544, 26344, 37160, 41548, 35610, 37170, - 41552, 41556, 37175, 29079, 19643, 41560, 36160, 39255, 41564, 41568, - 41572, 36960, 41576, 37195, 37200, 41580, 41584, 37205, 41588, 283, - 37210, 37215, 37220, 36090, 37230, 37235, 37240, 37250, 37255, 41592, - 32979, 24184, 41596, 37265, 37270, 41600, 41604, 41608, 41612, 41616, - 41620, 41624, 41628, 41632, 37275, 41636, 41640, 41644, 41648, 37280, - 33555, 37290, 41652, 37300, 37305, 41656, 37310, 37315, 37320, 30549, - 37330, 41660, 37335, 41664, 37345, 41668, 33723, 41672, 37350, 16589, - 37360, 41676, 41680, 41684, 41688, 41692, 32085, 41696, 32625, 18636, - 18156, 41700, 37365, 41704, 37370, 41708, 26859, 41712, 38255, 28619, - 22221, 37375, 33141, 37380, 37385, 37390, 41716, 41720, 41724, 41728, - 41732, 41736, 37395, 34815, 37405, 41740, 41744, 41748, 41752, 41756, - 41760, 37410, 41764, 41768, 37415, 41772, 41776, 41780, 41784, 41788, - 41792, 41796, 41800, 34749, 34755, 35390, 34539, 30934, 41804, 41808, - 41812, 35480, 41816, 41820, 41824, 34257, 41828, 41832, 41836, 41840, - 41844, 39010, 41848, 41852, 41856, 41860, 41864, 41868, 41872, 41876, - 41880, 41884, 41888, 41892, 41896, 41900, 41904, 41908, 41912, 41916, - 41920, 41924, 41928, 41932, 41936, 41940, 41944, 41948, 41952, 41956, - 41960, 41964, 41968, 41972, 41976, 41980, 41984, 41988, 41992, 41996, - 42000, 42004, 42008, 42012, 42016, 16832, 42020, 38280, 26627, 42024, - 38285, 33081, 38295, 23231, 28139, 42028, 42032, 42036, 42040, 35190, - 38790, 38305, 42044, 42048, 42052, 42056, 42060, 42064, 38800, 38310, - 38315, 38320, 38325, 42068, 42072, 38330, 38335, 38340, 38345, 42076, - 42080, 42084, 28795, 20325, 39030, 42088, 42092, 39035, 39040, 42096, - 42100, 42104, 42108, 39045, 42112, 42116, 39050, 39055, 42120, 42124, - 39065, 39070, 39075, 42128, 42132, 42136, 42140, 42144, 35680, 42148, - 39080, 42152, 39085, 39090, 39095, 39100, 39105, 39110, 42156, 42160, - 42164, 42168, 42172, 42176, 42180, 42184, 42188, 42192, 39305, 39120, - 42196, 42200, 42204, 42208, 42212, 42216, 42220, 42224, 42228, 42232, - 42236, 42240, 1944, 42244, 42248, 42252, 42256, 42260, 42264, 42268, - 42272, 42276, 42280, 42284, 42288, 42292, 42296, 42300, 42304, 42308, - 42312, 42316, 42320, 39505, 36940, 42324, 22211, 42328, 42332, 36345, - 42336, 32589, 32595, 26867, 42340, 27419, 42344, 42348, 42352, 42356, - 42360, 42364, 42368, 42372, 42376, 42380, 42384, 42388, 42392, 42396, - 42400, 42404, 42408, 42412, 42416, 42420, 42424, 42428, 42432, 42436, - 42440, 42444, 42448, 42452, 42456, 42460, 42464, 42468, 37715, 37720, - 37450, 37455, 35720, 37460, 35725, 42472, 37465, 37470, 35730, 37725, - 37730, 37735, 42476, 42480, 42484, 42488, 42492, 38380, 42496, 35920, - 38390, 35925, 38400, 42500, 38405, 38410, 42504, 38415, 38420, 42508, - 42512, 42516, 42520, 42524, 38430, 38435, 38440, 39670, 38445, 42528, - 38450, 38455, 38460, 38465, 42532, 38470, 38475, 42536, 38480, 42540, - 38490, 39165, 38495, 38500, 38505, 38510, 42544, 42548, 42552, 33663, - 42556, 42560, 42564, 24140, 42567, 31540, 17813, 23202, 5561, 22212, - 4793, 28140, 27100, 24761, 36316, 26612, 21692, 42570, 17488, 40609, - 40625, 25760, 42573, 42576, 39857, 5049, 42579, 30452, 25463, 21195, - 5305, 32296, 29353, 34708, 29535, 42582, 39913, 42585, 34732, 40521, - 19754, 903, 42588, 34114, 32170, 42591, 1408, 36076, 42594, 733, 41349, - 30746, 42597, 692, 40517, 21239, 17239, 36606, 25427, 23302, 36081, - 19033, 42600, 1132, 42603, 18613, 698, 1027, 6073, 30844, 38601, 41313, - 726, 36866, 35866, 17267, 27124, 42606, 4857, 42609, 32452, 1021, 19069, - 42612, 23142, 19201, 19974, 32824, 42615, 25688, 42618, 42621, 42624, - 42627, 42630, 35386, 26327, 19309, 30648, 32002, 42633, 1193, 33484, - 34060, 39921, 33664, 5113, 40837, 18637, 42636, 34678, 28620, 20249, - 42639, 42642, 24716, 42645, 42648, 42651, 18157, 21250, 41005, 18397, - 42654, 32164, 1172, 22202, 42657, 34774, 297, 42660, 41337, 42663, 33634, - 30949, 19561, 40833, 5897, 24203, 23252, 20392, 31152, 24401, 40389, - 30193, 42666, 42669, 26420, 41045, 16833, 17280, 40829, 42672, 26964, - 35581, 40393, 40397, 42675, 42678, 18565, 29339, 965, 10745, 42681, - 42684, 42687, 16763, 42690, 29500, 42693, 34648, 42696, 12, 26492, 42699, - 5369, 42702, 39881, 42705, 31636, 28724, 24626, 673, 28820, 42708, 42711, - 42714, 42717, 1215, 42720, 42723, 42726, 18661, 42729, 42732, 42735, - 42738, 41593, 39506, 42741, 19525, 40841, 42744, 42747, 42750, 42753, - 42756, 30473, 29003, 31918, 42759, 6137, 32536, 42762, 42765, 42768, - 42771, 34180, 42774, 42777, 42780, 42783, 42786, 42121, 42789, 21591, - 1163, 42792, 42795, 42798, 42801, 41065, 42804, 23432, 1059, 284, 42807, - 915, 42810, 42813, 42816, 21063, 42819, 42257, 29661, 28524, 18457, - 42822, 41077, 42825, 39546, 16530, 39286, 42828, 24185, 41889, 19549, - 36381, 42831, 42834, 42837, 42840, 21972, 5337, 5353, 1465, 42843, 42846, - 5577, 42849, 42852, 42855, 19644, 6153, 41121, 42858, 42861, 42864, - 41713, 351, 42867, 42870, 42873, 42876, 42879, 41225, 22062, 21228, - 32194, 42882, 21085, 42885, 978, 42888, 40401, 42891, 33652, 42894, - 42897, 42900, 42903, 42906, 42909, 42912, 42915, 42918, 36306, 42921, - 42241, 42924, 664, 42927, 32044, 42930, 42933, 42936, 42939, 42942, - 42945, 42948, 42951, 42954, 41321, 42957, 42960, 42963, 35831, 42966, - 42969, 42972, 32374, 42975, 42978, 42981, 42984, 32596, 42987, 42990, - 42993, 1961, 42996, 41853, 42999, 43002, 36331, 43005, 43008, 36711, - 43011, 43014, 43017, 43020, 43023, 23789, 43026, 43029, 43032, 29969, - 43035, 42137, 43038, 43041, 43044, 32056, 43047, 43050, 17211, 29962, - 35641, 952, 43053, 43056, 31384, 43059, 43062, 41341, 40813, 41541, - 43065, 43068, 43071, 43074, 37776, 43077, 41797, 50, 1147, 43080, 40498, - 23862, 43082, 272, 43084, 34061, 40162, 28976, 35482, 43086, 571, 28906, - 27141, 43088, 43090, 811, 32057, 33707, 307, 911, 357, 43092, 37682, - 24357, 241, 43094, 42829, 43096, 4, 22233, 926, 948, 29116, 43098, 43100, - 19689, 796, 40762, 333, 42706, 710, 88, 41206, 623, 313, 165, 35797, - 42643, 32039, 19722, 31367, 43102, 43104, 28005, 43106, 43108, 43110, - 20008, 35102, 43112, 27541, 41598, 43114, 39746, 474, 1205, 28766, 51, - 98, 5, 14, 308, 171, 102, 70, 57, 9, 34, 273, 363, 804, 149, 348, 42737, - 43116, 465, 43117, + 0, 0, 6, 10, 15, 23, 30, 32, 35, 40, 53, 65, 71, 77, 82, 90, 99, 103, + 108, 116, 119, 126, 130, 138, 144, 150, 157, 162, 172, 175, 182, 187, + 193, 201, 206, 215, 222, 229, 238, 243, 251, 255, 256, 264, 270, 276, + 282, 288, 295, 301, 309, 318, 322, 327, 330, 337, 344, 350, 353, 362, + 370, 375, 381, 387, 392, 397, 402, 405, 407, 413, 418, 426, 299, 428, + 430, 439, 100, 447, 457, 465, 467, 478, 481, 494, 498, 504, 514, 519, + 522, 524, 533, 538, 545, 549, 556, 559, 564, 569, 572, 582, 591, 599, + 606, 614, 618, 626, 634, 643, 647, 654, 662, 671, 675, 683, 689, 698, + 705, 708, 709, 714, 719, 728, 735, 738, 745, 751, 755, 763, 173, 767, + 773, 782, 750, 789, 263, 797, 803, 808, 812, 825, 834, 839, 842, 852, + 753, 857, 866, 875, 877, 882, 887, 894, 904, 907, 909, 913, 921, 22, 929, + 933, 938, 947, 543, 950, 960, 964, 971, 977, 983, 988, 994, 997, 1000, + 80, 1007, 1015, 1025, 1030, 1035, 1042, 1044, 1054, 779, 1058, 1062, + 1069, 1074, 1081, 1085, 1089, 1094, 1104, 1110, 1023, 1112, 1117, 1123, + 325, 1130, 1134, 1140, 1144, 1147, 1152, 1158, 1163, 1083, 1169, 1176, + 1181, 1183, 1185, 1190, 1195, 624, 1204, 1210, 1213, 1215, 1221, 31, + 1224, 1226, 1179, 1229, 1237, 1243, 1250, 1274, 1296, 1318, 1340, 1361, + 1382, 1402, 1422, 1441, 1460, 1479, 1498, 1517, 1536, 1555, 1574, 1592, + 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1789, 1806, + 1823, 1840, 1857, 1874, 1891, 1908, 1925, 1942, 1959, 1975, 1991, 2007, + 2023, 2039, 2055, 2071, 2087, 2103, 2119, 2135, 2151, 2167, 2183, 2199, + 2215, 2231, 2247, 2263, 2279, 2295, 2311, 2327, 2343, 2359, 2375, 2391, + 2407, 2423, 2439, 2455, 2471, 2487, 2503, 2519, 2535, 2551, 2567, 2583, + 2599, 2615, 2631, 2647, 2663, 2679, 2695, 2711, 2727, 2743, 2759, 2775, + 2791, 2807, 2823, 2839, 2855, 2871, 2887, 2903, 2919, 2935, 2951, 2967, + 2983, 2999, 3015, 3031, 3047, 3063, 3079, 3095, 3111, 3127, 3143, 3159, + 3175, 3191, 3207, 3223, 3239, 3255, 3271, 3287, 3303, 3319, 3335, 3351, + 3367, 3383, 3399, 3415, 3431, 3447, 3463, 3479, 3495, 3511, 3527, 3543, + 3559, 3575, 3591, 3607, 3623, 3639, 3655, 3671, 3687, 3703, 3719, 3735, + 3751, 3767, 3783, 3799, 3815, 3831, 3847, 3863, 3879, 3895, 3911, 3927, + 3943, 3959, 3975, 3991, 4007, 4023, 4039, 4055, 4071, 4087, 4103, 4119, + 4135, 4151, 4167, 4183, 4199, 4215, 4231, 4247, 4263, 4279, 4295, 4311, + 4327, 4343, 4359, 4375, 4391, 4407, 4423, 4439, 4455, 4471, 4487, 4503, + 4519, 4535, 4551, 4567, 4583, 4599, 4615, 4631, 4647, 4663, 4679, 4695, + 4711, 4727, 4743, 4759, 4775, 4791, 4807, 4823, 4839, 4855, 4871, 4887, + 4903, 4919, 4935, 4951, 4967, 4983, 4999, 5015, 5031, 5047, 5063, 5079, + 5095, 5111, 5127, 5143, 5159, 5175, 5191, 5207, 5223, 5239, 5255, 5271, + 5287, 5303, 5319, 5335, 5351, 5367, 5383, 5399, 5415, 5431, 5447, 5463, + 5479, 5495, 5511, 5527, 5543, 5559, 5575, 5591, 5607, 5623, 5639, 5655, + 5671, 5687, 5703, 5719, 5735, 5751, 5767, 5783, 5799, 5815, 5831, 5847, + 5863, 5879, 5895, 5911, 5927, 5943, 5959, 5975, 5991, 6007, 6023, 6039, + 6055, 6071, 6087, 6103, 6119, 6135, 6151, 6167, 6183, 6199, 6215, 6231, + 6247, 6263, 6279, 6295, 6311, 6327, 6343, 6359, 6375, 6391, 6407, 6423, + 6439, 6455, 6471, 6487, 6503, 6519, 6535, 6551, 6567, 6583, 6599, 6615, + 6631, 6647, 6663, 6679, 6695, 6711, 6727, 6743, 6759, 6775, 6791, 6807, + 6823, 6839, 6855, 6871, 6887, 6903, 6919, 6935, 6951, 6967, 6983, 6999, + 7015, 7031, 7047, 7063, 7079, 7095, 7111, 7127, 7143, 7159, 7175, 7191, + 7207, 7223, 7239, 7255, 7271, 7287, 7303, 7319, 7335, 7351, 7367, 7383, + 7399, 7415, 7431, 7447, 7463, 7479, 7495, 7511, 7527, 7543, 7559, 7575, + 7591, 7607, 7623, 7639, 7655, 7671, 7687, 7703, 7719, 7735, 7751, 7767, + 7783, 7799, 7815, 7831, 7847, 7863, 7879, 7895, 7911, 7927, 7943, 7959, + 7975, 7991, 8007, 8023, 8039, 8055, 8071, 8087, 8103, 8119, 8135, 8151, + 8167, 8183, 8199, 8215, 8231, 8247, 8263, 8279, 8295, 8311, 8327, 8343, + 8359, 8375, 8391, 8407, 8423, 8439, 8455, 8471, 8487, 8503, 8519, 8535, + 8551, 8567, 8583, 8599, 8615, 8631, 8647, 8663, 8679, 8695, 8711, 8727, + 8743, 8759, 8775, 8791, 8807, 8823, 8839, 8855, 8871, 8887, 8903, 8919, + 8935, 8951, 8967, 8983, 8999, 9015, 9031, 9047, 9063, 9079, 9095, 9111, + 9127, 9143, 9159, 9175, 9191, 9207, 9223, 9239, 9255, 9271, 9287, 9303, + 9319, 9335, 9351, 9367, 9383, 9399, 9415, 9431, 9447, 9463, 9479, 9495, + 9511, 9527, 9543, 9559, 9575, 9591, 9607, 9623, 9639, 9655, 9671, 9687, + 9703, 9719, 9735, 9751, 9767, 9783, 9799, 9815, 9831, 9847, 9863, 9879, + 9895, 9911, 9927, 9943, 9959, 9975, 9991, 10007, 10023, 10039, 10055, + 10071, 10087, 10103, 10119, 10135, 10151, 10167, 10183, 10199, 10215, + 10231, 10247, 10263, 10279, 10295, 10311, 10327, 10343, 10359, 10375, + 10391, 10407, 10423, 10439, 10455, 10471, 10487, 10503, 10519, 10535, + 10551, 10567, 10583, 10599, 10615, 10631, 10647, 10663, 10679, 10695, + 10711, 10727, 10743, 10759, 10775, 10791, 10807, 10823, 10839, 10855, + 10871, 10887, 10903, 10919, 10934, 10949, 10964, 10979, 10994, 11009, + 11024, 11039, 11054, 11069, 11084, 11099, 11114, 11129, 11144, 11159, + 11174, 11189, 11204, 11219, 11234, 11249, 11264, 11279, 11294, 11309, + 11324, 11339, 11354, 11369, 11384, 11399, 11414, 11429, 11444, 11459, + 11474, 11489, 11504, 11519, 11534, 11549, 11564, 11579, 11594, 11609, + 11624, 11639, 11654, 11669, 11684, 11699, 11714, 11729, 11744, 11759, + 11774, 11789, 11804, 11819, 11834, 11849, 11864, 11879, 11894, 11909, + 11924, 11939, 11954, 11969, 11984, 11999, 12014, 12029, 12044, 12059, + 12074, 12089, 12104, 12119, 12134, 12149, 12164, 12179, 12194, 12209, + 12224, 12239, 12254, 12269, 12284, 12299, 12314, 12329, 12344, 12359, + 12374, 12389, 12404, 12419, 12434, 12449, 12464, 12479, 12494, 12509, + 12524, 12539, 12554, 12569, 12584, 12599, 12614, 12629, 12644, 12659, + 12674, 12689, 12704, 12719, 12734, 12749, 12764, 12779, 12794, 12809, + 12824, 12839, 12854, 12869, 12884, 12899, 12914, 12929, 12944, 12959, + 12974, 12989, 13004, 13019, 13034, 13049, 13064, 13079, 13094, 13109, + 13124, 13139, 13154, 13169, 13184, 13199, 13214, 13229, 13244, 13259, + 13274, 13289, 13304, 13319, 13334, 13349, 13364, 13379, 13394, 13409, + 13424, 13439, 13454, 13469, 13484, 13499, 13514, 13529, 13544, 13559, + 13574, 13589, 13604, 13619, 13634, 13649, 13664, 13679, 13694, 13709, + 13724, 13739, 13754, 13769, 13784, 13799, 13814, 13829, 13844, 13859, + 13874, 13889, 13904, 13919, 13934, 13949, 13964, 13979, 13994, 14009, + 14024, 14039, 14054, 14069, 14084, 14099, 14114, 14129, 14144, 14159, + 14174, 14189, 14204, 14219, 14234, 14249, 14264, 14279, 14294, 14309, + 14324, 14339, 14354, 14369, 14384, 14399, 14414, 14429, 14444, 14459, + 14474, 14489, 14504, 14519, 14534, 14549, 14564, 14579, 14594, 14609, + 14624, 14639, 14654, 14669, 14684, 14699, 14714, 14729, 14744, 14759, + 14774, 14789, 14804, 14819, 14834, 14849, 14864, 14879, 14894, 14909, + 14924, 14939, 14954, 14969, 14984, 14999, 15014, 15029, 15044, 15059, + 15074, 15089, 15104, 15119, 15134, 15149, 15164, 15179, 15194, 15209, + 15224, 15239, 15254, 15269, 15284, 15299, 15314, 15329, 15344, 15359, + 15374, 15389, 15404, 15419, 15434, 15449, 15464, 15479, 15494, 15509, + 15524, 15539, 15554, 15569, 15584, 15599, 15614, 15629, 15644, 15659, + 15674, 15689, 15704, 15719, 15734, 15749, 15764, 15779, 15794, 15809, + 15824, 15839, 15854, 15869, 15884, 15899, 15914, 15929, 15944, 15959, + 15974, 15989, 16004, 16019, 16034, 16049, 16064, 16079, 16094, 16109, + 16124, 16139, 16154, 16169, 16184, 16199, 16214, 16229, 16244, 16259, + 16274, 16289, 16304, 16319, 16334, 16349, 16364, 16379, 16394, 16409, + 16424, 16439, 16454, 16469, 16484, 16499, 16514, 16529, 16544, 16559, + 16574, 16589, 16604, 16619, 16634, 16649, 16664, 16679, 16694, 16709, + 16724, 16739, 16754, 16769, 16784, 16799, 16814, 16829, 16844, 16859, + 16874, 16889, 16904, 16919, 16934, 16949, 16964, 16979, 16994, 17009, + 17024, 17039, 17054, 17069, 17084, 17099, 17114, 17129, 17144, 17159, + 17174, 17189, 17204, 17219, 17234, 17249, 17264, 17279, 17294, 17309, + 17324, 17339, 17354, 17369, 17384, 17399, 17414, 17429, 17444, 17459, + 17474, 17489, 17504, 17519, 17534, 17549, 17564, 17579, 17594, 17609, + 17624, 17639, 17654, 17669, 17684, 17699, 17714, 17729, 17744, 17759, + 17774, 17789, 17804, 17819, 17834, 17849, 17864, 17879, 17894, 17909, + 17924, 17939, 17954, 17969, 17984, 17999, 18014, 18029, 18044, 18059, + 18074, 18089, 18104, 18119, 18134, 18149, 18164, 18179, 18194, 18209, + 18224, 18239, 18254, 18269, 18283, 18297, 18311, 18325, 18339, 1408, + 18353, 18367, 18381, 18395, 18409, 18423, 18437, 18451, 18465, 18479, + 18493, 18507, 18521, 18535, 18549, 18563, 18577, 18591, 18605, 18619, + 18633, 18647, 18661, 18675, 18689, 18703, 1809, 18717, 18731, 18745, + 18759, 18773, 18787, 18801, 18815, 18829, 18843, 18857, 18871, 18885, + 18899, 18913, 18927, 18941, 18954, 18967, 18980, 18993, 19006, 19019, + 19032, 19045, 19058, 19071, 19084, 19097, 19110, 19123, 19136, 19149, + 19162, 19175, 19188, 19201, 19214, 19227, 19240, 1759, 19253, 19266, + 19279, 19292, 19305, 19318, 19331, 19344, 19357, 19370, 19383, 19396, + 19409, 19422, 19435, 19448, 19461, 19474, 19487, 19500, 19513, 19526, + 19539, 19552, 19565, 19578, 19591, 19604, 19617, 19630, 19643, 19656, + 19669, 19682, 19695, 19708, 19721, 1523, 19734, 19747, 19760, 19773, + 19786, 19799, 19812, 19825, 19838, 19851, 19864, 19877, 19890, 19903, + 19916, 19929, 19942, 19955, 19968, 19981, 19994, 20007, 20020, 20033, + 20046, 20059, 20072, 20085, 20098, 20111, 20124, 20137, 20150, 20163, + 20176, 20189, 20202, 20215, 20228, 20241, 20254, 20267, 20280, 20293, + 20306, 20319, 20332, 20345, 20358, 20371, 20384, 20397, 20410, 20423, + 20436, 20449, 20462, 20475, 20488, 20501, 20514, 20527, 20540, 20553, + 20566, 20579, 20592, 20605, 20618, 20631, 20644, 20657, 20670, 20683, + 20696, 20709, 20722, 20735, 20748, 20761, 20774, 20787, 20800, 20813, + 20826, 20839, 20852, 20865, 20878, 20891, 20904, 20917, 20930, 20943, + 20956, 20969, 20982, 20995, 21008, 21021, 21034, 21047, 21060, 21073, + 21086, 21099, 21112, 21125, 21138, 21151, 21164, 21177, 21190, 21203, + 21216, 21229, 21242, 21255, 21268, 21281, 21294, 21307, 21320, 21333, + 21346, 21359, 21372, 21385, 21398, 21411, 21424, 21437, 21450, 21463, + 21476, 21489, 21502, 21515, 21528, 21541, 21554, 21567, 21580, 21593, + 21606, 21619, 21632, 21645, 21658, 21671, 21684, 21697, 21710, 21723, + 21736, 21749, 21762, 21775, 21788, 21801, 21814, 21827, 21840, 21853, + 21866, 21879, 21892, 21905, 21918, 21931, 21944, 21957, 21970, 21983, + 21996, 22009, 22022, 22034, 22046, 22058, 22070, 22082, 22094, 22106, + 22118, 22130, 22142, 22154, 22166, 22178, 22190, 22202, 22214, 22226, + 22238, 1670, 22250, 22262, 22274, 1616, 22286, 22298, 22310, 22322, + 22334, 22346, 22358, 1505, 1598, 22370, 1634, 22382, 22394, 22406, 22418, + 22430, 22442, 22454, 22466, 22478, 22490, 22502, 22514, 22526, 22538, + 22550, 22562, 22574, 22586, 22598, 22610, 22622, 22634, 22646, 22658, + 22670, 22682, 22694, 22706, 22718, 22730, 22742, 22754, 22766, 22778, + 22790, 22802, 22814, 22826, 22838, 22850, 22862, 22874, 22886, 22898, + 22910, 22922, 22934, 22946, 22958, 22970, 22982, 22994, 23006, 23018, + 23030, 23042, 23054, 23066, 23078, 23090, 23102, 23114, 23126, 23138, + 23150, 23162, 23174, 23186, 23198, 23210, 23222, 23234, 23246, 23258, + 23270, 23282, 23294, 23306, 23318, 23330, 23342, 23354, 23366, 23378, + 23390, 23402, 23414, 1390, 23426, 23438, 23450, 1724, 23462, 23474, + 23486, 23498, 23510, 23522, 23534, 23546, 23558, 23570, 23582, 23594, + 23606, 23618, 23630, 23642, 23654, 23666, 23678, 23690, 23702, 23714, + 23726, 23738, 23750, 23762, 23774, 23786, 23798, 23810, 23822, 23834, + 23846, 23858, 23870, 23882, 23894, 23906, 23918, 23930, 23942, 23954, + 23966, 23978, 23990, 24002, 24014, 24026, 24038, 24050, 24062, 24074, + 24086, 24098, 24110, 24122, 24134, 24146, 24158, 24170, 24182, 24194, + 24206, 24218, 24230, 24242, 24254, 24266, 24278, 24290, 24302, 24314, + 24326, 24338, 24350, 24362, 24374, 24386, 24398, 24410, 24422, 24434, + 24446, 24458, 24470, 24482, 24494, 24506, 24518, 24530, 24542, 24554, + 24566, 24578, 24590, 24602, 24614, 24626, 24638, 24650, 24662, 24674, + 24686, 24698, 24710, 24722, 24734, 24746, 24758, 24770, 24781, 24792, + 24803, 24814, 24825, 24836, 24847, 24858, 24869, 24880, 24891, 24902, + 24913, 24924, 24935, 24946, 24957, 1795, 24968, 24979, 24990, 25001, + 25012, 25023, 25034, 25045, 25056, 1880, 1307, 25067, 1430, 25078, 25089, + 25100, 25111, 25122, 25133, 1897, 25144, 25155, 25166, 25177, 25188, + 25199, 25210, 25221, 25232, 25243, 25254, 25265, 25276, 25287, 1863, + 25298, 25309, 25320, 25331, 25342, 25353, 25364, 25375, 25386, 25397, + 25408, 25419, 25430, 25441, 25452, 25463, 25474, 25485, 25496, 25507, + 25518, 25529, 25540, 25551, 25562, 25573, 25584, 25595, 25606, 25617, + 25628, 25639, 25650, 25661, 25672, 25683, 25694, 25705, 25716, 25727, + 25738, 25749, 25760, 25771, 25782, 25793, 25804, 25815, 25826, 25837, + 25848, 25859, 25870, 25881, 25892, 25903, 25914, 25925, 25936, 25947, + 25958, 25969, 25980, 25991, 26002, 26013, 26024, 26035, 26046, 26057, + 26068, 26079, 26090, 26101, 26112, 26123, 26134, 26145, 26156, 26167, + 26178, 26189, 26200, 26211, 26222, 26233, 26244, 26255, 26266, 26277, + 26288, 26299, 26310, 26321, 26332, 26343, 26354, 26365, 26376, 26387, + 26398, 26409, 26420, 26431, 26442, 26453, 18580, 26464, 26475, 26486, + 26497, 26508, 26519, 26530, 26541, 26552, 26563, 26574, 26585, 26596, + 26607, 26618, 26629, 26640, 26651, 26662, 26673, 26684, 26695, 26706, + 26717, 26728, 26739, 26750, 26761, 26772, 26783, 26794, 26805, 26816, + 26827, 26838, 26849, 26860, 26871, 26882, 26893, 26904, 26915, 26926, + 26937, 26948, 26959, 26970, 26981, 26992, 27003, 27013, 27023, 27033, + 27043, 27053, 27063, 27073, 27083, 27093, 27103, 27113, 27123, 27133, + 27143, 27153, 27163, 27173, 27183, 27193, 27203, 22072, 27213, 27223, + 27233, 27243, 27253, 27263, 27273, 27283, 1372, 27293, 27303, 27313, + 27323, 27333, 27343, 27353, 27363, 27373, 27383, 27393, 27403, 27413, + 27423, 27433, 27443, 27453, 27463, 27473, 27483, 27493, 27503, 27513, + 27523, 27533, 27543, 27553, 27563, 27573, 27583, 27593, 27603, 27613, + 27623, 27633, 27643, 27653, 27663, 27673, 27683, 27693, 27703, 27713, + 27723, 27733, 27743, 27753, 27763, 27773, 27783, 27793, 27803, 27813, + 27823, 27833, 27843, 27853, 27863, 27873, 27883, 27893, 27903, 27913, + 27923, 27933, 27943, 27953, 27963, 27973, 27983, 27993, 19490, 28003, + 22672, 28013, 28023, 28033, 28043, 28053, 28063, 28073, 28083, 28093, + 28103, 28113, 28123, 28133, 28143, 28153, 28163, 28173, 28183, 28193, + 28203, 28213, 28223, 28233, 28243, 28253, 28263, 28273, 28283, 28293, + 28303, 28313, 28323, 28333, 28343, 28353, 28363, 28373, 28383, 28393, + 28403, 28413, 28423, 28433, 28443, 28453, 28463, 28473, 28483, 28493, + 28503, 28513, 28523, 28533, 28543, 28553, 28563, 28573, 28583, 28593, + 28603, 28613, 28623, 28633, 28643, 28653, 28663, 28673, 28683, 28693, + 28703, 28713, 28723, 28733, 28743, 28753, 28763, 28773, 28783, 28793, + 28803, 28813, 28823, 28833, 28843, 28853, 28863, 28873, 28883, 28893, + 28903, 28913, 28923, 28933, 28943, 28953, 28963, 28973, 28983, 28993, + 29003, 29013, 29023, 29033, 29043, 29053, 29063, 29073, 29083, 29093, + 29103, 29113, 29123, 29133, 29143, 29153, 29163, 29173, 29183, 29193, + 29203, 29213, 29223, 29233, 29243, 29253, 29263, 29273, 29283, 29293, + 29303, 29313, 29323, 29333, 29343, 1949, 29353, 29363, 29373, 29383, + 29393, 29403, 29413, 29423, 29433, 29443, 29453, 29463, 29473, 29483, + 29493, 29503, 29513, 29523, 29533, 29543, 29553, 29563, 29573, 29583, + 29593, 29603, 29613, 29623, 29633, 29643, 29653, 29663, 29673, 29683, + 29693, 29703, 29713, 29723, 29733, 29743, 29753, 29763, 29773, 29783, + 29793, 29803, 29813, 29823, 29833, 29843, 29853, 29863, 29873, 29883, + 29893, 29903, 29913, 29923, 29933, 29942, 29951, 29960, 29969, 29978, + 29987, 29996, 30005, 30014, 30023, 30032, 30041, 30050, 30059, 30068, + 30077, 30086, 18958, 30095, 30104, 30113, 30122, 30131, 30140, 30149, + 30158, 30167, 30176, 30185, 30194, 30203, 30212, 30221, 30230, 30239, + 30248, 30257, 30266, 30275, 30284, 30293, 30302, 30311, 30320, 30329, + 30338, 30347, 30356, 30365, 30374, 30383, 30392, 30401, 30410, 30419, + 30428, 30437, 30446, 30455, 30464, 30473, 24926, 30482, 30491, 30500, + 30509, 30518, 30527, 30536, 30545, 30554, 30563, 30572, 30581, 30590, + 30599, 30608, 30617, 30626, 30635, 30644, 30653, 30662, 30671, 30680, + 30689, 30698, 30707, 30716, 25135, 30725, 30734, 30743, 30752, 30761, + 30770, 30779, 30788, 30797, 30806, 30815, 30824, 30833, 30842, 30851, + 30860, 30869, 30878, 30887, 30896, 30905, 1287, 30914, 30923, 30932, + 30941, 30950, 30959, 30968, 30977, 30986, 30995, 31004, 31013, 31022, + 31031, 31040, 31049, 29894, 31058, 31067, 31076, 31085, 31094, 31103, + 31112, 31121, 31130, 31139, 31148, 31157, 31166, 31175, 31184, 31193, + 31202, 31211, 31220, 31229, 31238, 31247, 31256, 31265, 31274, 31283, + 31292, 31301, 31310, 31319, 31328, 31337, 31346, 31355, 31364, 31373, + 31382, 31391, 31400, 31409, 31418, 31427, 31436, 31445, 31454, 31463, + 31472, 31481, 31490, 31499, 31508, 31517, 31526, 31535, 31544, 31553, + 31562, 31571, 31580, 31589, 31598, 31607, 31616, 31625, 31634, 31643, + 31652, 31661, 31670, 31679, 31688, 31697, 31706, 31715, 31724, 31733, + 31742, 31751, 31760, 31769, 31778, 31787, 31796, 31805, 31814, 31823, + 31832, 31841, 31850, 31859, 31868, 31877, 31886, 31895, 31904, 31913, + 31922, 31931, 31940, 31949, 31958, 31967, 31976, 31985, 31994, 32003, + 32012, 32021, 32030, 32039, 32048, 32057, 32066, 32075, 32084, 32093, + 32102, 32111, 32120, 32129, 32138, 32147, 32156, 32165, 32174, 32183, + 32192, 32201, 32210, 10766, 32219, 32228, 32237, 32246, 32255, 32264, + 32273, 32282, 32291, 32300, 32309, 32318, 32327, 32336, 32345, 32354, + 32363, 32372, 32381, 32390, 32399, 32408, 32417, 32426, 32435, 32444, + 32453, 32462, 32471, 32480, 32489, 32498, 32507, 32516, 32525, 32534, + 32543, 32552, 32561, 32570, 32579, 32588, 32597, 32606, 32615, 32624, + 32633, 32642, 32651, 32660, 32669, 32678, 32687, 32696, 32705, 32714, + 32723, 1848, 32732, 32741, 32750, 32759, 32768, 32777, 32786, 32795, + 32804, 32813, 32822, 32831, 32840, 32849, 32858, 32867, 32876, 32885, + 32894, 32903, 32912, 32921, 32930, 32939, 32948, 32957, 32966, 32975, + 32984, 32993, 33002, 33011, 33020, 33029, 33038, 33047, 33056, 33065, + 33074, 33083, 33091, 33099, 33107, 33115, 18289, 33123, 33131, 33139, + 33147, 33155, 33163, 33171, 33179, 33187, 33195, 33203, 33211, 33219, + 33227, 33235, 33243, 33251, 33259, 33267, 27465, 33275, 33283, 33291, + 33299, 33307, 33315, 33323, 33331, 33339, 33347, 19609, 33355, 33363, + 33371, 33379, 33387, 33395, 33403, 18317, 33411, 33419, 33427, 33435, + 33443, 1471, 33451, 33459, 2047, 19765, 33467, 1967, 33475, 33483, 33491, + 18373, 33499, 33507, 33515, 33523, 18985, 22362, 33531, 33539, 33547, + 33555, 33563, 33571, 33579, 33587, 33595, 33603, 30402, 33611, 33619, + 33627, 33635, 33643, 33651, 33659, 33667, 33675, 33683, 33691, 1815, + 33699, 33707, 33715, 33723, 33731, 33739, 33747, 33755, 33763, 33771, + 33779, 33787, 33795, 33803, 33811, 33819, 33827, 33835, 33843, 33851, + 33859, 33867, 33875, 33883, 33891, 33899, 33907, 33915, 33923, 33931, + 33939, 33947, 33955, 33963, 33971, 33979, 33987, 33995, 34003, 34011, + 34019, 34027, 34035, 34043, 34051, 34059, 34067, 34075, 34083, 34091, + 27265, 34099, 34107, 34115, 34123, 34131, 34139, 34147, 34155, 34163, + 34171, 34179, 34187, 34195, 34203, 34211, 34219, 30906, 34227, 34235, + 34243, 34251, 34259, 34267, 34275, 34283, 34291, 34299, 34307, 34315, + 34323, 34331, 34339, 34347, 34355, 34363, 34371, 34379, 34387, 34395, + 34403, 34411, 34419, 34427, 34435, 34443, 34451, 34459, 34467, 34475, + 34483, 34491, 34499, 34507, 34515, 34523, 34531, 34539, 34547, 27325, + 34555, 34563, 34571, 34579, 34587, 34595, 34603, 34611, 34619, 34627, + 34635, 34643, 34651, 34659, 34667, 34675, 34683, 26467, 34691, 34699, + 34707, 34715, 34723, 34731, 34739, 34747, 34755, 34763, 34771, 34779, + 34787, 34795, 34803, 34811, 34819, 34827, 34835, 34843, 34851, 34859, + 34867, 34875, 34883, 34891, 34899, 34907, 34915, 34923, 34931, 34939, + 34947, 34955, 34963, 34971, 34979, 34987, 34995, 30951, 35003, 35011, + 35019, 35027, 35035, 35043, 35051, 35059, 35067, 35075, 35083, 35091, + 35099, 26588, 35107, 35115, 1934, 35123, 35131, 35139, 35147, 35155, + 35163, 35171, 35179, 32706, 35187, 35195, 35203, 35211, 35219, 35227, + 35235, 35243, 35251, 35259, 35267, 35275, 35283, 35291, 35299, 35307, + 35315, 35323, 35331, 35339, 2015, 35347, 35355, 10863, 35363, 35371, + 35379, 35387, 35395, 35403, 35411, 35419, 35427, 23310, 35435, 35443, + 35451, 35459, 35467, 35475, 35483, 35491, 35499, 35507, 35515, 35523, + 35531, 35539, 35547, 35555, 35563, 35571, 35579, 35587, 35595, 35603, + 35611, 35619, 35627, 35635, 35643, 35651, 35659, 35667, 35675, 35683, + 19141, 35691, 35699, 35707, 35715, 35723, 35731, 35739, 35747, 35755, + 1710, 35763, 35771, 35779, 35787, 35795, 35803, 35811, 35819, 35827, + 35835, 35843, 35851, 35859, 35867, 35875, 35883, 35891, 35899, 35907, + 35915, 35923, 35931, 35939, 35947, 35955, 35963, 35971, 35979, 35987, + 35995, 36003, 36011, 36019, 18905, 36027, 36035, 36043, 36051, 36059, + 36067, 36075, 36083, 36091, 36099, 36107, 28965, 36115, 36123, 36131, + 36139, 36147, 36155, 36163, 36171, 36179, 36187, 36195, 36202, 36209, + 36216, 36223, 36230, 19753, 36237, 36244, 36251, 36258, 36265, 36272, + 36279, 36286, 36293, 36300, 36307, 36314, 36321, 36328, 36335, 36342, + 36349, 11047, 36356, 36363, 36370, 36377, 36384, 36391, 36398, 36405, + 36412, 36419, 36426, 36433, 36440, 36447, 36454, 36461, 36468, 36475, + 36482, 36489, 36496, 36503, 36510, 36517, 1510, 36524, 36531, 1603, + 36538, 36545, 36552, 36559, 36566, 36573, 36580, 36587, 36594, 36601, + 36608, 36615, 36622, 36629, 36636, 36643, 36650, 1354, 36657, 36664, + 36671, 36678, 36685, 36692, 36699, 36706, 36713, 36720, 36727, 36734, + 36741, 36748, 36755, 36762, 36769, 36776, 36783, 26578, 36790, 36797, + 36804, 36811, 36818, 36825, 36832, 36839, 36846, 36853, 36860, 36867, + 36874, 36881, 36888, 36895, 36902, 36909, 36916, 36923, 36930, 36937, + 36944, 36951, 36958, 36965, 36972, 36979, 36986, 36993, 30187, 37000, + 37007, 37014, 37021, 37028, 37035, 37042, 37049, 37056, 37063, 37070, + 37077, 37084, 37091, 37098, 37105, 37112, 37119, 37126, 37133, 37140, + 37147, 37154, 37161, 37168, 37175, 37182, 37189, 37196, 37203, 37210, + 37217, 37224, 37231, 37238, 37245, 37252, 37259, 37266, 37273, 37280, + 22123, 37287, 37294, 37301, 37308, 37315, 37322, 37329, 37336, 37343, + 37350, 37357, 37364, 37371, 37378, 37385, 37392, 37399, 37406, 37413, + 37420, 37427, 37434, 37441, 37448, 37455, 37462, 37469, 37476, 37483, + 37490, 25291, 37497, 37504, 37511, 37518, 37525, 37532, 37539, 37546, + 37553, 37560, 37567, 30403, 37574, 37581, 37588, 37595, 37602, 37609, + 37616, 37623, 37630, 1747, 37637, 37644, 37651, 37658, 37665, 37672, + 37679, 37686, 37693, 37700, 37707, 37714, 37721, 37728, 37735, 37742, + 37749, 37756, 37763, 37770, 37777, 37784, 37791, 37798, 37805, 37812, + 37819, 37826, 37833, 37840, 37847, 37854, 37861, 37868, 37875, 37882, + 37889, 37896, 37903, 37910, 37917, 37924, 37931, 37938, 37945, 37952, + 37959, 37966, 30952, 37973, 37980, 37987, 37994, 38001, 38008, 38015, + 38022, 38029, 38036, 38043, 38050, 38057, 38064, 38071, 38078, 38085, + 38092, 38099, 38106, 38113, 38120, 38127, 38134, 38141, 38148, 38155, + 26512, 38162, 38169, 38176, 38183, 38190, 38197, 38204, 38211, 38218, + 38225, 38232, 38239, 38246, 38253, 34308, 38260, 38267, 38274, 38281, + 38288, 38295, 38302, 38309, 38316, 38323, 38330, 38337, 38344, 38351, + 38358, 38365, 38372, 38379, 38386, 38393, 38400, 38407, 38414, 38421, + 38428, 38435, 38442, 38449, 38456, 38463, 38470, 38477, 38484, 38491, + 38498, 38505, 38512, 38519, 38526, 38533, 38540, 38547, 38554, 38561, + 38568, 38575, 38582, 29166, 38589, 38596, 38603, 38610, 38617, 35596, + 38624, 38631, 38638, 38645, 38652, 38659, 38666, 38673, 38680, 38687, + 38694, 33196, 38701, 38708, 38715, 38722, 38729, 38736, 38743, 38750, + 38757, 38764, 38771, 38778, 38785, 38792, 38799, 38806, 38813, 38820, + 38827, 38834, 38841, 38848, 38855, 38862, 38869, 38876, 38883, 38890, + 38897, 38904, 30772, 38911, 38918, 38925, 38932, 23167, 38939, 38946, + 38953, 38960, 38967, 38974, 38981, 38988, 38995, 39002, 39009, 39016, + 39023, 39030, 39037, 39044, 39051, 39058, 39065, 39072, 39079, 39086, + 39093, 39100, 39107, 39114, 39121, 39128, 30970, 39135, 39142, 39149, + 28966, 39156, 39163, 39170, 39177, 39184, 39191, 39198, 39205, 39212, + 39219, 39226, 39233, 39240, 39247, 39254, 39261, 39267, 39273, 39279, + 39285, 39291, 39297, 39303, 39309, 39315, 39321, 39327, 38086, 33917, + 39333, 39339, 39345, 39351, 27927, 39357, 39363, 39369, 39375, 39381, + 39387, 39393, 39399, 27127, 39405, 39411, 39417, 39423, 39255, 39429, + 39435, 39441, 39447, 39453, 39459, 39465, 27227, 39471, 39477, 39483, + 39489, 39495, 39501, 39507, 39513, 39519, 39525, 39531, 39537, 39543, + 39549, 39555, 39561, 27287, 39567, 39573, 39579, 39585, 25061, 22148, + 39591, 19299, 28047, 39597, 39603, 39609, 39615, 19065, 39621, 39627, + 1312, 39633, 39639, 1549, 22580, 39645, 39651, 18347, 39657, 22448, + 39663, 39669, 1416, 39675, 18753, 39681, 19286, 39687, 39693, 39699, + 39705, 39711, 39717, 39723, 39729, 39735, 39741, 33613, 39747, 39753, + 39759, 39765, 27137, 39771, 39777, 39783, 39789, 39795, 39801, 39807, + 39813, 39819, 39825, 39831, 10973, 1198, 39837, 39843, 39849, 39855, + 39861, 39867, 39873, 39879, 39885, 39891, 39897, 39903, 39909, 39915, + 39921, 39927, 39933, 39939, 39945, 39951, 22460, 39957, 39963, 39969, + 39975, 39981, 39987, 39993, 39999, 40005, 40011, 40017, 40023, 40029, + 40035, 40041, 40047, 40053, 40059, 26876, 40065, 40071, 40077, 40083, + 40089, 40095, 40101, 40107, 40113, 40119, 40125, 30980, 27197, 40131, + 40137, 40143, 40149, 40155, 40161, 40167, 40173, 40179, 40185, 40191, + 40197, 40203, 40209, 40215, 40221, 40227, 40233, 40239, 40245, 40251, + 40257, 40263, 40269, 40275, 40281, 40287, 40293, 40299, 40305, 27377, + 40311, 40317, 40323, 40329, 40335, 40341, 40347, 40353, 40359, 40365, + 40371, 40377, 40383, 40389, 40395, 40401, 40407, 40413, 40419, 40425, + 40431, 40437, 40443, 40449, 40455, 40461, 40467, 40473, 40479, 40485, + 40491, 40497, 40503, 40509, 40515, 40521, 40527, 40533, 40539, 40545, + 32861, 40551, 40557, 40563, 40569, 40575, 40581, 40587, 40593, 40599, + 40605, 40611, 40617, 40623, 40629, 40635, 40641, 40647, 40653, 40659, + 40665, 40671, 40677, 40683, 40689, 40695, 40701, 40707, 40713, 26469, + 40719, 40725, 40731, 40737, 40743, 40749, 40755, 40761, 40767, 40773, + 40779, 40785, 40791, 40797, 40803, 40809, 40815, 40821, 40827, 40833, + 40839, 40845, 40851, 27367, 40857, 40863, 40869, 40875, 40881, 40887, + 40893, 40899, 40905, 40911, 40917, 40923, 40929, 40935, 40941, 40947, + 40953, 40959, 40965, 40971, 40977, 40983, 40989, 40995, 41001, 41007, + 41013, 41019, 41025, 41031, 41037, 41043, 37827, 41049, 41055, 41061, + 41067, 41073, 41079, 41085, 41091, 41097, 41103, 34469, 41109, 41115, + 41121, 41127, 41133, 41139, 41145, 41151, 41157, 41163, 41169, 41175, + 41181, 36093, 41187, 41193, 41199, 41205, 41211, 41217, 41223, 41229, + 41235, 41241, 41247, 41253, 41259, 41265, 41271, 41277, 41283, 41289, + 41295, 41301, 41307, 41313, 41319, 41325, 41331, 41337, 41343, 41349, + 41355, 41361, 41367, 41373, 41379, 41385, 41391, 41397, 41403, 41409, + 41415, 41421, 41427, 41433, 41439, 41445, 34701, 41451, 41457, 41463, + 41469, 41475, 41481, 41487, 22712, 41493, 41499, 41505, 41511, 41517, + 41523, 41529, 41535, 41541, 41547, 41553, 41559, 41565, 41571, 41577, + 41583, 41589, 41595, 41601, 41607, 41613, 41619, 41625, 41631, 41637, + 41643, 41649, 41655, 41661, 41667, 41673, 41679, 41685, 41691, 41697, + 41703, 41709, 41715, 41721, 41727, 41733, 41739, 41745, 41751, 41757, + 41763, 41769, 41775, 41781, 41787, 41793, 41799, 41805, 41811, 41817, + 41823, 41829, 41835, 41841, 41847, 41853, 41859, 41865, 41871, 41877, + 41883, 41889, 41895, 41901, 41907, 41913, 41919, 41925, 41931, 41937, + 41943, 41949, 41955, 41961, 41967, 41973, 41979, 41985, 41991, 41997, + 42003, 42009, 42015, 42021, 42027, 42033, 42039, 42045, 42051, 42057, + 42063, 42069, 42075, 42081, 42087, 42093, 42099, 42105, 42111, 42117, + 42123, 42129, 42135, 42141, 42147, 42153, 42159, 42165, 42171, 42177, + 42183, 42189, 37169, 42195, 42201, 42207, 42213, 42219, 42225, 42231, + 42237, 42243, 42249, 42255, 42261, 42267, 42273, 42279, 42285, 42291, + 42297, 42303, 42309, 42315, 42321, 42327, 42333, 42339, 42345, 42351, + 42357, 42363, 42369, 42375, 42381, 42387, 42393, 42399, 42405, 42411, + 42417, 42423, 42429, 42435, 42441, 42447, 42453, 42459, 42465, 42471, + 42477, 42483, 42489, 42495, 42501, 42507, 42513, 42519, 42525, 42531, + 42537, 42543, 42549, 42555, 42561, 42567, 42573, 42579, 42585, 42591, + 42597, 42603, 42609, 42615, 42621, 42627, 42633, 42639, 42645, 42651, + 42657, 42663, 42669, 42675, 42681, 42687, 42693, 42699, 42705, 42711, + 42717, 42723, 42729, 32393, 42735, 42741, 42747, 42753, 42759, 42765, + 42771, 42777, 42783, 42789, 42795, 42801, 42807, 42813, 42819, 42825, + 42831, 42837, 42843, 42849, 42855, 10943, 42861, 42867, 42873, 42879, + 42885, 42891, 42897, 42903, 42909, 42915, 42921, 42927, 42933, 42939, + 22496, 42945, 42951, 42957, 39122, 42963, 42969, 30989, 42975, 42981, + 42987, 42993, 42999, 43005, 43011, 43017, 43023, 43029, 43035, 43041, + 43047, 43053, 43059, 43065, 43071, 43077, 43083, 43089, 43095, 43101, + 43107, 43113, 43119, 43125, 43131, 43137, 43143, 43149, 43155, 43161, + 43167, 43173, 43179, 43185, 29087, 43191, 43197, 43203, 43209, 43215, + 43221, 43227, 43233, 43239, 43245, 43251, 43257, 43263, 43269, 43275, + 43281, 43287, 43293, 43299, 43305, 43311, 43317, 43323, 43329, 43335, + 43341, 43347, 43353, 43359, 43365, 43371, 43376, 43381, 43386, 43391, + 43396, 43401, 43406, 43411, 43416, 30198, 43421, 19157, 43426, 43431, + 40864, 43436, 43441, 43446, 28858, 43451, 43456, 43461, 43466, 43471, + 43476, 43481, 43486, 43491, 43496, 43501, 43506, 43511, 43060, 43516, + 41068, 29308, 43521, 43526, 43531, 39784, 43536, 43541, 43546, 43551, + 43556, 43561, 43566, 43571, 43576, 40024, 43581, 43586, 43591, 43596, + 43601, 32682, 43606, 43611, 43616, 43621, 43626, 43631, 43636, 43641, + 43646, 43651, 43656, 43661, 43666, 43671, 43676, 43681, 43686, 43691, + 43696, 1377, 43701, 43706, 43711, 43716, 17919, 43721, 43726, 43731, + 43736, 43741, 43746, 43751, 43756, 43761, 43766, 43771, 43776, 43781, + 43786, 40900, 43791, 43796, 43801, 43806, 43811, 43816, 43821, 43826, + 43831, 43836, 43841, 43846, 43851, 43856, 43861, 43866, 43871, 43876, + 43881, 43886, 39880, 43891, 43896, 42916, 43901, 43906, 434, 43911, + 31152, 43916, 43921, 43926, 43931, 43936, 43941, 43946, 43951, 43956, + 1153, 43961, 43966, 43971, 43976, 43981, 27058, 43986, 43991, 43996, + 44001, 44006, 44011, 39382, 44016, 44021, 44026, 44031, 44036, 44041, + 44046, 44051, 44056, 44061, 44066, 44071, 44076, 44081, 44086, 44091, + 44096, 44101, 44106, 44111, 18949, 44116, 44121, 44126, 44131, 44136, + 44141, 44146, 44151, 44156, 44161, 44166, 44171, 44176, 44181, 44186, + 44191, 43294, 44196, 38220, 44201, 44206, 44211, 44216, 44221, 44226, + 44231, 44236, 42958, 19404, 44241, 44246, 44251, 44256, 40120, 44261, + 44266, 44271, 44276, 44281, 44286, 44291, 44296, 26437, 44301, 44306, + 44311, 44316, 29288, 44321, 44326, 44331, 44336, 44341, 44346, 44351, + 44356, 44361, 44366, 44371, 44376, 44381, 44386, 44391, 44396, 44401, + 44406, 44411, 44416, 44421, 44426, 44431, 44436, 44441, 44446, 44451, + 44456, 44461, 44466, 44471, 44476, 26591, 44481, 44486, 44491, 44496, + 27388, 44501, 33830, 44506, 44511, 44516, 44521, 44526, 44531, 44536, + 44541, 44546, 44551, 44556, 44561, 44566, 44571, 44576, 44581, 44586, + 44591, 44596, 44601, 42634, 44606, 44611, 44616, 32745, 44621, 44626, + 30819, 44631, 44636, 44641, 44646, 44651, 44656, 41446, 44661, 44666, + 37100, 44671, 44676, 44681, 18572, 44686, 44691, 44696, 44701, 35590, + 44706, 44711, 44716, 44721, 44726, 44731, 36974, 38633, 44736, 44741, + 44746, 44751, 44756, 44761, 44766, 44771, 44776, 44781, 44786, 44791, + 44796, 44801, 44806, 44811, 44816, 44821, 44826, 44831, 44836, 44841, + 44846, 44851, 43054, 44856, 37275, 44861, 44866, 44871, 44876, 36358, + 44881, 44886, 44891, 44896, 44901, 44906, 44911, 44916, 44921, 44926, + 44931, 44936, 44941, 44946, 44951, 44956, 44961, 44966, 44971, 44976, + 44981, 28938, 44986, 44991, 44996, 45001, 45006, 38136, 45011, 45016, + 45021, 45026, 45031, 45036, 45041, 45046, 32934, 45051, 45056, 45061, + 45066, 45071, 45076, 45081, 45086, 45091, 45096, 45101, 45106, 45111, + 45116, 45121, 45126, 45131, 45136, 45141, 45146, 45151, 45156, 45161, + 45166, 45171, 45176, 45181, 45186, 45191, 45196, 45201, 45206, 45211, + 45216, 45221, 45226, 45231, 45236, 45241, 45246, 45251, 45256, 45261, + 45266, 45271, 45276, 45281, 45286, 45291, 45296, 45301, 45306, 45311, + 45316, 45321, 45326, 45331, 45336, 45341, 45346, 45351, 45356, 45361, + 45366, 45371, 45376, 45381, 45386, 45391, 45396, 45401, 45406, 45411, + 45416, 45421, 45426, 45431, 45436, 45441, 45446, 45451, 45456, 45461, + 45466, 45471, 45476, 45481, 45486, 45491, 45496, 45501, 45506, 45511, + 45516, 45521, 45526, 45531, 45536, 45541, 45546, 45551, 45556, 45561, + 45566, 45571, 45576, 45581, 45586, 45591, 45596, 45601, 45606, 45611, + 45616, 45621, 45626, 45631, 45636, 45641, 45646, 45651, 45656, 45661, + 45666, 45671, 45676, 45681, 45686, 45691, 45696, 45701, 45706, 45711, + 45716, 45721, 45726, 40750, 40756, 40762, 45731, 45736, 45741, 45746, + 45751, 45756, 45761, 45766, 45771, 45776, 29328, 40768, 40774, 40780, + 45781, 42142, 45786, 45791, 45796, 45801, 45806, 45811, 45816, 45821, + 45826, 45831, 45836, 45841, 45846, 40894, 45851, 45856, 45861, 45866, + 45871, 45876, 45881, 45886, 45891, 45896, 45901, 45906, 45911, 45916, + 45921, 45926, 39682, 45931, 45936, 45941, 45946, 45951, 45956, 45961, + 45966, 45971, 45976, 45981, 45986, 45991, 45996, 46001, 46006, 46011, + 46016, 46021, 46026, 46031, 46036, 46041, 46046, 46051, 46056, 46061, + 46066, 46071, 46076, 46081, 46086, 46091, 46096, 46101, 46106, 46111, + 46116, 46121, 46126, 46131, 46136, 46141, 46146, 46151, 46156, 46161, + 46166, 46171, 46176, 46181, 41074, 41080, 46186, 46191, 46196, 46201, + 46206, 46211, 46216, 46221, 41092, 41098, 46226, 46231, 30666, 46236, + 46241, 46246, 43258, 43264, 46251, 46256, 46261, 46266, 46271, 46276, + 46281, 46286, 46291, 46296, 46301, 46306, 46311, 46316, 46321, 46326, + 46331, 46336, 46341, 46346, 46351, 46356, 46361, 46366, 46371, 46376, + 46381, 46386, 46391, 46396, 46401, 46406, 46411, 46416, 46421, 46426, + 41374, 46431, 41380, 46436, 46441, 46446, 18446, 33486, 46451, 41386, + 41392, 41398, 41404, 41410, 41416, 46456, 46461, 46466, 46471, 40924, + 46476, 40810, 46481, 46486, 46491, 42976, 46496, 46501, 46506, 46511, + 46516, 46521, 46526, 46531, 46536, 46541, 46546, 46551, 46556, 46561, + 46566, 46571, 46576, 46581, 46586, 46591, 46596, 46601, 46606, 46611, + 46616, 46621, 46626, 46631, 46636, 46641, 46646, 46651, 46656, 46661, + 46666, 46671, 46676, 46681, 46686, 46691, 46696, 46701, 46706, 46711, + 46716, 46721, 46726, 46731, 46736, 46741, 46746, 46751, 46756, 46761, + 46766, 46771, 46776, 42484, 40960, 40966, 40972, 42562, 46781, 46786, + 46791, 46796, 46801, 46806, 46811, 46816, 46821, 46826, 46831, 46836, + 46841, 46846, 46851, 46856, 46861, 46866, 46871, 46876, 46881, 46886, + 46891, 46896, 46901, 46906, 41686, 41692, 41698, 46911, 46916, 46921, + 46926, 46931, 46936, 46941, 46946, 46951, 46956, 46961, 46966, 46971, + 46976, 46981, 46986, 41704, 46991, 41710, 41716, 42232, 46996, 47001, + 47006, 47011, 47016, 47021, 47026, 47031, 47036, 47041, 47046, 47051, + 47056, 47061, 47066, 47071, 47076, 47081, 47086, 47091, 47096, 47101, + 47106, 47111, 47116, 47121, 47126, 47131, 47136, 47141, 47146, 47151, + 39280, 47156, 47161, 47166, 47171, 47176, 47181, 47186, 47191, 47196, + 43024, 47201, 47206, 41500, 47211, 41506, 47216, 47221, 47226, 47231, + 47236, 41512, 47241, 41518, 41524, 41530, 47246, 38031, 47251, 47256, + 47261, 47266, 47271, 47276, 47281, 47286, 47291, 47296, 47301, 47306, + 47311, 47316, 47321, 47326, 47331, 47336, 47341, 41536, 41542, 47346, + 47351, 47356, 47361, 47366, 47371, 47376, 47381, 47386, 35374, 47391, + 47396, 41548, 47401, 41554, 29338, 41560, 47406, 47411, 47416, 47421, + 38542, 47426, 47431, 47436, 47441, 47446, 47451, 47456, 47461, 47466, + 47471, 47476, 47481, 47486, 47491, 47496, 47501, 47506, 47511, 47516, + 47521, 47526, 39646, 47531, 47536, 47541, 47546, 47551, 47556, 47561, + 47566, 47571, 47576, 47581, 42238, 47586, 47591, 47596, 47601, 47606, + 47611, 47616, 42244, 47621, 42250, 47626, 47631, 47636, 47641, 41572, + 41584, 39586, 47646, 47651, 47656, 47661, 47666, 47671, 47676, 47681, + 47686, 47691, 47696, 47701, 47706, 47711, 47716, 47721, 47726, 47731, + 38773, 47736, 47741, 47746, 47751, 47756, 47761, 47766, 47771, 47776, + 47781, 47786, 47791, 47796, 47801, 47806, 47811, 47816, 47821, 47826, + 41590, 47831, 47836, 47841, 47846, 47851, 47856, 47861, 47866, 47871, + 47876, 47881, 47886, 47891, 47896, 47901, 47906, 47911, 47916, 47921, + 47926, 47931, 47936, 47941, 47946, 47951, 47956, 47961, 47966, 47971, + 47976, 47981, 47986, 47991, 47996, 48001, 48006, 48011, 48016, 48021, + 48026, 48031, 48036, 48041, 48046, 48051, 48056, 48061, 48066, 48071, + 48076, 48081, 48086, 48091, 48096, 48101, 48106, 48111, 48116, 48121, + 48126, 48131, 48136, 48141, 48146, 48151, 48156, 48161, 48166, 48171, + 48176, 48181, 48186, 48191, 48196, 48201, 48206, 48211, 48216, 48221, + 48226, 48231, 48236, 48241, 48246, 48251, 48256, 48261, 48266, 48271, + 48276, 48281, 48286, 48291, 48296, 42520, 48301, 48306, 48311, 48316, + 48321, 48326, 48331, 48336, 48341, 48346, 48351, 48356, 48361, 48366, + 48371, 48376, 48381, 48386, 48391, 48396, 42646, 42274, 48401, 42280, + 48406, 48411, 48416, 48421, 48426, 48431, 48436, 48441, 48446, 48451, + 48456, 48461, 48466, 48471, 48476, 48481, 48486, 48491, 48496, 48501, + 48506, 48511, 48516, 48521, 48526, 48531, 48536, 48541, 42880, 42886, + 48546, 48551, 48556, 48561, 48566, 31089, 48571, 942, 48576, 48581, + 48586, 48591, 48596, 48601, 48606, 48611, 48616, 48621, 48626, 48631, + 48636, 48641, 48646, 48651, 48656, 48661, 48666, 48671, 48676, 48681, + 48686, 48691, 48696, 48701, 48706, 48711, 48716, 48721, 27328, 48726, + 48731, 42892, 48736, 48741, 48746, 48751, 48756, 48761, 48766, 48771, + 48776, 48781, 42382, 48786, 48791, 48796, 48801, 48806, 48811, 48816, + 48821, 48826, 27138, 48831, 48836, 48841, 48846, 48851, 48856, 38486, + 48861, 48866, 48871, 48876, 48881, 48886, 48891, 48896, 48901, 48906, + 48911, 48916, 48921, 48926, 48931, 48936, 48941, 48946, 48951, 48956, + 48961, 48966, 40636, 48971, 33406, 39011, 29348, 48976, 48981, 48986, + 48991, 48996, 49001, 49006, 49011, 49016, 33702, 49021, 49026, 49031, + 49036, 49041, 41620, 41626, 41632, 49046, 41650, 41836, 41842, 49051, + 49056, 49061, 49066, 49071, 49076, 49081, 49086, 49091, 49096, 49101, + 49106, 49111, 49116, 49121, 49126, 49131, 49136, 49141, 42292, 42298, + 42304, 49146, 49151, 49156, 49161, 49166, 49171, 49176, 49181, 49186, + 42310, 49191, 42316, 49196, 49201, 49206, 49211, 49216, 49221, 49226, + 49231, 49236, 49241, 49246, 49251, 49256, 49261, 49266, 49271, 49276, + 49281, 49286, 49291, 49296, 49301, 49306, 42322, 42328, 49311, 42334, + 42340, 42346, 49316, 49321, 49326, 49331, 49336, 49341, 49346, 49351, + 49356, 49361, 49366, 49371, 49376, 49381, 49386, 49391, 49396, 49401, + 49406, 49411, 49416, 602, 49420, 27259, 49424, 33007, 24876, 49428, + 49432, 49436, 33959, 42581, 49440, 49444, 19743, 41909, 26427, 49448, + 49452, 49456, 41225, 32368, 40451, 49460, 49464, 49468, 32638, 49472, + 49476, 49480, 39395, 39797, 45837, 49484, 49488, 49492, 22282, 49496, + 49500, 49504, 38858, 41069, 49508, 18601, 49512, 49516, 49520, 28969, + 49524, 49528, 49532, 49536, 39473, 45832, 49540, 33559, 27159, 45652, + 36268, 19197, 39737, 49544, 26570, 49548, 44277, 31081, 49552, 49556, + 49560, 49564, 30451, 38543, 49568, 29069, 40811, 49572, 37374, 48912, + 49576, 40895, 46937, 49580, 49584, 44857, 49588, 49592, 38914, 49596, + 43817, 23302, 45842, 49600, 49604, 49608, 49612, 260, 35095, 49616, + 49620, 25503, 49624, 49628, 39845, 49632, 30928, 40409, 49636, 49640, + 49644, 46227, 49648, 49652, 49656, 49660, 46067, 49664, 49668, 49672, + 49676, 49680, 47192, 49684, 49688, 49692, 49696, 49700, 46912, 33052, + 49704, 49708, 49712, 49716, 49720, 49724, 49728, 49732, 49736, 47732, + 33943, 49740, 49744, 49748, 49752, 49756, 49760, 49764, 48582, 49768, + 27439, 43055, 40319, 34151, 49772, 49776, 49780, 40481, 46457, 46462, + 49784, 46232, 39131, 49788, 49792, 49796, 49800, 45847, 36842, 49804, + 48442, 32125, 49808, 40523, 35775, 37332, 49812, 49816, 42239, 49820, + 37136, 24694, 45892, 38123, 49824, 49828, 49832, 49836, 48567, 49840, + 49844, 49848, 44827, 49852, 49856, 49860, 49864, 49868, 49872, 47727, + 46742, 49876, 38746, 49880, 49884, 49888, 49892, 49896, 49900, 49904, + 49908, 47742, 48307, 49912, 49916, 49920, 49924, 49928, 49932, 48877, + 31270, 37213, 48887, 49936, 22030, 49940, 1177, 48922, 48927, 29089, + 48712, 49944, 34047, 49948, 49952, 49956, 49960, 49964, 40493, 49968, + 49972, 37423, 45067, 49976, 49980, 37430, 43295, 49984, 49988, 40013, + 49992, 49996, 50000, 50004, 50008, 50012, 50016, 30739, 45667, 50020, + 45817, 38291, 34607, 50024, 50028, 50032, 50036, 50040, 50044, 50048, + 50052, 50056, 50060, 50064, 50068, 50072, 50076, 50080, 50084, 50088, + 50092, 50096, 31144, 50100, 50104, 50108, 50112, 50116, 50120, 50124, + 50128, 46342, 46347, 50132, 50136, 50140, 50144, 50148, 50152, 50156, + 50160, 46377, 50164, 40901, 43692, 50168, 50172, 42809, 50176, 50180, + 50184, 50188, 50192, 41159, 50196, 33079, 50200, 50204, 50208, 50212, + 50216, 50220, 50224, 50228, 50232, 46202, 44837, 44842, 46527, 50236, + 50240, 50244, 46587, 50248, 22750, 50252, 50256, 46637, 50260, 30748, + 50264, 50268, 50272, 50276, 50280, 35103, 50284, 50288, 50292, 50296, + 50300, 50304, 43972, 50308, 42257, 50312, 50316, 50320, 50324, 24898, + 50328, 32503, 50332, 50336, 33903, 50340, 50344, 50348, 41963, 50352, + 50356, 50360, 50364, 50368, 18447, 47747, 973, 50372, 50376, 50380, + 50384, 48587, 50388, 30289, 50392, 50396, 50400, 50404, 50408, 50412, + 50416, 50420, 50424, 50428, 50432, 48882, 50436, 50440, 50444, 50448, + 35671, 50452, 50456, 34495, 50460, 40031, 50464, 50468, 50472, 30325, + 50476, 42605, 50480, 38445, 50484, 50488, 50492, 50496, 50500, 50504, + 50508, 50512, 41417, 40487, 50516, 50520, 40403, 50524, 50528, 50532, + 50536, 50540, 47867, 50544, 47882, 47912, 50548, 50552, 50556, 48737, + 50560, 50564, 50568, 44287, 50572, 44617, 47972, 50576, 50580, 50584, + 42017, 50588, 49067, 34375, 42161, 50592, 50596, 43229, 31099, 40253, + 50600, 32989, 50604, 34559, 27229, 50608, 50612, 50616, 50620, 50624, + 50628, 50632, 50636, 50640, 50644, 50648, 50652, 50656, 50660, 50664, + 50668, 50672, 50676, 50680, 50684, 50688, 50692, 50696, 50700, 50704, + 50708, 50712, 50716, 50720, 50724, 50728, 50732, 50736, 50740, 50744, + 50748, 50752, 50756, 50760, 50764, 50768, 50772, 50776, 50780, 50784, + 50788, 50792, 50796, 50800, 50804, 50808, 50812, 50816, 50820, 50824, + 50828, 50832, 50836, 50840, 50844, 50848, 50852, 50856, 50860, 50864, + 50868, 50872, 50876, 50880, 50884, 50888, 50892, 50896, 50900, 50904, + 50908, 50912, 50916, 50920, 50924, 50928, 50932, 50936, 50940, 50944, + 50948, 50952, 50956, 50960, 50964, 50968, 50972, 50976, 50980, 50984, + 50988, 50992, 50996, 51000, 51004, 51008, 51012, 51016, 51020, 51024, + 51028, 51032, 51036, 51040, 51044, 51048, 51052, 51056, 51060, 51064, + 51068, 51072, 45597, 35295, 45607, 51076, 51080, 51084, 51088, 51092, + 51096, 51100, 32494, 51104, 51108, 45612, 51112, 51116, 45617, 51120, + 51124, 44587, 51128, 45627, 45632, 45637, 51132, 51136, 45642, 45647, + 45657, 45662, 44197, 45672, 51140, 51144, 51148, 45677, 47497, 45682, + 45687, 51152, 30100, 51156, 51160, 51164, 51168, 51172, 51176, 51180, + 51184, 51188, 51192, 45822, 51196, 51200, 51204, 51208, 51212, 36541, + 51216, 51220, 51224, 51228, 51232, 51236, 51240, 51244, 51248, 51252, + 51256, 51260, 51264, 51268, 51272, 51276, 25481, 51280, 51284, 35543, + 51288, 46052, 51292, 46057, 36135, 51296, 46062, 51300, 42071, 46072, + 39647, 51304, 46082, 46087, 46092, 46097, 46102, 46857, 51308, 51312, + 51316, 46107, 48447, 46112, 46122, 51320, 51324, 51328, 46127, 46132, + 44267, 46137, 46142, 46147, 51332, 51336, 51340, 51344, 51348, 51352, + 51356, 51360, 51364, 51368, 51372, 51376, 51380, 51384, 26339, 44552, + 51388, 51392, 51396, 51400, 41117, 51404, 51408, 51412, 51416, 51420, + 51424, 51428, 51432, 51436, 51440, 51444, 51448, 51452, 51456, 51460, + 51464, 51468, 51472, 51476, 51480, 51484, 51488, 51492, 51496, 51500, + 51504, 51508, 51512, 46327, 51516, 46332, 46337, 51520, 51524, 37010, + 46352, 51528, 46357, 51532, 51536, 51540, 46362, 51544, 46367, 46372, + 51548, 44342, 46382, 51552, 461, 51556, 44347, 46387, 46392, 46397, + 46402, 46407, 46412, 46417, 51560, 51564, 51568, 51572, 51576, 51580, + 44467, 29909, 45857, 45867, 30217, 35999, 51584, 51588, 45872, 45877, + 45882, 41939, 51592, 51596, 51600, 51604, 44117, 26394, 32359, 51608, + 51612, 51616, 51620, 51624, 51628, 34967, 51632, 51636, 51640, 51644, + 51648, 45887, 32431, 44812, 36975, 45902, 45907, 51652, 45912, 39683, + 44742, 44747, 44752, 51656, 51660, 51664, 51668, 51672, 51676, 51680, + 51684, 51688, 51692, 51696, 49142, 31198, 40751, 40643, 40763, 26405, + 45007, 51700, 41747, 36031, 48837, 51704, 51708, 51712, 51716, 51720, + 51724, 44452, 46917, 46922, 46927, 51728, 51732, 51736, 46932, 46942, + 51740, 46947, 46952, 46957, 44457, 46962, 51744, 46967, 47707, 46972, + 46977, 51748, 51752, 32089, 51756, 51760, 47067, 51764, 622, 51768, + 51772, 25426, 51776, 51780, 51784, 51788, 51792, 51796, 51800, 51804, + 51808, 51812, 51816, 51820, 22210, 51824, 51828, 51832, 51836, 51840, + 51844, 51848, 51852, 51856, 51860, 51864, 51868, 51872, 51876, 51880, + 51884, 51888, 51892, 51896, 51900, 51904, 51908, 29899, 46502, 51912, + 44317, 46512, 51916, 51920, 46517, 36331, 24777, 51924, 44832, 48847, + 51928, 51932, 51936, 46277, 51940, 46537, 46542, 51944, 51948, 51952, + 46547, 51956, 284, 46552, 46557, 46562, 44757, 46572, 46577, 46582, + 46592, 46597, 51960, 30460, 51964, 46607, 46612, 51968, 51972, 51976, + 51980, 51984, 51988, 51992, 51996, 52000, 46617, 52004, 52008, 52012, + 52016, 46622, 41891, 46632, 52020, 52024, 46642, 46647, 46652, 46657, + 46662, 38298, 46672, 52028, 46677, 52032, 46687, 52036, 42095, 52040, + 46692, 18190, 46702, 52044, 52048, 52052, 52056, 52060, 39815, 52064, + 40085, 22678, 22138, 52068, 46707, 52072, 46712, 52076, 33679, 52080, + 35871, 27879, 46717, 41429, 46722, 33407, 46732, 52084, 52088, 52092, + 52096, 52100, 52104, 52108, 46737, 43337, 46747, 52112, 52116, 52120, + 52124, 52128, 46752, 52132, 52136, 46757, 52140, 52144, 52148, 37661, + 52152, 52156, 52160, 52164, 43259, 43265, 52168, 52172, 52176, 19652, + 43001, 52180, 52184, 52188, 44187, 52192, 52196, 52200, 52204, 52208, + 52212, 52216, 52220, 52224, 48577, 52228, 52232, 41123, 52236, 52240, + 52244, 52248, 52252, 52256, 52260, 52264, 52268, 52272, 52276, 52280, + 52284, 52288, 52292, 52296, 52300, 52304, 52308, 52312, 52316, 52320, + 52324, 52328, 52332, 52336, 52340, 52344, 52348, 52352, 52356, 52360, + 52364, 52368, 52372, 52376, 52380, 52384, 52388, 52392, 52396, 52400, + 52404, 52408, 52412, 52416, 52420, 52424, 52428, 52432, 52436, 52440, + 52444, 47752, 33119, 52448, 47757, 41363, 47767, 29009, 35311, 52452, + 52456, 52460, 43073, 52464, 52468, 43792, 48332, 47777, 52472, 52476, + 52480, 52484, 52488, 48342, 47782, 47787, 47792, 47797, 52492, 52496, + 47802, 47807, 47812, 47817, 52500, 52504, 52508, 36063, 25514, 48602, + 52512, 52516, 48612, 48617, 52520, 52524, 52528, 48622, 52532, 52536, + 48627, 48632, 52540, 52544, 52548, 38648, 48642, 48647, 52552, 48652, + 52556, 30109, 52560, 44377, 52564, 48657, 52568, 48662, 48667, 48672, + 48677, 48682, 48687, 52572, 52576, 52580, 52584, 52588, 52592, 52596, + 52600, 52604, 52608, 52612, 48892, 48697, 52616, 52620, 52624, 52628, + 52632, 52636, 52640, 52644, 52648, 52652, 52656, 52660, 1955, 52664, + 52668, 52672, 52676, 52680, 52684, 52688, 52692, 52696, 52700, 52704, + 52708, 52712, 52716, 52720, 52724, 52728, 52732, 52736, 49167, 46257, + 52740, 52744, 27869, 52748, 52752, 45062, 29329, 40769, 40775, 33687, + 37276, 52756, 34447, 52760, 52764, 52768, 52772, 52776, 52780, 52784, + 52788, 52792, 52796, 52800, 52804, 52808, 52812, 52816, 52820, 52824, + 52828, 52832, 52836, 52840, 52844, 52848, 52852, 52856, 52860, 52864, + 52868, 52872, 52876, 52880, 52884, 52888, 52892, 52896, 47112, 47117, + 46807, 46812, 44422, 46817, 52900, 44427, 52904, 46822, 46827, 44432, + 47122, 47127, 47132, 52908, 52912, 52916, 52920, 52924, 52928, 52932, + 52936, 52940, 52944, 52948, 52952, 52956, 37626, 52960, 52964, 52968, + 44382, 52972, 52976, 52980, 52984, 52988, 52992, 47862, 52996, 44607, + 47872, 47877, 44612, 47887, 53000, 47892, 47897, 53004, 47902, 47907, + 53008, 53012, 53016, 53020, 53024, 47917, 47922, 47927, 49342, 47932, + 53028, 47937, 47942, 47947, 47952, 53032, 48962, 53036, 47957, 47962, + 53040, 47967, 53044, 47977, 48747, 47982, 47987, 47992, 47997, 53048, + 42474, 36675, 1086, 19640, 49781, 603, 39492, 28980, 27870, 33560, 5572, + 19198, 53052, 53055, 53058, 31190, 33296, 4804, 5060, 32504, 50381, + 45013, 53061, 37438, 39864, 50369, 32288, 38138, 49533, 5316, 53064, + 26516, 53067, 36955, 53070, 36731, 49589, 29110, 50293, 43224, 40230, + 974, 53073, 10931, 53076, 24899, 53079, 44743, 34008, 651, 38544, 42522, + 31910, 1419, 672, 4868, 6084, 51633, 18896, 49108, 53082, 26571, 23315, + 44553, 44748, 51669, 49757, 37704, 23111, 53085, 45893, 22643, 800, + 18938, 764, 40410, 44053, 991, 40086, 1155, 38446, 53088, 53091, 23171, + 53094, 41826, 28910, 25130, 41046, 32198, 53097, 38642, 23435, 40032, + 43290, 53100, 53103, 53106, 53109, 42018, 53112, 51185, 22679, 53115, + 22703, 37662, 53118, 53121, 53124, 22139, 53127, 43170, 35872, 25427, + 30929, 53130, 53133, 42468, 53136, 5124, 51093, 51305, 38992, 53139, + 30452, 50185, 53142, 11036, 27850, 36899, 51661, 31145, 53145, 38761, + 51089, 53148, 30479, 26582, 22391, 40218, 37270, 37851, 1127, 10756, + 53151, 298, 40518, 51657, 49208, 53154, 41988, 50001, 18951, 24695, 5908, + 27900, 19445, 34040, 50189, 22583, 53157, 53160, 53163, 33152, 53166, + 18448, 33080, 51085, 53169, 36000, 33800, 39936, 53172, 53175, 53178, + 29260, 36710, 53181, 53184, 18378, 53187, 36997, 43134, 53190, 12, 53193, + 53196, 5380, 51181, 49553, 53199, 39600, 31028, 623, 36096, 6148, 53202, + 53205, 53208, 53211, 33008, 1091, 34120, 53214, 53217, 22739, 53220, + 37543, 22451, 53223, 51961, 49168, 53226, 24659, 34112, 51097, 53229, + 51189, 28000, 53232, 53235, 53238, 32495, 36339, 50501, 53241, 40686, + 53244, 53247, 53250, 53253, 53256, 53259, 42594, 53262, 53265, 53268, + 53271, 53274, 53277, 53280, 52541, 53283, 26989, 31019, 53286, 53289, + 53292, 53295, 53298, 45888, 51377, 53301, 1178, 285, 53304, 53307, 53310, + 26329, 53313, 52673, 53316, 37144, 35760, 53319, 50621, 51393, 53322, + 18131, 53325, 4676, 4692, 48873, 53328, 30461, 50525, 24683, 45608, + 53331, 53334, 53337, 27440, 5348, 5364, 1476, 53340, 53343, 5588, 53346, + 53349, 53352, 53355, 53358, 47158, 24778, 6164, 51429, 53361, 53364, + 53367, 51357, 324, 53370, 53373, 53376, 53379, 51541, 38943, 27530, + 26395, 40254, 53382, 26384, 1082, 50193, 53385, 42006, 794, 53388, 53391, + 53394, 53397, 53400, 53403, 53406, 53409, 53412, 45003, 53415, 52657, + 53418, 786, 53421, 40068, 53424, 53427, 53430, 53433, 53436, 53439, + 53442, 53445, 45053, 53448, 53451, 44513, 53454, 53457, 53460, 40500, + 53463, 53466, 53469, 40776, 29340, 53472, 53475, 53478, 1972, 52233, + 53481, 53484, 41154, 53487, 53490, 45998, 53493, 53496, 53499, 53502, + 53505, 30011, 53508, 53511, 53514, 37557, 52557, 53517, 53520, 53523, + 53526, 40092, 53529, 53532, 18868, 44348, 1032, 46868, 53535, 53538, + 39336, 53541, 46773, 53544, 51149, 51881, 53547, 53550, 45813, 53553, + 44153, 53556, 52161, 19407, 416, 286, 38237, 1316, 2325, 39973, 21, 38, + 32694, 50274, 53559, 30075, 53561, 320, 36305, 53563, 36235, 42469, + 49918, 213, 44189, 53565, 479, 34049, 53518, 53567, 919, 40093, 42079, + 316, 395, 53569, 885, 30651, 204, 53571, 53329, 53573, 53575, 4, 27891, + 1102, 43604, 1115, 36466, 53577, 53579, 24834, 892, 50538, 373, 53200, + 771, 88, 51526, 703, 53581, 351, 106, 44484, 53116, 39793, 24867, 39325, + 53583, 53585, 35145, 49498, 53587, 53589, 53591, 25164, 43679, 53593, + 53595, 34617, 51966, 53597, 8, 1056, 554, 998, 36034, 39, 98, 14, 5, 161, + 102, 317, 70, 9, 52, 321, 34, 53225, 401, 171, 404, 523, 53599, 53600, }; /* code->name phrasebook */ -#define phrasebook_shift 8 -#define phrasebook_short 231 +#define phrasebook_shift 7 +#define phrasebook_short 226 static unsigned char phrasebook[] = { - 0, 242, 69, 236, 186, 65, 238, 76, 65, 83, 57, 242, 158, 57, 240, 248, - 57, 237, 124, 236, 190, 36, 236, 47, 37, 236, 47, 238, 77, 249, 4, 57, - 242, 84, 235, 243, 213, 189, 239, 144, 27, 244, 173, 27, 121, 27, 114, - 27, 153, 27, 163, 27, 168, 27, 169, 27, 179, 27, 176, 27, 178, 242, 81, - 237, 123, 206, 57, 242, 61, 57, 196, 57, 239, 126, 65, 237, 127, 253, - 220, 9, 5, 1, 64, 9, 5, 1, 199, 9, 5, 1, 203, 9, 5, 1, 187, 9, 5, 1, 70, - 9, 5, 1, 204, 9, 5, 1, 194, 9, 5, 1, 164, 9, 5, 1, 69, 9, 5, 1, 200, 9, - 5, 1, 205, 9, 5, 1, 148, 9, 5, 1, 171, 9, 5, 1, 183, 9, 5, 1, 78, 9, 5, - 1, 198, 9, 5, 1, 209, 9, 5, 1, 135, 9, 5, 1, 159, 9, 5, 1, 190, 9, 5, 1, - 84, 9, 5, 1, 186, 9, 5, 1, 201, 9, 5, 1, 170, 9, 5, 1, 181, 9, 5, 1, 202, - 36, 30, 110, 240, 219, 239, 144, 37, 30, 110, 157, 240, 203, 253, 113, - 244, 176, 244, 201, 240, 203, 9, 3, 1, 64, 9, 3, 1, 199, 9, 3, 1, 203, 9, - 3, 1, 187, 9, 3, 1, 70, 9, 3, 1, 204, 9, 3, 1, 194, 9, 3, 1, 164, 9, 3, - 1, 69, 9, 3, 1, 200, 9, 3, 1, 205, 9, 3, 1, 148, 9, 3, 1, 171, 9, 3, 1, - 183, 9, 3, 1, 78, 9, 3, 1, 198, 9, 3, 1, 209, 9, 3, 1, 135, 9, 3, 1, 159, - 9, 3, 1, 190, 9, 3, 1, 84, 9, 3, 1, 186, 9, 3, 1, 201, 9, 3, 1, 170, 9, - 3, 1, 181, 9, 3, 1, 202, 36, 244, 175, 110, 55, 244, 176, 37, 244, 175, - 110, 180, 239, 190, 242, 69, 239, 116, 236, 186, 65, 249, 196, 57, 245, - 163, 57, 239, 147, 57, 254, 78, 57, 242, 173, 143, 242, 5, 57, 150, 238, - 195, 57, 239, 216, 241, 71, 237, 136, 235, 237, 42, 160, 238, 76, 65, - 141, 57, 249, 119, 240, 241, 238, 52, 57, 166, 242, 156, 57, 238, 45, 57, - 236, 181, 114, 236, 181, 153, 244, 196, 240, 203, 247, 93, 57, 241, 74, - 57, 242, 65, 227, 239, 117, 236, 181, 121, 239, 47, 241, 71, 237, 136, - 235, 190, 42, 160, 238, 76, 65, 242, 83, 239, 123, 253, 101, 240, 147, - 242, 83, 239, 123, 253, 101, 244, 217, 242, 83, 239, 123, 244, 171, 239, - 67, 239, 116, 239, 126, 65, 9, 5, 1, 119, 2, 158, 9, 5, 1, 119, 2, 116, - 9, 5, 1, 119, 2, 236, 180, 9, 5, 1, 119, 2, 180, 9, 5, 1, 119, 2, 150, 9, - 5, 1, 119, 2, 249, 9, 47, 9, 5, 1, 253, 163, 9, 5, 1, 255, 36, 2, 239, - 117, 9, 5, 1, 144, 2, 158, 9, 5, 1, 144, 2, 116, 9, 5, 1, 144, 2, 236, - 180, 9, 5, 1, 144, 2, 150, 9, 5, 1, 197, 2, 158, 9, 5, 1, 197, 2, 116, 9, - 5, 1, 197, 2, 236, 180, 9, 5, 1, 197, 2, 150, 9, 5, 1, 249, 77, 9, 5, 1, - 255, 28, 2, 180, 9, 5, 1, 109, 2, 158, 9, 5, 1, 109, 2, 116, 9, 5, 1, - 109, 2, 236, 180, 9, 5, 1, 109, 2, 180, 9, 5, 1, 109, 2, 150, 235, 191, - 57, 9, 5, 1, 109, 2, 122, 9, 5, 1, 115, 2, 158, 9, 5, 1, 115, 2, 116, 9, - 5, 1, 115, 2, 236, 180, 9, 5, 1, 115, 2, 150, 9, 5, 1, 255, 35, 2, 116, - 9, 5, 1, 242, 189, 9, 3, 1, 245, 5, 159, 9, 3, 1, 119, 2, 158, 9, 3, 1, - 119, 2, 116, 9, 3, 1, 119, 2, 236, 180, 9, 3, 1, 119, 2, 180, 9, 3, 1, - 119, 2, 150, 9, 3, 1, 119, 2, 249, 9, 47, 9, 3, 1, 253, 163, 9, 3, 1, - 255, 36, 2, 239, 117, 9, 3, 1, 144, 2, 158, 9, 3, 1, 144, 2, 116, 9, 3, - 1, 144, 2, 236, 180, 9, 3, 1, 144, 2, 150, 9, 3, 1, 197, 2, 158, 9, 3, 1, - 197, 2, 116, 9, 3, 1, 197, 2, 236, 180, 9, 3, 1, 197, 2, 150, 9, 3, 1, - 249, 77, 9, 3, 1, 255, 28, 2, 180, 9, 3, 1, 109, 2, 158, 9, 3, 1, 109, 2, - 116, 9, 3, 1, 109, 2, 236, 180, 9, 3, 1, 109, 2, 180, 9, 3, 1, 109, 2, - 150, 239, 156, 57, 9, 3, 1, 109, 2, 122, 9, 3, 1, 115, 2, 158, 9, 3, 1, - 115, 2, 116, 9, 3, 1, 115, 2, 236, 180, 9, 3, 1, 115, 2, 150, 9, 3, 1, - 255, 35, 2, 116, 9, 3, 1, 242, 189, 9, 3, 1, 255, 35, 2, 150, 9, 5, 1, - 119, 2, 166, 9, 3, 1, 119, 2, 166, 9, 5, 1, 119, 2, 212, 9, 3, 1, 119, 2, - 212, 9, 5, 1, 119, 2, 240, 216, 9, 3, 1, 119, 2, 240, 216, 9, 5, 1, 255, - 36, 2, 116, 9, 3, 1, 255, 36, 2, 116, 9, 5, 1, 255, 36, 2, 236, 180, 9, - 3, 1, 255, 36, 2, 236, 180, 9, 5, 1, 255, 36, 2, 49, 47, 9, 3, 1, 255, - 36, 2, 49, 47, 9, 5, 1, 255, 36, 2, 193, 9, 3, 1, 255, 36, 2, 193, 9, 5, - 1, 255, 34, 2, 193, 9, 3, 1, 255, 34, 2, 193, 9, 5, 1, 255, 34, 2, 122, - 9, 3, 1, 255, 34, 2, 122, 9, 5, 1, 144, 2, 166, 9, 3, 1, 144, 2, 166, 9, - 5, 1, 144, 2, 212, 9, 3, 1, 144, 2, 212, 9, 5, 1, 144, 2, 49, 47, 9, 3, - 1, 144, 2, 49, 47, 9, 5, 1, 144, 2, 240, 216, 9, 3, 1, 144, 2, 240, 216, - 9, 5, 1, 144, 2, 193, 9, 3, 1, 144, 2, 193, 9, 5, 1, 255, 32, 2, 236, - 180, 9, 3, 1, 255, 32, 2, 236, 180, 9, 5, 1, 255, 32, 2, 212, 9, 3, 1, - 255, 32, 2, 212, 9, 5, 1, 255, 32, 2, 49, 47, 9, 3, 1, 255, 32, 2, 49, - 47, 9, 5, 1, 255, 32, 2, 239, 117, 9, 3, 1, 255, 32, 2, 239, 117, 9, 5, - 1, 255, 37, 2, 236, 180, 9, 3, 1, 255, 37, 2, 236, 180, 9, 5, 1, 255, 37, - 2, 122, 9, 3, 1, 255, 37, 2, 122, 9, 5, 1, 197, 2, 180, 9, 3, 1, 197, 2, - 180, 9, 5, 1, 197, 2, 166, 9, 3, 1, 197, 2, 166, 9, 5, 1, 197, 2, 212, 9, - 3, 1, 197, 2, 212, 9, 5, 1, 197, 2, 240, 216, 9, 3, 1, 197, 2, 240, 216, - 9, 5, 1, 197, 2, 49, 47, 9, 3, 1, 240, 228, 69, 9, 5, 17, 254, 45, 9, 3, - 17, 254, 45, 9, 5, 1, 255, 45, 2, 236, 180, 9, 3, 1, 255, 45, 2, 236, - 180, 9, 5, 1, 255, 38, 2, 239, 117, 9, 3, 1, 255, 38, 2, 239, 117, 9, 3, - 1, 251, 170, 9, 5, 1, 255, 31, 2, 116, 9, 3, 1, 255, 31, 2, 116, 9, 5, 1, - 255, 31, 2, 239, 117, 9, 3, 1, 255, 31, 2, 239, 117, 9, 5, 1, 255, 31, 2, - 193, 9, 3, 1, 255, 31, 2, 193, 9, 5, 1, 255, 31, 2, 242, 65, 227, 9, 3, - 1, 255, 31, 2, 242, 65, 227, 9, 5, 1, 255, 31, 2, 122, 9, 3, 1, 255, 31, - 2, 122, 9, 5, 1, 255, 28, 2, 116, 9, 3, 1, 255, 28, 2, 116, 9, 5, 1, 255, - 28, 2, 239, 117, 9, 3, 1, 255, 28, 2, 239, 117, 9, 5, 1, 255, 28, 2, 193, - 9, 3, 1, 255, 28, 2, 193, 9, 3, 1, 255, 28, 240, 143, 254, 216, 236, 190, - 9, 5, 1, 249, 66, 9, 3, 1, 249, 66, 9, 5, 1, 109, 2, 166, 9, 3, 1, 109, - 2, 166, 9, 5, 1, 109, 2, 212, 9, 3, 1, 109, 2, 212, 9, 5, 1, 109, 2, 42, - 116, 9, 3, 1, 109, 2, 42, 116, 9, 5, 17, 253, 142, 9, 3, 17, 253, 142, 9, - 5, 1, 255, 30, 2, 116, 9, 3, 1, 255, 30, 2, 116, 9, 5, 1, 255, 30, 2, - 239, 117, 9, 3, 1, 255, 30, 2, 239, 117, 9, 5, 1, 255, 30, 2, 193, 9, 3, - 1, 255, 30, 2, 193, 9, 5, 1, 255, 29, 2, 116, 9, 3, 1, 255, 29, 2, 116, - 9, 5, 1, 255, 29, 2, 236, 180, 9, 3, 1, 255, 29, 2, 236, 180, 9, 5, 1, - 255, 29, 2, 239, 117, 9, 3, 1, 255, 29, 2, 239, 117, 9, 5, 1, 255, 29, 2, - 193, 9, 3, 1, 255, 29, 2, 193, 9, 5, 1, 255, 33, 2, 239, 117, 9, 3, 1, - 255, 33, 2, 239, 117, 9, 5, 1, 255, 33, 2, 193, 9, 3, 1, 255, 33, 2, 193, - 9, 5, 1, 255, 33, 2, 122, 9, 3, 1, 255, 33, 2, 122, 9, 5, 1, 115, 2, 180, - 9, 3, 1, 115, 2, 180, 9, 5, 1, 115, 2, 166, 9, 3, 1, 115, 2, 166, 9, 5, - 1, 115, 2, 212, 9, 3, 1, 115, 2, 212, 9, 5, 1, 115, 2, 249, 9, 47, 9, 3, - 1, 115, 2, 249, 9, 47, 9, 5, 1, 115, 2, 42, 116, 9, 3, 1, 115, 2, 42, - 116, 9, 5, 1, 115, 2, 240, 216, 9, 3, 1, 115, 2, 240, 216, 9, 5, 1, 255, - 40, 2, 236, 180, 9, 3, 1, 255, 40, 2, 236, 180, 9, 5, 1, 255, 35, 2, 236, - 180, 9, 3, 1, 255, 35, 2, 236, 180, 9, 5, 1, 255, 35, 2, 150, 9, 5, 1, - 255, 27, 2, 116, 9, 3, 1, 255, 27, 2, 116, 9, 5, 1, 255, 27, 2, 49, 47, - 9, 3, 1, 255, 27, 2, 49, 47, 9, 5, 1, 255, 27, 2, 193, 9, 3, 1, 255, 27, - 2, 193, 9, 3, 1, 165, 159, 9, 3, 1, 255, 41, 2, 122, 9, 5, 1, 255, 41, 2, - 128, 9, 5, 1, 255, 41, 2, 241, 8, 9, 3, 1, 255, 41, 2, 241, 8, 9, 5, 1, - 249, 5, 169, 9, 3, 1, 249, 5, 169, 9, 5, 1, 249, 0, 78, 9, 5, 1, 255, 36, - 2, 128, 9, 3, 1, 255, 36, 2, 128, 9, 5, 1, 241, 93, 187, 9, 5, 1, 255, - 34, 2, 128, 9, 5, 1, 255, 34, 2, 241, 8, 9, 3, 1, 255, 34, 2, 241, 8, 9, - 3, 1, 242, 60, 242, 87, 9, 5, 1, 224, 70, 9, 5, 1, 242, 164, 9, 5, 1, - 249, 0, 70, 9, 5, 1, 255, 42, 2, 128, 9, 3, 1, 255, 42, 2, 128, 9, 5, 1, - 255, 32, 2, 128, 9, 5, 1, 242, 75, 9, 3, 1, 254, 44, 9, 5, 1, 244, 191, - 9, 5, 1, 197, 2, 122, 9, 5, 1, 255, 38, 2, 128, 9, 3, 1, 255, 38, 2, 128, - 9, 3, 1, 255, 31, 2, 143, 9, 3, 1, 243, 200, 2, 122, 9, 5, 1, 242, 60, - 171, 9, 5, 1, 255, 28, 2, 36, 128, 9, 3, 1, 255, 28, 2, 165, 37, 249, 83, - 9, 5, 1, 109, 2, 242, 65, 180, 9, 5, 1, 109, 2, 244, 210, 9, 3, 1, 109, - 2, 244, 210, 9, 5, 1, 254, 62, 9, 3, 1, 254, 62, 9, 5, 1, 255, 46, 2, - 128, 9, 3, 1, 255, 46, 2, 128, 9, 1, 254, 80, 9, 5, 1, 249, 5, 114, 9, 3, - 1, 249, 5, 114, 9, 5, 1, 249, 67, 9, 1, 224, 254, 38, 245, 28, 9, 3, 1, - 255, 33, 2, 241, 233, 128, 9, 5, 1, 255, 33, 2, 128, 9, 3, 1, 255, 33, 2, - 128, 9, 5, 1, 255, 33, 2, 238, 100, 128, 9, 5, 1, 115, 2, 244, 210, 9, 3, - 1, 115, 2, 244, 210, 9, 5, 1, 239, 127, 9, 5, 1, 255, 44, 2, 128, 9, 5, - 1, 255, 35, 2, 128, 9, 3, 1, 255, 35, 2, 128, 9, 5, 1, 255, 27, 2, 122, - 9, 3, 1, 255, 27, 2, 122, 9, 5, 1, 249, 221, 9, 5, 1, 253, 206, 238, 156, - 9, 3, 1, 253, 206, 238, 156, 9, 3, 1, 253, 206, 2, 244, 182, 9, 1, 225, - 2, 122, 9, 5, 1, 249, 5, 168, 9, 3, 1, 249, 5, 168, 9, 1, 239, 116, 240, - 211, 249, 71, 2, 122, 9, 1, 245, 224, 9, 1, 243, 91, 242, 140, 9, 1, 241, - 197, 242, 140, 9, 1, 239, 249, 242, 140, 9, 1, 238, 100, 242, 140, 9, 5, - 1, 254, 231, 2, 193, 9, 5, 1, 255, 34, 2, 3, 1, 255, 27, 2, 193, 9, 3, 1, - 254, 231, 2, 193, 9, 5, 1, 254, 53, 9, 5, 1, 255, 31, 2, 3, 1, 200, 9, 3, - 1, 254, 53, 9, 5, 1, 254, 57, 9, 5, 1, 255, 28, 2, 3, 1, 200, 9, 3, 1, - 254, 57, 9, 5, 1, 119, 2, 193, 9, 3, 1, 119, 2, 193, 9, 5, 1, 197, 2, - 193, 9, 3, 1, 197, 2, 193, 9, 5, 1, 109, 2, 193, 9, 3, 1, 109, 2, 193, 9, - 5, 1, 115, 2, 193, 9, 3, 1, 115, 2, 193, 9, 5, 1, 115, 2, 238, 81, 18, - 166, 9, 3, 1, 115, 2, 238, 81, 18, 166, 9, 5, 1, 115, 2, 238, 81, 18, - 116, 9, 3, 1, 115, 2, 238, 81, 18, 116, 9, 5, 1, 115, 2, 238, 81, 18, - 193, 9, 3, 1, 115, 2, 238, 81, 18, 193, 9, 5, 1, 115, 2, 238, 81, 18, - 158, 9, 3, 1, 115, 2, 238, 81, 18, 158, 9, 3, 1, 242, 60, 70, 9, 5, 1, - 119, 2, 238, 81, 18, 166, 9, 3, 1, 119, 2, 238, 81, 18, 166, 9, 5, 1, - 119, 2, 49, 53, 18, 166, 9, 3, 1, 119, 2, 49, 53, 18, 166, 9, 5, 1, 254, - 221, 2, 166, 9, 3, 1, 254, 221, 2, 166, 9, 5, 1, 255, 32, 2, 122, 9, 3, - 1, 255, 32, 2, 122, 9, 5, 1, 255, 32, 2, 193, 9, 3, 1, 255, 32, 2, 193, - 9, 5, 1, 255, 38, 2, 193, 9, 3, 1, 255, 38, 2, 193, 9, 5, 1, 109, 2, 240, - 216, 9, 3, 1, 109, 2, 240, 216, 9, 5, 1, 109, 2, 242, 234, 18, 166, 9, 3, - 1, 109, 2, 242, 234, 18, 166, 9, 5, 1, 253, 206, 2, 193, 9, 3, 1, 253, - 206, 2, 193, 9, 3, 1, 255, 45, 2, 193, 9, 5, 1, 254, 35, 9, 5, 1, 255, - 34, 2, 3, 1, 202, 9, 3, 1, 254, 35, 9, 5, 1, 255, 32, 2, 116, 9, 3, 1, - 255, 32, 2, 116, 9, 5, 1, 242, 225, 9, 5, 1, 245, 224, 9, 5, 1, 255, 28, - 2, 158, 9, 3, 1, 255, 28, 2, 158, 9, 5, 1, 119, 2, 249, 9, 53, 18, 116, - 9, 3, 1, 119, 2, 249, 9, 53, 18, 116, 9, 5, 1, 254, 221, 2, 116, 9, 3, 1, - 254, 221, 2, 116, 9, 5, 1, 109, 2, 242, 114, 18, 116, 9, 3, 1, 109, 2, - 242, 114, 18, 116, 9, 5, 1, 119, 2, 42, 158, 9, 3, 1, 119, 2, 42, 158, 9, - 5, 1, 119, 2, 239, 116, 212, 9, 3, 1, 119, 2, 239, 116, 212, 9, 5, 1, - 144, 2, 42, 158, 9, 3, 1, 144, 2, 42, 158, 9, 5, 1, 144, 2, 239, 116, - 212, 9, 3, 1, 144, 2, 239, 116, 212, 9, 5, 1, 197, 2, 42, 158, 9, 3, 1, - 197, 2, 42, 158, 9, 5, 1, 197, 2, 239, 116, 212, 9, 3, 1, 197, 2, 239, - 116, 212, 9, 5, 1, 109, 2, 42, 158, 9, 3, 1, 109, 2, 42, 158, 9, 5, 1, - 109, 2, 239, 116, 212, 9, 3, 1, 109, 2, 239, 116, 212, 9, 5, 1, 255, 30, - 2, 42, 158, 9, 3, 1, 255, 30, 2, 42, 158, 9, 5, 1, 255, 30, 2, 239, 116, - 212, 9, 3, 1, 255, 30, 2, 239, 116, 212, 9, 5, 1, 115, 2, 42, 158, 9, 3, - 1, 115, 2, 42, 158, 9, 5, 1, 115, 2, 239, 116, 212, 9, 3, 1, 115, 2, 239, - 116, 212, 9, 5, 1, 255, 29, 2, 244, 192, 45, 9, 3, 1, 255, 29, 2, 244, - 192, 45, 9, 5, 1, 255, 33, 2, 244, 192, 45, 9, 3, 1, 255, 33, 2, 244, - 192, 45, 9, 5, 1, 245, 227, 9, 3, 1, 245, 227, 9, 5, 1, 255, 37, 2, 193, - 9, 3, 1, 255, 37, 2, 193, 9, 5, 1, 255, 28, 2, 165, 37, 249, 83, 9, 5, 1, - 253, 247, 9, 3, 1, 253, 247, 9, 5, 1, 255, 27, 2, 128, 9, 3, 1, 255, 27, - 2, 128, 9, 5, 1, 119, 2, 49, 47, 9, 3, 1, 119, 2, 49, 47, 9, 5, 1, 144, - 2, 239, 117, 9, 3, 1, 144, 2, 239, 117, 9, 5, 1, 109, 2, 238, 81, 18, - 166, 9, 3, 1, 109, 2, 238, 81, 18, 166, 9, 5, 1, 109, 2, 229, 18, 166, 9, - 3, 1, 109, 2, 229, 18, 166, 9, 5, 1, 109, 2, 49, 47, 9, 3, 1, 109, 2, 49, - 47, 9, 5, 1, 109, 2, 49, 53, 18, 166, 9, 3, 1, 109, 2, 49, 53, 18, 166, - 9, 5, 1, 255, 35, 2, 166, 9, 3, 1, 255, 35, 2, 166, 9, 3, 1, 242, 60, 64, - 9, 3, 1, 242, 79, 9, 3, 1, 242, 60, 242, 79, 9, 3, 1, 255, 41, 2, 128, 9, - 3, 1, 249, 0, 78, 9, 3, 1, 255, 36, 2, 244, 226, 9, 3, 1, 255, 34, 2, - 244, 182, 9, 3, 1, 255, 34, 2, 128, 9, 3, 1, 224, 70, 9, 3, 1, 242, 164, - 9, 3, 1, 245, 41, 2, 128, 9, 3, 1, 249, 0, 70, 9, 3, 1, 224, 249, 0, 70, - 9, 3, 1, 224, 249, 0, 144, 2, 128, 9, 3, 1, 242, 77, 224, 249, 0, 70, 9, - 3, 1, 240, 228, 255, 45, 2, 122, 9, 3, 1, 255, 32, 2, 128, 9, 3, 1, 71, - 194, 9, 1, 3, 5, 194, 9, 3, 1, 242, 75, 9, 3, 1, 252, 117, 244, 210, 9, - 3, 1, 242, 60, 164, 9, 3, 1, 255, 37, 2, 128, 9, 3, 1, 251, 64, 2, 128, - 9, 3, 1, 197, 2, 122, 9, 3, 1, 244, 191, 9, 1, 3, 5, 69, 9, 3, 1, 255, - 31, 2, 242, 65, 180, 9, 3, 1, 255, 31, 2, 246, 21, 9, 3, 1, 255, 31, 2, - 238, 100, 128, 9, 3, 1, 247, 59, 9, 3, 1, 242, 60, 171, 9, 3, 1, 242, 60, - 255, 39, 2, 165, 249, 83, 9, 3, 1, 255, 39, 2, 128, 9, 3, 1, 255, 28, 2, - 36, 128, 9, 3, 1, 255, 28, 2, 238, 100, 128, 9, 1, 3, 5, 183, 9, 3, 1, - 242, 138, 78, 9, 1, 3, 5, 253, 142, 9, 3, 1, 242, 77, 242, 72, 9, 3, 1, - 249, 30, 9, 3, 1, 242, 60, 135, 9, 3, 1, 242, 60, 255, 30, 2, 165, 249, - 83, 9, 3, 1, 242, 60, 255, 30, 2, 128, 9, 3, 1, 255, 30, 2, 165, 249, 83, - 9, 3, 1, 255, 30, 2, 244, 182, 9, 3, 1, 255, 30, 2, 238, 139, 9, 3, 1, - 224, 255, 30, 2, 238, 139, 9, 1, 3, 5, 135, 9, 1, 3, 5, 239, 116, 135, 9, - 3, 1, 255, 29, 2, 128, 9, 3, 1, 249, 67, 9, 3, 1, 240, 228, 255, 45, 2, - 242, 114, 18, 128, 9, 3, 1, 245, 196, 224, 249, 67, 9, 3, 1, 254, 38, 2, - 244, 226, 9, 3, 1, 242, 60, 190, 9, 3, 1, 255, 33, 2, 238, 100, 128, 9, - 3, 1, 115, 143, 9, 3, 1, 239, 127, 9, 3, 1, 255, 44, 2, 128, 9, 3, 1, - 242, 60, 186, 9, 3, 1, 242, 60, 201, 9, 3, 1, 242, 60, 181, 9, 1, 3, 5, - 181, 9, 3, 1, 255, 27, 2, 238, 100, 128, 9, 3, 1, 255, 27, 2, 244, 226, - 9, 3, 1, 249, 221, 9, 3, 1, 253, 206, 2, 244, 226, 9, 1, 240, 211, 189, - 9, 1, 237, 117, 242, 116, 238, 9, 9, 1, 239, 116, 240, 211, 189, 9, 1, - 239, 87, 203, 9, 1, 239, 205, 242, 140, 9, 1, 3, 5, 199, 9, 3, 1, 242, - 77, 249, 0, 70, 9, 1, 3, 5, 255, 32, 2, 128, 9, 1, 3, 5, 164, 9, 3, 1, - 255, 45, 2, 236, 7, 9, 3, 1, 242, 60, 205, 9, 1, 3, 5, 148, 9, 3, 1, 255, - 47, 2, 128, 9, 1, 240, 211, 249, 71, 2, 122, 9, 1, 224, 240, 211, 249, - 71, 2, 122, 9, 3, 1, 254, 231, 239, 152, 9, 3, 1, 250, 216, 239, 152, 9, - 3, 1, 254, 231, 240, 253, 2, 244, 226, 9, 3, 1, 255, 24, 239, 152, 9, 3, - 1, 252, 201, 239, 152, 9, 3, 1, 255, 23, 240, 253, 2, 244, 226, 9, 3, 1, - 251, 2, 239, 152, 9, 3, 1, 255, 11, 239, 152, 9, 3, 1, 255, 12, 239, 152, - 9, 1, 239, 205, 236, 224, 9, 1, 240, 8, 236, 224, 147, 1, 3, 164, 147, 1, - 3, 255, 37, 2, 128, 147, 1, 3, 200, 147, 1, 3, 135, 147, 1, 3, 242, 60, - 135, 147, 1, 3, 242, 60, 255, 30, 2, 128, 147, 1, 3, 5, 239, 116, 135, - 147, 1, 3, 201, 147, 1, 3, 181, 147, 1, 242, 107, 147, 1, 42, 242, 107, - 147, 1, 242, 60, 242, 84, 147, 1, 236, 190, 147, 1, 224, 242, 84, 147, 1, - 37, 136, 244, 183, 147, 1, 36, 136, 244, 183, 147, 1, 240, 211, 189, 147, - 1, 224, 240, 211, 189, 147, 1, 36, 237, 116, 147, 1, 37, 237, 116, 147, - 1, 75, 237, 116, 147, 1, 79, 237, 116, 147, 1, 157, 240, 203, 193, 147, - 1, 55, 244, 176, 147, 1, 166, 147, 1, 244, 196, 240, 203, 147, 1, 244, - 201, 240, 203, 147, 1, 253, 113, 55, 244, 176, 147, 1, 253, 113, 166, - 147, 1, 253, 113, 244, 201, 240, 203, 147, 1, 253, 113, 244, 196, 240, - 203, 147, 1, 237, 144, 242, 81, 147, 1, 136, 237, 144, 242, 81, 147, 1, - 241, 13, 37, 136, 244, 183, 147, 1, 241, 13, 36, 136, 244, 183, 147, 1, - 75, 244, 184, 147, 1, 79, 244, 184, 147, 1, 249, 4, 57, 147, 1, 244, 197, - 57, 212, 49, 47, 249, 9, 47, 240, 216, 3, 180, 42, 244, 196, 240, 203, - 147, 1, 244, 59, 128, 147, 1, 244, 234, 240, 203, 147, 1, 3, 242, 75, - 147, 1, 3, 148, 147, 1, 3, 159, 147, 1, 3, 170, 147, 1, 3, 224, 240, 211, - 189, 147, 1, 238, 7, 249, 5, 143, 147, 1, 249, 10, 249, 5, 143, 147, 1, - 254, 145, 249, 5, 143, 147, 1, 253, 113, 249, 5, 143, 147, 1, 239, 11, - 249, 5, 143, 147, 1, 254, 79, 238, 119, 249, 5, 65, 147, 1, 250, 112, - 238, 119, 249, 5, 65, 147, 1, 240, 195, 147, 1, 236, 179, 147, 1, 42, - 236, 190, 48, 244, 201, 240, 203, 48, 244, 196, 240, 203, 48, 157, 240, - 203, 48, 180, 48, 166, 48, 238, 98, 48, 212, 48, 49, 47, 48, 150, 48, - 248, 255, 47, 48, 249, 9, 47, 48, 42, 244, 196, 240, 203, 48, 193, 48, - 55, 217, 47, 48, 42, 55, 217, 47, 48, 42, 244, 201, 240, 203, 48, 236, - 49, 48, 239, 116, 212, 48, 242, 60, 244, 192, 47, 48, 244, 192, 47, 48, - 224, 244, 192, 47, 48, 244, 192, 53, 184, 48, 244, 201, 230, 45, 48, 244, - 196, 230, 45, 48, 36, 249, 35, 45, 48, 37, 249, 35, 45, 48, 36, 160, 47, - 48, 244, 210, 48, 36, 136, 249, 9, 45, 48, 75, 249, 35, 45, 48, 79, 249, - 35, 45, 48, 249, 4, 25, 45, 48, 244, 197, 25, 45, 48, 237, 80, 248, 255, - 45, 48, 238, 100, 248, 255, 45, 48, 49, 45, 48, 238, 81, 45, 48, 249, 9, - 45, 48, 244, 192, 45, 48, 239, 117, 48, 240, 216, 48, 55, 217, 45, 48, - 242, 153, 45, 48, 239, 116, 42, 250, 138, 45, 48, 245, 15, 45, 48, 157, - 230, 45, 48, 244, 194, 45, 48, 239, 116, 244, 194, 45, 48, 229, 45, 48, - 242, 101, 45, 48, 253, 113, 244, 176, 48, 42, 253, 113, 244, 176, 48, - 229, 239, 131, 48, 207, 242, 114, 239, 131, 48, 165, 242, 114, 239, 131, - 48, 207, 240, 230, 239, 131, 48, 165, 240, 230, 239, 131, 48, 37, 136, - 249, 9, 45, 48, 239, 116, 242, 153, 45, 48, 30, 45, 48, 242, 2, 45, 48, - 255, 43, 47, 48, 55, 180, 48, 42, 238, 98, 48, 244, 201, 249, 5, 65, 48, - 244, 196, 249, 5, 65, 48, 26, 236, 43, 48, 26, 239, 186, 48, 26, 238, 85, - 242, 70, 48, 26, 211, 48, 242, 153, 47, 48, 242, 61, 25, 45, 48, 42, 55, - 217, 45, 48, 36, 160, 45, 48, 141, 229, 47, 48, 238, 14, 47, 48, 242, 93, - 80, 139, 47, 48, 36, 37, 59, 45, 48, 210, 59, 45, 48, 240, 82, 241, 22, - 48, 42, 180, 48, 42, 239, 116, 212, 48, 42, 63, 59, 45, 48, 9, 3, 1, 64, - 48, 9, 3, 1, 70, 48, 9, 3, 1, 69, 48, 9, 3, 1, 78, 48, 9, 3, 1, 84, 48, - 9, 3, 1, 203, 48, 9, 3, 1, 187, 48, 9, 3, 1, 164, 48, 9, 3, 1, 171, 48, - 9, 3, 1, 135, 48, 9, 3, 1, 190, 48, 9, 3, 1, 186, 48, 9, 3, 1, 170, 26, - 151, 57, 26, 149, 151, 57, 26, 211, 26, 239, 126, 65, 26, 242, 70, 26, - 238, 85, 242, 70, 26, 5, 1, 162, 2, 242, 70, 26, 254, 82, 241, 83, 26, 5, - 1, 240, 204, 2, 242, 70, 26, 5, 1, 182, 2, 242, 70, 26, 5, 1, 228, 2, - 242, 70, 26, 5, 1, 240, 210, 2, 242, 70, 26, 5, 1, 240, 199, 2, 242, 70, - 26, 5, 1, 172, 2, 242, 70, 26, 3, 1, 228, 2, 238, 85, 18, 242, 70, 26, 5, - 1, 242, 79, 26, 5, 1, 244, 198, 26, 5, 1, 242, 75, 26, 5, 1, 242, 87, 26, - 5, 1, 239, 133, 26, 5, 1, 244, 204, 26, 5, 1, 249, 42, 26, 5, 1, 242, 97, - 26, 5, 1, 244, 191, 26, 5, 1, 242, 95, 26, 5, 1, 242, 96, 26, 5, 1, 253, - 114, 26, 5, 1, 253, 112, 26, 5, 1, 253, 135, 26, 5, 1, 239, 137, 26, 5, - 1, 253, 116, 26, 5, 1, 249, 32, 26, 5, 1, 242, 73, 26, 5, 1, 249, 43, 26, - 5, 1, 239, 127, 26, 5, 1, 249, 30, 26, 5, 1, 249, 23, 26, 5, 1, 249, 31, - 26, 5, 1, 242, 72, 26, 5, 1, 228, 2, 237, 133, 26, 5, 1, 240, 199, 2, - 237, 133, 26, 3, 1, 162, 2, 242, 70, 26, 3, 1, 240, 204, 2, 242, 70, 26, - 3, 1, 182, 2, 242, 70, 26, 3, 1, 228, 2, 242, 70, 26, 3, 1, 240, 199, 2, - 238, 85, 18, 242, 70, 26, 3, 1, 242, 79, 26, 3, 1, 244, 198, 26, 3, 1, - 242, 75, 26, 3, 1, 242, 87, 26, 3, 1, 239, 133, 26, 3, 1, 244, 204, 26, - 3, 1, 249, 42, 26, 3, 1, 242, 97, 26, 3, 1, 244, 191, 26, 3, 1, 242, 95, - 26, 3, 1, 242, 96, 26, 3, 1, 253, 114, 26, 3, 1, 253, 112, 26, 3, 1, 253, - 135, 26, 3, 1, 239, 137, 26, 3, 1, 253, 116, 26, 3, 1, 249, 32, 26, 3, 1, - 29, 242, 73, 26, 3, 1, 242, 73, 26, 3, 1, 249, 43, 26, 3, 1, 239, 127, - 26, 3, 1, 249, 30, 26, 3, 1, 249, 23, 26, 3, 1, 249, 31, 26, 3, 1, 242, - 72, 26, 3, 1, 228, 2, 237, 133, 26, 3, 1, 240, 199, 2, 237, 133, 26, 3, - 1, 240, 210, 2, 242, 70, 26, 3, 1, 240, 199, 2, 242, 70, 26, 3, 1, 172, - 2, 242, 70, 26, 250, 155, 90, 26, 244, 203, 90, 26, 240, 199, 2, 248, - 255, 90, 26, 240, 199, 2, 244, 196, 18, 248, 255, 90, 26, 240, 199, 2, - 238, 81, 18, 248, 255, 90, 26, 253, 212, 90, 26, 254, 224, 90, 26, 254, - 15, 90, 26, 1, 241, 39, 242, 128, 26, 3, 1, 241, 39, 242, 128, 26, 1, - 241, 32, 26, 3, 1, 241, 32, 26, 1, 239, 213, 26, 3, 1, 239, 213, 26, 1, - 242, 128, 26, 3, 1, 242, 128, 26, 1, 242, 243, 26, 3, 1, 242, 243, 242, - 85, 5, 1, 245, 183, 242, 85, 3, 1, 245, 183, 242, 85, 5, 1, 249, 223, - 242, 85, 3, 1, 249, 223, 242, 85, 5, 1, 245, 123, 242, 85, 3, 1, 245, - 123, 242, 85, 5, 1, 245, 109, 242, 85, 3, 1, 245, 109, 242, 85, 5, 1, - 241, 56, 242, 85, 3, 1, 241, 56, 242, 85, 5, 1, 242, 252, 242, 85, 3, 1, - 242, 252, 242, 85, 5, 1, 249, 213, 242, 85, 3, 1, 249, 213, 26, 244, 228, - 90, 26, 253, 168, 90, 26, 242, 180, 248, 76, 90, 26, 1, 250, 118, 26, 5, - 244, 203, 90, 26, 242, 180, 240, 204, 90, 26, 224, 242, 180, 240, 204, - 90, 31, 5, 1, 254, 233, 2, 158, 31, 5, 1, 254, 46, 31, 5, 1, 249, 97, 31, - 5, 1, 249, 237, 31, 5, 1, 238, 164, 253, 181, 31, 5, 1, 249, 76, 31, 5, - 1, 231, 233, 69, 31, 5, 1, 253, 139, 31, 5, 1, 253, 239, 31, 5, 1, 249, - 106, 31, 5, 1, 249, 111, 31, 5, 1, 245, 212, 31, 5, 1, 250, 2, 31, 5, 1, - 197, 2, 158, 31, 5, 1, 207, 84, 31, 5, 1, 245, 79, 31, 5, 1, 64, 31, 5, - 1, 253, 191, 31, 5, 1, 253, 214, 31, 5, 1, 249, 78, 31, 5, 1, 253, 152, - 31, 5, 1, 253, 181, 31, 5, 1, 249, 74, 31, 5, 1, 253, 189, 31, 5, 1, 69, - 31, 5, 1, 207, 69, 31, 5, 1, 208, 31, 5, 1, 253, 223, 31, 5, 1, 253, 224, - 31, 5, 1, 253, 166, 31, 5, 1, 78, 31, 5, 1, 253, 143, 31, 5, 1, 253, 205, - 31, 5, 1, 253, 225, 31, 5, 1, 253, 151, 31, 5, 1, 84, 31, 5, 1, 253, 222, - 31, 5, 1, 253, 88, 31, 5, 1, 249, 64, 31, 5, 1, 249, 44, 31, 5, 1, 249, - 7, 31, 5, 1, 242, 249, 31, 5, 1, 249, 241, 57, 31, 5, 1, 245, 225, 31, 5, - 1, 249, 119, 57, 31, 5, 1, 70, 31, 5, 1, 253, 124, 31, 5, 1, 216, 31, 3, - 1, 64, 31, 3, 1, 253, 191, 31, 3, 1, 253, 214, 31, 3, 1, 249, 78, 31, 3, - 1, 253, 152, 31, 3, 1, 253, 181, 31, 3, 1, 249, 74, 31, 3, 1, 253, 189, - 31, 3, 1, 69, 31, 3, 1, 207, 69, 31, 3, 1, 208, 31, 3, 1, 253, 223, 31, - 3, 1, 253, 224, 31, 3, 1, 253, 166, 31, 3, 1, 78, 31, 3, 1, 253, 143, 31, - 3, 1, 253, 205, 31, 3, 1, 253, 225, 31, 3, 1, 253, 151, 31, 3, 1, 84, 31, - 3, 1, 253, 222, 31, 3, 1, 253, 88, 31, 3, 1, 249, 64, 31, 3, 1, 249, 44, - 31, 3, 1, 249, 7, 31, 3, 1, 242, 249, 31, 3, 1, 249, 241, 57, 31, 3, 1, - 245, 225, 31, 3, 1, 249, 119, 57, 31, 3, 1, 70, 31, 3, 1, 253, 124, 31, - 3, 1, 216, 31, 3, 1, 254, 233, 2, 158, 31, 3, 1, 254, 46, 31, 3, 1, 249, - 97, 31, 3, 1, 249, 237, 31, 3, 1, 238, 164, 253, 181, 31, 3, 1, 249, 76, - 31, 3, 1, 231, 233, 69, 31, 3, 1, 253, 139, 31, 3, 1, 253, 239, 31, 3, 1, - 249, 106, 31, 3, 1, 249, 111, 31, 3, 1, 245, 212, 31, 3, 1, 250, 2, 31, - 3, 1, 197, 2, 158, 31, 3, 1, 207, 84, 31, 3, 1, 245, 79, 31, 5, 1, 242, - 72, 31, 3, 1, 242, 72, 31, 5, 1, 250, 113, 31, 3, 1, 250, 113, 31, 5, 1, - 239, 157, 70, 31, 3, 1, 239, 157, 70, 31, 5, 1, 242, 147, 249, 58, 31, 3, - 1, 242, 147, 249, 58, 31, 5, 1, 239, 157, 242, 147, 249, 58, 31, 3, 1, - 239, 157, 242, 147, 249, 58, 31, 5, 1, 253, 202, 249, 58, 31, 3, 1, 253, - 202, 249, 58, 31, 5, 1, 239, 157, 253, 202, 249, 58, 31, 3, 1, 239, 157, - 253, 202, 249, 58, 31, 5, 1, 250, 4, 31, 3, 1, 250, 4, 31, 5, 1, 249, 31, - 31, 3, 1, 249, 31, 31, 5, 1, 245, 86, 31, 3, 1, 245, 86, 31, 5, 1, 239, - 219, 31, 3, 1, 239, 219, 31, 5, 1, 241, 60, 2, 42, 244, 201, 240, 203, - 31, 3, 1, 241, 60, 2, 42, 244, 201, 240, 203, 31, 5, 1, 254, 74, 31, 3, - 1, 254, 74, 31, 5, 1, 245, 174, 242, 72, 31, 3, 1, 245, 174, 242, 72, 31, - 5, 1, 172, 2, 242, 190, 31, 3, 1, 172, 2, 242, 190, 31, 5, 1, 254, 17, - 31, 3, 1, 254, 17, 31, 5, 1, 242, 128, 31, 3, 1, 242, 128, 31, 238, 133, - 57, 48, 31, 242, 190, 48, 31, 235, 182, 48, 31, 130, 238, 152, 48, 31, - 138, 238, 152, 48, 31, 241, 21, 238, 133, 57, 48, 31, 240, 117, 57, 31, - 5, 1, 207, 197, 2, 244, 182, 31, 3, 1, 207, 197, 2, 244, 182, 31, 5, 1, - 239, 233, 57, 31, 3, 1, 239, 233, 57, 31, 5, 1, 254, 245, 2, 244, 232, - 31, 3, 1, 254, 245, 2, 244, 232, 31, 5, 1, 253, 208, 2, 241, 89, 31, 3, - 1, 253, 208, 2, 241, 89, 31, 5, 1, 253, 208, 2, 122, 31, 3, 1, 253, 208, - 2, 122, 31, 5, 1, 253, 208, 2, 242, 65, 128, 31, 3, 1, 253, 208, 2, 242, - 65, 128, 31, 5, 1, 253, 217, 2, 237, 112, 31, 3, 1, 253, 217, 2, 237, - 112, 31, 5, 1, 254, 238, 2, 237, 112, 31, 3, 1, 254, 238, 2, 237, 112, - 31, 5, 1, 254, 218, 2, 237, 112, 31, 3, 1, 254, 218, 2, 237, 112, 31, 5, - 1, 254, 218, 2, 55, 122, 31, 3, 1, 254, 218, 2, 55, 122, 31, 5, 1, 254, - 218, 2, 122, 31, 3, 1, 254, 218, 2, 122, 31, 5, 1, 241, 42, 208, 31, 3, - 1, 241, 42, 208, 31, 5, 1, 254, 215, 2, 237, 112, 31, 3, 1, 254, 215, 2, - 237, 112, 31, 5, 17, 254, 215, 249, 78, 31, 3, 17, 254, 215, 249, 78, 31, - 5, 1, 254, 229, 2, 242, 65, 128, 31, 3, 1, 254, 229, 2, 242, 65, 128, 31, - 5, 1, 238, 91, 253, 88, 31, 3, 1, 238, 91, 253, 88, 31, 5, 1, 254, 246, - 2, 237, 112, 31, 3, 1, 254, 246, 2, 237, 112, 31, 5, 1, 254, 237, 2, 237, - 112, 31, 3, 1, 254, 237, 2, 237, 112, 31, 5, 1, 239, 175, 84, 31, 3, 1, - 239, 175, 84, 31, 5, 1, 239, 175, 115, 2, 122, 31, 3, 1, 239, 175, 115, - 2, 122, 31, 5, 1, 254, 248, 2, 237, 112, 31, 3, 1, 254, 248, 2, 237, 112, - 31, 5, 17, 254, 237, 249, 64, 31, 3, 17, 254, 237, 249, 64, 31, 5, 1, - 253, 164, 2, 237, 112, 31, 3, 1, 253, 164, 2, 237, 112, 31, 5, 1, 253, - 164, 2, 55, 122, 31, 3, 1, 253, 164, 2, 55, 122, 31, 5, 1, 245, 184, 31, - 3, 1, 245, 184, 31, 5, 1, 238, 91, 249, 44, 31, 3, 1, 238, 91, 249, 44, - 31, 5, 1, 238, 91, 253, 164, 2, 237, 112, 31, 3, 1, 238, 91, 253, 164, 2, - 237, 112, 31, 1, 239, 57, 31, 5, 1, 253, 217, 2, 212, 31, 3, 1, 253, 217, - 2, 212, 31, 5, 1, 254, 218, 2, 128, 31, 3, 1, 254, 218, 2, 128, 31, 5, 1, - 254, 241, 2, 244, 182, 31, 3, 1, 254, 241, 2, 244, 182, 31, 5, 1, 254, - 215, 2, 128, 31, 3, 1, 254, 215, 2, 128, 31, 5, 1, 254, 215, 2, 244, 182, - 31, 3, 1, 254, 215, 2, 244, 182, 31, 5, 1, 237, 160, 249, 44, 31, 3, 1, - 237, 160, 249, 44, 31, 5, 1, 254, 220, 2, 244, 182, 31, 3, 1, 254, 220, - 2, 244, 182, 31, 5, 1, 119, 2, 212, 31, 3, 1, 119, 2, 212, 31, 5, 1, 119, - 2, 150, 31, 3, 1, 119, 2, 150, 31, 5, 17, 119, 253, 181, 31, 3, 17, 119, - 253, 181, 31, 5, 1, 254, 233, 2, 212, 31, 3, 1, 254, 233, 2, 212, 31, 5, - 1, 242, 164, 31, 3, 1, 242, 164, 31, 5, 1, 245, 41, 2, 150, 31, 3, 1, - 245, 41, 2, 150, 31, 5, 1, 253, 217, 2, 150, 31, 3, 1, 253, 217, 2, 150, - 31, 5, 1, 254, 238, 2, 150, 31, 3, 1, 254, 238, 2, 150, 31, 5, 1, 238, - 91, 249, 76, 31, 3, 1, 238, 91, 249, 76, 31, 5, 1, 197, 2, 166, 31, 3, 1, - 197, 2, 166, 31, 5, 1, 197, 2, 150, 31, 3, 1, 197, 2, 150, 31, 5, 1, 109, - 2, 150, 31, 3, 1, 109, 2, 150, 31, 5, 1, 242, 138, 78, 31, 3, 1, 242, - 138, 78, 31, 5, 1, 242, 138, 109, 2, 150, 31, 3, 1, 242, 138, 109, 2, - 150, 31, 5, 1, 144, 2, 150, 31, 3, 1, 144, 2, 150, 31, 5, 1, 115, 2, 166, - 31, 3, 1, 115, 2, 166, 31, 5, 1, 115, 2, 150, 31, 3, 1, 115, 2, 150, 31, - 5, 1, 115, 2, 42, 116, 31, 3, 1, 115, 2, 42, 116, 31, 5, 1, 253, 164, 2, - 150, 31, 3, 1, 253, 164, 2, 150, 31, 5, 1, 250, 114, 2, 150, 31, 3, 1, - 250, 114, 2, 150, 31, 5, 1, 249, 21, 253, 152, 31, 3, 1, 249, 21, 253, - 152, 31, 5, 1, 249, 21, 249, 97, 31, 3, 1, 249, 21, 249, 97, 31, 5, 1, - 249, 21, 250, 128, 31, 3, 1, 249, 21, 250, 128, 31, 5, 1, 249, 21, 245, - 80, 31, 3, 1, 249, 21, 245, 80, 31, 5, 1, 249, 21, 249, 106, 31, 3, 1, - 249, 21, 249, 106, 31, 5, 1, 249, 21, 249, 111, 31, 3, 1, 249, 21, 249, - 111, 31, 5, 1, 249, 21, 250, 73, 31, 3, 1, 249, 21, 250, 73, 31, 5, 1, - 249, 21, 250, 88, 31, 3, 1, 249, 21, 250, 88, 87, 5, 1, 249, 187, 87, 5, - 1, 249, 191, 87, 5, 1, 249, 236, 87, 5, 1, 253, 93, 87, 5, 1, 249, 133, - 87, 5, 1, 253, 129, 87, 5, 1, 254, 9, 87, 5, 1, 254, 11, 87, 5, 1, 76, - 87, 5, 1, 249, 74, 87, 5, 1, 249, 138, 87, 5, 1, 245, 132, 87, 5, 1, 249, - 179, 87, 5, 1, 253, 115, 87, 5, 1, 249, 254, 87, 5, 1, 253, 140, 87, 5, - 1, 253, 118, 87, 5, 1, 245, 95, 87, 5, 1, 245, 68, 87, 5, 1, 249, 148, - 87, 5, 1, 253, 139, 87, 5, 1, 249, 112, 87, 5, 1, 249, 7, 87, 5, 1, 253, - 215, 87, 5, 1, 249, 11, 87, 5, 1, 249, 155, 87, 5, 1, 245, 117, 87, 5, 1, - 253, 92, 87, 5, 1, 250, 68, 87, 5, 1, 250, 105, 87, 5, 1, 245, 204, 87, - 5, 1, 249, 159, 87, 5, 1, 253, 178, 87, 5, 1, 245, 51, 87, 5, 1, 245, - 161, 87, 5, 1, 249, 140, 87, 5, 1, 254, 60, 87, 5, 1, 249, 101, 87, 147, - 1, 36, 136, 244, 183, 87, 236, 190, 87, 239, 215, 65, 87, 236, 186, 65, - 87, 242, 84, 87, 239, 126, 65, 87, 236, 60, 65, 87, 3, 1, 249, 187, 87, - 3, 1, 249, 191, 87, 3, 1, 249, 236, 87, 3, 1, 253, 93, 87, 3, 1, 249, - 133, 87, 3, 1, 253, 129, 87, 3, 1, 254, 9, 87, 3, 1, 254, 11, 87, 3, 1, - 76, 87, 3, 1, 249, 74, 87, 3, 1, 249, 138, 87, 3, 1, 245, 132, 87, 3, 1, - 249, 179, 87, 3, 1, 253, 115, 87, 3, 1, 249, 254, 87, 3, 1, 253, 140, 87, - 3, 1, 253, 118, 87, 3, 1, 245, 95, 87, 3, 1, 245, 68, 87, 3, 1, 249, 148, - 87, 3, 1, 253, 139, 87, 3, 1, 249, 112, 87, 3, 1, 249, 7, 87, 3, 1, 253, - 215, 87, 3, 1, 249, 11, 87, 3, 1, 249, 155, 87, 3, 1, 245, 117, 87, 3, 1, - 253, 92, 87, 3, 1, 250, 68, 87, 3, 1, 250, 105, 87, 3, 1, 245, 204, 87, - 3, 1, 249, 159, 87, 3, 1, 253, 178, 87, 3, 1, 245, 51, 87, 3, 1, 245, - 161, 87, 3, 1, 249, 140, 87, 3, 1, 254, 60, 87, 3, 1, 249, 101, 87, 3, - 17, 254, 100, 245, 51, 87, 213, 189, 87, 240, 241, 61, 230, 240, 70, 61, - 230, 242, 186, 61, 230, 237, 95, 61, 230, 245, 232, 244, 47, 61, 230, - 245, 232, 243, 121, 61, 230, 242, 37, 61, 230, 244, 57, 61, 230, 244, - 158, 61, 230, 241, 235, 61, 230, 244, 156, 61, 230, 244, 114, 61, 230, - 241, 57, 61, 230, 243, 125, 241, 218, 61, 230, 237, 157, 61, 230, 244, - 46, 247, 238, 61, 230, 241, 84, 241, 173, 61, 230, 244, 27, 61, 230, 243, - 232, 61, 230, 239, 44, 61, 230, 241, 211, 61, 230, 243, 220, 241, 190, - 61, 230, 243, 82, 61, 230, 244, 45, 61, 230, 241, 84, 241, 246, 61, 230, - 248, 189, 254, 88, 248, 196, 61, 230, 252, 56, 61, 230, 246, 250, 61, - 230, 246, 103, 61, 230, 244, 165, 61, 167, 243, 215, 240, 200, 61, 244, - 180, 244, 78, 61, 244, 180, 245, 24, 242, 186, 61, 244, 180, 245, 24, - 242, 162, 61, 244, 180, 245, 24, 241, 30, 61, 244, 180, 242, 222, 61, - 244, 180, 244, 125, 61, 244, 180, 242, 186, 61, 244, 180, 242, 162, 61, - 244, 180, 241, 30, 61, 244, 180, 242, 223, 61, 244, 180, 241, 247, 61, - 244, 180, 242, 176, 112, 242, 181, 61, 244, 180, 243, 221, 61, 236, 191, - 243, 213, 61, 244, 180, 245, 1, 61, 236, 191, 244, 24, 61, 244, 180, 249, - 54, 227, 61, 244, 180, 254, 22, 227, 61, 236, 191, 254, 184, 244, 25, 61, - 167, 156, 227, 61, 1, 244, 224, 61, 1, 250, 154, 61, 1, 243, 134, 61, 1, - 242, 204, 61, 1, 253, 125, 61, 1, 250, 102, 61, 1, 244, 159, 61, 1, 251, - 66, 61, 1, 252, 202, 61, 1, 249, 183, 61, 1, 29, 249, 81, 61, 1, 249, 81, - 61, 1, 242, 179, 61, 1, 29, 249, 147, 61, 1, 249, 147, 61, 1, 29, 249, - 152, 61, 1, 249, 152, 61, 1, 241, 253, 61, 1, 245, 57, 61, 1, 29, 253, - 143, 61, 1, 253, 143, 61, 1, 29, 243, 14, 61, 1, 243, 14, 61, 1, 252, 95, - 61, 1, 245, 170, 61, 1, 245, 6, 61, 1, 250, 86, 61, 17, 241, 10, 42, 250, - 102, 61, 17, 241, 10, 254, 24, 249, 183, 61, 17, 241, 10, 42, 249, 183, - 61, 236, 191, 241, 57, 61, 236, 191, 237, 157, 10, 242, 84, 10, 237, 123, - 10, 239, 126, 65, 10, 1, 242, 221, 10, 1, 67, 2, 244, 237, 47, 10, 1, 67, - 2, 125, 47, 10, 1, 253, 162, 2, 125, 47, 10, 1, 67, 2, 125, 45, 10, 1, - 50, 2, 125, 47, 10, 1, 244, 224, 10, 1, 249, 190, 10, 1, 191, 240, 110, - 10, 1, 252, 199, 10, 1, 248, 122, 10, 1, 245, 115, 10, 1, 251, 56, 10, 1, - 245, 120, 10, 1, 250, 205, 10, 1, 248, 121, 10, 1, 249, 159, 10, 1, 245, - 231, 10, 1, 245, 42, 10, 1, 244, 76, 10, 1, 252, 152, 10, 1, 250, 203, - 10, 1, 250, 82, 10, 1, 253, 58, 10, 1, 250, 135, 10, 1, 243, 133, 10, - 240, 176, 10, 1, 249, 101, 10, 1, 250, 53, 10, 1, 249, 81, 10, 1, 251, - 182, 10, 1, 245, 140, 10, 1, 245, 152, 10, 1, 251, 62, 10, 1, 249, 124, - 10, 1, 67, 239, 189, 10, 1, 249, 91, 10, 239, 12, 10, 238, 197, 10, 239, - 35, 10, 243, 106, 10, 243, 81, 10, 243, 183, 10, 242, 9, 10, 243, 6, 10, - 243, 208, 47, 10, 125, 47, 10, 125, 45, 236, 46, 27, 244, 173, 236, 46, - 27, 121, 236, 46, 27, 114, 236, 46, 27, 153, 236, 46, 27, 163, 236, 46, - 27, 168, 236, 46, 27, 169, 236, 46, 27, 179, 236, 46, 27, 176, 236, 46, - 27, 178, 10, 240, 248, 57, 10, 241, 51, 237, 114, 10, 238, 133, 237, 114, - 10, 249, 48, 240, 218, 244, 178, 10, 1, 240, 228, 249, 190, 10, 1, 240, - 228, 250, 53, 10, 1, 236, 181, 244, 224, 10, 1, 67, 244, 144, 10, 1, 67, - 2, 249, 57, 125, 47, 10, 1, 67, 2, 249, 57, 125, 45, 10, 1, 249, 10, 242, - 221, 10, 1, 249, 10, 125, 244, 224, 10, 1, 249, 10, 125, 249, 124, 10, 1, - 115, 2, 125, 47, 10, 1, 249, 10, 125, 249, 91, 10, 1, 248, 145, 10, 1, - 242, 41, 10, 1, 246, 19, 10, 1, 191, 2, 244, 183, 10, 1, 191, 2, 244, - 171, 248, 253, 53, 237, 121, 10, 1, 249, 155, 10, 1, 244, 112, 10, 1, - 243, 42, 10, 1, 81, 2, 125, 47, 10, 1, 81, 2, 225, 248, 253, 55, 47, 10, - 1, 247, 203, 10, 1, 246, 118, 10, 1, 81, 2, 244, 171, 248, 253, 47, 10, - 1, 244, 111, 10, 1, 240, 177, 10, 1, 246, 83, 10, 1, 253, 180, 2, 244, - 183, 10, 1, 253, 180, 2, 49, 45, 10, 1, 253, 180, 2, 49, 244, 188, 18, 3, - 250, 82, 10, 1, 243, 79, 10, 1, 241, 136, 10, 1, 250, 230, 10, 1, 253, - 180, 2, 244, 171, 248, 253, 53, 237, 121, 10, 1, 253, 180, 2, 249, 28, - 248, 253, 47, 10, 1, 248, 26, 10, 1, 253, 105, 2, 3, 186, 10, 1, 253, - 105, 2, 244, 183, 10, 1, 253, 105, 2, 49, 45, 10, 1, 253, 105, 2, 3, 255, - 44, 45, 10, 1, 253, 105, 2, 49, 244, 188, 18, 49, 47, 10, 1, 253, 105, 2, - 225, 248, 253, 47, 10, 1, 251, 119, 10, 1, 253, 105, 2, 249, 28, 248, - 253, 47, 10, 1, 214, 2, 49, 244, 188, 18, 49, 47, 10, 1, 214, 2, 244, - 171, 248, 253, 45, 10, 1, 214, 2, 244, 171, 248, 253, 244, 188, 18, 244, - 171, 248, 253, 47, 10, 1, 253, 108, 2, 225, 248, 253, 45, 10, 1, 253, - 108, 2, 244, 171, 248, 253, 47, 10, 1, 253, 122, 2, 244, 171, 248, 253, - 47, 10, 1, 253, 117, 2, 244, 171, 248, 253, 47, 10, 1, 240, 228, 249, - 101, 10, 1, 253, 111, 2, 49, 247, 99, 45, 10, 1, 253, 111, 2, 49, 45, 10, - 1, 252, 251, 10, 1, 253, 111, 2, 244, 171, 248, 253, 45, 10, 1, 244, 29, - 10, 1, 253, 120, 2, 49, 47, 10, 1, 253, 120, 2, 244, 171, 248, 253, 47, - 10, 1, 243, 187, 10, 1, 248, 110, 249, 81, 10, 1, 253, 87, 2, 244, 183, - 10, 1, 253, 87, 2, 49, 47, 10, 1, 253, 244, 10, 1, 253, 87, 2, 244, 171, - 248, 253, 45, 10, 1, 251, 23, 10, 1, 253, 194, 2, 244, 183, 10, 1, 243, - 245, 10, 1, 253, 194, 2, 225, 248, 253, 45, 10, 1, 246, 162, 10, 1, 253, - 194, 2, 244, 171, 248, 253, 47, 10, 1, 155, 2, 3, 186, 10, 1, 155, 2, 49, - 47, 10, 1, 155, 2, 244, 171, 248, 253, 47, 10, 1, 155, 2, 244, 171, 248, - 253, 45, 10, 1, 177, 2, 49, 45, 10, 1, 177, 241, 177, 10, 1, 244, 61, 10, - 1, 177, 2, 244, 183, 10, 1, 177, 2, 244, 171, 248, 253, 47, 10, 1, 188, - 236, 97, 10, 1, 244, 240, 2, 49, 47, 10, 1, 188, 2, 50, 47, 10, 1, 188, - 245, 99, 10, 1, 188, 249, 79, 2, 125, 47, 10, 1, 191, 241, 26, 245, 99, - 10, 1, 253, 162, 2, 244, 183, 10, 1, 240, 217, 253, 142, 10, 1, 253, 142, - 10, 1, 84, 10, 1, 253, 124, 10, 1, 240, 217, 253, 124, 10, 1, 253, 162, - 2, 225, 248, 253, 47, 10, 1, 253, 214, 10, 1, 244, 227, 249, 91, 10, 1, - 50, 2, 244, 182, 10, 1, 50, 2, 3, 186, 10, 1, 253, 162, 2, 49, 47, 10, 1, - 70, 10, 1, 50, 2, 244, 171, 248, 253, 45, 10, 1, 50, 241, 110, 10, 1, 50, - 242, 139, 2, 125, 47, 10, 213, 189, 10, 1, 253, 163, 10, 3, 249, 10, 17, - 253, 108, 2, 155, 2, 67, 239, 189, 10, 3, 249, 10, 17, 253, 120, 2, 155, - 2, 67, 239, 189, 10, 3, 249, 10, 43, 46, 12, 10, 3, 249, 10, 155, 244, - 224, 10, 3, 249, 10, 245, 115, 10, 3, 249, 10, 244, 171, 244, 215, 10, 3, - 249, 10, 245, 42, 10, 253, 127, 137, 245, 250, 10, 245, 45, 137, 254, - 181, 254, 241, 246, 178, 10, 3, 249, 10, 241, 4, 244, 173, 10, 3, 249, - 10, 242, 44, 236, 226, 244, 173, 10, 3, 249, 10, 240, 228, 251, 61, 137, - 245, 120, 10, 3, 249, 10, 43, 35, 12, 10, 3, 253, 113, 245, 42, 10, 3, - 249, 10, 243, 207, 10, 3, 249, 124, 10, 3, 249, 91, 10, 3, 249, 10, 249, - 91, 10, 3, 249, 10, 245, 152, 10, 245, 162, 137, 241, 252, 10, 244, 216, - 242, 100, 253, 113, 189, 10, 244, 216, 242, 100, 249, 10, 189, 10, 241, - 4, 249, 10, 249, 71, 2, 243, 113, 241, 46, 10, 3, 253, 113, 245, 140, - 239, 141, 236, 46, 27, 244, 173, 239, 141, 236, 46, 27, 121, 239, 141, - 236, 46, 27, 114, 239, 141, 236, 46, 27, 153, 239, 141, 236, 46, 27, 163, - 239, 141, 236, 46, 27, 168, 239, 141, 236, 46, 27, 169, 239, 141, 236, - 46, 27, 179, 239, 141, 236, 46, 27, 176, 239, 141, 236, 46, 27, 178, 10, - 1, 215, 2, 49, 45, 10, 1, 253, 107, 2, 49, 45, 10, 1, 244, 190, 2, 49, - 45, 10, 25, 243, 1, 237, 124, 10, 25, 243, 1, 236, 156, 249, 148, 118, - 253, 127, 137, 238, 41, 118, 236, 210, 213, 189, 118, 238, 129, 213, 189, - 118, 236, 210, 242, 81, 118, 238, 129, 242, 81, 118, 146, 242, 81, 118, - 244, 214, 242, 166, 244, 172, 118, 244, 214, 242, 166, 184, 118, 236, - 210, 244, 214, 242, 166, 244, 172, 118, 238, 129, 244, 214, 242, 166, - 184, 118, 236, 90, 118, 239, 184, 241, 226, 118, 239, 184, 238, 32, 118, - 239, 184, 236, 245, 118, 236, 60, 65, 118, 1, 242, 195, 118, 1, 236, 181, - 242, 195, 118, 1, 246, 24, 118, 1, 243, 122, 118, 1, 246, 134, 238, 141, - 118, 1, 241, 133, 118, 1, 240, 228, 243, 80, 245, 172, 118, 1, 253, 125, - 118, 1, 249, 124, 118, 1, 245, 231, 118, 1, 246, 173, 118, 1, 248, 120, - 118, 1, 252, 203, 238, 141, 118, 1, 248, 202, 118, 1, 253, 48, 253, 125, - 118, 1, 247, 27, 118, 1, 241, 196, 118, 1, 251, 235, 118, 1, 249, 152, - 118, 1, 239, 234, 118, 1, 29, 239, 234, 118, 1, 70, 118, 1, 253, 143, - 118, 1, 224, 253, 143, 118, 1, 244, 68, 118, 1, 248, 0, 118, 1, 245, 172, - 118, 1, 245, 6, 118, 1, 252, 197, 118, 242, 184, 47, 118, 242, 184, 45, - 118, 242, 184, 241, 18, 118, 242, 194, 47, 118, 242, 194, 45, 118, 242, - 194, 241, 18, 118, 245, 169, 47, 118, 245, 169, 45, 118, 242, 118, 245, - 234, 236, 182, 118, 242, 118, 245, 234, 239, 251, 118, 245, 106, 47, 118, - 245, 106, 45, 118, 237, 65, 241, 18, 118, 245, 82, 47, 118, 245, 82, 45, - 118, 244, 67, 118, 239, 216, 227, 118, 238, 51, 118, 239, 77, 118, 225, - 55, 248, 253, 47, 118, 225, 55, 248, 253, 45, 118, 244, 171, 248, 253, - 47, 118, 244, 171, 248, 253, 45, 118, 241, 2, 217, 47, 118, 241, 2, 217, - 45, 118, 243, 233, 118, 240, 4, 161, 1, 249, 68, 161, 1, 238, 59, 161, 1, - 244, 2, 161, 1, 249, 115, 161, 1, 249, 188, 161, 1, 238, 28, 161, 1, 243, - 181, 161, 1, 243, 28, 161, 1, 244, 136, 161, 1, 243, 216, 161, 1, 243, - 104, 161, 1, 241, 138, 161, 1, 245, 8, 161, 1, 243, 198, 161, 1, 243, - 120, 161, 1, 238, 10, 161, 1, 244, 72, 161, 1, 238, 198, 161, 1, 239, - 114, 161, 1, 239, 101, 161, 1, 249, 180, 161, 1, 239, 60, 161, 1, 239, - 34, 161, 1, 237, 180, 161, 1, 248, 143, 161, 1, 245, 107, 161, 1, 247, - 29, 161, 1, 242, 33, 161, 1, 250, 123, 161, 1, 242, 11, 161, 1, 241, 251, - 161, 1, 241, 132, 161, 1, 76, 161, 1, 253, 190, 161, 1, 245, 241, 161, 1, - 241, 176, 161, 1, 244, 44, 161, 1, 244, 143, 161, 239, 246, 161, 237, - 171, 161, 240, 88, 161, 238, 2, 161, 240, 190, 161, 238, 38, 161, 240, - 63, 161, 238, 8, 161, 240, 128, 161, 238, 37, 161, 243, 6, 161, 1, 249, - 150, 72, 25, 236, 49, 72, 25, 238, 90, 72, 25, 239, 148, 72, 1, 64, 72, - 1, 253, 95, 72, 1, 69, 72, 1, 253, 96, 72, 1, 84, 72, 1, 253, 104, 72, 1, - 152, 135, 72, 1, 152, 148, 72, 1, 242, 110, 70, 72, 1, 207, 70, 72, 1, - 70, 72, 1, 253, 106, 72, 1, 242, 110, 78, 72, 1, 207, 78, 72, 1, 78, 72, - 1, 253, 109, 72, 1, 208, 72, 1, 249, 24, 72, 1, 253, 100, 72, 1, 249, 36, - 72, 1, 249, 13, 72, 1, 253, 115, 72, 1, 249, 11, 72, 1, 253, 118, 72, 1, - 249, 45, 72, 1, 249, 38, 72, 1, 249, 22, 72, 1, 244, 195, 72, 1, 249, 27, - 72, 1, 244, 200, 72, 1, 249, 37, 72, 1, 253, 91, 72, 1, 249, 19, 72, 1, - 253, 93, 72, 1, 249, 40, 72, 1, 253, 94, 72, 1, 245, 150, 72, 1, 253, 90, - 72, 1, 249, 29, 72, 1, 253, 110, 72, 1, 249, 39, 72, 1, 221, 72, 1, 216, - 72, 1, 253, 92, 72, 1, 249, 50, 72, 1, 253, 103, 72, 1, 249, 49, 72, 1, - 245, 27, 72, 1, 253, 161, 72, 1, 249, 7, 72, 1, 249, 34, 72, 1, 253, 97, - 72, 1, 253, 88, 72, 25, 242, 149, 72, 25, 238, 117, 72, 38, 25, 253, 95, - 72, 38, 25, 69, 72, 38, 25, 253, 96, 72, 38, 25, 84, 72, 38, 25, 253, - 104, 72, 38, 25, 152, 135, 72, 38, 25, 152, 253, 130, 72, 38, 25, 242, - 110, 70, 72, 38, 25, 207, 70, 72, 38, 25, 70, 72, 38, 25, 253, 106, 72, - 38, 25, 242, 110, 78, 72, 38, 25, 207, 78, 72, 38, 25, 78, 72, 38, 25, - 253, 109, 72, 25, 240, 220, 72, 253, 245, 72, 242, 188, 25, 242, 43, 72, - 242, 188, 25, 238, 170, 72, 244, 201, 240, 203, 72, 244, 196, 240, 203, - 72, 1, 253, 213, 72, 1, 245, 124, 72, 1, 245, 97, 72, 1, 253, 129, 72, 1, - 243, 84, 72, 1, 249, 160, 72, 1, 253, 153, 72, 1, 249, 184, 72, 1, 152, - 253, 130, 72, 1, 152, 253, 146, 72, 38, 25, 152, 148, 72, 38, 25, 152, - 253, 146, 72, 242, 205, 72, 42, 242, 205, 72, 27, 244, 173, 72, 27, 121, - 72, 27, 114, 72, 27, 153, 72, 27, 163, 72, 27, 168, 72, 27, 169, 72, 27, - 179, 72, 27, 176, 72, 27, 178, 72, 236, 60, 57, 91, 25, 236, 49, 91, 25, - 238, 90, 91, 25, 239, 148, 91, 1, 64, 91, 1, 253, 95, 91, 1, 69, 91, 1, - 253, 96, 91, 1, 84, 91, 1, 253, 104, 91, 1, 152, 135, 91, 1, 152, 148, - 91, 1, 70, 91, 1, 253, 106, 91, 1, 78, 91, 1, 253, 109, 91, 1, 208, 91, - 1, 249, 24, 91, 1, 253, 100, 91, 1, 249, 36, 91, 1, 249, 13, 91, 1, 253, - 115, 91, 1, 249, 11, 91, 1, 253, 118, 91, 1, 249, 45, 91, 1, 249, 38, 91, - 1, 249, 22, 91, 1, 244, 195, 91, 1, 249, 27, 91, 1, 244, 200, 91, 1, 249, - 37, 91, 1, 253, 91, 91, 1, 249, 19, 91, 1, 253, 93, 91, 1, 249, 40, 91, - 1, 253, 94, 91, 1, 253, 90, 91, 1, 249, 29, 91, 1, 253, 110, 91, 1, 249, - 39, 91, 1, 221, 91, 1, 216, 91, 1, 253, 92, 91, 1, 253, 103, 91, 1, 249, - 7, 91, 1, 249, 34, 91, 1, 253, 97, 91, 1, 253, 88, 91, 25, 242, 149, 91, - 38, 25, 253, 95, 91, 38, 25, 69, 91, 38, 25, 253, 96, 91, 38, 25, 84, 91, - 38, 25, 253, 104, 91, 38, 25, 152, 135, 91, 38, 25, 152, 253, 130, 91, - 38, 25, 70, 91, 38, 25, 253, 106, 91, 38, 25, 78, 91, 38, 25, 253, 109, - 91, 25, 240, 220, 91, 254, 230, 242, 106, 65, 91, 1, 249, 50, 91, 1, 249, - 160, 91, 1, 249, 184, 91, 1, 152, 253, 130, 91, 1, 152, 253, 146, 91, 38, - 25, 152, 148, 91, 38, 25, 152, 253, 146, 91, 27, 244, 173, 91, 27, 121, - 91, 27, 114, 91, 27, 153, 91, 27, 163, 91, 27, 168, 91, 27, 169, 91, 27, - 179, 91, 27, 176, 91, 27, 178, 91, 1, 254, 253, 2, 242, 65, 238, 109, 91, - 1, 254, 253, 2, 149, 238, 109, 91, 245, 40, 65, 91, 245, 40, 57, 91, 239, - 147, 238, 103, 121, 91, 239, 147, 238, 103, 114, 91, 239, 147, 238, 103, - 153, 91, 239, 147, 238, 103, 163, 91, 239, 147, 238, 103, 253, 101, 251, - 190, 249, 166, 253, 173, 236, 95, 91, 239, 147, 237, 0, 239, 162, 91, - 241, 59, 113, 25, 243, 44, 113, 1, 64, 113, 1, 253, 95, 113, 1, 69, 113, - 1, 253, 96, 113, 1, 84, 113, 1, 253, 104, 113, 1, 253, 126, 113, 1, 253, - 106, 113, 1, 253, 119, 113, 1, 253, 109, 113, 1, 208, 113, 1, 249, 24, - 113, 1, 253, 100, 113, 1, 249, 36, 113, 1, 249, 13, 113, 1, 253, 115, - 113, 1, 249, 11, 113, 1, 253, 118, 113, 1, 249, 45, 113, 1, 249, 38, 113, - 1, 249, 22, 113, 1, 244, 195, 113, 1, 249, 27, 113, 1, 244, 200, 113, 1, - 249, 37, 113, 1, 253, 91, 113, 1, 249, 19, 113, 1, 253, 93, 113, 1, 249, - 40, 113, 1, 253, 94, 113, 1, 253, 90, 113, 1, 249, 29, 113, 1, 253, 110, - 113, 1, 249, 39, 113, 1, 221, 113, 1, 216, 113, 1, 253, 92, 113, 1, 253, - 103, 113, 1, 249, 49, 113, 1, 253, 161, 113, 1, 249, 7, 113, 1, 253, 97, - 113, 1, 253, 88, 113, 25, 242, 149, 113, 38, 25, 253, 95, 113, 38, 25, - 69, 113, 38, 25, 253, 96, 113, 38, 25, 84, 113, 38, 25, 253, 104, 113, - 38, 25, 253, 126, 113, 38, 25, 253, 106, 113, 38, 25, 253, 119, 113, 38, - 25, 253, 109, 113, 25, 240, 220, 113, 1, 245, 124, 113, 1, 245, 97, 113, - 1, 253, 129, 113, 1, 249, 50, 113, 1, 253, 153, 113, 27, 244, 173, 113, - 27, 121, 113, 27, 114, 113, 27, 153, 113, 27, 163, 113, 27, 168, 113, 27, - 169, 113, 27, 179, 113, 27, 176, 113, 27, 178, 113, 244, 121, 113, 243, - 25, 113, 251, 114, 113, 252, 244, 113, 255, 6, 244, 19, 106, 25, 236, 49, - 106, 25, 238, 90, 106, 25, 239, 148, 106, 1, 64, 106, 1, 253, 95, 106, 1, - 69, 106, 1, 253, 96, 106, 1, 84, 106, 1, 253, 104, 106, 1, 152, 135, 106, - 38, 242, 110, 70, 106, 1, 70, 106, 1, 253, 106, 106, 38, 242, 110, 78, - 106, 1, 78, 106, 1, 253, 109, 106, 1, 208, 106, 1, 249, 24, 106, 1, 253, - 100, 106, 1, 249, 36, 106, 1, 249, 13, 106, 1, 253, 115, 106, 1, 249, 11, - 106, 1, 253, 118, 106, 1, 249, 45, 106, 1, 249, 38, 106, 1, 249, 22, 106, - 1, 244, 195, 106, 1, 249, 27, 106, 1, 244, 200, 106, 1, 249, 37, 106, 1, - 253, 91, 106, 1, 249, 19, 106, 1, 253, 93, 106, 1, 249, 40, 106, 1, 253, - 94, 106, 1, 253, 90, 106, 1, 249, 29, 106, 1, 253, 110, 106, 1, 249, 39, - 106, 1, 221, 106, 1, 216, 106, 1, 253, 92, 106, 1, 253, 103, 106, 1, 249, - 49, 106, 1, 253, 161, 106, 1, 249, 7, 106, 1, 249, 34, 106, 1, 253, 97, - 106, 1, 253, 88, 106, 25, 242, 149, 106, 25, 238, 117, 106, 38, 25, 253, - 95, 106, 38, 25, 69, 106, 38, 25, 253, 96, 106, 38, 25, 84, 106, 38, 25, - 253, 104, 106, 38, 25, 152, 135, 106, 38, 25, 152, 253, 130, 106, 38, 25, - 242, 110, 70, 106, 38, 25, 70, 106, 38, 25, 253, 106, 106, 38, 25, 242, - 110, 78, 106, 38, 25, 78, 106, 38, 25, 253, 109, 106, 25, 240, 220, 106, - 253, 245, 106, 1, 152, 253, 130, 106, 27, 244, 173, 106, 27, 121, 106, - 27, 114, 106, 27, 153, 106, 27, 163, 106, 27, 168, 106, 27, 169, 106, 27, - 179, 106, 27, 176, 106, 27, 178, 105, 25, 236, 49, 105, 25, 238, 90, 105, - 25, 239, 148, 105, 1, 64, 105, 1, 253, 95, 105, 1, 69, 105, 1, 253, 96, - 105, 1, 84, 105, 1, 253, 104, 105, 1, 152, 135, 105, 1, 152, 148, 105, 1, - 70, 105, 1, 253, 106, 105, 1, 78, 105, 1, 253, 109, 105, 1, 208, 105, 1, - 249, 24, 105, 1, 253, 100, 105, 1, 249, 36, 105, 1, 249, 13, 105, 1, 253, - 115, 105, 1, 249, 11, 105, 1, 253, 118, 105, 1, 249, 45, 105, 1, 249, 38, - 105, 1, 249, 22, 105, 1, 244, 195, 105, 1, 249, 27, 105, 1, 244, 200, - 105, 1, 249, 37, 105, 1, 253, 91, 105, 1, 249, 19, 105, 1, 253, 93, 105, - 1, 249, 40, 105, 1, 253, 94, 105, 1, 253, 90, 105, 1, 249, 29, 105, 1, - 253, 110, 105, 1, 249, 39, 105, 1, 221, 105, 1, 216, 105, 1, 253, 92, - 105, 1, 253, 103, 105, 1, 249, 49, 105, 1, 249, 7, 105, 1, 249, 34, 105, - 1, 253, 97, 105, 1, 253, 88, 105, 25, 242, 149, 105, 25, 238, 117, 105, - 38, 25, 253, 95, 105, 38, 25, 69, 105, 38, 25, 253, 96, 105, 38, 25, 84, - 105, 38, 25, 253, 104, 105, 38, 25, 152, 135, 105, 38, 25, 70, 105, 38, - 25, 253, 106, 105, 38, 25, 78, 105, 38, 25, 253, 109, 105, 25, 240, 220, - 105, 254, 227, 242, 106, 65, 105, 254, 230, 242, 106, 65, 105, 1, 249, - 50, 105, 1, 249, 160, 105, 1, 249, 184, 105, 1, 152, 253, 130, 105, 1, - 152, 253, 146, 105, 27, 244, 173, 105, 27, 121, 105, 27, 114, 105, 27, - 153, 105, 27, 163, 105, 27, 168, 105, 27, 169, 105, 27, 179, 105, 27, - 176, 105, 27, 178, 105, 241, 59, 142, 25, 238, 90, 142, 25, 239, 148, - 142, 1, 64, 142, 1, 253, 95, 142, 1, 69, 142, 1, 253, 96, 142, 1, 84, - 142, 1, 253, 104, 142, 1, 70, 142, 1, 253, 126, 142, 1, 253, 106, 142, 1, - 78, 142, 1, 253, 119, 142, 1, 253, 109, 142, 1, 208, 142, 1, 249, 13, - 142, 1, 253, 115, 142, 1, 253, 118, 142, 1, 249, 38, 142, 1, 249, 22, - 142, 1, 249, 37, 142, 1, 253, 91, 142, 1, 253, 94, 142, 1, 245, 150, 142, - 1, 253, 90, 142, 1, 221, 142, 1, 216, 142, 1, 253, 92, 142, 1, 249, 50, - 142, 1, 253, 103, 142, 1, 249, 49, 142, 1, 245, 27, 142, 1, 253, 161, - 142, 1, 249, 34, 142, 1, 253, 97, 142, 1, 253, 88, 142, 38, 25, 253, 95, - 142, 38, 25, 69, 142, 38, 25, 253, 96, 142, 38, 25, 84, 142, 38, 25, 253, - 104, 142, 38, 25, 70, 142, 38, 25, 253, 126, 142, 38, 25, 253, 106, 142, - 38, 25, 78, 142, 38, 25, 253, 119, 142, 38, 25, 253, 109, 142, 25, 240, - 220, 142, 254, 230, 242, 106, 65, 142, 27, 121, 142, 27, 114, 142, 27, - 153, 142, 27, 163, 142, 27, 168, 142, 27, 169, 142, 27, 179, 142, 27, - 176, 142, 27, 178, 142, 83, 249, 18, 142, 83, 253, 101, 239, 150, 142, - 83, 253, 101, 238, 104, 104, 25, 236, 49, 104, 25, 238, 90, 104, 25, 239, - 148, 104, 1, 64, 104, 1, 253, 95, 104, 1, 69, 104, 1, 253, 96, 104, 1, - 84, 104, 1, 253, 104, 104, 1, 152, 135, 104, 1, 152, 148, 104, 1, 70, - 104, 1, 253, 126, 104, 1, 253, 106, 104, 1, 78, 104, 1, 253, 119, 104, 1, - 253, 109, 104, 1, 208, 104, 1, 249, 24, 104, 1, 253, 100, 104, 1, 249, - 36, 104, 1, 249, 13, 104, 1, 253, 115, 104, 1, 249, 11, 104, 1, 253, 118, - 104, 1, 249, 45, 104, 1, 249, 38, 104, 1, 249, 22, 104, 1, 244, 195, 104, - 1, 249, 27, 104, 1, 244, 200, 104, 1, 249, 37, 104, 1, 253, 91, 104, 1, - 249, 19, 104, 1, 253, 93, 104, 1, 249, 40, 104, 1, 253, 94, 104, 1, 253, - 90, 104, 1, 249, 29, 104, 1, 253, 110, 104, 1, 249, 39, 104, 1, 221, 104, - 1, 216, 104, 1, 253, 92, 104, 1, 249, 50, 104, 1, 253, 103, 104, 1, 249, - 49, 104, 1, 253, 161, 104, 1, 249, 7, 104, 1, 249, 34, 104, 1, 253, 97, - 104, 1, 253, 88, 104, 38, 25, 253, 95, 104, 38, 25, 69, 104, 38, 25, 253, - 96, 104, 38, 25, 84, 104, 38, 25, 253, 104, 104, 38, 25, 152, 135, 104, - 38, 25, 152, 253, 130, 104, 38, 25, 70, 104, 38, 25, 253, 126, 104, 38, - 25, 253, 106, 104, 38, 25, 78, 104, 38, 25, 253, 119, 104, 38, 25, 253, - 109, 104, 25, 240, 220, 104, 242, 106, 65, 104, 254, 227, 242, 106, 65, - 104, 1, 152, 253, 130, 104, 1, 152, 253, 146, 104, 27, 244, 173, 104, 27, - 121, 104, 27, 114, 104, 27, 153, 104, 27, 163, 104, 27, 168, 104, 27, - 169, 104, 27, 179, 104, 27, 176, 104, 27, 178, 102, 25, 238, 90, 102, 25, - 239, 148, 102, 1, 64, 102, 1, 253, 95, 102, 1, 69, 102, 1, 253, 96, 102, - 1, 84, 102, 1, 253, 104, 102, 1, 152, 135, 102, 1, 152, 148, 102, 1, 70, - 102, 1, 253, 126, 102, 1, 253, 106, 102, 1, 78, 102, 1, 253, 119, 102, 1, - 253, 109, 102, 1, 208, 102, 1, 249, 24, 102, 1, 253, 100, 102, 1, 249, - 36, 102, 1, 249, 13, 102, 1, 253, 115, 102, 1, 249, 11, 102, 1, 253, 118, - 102, 1, 249, 45, 102, 1, 249, 38, 102, 1, 249, 22, 102, 1, 244, 195, 102, - 1, 249, 27, 102, 1, 244, 200, 102, 1, 249, 37, 102, 1, 253, 91, 102, 1, - 249, 19, 102, 1, 253, 93, 102, 1, 249, 40, 102, 1, 253, 94, 102, 1, 253, - 90, 102, 1, 249, 29, 102, 1, 253, 110, 102, 1, 249, 39, 102, 1, 221, 102, - 1, 216, 102, 1, 253, 92, 102, 1, 249, 50, 102, 1, 253, 103, 102, 1, 249, - 49, 102, 1, 253, 161, 102, 1, 249, 7, 102, 1, 249, 34, 102, 1, 253, 97, - 102, 1, 253, 88, 102, 38, 25, 253, 95, 102, 38, 25, 69, 102, 38, 25, 253, - 96, 102, 38, 25, 84, 102, 38, 25, 253, 104, 102, 38, 25, 152, 135, 102, - 38, 25, 152, 253, 130, 102, 38, 25, 70, 102, 38, 25, 253, 126, 102, 38, - 25, 253, 106, 102, 38, 25, 78, 102, 38, 25, 253, 119, 102, 38, 25, 253, - 109, 102, 25, 240, 220, 102, 242, 106, 65, 102, 254, 227, 242, 106, 65, - 102, 1, 253, 153, 102, 1, 152, 253, 130, 102, 1, 152, 253, 146, 102, 27, - 244, 173, 102, 27, 121, 102, 27, 114, 102, 27, 153, 102, 27, 163, 102, - 27, 168, 102, 27, 169, 102, 27, 179, 102, 27, 176, 102, 27, 178, 107, 25, - 238, 90, 107, 25, 239, 148, 107, 1, 64, 107, 1, 253, 95, 107, 1, 69, 107, - 1, 253, 96, 107, 1, 84, 107, 1, 253, 104, 107, 1, 152, 135, 107, 1, 152, - 148, 107, 1, 70, 107, 1, 253, 126, 107, 1, 253, 106, 107, 1, 78, 107, 1, - 253, 119, 107, 1, 253, 109, 107, 1, 208, 107, 1, 249, 24, 107, 1, 253, - 100, 107, 1, 249, 36, 107, 1, 249, 13, 107, 1, 253, 115, 107, 1, 249, 11, - 107, 1, 253, 118, 107, 1, 249, 45, 107, 1, 249, 38, 107, 1, 249, 22, 107, - 1, 244, 195, 107, 1, 249, 27, 107, 1, 244, 200, 107, 1, 249, 37, 107, 1, - 253, 91, 107, 1, 249, 19, 107, 1, 253, 93, 107, 1, 249, 40, 107, 1, 253, - 94, 107, 1, 253, 90, 107, 1, 249, 29, 107, 1, 253, 110, 107, 1, 249, 39, - 107, 1, 221, 107, 1, 216, 107, 1, 253, 92, 107, 1, 249, 50, 107, 1, 253, - 103, 107, 1, 249, 49, 107, 1, 245, 27, 107, 1, 253, 161, 107, 1, 249, 7, - 107, 1, 249, 34, 107, 1, 253, 97, 107, 1, 253, 88, 107, 38, 25, 253, 95, - 107, 38, 25, 69, 107, 38, 25, 253, 96, 107, 38, 25, 84, 107, 38, 25, 253, - 104, 107, 38, 25, 152, 135, 107, 38, 25, 70, 107, 38, 25, 253, 126, 107, - 38, 25, 253, 106, 107, 38, 25, 78, 107, 38, 25, 253, 119, 107, 38, 25, - 253, 109, 107, 25, 240, 220, 107, 254, 230, 242, 106, 65, 107, 1, 152, - 253, 130, 107, 1, 152, 253, 146, 107, 27, 244, 173, 107, 27, 121, 107, - 27, 114, 107, 27, 153, 107, 27, 163, 107, 27, 168, 107, 27, 169, 107, 27, - 179, 107, 27, 176, 107, 27, 178, 103, 25, 236, 243, 103, 25, 238, 72, - 103, 1, 241, 106, 103, 1, 239, 245, 103, 1, 239, 247, 103, 1, 238, 168, - 103, 1, 241, 188, 103, 1, 240, 90, 103, 1, 242, 46, 103, 1, 240, 191, - 103, 1, 239, 33, 103, 1, 238, 21, 103, 1, 239, 29, 103, 1, 238, 16, 103, - 1, 241, 156, 103, 1, 240, 64, 103, 1, 239, 248, 103, 1, 241, 232, 103, 1, - 240, 132, 103, 1, 240, 1, 103, 1, 237, 115, 239, 221, 103, 1, 236, 189, - 239, 221, 103, 1, 237, 115, 239, 183, 103, 1, 236, 189, 239, 183, 103, 1, - 241, 189, 236, 219, 103, 1, 241, 5, 239, 183, 103, 1, 237, 115, 239, 206, - 103, 1, 236, 189, 239, 206, 103, 1, 237, 115, 239, 185, 103, 1, 236, 189, - 239, 185, 103, 1, 241, 34, 236, 219, 103, 1, 241, 34, 240, 158, 236, 146, - 103, 1, 241, 5, 239, 185, 103, 1, 237, 115, 238, 163, 103, 1, 236, 189, - 238, 163, 103, 1, 237, 115, 238, 118, 103, 1, 236, 189, 238, 118, 103, 1, - 238, 123, 239, 226, 103, 1, 241, 5, 238, 118, 103, 1, 237, 115, 239, 241, - 103, 1, 236, 189, 239, 241, 103, 1, 237, 115, 239, 179, 103, 1, 236, 189, - 239, 179, 103, 1, 241, 16, 239, 226, 103, 1, 241, 5, 239, 179, 103, 1, - 237, 115, 239, 227, 103, 1, 236, 189, 239, 227, 103, 1, 237, 115, 239, - 177, 103, 1, 236, 189, 239, 177, 103, 1, 240, 112, 103, 1, 250, 136, 239, - 177, 103, 1, 240, 197, 103, 1, 240, 150, 103, 1, 241, 16, 239, 223, 103, - 1, 240, 192, 103, 1, 241, 34, 239, 194, 103, 1, 238, 123, 239, 194, 103, - 1, 241, 16, 239, 194, 103, 1, 240, 85, 103, 1, 238, 123, 239, 223, 103, - 1, 240, 72, 103, 25, 237, 172, 103, 38, 25, 236, 199, 103, 38, 25, 245, - 26, 236, 211, 103, 38, 25, 249, 62, 236, 211, 103, 38, 25, 245, 26, 238, - 146, 103, 38, 25, 249, 62, 238, 146, 103, 38, 25, 245, 26, 237, 161, 103, - 38, 25, 249, 62, 237, 161, 103, 38, 25, 235, 251, 103, 38, 25, 239, 222, - 103, 38, 25, 249, 62, 239, 222, 103, 38, 25, 247, 38, 246, 104, 103, 38, - 25, 241, 23, 254, 14, 236, 199, 103, 38, 25, 241, 23, 254, 14, 249, 62, - 236, 199, 103, 38, 25, 241, 23, 254, 14, 236, 62, 103, 38, 25, 236, 62, - 103, 38, 25, 249, 62, 235, 251, 103, 38, 25, 249, 62, 236, 62, 103, 236, - 191, 237, 73, 95, 92, 254, 249, 251, 141, 95, 92, 253, 198, 247, 30, 95, - 92, 253, 198, 243, 189, 95, 92, 253, 198, 243, 190, 95, 92, 253, 198, - 247, 33, 95, 92, 253, 198, 240, 148, 95, 92, 254, 156, 252, 20, 95, 92, - 253, 237, 246, 45, 95, 92, 253, 237, 243, 63, 95, 92, 253, 237, 243, 61, - 95, 92, 254, 225, 253, 159, 95, 92, 253, 237, 246, 52, 95, 92, 255, 0, - 248, 194, 95, 92, 254, 240, 243, 59, 95, 92, 139, 244, 26, 95, 92, 253, - 188, 245, 47, 95, 92, 253, 188, 237, 76, 95, 92, 253, 188, 240, 139, 95, - 92, 254, 243, 252, 12, 95, 92, 254, 240, 250, 212, 95, 92, 139, 252, 194, - 95, 92, 253, 188, 244, 119, 95, 92, 253, 188, 242, 34, 95, 92, 253, 188, - 244, 118, 95, 92, 254, 243, 253, 112, 95, 92, 255, 3, 241, 108, 95, 92, - 255, 20, 252, 70, 95, 92, 253, 230, 244, 36, 95, 92, 254, 232, 253, 153, - 95, 92, 253, 230, 247, 243, 95, 92, 254, 232, 250, 251, 95, 92, 253, 230, - 240, 157, 95, 92, 255, 15, 221, 95, 92, 255, 0, 253, 41, 95, 92, 255, 21, - 252, 137, 95, 92, 253, 170, 95, 92, 254, 234, 245, 131, 95, 92, 253, 229, - 95, 92, 255, 26, 248, 169, 95, 92, 254, 225, 248, 51, 95, 92, 254, 225, - 248, 47, 95, 92, 254, 225, 252, 178, 95, 92, 254, 222, 251, 74, 95, 92, - 254, 234, 243, 65, 95, 92, 109, 249, 75, 95, 92, 254, 222, 241, 222, 95, - 92, 238, 40, 95, 92, 249, 33, 64, 95, 92, 253, 147, 239, 25, 95, 92, 249, - 33, 253, 95, 95, 92, 249, 33, 253, 234, 95, 92, 249, 33, 69, 95, 92, 249, - 33, 253, 96, 95, 92, 249, 33, 253, 253, 95, 92, 249, 33, 252, 236, 95, - 92, 249, 33, 84, 95, 92, 249, 33, 253, 104, 95, 92, 240, 138, 95, 239, - 147, 13, 245, 251, 95, 92, 249, 33, 70, 95, 92, 249, 33, 253, 163, 95, - 92, 249, 33, 78, 95, 92, 249, 33, 254, 227, 240, 108, 95, 92, 249, 33, - 254, 227, 239, 45, 95, 92, 236, 142, 95, 92, 239, 46, 95, 92, 238, 30, - 95, 92, 253, 147, 254, 37, 95, 92, 253, 147, 249, 55, 95, 92, 253, 147, - 252, 216, 95, 92, 253, 147, 238, 189, 95, 92, 236, 173, 95, 92, 239, 51, - 95, 92, 239, 112, 95, 92, 240, 76, 95, 27, 244, 173, 95, 27, 121, 95, 27, - 114, 95, 27, 153, 95, 27, 163, 95, 27, 168, 95, 27, 169, 95, 27, 179, 95, - 27, 176, 95, 27, 178, 95, 92, 236, 241, 95, 92, 241, 192, 132, 1, 253, - 155, 132, 1, 253, 198, 244, 231, 132, 1, 253, 198, 249, 72, 132, 1, 249, - 110, 132, 1, 253, 178, 132, 1, 254, 225, 249, 72, 132, 1, 249, 84, 132, - 1, 253, 193, 132, 1, 76, 132, 1, 253, 188, 244, 231, 132, 1, 253, 188, - 249, 72, 132, 1, 253, 136, 132, 1, 253, 221, 132, 1, 253, 187, 132, 1, - 253, 230, 244, 231, 132, 1, 254, 232, 249, 72, 132, 1, 253, 230, 249, 72, - 132, 1, 254, 232, 244, 231, 132, 1, 253, 141, 132, 1, 253, 123, 132, 1, - 254, 234, 245, 131, 132, 1, 254, 234, 247, 68, 132, 1, 253, 138, 132, 1, - 254, 225, 244, 231, 132, 1, 254, 222, 244, 231, 132, 1, 78, 132, 1, 254, - 222, 249, 72, 132, 238, 96, 132, 38, 25, 64, 132, 38, 25, 253, 147, 249, - 139, 132, 38, 25, 253, 95, 132, 38, 25, 253, 234, 132, 38, 25, 69, 132, - 38, 25, 253, 96, 132, 38, 25, 181, 132, 38, 25, 254, 26, 132, 38, 25, 84, - 132, 38, 25, 253, 104, 132, 38, 25, 253, 147, 251, 165, 132, 238, 157, - 25, 253, 184, 132, 238, 157, 25, 249, 84, 132, 38, 25, 70, 132, 38, 25, - 254, 36, 132, 38, 25, 78, 132, 38, 25, 254, 2, 132, 38, 25, 253, 106, - 132, 254, 249, 253, 103, 132, 249, 5, 253, 147, 254, 37, 132, 249, 5, - 253, 147, 249, 55, 132, 249, 5, 253, 147, 253, 174, 132, 249, 5, 253, - 147, 241, 122, 132, 236, 87, 65, 132, 238, 36, 132, 27, 244, 173, 132, - 27, 121, 132, 27, 114, 132, 27, 153, 132, 27, 163, 132, 27, 168, 132, 27, - 169, 132, 27, 179, 132, 27, 176, 132, 27, 178, 132, 254, 222, 253, 136, - 132, 254, 222, 253, 141, 41, 4, 253, 245, 41, 167, 249, 80, 253, 175, - 253, 199, 239, 105, 64, 41, 167, 249, 80, 253, 175, 253, 199, 254, 28, - 250, 64, 250, 150, 221, 41, 167, 249, 80, 253, 175, 253, 199, 254, 28, - 249, 80, 244, 242, 221, 41, 167, 46, 253, 175, 253, 199, 251, 224, 221, - 41, 167, 241, 48, 253, 175, 253, 199, 252, 160, 221, 41, 167, 244, 225, - 253, 175, 253, 199, 250, 45, 250, 70, 221, 41, 167, 253, 175, 253, 199, - 244, 242, 250, 70, 221, 41, 167, 248, 53, 244, 223, 41, 167, 246, 33, - 253, 175, 249, 107, 41, 167, 250, 162, 252, 163, 253, 175, 249, 107, 41, - 167, 236, 24, 243, 15, 41, 167, 238, 200, 244, 242, 243, 53, 41, 167, - 244, 223, 41, 167, 249, 154, 244, 223, 41, 167, 244, 242, 244, 223, 41, - 167, 249, 154, 244, 242, 244, 223, 41, 167, 254, 179, 250, 185, 244, 98, - 244, 223, 41, 167, 250, 63, 251, 45, 244, 223, 41, 167, 244, 225, 245, - 54, 245, 3, 255, 14, 165, 249, 61, 41, 167, 249, 80, 243, 15, 41, 239, - 224, 25, 250, 184, 242, 121, 41, 239, 224, 25, 251, 192, 242, 121, 41, - 236, 61, 25, 252, 162, 251, 28, 245, 235, 242, 121, 41, 236, 61, 25, 243, - 23, 253, 90, 41, 236, 61, 25, 248, 55, 242, 40, 41, 25, 249, 53, 249, 98, - 245, 92, 41, 25, 249, 53, 249, 98, 242, 219, 41, 25, 249, 53, 249, 98, - 245, 102, 41, 25, 249, 53, 254, 16, 245, 92, 41, 25, 249, 53, 254, 16, - 242, 219, 41, 25, 249, 53, 249, 98, 249, 53, 251, 252, 41, 27, 244, 173, - 41, 27, 121, 41, 27, 114, 41, 27, 153, 41, 27, 163, 41, 27, 168, 41, 27, - 169, 41, 27, 179, 41, 27, 176, 41, 27, 178, 41, 27, 136, 121, 41, 27, - 136, 114, 41, 27, 136, 153, 41, 27, 136, 163, 41, 27, 136, 168, 41, 27, - 136, 169, 41, 27, 136, 179, 41, 27, 136, 176, 41, 27, 136, 178, 41, 27, - 136, 244, 173, 41, 167, 246, 32, 242, 121, 41, 167, 250, 27, 245, 65, - 254, 59, 253, 69, 41, 167, 244, 225, 245, 54, 245, 3, 249, 130, 254, 56, - 249, 61, 41, 167, 250, 27, 245, 65, 252, 161, 242, 121, 41, 167, 253, - 164, 249, 107, 41, 167, 254, 73, 243, 24, 41, 167, 254, 43, 245, 3, 245, - 104, 41, 167, 254, 43, 245, 3, 245, 103, 41, 167, 254, 29, 245, 121, 245, - 104, 41, 167, 254, 29, 245, 121, 245, 103, 41, 25, 254, 208, 243, 16, 41, - 25, 254, 139, 243, 16, 41, 1, 208, 41, 1, 249, 24, 41, 1, 253, 100, 41, - 1, 249, 36, 41, 1, 249, 13, 41, 1, 253, 115, 41, 1, 249, 11, 41, 1, 253, - 118, 41, 1, 249, 38, 41, 1, 249, 22, 41, 1, 244, 195, 41, 1, 249, 27, 41, - 1, 244, 200, 41, 1, 249, 37, 41, 1, 253, 91, 41, 1, 249, 19, 41, 1, 253, - 93, 41, 1, 249, 40, 41, 1, 253, 94, 41, 1, 253, 90, 41, 1, 249, 29, 41, - 1, 253, 110, 41, 1, 249, 39, 41, 1, 221, 41, 1, 249, 56, 41, 1, 245, 211, - 41, 1, 249, 100, 41, 1, 245, 78, 41, 1, 253, 98, 41, 1, 249, 52, 41, 1, - 253, 129, 41, 1, 254, 27, 41, 1, 216, 41, 1, 253, 92, 41, 1, 253, 103, - 41, 1, 249, 7, 41, 1, 249, 34, 41, 1, 253, 97, 41, 1, 253, 88, 41, 1, 64, - 41, 1, 245, 127, 41, 1, 237, 134, 253, 92, 41, 38, 25, 253, 95, 41, 38, - 25, 69, 41, 38, 25, 253, 96, 41, 38, 25, 84, 41, 38, 25, 253, 104, 41, - 38, 25, 152, 135, 41, 38, 25, 152, 253, 130, 41, 38, 25, 152, 148, 41, - 38, 25, 152, 253, 146, 41, 38, 25, 70, 41, 38, 25, 253, 126, 41, 38, 25, - 78, 41, 38, 25, 253, 119, 41, 25, 252, 128, 255, 22, 254, 155, 253, 144, - 41, 25, 250, 64, 246, 17, 41, 38, 25, 224, 69, 41, 38, 25, 224, 253, 96, - 41, 25, 254, 59, 254, 212, 254, 152, 253, 93, 41, 25, 254, 183, 247, 55, - 41, 167, 240, 83, 41, 167, 241, 234, 41, 25, 254, 132, 242, 121, 41, 25, - 250, 112, 242, 121, 41, 25, 254, 131, 254, 73, 249, 61, 41, 25, 251, 223, - 249, 61, 41, 25, 254, 42, 254, 91, 239, 232, 41, 25, 254, 42, 254, 141, - 239, 232, 41, 185, 1, 208, 41, 185, 1, 249, 24, 41, 185, 1, 253, 100, 41, - 185, 1, 249, 36, 41, 185, 1, 249, 13, 41, 185, 1, 253, 115, 41, 185, 1, - 249, 11, 41, 185, 1, 253, 118, 41, 185, 1, 249, 38, 41, 185, 1, 249, 22, - 41, 185, 1, 244, 195, 41, 185, 1, 249, 27, 41, 185, 1, 244, 200, 41, 185, - 1, 249, 37, 41, 185, 1, 253, 91, 41, 185, 1, 249, 19, 41, 185, 1, 253, - 93, 41, 185, 1, 249, 40, 41, 185, 1, 253, 94, 41, 185, 1, 253, 90, 41, - 185, 1, 249, 29, 41, 185, 1, 253, 110, 41, 185, 1, 249, 39, 41, 185, 1, - 221, 41, 185, 1, 249, 56, 41, 185, 1, 245, 211, 41, 185, 1, 249, 100, 41, - 185, 1, 245, 78, 41, 185, 1, 253, 98, 41, 185, 1, 249, 52, 41, 185, 1, - 253, 129, 41, 185, 1, 254, 27, 41, 185, 1, 216, 41, 185, 1, 253, 92, 41, - 185, 1, 253, 103, 41, 185, 1, 249, 7, 41, 185, 1, 249, 34, 41, 185, 1, - 253, 97, 41, 185, 1, 253, 88, 41, 185, 1, 64, 41, 185, 1, 245, 127, 41, - 185, 1, 237, 134, 253, 98, 41, 185, 1, 237, 134, 216, 41, 185, 1, 237, - 134, 253, 92, 41, 254, 250, 254, 254, 249, 24, 41, 254, 250, 254, 254, - 254, 125, 249, 130, 254, 56, 249, 61, 41, 236, 54, 25, 82, 245, 60, 41, - 236, 54, 25, 117, 245, 60, 41, 236, 54, 25, 250, 176, 248, 118, 41, 236, - 54, 25, 252, 157, 243, 22, 41, 13, 250, 228, 253, 192, 41, 13, 254, 69, - 252, 127, 41, 13, 247, 237, 246, 135, 41, 13, 254, 69, 254, 180, 250, 63, - 246, 160, 41, 13, 250, 45, 253, 90, 41, 13, 253, 137, 253, 192, 41, 13, - 253, 137, 254, 239, 249, 154, 241, 11, 41, 13, 253, 137, 254, 239, 251, - 46, 241, 11, 41, 13, 253, 137, 254, 239, 249, 130, 241, 11, 41, 25, 249, - 53, 254, 16, 245, 102, 108, 1, 208, 108, 1, 249, 24, 108, 1, 253, 100, - 108, 1, 249, 36, 108, 1, 249, 13, 108, 1, 253, 115, 108, 1, 249, 11, 108, - 1, 253, 118, 108, 1, 249, 45, 108, 1, 249, 38, 108, 1, 247, 179, 108, 1, - 249, 22, 108, 1, 244, 195, 108, 1, 249, 27, 108, 1, 244, 200, 108, 1, - 249, 37, 108, 1, 253, 91, 108, 1, 249, 19, 108, 1, 253, 93, 108, 1, 249, - 40, 108, 1, 253, 94, 108, 1, 253, 90, 108, 1, 249, 29, 108, 1, 253, 110, - 108, 1, 249, 39, 108, 1, 221, 108, 1, 216, 108, 1, 253, 92, 108, 1, 253, - 103, 108, 1, 253, 98, 108, 1, 253, 97, 108, 1, 253, 88, 108, 1, 249, 49, - 108, 1, 64, 108, 1, 69, 108, 1, 253, 96, 108, 1, 84, 108, 1, 253, 104, - 108, 1, 70, 108, 1, 78, 108, 1, 253, 109, 108, 38, 25, 253, 95, 108, 38, - 25, 69, 108, 38, 25, 253, 96, 108, 38, 25, 84, 108, 38, 25, 253, 104, - 108, 38, 25, 70, 108, 38, 25, 253, 106, 108, 25, 238, 90, 108, 25, 49, - 45, 108, 25, 239, 148, 108, 25, 240, 220, 108, 27, 244, 173, 108, 27, - 121, 108, 27, 114, 108, 27, 153, 108, 27, 163, 108, 27, 168, 108, 27, - 169, 108, 27, 179, 108, 27, 176, 108, 27, 178, 108, 25, 242, 147, 239, - 174, 108, 25, 239, 174, 108, 13, 239, 42, 108, 13, 237, 181, 108, 13, - 234, 68, 108, 13, 239, 23, 108, 1, 249, 7, 108, 1, 249, 34, 108, 1, 152, - 135, 108, 1, 152, 253, 130, 108, 1, 152, 148, 108, 1, 152, 253, 146, 108, - 38, 25, 152, 135, 108, 38, 25, 152, 253, 130, 108, 38, 25, 152, 148, 108, - 38, 25, 152, 253, 146, 101, 5, 1, 253, 235, 101, 5, 1, 249, 189, 101, 5, - 1, 249, 227, 101, 5, 1, 249, 216, 101, 5, 1, 253, 166, 101, 5, 1, 250, - 106, 101, 5, 1, 250, 124, 101, 5, 1, 250, 83, 101, 5, 1, 253, 227, 101, - 5, 1, 249, 139, 101, 5, 1, 250, 7, 101, 5, 1, 249, 146, 101, 5, 1, 250, - 25, 101, 5, 1, 253, 246, 101, 5, 1, 250, 40, 101, 5, 1, 245, 233, 101, 5, - 1, 250, 60, 101, 5, 1, 250, 67, 101, 5, 1, 250, 84, 101, 5, 1, 254, 75, - 101, 5, 1, 245, 159, 101, 5, 1, 245, 122, 101, 5, 1, 245, 96, 101, 5, 1, - 250, 55, 101, 5, 1, 245, 6, 101, 5, 1, 245, 69, 101, 5, 1, 249, 61, 101, - 5, 1, 249, 247, 101, 5, 1, 249, 197, 101, 5, 1, 245, 67, 101, 5, 1, 250, - 111, 101, 5, 1, 245, 116, 101, 5, 1, 249, 239, 101, 5, 1, 253, 125, 101, - 5, 1, 249, 137, 101, 5, 1, 253, 132, 101, 5, 1, 249, 240, 101, 5, 1, 249, - 245, 101, 1, 253, 235, 101, 1, 249, 189, 101, 1, 249, 227, 101, 1, 249, - 216, 101, 1, 253, 166, 101, 1, 250, 106, 101, 1, 250, 124, 101, 1, 250, - 83, 101, 1, 253, 227, 101, 1, 249, 139, 101, 1, 250, 7, 101, 1, 249, 146, - 101, 1, 250, 25, 101, 1, 253, 246, 101, 1, 250, 40, 101, 1, 245, 233, - 101, 1, 250, 60, 101, 1, 250, 67, 101, 1, 250, 84, 101, 1, 254, 75, 101, - 1, 245, 159, 101, 1, 245, 122, 101, 1, 245, 96, 101, 1, 250, 55, 101, 1, - 245, 6, 101, 1, 245, 69, 101, 1, 249, 61, 101, 1, 249, 247, 101, 1, 249, - 197, 101, 1, 245, 67, 101, 1, 250, 111, 101, 1, 245, 116, 101, 1, 249, - 239, 101, 1, 253, 125, 101, 1, 249, 137, 101, 1, 253, 132, 101, 1, 249, - 240, 101, 1, 249, 245, 101, 1, 253, 226, 101, 1, 254, 209, 101, 1, 243, - 98, 101, 238, 113, 237, 114, 20, 88, 240, 242, 20, 88, 236, 59, 20, 88, - 242, 131, 20, 88, 240, 244, 20, 88, 236, 72, 20, 88, 242, 134, 20, 88, - 242, 129, 20, 88, 242, 133, 20, 88, 236, 209, 20, 88, 244, 230, 20, 88, - 237, 138, 20, 88, 242, 126, 20, 88, 242, 122, 20, 88, 236, 207, 20, 88, - 239, 155, 20, 88, 239, 158, 20, 88, 239, 166, 20, 88, 239, 161, 20, 88, - 242, 125, 20, 88, 235, 254, 20, 88, 236, 233, 20, 88, 235, 246, 20, 88, - 236, 148, 20, 88, 235, 208, 20, 88, 236, 79, 20, 88, 236, 234, 20, 88, - 236, 57, 20, 88, 235, 221, 20, 88, 236, 64, 20, 88, 235, 194, 20, 88, - 235, 255, 20, 88, 236, 154, 20, 88, 236, 0, 20, 88, 236, 198, 20, 88, - 231, 248, 20, 88, 231, 249, 20, 88, 232, 9, 20, 88, 234, 57, 20, 88, 232, - 8, 20, 88, 236, 77, 20, 88, 235, 226, 20, 88, 235, 205, 20, 88, 235, 204, - 20, 88, 235, 195, 20, 88, 231, 240, 20, 88, 236, 70, 20, 88, 236, 230, - 20, 88, 236, 71, 20, 88, 236, 231, 20, 88, 237, 98, 20, 88, 236, 206, 20, - 88, 232, 2, 20, 88, 235, 185, 20, 88, 237, 97, 20, 88, 236, 229, 20, 88, - 236, 33, 20, 88, 236, 34, 20, 88, 236, 36, 20, 88, 236, 35, 20, 88, 237, - 96, 20, 88, 236, 6, 20, 88, 231, 252, 20, 88, 232, 18, 20, 88, 231, 237, - 20, 88, 239, 191, 20, 88, 235, 253, 20, 88, 236, 23, 20, 88, 236, 136, - 20, 88, 236, 137, 20, 88, 237, 68, 20, 88, 235, 218, 20, 88, 236, 208, - 20, 88, 236, 135, 20, 88, 235, 216, 20, 88, 235, 220, 20, 88, 235, 219, - 20, 88, 238, 134, 20, 88, 236, 88, 20, 88, 235, 214, 20, 88, 231, 243, - 20, 88, 232, 6, 20, 88, 231, 234, 20, 88, 232, 19, 20, 88, 235, 213, 20, - 88, 232, 20, 20, 88, 231, 242, 20, 88, 235, 203, 20, 88, 232, 14, 20, 88, - 236, 232, 20, 88, 236, 73, 20, 88, 240, 255, 20, 129, 240, 255, 20, 129, - 64, 20, 129, 253, 163, 20, 129, 216, 20, 129, 249, 181, 20, 129, 254, 10, - 20, 129, 70, 20, 129, 249, 182, 20, 129, 253, 200, 20, 129, 78, 20, 129, - 253, 98, 20, 129, 249, 175, 20, 129, 253, 142, 20, 129, 253, 123, 20, - 129, 84, 20, 129, 249, 177, 20, 129, 253, 132, 20, 129, 253, 145, 20, - 129, 253, 124, 20, 129, 254, 12, 20, 129, 253, 139, 20, 129, 69, 20, 129, - 250, 132, 20, 129, 250, 133, 20, 129, 248, 186, 20, 129, 244, 151, 20, - 129, 246, 123, 20, 129, 246, 124, 20, 129, 243, 100, 20, 129, 244, 154, - 20, 129, 244, 155, 20, 129, 247, 231, 20, 129, 252, 53, 20, 129, 247, - 232, 20, 129, 252, 54, 20, 129, 252, 55, 20, 129, 243, 19, 20, 129, 241, - 91, 20, 129, 242, 57, 20, 129, 248, 195, 20, 129, 245, 226, 20, 129, 252, - 234, 20, 129, 248, 159, 20, 129, 240, 189, 20, 129, 248, 160, 20, 129, - 252, 235, 20, 129, 248, 198, 20, 129, 244, 157, 20, 129, 248, 199, 20, - 129, 241, 92, 20, 129, 243, 20, 20, 129, 248, 200, 20, 129, 245, 228, 20, - 129, 246, 126, 20, 129, 243, 102, 20, 129, 248, 190, 20, 129, 251, 104, - 20, 129, 246, 247, 20, 129, 251, 105, 20, 129, 251, 106, 20, 129, 246, - 246, 20, 129, 240, 87, 20, 129, 242, 197, 20, 129, 238, 174, 20, 129, - 239, 255, 20, 129, 239, 254, 20, 129, 237, 99, 20, 99, 240, 242, 20, 99, - 236, 59, 20, 99, 236, 63, 20, 99, 242, 131, 20, 99, 236, 65, 20, 99, 236, - 66, 20, 99, 240, 244, 20, 99, 242, 134, 20, 99, 235, 247, 20, 99, 236, - 67, 20, 99, 236, 68, 20, 99, 236, 204, 20, 99, 235, 197, 20, 99, 235, - 196, 20, 99, 236, 57, 20, 99, 242, 129, 20, 99, 242, 133, 20, 99, 236, - 198, 20, 99, 244, 230, 20, 99, 237, 138, 20, 99, 242, 126, 20, 99, 242, - 122, 20, 99, 239, 155, 20, 99, 239, 158, 20, 99, 239, 166, 20, 99, 239, - 161, 20, 99, 242, 125, 20, 99, 236, 26, 20, 99, 231, 244, 20, 99, 235, - 254, 20, 99, 235, 246, 20, 99, 236, 220, 20, 99, 235, 201, 20, 99, 235, - 224, 20, 99, 235, 208, 20, 99, 236, 39, 20, 99, 231, 250, 20, 99, 236, - 79, 20, 99, 236, 1, 20, 99, 231, 246, 20, 99, 236, 234, 20, 99, 231, 245, - 20, 99, 232, 10, 20, 99, 232, 4, 20, 99, 232, 0, 20, 99, 231, 239, 20, - 99, 234, 60, 20, 99, 235, 206, 20, 99, 235, 227, 20, 99, 231, 251, 20, - 99, 236, 27, 20, 99, 236, 144, 20, 99, 236, 64, 20, 99, 236, 216, 20, 99, - 234, 55, 20, 99, 235, 200, 20, 99, 235, 223, 20, 99, 236, 143, 20, 99, - 235, 194, 20, 99, 236, 155, 20, 99, 235, 204, 20, 99, 236, 153, 20, 99, - 235, 195, 20, 99, 236, 70, 20, 99, 236, 71, 20, 99, 236, 231, 20, 99, - 236, 206, 20, 99, 239, 191, 20, 99, 235, 253, 20, 99, 231, 253, 20, 99, - 236, 208, 20, 99, 235, 217, 20, 99, 238, 134, 20, 99, 235, 210, 20, 99, - 232, 5, 20, 99, 235, 203, 20, 99, 232, 14, 20, 99, 236, 132, 20, 99, 236, - 134, 20, 99, 236, 131, 20, 99, 236, 133, 20, 99, 236, 73, 24, 4, 253, 88, - 24, 4, 253, 197, 24, 4, 253, 154, 24, 4, 249, 68, 24, 4, 249, 242, 24, 4, - 253, 125, 24, 4, 253, 140, 24, 4, 253, 103, 24, 4, 253, 229, 24, 4, 253, - 211, 24, 4, 250, 6, 24, 4, 250, 8, 24, 4, 253, 210, 24, 4, 253, 184, 24, - 4, 249, 145, 24, 4, 251, 68, 24, 4, 251, 72, 24, 4, 251, 70, 24, 4, 245, - 107, 24, 4, 246, 174, 24, 4, 251, 69, 24, 4, 251, 71, 24, 4, 246, 175, - 24, 4, 221, 24, 4, 253, 114, 24, 4, 253, 156, 24, 4, 250, 17, 24, 4, 250, - 18, 24, 4, 253, 167, 24, 4, 253, 141, 24, 4, 249, 149, 24, 4, 252, 189, - 24, 4, 252, 193, 24, 4, 252, 191, 24, 4, 248, 112, 24, 4, 248, 113, 24, - 4, 252, 190, 24, 4, 252, 192, 24, 4, 248, 114, 24, 4, 253, 92, 24, 4, - 253, 170, 24, 4, 253, 169, 24, 4, 249, 115, 24, 4, 250, 62, 24, 4, 253, - 150, 24, 4, 253, 144, 24, 4, 252, 144, 24, 4, 253, 97, 24, 4, 253, 172, - 24, 4, 253, 158, 24, 4, 250, 66, 24, 4, 249, 117, 24, 4, 253, 171, 24, 4, - 253, 159, 24, 4, 249, 163, 24, 4, 249, 7, 24, 4, 249, 162, 24, 4, 249, - 118, 24, 4, 245, 180, 24, 4, 245, 182, 24, 4, 249, 70, 24, 4, 249, 85, - 24, 4, 245, 43, 24, 4, 253, 213, 24, 4, 254, 19, 24, 4, 253, 249, 24, 4, - 249, 157, 24, 4, 252, 85, 24, 4, 254, 67, 24, 4, 254, 18, 24, 4, 252, - 108, 24, 4, 252, 110, 24, 4, 248, 14, 24, 4, 248, 15, 24, 4, 252, 109, - 24, 4, 252, 86, 24, 4, 252, 90, 24, 4, 252, 88, 24, 4, 248, 1, 24, 4, - 248, 2, 24, 4, 252, 87, 24, 4, 252, 89, 24, 4, 248, 3, 24, 4, 248, 5, 24, - 4, 244, 48, 24, 4, 244, 49, 24, 4, 248, 4, 24, 4, 253, 110, 24, 4, 253, - 192, 24, 4, 253, 236, 24, 4, 249, 188, 24, 4, 249, 128, 24, 4, 253, 191, - 24, 4, 253, 221, 24, 4, 250, 169, 24, 4, 253, 161, 24, 4, 253, 255, 24, - 4, 254, 25, 24, 4, 252, 247, 24, 4, 249, 174, 24, 4, 253, 214, 24, 4, - 253, 215, 24, 4, 253, 8, 24, 4, 253, 91, 24, 4, 253, 160, 24, 4, 253, - 174, 24, 4, 250, 80, 24, 4, 249, 164, 24, 4, 253, 151, 24, 4, 76, 24, 4, - 249, 172, 24, 4, 253, 115, 24, 4, 254, 32, 24, 4, 254, 5, 24, 4, 249, - 194, 24, 4, 250, 180, 24, 4, 254, 4, 24, 4, 253, 178, 24, 4, 249, 132, - 24, 4, 254, 204, 24, 4, 254, 206, 24, 4, 253, 135, 24, 4, 253, 23, 24, 4, - 253, 24, 24, 4, 254, 205, 24, 4, 254, 77, 24, 4, 253, 34, 24, 4, 253, 36, - 24, 4, 248, 183, 24, 4, 248, 184, 24, 4, 253, 35, 24, 4, 253, 94, 24, 4, - 253, 112, 24, 4, 253, 148, 24, 4, 249, 150, 24, 4, 250, 26, 24, 4, 253, - 157, 24, 4, 253, 136, 24, 4, 249, 153, 24, 4, 249, 38, 24, 4, 250, 34, - 24, 4, 250, 33, 24, 4, 247, 201, 24, 4, 247, 202, 24, 4, 252, 47, 24, 4, - 249, 84, 24, 4, 247, 213, 24, 4, 240, 211, 64, 24, 4, 240, 211, 84, 24, - 4, 240, 211, 69, 24, 4, 240, 211, 253, 95, 24, 4, 240, 211, 253, 126, 24, - 4, 240, 211, 70, 24, 4, 240, 211, 78, 24, 4, 240, 211, 253, 98, 24, 4, - 208, 24, 4, 253, 183, 24, 4, 253, 182, 24, 4, 249, 252, 24, 4, 251, 146, - 24, 4, 253, 134, 24, 4, 253, 155, 24, 4, 249, 141, 24, 4, 249, 143, 24, - 4, 244, 254, 24, 4, 247, 44, 24, 4, 249, 142, 24, 4, 251, 176, 24, 4, - 251, 180, 24, 4, 251, 178, 24, 4, 247, 45, 24, 4, 247, 46, 24, 4, 251, - 177, 24, 4, 251, 179, 24, 4, 247, 47, 24, 4, 247, 49, 24, 4, 243, 195, - 24, 4, 243, 196, 24, 4, 247, 48, 24, 4, 253, 98, 24, 4, 253, 216, 24, 4, - 253, 145, 24, 4, 249, 123, 24, 4, 250, 109, 24, 4, 253, 132, 24, 4, 253, - 138, 24, 4, 237, 117, 64, 24, 4, 237, 117, 84, 24, 4, 237, 117, 69, 24, - 4, 237, 117, 253, 95, 24, 4, 237, 117, 253, 126, 24, 4, 237, 117, 70, 24, - 4, 237, 117, 78, 24, 4, 253, 129, 24, 4, 253, 233, 24, 4, 253, 218, 24, - 4, 250, 123, 24, 4, 249, 126, 24, 4, 253, 189, 24, 4, 253, 190, 24, 4, - 253, 76, 24, 4, 249, 52, 24, 4, 250, 127, 24, 4, 250, 125, 24, 4, 248, - 209, 24, 4, 245, 53, 24, 4, 249, 74, 24, 4, 250, 126, 24, 4, 248, 224, - 24, 4, 216, 24, 4, 253, 124, 24, 4, 253, 139, 24, 4, 249, 180, 24, 4, - 249, 125, 24, 4, 253, 200, 24, 4, 253, 123, 24, 4, 253, 93, 24, 4, 253, - 204, 24, 4, 253, 165, 24, 4, 250, 202, 24, 4, 249, 96, 24, 4, 253, 152, - 24, 4, 253, 193, 24, 4, 250, 236, 24, 4, 249, 27, 24, 4, 249, 212, 24, 4, - 249, 210, 24, 4, 246, 82, 24, 4, 246, 87, 24, 4, 249, 209, 24, 4, 249, - 211, 24, 4, 246, 101, 24, 4, 253, 118, 24, 4, 253, 241, 24, 4, 253, 228, - 24, 4, 251, 117, 24, 4, 249, 104, 24, 4, 253, 239, 24, 4, 253, 240, 24, - 4, 251, 135, 24, 4, 253, 100, 24, 4, 253, 196, 24, 4, 253, 209, 24, 4, - 249, 136, 24, 4, 249, 229, 24, 4, 253, 207, 24, 4, 253, 195, 24, 4, 251, - 52, 24, 4, 251, 54, 24, 4, 246, 167, 24, 4, 246, 168, 24, 4, 251, 53, 24, - 4, 249, 231, 24, 4, 249, 235, 24, 4, 249, 233, 24, 4, 246, 136, 24, 4, - 246, 140, 24, 4, 249, 232, 24, 4, 249, 234, 24, 4, 249, 19, 24, 4, 250, - 87, 24, 4, 249, 73, 24, 4, 245, 8, 24, 4, 245, 9, 24, 4, 249, 63, 24, 4, - 249, 55, 24, 4, 248, 126, 24, 4, 249, 11, 24, 4, 249, 131, 24, 4, 249, - 23, 24, 4, 246, 44, 24, 4, 244, 246, 24, 4, 249, 44, 24, 4, 249, 94, 24, - 4, 246, 60, 24, 4, 249, 29, 24, 4, 252, 63, 24, 4, 249, 30, 24, 4, 247, - 242, 24, 4, 247, 244, 24, 4, 250, 43, 24, 4, 250, 44, 24, 4, 247, 245, - 24, 4, 249, 56, 24, 4, 249, 171, 24, 4, 249, 169, 24, 4, 248, 140, 24, 4, - 245, 210, 24, 4, 249, 64, 24, 4, 249, 170, 24, 4, 248, 142, 24, 4, 252, - 229, 24, 4, 252, 233, 24, 4, 252, 231, 24, 4, 248, 157, 24, 4, 248, 158, - 24, 4, 252, 230, 24, 4, 252, 232, 24, 4, 253, 153, 24, 4, 254, 41, 24, 4, - 253, 226, 24, 4, 249, 222, 24, 4, 250, 255, 24, 4, 254, 40, 24, 4, 254, - 13, 24, 4, 251, 18, 24, 4, 253, 90, 24, 4, 253, 231, 24, 4, 253, 116, 24, - 4, 250, 39, 24, 4, 249, 114, 24, 4, 253, 143, 24, 4, 253, 187, 24, 4, - 249, 156, 24, 4, 252, 145, 24, 4, 251, 248, 24, 4, 251, 19, 24, 238, 73, - 24, 213, 189, 24, 242, 84, 24, 237, 123, 24, 242, 81, 24, 241, 243, 242, - 81, 24, 239, 126, 65, 24, 238, 113, 237, 114, 24, 27, 121, 24, 27, 114, - 24, 27, 153, 24, 27, 163, 24, 27, 168, 24, 27, 169, 24, 27, 179, 24, 27, - 176, 24, 27, 178, 24, 83, 249, 18, 24, 83, 240, 239, 24, 83, 241, 7, 24, - 83, 242, 213, 24, 83, 242, 144, 24, 83, 244, 85, 24, 83, 240, 162, 24, - 83, 241, 152, 24, 83, 241, 69, 24, 83, 239, 150, 24, 83, 253, 250, 238, - 104, 96, 1, 64, 96, 1, 70, 96, 1, 69, 96, 1, 78, 96, 1, 84, 96, 1, 186, - 96, 1, 253, 100, 96, 1, 208, 96, 1, 253, 207, 96, 1, 253, 209, 96, 1, - 253, 195, 96, 1, 253, 196, 96, 1, 254, 109, 96, 1, 253, 88, 96, 1, 253, - 125, 96, 1, 253, 154, 96, 1, 253, 140, 96, 1, 253, 197, 96, 1, 254, 44, - 96, 1, 253, 103, 96, 1, 253, 210, 96, 1, 253, 211, 96, 1, 253, 184, 96, - 1, 253, 229, 96, 1, 254, 137, 96, 1, 221, 96, 1, 253, 167, 96, 1, 253, - 156, 96, 1, 253, 141, 96, 1, 253, 114, 96, 1, 253, 94, 96, 1, 249, 244, - 96, 1, 251, 253, 96, 1, 253, 157, 96, 1, 253, 148, 96, 1, 253, 136, 96, - 1, 253, 112, 96, 1, 254, 58, 96, 1, 252, 99, 96, 1, 252, 100, 96, 1, 252, - 101, 96, 1, 250, 58, 96, 1, 250, 59, 96, 1, 252, 106, 96, 1, 253, 97, 96, - 1, 159, 96, 1, 253, 171, 96, 1, 253, 158, 96, 1, 253, 159, 96, 1, 253, - 172, 96, 1, 254, 72, 96, 1, 253, 93, 96, 1, 253, 91, 96, 1, 253, 152, 96, - 1, 253, 151, 96, 1, 253, 165, 96, 1, 253, 174, 96, 1, 253, 193, 96, 1, - 253, 204, 96, 1, 254, 99, 96, 1, 249, 214, 96, 1, 250, 89, 96, 1, 250, - 90, 96, 1, 250, 91, 96, 1, 250, 92, 96, 1, 250, 93, 96, 1, 252, 212, 96, - 1, 249, 56, 96, 1, 249, 64, 96, 1, 249, 169, 96, 1, 249, 170, 96, 1, 249, - 171, 96, 1, 252, 217, 96, 1, 253, 98, 96, 1, 253, 132, 96, 1, 253, 145, - 96, 1, 253, 138, 96, 1, 253, 216, 96, 1, 254, 203, 96, 1, 216, 96, 1, - 253, 200, 96, 1, 253, 139, 96, 1, 253, 123, 96, 1, 253, 124, 96, 1, 254, - 210, 14, 15, 70, 14, 15, 250, 134, 14, 15, 69, 14, 15, 253, 96, 14, 15, - 78, 14, 15, 253, 119, 14, 15, 242, 98, 253, 119, 14, 15, 44, 253, 126, - 14, 15, 44, 69, 14, 15, 64, 14, 15, 253, 95, 14, 15, 253, 132, 14, 15, - 94, 253, 132, 14, 15, 253, 145, 14, 15, 94, 253, 145, 14, 15, 250, 110, - 14, 15, 94, 250, 110, 14, 15, 253, 138, 14, 15, 94, 253, 138, 14, 15, - 249, 178, 14, 15, 94, 249, 178, 14, 15, 240, 212, 249, 178, 14, 15, 253, - 98, 14, 15, 94, 253, 98, 14, 15, 249, 123, 14, 15, 94, 249, 123, 14, 15, - 240, 212, 249, 123, 14, 15, 253, 106, 14, 15, 242, 98, 201, 14, 15, 240, - 211, 189, 14, 15, 29, 116, 14, 15, 29, 158, 14, 15, 29, 242, 80, 136, - 244, 183, 14, 15, 29, 253, 121, 136, 244, 183, 14, 15, 29, 37, 136, 244, - 183, 14, 15, 29, 244, 183, 14, 15, 29, 42, 116, 14, 15, 29, 42, 207, 55, - 239, 240, 14, 15, 29, 242, 65, 227, 14, 15, 29, 207, 146, 122, 14, 15, - 29, 244, 212, 14, 15, 29, 79, 244, 184, 14, 15, 253, 166, 14, 15, 253, - 227, 14, 15, 253, 246, 14, 15, 253, 235, 14, 15, 253, 143, 14, 15, 247, - 236, 14, 15, 253, 116, 14, 15, 252, 66, 14, 15, 253, 187, 14, 15, 250, - 47, 14, 15, 242, 98, 250, 47, 14, 15, 44, 249, 242, 14, 15, 44, 253, 154, - 14, 15, 253, 90, 14, 15, 250, 39, 14, 15, 250, 49, 14, 15, 94, 250, 49, - 14, 15, 250, 50, 14, 15, 94, 250, 50, 14, 15, 245, 164, 14, 15, 94, 245, - 164, 14, 15, 250, 51, 14, 15, 94, 250, 51, 14, 15, 245, 165, 14, 15, 94, - 245, 165, 14, 15, 249, 156, 14, 15, 94, 249, 156, 14, 15, 245, 38, 14, - 15, 94, 245, 38, 14, 15, 242, 98, 245, 38, 14, 15, 198, 14, 15, 94, 198, - 14, 15, 44, 164, 14, 15, 253, 151, 14, 15, 248, 115, 14, 15, 253, 174, - 14, 15, 252, 208, 14, 15, 76, 14, 15, 249, 167, 14, 15, 242, 98, 249, - 167, 14, 15, 44, 249, 96, 14, 15, 44, 253, 165, 14, 15, 253, 91, 14, 15, - 250, 80, 14, 15, 250, 99, 14, 15, 94, 250, 99, 14, 15, 250, 100, 14, 15, - 94, 250, 100, 14, 15, 245, 215, 14, 15, 94, 245, 215, 14, 15, 114, 14, - 15, 94, 114, 14, 15, 245, 216, 14, 15, 94, 245, 216, 14, 15, 249, 172, - 14, 15, 94, 249, 172, 14, 15, 245, 49, 14, 15, 94, 245, 49, 14, 15, 240, - 212, 245, 49, 14, 15, 190, 14, 15, 250, 95, 14, 15, 250, 96, 14, 15, 250, - 97, 14, 15, 249, 22, 14, 15, 253, 134, 14, 15, 247, 26, 14, 15, 253, 182, - 14, 15, 251, 156, 14, 15, 253, 155, 14, 15, 250, 3, 14, 15, 242, 98, 250, - 3, 14, 15, 208, 14, 15, 249, 252, 14, 15, 249, 142, 14, 15, 94, 249, 142, - 14, 15, 249, 143, 14, 15, 94, 249, 143, 14, 15, 245, 128, 14, 15, 94, - 245, 128, 14, 15, 250, 5, 14, 15, 94, 250, 5, 14, 15, 245, 129, 14, 15, - 94, 245, 129, 14, 15, 249, 141, 14, 15, 94, 249, 141, 14, 15, 244, 254, - 14, 15, 94, 244, 254, 14, 15, 240, 212, 244, 254, 14, 15, 205, 14, 15, - 254, 52, 14, 15, 236, 58, 249, 140, 14, 15, 236, 58, 251, 155, 14, 15, - 236, 58, 251, 164, 14, 15, 236, 58, 251, 140, 14, 15, 254, 4, 14, 15, - 246, 39, 14, 15, 254, 5, 14, 15, 250, 188, 14, 15, 253, 178, 14, 15, 249, - 200, 14, 15, 242, 98, 249, 200, 14, 15, 253, 115, 14, 15, 249, 194, 14, - 15, 249, 203, 14, 15, 94, 249, 203, 14, 15, 249, 204, 14, 15, 94, 249, - 204, 14, 15, 245, 73, 14, 15, 94, 245, 73, 14, 15, 249, 205, 14, 15, 94, - 249, 205, 14, 15, 245, 74, 14, 15, 94, 245, 74, 14, 15, 249, 132, 14, 15, - 94, 249, 132, 14, 15, 245, 19, 14, 15, 94, 245, 19, 14, 15, 240, 212, - 245, 19, 14, 15, 203, 14, 15, 242, 90, 253, 251, 14, 15, 253, 167, 14, - 15, 247, 75, 14, 15, 253, 156, 14, 15, 251, 232, 14, 15, 253, 141, 14, - 15, 250, 19, 14, 15, 242, 98, 250, 19, 14, 15, 221, 14, 15, 250, 17, 14, - 15, 250, 22, 14, 15, 94, 250, 22, 14, 15, 250, 23, 14, 15, 94, 250, 23, - 14, 15, 245, 144, 14, 15, 94, 245, 144, 14, 15, 250, 24, 14, 15, 94, 250, - 24, 14, 15, 245, 145, 14, 15, 94, 245, 145, 14, 15, 249, 149, 14, 15, 94, - 249, 149, 14, 15, 245, 31, 14, 15, 94, 245, 31, 14, 15, 240, 212, 245, - 31, 14, 15, 171, 14, 15, 94, 171, 14, 15, 254, 144, 14, 15, 237, 148, - 171, 14, 15, 242, 90, 171, 14, 15, 253, 157, 14, 15, 247, 107, 14, 15, - 253, 148, 14, 15, 252, 23, 14, 15, 253, 136, 14, 15, 250, 30, 14, 15, - 242, 98, 250, 30, 14, 15, 253, 94, 14, 15, 249, 150, 14, 15, 250, 32, 14, - 15, 94, 250, 32, 14, 15, 249, 153, 14, 15, 94, 249, 153, 14, 15, 245, 32, - 14, 15, 94, 245, 32, 14, 15, 240, 212, 245, 32, 14, 15, 183, 14, 15, 44, - 253, 244, 14, 15, 254, 157, 14, 15, 253, 210, 14, 15, 247, 50, 14, 15, - 253, 211, 14, 15, 251, 196, 14, 15, 253, 184, 14, 15, 250, 12, 14, 15, - 242, 98, 250, 12, 14, 15, 253, 103, 14, 15, 250, 6, 14, 15, 250, 13, 14, - 15, 94, 250, 13, 14, 15, 250, 14, 14, 15, 94, 250, 14, 14, 15, 245, 137, - 14, 15, 94, 245, 137, 14, 15, 250, 15, 14, 15, 94, 250, 15, 14, 15, 245, - 138, 14, 15, 94, 245, 138, 14, 15, 249, 145, 14, 15, 94, 249, 145, 14, - 15, 245, 136, 14, 15, 94, 245, 136, 14, 15, 148, 14, 15, 94, 148, 14, 15, - 98, 148, 14, 15, 253, 171, 14, 15, 248, 49, 14, 15, 253, 158, 14, 15, - 252, 165, 14, 15, 253, 159, 14, 15, 250, 74, 14, 15, 242, 98, 250, 74, - 14, 15, 253, 97, 14, 15, 250, 66, 14, 15, 250, 77, 14, 15, 94, 250, 77, - 14, 15, 250, 78, 14, 15, 94, 250, 78, 14, 15, 245, 198, 14, 15, 94, 245, - 198, 14, 15, 250, 79, 14, 15, 94, 250, 79, 14, 15, 245, 199, 14, 15, 94, - 245, 199, 14, 15, 249, 163, 14, 15, 94, 249, 163, 14, 15, 245, 46, 14, - 15, 94, 245, 46, 14, 15, 240, 212, 245, 46, 14, 15, 159, 14, 15, 237, - 148, 159, 14, 15, 254, 187, 14, 15, 238, 82, 159, 14, 15, 238, 35, 254, - 182, 14, 15, 240, 212, 252, 169, 14, 15, 240, 212, 252, 151, 14, 15, 240, - 212, 248, 83, 14, 15, 240, 212, 248, 106, 14, 15, 240, 212, 248, 79, 14, - 15, 240, 212, 248, 54, 14, 15, 249, 70, 14, 15, 249, 118, 14, 15, 248, - 61, 14, 15, 249, 85, 14, 15, 248, 62, 14, 15, 249, 7, 14, 15, 245, 180, - 14, 15, 245, 189, 14, 15, 94, 245, 189, 14, 15, 245, 190, 14, 15, 94, - 245, 190, 14, 15, 242, 254, 14, 15, 94, 242, 254, 14, 15, 245, 191, 14, - 15, 94, 245, 191, 14, 15, 242, 255, 14, 15, 94, 242, 255, 14, 15, 245, - 43, 14, 15, 94, 245, 43, 14, 15, 242, 253, 14, 15, 94, 242, 253, 14, 15, - 254, 21, 14, 15, 253, 200, 14, 15, 248, 187, 14, 15, 253, 139, 14, 15, - 253, 43, 14, 15, 253, 123, 14, 15, 250, 117, 14, 15, 242, 98, 250, 117, - 14, 15, 216, 14, 15, 249, 180, 14, 15, 250, 120, 14, 15, 94, 250, 120, - 14, 15, 250, 121, 14, 15, 94, 250, 121, 14, 15, 245, 229, 14, 15, 94, - 245, 229, 14, 15, 250, 122, 14, 15, 94, 250, 122, 14, 15, 245, 230, 14, - 15, 94, 245, 230, 14, 15, 250, 119, 14, 15, 94, 250, 119, 14, 15, 245, - 52, 14, 15, 94, 245, 52, 14, 15, 240, 212, 245, 52, 14, 15, 181, 14, 15, - 237, 178, 181, 14, 15, 94, 181, 14, 15, 242, 90, 253, 139, 14, 15, 253, - 150, 14, 15, 244, 50, 253, 150, 14, 15, 94, 253, 210, 14, 15, 248, 17, - 14, 15, 253, 169, 14, 15, 252, 125, 14, 15, 253, 144, 14, 15, 252, 129, - 14, 15, 94, 253, 184, 14, 15, 253, 92, 14, 15, 249, 115, 14, 15, 94, 253, - 103, 14, 15, 245, 175, 14, 15, 94, 245, 175, 14, 15, 135, 14, 15, 94, - 135, 14, 15, 98, 135, 14, 15, 254, 40, 14, 15, 246, 128, 14, 15, 253, - 226, 14, 15, 251, 6, 14, 15, 254, 13, 14, 15, 251, 12, 14, 15, 253, 153, - 14, 15, 249, 222, 14, 15, 245, 90, 14, 15, 94, 245, 90, 14, 15, 204, 14, - 15, 249, 63, 14, 15, 242, 182, 249, 63, 14, 15, 249, 73, 14, 15, 242, - 182, 249, 73, 14, 15, 245, 48, 14, 15, 242, 182, 245, 48, 14, 15, 249, - 55, 14, 15, 245, 202, 14, 15, 249, 19, 14, 15, 245, 8, 14, 15, 243, 10, - 14, 15, 94, 243, 10, 14, 15, 253, 251, 14, 15, 248, 146, 14, 15, 248, - 147, 14, 15, 245, 213, 14, 15, 244, 195, 14, 15, 252, 218, 14, 15, 252, - 226, 14, 15, 252, 227, 14, 15, 252, 228, 14, 15, 252, 225, 14, 15, 240, - 229, 253, 125, 14, 15, 240, 229, 253, 154, 14, 15, 240, 229, 251, 73, 14, - 15, 240, 229, 253, 140, 14, 15, 240, 229, 251, 89, 14, 15, 240, 229, 253, - 88, 14, 15, 240, 229, 249, 68, 14, 15, 240, 229, 164, 14, 15, 241, 225, - 164, 14, 15, 254, 111, 14, 15, 247, 255, 14, 15, 253, 249, 14, 15, 250, - 56, 14, 15, 254, 18, 14, 15, 252, 96, 14, 15, 253, 213, 14, 15, 249, 157, - 14, 15, 209, 14, 15, 245, 206, 14, 15, 245, 207, 14, 15, 245, 208, 14, - 15, 245, 205, 14, 15, 94, 253, 150, 14, 15, 94, 253, 169, 14, 15, 94, - 253, 144, 14, 15, 94, 253, 92, 14, 15, 243, 242, 14, 15, 252, 19, 14, 15, - 247, 152, 14, 15, 249, 110, 14, 15, 247, 153, 14, 15, 249, 13, 14, 15, - 247, 144, 14, 15, 253, 244, 14, 15, 252, 31, 14, 15, 242, 90, 249, 70, - 14, 15, 242, 90, 249, 118, 14, 15, 242, 90, 249, 85, 14, 15, 242, 90, - 249, 7, 14, 15, 237, 131, 249, 63, 14, 15, 237, 131, 249, 73, 14, 15, - 237, 131, 249, 55, 14, 15, 237, 131, 249, 19, 14, 15, 237, 131, 253, 251, - 14, 15, 250, 9, 14, 15, 247, 62, 14, 15, 250, 10, 14, 15, 247, 63, 14, - 15, 249, 144, 14, 15, 247, 60, 14, 15, 254, 134, 14, 15, 240, 231, 249, - 63, 14, 15, 240, 231, 249, 73, 14, 15, 240, 231, 245, 48, 14, 15, 240, - 231, 249, 55, 14, 15, 240, 231, 245, 202, 14, 15, 240, 231, 249, 19, 14, - 15, 240, 231, 245, 8, 14, 15, 240, 231, 253, 251, 14, 15, 241, 95, 199, - 14, 15, 238, 82, 70, 14, 15, 238, 82, 69, 14, 15, 238, 82, 78, 14, 15, - 238, 82, 64, 14, 15, 238, 82, 253, 132, 14, 15, 238, 82, 253, 145, 14, - 15, 238, 82, 253, 138, 14, 15, 238, 82, 253, 98, 14, 15, 238, 82, 253, - 157, 14, 15, 238, 82, 253, 148, 14, 15, 238, 82, 253, 136, 14, 15, 238, - 82, 253, 94, 14, 15, 238, 82, 253, 134, 14, 15, 238, 82, 253, 182, 14, - 15, 238, 82, 253, 155, 14, 15, 238, 82, 208, 14, 15, 242, 90, 253, 125, - 14, 15, 242, 90, 253, 154, 14, 15, 242, 90, 253, 140, 14, 15, 242, 90, - 253, 88, 14, 15, 44, 251, 36, 14, 15, 44, 251, 35, 14, 15, 44, 249, 78, - 14, 15, 44, 246, 153, 14, 15, 44, 251, 34, 14, 15, 44, 249, 36, 14, 15, - 44, 253, 170, 14, 15, 44, 253, 144, 14, 15, 44, 253, 150, 14, 15, 44, - 250, 62, 14, 15, 44, 253, 169, 14, 15, 44, 253, 92, 14, 15, 44, 253, 216, - 14, 15, 44, 253, 138, 14, 15, 44, 253, 132, 14, 15, 44, 250, 109, 14, 15, - 44, 253, 145, 14, 15, 44, 253, 98, 14, 15, 44, 251, 99, 14, 15, 44, 251, - 98, 14, 15, 44, 251, 96, 14, 15, 44, 246, 235, 14, 15, 44, 251, 97, 14, - 15, 44, 251, 95, 14, 15, 44, 250, 87, 14, 15, 44, 249, 55, 14, 15, 44, - 249, 63, 14, 15, 44, 245, 9, 14, 15, 44, 249, 73, 14, 15, 44, 249, 19, - 14, 15, 44, 252, 219, 14, 15, 44, 250, 97, 14, 15, 44, 250, 95, 14, 15, - 44, 248, 144, 14, 15, 44, 250, 96, 14, 15, 44, 249, 22, 14, 15, 44, 253, - 231, 14, 15, 44, 253, 187, 14, 15, 44, 253, 143, 14, 15, 44, 249, 114, - 14, 15, 44, 253, 116, 14, 15, 44, 253, 90, 14, 15, 44, 198, 14, 15, 44, - 253, 196, 14, 15, 44, 253, 195, 14, 15, 44, 253, 207, 14, 15, 44, 249, - 229, 14, 15, 44, 253, 209, 14, 15, 44, 253, 100, 14, 15, 44, 251, 152, - 14, 15, 44, 250, 0, 14, 15, 44, 249, 255, 14, 15, 44, 247, 32, 14, 15, - 44, 251, 151, 14, 15, 44, 249, 24, 14, 15, 44, 251, 163, 14, 15, 44, 251, - 162, 14, 15, 44, 251, 160, 14, 15, 44, 247, 37, 14, 15, 44, 251, 161, 14, - 15, 44, 251, 159, 14, 15, 44, 254, 51, 14, 15, 44, 253, 112, 14, 15, 44, - 253, 136, 14, 15, 44, 253, 157, 14, 15, 44, 250, 26, 14, 15, 44, 253, - 148, 14, 15, 44, 253, 94, 14, 15, 44, 253, 114, 14, 15, 44, 253, 141, 14, - 15, 44, 253, 167, 14, 15, 44, 250, 18, 14, 15, 44, 253, 156, 14, 15, 44, - 221, 14, 15, 44, 253, 124, 14, 15, 44, 253, 123, 14, 15, 44, 253, 200, - 14, 15, 44, 249, 125, 14, 15, 44, 253, 139, 14, 15, 44, 216, 14, 15, 44, - 253, 241, 14, 15, 242, 90, 253, 241, 14, 15, 44, 253, 240, 14, 15, 44, - 253, 239, 14, 15, 44, 249, 104, 14, 15, 44, 253, 228, 14, 15, 242, 90, - 253, 228, 14, 15, 44, 253, 118, 14, 15, 44, 249, 250, 14, 15, 44, 249, - 249, 14, 15, 44, 251, 127, 14, 15, 44, 247, 5, 14, 15, 44, 249, 248, 14, - 15, 44, 251, 126, 14, 15, 44, 253, 229, 14, 15, 44, 253, 184, 14, 15, 44, - 253, 210, 14, 15, 44, 250, 8, 14, 15, 44, 253, 211, 14, 15, 44, 253, 103, - 14, 15, 44, 250, 224, 14, 15, 44, 250, 223, 14, 15, 44, 250, 221, 14, 15, - 44, 246, 111, 14, 15, 44, 250, 222, 14, 15, 44, 249, 214, 14, 15, 44, - 251, 194, 14, 15, 44, 250, 10, 14, 15, 44, 251, 193, 14, 15, 44, 247, 61, - 14, 15, 44, 250, 9, 14, 15, 44, 249, 144, 14, 15, 44, 248, 134, 14, 15, - 44, 245, 208, 14, 15, 44, 245, 206, 14, 15, 44, 244, 122, 14, 15, 44, - 245, 207, 14, 15, 44, 245, 205, 14, 15, 44, 250, 93, 14, 15, 44, 250, 92, - 14, 15, 44, 250, 90, 14, 15, 44, 248, 133, 14, 15, 44, 250, 91, 14, 15, - 44, 250, 89, 14, 15, 44, 253, 233, 14, 15, 44, 253, 190, 14, 15, 44, 253, - 189, 14, 15, 44, 249, 126, 14, 15, 44, 253, 218, 14, 15, 44, 253, 129, - 14, 15, 44, 202, 14, 15, 44, 46, 202, 14, 15, 44, 250, 240, 14, 15, 44, - 250, 239, 14, 15, 44, 249, 76, 14, 15, 44, 246, 119, 14, 15, 44, 250, - 238, 14, 15, 44, 249, 100, 14, 15, 44, 253, 172, 14, 15, 44, 253, 159, - 14, 15, 44, 253, 171, 14, 15, 44, 249, 117, 14, 15, 44, 253, 158, 14, 15, - 44, 253, 97, 14, 15, 44, 249, 162, 14, 15, 44, 249, 85, 14, 15, 44, 249, - 70, 14, 15, 44, 245, 182, 14, 15, 44, 249, 118, 14, 15, 44, 249, 7, 14, - 15, 44, 254, 21, 14, 15, 44, 249, 171, 14, 15, 44, 249, 170, 14, 15, 44, - 249, 64, 14, 15, 44, 245, 210, 14, 15, 44, 249, 169, 14, 15, 44, 249, 56, - 14, 15, 44, 249, 131, 14, 15, 44, 249, 94, 14, 15, 44, 249, 44, 14, 15, - 44, 244, 246, 14, 15, 44, 249, 23, 14, 15, 44, 249, 11, 14, 15, 44, 248, - 152, 14, 15, 44, 248, 151, 14, 15, 44, 248, 149, 14, 15, 44, 244, 126, - 14, 15, 44, 248, 150, 14, 15, 44, 248, 148, 14, 15, 254, 31, 57, 14, 15, - 213, 189, 14, 15, 250, 54, 14, 15, 247, 145, 14, 15, 247, 177, 14, 15, - 244, 0, 14, 15, 247, 178, 14, 15, 244, 1, 14, 15, 247, 176, 14, 15, 243, - 255, 244, 174, 248, 81, 65, 244, 174, 1, 243, 43, 244, 174, 1, 247, 69, - 244, 174, 1, 243, 107, 244, 174, 1, 248, 50, 244, 174, 1, 247, 160, 244, - 174, 1, 248, 161, 244, 174, 1, 246, 80, 244, 174, 1, 244, 120, 244, 174, - 1, 246, 73, 244, 174, 1, 243, 58, 244, 174, 1, 247, 101, 244, 174, 1, - 246, 159, 244, 174, 1, 240, 125, 244, 174, 1, 242, 22, 244, 174, 1, 248, - 42, 244, 174, 1, 245, 239, 244, 174, 1, 250, 38, 244, 174, 1, 254, 198, - 244, 174, 1, 240, 62, 244, 174, 1, 240, 93, 244, 174, 1, 240, 61, 244, - 174, 1, 253, 186, 244, 174, 1, 239, 106, 244, 174, 1, 246, 249, 244, 174, - 1, 236, 127, 244, 174, 1, 244, 30, 244, 174, 241, 54, 65, 244, 174, 224, - 241, 54, 65, 100, 1, 251, 1, 251, 3, 255, 7, 204, 100, 1, 186, 100, 1, - 252, 245, 255, 25, 84, 100, 1, 254, 80, 100, 1, 181, 100, 1, 201, 100, 1, - 240, 182, 248, 125, 242, 189, 100, 1, 249, 77, 100, 1, 245, 247, 64, 100, - 1, 255, 18, 78, 100, 1, 255, 1, 64, 100, 1, 245, 237, 100, 1, 235, 178, - 78, 100, 1, 235, 228, 78, 100, 1, 78, 100, 1, 253, 142, 100, 1, 253, 246, - 100, 1, 248, 18, 254, 20, 252, 120, 135, 100, 1, 243, 185, 100, 1, 250, - 181, 100, 1, 251, 144, 205, 100, 1, 194, 100, 1, 249, 66, 100, 1, 251, - 29, 251, 55, 194, 100, 1, 251, 25, 100, 1, 248, 175, 253, 22, 201, 100, - 1, 243, 140, 164, 100, 1, 246, 169, 164, 100, 1, 231, 254, 164, 100, 1, - 232, 11, 164, 100, 1, 243, 235, 254, 162, 252, 0, 183, 100, 1, 235, 184, - 183, 100, 1, 239, 5, 100, 1, 251, 115, 255, 10, 254, 118, 69, 100, 1, 70, - 100, 1, 247, 1, 200, 100, 1, 251, 30, 100, 1, 235, 222, 253, 163, 100, 1, - 236, 32, 64, 100, 1, 251, 116, 250, 245, 100, 1, 244, 33, 244, 32, 198, - 100, 1, 245, 243, 243, 101, 100, 1, 244, 94, 159, 100, 1, 248, 75, 235, - 179, 159, 100, 1, 235, 229, 159, 100, 1, 203, 100, 1, 202, 100, 1, 248, - 132, 254, 193, 254, 195, 190, 100, 1, 235, 230, 190, 100, 1, 187, 100, 1, - 240, 7, 246, 23, 241, 115, 199, 100, 1, 232, 1, 199, 100, 1, 239, 6, 100, - 1, 241, 228, 100, 1, 246, 121, 255, 5, 70, 100, 1, 243, 212, 254, 55, - 171, 100, 1, 234, 54, 171, 100, 1, 235, 183, 171, 100, 1, 243, 201, 251, - 181, 251, 203, 148, 100, 1, 239, 4, 100, 1, 241, 185, 100, 1, 251, 111, - 100, 1, 246, 78, 250, 204, 187, 100, 1, 241, 231, 246, 125, 78, 100, 1, - 249, 218, 100, 1, 251, 113, 100, 1, 240, 22, 100, 1, 246, 40, 100, 1, - 243, 57, 100, 1, 248, 103, 100, 1, 235, 180, 100, 1, 235, 231, 100, 1, - 236, 22, 100, 1, 209, 100, 1, 170, 100, 242, 66, 236, 52, 100, 240, 120, - 236, 52, 100, 244, 234, 236, 52, 100, 243, 34, 90, 100, 240, 187, 90, - 100, 240, 6, 90, 240, 209, 1, 64, 240, 209, 1, 69, 240, 209, 1, 84, 240, - 209, 1, 208, 240, 209, 1, 253, 100, 240, 209, 1, 249, 13, 240, 209, 1, - 253, 91, 240, 209, 1, 253, 93, 240, 209, 1, 253, 94, 240, 209, 1, 253, - 90, 240, 209, 1, 253, 110, 240, 209, 1, 221, 240, 209, 1, 216, 240, 209, - 1, 253, 103, 240, 209, 1, 253, 98, 240, 209, 1, 253, 97, 240, 209, 1, - 253, 88, 240, 209, 38, 25, 69, 240, 209, 38, 25, 84, 240, 209, 25, 240, - 220, 240, 206, 1, 64, 240, 206, 1, 69, 240, 206, 1, 84, 240, 206, 1, 208, - 240, 206, 1, 253, 100, 240, 206, 1, 249, 13, 240, 206, 1, 253, 91, 240, - 206, 1, 253, 93, 240, 206, 1, 253, 94, 240, 206, 1, 253, 90, 240, 206, 1, - 253, 110, 240, 206, 1, 221, 240, 206, 1, 216, 240, 206, 1, 253, 92, 240, - 206, 1, 253, 103, 240, 206, 1, 253, 98, 240, 206, 1, 253, 97, 240, 206, - 1, 253, 88, 240, 206, 38, 25, 69, 240, 206, 38, 25, 84, 240, 206, 25, - 239, 58, 237, 162, 242, 66, 236, 52, 237, 162, 42, 236, 52, 244, 179, 1, - 64, 244, 179, 1, 69, 244, 179, 1, 84, 244, 179, 1, 208, 244, 179, 1, 253, - 100, 244, 179, 1, 249, 13, 244, 179, 1, 253, 91, 244, 179, 1, 253, 93, - 244, 179, 1, 253, 94, 244, 179, 1, 253, 90, 244, 179, 1, 253, 110, 244, - 179, 1, 221, 244, 179, 1, 216, 244, 179, 1, 253, 92, 244, 179, 1, 253, - 103, 244, 179, 1, 253, 98, 244, 179, 1, 253, 97, 244, 179, 1, 253, 88, - 244, 179, 38, 25, 69, 244, 179, 38, 25, 84, 239, 122, 1, 64, 239, 122, 1, - 69, 239, 122, 1, 84, 239, 122, 1, 208, 239, 122, 1, 253, 100, 239, 122, - 1, 249, 13, 239, 122, 1, 253, 91, 239, 122, 1, 253, 93, 239, 122, 1, 253, - 94, 239, 122, 1, 253, 90, 239, 122, 1, 253, 110, 239, 122, 1, 221, 239, - 122, 1, 216, 239, 122, 1, 253, 103, 239, 122, 1, 253, 98, 239, 122, 1, - 253, 97, 239, 122, 38, 25, 69, 239, 122, 38, 25, 84, 74, 1, 208, 74, 1, - 249, 24, 74, 1, 253, 155, 74, 1, 250, 0, 74, 1, 249, 110, 74, 1, 253, - 115, 74, 1, 249, 11, 74, 1, 253, 178, 74, 1, 249, 94, 74, 1, 249, 84, 74, - 1, 253, 93, 74, 1, 244, 195, 74, 1, 253, 193, 74, 1, 245, 213, 74, 1, - 252, 32, 74, 1, 253, 91, 74, 1, 249, 19, 74, 1, 76, 74, 1, 249, 55, 74, - 1, 253, 136, 74, 1, 253, 110, 74, 1, 249, 29, 74, 1, 253, 187, 74, 1, - 250, 44, 74, 1, 253, 141, 74, 1, 253, 123, 74, 1, 253, 144, 74, 1, 253, - 184, 74, 1, 253, 215, 74, 1, 249, 7, 74, 1, 250, 76, 74, 1, 253, 97, 74, - 1, 253, 88, 74, 1, 253, 103, 74, 1, 253, 213, 74, 236, 183, 38, 252, 83, - 74, 236, 183, 38, 249, 157, 74, 236, 183, 38, 253, 249, 74, 236, 183, 38, - 250, 56, 74, 236, 183, 38, 254, 19, 74, 236, 183, 38, 252, 102, 74, 236, - 183, 38, 250, 59, 74, 236, 183, 38, 248, 13, 74, 236, 183, 38, 254, 70, - 74, 236, 183, 38, 252, 150, 74, 236, 183, 38, 254, 54, 74, 236, 183, 38, - 251, 216, 74, 236, 183, 38, 254, 67, 74, 236, 183, 38, 250, 54, 74, 236, - 183, 38, 254, 68, 249, 173, 121, 74, 236, 183, 38, 254, 68, 249, 173, - 114, 74, 236, 183, 38, 252, 84, 74, 38, 239, 217, 254, 84, 74, 38, 239, - 217, 253, 95, 74, 38, 25, 253, 95, 74, 38, 25, 69, 74, 38, 25, 253, 96, - 74, 38, 25, 181, 74, 38, 25, 254, 26, 74, 38, 25, 84, 74, 38, 25, 253, - 104, 74, 38, 25, 254, 196, 74, 38, 25, 253, 142, 74, 38, 25, 216, 74, 38, - 25, 253, 181, 74, 38, 25, 70, 74, 38, 25, 253, 163, 74, 38, 25, 253, 106, - 74, 38, 25, 253, 119, 74, 38, 25, 253, 109, 74, 25, 240, 126, 74, 25, - 240, 151, 74, 25, 235, 234, 74, 25, 236, 145, 74, 25, 240, 186, 74, 25, - 241, 109, 74, 25, 244, 62, 74, 25, 236, 175, 74, 25, 240, 97, 74, 25, - 243, 27, 74, 25, 244, 70, 241, 254, 74, 25, 242, 52, 74, 25, 243, 72, 74, - 25, 236, 248, 74, 25, 247, 31, 74, 25, 236, 247, 74, 25, 243, 55, 254, - 169, 247, 43, 74, 25, 254, 133, 249, 167, 74, 25, 241, 113, 74, 25, 244, - 35, 247, 100, 74, 25, 240, 101, 74, 239, 147, 13, 248, 22, 74, 25, 235, - 211, 74, 27, 244, 173, 74, 27, 121, 74, 27, 114, 74, 27, 153, 74, 27, - 163, 74, 27, 168, 74, 27, 169, 74, 27, 179, 74, 27, 176, 74, 27, 178, 51, - 243, 45, 51, 238, 96, 51, 242, 84, 51, 213, 189, 51, 242, 81, 51, 249, - 28, 244, 215, 51, 249, 1, 249, 119, 240, 241, 51, 249, 8, 4, 240, 9, 241, - 205, 51, 242, 68, 242, 84, 51, 242, 68, 213, 189, 51, 241, 221, 51, 249, - 135, 238, 79, 239, 195, 121, 51, 249, 135, 238, 79, 239, 195, 114, 51, - 249, 135, 238, 79, 239, 195, 153, 51, 38, 237, 114, 51, 27, 244, 173, 51, - 27, 121, 51, 27, 114, 51, 27, 153, 51, 27, 163, 51, 27, 168, 51, 27, 169, - 51, 27, 179, 51, 27, 176, 51, 27, 178, 51, 1, 64, 51, 1, 70, 51, 1, 69, - 51, 1, 78, 51, 1, 84, 51, 1, 253, 142, 51, 1, 253, 253, 51, 1, 253, 126, - 51, 1, 253, 94, 51, 1, 249, 75, 51, 1, 253, 110, 51, 1, 253, 90, 51, 1, - 253, 213, 51, 1, 253, 100, 51, 1, 221, 51, 1, 253, 103, 51, 1, 253, 97, - 51, 1, 249, 7, 51, 1, 253, 91, 51, 1, 253, 93, 51, 1, 249, 11, 51, 1, - 253, 118, 51, 1, 216, 51, 1, 253, 92, 51, 1, 253, 98, 51, 1, 253, 153, - 51, 1, 208, 51, 1, 249, 24, 51, 1, 249, 56, 51, 1, 253, 129, 51, 1, 249, - 68, 51, 1, 253, 72, 51, 1, 249, 144, 51, 1, 250, 125, 51, 1, 249, 23, 51, - 1, 249, 1, 165, 38, 57, 51, 1, 249, 1, 70, 51, 1, 249, 1, 69, 51, 1, 249, - 1, 78, 51, 1, 249, 1, 84, 51, 1, 249, 1, 253, 142, 51, 1, 249, 1, 253, - 253, 51, 1, 249, 1, 249, 75, 51, 1, 249, 1, 253, 110, 51, 1, 249, 1, 253, - 90, 51, 1, 249, 1, 253, 213, 51, 1, 249, 1, 253, 100, 51, 1, 249, 1, 221, - 51, 1, 249, 1, 253, 91, 51, 1, 249, 1, 253, 93, 51, 1, 249, 1, 249, 11, - 51, 1, 249, 1, 253, 118, 51, 1, 249, 1, 249, 56, 51, 1, 249, 1, 216, 51, - 1, 249, 1, 253, 98, 51, 1, 249, 1, 208, 51, 1, 249, 1, 249, 136, 51, 1, - 249, 1, 249, 68, 51, 1, 249, 1, 251, 121, 51, 1, 249, 1, 252, 21, 51, 1, - 249, 1, 249, 100, 51, 1, 249, 8, 70, 51, 1, 249, 8, 69, 51, 1, 249, 8, - 254, 122, 51, 1, 249, 8, 253, 253, 51, 1, 249, 8, 84, 51, 1, 249, 8, 249, - 75, 51, 1, 249, 8, 208, 51, 1, 249, 8, 253, 100, 51, 1, 249, 8, 253, 88, - 51, 1, 249, 8, 253, 90, 51, 1, 249, 8, 249, 7, 51, 1, 249, 8, 253, 91, - 51, 1, 249, 8, 253, 93, 51, 1, 249, 8, 253, 118, 51, 1, 249, 8, 253, 153, - 51, 1, 249, 8, 249, 136, 51, 1, 249, 8, 249, 68, 51, 1, 249, 8, 249, 56, - 51, 1, 249, 8, 253, 129, 51, 1, 249, 8, 249, 115, 51, 1, 249, 8, 249, 11, - 51, 1, 249, 8, 249, 52, 51, 1, 242, 68, 69, 51, 1, 242, 68, 208, 51, 1, - 242, 68, 253, 92, 51, 1, 242, 68, 253, 153, 51, 1, 242, 68, 249, 52, 51, - 1, 192, 195, 239, 252, 121, 51, 1, 192, 195, 242, 53, 121, 51, 1, 192, - 195, 241, 134, 51, 1, 192, 195, 239, 244, 51, 1, 192, 195, 239, 116, 239, - 244, 51, 1, 192, 195, 241, 40, 51, 1, 192, 195, 244, 171, 241, 40, 51, 1, - 192, 195, 64, 51, 1, 192, 195, 69, 51, 1, 192, 195, 208, 51, 1, 192, 195, - 249, 13, 51, 1, 192, 195, 253, 115, 51, 1, 192, 195, 249, 22, 51, 1, 192, - 195, 244, 195, 51, 1, 192, 195, 249, 27, 51, 1, 192, 195, 249, 37, 51, 1, - 192, 195, 253, 91, 51, 1, 192, 195, 253, 93, 51, 1, 192, 195, 253, 90, - 51, 1, 192, 195, 249, 29, 51, 1, 192, 195, 249, 34, 51, 1, 192, 195, 249, - 52, 51, 1, 192, 195, 253, 129, 51, 1, 192, 195, 253, 219, 51, 1, 249, 1, - 192, 195, 253, 91, 51, 1, 249, 1, 192, 195, 249, 52, 51, 1, 242, 68, 192, - 195, 249, 36, 51, 1, 242, 68, 192, 195, 249, 13, 51, 1, 242, 68, 192, - 195, 253, 115, 51, 1, 242, 68, 192, 195, 249, 45, 51, 1, 242, 68, 192, - 195, 249, 22, 51, 1, 242, 68, 192, 195, 244, 200, 51, 1, 242, 68, 192, - 195, 253, 91, 51, 1, 242, 68, 192, 195, 249, 40, 51, 1, 242, 68, 192, - 195, 249, 34, 51, 1, 242, 68, 192, 195, 250, 199, 51, 1, 242, 68, 192, - 195, 249, 52, 51, 1, 242, 68, 192, 195, 253, 129, 51, 1, 192, 195, 136, - 84, 51, 1, 192, 195, 136, 216, 51, 1, 242, 68, 192, 195, 249, 39, 51, 1, - 192, 195, 240, 23, 9, 5, 1, 119, 2, 249, 9, 45, 9, 3, 1, 119, 2, 249, 9, - 45, 9, 5, 1, 255, 41, 2, 49, 47, 9, 3, 1, 255, 41, 2, 49, 47, 9, 5, 1, - 255, 41, 2, 49, 45, 9, 3, 1, 255, 41, 2, 49, 45, 9, 5, 1, 255, 41, 2, - 217, 45, 9, 3, 1, 255, 41, 2, 217, 45, 9, 5, 1, 255, 36, 2, 240, 250, 18, - 116, 9, 3, 1, 255, 36, 2, 240, 250, 18, 116, 9, 5, 1, 255, 34, 2, 49, 47, - 9, 3, 1, 255, 34, 2, 49, 47, 9, 5, 1, 255, 34, 2, 49, 45, 9, 3, 1, 255, - 34, 2, 49, 45, 9, 5, 1, 255, 34, 2, 217, 45, 9, 3, 1, 255, 34, 2, 217, - 45, 9, 5, 1, 255, 34, 2, 239, 117, 9, 3, 1, 255, 34, 2, 239, 117, 9, 5, - 1, 255, 34, 2, 157, 45, 9, 3, 1, 255, 34, 2, 157, 45, 9, 5, 1, 144, 2, - 242, 101, 18, 158, 9, 3, 1, 144, 2, 242, 101, 18, 158, 9, 5, 1, 144, 2, - 242, 101, 18, 116, 9, 3, 1, 144, 2, 242, 101, 18, 116, 9, 5, 1, 144, 2, - 157, 45, 9, 3, 1, 144, 2, 157, 45, 9, 5, 1, 144, 2, 229, 45, 9, 3, 1, - 144, 2, 229, 45, 9, 5, 1, 144, 2, 240, 250, 18, 212, 9, 3, 1, 144, 2, - 240, 250, 18, 212, 9, 5, 1, 255, 42, 2, 49, 47, 9, 3, 1, 255, 42, 2, 49, - 47, 9, 5, 1, 255, 32, 2, 166, 9, 3, 1, 255, 32, 2, 166, 9, 5, 1, 255, 37, - 2, 49, 47, 9, 3, 1, 255, 37, 2, 49, 47, 9, 5, 1, 255, 37, 2, 49, 45, 9, - 3, 1, 255, 37, 2, 49, 45, 9, 5, 1, 255, 37, 2, 150, 9, 3, 1, 255, 37, 2, - 150, 9, 5, 1, 255, 37, 2, 239, 117, 9, 3, 1, 255, 37, 2, 239, 117, 9, 5, - 1, 255, 37, 2, 244, 194, 45, 9, 3, 1, 255, 37, 2, 244, 194, 45, 9, 5, 1, - 197, 2, 229, 45, 9, 3, 1, 197, 2, 229, 45, 9, 5, 1, 197, 2, 238, 81, 18, - 116, 9, 3, 1, 197, 2, 238, 81, 18, 116, 9, 5, 1, 255, 38, 2, 116, 9, 3, - 1, 255, 38, 2, 116, 9, 5, 1, 255, 38, 2, 49, 45, 9, 3, 1, 255, 38, 2, 49, - 45, 9, 5, 1, 255, 38, 2, 217, 45, 9, 3, 1, 255, 38, 2, 217, 45, 9, 5, 1, - 255, 31, 2, 49, 45, 9, 3, 1, 255, 31, 2, 49, 45, 9, 5, 1, 255, 31, 2, 49, - 244, 188, 18, 166, 9, 3, 1, 255, 31, 2, 49, 244, 188, 18, 166, 9, 5, 1, - 255, 31, 2, 217, 45, 9, 3, 1, 255, 31, 2, 217, 45, 9, 5, 1, 255, 31, 2, - 157, 45, 9, 3, 1, 255, 31, 2, 157, 45, 9, 5, 1, 255, 39, 2, 116, 9, 3, 1, - 255, 39, 2, 116, 9, 5, 1, 255, 39, 2, 49, 47, 9, 3, 1, 255, 39, 2, 49, - 47, 9, 5, 1, 255, 39, 2, 49, 45, 9, 3, 1, 255, 39, 2, 49, 45, 9, 5, 1, - 255, 28, 2, 49, 47, 9, 3, 1, 255, 28, 2, 49, 47, 9, 5, 1, 255, 28, 2, 49, - 45, 9, 3, 1, 255, 28, 2, 49, 45, 9, 5, 1, 255, 28, 2, 217, 45, 9, 3, 1, - 255, 28, 2, 217, 45, 9, 5, 1, 255, 28, 2, 157, 45, 9, 3, 1, 255, 28, 2, - 157, 45, 9, 5, 1, 109, 2, 229, 18, 116, 9, 3, 1, 109, 2, 229, 18, 116, 9, - 5, 1, 109, 2, 229, 18, 150, 9, 3, 1, 109, 2, 229, 18, 150, 9, 5, 1, 109, - 2, 242, 101, 18, 158, 9, 3, 1, 109, 2, 242, 101, 18, 158, 9, 5, 1, 109, - 2, 242, 101, 18, 116, 9, 3, 1, 109, 2, 242, 101, 18, 116, 9, 5, 1, 255, - 46, 2, 116, 9, 3, 1, 255, 46, 2, 116, 9, 5, 1, 255, 46, 2, 49, 47, 9, 3, - 1, 255, 46, 2, 49, 47, 9, 5, 1, 255, 30, 2, 49, 47, 9, 3, 1, 255, 30, 2, - 49, 47, 9, 5, 1, 255, 30, 2, 49, 45, 9, 3, 1, 255, 30, 2, 49, 45, 9, 5, - 1, 255, 30, 2, 49, 244, 188, 18, 166, 9, 3, 1, 255, 30, 2, 49, 244, 188, - 18, 166, 9, 5, 1, 255, 30, 2, 217, 45, 9, 3, 1, 255, 30, 2, 217, 45, 9, - 5, 1, 255, 29, 2, 49, 47, 9, 3, 1, 255, 29, 2, 49, 47, 9, 5, 1, 255, 29, - 2, 49, 45, 9, 3, 1, 255, 29, 2, 49, 45, 9, 5, 1, 255, 29, 2, 244, 196, - 18, 49, 47, 9, 3, 1, 255, 29, 2, 244, 196, 18, 49, 47, 9, 5, 1, 255, 29, - 2, 245, 15, 18, 49, 47, 9, 3, 1, 255, 29, 2, 245, 15, 18, 49, 47, 9, 5, - 1, 255, 29, 2, 49, 244, 188, 18, 49, 47, 9, 3, 1, 255, 29, 2, 49, 244, - 188, 18, 49, 47, 9, 5, 1, 255, 33, 2, 49, 47, 9, 3, 1, 255, 33, 2, 49, - 47, 9, 5, 1, 255, 33, 2, 49, 45, 9, 3, 1, 255, 33, 2, 49, 45, 9, 5, 1, - 255, 33, 2, 217, 45, 9, 3, 1, 255, 33, 2, 217, 45, 9, 5, 1, 255, 33, 2, - 157, 45, 9, 3, 1, 255, 33, 2, 157, 45, 9, 5, 1, 115, 2, 238, 81, 45, 9, - 3, 1, 115, 2, 238, 81, 45, 9, 5, 1, 115, 2, 229, 45, 9, 3, 1, 115, 2, - 229, 45, 9, 5, 1, 115, 2, 157, 45, 9, 3, 1, 115, 2, 157, 45, 9, 5, 1, - 115, 2, 229, 18, 116, 9, 3, 1, 115, 2, 229, 18, 116, 9, 5, 1, 115, 2, - 242, 101, 18, 150, 9, 3, 1, 115, 2, 242, 101, 18, 150, 9, 5, 1, 255, 44, - 2, 180, 9, 3, 1, 255, 44, 2, 180, 9, 5, 1, 255, 44, 2, 49, 45, 9, 3, 1, - 255, 44, 2, 49, 45, 9, 5, 1, 255, 40, 2, 158, 9, 3, 1, 255, 40, 2, 158, - 9, 5, 1, 255, 40, 2, 116, 9, 3, 1, 255, 40, 2, 116, 9, 5, 1, 255, 40, 2, - 150, 9, 3, 1, 255, 40, 2, 150, 9, 5, 1, 255, 40, 2, 49, 47, 9, 3, 1, 255, - 40, 2, 49, 47, 9, 5, 1, 255, 40, 2, 49, 45, 9, 3, 1, 255, 40, 2, 49, 45, - 9, 5, 1, 255, 43, 2, 49, 47, 9, 3, 1, 255, 43, 2, 49, 47, 9, 5, 1, 255, - 43, 2, 150, 9, 3, 1, 255, 43, 2, 150, 9, 5, 1, 255, 35, 2, 49, 47, 9, 3, - 1, 255, 35, 2, 49, 47, 9, 5, 1, 255, 27, 2, 236, 180, 9, 3, 1, 255, 27, - 2, 236, 180, 9, 5, 1, 255, 27, 2, 49, 45, 9, 3, 1, 255, 27, 2, 49, 45, 9, - 5, 1, 255, 27, 2, 217, 45, 9, 3, 1, 255, 27, 2, 217, 45, 9, 3, 1, 255, - 37, 2, 217, 45, 9, 3, 1, 255, 33, 2, 150, 9, 3, 1, 255, 40, 2, 249, 9, - 47, 9, 3, 1, 255, 35, 2, 249, 9, 47, 9, 3, 1, 119, 2, 37, 136, 244, 183, - 9, 3, 1, 165, 255, 29, 2, 49, 47, 9, 5, 1, 119, 2, 49, 45, 9, 3, 1, 119, - 2, 49, 45, 9, 5, 1, 119, 2, 248, 255, 47, 9, 3, 1, 119, 2, 248, 255, 47, - 9, 5, 1, 119, 2, 157, 18, 116, 9, 3, 1, 119, 2, 157, 18, 116, 9, 5, 1, - 119, 2, 157, 18, 158, 9, 3, 1, 119, 2, 157, 18, 158, 9, 5, 1, 119, 2, - 157, 18, 248, 255, 47, 9, 3, 1, 119, 2, 157, 18, 248, 255, 47, 9, 5, 1, - 119, 2, 157, 18, 180, 9, 3, 1, 119, 2, 157, 18, 180, 9, 5, 1, 119, 2, - 157, 18, 49, 45, 9, 3, 1, 119, 2, 157, 18, 49, 45, 9, 5, 1, 119, 2, 244, - 194, 18, 116, 9, 3, 1, 119, 2, 244, 194, 18, 116, 9, 5, 1, 119, 2, 244, - 194, 18, 158, 9, 3, 1, 119, 2, 244, 194, 18, 158, 9, 5, 1, 119, 2, 244, - 194, 18, 248, 255, 47, 9, 3, 1, 119, 2, 244, 194, 18, 248, 255, 47, 9, 5, - 1, 119, 2, 244, 194, 18, 180, 9, 3, 1, 119, 2, 244, 194, 18, 180, 9, 5, - 1, 119, 2, 244, 194, 18, 49, 45, 9, 3, 1, 119, 2, 244, 194, 18, 49, 45, - 9, 5, 1, 144, 2, 49, 45, 9, 3, 1, 144, 2, 49, 45, 9, 5, 1, 144, 2, 248, - 255, 47, 9, 3, 1, 144, 2, 248, 255, 47, 9, 5, 1, 144, 2, 180, 9, 3, 1, - 144, 2, 180, 9, 5, 1, 144, 2, 157, 18, 116, 9, 3, 1, 144, 2, 157, 18, - 116, 9, 5, 1, 144, 2, 157, 18, 158, 9, 3, 1, 144, 2, 157, 18, 158, 9, 5, - 1, 144, 2, 157, 18, 248, 255, 47, 9, 3, 1, 144, 2, 157, 18, 248, 255, 47, - 9, 5, 1, 144, 2, 157, 18, 180, 9, 3, 1, 144, 2, 157, 18, 180, 9, 5, 1, - 144, 2, 157, 18, 49, 45, 9, 3, 1, 144, 2, 157, 18, 49, 45, 9, 5, 1, 197, - 2, 248, 255, 47, 9, 3, 1, 197, 2, 248, 255, 47, 9, 5, 1, 197, 2, 49, 45, - 9, 3, 1, 197, 2, 49, 45, 9, 5, 1, 109, 2, 49, 45, 9, 3, 1, 109, 2, 49, - 45, 9, 5, 1, 109, 2, 248, 255, 47, 9, 3, 1, 109, 2, 248, 255, 47, 9, 5, - 1, 109, 2, 157, 18, 116, 9, 3, 1, 109, 2, 157, 18, 116, 9, 5, 1, 109, 2, - 157, 18, 158, 9, 3, 1, 109, 2, 157, 18, 158, 9, 5, 1, 109, 2, 157, 18, - 248, 255, 47, 9, 3, 1, 109, 2, 157, 18, 248, 255, 47, 9, 5, 1, 109, 2, - 157, 18, 180, 9, 3, 1, 109, 2, 157, 18, 180, 9, 5, 1, 109, 2, 157, 18, - 49, 45, 9, 3, 1, 109, 2, 157, 18, 49, 45, 9, 5, 1, 109, 2, 249, 12, 18, - 116, 9, 3, 1, 109, 2, 249, 12, 18, 116, 9, 5, 1, 109, 2, 249, 12, 18, - 158, 9, 3, 1, 109, 2, 249, 12, 18, 158, 9, 5, 1, 109, 2, 249, 12, 18, - 248, 255, 47, 9, 3, 1, 109, 2, 249, 12, 18, 248, 255, 47, 9, 5, 1, 109, - 2, 249, 12, 18, 180, 9, 3, 1, 109, 2, 249, 12, 18, 180, 9, 5, 1, 109, 2, - 249, 12, 18, 49, 45, 9, 3, 1, 109, 2, 249, 12, 18, 49, 45, 9, 5, 1, 115, - 2, 49, 45, 9, 3, 1, 115, 2, 49, 45, 9, 5, 1, 115, 2, 248, 255, 47, 9, 3, - 1, 115, 2, 248, 255, 47, 9, 5, 1, 115, 2, 249, 12, 18, 116, 9, 3, 1, 115, - 2, 249, 12, 18, 116, 9, 5, 1, 115, 2, 249, 12, 18, 158, 9, 3, 1, 115, 2, - 249, 12, 18, 158, 9, 5, 1, 115, 2, 249, 12, 18, 248, 255, 47, 9, 3, 1, - 115, 2, 249, 12, 18, 248, 255, 47, 9, 5, 1, 115, 2, 249, 12, 18, 180, 9, - 3, 1, 115, 2, 249, 12, 18, 180, 9, 5, 1, 115, 2, 249, 12, 18, 49, 45, 9, - 3, 1, 115, 2, 249, 12, 18, 49, 45, 9, 5, 1, 255, 35, 2, 158, 9, 3, 1, - 255, 35, 2, 158, 9, 5, 1, 255, 35, 2, 49, 45, 9, 3, 1, 255, 35, 2, 49, - 45, 9, 5, 1, 255, 35, 2, 248, 255, 47, 9, 3, 1, 255, 35, 2, 248, 255, 47, - 9, 5, 1, 255, 35, 2, 180, 9, 3, 1, 255, 35, 2, 180, 26, 3, 1, 162, 2, - 242, 78, 26, 3, 1, 162, 2, 242, 74, 26, 3, 1, 162, 2, 138, 18, 174, 26, - 3, 1, 162, 2, 130, 18, 174, 26, 3, 1, 162, 2, 138, 18, 173, 26, 3, 1, - 162, 2, 130, 18, 173, 26, 3, 1, 162, 2, 138, 18, 236, 43, 26, 3, 1, 162, - 2, 130, 18, 236, 43, 26, 5, 1, 162, 2, 242, 78, 26, 5, 1, 162, 2, 242, - 74, 26, 5, 1, 162, 2, 138, 18, 174, 26, 5, 1, 162, 2, 130, 18, 174, 26, - 5, 1, 162, 2, 138, 18, 173, 26, 5, 1, 162, 2, 130, 18, 173, 26, 5, 1, - 162, 2, 138, 18, 236, 43, 26, 5, 1, 162, 2, 130, 18, 236, 43, 26, 3, 1, - 240, 204, 2, 242, 78, 26, 3, 1, 240, 204, 2, 242, 74, 26, 3, 1, 240, 204, - 2, 138, 18, 174, 26, 3, 1, 240, 204, 2, 130, 18, 174, 26, 3, 1, 240, 204, - 2, 138, 18, 173, 26, 3, 1, 240, 204, 2, 130, 18, 173, 26, 5, 1, 240, 204, - 2, 242, 78, 26, 5, 1, 240, 204, 2, 242, 74, 26, 5, 1, 240, 204, 2, 138, - 18, 174, 26, 5, 1, 240, 204, 2, 130, 18, 174, 26, 5, 1, 240, 204, 2, 138, - 18, 173, 26, 5, 1, 240, 204, 2, 130, 18, 173, 26, 3, 1, 182, 2, 242, 78, - 26, 3, 1, 182, 2, 242, 74, 26, 3, 1, 182, 2, 138, 18, 174, 26, 3, 1, 182, - 2, 130, 18, 174, 26, 3, 1, 182, 2, 138, 18, 173, 26, 3, 1, 182, 2, 130, - 18, 173, 26, 3, 1, 182, 2, 138, 18, 236, 43, 26, 3, 1, 182, 2, 130, 18, - 236, 43, 26, 5, 1, 182, 2, 242, 78, 26, 5, 1, 182, 2, 242, 74, 26, 5, 1, - 182, 2, 138, 18, 174, 26, 5, 1, 182, 2, 130, 18, 174, 26, 5, 1, 182, 2, - 138, 18, 173, 26, 5, 1, 182, 2, 130, 18, 173, 26, 5, 1, 182, 2, 138, 18, - 236, 43, 26, 5, 1, 182, 2, 130, 18, 236, 43, 26, 3, 1, 228, 2, 242, 78, - 26, 3, 1, 228, 2, 242, 74, 26, 3, 1, 228, 2, 138, 18, 174, 26, 3, 1, 228, - 2, 130, 18, 174, 26, 3, 1, 228, 2, 138, 18, 173, 26, 3, 1, 228, 2, 130, - 18, 173, 26, 3, 1, 228, 2, 138, 18, 236, 43, 26, 3, 1, 228, 2, 130, 18, - 236, 43, 26, 5, 1, 228, 2, 242, 78, 26, 5, 1, 228, 2, 242, 74, 26, 5, 1, - 228, 2, 138, 18, 174, 26, 5, 1, 228, 2, 130, 18, 174, 26, 5, 1, 228, 2, - 138, 18, 173, 26, 5, 1, 228, 2, 130, 18, 173, 26, 5, 1, 228, 2, 138, 18, - 236, 43, 26, 5, 1, 228, 2, 130, 18, 236, 43, 26, 3, 1, 240, 210, 2, 242, - 78, 26, 3, 1, 240, 210, 2, 242, 74, 26, 3, 1, 240, 210, 2, 138, 18, 174, - 26, 3, 1, 240, 210, 2, 130, 18, 174, 26, 3, 1, 240, 210, 2, 138, 18, 173, - 26, 3, 1, 240, 210, 2, 130, 18, 173, 26, 5, 1, 240, 210, 2, 242, 78, 26, - 5, 1, 240, 210, 2, 242, 74, 26, 5, 1, 240, 210, 2, 138, 18, 174, 26, 5, - 1, 240, 210, 2, 130, 18, 174, 26, 5, 1, 240, 210, 2, 138, 18, 173, 26, 5, - 1, 240, 210, 2, 130, 18, 173, 26, 3, 1, 240, 199, 2, 242, 78, 26, 3, 1, - 240, 199, 2, 242, 74, 26, 3, 1, 240, 199, 2, 138, 18, 174, 26, 3, 1, 240, - 199, 2, 130, 18, 174, 26, 3, 1, 240, 199, 2, 138, 18, 173, 26, 3, 1, 240, - 199, 2, 130, 18, 173, 26, 3, 1, 240, 199, 2, 138, 18, 236, 43, 26, 3, 1, - 240, 199, 2, 130, 18, 236, 43, 26, 5, 1, 240, 199, 2, 242, 74, 26, 5, 1, - 240, 199, 2, 130, 18, 174, 26, 5, 1, 240, 199, 2, 130, 18, 173, 26, 5, 1, - 240, 199, 2, 130, 18, 236, 43, 26, 3, 1, 172, 2, 242, 78, 26, 3, 1, 172, - 2, 242, 74, 26, 3, 1, 172, 2, 138, 18, 174, 26, 3, 1, 172, 2, 130, 18, - 174, 26, 3, 1, 172, 2, 138, 18, 173, 26, 3, 1, 172, 2, 130, 18, 173, 26, - 3, 1, 172, 2, 138, 18, 236, 43, 26, 3, 1, 172, 2, 130, 18, 236, 43, 26, - 5, 1, 172, 2, 242, 78, 26, 5, 1, 172, 2, 242, 74, 26, 5, 1, 172, 2, 138, - 18, 174, 26, 5, 1, 172, 2, 130, 18, 174, 26, 5, 1, 172, 2, 138, 18, 173, - 26, 5, 1, 172, 2, 130, 18, 173, 26, 5, 1, 172, 2, 138, 18, 236, 43, 26, - 5, 1, 172, 2, 130, 18, 236, 43, 26, 3, 1, 162, 2, 174, 26, 3, 1, 162, 2, - 173, 26, 3, 1, 240, 204, 2, 174, 26, 3, 1, 240, 204, 2, 173, 26, 3, 1, - 182, 2, 174, 26, 3, 1, 182, 2, 173, 26, 3, 1, 228, 2, 174, 26, 3, 1, 228, - 2, 173, 26, 3, 1, 240, 210, 2, 174, 26, 3, 1, 240, 210, 2, 173, 26, 3, 1, - 240, 199, 2, 174, 26, 3, 1, 240, 199, 2, 173, 26, 3, 1, 172, 2, 174, 26, - 3, 1, 172, 2, 173, 26, 3, 1, 162, 2, 138, 18, 211, 26, 3, 1, 162, 2, 130, - 18, 211, 26, 3, 1, 162, 2, 138, 18, 244, 193, 18, 211, 26, 3, 1, 162, 2, - 130, 18, 244, 193, 18, 211, 26, 3, 1, 162, 2, 138, 18, 249, 26, 18, 211, - 26, 3, 1, 162, 2, 130, 18, 249, 26, 18, 211, 26, 3, 1, 162, 2, 138, 18, - 236, 184, 18, 211, 26, 3, 1, 162, 2, 130, 18, 236, 184, 18, 211, 26, 5, - 1, 162, 2, 138, 18, 234, 62, 26, 5, 1, 162, 2, 130, 18, 234, 62, 26, 5, - 1, 162, 2, 138, 18, 244, 193, 18, 234, 62, 26, 5, 1, 162, 2, 130, 18, - 244, 193, 18, 234, 62, 26, 5, 1, 162, 2, 138, 18, 249, 26, 18, 234, 62, - 26, 5, 1, 162, 2, 130, 18, 249, 26, 18, 234, 62, 26, 5, 1, 162, 2, 138, - 18, 236, 184, 18, 234, 62, 26, 5, 1, 162, 2, 130, 18, 236, 184, 18, 234, - 62, 26, 3, 1, 182, 2, 138, 18, 211, 26, 3, 1, 182, 2, 130, 18, 211, 26, - 3, 1, 182, 2, 138, 18, 244, 193, 18, 211, 26, 3, 1, 182, 2, 130, 18, 244, - 193, 18, 211, 26, 3, 1, 182, 2, 138, 18, 249, 26, 18, 211, 26, 3, 1, 182, - 2, 130, 18, 249, 26, 18, 211, 26, 3, 1, 182, 2, 138, 18, 236, 184, 18, - 211, 26, 3, 1, 182, 2, 130, 18, 236, 184, 18, 211, 26, 5, 1, 182, 2, 138, - 18, 234, 62, 26, 5, 1, 182, 2, 130, 18, 234, 62, 26, 5, 1, 182, 2, 138, - 18, 244, 193, 18, 234, 62, 26, 5, 1, 182, 2, 130, 18, 244, 193, 18, 234, - 62, 26, 5, 1, 182, 2, 138, 18, 249, 26, 18, 234, 62, 26, 5, 1, 182, 2, - 130, 18, 249, 26, 18, 234, 62, 26, 5, 1, 182, 2, 138, 18, 236, 184, 18, - 234, 62, 26, 5, 1, 182, 2, 130, 18, 236, 184, 18, 234, 62, 26, 3, 1, 172, - 2, 138, 18, 211, 26, 3, 1, 172, 2, 130, 18, 211, 26, 3, 1, 172, 2, 138, - 18, 244, 193, 18, 211, 26, 3, 1, 172, 2, 130, 18, 244, 193, 18, 211, 26, - 3, 1, 172, 2, 138, 18, 249, 26, 18, 211, 26, 3, 1, 172, 2, 130, 18, 249, - 26, 18, 211, 26, 3, 1, 172, 2, 138, 18, 236, 184, 18, 211, 26, 3, 1, 172, - 2, 130, 18, 236, 184, 18, 211, 26, 5, 1, 172, 2, 138, 18, 234, 62, 26, 5, - 1, 172, 2, 130, 18, 234, 62, 26, 5, 1, 172, 2, 138, 18, 244, 193, 18, - 234, 62, 26, 5, 1, 172, 2, 130, 18, 244, 193, 18, 234, 62, 26, 5, 1, 172, - 2, 138, 18, 249, 26, 18, 234, 62, 26, 5, 1, 172, 2, 130, 18, 249, 26, 18, - 234, 62, 26, 5, 1, 172, 2, 138, 18, 236, 184, 18, 234, 62, 26, 5, 1, 172, - 2, 130, 18, 236, 184, 18, 234, 62, 26, 3, 1, 162, 2, 240, 245, 26, 3, 1, - 162, 2, 166, 26, 3, 1, 162, 2, 244, 193, 18, 211, 26, 3, 1, 162, 2, 211, - 26, 3, 1, 162, 2, 249, 26, 18, 211, 26, 3, 1, 162, 2, 236, 43, 26, 3, 1, - 162, 2, 236, 184, 18, 211, 26, 5, 1, 162, 2, 240, 245, 26, 5, 1, 162, 2, - 166, 26, 5, 1, 162, 2, 174, 26, 5, 1, 162, 2, 173, 26, 5, 1, 162, 2, 234, - 62, 26, 239, 186, 26, 234, 62, 26, 242, 78, 26, 236, 43, 26, 238, 85, 18, - 236, 43, 26, 3, 1, 182, 2, 244, 193, 18, 211, 26, 3, 1, 182, 2, 211, 26, - 3, 1, 182, 2, 249, 26, 18, 211, 26, 3, 1, 182, 2, 236, 43, 26, 3, 1, 182, - 2, 236, 184, 18, 211, 26, 5, 1, 240, 204, 2, 174, 26, 5, 1, 240, 204, 2, - 173, 26, 5, 1, 182, 2, 174, 26, 5, 1, 182, 2, 173, 26, 5, 1, 182, 2, 234, - 62, 26, 138, 18, 174, 26, 138, 18, 173, 26, 138, 18, 236, 43, 26, 3, 1, - 228, 2, 240, 245, 26, 3, 1, 228, 2, 166, 26, 3, 1, 228, 2, 238, 85, 18, - 174, 26, 3, 1, 228, 2, 238, 85, 18, 173, 26, 3, 1, 228, 2, 236, 43, 26, - 3, 1, 228, 2, 238, 85, 18, 236, 43, 26, 5, 1, 228, 2, 240, 245, 26, 5, 1, - 228, 2, 166, 26, 5, 1, 228, 2, 174, 26, 5, 1, 228, 2, 173, 26, 130, 18, - 174, 26, 130, 18, 173, 26, 130, 18, 236, 43, 26, 3, 1, 240, 199, 2, 240, - 245, 26, 3, 1, 240, 199, 2, 166, 26, 3, 1, 240, 199, 2, 238, 85, 18, 174, - 26, 3, 1, 240, 199, 2, 238, 85, 18, 173, 26, 3, 1, 253, 168, 2, 242, 78, - 26, 3, 1, 253, 168, 2, 242, 74, 26, 3, 1, 240, 199, 2, 236, 43, 26, 3, 1, - 240, 199, 2, 238, 85, 18, 236, 43, 26, 5, 1, 240, 199, 2, 240, 245, 26, - 5, 1, 240, 199, 2, 166, 26, 5, 1, 240, 199, 2, 174, 26, 5, 1, 240, 199, - 2, 173, 26, 5, 1, 253, 168, 2, 242, 74, 26, 238, 85, 18, 174, 26, 238, - 85, 18, 173, 26, 174, 26, 3, 1, 172, 2, 244, 193, 18, 211, 26, 3, 1, 172, - 2, 211, 26, 3, 1, 172, 2, 249, 26, 18, 211, 26, 3, 1, 172, 2, 236, 43, - 26, 3, 1, 172, 2, 236, 184, 18, 211, 26, 5, 1, 240, 210, 2, 174, 26, 5, - 1, 240, 210, 2, 173, 26, 5, 1, 172, 2, 174, 26, 5, 1, 172, 2, 173, 26, 5, - 1, 172, 2, 234, 62, 26, 173, 26, 242, 74, 254, 215, 244, 238, 254, 220, - 244, 238, 254, 215, 242, 69, 254, 220, 242, 69, 236, 174, 242, 69, 237, - 63, 242, 69, 238, 61, 242, 69, 242, 211, 242, 69, 236, 191, 242, 69, 252, - 206, 242, 69, 251, 57, 242, 69, 249, 127, 245, 12, 242, 69, 249, 127, - 245, 12, 237, 77, 249, 127, 245, 12, 241, 22, 235, 245, 65, 235, 248, 65, - 240, 241, 236, 149, 240, 241, 242, 211, 244, 189, 254, 215, 244, 189, - 254, 220, 244, 189, 146, 143, 42, 55, 244, 176, 42, 253, 113, 244, 176, - 36, 242, 66, 238, 76, 65, 37, 242, 66, 238, 76, 65, 242, 66, 245, 135, - 238, 76, 65, 242, 66, 234, 67, 238, 76, 65, 36, 42, 238, 76, 65, 37, 42, - 238, 76, 65, 42, 245, 135, 238, 76, 65, 42, 234, 67, 238, 76, 65, 241, - 50, 42, 241, 50, 240, 215, 237, 144, 240, 215, 253, 101, 49, 241, 25, - 225, 49, 241, 25, 146, 238, 96, 237, 67, 242, 239, 217, 237, 114, 238, - 113, 237, 114, 235, 245, 237, 154, 235, 248, 237, 154, 254, 171, 237, 1, - 237, 62, 235, 245, 238, 148, 235, 248, 238, 148, 243, 234, 239, 190, 242, - 69, 254, 66, 247, 96, 57, 254, 66, 253, 250, 239, 243, 57, 242, 107, 42, - 242, 107, 242, 59, 242, 107, 224, 242, 107, 224, 42, 242, 107, 224, 242, - 59, 242, 107, 242, 174, 242, 66, 235, 237, 160, 238, 76, 65, 242, 66, - 235, 190, 160, 238, 76, 65, 239, 72, 65, 42, 236, 186, 65, 236, 140, 238, - 98, 239, 109, 92, 249, 89, 244, 225, 238, 144, 242, 239, 238, 180, 243, - 171, 240, 215, 239, 123, 242, 91, 36, 30, 226, 2, 242, 242, 37, 30, 226, - 2, 242, 242, 42, 239, 126, 65, 239, 126, 236, 186, 65, 236, 186, 239, - 126, 65, 240, 184, 25, 254, 11, 224, 241, 74, 57, 86, 126, 240, 215, 86, - 63, 240, 215, 253, 113, 238, 77, 224, 237, 123, 246, 71, 253, 131, 225, - 238, 179, 241, 96, 237, 108, 237, 127, 244, 197, 57, 238, 94, 242, 107, - 242, 82, 8, 242, 69, 253, 19, 241, 22, 240, 80, 236, 85, 238, 145, 242, - 167, 238, 145, 237, 114, 241, 58, 238, 161, 238, 160, 239, 199, 238, 161, - 238, 160, 241, 58, 10, 249, 3, 239, 235, 239, 199, 10, 249, 3, 239, 235, - 240, 121, 27, 241, 77, 241, 223, 27, 241, 77, 236, 181, 244, 173, 236, - 181, 9, 3, 1, 69, 236, 181, 163, 236, 181, 168, 236, 181, 169, 236, 181, - 179, 236, 181, 176, 236, 181, 178, 236, 181, 249, 4, 57, 236, 181, 242, - 119, 236, 181, 242, 61, 57, 236, 181, 36, 236, 47, 236, 181, 37, 236, 47, - 236, 181, 9, 3, 1, 183, 238, 83, 244, 173, 238, 83, 121, 238, 83, 114, - 238, 83, 153, 238, 83, 163, 238, 83, 168, 238, 83, 169, 238, 83, 179, - 238, 83, 176, 238, 83, 178, 238, 83, 249, 4, 57, 238, 83, 242, 119, 238, - 83, 242, 61, 57, 238, 83, 36, 236, 47, 238, 83, 37, 236, 47, 236, 20, 57, - 244, 214, 57, 240, 20, 57, 243, 118, 246, 132, 57, 251, 199, 57, 251, - 234, 57, 247, 108, 57, 244, 34, 57, 245, 40, 57, 254, 76, 57, 254, 153, - 244, 77, 57, 250, 225, 57, 250, 248, 57, 254, 126, 57, 244, 127, 57, 241, - 150, 57, 243, 126, 247, 240, 57, 252, 62, 57, 48, 36, 154, 47, 48, 37, - 154, 47, 48, 165, 55, 217, 239, 131, 48, 207, 55, 217, 239, 131, 48, 235, - 236, 59, 47, 48, 238, 87, 59, 47, 48, 36, 59, 47, 48, 37, 59, 47, 48, - 249, 9, 239, 131, 48, 238, 87, 249, 9, 239, 131, 48, 235, 236, 249, 9, - 239, 131, 48, 244, 171, 248, 253, 47, 48, 249, 28, 248, 253, 47, 48, 238, - 97, 240, 200, 48, 238, 97, 240, 207, 48, 238, 97, 239, 132, 48, 238, 97, - 175, 237, 132, 48, 36, 37, 59, 47, 48, 238, 97, 242, 0, 48, 238, 97, 241, - 191, 48, 238, 97, 244, 135, 239, 119, 219, 48, 240, 219, 240, 230, 239, - 131, 48, 42, 55, 242, 114, 239, 131, 48, 241, 98, 90, 48, 242, 59, 239, - 108, 48, 249, 51, 242, 153, 47, 48, 126, 59, 239, 131, 241, 37, 253, 128, - 238, 167, 139, 253, 173, 240, 172, 120, 5, 203, 242, 156, 240, 14, 242, - 100, 217, 90, 250, 177, 253, 128, 250, 174, 252, 237, 246, 127, 238, 136, - 240, 160, 242, 156, 237, 61, 71, 3, 194, 71, 5, 164, 236, 51, 5, 164, - 120, 5, 164, 242, 238, 238, 136, 242, 238, 240, 17, 249, 25, 225, 253, - 116, 71, 5, 69, 236, 51, 5, 69, 71, 5, 148, 71, 3, 148, 255, 31, 255, 41, - 253, 99, 90, 120, 5, 183, 244, 7, 57, 244, 205, 239, 70, 237, 183, 71, 5, - 198, 120, 5, 198, 120, 5, 209, 71, 5, 135, 236, 51, 5, 135, 120, 5, 135, - 236, 157, 248, 116, 239, 75, 242, 8, 65, 238, 132, 57, 248, 136, 167, 57, - 239, 110, 120, 5, 202, 247, 235, 57, 254, 61, 57, 239, 116, 254, 61, 57, - 236, 51, 5, 202, 242, 60, 26, 3, 1, 244, 191, 243, 188, 57, 239, 250, 57, - 71, 5, 199, 236, 51, 5, 203, 239, 9, 90, 71, 3, 70, 71, 5, 70, 71, 5, - 204, 242, 60, 5, 204, 71, 5, 171, 71, 3, 78, 67, 90, 254, 3, 90, 245, 98, - 90, 245, 76, 90, 237, 71, 242, 16, 241, 3, 5, 209, 120, 3, 242, 75, 120, - 5, 242, 75, 120, 5, 253, 116, 120, 244, 186, 237, 164, 242, 60, 23, 5, - 194, 242, 60, 23, 5, 148, 224, 23, 5, 148, 242, 60, 23, 5, 181, 120, 21, - 5, 187, 120, 21, 3, 187, 120, 21, 3, 70, 120, 21, 3, 69, 120, 21, 3, 200, - 240, 146, 244, 176, 242, 60, 237, 124, 242, 83, 239, 123, 253, 101, 244, - 116, 242, 83, 239, 123, 225, 242, 35, 242, 83, 239, 123, 253, 101, 243, - 111, 242, 83, 239, 123, 225, 241, 20, 242, 83, 239, 123, 244, 171, 241, - 20, 242, 83, 239, 123, 249, 28, 241, 20, 242, 83, 239, 123, 253, 101, - 244, 84, 242, 83, 239, 123, 249, 48, 242, 14, 242, 83, 239, 123, 253, - 101, 241, 151, 242, 83, 239, 123, 244, 171, 239, 181, 242, 83, 239, 123, - 249, 48, 239, 181, 242, 83, 239, 123, 245, 4, 239, 181, 239, 123, 238, - 103, 121, 218, 151, 121, 218, 151, 114, 218, 151, 153, 218, 151, 163, - 218, 151, 168, 218, 151, 169, 218, 151, 179, 218, 151, 176, 218, 151, - 178, 218, 151, 249, 18, 218, 151, 240, 234, 218, 151, 240, 238, 218, 151, - 242, 144, 218, 151, 253, 101, 239, 150, 218, 151, 249, 48, 239, 150, 218, - 151, 253, 101, 238, 104, 3, 218, 151, 121, 3, 218, 151, 114, 3, 218, 151, - 153, 3, 218, 151, 163, 3, 218, 151, 168, 3, 218, 151, 169, 3, 218, 151, - 179, 3, 218, 151, 176, 3, 218, 151, 178, 3, 218, 151, 249, 18, 3, 218, - 151, 240, 234, 3, 218, 151, 240, 238, 3, 218, 151, 242, 144, 3, 218, 151, - 253, 101, 239, 150, 3, 218, 151, 249, 48, 239, 150, 3, 218, 151, 253, - 101, 238, 104, 218, 151, 253, 101, 239, 243, 255, 36, 187, 218, 151, 249, - 48, 238, 104, 218, 151, 253, 250, 238, 104, 218, 151, 224, 253, 101, 239, - 150, 126, 52, 210, 52, 63, 52, 220, 52, 36, 37, 52, 75, 79, 52, 244, 177, - 249, 17, 52, 244, 177, 249, 2, 52, 244, 181, 249, 2, 52, 244, 181, 249, - 17, 52, 126, 59, 2, 122, 63, 59, 2, 122, 126, 249, 90, 52, 63, 249, 90, - 52, 126, 225, 242, 159, 52, 210, 225, 242, 159, 52, 63, 225, 242, 159, - 52, 220, 225, 242, 159, 52, 126, 59, 2, 244, 182, 63, 59, 2, 244, 182, - 126, 59, 248, 254, 143, 210, 59, 248, 254, 143, 63, 59, 248, 254, 143, - 220, 59, 248, 254, 143, 75, 79, 59, 2, 245, 253, 126, 59, 2, 128, 63, 59, - 2, 128, 126, 59, 2, 245, 28, 63, 59, 2, 245, 28, 36, 37, 249, 90, 52, 36, - 37, 59, 2, 122, 220, 242, 193, 52, 210, 59, 2, 253, 252, 237, 125, 210, - 59, 2, 253, 252, 236, 195, 220, 59, 2, 253, 252, 237, 125, 220, 59, 2, - 253, 252, 236, 195, 63, 59, 2, 242, 86, 237, 121, 220, 59, 2, 242, 86, - 237, 125, 235, 236, 253, 121, 237, 163, 52, 238, 87, 253, 121, 237, 163, - 52, 244, 177, 249, 17, 59, 139, 165, 143, 126, 59, 139, 253, 99, 249, 25, - 63, 59, 139, 143, 235, 236, 249, 0, 175, 52, 238, 87, 249, 0, 175, 52, - 126, 154, 2, 133, 239, 176, 126, 154, 2, 133, 237, 121, 210, 154, 2, 133, - 236, 195, 210, 154, 2, 133, 237, 125, 63, 154, 2, 133, 239, 176, 63, 154, - 2, 133, 237, 121, 220, 154, 2, 133, 236, 195, 220, 154, 2, 133, 237, 125, - 63, 59, 249, 25, 126, 52, 210, 59, 126, 137, 220, 52, 126, 59, 249, 25, - 63, 52, 126, 242, 161, 240, 246, 210, 242, 161, 240, 246, 63, 242, 161, - 240, 246, 220, 242, 161, 240, 246, 126, 154, 249, 25, 63, 239, 142, 63, - 154, 249, 25, 126, 239, 142, 126, 42, 59, 2, 122, 36, 37, 42, 59, 2, 122, - 63, 42, 59, 2, 122, 126, 42, 52, 210, 42, 52, 63, 42, 52, 220, 42, 52, - 36, 37, 42, 52, 75, 79, 42, 52, 244, 177, 249, 17, 42, 52, 244, 177, 249, - 2, 42, 52, 244, 181, 249, 2, 42, 52, 244, 181, 249, 17, 42, 52, 126, 242, - 59, 52, 63, 242, 59, 52, 126, 239, 196, 52, 63, 239, 196, 52, 210, 59, 2, - 42, 122, 220, 59, 2, 42, 122, 126, 242, 105, 52, 210, 242, 105, 52, 63, - 242, 105, 52, 220, 242, 105, 52, 126, 59, 139, 143, 63, 59, 139, 143, - 126, 58, 52, 210, 58, 52, 63, 58, 52, 220, 58, 52, 210, 58, 59, 248, 254, - 143, 210, 58, 59, 254, 236, 238, 150, 210, 58, 59, 254, 236, 239, 228, 2, - 146, 143, 210, 58, 59, 254, 236, 239, 228, 2, 55, 143, 210, 58, 42, 52, - 210, 58, 42, 59, 254, 236, 238, 150, 63, 58, 59, 248, 254, 248, 170, 244, - 177, 249, 17, 59, 139, 240, 213, 244, 181, 249, 2, 59, 139, 240, 213, 75, - 79, 58, 52, 37, 59, 2, 3, 240, 200, 220, 59, 126, 137, 210, 52, 244, 171, - 63, 240, 246, 126, 59, 2, 55, 122, 63, 59, 2, 55, 122, 36, 37, 59, 2, 55, - 122, 126, 59, 2, 42, 55, 122, 63, 59, 2, 42, 55, 122, 36, 37, 59, 2, 42, - 55, 122, 126, 236, 203, 52, 63, 236, 203, 52, 36, 37, 236, 203, 52, 54, - 249, 185, 236, 251, 240, 243, 235, 240, 245, 201, 241, 155, 245, 201, - 249, 41, 141, 243, 103, 244, 216, 250, 69, 238, 19, 242, 130, 240, 214, - 253, 128, 141, 255, 2, 240, 214, 253, 128, 3, 240, 214, 253, 128, 239, - 146, 254, 217, 241, 27, 249, 41, 141, 241, 14, 254, 217, 241, 27, 3, 239, - 146, 254, 217, 241, 27, 253, 127, 137, 244, 42, 244, 186, 239, 138, 244, - 186, 237, 152, 244, 186, 237, 164, 244, 197, 57, 236, 28, 57, 49, 244, - 212, 239, 156, 242, 91, 253, 232, 242, 119, 239, 203, 223, 249, 9, 223, - 243, 54, 223, 30, 245, 39, 250, 194, 245, 39, 242, 214, 245, 39, 236, - 158, 76, 238, 121, 37, 242, 117, 242, 117, 239, 136, 242, 117, 238, 128, - 242, 117, 240, 31, 249, 41, 141, 241, 52, 239, 160, 76, 141, 239, 160, - 76, 240, 202, 249, 46, 240, 202, 253, 186, 235, 238, 242, 109, 238, 86, - 42, 238, 86, 242, 59, 238, 86, 241, 15, 238, 86, 242, 27, 238, 86, 244, - 142, 238, 86, 238, 87, 238, 86, 238, 87, 241, 15, 238, 86, 235, 236, 241, - 15, 238, 86, 238, 67, 240, 5, 244, 53, 236, 225, 49, 242, 119, 241, 154, - 239, 24, 236, 225, 237, 66, 229, 223, 224, 180, 239, 116, 251, 187, 159, - 252, 166, 245, 11, 244, 149, 239, 138, 141, 180, 244, 197, 180, 235, 199, - 80, 76, 141, 235, 199, 80, 76, 235, 239, 80, 76, 235, 239, 253, 177, 141, - 239, 200, 80, 76, 240, 223, 235, 239, 253, 137, 239, 200, 80, 76, 242, - 93, 80, 76, 141, 242, 93, 80, 76, 242, 93, 80, 112, 80, 76, 242, 59, 180, - 254, 1, 80, 76, 237, 113, 76, 235, 252, 237, 113, 76, 237, 187, 239, 204, - 237, 174, 253, 173, 243, 204, 235, 252, 80, 76, 235, 239, 80, 139, 112, - 253, 173, 244, 211, 253, 128, 244, 211, 137, 112, 235, 239, 80, 76, 244, - 214, 240, 254, 242, 61, 242, 81, 249, 9, 254, 214, 80, 76, 249, 9, 80, - 76, 236, 253, 76, 238, 5, 237, 60, 76, 249, 86, 240, 254, 245, 20, 80, - 76, 80, 139, 254, 216, 236, 255, 239, 136, 254, 30, 238, 50, 80, 76, 141, - 80, 76, 238, 111, 76, 141, 238, 111, 76, 240, 171, 237, 113, 76, 206, - 112, 80, 76, 196, 112, 80, 76, 206, 249, 25, 80, 76, 196, 249, 25, 80, - 76, 206, 253, 177, 141, 80, 76, 196, 253, 177, 141, 80, 76, 249, 108, - 237, 110, 249, 108, 235, 235, 239, 204, 141, 237, 113, 76, 141, 237, 110, - 141, 235, 235, 240, 223, 206, 253, 137, 80, 76, 240, 223, 196, 253, 137, - 80, 76, 206, 112, 237, 113, 76, 196, 112, 237, 113, 76, 240, 223, 206, - 253, 137, 237, 113, 76, 240, 223, 196, 253, 137, 237, 113, 76, 206, 112, - 235, 235, 196, 112, 237, 110, 240, 223, 206, 253, 137, 235, 235, 240, - 223, 196, 253, 137, 237, 110, 238, 126, 238, 130, 239, 143, 112, 80, 76, - 239, 145, 112, 80, 76, 239, 143, 112, 237, 113, 76, 239, 145, 112, 237, - 113, 76, 249, 41, 141, 240, 142, 249, 41, 141, 240, 173, 242, 76, 253, - 128, 239, 121, 253, 128, 141, 119, 242, 76, 253, 128, 141, 119, 239, 121, - 253, 128, 242, 76, 137, 112, 80, 76, 239, 121, 137, 112, 80, 76, 240, - 223, 119, 242, 76, 137, 253, 137, 80, 76, 240, 223, 119, 239, 121, 137, - 253, 137, 80, 76, 242, 76, 137, 2, 141, 80, 76, 239, 121, 137, 2, 141, - 80, 76, 239, 50, 239, 225, 235, 181, 239, 225, 242, 109, 30, 244, 211, - 253, 128, 30, 239, 169, 253, 128, 30, 244, 211, 137, 112, 80, 76, 30, - 239, 169, 137, 112, 80, 76, 30, 249, 195, 30, 249, 202, 28, 244, 212, 28, - 242, 119, 28, 242, 167, 28, 239, 156, 242, 91, 28, 49, 223, 28, 249, 9, - 223, 28, 239, 203, 223, 28, 240, 254, 28, 244, 189, 240, 227, 244, 212, - 240, 227, 242, 119, 240, 227, 242, 167, 240, 227, 49, 223, 37, 244, 184, - 36, 244, 184, 79, 244, 184, 75, 244, 184, 237, 175, 241, 216, 245, 209, - 241, 172, 242, 59, 55, 253, 99, 37, 237, 119, 42, 55, 253, 99, 42, 37, - 237, 119, 249, 41, 141, 244, 43, 141, 245, 209, 249, 41, 141, 243, 116, - 241, 68, 42, 55, 253, 99, 42, 37, 237, 119, 239, 143, 245, 217, 238, 114, - 239, 145, 245, 217, 238, 114, 242, 103, 239, 164, 253, 128, 239, 146, - 254, 217, 242, 103, 238, 159, 242, 103, 239, 164, 137, 112, 80, 76, 239, - 146, 254, 217, 242, 103, 239, 164, 112, 80, 76, 239, 169, 253, 128, 244, - 211, 253, 128, 238, 122, 239, 27, 238, 193, 241, 207, 236, 139, 253, 30, - 247, 109, 252, 34, 37, 160, 2, 249, 65, 37, 219, 244, 186, 240, 202, 249, - 46, 244, 186, 240, 202, 253, 186, 244, 186, 235, 238, 244, 186, 242, 109, - 240, 221, 223, 49, 223, 249, 86, 223, 239, 156, 242, 167, 241, 45, 36, - 242, 103, 242, 210, 237, 128, 239, 138, 37, 242, 103, 242, 210, 237, 128, - 239, 138, 36, 237, 128, 239, 138, 37, 237, 128, 239, 138, 224, 229, 240, - 254, 244, 175, 240, 202, 253, 186, 244, 175, 240, 202, 249, 46, 42, 240, - 237, 42, 238, 116, 42, 235, 238, 42, 242, 109, 238, 43, 80, 18, 239, 160, - 76, 206, 2, 227, 196, 2, 227, 250, 104, 249, 108, 237, 110, 250, 104, - 249, 108, 235, 235, 206, 80, 139, 112, 235, 235, 196, 80, 139, 112, 237, - 110, 80, 139, 112, 237, 110, 80, 139, 112, 235, 235, 80, 139, 112, 238, - 126, 80, 139, 112, 238, 130, 249, 41, 141, 241, 242, 112, 242, 88, 249, - 41, 141, 242, 26, 112, 242, 88, 141, 30, 244, 211, 137, 112, 80, 76, 141, - 30, 239, 169, 137, 112, 80, 76, 30, 244, 211, 137, 112, 141, 80, 76, 30, - 239, 169, 137, 112, 141, 80, 76, 206, 253, 177, 141, 237, 113, 76, 196, - 253, 177, 141, 237, 113, 76, 239, 143, 253, 177, 141, 237, 113, 76, 239, - 145, 253, 177, 141, 237, 113, 76, 141, 242, 103, 239, 164, 253, 128, 249, - 41, 141, 241, 14, 254, 217, 242, 103, 238, 159, 141, 242, 103, 239, 164, - 137, 112, 80, 76, 249, 41, 141, 241, 14, 254, 217, 242, 103, 239, 164, - 112, 242, 88, 55, 238, 96, 241, 213, 146, 238, 96, 75, 37, 239, 125, 238, - 96, 79, 37, 239, 125, 238, 96, 240, 214, 137, 2, 165, 146, 122, 240, 214, - 137, 2, 55, 253, 99, 254, 228, 253, 127, 137, 146, 122, 3, 240, 214, 137, - 2, 55, 253, 99, 254, 228, 253, 127, 137, 146, 122, 240, 214, 137, 2, 49, - 47, 240, 214, 137, 2, 239, 130, 3, 240, 214, 137, 2, 239, 130, 240, 214, - 137, 2, 238, 75, 240, 214, 137, 2, 225, 146, 239, 240, 239, 146, 2, 165, - 146, 122, 239, 146, 2, 55, 253, 99, 254, 228, 253, 127, 137, 146, 122, 3, - 239, 146, 2, 55, 253, 99, 254, 228, 253, 127, 137, 146, 122, 239, 146, 2, - 239, 130, 3, 239, 146, 2, 239, 130, 255, 27, 239, 129, 254, 87, 237, 75, - 240, 25, 57, 240, 67, 52, 243, 163, 75, 237, 116, 79, 237, 116, 237, 82, - 236, 152, 249, 57, 244, 176, 36, 239, 207, 37, 239, 207, 36, 242, 212, - 37, 242, 212, 242, 80, 37, 244, 247, 242, 80, 36, 244, 247, 253, 121, 37, - 244, 247, 253, 121, 36, 244, 247, 224, 141, 57, 30, 239, 188, 249, 65, - 240, 161, 242, 6, 238, 132, 239, 69, 240, 141, 237, 136, 240, 193, 240, - 207, 245, 162, 137, 240, 92, 57, 242, 60, 141, 57, 244, 145, 237, 140, - 253, 121, 36, 240, 213, 253, 121, 37, 240, 213, 242, 80, 36, 240, 213, - 242, 80, 37, 240, 213, 253, 121, 136, 238, 86, 242, 80, 136, 238, 86, - 243, 119, 244, 90, 75, 238, 177, 241, 112, 225, 146, 245, 252, 244, 20, - 251, 150, 245, 81, 139, 253, 173, 184, 255, 43, 254, 214, 119, 239, 71, - 249, 47, 239, 37, 235, 237, 160, 110, 235, 190, 160, 110, 245, 81, 139, - 253, 173, 244, 172, 241, 111, 244, 183, 236, 8, 254, 1, 234, 69, 239, 99, - 248, 135, 241, 250, 238, 203, 241, 230, 241, 129, 244, 110, 244, 88, 236, - 92, 236, 93, 123, 124, 13, 241, 183, 123, 124, 13, 244, 99, 244, 238, - 123, 124, 13, 249, 14, 242, 88, 123, 124, 13, 249, 14, 241, 52, 123, 124, - 13, 249, 14, 239, 132, 123, 124, 13, 249, 14, 249, 69, 123, 124, 13, 249, - 14, 240, 200, 123, 124, 13, 175, 242, 150, 123, 124, 13, 175, 249, 69, - 123, 124, 13, 248, 80, 143, 123, 124, 13, 238, 181, 143, 123, 124, 13, - 249, 14, 242, 91, 123, 124, 13, 249, 14, 237, 132, 123, 124, 13, 249, 14, - 237, 110, 123, 124, 13, 249, 14, 235, 235, 123, 124, 13, 126, 245, 10, - 123, 124, 13, 63, 245, 10, 123, 124, 13, 249, 14, 126, 52, 123, 124, 13, - 249, 14, 63, 52, 123, 124, 13, 175, 237, 132, 123, 124, 13, 79, 249, 35, - 238, 75, 123, 124, 13, 245, 20, 242, 150, 123, 124, 13, 249, 14, 79, 242, - 174, 123, 124, 13, 249, 14, 242, 87, 123, 124, 13, 79, 249, 35, 249, 69, - 123, 124, 13, 210, 245, 10, 123, 124, 13, 249, 14, 210, 52, 123, 124, 13, - 75, 249, 35, 239, 130, 123, 124, 13, 254, 6, 242, 150, 123, 124, 13, 249, - 14, 75, 242, 174, 123, 124, 13, 249, 14, 250, 213, 123, 124, 13, 75, 249, - 35, 249, 69, 123, 124, 13, 220, 245, 10, 123, 124, 13, 249, 14, 220, 52, - 123, 124, 13, 245, 166, 238, 75, 123, 124, 13, 245, 20, 238, 75, 123, - 124, 13, 240, 221, 238, 75, 123, 124, 13, 254, 48, 238, 75, 123, 124, 13, - 175, 238, 75, 123, 124, 13, 75, 249, 161, 249, 69, 123, 124, 13, 245, - 166, 244, 238, 123, 124, 13, 175, 244, 178, 123, 124, 13, 249, 14, 242, - 81, 123, 124, 13, 75, 249, 35, 150, 123, 124, 13, 254, 6, 150, 123, 124, - 13, 249, 86, 150, 123, 124, 13, 254, 48, 150, 123, 124, 13, 175, 150, - 123, 124, 13, 79, 249, 161, 242, 150, 123, 124, 13, 36, 249, 161, 242, - 150, 123, 124, 13, 229, 150, 123, 124, 13, 196, 150, 123, 124, 13, 244, - 192, 143, 123, 124, 13, 254, 6, 180, 123, 124, 13, 244, 164, 123, 124, - 13, 248, 105, 180, 123, 124, 13, 239, 82, 238, 75, 123, 124, 13, 249, 14, - 141, 242, 88, 123, 124, 13, 249, 14, 239, 68, 123, 124, 13, 79, 244, 225, - 180, 123, 124, 13, 75, 244, 225, 180, 123, 124, 13, 244, 191, 123, 124, - 13, 249, 32, 123, 124, 13, 242, 72, 123, 124, 13, 162, 238, 75, 123, 124, - 13, 240, 204, 238, 75, 123, 124, 13, 228, 238, 75, 123, 124, 13, 172, - 238, 75, 123, 124, 13, 242, 79, 141, 245, 16, 65, 37, 160, 2, 220, 242, - 193, 52, 238, 60, 249, 0, 249, 47, 250, 151, 90, 55, 217, 2, 242, 65, - 227, 238, 144, 90, 237, 182, 238, 165, 90, 236, 11, 238, 165, 90, 239, - 215, 90, 236, 252, 90, 58, 30, 2, 242, 100, 55, 244, 176, 246, 122, 90, - 236, 200, 254, 49, 90, 251, 63, 90, 28, 146, 253, 99, 2, 244, 3, 28, 239, - 118, 244, 185, 242, 173, 175, 2, 239, 52, 52, 252, 238, 90, 238, 34, 90, - 238, 15, 90, 231, 241, 243, 139, 90, 231, 241, 243, 197, 90, 231, 232, - 90, 231, 235, 90, 243, 92, 241, 131, 13, 249, 3, 114, 232, 12, 90, 123, - 124, 13, 244, 238, 241, 51, 238, 158, 254, 49, 90, 240, 144, 245, 156, - 252, 16, 245, 156, 247, 250, 242, 244, 90, 246, 70, 242, 244, 90, 36, - 236, 187, 156, 128, 36, 236, 187, 237, 122, 36, 236, 187, 149, 128, 37, - 236, 187, 156, 128, 37, 236, 187, 237, 122, 37, 236, 187, 149, 128, 36, - 30, 226, 156, 240, 213, 36, 30, 226, 237, 122, 36, 30, 226, 149, 240, - 213, 37, 30, 226, 156, 240, 213, 37, 30, 226, 237, 122, 37, 30, 226, 149, - 240, 213, 36, 244, 175, 226, 156, 128, 36, 244, 175, 226, 242, 65, 242, - 163, 36, 244, 175, 226, 149, 128, 244, 175, 226, 237, 122, 37, 244, 175, - 226, 156, 128, 37, 244, 175, 226, 242, 65, 242, 163, 37, 244, 175, 226, - 149, 128, 239, 135, 237, 122, 146, 217, 237, 122, 156, 36, 112, 149, 37, - 244, 175, 226, 239, 174, 156, 37, 112, 149, 36, 244, 175, 226, 239, 174, - 238, 131, 249, 168, 238, 131, 241, 12, 253, 121, 30, 110, 242, 80, 30, - 110, 242, 80, 30, 226, 249, 25, 253, 121, 30, 110, 22, 13, 241, 12, 36, - 55, 56, 244, 176, 37, 55, 56, 244, 176, 146, 249, 116, 241, 198, 146, - 249, 116, 241, 199, 146, 249, 116, 241, 200, 146, 249, 116, 241, 201, - 238, 84, 13, 117, 55, 18, 253, 121, 184, 238, 84, 13, 117, 55, 18, 242, - 80, 184, 238, 84, 13, 117, 55, 2, 240, 200, 238, 84, 13, 117, 79, 18, - 146, 2, 240, 200, 238, 84, 13, 117, 75, 18, 146, 2, 240, 200, 238, 84, - 13, 117, 55, 2, 219, 238, 84, 13, 117, 79, 18, 146, 2, 219, 238, 84, 13, - 117, 75, 18, 146, 2, 219, 238, 84, 13, 117, 55, 18, 245, 11, 238, 84, 13, - 117, 79, 18, 146, 2, 245, 11, 238, 84, 13, 117, 75, 18, 146, 2, 245, 11, - 238, 84, 13, 117, 79, 18, 236, 182, 238, 84, 13, 117, 75, 18, 236, 182, - 238, 84, 13, 117, 55, 18, 253, 121, 244, 172, 238, 84, 13, 117, 55, 18, - 242, 80, 244, 172, 30, 245, 22, 244, 56, 90, 13, 54, 247, 197, 13, 54, - 245, 45, 137, 240, 86, 13, 54, 245, 45, 137, 245, 200, 13, 54, 253, 127, - 137, 245, 200, 13, 54, 253, 127, 137, 236, 40, 13, 54, 240, 68, 13, 54, - 236, 74, 13, 54, 246, 20, 13, 54, 237, 177, 13, 54, 146, 236, 235, 13, - 54, 217, 245, 83, 13, 54, 55, 236, 235, 13, 54, 249, 3, 245, 83, 13, 54, - 240, 13, 241, 249, 13, 54, 245, 185, 252, 58, 13, 54, 245, 185, 253, 227, - 13, 54, 250, 210, 251, 197, 241, 53, 13, 54, 242, 157, 240, 251, 121, 13, - 54, 242, 157, 240, 251, 114, 13, 54, 242, 157, 240, 251, 153, 13, 54, - 242, 157, 240, 251, 163, 13, 54, 239, 115, 236, 74, 13, 54, 237, 102, - 246, 248, 13, 54, 253, 127, 137, 236, 176, 242, 67, 13, 54, 241, 120, 13, - 54, 253, 127, 137, 241, 209, 13, 54, 237, 101, 13, 54, 241, 53, 13, 54, - 251, 7, 237, 114, 13, 54, 246, 161, 237, 114, 13, 54, 244, 55, 237, 114, - 13, 54, 252, 239, 237, 114, 13, 54, 242, 69, 13, 54, 241, 137, 246, 29, - 90, 249, 0, 249, 47, 13, 54, 240, 124, 13, 54, 243, 90, 249, 3, 114, 13, - 54, 238, 65, 249, 3, 114, 253, 149, 128, 253, 149, 243, 60, 253, 149, - 245, 88, 253, 149, 239, 116, 245, 88, 253, 149, 250, 152, 241, 119, 253, - 149, 254, 89, 249, 89, 253, 149, 243, 49, 250, 140, 234, 72, 253, 149, - 243, 29, 137, 242, 201, 253, 149, 244, 189, 253, 149, 240, 21, 241, 37, - 241, 224, 253, 149, 42, 237, 132, 28, 27, 121, 28, 27, 114, 28, 27, 153, - 28, 27, 163, 28, 27, 168, 28, 27, 169, 28, 27, 179, 28, 27, 176, 28, 27, - 178, 28, 83, 249, 18, 28, 83, 240, 234, 28, 83, 240, 238, 28, 83, 238, - 108, 28, 83, 238, 106, 28, 83, 239, 167, 28, 83, 239, 162, 28, 83, 237, - 129, 28, 83, 238, 105, 28, 83, 238, 107, 28, 83, 240, 239, 68, 27, 121, - 68, 27, 114, 68, 27, 153, 68, 27, 163, 68, 27, 168, 68, 27, 169, 68, 27, - 179, 68, 27, 176, 68, 27, 178, 68, 83, 249, 18, 68, 83, 240, 234, 68, 83, - 240, 238, 68, 83, 238, 108, 68, 83, 238, 106, 68, 83, 239, 167, 68, 83, - 239, 162, 68, 83, 237, 129, 68, 83, 238, 105, 68, 83, 238, 107, 68, 83, - 240, 239, 27, 253, 101, 213, 189, 27, 225, 213, 189, 27, 244, 171, 213, - 189, 27, 249, 28, 213, 189, 27, 249, 48, 213, 189, 27, 254, 23, 213, 189, - 27, 245, 4, 213, 189, 27, 244, 207, 213, 189, 27, 250, 29, 213, 189, 83, - 253, 250, 213, 189, 83, 243, 97, 213, 189, 83, 243, 17, 213, 189, 83, - 240, 180, 213, 189, 83, 240, 78, 213, 189, 83, 241, 166, 213, 189, 83, - 241, 78, 213, 189, 83, 239, 83, 213, 189, 83, 240, 65, 213, 189, 83, 240, - 127, 213, 189, 83, 242, 104, 213, 189, 68, 9, 3, 1, 64, 68, 9, 3, 1, 199, - 68, 9, 3, 1, 203, 68, 9, 3, 1, 187, 68, 9, 3, 1, 70, 68, 9, 3, 1, 204, - 68, 9, 3, 1, 194, 68, 9, 3, 1, 164, 68, 9, 3, 1, 69, 68, 9, 3, 1, 200, - 68, 9, 3, 1, 205, 68, 9, 3, 1, 148, 68, 9, 3, 1, 171, 68, 9, 3, 1, 183, - 68, 9, 3, 1, 78, 68, 9, 3, 1, 198, 68, 9, 3, 1, 209, 68, 9, 3, 1, 135, - 68, 9, 3, 1, 159, 68, 9, 3, 1, 190, 68, 9, 3, 1, 84, 68, 9, 3, 1, 186, - 68, 9, 3, 1, 201, 68, 9, 3, 1, 170, 68, 9, 3, 1, 181, 68, 9, 3, 1, 202, - 28, 9, 5, 1, 64, 28, 9, 5, 1, 199, 28, 9, 5, 1, 203, 28, 9, 5, 1, 187, - 28, 9, 5, 1, 70, 28, 9, 5, 1, 204, 28, 9, 5, 1, 194, 28, 9, 5, 1, 164, - 28, 9, 5, 1, 69, 28, 9, 5, 1, 200, 28, 9, 5, 1, 205, 28, 9, 5, 1, 148, - 28, 9, 5, 1, 171, 28, 9, 5, 1, 183, 28, 9, 5, 1, 78, 28, 9, 5, 1, 198, - 28, 9, 5, 1, 209, 28, 9, 5, 1, 135, 28, 9, 5, 1, 159, 28, 9, 5, 1, 190, - 28, 9, 5, 1, 84, 28, 9, 5, 1, 186, 28, 9, 5, 1, 201, 28, 9, 5, 1, 170, - 28, 9, 5, 1, 181, 28, 9, 5, 1, 202, 28, 9, 3, 1, 64, 28, 9, 3, 1, 199, - 28, 9, 3, 1, 203, 28, 9, 3, 1, 187, 28, 9, 3, 1, 70, 28, 9, 3, 1, 204, - 28, 9, 3, 1, 194, 28, 9, 3, 1, 164, 28, 9, 3, 1, 69, 28, 9, 3, 1, 200, - 28, 9, 3, 1, 205, 28, 9, 3, 1, 148, 28, 9, 3, 1, 171, 28, 9, 3, 1, 183, - 28, 9, 3, 1, 78, 28, 9, 3, 1, 198, 28, 9, 3, 1, 209, 28, 9, 3, 1, 135, - 28, 9, 3, 1, 159, 28, 9, 3, 1, 190, 28, 9, 3, 1, 84, 28, 9, 3, 1, 186, - 28, 9, 3, 1, 201, 28, 9, 3, 1, 170, 28, 9, 3, 1, 181, 28, 9, 3, 1, 202, - 28, 27, 244, 173, 239, 115, 28, 83, 240, 234, 239, 115, 28, 83, 240, 238, - 239, 115, 28, 83, 238, 108, 239, 115, 28, 83, 238, 106, 239, 115, 28, 83, - 239, 167, 239, 115, 28, 83, 239, 162, 239, 115, 28, 83, 237, 129, 239, - 115, 28, 83, 238, 105, 239, 115, 28, 83, 238, 107, 239, 115, 28, 83, 240, - 239, 42, 28, 27, 121, 42, 28, 27, 114, 42, 28, 27, 153, 42, 28, 27, 163, - 42, 28, 27, 168, 42, 28, 27, 169, 42, 28, 27, 179, 42, 28, 27, 176, 42, - 28, 27, 178, 42, 28, 83, 249, 18, 56, 60, 117, 236, 182, 56, 60, 82, 236, - 182, 56, 60, 117, 238, 88, 56, 60, 82, 238, 88, 56, 60, 117, 242, 59, - 249, 15, 236, 182, 56, 60, 82, 242, 59, 249, 15, 236, 182, 56, 60, 117, - 242, 59, 249, 15, 238, 88, 56, 60, 82, 242, 59, 249, 15, 238, 88, 56, 60, - 117, 238, 94, 249, 15, 236, 182, 56, 60, 82, 238, 94, 249, 15, 236, 182, - 56, 60, 117, 238, 94, 249, 15, 238, 88, 56, 60, 82, 238, 94, 249, 15, - 238, 88, 56, 60, 117, 79, 18, 184, 56, 60, 79, 117, 18, 37, 242, 64, 56, - 60, 79, 82, 18, 37, 242, 63, 56, 60, 82, 79, 18, 184, 56, 60, 117, 79, - 18, 244, 172, 56, 60, 79, 117, 18, 36, 242, 64, 56, 60, 79, 82, 18, 36, - 242, 63, 56, 60, 82, 79, 18, 244, 172, 56, 60, 117, 75, 18, 184, 56, 60, - 75, 117, 18, 37, 242, 64, 56, 60, 75, 82, 18, 37, 242, 63, 56, 60, 82, - 75, 18, 184, 56, 60, 117, 75, 18, 244, 172, 56, 60, 75, 117, 18, 36, 242, - 64, 56, 60, 75, 82, 18, 36, 242, 63, 56, 60, 82, 75, 18, 244, 172, 56, - 60, 117, 55, 18, 184, 56, 60, 55, 117, 18, 37, 242, 64, 56, 60, 75, 82, - 18, 37, 79, 242, 63, 56, 60, 79, 82, 18, 37, 75, 242, 63, 56, 60, 55, 82, - 18, 37, 242, 63, 56, 60, 79, 117, 18, 37, 75, 242, 64, 56, 60, 75, 117, - 18, 37, 79, 242, 64, 56, 60, 82, 55, 18, 184, 56, 60, 117, 55, 18, 244, - 172, 56, 60, 55, 117, 18, 36, 242, 64, 56, 60, 75, 82, 18, 36, 79, 242, - 63, 56, 60, 79, 82, 18, 36, 75, 242, 63, 56, 60, 55, 82, 18, 36, 242, 63, - 56, 60, 79, 117, 18, 36, 75, 242, 64, 56, 60, 75, 117, 18, 36, 79, 242, - 64, 56, 60, 82, 55, 18, 244, 172, 56, 60, 117, 79, 18, 236, 182, 56, 60, - 36, 82, 18, 37, 79, 242, 63, 56, 60, 37, 82, 18, 36, 79, 242, 63, 56, 60, - 79, 117, 18, 146, 242, 64, 56, 60, 79, 82, 18, 146, 242, 63, 56, 60, 37, - 117, 18, 36, 79, 242, 64, 56, 60, 36, 117, 18, 37, 79, 242, 64, 56, 60, - 82, 79, 18, 236, 182, 56, 60, 117, 75, 18, 236, 182, 56, 60, 36, 82, 18, - 37, 75, 242, 63, 56, 60, 37, 82, 18, 36, 75, 242, 63, 56, 60, 75, 117, - 18, 146, 242, 64, 56, 60, 75, 82, 18, 146, 242, 63, 56, 60, 37, 117, 18, - 36, 75, 242, 64, 56, 60, 36, 117, 18, 37, 75, 242, 64, 56, 60, 82, 75, - 18, 236, 182, 56, 60, 117, 55, 18, 236, 182, 56, 60, 36, 82, 18, 37, 55, - 242, 63, 56, 60, 37, 82, 18, 36, 55, 242, 63, 56, 60, 55, 117, 18, 146, - 242, 64, 56, 60, 75, 82, 18, 79, 146, 242, 63, 56, 60, 79, 82, 18, 75, - 146, 242, 63, 56, 60, 55, 82, 18, 146, 242, 63, 56, 60, 36, 75, 82, 18, - 37, 79, 242, 63, 56, 60, 37, 75, 82, 18, 36, 79, 242, 63, 56, 60, 36, 79, - 82, 18, 37, 75, 242, 63, 56, 60, 37, 79, 82, 18, 36, 75, 242, 63, 56, 60, - 79, 117, 18, 75, 146, 242, 64, 56, 60, 75, 117, 18, 79, 146, 242, 64, 56, - 60, 37, 117, 18, 36, 55, 242, 64, 56, 60, 36, 117, 18, 37, 55, 242, 64, - 56, 60, 82, 55, 18, 236, 182, 56, 60, 117, 42, 249, 15, 236, 182, 56, 60, - 82, 42, 249, 15, 236, 182, 56, 60, 117, 42, 249, 15, 238, 88, 56, 60, 82, - 42, 249, 15, 238, 88, 56, 60, 42, 236, 182, 56, 60, 42, 238, 88, 56, 60, - 79, 242, 66, 18, 37, 240, 222, 56, 60, 79, 42, 18, 37, 240, 226, 56, 60, - 42, 79, 18, 184, 56, 60, 79, 242, 66, 18, 36, 240, 222, 56, 60, 79, 42, - 18, 36, 240, 226, 56, 60, 42, 79, 18, 244, 172, 56, 60, 75, 242, 66, 18, - 37, 240, 222, 56, 60, 75, 42, 18, 37, 240, 226, 56, 60, 42, 75, 18, 184, - 56, 60, 75, 242, 66, 18, 36, 240, 222, 56, 60, 75, 42, 18, 36, 240, 226, - 56, 60, 42, 75, 18, 244, 172, 56, 60, 55, 242, 66, 18, 37, 240, 222, 56, - 60, 55, 42, 18, 37, 240, 226, 56, 60, 42, 55, 18, 184, 56, 60, 55, 242, - 66, 18, 36, 240, 222, 56, 60, 55, 42, 18, 36, 240, 226, 56, 60, 42, 55, - 18, 244, 172, 56, 60, 79, 242, 66, 18, 146, 240, 222, 56, 60, 79, 42, 18, - 146, 240, 226, 56, 60, 42, 79, 18, 236, 182, 56, 60, 75, 242, 66, 18, - 146, 240, 222, 56, 60, 75, 42, 18, 146, 240, 226, 56, 60, 42, 75, 18, - 236, 182, 56, 60, 55, 242, 66, 18, 146, 240, 222, 56, 60, 55, 42, 18, - 146, 240, 226, 56, 60, 42, 55, 18, 236, 182, 56, 60, 117, 253, 133, 79, - 18, 184, 56, 60, 117, 253, 133, 79, 18, 244, 172, 56, 60, 117, 253, 133, - 75, 18, 244, 172, 56, 60, 117, 253, 133, 75, 18, 184, 56, 60, 117, 239, - 125, 156, 37, 139, 149, 244, 172, 56, 60, 117, 239, 125, 156, 36, 139, - 149, 184, 56, 60, 117, 239, 125, 242, 94, 56, 60, 117, 244, 172, 56, 60, - 117, 253, 131, 56, 60, 117, 184, 56, 60, 117, 244, 185, 56, 60, 82, 244, - 172, 56, 60, 82, 253, 131, 56, 60, 82, 184, 56, 60, 82, 244, 185, 56, 60, - 117, 36, 18, 82, 184, 56, 60, 117, 75, 18, 82, 244, 185, 56, 60, 82, 36, - 18, 117, 184, 56, 60, 82, 75, 18, 117, 244, 185, 156, 136, 242, 67, 149, - 253, 101, 242, 111, 242, 67, 149, 253, 101, 240, 224, 242, 67, 149, 244, - 171, 240, 240, 242, 67, 149, 136, 242, 67, 149, 249, 48, 240, 240, 242, - 67, 149, 244, 171, 239, 231, 242, 67, 149, 245, 4, 240, 240, 242, 67, - 213, 242, 67, 36, 245, 4, 240, 240, 242, 67, 36, 244, 171, 239, 231, 242, - 67, 36, 249, 48, 240, 240, 242, 67, 36, 136, 242, 67, 36, 244, 171, 240, - 240, 242, 67, 36, 253, 101, 240, 224, 242, 67, 36, 253, 101, 242, 111, - 242, 67, 37, 136, 242, 67, 117, 242, 187, 242, 82, 242, 187, 250, 208, - 242, 187, 156, 253, 101, 242, 111, 242, 67, 37, 253, 101, 242, 111, 242, - 67, 239, 124, 149, 244, 172, 239, 124, 149, 184, 239, 124, 156, 244, 172, - 239, 124, 156, 36, 18, 149, 36, 18, 149, 184, 239, 124, 156, 36, 18, 149, - 184, 239, 124, 156, 36, 18, 156, 37, 18, 149, 244, 172, 239, 124, 156, - 36, 18, 156, 37, 18, 149, 184, 239, 124, 156, 184, 239, 124, 156, 37, 18, - 149, 244, 172, 239, 124, 156, 37, 18, 149, 36, 18, 149, 184, 86, 240, - 207, 58, 240, 207, 58, 30, 2, 241, 4, 240, 18, 58, 30, 237, 151, 86, 3, - 240, 207, 30, 2, 146, 244, 220, 30, 2, 55, 244, 220, 30, 2, 238, 39, 237, - 153, 244, 220, 30, 2, 156, 36, 139, 149, 37, 244, 220, 30, 2, 156, 37, - 139, 149, 36, 244, 220, 30, 2, 239, 125, 237, 153, 244, 220, 86, 3, 240, - 207, 58, 3, 240, 207, 86, 237, 137, 58, 237, 137, 86, 55, 237, 137, 58, - 55, 237, 137, 86, 235, 202, 58, 235, 202, 86, 236, 192, 219, 58, 236, - 192, 219, 86, 236, 192, 3, 219, 58, 236, 192, 3, 219, 86, 235, 190, 219, - 58, 235, 190, 219, 86, 235, 190, 3, 219, 58, 235, 190, 3, 219, 86, 235, - 190, 239, 173, 58, 235, 190, 239, 173, 86, 235, 241, 219, 58, 235, 241, - 219, 86, 235, 241, 3, 219, 58, 235, 241, 3, 219, 86, 235, 237, 219, 58, - 235, 237, 219, 86, 235, 237, 3, 219, 58, 235, 237, 3, 219, 86, 235, 237, - 239, 173, 58, 235, 237, 239, 173, 86, 239, 132, 58, 239, 132, 58, 240, - 221, 237, 151, 86, 3, 239, 132, 240, 75, 239, 188, 58, 240, 200, 242, - 118, 240, 200, 175, 2, 55, 244, 220, 238, 184, 86, 240, 200, 175, 2, 36, - 136, 231, 231, 175, 2, 37, 136, 231, 231, 175, 2, 149, 136, 231, 231, - 175, 2, 156, 136, 231, 231, 175, 2, 156, 37, 239, 124, 231, 231, 175, 2, - 254, 1, 253, 177, 156, 36, 239, 124, 231, 231, 36, 136, 86, 240, 200, 37, - 136, 86, 240, 200, 241, 0, 240, 215, 241, 0, 58, 240, 200, 156, 136, 241, - 0, 58, 240, 200, 149, 136, 241, 0, 58, 240, 200, 156, 36, 239, 124, 239, - 170, 249, 65, 156, 37, 239, 124, 239, 170, 249, 65, 149, 37, 239, 124, - 239, 170, 249, 65, 149, 36, 239, 124, 239, 170, 249, 65, 156, 136, 240, - 200, 149, 136, 240, 200, 86, 149, 37, 219, 86, 149, 36, 219, 86, 156, 36, - 219, 86, 156, 37, 219, 58, 240, 215, 30, 2, 36, 136, 231, 231, 30, 2, 37, - 136, 231, 231, 30, 2, 156, 36, 239, 125, 136, 231, 231, 30, 2, 149, 37, - 239, 125, 136, 231, 231, 58, 30, 2, 55, 238, 183, 244, 176, 58, 236, 192, - 239, 118, 2, 227, 236, 192, 239, 118, 2, 36, 136, 231, 231, 236, 192, - 239, 118, 2, 37, 136, 231, 231, 244, 222, 240, 200, 58, 30, 2, 156, 36, - 238, 93, 58, 30, 2, 149, 36, 238, 93, 58, 30, 2, 149, 37, 238, 93, 58, - 30, 2, 156, 37, 238, 93, 58, 175, 2, 156, 36, 238, 93, 58, 175, 2, 149, - 36, 238, 93, 58, 175, 2, 149, 37, 238, 93, 58, 175, 2, 156, 37, 238, 93, - 156, 36, 219, 156, 37, 219, 149, 36, 219, 58, 242, 82, 240, 207, 86, 242, - 82, 240, 207, 58, 242, 82, 3, 240, 207, 86, 242, 82, 3, 240, 207, 149, - 37, 219, 86, 254, 71, 2, 245, 168, 243, 71, 239, 107, 240, 166, 243, 74, - 86, 244, 178, 58, 244, 178, 238, 29, 236, 38, 249, 87, 238, 178, 245, - 151, 237, 186, 245, 151, 236, 89, 237, 79, 86, 237, 166, 58, 237, 166, - 242, 137, 249, 47, 242, 137, 56, 2, 242, 201, 242, 137, 56, 2, 170, 240, - 156, 58, 245, 186, 242, 163, 86, 245, 186, 242, 163, 224, 241, 3, 242, - 177, 244, 218, 240, 215, 86, 36, 239, 119, 242, 127, 86, 37, 239, 119, - 242, 127, 58, 36, 239, 119, 242, 127, 58, 75, 239, 119, 242, 127, 58, 37, - 239, 119, 242, 127, 58, 79, 239, 119, 242, 127, 248, 78, 18, 236, 254, - 241, 123, 57, 237, 83, 57, 238, 182, 57, 238, 186, 245, 246, 240, 133, - 242, 94, 254, 31, 249, 32, 244, 234, 137, 239, 43, 244, 234, 137, 238, - 22, 249, 86, 18, 238, 196, 244, 227, 90, 254, 81, 242, 10, 243, 142, 18, - 242, 13, 247, 239, 90, 254, 79, 248, 188, 240, 232, 54, 241, 179, 240, - 232, 54, 247, 52, 240, 232, 54, 244, 236, 240, 232, 54, 240, 181, 240, - 232, 54, 245, 50, 240, 232, 54, 242, 169, 240, 232, 54, 238, 147, 240, - 232, 54, 242, 142, 248, 172, 137, 241, 139, 58, 240, 79, 244, 235, 58, - 241, 81, 244, 235, 86, 241, 81, 244, 235, 58, 254, 71, 2, 245, 168, 245, - 84, 240, 224, 244, 229, 251, 184, 240, 224, 244, 229, 240, 115, 243, 108, - 57, 242, 142, 251, 217, 57, 240, 96, 241, 255, 242, 45, 240, 123, 244, - 38, 243, 33, 242, 31, 241, 174, 241, 121, 251, 188, 244, 141, 243, 203, - 239, 81, 236, 162, 237, 179, 238, 173, 241, 240, 58, 244, 199, 245, 125, - 58, 244, 199, 242, 241, 58, 244, 199, 245, 173, 58, 244, 199, 241, 44, - 58, 244, 199, 241, 63, 58, 244, 199, 245, 158, 86, 244, 199, 245, 125, - 86, 244, 199, 242, 241, 86, 244, 199, 245, 173, 86, 244, 199, 241, 44, - 86, 244, 199, 241, 63, 86, 244, 199, 245, 158, 86, 245, 195, 244, 219, - 58, 244, 218, 244, 219, 58, 240, 221, 244, 219, 86, 249, 199, 244, 219, - 58, 245, 195, 244, 219, 86, 244, 218, 244, 219, 86, 240, 221, 244, 219, - 58, 249, 199, 244, 219, 254, 112, 240, 167, 240, 224, 244, 208, 242, 111, - 244, 208, 242, 198, 242, 111, 242, 233, 242, 198, 238, 127, 242, 233, - 245, 30, 249, 134, 57, 245, 30, 241, 28, 57, 245, 30, 245, 5, 57, 249, - 17, 118, 242, 94, 249, 2, 118, 242, 94, 238, 166, 238, 89, 90, 238, 89, - 13, 54, 244, 128, 238, 99, 238, 89, 13, 54, 244, 129, 238, 99, 238, 89, - 13, 54, 244, 130, 238, 99, 238, 89, 13, 54, 244, 131, 238, 99, 238, 89, - 13, 54, 244, 132, 238, 99, 238, 89, 13, 54, 244, 133, 238, 99, 238, 89, - 13, 54, 244, 134, 238, 99, 238, 89, 13, 54, 241, 175, 238, 31, 86, 238, - 166, 238, 89, 90, 240, 152, 245, 157, 90, 231, 255, 245, 157, 90, 253, - 203, 241, 157, 253, 203, 241, 158, 253, 203, 241, 159, 253, 203, 241, - 160, 253, 203, 241, 161, 253, 203, 241, 162, 58, 175, 2, 49, 184, 58, - 175, 2, 225, 244, 215, 86, 175, 2, 58, 49, 184, 86, 175, 2, 225, 58, 244, - 215, 156, 245, 61, 238, 115, 86, 238, 115, 149, 245, 61, 238, 115, 58, - 238, 115, 238, 132, 240, 105, 57, 252, 196, 243, 95, 238, 169, 239, 7, - 242, 51, 244, 250, 242, 55, 244, 250, 149, 37, 241, 29, 241, 29, 156, 37, - 241, 29, 58, 250, 28, 86, 250, 28, 245, 16, 65, 82, 245, 16, 65, 235, - 191, 170, 82, 235, 191, 170, 242, 137, 170, 82, 242, 137, 170, 239, 159, - 26, 242, 94, 82, 26, 242, 94, 249, 0, 242, 100, 242, 94, 82, 249, 0, 242, - 100, 242, 94, 9, 242, 94, 239, 153, 58, 9, 242, 94, 239, 159, 9, 242, 94, - 241, 204, 242, 94, 249, 86, 137, 243, 83, 249, 28, 234, 63, 238, 77, 249, - 28, 235, 193, 238, 77, 82, 249, 28, 235, 193, 238, 77, 249, 28, 236, 250, - 238, 77, 86, 249, 28, 240, 218, 244, 178, 58, 249, 28, 240, 218, 244, - 178, 242, 188, 239, 159, 58, 244, 178, 28, 58, 244, 178, 249, 0, 242, - 100, 86, 244, 178, 86, 242, 100, 58, 244, 178, 239, 159, 86, 244, 178, - 82, 239, 159, 86, 244, 178, 239, 192, 244, 178, 239, 153, 58, 244, 178, - 82, 238, 77, 249, 0, 242, 100, 238, 77, 244, 207, 244, 96, 238, 77, 244, - 207, 240, 218, 86, 244, 178, 244, 207, 240, 218, 239, 192, 244, 178, 254, - 23, 240, 218, 86, 244, 178, 244, 207, 240, 218, 236, 227, 86, 244, 178, - 82, 244, 207, 240, 218, 236, 227, 86, 244, 178, 243, 17, 240, 218, 86, - 244, 178, 241, 78, 240, 218, 238, 77, 234, 63, 238, 77, 249, 0, 242, 100, - 234, 63, 238, 77, 82, 234, 63, 238, 77, 254, 23, 239, 230, 86, 18, 58, - 238, 110, 86, 238, 110, 58, 238, 110, 244, 207, 239, 230, 239, 159, 86, - 238, 110, 28, 249, 0, 242, 100, 244, 207, 240, 218, 244, 178, 82, 234, - 63, 239, 192, 238, 77, 237, 143, 248, 129, 238, 69, 237, 143, 82, 241, - 124, 237, 143, 239, 237, 82, 239, 237, 235, 193, 238, 77, 244, 207, 234, - 63, 238, 154, 238, 77, 82, 244, 207, 234, 63, 238, 154, 238, 77, 239, - 153, 58, 240, 200, 149, 37, 235, 250, 58, 240, 207, 156, 37, 235, 250, - 58, 240, 207, 149, 37, 239, 153, 58, 240, 207, 156, 37, 239, 153, 58, - 240, 207, 86, 240, 221, 244, 197, 58, 170, 117, 55, 143, 242, 82, 55, - 143, 82, 55, 143, 82, 242, 66, 242, 60, 244, 192, 238, 76, 167, 238, 78, - 82, 242, 66, 244, 192, 238, 76, 167, 238, 78, 82, 42, 242, 60, 244, 192, - 238, 76, 167, 238, 78, 82, 42, 244, 192, 238, 76, 167, 238, 78, 242, 141, - 252, 177, 238, 113, 25, 238, 78, 82, 236, 186, 167, 238, 78, 82, 244, - 218, 236, 186, 167, 238, 78, 82, 86, 242, 178, 241, 3, 82, 86, 244, 218, - 240, 215, 242, 177, 242, 178, 241, 3, 242, 177, 244, 218, 240, 215, 242, - 82, 36, 236, 187, 238, 78, 242, 82, 37, 236, 187, 238, 78, 242, 82, 238, - 140, 36, 236, 187, 238, 78, 242, 82, 238, 140, 37, 236, 187, 238, 78, - 242, 82, 235, 237, 160, 226, 238, 78, 242, 82, 235, 190, 160, 226, 238, - 78, 82, 235, 237, 160, 238, 76, 167, 238, 78, 82, 235, 190, 160, 238, 76, - 167, 238, 78, 82, 235, 237, 160, 226, 238, 78, 82, 235, 190, 160, 226, - 238, 78, 117, 36, 239, 139, 244, 202, 226, 238, 78, 117, 37, 239, 139, - 244, 202, 226, 238, 78, 242, 82, 36, 244, 175, 226, 238, 78, 242, 82, 37, - 244, 175, 226, 238, 78, 240, 201, 239, 115, 28, 27, 121, 240, 201, 239, - 115, 28, 27, 114, 240, 201, 239, 115, 28, 27, 153, 240, 201, 239, 115, - 28, 27, 163, 240, 201, 239, 115, 28, 27, 168, 240, 201, 239, 115, 28, 27, - 169, 240, 201, 239, 115, 28, 27, 179, 240, 201, 239, 115, 28, 27, 176, - 240, 201, 239, 115, 28, 27, 178, 240, 201, 239, 115, 28, 83, 249, 18, - 240, 201, 28, 23, 27, 121, 240, 201, 28, 23, 27, 114, 240, 201, 28, 23, - 27, 153, 240, 201, 28, 23, 27, 163, 240, 201, 28, 23, 27, 168, 240, 201, - 28, 23, 27, 169, 240, 201, 28, 23, 27, 179, 240, 201, 28, 23, 27, 176, - 240, 201, 28, 23, 27, 178, 240, 201, 28, 23, 83, 249, 18, 240, 201, 239, - 115, 28, 23, 27, 121, 240, 201, 239, 115, 28, 23, 27, 114, 240, 201, 239, - 115, 28, 23, 27, 153, 240, 201, 239, 115, 28, 23, 27, 163, 240, 201, 239, - 115, 28, 23, 27, 168, 240, 201, 239, 115, 28, 23, 27, 169, 240, 201, 239, - 115, 28, 23, 27, 179, 240, 201, 239, 115, 28, 23, 27, 176, 240, 201, 239, - 115, 28, 23, 27, 178, 240, 201, 239, 115, 28, 23, 83, 249, 18, 82, 237, - 109, 63, 52, 82, 244, 181, 249, 2, 52, 82, 63, 52, 82, 244, 177, 249, 2, - 52, 240, 60, 244, 180, 63, 52, 82, 236, 161, 63, 52, 234, 65, 63, 52, 82, - 234, 65, 63, 52, 242, 105, 234, 65, 63, 52, 82, 242, 105, 234, 65, 63, - 52, 86, 63, 52, 241, 88, 237, 105, 63, 237, 116, 241, 88, 235, 212, 63, - 237, 116, 86, 63, 237, 116, 82, 86, 242, 141, 220, 18, 63, 52, 82, 86, - 242, 141, 210, 18, 63, 52, 245, 196, 86, 63, 52, 82, 234, 70, 86, 63, 52, - 236, 159, 58, 63, 52, 237, 74, 58, 63, 52, 236, 246, 239, 153, 58, 63, - 52, 236, 129, 239, 153, 58, 63, 52, 82, 149, 235, 192, 58, 63, 52, 82, - 156, 235, 192, 58, 63, 52, 241, 70, 149, 235, 192, 58, 63, 52, 241, 70, - 156, 235, 192, 58, 63, 52, 28, 82, 58, 63, 52, 235, 189, 63, 52, 234, 64, - 244, 181, 249, 2, 52, 234, 64, 63, 52, 234, 64, 244, 177, 249, 2, 52, 82, - 234, 64, 244, 181, 249, 2, 52, 82, 234, 64, 63, 52, 82, 234, 64, 244, - 177, 249, 2, 52, 235, 186, 63, 52, 82, 234, 61, 63, 52, 236, 83, 63, 52, - 82, 236, 83, 63, 52, 236, 29, 63, 52, 58, 240, 221, 2, 241, 13, 227, 18, - 2, 227, 240, 214, 137, 240, 236, 239, 176, 149, 37, 242, 86, 2, 227, 156, - 36, 242, 86, 2, 227, 36, 245, 33, 244, 251, 37, 245, 33, 244, 251, 213, - 245, 33, 244, 251, 244, 222, 75, 244, 184, 244, 222, 79, 244, 184, 36, - 18, 37, 42, 237, 119, 36, 18, 37, 244, 184, 36, 238, 122, 165, 37, 244, - 184, 165, 36, 244, 184, 75, 249, 35, 2, 175, 47, 241, 203, 241, 17, 254, - 216, 146, 248, 43, 58, 235, 244, 239, 132, 58, 235, 244, 240, 221, 2, - 126, 244, 232, 58, 235, 244, 240, 221, 2, 63, 244, 232, 58, 30, 2, 126, - 244, 232, 58, 30, 2, 63, 244, 232, 8, 36, 58, 30, 110, 8, 37, 58, 30, - 110, 8, 36, 160, 110, 8, 37, 160, 110, 8, 36, 42, 160, 110, 8, 37, 42, - 160, 110, 210, 238, 94, 52, 220, 238, 94, 52, 235, 236, 242, 215, 175, - 52, 238, 87, 242, 215, 175, 52, 37, 59, 2, 28, 244, 212, 165, 126, 52, - 165, 63, 52, 165, 36, 37, 52, 165, 126, 42, 52, 165, 63, 42, 52, 165, 36, - 37, 42, 52, 165, 126, 59, 248, 254, 143, 165, 63, 59, 248, 254, 143, 165, - 126, 42, 59, 248, 254, 143, 165, 63, 42, 59, 248, 254, 143, 165, 63, 239, - 196, 52, 32, 33, 243, 46, 32, 33, 241, 142, 32, 33, 241, 143, 32, 33, - 240, 32, 32, 33, 241, 144, 32, 33, 240, 33, 32, 33, 240, 39, 32, 33, 238, - 204, 32, 33, 241, 145, 32, 33, 240, 34, 32, 33, 240, 40, 32, 33, 238, - 205, 32, 33, 240, 45, 32, 33, 238, 210, 32, 33, 238, 225, 32, 33, 237, - 188, 32, 33, 241, 146, 32, 33, 240, 35, 32, 33, 240, 41, 32, 33, 238, - 206, 32, 33, 240, 46, 32, 33, 238, 211, 32, 33, 238, 226, 32, 33, 237, - 189, 32, 33, 240, 50, 32, 33, 238, 215, 32, 33, 238, 230, 32, 33, 237, - 193, 32, 33, 238, 240, 32, 33, 237, 203, 32, 33, 237, 223, 32, 33, 237, - 2, 32, 33, 241, 147, 32, 33, 240, 36, 32, 33, 240, 42, 32, 33, 238, 207, - 32, 33, 240, 47, 32, 33, 238, 212, 32, 33, 238, 227, 32, 33, 237, 190, - 32, 33, 240, 51, 32, 33, 238, 216, 32, 33, 238, 231, 32, 33, 237, 194, - 32, 33, 238, 241, 32, 33, 237, 204, 32, 33, 237, 224, 32, 33, 237, 3, 32, - 33, 240, 54, 32, 33, 238, 219, 32, 33, 238, 234, 32, 33, 237, 197, 32, - 33, 238, 244, 32, 33, 237, 207, 32, 33, 237, 227, 32, 33, 237, 6, 32, 33, - 238, 250, 32, 33, 237, 213, 32, 33, 237, 233, 32, 33, 237, 12, 32, 33, - 237, 243, 32, 33, 237, 22, 32, 33, 237, 37, 32, 33, 236, 98, 32, 33, 241, - 148, 32, 33, 240, 37, 32, 33, 240, 43, 32, 33, 238, 208, 32, 33, 240, 48, - 32, 33, 238, 213, 32, 33, 238, 228, 32, 33, 237, 191, 32, 33, 240, 52, - 32, 33, 238, 217, 32, 33, 238, 232, 32, 33, 237, 195, 32, 33, 238, 242, - 32, 33, 237, 205, 32, 33, 237, 225, 32, 33, 237, 4, 32, 33, 240, 55, 32, - 33, 238, 220, 32, 33, 238, 235, 32, 33, 237, 198, 32, 33, 238, 245, 32, - 33, 237, 208, 32, 33, 237, 228, 32, 33, 237, 7, 32, 33, 238, 251, 32, 33, - 237, 214, 32, 33, 237, 234, 32, 33, 237, 13, 32, 33, 237, 244, 32, 33, - 237, 23, 32, 33, 237, 38, 32, 33, 236, 99, 32, 33, 240, 57, 32, 33, 238, - 222, 32, 33, 238, 237, 32, 33, 237, 200, 32, 33, 238, 247, 32, 33, 237, - 210, 32, 33, 237, 230, 32, 33, 237, 9, 32, 33, 238, 253, 32, 33, 237, - 216, 32, 33, 237, 236, 32, 33, 237, 15, 32, 33, 237, 246, 32, 33, 237, - 25, 32, 33, 237, 40, 32, 33, 236, 101, 32, 33, 239, 0, 32, 33, 237, 219, - 32, 33, 237, 239, 32, 33, 237, 18, 32, 33, 237, 249, 32, 33, 237, 28, 32, - 33, 237, 43, 32, 33, 236, 104, 32, 33, 237, 253, 32, 33, 237, 32, 32, 33, - 237, 47, 32, 33, 236, 108, 32, 33, 237, 52, 32, 33, 236, 113, 32, 33, - 236, 119, 32, 33, 236, 12, 32, 33, 241, 149, 32, 33, 240, 38, 32, 33, - 240, 44, 32, 33, 238, 209, 32, 33, 240, 49, 32, 33, 238, 214, 32, 33, - 238, 229, 32, 33, 237, 192, 32, 33, 240, 53, 32, 33, 238, 218, 32, 33, - 238, 233, 32, 33, 237, 196, 32, 33, 238, 243, 32, 33, 237, 206, 32, 33, - 237, 226, 32, 33, 237, 5, 32, 33, 240, 56, 32, 33, 238, 221, 32, 33, 238, - 236, 32, 33, 237, 199, 32, 33, 238, 246, 32, 33, 237, 209, 32, 33, 237, - 229, 32, 33, 237, 8, 32, 33, 238, 252, 32, 33, 237, 215, 32, 33, 237, - 235, 32, 33, 237, 14, 32, 33, 237, 245, 32, 33, 237, 24, 32, 33, 237, 39, - 32, 33, 236, 100, 32, 33, 240, 58, 32, 33, 238, 223, 32, 33, 238, 238, - 32, 33, 237, 201, 32, 33, 238, 248, 32, 33, 237, 211, 32, 33, 237, 231, - 32, 33, 237, 10, 32, 33, 238, 254, 32, 33, 237, 217, 32, 33, 237, 237, - 32, 33, 237, 16, 32, 33, 237, 247, 32, 33, 237, 26, 32, 33, 237, 41, 32, - 33, 236, 102, 32, 33, 239, 1, 32, 33, 237, 220, 32, 33, 237, 240, 32, 33, - 237, 19, 32, 33, 237, 250, 32, 33, 237, 29, 32, 33, 237, 44, 32, 33, 236, - 105, 32, 33, 237, 254, 32, 33, 237, 33, 32, 33, 237, 48, 32, 33, 236, - 109, 32, 33, 237, 53, 32, 33, 236, 114, 32, 33, 236, 120, 32, 33, 236, - 13, 32, 33, 240, 59, 32, 33, 238, 224, 32, 33, 238, 239, 32, 33, 237, - 202, 32, 33, 238, 249, 32, 33, 237, 212, 32, 33, 237, 232, 32, 33, 237, - 11, 32, 33, 238, 255, 32, 33, 237, 218, 32, 33, 237, 238, 32, 33, 237, - 17, 32, 33, 237, 248, 32, 33, 237, 27, 32, 33, 237, 42, 32, 33, 236, 103, - 32, 33, 239, 2, 32, 33, 237, 221, 32, 33, 237, 241, 32, 33, 237, 20, 32, - 33, 237, 251, 32, 33, 237, 30, 32, 33, 237, 45, 32, 33, 236, 106, 32, 33, - 237, 255, 32, 33, 237, 34, 32, 33, 237, 49, 32, 33, 236, 110, 32, 33, - 237, 54, 32, 33, 236, 115, 32, 33, 236, 121, 32, 33, 236, 14, 32, 33, - 239, 3, 32, 33, 237, 222, 32, 33, 237, 242, 32, 33, 237, 21, 32, 33, 237, - 252, 32, 33, 237, 31, 32, 33, 237, 46, 32, 33, 236, 107, 32, 33, 238, 0, - 32, 33, 237, 35, 32, 33, 237, 50, 32, 33, 236, 111, 32, 33, 237, 55, 32, - 33, 236, 116, 32, 33, 236, 122, 32, 33, 236, 15, 32, 33, 238, 1, 32, 33, - 237, 36, 32, 33, 237, 51, 32, 33, 236, 112, 32, 33, 237, 56, 32, 33, 236, - 117, 32, 33, 236, 123, 32, 33, 236, 16, 32, 33, 237, 57, 32, 33, 236, - 118, 32, 33, 236, 124, 32, 33, 236, 17, 32, 33, 236, 125, 32, 33, 236, - 18, 32, 33, 236, 19, 32, 33, 235, 215, 63, 237, 120, 59, 2, 55, 122, 63, - 237, 120, 59, 2, 42, 55, 122, 126, 42, 59, 2, 55, 122, 63, 42, 59, 2, 55, - 122, 36, 37, 42, 59, 2, 55, 122, 63, 237, 120, 59, 248, 254, 143, 126, - 42, 59, 248, 254, 143, 63, 42, 59, 248, 254, 143, 220, 59, 2, 146, 122, - 210, 59, 2, 146, 122, 210, 242, 59, 52, 220, 242, 59, 52, 126, 42, 249, - 15, 52, 63, 42, 249, 15, 52, 126, 242, 59, 249, 15, 52, 63, 242, 59, 249, - 15, 52, 63, 237, 120, 242, 59, 249, 15, 52, 63, 59, 2, 242, 118, 244, - 239, 210, 59, 139, 143, 220, 59, 139, 143, 63, 59, 2, 249, 88, 2, 55, - 122, 63, 59, 2, 249, 88, 2, 42, 55, 122, 63, 237, 120, 59, 2, 244, 182, - 63, 237, 120, 59, 2, 249, 88, 2, 55, 122, 63, 237, 120, 59, 2, 249, 88, - 2, 42, 55, 122, 126, 236, 196, 63, 236, 196, 126, 42, 236, 196, 63, 42, - 236, 196, 126, 59, 139, 86, 239, 132, 63, 59, 139, 86, 239, 132, 126, 59, - 248, 254, 253, 99, 139, 86, 239, 132, 63, 59, 248, 254, 253, 99, 139, 86, - 239, 132, 244, 177, 249, 17, 18, 244, 181, 249, 2, 52, 244, 177, 249, 2, - 18, 244, 181, 249, 17, 52, 244, 177, 249, 17, 59, 2, 128, 244, 177, 249, - 2, 59, 2, 128, 244, 181, 249, 2, 59, 2, 128, 244, 181, 249, 17, 59, 2, - 128, 244, 177, 249, 17, 59, 18, 244, 177, 249, 2, 52, 244, 177, 249, 2, - 59, 18, 244, 181, 249, 2, 52, 244, 181, 249, 2, 59, 18, 244, 181, 249, - 17, 52, 244, 181, 249, 17, 59, 18, 244, 177, 249, 17, 52, 242, 120, 239, - 125, 239, 149, 240, 247, 238, 109, 240, 247, 239, 125, 239, 149, 242, - 120, 238, 109, 244, 181, 249, 2, 59, 239, 149, 244, 177, 249, 2, 52, 244, - 177, 249, 2, 59, 239, 149, 244, 181, 249, 2, 52, 240, 247, 239, 125, 239, - 149, 244, 177, 249, 2, 52, 242, 120, 239, 125, 239, 149, 244, 181, 249, - 2, 52, 244, 177, 249, 2, 59, 239, 149, 244, 177, 249, 17, 52, 244, 177, - 249, 17, 59, 239, 149, 244, 177, 249, 2, 52, 249, 90, 59, 239, 119, 240, - 30, 184, 59, 239, 119, 63, 249, 120, 240, 252, 239, 176, 59, 239, 119, - 63, 249, 120, 240, 252, 237, 121, 59, 239, 119, 220, 249, 120, 240, 252, - 237, 125, 59, 239, 119, 220, 249, 120, 240, 252, 236, 195, 238, 56, 253, - 133, 238, 87, 52, 239, 41, 253, 133, 235, 236, 52, 253, 121, 253, 133, - 235, 236, 52, 242, 80, 253, 133, 235, 236, 52, 253, 121, 253, 133, 238, - 87, 59, 2, 242, 119, 253, 121, 253, 133, 235, 236, 59, 2, 244, 212, 149, - 37, 236, 69, 238, 87, 52, 149, 36, 236, 69, 235, 236, 52, 235, 236, 242, - 77, 175, 52, 238, 87, 242, 77, 175, 52, 63, 59, 53, 207, 126, 52, 126, - 59, 53, 207, 63, 52, 207, 63, 59, 53, 126, 52, 63, 59, 2, 249, 4, 45, - 126, 59, 2, 249, 4, 45, 63, 59, 240, 249, 170, 36, 37, 59, 240, 249, 3, - 240, 200, 210, 237, 120, 59, 248, 254, 3, 240, 200, 36, 133, 75, 37, 133, - 79, 239, 142, 36, 133, 79, 37, 133, 75, 239, 142, 75, 133, 37, 79, 133, - 36, 239, 142, 75, 133, 36, 79, 133, 37, 239, 142, 36, 133, 75, 37, 133, - 75, 239, 142, 75, 133, 37, 79, 133, 37, 239, 142, 36, 133, 79, 37, 133, - 79, 239, 142, 75, 133, 36, 79, 133, 36, 239, 142, 126, 154, 2, 133, 75, - 139, 143, 63, 154, 2, 133, 75, 139, 143, 210, 154, 2, 133, 37, 139, 143, - 220, 154, 2, 133, 37, 139, 143, 126, 154, 2, 133, 79, 139, 143, 63, 154, - 2, 133, 79, 139, 143, 210, 154, 2, 133, 36, 139, 143, 220, 154, 2, 133, - 36, 139, 143, 126, 154, 2, 133, 75, 248, 254, 143, 63, 154, 2, 133, 75, - 248, 254, 143, 210, 154, 2, 133, 37, 248, 254, 143, 220, 154, 2, 133, 37, - 248, 254, 143, 126, 154, 2, 133, 79, 248, 254, 143, 63, 154, 2, 133, 79, - 248, 254, 143, 210, 154, 2, 133, 36, 248, 254, 143, 220, 154, 2, 133, 36, - 248, 254, 143, 126, 154, 2, 133, 75, 53, 126, 154, 2, 133, 244, 185, 210, - 154, 2, 133, 36, 242, 99, 210, 154, 2, 133, 184, 63, 154, 2, 133, 75, 53, - 63, 154, 2, 133, 244, 185, 220, 154, 2, 133, 36, 242, 99, 220, 154, 2, - 133, 184, 126, 154, 2, 133, 75, 53, 63, 154, 2, 133, 253, 131, 126, 154, - 2, 133, 79, 53, 63, 154, 2, 133, 244, 185, 63, 154, 2, 133, 75, 53, 126, - 154, 2, 133, 253, 131, 63, 154, 2, 133, 79, 53, 126, 154, 2, 133, 244, - 185, 126, 154, 2, 133, 75, 53, 165, 244, 189, 126, 154, 2, 133, 79, 244, - 188, 165, 244, 189, 63, 154, 2, 133, 75, 53, 165, 244, 189, 63, 154, 2, - 133, 79, 244, 188, 165, 244, 189, 210, 154, 2, 133, 36, 242, 99, 220, - 154, 2, 133, 184, 220, 154, 2, 133, 36, 242, 99, 210, 154, 2, 133, 184, - 37, 42, 59, 2, 241, 4, 245, 25, 242, 61, 25, 53, 63, 52, 229, 239, 168, - 53, 63, 52, 126, 59, 53, 229, 223, 63, 59, 53, 229, 223, 63, 59, 53, 242, - 93, 80, 76, 206, 53, 126, 52, 126, 59, 240, 249, 237, 110, 196, 53, 63, - 52, 242, 76, 53, 63, 52, 126, 59, 240, 249, 240, 237, 239, 121, 53, 126, - 52, 36, 249, 102, 244, 182, 37, 249, 102, 244, 182, 75, 249, 102, 244, - 182, 79, 249, 102, 244, 182, 242, 59, 55, 253, 99, 237, 185, 255, 27, - 239, 129, 248, 82, 255, 27, 239, 129, 249, 173, 242, 81, 36, 58, 244, - 175, 110, 37, 58, 244, 175, 110, 36, 58, 236, 47, 37, 58, 236, 47, 255, - 27, 239, 129, 36, 244, 211, 110, 255, 27, 239, 129, 37, 244, 211, 110, - 255, 27, 239, 129, 36, 241, 43, 110, 255, 27, 239, 129, 37, 241, 43, 110, - 36, 30, 226, 2, 238, 75, 37, 30, 226, 2, 238, 75, 36, 30, 226, 2, 249, - 121, 254, 214, 253, 121, 240, 213, 37, 30, 226, 2, 249, 121, 254, 214, - 242, 80, 240, 213, 36, 30, 226, 2, 249, 121, 254, 214, 242, 80, 240, 213, - 37, 30, 226, 2, 249, 121, 254, 214, 253, 121, 240, 213, 36, 160, 226, 2, - 227, 37, 160, 226, 2, 227, 36, 253, 133, 206, 110, 37, 253, 133, 196, - 110, 42, 36, 253, 133, 196, 110, 42, 37, 253, 133, 206, 110, 36, 86, 239, - 139, 244, 202, 110, 37, 86, 239, 139, 244, 202, 110, 242, 118, 242, 143, - 55, 242, 193, 244, 176, 239, 136, 160, 240, 236, 244, 172, 37, 160, 242, - 49, 2, 240, 207, 239, 136, 37, 160, 2, 227, 160, 2, 255, 29, 240, 235, - 244, 196, 242, 117, 238, 128, 160, 240, 236, 244, 172, 238, 128, 160, - 240, 236, 253, 131, 242, 60, 242, 117, 224, 242, 117, 160, 2, 238, 75, - 224, 160, 2, 238, 75, 241, 2, 160, 240, 236, 253, 131, 241, 2, 160, 240, - 236, 244, 185, 239, 136, 160, 2, 249, 0, 253, 176, 242, 112, 254, 214, - 59, 239, 119, 75, 18, 184, 239, 136, 160, 2, 249, 0, 253, 176, 242, 112, - 254, 214, 59, 239, 119, 75, 18, 244, 172, 239, 136, 160, 2, 249, 0, 253, - 176, 242, 112, 254, 214, 59, 239, 119, 79, 18, 184, 239, 136, 160, 2, - 249, 0, 253, 176, 242, 112, 254, 214, 59, 239, 119, 79, 18, 244, 172, - 239, 136, 160, 2, 249, 0, 253, 176, 242, 112, 254, 214, 59, 239, 119, 37, - 18, 253, 131, 239, 136, 160, 2, 249, 0, 253, 176, 242, 112, 254, 214, 59, - 239, 119, 36, 18, 253, 131, 239, 136, 160, 2, 249, 0, 253, 176, 242, 112, - 254, 214, 59, 239, 119, 37, 18, 244, 185, 239, 136, 160, 2, 249, 0, 253, - 176, 242, 112, 254, 214, 59, 239, 119, 36, 18, 244, 185, 224, 244, 216, - 250, 69, 244, 216, 253, 232, 2, 239, 130, 244, 216, 253, 232, 2, 3, 175, - 47, 244, 216, 253, 232, 2, 37, 59, 47, 244, 216, 253, 232, 2, 36, 59, 47, - 175, 2, 146, 143, 28, 55, 143, 28, 238, 124, 28, 240, 219, 239, 144, 28, - 235, 225, 175, 241, 17, 254, 216, 146, 253, 99, 18, 253, 121, 136, 241, - 17, 254, 216, 55, 143, 175, 2, 236, 171, 170, 28, 231, 236, 239, 156, 57, - 75, 59, 240, 249, 240, 200, 28, 58, 240, 215, 28, 240, 215, 28, 237, 110, - 28, 235, 235, 175, 2, 3, 175, 139, 253, 173, 184, 175, 2, 225, 146, 242, - 24, 139, 253, 173, 184, 240, 227, 242, 120, 239, 125, 242, 91, 240, 227, - 240, 247, 239, 125, 242, 91, 240, 227, 238, 77, 240, 227, 3, 240, 200, - 240, 227, 240, 207, 225, 242, 160, 240, 168, 239, 118, 2, 49, 47, 239, - 118, 2, 238, 75, 255, 29, 254, 214, 219, 239, 118, 2, 242, 246, 254, 228, - 241, 12, 37, 239, 118, 53, 36, 219, 36, 239, 118, 242, 99, 55, 143, 55, - 253, 99, 242, 99, 37, 219, 242, 200, 2, 36, 136, 231, 231, 242, 200, 2, - 37, 136, 231, 231, 86, 241, 45, 244, 241, 2, 36, 136, 231, 231, 244, 241, - 2, 37, 136, 231, 231, 58, 237, 140, 86, 237, 140, 36, 242, 170, 242, 143, - 37, 242, 170, 242, 143, 36, 42, 242, 170, 242, 143, 37, 42, 242, 170, - 242, 143, 238, 18, 238, 121, 254, 192, 249, 25, 238, 121, 240, 91, 241, - 68, 2, 55, 143, 236, 126, 238, 122, 30, 2, 238, 194, 240, 134, 239, 32, - 254, 85, 242, 12, 239, 138, 242, 61, 25, 18, 240, 205, 238, 124, 242, 61, - 25, 18, 240, 205, 239, 160, 2, 229, 47, 238, 111, 139, 18, 240, 205, 238, - 124, 243, 136, 244, 104, 235, 233, 235, 241, 239, 118, 2, 36, 136, 231, - 231, 235, 241, 239, 118, 2, 37, 136, 231, 231, 86, 240, 221, 2, 79, 52, - 86, 239, 188, 58, 175, 2, 79, 52, 86, 175, 2, 79, 52, 236, 50, 58, 240, - 207, 236, 50, 86, 240, 207, 236, 50, 58, 239, 132, 236, 50, 86, 239, 132, - 236, 50, 58, 240, 200, 236, 50, 86, 240, 200, 236, 31, 240, 219, 240, - 230, 223, 240, 230, 2, 239, 130, 240, 219, 240, 230, 2, 146, 122, 253, - 202, 239, 144, 253, 202, 240, 219, 239, 144, 42, 244, 212, 242, 59, 244, - 212, 235, 237, 242, 141, 160, 110, 235, 190, 242, 141, 160, 110, 248, - 131, 247, 97, 244, 186, 28, 49, 223, 244, 186, 28, 249, 4, 223, 244, 186, - 28, 244, 241, 223, 244, 186, 244, 206, 239, 168, 2, 227, 244, 186, 244, - 206, 239, 168, 2, 244, 212, 244, 186, 30, 236, 48, 223, 244, 186, 30, - 244, 206, 223, 225, 240, 202, 18, 223, 225, 240, 202, 112, 223, 244, 186, - 244, 241, 223, 243, 229, 225, 252, 179, 238, 131, 2, 238, 86, 238, 94, - 239, 135, 223, 243, 114, 250, 41, 238, 86, 239, 135, 2, 42, 122, 239, - 135, 241, 105, 2, 242, 91, 236, 249, 239, 22, 235, 236, 236, 138, 217, - 236, 201, 2, 236, 226, 250, 42, 242, 171, 245, 36, 217, 236, 201, 2, 236, - 69, 250, 42, 242, 171, 245, 36, 217, 236, 201, 141, 239, 31, 253, 173, - 245, 36, 239, 135, 242, 171, 119, 244, 180, 223, 238, 49, 239, 135, 223, - 239, 135, 2, 126, 59, 2, 128, 239, 135, 2, 244, 241, 57, 239, 135, 2, - 235, 238, 239, 135, 2, 242, 109, 239, 135, 2, 239, 130, 239, 135, 2, 238, - 75, 244, 251, 244, 222, 36, 239, 118, 223, 255, 27, 239, 129, 242, 185, - 236, 75, 255, 27, 239, 129, 242, 185, 241, 239, 255, 27, 239, 129, 242, - 185, 237, 81, 249, 4, 25, 2, 3, 175, 47, 249, 4, 25, 2, 157, 230, 47, - 249, 4, 25, 2, 229, 47, 249, 4, 25, 2, 49, 45, 249, 4, 25, 2, 229, 45, - 249, 4, 25, 2, 238, 83, 114, 249, 4, 25, 2, 86, 219, 244, 197, 25, 2, - 244, 192, 47, 244, 197, 25, 2, 49, 45, 244, 197, 25, 2, 240, 247, 244, - 215, 244, 197, 25, 2, 242, 120, 244, 215, 249, 4, 25, 254, 214, 36, 136, - 240, 200, 249, 4, 25, 254, 214, 37, 136, 240, 200, 244, 139, 112, 244, - 234, 239, 138, 235, 191, 25, 2, 49, 47, 235, 191, 25, 2, 238, 75, 237, - 128, 241, 244, 2, 242, 80, 241, 128, 245, 193, 239, 138, 235, 191, 25, - 254, 214, 36, 136, 240, 200, 235, 191, 25, 254, 214, 37, 136, 240, 200, - 28, 235, 191, 25, 2, 157, 240, 203, 235, 191, 25, 254, 214, 42, 240, 200, - 28, 239, 156, 57, 249, 4, 25, 254, 214, 219, 244, 197, 25, 254, 214, 219, - 235, 191, 25, 254, 214, 219, 239, 218, 239, 138, 239, 76, 239, 218, 239, - 138, 255, 27, 239, 129, 238, 53, 236, 75, 236, 84, 112, 237, 152, 236, - 48, 2, 227, 244, 206, 2, 244, 197, 57, 244, 206, 2, 239, 130, 236, 48, 2, - 239, 130, 236, 48, 2, 240, 202, 249, 46, 244, 206, 2, 240, 202, 253, 186, - 244, 206, 53, 235, 238, 236, 48, 53, 242, 109, 244, 206, 53, 253, 99, 53, - 235, 238, 236, 48, 53, 253, 99, 53, 242, 109, 244, 206, 242, 99, 18, 242, - 160, 2, 242, 109, 236, 48, 242, 99, 18, 242, 160, 2, 235, 238, 242, 77, - 244, 206, 2, 241, 76, 242, 77, 236, 48, 2, 241, 76, 42, 30, 235, 238, 42, - 30, 242, 109, 242, 77, 244, 206, 2, 242, 246, 18, 245, 193, 239, 138, - 240, 202, 18, 2, 49, 47, 240, 202, 112, 2, 49, 47, 42, 240, 202, 249, 46, - 42, 240, 202, 253, 186, 225, 236, 76, 240, 202, 249, 46, 225, 236, 76, - 240, 202, 253, 186, 241, 79, 244, 222, 253, 186, 241, 79, 244, 222, 249, - 46, 240, 202, 112, 236, 221, 240, 202, 249, 46, 240, 202, 18, 2, 242, 65, - 244, 239, 240, 202, 112, 2, 242, 65, 244, 239, 240, 202, 18, 2, 146, 244, - 189, 240, 202, 112, 2, 146, 244, 189, 240, 202, 18, 2, 42, 239, 130, 240, - 202, 18, 2, 238, 75, 240, 202, 18, 2, 42, 238, 75, 3, 254, 199, 2, 238, - 75, 240, 202, 112, 2, 42, 239, 130, 240, 202, 112, 2, 42, 238, 75, 255, - 27, 239, 129, 243, 94, 232, 15, 255, 27, 239, 129, 248, 19, 232, 15, 242, - 61, 25, 2, 49, 45, 238, 111, 2, 49, 47, 242, 59, 146, 253, 99, 2, 42, 55, - 122, 242, 59, 146, 253, 99, 2, 242, 59, 55, 122, 229, 239, 168, 2, 49, - 47, 229, 239, 168, 2, 242, 120, 244, 215, 240, 225, 244, 197, 240, 163, - 238, 192, 2, 49, 47, 242, 61, 2, 238, 77, 242, 93, 80, 139, 2, 157, 240, - 203, 235, 239, 80, 112, 80, 76, 242, 61, 25, 53, 249, 4, 57, 249, 4, 25, - 53, 242, 61, 57, 242, 61, 25, 53, 229, 223, 42, 244, 214, 242, 88, 225, - 236, 212, 242, 61, 243, 0, 244, 171, 236, 212, 242, 61, 243, 0, 242, 61, - 25, 2, 225, 248, 253, 53, 18, 225, 248, 253, 45, 237, 113, 2, 249, 28, - 248, 253, 47, 206, 2, 175, 240, 235, 196, 2, 175, 240, 235, 206, 2, 239, - 126, 167, 47, 196, 2, 239, 126, 167, 47, 206, 112, 240, 205, 80, 76, 196, - 112, 240, 205, 80, 76, 206, 112, 240, 205, 80, 139, 2, 49, 240, 235, 196, - 112, 240, 205, 80, 139, 2, 49, 240, 235, 206, 112, 240, 205, 80, 139, 2, - 49, 47, 196, 112, 240, 205, 80, 139, 2, 49, 47, 206, 112, 240, 205, 80, - 139, 2, 49, 53, 184, 196, 112, 240, 205, 80, 139, 2, 49, 53, 244, 172, - 206, 112, 236, 53, 196, 112, 236, 53, 206, 18, 236, 193, 141, 80, 76, - 196, 18, 236, 193, 141, 80, 76, 206, 18, 141, 236, 53, 196, 18, 141, 236, - 53, 206, 53, 236, 188, 80, 53, 235, 235, 196, 53, 236, 188, 80, 53, 237, - 110, 206, 53, 240, 225, 112, 242, 88, 196, 53, 240, 225, 112, 242, 88, - 206, 53, 240, 225, 53, 235, 235, 196, 53, 240, 225, 53, 237, 110, 206, - 53, 196, 53, 236, 188, 242, 88, 196, 53, 206, 53, 236, 188, 242, 88, 206, - 53, 240, 205, 80, 53, 196, 53, 240, 205, 242, 88, 196, 53, 240, 205, 80, - 53, 206, 53, 240, 205, 242, 88, 240, 205, 80, 139, 112, 237, 110, 240, - 205, 80, 139, 112, 235, 235, 240, 205, 80, 139, 112, 206, 2, 49, 240, - 235, 240, 205, 80, 139, 112, 196, 2, 49, 240, 235, 236, 188, 80, 139, - 112, 237, 110, 236, 188, 80, 139, 112, 235, 235, 236, 188, 240, 205, 80, - 139, 112, 237, 110, 236, 188, 240, 205, 80, 139, 112, 235, 235, 240, 225, - 112, 237, 110, 240, 225, 112, 235, 235, 240, 225, 53, 206, 53, 242, 61, - 57, 240, 225, 53, 196, 53, 242, 61, 57, 42, 242, 148, 237, 110, 42, 242, - 148, 235, 235, 42, 242, 148, 206, 2, 238, 75, 196, 236, 221, 237, 110, - 196, 242, 99, 237, 110, 206, 242, 77, 254, 216, 242, 203, 196, 242, 77, - 254, 216, 242, 203, 206, 242, 77, 254, 216, 245, 72, 53, 240, 205, 242, - 88, 196, 242, 77, 254, 216, 245, 72, 53, 240, 205, 242, 88, 241, 80, 245, - 47, 242, 230, 245, 47, 241, 80, 249, 166, 112, 80, 76, 242, 230, 249, - 166, 112, 80, 76, 242, 61, 25, 2, 246, 34, 47, 239, 143, 53, 236, 193, - 242, 61, 57, 239, 145, 53, 236, 193, 242, 61, 57, 239, 143, 53, 236, 193, - 141, 80, 76, 239, 145, 53, 236, 193, 141, 80, 76, 239, 143, 53, 242, 61, - 57, 239, 145, 53, 242, 61, 57, 239, 143, 53, 141, 80, 76, 239, 145, 53, - 141, 80, 76, 239, 143, 53, 242, 93, 80, 76, 239, 145, 53, 242, 93, 80, - 76, 239, 143, 53, 141, 242, 93, 80, 76, 239, 145, 53, 141, 242, 93, 80, - 76, 42, 238, 126, 42, 238, 130, 242, 76, 2, 227, 239, 121, 2, 227, 242, - 76, 2, 249, 4, 25, 45, 239, 121, 2, 249, 4, 25, 45, 242, 76, 2, 235, 191, - 25, 45, 239, 121, 2, 235, 191, 25, 45, 242, 76, 137, 112, 80, 139, 2, 49, - 47, 239, 121, 137, 112, 80, 139, 2, 49, 47, 242, 76, 137, 53, 242, 61, - 57, 239, 121, 137, 53, 242, 61, 57, 242, 76, 137, 53, 229, 223, 239, 121, - 137, 53, 229, 223, 242, 76, 137, 53, 242, 93, 80, 76, 239, 121, 137, 53, - 242, 93, 80, 76, 242, 76, 137, 53, 141, 80, 76, 239, 121, 137, 53, 141, - 80, 76, 30, 36, 249, 0, 56, 223, 30, 37, 249, 0, 56, 223, 242, 77, 240, - 237, 242, 77, 238, 116, 242, 77, 242, 76, 112, 80, 76, 242, 77, 239, 121, - 112, 80, 76, 242, 76, 53, 238, 116, 239, 121, 53, 240, 237, 242, 76, 53, - 240, 237, 239, 121, 53, 238, 116, 239, 121, 242, 99, 240, 237, 239, 121, - 242, 99, 18, 242, 160, 254, 216, 249, 15, 2, 240, 237, 240, 214, 137, - 240, 236, 237, 121, 239, 62, 2, 254, 190, 249, 168, 237, 106, 235, 238, - 240, 77, 237, 78, 207, 36, 244, 184, 207, 79, 244, 184, 207, 75, 244, - 184, 236, 30, 2, 159, 55, 253, 99, 242, 59, 37, 237, 119, 42, 55, 253, - 99, 36, 237, 119, 55, 253, 99, 42, 36, 237, 119, 42, 55, 253, 99, 42, 36, - 237, 119, 165, 249, 15, 248, 254, 36, 243, 219, 137, 42, 238, 88, 207, - 79, 249, 35, 2, 239, 130, 207, 75, 249, 35, 2, 238, 75, 207, 75, 249, 35, - 53, 207, 79, 244, 184, 42, 79, 244, 184, 42, 75, 244, 184, 42, 242, 114, - 141, 57, 224, 42, 242, 114, 141, 57, 249, 41, 141, 243, 93, 2, 224, 240, - 122, 242, 91, 55, 217, 2, 175, 47, 55, 217, 2, 175, 45, 79, 249, 35, 2, - 175, 45, 239, 160, 2, 146, 122, 239, 160, 2, 229, 223, 242, 59, 55, 253, - 99, 242, 199, 238, 114, 242, 59, 55, 253, 99, 2, 146, 122, 242, 59, 244, - 214, 223, 242, 59, 242, 148, 237, 110, 242, 59, 242, 148, 235, 235, 236, - 188, 240, 205, 206, 112, 80, 76, 236, 188, 240, 205, 196, 112, 80, 76, - 242, 59, 240, 230, 242, 199, 238, 114, 244, 222, 242, 59, 55, 253, 99, - 223, 42, 240, 230, 223, 58, 55, 143, 244, 186, 58, 55, 143, 7, 22, 241, - 248, 7, 22, 242, 175, 7, 22, 242, 165, 121, 7, 22, 242, 165, 114, 7, 22, - 242, 165, 153, 7, 22, 241, 237, 7, 22, 249, 47, 7, 22, 243, 7, 7, 22, - 245, 126, 121, 7, 22, 245, 126, 114, 7, 22, 236, 213, 7, 22, 245, 178, 7, - 22, 3, 121, 7, 22, 3, 114, 7, 22, 249, 105, 121, 7, 22, 249, 105, 114, 7, - 22, 249, 105, 153, 7, 22, 249, 105, 163, 7, 22, 244, 91, 7, 22, 241, 87, - 7, 22, 245, 194, 121, 7, 22, 245, 194, 114, 7, 22, 244, 218, 121, 7, 22, - 244, 218, 114, 7, 22, 244, 250, 7, 22, 249, 158, 7, 22, 243, 64, 7, 22, - 249, 87, 7, 22, 244, 229, 7, 22, 242, 207, 7, 22, 241, 217, 7, 22, 238, - 190, 7, 22, 245, 220, 121, 7, 22, 245, 220, 114, 7, 22, 244, 236, 7, 22, - 254, 65, 121, 7, 22, 254, 65, 114, 7, 22, 237, 130, 136, 250, 94, 243, - 13, 7, 22, 249, 201, 7, 22, 249, 215, 7, 22, 245, 114, 7, 22, 249, 192, - 137, 242, 202, 7, 22, 249, 220, 7, 22, 243, 3, 121, 7, 22, 243, 3, 114, - 7, 22, 241, 41, 7, 22, 245, 44, 7, 22, 236, 44, 245, 44, 7, 22, 253, 243, - 121, 7, 22, 253, 243, 114, 7, 22, 253, 243, 153, 7, 22, 253, 243, 163, 7, - 22, 247, 77, 7, 22, 242, 250, 7, 22, 252, 116, 7, 22, 250, 249, 7, 22, - 250, 37, 7, 22, 245, 64, 121, 7, 22, 245, 64, 114, 7, 22, 245, 139, 7, - 22, 241, 67, 7, 22, 245, 23, 121, 7, 22, 245, 23, 114, 7, 22, 245, 23, - 153, 7, 22, 243, 11, 7, 22, 239, 210, 7, 22, 249, 17, 121, 7, 22, 249, - 17, 114, 7, 22, 236, 44, 249, 117, 7, 22, 237, 130, 244, 210, 7, 22, 244, - 210, 7, 22, 236, 44, 241, 82, 7, 22, 236, 44, 242, 251, 7, 22, 245, 22, - 7, 22, 236, 44, 245, 66, 7, 22, 237, 130, 245, 218, 7, 22, 249, 176, 121, - 7, 22, 249, 176, 114, 7, 22, 245, 70, 7, 22, 236, 44, 245, 100, 7, 22, - 165, 121, 7, 22, 165, 114, 7, 22, 236, 44, 245, 133, 7, 22, 236, 44, 245, - 91, 7, 22, 245, 143, 121, 7, 22, 245, 143, 114, 7, 22, 245, 167, 7, 22, - 245, 62, 7, 22, 236, 44, 243, 8, 239, 187, 7, 22, 236, 44, 245, 130, 7, - 22, 236, 44, 245, 50, 7, 22, 236, 44, 249, 224, 7, 22, 254, 8, 121, 7, - 22, 254, 8, 114, 7, 22, 254, 8, 153, 7, 22, 236, 44, 249, 219, 7, 22, - 245, 25, 7, 22, 236, 44, 242, 224, 7, 22, 245, 63, 7, 22, 242, 217, 7, - 22, 236, 44, 245, 85, 7, 22, 236, 44, 245, 14, 7, 22, 236, 44, 245, 177, - 7, 22, 237, 130, 243, 18, 7, 22, 237, 130, 241, 90, 7, 22, 236, 44, 245, - 89, 7, 22, 236, 56, 245, 21, 7, 22, 236, 44, 245, 21, 7, 22, 236, 56, - 242, 191, 7, 22, 236, 44, 242, 191, 7, 22, 236, 56, 241, 19, 7, 22, 236, - 44, 241, 19, 7, 22, 241, 9, 7, 22, 236, 56, 241, 9, 7, 22, 236, 44, 241, - 9, 40, 22, 121, 40, 22, 244, 176, 40, 22, 227, 40, 22, 242, 91, 40, 22, - 242, 3, 40, 22, 128, 40, 22, 114, 40, 22, 251, 195, 40, 22, 249, 146, 40, - 22, 247, 57, 40, 22, 243, 99, 40, 22, 176, 40, 22, 79, 249, 47, 40, 22, - 243, 76, 40, 22, 251, 107, 40, 22, 243, 7, 40, 22, 249, 0, 249, 47, 40, - 22, 243, 191, 40, 22, 244, 40, 40, 22, 248, 174, 40, 22, 244, 97, 40, 22, - 37, 249, 0, 249, 47, 40, 22, 243, 145, 237, 139, 40, 22, 249, 18, 40, 22, - 236, 213, 40, 22, 245, 178, 40, 22, 242, 175, 40, 22, 240, 145, 40, 22, - 243, 26, 40, 22, 243, 231, 40, 22, 237, 139, 40, 22, 242, 142, 40, 22, - 240, 159, 40, 22, 253, 195, 40, 22, 255, 8, 242, 15, 40, 22, 240, 71, 40, - 22, 250, 158, 40, 22, 244, 148, 40, 22, 243, 62, 40, 22, 248, 24, 40, 22, - 246, 251, 40, 22, 243, 2, 40, 22, 247, 53, 40, 22, 241, 130, 40, 22, 242, - 19, 40, 22, 238, 147, 40, 22, 244, 60, 40, 22, 248, 173, 40, 22, 240, - 131, 40, 22, 242, 42, 40, 22, 250, 229, 40, 22, 207, 241, 87, 40, 22, - 242, 118, 242, 175, 40, 22, 165, 242, 23, 40, 22, 225, 243, 143, 40, 22, - 244, 79, 40, 22, 249, 129, 40, 22, 244, 92, 40, 22, 240, 10, 40, 22, 248, - 104, 40, 22, 242, 178, 40, 22, 240, 84, 40, 22, 246, 113, 40, 22, 244, - 250, 40, 22, 241, 117, 40, 22, 249, 158, 40, 22, 242, 1, 40, 22, 241, - 141, 40, 22, 250, 139, 40, 22, 240, 207, 40, 22, 249, 151, 40, 22, 249, - 87, 40, 22, 252, 156, 40, 22, 244, 229, 40, 22, 248, 137, 40, 22, 247, - 51, 40, 22, 189, 40, 22, 242, 207, 40, 22, 242, 54, 40, 22, 254, 240, - 249, 151, 40, 22, 240, 16, 40, 22, 249, 225, 40, 22, 246, 68, 40, 22, - 244, 105, 40, 22, 242, 169, 40, 22, 244, 236, 40, 22, 246, 69, 40, 22, - 241, 163, 40, 22, 42, 170, 40, 22, 136, 250, 94, 243, 13, 40, 22, 244, - 87, 40, 22, 246, 129, 40, 22, 249, 201, 40, 22, 249, 215, 40, 22, 239, - 64, 40, 22, 245, 114, 40, 22, 243, 218, 40, 22, 248, 130, 40, 22, 244, - 107, 40, 22, 247, 67, 40, 22, 252, 246, 40, 22, 243, 110, 40, 22, 249, - 192, 137, 242, 202, 40, 22, 239, 84, 40, 22, 242, 118, 248, 119, 40, 22, - 242, 92, 40, 22, 248, 77, 40, 22, 246, 109, 40, 22, 249, 220, 40, 22, - 244, 95, 40, 22, 52, 40, 22, 244, 106, 40, 22, 242, 18, 40, 22, 244, 123, - 40, 22, 243, 137, 40, 22, 246, 43, 40, 22, 244, 103, 40, 22, 241, 41, 40, - 22, 248, 21, 40, 22, 245, 44, 40, 22, 251, 118, 40, 22, 252, 14, 40, 22, - 242, 250, 40, 22, 240, 73, 40, 22, 250, 37, 40, 22, 249, 46, 40, 22, 247, - 249, 40, 22, 249, 218, 40, 22, 243, 52, 40, 22, 245, 139, 40, 22, 239, - 49, 40, 22, 245, 179, 40, 22, 241, 101, 40, 22, 241, 67, 40, 22, 241, 36, - 40, 22, 241, 229, 40, 22, 246, 30, 40, 22, 239, 86, 40, 22, 243, 73, 40, - 22, 243, 138, 40, 22, 243, 11, 40, 22, 241, 187, 40, 22, 243, 47, 40, 22, - 249, 176, 237, 139, 40, 22, 239, 210, 40, 22, 248, 171, 40, 22, 249, 117, - 40, 22, 244, 210, 40, 22, 241, 82, 40, 22, 242, 47, 40, 22, 246, 18, 40, - 22, 252, 65, 40, 22, 241, 107, 40, 22, 242, 251, 40, 22, 252, 119, 40, - 22, 252, 138, 40, 22, 245, 22, 40, 22, 246, 31, 40, 22, 245, 66, 40, 22, - 241, 114, 40, 22, 240, 119, 40, 22, 245, 218, 40, 22, 245, 70, 40, 22, - 245, 222, 40, 22, 236, 96, 40, 22, 240, 194, 40, 22, 245, 100, 40, 22, - 245, 133, 40, 22, 245, 91, 40, 22, 243, 230, 40, 22, 244, 86, 40, 22, - 207, 244, 109, 245, 14, 40, 22, 245, 167, 40, 22, 245, 62, 40, 22, 244, - 150, 40, 22, 244, 235, 40, 22, 239, 187, 40, 22, 243, 8, 239, 187, 40, - 22, 247, 56, 40, 22, 244, 93, 40, 22, 245, 130, 40, 22, 245, 50, 40, 22, - 249, 224, 40, 22, 249, 219, 40, 22, 245, 25, 40, 22, 239, 21, 40, 22, - 242, 224, 40, 22, 245, 63, 40, 22, 248, 117, 40, 22, 246, 171, 40, 22, - 243, 112, 40, 22, 237, 84, 245, 222, 40, 22, 238, 187, 40, 22, 242, 217, - 40, 22, 245, 85, 40, 22, 245, 14, 40, 22, 245, 177, 40, 22, 246, 102, 40, - 22, 243, 18, 40, 22, 246, 172, 40, 22, 241, 90, 40, 22, 241, 214, 40, 22, - 231, 231, 40, 22, 237, 59, 40, 22, 245, 89, 40, 22, 242, 39, 40, 22, 246, - 115, 40, 22, 250, 61, 40, 22, 247, 180, 40, 22, 245, 21, 40, 22, 242, - 191, 40, 22, 241, 19, 40, 22, 241, 9, 40, 22, 243, 115, 66, 236, 185, 92, - 36, 139, 184, 66, 236, 185, 92, 53, 139, 45, 66, 236, 185, 92, 36, 139, - 242, 65, 18, 184, 66, 236, 185, 92, 53, 139, 242, 65, 18, 45, 66, 236, - 185, 92, 213, 239, 98, 66, 236, 185, 92, 239, 165, 248, 254, 47, 66, 236, - 185, 92, 239, 165, 248, 254, 45, 66, 236, 185, 92, 239, 165, 248, 254, - 244, 172, 66, 236, 185, 92, 239, 165, 248, 254, 156, 244, 172, 66, 236, - 185, 92, 239, 165, 248, 254, 156, 184, 66, 236, 185, 92, 239, 165, 248, - 254, 149, 244, 172, 66, 236, 185, 92, 239, 54, 66, 242, 69, 66, 242, 84, - 66, 213, 189, 246, 110, 65, 240, 95, 238, 20, 239, 239, 90, 66, 238, 101, - 65, 66, 241, 48, 65, 66, 83, 244, 173, 36, 160, 110, 37, 160, 110, 36, - 42, 160, 110, 37, 42, 160, 110, 36, 242, 86, 110, 37, 242, 86, 110, 36, - 58, 242, 86, 110, 37, 58, 242, 86, 110, 36, 86, 237, 126, 110, 37, 86, - 237, 126, 110, 242, 183, 65, 251, 32, 65, 36, 239, 139, 244, 202, 110, - 37, 239, 139, 244, 202, 110, 36, 58, 237, 126, 110, 37, 58, 237, 126, - 110, 36, 58, 239, 139, 244, 202, 110, 37, 58, 239, 139, 244, 202, 110, - 36, 58, 30, 110, 37, 58, 30, 110, 249, 90, 244, 189, 224, 42, 245, 37, - 238, 76, 65, 42, 245, 37, 238, 76, 65, 253, 113, 42, 245, 37, 238, 76, - 65, 242, 183, 167, 244, 235, 239, 134, 151, 121, 239, 134, 151, 114, 239, - 134, 151, 153, 239, 134, 151, 163, 239, 134, 151, 168, 239, 134, 151, - 169, 239, 134, 151, 179, 239, 134, 151, 176, 239, 134, 151, 178, 66, 247, - 58, 249, 5, 65, 66, 242, 120, 249, 5, 65, 66, 238, 119, 249, 5, 65, 66, - 240, 69, 249, 5, 65, 20, 242, 66, 49, 249, 5, 65, 20, 42, 49, 249, 5, 65, - 249, 57, 244, 189, 55, 249, 82, 242, 113, 65, 55, 249, 82, 242, 113, 2, - 242, 116, 244, 205, 65, 55, 249, 82, 242, 113, 167, 156, 244, 217, 55, - 249, 82, 242, 113, 2, 242, 116, 244, 205, 167, 156, 244, 217, 55, 249, - 82, 242, 113, 167, 149, 244, 217, 28, 242, 183, 65, 66, 127, 217, 251, 0, - 238, 158, 90, 239, 134, 151, 249, 18, 239, 134, 151, 240, 239, 239, 134, - 151, 241, 7, 55, 66, 238, 101, 65, 251, 219, 65, 250, 41, 236, 240, 65, - 66, 238, 79, 237, 136, 66, 136, 251, 8, 242, 69, 93, 1, 3, 64, 93, 1, 64, - 93, 1, 3, 69, 93, 1, 69, 93, 1, 3, 84, 93, 1, 84, 93, 1, 3, 70, 93, 1, - 70, 93, 1, 3, 78, 93, 1, 78, 93, 1, 208, 93, 1, 253, 100, 93, 1, 253, - 182, 93, 1, 253, 209, 93, 1, 253, 183, 93, 1, 253, 196, 93, 1, 253, 134, - 93, 1, 253, 207, 93, 1, 253, 155, 93, 1, 253, 195, 93, 1, 253, 97, 93, 1, - 253, 129, 93, 1, 253, 158, 93, 1, 253, 218, 93, 1, 253, 172, 93, 1, 253, - 233, 93, 1, 253, 171, 93, 1, 253, 189, 93, 1, 253, 159, 93, 1, 253, 190, - 93, 1, 253, 91, 93, 1, 253, 93, 93, 1, 253, 174, 93, 1, 253, 165, 93, 1, - 3, 253, 160, 93, 1, 253, 160, 93, 1, 253, 204, 93, 1, 253, 151, 93, 1, - 253, 152, 93, 1, 76, 93, 1, 253, 193, 93, 1, 253, 94, 93, 1, 253, 148, - 93, 1, 253, 112, 93, 1, 253, 157, 93, 1, 253, 136, 93, 1, 253, 88, 93, 1, - 253, 110, 93, 1, 253, 90, 93, 1, 253, 154, 93, 1, 253, 236, 93, 1, 253, - 116, 93, 1, 253, 197, 93, 1, 253, 192, 93, 1, 253, 231, 93, 1, 253, 125, - 93, 1, 253, 191, 93, 1, 253, 143, 93, 1, 253, 140, 93, 1, 253, 221, 93, - 1, 253, 187, 93, 1, 221, 93, 1, 253, 156, 93, 1, 253, 114, 93, 1, 253, - 167, 93, 1, 253, 141, 93, 1, 3, 216, 93, 1, 216, 93, 1, 3, 253, 124, 93, - 1, 253, 124, 93, 1, 3, 253, 123, 93, 1, 253, 123, 93, 1, 253, 92, 93, 1, - 253, 169, 93, 1, 253, 170, 93, 1, 253, 150, 93, 1, 253, 144, 93, 1, 3, - 253, 98, 93, 1, 253, 98, 93, 1, 253, 145, 93, 1, 253, 132, 93, 1, 253, - 138, 93, 1, 183, 93, 1, 253, 255, 93, 1, 3, 208, 93, 1, 3, 253, 134, 48, - 232, 3, 242, 116, 244, 205, 65, 48, 232, 3, 236, 205, 244, 205, 65, 232, - 3, 242, 116, 244, 205, 65, 232, 3, 236, 205, 244, 205, 65, 93, 238, 101, - 65, 93, 242, 116, 238, 101, 65, 93, 240, 253, 248, 197, 232, 3, 42, 240, - 241, 39, 1, 3, 64, 39, 1, 64, 39, 1, 3, 69, 39, 1, 69, 39, 1, 3, 84, 39, - 1, 84, 39, 1, 3, 70, 39, 1, 70, 39, 1, 3, 78, 39, 1, 78, 39, 1, 208, 39, - 1, 253, 100, 39, 1, 253, 182, 39, 1, 253, 209, 39, 1, 253, 183, 39, 1, - 253, 196, 39, 1, 253, 134, 39, 1, 253, 207, 39, 1, 253, 155, 39, 1, 253, - 195, 39, 1, 253, 97, 39, 1, 253, 129, 39, 1, 253, 158, 39, 1, 253, 218, - 39, 1, 253, 172, 39, 1, 253, 233, 39, 1, 253, 171, 39, 1, 253, 189, 39, - 1, 253, 159, 39, 1, 253, 190, 39, 1, 253, 91, 39, 1, 253, 93, 39, 1, 253, - 174, 39, 1, 253, 165, 39, 1, 3, 253, 160, 39, 1, 253, 160, 39, 1, 253, - 204, 39, 1, 253, 151, 39, 1, 253, 152, 39, 1, 76, 39, 1, 253, 193, 39, 1, - 253, 94, 39, 1, 253, 148, 39, 1, 253, 112, 39, 1, 253, 157, 39, 1, 253, - 136, 39, 1, 253, 88, 39, 1, 253, 110, 39, 1, 253, 90, 39, 1, 253, 154, - 39, 1, 253, 236, 39, 1, 253, 116, 39, 1, 253, 197, 39, 1, 253, 192, 39, - 1, 253, 231, 39, 1, 253, 125, 39, 1, 253, 191, 39, 1, 253, 143, 39, 1, - 253, 140, 39, 1, 253, 221, 39, 1, 253, 187, 39, 1, 221, 39, 1, 253, 156, - 39, 1, 253, 114, 39, 1, 253, 167, 39, 1, 253, 141, 39, 1, 3, 216, 39, 1, - 216, 39, 1, 3, 253, 124, 39, 1, 253, 124, 39, 1, 3, 253, 123, 39, 1, 253, - 123, 39, 1, 253, 92, 39, 1, 253, 169, 39, 1, 253, 170, 39, 1, 253, 150, - 39, 1, 253, 144, 39, 1, 3, 253, 98, 39, 1, 253, 98, 39, 1, 253, 145, 39, - 1, 253, 132, 39, 1, 253, 138, 39, 1, 183, 39, 1, 253, 255, 39, 1, 3, 208, - 39, 1, 3, 253, 134, 39, 1, 253, 161, 39, 1, 254, 25, 39, 1, 253, 214, 39, - 1, 253, 215, 39, 242, 65, 227, 232, 3, 238, 153, 244, 205, 65, 39, 238, - 101, 65, 39, 242, 116, 238, 101, 65, 39, 240, 253, 247, 39, 134, 1, 199, - 134, 1, 198, 134, 1, 171, 134, 1, 204, 134, 1, 187, 134, 1, 190, 134, 1, - 183, 134, 1, 148, 134, 1, 194, 134, 1, 205, 134, 1, 164, 134, 1, 200, - 134, 1, 209, 134, 1, 170, 134, 1, 254, 211, 134, 1, 254, 94, 134, 1, 254, - 21, 134, 1, 135, 134, 1, 202, 134, 1, 203, 134, 1, 159, 134, 1, 64, 134, - 1, 78, 134, 1, 70, 134, 1, 254, 9, 134, 1, 253, 106, 134, 1, 254, 36, - 134, 1, 253, 109, 134, 1, 253, 247, 134, 1, 253, 235, 134, 1, 253, 166, - 134, 1, 249, 75, 134, 1, 249, 66, 134, 1, 253, 205, 134, 1, 69, 134, 1, - 84, 134, 1, 254, 120, 134, 1, 186, 134, 1, 253, 244, 134, 1, 254, 108, - 20, 1, 240, 242, 20, 1, 236, 59, 20, 1, 236, 63, 20, 1, 242, 131, 20, 1, - 236, 65, 20, 1, 236, 66, 20, 1, 240, 244, 20, 1, 236, 72, 20, 1, 242, - 134, 20, 1, 235, 247, 20, 1, 236, 67, 20, 1, 236, 68, 20, 1, 236, 204, - 20, 1, 235, 197, 20, 1, 235, 196, 20, 1, 236, 57, 20, 1, 242, 129, 20, 1, - 242, 133, 20, 1, 236, 209, 20, 1, 236, 198, 20, 1, 244, 230, 20, 1, 237, - 138, 20, 1, 242, 126, 20, 1, 242, 122, 20, 1, 236, 207, 20, 1, 239, 155, - 20, 1, 239, 158, 20, 1, 239, 166, 20, 1, 239, 161, 20, 1, 242, 125, 20, - 1, 64, 20, 1, 253, 163, 20, 1, 216, 20, 1, 249, 181, 20, 1, 254, 10, 20, - 1, 70, 20, 1, 249, 182, 20, 1, 253, 200, 20, 1, 78, 20, 1, 253, 98, 20, - 1, 249, 175, 20, 1, 253, 142, 20, 1, 253, 123, 20, 1, 84, 20, 1, 249, - 177, 20, 1, 253, 132, 20, 1, 253, 145, 20, 1, 253, 124, 20, 1, 254, 12, - 20, 1, 253, 139, 20, 1, 69, 20, 240, 255, 20, 1, 236, 233, 20, 1, 235, - 246, 20, 1, 236, 220, 20, 1, 235, 201, 20, 1, 231, 250, 20, 1, 236, 1, - 20, 1, 232, 4, 20, 1, 235, 206, 20, 1, 231, 251, 20, 1, 236, 64, 20, 1, - 236, 216, 20, 1, 235, 200, 20, 1, 235, 194, 20, 1, 235, 255, 20, 1, 236, - 0, 20, 1, 231, 248, 20, 1, 231, 249, 20, 1, 236, 77, 20, 1, 235, 205, 20, - 1, 235, 195, 20, 1, 231, 240, 20, 1, 236, 70, 20, 1, 236, 230, 20, 1, - 236, 71, 20, 1, 236, 206, 20, 1, 236, 229, 20, 1, 239, 191, 20, 1, 236, - 208, 20, 1, 238, 134, 20, 1, 235, 210, 20, 1, 232, 5, 20, 1, 232, 14, 20, - 1, 236, 232, 20, 1, 236, 73, 20, 1, 243, 19, 20, 1, 241, 91, 20, 1, 245, - 226, 20, 1, 241, 92, 20, 1, 243, 20, 20, 1, 245, 228, 20, 1, 242, 197, - 20, 1, 241, 100, 66, 237, 111, 241, 202, 65, 66, 237, 111, 240, 219, 65, - 66, 237, 111, 253, 101, 65, 66, 237, 111, 225, 65, 66, 237, 111, 244, - 171, 65, 66, 237, 111, 249, 28, 65, 66, 237, 111, 253, 121, 65, 66, 237, - 111, 242, 65, 65, 66, 237, 111, 242, 80, 65, 66, 237, 111, 245, 84, 65, - 66, 237, 111, 242, 165, 65, 66, 237, 111, 248, 124, 65, 66, 237, 111, - 242, 214, 65, 66, 237, 111, 243, 144, 65, 66, 237, 111, 246, 120, 65, 66, - 237, 111, 254, 55, 65, 134, 1, 253, 192, 134, 1, 253, 218, 134, 1, 253, - 228, 134, 1, 253, 196, 134, 1, 253, 126, 134, 1, 250, 243, 134, 1, 253, - 119, 134, 1, 250, 38, 134, 1, 254, 117, 134, 1, 250, 137, 134, 1, 251, - 112, 134, 1, 252, 240, 134, 1, 254, 115, 134, 1, 252, 18, 134, 1, 245, - 240, 134, 1, 245, 249, 134, 1, 253, 234, 134, 1, 253, 245, 134, 1, 252, - 57, 134, 1, 246, 252, 134, 29, 1, 198, 134, 29, 1, 190, 134, 29, 1, 205, - 134, 29, 1, 164, 39, 1, 3, 253, 183, 39, 1, 3, 253, 158, 39, 1, 3, 253, - 172, 39, 1, 3, 76, 39, 1, 3, 253, 112, 39, 1, 3, 253, 88, 39, 1, 3, 253, - 154, 39, 1, 3, 253, 197, 39, 1, 3, 253, 125, 39, 1, 3, 253, 140, 39, 1, - 3, 253, 114, 39, 1, 3, 253, 92, 39, 1, 3, 253, 169, 39, 1, 3, 253, 170, - 39, 1, 3, 253, 150, 39, 1, 3, 253, 144, 68, 20, 240, 242, 68, 20, 242, - 131, 68, 20, 240, 244, 68, 20, 242, 134, 68, 20, 242, 129, 68, 20, 242, - 133, 68, 20, 244, 230, 68, 20, 242, 126, 68, 20, 242, 122, 68, 20, 239, - 155, 68, 20, 239, 158, 68, 20, 239, 166, 68, 20, 239, 161, 68, 20, 242, - 125, 68, 20, 242, 227, 64, 68, 20, 245, 149, 64, 68, 20, 243, 12, 64, 68, - 20, 245, 171, 64, 68, 20, 245, 142, 64, 68, 20, 245, 160, 64, 68, 20, - 250, 72, 64, 68, 20, 245, 113, 64, 68, 20, 245, 18, 64, 68, 20, 241, 47, - 64, 68, 20, 241, 61, 64, 68, 20, 241, 86, 64, 68, 20, 241, 72, 64, 68, - 20, 245, 108, 64, 68, 20, 245, 18, 84, 68, 97, 121, 68, 97, 114, 68, 97, - 153, 68, 97, 163, 68, 97, 168, 68, 97, 169, 68, 97, 179, 68, 97, 176, 68, - 97, 178, 68, 97, 249, 18, 68, 97, 244, 229, 68, 97, 244, 236, 68, 97, - 242, 169, 68, 97, 245, 223, 68, 97, 242, 231, 68, 97, 242, 142, 68, 97, - 249, 87, 68, 97, 243, 4, 68, 97, 245, 105, 68, 97, 239, 236, 68, 97, 245, - 146, 68, 97, 239, 238, 68, 97, 237, 155, 68, 97, 234, 66, 68, 97, 242, - 229, 68, 97, 238, 54, 68, 97, 246, 41, 68, 97, 243, 5, 68, 97, 237, 165, - 68, 97, 236, 214, 68, 97, 238, 155, 68, 97, 238, 135, 68, 97, 239, 14, - 68, 97, 244, 187, 68, 97, 245, 179, 68, 97, 244, 54, 28, 83, 242, 104, - 121, 28, 83, 242, 104, 114, 28, 83, 242, 104, 153, 28, 83, 242, 104, 163, - 28, 83, 242, 104, 168, 28, 83, 242, 104, 169, 28, 83, 242, 104, 179, 28, - 83, 242, 104, 176, 28, 83, 242, 104, 178, 28, 83, 241, 7, 28, 83, 242, - 108, 121, 28, 83, 242, 108, 114, 28, 83, 242, 108, 153, 28, 83, 242, 108, - 163, 28, 83, 242, 108, 168, 28, 20, 240, 242, 28, 20, 242, 131, 28, 20, - 240, 244, 28, 20, 242, 134, 28, 20, 242, 129, 28, 20, 242, 133, 28, 20, - 244, 230, 28, 20, 242, 126, 28, 20, 242, 122, 28, 20, 239, 155, 28, 20, - 239, 158, 28, 20, 239, 166, 28, 20, 239, 161, 28, 20, 242, 125, 28, 20, - 242, 227, 64, 28, 20, 245, 149, 64, 28, 20, 243, 12, 64, 28, 20, 245, - 171, 64, 28, 20, 245, 142, 64, 28, 20, 245, 160, 64, 28, 20, 250, 72, 64, - 28, 20, 245, 113, 64, 28, 20, 245, 18, 64, 28, 20, 241, 47, 64, 28, 20, - 241, 61, 64, 28, 20, 241, 86, 64, 28, 20, 241, 72, 64, 28, 20, 245, 108, - 64, 243, 193, 239, 239, 90, 28, 97, 121, 28, 97, 114, 28, 97, 153, 28, - 97, 163, 28, 97, 168, 28, 97, 169, 28, 97, 179, 28, 97, 176, 28, 97, 178, - 28, 97, 249, 18, 28, 97, 244, 229, 28, 97, 244, 236, 28, 97, 242, 169, - 28, 97, 245, 223, 28, 97, 242, 231, 28, 97, 242, 142, 28, 97, 249, 87, - 28, 97, 243, 4, 28, 97, 245, 105, 28, 97, 239, 236, 28, 97, 245, 146, 28, - 97, 239, 238, 28, 97, 237, 155, 28, 97, 234, 66, 28, 97, 242, 229, 28, - 97, 242, 4, 28, 97, 247, 76, 28, 97, 241, 164, 28, 97, 239, 97, 28, 97, - 238, 6, 28, 97, 244, 41, 28, 97, 237, 176, 28, 97, 246, 255, 28, 97, 244, - 187, 28, 97, 246, 74, 28, 97, 240, 19, 28, 97, 246, 177, 28, 97, 241, 46, - 28, 97, 251, 206, 28, 97, 244, 172, 28, 97, 184, 28, 97, 239, 48, 28, 97, - 239, 73, 28, 97, 243, 5, 28, 97, 237, 165, 28, 97, 236, 214, 28, 97, 238, - 155, 28, 97, 238, 135, 28, 97, 243, 248, 28, 83, 242, 108, 169, 28, 83, - 242, 108, 179, 28, 83, 242, 108, 176, 28, 83, 242, 108, 178, 28, 83, 242, - 213, 28, 83, 244, 209, 121, 28, 83, 244, 209, 114, 28, 83, 244, 209, 153, - 28, 83, 244, 209, 163, 28, 83, 244, 209, 168, 28, 83, 244, 209, 169, 28, - 83, 244, 209, 179, 28, 83, 244, 209, 176, 28, 83, 244, 209, 178, 28, 83, - 242, 144, 66, 127, 13, 54, 240, 94, 66, 127, 13, 54, 239, 13, 66, 127, - 13, 54, 243, 214, 66, 127, 13, 54, 243, 31, 66, 127, 13, 54, 251, 222, - 66, 127, 13, 54, 247, 20, 66, 127, 13, 54, 247, 19, 66, 127, 13, 54, 241, - 104, 66, 127, 13, 54, 238, 58, 66, 127, 13, 54, 240, 129, 66, 127, 13, - 54, 239, 53, 66, 127, 13, 54, 238, 199, 28, 39, 64, 28, 39, 69, 28, 39, - 84, 28, 39, 70, 28, 39, 78, 28, 39, 208, 28, 39, 253, 182, 28, 39, 253, - 183, 28, 39, 253, 134, 28, 39, 253, 155, 28, 39, 253, 97, 28, 39, 253, - 158, 28, 39, 253, 172, 28, 39, 253, 171, 28, 39, 253, 159, 28, 39, 253, - 91, 28, 39, 253, 174, 28, 39, 253, 160, 28, 39, 253, 151, 28, 39, 76, 28, - 39, 253, 94, 28, 39, 253, 148, 28, 39, 253, 112, 28, 39, 253, 157, 28, - 39, 253, 136, 28, 39, 253, 88, 28, 39, 253, 154, 28, 39, 253, 197, 28, - 39, 253, 125, 28, 39, 253, 140, 28, 39, 221, 28, 39, 253, 156, 28, 39, - 253, 114, 28, 39, 253, 167, 28, 39, 253, 141, 28, 39, 216, 28, 39, 253, - 124, 28, 39, 253, 123, 28, 39, 253, 92, 28, 39, 253, 169, 28, 39, 253, - 170, 28, 39, 253, 150, 28, 39, 253, 144, 28, 39, 253, 98, 28, 39, 253, - 145, 28, 39, 253, 132, 28, 39, 253, 138, 30, 241, 99, 30, 241, 103, 30, - 243, 30, 30, 245, 236, 30, 241, 186, 30, 246, 253, 30, 252, 241, 30, 239, - 10, 30, 243, 96, 30, 247, 233, 30, 247, 234, 30, 243, 182, 30, 240, 98, - 30, 240, 99, 30, 243, 124, 30, 243, 123, 30, 246, 158, 30, 243, 135, 30, - 241, 195, 30, 240, 81, 30, 247, 36, 30, 237, 72, 30, 236, 141, 30, 238, - 25, 30, 241, 178, 30, 238, 12, 30, 238, 27, 30, 240, 102, 30, 243, 186, - 30, 241, 194, 30, 243, 192, 30, 240, 155, 30, 239, 78, 30, 240, 164, 30, - 244, 74, 30, 244, 75, 30, 243, 78, 30, 246, 105, 30, 246, 114, 30, 252, - 213, 30, 247, 110, 30, 244, 4, 30, 243, 141, 30, 239, 55, 30, 244, 23, - 30, 240, 2, 30, 238, 42, 30, 241, 238, 30, 247, 248, 30, 246, 28, 30, - 239, 28, 30, 241, 182, 30, 238, 185, 30, 243, 164, 30, 238, 13, 30, 247, - 241, 30, 241, 236, 30, 241, 181, 30, 244, 31, 30, 244, 28, 30, 243, 41, - 30, 241, 241, 30, 241, 116, 30, 251, 88, 30, 244, 39, 30, 243, 162, 30, - 246, 231, 30, 240, 107, 30, 243, 210, 30, 243, 209, 30, 241, 206, 30, - 240, 109, 30, 240, 116, 30, 247, 98, 30, 238, 33, 30, 245, 29, 30, 240, - 114, 30, 240, 113, 30, 244, 152, 30, 244, 153, 30, 248, 201, 30, 240, - 153, 30, 248, 23, 30, 244, 66, 30, 240, 154, 30, 248, 20, 30, 239, 74, - 30, 244, 146, 66, 127, 13, 54, 249, 6, 244, 173, 66, 127, 13, 54, 249, 6, - 121, 66, 127, 13, 54, 249, 6, 114, 66, 127, 13, 54, 249, 6, 153, 66, 127, - 13, 54, 249, 6, 163, 66, 127, 13, 54, 249, 6, 168, 66, 127, 13, 54, 249, - 6, 169, 66, 127, 13, 54, 249, 6, 179, 66, 127, 13, 54, 249, 6, 176, 66, - 127, 13, 54, 249, 6, 178, 66, 127, 13, 54, 249, 6, 249, 18, 66, 127, 13, - 54, 249, 6, 240, 234, 66, 127, 13, 54, 249, 6, 240, 238, 66, 127, 13, 54, - 249, 6, 238, 108, 66, 127, 13, 54, 249, 6, 238, 106, 66, 127, 13, 54, - 249, 6, 239, 167, 66, 127, 13, 54, 249, 6, 239, 162, 66, 127, 13, 54, - 249, 6, 237, 129, 66, 127, 13, 54, 249, 6, 238, 105, 66, 127, 13, 54, - 249, 6, 238, 107, 66, 127, 13, 54, 249, 6, 240, 239, 66, 127, 13, 54, - 249, 6, 236, 238, 66, 127, 13, 54, 249, 6, 236, 239, 66, 127, 13, 54, - 249, 6, 236, 4, 66, 127, 13, 54, 249, 6, 236, 82, 30, 251, 93, 30, 253, - 93, 30, 253, 109, 30, 143, 30, 254, 163, 30, 254, 165, 30, 253, 238, 249, - 109, 241, 180, 30, 253, 238, 249, 109, 242, 29, 30, 253, 238, 249, 109, - 240, 175, 30, 253, 238, 249, 109, 243, 217, 30, 236, 91, 30, 255, 19, - 245, 245, 30, 253, 94, 30, 254, 219, 64, 30, 221, 30, 208, 30, 254, 124, - 30, 254, 140, 30, 254, 106, 30, 250, 175, 30, 247, 28, 30, 254, 167, 30, - 254, 154, 30, 254, 219, 204, 30, 254, 219, 194, 30, 254, 143, 30, 254, - 50, 30, 254, 114, 30, 251, 153, 30, 251, 230, 30, 251, 37, 30, 252, 207, - 30, 254, 219, 148, 30, 254, 146, 30, 254, 98, 30, 254, 127, 30, 254, 104, - 30, 254, 158, 30, 254, 219, 171, 30, 254, 147, 30, 254, 95, 30, 254, 128, - 30, 254, 251, 239, 163, 30, 254, 244, 239, 163, 30, 255, 39, 239, 163, - 30, 254, 242, 239, 163, 30, 254, 251, 242, 155, 30, 254, 244, 242, 155, - 30, 255, 39, 242, 155, 30, 254, 242, 242, 155, 30, 255, 39, 249, 25, 159, - 30, 255, 39, 249, 25, 255, 29, 239, 163, 30, 253, 90, 30, 251, 169, 30, - 251, 242, 30, 251, 44, 30, 252, 115, 30, 254, 20, 249, 25, 159, 30, 254, - 20, 249, 25, 255, 29, 239, 163, 30, 254, 173, 30, 254, 159, 30, 254, 219, - 159, 30, 254, 148, 30, 254, 174, 30, 254, 58, 30, 254, 219, 186, 30, 254, - 149, 30, 254, 130, 30, 255, 16, 245, 29, 30, 254, 175, 30, 254, 161, 30, - 254, 219, 201, 30, 254, 150, 30, 254, 52, 30, 255, 17, 245, 29, 30, 255, - 38, 250, 35, 30, 255, 39, 250, 35, 30, 253, 234, 30, 254, 90, 30, 254, - 92, 30, 254, 93, 30, 255, 36, 249, 25, 254, 50, 30, 253, 178, 30, 254, - 97, 30, 254, 110, 30, 253, 88, 30, 254, 113, 30, 253, 227, 30, 254, 51, - 30, 254, 242, 240, 12, 30, 254, 129, 30, 254, 135, 30, 254, 136, 30, 251, - 202, 30, 254, 138, 30, 255, 13, 243, 2, 30, 251, 233, 30, 251, 239, 30, - 254, 168, 30, 254, 170, 30, 252, 74, 30, 254, 172, 30, 254, 185, 30, 254, - 72, 30, 254, 202, 66, 127, 13, 54, 253, 89, 121, 66, 127, 13, 54, 253, - 89, 114, 66, 127, 13, 54, 253, 89, 153, 66, 127, 13, 54, 253, 89, 163, - 66, 127, 13, 54, 253, 89, 168, 66, 127, 13, 54, 253, 89, 169, 66, 127, - 13, 54, 253, 89, 179, 66, 127, 13, 54, 253, 89, 176, 66, 127, 13, 54, - 253, 89, 178, 66, 127, 13, 54, 253, 89, 249, 18, 66, 127, 13, 54, 253, - 89, 240, 234, 66, 127, 13, 54, 253, 89, 240, 238, 66, 127, 13, 54, 253, - 89, 238, 108, 66, 127, 13, 54, 253, 89, 238, 106, 66, 127, 13, 54, 253, - 89, 239, 167, 66, 127, 13, 54, 253, 89, 239, 162, 66, 127, 13, 54, 253, - 89, 237, 129, 66, 127, 13, 54, 253, 89, 238, 105, 66, 127, 13, 54, 253, - 89, 238, 107, 66, 127, 13, 54, 253, 89, 240, 239, 66, 127, 13, 54, 253, - 89, 236, 238, 66, 127, 13, 54, 253, 89, 236, 239, 66, 127, 13, 54, 253, - 89, 236, 4, 66, 127, 13, 54, 253, 89, 236, 82, 66, 127, 13, 54, 253, 89, - 236, 177, 66, 127, 13, 54, 253, 89, 237, 107, 66, 127, 13, 54, 253, 89, - 236, 42, 66, 127, 13, 54, 253, 89, 236, 41, 66, 127, 13, 54, 253, 89, - 236, 178, 66, 127, 13, 54, 253, 89, 241, 7, 66, 127, 13, 54, 253, 89, - 237, 104, 6, 4, 254, 119, 6, 4, 254, 121, 6, 4, 69, 6, 4, 254, 116, 6, 4, - 251, 109, 6, 4, 251, 110, 6, 4, 253, 181, 6, 4, 251, 108, 6, 4, 253, 220, - 6, 4, 254, 86, 6, 4, 64, 6, 4, 254, 83, 6, 4, 252, 243, 6, 4, 254, 197, - 6, 4, 252, 242, 6, 4, 254, 17, 6, 4, 254, 164, 6, 4, 78, 6, 4, 254, 63, - 6, 4, 254, 101, 6, 4, 70, 6, 4, 253, 216, 6, 4, 250, 160, 6, 4, 250, 161, - 6, 4, 253, 236, 6, 4, 250, 159, 6, 4, 246, 26, 6, 4, 246, 27, 6, 4, 250, - 157, 6, 4, 246, 25, 6, 4, 250, 142, 6, 4, 250, 143, 6, 4, 253, 110, 6, 4, - 250, 141, 6, 4, 246, 36, 6, 4, 250, 165, 6, 4, 246, 35, 6, 4, 250, 164, - 6, 4, 249, 47, 6, 4, 253, 221, 6, 4, 250, 163, 6, 4, 250, 156, 6, 4, 253, - 191, 6, 4, 250, 153, 6, 4, 250, 167, 6, 4, 250, 168, 6, 4, 253, 192, 6, - 4, 250, 166, 6, 4, 246, 37, 6, 4, 249, 193, 6, 4, 250, 172, 6, 4, 250, - 173, 6, 4, 254, 30, 6, 4, 250, 170, 6, 4, 246, 38, 6, 4, 250, 171, 6, 4, - 252, 68, 6, 4, 252, 69, 6, 4, 253, 116, 6, 4, 252, 67, 6, 4, 247, 247, 6, - 4, 252, 64, 6, 4, 247, 246, 6, 4, 252, 60, 6, 4, 252, 61, 6, 4, 253, 90, - 6, 4, 252, 59, 6, 4, 247, 252, 6, 4, 252, 75, 6, 4, 247, 251, 6, 4, 252, - 72, 6, 4, 252, 73, 6, 4, 253, 187, 6, 4, 252, 71, 6, 4, 250, 48, 6, 4, - 252, 78, 6, 4, 253, 231, 6, 4, 252, 76, 6, 4, 247, 253, 6, 4, 252, 77, 6, - 4, 250, 52, 6, 4, 252, 81, 6, 4, 254, 176, 6, 4, 252, 79, 6, 4, 247, 254, - 6, 4, 252, 80, 6, 4, 246, 5, 6, 4, 246, 6, 6, 4, 250, 146, 6, 4, 246, 4, - 6, 4, 243, 36, 6, 4, 243, 37, 6, 4, 246, 3, 6, 4, 243, 35, 6, 4, 245, - 255, 6, 4, 246, 0, 6, 4, 250, 144, 6, 4, 245, 254, 6, 4, 243, 39, 6, 4, - 246, 10, 6, 4, 243, 38, 6, 4, 246, 8, 6, 4, 246, 9, 6, 4, 250, 147, 6, 4, - 246, 7, 6, 4, 246, 2, 6, 4, 250, 145, 6, 4, 246, 1, 6, 4, 245, 58, 6, 4, - 246, 13, 6, 4, 250, 148, 6, 4, 246, 11, 6, 4, 243, 40, 6, 4, 246, 12, 6, - 4, 246, 15, 6, 4, 246, 16, 6, 4, 250, 149, 6, 4, 246, 14, 6, 4, 247, 115, - 6, 4, 247, 116, 6, 4, 252, 3, 6, 4, 247, 114, 6, 4, 243, 237, 6, 4, 245, - 148, 6, 4, 243, 236, 6, 4, 247, 112, 6, 4, 247, 113, 6, 4, 252, 2, 6, 4, - 247, 111, 6, 4, 247, 118, 6, 4, 247, 119, 6, 4, 252, 4, 6, 4, 247, 117, - 6, 4, 247, 122, 6, 4, 247, 123, 6, 4, 252, 5, 6, 4, 247, 120, 6, 4, 243, - 238, 6, 4, 247, 121, 6, 4, 247, 126, 6, 4, 247, 127, 6, 4, 252, 6, 6, 4, - 247, 124, 6, 4, 243, 239, 6, 4, 247, 125, 6, 4, 246, 204, 6, 4, 246, 205, - 6, 4, 251, 83, 6, 4, 246, 203, 6, 4, 243, 153, 6, 4, 246, 202, 6, 4, 243, - 152, 6, 4, 246, 200, 6, 4, 246, 201, 6, 4, 251, 82, 6, 4, 246, 199, 6, 4, - 243, 155, 6, 4, 246, 209, 6, 4, 243, 154, 6, 4, 246, 207, 6, 4, 246, 208, - 6, 4, 249, 243, 6, 4, 246, 206, 6, 4, 246, 212, 6, 4, 246, 213, 6, 4, - 251, 84, 6, 4, 246, 210, 6, 4, 243, 156, 6, 4, 246, 211, 6, 4, 246, 216, - 6, 4, 251, 85, 6, 4, 246, 214, 6, 4, 243, 157, 6, 4, 246, 215, 6, 4, 251, - 237, 6, 4, 251, 238, 6, 4, 253, 156, 6, 4, 251, 236, 6, 4, 247, 95, 6, 4, - 251, 231, 6, 4, 247, 94, 6, 4, 251, 220, 6, 4, 251, 221, 6, 4, 221, 6, 4, - 251, 218, 6, 4, 247, 104, 6, 4, 247, 105, 6, 4, 251, 243, 6, 4, 247, 103, - 6, 4, 251, 240, 6, 4, 251, 241, 6, 4, 253, 141, 6, 4, 250, 21, 6, 4, 251, - 226, 6, 4, 253, 167, 6, 4, 251, 246, 6, 4, 251, 247, 6, 4, 253, 114, 6, - 4, 251, 244, 6, 4, 247, 106, 6, 4, 251, 245, 6, 4, 251, 250, 6, 4, 251, - 251, 6, 4, 254, 151, 6, 4, 251, 249, 6, 4, 251, 10, 6, 4, 251, 11, 6, 4, - 253, 226, 6, 4, 251, 9, 6, 4, 250, 253, 6, 4, 250, 254, 6, 4, 253, 153, - 6, 4, 250, 252, 6, 4, 251, 14, 6, 4, 254, 13, 6, 4, 251, 13, 6, 4, 251, - 16, 6, 4, 251, 17, 6, 4, 254, 41, 6, 4, 251, 15, 6, 4, 246, 133, 6, 4, - 249, 225, 6, 4, 251, 21, 6, 4, 251, 22, 6, 4, 254, 105, 6, 4, 251, 20, 6, - 4, 252, 255, 6, 4, 253, 0, 6, 4, 254, 25, 6, 4, 252, 254, 6, 4, 248, 165, - 6, 4, 248, 166, 6, 4, 252, 253, 6, 4, 248, 164, 6, 4, 252, 249, 6, 4, - 252, 250, 6, 4, 253, 161, 6, 4, 252, 248, 6, 4, 253, 3, 6, 4, 253, 4, 6, - 4, 253, 215, 6, 4, 253, 2, 6, 4, 252, 252, 6, 4, 250, 103, 6, 4, 253, 6, - 6, 4, 253, 7, 6, 4, 253, 255, 6, 4, 253, 5, 6, 4, 248, 167, 6, 4, 250, - 108, 6, 4, 253, 11, 6, 4, 253, 12, 6, 4, 254, 201, 6, 4, 253, 9, 6, 4, - 248, 168, 6, 4, 253, 10, 6, 4, 250, 219, 6, 4, 250, 220, 6, 4, 253, 165, - 6, 4, 250, 218, 6, 4, 246, 107, 6, 4, 250, 217, 6, 4, 246, 106, 6, 4, - 250, 209, 6, 4, 250, 211, 6, 4, 253, 93, 6, 4, 250, 207, 6, 4, 246, 116, - 6, 4, 250, 231, 6, 4, 227, 6, 4, 250, 227, 6, 4, 253, 193, 6, 4, 250, - 226, 6, 4, 250, 215, 6, 4, 253, 152, 6, 4, 250, 214, 6, 4, 250, 234, 6, - 4, 250, 235, 6, 4, 253, 204, 6, 4, 250, 232, 6, 4, 246, 117, 6, 4, 250, - 233, 6, 4, 252, 210, 6, 4, 252, 211, 6, 4, 253, 174, 6, 4, 252, 209, 6, - 4, 248, 128, 6, 4, 249, 89, 6, 4, 248, 127, 6, 4, 250, 85, 6, 4, 252, - 198, 6, 4, 253, 91, 6, 4, 252, 195, 6, 4, 248, 154, 6, 4, 248, 155, 6, 4, - 252, 220, 6, 4, 248, 153, 6, 4, 252, 214, 6, 4, 252, 215, 6, 4, 76, 6, 4, - 249, 168, 6, 4, 252, 204, 6, 4, 253, 151, 6, 4, 252, 200, 6, 4, 252, 223, - 6, 4, 252, 224, 6, 4, 253, 160, 6, 4, 252, 221, 6, 4, 248, 156, 6, 4, - 252, 222, 6, 4, 246, 92, 6, 4, 246, 93, 6, 4, 249, 210, 6, 4, 246, 91, 6, - 4, 243, 86, 6, 4, 246, 90, 6, 4, 243, 85, 6, 4, 246, 85, 6, 4, 246, 86, - 6, 4, 249, 27, 6, 4, 246, 84, 6, 4, 243, 88, 6, 4, 246, 97, 6, 4, 243, - 87, 6, 4, 246, 95, 6, 4, 246, 96, 6, 4, 249, 211, 6, 4, 246, 94, 6, 4, - 246, 89, 6, 4, 249, 209, 6, 4, 246, 88, 6, 4, 246, 99, 6, 4, 246, 100, 6, - 4, 249, 212, 6, 4, 246, 98, 6, 4, 243, 89, 6, 4, 245, 77, 6, 4, 247, 135, - 6, 4, 247, 136, 6, 4, 252, 9, 6, 4, 247, 134, 6, 4, 243, 240, 6, 4, 247, - 133, 6, 4, 247, 129, 6, 4, 247, 130, 6, 4, 252, 7, 6, 4, 247, 128, 6, 4, - 247, 138, 6, 4, 247, 139, 6, 4, 252, 10, 6, 4, 247, 137, 6, 4, 247, 132, - 6, 4, 252, 8, 6, 4, 247, 131, 6, 4, 247, 142, 6, 4, 247, 143, 6, 4, 252, - 11, 6, 4, 247, 140, 6, 4, 243, 241, 6, 4, 247, 141, 6, 4, 246, 224, 6, 4, - 246, 225, 6, 4, 251, 87, 6, 4, 246, 223, 6, 4, 243, 159, 6, 4, 243, 160, - 6, 4, 246, 222, 6, 4, 243, 158, 6, 4, 246, 218, 6, 4, 246, 219, 6, 4, - 249, 244, 6, 4, 246, 217, 6, 4, 243, 161, 6, 4, 246, 229, 6, 4, 246, 227, - 6, 4, 246, 228, 6, 4, 246, 226, 6, 4, 246, 221, 6, 4, 251, 86, 6, 4, 246, - 220, 6, 4, 246, 230, 6, 4, 252, 25, 6, 4, 252, 26, 6, 4, 253, 148, 6, 4, - 252, 24, 6, 4, 247, 159, 6, 4, 252, 22, 6, 4, 247, 158, 6, 4, 252, 1, 6, - 4, 253, 94, 6, 4, 251, 255, 6, 4, 247, 199, 6, 4, 252, 42, 6, 4, 247, - 198, 6, 4, 249, 151, 6, 4, 252, 35, 6, 4, 253, 136, 6, 4, 252, 33, 6, 4, - 252, 15, 6, 4, 253, 157, 6, 4, 252, 13, 6, 4, 252, 45, 6, 4, 252, 46, 6, - 4, 253, 112, 6, 4, 252, 43, 6, 4, 247, 200, 6, 4, 252, 44, 6, 4, 246, - 186, 6, 4, 246, 187, 6, 4, 251, 78, 6, 4, 246, 185, 6, 4, 243, 147, 6, 4, - 246, 184, 6, 4, 243, 146, 6, 4, 246, 180, 6, 4, 246, 181, 6, 4, 251, 76, - 6, 4, 246, 179, 6, 4, 243, 149, 6, 4, 246, 190, 6, 4, 243, 148, 6, 4, - 246, 189, 6, 4, 251, 79, 6, 4, 246, 188, 6, 4, 246, 183, 6, 4, 251, 77, - 6, 4, 246, 182, 6, 4, 246, 193, 6, 4, 246, 194, 6, 4, 251, 80, 6, 4, 246, - 191, 6, 4, 243, 150, 6, 4, 246, 192, 6, 4, 246, 197, 6, 4, 246, 198, 6, - 4, 251, 81, 6, 4, 246, 195, 6, 4, 243, 151, 6, 4, 246, 196, 6, 4, 251, - 200, 6, 4, 251, 201, 6, 4, 253, 211, 6, 4, 251, 198, 6, 4, 247, 65, 6, 4, - 247, 66, 6, 4, 250, 11, 6, 4, 247, 64, 6, 4, 251, 185, 6, 4, 251, 186, 6, - 4, 253, 103, 6, 4, 251, 183, 6, 4, 247, 71, 6, 4, 247, 72, 6, 4, 251, - 208, 6, 4, 247, 70, 6, 4, 251, 205, 6, 4, 251, 207, 6, 4, 253, 184, 6, 4, - 251, 204, 6, 4, 251, 191, 6, 4, 253, 210, 6, 4, 251, 189, 6, 4, 251, 211, - 6, 4, 251, 212, 6, 4, 253, 229, 6, 4, 251, 209, 6, 4, 247, 73, 6, 4, 251, - 210, 6, 4, 251, 214, 6, 4, 251, 215, 6, 4, 254, 54, 6, 4, 251, 213, 6, 4, - 247, 74, 6, 4, 250, 16, 6, 4, 251, 40, 6, 4, 251, 41, 6, 4, 253, 209, 6, - 4, 251, 39, 6, 4, 246, 156, 6, 4, 246, 157, 6, 4, 251, 38, 6, 4, 246, - 155, 6, 4, 251, 26, 6, 4, 251, 27, 6, 4, 253, 100, 6, 4, 251, 24, 6, 4, - 246, 164, 6, 4, 246, 165, 6, 4, 251, 47, 6, 4, 246, 163, 6, 4, 249, 238, - 6, 4, 251, 43, 6, 4, 253, 195, 6, 4, 251, 42, 6, 4, 251, 31, 6, 4, 251, - 33, 6, 4, 253, 207, 6, 4, 249, 230, 6, 4, 251, 50, 6, 4, 251, 51, 6, 4, - 253, 196, 6, 4, 251, 48, 6, 4, 246, 166, 6, 4, 251, 49, 6, 4, 250, 1, 6, - 4, 251, 158, 6, 4, 253, 182, 6, 4, 251, 157, 6, 4, 247, 35, 6, 4, 251, - 154, 6, 4, 247, 34, 6, 4, 251, 143, 6, 4, 251, 145, 6, 4, 208, 6, 4, 251, - 142, 6, 4, 247, 41, 6, 4, 251, 171, 6, 4, 247, 40, 6, 4, 251, 167, 6, 4, - 251, 168, 6, 4, 253, 155, 6, 4, 251, 166, 6, 4, 251, 148, 6, 4, 251, 149, - 6, 4, 253, 134, 6, 4, 251, 147, 6, 4, 251, 174, 6, 4, 251, 175, 6, 4, - 253, 183, 6, 4, 251, 172, 6, 4, 247, 42, 6, 4, 251, 173, 6, 4, 246, 145, - 6, 4, 246, 146, 6, 4, 249, 233, 6, 4, 243, 128, 6, 4, 246, 144, 6, 4, - 243, 127, 6, 4, 246, 138, 6, 4, 246, 139, 6, 4, 249, 231, 6, 4, 246, 137, - 6, 4, 243, 130, 6, 4, 243, 131, 6, 4, 245, 94, 6, 4, 243, 129, 6, 4, 246, - 147, 6, 4, 246, 148, 6, 4, 249, 234, 6, 4, 245, 93, 6, 4, 246, 142, 6, 4, - 246, 143, 6, 4, 249, 232, 6, 4, 246, 141, 6, 4, 246, 151, 6, 4, 246, 152, - 6, 4, 249, 235, 6, 4, 246, 149, 6, 4, 243, 132, 6, 4, 246, 150, 6, 4, - 243, 223, 6, 4, 247, 84, 6, 4, 247, 80, 6, 4, 247, 81, 6, 4, 251, 227, 6, - 4, 247, 79, 6, 4, 243, 225, 6, 4, 247, 88, 6, 4, 243, 224, 6, 4, 247, 86, - 6, 4, 247, 87, 6, 4, 249, 107, 6, 4, 247, 85, 6, 4, 247, 83, 6, 4, 251, - 228, 6, 4, 247, 82, 6, 4, 247, 91, 6, 4, 247, 92, 6, 4, 251, 229, 6, 4, - 247, 89, 6, 4, 243, 226, 6, 4, 247, 90, 6, 4, 245, 110, 6, 4, 246, 243, - 6, 4, 251, 102, 6, 4, 246, 242, 6, 4, 243, 166, 6, 4, 243, 167, 6, 4, - 246, 241, 6, 4, 243, 165, 6, 4, 246, 237, 6, 4, 246, 238, 6, 4, 251, 100, - 6, 4, 246, 236, 6, 4, 243, 169, 6, 4, 243, 170, 6, 4, 245, 112, 6, 4, - 243, 168, 6, 4, 246, 244, 6, 4, 246, 245, 6, 4, 251, 103, 6, 4, 245, 111, - 6, 4, 246, 240, 6, 4, 251, 101, 6, 4, 246, 239, 6, 4, 243, 244, 6, 4, - 247, 151, 6, 4, 243, 243, 6, 4, 247, 147, 6, 4, 247, 148, 6, 4, 249, 13, - 6, 4, 247, 146, 6, 4, 243, 246, 6, 4, 243, 247, 6, 4, 247, 157, 6, 4, - 247, 155, 6, 4, 247, 156, 6, 4, 249, 110, 6, 4, 247, 154, 6, 4, 247, 150, - 6, 4, 252, 17, 6, 4, 247, 149, 6, 4, 251, 75, 6, 4, 246, 176, 6, 4, 249, - 137, 6, 4, 251, 59, 6, 4, 251, 60, 6, 4, 253, 88, 6, 4, 251, 58, 6, 4, - 246, 233, 6, 4, 246, 234, 6, 4, 251, 94, 6, 4, 246, 232, 6, 4, 251, 91, - 6, 4, 251, 92, 6, 4, 253, 140, 6, 4, 251, 90, 6, 4, 251, 67, 6, 4, 253, - 125, 6, 4, 251, 65, 6, 4, 253, 14, 6, 4, 253, 15, 6, 4, 253, 98, 6, 4, - 253, 13, 6, 4, 248, 177, 6, 4, 253, 21, 6, 4, 248, 176, 6, 4, 253, 20, 6, - 4, 253, 138, 6, 4, 253, 18, 6, 4, 253, 17, 6, 4, 253, 132, 6, 4, 253, 16, - 6, 4, 253, 67, 6, 4, 253, 68, 6, 4, 253, 218, 6, 4, 253, 66, 6, 4, 248, - 230, 6, 4, 253, 65, 6, 4, 248, 229, 6, 4, 253, 60, 6, 4, 253, 61, 6, 4, - 253, 129, 6, 4, 253, 59, 6, 4, 248, 232, 6, 4, 253, 73, 6, 4, 248, 231, - 6, 4, 250, 129, 6, 4, 253, 71, 6, 4, 253, 190, 6, 4, 253, 70, 6, 4, 253, - 63, 6, 4, 253, 189, 6, 4, 253, 62, 6, 4, 253, 74, 6, 4, 253, 75, 6, 4, - 253, 233, 6, 4, 250, 130, 6, 4, 248, 233, 6, 4, 250, 131, 6, 4, 253, 79, - 6, 4, 253, 80, 6, 4, 254, 213, 6, 4, 253, 77, 6, 4, 248, 234, 6, 4, 253, - 78, 6, 4, 250, 189, 6, 4, 250, 190, 6, 4, 254, 5, 6, 4, 249, 198, 6, 4, - 246, 66, 6, 4, 246, 67, 6, 4, 250, 187, 6, 4, 246, 65, 6, 4, 250, 178, 6, - 4, 250, 179, 6, 4, 253, 115, 6, 4, 249, 195, 6, 4, 246, 75, 6, 4, 250, - 195, 6, 4, 245, 71, 6, 4, 250, 192, 6, 4, 250, 193, 6, 4, 253, 178, 6, 4, - 250, 191, 6, 4, 250, 183, 6, 4, 254, 4, 6, 4, 250, 182, 6, 4, 250, 197, - 6, 4, 250, 198, 6, 4, 254, 32, 6, 4, 249, 202, 6, 4, 246, 76, 6, 4, 250, - 196, 6, 4, 249, 207, 6, 4, 250, 201, 6, 4, 254, 33, 6, 4, 249, 206, 6, 4, - 246, 77, 6, 4, 250, 200, 6, 4, 248, 242, 6, 4, 248, 243, 6, 4, 253, 83, - 6, 4, 248, 241, 6, 4, 243, 21, 6, 4, 244, 168, 6, 4, 248, 240, 6, 4, 244, - 167, 6, 4, 248, 236, 6, 4, 248, 237, 6, 4, 253, 81, 6, 4, 248, 235, 6, 4, - 248, 245, 6, 4, 253, 84, 6, 4, 248, 244, 6, 4, 248, 239, 6, 4, 253, 82, - 6, 4, 248, 238, 6, 4, 248, 248, 6, 4, 253, 85, 6, 4, 248, 246, 6, 4, 244, - 169, 6, 4, 248, 247, 6, 4, 248, 251, 6, 4, 248, 252, 6, 4, 253, 86, 6, 4, - 248, 249, 6, 4, 244, 170, 6, 4, 248, 250, 6, 4, 247, 220, 6, 4, 247, 221, - 6, 4, 252, 50, 6, 4, 247, 219, 6, 4, 244, 14, 6, 4, 247, 218, 6, 4, 244, - 13, 6, 4, 247, 215, 6, 4, 247, 216, 6, 4, 252, 48, 6, 4, 247, 214, 6, 4, - 244, 15, 6, 4, 247, 224, 6, 4, 247, 223, 6, 4, 247, 222, 6, 4, 247, 217, - 6, 4, 252, 49, 6, 4, 247, 226, 6, 4, 252, 51, 6, 4, 245, 155, 6, 4, 244, - 16, 6, 4, 247, 225, 6, 4, 247, 229, 6, 4, 247, 230, 6, 4, 252, 52, 6, 4, - 247, 227, 6, 4, 244, 17, 6, 4, 247, 228, 6, 4, 252, 168, 6, 4, 169, 6, 4, - 253, 158, 6, 4, 252, 167, 6, 4, 248, 74, 6, 4, 252, 164, 6, 4, 248, 73, - 6, 4, 252, 154, 6, 4, 252, 155, 6, 4, 253, 97, 6, 4, 252, 153, 6, 4, 248, - 108, 6, 4, 252, 180, 6, 4, 248, 107, 6, 4, 252, 172, 6, 4, 252, 173, 6, - 4, 253, 159, 6, 4, 252, 171, 6, 4, 252, 159, 6, 4, 253, 171, 6, 4, 252, - 158, 6, 4, 252, 183, 6, 4, 252, 184, 6, 4, 253, 172, 6, 4, 252, 181, 6, - 4, 248, 109, 6, 4, 252, 182, 6, 4, 252, 187, 6, 4, 252, 188, 6, 4, 254, - 188, 6, 4, 252, 185, 6, 4, 248, 111, 6, 4, 252, 186, 6, 4, 248, 91, 6, 4, - 248, 92, 6, 4, 250, 75, 6, 4, 248, 90, 6, 4, 244, 101, 6, 4, 248, 89, 6, - 4, 244, 100, 6, 4, 248, 85, 6, 4, 248, 86, 6, 4, 249, 34, 6, 4, 248, 84, - 6, 4, 248, 94, 6, 4, 248, 95, 6, 4, 250, 76, 6, 4, 248, 93, 6, 4, 248, - 88, 6, 4, 252, 174, 6, 4, 248, 87, 6, 4, 248, 97, 6, 4, 248, 98, 6, 4, - 252, 175, 6, 4, 248, 96, 6, 4, 248, 101, 6, 4, 248, 102, 6, 4, 252, 176, - 6, 4, 248, 99, 6, 4, 244, 102, 6, 4, 248, 100, 6, 4, 248, 211, 6, 4, 248, - 212, 6, 4, 249, 52, 6, 4, 248, 210, 6, 4, 244, 161, 6, 4, 248, 219, 6, 4, - 244, 160, 6, 4, 248, 217, 6, 4, 248, 218, 6, 4, 250, 126, 6, 4, 248, 216, - 6, 4, 248, 214, 6, 4, 248, 215, 6, 4, 249, 74, 6, 4, 248, 213, 6, 4, 248, - 222, 6, 4, 248, 223, 6, 4, 250, 127, 6, 4, 248, 220, 6, 4, 244, 162, 6, - 4, 248, 221, 6, 4, 248, 227, 6, 4, 248, 228, 6, 4, 253, 64, 6, 4, 248, - 225, 6, 4, 244, 163, 6, 4, 248, 226, 6, 4, 246, 47, 6, 4, 246, 48, 6, 4, - 249, 11, 6, 4, 246, 46, 6, 4, 243, 67, 6, 4, 243, 68, 6, 4, 246, 56, 6, - 4, 243, 66, 6, 4, 246, 54, 6, 4, 246, 55, 6, 4, 249, 94, 6, 4, 246, 53, - 6, 4, 246, 50, 6, 4, 246, 51, 6, 4, 249, 44, 6, 4, 246, 49, 6, 4, 246, - 59, 6, 4, 249, 131, 6, 4, 246, 57, 6, 4, 243, 69, 6, 4, 246, 58, 6, 4, - 246, 63, 6, 4, 246, 64, 6, 4, 250, 186, 6, 4, 246, 61, 6, 4, 243, 70, 6, - 4, 246, 62, 6, 4, 248, 25, 6, 4, 249, 50, 6, 4, 244, 63, 6, 4, 248, 33, - 6, 4, 248, 31, 6, 4, 248, 32, 6, 4, 252, 134, 6, 4, 248, 30, 6, 4, 248, - 28, 6, 4, 248, 29, 6, 4, 252, 133, 6, 4, 248, 27, 6, 4, 248, 36, 6, 4, - 248, 37, 6, 4, 252, 135, 6, 4, 248, 34, 6, 4, 244, 64, 6, 4, 248, 35, 6, - 4, 248, 40, 6, 4, 248, 41, 6, 4, 252, 136, 6, 4, 248, 38, 6, 4, 244, 65, - 6, 4, 248, 39, 6, 4, 247, 182, 6, 4, 247, 183, 6, 4, 252, 36, 6, 4, 247, - 181, 6, 4, 247, 188, 6, 4, 252, 38, 6, 4, 247, 187, 6, 4, 247, 185, 6, 4, - 247, 186, 6, 4, 252, 37, 6, 4, 247, 184, 6, 4, 247, 191, 6, 4, 247, 192, - 6, 4, 252, 39, 6, 4, 247, 189, 6, 4, 244, 5, 6, 4, 247, 190, 6, 4, 247, - 195, 6, 4, 247, 196, 6, 4, 252, 40, 6, 4, 247, 193, 6, 4, 244, 6, 6, 4, - 247, 194, 6, 4, 245, 181, 6, 4, 248, 57, 6, 4, 249, 7, 6, 4, 248, 56, 6, - 4, 244, 81, 6, 4, 248, 65, 6, 4, 244, 80, 6, 4, 248, 63, 6, 4, 248, 64, - 6, 4, 249, 85, 6, 4, 245, 187, 6, 4, 248, 59, 6, 4, 248, 60, 6, 4, 249, - 70, 6, 4, 248, 58, 6, 4, 248, 67, 6, 4, 248, 68, 6, 4, 249, 162, 6, 4, - 248, 66, 6, 4, 244, 82, 6, 4, 245, 188, 6, 4, 248, 71, 6, 4, 248, 72, 6, - 4, 250, 71, 6, 4, 248, 69, 6, 4, 244, 83, 6, 4, 248, 70, 6, 4, 250, 61, - 6, 4, 252, 118, 6, 4, 253, 92, 6, 4, 249, 158, 6, 4, 248, 45, 6, 4, 252, - 139, 6, 4, 248, 44, 6, 4, 252, 131, 6, 4, 252, 132, 6, 4, 253, 144, 6, 4, - 252, 130, 6, 4, 252, 123, 6, 4, 253, 150, 6, 4, 252, 121, 6, 4, 252, 142, - 6, 4, 252, 143, 6, 4, 253, 170, 6, 4, 252, 140, 6, 4, 248, 46, 6, 4, 252, - 141, 6, 4, 252, 148, 6, 4, 252, 149, 6, 4, 254, 70, 6, 4, 252, 146, 6, 4, - 248, 48, 6, 4, 252, 147, 6, 4, 251, 124, 6, 4, 251, 125, 6, 4, 253, 228, - 6, 4, 251, 123, 6, 4, 247, 3, 6, 4, 247, 4, 6, 4, 251, 122, 6, 4, 247, 2, - 6, 4, 247, 22, 6, 4, 247, 23, 6, 4, 251, 130, 6, 4, 247, 21, 6, 4, 249, - 69, 6, 4, 251, 129, 6, 4, 253, 240, 6, 4, 251, 128, 6, 4, 251, 133, 6, 4, - 251, 134, 6, 4, 253, 241, 6, 4, 251, 131, 6, 4, 247, 24, 6, 4, 251, 132, - 6, 4, 251, 138, 6, 4, 251, 139, 6, 4, 254, 123, 6, 4, 251, 136, 6, 4, - 247, 25, 6, 4, 251, 137, 6, 4, 252, 93, 6, 4, 252, 94, 6, 4, 253, 249, 6, - 4, 252, 92, 6, 4, 248, 7, 6, 4, 248, 8, 6, 4, 252, 91, 6, 4, 248, 6, 6, - 4, 248, 10, 6, 4, 248, 11, 6, 4, 250, 58, 6, 4, 248, 9, 6, 4, 250, 57, 6, - 4, 252, 98, 6, 4, 254, 18, 6, 4, 252, 97, 6, 4, 252, 105, 6, 4, 252, 107, - 6, 4, 254, 19, 6, 4, 252, 103, 6, 4, 248, 12, 6, 4, 252, 104, 6, 4, 252, - 113, 6, 4, 252, 114, 6, 4, 254, 178, 6, 4, 252, 111, 6, 4, 248, 16, 6, 4, - 252, 112, 6, 4, 247, 7, 6, 4, 247, 8, 6, 4, 249, 248, 6, 4, 247, 6, 6, 4, - 243, 176, 6, 4, 243, 177, 6, 4, 245, 118, 6, 4, 243, 175, 6, 4, 243, 179, - 6, 4, 247, 12, 6, 4, 243, 178, 6, 4, 247, 10, 6, 4, 247, 11, 6, 4, 249, - 249, 6, 4, 247, 9, 6, 4, 245, 119, 6, 4, 247, 15, 6, 4, 249, 250, 6, 4, - 247, 13, 6, 4, 243, 180, 6, 4, 247, 14, 6, 4, 247, 17, 6, 4, 247, 18, 6, - 4, 249, 251, 6, 4, 247, 16, 6, 4, 247, 163, 6, 4, 247, 164, 6, 4, 252, - 27, 6, 4, 247, 162, 6, 4, 243, 250, 6, 4, 243, 251, 6, 4, 247, 161, 6, 4, - 243, 249, 6, 4, 243, 252, 6, 4, 247, 168, 6, 4, 247, 166, 6, 4, 247, 167, - 6, 4, 252, 28, 6, 4, 247, 165, 6, 4, 247, 171, 6, 4, 252, 29, 6, 4, 247, - 169, 6, 4, 243, 253, 6, 4, 247, 170, 6, 4, 247, 174, 6, 4, 247, 175, 6, - 4, 252, 30, 6, 4, 247, 172, 6, 4, 243, 254, 6, 4, 247, 173, 6, 4, 247, - 205, 6, 4, 247, 206, 6, 4, 250, 33, 6, 4, 245, 153, 6, 4, 244, 9, 6, 4, - 244, 10, 6, 4, 247, 204, 6, 4, 244, 8, 6, 4, 244, 12, 6, 4, 247, 209, 6, - 4, 244, 11, 6, 4, 247, 207, 6, 4, 247, 208, 6, 4, 249, 84, 6, 4, 245, - 154, 6, 4, 247, 211, 6, 4, 247, 212, 6, 4, 250, 34, 6, 4, 247, 210, 6, 4, - 253, 27, 6, 4, 253, 28, 6, 4, 253, 135, 6, 4, 253, 26, 6, 4, 248, 179, 6, - 4, 248, 180, 6, 4, 253, 25, 6, 4, 248, 178, 6, 4, 248, 182, 6, 4, 253, - 33, 6, 4, 253, 31, 6, 4, 253, 32, 6, 4, 254, 77, 6, 4, 253, 29, 6, 4, - 253, 39, 6, 4, 253, 40, 6, 4, 254, 207, 6, 4, 253, 37, 6, 4, 248, 185, 6, - 4, 253, 38, 6, 4, 250, 116, 6, 4, 253, 45, 6, 4, 253, 139, 6, 4, 253, 44, - 6, 4, 248, 192, 6, 4, 248, 193, 6, 4, 253, 42, 6, 4, 248, 191, 6, 4, 248, - 204, 6, 4, 248, 205, 6, 4, 253, 49, 6, 4, 248, 203, 6, 4, 250, 118, 6, 4, - 253, 47, 6, 4, 253, 123, 6, 4, 253, 46, 6, 4, 253, 52, 6, 4, 253, 53, 6, - 4, 253, 124, 6, 4, 253, 50, 6, 4, 248, 206, 6, 4, 253, 51, 6, 4, 253, 56, - 6, 4, 253, 57, 6, 4, 254, 26, 6, 4, 253, 54, 6, 4, 248, 207, 6, 4, 253, - 55, 6, 22, 250, 57, 6, 22, 253, 211, 6, 22, 250, 1, 6, 22, 245, 153, 6, - 22, 249, 206, 6, 22, 250, 75, 6, 22, 245, 93, 6, 22, 249, 230, 6, 22, - 253, 156, 6, 22, 245, 110, 6, 22, 250, 16, 6, 22, 245, 58, 6, 22, 250, - 21, 6, 22, 253, 123, 6, 22, 250, 48, 6, 22, 245, 112, 6, 22, 250, 85, 6, - 22, 253, 100, 6, 22, 250, 130, 6, 22, 249, 207, 6, 22, 245, 77, 6, 22, - 249, 193, 6, 22, 245, 94, 6, 22, 245, 154, 6, 22, 253, 160, 6, 22, 254, - 63, 6, 22, 245, 119, 6, 22, 250, 129, 6, 22, 250, 52, 6, 22, 249, 243, 6, - 22, 250, 116, 6, 22, 250, 108, 6, 22, 250, 71, 6, 22, 250, 103, 6, 22, - 253, 129, 6, 22, 253, 240, 6, 22, 245, 155, 6, 22, 249, 251, 6, 22, 249, - 238, 6, 22, 245, 118, 6, 22, 253, 138, 6, 22, 253, 204, 6, 22, 245, 188, - 6, 22, 250, 11, 6, 22, 254, 33, 6, 22, 245, 71, 6, 22, 249, 198, 6, 22, - 245, 111, 6, 22, 245, 181, 6, 22, 250, 131, 6, 22, 245, 187, 6, 22, 249, - 44, 6, 22, 243, 21, 6, 22, 245, 148, 6, 22, 253, 134, 7, 11, 234, 73, 7, - 11, 234, 74, 7, 11, 234, 75, 7, 11, 234, 76, 7, 11, 234, 77, 7, 11, 234, - 78, 7, 11, 234, 79, 7, 11, 234, 80, 7, 11, 234, 81, 7, 11, 234, 82, 7, - 11, 234, 83, 7, 11, 234, 84, 7, 11, 234, 85, 7, 11, 234, 86, 7, 11, 234, - 87, 7, 11, 234, 88, 7, 11, 234, 89, 7, 11, 234, 90, 7, 11, 234, 91, 7, - 11, 234, 92, 7, 11, 234, 93, 7, 11, 234, 94, 7, 11, 234, 95, 7, 11, 234, - 96, 7, 11, 234, 97, 7, 11, 234, 98, 7, 11, 234, 99, 7, 11, 234, 100, 7, - 11, 234, 101, 7, 11, 234, 102, 7, 11, 234, 103, 7, 11, 234, 104, 7, 11, - 234, 105, 7, 11, 234, 106, 7, 11, 234, 107, 7, 11, 234, 108, 7, 11, 234, - 109, 7, 11, 234, 110, 7, 11, 234, 111, 7, 11, 234, 112, 7, 11, 234, 113, - 7, 11, 234, 114, 7, 11, 234, 115, 7, 11, 234, 116, 7, 11, 234, 117, 7, - 11, 234, 118, 7, 11, 234, 119, 7, 11, 234, 120, 7, 11, 234, 121, 7, 11, - 234, 122, 7, 11, 234, 123, 7, 11, 234, 124, 7, 11, 234, 125, 7, 11, 234, - 126, 7, 11, 234, 127, 7, 11, 234, 128, 7, 11, 234, 129, 7, 11, 234, 130, - 7, 11, 234, 131, 7, 11, 234, 132, 7, 11, 234, 133, 7, 11, 234, 134, 7, - 11, 234, 135, 7, 11, 234, 136, 7, 11, 234, 137, 7, 11, 234, 138, 7, 11, - 234, 139, 7, 11, 234, 140, 7, 11, 234, 141, 7, 11, 234, 142, 7, 11, 234, - 143, 7, 11, 234, 144, 7, 11, 234, 145, 7, 11, 234, 146, 7, 11, 234, 147, - 7, 11, 234, 148, 7, 11, 234, 149, 7, 11, 234, 150, 7, 11, 234, 151, 7, - 11, 234, 152, 7, 11, 234, 153, 7, 11, 234, 154, 7, 11, 234, 155, 7, 11, - 234, 156, 7, 11, 234, 157, 7, 11, 234, 158, 7, 11, 234, 159, 7, 11, 234, - 160, 7, 11, 234, 161, 7, 11, 234, 162, 7, 11, 234, 163, 7, 11, 234, 164, - 7, 11, 234, 165, 7, 11, 234, 166, 7, 11, 234, 167, 7, 11, 234, 168, 7, - 11, 234, 169, 7, 11, 234, 170, 7, 11, 234, 171, 7, 11, 234, 172, 7, 11, - 234, 173, 7, 11, 234, 174, 7, 11, 234, 175, 7, 11, 234, 176, 7, 11, 234, - 177, 7, 11, 234, 178, 7, 11, 234, 179, 7, 11, 234, 180, 7, 11, 234, 181, - 7, 11, 234, 182, 7, 11, 234, 183, 7, 11, 234, 184, 7, 11, 234, 185, 7, - 11, 234, 186, 7, 11, 234, 187, 7, 11, 234, 188, 7, 11, 234, 189, 7, 11, - 234, 190, 7, 11, 234, 191, 7, 11, 234, 192, 7, 11, 234, 193, 7, 11, 234, - 194, 7, 11, 234, 195, 7, 11, 234, 196, 7, 11, 234, 197, 7, 11, 234, 198, - 7, 11, 234, 199, 7, 11, 234, 200, 7, 11, 234, 201, 7, 11, 234, 202, 7, - 11, 234, 203, 7, 11, 234, 204, 7, 11, 234, 205, 7, 11, 234, 206, 7, 11, - 234, 207, 7, 11, 234, 208, 7, 11, 234, 209, 7, 11, 234, 210, 7, 11, 234, - 211, 7, 11, 234, 212, 7, 11, 234, 213, 7, 11, 234, 214, 7, 11, 234, 215, - 7, 11, 234, 216, 7, 11, 234, 217, 7, 11, 234, 218, 7, 11, 234, 219, 7, - 11, 234, 220, 7, 11, 234, 221, 7, 11, 234, 222, 7, 11, 234, 223, 7, 11, - 234, 224, 7, 11, 234, 225, 7, 11, 234, 226, 7, 11, 234, 227, 7, 11, 234, - 228, 7, 11, 234, 229, 7, 11, 234, 230, 7, 11, 234, 231, 7, 11, 234, 232, - 7, 11, 234, 233, 7, 11, 234, 234, 7, 11, 234, 235, 7, 11, 234, 236, 7, - 11, 234, 237, 7, 11, 234, 238, 7, 11, 234, 239, 7, 11, 234, 240, 7, 11, - 234, 241, 7, 11, 234, 242, 7, 11, 234, 243, 7, 11, 234, 244, 7, 11, 234, - 245, 7, 11, 234, 246, 7, 11, 234, 247, 7, 11, 234, 248, 7, 11, 234, 249, - 7, 11, 234, 250, 7, 11, 234, 251, 7, 11, 234, 252, 7, 11, 234, 253, 7, - 11, 234, 254, 7, 11, 234, 255, 7, 11, 235, 0, 7, 11, 235, 1, 7, 11, 235, - 2, 7, 11, 235, 3, 7, 11, 235, 4, 7, 11, 235, 5, 7, 11, 235, 6, 7, 11, - 235, 7, 7, 11, 235, 8, 7, 11, 235, 9, 7, 11, 235, 10, 7, 11, 235, 11, 7, - 11, 235, 12, 7, 11, 235, 13, 7, 11, 235, 14, 7, 11, 235, 15, 7, 11, 235, - 16, 7, 11, 235, 17, 7, 11, 235, 18, 7, 11, 235, 19, 7, 11, 235, 20, 7, - 11, 235, 21, 7, 11, 235, 22, 7, 11, 235, 23, 7, 11, 235, 24, 7, 11, 235, - 25, 7, 11, 235, 26, 7, 11, 235, 27, 7, 11, 235, 28, 7, 11, 235, 29, 7, - 11, 235, 30, 7, 11, 235, 31, 7, 11, 235, 32, 7, 11, 235, 33, 7, 11, 235, - 34, 7, 11, 235, 35, 7, 11, 235, 36, 7, 11, 235, 37, 7, 11, 235, 38, 7, - 11, 235, 39, 7, 11, 235, 40, 7, 11, 235, 41, 7, 11, 235, 42, 7, 11, 235, - 43, 7, 11, 235, 44, 7, 11, 235, 45, 7, 11, 235, 46, 7, 11, 235, 47, 7, - 11, 235, 48, 7, 11, 235, 49, 7, 11, 235, 50, 7, 11, 235, 51, 7, 11, 235, - 52, 7, 11, 235, 53, 7, 11, 235, 54, 7, 11, 235, 55, 7, 11, 235, 56, 7, - 11, 235, 57, 7, 11, 235, 58, 7, 11, 235, 59, 7, 11, 235, 60, 7, 11, 235, - 61, 7, 11, 235, 62, 7, 11, 235, 63, 7, 11, 235, 64, 7, 11, 235, 65, 7, - 11, 235, 66, 7, 11, 235, 67, 7, 11, 235, 68, 7, 11, 235, 69, 7, 11, 235, - 70, 7, 11, 235, 71, 7, 11, 235, 72, 7, 11, 235, 73, 7, 11, 235, 74, 7, - 11, 235, 75, 7, 11, 235, 76, 7, 11, 235, 77, 7, 11, 235, 78, 7, 11, 235, - 79, 7, 11, 235, 80, 7, 11, 235, 81, 7, 11, 235, 82, 7, 11, 235, 83, 7, - 11, 235, 84, 7, 11, 235, 85, 7, 11, 235, 86, 7, 11, 235, 87, 7, 11, 235, - 88, 7, 11, 235, 89, 7, 11, 235, 90, 7, 11, 235, 91, 7, 11, 235, 92, 7, - 11, 235, 93, 7, 11, 235, 94, 7, 11, 235, 95, 7, 11, 235, 96, 7, 11, 235, - 97, 7, 11, 235, 98, 7, 11, 235, 99, 7, 11, 235, 100, 7, 11, 235, 101, 7, - 11, 235, 102, 7, 11, 235, 103, 7, 11, 235, 104, 7, 11, 235, 105, 7, 11, - 235, 106, 7, 11, 235, 107, 7, 11, 235, 108, 7, 11, 235, 109, 7, 11, 235, - 110, 7, 11, 235, 111, 7, 11, 235, 112, 7, 11, 235, 113, 7, 11, 235, 114, - 7, 11, 235, 115, 7, 11, 235, 116, 7, 11, 235, 117, 7, 11, 235, 118, 7, - 11, 235, 119, 7, 11, 235, 120, 7, 11, 235, 121, 7, 11, 235, 122, 7, 11, - 235, 123, 7, 11, 235, 124, 7, 11, 235, 125, 7, 11, 235, 126, 7, 11, 235, - 127, 7, 11, 235, 128, 7, 11, 235, 129, 7, 11, 235, 130, 7, 11, 235, 131, - 7, 11, 235, 132, 7, 11, 235, 133, 7, 11, 235, 134, 7, 11, 235, 135, 7, - 11, 235, 136, 7, 11, 235, 137, 7, 11, 235, 138, 7, 11, 235, 139, 7, 11, - 235, 140, 7, 11, 235, 141, 7, 11, 235, 142, 7, 11, 235, 143, 7, 11, 235, - 144, 7, 11, 235, 145, 7, 11, 235, 146, 7, 11, 235, 147, 7, 11, 235, 148, - 7, 11, 235, 149, 7, 11, 235, 150, 7, 11, 235, 151, 7, 11, 235, 152, 7, - 11, 235, 153, 7, 11, 235, 154, 7, 11, 235, 155, 7, 11, 235, 156, 7, 11, - 235, 157, 7, 11, 235, 158, 7, 11, 235, 159, 7, 11, 235, 160, 7, 11, 235, - 161, 7, 11, 235, 162, 7, 11, 235, 163, 7, 11, 235, 164, 7, 11, 235, 165, - 7, 11, 235, 166, 7, 11, 235, 167, 7, 11, 235, 168, 7, 11, 235, 169, 7, - 11, 235, 170, 7, 11, 235, 171, 7, 11, 235, 172, 7, 11, 235, 173, 7, 11, - 235, 174, 7, 11, 235, 175, 7, 11, 235, 176, 7, 11, 235, 177, 9, 3, 17, - 254, 102, 9, 3, 17, 253, 226, 9, 3, 17, 254, 103, 9, 3, 17, 251, 4, 9, 3, - 17, 251, 5, 9, 3, 17, 165, 255, 29, 190, 9, 3, 17, 254, 186, 87, 3, 17, - 253, 242, 249, 112, 87, 3, 17, 253, 242, 249, 133, 87, 3, 17, 253, 242, - 249, 138, 87, 3, 17, 254, 200, 249, 112, 87, 3, 17, 253, 242, 249, 179, - 61, 1, 254, 0, 2, 242, 222, 61, 244, 180, 236, 25, 242, 50, 61, 17, 241, - 10, 254, 0, 254, 0, 242, 162, 61, 1, 236, 200, 245, 57, 61, 1, 249, 51, - 244, 224, 61, 1, 249, 51, 242, 204, 61, 1, 249, 51, 253, 125, 61, 1, 249, - 51, 249, 81, 61, 1, 249, 51, 242, 179, 61, 1, 249, 51, 29, 249, 147, 61, - 1, 249, 51, 245, 170, 61, 1, 249, 51, 250, 86, 61, 1, 236, 200, 249, 4, - 57, 61, 1, 249, 54, 2, 249, 54, 227, 61, 1, 249, 54, 2, 254, 22, 227, 61, - 1, 249, 54, 2, 242, 176, 18, 249, 54, 227, 61, 1, 249, 54, 2, 242, 176, - 18, 254, 22, 227, 61, 1, 67, 2, 242, 162, 61, 1, 67, 2, 241, 30, 61, 1, - 67, 2, 242, 181, 61, 1, 254, 3, 2, 240, 208, 61, 1, 245, 98, 2, 240, 208, - 61, 1, 245, 76, 2, 240, 208, 61, 1, 255, 9, 2, 242, 181, 61, 1, 254, 24, - 2, 240, 208, 61, 1, 248, 208, 2, 240, 208, 61, 1, 254, 191, 2, 240, 208, - 61, 1, 254, 0, 2, 240, 208, 61, 1, 29, 253, 87, 2, 240, 208, 61, 1, 253, - 87, 2, 240, 208, 61, 1, 247, 54, 2, 240, 208, 61, 1, 254, 142, 2, 240, - 208, 61, 1, 254, 160, 2, 240, 208, 61, 1, 244, 69, 2, 240, 208, 61, 1, - 29, 254, 229, 2, 240, 208, 61, 1, 254, 229, 2, 240, 208, 61, 1, 248, 141, - 2, 240, 208, 61, 1, 254, 177, 2, 240, 208, 61, 1, 252, 122, 2, 240, 208, - 61, 1, 249, 54, 2, 240, 208, 61, 1, 254, 189, 2, 240, 208, 61, 1, 254, - 24, 2, 242, 223, 61, 1, 254, 3, 2, 245, 1, 61, 1, 253, 87, 2, 245, 1, 61, - 1, 254, 229, 2, 245, 1, 61, 17, 67, 242, 179, 10, 1, 67, 245, 219, 35, - 12, 10, 1, 67, 245, 219, 29, 12, 10, 1, 249, 93, 35, 12, 10, 1, 249, 93, - 29, 12, 10, 1, 249, 93, 46, 12, 10, 1, 249, 93, 98, 12, 10, 1, 253, 248, - 35, 12, 10, 1, 253, 248, 29, 12, 10, 1, 253, 248, 46, 12, 10, 1, 253, - 248, 98, 12, 10, 1, 244, 245, 35, 12, 10, 1, 244, 245, 29, 12, 10, 1, - 244, 245, 46, 12, 10, 1, 244, 245, 98, 12, 10, 1, 242, 168, 35, 12, 10, - 1, 242, 168, 29, 12, 10, 1, 242, 168, 46, 12, 10, 1, 242, 168, 98, 12, - 10, 1, 245, 7, 35, 12, 10, 1, 245, 7, 29, 12, 10, 1, 245, 7, 46, 12, 10, - 1, 245, 7, 98, 12, 10, 1, 249, 122, 35, 12, 10, 1, 249, 122, 29, 12, 10, - 1, 249, 122, 46, 12, 10, 1, 249, 122, 98, 12, 10, 1, 253, 254, 35, 12, - 10, 1, 253, 254, 29, 12, 10, 1, 253, 254, 46, 12, 10, 1, 253, 254, 98, - 12, 10, 1, 245, 0, 35, 12, 10, 1, 245, 0, 29, 12, 10, 1, 245, 0, 46, 12, - 10, 1, 245, 0, 98, 12, 10, 1, 249, 99, 35, 12, 10, 1, 249, 99, 29, 12, - 10, 1, 249, 99, 46, 12, 10, 1, 249, 99, 98, 12, 10, 1, 249, 113, 35, 12, - 10, 1, 249, 113, 29, 12, 10, 1, 249, 113, 46, 12, 10, 1, 249, 113, 98, - 12, 10, 1, 244, 240, 35, 12, 10, 1, 244, 240, 29, 12, 10, 1, 244, 240, - 46, 12, 10, 1, 244, 240, 98, 12, 10, 1, 241, 6, 35, 12, 10, 1, 241, 6, - 29, 12, 10, 1, 241, 6, 46, 12, 10, 1, 241, 6, 98, 12, 10, 1, 242, 206, - 35, 12, 10, 1, 242, 206, 29, 12, 10, 1, 245, 75, 35, 12, 10, 1, 245, 75, - 29, 12, 10, 1, 254, 34, 35, 12, 10, 1, 254, 34, 29, 12, 10, 1, 249, 208, - 35, 12, 10, 1, 249, 208, 29, 12, 10, 1, 254, 47, 35, 12, 10, 1, 254, 47, - 29, 12, 10, 1, 250, 65, 35, 12, 10, 1, 250, 65, 29, 12, 10, 1, 244, 253, - 35, 12, 10, 1, 244, 253, 29, 12, 10, 1, 244, 253, 46, 12, 10, 1, 244, - 253, 98, 12, 10, 1, 253, 194, 35, 12, 10, 1, 253, 194, 29, 12, 10, 1, - 253, 194, 46, 12, 10, 1, 253, 194, 98, 12, 10, 1, 249, 103, 35, 12, 10, - 1, 249, 103, 29, 12, 10, 1, 249, 103, 46, 12, 10, 1, 249, 103, 98, 12, - 10, 1, 244, 255, 35, 12, 10, 1, 244, 255, 29, 12, 10, 1, 244, 255, 46, - 12, 10, 1, 244, 255, 98, 12, 10, 1, 177, 242, 218, 35, 12, 10, 1, 177, - 242, 218, 29, 12, 10, 1, 245, 2, 35, 12, 10, 1, 245, 2, 29, 12, 10, 1, - 245, 2, 46, 12, 10, 1, 245, 2, 98, 12, 10, 1, 188, 2, 50, 53, 35, 12, 10, - 1, 188, 2, 50, 53, 29, 12, 10, 1, 188, 249, 79, 35, 12, 10, 1, 188, 249, - 79, 29, 12, 10, 1, 188, 249, 79, 46, 12, 10, 1, 188, 249, 79, 98, 12, 10, - 1, 188, 236, 197, 35, 12, 10, 1, 188, 236, 197, 29, 12, 10, 1, 188, 236, - 197, 46, 12, 10, 1, 188, 236, 197, 98, 12, 10, 1, 50, 242, 139, 35, 12, - 10, 1, 50, 242, 139, 29, 12, 10, 1, 50, 242, 139, 2, 125, 53, 35, 12, 10, - 1, 50, 242, 139, 2, 125, 53, 29, 12, 10, 1, 254, 235, 35, 12, 10, 1, 254, - 235, 29, 12, 10, 1, 254, 235, 46, 12, 10, 1, 254, 235, 98, 12, 10, 1, - 115, 35, 12, 10, 1, 115, 29, 12, 10, 1, 254, 223, 35, 12, 10, 1, 254, - 223, 29, 12, 10, 1, 254, 226, 35, 12, 10, 1, 254, 226, 29, 12, 10, 1, - 115, 2, 125, 53, 35, 12, 10, 1, 254, 255, 35, 12, 10, 1, 254, 255, 29, - 12, 10, 1, 240, 217, 254, 223, 35, 12, 10, 1, 240, 217, 254, 223, 29, 12, - 10, 1, 240, 217, 254, 226, 35, 12, 10, 1, 240, 217, 254, 226, 29, 12, 10, - 1, 144, 35, 12, 10, 1, 144, 29, 12, 10, 1, 144, 46, 12, 10, 1, 144, 98, - 12, 10, 1, 242, 151, 242, 226, 240, 217, 67, 131, 46, 12, 10, 1, 242, - 151, 242, 226, 240, 217, 67, 131, 98, 12, 10, 17, 50, 2, 125, 53, 2, 67, - 35, 12, 10, 17, 50, 2, 125, 53, 2, 67, 29, 12, 10, 17, 50, 2, 125, 53, 2, - 254, 221, 35, 12, 10, 17, 50, 2, 125, 53, 2, 254, 221, 29, 12, 10, 17, - 50, 2, 125, 53, 2, 253, 162, 35, 12, 10, 17, 50, 2, 125, 53, 2, 253, 162, - 29, 12, 10, 17, 50, 2, 125, 53, 2, 115, 35, 12, 10, 17, 50, 2, 125, 53, - 2, 115, 29, 12, 10, 17, 50, 2, 125, 53, 2, 254, 223, 35, 12, 10, 17, 50, - 2, 125, 53, 2, 254, 223, 29, 12, 10, 17, 50, 2, 125, 53, 2, 254, 226, 35, - 12, 10, 17, 50, 2, 125, 53, 2, 254, 226, 29, 12, 10, 17, 50, 2, 125, 53, - 2, 144, 35, 12, 10, 17, 50, 2, 125, 53, 2, 144, 29, 12, 10, 17, 50, 2, - 125, 53, 2, 144, 46, 12, 10, 17, 242, 151, 240, 217, 50, 2, 125, 53, 2, - 67, 131, 35, 12, 10, 17, 242, 151, 240, 217, 50, 2, 125, 53, 2, 67, 131, - 29, 12, 10, 17, 242, 151, 240, 217, 50, 2, 125, 53, 2, 67, 131, 46, 12, - 10, 1, 244, 227, 50, 35, 12, 10, 1, 244, 227, 50, 29, 12, 10, 1, 244, - 227, 50, 46, 12, 10, 1, 244, 227, 50, 98, 12, 10, 17, 50, 2, 125, 53, 2, - 89, 35, 12, 10, 17, 50, 2, 125, 53, 2, 81, 35, 12, 10, 17, 50, 2, 125, - 53, 2, 43, 35, 12, 10, 17, 50, 2, 125, 53, 2, 67, 131, 35, 12, 10, 17, - 50, 2, 125, 53, 2, 50, 35, 12, 10, 17, 253, 102, 2, 89, 35, 12, 10, 17, - 253, 102, 2, 81, 35, 12, 10, 17, 253, 102, 2, 145, 35, 12, 10, 17, 253, - 102, 2, 43, 35, 12, 10, 17, 253, 102, 2, 67, 131, 35, 12, 10, 17, 253, - 102, 2, 50, 35, 12, 10, 17, 191, 2, 89, 35, 12, 10, 17, 191, 2, 81, 35, - 12, 10, 17, 191, 2, 145, 35, 12, 10, 17, 191, 2, 43, 35, 12, 10, 17, 191, - 2, 67, 131, 35, 12, 10, 17, 191, 2, 50, 35, 12, 10, 17, 249, 20, 2, 89, - 35, 12, 10, 17, 249, 20, 2, 43, 35, 12, 10, 17, 249, 20, 2, 67, 131, 35, - 12, 10, 17, 249, 20, 2, 50, 35, 12, 10, 17, 89, 2, 81, 35, 12, 10, 17, - 89, 2, 43, 35, 12, 10, 17, 81, 2, 89, 35, 12, 10, 17, 81, 2, 43, 35, 12, - 10, 17, 145, 2, 89, 35, 12, 10, 17, 145, 2, 81, 35, 12, 10, 17, 145, 2, - 43, 35, 12, 10, 17, 214, 2, 89, 35, 12, 10, 17, 214, 2, 81, 35, 12, 10, - 17, 214, 2, 145, 35, 12, 10, 17, 214, 2, 43, 35, 12, 10, 17, 253, 108, 2, - 81, 35, 12, 10, 17, 253, 108, 2, 43, 35, 12, 10, 17, 253, 107, 2, 89, 35, - 12, 10, 17, 253, 107, 2, 81, 35, 12, 10, 17, 253, 107, 2, 145, 35, 12, - 10, 17, 253, 107, 2, 43, 35, 12, 10, 17, 253, 122, 2, 81, 35, 12, 10, 17, - 253, 122, 2, 43, 35, 12, 10, 17, 253, 201, 2, 43, 35, 12, 10, 17, 253, - 117, 2, 89, 35, 12, 10, 17, 253, 117, 2, 43, 35, 12, 10, 17, 244, 190, 2, - 89, 35, 12, 10, 17, 244, 190, 2, 43, 35, 12, 10, 17, 253, 111, 2, 89, 35, - 12, 10, 17, 253, 111, 2, 81, 35, 12, 10, 17, 253, 111, 2, 145, 35, 12, - 10, 17, 253, 111, 2, 43, 35, 12, 10, 17, 253, 111, 2, 67, 131, 35, 12, - 10, 17, 253, 111, 2, 50, 35, 12, 10, 17, 253, 120, 2, 81, 35, 12, 10, 17, - 253, 120, 2, 43, 35, 12, 10, 17, 253, 120, 2, 67, 131, 35, 12, 10, 17, - 253, 120, 2, 50, 35, 12, 10, 17, 253, 87, 2, 67, 35, 12, 10, 17, 253, 87, - 2, 89, 35, 12, 10, 17, 253, 87, 2, 81, 35, 12, 10, 17, 253, 87, 2, 145, - 35, 12, 10, 17, 253, 87, 2, 155, 35, 12, 10, 17, 253, 87, 2, 43, 35, 12, - 10, 17, 253, 87, 2, 67, 131, 35, 12, 10, 17, 253, 87, 2, 50, 35, 12, 10, - 17, 155, 2, 89, 35, 12, 10, 17, 155, 2, 81, 35, 12, 10, 17, 155, 2, 145, - 35, 12, 10, 17, 155, 2, 43, 35, 12, 10, 17, 155, 2, 67, 131, 35, 12, 10, - 17, 155, 2, 50, 35, 12, 10, 17, 43, 2, 89, 35, 12, 10, 17, 43, 2, 81, 35, - 12, 10, 17, 43, 2, 145, 35, 12, 10, 17, 43, 2, 43, 35, 12, 10, 17, 43, 2, - 67, 131, 35, 12, 10, 17, 43, 2, 50, 35, 12, 10, 17, 177, 2, 89, 35, 12, - 10, 17, 177, 2, 81, 35, 12, 10, 17, 177, 2, 145, 35, 12, 10, 17, 177, 2, - 43, 35, 12, 10, 17, 177, 2, 67, 131, 35, 12, 10, 17, 177, 2, 50, 35, 12, - 10, 17, 188, 2, 89, 35, 12, 10, 17, 188, 2, 43, 35, 12, 10, 17, 188, 2, - 67, 131, 35, 12, 10, 17, 188, 2, 50, 35, 12, 10, 17, 50, 2, 89, 35, 12, - 10, 17, 50, 2, 81, 35, 12, 10, 17, 50, 2, 145, 35, 12, 10, 17, 50, 2, 43, - 35, 12, 10, 17, 50, 2, 67, 131, 35, 12, 10, 17, 50, 2, 50, 35, 12, 10, - 17, 249, 165, 2, 236, 181, 67, 35, 12, 10, 17, 253, 105, 2, 236, 181, 67, - 35, 12, 10, 17, 67, 131, 2, 236, 181, 67, 35, 12, 10, 17, 242, 102, 2, - 239, 211, 35, 12, 10, 17, 242, 102, 2, 239, 220, 35, 12, 10, 17, 242, - 102, 2, 244, 249, 35, 12, 10, 17, 242, 102, 2, 244, 248, 35, 12, 10, 17, - 242, 102, 2, 244, 252, 35, 12, 10, 17, 242, 102, 2, 236, 181, 67, 35, 12, - 10, 17, 50, 2, 125, 53, 2, 253, 105, 29, 12, 10, 17, 50, 2, 125, 53, 2, - 249, 59, 29, 12, 10, 17, 50, 2, 125, 53, 2, 43, 29, 12, 10, 17, 50, 2, - 125, 53, 2, 177, 29, 12, 10, 17, 50, 2, 125, 53, 2, 67, 131, 29, 12, 10, - 17, 50, 2, 125, 53, 2, 50, 29, 12, 10, 17, 253, 102, 2, 253, 105, 29, 12, - 10, 17, 253, 102, 2, 249, 59, 29, 12, 10, 17, 253, 102, 2, 43, 29, 12, - 10, 17, 253, 102, 2, 177, 29, 12, 10, 17, 253, 102, 2, 67, 131, 29, 12, - 10, 17, 253, 102, 2, 50, 29, 12, 10, 17, 191, 2, 253, 105, 29, 12, 10, - 17, 191, 2, 249, 59, 29, 12, 10, 17, 191, 2, 43, 29, 12, 10, 17, 191, 2, - 177, 29, 12, 10, 17, 191, 2, 67, 131, 29, 12, 10, 17, 191, 2, 50, 29, 12, - 10, 17, 249, 20, 2, 253, 105, 29, 12, 10, 17, 249, 20, 2, 249, 59, 29, - 12, 10, 17, 249, 20, 2, 43, 29, 12, 10, 17, 249, 20, 2, 177, 29, 12, 10, - 17, 249, 20, 2, 67, 131, 29, 12, 10, 17, 249, 20, 2, 50, 29, 12, 10, 17, - 253, 111, 2, 67, 131, 29, 12, 10, 17, 253, 111, 2, 50, 29, 12, 10, 17, - 253, 120, 2, 67, 131, 29, 12, 10, 17, 253, 120, 2, 50, 29, 12, 10, 17, - 253, 87, 2, 67, 29, 12, 10, 17, 253, 87, 2, 155, 29, 12, 10, 17, 253, 87, - 2, 43, 29, 12, 10, 17, 253, 87, 2, 67, 131, 29, 12, 10, 17, 253, 87, 2, - 50, 29, 12, 10, 17, 155, 2, 43, 29, 12, 10, 17, 155, 2, 67, 131, 29, 12, - 10, 17, 155, 2, 50, 29, 12, 10, 17, 43, 2, 67, 29, 12, 10, 17, 43, 2, 43, - 29, 12, 10, 17, 177, 2, 253, 105, 29, 12, 10, 17, 177, 2, 249, 59, 29, - 12, 10, 17, 177, 2, 43, 29, 12, 10, 17, 177, 2, 177, 29, 12, 10, 17, 177, - 2, 67, 131, 29, 12, 10, 17, 177, 2, 50, 29, 12, 10, 17, 67, 131, 2, 236, - 181, 67, 29, 12, 10, 17, 50, 2, 253, 105, 29, 12, 10, 17, 50, 2, 249, 59, - 29, 12, 10, 17, 50, 2, 43, 29, 12, 10, 17, 50, 2, 177, 29, 12, 10, 17, - 50, 2, 67, 131, 29, 12, 10, 17, 50, 2, 50, 29, 12, 10, 17, 50, 2, 125, - 53, 2, 89, 46, 12, 10, 17, 50, 2, 125, 53, 2, 81, 46, 12, 10, 17, 50, 2, - 125, 53, 2, 145, 46, 12, 10, 17, 50, 2, 125, 53, 2, 43, 46, 12, 10, 17, - 50, 2, 125, 53, 2, 188, 46, 12, 10, 17, 253, 102, 2, 89, 46, 12, 10, 17, - 253, 102, 2, 81, 46, 12, 10, 17, 253, 102, 2, 145, 46, 12, 10, 17, 253, - 102, 2, 43, 46, 12, 10, 17, 253, 102, 2, 188, 46, 12, 10, 17, 191, 2, 89, - 46, 12, 10, 17, 191, 2, 81, 46, 12, 10, 17, 191, 2, 145, 46, 12, 10, 17, - 191, 2, 43, 46, 12, 10, 17, 191, 2, 188, 46, 12, 10, 17, 249, 20, 2, 43, - 46, 12, 10, 17, 89, 2, 81, 46, 12, 10, 17, 89, 2, 43, 46, 12, 10, 17, 81, - 2, 89, 46, 12, 10, 17, 81, 2, 43, 46, 12, 10, 17, 145, 2, 89, 46, 12, 10, - 17, 145, 2, 43, 46, 12, 10, 17, 214, 2, 89, 46, 12, 10, 17, 214, 2, 81, - 46, 12, 10, 17, 214, 2, 145, 46, 12, 10, 17, 214, 2, 43, 46, 12, 10, 17, - 253, 108, 2, 81, 46, 12, 10, 17, 253, 108, 2, 145, 46, 12, 10, 17, 253, - 108, 2, 43, 46, 12, 10, 17, 253, 107, 2, 89, 46, 12, 10, 17, 253, 107, 2, - 81, 46, 12, 10, 17, 253, 107, 2, 145, 46, 12, 10, 17, 253, 107, 2, 43, - 46, 12, 10, 17, 253, 122, 2, 81, 46, 12, 10, 17, 253, 201, 2, 43, 46, 12, - 10, 17, 253, 117, 2, 89, 46, 12, 10, 17, 253, 117, 2, 43, 46, 12, 10, 17, - 244, 190, 2, 89, 46, 12, 10, 17, 244, 190, 2, 43, 46, 12, 10, 17, 253, - 111, 2, 89, 46, 12, 10, 17, 253, 111, 2, 81, 46, 12, 10, 17, 253, 111, 2, - 145, 46, 12, 10, 17, 253, 111, 2, 43, 46, 12, 10, 17, 253, 120, 2, 81, - 46, 12, 10, 17, 253, 120, 2, 43, 46, 12, 10, 17, 253, 87, 2, 89, 46, 12, - 10, 17, 253, 87, 2, 81, 46, 12, 10, 17, 253, 87, 2, 145, 46, 12, 10, 17, - 253, 87, 2, 155, 46, 12, 10, 17, 253, 87, 2, 43, 46, 12, 10, 17, 155, 2, - 89, 46, 12, 10, 17, 155, 2, 81, 46, 12, 10, 17, 155, 2, 145, 46, 12, 10, - 17, 155, 2, 43, 46, 12, 10, 17, 155, 2, 188, 46, 12, 10, 17, 43, 2, 89, - 46, 12, 10, 17, 43, 2, 81, 46, 12, 10, 17, 43, 2, 145, 46, 12, 10, 17, - 43, 2, 43, 46, 12, 10, 17, 177, 2, 89, 46, 12, 10, 17, 177, 2, 81, 46, - 12, 10, 17, 177, 2, 145, 46, 12, 10, 17, 177, 2, 43, 46, 12, 10, 17, 177, - 2, 188, 46, 12, 10, 17, 188, 2, 89, 46, 12, 10, 17, 188, 2, 43, 46, 12, - 10, 17, 188, 2, 236, 181, 67, 46, 12, 10, 17, 50, 2, 89, 46, 12, 10, 17, - 50, 2, 81, 46, 12, 10, 17, 50, 2, 145, 46, 12, 10, 17, 50, 2, 43, 46, 12, - 10, 17, 50, 2, 188, 46, 12, 10, 17, 50, 2, 125, 53, 2, 43, 98, 12, 10, - 17, 50, 2, 125, 53, 2, 188, 98, 12, 10, 17, 253, 102, 2, 43, 98, 12, 10, - 17, 253, 102, 2, 188, 98, 12, 10, 17, 191, 2, 43, 98, 12, 10, 17, 191, 2, - 188, 98, 12, 10, 17, 249, 20, 2, 43, 98, 12, 10, 17, 249, 20, 2, 188, 98, - 12, 10, 17, 214, 2, 43, 98, 12, 10, 17, 214, 2, 188, 98, 12, 10, 17, 215, - 2, 43, 98, 12, 10, 17, 215, 2, 188, 98, 12, 10, 17, 253, 87, 2, 155, 98, - 12, 10, 17, 253, 87, 2, 43, 98, 12, 10, 17, 155, 2, 43, 98, 12, 10, 17, - 177, 2, 43, 98, 12, 10, 17, 177, 2, 188, 98, 12, 10, 17, 50, 2, 43, 98, - 12, 10, 17, 50, 2, 188, 98, 12, 10, 17, 242, 102, 2, 244, 249, 98, 12, - 10, 17, 242, 102, 2, 244, 248, 98, 12, 10, 17, 242, 102, 2, 244, 252, 98, - 12, 10, 17, 253, 122, 2, 67, 131, 35, 12, 10, 17, 253, 122, 2, 50, 35, - 12, 10, 17, 253, 117, 2, 67, 131, 35, 12, 10, 17, 253, 117, 2, 50, 35, - 12, 10, 17, 244, 190, 2, 67, 131, 35, 12, 10, 17, 244, 190, 2, 50, 35, - 12, 10, 17, 214, 2, 67, 131, 35, 12, 10, 17, 214, 2, 50, 35, 12, 10, 17, - 215, 2, 67, 131, 35, 12, 10, 17, 215, 2, 50, 35, 12, 10, 17, 81, 2, 67, - 131, 35, 12, 10, 17, 81, 2, 50, 35, 12, 10, 17, 89, 2, 67, 131, 35, 12, - 10, 17, 89, 2, 50, 35, 12, 10, 17, 145, 2, 67, 131, 35, 12, 10, 17, 145, - 2, 50, 35, 12, 10, 17, 253, 108, 2, 67, 131, 35, 12, 10, 17, 253, 108, 2, - 50, 35, 12, 10, 17, 253, 107, 2, 67, 131, 35, 12, 10, 17, 253, 107, 2, - 50, 35, 12, 10, 17, 215, 2, 89, 35, 12, 10, 17, 215, 2, 81, 35, 12, 10, - 17, 215, 2, 145, 35, 12, 10, 17, 215, 2, 43, 35, 12, 10, 17, 215, 2, 253, - 105, 35, 12, 10, 17, 214, 2, 253, 105, 35, 12, 10, 17, 253, 108, 2, 253, - 105, 35, 12, 10, 17, 253, 107, 2, 253, 105, 35, 12, 10, 17, 253, 122, 2, - 67, 131, 29, 12, 10, 17, 253, 122, 2, 50, 29, 12, 10, 17, 253, 117, 2, - 67, 131, 29, 12, 10, 17, 253, 117, 2, 50, 29, 12, 10, 17, 244, 190, 2, - 67, 131, 29, 12, 10, 17, 244, 190, 2, 50, 29, 12, 10, 17, 214, 2, 67, - 131, 29, 12, 10, 17, 214, 2, 50, 29, 12, 10, 17, 215, 2, 67, 131, 29, 12, - 10, 17, 215, 2, 50, 29, 12, 10, 17, 81, 2, 67, 131, 29, 12, 10, 17, 81, - 2, 50, 29, 12, 10, 17, 89, 2, 67, 131, 29, 12, 10, 17, 89, 2, 50, 29, 12, - 10, 17, 145, 2, 67, 131, 29, 12, 10, 17, 145, 2, 50, 29, 12, 10, 17, 253, - 108, 2, 67, 131, 29, 12, 10, 17, 253, 108, 2, 50, 29, 12, 10, 17, 253, - 107, 2, 67, 131, 29, 12, 10, 17, 253, 107, 2, 50, 29, 12, 10, 17, 215, 2, - 89, 29, 12, 10, 17, 215, 2, 81, 29, 12, 10, 17, 215, 2, 145, 29, 12, 10, - 17, 215, 2, 43, 29, 12, 10, 17, 215, 2, 253, 105, 29, 12, 10, 17, 214, 2, - 253, 105, 29, 12, 10, 17, 253, 108, 2, 253, 105, 29, 12, 10, 17, 253, - 107, 2, 253, 105, 29, 12, 10, 17, 215, 2, 89, 46, 12, 10, 17, 215, 2, 81, - 46, 12, 10, 17, 215, 2, 145, 46, 12, 10, 17, 215, 2, 43, 46, 12, 10, 17, - 214, 2, 188, 46, 12, 10, 17, 215, 2, 188, 46, 12, 10, 17, 253, 122, 2, - 43, 46, 12, 10, 17, 214, 2, 89, 98, 12, 10, 17, 214, 2, 81, 98, 12, 10, - 17, 214, 2, 145, 98, 12, 10, 17, 215, 2, 89, 98, 12, 10, 17, 215, 2, 81, - 98, 12, 10, 17, 215, 2, 145, 98, 12, 10, 17, 253, 122, 2, 43, 98, 12, 10, - 17, 253, 201, 2, 43, 98, 12, 10, 17, 67, 2, 239, 172, 29, 12, 10, 17, 67, - 2, 239, 172, 35, 12, 242, 236, 36, 236, 47, 242, 236, 37, 236, 47, 10, - 17, 191, 2, 89, 2, 43, 46, 12, 10, 17, 191, 2, 81, 2, 89, 29, 12, 10, 17, - 191, 2, 81, 2, 89, 46, 12, 10, 17, 191, 2, 81, 2, 43, 46, 12, 10, 17, - 191, 2, 145, 2, 43, 46, 12, 10, 17, 191, 2, 43, 2, 89, 46, 12, 10, 17, - 191, 2, 43, 2, 81, 46, 12, 10, 17, 191, 2, 43, 2, 145, 46, 12, 10, 17, - 89, 2, 43, 2, 81, 29, 12, 10, 17, 89, 2, 43, 2, 81, 46, 12, 10, 17, 81, - 2, 43, 2, 50, 29, 12, 10, 17, 81, 2, 43, 2, 67, 131, 29, 12, 10, 17, 214, - 2, 81, 2, 89, 46, 12, 10, 17, 214, 2, 89, 2, 81, 46, 12, 10, 17, 214, 2, - 89, 2, 67, 131, 29, 12, 10, 17, 214, 2, 43, 2, 81, 29, 12, 10, 17, 214, - 2, 43, 2, 81, 46, 12, 10, 17, 214, 2, 43, 2, 89, 46, 12, 10, 17, 214, 2, - 43, 2, 43, 29, 12, 10, 17, 214, 2, 43, 2, 43, 46, 12, 10, 17, 253, 108, - 2, 81, 2, 81, 29, 12, 10, 17, 253, 108, 2, 81, 2, 81, 46, 12, 10, 17, - 253, 108, 2, 43, 2, 43, 29, 12, 10, 17, 215, 2, 81, 2, 43, 29, 12, 10, - 17, 215, 2, 81, 2, 43, 46, 12, 10, 17, 215, 2, 89, 2, 50, 29, 12, 10, 17, - 215, 2, 43, 2, 145, 29, 12, 10, 17, 215, 2, 43, 2, 145, 46, 12, 10, 17, - 215, 2, 43, 2, 43, 29, 12, 10, 17, 215, 2, 43, 2, 43, 46, 12, 10, 17, - 253, 107, 2, 81, 2, 67, 131, 29, 12, 10, 17, 253, 107, 2, 145, 2, 43, 29, - 12, 10, 17, 253, 107, 2, 145, 2, 43, 46, 12, 10, 17, 253, 122, 2, 43, 2, - 81, 29, 12, 10, 17, 253, 122, 2, 43, 2, 81, 46, 12, 10, 17, 253, 122, 2, - 43, 2, 43, 46, 12, 10, 17, 253, 122, 2, 43, 2, 50, 29, 12, 10, 17, 253, - 117, 2, 89, 2, 43, 29, 12, 10, 17, 253, 117, 2, 43, 2, 43, 29, 12, 10, - 17, 253, 117, 2, 43, 2, 43, 46, 12, 10, 17, 253, 117, 2, 43, 2, 67, 131, - 29, 12, 10, 17, 244, 190, 2, 43, 2, 43, 29, 12, 10, 17, 244, 190, 2, 43, - 2, 50, 29, 12, 10, 17, 244, 190, 2, 43, 2, 67, 131, 29, 12, 10, 17, 253, - 111, 2, 145, 2, 43, 29, 12, 10, 17, 253, 111, 2, 145, 2, 43, 46, 12, 10, - 17, 253, 120, 2, 43, 2, 81, 29, 12, 10, 17, 253, 120, 2, 43, 2, 43, 29, - 12, 10, 17, 155, 2, 81, 2, 43, 29, 12, 10, 17, 155, 2, 81, 2, 50, 29, 12, - 10, 17, 155, 2, 81, 2, 67, 131, 29, 12, 10, 17, 155, 2, 89, 2, 89, 46, - 12, 10, 17, 155, 2, 89, 2, 89, 29, 12, 10, 17, 155, 2, 145, 2, 43, 29, - 12, 10, 17, 155, 2, 145, 2, 43, 46, 12, 10, 17, 155, 2, 43, 2, 81, 29, - 12, 10, 17, 155, 2, 43, 2, 81, 46, 12, 10, 17, 43, 2, 81, 2, 89, 46, 12, - 10, 17, 43, 2, 81, 2, 43, 46, 12, 10, 17, 43, 2, 81, 2, 50, 29, 12, 10, - 17, 43, 2, 89, 2, 81, 46, 12, 10, 17, 43, 2, 89, 2, 43, 46, 12, 10, 17, - 43, 2, 145, 2, 89, 46, 12, 10, 17, 43, 2, 145, 2, 43, 46, 12, 10, 17, 43, - 2, 89, 2, 145, 46, 12, 10, 17, 188, 2, 43, 2, 89, 46, 12, 10, 17, 188, 2, - 43, 2, 43, 46, 12, 10, 17, 177, 2, 81, 2, 43, 46, 12, 10, 17, 177, 2, 81, - 2, 67, 131, 29, 12, 10, 17, 177, 2, 89, 2, 43, 29, 12, 10, 17, 177, 2, - 89, 2, 43, 46, 12, 10, 17, 177, 2, 89, 2, 67, 131, 29, 12, 10, 17, 177, - 2, 43, 2, 50, 29, 12, 10, 17, 177, 2, 43, 2, 67, 131, 29, 12, 10, 17, 50, - 2, 43, 2, 43, 29, 12, 10, 17, 50, 2, 43, 2, 43, 46, 12, 10, 17, 253, 102, - 2, 145, 2, 50, 29, 12, 10, 17, 191, 2, 89, 2, 50, 29, 12, 10, 17, 191, 2, - 89, 2, 67, 131, 29, 12, 10, 17, 191, 2, 145, 2, 50, 29, 12, 10, 17, 191, - 2, 145, 2, 67, 131, 29, 12, 10, 17, 191, 2, 43, 2, 50, 29, 12, 10, 17, - 191, 2, 43, 2, 67, 131, 29, 12, 10, 17, 89, 2, 43, 2, 50, 29, 12, 10, 17, - 89, 2, 81, 2, 67, 131, 29, 12, 10, 17, 89, 2, 43, 2, 67, 131, 29, 12, 10, - 17, 214, 2, 145, 2, 67, 131, 29, 12, 10, 17, 253, 108, 2, 81, 2, 50, 29, - 12, 10, 17, 215, 2, 81, 2, 50, 29, 12, 10, 17, 253, 107, 2, 81, 2, 50, - 29, 12, 10, 17, 155, 2, 89, 2, 50, 29, 12, 10, 17, 155, 2, 43, 2, 50, 29, - 12, 10, 17, 50, 2, 81, 2, 50, 29, 12, 10, 17, 50, 2, 89, 2, 50, 29, 12, - 10, 17, 50, 2, 43, 2, 50, 29, 12, 10, 17, 43, 2, 43, 2, 50, 29, 12, 10, - 17, 253, 120, 2, 43, 2, 50, 29, 12, 10, 17, 177, 2, 81, 2, 50, 29, 12, - 10, 17, 253, 120, 2, 43, 2, 81, 46, 12, 10, 17, 155, 2, 81, 2, 43, 46, - 12, 10, 17, 253, 117, 2, 43, 2, 50, 29, 12, 10, 17, 253, 87, 2, 43, 2, - 50, 29, 12, 10, 17, 177, 2, 89, 2, 81, 46, 12, 10, 17, 43, 2, 145, 2, 50, - 29, 12, 10, 17, 155, 2, 89, 2, 43, 46, 12, 10, 17, 253, 87, 2, 43, 2, 43, - 29, 12, 10, 17, 155, 2, 89, 2, 43, 29, 12, 10, 17, 177, 2, 89, 2, 81, 29, - 12, 10, 17, 89, 2, 81, 2, 50, 29, 12, 10, 17, 81, 2, 89, 2, 50, 29, 12, - 10, 17, 43, 2, 89, 2, 50, 29, 12, 10, 17, 253, 111, 2, 43, 2, 50, 29, 12, - 10, 17, 253, 102, 2, 81, 2, 50, 29, 12, 10, 17, 253, 87, 2, 43, 2, 43, - 46, 12, 10, 17, 253, 117, 2, 89, 2, 43, 46, 12, 10, 17, 253, 108, 2, 43, - 2, 43, 46, 12, 10, 17, 214, 2, 145, 2, 50, 29, 12, 10, 17, 177, 2, 89, 2, - 50, 29, 12, 10, 17, 245, 176, 250, 101, 254, 217, 241, 64, 249, 71, 25, - 35, 12, 10, 17, 252, 82, 250, 101, 254, 217, 241, 64, 249, 71, 25, 35, - 12, 10, 17, 245, 244, 35, 12, 10, 17, 245, 242, 35, 12, 10, 17, 240, 118, - 35, 12, 10, 17, 248, 52, 35, 12, 10, 17, 244, 52, 35, 12, 10, 17, 242, - 196, 35, 12, 10, 17, 240, 196, 35, 12, 10, 17, 245, 176, 35, 12, 10, 17, - 237, 85, 242, 196, 239, 111, 10, 17, 234, 51, 252, 124, 57, 238, 79, 237, - 86, 238, 79, 237, 87, 238, 79, 237, 88, 238, 79, 237, 89, 238, 79, 237, - 90, 238, 79, 237, 91, 238, 79, 237, 92, 238, 79, 237, 93, 238, 79, 237, - 94, 238, 79, 236, 163, 238, 79, 236, 164, 238, 79, 236, 165, 238, 79, - 236, 166, 238, 79, 236, 167, 238, 79, 236, 168, 238, 79, 236, 169, 48, - 17, 36, 244, 217, 48, 17, 37, 244, 217, 48, 42, 229, 36, 244, 217, 48, - 42, 229, 37, 244, 217, 236, 45, 249, 3, 54, 55, 225, 49, 241, 25, 236, - 45, 249, 3, 54, 55, 254, 220, 244, 189, 236, 45, 249, 3, 54, 55, 254, - 215, 244, 189, 236, 45, 249, 3, 54, 55, 253, 113, 244, 176, 236, 45, 249, - 3, 54, 55, 249, 57, 253, 113, 244, 176, 236, 45, 249, 3, 54, 55, 36, 236, - 47, 236, 45, 249, 3, 54, 55, 37, 236, 47, 236, 45, 249, 3, 54, 55, 36, - 244, 175, 110, 236, 45, 249, 3, 54, 55, 37, 244, 175, 110, 236, 45, 249, - 3, 54, 55, 36, 239, 139, 244, 202, 110, 236, 45, 249, 3, 54, 55, 37, 239, - 139, 244, 202, 110, 236, 45, 249, 3, 54, 55, 36, 86, 237, 126, 110, 236, - 45, 249, 3, 54, 55, 37, 86, 237, 126, 110, 236, 45, 249, 3, 54, 55, 36, - 42, 160, 110, 236, 45, 249, 3, 54, 55, 37, 42, 160, 110, 236, 45, 249, 3, - 54, 55, 36, 160, 110, 236, 45, 249, 3, 54, 55, 37, 160, 110, 236, 45, - 249, 3, 54, 55, 36, 242, 86, 110, 236, 45, 249, 3, 54, 55, 37, 242, 86, - 110, 236, 45, 249, 3, 54, 55, 36, 58, 242, 86, 110, 236, 45, 249, 3, 54, - 55, 37, 58, 242, 86, 110, 242, 247, 227, 58, 242, 247, 227, 242, 105, - 238, 98, 237, 149, 238, 98, 249, 57, 238, 98, 42, 249, 57, 238, 98, 242, - 105, 253, 113, 244, 176, 237, 149, 253, 113, 244, 176, 249, 57, 253, 113, - 244, 176, 3, 242, 84, 3, 66, 242, 84, 3, 213, 189, 3, 237, 123, 3, 242, - 81, 3, 239, 126, 65, 3, 236, 186, 65, 3, 254, 220, 244, 189, 3, 36, 236, - 47, 3, 37, 236, 47, 3, 36, 244, 175, 110, 3, 37, 244, 175, 110, 3, 36, - 239, 139, 244, 202, 110, 3, 37, 239, 139, 244, 202, 110, 3, 83, 57, 3, - 237, 124, 3, 238, 77, 3, 249, 4, 57, 3, 235, 243, 3, 206, 57, 3, 196, 57, - 3, 242, 61, 57, 3, 240, 219, 239, 144, 3, 242, 158, 57, 3, 240, 248, 57, - 3, 237, 127, 253, 220, 10, 239, 172, 35, 12, 10, 242, 30, 2, 239, 172, - 47, 10, 239, 211, 35, 12, 10, 249, 88, 239, 20, 10, 239, 220, 35, 12, 10, - 244, 249, 35, 12, 10, 244, 249, 98, 12, 10, 244, 248, 35, 12, 10, 244, - 248, 98, 12, 10, 244, 252, 35, 12, 10, 244, 252, 98, 12, 10, 242, 102, - 35, 12, 10, 242, 102, 98, 12, 10, 245, 197, 35, 12, 10, 245, 197, 98, 12, - 10, 1, 125, 35, 12, 10, 1, 67, 2, 244, 237, 53, 35, 12, 10, 1, 67, 2, - 244, 237, 53, 29, 12, 10, 1, 67, 2, 125, 53, 35, 12, 10, 1, 67, 2, 125, - 53, 29, 12, 10, 1, 253, 162, 2, 125, 53, 35, 12, 10, 1, 253, 162, 2, 125, - 53, 29, 12, 10, 1, 67, 2, 125, 244, 188, 35, 12, 10, 1, 67, 2, 125, 244, - 188, 29, 12, 10, 1, 50, 2, 125, 53, 35, 12, 10, 1, 50, 2, 125, 53, 29, - 12, 10, 1, 50, 2, 125, 53, 46, 12, 10, 1, 50, 2, 125, 53, 98, 12, 10, 1, - 67, 35, 12, 10, 1, 67, 29, 12, 10, 1, 253, 102, 35, 12, 10, 1, 253, 102, - 29, 12, 10, 1, 253, 102, 46, 12, 10, 1, 253, 102, 98, 12, 10, 1, 191, - 241, 26, 35, 12, 10, 1, 191, 241, 26, 29, 12, 10, 1, 191, 35, 12, 10, 1, - 191, 29, 12, 10, 1, 191, 46, 12, 10, 1, 191, 98, 12, 10, 1, 249, 20, 35, - 12, 10, 1, 249, 20, 29, 12, 10, 1, 249, 20, 46, 12, 10, 1, 249, 20, 98, - 12, 10, 1, 89, 35, 12, 10, 1, 89, 29, 12, 10, 1, 89, 46, 12, 10, 1, 89, - 98, 12, 10, 1, 81, 35, 12, 10, 1, 81, 29, 12, 10, 1, 81, 46, 12, 10, 1, - 81, 98, 12, 10, 1, 145, 35, 12, 10, 1, 145, 29, 12, 10, 1, 145, 46, 12, - 10, 1, 145, 98, 12, 10, 1, 253, 180, 35, 12, 10, 1, 253, 180, 29, 12, 10, - 1, 249, 165, 35, 12, 10, 1, 249, 165, 29, 12, 10, 1, 253, 105, 35, 12, - 10, 1, 253, 105, 29, 12, 10, 1, 249, 59, 35, 12, 10, 1, 249, 59, 29, 12, - 10, 1, 214, 35, 12, 10, 1, 214, 29, 12, 10, 1, 214, 46, 12, 10, 1, 214, - 98, 12, 10, 1, 215, 35, 12, 10, 1, 215, 29, 12, 10, 1, 215, 46, 12, 10, - 1, 215, 98, 12, 10, 1, 253, 108, 35, 12, 10, 1, 253, 108, 29, 12, 10, 1, - 253, 108, 46, 12, 10, 1, 253, 108, 98, 12, 10, 1, 253, 107, 35, 12, 10, - 1, 253, 107, 29, 12, 10, 1, 253, 107, 46, 12, 10, 1, 253, 107, 98, 12, - 10, 1, 253, 122, 35, 12, 10, 1, 253, 122, 29, 12, 10, 1, 253, 122, 46, - 12, 10, 1, 253, 122, 98, 12, 10, 1, 253, 201, 35, 12, 10, 1, 253, 201, - 29, 12, 10, 1, 253, 201, 46, 12, 10, 1, 253, 201, 98, 12, 10, 1, 253, - 117, 35, 12, 10, 1, 253, 117, 29, 12, 10, 1, 253, 117, 46, 12, 10, 1, - 253, 117, 98, 12, 10, 1, 244, 190, 35, 12, 10, 1, 244, 190, 29, 12, 10, - 1, 244, 190, 46, 12, 10, 1, 244, 190, 98, 12, 10, 1, 253, 111, 35, 12, - 10, 1, 253, 111, 29, 12, 10, 1, 253, 111, 46, 12, 10, 1, 253, 111, 98, - 12, 10, 1, 253, 120, 35, 12, 10, 1, 253, 120, 29, 12, 10, 1, 253, 120, - 46, 12, 10, 1, 253, 120, 98, 12, 10, 1, 253, 87, 35, 12, 10, 1, 253, 87, - 29, 12, 10, 1, 253, 87, 46, 12, 10, 1, 253, 87, 98, 12, 10, 1, 155, 35, - 12, 10, 1, 155, 29, 12, 10, 1, 155, 46, 12, 10, 1, 155, 98, 12, 10, 1, - 43, 35, 12, 10, 1, 43, 29, 12, 10, 1, 43, 46, 12, 10, 1, 43, 98, 12, 10, - 1, 177, 35, 12, 10, 1, 177, 29, 12, 10, 1, 177, 46, 12, 10, 1, 177, 98, - 12, 10, 1, 188, 35, 12, 10, 1, 188, 29, 12, 10, 1, 188, 46, 12, 10, 1, - 188, 98, 12, 10, 1, 253, 162, 35, 12, 10, 1, 253, 162, 29, 12, 10, 1, 67, - 131, 35, 12, 10, 1, 67, 131, 29, 12, 10, 1, 50, 35, 12, 10, 1, 50, 29, - 12, 10, 1, 50, 46, 12, 10, 1, 50, 98, 12, 10, 17, 155, 2, 67, 2, 244, - 237, 53, 35, 12, 10, 17, 155, 2, 67, 2, 244, 237, 53, 29, 12, 10, 17, - 155, 2, 67, 2, 125, 53, 35, 12, 10, 17, 155, 2, 67, 2, 125, 53, 29, 12, - 10, 17, 155, 2, 67, 2, 125, 244, 188, 35, 12, 10, 17, 155, 2, 67, 2, 125, - 244, 188, 29, 12, 10, 17, 155, 2, 67, 35, 12, 10, 17, 155, 2, 67, 29, 12, - 249, 127, 245, 12, 239, 190, 242, 69, 73, 236, 186, 65, 73, 238, 76, 65, - 73, 83, 57, 73, 242, 158, 57, 73, 240, 248, 57, 73, 237, 124, 73, 236, - 190, 73, 36, 236, 47, 73, 37, 236, 47, 73, 238, 77, 73, 249, 4, 57, 73, - 242, 84, 73, 235, 243, 73, 213, 189, 73, 239, 144, 73, 27, 244, 173, 73, - 27, 121, 73, 27, 114, 73, 27, 153, 73, 27, 163, 73, 27, 168, 73, 27, 169, - 73, 27, 179, 73, 27, 176, 73, 27, 178, 73, 242, 81, 73, 237, 123, 73, - 206, 57, 73, 242, 61, 57, 73, 196, 57, 73, 239, 126, 65, 73, 237, 127, - 253, 220, 73, 9, 5, 1, 64, 73, 9, 5, 1, 199, 73, 9, 5, 1, 203, 73, 9, 5, - 1, 187, 73, 9, 5, 1, 70, 73, 9, 5, 1, 204, 73, 9, 5, 1, 194, 73, 9, 5, 1, - 164, 73, 9, 5, 1, 69, 73, 9, 5, 1, 200, 73, 9, 5, 1, 205, 73, 9, 5, 1, - 148, 73, 9, 5, 1, 171, 73, 9, 5, 1, 183, 73, 9, 5, 1, 78, 73, 9, 5, 1, - 198, 73, 9, 5, 1, 209, 73, 9, 5, 1, 135, 73, 9, 5, 1, 159, 73, 9, 5, 1, - 190, 73, 9, 5, 1, 84, 73, 9, 5, 1, 186, 73, 9, 5, 1, 201, 73, 9, 5, 1, - 170, 73, 9, 5, 1, 181, 73, 9, 5, 1, 202, 73, 36, 30, 110, 73, 240, 219, - 239, 144, 73, 37, 30, 110, 73, 157, 240, 203, 73, 253, 113, 244, 176, 73, - 244, 201, 240, 203, 73, 9, 3, 1, 64, 73, 9, 3, 1, 199, 73, 9, 3, 1, 203, - 73, 9, 3, 1, 187, 73, 9, 3, 1, 70, 73, 9, 3, 1, 204, 73, 9, 3, 1, 194, - 73, 9, 3, 1, 164, 73, 9, 3, 1, 69, 73, 9, 3, 1, 200, 73, 9, 3, 1, 205, - 73, 9, 3, 1, 148, 73, 9, 3, 1, 171, 73, 9, 3, 1, 183, 73, 9, 3, 1, 78, - 73, 9, 3, 1, 198, 73, 9, 3, 1, 209, 73, 9, 3, 1, 135, 73, 9, 3, 1, 159, - 73, 9, 3, 1, 190, 73, 9, 3, 1, 84, 73, 9, 3, 1, 186, 73, 9, 3, 1, 201, - 73, 9, 3, 1, 170, 73, 9, 3, 1, 181, 73, 9, 3, 1, 202, 73, 36, 244, 175, - 110, 73, 55, 244, 176, 73, 37, 244, 175, 110, 73, 180, 73, 36, 58, 236, - 47, 73, 37, 58, 236, 47, 62, 66, 213, 189, 62, 36, 242, 86, 110, 62, 37, - 242, 86, 110, 62, 66, 242, 84, 62, 39, 242, 65, 227, 62, 39, 1, 253, 138, - 62, 39, 1, 3, 64, 62, 39, 1, 3, 69, 62, 39, 1, 3, 84, 62, 39, 1, 3, 70, - 62, 39, 1, 3, 78, 62, 39, 1, 3, 216, 62, 39, 1, 3, 253, 124, 62, 39, 1, - 3, 253, 123, 62, 39, 1, 3, 253, 160, 62, 232, 3, 238, 153, 244, 205, 65, - 62, 39, 1, 64, 62, 39, 1, 69, 62, 39, 1, 84, 62, 39, 1, 70, 62, 39, 1, - 78, 62, 39, 1, 208, 62, 39, 1, 253, 182, 62, 39, 1, 253, 183, 62, 39, 1, - 253, 134, 62, 39, 1, 253, 155, 62, 39, 1, 253, 97, 62, 39, 1, 253, 158, - 62, 39, 1, 253, 172, 62, 39, 1, 253, 171, 62, 39, 1, 253, 159, 62, 39, 1, - 253, 91, 62, 39, 1, 253, 174, 62, 39, 1, 253, 160, 62, 39, 1, 253, 151, - 62, 39, 1, 76, 62, 39, 1, 253, 94, 62, 39, 1, 253, 148, 62, 39, 1, 253, - 112, 62, 39, 1, 253, 157, 62, 39, 1, 253, 136, 62, 39, 1, 253, 88, 62, - 39, 1, 253, 154, 62, 39, 1, 253, 197, 62, 39, 1, 253, 125, 62, 39, 1, - 253, 140, 62, 39, 1, 221, 62, 39, 1, 253, 156, 62, 39, 1, 253, 114, 62, - 39, 1, 253, 167, 62, 39, 1, 253, 141, 62, 39, 1, 216, 62, 39, 1, 253, - 124, 62, 39, 1, 253, 123, 62, 39, 1, 253, 92, 62, 39, 1, 253, 169, 62, - 39, 1, 253, 170, 62, 39, 1, 253, 150, 62, 39, 1, 253, 144, 62, 39, 1, - 253, 98, 62, 39, 1, 183, 62, 39, 242, 116, 244, 205, 65, 62, 39, 236, - 205, 244, 205, 65, 62, 20, 240, 255, 62, 20, 1, 240, 242, 62, 20, 1, 236, - 59, 62, 20, 1, 236, 63, 62, 20, 1, 242, 131, 62, 20, 1, 236, 65, 62, 20, - 1, 236, 66, 62, 20, 1, 240, 244, 62, 20, 1, 236, 72, 62, 20, 1, 242, 134, - 62, 20, 1, 235, 247, 62, 20, 1, 236, 67, 62, 20, 1, 236, 68, 62, 20, 1, - 236, 204, 62, 20, 1, 235, 197, 62, 20, 1, 235, 196, 62, 20, 1, 236, 57, - 62, 20, 1, 242, 129, 62, 20, 1, 242, 133, 62, 20, 1, 236, 209, 62, 20, 1, - 236, 198, 62, 20, 1, 244, 230, 62, 20, 1, 237, 138, 62, 20, 1, 242, 126, - 62, 20, 1, 242, 122, 62, 20, 1, 236, 207, 62, 20, 1, 239, 155, 62, 20, 1, - 239, 158, 62, 20, 1, 239, 166, 62, 20, 1, 239, 161, 62, 20, 1, 242, 125, - 62, 20, 1, 64, 62, 20, 1, 253, 163, 62, 20, 1, 216, 62, 20, 1, 249, 181, - 62, 20, 1, 254, 10, 62, 20, 1, 70, 62, 20, 1, 249, 182, 62, 20, 1, 253, - 200, 62, 20, 1, 78, 62, 20, 1, 253, 98, 62, 20, 1, 249, 175, 62, 20, 1, - 253, 142, 62, 20, 1, 253, 123, 62, 20, 1, 84, 62, 20, 1, 249, 177, 62, - 20, 1, 253, 132, 62, 20, 1, 253, 145, 62, 20, 1, 253, 124, 62, 20, 1, - 254, 12, 62, 20, 1, 253, 139, 62, 20, 1, 69, 73, 249, 196, 57, 73, 245, - 163, 57, 73, 141, 57, 73, 166, 73, 242, 173, 143, 73, 254, 78, 57, 73, - 254, 76, 57, 62, 246, 131, 117, 238, 88, 62, 126, 52, 62, 210, 52, 62, - 63, 52, 62, 220, 52, 62, 86, 240, 207, 62, 58, 240, 200, 236, 202, 237, - 111, 241, 97, 236, 202, 237, 111, 237, 114, 236, 202, 237, 111, 237, 103, - 244, 18, 236, 228, 237, 150, 236, 228, 237, 150, 222, 21, 1, 64, 222, 21, - 1, 253, 191, 222, 21, 1, 253, 134, 222, 21, 1, 253, 152, 222, 21, 1, 70, - 222, 21, 1, 253, 214, 222, 21, 1, 253, 189, 222, 21, 1, 253, 125, 222, - 21, 1, 249, 63, 222, 21, 1, 69, 222, 21, 1, 208, 222, 21, 1, 253, 223, - 222, 21, 1, 253, 224, 222, 21, 1, 253, 166, 222, 21, 1, 249, 67, 222, 21, - 1, 78, 222, 21, 1, 253, 143, 222, 21, 1, 249, 70, 222, 21, 1, 253, 183, - 222, 21, 1, 253, 205, 222, 21, 1, 253, 225, 222, 21, 1, 253, 151, 222, - 21, 1, 84, 222, 21, 1, 250, 242, 222, 21, 1, 250, 43, 222, 21, 1, 249, - 255, 222, 21, 1, 253, 222, 222, 21, 1, 250, 246, 222, 21, 1, 249, 44, - 222, 21, 1, 253, 96, 222, 21, 1, 253, 104, 222, 21, 151, 121, 222, 21, - 151, 168, 222, 21, 151, 249, 18, 222, 21, 151, 242, 144, 242, 62, 1, 245, - 238, 242, 62, 1, 240, 3, 242, 62, 1, 246, 154, 242, 62, 1, 246, 79, 242, - 62, 1, 241, 94, 242, 62, 1, 239, 66, 242, 62, 1, 247, 0, 242, 62, 1, 246, - 170, 242, 62, 1, 242, 36, 242, 62, 1, 250, 241, 242, 62, 1, 243, 194, - 242, 62, 1, 243, 199, 242, 62, 1, 243, 211, 242, 62, 1, 241, 219, 242, - 62, 1, 251, 120, 242, 62, 1, 248, 162, 242, 62, 1, 239, 56, 242, 62, 1, - 241, 69, 242, 62, 1, 244, 51, 242, 62, 1, 244, 71, 242, 62, 1, 244, 113, - 242, 62, 1, 244, 147, 242, 62, 1, 243, 105, 242, 62, 1, 243, 173, 242, - 62, 1, 242, 225, 242, 62, 1, 244, 21, 242, 62, 1, 250, 29, 239, 150, 111, - 5, 1, 165, 69, 111, 5, 1, 165, 70, 111, 5, 1, 165, 64, 111, 5, 1, 165, - 253, 219, 111, 5, 1, 165, 78, 111, 5, 1, 165, 253, 119, 111, 5, 1, 207, - 69, 111, 5, 1, 207, 70, 111, 5, 1, 207, 64, 111, 5, 1, 207, 253, 219, - 111, 5, 1, 207, 78, 111, 5, 1, 207, 253, 119, 111, 5, 1, 254, 2, 111, 5, - 1, 254, 64, 111, 5, 1, 253, 216, 111, 5, 1, 249, 125, 111, 5, 1, 164, - 111, 5, 1, 249, 114, 111, 5, 1, 249, 128, 111, 5, 1, 249, 164, 111, 5, 1, - 249, 96, 111, 5, 1, 244, 246, 111, 5, 1, 249, 104, 111, 5, 1, 249, 253, - 111, 5, 1, 249, 228, 111, 5, 1, 253, 222, 111, 5, 1, 249, 174, 111, 5, 1, - 249, 77, 111, 5, 1, 245, 9, 111, 5, 1, 253, 225, 111, 5, 1, 249, 126, - 111, 5, 1, 249, 67, 111, 5, 1, 245, 53, 111, 5, 1, 253, 205, 111, 5, 1, - 253, 223, 111, 5, 1, 253, 224, 111, 5, 1, 253, 166, 111, 5, 1, 249, 66, - 111, 3, 1, 165, 69, 111, 3, 1, 165, 70, 111, 3, 1, 165, 64, 111, 3, 1, - 165, 253, 219, 111, 3, 1, 165, 78, 111, 3, 1, 165, 253, 119, 111, 3, 1, - 207, 69, 111, 3, 1, 207, 70, 111, 3, 1, 207, 64, 111, 3, 1, 207, 253, - 219, 111, 3, 1, 207, 78, 111, 3, 1, 207, 253, 119, 111, 3, 1, 254, 2, - 111, 3, 1, 254, 64, 111, 3, 1, 253, 216, 111, 3, 1, 249, 125, 111, 3, 1, - 164, 111, 3, 1, 249, 114, 111, 3, 1, 249, 128, 111, 3, 1, 249, 164, 111, - 3, 1, 249, 96, 111, 3, 1, 244, 246, 111, 3, 1, 249, 104, 111, 3, 1, 249, - 253, 111, 3, 1, 249, 228, 111, 3, 1, 253, 222, 111, 3, 1, 249, 174, 111, - 3, 1, 249, 77, 111, 3, 1, 245, 9, 111, 3, 1, 253, 225, 111, 3, 1, 249, - 126, 111, 3, 1, 249, 67, 111, 3, 1, 245, 53, 111, 3, 1, 253, 205, 111, 3, - 1, 253, 223, 111, 3, 1, 253, 224, 111, 3, 1, 253, 166, 111, 3, 1, 249, - 66, 34, 19, 13, 242, 78, 34, 19, 13, 241, 135, 34, 19, 13, 236, 43, 34, - 19, 13, 245, 34, 236, 55, 34, 19, 13, 245, 34, 242, 124, 34, 19, 13, 242, - 192, 236, 55, 34, 19, 13, 242, 192, 242, 124, 34, 19, 13, 239, 36, 34, - 19, 13, 238, 66, 34, 19, 13, 236, 151, 34, 19, 13, 238, 74, 34, 19, 13, - 239, 113, 242, 124, 34, 19, 13, 239, 40, 34, 19, 13, 245, 55, 236, 55, - 34, 19, 13, 254, 39, 236, 55, 34, 19, 13, 241, 83, 34, 19, 13, 238, 24, - 34, 19, 13, 236, 244, 34, 19, 13, 237, 146, 242, 124, 34, 19, 13, 240, - 174, 34, 19, 13, 244, 117, 34, 19, 13, 242, 235, 238, 80, 34, 19, 13, - 242, 145, 238, 80, 34, 19, 13, 241, 245, 34, 19, 13, 238, 188, 34, 19, - 13, 244, 138, 34, 19, 13, 249, 246, 238, 80, 34, 19, 13, 241, 1, 238, 80, - 34, 19, 13, 238, 112, 238, 80, 34, 19, 13, 239, 79, 34, 19, 13, 239, 59, - 34, 19, 13, 242, 20, 238, 171, 34, 19, 13, 244, 22, 238, 80, 34, 19, 13, - 242, 48, 238, 80, 34, 19, 13, 239, 201, 238, 80, 34, 19, 13, 238, 172, - 34, 19, 13, 241, 62, 34, 19, 13, 244, 58, 34, 19, 13, 242, 237, 238, 80, - 34, 19, 13, 240, 183, 34, 19, 13, 236, 5, 34, 19, 13, 242, 7, 34, 19, 13, - 241, 33, 238, 80, 34, 19, 13, 241, 33, 251, 225, 240, 170, 34, 19, 13, - 238, 149, 238, 80, 34, 19, 13, 244, 115, 34, 19, 13, 243, 202, 34, 19, - 13, 250, 237, 34, 19, 13, 248, 138, 34, 19, 13, 240, 179, 34, 19, 13, - 238, 26, 34, 19, 13, 245, 55, 254, 39, 249, 16, 34, 19, 13, 242, 71, 238, - 80, 34, 19, 13, 238, 17, 34, 19, 13, 239, 198, 238, 80, 34, 19, 13, 243, - 184, 239, 104, 34, 19, 13, 239, 61, 34, 19, 13, 238, 48, 34, 19, 13, 239, - 38, 34, 19, 13, 239, 208, 238, 80, 34, 19, 13, 240, 149, 34, 19, 13, 236, - 222, 238, 80, 34, 19, 13, 236, 223, 238, 80, 34, 19, 13, 240, 89, 34, 19, - 13, 245, 147, 34, 19, 13, 240, 136, 34, 19, 13, 240, 100, 245, 13, 34, - 19, 13, 239, 198, 245, 13, 34, 19, 13, 236, 37, 34, 19, 13, 236, 21, 34, - 19, 13, 249, 246, 249, 16, 34, 19, 13, 242, 235, 249, 16, 34, 19, 13, - 245, 34, 249, 16, 34, 19, 13, 240, 137, 34, 19, 13, 239, 39, 34, 19, 13, - 234, 56, 34, 19, 13, 234, 52, 34, 19, 13, 240, 135, 249, 16, 34, 19, 13, - 238, 112, 253, 185, 249, 60, 34, 19, 13, 241, 1, 253, 185, 249, 60, 34, - 19, 13, 242, 58, 34, 19, 13, 237, 146, 249, 16, 34, 19, 13, 237, 145, - 239, 100, 249, 16, 34, 19, 13, 240, 198, 34, 19, 13, 234, 53, 34, 19, 13, - 240, 66, 34, 19, 13, 240, 15, 34, 19, 13, 243, 228, 246, 254, 34, 19, 13, - 242, 192, 249, 16, 34, 19, 13, 242, 237, 249, 16, 34, 19, 13, 239, 65, - 249, 16, 34, 19, 13, 241, 227, 34, 19, 13, 236, 242, 34, 19, 13, 240, - 106, 34, 19, 13, 236, 223, 249, 16, 34, 19, 13, 236, 222, 249, 16, 34, - 19, 13, 242, 209, 236, 150, 34, 19, 13, 240, 103, 34, 19, 13, 232, 17, - 34, 19, 13, 239, 198, 249, 16, 34, 19, 13, 237, 58, 34, 19, 13, 241, 33, - 249, 16, 34, 19, 13, 244, 108, 34, 19, 13, 239, 208, 249, 16, 34, 19, 13, - 239, 8, 34, 19, 13, 244, 73, 249, 16, 34, 19, 13, 248, 181, 241, 62, 34, - 19, 13, 232, 13, 34, 19, 13, 234, 58, 34, 19, 13, 235, 187, 34, 19, 13, - 231, 247, 34, 19, 13, 231, 238, 34, 19, 13, 235, 188, 34, 19, 13, 234, - 59, 34, 19, 13, 234, 71, 34, 19, 13, 235, 198, 34, 19, 13, 242, 209, 235, - 198, 34, 19, 13, 238, 149, 249, 16, 34, 19, 13, 236, 237, 250, 247, 34, - 19, 13, 236, 237, 250, 250, 34, 19, 13, 248, 123, 241, 38, 34, 19, 13, - 252, 205, 254, 15, 239, 253, 34, 19, 13, 238, 23, 34, 19, 13, 238, 4, 34, - 19, 13, 250, 115, 244, 221, 34, 19, 13, 250, 115, 249, 60, 34, 19, 13, - 240, 169, 34, 19, 13, 242, 228, 249, 60, 34, 19, 13, 246, 108, 238, 80, - 34, 19, 13, 241, 24, 238, 80, 34, 19, 13, 241, 24, 245, 13, 34, 19, 13, - 241, 24, 249, 16, 34, 19, 13, 239, 201, 249, 16, 34, 19, 13, 245, 248, - 34, 19, 13, 242, 124, 34, 19, 13, 242, 38, 34, 19, 13, 239, 102, 34, 19, - 13, 239, 186, 34, 19, 13, 242, 146, 250, 244, 239, 209, 34, 19, 13, 242, - 146, 254, 7, 239, 178, 34, 19, 13, 242, 146, 248, 139, 239, 178, 34, 19, - 13, 242, 146, 240, 178, 239, 178, 34, 19, 13, 242, 146, 241, 184, 239, - 209, 34, 19, 13, 242, 145, 253, 185, 249, 60, 34, 19, 13, 242, 145, 235, - 242, 238, 176, 34, 19, 13, 242, 145, 235, 242, 242, 208, 34, 19, 13, 238, - 202, 34, 19, 13, 239, 180, 235, 242, 239, 202, 244, 221, 34, 19, 13, 239, - 180, 235, 242, 239, 202, 249, 60, 34, 19, 13, 239, 180, 235, 242, 242, - 208, 34, 19, 13, 238, 71, 34, 19, 13, 243, 32, 34, 19, 13, 237, 69, 34, - 19, 13, 240, 26, 34, 19, 13, 244, 213, 250, 46, 245, 56, 34, 19, 13, 244, - 213, 238, 175, 34, 19, 13, 244, 213, 245, 56, 34, 19, 13, 244, 213, 241, - 212, 34, 19, 13, 244, 213, 247, 78, 34, 19, 13, 244, 213, 242, 220, 34, - 19, 13, 244, 213, 238, 11, 34, 19, 13, 244, 213, 250, 46, 242, 220, 34, - 19, 13, 239, 128, 242, 240, 242, 89, 34, 19, 13, 239, 128, 249, 186, 242, - 240, 242, 89, 34, 19, 13, 239, 128, 239, 212, 242, 89, 34, 19, 13, 239, - 128, 249, 186, 239, 212, 242, 89, 34, 19, 13, 239, 128, 244, 124, 242, - 89, 34, 19, 13, 239, 128, 238, 70, 34, 19, 13, 239, 128, 239, 197, 242, - 89, 34, 19, 13, 239, 128, 239, 197, 241, 65, 242, 89, 34, 19, 13, 239, - 128, 241, 65, 242, 89, 34, 19, 13, 239, 128, 241, 75, 242, 89, 34, 19, - 13, 243, 174, 243, 9, 237, 159, 34, 19, 13, 237, 145, 243, 9, 237, 159, - 34, 19, 13, 238, 120, 236, 172, 34, 19, 13, 238, 120, 236, 217, 34, 19, - 13, 238, 120, 238, 137, 34, 19, 13, 239, 128, 248, 163, 242, 89, 34, 19, - 13, 239, 128, 238, 47, 242, 89, 34, 19, 13, 239, 128, 241, 75, 239, 197, - 242, 89, 34, 19, 13, 237, 158, 255, 28, 241, 38, 34, 19, 13, 237, 158, - 255, 28, 240, 29, 34, 19, 13, 241, 153, 254, 15, 242, 71, 250, 107, 34, - 19, 13, 239, 30, 34, 19, 13, 237, 70, 34, 19, 13, 242, 71, 240, 0, 240, - 24, 243, 172, 34, 19, 13, 242, 71, 238, 95, 253, 90, 34, 19, 13, 242, 71, - 238, 95, 245, 147, 34, 19, 13, 242, 71, 251, 254, 242, 89, 34, 19, 13, - 242, 71, 238, 95, 253, 165, 34, 19, 13, 242, 71, 241, 31, 240, 27, 253, - 165, 34, 19, 13, 242, 71, 238, 95, 253, 134, 34, 19, 13, 242, 71, 238, - 95, 253, 190, 34, 19, 13, 242, 71, 238, 95, 254, 252, 244, 221, 34, 19, - 13, 242, 71, 238, 95, 254, 252, 249, 60, 34, 19, 13, 242, 71, 241, 66, - 242, 154, 238, 137, 34, 19, 13, 242, 71, 241, 66, 242, 154, 236, 217, 34, - 19, 13, 243, 109, 241, 31, 242, 154, 244, 137, 34, 19, 13, 242, 71, 241, - 31, 242, 154, 242, 28, 34, 19, 13, 242, 71, 241, 220, 34, 19, 13, 245, - 17, 244, 166, 34, 19, 13, 245, 17, 241, 193, 34, 19, 13, 245, 17, 242, - 17, 34, 19, 13, 242, 71, 197, 242, 136, 235, 207, 34, 19, 13, 242, 71, - 238, 3, 237, 173, 34, 19, 13, 242, 136, 236, 81, 34, 19, 13, 242, 123, - 236, 81, 34, 19, 13, 242, 123, 235, 207, 34, 19, 13, 242, 123, 249, 92, - 254, 7, 238, 92, 34, 19, 13, 242, 123, 236, 218, 241, 85, 238, 92, 34, - 19, 13, 242, 123, 238, 138, 254, 247, 238, 92, 34, 19, 13, 242, 123, 237, - 170, 250, 36, 238, 92, 34, 19, 13, 242, 136, 249, 92, 254, 7, 238, 92, - 34, 19, 13, 242, 136, 236, 218, 241, 85, 238, 92, 34, 19, 13, 242, 136, - 238, 138, 254, 247, 238, 92, 34, 19, 13, 242, 136, 237, 170, 250, 36, - 238, 92, 34, 19, 13, 242, 216, 241, 140, 34, 19, 13, 242, 216, 242, 56, - 34, 19, 13, 239, 171, 249, 92, 243, 227, 34, 19, 13, 239, 171, 249, 92, - 241, 210, 34, 19, 13, 239, 171, 242, 124, 34, 19, 13, 239, 171, 239, 242, - 34, 19, 13, 239, 151, 239, 242, 34, 19, 13, 239, 151, 241, 35, 239, 214, - 34, 19, 13, 239, 151, 241, 35, 238, 162, 34, 19, 13, 239, 151, 241, 35, - 236, 236, 34, 19, 13, 239, 151, 241, 102, 34, 19, 13, 239, 151, 242, 172, - 239, 214, 34, 19, 13, 239, 151, 242, 172, 238, 162, 34, 19, 13, 239, 151, - 242, 172, 236, 236, 34, 19, 13, 240, 28, 254, 107, 34, 19, 13, 238, 201, - 253, 247, 34, 19, 13, 241, 32, 34, 19, 13, 240, 233, 253, 90, 34, 19, 13, - 240, 233, 250, 107, 34, 19, 13, 240, 233, 253, 100, 34, 19, 13, 240, 233, - 253, 165, 34, 19, 13, 240, 233, 253, 134, 34, 19, 13, 240, 233, 253, 190, - 34, 19, 13, 240, 233, 253, 148, 34, 19, 13, 238, 112, 253, 185, 245, 141, - 34, 19, 13, 241, 1, 253, 185, 245, 141, 34, 19, 13, 238, 112, 253, 185, - 244, 221, 34, 19, 13, 241, 1, 253, 185, 244, 221, 34, 19, 13, 242, 228, - 244, 221, 34, 19, 13, 242, 145, 253, 185, 244, 221, 19, 13, 242, 66, 239, - 154, 19, 13, 42, 239, 154, 19, 13, 29, 239, 154, 19, 13, 240, 219, 29, - 239, 154, 19, 13, 242, 105, 239, 154, 19, 13, 207, 239, 154, 19, 13, 36, - 242, 113, 57, 19, 13, 37, 242, 113, 57, 19, 13, 242, 113, 244, 215, 19, - 13, 253, 180, 242, 245, 19, 13, 255, 4, 246, 42, 19, 13, 242, 245, 19, - 13, 246, 72, 19, 13, 239, 193, 239, 15, 19, 13, 239, 193, 239, 16, 19, - 13, 239, 193, 239, 17, 19, 13, 240, 74, 19, 13, 241, 165, 45, 19, 13, - 243, 50, 65, 19, 13, 240, 11, 19, 13, 243, 48, 19, 13, 110, 19, 13, 240, - 130, 242, 135, 19, 13, 240, 188, 242, 135, 19, 13, 238, 68, 242, 135, 19, - 13, 239, 19, 242, 135, 19, 13, 239, 18, 242, 135, 19, 13, 240, 165, 242, - 135, 19, 13, 238, 62, 237, 156, 19, 13, 237, 64, 237, 156, 19, 13, 255, - 32, 244, 233, 19, 13, 255, 32, 249, 95, 242, 132, 244, 243, 19, 13, 255, - 32, 249, 95, 242, 132, 242, 152, 19, 13, 255, 36, 244, 233, 19, 13, 255, - 42, 244, 233, 19, 13, 255, 42, 249, 95, 242, 132, 244, 243, 19, 13, 255, - 42, 249, 95, 242, 132, 242, 152, 19, 13, 249, 217, 241, 125, 19, 13, 249, - 217, 241, 126, 19, 13, 42, 242, 248, 19, 13, 42, 245, 87, 19, 13, 249, - 134, 253, 131, 19, 13, 249, 134, 244, 185, 19, 13, 241, 28, 253, 131, 19, - 13, 241, 28, 244, 185, 19, 13, 245, 5, 253, 131, 19, 13, 245, 5, 244, - 185, 19, 13, 240, 224, 249, 5, 242, 248, 19, 13, 240, 224, 249, 5, 245, - 87, 19, 13, 243, 75, 245, 203, 19, 13, 254, 96, 245, 203, 19, 13, 242, - 132, 244, 243, 19, 13, 242, 132, 242, 152, 19, 13, 236, 78, 244, 243, 19, - 13, 236, 78, 242, 152, 19, 13, 247, 102, 244, 187, 19, 13, 245, 221, 244, - 187, 19, 13, 136, 244, 187, 19, 13, 240, 224, 244, 187, 19, 13, 242, 111, - 244, 187, 19, 13, 238, 127, 244, 187, 19, 13, 236, 2, 244, 187, 19, 13, - 236, 80, 244, 187, 19, 13, 253, 101, 241, 21, 236, 3, 244, 187, 19, 13, - 255, 43, 238, 102, 19, 13, 249, 4, 238, 102, 19, 13, 175, 255, 43, 238, - 102, 19, 13, 30, 239, 120, 242, 92, 19, 13, 30, 239, 120, 231, 231, 19, - 13, 239, 118, 239, 120, 75, 242, 92, 19, 13, 239, 118, 239, 120, 75, 231, - 231, 19, 13, 239, 118, 239, 120, 36, 242, 92, 19, 13, 239, 118, 239, 120, - 36, 231, 231, 19, 13, 239, 118, 239, 120, 37, 242, 92, 19, 13, 239, 118, - 239, 120, 37, 231, 231, 19, 13, 239, 118, 239, 120, 79, 242, 92, 19, 13, - 239, 118, 239, 120, 79, 231, 231, 19, 13, 239, 118, 239, 120, 75, 37, - 242, 92, 19, 13, 239, 118, 239, 120, 75, 37, 231, 231, 19, 13, 250, 20, - 239, 120, 242, 92, 19, 13, 250, 20, 239, 120, 231, 231, 19, 13, 235, 209, - 239, 120, 79, 242, 92, 19, 13, 235, 209, 239, 120, 79, 231, 231, 19, 13, - 236, 187, 238, 102, 19, 13, 253, 1, 238, 102, 19, 13, 239, 120, 231, 231, - 19, 13, 252, 41, 238, 102, 19, 13, 241, 49, 239, 120, 242, 92, 19, 13, - 241, 49, 239, 120, 231, 231, 19, 13, 212, 19, 13, 245, 221, 244, 208, 19, - 13, 136, 244, 208, 19, 13, 240, 224, 244, 208, 19, 13, 242, 111, 244, - 208, 19, 13, 238, 127, 244, 208, 19, 13, 236, 2, 244, 208, 19, 13, 236, - 80, 244, 208, 19, 13, 253, 101, 241, 21, 236, 3, 244, 208, 19, 13, 48, - 244, 239, 19, 13, 48, 236, 170, 244, 239, 19, 13, 48, 237, 167, 19, 13, - 48, 237, 168, 19, 13, 48, 237, 169, 19, 13, 239, 182, 237, 167, 19, 13, - 239, 182, 237, 168, 19, 13, 239, 182, 237, 169, 19, 13, 48, 236, 86, 227, - 19, 13, 48, 241, 167, 19, 13, 48, 241, 168, 19, 13, 48, 241, 169, 19, 13, - 48, 241, 170, 19, 13, 48, 241, 171, 19, 13, 244, 244, 245, 59, 19, 13, - 253, 127, 245, 59, 19, 13, 244, 244, 249, 89, 19, 13, 253, 127, 249, 89, - 19, 13, 244, 244, 245, 192, 19, 13, 253, 127, 245, 192, 19, 13, 244, 244, - 241, 73, 19, 13, 253, 127, 241, 73, 19, 13, 48, 240, 203, 19, 13, 48, - 239, 85, 19, 13, 48, 242, 32, 19, 13, 48, 235, 232, 19, 13, 48, 240, 111, - 19, 13, 48, 232, 7, 19, 13, 48, 232, 16, 19, 13, 48, 243, 206, 19, 13, - 237, 147, 253, 131, 19, 13, 237, 147, 244, 185, 19, 13, 48, 246, 112, 19, - 13, 48, 252, 126, 19, 13, 48, 246, 130, 19, 13, 48, 244, 89, 19, 13, 48, - 246, 22, 19, 13, 48, 42, 241, 36, 19, 13, 48, 242, 59, 241, 36, 19, 13, - 236, 160, 19, 13, 242, 25, 19, 13, 202, 19, 13, 244, 37, 19, 13, 243, - 222, 19, 13, 243, 117, 19, 13, 237, 184, 19, 13, 236, 94, 19, 13, 245, - 101, 250, 31, 242, 91, 19, 13, 245, 101, 250, 31, 254, 243, 242, 91, 19, - 13, 254, 194, 19, 13, 245, 214, 19, 13, 239, 116, 245, 214, 19, 13, 250, - 98, 242, 91, 19, 13, 250, 98, 253, 131, 19, 13, 239, 140, 239, 88, 19, - 13, 239, 140, 239, 89, 19, 13, 239, 140, 239, 90, 19, 13, 239, 140, 239, - 91, 19, 13, 239, 140, 239, 92, 19, 13, 239, 140, 239, 93, 19, 13, 239, - 140, 239, 94, 19, 13, 239, 140, 239, 95, 19, 13, 239, 140, 239, 96, 19, - 13, 239, 140, 238, 63, 19, 13, 239, 140, 238, 64, 19, 13, 236, 130, 19, - 13, 236, 147, 19, 13, 253, 127, 137, 242, 21, 19, 13, 242, 156, 242, 91, - 19, 13, 48, 79, 249, 129, 19, 13, 48, 75, 249, 129, 19, 13, 48, 239, 26, - 19, 13, 48, 252, 170, 238, 44, 19, 13, 245, 35, 65, 19, 13, 245, 35, 75, - 65, 19, 13, 136, 245, 35, 65, 19, 13, 238, 142, 253, 131, 19, 13, 238, - 142, 244, 185, 19, 13, 2, 236, 128, 19, 13, 246, 81, 19, 13, 250, 206, - 249, 185, 19, 13, 241, 208, 19, 13, 243, 205, 19, 13, 241, 118, 19, 13, - 237, 141, 242, 92, 19, 13, 237, 141, 231, 231, 19, 13, 241, 215, 19, 13, - 242, 232, 231, 231, 19, 13, 237, 142, 242, 92, 19, 13, 237, 142, 231, - 231, 19, 13, 249, 226, 242, 92, 19, 13, 249, 226, 231, 231, 19, 13, 245, - 134, 239, 229, 244, 187, 19, 13, 245, 134, 237, 135, 244, 187, 19, 13, - 243, 51, 244, 187, 19, 13, 237, 141, 244, 187, 19, 13, 242, 232, 244, - 187, 19, 13, 237, 142, 244, 187, 19, 13, 242, 115, 238, 125, 253, 179, - 237, 118, 238, 151, 19, 13, 242, 115, 238, 125, 253, 179, 237, 118, 236, - 215, 19, 13, 242, 115, 238, 125, 253, 179, 237, 118, 239, 229, 235, 249, - 19, 13, 242, 115, 236, 194, 253, 179, 237, 118, 238, 151, 19, 13, 242, - 115, 236, 194, 253, 179, 237, 118, 236, 215, 19, 13, 242, 115, 236, 194, - 253, 179, 237, 118, 237, 135, 235, 249, 19, 13, 242, 115, 236, 194, 253, - 179, 237, 118, 237, 135, 236, 9, 19, 13, 242, 115, 236, 194, 253, 179, - 237, 118, 237, 135, 236, 10, 19, 13, 243, 77, 19, 13, 238, 143, 255, 36, - 244, 233, 19, 13, 238, 143, 255, 42, 244, 233, 19, 13, 30, 199, 19, 13, - 244, 140, 19, 13, 240, 140, 19, 13, 241, 127, 19, 13, 238, 57, 19, 13, - 238, 191, 19, 13, 239, 103, 19, 13, 238, 46, 19, 13, 239, 63, 241, 55, - 19, 13, 239, 80, 241, 55, 19, 13, 240, 185, 238, 55, 19, 13, 254, 166, - 237, 100, 8, 16, 5, 64, 8, 16, 5, 199, 8, 16, 5, 203, 8, 16, 5, 187, 8, - 16, 5, 70, 8, 16, 5, 204, 8, 16, 5, 194, 8, 16, 5, 164, 8, 16, 5, 69, 8, - 16, 5, 200, 8, 16, 5, 205, 8, 16, 5, 148, 8, 16, 5, 171, 8, 16, 5, 183, - 8, 16, 5, 78, 8, 16, 5, 198, 8, 16, 5, 209, 8, 16, 5, 135, 8, 16, 5, 159, - 8, 16, 5, 190, 8, 16, 5, 84, 8, 16, 5, 186, 8, 16, 5, 201, 8, 16, 5, 170, - 8, 16, 5, 181, 8, 16, 5, 202, 8, 16, 3, 64, 8, 16, 3, 199, 8, 16, 3, 203, - 8, 16, 3, 187, 8, 16, 3, 70, 8, 16, 3, 204, 8, 16, 3, 194, 8, 16, 3, 164, - 8, 16, 3, 69, 8, 16, 3, 200, 8, 16, 3, 205, 8, 16, 3, 148, 8, 16, 3, 171, - 8, 16, 3, 183, 8, 16, 3, 78, 8, 16, 3, 198, 8, 16, 3, 209, 8, 16, 3, 135, - 8, 16, 3, 159, 8, 16, 3, 190, 8, 16, 3, 84, 8, 16, 3, 186, 8, 16, 3, 201, - 8, 16, 3, 170, 8, 16, 3, 181, 8, 16, 3, 202, 8, 21, 5, 64, 8, 21, 5, 199, - 8, 21, 5, 203, 8, 21, 5, 187, 8, 21, 5, 70, 8, 21, 5, 204, 8, 21, 5, 194, - 8, 21, 5, 164, 8, 21, 5, 69, 8, 21, 5, 200, 8, 21, 5, 205, 8, 21, 5, 148, - 8, 21, 5, 171, 8, 21, 5, 183, 8, 21, 5, 78, 8, 21, 5, 198, 8, 21, 5, 209, - 8, 21, 5, 135, 8, 21, 5, 159, 8, 21, 5, 190, 8, 21, 5, 84, 8, 21, 5, 186, - 8, 21, 5, 201, 8, 21, 5, 170, 8, 21, 5, 181, 8, 21, 5, 202, 8, 21, 3, 64, - 8, 21, 3, 199, 8, 21, 3, 203, 8, 21, 3, 187, 8, 21, 3, 70, 8, 21, 3, 204, - 8, 21, 3, 194, 8, 21, 3, 69, 8, 21, 3, 200, 8, 21, 3, 205, 8, 21, 3, 148, - 8, 21, 3, 171, 8, 21, 3, 183, 8, 21, 3, 78, 8, 21, 3, 198, 8, 21, 3, 209, - 8, 21, 3, 135, 8, 21, 3, 159, 8, 21, 3, 190, 8, 21, 3, 84, 8, 21, 3, 186, - 8, 21, 3, 201, 8, 21, 3, 170, 8, 21, 3, 181, 8, 21, 3, 202, 8, 16, 21, 5, - 64, 8, 16, 21, 5, 199, 8, 16, 21, 5, 203, 8, 16, 21, 5, 187, 8, 16, 21, - 5, 70, 8, 16, 21, 5, 204, 8, 16, 21, 5, 194, 8, 16, 21, 5, 164, 8, 16, - 21, 5, 69, 8, 16, 21, 5, 200, 8, 16, 21, 5, 205, 8, 16, 21, 5, 148, 8, - 16, 21, 5, 171, 8, 16, 21, 5, 183, 8, 16, 21, 5, 78, 8, 16, 21, 5, 198, - 8, 16, 21, 5, 209, 8, 16, 21, 5, 135, 8, 16, 21, 5, 159, 8, 16, 21, 5, - 190, 8, 16, 21, 5, 84, 8, 16, 21, 5, 186, 8, 16, 21, 5, 201, 8, 16, 21, - 5, 170, 8, 16, 21, 5, 181, 8, 16, 21, 5, 202, 8, 16, 21, 3, 64, 8, 16, - 21, 3, 199, 8, 16, 21, 3, 203, 8, 16, 21, 3, 187, 8, 16, 21, 3, 70, 8, - 16, 21, 3, 204, 8, 16, 21, 3, 194, 8, 16, 21, 3, 164, 8, 16, 21, 3, 69, - 8, 16, 21, 3, 200, 8, 16, 21, 3, 205, 8, 16, 21, 3, 148, 8, 16, 21, 3, - 171, 8, 16, 21, 3, 183, 8, 16, 21, 3, 78, 8, 16, 21, 3, 198, 8, 16, 21, - 3, 209, 8, 16, 21, 3, 135, 8, 16, 21, 3, 159, 8, 16, 21, 3, 190, 8, 16, - 21, 3, 84, 8, 16, 21, 3, 186, 8, 16, 21, 3, 201, 8, 16, 21, 3, 170, 8, - 16, 21, 3, 181, 8, 16, 21, 3, 202, 8, 71, 5, 64, 8, 71, 5, 203, 8, 71, 5, - 187, 8, 71, 5, 194, 8, 71, 5, 200, 8, 71, 5, 205, 8, 71, 5, 183, 8, 71, - 5, 78, 8, 71, 5, 198, 8, 71, 5, 209, 8, 71, 5, 159, 8, 71, 5, 190, 8, 71, - 5, 84, 8, 71, 5, 186, 8, 71, 5, 201, 8, 71, 5, 170, 8, 71, 5, 181, 8, 71, - 5, 202, 8, 71, 3, 64, 8, 71, 3, 199, 8, 71, 3, 203, 8, 71, 3, 187, 8, 71, - 3, 204, 8, 71, 3, 164, 8, 71, 3, 69, 8, 71, 3, 200, 8, 71, 3, 205, 8, 71, - 3, 171, 8, 71, 3, 183, 8, 71, 3, 198, 8, 71, 3, 209, 8, 71, 3, 135, 8, - 71, 3, 159, 8, 71, 3, 190, 8, 71, 3, 84, 8, 71, 3, 186, 8, 71, 3, 201, 8, - 71, 3, 170, 8, 71, 3, 181, 8, 71, 3, 202, 8, 16, 71, 5, 64, 8, 16, 71, 5, - 199, 8, 16, 71, 5, 203, 8, 16, 71, 5, 187, 8, 16, 71, 5, 70, 8, 16, 71, - 5, 204, 8, 16, 71, 5, 194, 8, 16, 71, 5, 164, 8, 16, 71, 5, 69, 8, 16, - 71, 5, 200, 8, 16, 71, 5, 205, 8, 16, 71, 5, 148, 8, 16, 71, 5, 171, 8, - 16, 71, 5, 183, 8, 16, 71, 5, 78, 8, 16, 71, 5, 198, 8, 16, 71, 5, 209, - 8, 16, 71, 5, 135, 8, 16, 71, 5, 159, 8, 16, 71, 5, 190, 8, 16, 71, 5, - 84, 8, 16, 71, 5, 186, 8, 16, 71, 5, 201, 8, 16, 71, 5, 170, 8, 16, 71, - 5, 181, 8, 16, 71, 5, 202, 8, 16, 71, 3, 64, 8, 16, 71, 3, 199, 8, 16, - 71, 3, 203, 8, 16, 71, 3, 187, 8, 16, 71, 3, 70, 8, 16, 71, 3, 204, 8, - 16, 71, 3, 194, 8, 16, 71, 3, 164, 8, 16, 71, 3, 69, 8, 16, 71, 3, 200, - 8, 16, 71, 3, 205, 8, 16, 71, 3, 148, 8, 16, 71, 3, 171, 8, 16, 71, 3, - 183, 8, 16, 71, 3, 78, 8, 16, 71, 3, 198, 8, 16, 71, 3, 209, 8, 16, 71, - 3, 135, 8, 16, 71, 3, 159, 8, 16, 71, 3, 190, 8, 16, 71, 3, 84, 8, 16, - 71, 3, 186, 8, 16, 71, 3, 201, 8, 16, 71, 3, 170, 8, 16, 71, 3, 181, 8, - 16, 71, 3, 202, 8, 77, 5, 64, 8, 77, 5, 199, 8, 77, 5, 187, 8, 77, 5, 70, - 8, 77, 5, 204, 8, 77, 5, 194, 8, 77, 5, 200, 8, 77, 5, 205, 8, 77, 5, - 148, 8, 77, 5, 171, 8, 77, 5, 183, 8, 77, 5, 78, 8, 77, 5, 198, 8, 77, 5, - 209, 8, 77, 5, 159, 8, 77, 5, 190, 8, 77, 5, 84, 8, 77, 5, 186, 8, 77, 5, - 201, 8, 77, 5, 170, 8, 77, 5, 181, 8, 77, 3, 64, 8, 77, 3, 199, 8, 77, 3, - 203, 8, 77, 3, 187, 8, 77, 3, 70, 8, 77, 3, 204, 8, 77, 3, 194, 8, 77, 3, - 164, 8, 77, 3, 69, 8, 77, 3, 200, 8, 77, 3, 205, 8, 77, 3, 148, 8, 77, 3, - 171, 8, 77, 3, 183, 8, 77, 3, 78, 8, 77, 3, 198, 8, 77, 3, 209, 8, 77, 3, - 135, 8, 77, 3, 159, 8, 77, 3, 190, 8, 77, 3, 84, 8, 77, 3, 186, 8, 77, 3, - 201, 8, 77, 3, 170, 8, 77, 3, 181, 8, 77, 3, 202, 8, 120, 5, 64, 8, 120, - 5, 199, 8, 120, 5, 187, 8, 120, 5, 70, 8, 120, 5, 204, 8, 120, 5, 194, 8, - 120, 5, 69, 8, 120, 5, 200, 8, 120, 5, 205, 8, 120, 5, 148, 8, 120, 5, - 171, 8, 120, 5, 78, 8, 120, 5, 159, 8, 120, 5, 190, 8, 120, 5, 84, 8, - 120, 5, 186, 8, 120, 5, 201, 8, 120, 5, 170, 8, 120, 5, 181, 8, 120, 3, - 64, 8, 120, 3, 199, 8, 120, 3, 203, 8, 120, 3, 187, 8, 120, 3, 70, 8, - 120, 3, 204, 8, 120, 3, 194, 8, 120, 3, 164, 8, 120, 3, 69, 8, 120, 3, - 200, 8, 120, 3, 205, 8, 120, 3, 148, 8, 120, 3, 171, 8, 120, 3, 183, 8, - 120, 3, 78, 8, 120, 3, 198, 8, 120, 3, 209, 8, 120, 3, 135, 8, 120, 3, - 159, 8, 120, 3, 190, 8, 120, 3, 84, 8, 120, 3, 186, 8, 120, 3, 201, 8, - 120, 3, 170, 8, 120, 3, 181, 8, 120, 3, 202, 8, 16, 77, 5, 64, 8, 16, 77, - 5, 199, 8, 16, 77, 5, 203, 8, 16, 77, 5, 187, 8, 16, 77, 5, 70, 8, 16, - 77, 5, 204, 8, 16, 77, 5, 194, 8, 16, 77, 5, 164, 8, 16, 77, 5, 69, 8, - 16, 77, 5, 200, 8, 16, 77, 5, 205, 8, 16, 77, 5, 148, 8, 16, 77, 5, 171, - 8, 16, 77, 5, 183, 8, 16, 77, 5, 78, 8, 16, 77, 5, 198, 8, 16, 77, 5, - 209, 8, 16, 77, 5, 135, 8, 16, 77, 5, 159, 8, 16, 77, 5, 190, 8, 16, 77, - 5, 84, 8, 16, 77, 5, 186, 8, 16, 77, 5, 201, 8, 16, 77, 5, 170, 8, 16, - 77, 5, 181, 8, 16, 77, 5, 202, 8, 16, 77, 3, 64, 8, 16, 77, 3, 199, 8, - 16, 77, 3, 203, 8, 16, 77, 3, 187, 8, 16, 77, 3, 70, 8, 16, 77, 3, 204, - 8, 16, 77, 3, 194, 8, 16, 77, 3, 164, 8, 16, 77, 3, 69, 8, 16, 77, 3, - 200, 8, 16, 77, 3, 205, 8, 16, 77, 3, 148, 8, 16, 77, 3, 171, 8, 16, 77, - 3, 183, 8, 16, 77, 3, 78, 8, 16, 77, 3, 198, 8, 16, 77, 3, 209, 8, 16, - 77, 3, 135, 8, 16, 77, 3, 159, 8, 16, 77, 3, 190, 8, 16, 77, 3, 84, 8, - 16, 77, 3, 186, 8, 16, 77, 3, 201, 8, 16, 77, 3, 170, 8, 16, 77, 3, 181, - 8, 16, 77, 3, 202, 8, 23, 5, 64, 8, 23, 5, 199, 8, 23, 5, 203, 8, 23, 5, - 187, 8, 23, 5, 70, 8, 23, 5, 204, 8, 23, 5, 194, 8, 23, 5, 164, 8, 23, 5, - 69, 8, 23, 5, 200, 8, 23, 5, 205, 8, 23, 5, 148, 8, 23, 5, 171, 8, 23, 5, - 183, 8, 23, 5, 78, 8, 23, 5, 198, 8, 23, 5, 209, 8, 23, 5, 135, 8, 23, 5, - 159, 8, 23, 5, 190, 8, 23, 5, 84, 8, 23, 5, 186, 8, 23, 5, 201, 8, 23, 5, - 170, 8, 23, 5, 181, 8, 23, 5, 202, 8, 23, 3, 64, 8, 23, 3, 199, 8, 23, 3, - 203, 8, 23, 3, 187, 8, 23, 3, 70, 8, 23, 3, 204, 8, 23, 3, 194, 8, 23, 3, - 164, 8, 23, 3, 69, 8, 23, 3, 200, 8, 23, 3, 205, 8, 23, 3, 148, 8, 23, 3, - 171, 8, 23, 3, 183, 8, 23, 3, 78, 8, 23, 3, 198, 8, 23, 3, 209, 8, 23, 3, - 135, 8, 23, 3, 159, 8, 23, 3, 190, 8, 23, 3, 84, 8, 23, 3, 186, 8, 23, 3, - 201, 8, 23, 3, 170, 8, 23, 3, 181, 8, 23, 3, 202, 8, 23, 16, 5, 64, 8, - 23, 16, 5, 199, 8, 23, 16, 5, 203, 8, 23, 16, 5, 187, 8, 23, 16, 5, 70, - 8, 23, 16, 5, 204, 8, 23, 16, 5, 194, 8, 23, 16, 5, 164, 8, 23, 16, 5, - 69, 8, 23, 16, 5, 200, 8, 23, 16, 5, 205, 8, 23, 16, 5, 148, 8, 23, 16, - 5, 171, 8, 23, 16, 5, 183, 8, 23, 16, 5, 78, 8, 23, 16, 5, 198, 8, 23, - 16, 5, 209, 8, 23, 16, 5, 135, 8, 23, 16, 5, 159, 8, 23, 16, 5, 190, 8, - 23, 16, 5, 84, 8, 23, 16, 5, 186, 8, 23, 16, 5, 201, 8, 23, 16, 5, 170, - 8, 23, 16, 5, 181, 8, 23, 16, 5, 202, 8, 23, 16, 3, 64, 8, 23, 16, 3, - 199, 8, 23, 16, 3, 203, 8, 23, 16, 3, 187, 8, 23, 16, 3, 70, 8, 23, 16, - 3, 204, 8, 23, 16, 3, 194, 8, 23, 16, 3, 164, 8, 23, 16, 3, 69, 8, 23, - 16, 3, 200, 8, 23, 16, 3, 205, 8, 23, 16, 3, 148, 8, 23, 16, 3, 171, 8, - 23, 16, 3, 183, 8, 23, 16, 3, 78, 8, 23, 16, 3, 198, 8, 23, 16, 3, 209, - 8, 23, 16, 3, 135, 8, 23, 16, 3, 159, 8, 23, 16, 3, 190, 8, 23, 16, 3, - 84, 8, 23, 16, 3, 186, 8, 23, 16, 3, 201, 8, 23, 16, 3, 170, 8, 23, 16, - 3, 181, 8, 23, 16, 3, 202, 8, 23, 21, 5, 64, 8, 23, 21, 5, 199, 8, 23, - 21, 5, 203, 8, 23, 21, 5, 187, 8, 23, 21, 5, 70, 8, 23, 21, 5, 204, 8, - 23, 21, 5, 194, 8, 23, 21, 5, 164, 8, 23, 21, 5, 69, 8, 23, 21, 5, 200, - 8, 23, 21, 5, 205, 8, 23, 21, 5, 148, 8, 23, 21, 5, 171, 8, 23, 21, 5, - 183, 8, 23, 21, 5, 78, 8, 23, 21, 5, 198, 8, 23, 21, 5, 209, 8, 23, 21, - 5, 135, 8, 23, 21, 5, 159, 8, 23, 21, 5, 190, 8, 23, 21, 5, 84, 8, 23, - 21, 5, 186, 8, 23, 21, 5, 201, 8, 23, 21, 5, 170, 8, 23, 21, 5, 181, 8, - 23, 21, 5, 202, 8, 23, 21, 3, 64, 8, 23, 21, 3, 199, 8, 23, 21, 3, 203, - 8, 23, 21, 3, 187, 8, 23, 21, 3, 70, 8, 23, 21, 3, 204, 8, 23, 21, 3, - 194, 8, 23, 21, 3, 164, 8, 23, 21, 3, 69, 8, 23, 21, 3, 200, 8, 23, 21, - 3, 205, 8, 23, 21, 3, 148, 8, 23, 21, 3, 171, 8, 23, 21, 3, 183, 8, 23, - 21, 3, 78, 8, 23, 21, 3, 198, 8, 23, 21, 3, 209, 8, 23, 21, 3, 135, 8, - 23, 21, 3, 159, 8, 23, 21, 3, 190, 8, 23, 21, 3, 84, 8, 23, 21, 3, 186, - 8, 23, 21, 3, 201, 8, 23, 21, 3, 170, 8, 23, 21, 3, 181, 8, 23, 21, 3, - 202, 8, 23, 16, 21, 5, 64, 8, 23, 16, 21, 5, 199, 8, 23, 16, 21, 5, 203, - 8, 23, 16, 21, 5, 187, 8, 23, 16, 21, 5, 70, 8, 23, 16, 21, 5, 204, 8, - 23, 16, 21, 5, 194, 8, 23, 16, 21, 5, 164, 8, 23, 16, 21, 5, 69, 8, 23, - 16, 21, 5, 200, 8, 23, 16, 21, 5, 205, 8, 23, 16, 21, 5, 148, 8, 23, 16, - 21, 5, 171, 8, 23, 16, 21, 5, 183, 8, 23, 16, 21, 5, 78, 8, 23, 16, 21, - 5, 198, 8, 23, 16, 21, 5, 209, 8, 23, 16, 21, 5, 135, 8, 23, 16, 21, 5, - 159, 8, 23, 16, 21, 5, 190, 8, 23, 16, 21, 5, 84, 8, 23, 16, 21, 5, 186, - 8, 23, 16, 21, 5, 201, 8, 23, 16, 21, 5, 170, 8, 23, 16, 21, 5, 181, 8, - 23, 16, 21, 5, 202, 8, 23, 16, 21, 3, 64, 8, 23, 16, 21, 3, 199, 8, 23, - 16, 21, 3, 203, 8, 23, 16, 21, 3, 187, 8, 23, 16, 21, 3, 70, 8, 23, 16, - 21, 3, 204, 8, 23, 16, 21, 3, 194, 8, 23, 16, 21, 3, 164, 8, 23, 16, 21, - 3, 69, 8, 23, 16, 21, 3, 200, 8, 23, 16, 21, 3, 205, 8, 23, 16, 21, 3, - 148, 8, 23, 16, 21, 3, 171, 8, 23, 16, 21, 3, 183, 8, 23, 16, 21, 3, 78, - 8, 23, 16, 21, 3, 198, 8, 23, 16, 21, 3, 209, 8, 23, 16, 21, 3, 135, 8, - 23, 16, 21, 3, 159, 8, 23, 16, 21, 3, 190, 8, 23, 16, 21, 3, 84, 8, 23, - 16, 21, 3, 186, 8, 23, 16, 21, 3, 201, 8, 23, 16, 21, 3, 170, 8, 23, 16, - 21, 3, 181, 8, 23, 16, 21, 3, 202, 8, 140, 5, 64, 8, 140, 5, 199, 8, 140, - 5, 203, 8, 140, 5, 187, 8, 140, 5, 70, 8, 140, 5, 204, 8, 140, 5, 194, 8, - 140, 5, 164, 8, 140, 5, 69, 8, 140, 5, 200, 8, 140, 5, 205, 8, 140, 5, - 148, 8, 140, 5, 171, 8, 140, 5, 183, 8, 140, 5, 78, 8, 140, 5, 198, 8, - 140, 5, 209, 8, 140, 5, 135, 8, 140, 5, 159, 8, 140, 5, 190, 8, 140, 5, - 84, 8, 140, 5, 186, 8, 140, 5, 201, 8, 140, 5, 170, 8, 140, 5, 181, 8, - 140, 5, 202, 8, 140, 3, 64, 8, 140, 3, 199, 8, 140, 3, 203, 8, 140, 3, - 187, 8, 140, 3, 70, 8, 140, 3, 204, 8, 140, 3, 194, 8, 140, 3, 164, 8, - 140, 3, 69, 8, 140, 3, 200, 8, 140, 3, 205, 8, 140, 3, 148, 8, 140, 3, - 171, 8, 140, 3, 183, 8, 140, 3, 78, 8, 140, 3, 198, 8, 140, 3, 209, 8, - 140, 3, 135, 8, 140, 3, 159, 8, 140, 3, 190, 8, 140, 3, 84, 8, 140, 3, - 186, 8, 140, 3, 201, 8, 140, 3, 170, 8, 140, 3, 181, 8, 140, 3, 202, 8, - 16, 5, 242, 79, 8, 16, 5, 244, 198, 8, 16, 5, 242, 75, 8, 16, 5, 242, 87, - 8, 16, 5, 239, 133, 8, 16, 5, 244, 204, 8, 16, 5, 249, 42, 8, 16, 5, 242, - 97, 8, 16, 5, 244, 191, 8, 16, 5, 242, 95, 8, 16, 5, 242, 96, 8, 16, 5, - 253, 114, 8, 16, 5, 253, 112, 8, 16, 5, 253, 135, 8, 16, 5, 239, 137, 8, - 16, 5, 253, 116, 8, 16, 5, 249, 32, 8, 16, 5, 244, 203, 90, 8, 16, 5, - 242, 73, 8, 16, 5, 249, 43, 8, 16, 5, 239, 127, 8, 16, 5, 249, 30, 8, 16, - 5, 249, 23, 8, 16, 5, 249, 31, 8, 16, 5, 242, 72, 8, 16, 242, 130, 8, 16, - 3, 242, 79, 8, 16, 3, 244, 198, 8, 16, 3, 242, 75, 8, 16, 3, 242, 87, 8, - 16, 3, 239, 133, 8, 16, 3, 244, 204, 8, 16, 3, 249, 42, 8, 16, 3, 242, - 97, 8, 16, 3, 244, 191, 8, 16, 3, 242, 95, 8, 16, 3, 242, 96, 8, 16, 3, - 253, 114, 8, 16, 3, 253, 112, 8, 16, 3, 253, 135, 8, 16, 3, 239, 137, 8, - 16, 3, 253, 116, 8, 16, 3, 249, 32, 8, 16, 3, 29, 242, 73, 8, 16, 3, 242, - 73, 8, 16, 3, 249, 43, 8, 16, 3, 239, 127, 8, 16, 3, 249, 30, 8, 16, 3, - 249, 23, 8, 16, 3, 249, 31, 8, 16, 3, 242, 72, 8, 16, 240, 243, 235, 240, - 8, 16, 240, 204, 90, 8, 16, 244, 203, 90, 8, 16, 244, 228, 90, 8, 16, - 253, 212, 90, 8, 16, 253, 168, 90, 8, 16, 254, 224, 90, 8, 21, 5, 242, - 79, 8, 21, 5, 244, 198, 8, 21, 5, 242, 75, 8, 21, 5, 242, 87, 8, 21, 5, - 239, 133, 8, 21, 5, 244, 204, 8, 21, 5, 249, 42, 8, 21, 5, 242, 97, 8, - 21, 5, 244, 191, 8, 21, 5, 242, 95, 8, 21, 5, 242, 96, 8, 21, 5, 253, - 114, 8, 21, 5, 253, 112, 8, 21, 5, 253, 135, 8, 21, 5, 239, 137, 8, 21, - 5, 253, 116, 8, 21, 5, 249, 32, 8, 21, 5, 244, 203, 90, 8, 21, 5, 242, - 73, 8, 21, 5, 249, 43, 8, 21, 5, 239, 127, 8, 21, 5, 249, 30, 8, 21, 5, - 249, 23, 8, 21, 5, 249, 31, 8, 21, 5, 242, 72, 8, 21, 242, 130, 8, 21, 3, - 242, 79, 8, 21, 3, 244, 198, 8, 21, 3, 242, 75, 8, 21, 3, 242, 87, 8, 21, - 3, 239, 133, 8, 21, 3, 244, 204, 8, 21, 3, 249, 42, 8, 21, 3, 242, 97, 8, - 21, 3, 244, 191, 8, 21, 3, 242, 95, 8, 21, 3, 242, 96, 8, 21, 3, 253, - 114, 8, 21, 3, 253, 112, 8, 21, 3, 253, 135, 8, 21, 3, 239, 137, 8, 21, - 3, 253, 116, 8, 21, 3, 249, 32, 8, 21, 3, 29, 242, 73, 8, 21, 3, 242, 73, - 8, 21, 3, 249, 43, 8, 21, 3, 239, 127, 8, 21, 3, 249, 30, 8, 21, 3, 249, - 23, 8, 21, 3, 249, 31, 8, 21, 3, 242, 72, 8, 21, 240, 243, 235, 240, 8, - 21, 240, 204, 90, 8, 21, 244, 203, 90, 8, 21, 244, 228, 90, 8, 21, 253, - 212, 90, 8, 21, 253, 168, 90, 8, 21, 254, 224, 90, 8, 16, 21, 5, 242, 79, - 8, 16, 21, 5, 244, 198, 8, 16, 21, 5, 242, 75, 8, 16, 21, 5, 242, 87, 8, - 16, 21, 5, 239, 133, 8, 16, 21, 5, 244, 204, 8, 16, 21, 5, 249, 42, 8, - 16, 21, 5, 242, 97, 8, 16, 21, 5, 244, 191, 8, 16, 21, 5, 242, 95, 8, 16, - 21, 5, 242, 96, 8, 16, 21, 5, 253, 114, 8, 16, 21, 5, 253, 112, 8, 16, - 21, 5, 253, 135, 8, 16, 21, 5, 239, 137, 8, 16, 21, 5, 253, 116, 8, 16, - 21, 5, 249, 32, 8, 16, 21, 5, 244, 203, 90, 8, 16, 21, 5, 242, 73, 8, 16, - 21, 5, 249, 43, 8, 16, 21, 5, 239, 127, 8, 16, 21, 5, 249, 30, 8, 16, 21, - 5, 249, 23, 8, 16, 21, 5, 249, 31, 8, 16, 21, 5, 242, 72, 8, 16, 21, 242, - 130, 8, 16, 21, 3, 242, 79, 8, 16, 21, 3, 244, 198, 8, 16, 21, 3, 242, - 75, 8, 16, 21, 3, 242, 87, 8, 16, 21, 3, 239, 133, 8, 16, 21, 3, 244, - 204, 8, 16, 21, 3, 249, 42, 8, 16, 21, 3, 242, 97, 8, 16, 21, 3, 244, - 191, 8, 16, 21, 3, 242, 95, 8, 16, 21, 3, 242, 96, 8, 16, 21, 3, 253, - 114, 8, 16, 21, 3, 253, 112, 8, 16, 21, 3, 253, 135, 8, 16, 21, 3, 239, - 137, 8, 16, 21, 3, 253, 116, 8, 16, 21, 3, 249, 32, 8, 16, 21, 3, 29, - 242, 73, 8, 16, 21, 3, 242, 73, 8, 16, 21, 3, 249, 43, 8, 16, 21, 3, 239, - 127, 8, 16, 21, 3, 249, 30, 8, 16, 21, 3, 249, 23, 8, 16, 21, 3, 249, 31, - 8, 16, 21, 3, 242, 72, 8, 16, 21, 240, 243, 235, 240, 8, 16, 21, 240, - 204, 90, 8, 16, 21, 244, 203, 90, 8, 16, 21, 244, 228, 90, 8, 16, 21, - 253, 212, 90, 8, 16, 21, 253, 168, 90, 8, 16, 21, 254, 224, 90, 8, 23, - 16, 5, 242, 79, 8, 23, 16, 5, 244, 198, 8, 23, 16, 5, 242, 75, 8, 23, 16, - 5, 242, 87, 8, 23, 16, 5, 239, 133, 8, 23, 16, 5, 244, 204, 8, 23, 16, 5, - 249, 42, 8, 23, 16, 5, 242, 97, 8, 23, 16, 5, 244, 191, 8, 23, 16, 5, - 242, 95, 8, 23, 16, 5, 242, 96, 8, 23, 16, 5, 253, 114, 8, 23, 16, 5, - 253, 112, 8, 23, 16, 5, 253, 135, 8, 23, 16, 5, 239, 137, 8, 23, 16, 5, - 253, 116, 8, 23, 16, 5, 249, 32, 8, 23, 16, 5, 244, 203, 90, 8, 23, 16, - 5, 242, 73, 8, 23, 16, 5, 249, 43, 8, 23, 16, 5, 239, 127, 8, 23, 16, 5, - 249, 30, 8, 23, 16, 5, 249, 23, 8, 23, 16, 5, 249, 31, 8, 23, 16, 5, 242, - 72, 8, 23, 16, 242, 130, 8, 23, 16, 3, 242, 79, 8, 23, 16, 3, 244, 198, - 8, 23, 16, 3, 242, 75, 8, 23, 16, 3, 242, 87, 8, 23, 16, 3, 239, 133, 8, - 23, 16, 3, 244, 204, 8, 23, 16, 3, 249, 42, 8, 23, 16, 3, 242, 97, 8, 23, - 16, 3, 244, 191, 8, 23, 16, 3, 242, 95, 8, 23, 16, 3, 242, 96, 8, 23, 16, - 3, 253, 114, 8, 23, 16, 3, 253, 112, 8, 23, 16, 3, 253, 135, 8, 23, 16, - 3, 239, 137, 8, 23, 16, 3, 253, 116, 8, 23, 16, 3, 249, 32, 8, 23, 16, 3, - 29, 242, 73, 8, 23, 16, 3, 242, 73, 8, 23, 16, 3, 249, 43, 8, 23, 16, 3, - 239, 127, 8, 23, 16, 3, 249, 30, 8, 23, 16, 3, 249, 23, 8, 23, 16, 3, - 249, 31, 8, 23, 16, 3, 242, 72, 8, 23, 16, 240, 243, 235, 240, 8, 23, 16, - 240, 204, 90, 8, 23, 16, 244, 203, 90, 8, 23, 16, 244, 228, 90, 8, 23, - 16, 253, 212, 90, 8, 23, 16, 253, 168, 90, 8, 23, 16, 254, 224, 90, 8, - 23, 16, 21, 5, 242, 79, 8, 23, 16, 21, 5, 244, 198, 8, 23, 16, 21, 5, - 242, 75, 8, 23, 16, 21, 5, 242, 87, 8, 23, 16, 21, 5, 239, 133, 8, 23, - 16, 21, 5, 244, 204, 8, 23, 16, 21, 5, 249, 42, 8, 23, 16, 21, 5, 242, - 97, 8, 23, 16, 21, 5, 244, 191, 8, 23, 16, 21, 5, 242, 95, 8, 23, 16, 21, - 5, 242, 96, 8, 23, 16, 21, 5, 253, 114, 8, 23, 16, 21, 5, 253, 112, 8, - 23, 16, 21, 5, 253, 135, 8, 23, 16, 21, 5, 239, 137, 8, 23, 16, 21, 5, - 253, 116, 8, 23, 16, 21, 5, 249, 32, 8, 23, 16, 21, 5, 244, 203, 90, 8, - 23, 16, 21, 5, 242, 73, 8, 23, 16, 21, 5, 249, 43, 8, 23, 16, 21, 5, 239, - 127, 8, 23, 16, 21, 5, 249, 30, 8, 23, 16, 21, 5, 249, 23, 8, 23, 16, 21, - 5, 249, 31, 8, 23, 16, 21, 5, 242, 72, 8, 23, 16, 21, 242, 130, 8, 23, - 16, 21, 3, 242, 79, 8, 23, 16, 21, 3, 244, 198, 8, 23, 16, 21, 3, 242, - 75, 8, 23, 16, 21, 3, 242, 87, 8, 23, 16, 21, 3, 239, 133, 8, 23, 16, 21, - 3, 244, 204, 8, 23, 16, 21, 3, 249, 42, 8, 23, 16, 21, 3, 242, 97, 8, 23, - 16, 21, 3, 244, 191, 8, 23, 16, 21, 3, 242, 95, 8, 23, 16, 21, 3, 242, - 96, 8, 23, 16, 21, 3, 253, 114, 8, 23, 16, 21, 3, 253, 112, 8, 23, 16, - 21, 3, 253, 135, 8, 23, 16, 21, 3, 239, 137, 8, 23, 16, 21, 3, 253, 116, - 8, 23, 16, 21, 3, 249, 32, 8, 23, 16, 21, 3, 29, 242, 73, 8, 23, 16, 21, - 3, 242, 73, 8, 23, 16, 21, 3, 249, 43, 8, 23, 16, 21, 3, 239, 127, 8, 23, - 16, 21, 3, 249, 30, 8, 23, 16, 21, 3, 249, 23, 8, 23, 16, 21, 3, 249, 31, - 8, 23, 16, 21, 3, 242, 72, 8, 23, 16, 21, 240, 243, 235, 240, 8, 23, 16, - 21, 240, 204, 90, 8, 23, 16, 21, 244, 203, 90, 8, 23, 16, 21, 244, 228, - 90, 8, 23, 16, 21, 253, 212, 90, 8, 23, 16, 21, 253, 168, 90, 8, 23, 16, - 21, 254, 224, 90, 8, 16, 27, 244, 173, 8, 16, 27, 121, 8, 16, 27, 114, 8, - 16, 27, 153, 8, 16, 27, 163, 8, 16, 27, 168, 8, 16, 27, 169, 8, 16, 27, - 179, 8, 16, 27, 176, 8, 16, 27, 178, 8, 120, 27, 244, 173, 8, 120, 27, - 121, 8, 120, 27, 114, 8, 120, 27, 153, 8, 120, 27, 163, 8, 120, 27, 168, - 8, 120, 27, 169, 8, 120, 27, 179, 8, 120, 27, 176, 8, 120, 27, 178, 8, - 23, 27, 244, 173, 8, 23, 27, 121, 8, 23, 27, 114, 8, 23, 27, 153, 8, 23, - 27, 163, 8, 23, 27, 168, 8, 23, 27, 169, 8, 23, 27, 179, 8, 23, 27, 176, - 8, 23, 27, 178, 8, 23, 16, 27, 244, 173, 8, 23, 16, 27, 121, 8, 23, 16, - 27, 114, 8, 23, 16, 27, 153, 8, 23, 16, 27, 163, 8, 23, 16, 27, 168, 8, - 23, 16, 27, 169, 8, 23, 16, 27, 179, 8, 23, 16, 27, 176, 8, 23, 16, 27, - 178, 8, 140, 27, 244, 173, 8, 140, 27, 121, 8, 140, 27, 114, 8, 140, 27, - 153, 8, 140, 27, 163, 8, 140, 27, 168, 8, 140, 27, 169, 8, 140, 27, 179, - 8, 140, 27, 176, 8, 140, 27, 178, 7, 11, 232, 21, 7, 11, 232, 22, 7, 11, - 232, 23, 7, 11, 232, 24, 7, 11, 232, 25, 7, 11, 232, 26, 7, 11, 232, 27, - 7, 11, 232, 28, 7, 11, 232, 29, 7, 11, 232, 30, 7, 11, 232, 31, 7, 11, - 232, 32, 7, 11, 232, 33, 7, 11, 232, 34, 7, 11, 232, 35, 7, 11, 232, 36, - 7, 11, 232, 37, 7, 11, 232, 38, 7, 11, 232, 39, 7, 11, 232, 40, 7, 11, - 232, 41, 7, 11, 232, 42, 7, 11, 232, 43, 7, 11, 232, 44, 7, 11, 232, 45, - 7, 11, 232, 46, 7, 11, 232, 47, 7, 11, 232, 48, 7, 11, 232, 49, 7, 11, - 232, 50, 7, 11, 232, 51, 7, 11, 232, 52, 7, 11, 232, 53, 7, 11, 232, 54, - 7, 11, 232, 55, 7, 11, 232, 56, 7, 11, 232, 57, 7, 11, 232, 58, 7, 11, - 232, 59, 7, 11, 232, 60, 7, 11, 232, 61, 7, 11, 232, 62, 7, 11, 232, 63, - 7, 11, 232, 64, 7, 11, 232, 65, 7, 11, 232, 66, 7, 11, 232, 67, 7, 11, - 232, 68, 7, 11, 232, 69, 7, 11, 232, 70, 7, 11, 232, 71, 7, 11, 232, 72, - 7, 11, 232, 73, 7, 11, 232, 74, 7, 11, 232, 75, 7, 11, 232, 76, 7, 11, - 232, 77, 7, 11, 232, 78, 7, 11, 232, 79, 7, 11, 232, 80, 7, 11, 232, 81, - 7, 11, 232, 82, 7, 11, 232, 83, 7, 11, 232, 84, 7, 11, 232, 85, 7, 11, - 232, 86, 7, 11, 232, 87, 7, 11, 232, 88, 7, 11, 232, 89, 7, 11, 232, 90, - 7, 11, 232, 91, 7, 11, 232, 92, 7, 11, 232, 93, 7, 11, 232, 94, 7, 11, - 232, 95, 7, 11, 232, 96, 7, 11, 232, 97, 7, 11, 232, 98, 7, 11, 232, 99, - 7, 11, 232, 100, 7, 11, 232, 101, 7, 11, 232, 102, 7, 11, 232, 103, 7, - 11, 232, 104, 7, 11, 232, 105, 7, 11, 232, 106, 7, 11, 232, 107, 7, 11, - 232, 108, 7, 11, 232, 109, 7, 11, 232, 110, 7, 11, 232, 111, 7, 11, 232, - 112, 7, 11, 232, 113, 7, 11, 232, 114, 7, 11, 232, 115, 7, 11, 232, 116, - 7, 11, 232, 117, 7, 11, 232, 118, 7, 11, 232, 119, 7, 11, 232, 120, 7, - 11, 232, 121, 7, 11, 232, 122, 7, 11, 232, 123, 7, 11, 232, 124, 7, 11, - 232, 125, 7, 11, 232, 126, 7, 11, 232, 127, 7, 11, 232, 128, 7, 11, 232, - 129, 7, 11, 232, 130, 7, 11, 232, 131, 7, 11, 232, 132, 7, 11, 232, 133, - 7, 11, 232, 134, 7, 11, 232, 135, 7, 11, 232, 136, 7, 11, 232, 137, 7, - 11, 232, 138, 7, 11, 232, 139, 7, 11, 232, 140, 7, 11, 232, 141, 7, 11, - 232, 142, 7, 11, 232, 143, 7, 11, 232, 144, 7, 11, 232, 145, 7, 11, 232, - 146, 7, 11, 232, 147, 7, 11, 232, 148, 7, 11, 232, 149, 7, 11, 232, 150, - 7, 11, 232, 151, 7, 11, 232, 152, 7, 11, 232, 153, 7, 11, 232, 154, 7, - 11, 232, 155, 7, 11, 232, 156, 7, 11, 232, 157, 7, 11, 232, 158, 7, 11, - 232, 159, 7, 11, 232, 160, 7, 11, 232, 161, 7, 11, 232, 162, 7, 11, 232, - 163, 7, 11, 232, 164, 7, 11, 232, 165, 7, 11, 232, 166, 7, 11, 232, 167, - 7, 11, 232, 168, 7, 11, 232, 169, 7, 11, 232, 170, 7, 11, 232, 171, 7, - 11, 232, 172, 7, 11, 232, 173, 7, 11, 232, 174, 7, 11, 232, 175, 7, 11, - 232, 176, 7, 11, 232, 177, 7, 11, 232, 178, 7, 11, 232, 179, 7, 11, 232, - 180, 7, 11, 232, 181, 7, 11, 232, 182, 7, 11, 232, 183, 7, 11, 232, 184, - 7, 11, 232, 185, 7, 11, 232, 186, 7, 11, 232, 187, 7, 11, 232, 188, 7, - 11, 232, 189, 7, 11, 232, 190, 7, 11, 232, 191, 7, 11, 232, 192, 7, 11, - 232, 193, 7, 11, 232, 194, 7, 11, 232, 195, 7, 11, 232, 196, 7, 11, 232, - 197, 7, 11, 232, 198, 7, 11, 232, 199, 7, 11, 232, 200, 7, 11, 232, 201, - 7, 11, 232, 202, 7, 11, 232, 203, 7, 11, 232, 204, 7, 11, 232, 205, 7, - 11, 232, 206, 7, 11, 232, 207, 7, 11, 232, 208, 7, 11, 232, 209, 7, 11, - 232, 210, 7, 11, 232, 211, 7, 11, 232, 212, 7, 11, 232, 213, 7, 11, 232, - 214, 7, 11, 232, 215, 7, 11, 232, 216, 7, 11, 232, 217, 7, 11, 232, 218, - 7, 11, 232, 219, 7, 11, 232, 220, 7, 11, 232, 221, 7, 11, 232, 222, 7, - 11, 232, 223, 7, 11, 232, 224, 7, 11, 232, 225, 7, 11, 232, 226, 7, 11, - 232, 227, 7, 11, 232, 228, 7, 11, 232, 229, 7, 11, 232, 230, 7, 11, 232, - 231, 7, 11, 232, 232, 7, 11, 232, 233, 7, 11, 232, 234, 7, 11, 232, 235, - 7, 11, 232, 236, 7, 11, 232, 237, 7, 11, 232, 238, 7, 11, 232, 239, 7, - 11, 232, 240, 7, 11, 232, 241, 7, 11, 232, 242, 7, 11, 232, 243, 7, 11, - 232, 244, 7, 11, 232, 245, 7, 11, 232, 246, 7, 11, 232, 247, 7, 11, 232, - 248, 7, 11, 232, 249, 7, 11, 232, 250, 7, 11, 232, 251, 7, 11, 232, 252, - 7, 11, 232, 253, 7, 11, 232, 254, 7, 11, 232, 255, 7, 11, 233, 0, 7, 11, - 233, 1, 7, 11, 233, 2, 7, 11, 233, 3, 7, 11, 233, 4, 7, 11, 233, 5, 7, - 11, 233, 6, 7, 11, 233, 7, 7, 11, 233, 8, 7, 11, 233, 9, 7, 11, 233, 10, - 7, 11, 233, 11, 7, 11, 233, 12, 7, 11, 233, 13, 7, 11, 233, 14, 7, 11, - 233, 15, 7, 11, 233, 16, 7, 11, 233, 17, 7, 11, 233, 18, 7, 11, 233, 19, - 7, 11, 233, 20, 7, 11, 233, 21, 7, 11, 233, 22, 7, 11, 233, 23, 7, 11, - 233, 24, 7, 11, 233, 25, 7, 11, 233, 26, 7, 11, 233, 27, 7, 11, 233, 28, - 7, 11, 233, 29, 7, 11, 233, 30, 7, 11, 233, 31, 7, 11, 233, 32, 7, 11, - 233, 33, 7, 11, 233, 34, 7, 11, 233, 35, 7, 11, 233, 36, 7, 11, 233, 37, - 7, 11, 233, 38, 7, 11, 233, 39, 7, 11, 233, 40, 7, 11, 233, 41, 7, 11, - 233, 42, 7, 11, 233, 43, 7, 11, 233, 44, 7, 11, 233, 45, 7, 11, 233, 46, - 7, 11, 233, 47, 7, 11, 233, 48, 7, 11, 233, 49, 7, 11, 233, 50, 7, 11, - 233, 51, 7, 11, 233, 52, 7, 11, 233, 53, 7, 11, 233, 54, 7, 11, 233, 55, - 7, 11, 233, 56, 7, 11, 233, 57, 7, 11, 233, 58, 7, 11, 233, 59, 7, 11, - 233, 60, 7, 11, 233, 61, 7, 11, 233, 62, 7, 11, 233, 63, 7, 11, 233, 64, - 7, 11, 233, 65, 7, 11, 233, 66, 7, 11, 233, 67, 7, 11, 233, 68, 7, 11, - 233, 69, 7, 11, 233, 70, 7, 11, 233, 71, 7, 11, 233, 72, 7, 11, 233, 73, - 7, 11, 233, 74, 7, 11, 233, 75, 7, 11, 233, 76, 7, 11, 233, 77, 7, 11, - 233, 78, 7, 11, 233, 79, 7, 11, 233, 80, 7, 11, 233, 81, 7, 11, 233, 82, - 7, 11, 233, 83, 7, 11, 233, 84, 7, 11, 233, 85, 7, 11, 233, 86, 7, 11, - 233, 87, 7, 11, 233, 88, 7, 11, 233, 89, 7, 11, 233, 90, 7, 11, 233, 91, - 7, 11, 233, 92, 7, 11, 233, 93, 7, 11, 233, 94, 7, 11, 233, 95, 7, 11, - 233, 96, 7, 11, 233, 97, 7, 11, 233, 98, 7, 11, 233, 99, 7, 11, 233, 100, - 7, 11, 233, 101, 7, 11, 233, 102, 7, 11, 233, 103, 7, 11, 233, 104, 7, - 11, 233, 105, 7, 11, 233, 106, 7, 11, 233, 107, 7, 11, 233, 108, 7, 11, - 233, 109, 7, 11, 233, 110, 7, 11, 233, 111, 7, 11, 233, 112, 7, 11, 233, - 113, 7, 11, 233, 114, 7, 11, 233, 115, 7, 11, 233, 116, 7, 11, 233, 117, - 7, 11, 233, 118, 7, 11, 233, 119, 7, 11, 233, 120, 7, 11, 233, 121, 7, - 11, 233, 122, 7, 11, 233, 123, 7, 11, 233, 124, 7, 11, 233, 125, 7, 11, - 233, 126, 7, 11, 233, 127, 7, 11, 233, 128, 7, 11, 233, 129, 7, 11, 233, - 130, 7, 11, 233, 131, 7, 11, 233, 132, 7, 11, 233, 133, 7, 11, 233, 134, - 7, 11, 233, 135, 7, 11, 233, 136, 7, 11, 233, 137, 7, 11, 233, 138, 7, - 11, 233, 139, 7, 11, 233, 140, 7, 11, 233, 141, 7, 11, 233, 142, 7, 11, - 233, 143, 7, 11, 233, 144, 7, 11, 233, 145, 7, 11, 233, 146, 7, 11, 233, - 147, 7, 11, 233, 148, 7, 11, 233, 149, 7, 11, 233, 150, 7, 11, 233, 151, - 7, 11, 233, 152, 7, 11, 233, 153, 7, 11, 233, 154, 7, 11, 233, 155, 7, - 11, 233, 156, 7, 11, 233, 157, 7, 11, 233, 158, 7, 11, 233, 159, 7, 11, - 233, 160, 7, 11, 233, 161, 7, 11, 233, 162, 7, 11, 233, 163, 7, 11, 233, - 164, 7, 11, 233, 165, 7, 11, 233, 166, 7, 11, 233, 167, 7, 11, 233, 168, - 7, 11, 233, 169, 7, 11, 233, 170, 7, 11, 233, 171, 7, 11, 233, 172, 7, - 11, 233, 173, 7, 11, 233, 174, 7, 11, 233, 175, 7, 11, 233, 176, 7, 11, - 233, 177, 7, 11, 233, 178, 7, 11, 233, 179, 7, 11, 233, 180, 7, 11, 233, - 181, 7, 11, 233, 182, 7, 11, 233, 183, 7, 11, 233, 184, 7, 11, 233, 185, - 7, 11, 233, 186, 7, 11, 233, 187, 7, 11, 233, 188, 7, 11, 233, 189, 7, - 11, 233, 190, 7, 11, 233, 191, 7, 11, 233, 192, 7, 11, 233, 193, 7, 11, - 233, 194, 7, 11, 233, 195, 7, 11, 233, 196, 7, 11, 233, 197, 7, 11, 233, - 198, 7, 11, 233, 199, 7, 11, 233, 200, 7, 11, 233, 201, 7, 11, 233, 202, - 7, 11, 233, 203, 7, 11, 233, 204, 7, 11, 233, 205, 7, 11, 233, 206, 7, - 11, 233, 207, 7, 11, 233, 208, 7, 11, 233, 209, 7, 11, 233, 210, 7, 11, - 233, 211, 7, 11, 233, 212, 7, 11, 233, 213, 7, 11, 233, 214, 7, 11, 233, - 215, 7, 11, 233, 216, 7, 11, 233, 217, 7, 11, 233, 218, 7, 11, 233, 219, - 7, 11, 233, 220, 7, 11, 233, 221, 7, 11, 233, 222, 7, 11, 233, 223, 7, - 11, 233, 224, 7, 11, 233, 225, 7, 11, 233, 226, 7, 11, 233, 227, 7, 11, - 233, 228, 7, 11, 233, 229, 7, 11, 233, 230, 7, 11, 233, 231, 7, 11, 233, - 232, 7, 11, 233, 233, 7, 11, 233, 234, 7, 11, 233, 235, 7, 11, 233, 236, - 7, 11, 233, 237, 7, 11, 233, 238, 7, 11, 233, 239, 7, 11, 233, 240, 7, - 11, 233, 241, 7, 11, 233, 242, 7, 11, 233, 243, 7, 11, 233, 244, 7, 11, - 233, 245, 7, 11, 233, 246, 7, 11, 233, 247, 7, 11, 233, 248, 7, 11, 233, - 249, 7, 11, 233, 250, 7, 11, 233, 251, 7, 11, 233, 252, 7, 11, 233, 253, - 7, 11, 233, 254, 7, 11, 233, 255, 7, 11, 234, 0, 7, 11, 234, 1, 7, 11, - 234, 2, 7, 11, 234, 3, 7, 11, 234, 4, 7, 11, 234, 5, 7, 11, 234, 6, 7, - 11, 234, 7, 7, 11, 234, 8, 7, 11, 234, 9, 7, 11, 234, 10, 7, 11, 234, 11, - 7, 11, 234, 12, 7, 11, 234, 13, 7, 11, 234, 14, 7, 11, 234, 15, 7, 11, - 234, 16, 7, 11, 234, 17, 7, 11, 234, 18, 7, 11, 234, 19, 7, 11, 234, 20, - 7, 11, 234, 21, 7, 11, 234, 22, 7, 11, 234, 23, 7, 11, 234, 24, 7, 11, - 234, 25, 7, 11, 234, 26, 7, 11, 234, 27, 7, 11, 234, 28, 7, 11, 234, 29, - 7, 11, 234, 30, 7, 11, 234, 31, 7, 11, 234, 32, 7, 11, 234, 33, 7, 11, - 234, 34, 7, 11, 234, 35, 7, 11, 234, 36, 7, 11, 234, 37, 7, 11, 234, 38, - 7, 11, 234, 39, 7, 11, 234, 40, 7, 11, 234, 41, 7, 11, 234, 42, 7, 11, - 234, 43, 7, 11, 234, 44, 7, 11, 234, 45, 7, 11, 234, 46, 7, 11, 234, 47, - 7, 11, 234, 48, 7, 11, 234, 49, 7, 11, 234, 50, 240, 104, 250, 81, 85, - 242, 69, 85, 236, 186, 65, 85, 238, 76, 65, 85, 83, 57, 85, 242, 158, 57, - 85, 240, 248, 57, 85, 237, 124, 85, 236, 190, 85, 36, 236, 47, 85, 37, - 236, 47, 85, 238, 77, 85, 249, 4, 57, 85, 242, 84, 85, 235, 243, 85, 213, - 189, 85, 239, 144, 85, 27, 244, 173, 85, 27, 121, 85, 27, 114, 85, 27, - 153, 85, 27, 163, 85, 27, 168, 85, 27, 169, 85, 27, 179, 85, 27, 176, 85, - 27, 178, 85, 242, 81, 85, 237, 123, 85, 206, 57, 85, 242, 61, 57, 85, - 196, 57, 85, 239, 126, 65, 85, 237, 127, 253, 220, 85, 9, 5, 1, 64, 85, - 9, 5, 1, 199, 85, 9, 5, 1, 203, 85, 9, 5, 1, 187, 85, 9, 5, 1, 70, 85, 9, - 5, 1, 204, 85, 9, 5, 1, 194, 85, 9, 5, 1, 164, 85, 9, 5, 1, 69, 85, 9, 5, - 1, 200, 85, 9, 5, 1, 205, 85, 9, 5, 1, 148, 85, 9, 5, 1, 171, 85, 9, 5, - 1, 183, 85, 9, 5, 1, 78, 85, 9, 5, 1, 198, 85, 9, 5, 1, 209, 85, 9, 5, 1, - 135, 85, 9, 5, 1, 159, 85, 9, 5, 1, 190, 85, 9, 5, 1, 84, 85, 9, 5, 1, - 186, 85, 9, 5, 1, 201, 85, 9, 5, 1, 170, 85, 9, 5, 1, 181, 85, 9, 5, 1, - 202, 85, 36, 30, 110, 85, 240, 219, 239, 144, 85, 37, 30, 110, 85, 157, - 240, 203, 85, 253, 113, 244, 176, 85, 244, 201, 240, 203, 85, 9, 3, 1, - 64, 85, 9, 3, 1, 199, 85, 9, 3, 1, 203, 85, 9, 3, 1, 187, 85, 9, 3, 1, - 70, 85, 9, 3, 1, 204, 85, 9, 3, 1, 194, 85, 9, 3, 1, 164, 85, 9, 3, 1, - 69, 85, 9, 3, 1, 200, 85, 9, 3, 1, 205, 85, 9, 3, 1, 148, 85, 9, 3, 1, - 171, 85, 9, 3, 1, 183, 85, 9, 3, 1, 78, 85, 9, 3, 1, 198, 85, 9, 3, 1, - 209, 85, 9, 3, 1, 135, 85, 9, 3, 1, 159, 85, 9, 3, 1, 190, 85, 9, 3, 1, - 84, 85, 9, 3, 1, 186, 85, 9, 3, 1, 201, 85, 9, 3, 1, 170, 85, 9, 3, 1, - 181, 85, 9, 3, 1, 202, 85, 36, 244, 175, 110, 85, 55, 244, 176, 85, 37, - 244, 175, 110, 85, 180, 243, 56, 250, 81, + 0, 240, 15, 233, 54, 69, 235, 51, 69, 61, 52, 240, 114, 52, 238, 107, 52, + 234, 17, 233, 59, 40, 232, 74, 38, 232, 74, 235, 52, 248, 49, 52, 240, + 27, 231, 94, 248, 37, 208, 236, 177, 26, 242, 217, 26, 127, 26, 111, 26, + 166, 26, 177, 26, 176, 26, 187, 26, 203, 26, 195, 26, 202, 240, 24, 234, + 14, 235, 44, 52, 240, 7, 52, 232, 68, 52, 236, 156, 69, 234, 20, 254, 20, + 8, 5, 1, 67, 8, 5, 1, 217, 8, 5, 1, 255, 18, 8, 5, 1, 209, 8, 5, 1, 72, + 8, 5, 1, 255, 19, 8, 5, 1, 210, 8, 5, 1, 192, 8, 5, 1, 71, 8, 5, 1, 221, + 8, 5, 1, 255, 15, 8, 5, 1, 162, 8, 5, 1, 173, 8, 5, 1, 197, 8, 5, 1, 73, + 8, 5, 1, 223, 8, 5, 1, 255, 20, 8, 5, 1, 144, 8, 5, 1, 193, 8, 5, 1, 214, + 8, 5, 1, 79, 8, 5, 1, 179, 8, 5, 1, 255, 16, 8, 5, 1, 206, 8, 5, 1, 255, + 14, 8, 5, 1, 255, 17, 40, 31, 104, 238, 75, 236, 177, 38, 31, 104, 190, + 238, 54, 170, 242, 224, 242, 245, 238, 54, 8, 3, 1, 67, 8, 3, 1, 217, 8, + 3, 1, 255, 18, 8, 3, 1, 209, 8, 3, 1, 72, 8, 3, 1, 255, 19, 8, 3, 1, 210, + 8, 3, 1, 192, 8, 3, 1, 71, 8, 3, 1, 221, 8, 3, 1, 255, 15, 8, 3, 1, 162, + 8, 3, 1, 173, 8, 3, 1, 197, 8, 3, 1, 73, 8, 3, 1, 223, 8, 3, 1, 255, 20, + 8, 3, 1, 144, 8, 3, 1, 193, 8, 3, 1, 214, 8, 3, 1, 79, 8, 3, 1, 179, 8, + 3, 1, 255, 16, 8, 3, 1, 206, 8, 3, 1, 255, 14, 8, 3, 1, 255, 17, 40, 242, + 225, 104, 59, 242, 224, 38, 242, 225, 104, 169, 236, 233, 240, 15, 236, + 145, 233, 54, 69, 249, 39, 52, 243, 246, 52, 236, 181, 52, 254, 134, 52, + 240, 129, 125, 238, 213, 52, 175, 235, 195, 52, 237, 9, 238, 205, 234, + 30, 231, 87, 45, 185, 235, 51, 69, 161, 52, 248, 186, 238, 93, 234, 245, + 52, 196, 240, 112, 52, 234, 236, 52, 233, 49, 111, 233, 49, 166, 242, + 241, 238, 54, 246, 81, 52, 238, 208, 52, 240, 1, 248, 40, 236, 151, 233, + 49, 127, 236, 58, 238, 205, 234, 30, 231, 36, 45, 185, 235, 51, 69, 240, + 30, 236, 155, 253, 125, 237, 33, 240, 30, 236, 155, 253, 125, 243, 7, + 240, 30, 236, 155, 204, 236, 84, 236, 145, 236, 156, 69, 8, 5, 1, 134, 2, + 191, 8, 5, 1, 134, 2, 135, 8, 5, 1, 134, 2, 233, 48, 8, 5, 1, 134, 2, + 169, 8, 5, 1, 134, 2, 175, 8, 5, 1, 134, 2, 248, 51, 48, 8, 5, 1, 253, + 178, 8, 5, 1, 255, 105, 2, 236, 151, 8, 5, 1, 157, 2, 191, 8, 5, 1, 157, + 2, 135, 8, 5, 1, 157, 2, 233, 48, 8, 5, 1, 157, 2, 175, 8, 5, 1, 220, 2, + 191, 8, 5, 1, 220, 2, 135, 8, 5, 1, 220, 2, 233, 48, 8, 5, 1, 220, 2, + 175, 8, 5, 1, 248, 109, 8, 5, 1, 255, 98, 2, 169, 8, 5, 1, 117, 2, 191, + 8, 5, 1, 117, 2, 135, 8, 5, 1, 117, 2, 233, 48, 8, 5, 1, 117, 2, 169, 8, + 5, 1, 117, 2, 175, 231, 37, 52, 8, 5, 1, 117, 2, 108, 8, 5, 1, 132, 2, + 191, 8, 5, 1, 132, 2, 135, 8, 5, 1, 132, 2, 233, 48, 8, 5, 1, 132, 2, + 175, 8, 5, 1, 255, 107, 2, 135, 8, 5, 1, 240, 149, 8, 3, 1, 243, 74, 193, + 8, 3, 1, 134, 2, 191, 8, 3, 1, 134, 2, 135, 8, 3, 1, 134, 2, 233, 48, 8, + 3, 1, 134, 2, 169, 8, 3, 1, 134, 2, 175, 8, 3, 1, 134, 2, 248, 51, 48, 8, + 3, 1, 253, 178, 8, 3, 1, 255, 105, 2, 236, 151, 8, 3, 1, 157, 2, 191, 8, + 3, 1, 157, 2, 135, 8, 3, 1, 157, 2, 233, 48, 8, 3, 1, 157, 2, 175, 8, 3, + 1, 220, 2, 191, 8, 3, 1, 220, 2, 135, 8, 3, 1, 220, 2, 233, 48, 8, 3, 1, + 220, 2, 175, 8, 3, 1, 248, 109, 8, 3, 1, 255, 98, 2, 169, 8, 3, 1, 117, + 2, 191, 8, 3, 1, 117, 2, 135, 8, 3, 1, 117, 2, 233, 48, 8, 3, 1, 117, 2, + 169, 8, 3, 1, 117, 2, 175, 236, 196, 52, 8, 3, 1, 117, 2, 108, 8, 3, 1, + 132, 2, 191, 8, 3, 1, 132, 2, 135, 8, 3, 1, 132, 2, 233, 48, 8, 3, 1, + 132, 2, 175, 8, 3, 1, 255, 107, 2, 135, 8, 3, 1, 240, 149, 8, 3, 1, 255, + 107, 2, 175, 8, 5, 1, 134, 2, 196, 8, 3, 1, 134, 2, 196, 8, 5, 1, 134, 2, + 239, 255, 8, 3, 1, 134, 2, 239, 255, 8, 5, 1, 134, 2, 238, 71, 8, 3, 1, + 134, 2, 238, 71, 8, 5, 1, 255, 105, 2, 135, 8, 3, 1, 255, 105, 2, 135, 8, + 5, 1, 255, 105, 2, 233, 48, 8, 3, 1, 255, 105, 2, 233, 48, 8, 5, 1, 255, + 105, 2, 53, 48, 8, 3, 1, 255, 105, 2, 53, 48, 8, 5, 1, 255, 105, 2, 239, + 254, 8, 3, 1, 255, 105, 2, 239, 254, 8, 5, 1, 255, 103, 2, 239, 254, 8, + 3, 1, 255, 103, 2, 239, 254, 8, 5, 1, 255, 103, 2, 108, 8, 3, 1, 255, + 103, 2, 108, 8, 5, 1, 157, 2, 196, 8, 3, 1, 157, 2, 196, 8, 5, 1, 157, 2, + 239, 255, 8, 3, 1, 157, 2, 239, 255, 8, 5, 1, 157, 2, 53, 48, 8, 3, 1, + 157, 2, 53, 48, 8, 5, 1, 157, 2, 238, 71, 8, 3, 1, 157, 2, 238, 71, 8, 5, + 1, 157, 2, 239, 254, 8, 3, 1, 157, 2, 239, 254, 8, 5, 1, 255, 104, 2, + 233, 48, 8, 3, 1, 255, 104, 2, 233, 48, 8, 5, 1, 255, 104, 2, 239, 255, + 8, 3, 1, 255, 104, 2, 239, 255, 8, 5, 1, 255, 104, 2, 53, 48, 8, 3, 1, + 255, 104, 2, 53, 48, 8, 5, 1, 255, 104, 2, 236, 151, 8, 3, 1, 255, 104, + 2, 236, 151, 8, 5, 1, 255, 106, 2, 233, 48, 8, 3, 1, 255, 106, 2, 233, + 48, 8, 5, 1, 255, 106, 2, 108, 8, 3, 1, 255, 106, 2, 108, 8, 5, 1, 220, + 2, 169, 8, 3, 1, 220, 2, 169, 8, 5, 1, 220, 2, 196, 8, 3, 1, 220, 2, 196, + 8, 5, 1, 220, 2, 239, 255, 8, 3, 1, 220, 2, 239, 255, 8, 5, 1, 220, 2, + 238, 71, 8, 3, 1, 220, 2, 238, 71, 8, 5, 1, 220, 2, 53, 48, 8, 3, 1, 238, + 70, 71, 8, 5, 18, 254, 99, 8, 3, 18, 254, 99, 8, 5, 1, 255, 115, 2, 233, + 48, 8, 3, 1, 255, 115, 2, 233, 48, 8, 5, 1, 255, 109, 2, 236, 151, 8, 3, + 1, 255, 109, 2, 236, 151, 8, 3, 1, 251, 164, 8, 5, 1, 255, 100, 2, 135, + 8, 3, 1, 255, 100, 2, 135, 8, 5, 1, 255, 100, 2, 236, 151, 8, 3, 1, 255, + 100, 2, 236, 151, 8, 5, 1, 255, 100, 2, 239, 254, 8, 3, 1, 255, 100, 2, + 239, 254, 8, 5, 1, 255, 100, 2, 240, 1, 248, 40, 8, 3, 1, 255, 100, 2, + 240, 1, 248, 40, 8, 5, 1, 255, 100, 2, 108, 8, 3, 1, 255, 100, 2, 108, 8, + 5, 1, 255, 98, 2, 135, 8, 3, 1, 255, 98, 2, 135, 8, 5, 1, 255, 98, 2, + 236, 151, 8, 3, 1, 255, 98, 2, 236, 151, 8, 5, 1, 255, 98, 2, 239, 254, + 8, 3, 1, 255, 98, 2, 239, 254, 8, 3, 1, 255, 98, 237, 241, 255, 25, 233, + 59, 8, 5, 1, 248, 108, 8, 3, 1, 248, 108, 8, 5, 1, 117, 2, 196, 8, 3, 1, + 117, 2, 196, 8, 5, 1, 117, 2, 239, 255, 8, 3, 1, 117, 2, 239, 255, 8, 5, + 1, 117, 2, 45, 135, 8, 3, 1, 117, 2, 45, 135, 8, 5, 18, 253, 193, 8, 3, + 18, 253, 193, 8, 5, 1, 255, 101, 2, 135, 8, 3, 1, 255, 101, 2, 135, 8, 5, + 1, 255, 101, 2, 236, 151, 8, 3, 1, 255, 101, 2, 236, 151, 8, 5, 1, 255, + 101, 2, 239, 254, 8, 3, 1, 255, 101, 2, 239, 254, 8, 5, 1, 255, 99, 2, + 135, 8, 3, 1, 255, 99, 2, 135, 8, 5, 1, 255, 99, 2, 233, 48, 8, 3, 1, + 255, 99, 2, 233, 48, 8, 5, 1, 255, 99, 2, 236, 151, 8, 3, 1, 255, 99, 2, + 236, 151, 8, 5, 1, 255, 99, 2, 239, 254, 8, 3, 1, 255, 99, 2, 239, 254, + 8, 5, 1, 255, 102, 2, 236, 151, 8, 3, 1, 255, 102, 2, 236, 151, 8, 5, 1, + 255, 102, 2, 239, 254, 8, 3, 1, 255, 102, 2, 239, 254, 8, 5, 1, 255, 102, + 2, 108, 8, 3, 1, 255, 102, 2, 108, 8, 5, 1, 132, 2, 169, 8, 3, 1, 132, 2, + 169, 8, 5, 1, 132, 2, 196, 8, 3, 1, 132, 2, 196, 8, 5, 1, 132, 2, 239, + 255, 8, 3, 1, 132, 2, 239, 255, 8, 5, 1, 132, 2, 248, 51, 48, 8, 3, 1, + 132, 2, 248, 51, 48, 8, 5, 1, 132, 2, 45, 135, 8, 3, 1, 132, 2, 45, 135, + 8, 5, 1, 132, 2, 238, 71, 8, 3, 1, 132, 2, 238, 71, 8, 5, 1, 255, 111, 2, + 233, 48, 8, 3, 1, 255, 111, 2, 233, 48, 8, 5, 1, 255, 107, 2, 233, 48, 8, + 3, 1, 255, 107, 2, 233, 48, 8, 5, 1, 255, 107, 2, 175, 8, 5, 1, 255, 97, + 2, 135, 8, 3, 1, 255, 97, 2, 135, 8, 5, 1, 255, 97, 2, 53, 48, 8, 3, 1, + 255, 97, 2, 53, 48, 8, 5, 1, 255, 97, 2, 239, 254, 8, 3, 1, 255, 97, 2, + 239, 254, 8, 3, 1, 183, 193, 8, 3, 1, 41, 2, 108, 8, 5, 1, 41, 2, 90, 8, + 5, 1, 41, 2, 238, 124, 8, 3, 1, 41, 2, 238, 124, 8, 5, 1, 188, 187, 8, 3, + 1, 188, 187, 8, 5, 1, 248, 35, 73, 8, 5, 1, 255, 105, 2, 90, 8, 3, 1, + 255, 105, 2, 90, 8, 5, 1, 238, 238, 209, 8, 5, 1, 255, 103, 2, 90, 8, 5, + 1, 255, 103, 2, 238, 124, 8, 3, 1, 255, 103, 2, 238, 124, 8, 3, 1, 205, + 240, 28, 8, 5, 1, 224, 72, 8, 5, 1, 240, 86, 8, 5, 1, 248, 35, 72, 8, 5, + 1, 255, 112, 2, 90, 8, 3, 1, 255, 112, 2, 90, 8, 5, 1, 255, 104, 2, 90, + 8, 5, 1, 240, 10, 8, 3, 1, 254, 98, 8, 5, 1, 242, 237, 8, 5, 1, 220, 2, + 108, 8, 5, 1, 255, 109, 2, 90, 8, 3, 1, 255, 109, 2, 90, 8, 3, 1, 255, + 100, 2, 125, 8, 3, 1, 241, 212, 2, 108, 8, 5, 1, 205, 173, 8, 5, 1, 255, + 98, 2, 40, 90, 8, 3, 1, 255, 98, 2, 183, 38, 248, 117, 8, 5, 1, 117, 2, + 240, 1, 169, 8, 5, 1, 117, 2, 243, 8, 8, 3, 1, 117, 2, 243, 8, 8, 5, 1, + 254, 42, 8, 3, 1, 254, 42, 8, 5, 1, 255, 114, 2, 90, 8, 3, 1, 255, 114, + 2, 90, 8, 1, 254, 135, 8, 5, 1, 188, 111, 8, 3, 1, 188, 111, 8, 5, 1, + 248, 93, 8, 1, 224, 254, 38, 243, 105, 8, 3, 1, 255, 102, 2, 238, 65, 90, + 8, 5, 1, 255, 102, 2, 90, 8, 3, 1, 255, 102, 2, 90, 8, 5, 1, 255, 102, 2, + 235, 54, 90, 8, 5, 1, 132, 2, 243, 8, 8, 3, 1, 132, 2, 243, 8, 8, 5, 1, + 236, 160, 8, 5, 1, 255, 110, 2, 90, 8, 5, 1, 255, 107, 2, 90, 8, 3, 1, + 255, 107, 2, 90, 8, 5, 1, 255, 97, 2, 108, 8, 3, 1, 255, 97, 2, 108, 8, + 5, 1, 248, 155, 8, 5, 1, 253, 244, 235, 142, 8, 3, 1, 253, 244, 235, 142, + 8, 3, 1, 253, 244, 2, 242, 226, 8, 1, 171, 2, 108, 8, 5, 1, 188, 176, 8, + 3, 1, 188, 176, 8, 1, 236, 145, 238, 62, 248, 119, 2, 108, 8, 1, 244, 54, + 8, 1, 241, 82, 240, 93, 8, 1, 239, 114, 240, 93, 8, 1, 237, 59, 240, 93, + 8, 1, 235, 54, 240, 93, 8, 5, 1, 255, 40, 2, 239, 254, 8, 5, 1, 255, 103, + 2, 3, 1, 255, 97, 2, 239, 254, 8, 3, 1, 255, 40, 2, 239, 254, 8, 5, 1, + 254, 109, 8, 5, 1, 255, 100, 2, 3, 1, 221, 8, 3, 1, 254, 109, 8, 5, 1, + 254, 113, 8, 5, 1, 255, 98, 2, 3, 1, 221, 8, 3, 1, 254, 113, 8, 5, 1, + 134, 2, 239, 254, 8, 3, 1, 134, 2, 239, 254, 8, 5, 1, 220, 2, 239, 254, + 8, 3, 1, 220, 2, 239, 254, 8, 5, 1, 117, 2, 239, 254, 8, 3, 1, 117, 2, + 239, 254, 8, 5, 1, 132, 2, 239, 254, 8, 3, 1, 132, 2, 239, 254, 8, 5, 1, + 132, 2, 235, 56, 19, 196, 8, 3, 1, 132, 2, 235, 56, 19, 196, 8, 5, 1, + 132, 2, 235, 56, 19, 135, 8, 3, 1, 132, 2, 235, 56, 19, 135, 8, 5, 1, + 132, 2, 235, 56, 19, 239, 254, 8, 3, 1, 132, 2, 235, 56, 19, 239, 254, 8, + 5, 1, 132, 2, 235, 56, 19, 191, 8, 3, 1, 132, 2, 235, 56, 19, 191, 8, 3, + 1, 205, 72, 8, 5, 1, 134, 2, 235, 56, 19, 196, 8, 3, 1, 134, 2, 235, 56, + 19, 196, 8, 5, 1, 134, 2, 53, 60, 19, 196, 8, 3, 1, 134, 2, 53, 60, 19, + 196, 8, 5, 1, 255, 30, 2, 196, 8, 3, 1, 255, 30, 2, 196, 8, 5, 1, 255, + 104, 2, 108, 8, 3, 1, 255, 104, 2, 108, 8, 5, 1, 255, 104, 2, 239, 254, + 8, 3, 1, 255, 104, 2, 239, 254, 8, 5, 1, 255, 109, 2, 239, 254, 8, 3, 1, + 255, 109, 2, 239, 254, 8, 5, 1, 117, 2, 238, 71, 8, 3, 1, 117, 2, 238, + 71, 8, 5, 1, 117, 2, 240, 204, 19, 196, 8, 3, 1, 117, 2, 240, 204, 19, + 196, 8, 5, 1, 253, 244, 2, 239, 254, 8, 3, 1, 253, 244, 2, 239, 254, 8, + 3, 1, 255, 115, 2, 239, 254, 8, 5, 1, 254, 88, 8, 5, 1, 255, 103, 2, 3, + 1, 255, 17, 8, 3, 1, 254, 88, 8, 5, 1, 255, 104, 2, 135, 8, 3, 1, 255, + 104, 2, 135, 8, 5, 1, 240, 190, 8, 5, 1, 244, 54, 8, 5, 1, 255, 98, 2, + 191, 8, 3, 1, 255, 98, 2, 191, 8, 5, 1, 134, 2, 248, 51, 60, 19, 135, 8, + 3, 1, 134, 2, 248, 51, 60, 19, 135, 8, 5, 1, 255, 30, 2, 135, 8, 3, 1, + 255, 30, 2, 135, 8, 5, 1, 117, 2, 240, 5, 19, 135, 8, 3, 1, 117, 2, 240, + 5, 19, 135, 8, 5, 1, 134, 2, 45, 191, 8, 3, 1, 134, 2, 45, 191, 8, 5, 1, + 134, 2, 236, 145, 239, 255, 8, 3, 1, 134, 2, 236, 145, 239, 255, 8, 5, 1, + 157, 2, 45, 191, 8, 3, 1, 157, 2, 45, 191, 8, 5, 1, 157, 2, 236, 145, + 239, 255, 8, 3, 1, 157, 2, 236, 145, 239, 255, 8, 5, 1, 220, 2, 45, 191, + 8, 3, 1, 220, 2, 45, 191, 8, 5, 1, 220, 2, 236, 145, 239, 255, 8, 3, 1, + 220, 2, 236, 145, 239, 255, 8, 5, 1, 117, 2, 45, 191, 8, 3, 1, 117, 2, + 45, 191, 8, 5, 1, 117, 2, 236, 145, 239, 255, 8, 3, 1, 117, 2, 236, 145, + 239, 255, 8, 5, 1, 255, 101, 2, 45, 191, 8, 3, 1, 255, 101, 2, 45, 191, + 8, 5, 1, 255, 101, 2, 236, 145, 239, 255, 8, 3, 1, 255, 101, 2, 236, 145, + 239, 255, 8, 5, 1, 132, 2, 45, 191, 8, 3, 1, 132, 2, 45, 191, 8, 5, 1, + 132, 2, 236, 145, 239, 255, 8, 3, 1, 132, 2, 236, 145, 239, 255, 8, 5, 1, + 255, 99, 2, 242, 244, 46, 8, 3, 1, 255, 99, 2, 242, 244, 46, 8, 5, 1, + 255, 102, 2, 242, 244, 46, 8, 3, 1, 255, 102, 2, 242, 244, 46, 8, 5, 1, + 244, 59, 8, 3, 1, 244, 59, 8, 5, 1, 255, 106, 2, 239, 254, 8, 3, 1, 255, + 106, 2, 239, 254, 8, 5, 1, 255, 98, 2, 183, 38, 248, 117, 8, 3, 1, 255, + 103, 2, 242, 253, 8, 5, 1, 254, 10, 8, 3, 1, 254, 10, 8, 5, 1, 255, 97, + 2, 90, 8, 3, 1, 255, 97, 2, 90, 8, 5, 1, 134, 2, 53, 48, 8, 3, 1, 134, 2, + 53, 48, 8, 5, 1, 157, 2, 236, 151, 8, 3, 1, 157, 2, 236, 151, 8, 5, 1, + 117, 2, 235, 56, 19, 196, 8, 3, 1, 117, 2, 235, 56, 19, 196, 8, 5, 1, + 117, 2, 242, 219, 19, 196, 8, 3, 1, 117, 2, 242, 219, 19, 196, 8, 5, 1, + 117, 2, 53, 48, 8, 3, 1, 117, 2, 53, 48, 8, 5, 1, 117, 2, 53, 60, 19, + 196, 8, 3, 1, 117, 2, 53, 60, 19, 196, 8, 5, 1, 255, 107, 2, 196, 8, 3, + 1, 255, 107, 2, 196, 8, 3, 1, 255, 100, 2, 242, 253, 8, 3, 1, 255, 98, 2, + 242, 253, 8, 3, 1, 255, 102, 2, 242, 253, 8, 3, 1, 238, 70, 221, 8, 3, 1, + 255, 71, 236, 182, 8, 3, 1, 255, 89, 236, 182, 8, 5, 1, 134, 2, 108, 8, + 5, 1, 255, 105, 2, 108, 8, 3, 1, 255, 105, 2, 108, 8, 5, 1, 255, 100, 2, + 125, 8, 5, 1, 255, 102, 2, 236, 159, 108, 8, 3, 1, 255, 99, 2, 243, 126, + 242, 226, 8, 3, 1, 255, 97, 2, 243, 126, 242, 226, 8, 5, 1, 238, 62, 208, + 8, 3, 1, 205, 67, 8, 3, 1, 240, 22, 8, 3, 1, 205, 240, 22, 8, 3, 1, 41, + 2, 90, 8, 3, 1, 248, 35, 73, 8, 3, 1, 255, 105, 2, 242, 253, 8, 3, 1, + 255, 103, 2, 242, 226, 8, 3, 1, 255, 103, 2, 90, 8, 3, 1, 224, 72, 8, 3, + 1, 240, 86, 8, 3, 1, 243, 73, 2, 90, 8, 3, 1, 248, 35, 72, 8, 3, 1, 224, + 248, 35, 72, 8, 3, 1, 224, 248, 35, 157, 2, 90, 8, 3, 1, 240, 23, 224, + 248, 35, 72, 8, 3, 1, 238, 70, 255, 115, 2, 108, 8, 3, 1, 255, 104, 2, + 90, 8, 3, 1, 84, 210, 8, 1, 3, 5, 210, 8, 3, 1, 240, 10, 8, 3, 1, 252, + 129, 243, 8, 8, 3, 1, 205, 192, 8, 3, 1, 255, 106, 2, 90, 8, 3, 1, 251, + 52, 2, 90, 8, 3, 1, 220, 2, 108, 8, 3, 1, 242, 237, 8, 1, 3, 5, 71, 8, 3, + 1, 255, 100, 2, 240, 1, 169, 8, 3, 1, 255, 100, 2, 244, 216, 8, 3, 1, + 255, 100, 2, 235, 54, 90, 8, 3, 1, 246, 43, 8, 3, 1, 205, 173, 8, 3, 1, + 205, 255, 108, 2, 183, 248, 117, 8, 3, 1, 255, 108, 2, 90, 8, 3, 1, 255, + 98, 2, 40, 90, 8, 3, 1, 255, 98, 2, 235, 54, 90, 8, 1, 3, 5, 197, 8, 3, + 1, 240, 60, 73, 8, 1, 3, 5, 253, 193, 8, 3, 1, 240, 23, 240, 20, 8, 3, 1, + 248, 68, 8, 3, 1, 205, 144, 8, 3, 1, 205, 255, 101, 2, 183, 248, 117, 8, + 3, 1, 205, 255, 101, 2, 90, 8, 3, 1, 255, 101, 2, 183, 248, 117, 8, 3, 1, + 255, 101, 2, 242, 226, 8, 3, 1, 255, 101, 2, 235, 100, 8, 3, 1, 224, 255, + 101, 2, 235, 100, 8, 1, 3, 5, 144, 8, 1, 3, 5, 236, 145, 144, 8, 3, 1, + 255, 99, 2, 90, 8, 3, 1, 248, 93, 8, 3, 1, 238, 70, 255, 115, 2, 240, 5, + 19, 90, 8, 3, 1, 244, 23, 224, 248, 93, 8, 3, 1, 254, 38, 2, 242, 253, 8, + 3, 1, 205, 214, 8, 3, 1, 255, 102, 2, 235, 54, 90, 8, 3, 1, 132, 125, 8, + 3, 1, 236, 160, 8, 3, 1, 255, 110, 2, 90, 8, 3, 1, 205, 179, 8, 3, 1, + 205, 255, 16, 8, 3, 1, 205, 255, 14, 8, 1, 3, 5, 255, 14, 8, 3, 1, 255, + 97, 2, 235, 54, 90, 8, 3, 1, 255, 97, 2, 242, 253, 8, 3, 1, 248, 155, 8, + 3, 1, 253, 244, 2, 242, 253, 8, 1, 238, 62, 208, 8, 1, 234, 12, 240, 59, + 234, 192, 8, 1, 236, 145, 238, 62, 208, 8, 1, 236, 110, 255, 18, 8, 1, + 236, 249, 240, 93, 8, 1, 3, 5, 217, 8, 3, 1, 240, 23, 248, 35, 72, 8, 1, + 3, 5, 255, 104, 2, 90, 8, 1, 3, 5, 192, 8, 3, 1, 255, 115, 2, 231, 101, + 8, 3, 1, 205, 255, 15, 8, 1, 3, 5, 162, 8, 3, 1, 255, 116, 2, 90, 8, 1, + 238, 62, 248, 119, 2, 108, 8, 1, 224, 238, 62, 248, 119, 2, 108, 8, 3, 1, + 255, 40, 236, 182, 8, 3, 1, 250, 192, 236, 182, 8, 3, 1, 255, 40, 238, + 112, 2, 242, 253, 8, 3, 1, 255, 94, 236, 182, 8, 3, 1, 252, 215, 236, + 182, 8, 3, 1, 255, 92, 238, 112, 2, 242, 253, 8, 3, 1, 250, 239, 236, + 182, 8, 3, 1, 255, 78, 236, 182, 8, 3, 1, 255, 79, 236, 182, 8, 1, 236, + 249, 233, 95, 8, 1, 237, 77, 233, 95, 8, 3, 1, 205, 255, 106, 2, 235, + 100, 8, 3, 1, 205, 255, 106, 2, 237, 11, 19, 242, 226, 49, 1, 3, 192, 49, + 1, 3, 255, 106, 2, 90, 49, 1, 3, 221, 49, 1, 3, 144, 49, 1, 3, 205, 144, + 49, 1, 3, 205, 255, 101, 2, 90, 49, 1, 3, 5, 236, 145, 144, 49, 1, 3, + 255, 16, 49, 1, 3, 255, 14, 49, 1, 240, 57, 49, 1, 45, 240, 57, 49, 1, + 205, 240, 27, 49, 1, 233, 59, 49, 1, 224, 240, 27, 49, 1, 38, 137, 242, + 233, 49, 1, 40, 137, 242, 233, 49, 1, 238, 62, 208, 49, 1, 224, 238, 62, + 208, 49, 1, 40, 234, 7, 49, 1, 38, 234, 7, 49, 1, 88, 234, 7, 49, 1, 92, + 234, 7, 49, 1, 190, 238, 54, 239, 254, 49, 1, 59, 242, 224, 49, 1, 196, + 49, 1, 242, 241, 238, 54, 49, 1, 242, 245, 238, 54, 49, 1, 170, 59, 242, + 224, 49, 1, 170, 196, 49, 1, 170, 242, 245, 238, 54, 49, 1, 170, 242, + 241, 238, 54, 49, 1, 234, 43, 240, 24, 49, 1, 137, 234, 43, 240, 24, 49, + 1, 238, 130, 38, 137, 242, 233, 49, 1, 238, 130, 40, 137, 242, 233, 49, + 1, 88, 242, 234, 49, 1, 92, 242, 234, 49, 1, 248, 49, 52, 49, 1, 242, + 250, 52, 239, 255, 53, 48, 248, 51, 48, 238, 71, 3, 169, 45, 242, 241, + 238, 54, 49, 1, 242, 83, 90, 49, 1, 243, 38, 238, 54, 49, 1, 3, 240, 10, + 49, 1, 3, 162, 49, 1, 3, 193, 49, 1, 3, 206, 49, 1, 3, 224, 238, 62, 208, + 49, 1, 234, 27, 188, 125, 49, 1, 200, 188, 125, 49, 1, 254, 40, 188, 125, + 49, 1, 170, 188, 125, 49, 1, 235, 87, 188, 125, 49, 1, 254, 15, 235, 98, + 188, 69, 49, 1, 248, 122, 235, 98, 188, 69, 49, 1, 238, 44, 49, 1, 233, + 47, 49, 1, 45, 233, 59, 49, 1, 170, 92, 234, 7, 49, 1, 170, 88, 234, 7, + 49, 1, 170, 40, 234, 7, 49, 1, 170, 38, 234, 7, 49, 1, 170, 242, 233, 49, + 1, 240, 1, 242, 245, 238, 54, 49, 1, 240, 1, 45, 242, 245, 238, 54, 49, + 1, 240, 1, 45, 242, 241, 238, 54, 49, 1, 170, 169, 49, 1, 240, 84, 240, + 24, 49, 1, 243, 24, 200, 243, 78, 49, 1, 253, 165, 200, 243, 78, 49, 1, + 243, 24, 170, 243, 78, 49, 1, 253, 165, 170, 243, 78, 49, 1, 240, 226, + 49, 1, 248, 35, 240, 226, 49, 1, 170, 40, 56, 50, 242, 245, 238, 54, 50, + 242, 241, 238, 54, 50, 190, 238, 54, 50, 169, 50, 196, 50, 235, 74, 50, + 239, 255, 50, 53, 48, 50, 175, 50, 248, 45, 48, 50, 248, 51, 48, 50, 45, + 242, 241, 238, 54, 50, 239, 254, 50, 59, 248, 41, 48, 50, 45, 59, 248, + 41, 48, 50, 45, 242, 245, 238, 54, 50, 232, 77, 50, 236, 145, 239, 255, + 50, 205, 242, 244, 48, 50, 242, 244, 48, 50, 224, 242, 244, 48, 50, 242, + 244, 60, 225, 50, 242, 245, 240, 2, 46, 50, 242, 241, 240, 2, 46, 50, 40, + 248, 84, 46, 50, 38, 248, 84, 46, 50, 40, 185, 48, 50, 243, 8, 50, 40, + 137, 248, 51, 46, 50, 88, 248, 84, 46, 50, 92, 248, 84, 46, 50, 248, 49, + 21, 46, 50, 242, 250, 21, 46, 50, 233, 222, 248, 45, 46, 50, 235, 54, + 248, 45, 46, 50, 53, 46, 50, 235, 56, 46, 50, 248, 51, 46, 50, 242, 244, + 46, 50, 236, 151, 50, 238, 71, 50, 59, 248, 41, 46, 50, 240, 109, 46, 50, + 236, 145, 45, 249, 239, 46, 50, 243, 86, 46, 50, 190, 240, 2, 46, 50, + 242, 243, 46, 50, 236, 145, 242, 243, 46, 50, 242, 219, 46, 50, 240, 42, + 46, 50, 170, 242, 224, 50, 45, 170, 242, 224, 50, 242, 219, 236, 161, 50, + 242, 215, 240, 5, 236, 161, 50, 183, 240, 5, 236, 161, 50, 242, 215, 238, + 83, 236, 161, 50, 183, 238, 83, 236, 161, 50, 38, 137, 248, 51, 46, 50, + 236, 145, 240, 109, 46, 50, 31, 46, 50, 239, 184, 46, 50, 255, 113, 48, + 50, 59, 169, 50, 45, 235, 74, 50, 242, 245, 188, 69, 50, 242, 241, 188, + 69, 50, 17, 232, 71, 50, 17, 236, 229, 50, 17, 235, 59, 240, 16, 50, 17, + 231, 35, 50, 240, 109, 48, 50, 240, 7, 21, 46, 50, 45, 59, 248, 41, 46, + 50, 40, 185, 46, 50, 161, 242, 219, 48, 50, 234, 200, 48, 50, 240, 40, + 95, 153, 48, 50, 40, 38, 65, 46, 50, 226, 226, 65, 46, 50, 237, 166, 238, + 140, 50, 38, 235, 76, 48, 50, 40, 137, 248, 51, 48, 50, 237, 10, 50, 255, + 113, 46, 50, 40, 235, 76, 46, 50, 38, 235, 76, 46, 50, 38, 235, 76, 19, + 88, 235, 76, 46, 50, 38, 137, 248, 51, 48, 50, 53, 60, 225, 50, 236, 219, + 46, 50, 45, 248, 51, 46, 50, 240, 126, 48, 50, 45, 242, 243, 46, 50, 45, + 239, 255, 50, 45, 196, 50, 45, 240, 42, 46, 50, 45, 169, 50, 45, 236, + 145, 239, 255, 50, 45, 77, 65, 46, 50, 8, 3, 1, 67, 50, 8, 3, 1, 72, 50, + 8, 3, 1, 71, 50, 8, 3, 1, 73, 50, 8, 3, 1, 79, 50, 8, 3, 1, 255, 18, 50, + 8, 3, 1, 209, 50, 8, 3, 1, 192, 50, 8, 3, 1, 173, 50, 8, 3, 1, 144, 50, + 8, 3, 1, 214, 50, 8, 3, 1, 179, 50, 8, 3, 1, 206, 17, 178, 52, 17, 168, + 178, 52, 17, 231, 35, 17, 236, 156, 69, 17, 240, 16, 17, 235, 59, 240, + 16, 17, 5, 1, 194, 2, 240, 16, 17, 254, 140, 238, 223, 17, 5, 1, 238, 57, + 2, 240, 16, 17, 5, 1, 253, 123, 2, 240, 16, 17, 5, 1, 248, 42, 2, 240, + 16, 17, 5, 1, 238, 64, 2, 240, 16, 17, 5, 1, 238, 53, 2, 240, 16, 17, 5, + 1, 211, 2, 240, 16, 17, 3, 1, 248, 42, 2, 235, 59, 19, 240, 16, 17, 5, 1, + 240, 22, 17, 5, 1, 242, 242, 17, 5, 1, 240, 10, 17, 5, 1, 240, 28, 17, 5, + 1, 236, 165, 17, 5, 1, 242, 251, 17, 5, 1, 248, 87, 17, 5, 1, 240, 38, + 17, 5, 1, 242, 237, 17, 5, 1, 240, 41, 17, 5, 1, 240, 33, 17, 5, 1, 253, + 154, 17, 5, 1, 253, 150, 17, 5, 1, 253, 188, 17, 5, 1, 236, 169, 17, 5, + 1, 253, 147, 17, 5, 1, 248, 73, 17, 5, 1, 240, 21, 17, 5, 1, 248, 85, 17, + 5, 1, 236, 160, 17, 5, 1, 248, 68, 17, 5, 1, 248, 67, 17, 5, 1, 248, 69, + 17, 5, 1, 240, 20, 17, 5, 1, 248, 42, 2, 234, 26, 17, 5, 1, 238, 53, 2, + 234, 26, 17, 3, 1, 194, 2, 240, 16, 17, 3, 1, 238, 57, 2, 240, 16, 17, 3, + 1, 253, 123, 2, 240, 16, 17, 3, 1, 248, 42, 2, 240, 16, 17, 3, 1, 238, + 53, 2, 235, 59, 19, 240, 16, 17, 3, 1, 240, 22, 17, 3, 1, 242, 242, 17, + 3, 1, 240, 10, 17, 3, 1, 240, 28, 17, 3, 1, 236, 165, 17, 3, 1, 242, 251, + 17, 3, 1, 248, 87, 17, 3, 1, 240, 38, 17, 3, 1, 242, 237, 17, 3, 1, 240, + 41, 17, 3, 1, 240, 33, 17, 3, 1, 253, 154, 17, 3, 1, 253, 150, 17, 3, 1, + 253, 188, 17, 3, 1, 236, 169, 17, 3, 1, 253, 147, 17, 3, 1, 248, 73, 17, + 3, 1, 30, 240, 21, 17, 3, 1, 240, 21, 17, 3, 1, 248, 85, 17, 3, 1, 236, + 160, 17, 3, 1, 248, 68, 17, 3, 1, 248, 67, 17, 3, 1, 248, 69, 17, 3, 1, + 240, 20, 17, 3, 1, 248, 42, 2, 234, 26, 17, 3, 1, 238, 53, 2, 234, 26, + 17, 3, 1, 238, 64, 2, 240, 16, 17, 3, 1, 238, 53, 2, 240, 16, 17, 3, 1, + 211, 2, 240, 16, 17, 250, 118, 91, 17, 243, 0, 91, 17, 238, 53, 2, 248, + 45, 91, 17, 238, 53, 2, 242, 241, 19, 248, 45, 91, 17, 238, 53, 2, 235, + 56, 19, 248, 45, 91, 17, 254, 11, 91, 17, 255, 29, 91, 17, 254, 65, 91, + 17, 1, 238, 162, 240, 77, 17, 3, 1, 238, 162, 240, 77, 17, 1, 238, 152, + 17, 3, 1, 238, 152, 17, 1, 237, 6, 17, 3, 1, 237, 6, 17, 1, 240, 77, 17, + 3, 1, 240, 77, 17, 1, 240, 121, 17, 3, 1, 240, 121, 62, 5, 1, 243, 32, + 62, 3, 1, 243, 32, 62, 5, 1, 249, 62, 62, 3, 1, 249, 62, 62, 5, 1, 243, + 64, 62, 3, 1, 243, 64, 62, 5, 1, 243, 28, 62, 3, 1, 243, 28, 62, 5, 1, + 238, 115, 62, 3, 1, 238, 115, 62, 5, 1, 240, 88, 62, 3, 1, 240, 88, 62, + 5, 1, 249, 53, 62, 3, 1, 249, 53, 17, 243, 29, 91, 17, 253, 218, 91, 17, + 240, 67, 243, 45, 91, 17, 1, 249, 211, 17, 5, 243, 0, 91, 17, 240, 67, + 238, 57, 91, 17, 224, 240, 67, 238, 57, 91, 17, 5, 1, 248, 110, 17, 3, 1, + 248, 110, 17, 5, 240, 67, 243, 45, 91, 17, 5, 1, 248, 134, 17, 3, 1, 248, + 134, 17, 253, 218, 2, 240, 5, 91, 17, 5, 224, 240, 67, 243, 45, 91, 17, + 5, 240, 4, 240, 67, 243, 45, 91, 17, 5, 224, 240, 4, 240, 67, 243, 45, + 91, 32, 5, 1, 255, 42, 2, 191, 32, 5, 1, 254, 100, 32, 5, 1, 248, 150, + 32, 5, 1, 249, 77, 32, 5, 1, 235, 156, 253, 237, 32, 5, 1, 248, 126, 32, + 5, 1, 226, 228, 71, 32, 5, 1, 253, 189, 32, 5, 1, 254, 24, 32, 5, 1, 248, + 165, 32, 5, 1, 248, 174, 32, 5, 1, 244, 40, 32, 5, 1, 249, 96, 32, 5, 1, + 220, 2, 191, 32, 5, 1, 242, 215, 79, 32, 5, 1, 243, 166, 32, 5, 1, 67, + 32, 5, 1, 253, 242, 32, 5, 1, 254, 12, 32, 5, 1, 248, 127, 32, 5, 1, 253, + 200, 32, 5, 1, 253, 237, 32, 5, 1, 248, 123, 32, 5, 1, 253, 228, 32, 5, + 1, 71, 32, 5, 1, 242, 215, 71, 32, 5, 1, 201, 32, 5, 1, 254, 3, 32, 5, 1, + 254, 22, 32, 5, 1, 253, 202, 32, 5, 1, 73, 32, 5, 1, 253, 175, 32, 5, 1, + 254, 4, 32, 5, 1, 254, 23, 32, 5, 1, 253, 195, 32, 5, 1, 79, 32, 5, 1, + 254, 21, 32, 5, 1, 219, 32, 5, 1, 248, 112, 32, 5, 1, 248, 88, 32, 5, 1, + 248, 46, 32, 5, 1, 240, 224, 32, 5, 1, 249, 79, 52, 32, 5, 1, 243, 83, + 32, 5, 1, 248, 186, 52, 32, 5, 1, 72, 32, 5, 1, 253, 161, 32, 5, 1, 216, + 32, 3, 1, 67, 32, 3, 1, 253, 242, 32, 3, 1, 254, 12, 32, 3, 1, 248, 127, + 32, 3, 1, 253, 200, 32, 3, 1, 253, 237, 32, 3, 1, 248, 123, 32, 3, 1, + 253, 228, 32, 3, 1, 71, 32, 3, 1, 242, 215, 71, 32, 3, 1, 201, 32, 3, 1, + 254, 3, 32, 3, 1, 254, 22, 32, 3, 1, 253, 202, 32, 3, 1, 73, 32, 3, 1, + 253, 175, 32, 3, 1, 254, 4, 32, 3, 1, 254, 23, 32, 3, 1, 253, 195, 32, 3, + 1, 79, 32, 3, 1, 254, 21, 32, 3, 1, 219, 32, 3, 1, 248, 112, 32, 3, 1, + 248, 88, 32, 3, 1, 248, 46, 32, 3, 1, 240, 224, 32, 3, 1, 249, 79, 52, + 32, 3, 1, 243, 83, 32, 3, 1, 248, 186, 52, 32, 3, 1, 72, 32, 3, 1, 253, + 161, 32, 3, 1, 216, 32, 3, 1, 255, 42, 2, 191, 32, 3, 1, 254, 100, 32, 3, + 1, 248, 150, 32, 3, 1, 249, 77, 32, 3, 1, 235, 156, 253, 237, 32, 3, 1, + 248, 126, 32, 3, 1, 226, 228, 71, 32, 3, 1, 253, 189, 32, 3, 1, 254, 24, + 32, 3, 1, 248, 165, 32, 3, 1, 248, 174, 32, 3, 1, 244, 40, 32, 3, 1, 249, + 96, 32, 3, 1, 220, 2, 191, 32, 3, 1, 242, 215, 79, 32, 3, 1, 243, 166, + 32, 5, 1, 240, 20, 32, 3, 1, 240, 20, 32, 5, 1, 249, 21, 32, 3, 1, 249, + 21, 32, 5, 1, 236, 197, 72, 32, 3, 1, 236, 197, 72, 32, 5, 1, 240, 101, + 248, 74, 32, 3, 1, 240, 101, 248, 74, 32, 5, 1, 236, 197, 240, 101, 248, + 74, 32, 3, 1, 236, 197, 240, 101, 248, 74, 32, 5, 1, 253, 213, 248, 74, + 32, 3, 1, 253, 213, 248, 74, 32, 5, 1, 236, 197, 253, 213, 248, 74, 32, + 3, 1, 236, 197, 253, 213, 248, 74, 32, 5, 1, 248, 163, 32, 3, 1, 248, + 163, 32, 5, 1, 248, 69, 32, 3, 1, 248, 69, 32, 5, 1, 243, 57, 32, 3, 1, + 243, 57, 32, 5, 1, 236, 215, 32, 3, 1, 236, 215, 32, 5, 1, 238, 192, 2, + 45, 242, 245, 238, 54, 32, 3, 1, 238, 192, 2, 45, 242, 245, 238, 54, 32, + 5, 1, 254, 130, 32, 3, 1, 254, 130, 32, 5, 1, 244, 1, 240, 20, 32, 3, 1, + 244, 1, 240, 20, 32, 5, 1, 211, 2, 240, 150, 32, 3, 1, 211, 2, 240, 150, + 32, 5, 1, 254, 67, 32, 3, 1, 254, 67, 32, 5, 1, 240, 77, 32, 3, 1, 240, + 77, 32, 235, 114, 52, 50, 32, 240, 150, 50, 32, 231, 27, 50, 32, 148, + 235, 135, 50, 32, 159, 235, 135, 50, 32, 238, 92, 235, 114, 52, 50, 32, + 237, 211, 52, 32, 5, 1, 242, 215, 220, 2, 242, 226, 32, 3, 1, 242, 215, + 220, 2, 242, 226, 32, 5, 1, 237, 36, 52, 32, 3, 1, 237, 36, 52, 32, 5, 1, + 255, 54, 2, 243, 36, 32, 3, 1, 255, 54, 2, 243, 36, 32, 5, 1, 253, 233, + 2, 238, 231, 32, 3, 1, 253, 233, 2, 238, 231, 32, 5, 1, 253, 233, 2, 108, + 32, 3, 1, 253, 233, 2, 108, 32, 5, 1, 253, 233, 2, 240, 1, 90, 32, 3, 1, + 253, 233, 2, 240, 1, 90, 32, 5, 1, 254, 16, 2, 234, 2, 32, 3, 1, 254, 16, + 2, 234, 2, 32, 5, 1, 255, 46, 2, 234, 2, 32, 3, 1, 255, 46, 2, 234, 2, + 32, 5, 1, 255, 26, 2, 234, 2, 32, 3, 1, 255, 26, 2, 234, 2, 32, 5, 1, + 255, 26, 2, 59, 108, 32, 3, 1, 255, 26, 2, 59, 108, 32, 5, 1, 255, 26, 2, + 108, 32, 3, 1, 255, 26, 2, 108, 32, 5, 1, 238, 165, 201, 32, 3, 1, 238, + 165, 201, 32, 5, 1, 255, 23, 2, 234, 2, 32, 3, 1, 255, 23, 2, 234, 2, 32, + 5, 18, 255, 23, 248, 127, 32, 3, 18, 255, 23, 248, 127, 32, 5, 1, 255, + 38, 2, 240, 1, 90, 32, 3, 1, 255, 38, 2, 240, 1, 90, 32, 5, 1, 235, 66, + 219, 32, 3, 1, 235, 66, 219, 32, 5, 1, 255, 55, 2, 234, 2, 32, 3, 1, 255, + 55, 2, 234, 2, 32, 5, 1, 255, 45, 2, 234, 2, 32, 3, 1, 255, 45, 2, 234, + 2, 32, 5, 1, 236, 218, 79, 32, 3, 1, 236, 218, 79, 32, 5, 1, 236, 218, + 132, 2, 108, 32, 3, 1, 236, 218, 132, 2, 108, 32, 5, 1, 255, 58, 2, 234, + 2, 32, 3, 1, 255, 58, 2, 234, 2, 32, 5, 18, 255, 45, 248, 112, 32, 3, 18, + 255, 45, 248, 112, 32, 5, 1, 253, 223, 2, 234, 2, 32, 3, 1, 253, 223, 2, + 234, 2, 32, 5, 1, 253, 223, 2, 59, 108, 32, 3, 1, 253, 223, 2, 59, 108, + 32, 5, 1, 244, 10, 32, 3, 1, 244, 10, 32, 5, 1, 235, 66, 248, 88, 32, 3, + 1, 235, 66, 248, 88, 32, 5, 1, 235, 66, 253, 223, 2, 234, 2, 32, 3, 1, + 235, 66, 253, 223, 2, 234, 2, 32, 1, 236, 69, 32, 5, 1, 254, 16, 2, 239, + 255, 32, 3, 1, 254, 16, 2, 239, 255, 32, 5, 1, 255, 26, 2, 90, 32, 3, 1, + 255, 26, 2, 90, 32, 5, 1, 255, 49, 2, 242, 226, 32, 3, 1, 255, 49, 2, + 242, 226, 32, 5, 1, 255, 23, 2, 90, 32, 3, 1, 255, 23, 2, 90, 32, 5, 1, + 255, 23, 2, 242, 226, 32, 3, 1, 255, 23, 2, 242, 226, 32, 5, 1, 234, 59, + 248, 88, 32, 3, 1, 234, 59, 248, 88, 32, 5, 1, 255, 28, 2, 242, 226, 32, + 3, 1, 255, 28, 2, 242, 226, 32, 5, 1, 134, 2, 239, 255, 32, 3, 1, 134, 2, + 239, 255, 32, 5, 1, 134, 2, 175, 32, 3, 1, 134, 2, 175, 32, 5, 18, 134, + 253, 237, 32, 3, 18, 134, 253, 237, 32, 5, 1, 255, 42, 2, 239, 255, 32, + 3, 1, 255, 42, 2, 239, 255, 32, 5, 1, 240, 86, 32, 3, 1, 240, 86, 32, 5, + 1, 243, 73, 2, 175, 32, 3, 1, 243, 73, 2, 175, 32, 5, 1, 254, 16, 2, 175, + 32, 3, 1, 254, 16, 2, 175, 32, 5, 1, 255, 46, 2, 175, 32, 3, 1, 255, 46, + 2, 175, 32, 5, 1, 235, 66, 248, 126, 32, 3, 1, 235, 66, 248, 126, 32, 5, + 1, 220, 2, 196, 32, 3, 1, 220, 2, 196, 32, 5, 1, 220, 2, 175, 32, 3, 1, + 220, 2, 175, 32, 5, 1, 117, 2, 175, 32, 3, 1, 117, 2, 175, 32, 5, 1, 240, + 60, 73, 32, 3, 1, 240, 60, 73, 32, 5, 1, 240, 60, 117, 2, 175, 32, 3, 1, + 240, 60, 117, 2, 175, 32, 5, 1, 157, 2, 175, 32, 3, 1, 157, 2, 175, 32, + 5, 1, 132, 2, 196, 32, 3, 1, 132, 2, 196, 32, 5, 1, 132, 2, 175, 32, 3, + 1, 132, 2, 175, 32, 5, 1, 132, 2, 45, 135, 32, 3, 1, 132, 2, 45, 135, 32, + 5, 1, 253, 223, 2, 175, 32, 3, 1, 253, 223, 2, 175, 32, 5, 1, 253, 233, + 2, 234, 2, 32, 3, 1, 253, 233, 2, 234, 2, 32, 5, 1, 249, 207, 2, 175, 32, + 3, 1, 249, 207, 2, 175, 32, 5, 1, 248, 72, 253, 200, 32, 3, 1, 248, 72, + 253, 200, 32, 5, 1, 248, 72, 248, 150, 32, 3, 1, 248, 72, 248, 150, 32, + 5, 1, 248, 72, 249, 220, 32, 3, 1, 248, 72, 249, 220, 32, 5, 1, 248, 72, + 243, 167, 32, 3, 1, 248, 72, 243, 167, 32, 5, 1, 248, 72, 248, 165, 32, + 3, 1, 248, 72, 248, 165, 32, 5, 1, 248, 72, 248, 174, 32, 3, 1, 248, 72, + 248, 174, 32, 5, 1, 248, 72, 249, 165, 32, 3, 1, 248, 72, 249, 165, 32, + 5, 1, 248, 72, 249, 178, 32, 3, 1, 248, 72, 249, 178, 100, 5, 1, 249, 28, + 100, 5, 1, 249, 32, 100, 5, 1, 249, 76, 100, 5, 1, 253, 133, 100, 5, 1, + 248, 208, 100, 5, 1, 253, 163, 100, 5, 1, 254, 36, 100, 5, 1, 254, 60, + 100, 5, 1, 87, 100, 5, 1, 248, 123, 100, 5, 1, 248, 216, 100, 5, 1, 243, + 216, 100, 5, 1, 249, 17, 100, 5, 1, 253, 152, 100, 5, 1, 249, 93, 100, 5, + 1, 253, 184, 100, 5, 1, 253, 146, 100, 5, 1, 243, 182, 100, 5, 1, 243, + 155, 100, 5, 1, 248, 228, 100, 5, 1, 253, 189, 100, 5, 1, 248, 175, 100, + 5, 1, 248, 46, 100, 5, 1, 254, 13, 100, 5, 1, 248, 57, 100, 5, 1, 248, + 237, 100, 5, 1, 243, 201, 100, 5, 1, 253, 130, 100, 5, 1, 249, 159, 100, + 5, 1, 249, 195, 100, 5, 1, 244, 32, 100, 5, 1, 248, 245, 100, 5, 1, 253, + 224, 100, 5, 1, 243, 136, 100, 5, 1, 243, 244, 100, 5, 1, 248, 218, 100, + 5, 1, 254, 118, 100, 5, 1, 248, 156, 100, 49, 1, 40, 137, 242, 233, 100, + 233, 59, 100, 237, 8, 69, 100, 233, 54, 69, 100, 240, 27, 100, 236, 156, + 69, 100, 232, 88, 69, 100, 3, 1, 249, 28, 100, 3, 1, 249, 32, 100, 3, 1, + 249, 76, 100, 3, 1, 253, 133, 100, 3, 1, 248, 208, 100, 3, 1, 253, 163, + 100, 3, 1, 254, 36, 100, 3, 1, 254, 60, 100, 3, 1, 87, 100, 3, 1, 248, + 123, 100, 3, 1, 248, 216, 100, 3, 1, 243, 216, 100, 3, 1, 249, 17, 100, + 3, 1, 253, 152, 100, 3, 1, 249, 93, 100, 3, 1, 253, 184, 100, 3, 1, 253, + 146, 100, 3, 1, 243, 182, 100, 3, 1, 243, 155, 100, 3, 1, 248, 228, 100, + 3, 1, 253, 189, 100, 3, 1, 248, 175, 100, 3, 1, 248, 46, 100, 3, 1, 254, + 13, 100, 3, 1, 248, 57, 100, 3, 1, 248, 237, 100, 3, 1, 243, 201, 100, 3, + 1, 253, 130, 100, 3, 1, 249, 159, 100, 3, 1, 249, 195, 100, 3, 1, 244, + 32, 100, 3, 1, 248, 245, 100, 3, 1, 253, 224, 100, 3, 1, 243, 136, 100, + 3, 1, 243, 244, 100, 3, 1, 248, 218, 100, 3, 1, 254, 118, 100, 3, 1, 248, + 156, 100, 3, 18, 254, 159, 243, 136, 100, 248, 37, 208, 100, 238, 93, 68, + 240, 2, 237, 152, 68, 240, 2, 240, 145, 68, 240, 2, 233, 242, 68, 240, 2, + 244, 64, 240, 212, 68, 240, 2, 244, 64, 241, 120, 68, 240, 2, 239, 222, + 68, 240, 2, 242, 81, 68, 240, 2, 242, 200, 68, 240, 2, 239, 158, 68, 240, + 2, 242, 197, 68, 240, 2, 242, 145, 68, 240, 2, 238, 186, 68, 240, 2, 241, + 126, 239, 141, 68, 240, 2, 234, 56, 68, 240, 2, 242, 71, 246, 238, 68, + 240, 2, 238, 224, 239, 80, 68, 240, 2, 242, 50, 68, 240, 2, 244, 85, 239, + 88, 68, 240, 2, 241, 250, 68, 240, 2, 236, 54, 68, 240, 2, 239, 134, 68, + 240, 2, 241, 235, 239, 106, 68, 240, 2, 241, 73, 68, 240, 2, 242, 69, 68, + 240, 2, 238, 224, 239, 171, 68, 240, 2, 247, 225, 254, 145, 247, 232, 68, + 240, 2, 252, 58, 68, 240, 2, 245, 226, 68, 240, 2, 245, 61, 68, 240, 2, + 242, 208, 68, 158, 241, 230, 238, 51, 68, 242, 232, 242, 105, 68, 242, + 232, 243, 98, 240, 145, 68, 242, 232, 243, 98, 240, 118, 68, 242, 232, + 243, 98, 238, 149, 68, 242, 232, 240, 187, 68, 242, 232, 242, 159, 68, + 242, 232, 240, 145, 68, 242, 232, 240, 118, 68, 242, 232, 238, 149, 68, + 242, 232, 240, 188, 68, 242, 232, 239, 172, 68, 242, 232, 240, 133, 128, + 240, 140, 68, 242, 232, 241, 236, 68, 233, 51, 241, 228, 68, 242, 232, + 243, 70, 68, 233, 51, 242, 47, 68, 242, 232, 248, 102, 248, 40, 68, 242, + 232, 254, 73, 248, 40, 68, 233, 51, 254, 240, 242, 48, 68, 158, 189, 248, + 40, 68, 158, 168, 248, 40, 68, 233, 51, 254, 114, 237, 167, 68, 242, 232, + 242, 70, 240, 212, 68, 1, 243, 3, 68, 1, 250, 117, 68, 1, 241, 136, 68, + 1, 240, 165, 68, 1, 253, 168, 68, 1, 249, 192, 68, 1, 242, 201, 68, 1, + 251, 54, 68, 1, 249, 176, 68, 1, 248, 193, 68, 1, 30, 248, 116, 68, 1, + 248, 116, 68, 1, 240, 139, 68, 1, 30, 248, 166, 68, 1, 248, 166, 68, 1, + 30, 248, 132, 68, 1, 248, 132, 68, 1, 239, 178, 68, 1, 243, 144, 68, 1, + 30, 253, 175, 68, 1, 253, 175, 68, 1, 30, 240, 248, 68, 1, 240, 248, 68, + 1, 252, 99, 68, 1, 243, 253, 68, 1, 243, 33, 68, 1, 249, 175, 68, 18, + 238, 126, 45, 249, 192, 68, 18, 238, 126, 254, 76, 248, 193, 68, 18, 238, + 126, 45, 248, 193, 68, 233, 51, 238, 186, 68, 233, 51, 234, 56, 11, 61, + 52, 11, 21, 242, 97, 11, 237, 159, 238, 95, 11, 21, 242, 93, 238, 237, + 52, 11, 240, 27, 11, 250, 186, 234, 6, 11, 242, 63, 244, 46, 52, 11, 21, + 241, 245, 11, 21, 233, 100, 240, 107, 235, 40, 11, 21, 240, 107, 235, + 173, 11, 21, 233, 228, 238, 242, 11, 21, 252, 127, 238, 244, 244, 80, 11, + 21, 235, 31, 11, 3, 200, 248, 137, 11, 234, 14, 11, 240, 3, 53, 233, 51, + 69, 11, 236, 156, 69, 11, 1, 240, 186, 11, 1, 83, 2, 243, 42, 48, 11, 1, + 83, 2, 143, 48, 11, 1, 253, 220, 2, 143, 48, 11, 1, 83, 2, 143, 46, 11, + 1, 57, 2, 143, 48, 11, 1, 243, 3, 11, 1, 249, 31, 11, 1, 253, 127, 237, + 200, 11, 1, 252, 213, 11, 1, 247, 142, 11, 1, 243, 200, 11, 1, 251, 45, + 11, 1, 243, 205, 11, 1, 250, 180, 11, 1, 247, 141, 11, 1, 248, 245, 11, + 1, 244, 63, 11, 1, 243, 120, 11, 1, 242, 103, 11, 1, 252, 165, 11, 1, + 250, 178, 11, 1, 248, 137, 11, 1, 253, 97, 11, 1, 248, 105, 11, 1, 240, + 180, 11, 238, 22, 11, 1, 248, 156, 11, 1, 249, 145, 11, 1, 248, 116, 11, + 1, 251, 182, 11, 1, 243, 223, 11, 1, 243, 236, 11, 1, 251, 50, 11, 1, + 248, 142, 11, 1, 83, 236, 232, 11, 1, 248, 144, 11, 236, 18, 11, 235, + 197, 11, 236, 43, 11, 241, 103, 11, 240, 134, 11, 241, 193, 11, 239, 191, + 11, 240, 240, 11, 241, 223, 48, 11, 143, 48, 11, 143, 46, 11, 235, 48, + 243, 3, 11, 236, 145, 240, 134, 11, 158, 198, 238, 187, 11, 236, 144, 11, + 33, 21, 3, 255, 110, 48, 11, 33, 21, 236, 145, 3, 255, 110, 48, 11, 33, + 21, 53, 46, 11, 224, 240, 134, 11, 243, 40, 2, 171, 243, 5, 232, 73, 26, + 242, 217, 232, 73, 26, 127, 232, 73, 26, 111, 232, 73, 26, 166, 232, 73, + 26, 177, 232, 73, 26, 176, 232, 73, 26, 187, 232, 73, 26, 203, 232, 73, + 26, 195, 232, 73, 26, 202, 11, 238, 107, 52, 11, 238, 176, 234, 6, 11, + 235, 114, 234, 6, 11, 248, 48, 238, 74, 242, 229, 11, 1, 238, 70, 249, + 31, 11, 1, 238, 70, 249, 145, 11, 1, 233, 49, 243, 3, 11, 1, 83, 242, + 182, 11, 1, 83, 2, 248, 103, 143, 48, 11, 1, 83, 2, 248, 103, 143, 46, + 11, 1, 200, 240, 186, 11, 1, 200, 143, 243, 3, 11, 1, 200, 143, 248, 142, + 11, 1, 132, 2, 143, 48, 11, 1, 200, 143, 248, 144, 11, 1, 247, 165, 11, + 1, 239, 231, 11, 1, 244, 214, 11, 1, 253, 127, 2, 242, 233, 11, 1, 253, + 127, 2, 204, 181, 60, 234, 9, 11, 1, 248, 237, 11, 1, 242, 143, 11, 1, + 241, 28, 11, 1, 94, 2, 143, 48, 11, 1, 94, 2, 171, 181, 59, 48, 11, 1, + 246, 201, 11, 1, 245, 77, 11, 1, 94, 2, 204, 181, 48, 11, 1, 242, 142, + 11, 1, 238, 23, 11, 1, 245, 37, 11, 1, 253, 199, 2, 242, 233, 11, 1, 253, + 199, 2, 53, 46, 11, 1, 253, 199, 2, 53, 242, 230, 19, 3, 248, 137, 11, 1, + 241, 71, 11, 1, 239, 38, 11, 1, 250, 208, 11, 1, 253, 199, 2, 204, 181, + 60, 234, 9, 11, 1, 253, 199, 2, 248, 58, 181, 48, 11, 1, 247, 36, 11, 1, + 253, 143, 2, 3, 179, 11, 1, 253, 143, 2, 242, 233, 11, 1, 253, 143, 2, + 53, 46, 11, 1, 253, 143, 2, 3, 255, 110, 46, 11, 1, 253, 143, 2, 53, 242, + 230, 19, 53, 48, 11, 1, 253, 143, 2, 171, 181, 48, 11, 1, 251, 112, 11, + 1, 253, 143, 2, 248, 58, 181, 48, 11, 1, 248, 39, 2, 53, 242, 230, 19, + 53, 48, 11, 1, 248, 39, 2, 204, 181, 46, 11, 1, 248, 39, 2, 204, 181, + 242, 230, 19, 204, 181, 48, 11, 1, 253, 157, 2, 171, 181, 46, 11, 1, 253, + 157, 2, 204, 181, 48, 11, 1, 253, 169, 2, 204, 181, 48, 11, 1, 253, 158, + 2, 204, 181, 48, 11, 1, 238, 70, 248, 156, 11, 1, 253, 153, 2, 53, 246, + 92, 46, 11, 1, 253, 153, 2, 53, 46, 11, 1, 253, 10, 11, 1, 253, 153, 2, + 204, 181, 46, 11, 1, 242, 53, 11, 1, 253, 167, 2, 53, 48, 11, 1, 253, + 167, 2, 204, 181, 48, 11, 1, 241, 197, 11, 1, 243, 126, 248, 116, 11, 1, + 253, 135, 2, 242, 233, 11, 1, 253, 135, 2, 53, 48, 11, 1, 254, 26, 11, 1, + 253, 135, 2, 204, 181, 46, 11, 1, 251, 5, 11, 1, 253, 246, 2, 242, 233, + 11, 1, 242, 8, 11, 1, 253, 246, 2, 171, 181, 46, 11, 1, 245, 129, 11, 1, + 253, 246, 2, 204, 181, 48, 11, 1, 182, 2, 3, 179, 11, 1, 182, 2, 53, 48, + 11, 1, 182, 2, 204, 181, 48, 11, 1, 182, 2, 204, 181, 46, 11, 1, 198, 2, + 53, 46, 11, 1, 198, 238, 187, 11, 1, 242, 85, 11, 1, 198, 2, 242, 233, + 11, 1, 198, 2, 204, 181, 48, 11, 1, 253, 124, 232, 133, 11, 1, 243, 47, + 2, 53, 48, 11, 1, 253, 124, 2, 57, 48, 11, 1, 253, 124, 243, 185, 11, 1, + 253, 124, 248, 128, 2, 143, 48, 11, 1, 253, 127, 238, 144, 243, 185, 11, + 1, 253, 220, 2, 242, 233, 11, 1, 238, 73, 253, 193, 11, 1, 253, 193, 11, + 1, 79, 11, 1, 253, 161, 11, 1, 238, 73, 253, 161, 11, 1, 253, 220, 2, + 171, 181, 48, 11, 1, 254, 12, 11, 1, 243, 26, 248, 144, 11, 1, 57, 2, + 242, 226, 11, 1, 57, 2, 3, 179, 11, 1, 253, 220, 2, 53, 48, 11, 1, 72, + 11, 1, 57, 2, 204, 181, 46, 11, 1, 57, 239, 5, 11, 1, 57, 240, 92, 2, + 143, 48, 11, 248, 37, 208, 11, 1, 253, 178, 11, 3, 200, 18, 253, 157, 2, + 182, 2, 83, 236, 232, 11, 3, 200, 18, 253, 167, 2, 182, 2, 83, 236, 232, + 11, 3, 200, 51, 54, 13, 11, 3, 200, 182, 243, 3, 11, 3, 200, 243, 200, + 11, 3, 200, 204, 243, 5, 11, 3, 200, 243, 120, 11, 253, 165, 147, 244, + 87, 11, 243, 124, 147, 254, 237, 255, 49, 245, 147, 11, 3, 200, 238, 121, + 242, 217, 11, 3, 200, 239, 234, 233, 97, 242, 217, 11, 3, 200, 238, 70, + 251, 49, 147, 243, 205, 11, 3, 200, 51, 39, 13, 11, 3, 170, 243, 120, 11, + 3, 200, 241, 222, 11, 3, 248, 142, 11, 3, 248, 144, 11, 3, 200, 248, 144, + 11, 3, 200, 243, 236, 11, 243, 245, 147, 239, 177, 11, 243, 15, 240, 46, + 170, 208, 11, 243, 15, 240, 46, 200, 208, 11, 238, 121, 200, 248, 119, 2, + 241, 109, 238, 129, 11, 3, 170, 243, 223, 11, 1, 253, 199, 2, 236, 145, + 179, 11, 1, 253, 143, 2, 236, 145, 179, 236, 174, 232, 73, 26, 242, 217, + 236, 174, 232, 73, 26, 127, 236, 174, 232, 73, 26, 111, 236, 174, 232, + 73, 26, 166, 236, 174, 232, 73, 26, 177, 236, 174, 232, 73, 26, 176, 236, + 174, 232, 73, 26, 187, 236, 174, 232, 73, 26, 203, 236, 174, 232, 73, 26, + 195, 236, 174, 232, 73, 26, 202, 11, 1, 242, 216, 2, 53, 46, 11, 1, 253, + 155, 2, 53, 46, 11, 1, 242, 240, 2, 53, 46, 11, 21, 240, 233, 234, 17, + 11, 21, 240, 233, 232, 197, 248, 228, 11, 1, 253, 124, 2, 236, 145, 179, + 129, 253, 165, 147, 234, 232, 129, 233, 80, 248, 37, 208, 129, 235, 110, + 248, 37, 208, 129, 233, 80, 240, 24, 129, 235, 110, 240, 24, 129, 163, + 240, 24, 129, 243, 14, 240, 122, 242, 220, 129, 243, 14, 240, 122, 225, + 129, 233, 80, 243, 14, 240, 122, 242, 220, 129, 235, 110, 243, 14, 240, + 122, 225, 129, 232, 121, 129, 236, 227, 239, 150, 129, 236, 227, 234, + 222, 129, 236, 227, 233, 117, 129, 232, 88, 69, 129, 1, 240, 155, 129, 1, + 233, 49, 240, 155, 129, 1, 244, 219, 129, 1, 241, 121, 129, 1, 245, 96, + 235, 123, 129, 1, 239, 35, 129, 1, 238, 70, 241, 72, 243, 255, 129, 1, + 253, 168, 129, 1, 248, 142, 129, 1, 244, 63, 129, 1, 245, 142, 129, 1, + 247, 140, 129, 1, 252, 216, 235, 123, 129, 1, 247, 238, 129, 1, 253, 87, + 253, 168, 129, 1, 246, 5, 129, 1, 239, 113, 129, 1, 251, 235, 129, 1, + 248, 132, 129, 1, 237, 37, 129, 1, 30, 237, 37, 129, 1, 72, 129, 1, 253, + 175, 129, 1, 224, 253, 175, 129, 1, 242, 92, 129, 1, 247, 6, 129, 1, 243, + 255, 129, 1, 243, 33, 129, 1, 252, 211, 129, 1, 184, 241, 30, 129, 1, + 184, 239, 84, 129, 1, 184, 237, 104, 129, 240, 143, 48, 129, 240, 143, + 46, 129, 240, 143, 238, 136, 129, 240, 154, 48, 129, 240, 154, 46, 129, + 240, 154, 238, 136, 129, 243, 252, 48, 129, 243, 252, 46, 129, 240, 4, + 244, 66, 233, 50, 129, 240, 4, 244, 66, 237, 61, 129, 243, 192, 48, 129, + 243, 192, 46, 129, 233, 205, 238, 136, 129, 243, 170, 48, 129, 243, 170, + 46, 129, 242, 91, 129, 237, 9, 248, 40, 129, 234, 244, 129, 236, 94, 129, + 171, 59, 181, 48, 129, 171, 59, 181, 46, 129, 204, 181, 48, 129, 204, + 181, 46, 129, 238, 106, 248, 41, 48, 129, 238, 106, 248, 41, 46, 129, + 241, 251, 129, 237, 71, 129, 1, 238, 151, 242, 202, 129, 1, 238, 151, + 241, 201, 129, 1, 238, 151, 254, 62, 11, 1, 253, 136, 2, 204, 181, 232, + 173, 46, 11, 1, 253, 136, 2, 53, 242, 230, 19, 204, 181, 48, 11, 1, 253, + 136, 2, 204, 181, 236, 150, 226, 226, 46, 11, 1, 253, 136, 2, 204, 181, + 236, 150, 226, 226, 242, 230, 19, 171, 181, 48, 11, 1, 253, 136, 2, 171, + 181, 242, 230, 19, 53, 48, 11, 1, 253, 136, 2, 236, 145, 3, 255, 110, 46, + 11, 1, 253, 136, 2, 3, 179, 11, 1, 94, 2, 171, 181, 48, 11, 1, 94, 2, + 204, 181, 236, 150, 226, 226, 46, 11, 1, 253, 199, 2, 171, 181, 234, 33, + 242, 230, 19, 3, 248, 137, 11, 1, 253, 199, 2, 236, 145, 3, 255, 110, 46, + 11, 1, 253, 143, 2, 108, 11, 1, 248, 39, 2, 248, 58, 181, 48, 11, 1, 253, + 158, 2, 171, 181, 48, 11, 1, 253, 158, 2, 204, 181, 236, 150, 235, 45, + 48, 11, 1, 253, 158, 2, 171, 181, 234, 33, 48, 11, 1, 253, 153, 2, 171, + 181, 46, 11, 1, 253, 153, 2, 204, 181, 236, 150, 226, 226, 46, 11, 1, + 243, 21, 2, 53, 48, 11, 1, 243, 21, 2, 204, 181, 48, 11, 1, 243, 21, 2, + 204, 181, 236, 150, 226, 226, 46, 11, 1, 51, 2, 53, 48, 11, 1, 51, 2, 53, + 46, 11, 1, 198, 2, 171, 181, 46, 11, 1, 198, 2, 3, 248, 137, 11, 1, 198, + 2, 3, 179, 11, 1, 182, 2, 125, 11, 1, 253, 143, 2, 171, 181, 234, 33, 48, + 11, 1, 253, 143, 2, 143, 48, 11, 1, 248, 39, 2, 171, 181, 234, 33, 48, + 199, 1, 248, 114, 199, 1, 234, 254, 199, 1, 242, 22, 199, 1, 248, 182, + 199, 1, 249, 30, 199, 1, 234, 218, 199, 1, 241, 191, 199, 1, 241, 8, 199, + 1, 242, 173, 199, 1, 241, 231, 199, 1, 241, 101, 199, 1, 239, 41, 199, 1, + 243, 76, 199, 1, 241, 210, 199, 1, 241, 119, 199, 1, 234, 195, 199, 1, + 242, 99, 199, 1, 235, 199, 199, 1, 236, 143, 199, 1, 236, 127, 199, 1, + 248, 191, 199, 1, 236, 72, 199, 1, 236, 42, 199, 1, 234, 100, 199, 1, + 247, 163, 199, 1, 243, 194, 199, 1, 246, 8, 199, 1, 239, 217, 199, 1, + 249, 216, 199, 1, 239, 193, 199, 1, 239, 176, 199, 1, 239, 34, 199, 1, + 87, 199, 1, 253, 222, 199, 1, 244, 74, 199, 1, 239, 83, 199, 1, 242, 68, + 199, 1, 242, 181, 199, 237, 54, 199, 234, 88, 199, 237, 176, 199, 234, + 183, 199, 238, 37, 199, 234, 229, 199, 237, 145, 199, 234, 189, 199, 237, + 223, 199, 234, 228, 199, 240, 240, 199, 1, 248, 231, 85, 21, 232, 77, 85, + 21, 235, 61, 85, 21, 236, 173, 85, 1, 242, 215, 67, 85, 1, 67, 85, 1, + 253, 140, 85, 1, 71, 85, 1, 253, 142, 85, 1, 79, 85, 1, 253, 148, 85, 1, + 165, 144, 85, 1, 165, 162, 85, 1, 240, 61, 72, 85, 1, 242, 215, 72, 85, + 1, 72, 85, 1, 253, 149, 85, 1, 240, 61, 73, 85, 1, 242, 215, 73, 85, 1, + 73, 85, 1, 253, 151, 85, 1, 201, 85, 1, 248, 61, 85, 1, 253, 139, 85, 1, + 248, 77, 85, 1, 248, 50, 85, 1, 253, 152, 85, 1, 248, 57, 85, 1, 253, + 146, 85, 1, 248, 89, 85, 1, 248, 78, 85, 1, 248, 71, 85, 1, 242, 247, 85, + 1, 248, 75, 85, 1, 242, 249, 85, 1, 248, 82, 85, 1, 253, 126, 85, 1, 248, + 55, 85, 1, 253, 133, 85, 1, 248, 76, 85, 1, 253, 131, 85, 1, 243, 234, + 85, 1, 253, 129, 85, 1, 248, 65, 85, 1, 253, 141, 85, 1, 248, 81, 85, 1, + 222, 85, 1, 216, 85, 1, 253, 130, 85, 1, 248, 96, 85, 1, 253, 134, 85, 1, + 248, 94, 85, 1, 243, 104, 85, 1, 253, 171, 85, 1, 248, 46, 85, 1, 248, + 66, 85, 1, 253, 132, 85, 1, 219, 85, 21, 240, 81, 85, 21, 235, 80, 85, + 33, 21, 253, 140, 85, 33, 21, 71, 85, 33, 21, 253, 142, 85, 33, 21, 79, + 85, 33, 21, 253, 148, 85, 33, 21, 165, 144, 85, 33, 21, 165, 253, 182, + 85, 33, 21, 240, 61, 72, 85, 33, 21, 242, 215, 72, 85, 33, 21, 72, 85, + 33, 21, 253, 149, 85, 33, 21, 240, 61, 73, 85, 33, 21, 242, 215, 73, 85, + 33, 21, 73, 85, 33, 21, 253, 151, 85, 21, 238, 72, 85, 254, 43, 85, 240, + 148, 21, 239, 233, 85, 240, 148, 21, 235, 163, 85, 242, 245, 238, 54, 85, + 242, 241, 238, 54, 85, 1, 253, 217, 85, 1, 243, 207, 85, 1, 243, 183, 85, + 1, 253, 163, 85, 1, 241, 75, 85, 1, 248, 246, 85, 1, 253, 179, 85, 1, + 249, 24, 85, 1, 165, 253, 182, 85, 1, 165, 253, 191, 85, 33, 21, 165, + 162, 85, 33, 21, 165, 253, 191, 85, 240, 111, 85, 45, 240, 111, 85, 26, + 242, 217, 85, 26, 127, 85, 26, 111, 85, 26, 166, 85, 26, 177, 85, 26, + 176, 85, 26, 187, 85, 26, 203, 85, 26, 195, 85, 26, 202, 85, 232, 88, 52, + 85, 1, 238, 62, 208, 101, 21, 232, 77, 101, 21, 235, 61, 101, 21, 236, + 173, 101, 1, 67, 101, 1, 253, 140, 101, 1, 71, 101, 1, 253, 142, 101, 1, + 79, 101, 1, 253, 148, 101, 1, 165, 144, 101, 1, 165, 162, 101, 1, 72, + 101, 1, 253, 149, 101, 1, 73, 101, 1, 253, 151, 101, 1, 201, 101, 1, 248, + 61, 101, 1, 253, 139, 101, 1, 248, 77, 101, 1, 248, 50, 101, 1, 253, 152, + 101, 1, 248, 57, 101, 1, 253, 146, 101, 1, 248, 89, 101, 1, 248, 78, 101, + 1, 248, 71, 101, 1, 242, 247, 101, 1, 248, 75, 101, 1, 242, 249, 101, 1, + 248, 82, 101, 1, 253, 126, 101, 1, 248, 55, 101, 1, 253, 133, 101, 1, + 248, 76, 101, 1, 253, 131, 101, 1, 253, 129, 101, 1, 248, 65, 101, 1, + 253, 141, 101, 1, 248, 81, 101, 1, 222, 101, 1, 216, 101, 1, 253, 130, + 101, 1, 253, 134, 101, 1, 248, 46, 101, 1, 248, 66, 101, 1, 253, 132, + 101, 1, 219, 101, 21, 240, 81, 101, 21, 235, 80, 101, 33, 21, 253, 140, + 101, 33, 21, 71, 101, 33, 21, 253, 142, 101, 33, 21, 79, 101, 33, 21, + 253, 148, 101, 33, 21, 165, 144, 101, 33, 21, 165, 253, 182, 101, 33, 21, + 72, 101, 33, 21, 253, 149, 101, 33, 21, 73, 101, 33, 21, 253, 151, 101, + 21, 238, 72, 101, 1, 241, 200, 253, 126, 101, 255, 39, 240, 51, 69, 101, + 1, 248, 96, 101, 1, 248, 246, 101, 1, 249, 24, 101, 1, 165, 253, 182, + 101, 1, 165, 253, 191, 101, 33, 21, 165, 162, 101, 33, 21, 165, 253, 191, + 101, 26, 242, 217, 101, 26, 127, 101, 26, 111, 101, 26, 166, 101, 26, + 177, 101, 26, 176, 101, 26, 187, 101, 26, 203, 101, 26, 195, 101, 26, + 202, 101, 1, 255, 63, 2, 240, 1, 235, 86, 101, 1, 255, 63, 2, 168, 235, + 86, 101, 243, 44, 69, 101, 243, 44, 52, 101, 236, 181, 235, 79, 127, 101, + 236, 181, 235, 79, 111, 101, 236, 181, 235, 79, 166, 101, 236, 181, 235, + 79, 177, 101, 236, 181, 235, 79, 253, 125, 251, 190, 249, 1, 253, 145, + 232, 129, 101, 236, 181, 233, 131, 236, 202, 101, 238, 191, 133, 21, 249, + 233, 240, 160, 133, 21, 240, 160, 133, 21, 236, 173, 133, 1, 67, 133, 1, + 253, 140, 133, 1, 71, 133, 1, 253, 142, 133, 1, 79, 133, 1, 253, 148, + 133, 1, 253, 164, 133, 1, 253, 149, 133, 1, 253, 156, 133, 1, 253, 151, + 133, 1, 201, 133, 1, 248, 61, 133, 1, 253, 139, 133, 1, 248, 77, 133, 1, + 248, 50, 133, 1, 253, 152, 133, 1, 248, 57, 133, 1, 253, 146, 133, 1, + 248, 89, 133, 1, 248, 78, 133, 1, 248, 71, 133, 1, 242, 247, 133, 1, 248, + 75, 133, 1, 242, 249, 133, 1, 248, 82, 133, 1, 253, 126, 133, 1, 248, 55, + 133, 1, 253, 133, 133, 1, 248, 76, 133, 1, 253, 131, 133, 1, 253, 129, + 133, 1, 248, 65, 133, 1, 253, 141, 133, 1, 248, 81, 133, 1, 222, 133, 1, + 216, 133, 1, 253, 130, 133, 1, 253, 134, 133, 1, 248, 94, 133, 1, 253, + 171, 133, 1, 248, 46, 133, 1, 253, 132, 133, 1, 219, 133, 21, 240, 81, + 133, 33, 21, 253, 140, 133, 33, 21, 71, 133, 33, 21, 253, 142, 133, 33, + 21, 79, 133, 33, 21, 253, 148, 133, 33, 21, 253, 164, 133, 33, 21, 253, + 149, 133, 33, 21, 253, 156, 133, 33, 21, 253, 151, 133, 21, 238, 72, 133, + 1, 243, 207, 133, 1, 243, 183, 133, 1, 253, 163, 133, 1, 248, 96, 133, 1, + 253, 179, 133, 26, 242, 217, 133, 26, 127, 133, 26, 111, 133, 26, 166, + 133, 26, 177, 133, 26, 176, 133, 26, 187, 133, 26, 203, 133, 26, 195, + 133, 26, 202, 133, 242, 154, 133, 241, 5, 133, 251, 107, 133, 253, 2, + 133, 255, 73, 242, 41, 112, 21, 232, 77, 112, 21, 235, 61, 112, 21, 236, + 173, 112, 1, 67, 112, 1, 253, 140, 112, 1, 71, 112, 1, 253, 142, 112, 1, + 79, 112, 1, 253, 148, 112, 1, 165, 144, 112, 1, 165, 162, 112, 33, 240, + 61, 72, 112, 1, 72, 112, 1, 253, 149, 112, 33, 240, 61, 73, 112, 1, 73, + 112, 1, 253, 151, 112, 1, 201, 112, 1, 248, 61, 112, 1, 253, 139, 112, 1, + 248, 77, 112, 1, 248, 50, 112, 1, 253, 152, 112, 1, 248, 57, 112, 1, 253, + 146, 112, 1, 248, 89, 112, 1, 248, 78, 112, 1, 248, 71, 112, 1, 242, 247, + 112, 1, 248, 75, 112, 1, 242, 249, 112, 1, 248, 82, 112, 1, 253, 126, + 112, 1, 248, 55, 112, 1, 253, 133, 112, 1, 248, 76, 112, 1, 253, 131, + 112, 1, 253, 129, 112, 1, 248, 65, 112, 1, 253, 141, 112, 1, 248, 81, + 112, 1, 222, 112, 1, 216, 112, 1, 253, 130, 112, 1, 253, 134, 112, 1, + 248, 94, 112, 1, 253, 171, 112, 1, 248, 46, 112, 1, 248, 66, 112, 1, 253, + 132, 112, 1, 219, 112, 21, 240, 81, 112, 21, 235, 80, 112, 33, 21, 253, + 140, 112, 33, 21, 71, 112, 33, 21, 253, 142, 112, 33, 21, 79, 112, 33, + 21, 253, 148, 112, 33, 21, 165, 144, 112, 33, 21, 165, 253, 182, 112, 33, + 21, 240, 61, 72, 112, 33, 21, 72, 112, 33, 21, 253, 149, 112, 33, 21, + 240, 61, 73, 112, 33, 21, 73, 112, 33, 21, 253, 151, 112, 21, 238, 72, + 112, 254, 43, 112, 1, 165, 253, 182, 112, 1, 165, 253, 191, 112, 33, 21, + 165, 162, 112, 33, 21, 165, 253, 191, 112, 26, 242, 217, 112, 26, 127, + 112, 26, 111, 112, 26, 166, 112, 26, 177, 112, 26, 176, 112, 26, 187, + 112, 26, 203, 112, 26, 195, 112, 26, 202, 112, 243, 44, 52, 118, 21, 232, + 77, 118, 21, 235, 61, 118, 21, 236, 173, 118, 1, 67, 118, 1, 253, 140, + 118, 1, 71, 118, 1, 253, 142, 118, 1, 79, 118, 1, 253, 148, 118, 1, 165, + 144, 118, 1, 165, 162, 118, 1, 72, 118, 1, 253, 149, 118, 1, 73, 118, 1, + 253, 151, 118, 1, 201, 118, 1, 248, 61, 118, 1, 253, 139, 118, 1, 248, + 77, 118, 1, 248, 50, 118, 1, 253, 152, 118, 1, 248, 57, 118, 1, 253, 146, + 118, 1, 248, 89, 118, 1, 248, 78, 118, 1, 248, 71, 118, 1, 242, 247, 118, + 1, 248, 75, 118, 1, 242, 249, 118, 1, 248, 82, 118, 1, 253, 126, 118, 1, + 248, 55, 118, 1, 253, 133, 118, 1, 248, 76, 118, 1, 253, 131, 118, 1, + 253, 129, 118, 1, 248, 65, 118, 1, 253, 141, 118, 1, 248, 81, 118, 1, + 222, 118, 1, 216, 118, 1, 253, 130, 118, 1, 253, 134, 118, 1, 248, 94, + 118, 1, 253, 171, 118, 1, 248, 46, 118, 1, 248, 66, 118, 1, 253, 132, + 118, 1, 219, 118, 21, 240, 81, 118, 21, 235, 80, 118, 33, 21, 253, 140, + 118, 33, 21, 71, 118, 33, 21, 253, 142, 118, 33, 21, 79, 118, 33, 21, + 253, 148, 118, 33, 21, 165, 144, 118, 33, 21, 72, 118, 33, 21, 253, 149, + 118, 33, 21, 73, 118, 33, 21, 253, 151, 118, 21, 238, 72, 118, 255, 37, + 240, 51, 69, 118, 255, 39, 240, 51, 69, 118, 1, 248, 96, 118, 1, 248, + 246, 118, 1, 249, 24, 118, 1, 165, 253, 182, 118, 1, 165, 253, 191, 118, + 26, 242, 217, 118, 26, 127, 118, 26, 111, 118, 26, 166, 118, 26, 177, + 118, 26, 176, 118, 26, 187, 118, 26, 203, 118, 26, 195, 118, 26, 202, + 118, 238, 191, 118, 1, 253, 138, 140, 21, 235, 61, 140, 21, 236, 173, + 140, 1, 67, 140, 1, 253, 140, 140, 1, 71, 140, 1, 253, 142, 140, 1, 79, + 140, 1, 253, 148, 140, 1, 72, 140, 1, 253, 164, 140, 1, 253, 149, 140, 1, + 73, 140, 1, 253, 156, 140, 1, 253, 151, 140, 1, 201, 140, 1, 248, 50, + 140, 1, 253, 152, 140, 1, 253, 146, 140, 1, 248, 78, 140, 1, 248, 71, + 140, 1, 248, 82, 140, 1, 253, 126, 140, 1, 253, 131, 140, 1, 243, 234, + 140, 1, 253, 129, 140, 1, 222, 140, 1, 216, 140, 1, 253, 130, 140, 1, + 248, 96, 140, 1, 253, 134, 140, 1, 248, 94, 140, 1, 243, 104, 140, 1, + 253, 171, 140, 1, 248, 46, 140, 1, 248, 66, 140, 1, 253, 132, 140, 1, + 219, 140, 33, 21, 253, 140, 140, 33, 21, 71, 140, 33, 21, 253, 142, 140, + 33, 21, 79, 140, 33, 21, 253, 148, 140, 33, 21, 72, 140, 33, 21, 253, + 164, 140, 33, 21, 253, 149, 140, 33, 21, 73, 140, 33, 21, 253, 156, 140, + 33, 21, 253, 151, 140, 21, 238, 72, 140, 255, 39, 240, 51, 69, 140, 26, + 242, 217, 140, 26, 127, 140, 26, 111, 140, 26, 166, 140, 26, 177, 140, + 26, 176, 140, 26, 187, 140, 26, 203, 140, 26, 195, 140, 26, 202, 140, 61, + 248, 53, 140, 61, 253, 125, 236, 149, 140, 61, 253, 125, 235, 49, 140, + 253, 137, 52, 140, 246, 90, 52, 140, 249, 206, 52, 140, 245, 59, 52, 140, + 241, 68, 52, 140, 255, 24, 60, 52, 140, 243, 44, 52, 140, 61, 52, 124, + 21, 232, 77, 124, 21, 235, 61, 124, 21, 236, 173, 124, 1, 67, 124, 1, + 253, 140, 124, 1, 71, 124, 1, 253, 142, 124, 1, 79, 124, 1, 253, 148, + 124, 1, 165, 144, 124, 1, 165, 162, 124, 1, 72, 124, 1, 253, 164, 124, 1, + 253, 149, 124, 1, 73, 124, 1, 253, 156, 124, 1, 253, 151, 124, 1, 201, + 124, 1, 248, 61, 124, 1, 253, 139, 124, 1, 248, 77, 124, 1, 248, 50, 124, + 1, 253, 152, 124, 1, 248, 57, 124, 1, 253, 146, 124, 1, 248, 89, 124, 1, + 248, 78, 124, 1, 248, 71, 124, 1, 242, 247, 124, 1, 248, 75, 124, 1, 242, + 249, 124, 1, 248, 82, 124, 1, 253, 126, 124, 1, 248, 55, 124, 1, 253, + 133, 124, 1, 248, 76, 124, 1, 253, 131, 124, 1, 253, 129, 124, 1, 248, + 65, 124, 1, 253, 141, 124, 1, 248, 81, 124, 1, 222, 124, 1, 216, 124, 1, + 253, 130, 124, 1, 248, 96, 124, 1, 253, 134, 124, 1, 248, 94, 124, 1, + 253, 171, 124, 1, 248, 46, 124, 1, 248, 66, 124, 1, 253, 132, 124, 1, + 219, 124, 33, 21, 253, 140, 124, 33, 21, 71, 124, 33, 21, 253, 142, 124, + 33, 21, 79, 124, 33, 21, 253, 148, 124, 33, 21, 165, 144, 124, 33, 21, + 165, 253, 182, 124, 33, 21, 72, 124, 33, 21, 253, 164, 124, 33, 21, 253, + 149, 124, 33, 21, 73, 124, 33, 21, 253, 156, 124, 33, 21, 253, 151, 124, + 21, 238, 72, 124, 240, 51, 69, 124, 255, 37, 240, 51, 69, 124, 1, 165, + 253, 182, 124, 1, 165, 253, 191, 124, 26, 242, 217, 124, 26, 127, 124, + 26, 111, 124, 26, 166, 124, 26, 177, 124, 26, 176, 124, 26, 187, 124, 26, + 203, 124, 26, 195, 124, 26, 202, 115, 21, 235, 61, 115, 21, 236, 173, + 115, 1, 67, 115, 1, 253, 140, 115, 1, 71, 115, 1, 253, 142, 115, 1, 79, + 115, 1, 253, 148, 115, 1, 165, 144, 115, 1, 165, 162, 115, 1, 72, 115, 1, + 253, 164, 115, 1, 253, 149, 115, 1, 73, 115, 1, 253, 156, 115, 1, 253, + 151, 115, 1, 201, 115, 1, 248, 61, 115, 1, 253, 139, 115, 1, 248, 77, + 115, 1, 248, 50, 115, 1, 253, 152, 115, 1, 248, 57, 115, 1, 253, 146, + 115, 1, 248, 89, 115, 1, 248, 78, 115, 1, 248, 71, 115, 1, 242, 247, 115, + 1, 248, 75, 115, 1, 242, 249, 115, 1, 248, 82, 115, 1, 253, 126, 115, 1, + 248, 55, 115, 1, 253, 133, 115, 1, 248, 76, 115, 1, 253, 131, 115, 1, + 253, 129, 115, 1, 248, 65, 115, 1, 253, 141, 115, 1, 248, 81, 115, 1, + 222, 115, 1, 216, 115, 1, 253, 130, 115, 1, 248, 96, 115, 1, 253, 134, + 115, 1, 248, 94, 115, 1, 253, 171, 115, 1, 248, 46, 115, 1, 248, 66, 115, + 1, 253, 132, 115, 1, 219, 115, 21, 240, 81, 115, 21, 235, 80, 115, 33, + 21, 253, 140, 115, 33, 21, 71, 115, 33, 21, 253, 142, 115, 33, 21, 79, + 115, 33, 21, 253, 148, 115, 33, 21, 165, 144, 115, 33, 21, 165, 253, 182, + 115, 33, 21, 72, 115, 33, 21, 253, 164, 115, 33, 21, 253, 149, 115, 33, + 21, 73, 115, 33, 21, 253, 156, 115, 33, 21, 253, 151, 115, 21, 238, 72, + 115, 240, 51, 69, 115, 255, 37, 240, 51, 69, 115, 1, 253, 179, 115, 1, + 165, 253, 182, 115, 1, 165, 253, 191, 115, 26, 242, 217, 115, 26, 127, + 115, 26, 111, 115, 26, 166, 115, 26, 177, 115, 26, 176, 115, 26, 187, + 115, 26, 203, 115, 26, 195, 115, 26, 202, 130, 21, 235, 61, 130, 21, 236, + 173, 130, 1, 67, 130, 1, 253, 140, 130, 1, 71, 130, 1, 253, 142, 130, 1, + 79, 130, 1, 253, 148, 130, 1, 165, 144, 130, 1, 165, 162, 130, 1, 72, + 130, 1, 253, 164, 130, 1, 253, 149, 130, 1, 73, 130, 1, 253, 156, 130, 1, + 253, 151, 130, 1, 201, 130, 1, 248, 61, 130, 1, 253, 139, 130, 1, 248, + 77, 130, 1, 248, 50, 130, 1, 253, 152, 130, 1, 248, 57, 130, 1, 253, 146, + 130, 1, 248, 89, 130, 1, 248, 78, 130, 1, 248, 71, 130, 1, 242, 247, 130, + 1, 248, 75, 130, 1, 242, 249, 130, 1, 248, 82, 130, 1, 253, 126, 130, 1, + 248, 55, 130, 1, 253, 133, 130, 1, 248, 76, 130, 1, 253, 131, 130, 1, + 253, 129, 130, 1, 248, 65, 130, 1, 253, 141, 130, 1, 248, 81, 130, 1, + 222, 130, 1, 216, 130, 1, 253, 130, 130, 1, 248, 96, 130, 1, 253, 134, + 130, 1, 248, 94, 130, 1, 243, 104, 130, 1, 253, 171, 130, 1, 248, 46, + 130, 1, 248, 66, 130, 1, 253, 132, 130, 1, 219, 130, 33, 21, 253, 140, + 130, 33, 21, 71, 130, 33, 21, 253, 142, 130, 33, 21, 79, 130, 33, 21, + 253, 148, 130, 33, 21, 165, 144, 130, 33, 21, 72, 130, 33, 21, 253, 164, + 130, 33, 21, 253, 149, 130, 33, 21, 73, 130, 33, 21, 253, 156, 130, 33, + 21, 253, 151, 130, 21, 238, 72, 130, 255, 39, 240, 51, 69, 130, 1, 165, + 253, 182, 130, 1, 165, 253, 191, 130, 26, 242, 217, 130, 26, 127, 130, + 26, 111, 130, 26, 166, 130, 26, 177, 130, 26, 176, 130, 26, 187, 130, 26, + 203, 130, 26, 195, 130, 26, 202, 123, 21, 233, 115, 123, 21, 235, 39, + 123, 1, 239, 0, 123, 1, 237, 53, 123, 1, 237, 56, 123, 1, 235, 161, 123, + 1, 239, 102, 123, 1, 237, 178, 123, 1, 239, 237, 123, 1, 238, 39, 123, 1, + 236, 41, 123, 1, 234, 209, 123, 1, 236, 37, 123, 1, 234, 202, 123, 1, + 239, 59, 123, 1, 237, 146, 123, 1, 237, 57, 123, 1, 239, 156, 123, 1, + 237, 227, 123, 1, 237, 68, 123, 1, 234, 8, 237, 16, 123, 1, 233, 58, 237, + 16, 123, 1, 234, 8, 236, 226, 123, 1, 233, 58, 236, 226, 123, 1, 239, + 105, 233, 89, 123, 1, 238, 122, 236, 226, 123, 1, 234, 8, 236, 250, 123, + 1, 233, 58, 236, 250, 123, 1, 234, 8, 236, 228, 123, 1, 233, 58, 236, + 228, 123, 1, 238, 154, 233, 89, 123, 1, 238, 154, 238, 1, 232, 185, 123, + 1, 238, 122, 236, 228, 123, 1, 234, 8, 235, 155, 123, 1, 233, 58, 235, + 155, 123, 1, 234, 8, 235, 97, 123, 1, 233, 58, 235, 97, 123, 1, 235, 104, + 237, 25, 123, 1, 238, 122, 235, 97, 123, 1, 234, 8, 237, 46, 123, 1, 233, + 58, 237, 46, 123, 1, 234, 8, 236, 222, 123, 1, 233, 58, 236, 222, 123, 1, + 238, 134, 237, 25, 123, 1, 238, 122, 236, 222, 123, 1, 234, 8, 237, 27, + 123, 1, 233, 58, 237, 27, 123, 1, 234, 8, 236, 220, 123, 1, 233, 58, 236, + 220, 123, 1, 237, 205, 123, 1, 249, 237, 236, 220, 123, 1, 238, 47, 123, + 1, 237, 247, 123, 1, 238, 134, 237, 20, 123, 1, 238, 41, 123, 1, 238, + 154, 236, 238, 123, 1, 235, 104, 236, 238, 123, 1, 238, 134, 236, 238, + 123, 1, 237, 171, 123, 1, 235, 104, 237, 20, 123, 1, 237, 155, 123, 21, + 234, 90, 123, 33, 21, 233, 67, 123, 33, 21, 243, 102, 233, 81, 123, 33, + 21, 248, 107, 233, 81, 123, 33, 21, 243, 102, 235, 130, 123, 33, 21, 248, + 107, 235, 130, 123, 33, 21, 243, 102, 234, 60, 123, 33, 21, 248, 107, + 234, 60, 123, 33, 21, 231, 104, 123, 33, 21, 237, 17, 123, 33, 21, 248, + 107, 237, 17, 123, 33, 21, 246, 18, 245, 62, 123, 33, 21, 238, 141, 254, + 64, 233, 67, 123, 33, 21, 238, 141, 254, 64, 248, 107, 233, 67, 123, 33, + 21, 238, 141, 254, 64, 232, 90, 123, 33, 21, 232, 90, 123, 33, 21, 248, + 107, 231, 104, 123, 33, 21, 248, 107, 232, 90, 123, 233, 51, 233, 214, + 107, 99, 255, 59, 249, 91, 107, 99, 253, 249, 246, 9, 107, 99, 253, 249, + 241, 202, 107, 99, 253, 249, 241, 203, 107, 99, 253, 249, 246, 12, 107, + 99, 253, 249, 237, 245, 107, 99, 254, 213, 252, 19, 107, 99, 254, 35, + 244, 253, 107, 99, 254, 35, 241, 53, 107, 99, 254, 35, 241, 51, 107, 99, + 255, 35, 253, 186, 107, 99, 254, 35, 245, 5, 107, 99, 255, 66, 247, 230, + 107, 99, 255, 48, 241, 49, 107, 99, 153, 242, 49, 107, 99, 253, 240, 243, + 127, 107, 99, 253, 240, 233, 218, 107, 99, 253, 240, 237, 237, 107, 99, + 255, 51, 252, 12, 107, 99, 255, 48, 250, 188, 107, 99, 153, 252, 208, + 107, 99, 253, 240, 242, 152, 107, 99, 253, 240, 239, 218, 107, 99, 253, + 240, 242, 151, 107, 99, 255, 51, 253, 150, 107, 99, 255, 69, 239, 2, 107, + 99, 255, 88, 252, 70, 107, 99, 254, 27, 242, 60, 107, 99, 255, 41, 253, + 179, 107, 99, 254, 27, 246, 244, 107, 99, 255, 41, 250, 233, 107, 99, + 254, 27, 238, 0, 107, 99, 255, 83, 222, 107, 99, 255, 66, 249, 20, 107, + 99, 255, 90, 252, 150, 107, 99, 253, 185, 107, 99, 255, 43, 243, 215, + 107, 99, 254, 8, 107, 99, 255, 96, 247, 191, 107, 99, 255, 35, 247, 63, + 107, 99, 255, 35, 247, 57, 107, 99, 255, 35, 252, 191, 107, 99, 255, 32, + 251, 62, 107, 99, 255, 43, 241, 55, 107, 99, 117, 248, 124, 107, 99, 255, + 32, 239, 145, 107, 99, 234, 231, 107, 99, 248, 83, 67, 107, 99, 253, 205, + 236, 32, 107, 99, 248, 83, 253, 140, 107, 99, 248, 83, 254, 32, 107, 99, + 248, 83, 71, 107, 99, 248, 83, 253, 142, 107, 99, 248, 83, 253, 252, 107, + 99, 248, 83, 252, 249, 107, 99, 248, 83, 79, 107, 99, 248, 83, 253, 148, + 107, 99, 237, 236, 107, 236, 181, 12, 244, 190, 107, 99, 248, 83, 72, + 107, 99, 248, 83, 253, 178, 107, 99, 248, 83, 73, 107, 99, 248, 83, 255, + 37, 237, 198, 107, 99, 248, 83, 255, 37, 236, 55, 107, 99, 232, 181, 107, + 99, 236, 56, 107, 99, 234, 220, 107, 99, 253, 205, 254, 90, 107, 99, 253, + 205, 248, 97, 107, 99, 253, 205, 252, 229, 107, 99, 253, 205, 235, 188, + 107, 99, 233, 41, 107, 99, 236, 63, 107, 99, 236, 141, 107, 99, 237, 158, + 107, 26, 242, 217, 107, 26, 127, 107, 26, 111, 107, 26, 166, 107, 26, + 177, 107, 26, 176, 107, 26, 187, 107, 26, 203, 107, 26, 195, 107, 26, + 202, 107, 99, 233, 113, 107, 99, 239, 108, 152, 1, 253, 190, 152, 1, 253, + 249, 243, 35, 152, 1, 253, 249, 248, 120, 152, 1, 248, 172, 152, 1, 253, + 224, 152, 1, 255, 35, 248, 120, 152, 1, 248, 133, 152, 1, 253, 225, 152, + 1, 87, 152, 1, 253, 240, 243, 35, 152, 1, 253, 240, 248, 120, 152, 1, + 253, 173, 152, 1, 254, 1, 152, 1, 253, 208, 152, 1, 254, 27, 243, 35, + 152, 1, 255, 41, 248, 120, 152, 1, 254, 27, 248, 120, 152, 1, 255, 41, + 243, 35, 152, 1, 253, 181, 152, 1, 253, 162, 152, 1, 255, 43, 243, 215, + 152, 1, 255, 43, 246, 54, 152, 1, 253, 177, 152, 1, 255, 35, 243, 35, + 152, 1, 255, 32, 243, 35, 152, 1, 73, 152, 1, 255, 32, 248, 120, 152, + 235, 69, 152, 33, 21, 67, 152, 33, 21, 253, 205, 248, 162, 152, 33, 21, + 253, 140, 152, 33, 21, 254, 32, 152, 33, 21, 71, 152, 33, 21, 253, 142, + 152, 33, 21, 255, 14, 152, 33, 21, 254, 77, 152, 33, 21, 79, 152, 33, 21, + 253, 148, 152, 33, 21, 253, 205, 251, 159, 152, 235, 143, 21, 253, 216, + 152, 235, 143, 21, 248, 133, 152, 33, 21, 72, 152, 33, 21, 254, 89, 152, + 33, 21, 73, 152, 33, 21, 254, 33, 152, 33, 21, 253, 149, 152, 255, 59, + 253, 134, 152, 188, 253, 205, 254, 90, 152, 188, 253, 205, 248, 97, 152, + 188, 253, 205, 253, 212, 152, 188, 253, 205, 239, 18, 152, 232, 118, 69, + 152, 234, 227, 152, 26, 242, 217, 152, 26, 127, 152, 26, 111, 152, 26, + 166, 152, 26, 177, 152, 26, 176, 152, 26, 187, 152, 26, 203, 152, 26, + 195, 152, 26, 202, 152, 255, 32, 253, 173, 152, 255, 32, 253, 181, 47, 4, + 254, 43, 47, 158, 248, 129, 253, 221, 253, 226, 236, 133, 67, 47, 158, + 248, 129, 253, 221, 253, 226, 254, 79, 249, 155, 250, 112, 222, 47, 158, + 248, 129, 253, 221, 253, 226, 254, 79, 248, 129, 243, 49, 222, 47, 158, + 54, 253, 221, 253, 226, 251, 224, 222, 47, 158, 238, 171, 253, 221, 253, + 226, 252, 173, 222, 47, 158, 243, 25, 253, 221, 253, 226, 249, 137, 249, + 161, 222, 47, 158, 253, 221, 253, 226, 243, 49, 249, 161, 222, 47, 158, + 247, 65, 243, 23, 47, 158, 244, 230, 253, 221, 248, 167, 47, 158, 250, + 127, 249, 162, 253, 221, 248, 167, 47, 158, 231, 143, 240, 249, 47, 158, + 235, 202, 243, 49, 241, 40, 47, 158, 243, 23, 47, 158, 248, 234, 243, 23, + 47, 158, 243, 49, 243, 23, 47, 158, 248, 234, 243, 49, 243, 23, 47, 158, + 254, 235, 250, 159, 242, 126, 243, 23, 47, 158, 249, 154, 251, 29, 243, + 23, 47, 158, 243, 25, 243, 140, 243, 72, 255, 81, 183, 248, 100, 47, 158, + 248, 129, 240, 249, 47, 237, 22, 21, 250, 158, 240, 70, 47, 237, 22, 21, + 251, 192, 240, 70, 47, 232, 89, 21, 252, 175, 251, 12, 244, 67, 240, 70, + 47, 232, 89, 21, 241, 3, 253, 129, 47, 232, 89, 21, 247, 67, 239, 230, + 47, 21, 248, 101, 248, 151, 243, 179, 47, 21, 248, 101, 248, 151, 240, + 183, 47, 21, 248, 101, 248, 151, 243, 187, 47, 21, 248, 101, 254, 66, + 243, 179, 47, 21, 248, 101, 254, 66, 240, 183, 47, 21, 248, 101, 248, + 151, 248, 101, 251, 252, 47, 26, 242, 217, 47, 26, 127, 47, 26, 111, 47, + 26, 166, 47, 26, 177, 47, 26, 176, 47, 26, 187, 47, 26, 203, 47, 26, 195, + 47, 26, 202, 47, 26, 137, 127, 47, 26, 137, 111, 47, 26, 137, 166, 47, + 26, 137, 177, 47, 26, 137, 176, 47, 26, 137, 187, 47, 26, 137, 203, 47, + 26, 137, 195, 47, 26, 137, 202, 47, 26, 137, 242, 217, 47, 158, 244, 228, + 240, 70, 47, 158, 249, 119, 243, 153, 254, 116, 253, 108, 47, 158, 243, + 25, 243, 140, 243, 72, 248, 199, 254, 112, 248, 100, 47, 158, 249, 119, + 243, 153, 252, 174, 240, 70, 47, 158, 253, 223, 248, 167, 47, 158, 254, + 129, 241, 4, 47, 158, 254, 95, 243, 72, 243, 189, 47, 158, 254, 95, 243, + 72, 243, 188, 47, 158, 254, 80, 243, 206, 243, 189, 47, 158, 254, 80, + 243, 206, 243, 188, 47, 21, 255, 8, 240, 250, 47, 21, 254, 198, 240, 250, + 47, 1, 201, 47, 1, 248, 61, 47, 1, 253, 139, 47, 1, 248, 77, 47, 1, 248, + 50, 47, 1, 253, 152, 47, 1, 248, 57, 47, 1, 253, 146, 47, 1, 248, 78, 47, + 1, 248, 71, 47, 1, 242, 247, 47, 1, 248, 75, 47, 1, 242, 249, 47, 1, 248, + 82, 47, 1, 253, 126, 47, 1, 248, 55, 47, 1, 253, 133, 47, 1, 248, 76, 47, + 1, 253, 131, 47, 1, 253, 129, 47, 1, 248, 65, 47, 1, 253, 141, 47, 1, + 248, 81, 47, 1, 222, 47, 1, 248, 90, 47, 1, 243, 130, 47, 1, 248, 153, + 47, 1, 243, 165, 47, 1, 253, 138, 47, 1, 248, 99, 47, 1, 253, 163, 47, 1, + 254, 78, 47, 1, 216, 47, 1, 253, 130, 47, 1, 253, 134, 47, 1, 248, 46, + 47, 1, 248, 66, 47, 1, 253, 132, 47, 1, 219, 47, 1, 67, 47, 1, 243, 210, + 47, 1, 234, 28, 253, 130, 47, 33, 21, 253, 140, 47, 33, 21, 71, 47, 33, + 21, 253, 142, 47, 33, 21, 79, 47, 33, 21, 253, 148, 47, 33, 21, 165, 144, + 47, 33, 21, 165, 253, 182, 47, 33, 21, 165, 162, 47, 33, 21, 165, 253, + 191, 47, 33, 21, 72, 47, 33, 21, 253, 164, 47, 33, 21, 73, 47, 33, 21, + 253, 156, 47, 21, 252, 140, 255, 91, 254, 212, 253, 160, 47, 21, 249, + 155, 244, 212, 47, 33, 21, 224, 71, 47, 33, 21, 224, 253, 142, 47, 21, + 254, 116, 255, 12, 254, 210, 253, 133, 47, 21, 254, 239, 246, 39, 47, + 158, 237, 168, 47, 158, 239, 157, 47, 21, 254, 192, 240, 70, 47, 21, 248, + 122, 240, 70, 47, 21, 254, 191, 254, 129, 248, 100, 47, 21, 251, 223, + 248, 100, 47, 21, 254, 94, 254, 148, 237, 34, 47, 21, 254, 94, 254, 200, + 237, 34, 47, 213, 1, 201, 47, 213, 1, 248, 61, 47, 213, 1, 253, 139, 47, + 213, 1, 248, 77, 47, 213, 1, 248, 50, 47, 213, 1, 253, 152, 47, 213, 1, + 248, 57, 47, 213, 1, 253, 146, 47, 213, 1, 248, 78, 47, 213, 1, 248, 71, + 47, 213, 1, 242, 247, 47, 213, 1, 248, 75, 47, 213, 1, 242, 249, 47, 213, + 1, 248, 82, 47, 213, 1, 253, 126, 47, 213, 1, 248, 55, 47, 213, 1, 253, + 133, 47, 213, 1, 248, 76, 47, 213, 1, 253, 131, 47, 213, 1, 253, 129, 47, + 213, 1, 248, 65, 47, 213, 1, 253, 141, 47, 213, 1, 248, 81, 47, 213, 1, + 222, 47, 213, 1, 248, 90, 47, 213, 1, 243, 130, 47, 213, 1, 248, 153, 47, + 213, 1, 243, 165, 47, 213, 1, 253, 138, 47, 213, 1, 248, 99, 47, 213, 1, + 253, 163, 47, 213, 1, 254, 78, 47, 213, 1, 216, 47, 213, 1, 253, 130, 47, + 213, 1, 253, 134, 47, 213, 1, 248, 46, 47, 213, 1, 248, 66, 47, 213, 1, + 253, 132, 47, 213, 1, 219, 47, 213, 1, 67, 47, 213, 1, 243, 210, 47, 213, + 1, 234, 28, 253, 138, 47, 213, 1, 234, 28, 216, 47, 213, 1, 234, 28, 253, + 130, 47, 255, 60, 255, 64, 248, 61, 47, 255, 60, 255, 64, 254, 183, 248, + 199, 254, 112, 248, 100, 47, 232, 82, 21, 96, 243, 147, 47, 232, 82, 21, + 136, 243, 147, 47, 232, 82, 21, 250, 144, 247, 138, 47, 232, 82, 21, 252, + 170, 241, 2, 47, 12, 250, 206, 253, 243, 47, 12, 254, 124, 252, 139, 47, + 12, 246, 237, 245, 97, 47, 12, 254, 124, 254, 236, 249, 154, 245, 127, + 47, 12, 249, 137, 253, 129, 47, 12, 253, 192, 253, 243, 47, 12, 253, 192, + 255, 47, 248, 234, 238, 127, 47, 12, 253, 192, 255, 47, 251, 30, 238, + 127, 47, 12, 253, 192, 255, 47, 248, 199, 238, 127, 47, 21, 248, 101, + 254, 66, 243, 187, 47, 158, 244, 229, 249, 162, 255, 57, 253, 226, 240, + 216, 47, 158, 246, 89, 253, 221, 255, 57, 253, 226, 240, 216, 131, 1, + 201, 131, 1, 248, 61, 131, 1, 253, 139, 131, 1, 248, 77, 131, 1, 248, 50, + 131, 1, 253, 152, 131, 1, 248, 57, 131, 1, 253, 146, 131, 1, 248, 89, + 131, 1, 248, 78, 131, 1, 246, 175, 131, 1, 248, 71, 131, 1, 242, 247, + 131, 1, 248, 75, 131, 1, 242, 249, 131, 1, 248, 82, 131, 1, 253, 126, + 131, 1, 248, 55, 131, 1, 253, 133, 131, 1, 248, 76, 131, 1, 253, 131, + 131, 1, 253, 129, 131, 1, 248, 65, 131, 1, 253, 141, 131, 1, 248, 81, + 131, 1, 222, 131, 1, 216, 131, 1, 253, 130, 131, 1, 253, 134, 131, 1, + 253, 138, 131, 1, 253, 132, 131, 1, 219, 131, 1, 248, 94, 131, 1, 67, + 131, 1, 71, 131, 1, 253, 142, 131, 1, 79, 131, 1, 253, 148, 131, 1, 72, + 131, 1, 73, 131, 1, 253, 151, 131, 33, 21, 253, 140, 131, 33, 21, 71, + 131, 33, 21, 253, 142, 131, 33, 21, 79, 131, 33, 21, 253, 148, 131, 33, + 21, 72, 131, 33, 21, 253, 149, 131, 21, 235, 61, 131, 21, 53, 46, 131, + 21, 236, 173, 131, 21, 238, 72, 131, 26, 242, 217, 131, 26, 127, 131, 26, + 111, 131, 26, 166, 131, 26, 177, 131, 26, 176, 131, 26, 187, 131, 26, + 203, 131, 26, 195, 131, 26, 202, 131, 21, 240, 101, 236, 210, 131, 21, + 236, 210, 131, 12, 236, 52, 131, 12, 234, 102, 131, 12, 229, 63, 131, 12, + 236, 30, 131, 1, 248, 46, 131, 1, 248, 66, 131, 1, 165, 144, 131, 1, 165, + 253, 182, 131, 1, 165, 162, 131, 1, 165, 253, 191, 131, 33, 21, 165, 144, + 131, 33, 21, 165, 253, 182, 131, 33, 21, 165, 162, 131, 33, 21, 165, 253, + 191, 75, 5, 1, 254, 19, 75, 5, 1, 248, 195, 75, 5, 1, 248, 158, 75, 5, 1, + 248, 205, 75, 5, 1, 253, 202, 75, 5, 1, 249, 11, 75, 5, 1, 249, 25, 75, + 5, 1, 248, 253, 75, 5, 1, 253, 247, 75, 5, 1, 248, 162, 75, 5, 1, 248, + 224, 75, 5, 1, 248, 131, 75, 5, 1, 248, 171, 75, 5, 1, 254, 9, 75, 5, 1, + 248, 236, 75, 5, 1, 243, 138, 75, 5, 1, 248, 243, 75, 5, 1, 248, 134, 75, + 5, 1, 248, 254, 75, 5, 1, 254, 75, 75, 5, 1, 243, 115, 75, 5, 1, 243, + 103, 75, 5, 1, 243, 95, 75, 5, 1, 248, 242, 75, 5, 1, 243, 33, 75, 5, 1, + 243, 88, 75, 5, 1, 248, 100, 75, 5, 1, 248, 217, 75, 5, 1, 248, 201, 75, + 5, 1, 243, 87, 75, 5, 1, 249, 16, 75, 5, 1, 243, 101, 75, 5, 1, 248, 212, + 75, 5, 1, 253, 168, 75, 5, 1, 248, 160, 75, 5, 1, 253, 170, 75, 5, 1, + 248, 213, 75, 5, 1, 248, 215, 75, 1, 254, 19, 75, 1, 248, 195, 75, 1, + 248, 158, 75, 1, 248, 205, 75, 1, 253, 202, 75, 1, 249, 11, 75, 1, 249, + 25, 75, 1, 248, 253, 75, 1, 253, 247, 75, 1, 248, 162, 75, 1, 248, 224, + 75, 1, 248, 131, 75, 1, 248, 171, 75, 1, 254, 9, 75, 1, 248, 236, 75, 1, + 243, 138, 75, 1, 248, 243, 75, 1, 248, 134, 75, 1, 248, 254, 75, 1, 254, + 75, 75, 1, 243, 115, 75, 1, 243, 103, 75, 1, 243, 95, 75, 1, 248, 242, + 75, 1, 243, 33, 75, 1, 243, 88, 75, 1, 248, 100, 75, 1, 248, 217, 75, 1, + 248, 201, 75, 1, 243, 87, 75, 1, 249, 16, 75, 1, 243, 101, 75, 1, 248, + 212, 75, 1, 253, 168, 75, 1, 248, 160, 75, 1, 253, 170, 75, 1, 248, 213, + 75, 1, 248, 215, 75, 1, 253, 245, 75, 1, 255, 9, 75, 1, 241, 94, 75, 1, + 205, 248, 158, 75, 1, 248, 105, 75, 235, 91, 234, 6, 49, 1, 75, 248, 171, + 23, 102, 238, 99, 23, 102, 232, 87, 23, 102, 240, 80, 23, 102, 238, 102, + 23, 102, 232, 101, 23, 102, 240, 85, 23, 102, 240, 78, 23, 102, 240, 83, + 23, 102, 233, 79, 23, 102, 243, 34, 23, 102, 234, 32, 23, 102, 240, 75, + 23, 102, 240, 71, 23, 102, 233, 77, 23, 102, 236, 195, 23, 102, 236, 198, + 23, 102, 236, 205, 23, 102, 236, 201, 23, 102, 240, 74, 23, 102, 231, + 108, 23, 102, 233, 105, 23, 102, 231, 97, 23, 102, 232, 187, 23, 102, + 231, 56, 23, 102, 232, 108, 23, 102, 233, 106, 23, 102, 232, 85, 23, 102, + 231, 71, 23, 102, 232, 92, 23, 102, 231, 40, 23, 102, 231, 109, 23, 102, + 232, 195, 23, 102, 231, 110, 23, 102, 233, 66, 23, 102, 226, 243, 23, + 102, 226, 244, 23, 102, 227, 4, 23, 102, 229, 52, 23, 102, 227, 3, 23, + 102, 232, 106, 23, 102, 231, 75, 23, 102, 231, 52, 23, 102, 231, 51, 23, + 102, 231, 41, 23, 102, 226, 235, 23, 102, 232, 99, 23, 102, 233, 102, 23, + 102, 232, 100, 23, 102, 233, 103, 23, 102, 233, 245, 23, 102, 233, 76, + 23, 102, 226, 253, 23, 102, 231, 30, 23, 102, 233, 244, 23, 102, 233, + 101, 23, 102, 232, 55, 23, 102, 232, 56, 23, 102, 232, 58, 23, 102, 232, + 57, 23, 102, 233, 243, 23, 102, 231, 120, 23, 102, 226, 247, 23, 102, + 227, 13, 23, 102, 226, 232, 23, 102, 236, 234, 23, 102, 231, 106, 23, + 102, 231, 142, 23, 102, 232, 175, 23, 102, 232, 176, 23, 102, 233, 208, + 23, 102, 231, 68, 23, 102, 233, 78, 23, 102, 232, 174, 23, 102, 231, 66, + 23, 102, 231, 70, 23, 102, 231, 69, 23, 102, 235, 115, 23, 102, 232, 119, + 23, 102, 231, 62, 23, 102, 226, 238, 23, 102, 227, 1, 23, 102, 226, 229, + 23, 102, 227, 14, 23, 102, 231, 61, 23, 102, 227, 15, 23, 102, 226, 237, + 23, 102, 231, 50, 23, 102, 227, 9, 23, 102, 233, 104, 23, 102, 232, 102, + 23, 102, 238, 114, 23, 146, 238, 114, 23, 146, 67, 23, 146, 253, 178, 23, + 146, 216, 23, 146, 249, 18, 23, 146, 254, 59, 23, 146, 72, 23, 146, 249, + 22, 23, 146, 253, 254, 23, 146, 73, 23, 146, 253, 138, 23, 146, 249, 12, + 23, 146, 253, 193, 23, 146, 253, 162, 23, 146, 79, 23, 146, 249, 14, 23, + 146, 253, 170, 23, 146, 253, 187, 23, 146, 253, 161, 23, 146, 254, 61, + 23, 146, 253, 189, 23, 146, 71, 23, 146, 249, 229, 23, 146, 249, 230, 23, + 146, 247, 211, 23, 146, 242, 189, 23, 146, 245, 83, 23, 146, 245, 84, 23, + 146, 241, 96, 23, 146, 242, 195, 23, 146, 242, 196, 23, 146, 246, 230, + 23, 146, 252, 52, 23, 146, 246, 231, 23, 146, 252, 53, 23, 146, 252, 54, + 23, 146, 240, 255, 23, 146, 238, 233, 23, 146, 239, 251, 23, 146, 247, + 231, 23, 146, 244, 58, 23, 146, 252, 247, 23, 146, 247, 180, 23, 146, + 238, 36, 23, 146, 247, 181, 23, 146, 252, 248, 23, 146, 247, 234, 23, + 146, 242, 199, 23, 146, 247, 235, 23, 146, 238, 234, 23, 146, 241, 0, 23, + 146, 247, 236, 23, 146, 244, 60, 23, 146, 245, 86, 23, 146, 241, 99, 23, + 146, 247, 226, 23, 146, 251, 97, 23, 146, 245, 223, 23, 146, 251, 98, 23, + 146, 251, 99, 23, 146, 245, 222, 23, 146, 237, 175, 23, 146, 240, 156, + 23, 146, 235, 169, 23, 146, 237, 65, 23, 146, 237, 64, 23, 146, 233, 246, + 23, 114, 238, 99, 23, 114, 232, 87, 23, 114, 232, 91, 23, 114, 240, 80, + 23, 114, 232, 93, 23, 114, 232, 94, 23, 114, 238, 102, 23, 114, 240, 85, + 23, 114, 231, 98, 23, 114, 232, 96, 23, 114, 232, 97, 23, 114, 233, 74, + 23, 114, 231, 43, 23, 114, 231, 42, 23, 114, 232, 85, 23, 114, 240, 78, + 23, 114, 240, 83, 23, 114, 233, 66, 23, 114, 243, 34, 23, 114, 234, 32, + 23, 114, 240, 75, 23, 114, 240, 71, 23, 114, 236, 195, 23, 114, 236, 198, + 23, 114, 236, 205, 23, 114, 236, 201, 23, 114, 240, 74, 23, 114, 231, + 145, 23, 114, 226, 239, 23, 114, 231, 108, 23, 114, 231, 97, 23, 114, + 233, 90, 23, 114, 231, 47, 23, 114, 231, 74, 23, 114, 231, 56, 23, 114, + 232, 61, 23, 114, 226, 245, 23, 114, 232, 108, 23, 114, 231, 111, 23, + 114, 226, 241, 23, 114, 233, 106, 23, 114, 226, 240, 23, 114, 227, 5, 23, + 114, 226, 255, 23, 114, 226, 251, 23, 114, 226, 234, 23, 114, 229, 55, + 23, 114, 231, 54, 23, 114, 231, 76, 23, 114, 226, 246, 23, 114, 231, 147, + 23, 114, 232, 183, 23, 114, 232, 92, 23, 114, 233, 86, 23, 114, 229, 50, + 23, 114, 231, 46, 23, 114, 231, 73, 23, 114, 232, 182, 23, 114, 231, 40, + 23, 114, 232, 196, 23, 114, 231, 51, 23, 114, 232, 194, 23, 114, 231, 41, + 23, 114, 232, 99, 23, 114, 232, 100, 23, 114, 233, 103, 23, 114, 233, 76, + 23, 114, 236, 234, 23, 114, 231, 106, 23, 114, 226, 248, 23, 114, 233, + 78, 23, 114, 231, 67, 23, 114, 235, 115, 23, 114, 231, 58, 23, 114, 227, + 0, 23, 114, 231, 50, 23, 114, 227, 9, 23, 114, 232, 170, 23, 114, 232, + 172, 23, 114, 232, 169, 23, 114, 232, 171, 23, 114, 232, 102, 22, 4, 219, + 22, 4, 253, 236, 22, 4, 253, 214, 22, 4, 248, 114, 22, 4, 249, 80, 22, 4, + 253, 168, 22, 4, 253, 184, 22, 4, 251, 76, 22, 4, 253, 134, 22, 4, 254, + 8, 22, 4, 253, 251, 22, 4, 249, 101, 22, 4, 249, 102, 22, 4, 253, 250, + 22, 4, 253, 216, 22, 4, 248, 227, 22, 4, 251, 56, 22, 4, 251, 60, 22, 4, + 251, 58, 22, 4, 243, 194, 22, 4, 245, 143, 22, 4, 251, 57, 22, 4, 251, + 59, 22, 4, 245, 144, 22, 4, 222, 22, 4, 253, 154, 22, 4, 253, 180, 22, 4, + 249, 110, 22, 4, 249, 111, 22, 4, 253, 206, 22, 4, 253, 181, 22, 4, 248, + 169, 22, 4, 252, 202, 22, 4, 252, 206, 22, 4, 252, 204, 22, 4, 247, 131, + 22, 4, 247, 132, 22, 4, 252, 203, 22, 4, 252, 205, 22, 4, 247, 133, 22, + 4, 253, 130, 22, 4, 253, 185, 22, 4, 253, 209, 22, 4, 248, 182, 22, 4, + 249, 153, 22, 4, 253, 194, 22, 4, 253, 160, 22, 4, 252, 157, 22, 4, 253, + 132, 22, 4, 253, 211, 22, 4, 253, 198, 22, 4, 249, 158, 22, 4, 248, 184, + 22, 4, 253, 210, 22, 4, 253, 186, 22, 4, 248, 252, 22, 4, 248, 46, 22, 4, + 248, 248, 22, 4, 248, 185, 22, 4, 244, 7, 22, 4, 244, 9, 22, 4, 248, 118, + 22, 4, 248, 110, 22, 4, 243, 121, 22, 4, 253, 217, 22, 4, 254, 29, 22, 4, + 254, 28, 22, 4, 248, 241, 22, 4, 252, 88, 22, 4, 254, 70, 22, 4, 254, 45, + 22, 4, 252, 98, 22, 4, 252, 112, 22, 4, 252, 114, 22, 4, 247, 21, 22, 4, + 247, 22, 22, 4, 252, 113, 22, 4, 252, 89, 22, 4, 252, 93, 22, 4, 252, 91, + 22, 4, 247, 7, 22, 4, 247, 8, 22, 4, 252, 90, 22, 4, 252, 92, 22, 4, 247, + 9, 22, 4, 247, 11, 22, 4, 242, 72, 22, 4, 242, 73, 22, 4, 247, 10, 22, 4, + 253, 141, 22, 4, 253, 243, 22, 4, 254, 34, 22, 4, 249, 30, 22, 4, 248, + 197, 22, 4, 253, 242, 22, 4, 254, 1, 22, 4, 249, 36, 22, 4, 253, 171, 22, + 4, 254, 49, 22, 4, 254, 48, 22, 4, 253, 6, 22, 4, 249, 10, 22, 4, 254, + 12, 22, 4, 254, 13, 22, 4, 253, 24, 22, 4, 253, 126, 22, 4, 253, 196, 22, + 4, 253, 212, 22, 4, 249, 172, 22, 4, 248, 255, 22, 4, 253, 195, 22, 4, + 87, 22, 4, 249, 7, 22, 4, 253, 152, 22, 4, 254, 84, 22, 4, 254, 55, 22, + 4, 249, 37, 22, 4, 250, 154, 22, 4, 254, 54, 22, 4, 253, 224, 22, 4, 248, + 203, 22, 4, 253, 253, 22, 4, 255, 6, 22, 4, 253, 188, 22, 4, 253, 41, 22, + 4, 253, 42, 22, 4, 254, 132, 22, 4, 254, 133, 22, 4, 253, 47, 22, 4, 253, + 53, 22, 4, 253, 55, 22, 4, 247, 206, 22, 4, 247, 207, 22, 4, 253, 54, 22, + 4, 253, 131, 22, 4, 253, 150, 22, 4, 253, 166, 22, 4, 248, 231, 22, 4, + 249, 118, 22, 4, 253, 197, 22, 4, 253, 173, 22, 4, 248, 176, 22, 4, 248, + 78, 22, 4, 249, 125, 22, 4, 248, 178, 22, 4, 246, 198, 22, 4, 246, 200, + 22, 4, 252, 46, 22, 4, 248, 133, 22, 4, 246, 212, 22, 4, 238, 62, 67, 22, + 4, 238, 62, 79, 22, 4, 238, 62, 71, 22, 4, 238, 62, 253, 140, 22, 4, 238, + 62, 253, 164, 22, 4, 238, 62, 72, 22, 4, 238, 62, 73, 22, 4, 238, 62, + 253, 138, 22, 4, 201, 22, 4, 253, 203, 22, 4, 253, 215, 22, 4, 249, 90, + 22, 4, 251, 141, 22, 4, 253, 172, 22, 4, 253, 190, 22, 4, 251, 157, 22, + 4, 248, 221, 22, 4, 248, 223, 22, 4, 243, 65, 22, 4, 246, 25, 22, 4, 248, + 222, 22, 4, 251, 170, 22, 4, 251, 174, 22, 4, 251, 172, 22, 4, 246, 26, + 22, 4, 246, 27, 22, 4, 251, 171, 22, 4, 251, 173, 22, 4, 246, 28, 22, 4, + 246, 30, 22, 4, 241, 207, 22, 4, 241, 208, 22, 4, 246, 29, 22, 4, 253, + 138, 22, 4, 254, 14, 22, 4, 253, 187, 22, 4, 248, 190, 22, 4, 249, 199, + 22, 4, 253, 170, 22, 4, 253, 177, 22, 4, 253, 34, 22, 4, 234, 12, 67, 22, + 4, 234, 12, 79, 22, 4, 234, 12, 71, 22, 4, 234, 12, 253, 140, 22, 4, 234, + 12, 253, 164, 22, 4, 234, 12, 72, 22, 4, 234, 12, 73, 22, 4, 253, 163, + 22, 4, 254, 18, 22, 4, 254, 17, 22, 4, 249, 216, 22, 4, 248, 194, 22, 4, + 253, 228, 22, 4, 253, 222, 22, 4, 253, 117, 22, 4, 248, 99, 22, 4, 249, + 219, 22, 4, 249, 217, 22, 4, 247, 245, 22, 4, 243, 139, 22, 4, 248, 123, + 22, 4, 249, 218, 22, 4, 248, 4, 22, 4, 216, 22, 4, 253, 161, 22, 4, 253, + 189, 22, 4, 248, 191, 22, 4, 248, 192, 22, 4, 253, 254, 22, 4, 253, 162, + 22, 4, 253, 84, 22, 4, 253, 133, 22, 4, 253, 232, 22, 4, 253, 201, 22, 4, + 250, 177, 22, 4, 248, 149, 22, 4, 253, 200, 22, 4, 253, 225, 22, 4, 250, + 214, 22, 4, 248, 75, 22, 4, 249, 52, 22, 4, 249, 51, 22, 4, 245, 36, 22, + 4, 245, 41, 22, 4, 249, 50, 22, 4, 248, 204, 22, 4, 245, 57, 22, 4, 253, + 146, 22, 4, 254, 25, 22, 4, 254, 7, 22, 4, 251, 110, 22, 4, 248, 161, 22, + 4, 254, 24, 22, 4, 253, 248, 22, 4, 251, 131, 22, 4, 253, 139, 22, 4, + 253, 235, 22, 4, 254, 6, 22, 4, 248, 211, 22, 4, 249, 68, 22, 4, 254, 5, + 22, 4, 253, 234, 22, 4, 251, 25, 22, 4, 251, 36, 22, 4, 251, 38, 22, 4, + 245, 134, 22, 4, 245, 135, 22, 4, 251, 37, 22, 4, 249, 70, 22, 4, 249, + 74, 22, 4, 249, 72, 22, 4, 245, 99, 22, 4, 245, 103, 22, 4, 249, 71, 22, + 4, 249, 73, 22, 4, 241, 134, 22, 4, 248, 55, 22, 4, 249, 177, 22, 4, 248, + 121, 22, 4, 243, 76, 22, 4, 243, 77, 22, 4, 248, 111, 22, 4, 248, 97, 22, + 4, 247, 147, 22, 4, 248, 57, 22, 4, 248, 200, 22, 4, 248, 67, 22, 4, 244, + 252, 22, 4, 243, 54, 22, 4, 248, 88, 22, 4, 248, 125, 22, 4, 245, 13, 22, + 4, 248, 65, 22, 4, 252, 64, 22, 4, 248, 68, 22, 4, 246, 243, 22, 4, 246, + 245, 22, 4, 249, 136, 22, 4, 248, 238, 22, 4, 246, 247, 22, 4, 248, 90, + 22, 4, 249, 5, 22, 4, 248, 140, 22, 4, 247, 160, 22, 4, 244, 39, 22, 4, + 248, 112, 22, 4, 249, 4, 22, 4, 247, 162, 22, 4, 252, 242, 22, 4, 252, + 246, 22, 4, 252, 244, 22, 4, 247, 177, 22, 4, 247, 178, 22, 4, 252, 243, + 22, 4, 252, 245, 22, 4, 247, 179, 22, 4, 253, 179, 22, 4, 254, 93, 22, 4, + 253, 245, 22, 4, 249, 60, 22, 4, 249, 61, 22, 4, 254, 62, 22, 4, 254, 63, + 22, 4, 249, 66, 22, 4, 253, 129, 22, 4, 253, 239, 22, 4, 253, 147, 22, 4, + 249, 133, 22, 4, 248, 180, 22, 4, 253, 175, 22, 4, 253, 208, 22, 4, 248, + 181, 22, 4, 252, 158, 22, 4, 251, 248, 22, 4, 251, 1, 22, 50, 234, 194, + 69, 22, 238, 213, 69, 22, 235, 42, 22, 248, 37, 208, 22, 240, 27, 22, + 234, 14, 22, 240, 24, 22, 239, 166, 240, 24, 22, 236, 156, 69, 22, 235, + 91, 234, 6, 22, 26, 127, 22, 26, 111, 22, 26, 166, 22, 26, 177, 22, 26, + 176, 22, 26, 187, 22, 26, 203, 22, 26, 195, 22, 26, 202, 22, 61, 248, 53, + 22, 61, 238, 77, 22, 61, 238, 101, 22, 61, 240, 136, 22, 61, 240, 50, 22, + 61, 240, 234, 22, 61, 237, 38, 22, 61, 238, 182, 22, 61, 238, 147, 22, + 61, 236, 149, 22, 61, 253, 219, 235, 49, 22, 4, 235, 94, 248, 169, 22, 4, + 248, 230, 22, 4, 246, 101, 22, 4, 248, 229, 22, 4, 235, 94, 249, 36, 22, + 4, 250, 136, 22, 4, 244, 237, 22, 4, 250, 135, 22, 4, 235, 94, 249, 66, + 22, 4, 251, 0, 22, 4, 245, 95, 22, 4, 250, 255, 22, 4, 235, 94, 248, 181, + 22, 4, 248, 240, 22, 4, 247, 2, 22, 4, 248, 239, 22, 243, 10, 158, 242, + 198, 22, 243, 10, 158, 241, 83, 22, 243, 10, 158, 238, 212, 22, 243, 10, + 158, 242, 215, 238, 212, 22, 243, 10, 158, 241, 84, 22, 243, 10, 158, + 241, 199, 22, 243, 10, 158, 239, 24, 22, 243, 10, 158, 241, 149, 22, 243, + 10, 158, 232, 130, 22, 243, 10, 158, 246, 22, 109, 1, 67, 109, 1, 72, + 109, 1, 71, 109, 1, 73, 109, 1, 79, 109, 1, 179, 109, 1, 253, 139, 109, + 1, 201, 109, 1, 254, 5, 109, 1, 254, 6, 109, 1, 253, 234, 109, 1, 253, + 235, 109, 1, 254, 169, 109, 1, 219, 109, 1, 253, 168, 109, 1, 253, 214, + 109, 1, 253, 184, 109, 1, 253, 236, 109, 1, 254, 98, 109, 1, 253, 134, + 109, 1, 253, 250, 109, 1, 253, 251, 109, 1, 253, 216, 109, 1, 254, 8, + 109, 1, 254, 196, 109, 1, 222, 109, 1, 253, 206, 109, 1, 253, 180, 109, + 1, 253, 181, 109, 1, 253, 154, 109, 1, 253, 131, 109, 1, 249, 83, 109, 1, + 251, 253, 109, 1, 253, 197, 109, 1, 253, 166, 109, 1, 253, 173, 109, 1, + 253, 150, 109, 1, 254, 115, 109, 1, 252, 103, 109, 1, 252, 104, 109, 1, + 252, 105, 109, 1, 249, 149, 109, 1, 249, 150, 109, 1, 252, 110, 109, 1, + 253, 132, 109, 1, 193, 109, 1, 253, 210, 109, 1, 253, 198, 109, 1, 253, + 186, 109, 1, 253, 211, 109, 1, 254, 127, 109, 1, 253, 133, 109, 1, 253, + 126, 109, 1, 253, 200, 109, 1, 253, 195, 109, 1, 253, 201, 109, 1, 253, + 212, 109, 1, 253, 225, 109, 1, 253, 232, 109, 1, 254, 158, 109, 1, 249, + 55, 109, 1, 249, 179, 109, 1, 249, 180, 109, 1, 249, 181, 109, 1, 249, + 182, 109, 1, 249, 183, 109, 1, 252, 225, 109, 1, 248, 90, 109, 1, 248, + 112, 109, 1, 248, 140, 109, 1, 249, 4, 109, 1, 249, 5, 109, 1, 252, 230, + 109, 1, 253, 138, 109, 1, 253, 170, 109, 1, 253, 187, 109, 1, 253, 177, + 109, 1, 254, 14, 109, 1, 255, 4, 109, 1, 216, 109, 1, 253, 254, 109, 1, + 253, 189, 109, 1, 253, 162, 109, 1, 253, 161, 109, 1, 255, 10, 14, 15, + 72, 14, 15, 249, 231, 14, 15, 71, 14, 15, 253, 142, 14, 15, 73, 14, 15, + 253, 156, 14, 15, 240, 44, 253, 156, 14, 15, 55, 253, 164, 14, 15, 55, + 71, 14, 15, 67, 14, 15, 253, 140, 14, 15, 253, 170, 14, 15, 106, 253, + 170, 14, 15, 253, 187, 14, 15, 106, 253, 187, 14, 15, 249, 200, 14, 15, + 106, 249, 200, 14, 15, 253, 177, 14, 15, 106, 253, 177, 14, 15, 249, 15, + 14, 15, 106, 249, 15, 14, 15, 238, 66, 249, 15, 14, 15, 253, 138, 14, 15, + 106, 253, 138, 14, 15, 248, 190, 14, 15, 106, 248, 190, 14, 15, 238, 66, + 248, 190, 14, 15, 253, 149, 14, 15, 240, 44, 255, 16, 14, 15, 238, 62, + 208, 14, 15, 30, 135, 14, 15, 30, 191, 14, 15, 30, 240, 17, 137, 242, + 233, 14, 15, 30, 253, 159, 137, 242, 233, 14, 15, 30, 38, 137, 242, 233, + 14, 15, 30, 242, 233, 14, 15, 30, 45, 135, 14, 15, 30, 45, 242, 215, 59, + 237, 45, 14, 15, 30, 240, 1, 248, 40, 14, 15, 30, 242, 215, 163, 108, 14, + 15, 30, 243, 12, 14, 15, 30, 92, 242, 234, 14, 15, 253, 202, 14, 15, 253, + 247, 14, 15, 254, 9, 14, 15, 254, 19, 14, 15, 253, 175, 14, 15, 246, 236, + 14, 15, 253, 147, 14, 15, 249, 138, 14, 15, 253, 208, 14, 15, 249, 140, + 14, 15, 240, 44, 249, 140, 14, 15, 55, 249, 80, 14, 15, 55, 253, 214, 14, + 15, 253, 129, 14, 15, 249, 133, 14, 15, 248, 239, 14, 15, 106, 248, 239, + 14, 15, 248, 240, 14, 15, 106, 248, 240, 14, 15, 243, 247, 14, 15, 106, + 243, 247, 14, 15, 249, 143, 14, 15, 106, 249, 143, 14, 15, 243, 248, 14, + 15, 106, 243, 248, 14, 15, 248, 181, 14, 15, 106, 248, 181, 14, 15, 243, + 118, 14, 15, 106, 243, 118, 14, 15, 240, 44, 243, 118, 14, 15, 223, 14, + 15, 106, 223, 14, 15, 55, 192, 14, 15, 253, 195, 14, 15, 247, 135, 14, + 15, 253, 212, 14, 15, 252, 221, 14, 15, 87, 14, 15, 249, 2, 14, 15, 240, + 44, 249, 2, 14, 15, 55, 248, 149, 14, 15, 55, 253, 201, 14, 15, 253, 126, + 14, 15, 249, 172, 14, 15, 249, 8, 14, 15, 106, 249, 8, 14, 15, 249, 189, + 14, 15, 106, 249, 189, 14, 15, 244, 42, 14, 15, 106, 244, 42, 14, 15, + 111, 14, 15, 106, 111, 14, 15, 244, 43, 14, 15, 106, 244, 43, 14, 15, + 249, 7, 14, 15, 106, 249, 7, 14, 15, 243, 132, 14, 15, 106, 243, 132, 14, + 15, 238, 66, 243, 132, 14, 15, 214, 14, 15, 249, 186, 14, 15, 249, 187, + 14, 15, 249, 6, 14, 15, 248, 71, 14, 15, 253, 172, 14, 15, 246, 4, 14, + 15, 253, 215, 14, 15, 251, 150, 14, 15, 253, 190, 14, 15, 249, 98, 14, + 15, 240, 44, 249, 98, 14, 15, 201, 14, 15, 249, 90, 14, 15, 248, 222, 14, + 15, 106, 248, 222, 14, 15, 248, 223, 14, 15, 106, 248, 223, 14, 15, 243, + 211, 14, 15, 106, 243, 211, 14, 15, 249, 100, 14, 15, 106, 249, 100, 14, + 15, 243, 212, 14, 15, 106, 243, 212, 14, 15, 248, 221, 14, 15, 106, 248, + 221, 14, 15, 243, 65, 14, 15, 106, 243, 65, 14, 15, 238, 66, 243, 65, 14, + 15, 255, 15, 14, 15, 254, 108, 14, 15, 232, 86, 248, 218, 14, 15, 232, + 86, 251, 149, 14, 15, 232, 86, 251, 158, 14, 15, 232, 86, 251, 136, 14, + 15, 254, 54, 14, 15, 244, 239, 14, 15, 254, 55, 14, 15, 250, 162, 14, 15, + 253, 224, 14, 15, 249, 42, 14, 15, 240, 44, 249, 42, 14, 15, 253, 152, + 14, 15, 249, 37, 14, 15, 249, 44, 14, 15, 106, 249, 44, 14, 15, 249, 45, + 14, 15, 106, 249, 45, 14, 15, 243, 159, 14, 15, 106, 243, 159, 14, 15, + 249, 46, 14, 15, 106, 249, 46, 14, 15, 243, 160, 14, 15, 106, 243, 160, + 14, 15, 248, 203, 14, 15, 106, 248, 203, 14, 15, 243, 91, 14, 15, 106, + 243, 91, 14, 15, 238, 66, 243, 91, 14, 15, 255, 18, 14, 15, 240, 36, 254, + 46, 14, 15, 253, 206, 14, 15, 246, 61, 14, 15, 253, 180, 14, 15, 251, + 232, 14, 15, 253, 181, 14, 15, 249, 112, 14, 15, 240, 44, 249, 112, 14, + 15, 222, 14, 15, 249, 110, 14, 15, 248, 229, 14, 15, 106, 248, 229, 14, + 15, 248, 230, 14, 15, 106, 248, 230, 14, 15, 243, 228, 14, 15, 106, 243, + 228, 14, 15, 249, 117, 14, 15, 106, 249, 117, 14, 15, 243, 229, 14, 15, + 106, 243, 229, 14, 15, 248, 169, 14, 15, 106, 248, 169, 14, 15, 243, 109, + 14, 15, 106, 243, 109, 14, 15, 238, 66, 243, 109, 14, 15, 173, 14, 15, + 106, 173, 14, 15, 254, 203, 14, 15, 234, 47, 173, 14, 15, 240, 36, 173, + 14, 15, 253, 197, 14, 15, 246, 102, 14, 15, 253, 166, 14, 15, 252, 22, + 14, 15, 253, 173, 14, 15, 249, 121, 14, 15, 240, 44, 249, 121, 14, 15, + 253, 131, 14, 15, 248, 231, 14, 15, 249, 124, 14, 15, 106, 249, 124, 14, + 15, 248, 176, 14, 15, 106, 248, 176, 14, 15, 243, 110, 14, 15, 106, 243, + 110, 14, 15, 238, 66, 243, 110, 14, 15, 197, 14, 15, 55, 254, 26, 14, 15, + 254, 214, 14, 15, 253, 250, 14, 15, 246, 33, 14, 15, 253, 251, 14, 15, + 251, 196, 14, 15, 253, 216, 14, 15, 248, 226, 14, 15, 240, 44, 248, 226, + 14, 15, 253, 134, 14, 15, 249, 101, 14, 15, 249, 106, 14, 15, 106, 249, + 106, 14, 15, 249, 107, 14, 15, 106, 249, 107, 14, 15, 243, 220, 14, 15, + 106, 243, 220, 14, 15, 249, 108, 14, 15, 106, 249, 108, 14, 15, 243, 221, + 14, 15, 106, 243, 221, 14, 15, 248, 227, 14, 15, 106, 248, 227, 14, 15, + 243, 219, 14, 15, 106, 243, 219, 14, 15, 162, 14, 15, 106, 162, 14, 15, + 113, 162, 14, 15, 253, 210, 14, 15, 247, 60, 14, 15, 253, 198, 14, 15, + 252, 177, 14, 15, 253, 186, 14, 15, 249, 166, 14, 15, 240, 44, 249, 166, + 14, 15, 253, 132, 14, 15, 249, 158, 14, 15, 249, 169, 14, 15, 106, 249, + 169, 14, 15, 249, 170, 14, 15, 106, 249, 170, 14, 15, 244, 26, 14, 15, + 106, 244, 26, 14, 15, 249, 171, 14, 15, 106, 249, 171, 14, 15, 244, 27, + 14, 15, 106, 244, 27, 14, 15, 248, 252, 14, 15, 106, 248, 252, 14, 15, + 243, 125, 14, 15, 106, 243, 125, 14, 15, 238, 66, 243, 125, 14, 15, 193, + 14, 15, 234, 47, 193, 14, 15, 254, 128, 14, 15, 235, 57, 193, 14, 15, + 234, 225, 254, 238, 14, 15, 238, 66, 252, 181, 14, 15, 238, 66, 252, 164, + 14, 15, 238, 66, 247, 98, 14, 15, 238, 66, 247, 124, 14, 15, 238, 66, + 247, 93, 14, 15, 238, 66, 247, 66, 14, 15, 248, 118, 14, 15, 248, 185, + 14, 15, 247, 73, 14, 15, 248, 110, 14, 15, 247, 76, 14, 15, 248, 46, 14, + 15, 244, 7, 14, 15, 244, 16, 14, 15, 106, 244, 16, 14, 15, 244, 17, 14, + 15, 106, 244, 17, 14, 15, 240, 230, 14, 15, 106, 240, 230, 14, 15, 244, + 18, 14, 15, 106, 244, 18, 14, 15, 240, 231, 14, 15, 106, 240, 231, 14, + 15, 243, 121, 14, 15, 106, 243, 121, 14, 15, 240, 229, 14, 15, 106, 240, + 229, 14, 15, 254, 72, 14, 15, 253, 254, 14, 15, 247, 212, 14, 15, 253, + 189, 14, 15, 253, 81, 14, 15, 253, 162, 14, 15, 249, 210, 14, 15, 240, + 44, 249, 210, 14, 15, 216, 14, 15, 248, 191, 14, 15, 249, 213, 14, 15, + 106, 249, 213, 14, 15, 249, 214, 14, 15, 106, 249, 214, 14, 15, 244, 61, + 14, 15, 106, 244, 61, 14, 15, 249, 215, 14, 15, 106, 249, 215, 14, 15, + 244, 62, 14, 15, 106, 244, 62, 14, 15, 249, 212, 14, 15, 106, 249, 212, + 14, 15, 243, 137, 14, 15, 106, 243, 137, 14, 15, 238, 66, 243, 137, 14, + 15, 255, 14, 14, 15, 234, 98, 255, 14, 14, 15, 106, 255, 14, 14, 15, 240, + 36, 253, 189, 14, 15, 253, 194, 14, 15, 242, 74, 253, 194, 14, 15, 106, + 253, 250, 14, 15, 247, 26, 14, 15, 253, 209, 14, 15, 252, 137, 14, 15, + 253, 160, 14, 15, 252, 143, 14, 15, 106, 253, 216, 14, 15, 253, 130, 14, + 15, 248, 182, 14, 15, 106, 253, 134, 14, 15, 244, 2, 14, 15, 106, 244, 2, + 14, 15, 144, 14, 15, 106, 144, 14, 15, 113, 144, 14, 15, 254, 62, 14, 15, + 245, 88, 14, 15, 253, 245, 14, 15, 250, 243, 14, 15, 254, 63, 14, 15, + 250, 249, 14, 15, 253, 179, 14, 15, 249, 60, 14, 15, 243, 177, 14, 15, + 106, 243, 177, 14, 15, 255, 19, 14, 15, 248, 111, 14, 15, 240, 141, 248, + 111, 14, 15, 248, 121, 14, 15, 240, 141, 248, 121, 14, 15, 243, 128, 14, + 15, 240, 141, 243, 128, 14, 15, 248, 97, 14, 15, 244, 30, 14, 15, 248, + 55, 14, 15, 243, 76, 14, 15, 240, 244, 14, 15, 106, 240, 244, 14, 15, + 254, 46, 14, 15, 247, 166, 14, 15, 247, 167, 14, 15, 243, 131, 14, 15, + 242, 247, 14, 15, 252, 231, 14, 15, 252, 239, 14, 15, 252, 240, 14, 15, + 252, 241, 14, 15, 252, 238, 14, 15, 238, 86, 253, 168, 14, 15, 238, 86, + 253, 214, 14, 15, 238, 86, 251, 61, 14, 15, 238, 86, 253, 184, 14, 15, + 238, 86, 251, 78, 14, 15, 238, 86, 219, 14, 15, 238, 86, 248, 114, 14, + 15, 238, 86, 192, 14, 15, 239, 148, 192, 14, 15, 254, 172, 14, 15, 247, + 5, 14, 15, 254, 28, 14, 15, 249, 147, 14, 15, 254, 45, 14, 15, 252, 100, + 14, 15, 253, 217, 14, 15, 248, 241, 14, 15, 255, 20, 14, 15, 244, 34, 14, + 15, 244, 35, 14, 15, 244, 36, 14, 15, 244, 33, 14, 15, 106, 253, 194, 14, + 15, 106, 253, 209, 14, 15, 106, 253, 160, 14, 15, 106, 253, 130, 14, 15, + 242, 5, 14, 15, 248, 232, 14, 15, 246, 147, 14, 15, 248, 172, 14, 15, + 246, 149, 14, 15, 248, 50, 14, 15, 246, 139, 14, 15, 254, 26, 14, 15, + 252, 30, 14, 15, 240, 36, 248, 118, 14, 15, 240, 36, 248, 185, 14, 15, + 240, 36, 248, 110, 14, 15, 240, 36, 248, 46, 14, 15, 234, 24, 248, 111, + 14, 15, 234, 24, 248, 121, 14, 15, 234, 24, 248, 97, 14, 15, 234, 24, + 248, 55, 14, 15, 234, 24, 254, 46, 14, 15, 249, 103, 14, 15, 246, 46, 14, + 15, 249, 104, 14, 15, 246, 47, 14, 15, 248, 225, 14, 15, 246, 44, 14, 15, + 254, 193, 14, 15, 238, 88, 248, 111, 14, 15, 238, 88, 248, 121, 14, 15, + 238, 88, 243, 128, 14, 15, 238, 88, 248, 97, 14, 15, 238, 88, 244, 30, + 14, 15, 238, 88, 248, 55, 14, 15, 238, 88, 243, 76, 14, 15, 238, 88, 254, + 46, 14, 15, 238, 241, 217, 14, 15, 235, 57, 72, 14, 15, 235, 57, 71, 14, + 15, 235, 57, 73, 14, 15, 235, 57, 67, 14, 15, 235, 57, 253, 170, 14, 15, + 235, 57, 253, 187, 14, 15, 235, 57, 253, 177, 14, 15, 235, 57, 253, 138, + 14, 15, 235, 57, 253, 197, 14, 15, 235, 57, 253, 166, 14, 15, 235, 57, + 253, 173, 14, 15, 235, 57, 253, 131, 14, 15, 235, 57, 253, 172, 14, 15, + 235, 57, 253, 215, 14, 15, 235, 57, 253, 190, 14, 15, 235, 57, 201, 14, + 15, 240, 36, 253, 168, 14, 15, 240, 36, 253, 214, 14, 15, 240, 36, 253, + 184, 14, 15, 240, 36, 219, 14, 15, 55, 251, 19, 14, 15, 55, 249, 75, 14, + 15, 55, 248, 127, 14, 15, 55, 245, 119, 14, 15, 55, 251, 18, 14, 15, 55, + 248, 77, 14, 15, 55, 253, 185, 14, 15, 55, 253, 160, 14, 15, 55, 253, + 194, 14, 15, 55, 249, 153, 14, 15, 55, 253, 209, 14, 15, 55, 253, 130, + 14, 15, 55, 254, 14, 14, 15, 55, 253, 177, 14, 15, 55, 253, 170, 14, 15, + 55, 249, 199, 14, 15, 55, 253, 187, 14, 15, 55, 253, 138, 14, 15, 55, + 251, 88, 14, 15, 55, 251, 87, 14, 15, 55, 251, 85, 14, 15, 55, 245, 208, + 14, 15, 55, 251, 86, 14, 15, 55, 251, 84, 14, 15, 55, 249, 177, 14, 15, + 55, 248, 97, 14, 15, 55, 248, 111, 14, 15, 55, 243, 77, 14, 15, 55, 248, + 121, 14, 15, 55, 248, 55, 14, 15, 55, 252, 232, 14, 15, 55, 249, 6, 14, + 15, 55, 249, 186, 14, 15, 55, 247, 164, 14, 15, 55, 249, 187, 14, 15, 55, + 248, 71, 14, 15, 55, 253, 239, 14, 15, 55, 253, 208, 14, 15, 55, 253, + 175, 14, 15, 55, 248, 180, 14, 15, 55, 253, 147, 14, 15, 55, 253, 129, + 14, 15, 55, 223, 14, 15, 55, 253, 235, 14, 15, 55, 253, 234, 14, 15, 55, + 254, 5, 14, 15, 55, 249, 68, 14, 15, 55, 254, 6, 14, 15, 55, 253, 139, + 14, 15, 55, 251, 146, 14, 15, 55, 248, 220, 14, 15, 55, 249, 94, 14, 15, + 55, 246, 11, 14, 15, 55, 248, 219, 14, 15, 55, 248, 61, 14, 15, 55, 251, + 156, 14, 15, 55, 251, 155, 14, 15, 55, 251, 153, 14, 15, 55, 246, 17, 14, + 15, 55, 251, 154, 14, 15, 55, 249, 97, 14, 15, 55, 254, 107, 14, 15, 55, + 253, 150, 14, 15, 55, 253, 173, 14, 15, 55, 253, 197, 14, 15, 55, 249, + 118, 14, 15, 55, 253, 166, 14, 15, 55, 253, 131, 14, 15, 55, 253, 154, + 14, 15, 55, 253, 181, 14, 15, 55, 253, 206, 14, 15, 55, 249, 111, 14, 15, + 55, 253, 180, 14, 15, 55, 222, 14, 15, 55, 253, 161, 14, 15, 55, 253, + 162, 14, 15, 55, 253, 254, 14, 15, 55, 248, 192, 14, 15, 55, 253, 189, + 14, 15, 55, 216, 14, 15, 55, 254, 25, 14, 15, 240, 36, 254, 25, 14, 15, + 55, 253, 248, 14, 15, 55, 254, 24, 14, 15, 55, 248, 161, 14, 15, 55, 254, + 7, 14, 15, 240, 36, 254, 7, 14, 15, 55, 253, 146, 14, 15, 55, 249, 88, + 14, 15, 55, 249, 87, 14, 15, 55, 251, 121, 14, 15, 55, 245, 238, 14, 15, + 55, 249, 86, 14, 15, 55, 251, 120, 14, 15, 55, 254, 8, 14, 15, 55, 253, + 216, 14, 15, 55, 253, 250, 14, 15, 55, 249, 102, 14, 15, 55, 253, 251, + 14, 15, 55, 253, 134, 14, 15, 55, 250, 201, 14, 15, 55, 250, 200, 14, 15, + 55, 250, 198, 14, 15, 55, 245, 70, 14, 15, 55, 250, 199, 14, 15, 55, 249, + 55, 14, 15, 55, 251, 194, 14, 15, 55, 249, 104, 14, 15, 55, 251, 193, 14, + 15, 55, 246, 45, 14, 15, 55, 249, 103, 14, 15, 55, 248, 225, 14, 15, 55, + 247, 155, 14, 15, 55, 244, 36, 14, 15, 55, 244, 34, 14, 15, 55, 242, 155, + 14, 15, 55, 244, 35, 14, 15, 55, 244, 33, 14, 15, 55, 249, 183, 14, 15, + 55, 249, 182, 14, 15, 55, 249, 180, 14, 15, 55, 247, 154, 14, 15, 55, + 249, 181, 14, 15, 55, 249, 179, 14, 15, 55, 254, 18, 14, 15, 55, 253, + 222, 14, 15, 55, 253, 228, 14, 15, 55, 248, 194, 14, 15, 55, 254, 17, 14, + 15, 55, 253, 163, 14, 15, 55, 255, 17, 14, 15, 55, 54, 255, 17, 14, 15, + 55, 250, 220, 14, 15, 55, 250, 219, 14, 15, 55, 248, 126, 14, 15, 55, + 245, 78, 14, 15, 55, 250, 218, 14, 15, 55, 248, 153, 14, 15, 55, 253, + 211, 14, 15, 55, 253, 186, 14, 15, 55, 253, 210, 14, 15, 55, 248, 184, + 14, 15, 55, 253, 198, 14, 15, 55, 253, 132, 14, 15, 55, 248, 248, 14, 15, + 55, 248, 110, 14, 15, 55, 248, 118, 14, 15, 55, 244, 9, 14, 15, 55, 248, + 185, 14, 15, 55, 248, 46, 14, 15, 55, 254, 72, 14, 15, 55, 249, 5, 14, + 15, 55, 249, 4, 14, 15, 55, 248, 112, 14, 15, 55, 244, 39, 14, 15, 55, + 248, 140, 14, 15, 55, 248, 90, 14, 15, 55, 248, 200, 14, 15, 55, 248, + 125, 14, 15, 55, 248, 88, 14, 15, 55, 243, 54, 14, 15, 55, 248, 67, 14, + 15, 55, 248, 57, 14, 15, 55, 247, 172, 14, 15, 55, 247, 171, 14, 15, 55, + 247, 169, 14, 15, 55, 242, 160, 14, 15, 55, 247, 170, 14, 15, 55, 247, + 168, 14, 15, 254, 83, 52, 14, 15, 248, 37, 208, 14, 15, 249, 146, 14, 15, + 246, 140, 14, 15, 246, 173, 14, 15, 242, 20, 14, 15, 246, 174, 14, 15, + 242, 21, 14, 15, 246, 172, 14, 15, 242, 19, 242, 221, 247, 96, 69, 242, + 221, 1, 241, 29, 242, 221, 1, 246, 55, 242, 221, 1, 241, 104, 242, 221, + 1, 247, 62, 242, 221, 1, 246, 156, 242, 221, 1, 247, 182, 242, 221, 1, + 245, 33, 242, 221, 1, 242, 153, 242, 221, 1, 245, 26, 242, 221, 1, 241, + 48, 242, 221, 1, 246, 94, 242, 221, 1, 245, 126, 242, 221, 1, 237, 220, + 242, 221, 1, 239, 205, 242, 221, 1, 247, 52, 242, 221, 1, 244, 72, 242, + 221, 1, 249, 130, 242, 221, 1, 254, 253, 242, 221, 1, 237, 144, 242, 221, + 1, 237, 182, 242, 221, 1, 237, 143, 242, 221, 1, 253, 227, 242, 221, 1, + 236, 134, 242, 221, 1, 245, 225, 242, 221, 1, 232, 163, 242, 221, 1, 242, + 54, 242, 221, 238, 184, 69, 242, 221, 224, 238, 184, 69, 119, 1, 250, + 238, 250, 240, 255, 74, 255, 19, 119, 1, 179, 119, 1, 253, 4, 255, 95, + 79, 119, 1, 254, 135, 119, 1, 255, 14, 119, 1, 255, 16, 119, 1, 238, 28, + 247, 146, 240, 149, 119, 1, 248, 109, 119, 1, 244, 82, 67, 119, 1, 255, + 86, 73, 119, 1, 255, 67, 67, 119, 1, 244, 69, 119, 1, 231, 23, 73, 119, + 1, 231, 77, 73, 119, 1, 73, 119, 1, 253, 193, 119, 1, 254, 9, 119, 1, + 247, 27, 254, 71, 252, 132, 144, 119, 1, 241, 195, 119, 1, 250, 155, 119, + 1, 251, 139, 255, 15, 119, 1, 210, 119, 1, 248, 108, 119, 1, 251, 13, + 251, 41, 210, 119, 1, 251, 9, 119, 1, 247, 198, 253, 40, 255, 16, 119, 1, + 241, 145, 192, 119, 1, 245, 138, 192, 119, 1, 226, 249, 192, 119, 1, 227, + 6, 192, 119, 1, 241, 253, 254, 218, 252, 0, 197, 119, 1, 231, 29, 197, + 119, 1, 236, 7, 119, 1, 251, 108, 255, 77, 254, 178, 71, 119, 1, 72, 119, + 1, 245, 234, 221, 119, 1, 251, 14, 119, 1, 231, 72, 253, 178, 119, 1, + 232, 54, 67, 119, 1, 251, 109, 250, 226, 119, 1, 242, 57, 242, 56, 223, + 119, 1, 244, 76, 241, 97, 119, 1, 242, 122, 193, 119, 1, 247, 89, 231, + 24, 193, 119, 1, 231, 78, 193, 119, 1, 255, 18, 119, 1, 255, 17, 119, 1, + 247, 153, 254, 249, 254, 251, 214, 119, 1, 231, 79, 214, 119, 1, 209, + 119, 1, 237, 76, 244, 218, 239, 10, 217, 119, 1, 226, 252, 217, 119, 1, + 236, 8, 119, 1, 239, 152, 119, 1, 245, 80, 255, 72, 72, 119, 1, 241, 227, + 254, 111, 173, 119, 1, 229, 49, 173, 119, 1, 231, 28, 173, 119, 1, 241, + 213, 251, 181, 251, 204, 162, 119, 1, 236, 6, 119, 1, 239, 98, 119, 1, + 251, 104, 119, 1, 245, 31, 250, 179, 209, 119, 1, 239, 155, 245, 85, 73, + 119, 1, 248, 206, 119, 1, 251, 106, 119, 1, 237, 98, 119, 1, 244, 240, + 119, 1, 241, 47, 119, 1, 247, 120, 119, 1, 231, 25, 119, 1, 231, 80, 119, + 1, 231, 141, 119, 1, 255, 20, 119, 1, 206, 119, 240, 12, 232, 75, 119, + 237, 215, 232, 75, 119, 243, 38, 232, 75, 119, 241, 16, 91, 119, 238, 34, + 91, 119, 237, 75, 91, 238, 63, 1, 67, 238, 63, 1, 71, 238, 63, 1, 79, + 238, 63, 1, 201, 238, 63, 1, 253, 139, 238, 63, 1, 248, 50, 238, 63, 1, + 253, 126, 238, 63, 1, 253, 133, 238, 63, 1, 253, 131, 238, 63, 1, 253, + 129, 238, 63, 1, 253, 141, 238, 63, 1, 222, 238, 63, 1, 216, 238, 63, 1, + 253, 134, 238, 63, 1, 253, 138, 238, 63, 1, 253, 132, 238, 63, 1, 219, + 238, 63, 33, 21, 71, 238, 63, 33, 21, 79, 238, 63, 21, 238, 72, 238, 60, + 1, 67, 238, 60, 1, 71, 238, 60, 1, 79, 238, 60, 1, 201, 238, 60, 1, 253, + 139, 238, 60, 1, 248, 50, 238, 60, 1, 253, 126, 238, 60, 1, 253, 133, + 238, 60, 1, 253, 131, 238, 60, 1, 253, 129, 238, 60, 1, 253, 141, 238, + 60, 1, 222, 238, 60, 1, 216, 238, 60, 1, 253, 130, 238, 60, 1, 253, 134, + 238, 60, 1, 253, 138, 238, 60, 1, 253, 132, 238, 60, 1, 219, 238, 60, 33, + 21, 71, 238, 60, 33, 21, 79, 238, 60, 21, 236, 70, 234, 63, 240, 12, 232, + 75, 234, 63, 45, 232, 75, 242, 231, 1, 67, 242, 231, 1, 71, 242, 231, 1, + 79, 242, 231, 1, 201, 242, 231, 1, 253, 139, 242, 231, 1, 248, 50, 242, + 231, 1, 253, 126, 242, 231, 1, 253, 133, 242, 231, 1, 253, 131, 242, 231, + 1, 253, 129, 242, 231, 1, 253, 141, 242, 231, 1, 222, 242, 231, 1, 216, + 242, 231, 1, 253, 130, 242, 231, 1, 253, 134, 242, 231, 1, 253, 138, 242, + 231, 1, 253, 132, 242, 231, 1, 219, 242, 231, 33, 21, 71, 242, 231, 33, + 21, 79, 236, 157, 1, 67, 236, 157, 1, 71, 236, 157, 1, 79, 236, 157, 1, + 201, 236, 157, 1, 253, 139, 236, 157, 1, 248, 50, 236, 157, 1, 253, 126, + 236, 157, 1, 253, 133, 236, 157, 1, 253, 131, 236, 157, 1, 253, 129, 236, + 157, 1, 253, 141, 236, 157, 1, 222, 236, 157, 1, 216, 236, 157, 1, 253, + 134, 236, 157, 1, 253, 138, 236, 157, 1, 253, 132, 236, 157, 33, 21, 71, + 236, 157, 33, 21, 79, 63, 1, 201, 63, 1, 248, 61, 63, 1, 253, 190, 63, 1, + 248, 220, 63, 1, 248, 172, 63, 1, 253, 152, 63, 1, 248, 57, 63, 1, 253, + 224, 63, 1, 248, 125, 63, 1, 248, 133, 63, 1, 253, 133, 63, 1, 242, 247, + 63, 1, 253, 225, 63, 1, 243, 131, 63, 1, 252, 31, 63, 1, 253, 126, 63, 1, + 248, 55, 63, 1, 87, 63, 1, 248, 97, 63, 1, 253, 173, 63, 1, 253, 141, 63, + 1, 248, 65, 63, 1, 253, 208, 63, 1, 248, 238, 63, 1, 253, 181, 63, 1, + 253, 162, 63, 1, 253, 160, 63, 1, 253, 216, 63, 1, 254, 13, 63, 1, 248, + 46, 63, 1, 248, 250, 63, 1, 253, 132, 63, 1, 219, 63, 1, 253, 134, 63, 1, + 253, 217, 63, 233, 52, 33, 252, 86, 63, 233, 52, 33, 248, 241, 63, 233, + 52, 33, 254, 28, 63, 233, 52, 33, 249, 147, 63, 233, 52, 33, 254, 29, 63, + 233, 52, 33, 252, 106, 63, 233, 52, 33, 249, 150, 63, 233, 52, 33, 247, + 20, 63, 233, 52, 33, 254, 125, 63, 233, 52, 33, 252, 163, 63, 233, 52, + 33, 254, 110, 63, 233, 52, 33, 251, 217, 63, 233, 52, 33, 254, 70, 63, + 233, 52, 33, 249, 146, 63, 233, 52, 33, 254, 123, 249, 9, 127, 63, 233, + 52, 33, 254, 123, 249, 9, 111, 63, 233, 52, 33, 252, 87, 63, 33, 237, 13, + 254, 142, 63, 33, 237, 13, 253, 140, 63, 33, 21, 253, 140, 63, 33, 21, + 71, 63, 33, 21, 253, 142, 63, 33, 21, 255, 14, 63, 33, 21, 254, 77, 63, + 33, 21, 79, 63, 33, 21, 253, 148, 63, 33, 21, 254, 74, 63, 33, 21, 253, + 193, 63, 33, 21, 216, 63, 33, 21, 253, 237, 63, 33, 21, 72, 63, 33, 21, + 253, 178, 63, 33, 21, 253, 149, 63, 33, 21, 253, 156, 63, 33, 21, 253, + 151, 63, 21, 237, 221, 63, 21, 237, 248, 63, 21, 231, 84, 63, 21, 232, + 184, 63, 21, 238, 32, 63, 21, 239, 3, 63, 21, 242, 86, 63, 21, 233, 43, + 63, 21, 237, 186, 63, 21, 241, 7, 63, 21, 242, 96, 239, 179, 63, 21, 239, + 243, 63, 21, 241, 62, 63, 21, 233, 121, 63, 21, 246, 10, 63, 21, 233, + 120, 63, 21, 241, 42, 254, 69, 246, 24, 63, 21, 253, 204, 249, 2, 63, 21, + 239, 8, 63, 21, 242, 59, 246, 93, 63, 21, 237, 191, 63, 236, 181, 12, + 247, 31, 63, 21, 231, 59, 63, 21, 235, 176, 63, 26, 242, 217, 63, 26, + 127, 63, 26, 111, 63, 26, 166, 63, 26, 177, 63, 26, 176, 63, 26, 187, 63, + 26, 203, 63, 26, 195, 63, 26, 202, 63, 12, 253, 204, 243, 4, 252, 184, + 63, 12, 253, 204, 243, 4, 246, 99, 63, 12, 253, 204, 243, 4, 249, 138, + 63, 12, 253, 204, 243, 4, 250, 113, 63, 12, 253, 204, 243, 4, 244, 233, + 63, 12, 253, 204, 243, 4, 246, 253, 63, 12, 253, 204, 243, 4, 234, 239, + 63, 12, 253, 204, 243, 4, 236, 79, 63, 12, 253, 204, 243, 4, 236, 78, 63, + 12, 253, 204, 243, 4, 234, 238, 58, 241, 31, 58, 235, 69, 58, 240, 27, + 58, 248, 37, 208, 58, 240, 24, 58, 248, 58, 243, 5, 58, 248, 47, 248, + 186, 238, 93, 58, 248, 54, 4, 237, 78, 238, 95, 58, 240, 14, 240, 27, 58, + 240, 14, 248, 37, 208, 58, 239, 144, 58, 248, 210, 34, 236, 239, 127, 58, + 248, 210, 34, 236, 239, 111, 58, 248, 210, 34, 236, 239, 166, 58, 33, + 234, 6, 58, 26, 242, 217, 58, 26, 127, 58, 26, 111, 58, 26, 166, 58, 26, + 177, 58, 26, 176, 58, 26, 187, 58, 26, 203, 58, 26, 195, 58, 26, 202, 58, + 1, 67, 58, 1, 72, 58, 1, 71, 58, 1, 73, 58, 1, 79, 58, 1, 253, 193, 58, + 1, 253, 252, 58, 1, 253, 164, 58, 1, 253, 131, 58, 1, 248, 124, 58, 1, + 253, 141, 58, 1, 253, 129, 58, 1, 253, 217, 58, 1, 253, 139, 58, 1, 222, + 58, 1, 253, 134, 58, 1, 253, 132, 58, 1, 248, 46, 58, 1, 253, 126, 58, 1, + 253, 133, 58, 1, 248, 57, 58, 1, 253, 146, 58, 1, 216, 58, 1, 253, 130, + 58, 1, 253, 138, 58, 1, 253, 179, 58, 1, 201, 58, 1, 248, 61, 58, 1, 248, + 90, 58, 1, 253, 163, 58, 1, 248, 114, 58, 1, 253, 113, 58, 1, 248, 225, + 58, 1, 249, 217, 58, 1, 248, 67, 58, 1, 248, 47, 183, 33, 52, 58, 1, 248, + 47, 72, 58, 1, 248, 47, 71, 58, 1, 248, 47, 73, 58, 1, 248, 47, 79, 58, + 1, 248, 47, 253, 193, 58, 1, 248, 47, 253, 252, 58, 1, 248, 47, 248, 124, + 58, 1, 248, 47, 253, 141, 58, 1, 248, 47, 253, 129, 58, 1, 248, 47, 253, + 217, 58, 1, 248, 47, 253, 139, 58, 1, 248, 47, 222, 58, 1, 248, 47, 253, + 126, 58, 1, 248, 47, 253, 133, 58, 1, 248, 47, 248, 57, 58, 1, 248, 47, + 253, 146, 58, 1, 248, 47, 248, 90, 58, 1, 248, 47, 216, 58, 1, 248, 47, + 253, 138, 58, 1, 248, 47, 201, 58, 1, 248, 47, 248, 211, 58, 1, 248, 47, + 248, 114, 58, 1, 248, 47, 251, 115, 58, 1, 248, 47, 252, 20, 58, 1, 248, + 47, 248, 153, 58, 1, 248, 54, 72, 58, 1, 248, 54, 71, 58, 1, 248, 54, + 254, 102, 58, 1, 248, 54, 253, 252, 58, 1, 248, 54, 79, 58, 1, 248, 54, + 248, 124, 58, 1, 248, 54, 201, 58, 1, 248, 54, 253, 139, 58, 1, 248, 54, + 219, 58, 1, 248, 54, 253, 129, 58, 1, 248, 54, 248, 46, 58, 1, 248, 54, + 253, 126, 58, 1, 248, 54, 253, 133, 58, 1, 248, 54, 253, 146, 58, 1, 248, + 54, 253, 179, 58, 1, 248, 54, 248, 211, 58, 1, 248, 54, 248, 114, 58, 1, + 248, 54, 248, 90, 58, 1, 248, 54, 253, 163, 58, 1, 248, 54, 248, 182, 58, + 1, 248, 54, 248, 57, 58, 1, 248, 54, 248, 99, 58, 1, 240, 14, 71, 58, 1, + 240, 14, 201, 58, 1, 240, 14, 253, 130, 58, 1, 240, 14, 253, 179, 58, 1, + 240, 14, 248, 99, 58, 1, 253, 128, 248, 36, 237, 62, 127, 58, 1, 253, + 128, 248, 36, 239, 244, 127, 58, 1, 253, 128, 248, 36, 239, 36, 58, 1, + 253, 128, 248, 36, 237, 50, 58, 1, 253, 128, 248, 36, 236, 145, 237, 50, + 58, 1, 253, 128, 248, 36, 238, 163, 58, 1, 253, 128, 248, 36, 204, 238, + 163, 58, 1, 253, 128, 248, 36, 67, 58, 1, 253, 128, 248, 36, 71, 58, 1, + 253, 128, 248, 36, 201, 58, 1, 253, 128, 248, 36, 248, 50, 58, 1, 253, + 128, 248, 36, 253, 152, 58, 1, 253, 128, 248, 36, 248, 71, 58, 1, 253, + 128, 248, 36, 242, 247, 58, 1, 253, 128, 248, 36, 248, 75, 58, 1, 253, + 128, 248, 36, 248, 82, 58, 1, 253, 128, 248, 36, 253, 126, 58, 1, 253, + 128, 248, 36, 253, 133, 58, 1, 253, 128, 248, 36, 253, 129, 58, 1, 253, + 128, 248, 36, 248, 65, 58, 1, 253, 128, 248, 36, 248, 66, 58, 1, 253, + 128, 248, 36, 248, 99, 58, 1, 253, 128, 248, 36, 253, 163, 58, 1, 253, + 128, 248, 36, 254, 0, 58, 1, 248, 47, 253, 128, 248, 36, 253, 126, 58, 1, + 248, 47, 253, 128, 248, 36, 248, 99, 58, 1, 240, 14, 253, 128, 248, 36, + 248, 77, 58, 1, 240, 14, 253, 128, 248, 36, 248, 50, 58, 1, 240, 14, 253, + 128, 248, 36, 253, 152, 58, 1, 240, 14, 253, 128, 248, 36, 248, 89, 58, + 1, 240, 14, 253, 128, 248, 36, 248, 71, 58, 1, 240, 14, 253, 128, 248, + 36, 242, 249, 58, 1, 240, 14, 253, 128, 248, 36, 253, 126, 58, 1, 240, + 14, 253, 128, 248, 36, 248, 76, 58, 1, 240, 14, 253, 128, 248, 36, 248, + 66, 58, 1, 240, 14, 253, 128, 248, 36, 250, 174, 58, 1, 240, 14, 253, + 128, 248, 36, 248, 99, 58, 1, 240, 14, 253, 128, 248, 36, 253, 163, 58, + 1, 253, 128, 248, 36, 137, 79, 58, 1, 253, 128, 248, 36, 137, 216, 58, 1, + 240, 14, 253, 128, 248, 36, 248, 81, 58, 1, 253, 128, 248, 36, 237, 101, + 149, 232, 65, 239, 117, 149, 1, 201, 149, 1, 248, 61, 149, 1, 253, 139, + 149, 1, 248, 77, 149, 1, 248, 50, 149, 1, 253, 152, 149, 1, 248, 57, 149, + 1, 253, 146, 149, 1, 248, 89, 149, 1, 249, 203, 149, 1, 253, 126, 149, 1, + 248, 55, 149, 1, 253, 133, 149, 1, 248, 76, 149, 1, 253, 131, 149, 1, + 253, 129, 149, 1, 248, 65, 149, 1, 253, 141, 149, 1, 248, 81, 149, 1, + 222, 149, 1, 216, 149, 1, 253, 130, 149, 1, 253, 134, 149, 1, 253, 138, + 149, 1, 248, 46, 149, 1, 248, 66, 149, 1, 253, 132, 149, 1, 219, 149, 33, + 21, 67, 149, 33, 21, 71, 149, 33, 21, 79, 149, 33, 21, 253, 164, 149, 33, + 21, 253, 149, 149, 33, 21, 253, 156, 149, 33, 21, 253, 151, 149, 33, 21, + 72, 149, 33, 21, 73, 149, 213, 1, 216, 149, 213, 1, 253, 130, 149, 213, + 1, 253, 138, 149, 3, 1, 201, 149, 3, 1, 248, 50, 149, 3, 1, 235, 61, 149, + 3, 1, 253, 126, 149, 3, 1, 253, 131, 149, 3, 1, 253, 129, 149, 3, 1, 222, + 149, 3, 1, 253, 130, 149, 3, 1, 253, 134, 149, 21, 234, 226, 149, 21, + 234, 212, 149, 21, 247, 59, 149, 21, 248, 226, 149, 233, 54, 69, 149, + 236, 156, 69, 149, 26, 242, 217, 149, 26, 127, 149, 26, 111, 149, 26, + 166, 149, 26, 177, 149, 26, 176, 149, 26, 187, 149, 26, 203, 149, 26, + 195, 149, 26, 202, 81, 255, 21, 1, 201, 81, 255, 21, 1, 253, 253, 81, + 255, 21, 1, 248, 50, 81, 255, 21, 1, 248, 90, 81, 255, 21, 1, 253, 132, + 81, 255, 21, 1, 216, 81, 255, 21, 1, 253, 126, 81, 255, 21, 1, 248, 55, + 81, 255, 21, 1, 253, 134, 81, 255, 21, 1, 253, 129, 81, 255, 21, 1, 248, + 65, 81, 255, 21, 1, 222, 81, 255, 21, 1, 253, 179, 81, 255, 21, 1, 253, + 171, 81, 255, 21, 1, 219, 81, 255, 21, 1, 253, 217, 81, 255, 21, 1, 248, + 61, 81, 255, 21, 1, 243, 130, 81, 255, 21, 1, 253, 131, 81, 255, 21, 1, + 67, 81, 255, 21, 1, 71, 81, 255, 21, 1, 253, 164, 81, 255, 21, 1, 254, + 36, 81, 255, 21, 1, 79, 81, 255, 21, 1, 253, 156, 81, 255, 21, 1, 73, 81, + 255, 21, 1, 253, 252, 81, 255, 21, 1, 72, 81, 255, 21, 1, 249, 243, 81, + 255, 21, 1, 253, 149, 81, 255, 21, 1, 239, 223, 81, 255, 21, 1, 239, 224, + 81, 255, 21, 1, 239, 225, 81, 255, 21, 1, 239, 226, 81, 255, 21, 1, 239, + 227, 116, 81, 122, 1, 200, 253, 217, 116, 81, 122, 1, 170, 253, 217, 116, + 81, 122, 1, 200, 201, 116, 81, 122, 1, 200, 253, 253, 116, 81, 122, 1, + 200, 248, 50, 116, 81, 122, 1, 170, 201, 116, 81, 122, 1, 170, 253, 253, + 116, 81, 122, 1, 170, 248, 50, 116, 81, 122, 1, 200, 248, 90, 116, 81, + 122, 1, 200, 253, 132, 116, 81, 122, 1, 200, 216, 116, 81, 122, 1, 170, + 248, 90, 116, 81, 122, 1, 170, 253, 132, 116, 81, 122, 1, 170, 216, 116, + 81, 122, 1, 200, 253, 126, 116, 81, 122, 1, 200, 248, 55, 116, 81, 122, + 1, 200, 253, 131, 116, 81, 122, 1, 170, 253, 126, 116, 81, 122, 1, 170, + 248, 55, 116, 81, 122, 1, 170, 253, 131, 116, 81, 122, 1, 200, 253, 129, + 116, 81, 122, 1, 200, 248, 65, 116, 81, 122, 1, 200, 222, 116, 81, 122, + 1, 170, 253, 129, 116, 81, 122, 1, 170, 248, 65, 116, 81, 122, 1, 170, + 222, 116, 81, 122, 1, 200, 253, 179, 116, 81, 122, 1, 200, 253, 171, 116, + 81, 122, 1, 200, 253, 134, 116, 81, 122, 1, 170, 253, 179, 116, 81, 122, + 1, 170, 253, 171, 116, 81, 122, 1, 170, 253, 134, 116, 81, 122, 1, 200, + 219, 116, 81, 122, 1, 200, 253, 133, 116, 81, 122, 1, 200, 253, 141, 116, + 81, 122, 1, 170, 219, 116, 81, 122, 1, 170, 253, 133, 116, 81, 122, 1, + 170, 253, 141, 116, 81, 122, 1, 200, 249, 99, 116, 81, 122, 1, 200, 249, + 201, 116, 81, 122, 1, 170, 249, 99, 116, 81, 122, 1, 170, 249, 201, 116, + 81, 122, 33, 21, 33, 234, 255, 116, 81, 122, 33, 21, 253, 140, 116, 81, + 122, 33, 21, 253, 142, 116, 81, 122, 33, 21, 79, 116, 81, 122, 33, 21, + 253, 148, 116, 81, 122, 33, 21, 72, 116, 81, 122, 33, 21, 253, 178, 116, + 81, 122, 33, 21, 73, 116, 81, 122, 33, 21, 254, 117, 116, 81, 122, 33, + 21, 253, 252, 116, 81, 122, 33, 21, 254, 33, 116, 81, 122, 33, 21, 249, + 232, 116, 81, 122, 33, 21, 254, 254, 116, 81, 122, 33, 21, 254, 221, 116, + 81, 122, 33, 21, 252, 56, 116, 81, 122, 33, 21, 252, 250, 116, 81, 122, + 33, 21, 254, 102, 116, 81, 122, 1, 30, 179, 116, 81, 122, 1, 30, 254, 26, + 116, 81, 122, 1, 30, 197, 116, 81, 122, 1, 30, 173, 116, 81, 122, 1, 30, + 255, 15, 116, 81, 122, 1, 30, 209, 116, 81, 122, 1, 30, 217, 116, 81, + 122, 188, 238, 200, 116, 81, 122, 188, 238, 201, 116, 81, 122, 26, 242, + 217, 116, 81, 122, 26, 127, 116, 81, 122, 26, 111, 116, 81, 122, 26, 166, + 116, 81, 122, 26, 177, 116, 81, 122, 26, 176, 116, 81, 122, 26, 187, 116, + 81, 122, 26, 203, 116, 81, 122, 26, 195, 116, 81, 122, 26, 202, 116, 81, + 122, 21, 251, 180, 116, 81, 122, 21, 246, 36, 63, 12, 233, 223, 63, 12, + 249, 116, 242, 246, 63, 12, 254, 69, 242, 246, 63, 12, 254, 81, 242, 246, + 63, 12, 249, 34, 242, 246, 63, 12, 249, 141, 242, 246, 63, 12, 235, 137, + 242, 246, 63, 12, 237, 32, 242, 246, 63, 12, 237, 31, 242, 246, 63, 12, + 235, 136, 242, 246, 63, 12, 254, 86, 242, 246, 63, 12, 237, 3, 242, 246, + 63, 12, 238, 175, 242, 246, 63, 12, 238, 174, 242, 246, 63, 12, 237, 2, + 242, 246, 63, 12, 237, 4, 242, 246, 63, 12, 235, 38, 63, 12, 249, 116, + 248, 80, 63, 12, 254, 69, 248, 80, 63, 12, 254, 81, 248, 80, 63, 12, 249, + 34, 248, 80, 63, 12, 249, 141, 248, 80, 63, 12, 235, 137, 248, 80, 63, + 12, 237, 32, 248, 80, 63, 12, 237, 31, 248, 80, 63, 12, 235, 136, 248, + 80, 63, 12, 254, 86, 248, 80, 63, 12, 237, 3, 248, 80, 63, 12, 238, 175, + 248, 80, 63, 12, 238, 174, 248, 80, 63, 12, 237, 2, 248, 80, 63, 12, 237, + 4, 248, 80, 236, 148, 1, 201, 236, 148, 1, 253, 139, 236, 148, 1, 248, + 50, 236, 148, 1, 246, 148, 236, 148, 1, 253, 129, 236, 148, 1, 253, 141, + 236, 148, 1, 222, 236, 148, 1, 249, 115, 236, 148, 1, 253, 126, 236, 148, + 1, 253, 133, 236, 148, 1, 253, 131, 236, 148, 1, 249, 123, 236, 148, 1, + 253, 152, 236, 148, 1, 253, 146, 236, 148, 1, 248, 78, 236, 148, 1, 246, + 199, 236, 148, 1, 216, 236, 148, 1, 253, 130, 236, 148, 1, 253, 134, 236, + 148, 1, 253, 171, 236, 148, 1, 253, 132, 236, 148, 1, 67, 236, 148, 1, + 219, 236, 148, 33, 21, 71, 236, 148, 33, 21, 79, 236, 148, 33, 21, 72, + 236, 148, 33, 21, 73, 236, 148, 33, 21, 253, 178, 236, 148, 237, 231, + 236, 148, 253, 165, 147, 236, 210, 8, 1, 3, 5, 67, 8, 1, 3, 5, 253, 178, + 8, 3, 1, 205, 253, 178, 8, 1, 3, 5, 240, 60, 217, 8, 1, 3, 5, 255, 18, 8, + 1, 3, 5, 209, 8, 1, 3, 5, 248, 109, 8, 1, 3, 5, 72, 8, 3, 1, 205, 248, + 35, 72, 8, 3, 1, 205, 71, 8, 1, 3, 5, 221, 8, 1, 3, 5, 255, 15, 8, 1, 3, + 5, 255, 100, 2, 108, 8, 1, 3, 5, 173, 8, 1, 3, 5, 224, 197, 8, 1, 3, 5, + 73, 8, 1, 3, 5, 248, 35, 73, 8, 3, 1, 236, 190, 73, 8, 3, 1, 236, 190, + 248, 35, 73, 8, 3, 1, 236, 190, 117, 2, 108, 8, 3, 1, 205, 253, 193, 8, + 1, 3, 5, 254, 10, 8, 3, 1, 253, 159, 137, 73, 8, 3, 1, 240, 17, 137, 73, + 8, 1, 3, 5, 223, 8, 1, 3, 5, 224, 144, 8, 1, 3, 5, 205, 144, 8, 1, 3, 5, + 214, 8, 1, 3, 5, 79, 8, 3, 1, 236, 190, 79, 8, 3, 1, 236, 190, 233, 132, + 79, 8, 3, 1, 236, 190, 205, 173, 8, 1, 3, 5, 179, 8, 1, 3, 5, 255, 16, 8, + 1, 3, 5, 255, 17, 8, 1, 3, 5, 248, 155, 8, 1, 240, 59, 236, 49, 238, 10, + 8, 1, 248, 105, 17, 1, 3, 5, 240, 10, 17, 1, 3, 5, 240, 33, 17, 1, 3, 5, + 253, 147, 17, 1, 3, 5, 248, 73, 17, 1, 3, 5, 248, 69, 32, 1, 3, 5, 254, + 3, 49, 1, 5, 67, 49, 1, 5, 253, 178, 49, 1, 5, 217, 49, 1, 5, 240, 60, + 217, 49, 1, 5, 209, 49, 1, 5, 72, 49, 1, 5, 224, 72, 49, 1, 5, 210, 49, + 1, 5, 192, 49, 1, 5, 71, 49, 1, 5, 221, 49, 1, 5, 255, 15, 49, 1, 5, 162, + 49, 1, 5, 173, 49, 1, 5, 197, 49, 1, 5, 224, 197, 49, 1, 5, 73, 49, 1, 5, + 254, 10, 49, 1, 5, 223, 49, 1, 5, 144, 49, 1, 5, 214, 49, 1, 5, 79, 49, + 1, 5, 255, 16, 49, 1, 3, 67, 49, 1, 3, 205, 67, 49, 1, 3, 240, 22, 49, 1, + 3, 205, 253, 178, 49, 1, 3, 217, 49, 1, 3, 209, 49, 1, 3, 72, 49, 1, 3, + 240, 86, 49, 1, 3, 248, 35, 72, 49, 1, 3, 205, 248, 35, 72, 49, 1, 3, + 210, 49, 1, 3, 205, 71, 49, 1, 3, 255, 15, 49, 1, 3, 173, 49, 1, 3, 248, + 108, 49, 1, 3, 73, 49, 1, 3, 248, 35, 73, 49, 1, 3, 253, 159, 137, 73, + 49, 1, 3, 240, 17, 137, 73, 49, 1, 3, 223, 49, 1, 3, 214, 49, 1, 3, 79, + 49, 1, 3, 236, 190, 79, 49, 1, 3, 205, 173, 49, 1, 3, 179, 49, 1, 3, 248, + 105, 49, 1, 3, 242, 242, 49, 1, 3, 17, 240, 10, 49, 1, 3, 240, 28, 49, 1, + 3, 17, 248, 68, 49, 1, 3, 248, 67, 8, 235, 48, 3, 1, 71, 8, 235, 48, 3, + 1, 144, 8, 235, 48, 3, 1, 79, 8, 235, 48, 3, 1, 179, 17, 235, 48, 3, 1, + 242, 242, 17, 235, 48, 3, 1, 240, 10, 17, 235, 48, 3, 1, 248, 73, 17, + 235, 48, 3, 1, 248, 68, 17, 235, 48, 3, 1, 248, 67, 8, 3, 1, 253, 252, 8, + 3, 1, 41, 2, 240, 1, 169, 8, 3, 1, 255, 103, 2, 240, 1, 169, 8, 3, 1, + 255, 112, 2, 240, 1, 169, 8, 3, 1, 255, 108, 2, 240, 1, 169, 8, 3, 1, + 255, 98, 2, 240, 1, 169, 8, 3, 1, 255, 114, 2, 240, 1, 169, 8, 3, 1, 255, + 101, 2, 240, 1, 169, 8, 3, 1, 255, 101, 2, 237, 11, 19, 240, 1, 169, 8, + 3, 1, 255, 99, 2, 240, 1, 169, 8, 3, 1, 255, 102, 2, 240, 1, 169, 8, 3, + 1, 255, 97, 2, 240, 1, 169, 8, 3, 1, 205, 210, 49, 1, 32, 253, 202, 8, 3, + 1, 239, 101, 210, 8, 3, 1, 255, 93, 2, 231, 82, 8, 3, 5, 1, 220, 2, 108, + 8, 3, 1, 248, 42, 2, 108, 8, 3, 1, 255, 114, 2, 108, 8, 3, 5, 1, 132, 2, + 108, 8, 3, 1, 238, 53, 2, 108, 8, 3, 1, 41, 2, 238, 65, 90, 8, 3, 1, 255, + 103, 2, 238, 65, 90, 8, 3, 1, 255, 112, 2, 238, 65, 90, 8, 3, 1, 255, + 104, 2, 238, 65, 90, 8, 3, 1, 255, 109, 2, 238, 65, 90, 8, 3, 1, 255, + 100, 2, 238, 65, 90, 8, 3, 1, 255, 108, 2, 238, 65, 90, 8, 3, 1, 255, 98, + 2, 238, 65, 90, 8, 3, 1, 255, 114, 2, 238, 65, 90, 8, 3, 1, 255, 101, 2, + 238, 65, 90, 8, 3, 1, 255, 99, 2, 238, 65, 90, 8, 3, 1, 254, 38, 2, 238, + 65, 90, 8, 3, 1, 255, 110, 2, 238, 65, 90, 8, 3, 1, 255, 113, 2, 238, 65, + 90, 8, 3, 1, 255, 97, 2, 238, 65, 90, 8, 3, 1, 134, 2, 235, 54, 90, 8, 3, + 1, 194, 2, 235, 54, 90, 8, 3, 1, 255, 103, 2, 248, 45, 19, 242, 226, 8, + 3, 1, 157, 2, 235, 54, 90, 8, 3, 1, 248, 35, 157, 2, 235, 54, 90, 8, 3, + 1, 224, 248, 35, 157, 2, 235, 54, 90, 8, 3, 1, 243, 73, 2, 235, 54, 90, + 8, 3, 1, 220, 2, 235, 54, 90, 8, 3, 1, 248, 35, 117, 2, 235, 54, 90, 8, + 3, 1, 254, 38, 2, 235, 54, 90, 8, 3, 1, 132, 2, 235, 54, 90, 8, 3, 1, + 253, 244, 2, 235, 54, 90, 49, 1, 3, 205, 240, 22, 49, 1, 3, 255, 18, 49, + 1, 3, 255, 105, 2, 242, 253, 49, 1, 3, 248, 109, 49, 1, 3, 224, 248, 35, + 72, 49, 1, 3, 255, 19, 49, 1, 3, 238, 70, 255, 115, 2, 108, 49, 1, 3, 84, + 210, 49, 1, 3, 205, 192, 49, 1, 3, 220, 2, 108, 49, 1, 3, 242, 237, 49, + 1, 3, 5, 71, 49, 1, 3, 5, 220, 2, 108, 49, 1, 3, 255, 115, 2, 231, 101, + 49, 1, 3, 255, 100, 2, 235, 54, 90, 49, 1, 3, 255, 100, 2, 238, 65, 90, + 49, 1, 3, 5, 162, 49, 1, 3, 255, 108, 2, 90, 49, 1, 3, 205, 255, 108, 2, + 183, 248, 117, 49, 1, 3, 255, 98, 2, 40, 90, 49, 1, 3, 255, 98, 2, 235, + 54, 90, 49, 1, 3, 5, 197, 49, 1, 3, 240, 60, 73, 49, 1, 3, 248, 68, 49, + 1, 3, 255, 99, 2, 90, 49, 1, 3, 248, 93, 49, 1, 3, 255, 102, 2, 238, 65, + 90, 49, 1, 3, 132, 125, 49, 1, 3, 236, 160, 49, 1, 3, 5, 79, 49, 1, 3, + 255, 110, 2, 90, 49, 1, 3, 205, 179, 49, 1, 3, 255, 17, 49, 1, 3, 255, + 97, 2, 235, 54, 90, 49, 1, 3, 255, 97, 2, 242, 253, 49, 1, 3, 248, 155, + 49, 1, 3, 240, 38, 50, 240, 4, 242, 245, 238, 54, 50, 240, 4, 242, 241, + 238, 54, 50, 247, 95, 46, 50, 235, 6, 69, 8, 5, 1, 134, 2, 248, 51, 46, + 8, 3, 1, 134, 2, 248, 51, 46, 8, 5, 1, 41, 2, 53, 48, 8, 3, 1, 41, 2, 53, + 48, 8, 5, 1, 41, 2, 53, 46, 8, 3, 1, 41, 2, 53, 46, 8, 5, 1, 41, 2, 248, + 41, 46, 8, 3, 1, 41, 2, 248, 41, 46, 8, 5, 1, 255, 105, 2, 238, 109, 19, + 135, 8, 3, 1, 255, 105, 2, 238, 109, 19, 135, 8, 5, 1, 255, 103, 2, 53, + 48, 8, 3, 1, 255, 103, 2, 53, 48, 8, 5, 1, 255, 103, 2, 53, 46, 8, 3, 1, + 255, 103, 2, 53, 46, 8, 5, 1, 255, 103, 2, 248, 41, 46, 8, 3, 1, 255, + 103, 2, 248, 41, 46, 8, 5, 1, 255, 103, 2, 236, 151, 8, 3, 1, 255, 103, + 2, 236, 151, 8, 5, 1, 255, 103, 2, 190, 46, 8, 3, 1, 255, 103, 2, 190, + 46, 8, 5, 1, 157, 2, 240, 42, 19, 191, 8, 3, 1, 157, 2, 240, 42, 19, 191, + 8, 5, 1, 157, 2, 240, 42, 19, 135, 8, 3, 1, 157, 2, 240, 42, 19, 135, 8, + 5, 1, 157, 2, 190, 46, 8, 3, 1, 157, 2, 190, 46, 8, 5, 1, 157, 2, 242, + 219, 46, 8, 3, 1, 157, 2, 242, 219, 46, 8, 5, 1, 157, 2, 238, 109, 19, + 239, 255, 8, 3, 1, 157, 2, 238, 109, 19, 239, 255, 8, 5, 1, 255, 112, 2, + 53, 48, 8, 3, 1, 255, 112, 2, 53, 48, 8, 5, 1, 255, 104, 2, 196, 8, 3, 1, + 255, 104, 2, 196, 8, 5, 1, 255, 106, 2, 53, 48, 8, 3, 1, 255, 106, 2, 53, + 48, 8, 5, 1, 255, 106, 2, 53, 46, 8, 3, 1, 255, 106, 2, 53, 46, 8, 5, 1, + 255, 106, 2, 175, 8, 3, 1, 255, 106, 2, 175, 8, 5, 1, 255, 106, 2, 236, + 151, 8, 3, 1, 255, 106, 2, 236, 151, 8, 5, 1, 255, 106, 2, 242, 243, 46, + 8, 3, 1, 255, 106, 2, 242, 243, 46, 8, 5, 1, 220, 2, 242, 219, 46, 8, 3, + 1, 220, 2, 242, 219, 46, 8, 5, 1, 220, 2, 235, 56, 19, 135, 8, 3, 1, 220, + 2, 235, 56, 19, 135, 8, 5, 1, 255, 109, 2, 135, 8, 3, 1, 255, 109, 2, + 135, 8, 5, 1, 255, 109, 2, 53, 46, 8, 3, 1, 255, 109, 2, 53, 46, 8, 5, 1, + 255, 109, 2, 248, 41, 46, 8, 3, 1, 255, 109, 2, 248, 41, 46, 8, 5, 1, + 255, 100, 2, 53, 46, 8, 3, 1, 255, 100, 2, 53, 46, 8, 5, 1, 255, 100, 2, + 53, 242, 230, 19, 196, 8, 3, 1, 255, 100, 2, 53, 242, 230, 19, 196, 8, 5, + 1, 255, 100, 2, 248, 41, 46, 8, 3, 1, 255, 100, 2, 248, 41, 46, 8, 5, 1, + 255, 100, 2, 190, 46, 8, 3, 1, 255, 100, 2, 190, 46, 8, 5, 1, 255, 108, + 2, 135, 8, 3, 1, 255, 108, 2, 135, 8, 5, 1, 255, 108, 2, 53, 48, 8, 3, 1, + 255, 108, 2, 53, 48, 8, 5, 1, 255, 108, 2, 53, 46, 8, 3, 1, 255, 108, 2, + 53, 46, 8, 5, 1, 255, 98, 2, 53, 48, 8, 3, 1, 255, 98, 2, 53, 48, 8, 5, + 1, 255, 98, 2, 53, 46, 8, 3, 1, 255, 98, 2, 53, 46, 8, 5, 1, 255, 98, 2, + 248, 41, 46, 8, 3, 1, 255, 98, 2, 248, 41, 46, 8, 5, 1, 255, 98, 2, 190, + 46, 8, 3, 1, 255, 98, 2, 190, 46, 8, 5, 1, 117, 2, 242, 219, 19, 135, 8, + 3, 1, 117, 2, 242, 219, 19, 135, 8, 5, 1, 117, 2, 242, 219, 19, 175, 8, + 3, 1, 117, 2, 242, 219, 19, 175, 8, 5, 1, 117, 2, 240, 42, 19, 191, 8, 3, + 1, 117, 2, 240, 42, 19, 191, 8, 5, 1, 117, 2, 240, 42, 19, 135, 8, 3, 1, + 117, 2, 240, 42, 19, 135, 8, 5, 1, 255, 114, 2, 135, 8, 3, 1, 255, 114, + 2, 135, 8, 5, 1, 255, 114, 2, 53, 48, 8, 3, 1, 255, 114, 2, 53, 48, 8, 5, + 1, 255, 101, 2, 53, 48, 8, 3, 1, 255, 101, 2, 53, 48, 8, 5, 1, 255, 101, + 2, 53, 46, 8, 3, 1, 255, 101, 2, 53, 46, 8, 5, 1, 255, 101, 2, 53, 242, + 230, 19, 196, 8, 3, 1, 255, 101, 2, 53, 242, 230, 19, 196, 8, 5, 1, 255, + 101, 2, 248, 41, 46, 8, 3, 1, 255, 101, 2, 248, 41, 46, 8, 5, 1, 255, 99, + 2, 53, 48, 8, 3, 1, 255, 99, 2, 53, 48, 8, 5, 1, 255, 99, 2, 53, 46, 8, + 3, 1, 255, 99, 2, 53, 46, 8, 5, 1, 255, 99, 2, 242, 241, 19, 53, 48, 8, + 3, 1, 255, 99, 2, 242, 241, 19, 53, 48, 8, 5, 1, 255, 99, 2, 243, 86, 19, + 53, 48, 8, 3, 1, 255, 99, 2, 243, 86, 19, 53, 48, 8, 5, 1, 255, 99, 2, + 53, 242, 230, 19, 53, 48, 8, 3, 1, 255, 99, 2, 53, 242, 230, 19, 53, 48, + 8, 5, 1, 255, 102, 2, 53, 48, 8, 3, 1, 255, 102, 2, 53, 48, 8, 5, 1, 255, + 102, 2, 53, 46, 8, 3, 1, 255, 102, 2, 53, 46, 8, 5, 1, 255, 102, 2, 248, + 41, 46, 8, 3, 1, 255, 102, 2, 248, 41, 46, 8, 5, 1, 255, 102, 2, 190, 46, + 8, 3, 1, 255, 102, 2, 190, 46, 8, 5, 1, 132, 2, 235, 56, 46, 8, 3, 1, + 132, 2, 235, 56, 46, 8, 5, 1, 132, 2, 242, 219, 46, 8, 3, 1, 132, 2, 242, + 219, 46, 8, 5, 1, 132, 2, 190, 46, 8, 3, 1, 132, 2, 190, 46, 8, 5, 1, + 132, 2, 242, 219, 19, 135, 8, 3, 1, 132, 2, 242, 219, 19, 135, 8, 5, 1, + 132, 2, 240, 42, 19, 175, 8, 3, 1, 132, 2, 240, 42, 19, 175, 8, 5, 1, + 255, 110, 2, 169, 8, 3, 1, 255, 110, 2, 169, 8, 5, 1, 255, 110, 2, 53, + 46, 8, 3, 1, 255, 110, 2, 53, 46, 8, 5, 1, 255, 111, 2, 191, 8, 3, 1, + 255, 111, 2, 191, 8, 5, 1, 255, 111, 2, 135, 8, 3, 1, 255, 111, 2, 135, + 8, 5, 1, 255, 111, 2, 175, 8, 3, 1, 255, 111, 2, 175, 8, 5, 1, 255, 111, + 2, 53, 48, 8, 3, 1, 255, 111, 2, 53, 48, 8, 5, 1, 255, 111, 2, 53, 46, 8, + 3, 1, 255, 111, 2, 53, 46, 8, 5, 1, 255, 113, 2, 53, 48, 8, 3, 1, 255, + 113, 2, 53, 48, 8, 5, 1, 255, 113, 2, 175, 8, 3, 1, 255, 113, 2, 175, 8, + 5, 1, 255, 107, 2, 53, 48, 8, 3, 1, 255, 107, 2, 53, 48, 8, 5, 1, 255, + 97, 2, 233, 48, 8, 3, 1, 255, 97, 2, 233, 48, 8, 5, 1, 255, 97, 2, 53, + 46, 8, 3, 1, 255, 97, 2, 53, 46, 8, 5, 1, 255, 97, 2, 248, 41, 46, 8, 3, + 1, 255, 97, 2, 248, 41, 46, 8, 3, 1, 255, 106, 2, 248, 41, 46, 8, 3, 1, + 255, 102, 2, 175, 8, 3, 1, 255, 111, 2, 248, 51, 48, 8, 3, 1, 255, 107, + 2, 248, 51, 48, 8, 3, 1, 134, 2, 38, 137, 242, 233, 8, 3, 1, 183, 255, + 99, 2, 53, 48, 8, 5, 1, 134, 2, 53, 46, 8, 3, 1, 134, 2, 53, 46, 8, 5, 1, + 134, 2, 248, 45, 48, 8, 3, 1, 134, 2, 248, 45, 48, 8, 5, 1, 134, 2, 190, + 19, 135, 8, 3, 1, 134, 2, 190, 19, 135, 8, 5, 1, 134, 2, 190, 19, 191, 8, + 3, 1, 134, 2, 190, 19, 191, 8, 5, 1, 134, 2, 190, 19, 248, 45, 48, 8, 3, + 1, 134, 2, 190, 19, 248, 45, 48, 8, 5, 1, 134, 2, 190, 19, 169, 8, 3, 1, + 134, 2, 190, 19, 169, 8, 5, 1, 134, 2, 190, 19, 53, 46, 8, 3, 1, 134, 2, + 190, 19, 53, 46, 8, 5, 1, 134, 2, 242, 243, 19, 135, 8, 3, 1, 134, 2, + 242, 243, 19, 135, 8, 5, 1, 134, 2, 242, 243, 19, 191, 8, 3, 1, 134, 2, + 242, 243, 19, 191, 8, 5, 1, 134, 2, 242, 243, 19, 248, 45, 48, 8, 3, 1, + 134, 2, 242, 243, 19, 248, 45, 48, 8, 5, 1, 134, 2, 242, 243, 19, 169, 8, + 3, 1, 134, 2, 242, 243, 19, 169, 8, 5, 1, 134, 2, 242, 243, 19, 53, 46, + 8, 3, 1, 134, 2, 242, 243, 19, 53, 46, 8, 5, 1, 157, 2, 53, 46, 8, 3, 1, + 157, 2, 53, 46, 8, 5, 1, 157, 2, 248, 45, 48, 8, 3, 1, 157, 2, 248, 45, + 48, 8, 5, 1, 157, 2, 169, 8, 3, 1, 157, 2, 169, 8, 5, 1, 157, 2, 190, 19, + 135, 8, 3, 1, 157, 2, 190, 19, 135, 8, 5, 1, 157, 2, 190, 19, 191, 8, 3, + 1, 157, 2, 190, 19, 191, 8, 5, 1, 157, 2, 190, 19, 248, 45, 48, 8, 3, 1, + 157, 2, 190, 19, 248, 45, 48, 8, 5, 1, 157, 2, 190, 19, 169, 8, 3, 1, + 157, 2, 190, 19, 169, 8, 5, 1, 157, 2, 190, 19, 53, 46, 8, 3, 1, 157, 2, + 190, 19, 53, 46, 8, 5, 1, 220, 2, 248, 45, 48, 8, 3, 1, 220, 2, 248, 45, + 48, 8, 5, 1, 220, 2, 53, 46, 8, 3, 1, 220, 2, 53, 46, 8, 5, 1, 117, 2, + 53, 46, 8, 3, 1, 117, 2, 53, 46, 8, 5, 1, 117, 2, 248, 45, 48, 8, 3, 1, + 117, 2, 248, 45, 48, 8, 5, 1, 117, 2, 190, 19, 135, 8, 3, 1, 117, 2, 190, + 19, 135, 8, 5, 1, 117, 2, 190, 19, 191, 8, 3, 1, 117, 2, 190, 19, 191, 8, + 5, 1, 117, 2, 190, 19, 248, 45, 48, 8, 3, 1, 117, 2, 190, 19, 248, 45, + 48, 8, 5, 1, 117, 2, 190, 19, 169, 8, 3, 1, 117, 2, 190, 19, 169, 8, 5, + 1, 117, 2, 190, 19, 53, 46, 8, 3, 1, 117, 2, 190, 19, 53, 46, 8, 5, 1, + 117, 2, 248, 60, 19, 135, 8, 3, 1, 117, 2, 248, 60, 19, 135, 8, 5, 1, + 117, 2, 248, 60, 19, 191, 8, 3, 1, 117, 2, 248, 60, 19, 191, 8, 5, 1, + 117, 2, 248, 60, 19, 248, 45, 48, 8, 3, 1, 117, 2, 248, 60, 19, 248, 45, + 48, 8, 5, 1, 117, 2, 248, 60, 19, 169, 8, 3, 1, 117, 2, 248, 60, 19, 169, + 8, 5, 1, 117, 2, 248, 60, 19, 53, 46, 8, 3, 1, 117, 2, 248, 60, 19, 53, + 46, 8, 5, 1, 132, 2, 53, 46, 8, 3, 1, 132, 2, 53, 46, 8, 5, 1, 132, 2, + 248, 45, 48, 8, 3, 1, 132, 2, 248, 45, 48, 8, 5, 1, 132, 2, 248, 60, 19, + 135, 8, 3, 1, 132, 2, 248, 60, 19, 135, 8, 5, 1, 132, 2, 248, 60, 19, + 191, 8, 3, 1, 132, 2, 248, 60, 19, 191, 8, 5, 1, 132, 2, 248, 60, 19, + 248, 45, 48, 8, 3, 1, 132, 2, 248, 60, 19, 248, 45, 48, 8, 5, 1, 132, 2, + 248, 60, 19, 169, 8, 3, 1, 132, 2, 248, 60, 19, 169, 8, 5, 1, 132, 2, + 248, 60, 19, 53, 46, 8, 3, 1, 132, 2, 248, 60, 19, 53, 46, 8, 5, 1, 255, + 107, 2, 191, 8, 3, 1, 255, 107, 2, 191, 8, 5, 1, 255, 107, 2, 53, 46, 8, + 3, 1, 255, 107, 2, 53, 46, 8, 5, 1, 255, 107, 2, 248, 45, 48, 8, 3, 1, + 255, 107, 2, 248, 45, 48, 8, 5, 1, 255, 107, 2, 169, 8, 3, 1, 255, 107, + 2, 169, 17, 3, 1, 194, 2, 240, 29, 17, 3, 1, 194, 2, 240, 25, 17, 3, 1, + 194, 2, 159, 19, 215, 17, 3, 1, 194, 2, 148, 19, 215, 17, 3, 1, 194, 2, + 159, 19, 212, 17, 3, 1, 194, 2, 148, 19, 212, 17, 3, 1, 194, 2, 159, 19, + 232, 71, 17, 3, 1, 194, 2, 148, 19, 232, 71, 17, 5, 1, 194, 2, 240, 29, + 17, 5, 1, 194, 2, 240, 25, 17, 5, 1, 194, 2, 159, 19, 215, 17, 5, 1, 194, + 2, 148, 19, 215, 17, 5, 1, 194, 2, 159, 19, 212, 17, 5, 1, 194, 2, 148, + 19, 212, 17, 5, 1, 194, 2, 159, 19, 232, 71, 17, 5, 1, 194, 2, 148, 19, + 232, 71, 17, 3, 1, 238, 57, 2, 240, 29, 17, 3, 1, 238, 57, 2, 240, 25, + 17, 3, 1, 238, 57, 2, 159, 19, 215, 17, 3, 1, 238, 57, 2, 148, 19, 215, + 17, 3, 1, 238, 57, 2, 159, 19, 212, 17, 3, 1, 238, 57, 2, 148, 19, 212, + 17, 5, 1, 238, 57, 2, 240, 29, 17, 5, 1, 238, 57, 2, 240, 25, 17, 5, 1, + 238, 57, 2, 159, 19, 215, 17, 5, 1, 238, 57, 2, 148, 19, 215, 17, 5, 1, + 238, 57, 2, 159, 19, 212, 17, 5, 1, 238, 57, 2, 148, 19, 212, 17, 3, 1, + 253, 123, 2, 240, 29, 17, 3, 1, 253, 123, 2, 240, 25, 17, 3, 1, 253, 123, + 2, 159, 19, 215, 17, 3, 1, 253, 123, 2, 148, 19, 215, 17, 3, 1, 253, 123, + 2, 159, 19, 212, 17, 3, 1, 253, 123, 2, 148, 19, 212, 17, 3, 1, 253, 123, + 2, 159, 19, 232, 71, 17, 3, 1, 253, 123, 2, 148, 19, 232, 71, 17, 5, 1, + 253, 123, 2, 240, 29, 17, 5, 1, 253, 123, 2, 240, 25, 17, 5, 1, 253, 123, + 2, 159, 19, 215, 17, 5, 1, 253, 123, 2, 148, 19, 215, 17, 5, 1, 253, 123, + 2, 159, 19, 212, 17, 5, 1, 253, 123, 2, 148, 19, 212, 17, 5, 1, 253, 123, + 2, 159, 19, 232, 71, 17, 5, 1, 253, 123, 2, 148, 19, 232, 71, 17, 3, 1, + 248, 42, 2, 240, 29, 17, 3, 1, 248, 42, 2, 240, 25, 17, 3, 1, 248, 42, 2, + 159, 19, 215, 17, 3, 1, 248, 42, 2, 148, 19, 215, 17, 3, 1, 248, 42, 2, + 159, 19, 212, 17, 3, 1, 248, 42, 2, 148, 19, 212, 17, 3, 1, 248, 42, 2, + 159, 19, 232, 71, 17, 3, 1, 248, 42, 2, 148, 19, 232, 71, 17, 5, 1, 248, + 42, 2, 240, 29, 17, 5, 1, 248, 42, 2, 240, 25, 17, 5, 1, 248, 42, 2, 159, + 19, 215, 17, 5, 1, 248, 42, 2, 148, 19, 215, 17, 5, 1, 248, 42, 2, 159, + 19, 212, 17, 5, 1, 248, 42, 2, 148, 19, 212, 17, 5, 1, 248, 42, 2, 159, + 19, 232, 71, 17, 5, 1, 248, 42, 2, 148, 19, 232, 71, 17, 3, 1, 238, 64, + 2, 240, 29, 17, 3, 1, 238, 64, 2, 240, 25, 17, 3, 1, 238, 64, 2, 159, 19, + 215, 17, 3, 1, 238, 64, 2, 148, 19, 215, 17, 3, 1, 238, 64, 2, 159, 19, + 212, 17, 3, 1, 238, 64, 2, 148, 19, 212, 17, 5, 1, 238, 64, 2, 240, 29, + 17, 5, 1, 238, 64, 2, 240, 25, 17, 5, 1, 238, 64, 2, 159, 19, 215, 17, 5, + 1, 238, 64, 2, 148, 19, 215, 17, 5, 1, 238, 64, 2, 159, 19, 212, 17, 5, + 1, 238, 64, 2, 148, 19, 212, 17, 3, 1, 238, 53, 2, 240, 29, 17, 3, 1, + 238, 53, 2, 240, 25, 17, 3, 1, 238, 53, 2, 159, 19, 215, 17, 3, 1, 238, + 53, 2, 148, 19, 215, 17, 3, 1, 238, 53, 2, 159, 19, 212, 17, 3, 1, 238, + 53, 2, 148, 19, 212, 17, 3, 1, 238, 53, 2, 159, 19, 232, 71, 17, 3, 1, + 238, 53, 2, 148, 19, 232, 71, 17, 5, 1, 238, 53, 2, 240, 25, 17, 5, 1, + 238, 53, 2, 148, 19, 215, 17, 5, 1, 238, 53, 2, 148, 19, 212, 17, 5, 1, + 238, 53, 2, 148, 19, 232, 71, 17, 3, 1, 211, 2, 240, 29, 17, 3, 1, 211, + 2, 240, 25, 17, 3, 1, 211, 2, 159, 19, 215, 17, 3, 1, 211, 2, 148, 19, + 215, 17, 3, 1, 211, 2, 159, 19, 212, 17, 3, 1, 211, 2, 148, 19, 212, 17, + 3, 1, 211, 2, 159, 19, 232, 71, 17, 3, 1, 211, 2, 148, 19, 232, 71, 17, + 5, 1, 211, 2, 240, 29, 17, 5, 1, 211, 2, 240, 25, 17, 5, 1, 211, 2, 159, + 19, 215, 17, 5, 1, 211, 2, 148, 19, 215, 17, 5, 1, 211, 2, 159, 19, 212, + 17, 5, 1, 211, 2, 148, 19, 212, 17, 5, 1, 211, 2, 159, 19, 232, 71, 17, + 5, 1, 211, 2, 148, 19, 232, 71, 17, 3, 1, 194, 2, 215, 17, 3, 1, 194, 2, + 212, 17, 3, 1, 238, 57, 2, 215, 17, 3, 1, 238, 57, 2, 212, 17, 3, 1, 253, + 123, 2, 215, 17, 3, 1, 253, 123, 2, 212, 17, 3, 1, 248, 42, 2, 215, 17, + 3, 1, 248, 42, 2, 212, 17, 3, 1, 238, 64, 2, 215, 17, 3, 1, 238, 64, 2, + 212, 17, 3, 1, 238, 53, 2, 215, 17, 3, 1, 238, 53, 2, 212, 17, 3, 1, 211, + 2, 215, 17, 3, 1, 211, 2, 212, 17, 3, 1, 194, 2, 159, 19, 231, 35, 17, 3, + 1, 194, 2, 148, 19, 231, 35, 17, 3, 1, 194, 2, 159, 19, 242, 248, 19, + 231, 35, 17, 3, 1, 194, 2, 148, 19, 242, 248, 19, 231, 35, 17, 3, 1, 194, + 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, 194, 2, 148, 19, 248, 79, 19, + 231, 35, 17, 3, 1, 194, 2, 159, 19, 233, 53, 19, 231, 35, 17, 3, 1, 194, + 2, 148, 19, 233, 53, 19, 231, 35, 17, 5, 1, 194, 2, 159, 19, 229, 57, 17, + 5, 1, 194, 2, 148, 19, 229, 57, 17, 5, 1, 194, 2, 159, 19, 242, 248, 19, + 229, 57, 17, 5, 1, 194, 2, 148, 19, 242, 248, 19, 229, 57, 17, 5, 1, 194, + 2, 159, 19, 248, 79, 19, 229, 57, 17, 5, 1, 194, 2, 148, 19, 248, 79, 19, + 229, 57, 17, 5, 1, 194, 2, 159, 19, 233, 53, 19, 229, 57, 17, 5, 1, 194, + 2, 148, 19, 233, 53, 19, 229, 57, 17, 3, 1, 253, 123, 2, 159, 19, 231, + 35, 17, 3, 1, 253, 123, 2, 148, 19, 231, 35, 17, 3, 1, 253, 123, 2, 159, + 19, 242, 248, 19, 231, 35, 17, 3, 1, 253, 123, 2, 148, 19, 242, 248, 19, + 231, 35, 17, 3, 1, 253, 123, 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, + 253, 123, 2, 148, 19, 248, 79, 19, 231, 35, 17, 3, 1, 253, 123, 2, 159, + 19, 233, 53, 19, 231, 35, 17, 3, 1, 253, 123, 2, 148, 19, 233, 53, 19, + 231, 35, 17, 5, 1, 253, 123, 2, 159, 19, 229, 57, 17, 5, 1, 253, 123, 2, + 148, 19, 229, 57, 17, 5, 1, 253, 123, 2, 159, 19, 242, 248, 19, 229, 57, + 17, 5, 1, 253, 123, 2, 148, 19, 242, 248, 19, 229, 57, 17, 5, 1, 253, + 123, 2, 159, 19, 248, 79, 19, 229, 57, 17, 5, 1, 253, 123, 2, 148, 19, + 248, 79, 19, 229, 57, 17, 5, 1, 253, 123, 2, 159, 19, 233, 53, 19, 229, + 57, 17, 5, 1, 253, 123, 2, 148, 19, 233, 53, 19, 229, 57, 17, 3, 1, 211, + 2, 159, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 231, 35, 17, 3, 1, 211, + 2, 159, 19, 242, 248, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 242, 248, + 19, 231, 35, 17, 3, 1, 211, 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, + 211, 2, 148, 19, 248, 79, 19, 231, 35, 17, 3, 1, 211, 2, 159, 19, 233, + 53, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 233, 53, 19, 231, 35, 17, 5, + 1, 211, 2, 159, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, 229, 57, 17, 5, + 1, 211, 2, 159, 19, 242, 248, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, + 242, 248, 19, 229, 57, 17, 5, 1, 211, 2, 159, 19, 248, 79, 19, 229, 57, + 17, 5, 1, 211, 2, 148, 19, 248, 79, 19, 229, 57, 17, 5, 1, 211, 2, 159, + 19, 233, 53, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, 233, 53, 19, 229, + 57, 17, 3, 1, 194, 2, 238, 103, 17, 3, 1, 194, 2, 196, 17, 3, 1, 194, 2, + 242, 248, 19, 231, 35, 17, 3, 1, 194, 2, 231, 35, 17, 3, 1, 194, 2, 248, + 79, 19, 231, 35, 17, 3, 1, 194, 2, 232, 71, 17, 3, 1, 194, 2, 233, 53, + 19, 231, 35, 17, 5, 1, 194, 2, 238, 103, 17, 5, 1, 194, 2, 196, 17, 5, 1, + 194, 2, 215, 17, 5, 1, 194, 2, 212, 17, 5, 1, 194, 2, 229, 57, 17, 236, + 229, 17, 229, 57, 17, 240, 29, 17, 232, 71, 17, 235, 59, 19, 232, 71, 17, + 3, 1, 253, 123, 2, 242, 248, 19, 231, 35, 17, 3, 1, 253, 123, 2, 231, 35, + 17, 3, 1, 253, 123, 2, 248, 79, 19, 231, 35, 17, 3, 1, 253, 123, 2, 232, + 71, 17, 3, 1, 253, 123, 2, 233, 53, 19, 231, 35, 17, 5, 1, 238, 57, 2, + 215, 17, 5, 1, 238, 57, 2, 212, 17, 5, 1, 253, 123, 2, 215, 17, 5, 1, + 253, 123, 2, 212, 17, 5, 1, 253, 123, 2, 229, 57, 17, 159, 19, 215, 17, + 159, 19, 212, 17, 159, 19, 232, 71, 17, 3, 1, 248, 42, 2, 238, 103, 17, + 3, 1, 248, 42, 2, 196, 17, 3, 1, 248, 42, 2, 235, 59, 19, 215, 17, 3, 1, + 248, 42, 2, 235, 59, 19, 212, 17, 3, 1, 248, 42, 2, 232, 71, 17, 3, 1, + 248, 42, 2, 235, 59, 19, 232, 71, 17, 5, 1, 248, 42, 2, 238, 103, 17, 5, + 1, 248, 42, 2, 196, 17, 5, 1, 248, 42, 2, 215, 17, 5, 1, 248, 42, 2, 212, + 17, 148, 19, 215, 17, 148, 19, 212, 17, 148, 19, 232, 71, 17, 3, 1, 238, + 53, 2, 238, 103, 17, 3, 1, 238, 53, 2, 196, 17, 3, 1, 238, 53, 2, 235, + 59, 19, 215, 17, 3, 1, 238, 53, 2, 235, 59, 19, 212, 17, 3, 1, 253, 218, + 2, 240, 29, 17, 3, 1, 253, 218, 2, 240, 25, 17, 3, 1, 238, 53, 2, 232, + 71, 17, 3, 1, 238, 53, 2, 235, 59, 19, 232, 71, 17, 5, 1, 238, 53, 2, + 238, 103, 17, 5, 1, 238, 53, 2, 196, 17, 5, 1, 238, 53, 2, 215, 17, 5, 1, + 238, 53, 2, 212, 17, 5, 1, 253, 218, 2, 240, 25, 17, 235, 59, 19, 215, + 17, 235, 59, 19, 212, 17, 215, 17, 3, 1, 211, 2, 242, 248, 19, 231, 35, + 17, 3, 1, 211, 2, 231, 35, 17, 3, 1, 211, 2, 248, 79, 19, 231, 35, 17, 3, + 1, 211, 2, 232, 71, 17, 3, 1, 211, 2, 233, 53, 19, 231, 35, 17, 5, 1, + 238, 64, 2, 215, 17, 5, 1, 238, 64, 2, 212, 17, 5, 1, 211, 2, 215, 17, 5, + 1, 211, 2, 212, 17, 5, 1, 211, 2, 229, 57, 17, 212, 17, 240, 25, 255, 23, + 243, 43, 255, 28, 243, 43, 255, 23, 240, 15, 255, 28, 240, 15, 233, 42, + 240, 15, 233, 203, 240, 15, 235, 1, 240, 15, 240, 174, 240, 15, 233, 51, + 240, 15, 252, 219, 240, 15, 251, 46, 240, 15, 248, 145, 243, 81, 240, 15, + 248, 145, 243, 81, 233, 219, 248, 145, 243, 81, 238, 140, 231, 96, 69, + 231, 99, 69, 238, 93, 232, 188, 238, 93, 240, 174, 242, 235, 255, 23, + 242, 235, 255, 28, 242, 235, 163, 125, 45, 59, 242, 224, 45, 170, 242, + 224, 40, 240, 12, 235, 51, 69, 38, 240, 12, 235, 51, 69, 240, 12, 243, + 218, 235, 51, 69, 240, 12, 229, 62, 235, 51, 69, 40, 45, 235, 51, 69, 38, + 45, 235, 51, 69, 45, 243, 218, 235, 51, 69, 45, 229, 62, 235, 51, 69, + 238, 173, 45, 238, 173, 238, 69, 234, 43, 238, 69, 253, 125, 53, 238, + 143, 171, 53, 238, 143, 163, 235, 69, 233, 207, 240, 209, 248, 41, 234, + 6, 235, 91, 234, 6, 231, 96, 234, 52, 231, 99, 234, 52, 254, 227, 233, + 134, 233, 202, 231, 96, 235, 131, 231, 99, 235, 131, 241, 252, 236, 233, + 240, 15, 254, 68, 246, 85, 52, 254, 68, 253, 219, 236, 193, 52, 240, 57, + 45, 240, 57, 240, 3, 240, 57, 224, 240, 57, 224, 45, 240, 57, 224, 240, + 3, 240, 57, 240, 130, 240, 12, 231, 87, 185, 235, 51, 69, 240, 12, 231, + 36, 185, 235, 51, 69, 236, 90, 69, 45, 233, 54, 69, 232, 179, 235, 74, + 235, 158, 99, 248, 139, 243, 25, 235, 128, 240, 209, 235, 175, 241, 177, + 238, 69, 236, 155, 240, 37, 40, 31, 238, 52, 2, 240, 214, 38, 31, 238, + 52, 2, 240, 214, 45, 236, 156, 69, 236, 156, 233, 54, 69, 233, 54, 236, + 156, 69, 238, 30, 21, 254, 60, 224, 238, 208, 52, 86, 139, 238, 69, 86, + 77, 238, 69, 170, 235, 52, 224, 234, 14, 245, 24, 253, 176, 171, 235, + 174, 238, 243, 234, 0, 234, 20, 242, 250, 52, 247, 129, 242, 235, 236, + 145, 235, 158, 241, 111, 233, 51, 69, 204, 53, 232, 75, 235, 71, 240, 57, + 248, 58, 53, 232, 75, 248, 48, 53, 232, 75, 171, 53, 232, 75, 248, 58, + 53, 69, 240, 4, 240, 34, 236, 131, 59, 248, 58, 243, 5, 240, 19, 10, 240, + 15, 248, 143, 238, 140, 237, 163, 232, 116, 235, 129, 240, 123, 235, 129, + 234, 6, 238, 190, 235, 152, 235, 145, 236, 243, 235, 152, 235, 145, 238, + 190, 11, 248, 38, 237, 39, 236, 243, 11, 248, 38, 237, 39, 237, 216, 26, + 238, 215, 239, 146, 26, 238, 215, 233, 49, 242, 217, 233, 49, 8, 3, 1, + 71, 233, 49, 177, 233, 49, 176, 233, 49, 187, 233, 49, 203, 233, 49, 195, + 233, 49, 202, 233, 49, 248, 49, 52, 233, 49, 240, 68, 233, 49, 240, 7, + 52, 233, 49, 40, 232, 74, 233, 49, 38, 232, 74, 233, 49, 8, 3, 1, 197, + 235, 48, 242, 217, 235, 48, 127, 235, 48, 111, 235, 48, 166, 235, 48, + 177, 235, 48, 176, 235, 48, 187, 235, 48, 203, 235, 48, 195, 235, 48, + 202, 235, 48, 248, 49, 52, 235, 48, 240, 68, 235, 48, 240, 7, 52, 235, + 48, 40, 232, 74, 235, 48, 38, 232, 74, 8, 235, 48, 3, 1, 67, 8, 235, 48, + 3, 1, 72, 8, 235, 48, 3, 1, 73, 8, 235, 48, 3, 1, 206, 8, 235, 48, 3, 1, + 240, 86, 231, 137, 52, 243, 14, 52, 237, 96, 52, 241, 117, 245, 92, 52, + 251, 199, 52, 251, 234, 52, 246, 103, 52, 242, 58, 52, 243, 44, 52, 254, + 131, 52, 116, 242, 104, 52, 250, 203, 52, 250, 231, 52, 254, 185, 52, + 242, 162, 52, 238, 180, 52, 241, 127, 246, 241, 52, 252, 63, 52, 239, 86, + 52, 238, 254, 52, 239, 94, 52, 250, 153, 52, 50, 40, 186, 48, 50, 38, + 186, 48, 50, 183, 59, 248, 41, 236, 161, 50, 242, 215, 59, 248, 41, 236, + 161, 50, 231, 86, 65, 48, 50, 235, 62, 65, 48, 50, 40, 65, 48, 50, 38, + 65, 48, 50, 248, 51, 236, 161, 50, 235, 62, 248, 51, 236, 161, 50, 231, + 86, 248, 51, 236, 161, 50, 204, 181, 48, 50, 248, 58, 181, 48, 50, 235, + 73, 238, 51, 50, 235, 73, 238, 59, 50, 235, 73, 236, 164, 50, 235, 73, + 218, 234, 25, 50, 40, 38, 65, 48, 50, 235, 73, 239, 182, 50, 235, 73, + 239, 107, 50, 235, 73, 242, 172, 236, 150, 235, 46, 50, 238, 75, 238, 83, + 236, 161, 50, 45, 59, 240, 5, 236, 161, 50, 238, 245, 91, 50, 240, 3, + 236, 136, 50, 248, 98, 240, 109, 48, 50, 139, 65, 236, 161, 50, 183, 45, + 238, 83, 236, 161, 238, 158, 253, 174, 235, 160, 153, 253, 145, 238, 18, + 138, 5, 255, 18, 240, 112, 237, 85, 240, 46, 248, 41, 91, 250, 145, 253, + 174, 250, 142, 252, 251, 245, 87, 235, 118, 238, 3, 240, 112, 233, 200, + 84, 3, 210, 84, 5, 192, 232, 80, 5, 192, 138, 5, 192, 240, 208, 235, 118, + 240, 208, 237, 90, 248, 59, 171, 253, 147, 84, 5, 71, 232, 80, 5, 71, 84, + 5, 162, 84, 3, 162, 255, 100, 41, 253, 144, 91, 138, 5, 197, 242, 27, 52, + 243, 1, 236, 88, 234, 105, 84, 5, 223, 138, 5, 223, 138, 5, 255, 20, 84, + 5, 144, 232, 80, 5, 144, 138, 5, 144, 232, 198, 247, 136, 235, 141, 239, + 189, 69, 235, 113, 52, 247, 157, 158, 52, 236, 138, 138, 5, 255, 17, 246, + 235, 52, 254, 119, 52, 236, 145, 254, 119, 52, 232, 80, 5, 255, 17, 205, + 17, 3, 1, 242, 237, 241, 198, 52, 237, 60, 52, 84, 5, 217, 232, 80, 5, + 255, 18, 236, 14, 91, 84, 3, 72, 84, 5, 72, 84, 5, 255, 19, 205, 5, 255, + 19, 84, 5, 173, 84, 3, 73, 83, 91, 254, 53, 91, 243, 184, 91, 243, 162, + 91, 233, 211, 239, 199, 238, 120, 5, 255, 20, 236, 17, 52, 138, 3, 253, + 147, 138, 3, 240, 10, 138, 5, 240, 10, 138, 5, 253, 147, 138, 242, 238, + 234, 65, 205, 27, 5, 210, 205, 27, 5, 162, 224, 27, 5, 162, 205, 27, 5, + 255, 14, 138, 24, 5, 209, 138, 24, 3, 209, 138, 24, 3, 72, 138, 24, 3, + 71, 138, 24, 3, 221, 237, 244, 242, 224, 205, 234, 17, 254, 68, 52, 240, + 30, 236, 155, 253, 125, 242, 148, 240, 30, 236, 155, 171, 239, 220, 240, + 30, 236, 155, 253, 125, 241, 107, 240, 30, 236, 155, 171, 238, 138, 240, + 30, 236, 155, 204, 238, 138, 240, 30, 236, 155, 248, 58, 238, 138, 240, + 30, 236, 155, 253, 125, 242, 113, 240, 30, 236, 155, 248, 48, 239, 197, + 240, 30, 236, 155, 253, 125, 239, 55, 240, 30, 236, 155, 204, 236, 224, + 240, 30, 236, 155, 248, 48, 236, 224, 240, 30, 236, 155, 243, 31, 236, + 224, 236, 155, 235, 79, 127, 242, 218, 178, 127, 242, 218, 178, 111, 242, + 218, 178, 166, 242, 218, 178, 177, 242, 218, 178, 176, 242, 218, 178, + 187, 242, 218, 178, 203, 242, 218, 178, 195, 242, 218, 178, 202, 242, + 218, 178, 248, 53, 242, 218, 178, 238, 91, 242, 218, 178, 238, 97, 242, + 218, 178, 240, 50, 242, 218, 178, 253, 125, 236, 149, 242, 218, 178, 248, + 48, 236, 149, 242, 218, 178, 253, 125, 235, 49, 3, 242, 218, 178, 127, 3, + 242, 218, 178, 111, 3, 242, 218, 178, 166, 3, 242, 218, 178, 177, 3, 242, + 218, 178, 176, 3, 242, 218, 178, 187, 3, 242, 218, 178, 203, 3, 242, 218, + 178, 195, 3, 242, 218, 178, 202, 3, 242, 218, 178, 248, 53, 3, 242, 218, + 178, 238, 91, 3, 242, 218, 178, 238, 97, 3, 242, 218, 178, 240, 50, 3, + 242, 218, 178, 253, 125, 236, 149, 3, 242, 218, 178, 248, 48, 236, 149, + 3, 242, 218, 178, 253, 125, 235, 49, 242, 218, 178, 253, 125, 236, 193, + 255, 105, 209, 242, 218, 178, 248, 48, 235, 49, 242, 218, 178, 253, 219, + 235, 49, 242, 218, 178, 224, 253, 125, 236, 149, 139, 56, 226, 226, 56, + 77, 56, 235, 45, 56, 40, 38, 56, 88, 92, 56, 242, 223, 248, 56, 56, 242, + 223, 248, 43, 56, 242, 228, 248, 43, 56, 242, 228, 248, 56, 56, 139, 65, + 2, 108, 77, 65, 2, 108, 139, 248, 141, 56, 77, 248, 141, 56, 139, 171, + 240, 115, 56, 226, 226, 171, 240, 115, 56, 77, 171, 240, 115, 56, 235, + 45, 171, 240, 115, 56, 139, 65, 2, 242, 226, 77, 65, 2, 242, 226, 139, + 65, 248, 44, 125, 226, 226, 65, 248, 44, 125, 77, 65, 248, 44, 125, 235, + 45, 65, 248, 44, 125, 88, 92, 65, 2, 244, 192, 139, 65, 2, 90, 77, 65, 2, + 90, 139, 65, 2, 243, 105, 77, 65, 2, 243, 105, 40, 38, 248, 141, 56, 40, + 38, 65, 2, 108, 235, 45, 240, 126, 56, 226, 226, 65, 2, 253, 241, 234, + 18, 226, 226, 65, 2, 253, 241, 233, 63, 235, 45, 65, 2, 253, 241, 234, + 18, 235, 45, 65, 2, 253, 241, 233, 63, 77, 65, 2, 240, 31, 234, 9, 235, + 45, 65, 2, 240, 31, 234, 18, 231, 86, 253, 159, 234, 64, 56, 235, 62, + 253, 159, 234, 64, 56, 242, 223, 248, 56, 65, 153, 183, 125, 139, 65, + 153, 253, 144, 248, 59, 77, 65, 153, 125, 231, 86, 248, 35, 218, 56, 235, + 62, 248, 35, 218, 56, 139, 186, 2, 154, 236, 206, 139, 186, 2, 154, 234, + 9, 226, 226, 186, 2, 154, 233, 63, 226, 226, 186, 2, 154, 234, 18, 77, + 186, 2, 154, 236, 206, 77, 186, 2, 154, 234, 9, 235, 45, 186, 2, 154, + 233, 63, 235, 45, 186, 2, 154, 234, 18, 77, 65, 248, 59, 139, 56, 226, + 226, 65, 139, 147, 235, 45, 56, 139, 65, 248, 59, 77, 56, 139, 240, 117, + 238, 104, 226, 226, 240, 117, 238, 104, 77, 240, 117, 238, 104, 235, 45, + 240, 117, 238, 104, 139, 186, 248, 59, 77, 236, 175, 77, 186, 248, 59, + 139, 236, 175, 139, 45, 65, 2, 108, 40, 38, 45, 65, 2, 108, 77, 45, 65, + 2, 108, 139, 45, 56, 226, 226, 45, 56, 77, 45, 56, 235, 45, 45, 56, 40, + 38, 45, 56, 88, 92, 45, 56, 242, 223, 248, 56, 45, 56, 242, 223, 248, 43, + 45, 56, 242, 228, 248, 43, 45, 56, 242, 228, 248, 56, 45, 56, 139, 240, + 3, 56, 77, 240, 3, 56, 139, 236, 240, 56, 77, 236, 240, 56, 226, 226, 65, + 2, 45, 108, 235, 45, 65, 2, 45, 108, 139, 240, 55, 56, 226, 226, 240, 55, + 56, 77, 240, 55, 56, 235, 45, 240, 55, 56, 139, 65, 153, 125, 77, 65, + 153, 125, 139, 64, 56, 226, 226, 64, 56, 77, 64, 56, 235, 45, 64, 56, + 226, 226, 64, 65, 248, 44, 125, 226, 226, 64, 65, 255, 34, 235, 133, 226, + 226, 64, 65, 255, 34, 237, 28, 2, 163, 125, 226, 226, 64, 65, 255, 34, + 237, 28, 2, 59, 125, 226, 226, 64, 45, 56, 226, 226, 64, 45, 65, 255, 34, + 235, 133, 77, 64, 65, 248, 44, 247, 192, 242, 223, 248, 56, 65, 153, 238, + 67, 242, 228, 248, 43, 65, 153, 238, 67, 88, 92, 64, 56, 38, 65, 2, 3, + 238, 51, 235, 45, 65, 139, 147, 226, 226, 56, 204, 77, 238, 104, 139, 65, + 2, 59, 108, 77, 65, 2, 59, 108, 40, 38, 65, 2, 59, 108, 139, 65, 2, 45, + 59, 108, 77, 65, 2, 45, 59, 108, 40, 38, 65, 2, 45, 59, 108, 139, 233, + 72, 56, 77, 233, 72, 56, 40, 38, 233, 72, 56, 28, 249, 26, 233, 124, 238, + 100, 231, 90, 244, 29, 239, 58, 244, 29, 248, 86, 161, 241, 100, 243, 15, + 249, 160, 234, 205, 240, 79, 238, 68, 253, 174, 161, 255, 68, 238, 68, + 253, 174, 3, 238, 68, 253, 174, 236, 180, 255, 24, 238, 145, 248, 86, + 161, 238, 131, 255, 24, 238, 145, 3, 236, 180, 255, 24, 238, 145, 253, + 165, 147, 242, 66, 242, 238, 236, 170, 242, 238, 234, 50, 242, 238, 234, + 65, 242, 250, 52, 231, 148, 52, 53, 243, 12, 236, 196, 240, 37, 254, 30, + 240, 68, 236, 219, 235, 47, 248, 51, 235, 47, 241, 41, 235, 47, 31, 243, + 119, 250, 169, 243, 119, 240, 137, 243, 119, 232, 199, 87, 235, 101, 38, + 240, 54, 240, 54, 236, 168, 240, 54, 235, 109, 240, 54, 237, 112, 248, + 86, 161, 238, 177, 236, 200, 87, 161, 236, 200, 87, 238, 56, 248, 91, + 238, 56, 253, 227, 231, 88, 240, 58, 235, 60, 45, 235, 60, 240, 3, 235, + 60, 238, 132, 235, 60, 239, 210, 235, 60, 242, 180, 235, 60, 235, 62, + 235, 60, 235, 62, 238, 132, 235, 60, 231, 86, 238, 132, 235, 60, 235, 33, + 237, 74, 242, 78, 233, 96, 53, 240, 68, 239, 57, 236, 31, 233, 96, 233, + 206, 242, 219, 235, 47, 224, 169, 236, 145, 251, 187, 193, 252, 178, 243, + 80, 242, 186, 236, 170, 161, 169, 242, 250, 169, 231, 45, 95, 87, 161, + 231, 45, 95, 87, 231, 89, 95, 87, 231, 89, 253, 230, 161, 236, 244, 95, + 87, 238, 79, 231, 89, 253, 192, 236, 244, 95, 87, 240, 40, 95, 87, 161, + 240, 40, 95, 87, 240, 40, 95, 128, 95, 87, 240, 3, 169, 254, 51, 95, 87, + 234, 5, 87, 231, 105, 234, 5, 87, 234, 111, 236, 248, 234, 92, 253, 145, + 241, 216, 231, 105, 95, 87, 231, 89, 95, 153, 128, 253, 145, 243, 11, + 253, 174, 243, 11, 147, 128, 231, 89, 95, 87, 243, 14, 238, 113, 240, 7, + 240, 24, 248, 51, 255, 22, 95, 87, 248, 51, 95, 87, 233, 128, 87, 234, + 187, 233, 198, 87, 248, 135, 238, 113, 243, 92, 95, 87, 95, 153, 255, 25, + 233, 130, 236, 168, 254, 82, 234, 243, 95, 87, 161, 95, 87, 235, 89, 87, + 161, 235, 89, 87, 238, 17, 234, 5, 87, 235, 44, 128, 95, 87, 232, 68, + 128, 95, 87, 235, 44, 248, 59, 95, 87, 232, 68, 248, 59, 95, 87, 235, 44, + 253, 230, 161, 95, 87, 232, 68, 253, 230, 161, 95, 87, 248, 168, 234, 3, + 248, 168, 231, 85, 236, 248, 161, 234, 5, 87, 161, 234, 3, 161, 231, 85, + 238, 79, 235, 44, 253, 192, 95, 87, 238, 79, 232, 68, 253, 192, 95, 87, + 235, 44, 128, 234, 5, 87, 232, 68, 128, 234, 5, 87, 238, 79, 235, 44, + 253, 192, 234, 5, 87, 238, 79, 232, 68, 253, 192, 234, 5, 87, 235, 44, + 128, 231, 85, 232, 68, 128, 234, 3, 238, 79, 235, 44, 253, 192, 231, 85, + 238, 79, 232, 68, 253, 192, 234, 3, 235, 107, 235, 111, 236, 176, 128, + 95, 87, 236, 178, 128, 95, 87, 236, 176, 128, 234, 5, 87, 236, 178, 128, + 234, 5, 87, 248, 86, 161, 237, 240, 248, 86, 161, 238, 19, 240, 26, 253, + 174, 236, 154, 253, 174, 161, 134, 240, 26, 253, 174, 161, 134, 236, 154, + 253, 174, 240, 26, 147, 128, 95, 87, 236, 154, 147, 128, 95, 87, 238, 79, + 134, 240, 26, 147, 253, 192, 95, 87, 238, 79, 134, 236, 154, 147, 253, + 192, 95, 87, 240, 26, 147, 2, 161, 95, 87, 236, 154, 147, 2, 161, 95, 87, + 236, 62, 237, 24, 231, 26, 237, 24, 240, 58, 31, 243, 11, 253, 174, 31, + 236, 209, 253, 174, 31, 243, 11, 147, 128, 95, 87, 31, 236, 209, 147, + 128, 95, 87, 31, 249, 38, 31, 249, 43, 29, 243, 12, 29, 240, 68, 29, 240, + 123, 29, 236, 196, 240, 37, 29, 53, 235, 47, 29, 248, 51, 235, 47, 29, + 236, 219, 235, 47, 29, 238, 113, 29, 242, 235, 238, 84, 243, 12, 238, 84, + 240, 68, 238, 84, 240, 123, 238, 84, 53, 235, 47, 38, 242, 234, 40, 242, + 234, 92, 242, 234, 88, 242, 234, 234, 94, 239, 139, 244, 38, 239, 78, + 240, 3, 59, 253, 144, 38, 234, 15, 45, 59, 253, 144, 45, 38, 234, 15, + 248, 86, 161, 242, 67, 161, 244, 38, 248, 86, 161, 241, 114, 238, 203, + 45, 59, 253, 144, 45, 38, 234, 15, 236, 176, 244, 44, 235, 92, 236, 178, + 244, 44, 235, 92, 240, 52, 236, 203, 253, 174, 236, 180, 255, 24, 240, + 52, 235, 144, 240, 52, 236, 203, 147, 128, 95, 87, 236, 180, 255, 24, + 240, 52, 236, 203, 128, 95, 87, 236, 209, 253, 174, 243, 11, 253, 174, + 235, 103, 236, 35, 235, 193, 239, 130, 232, 178, 253, 49, 246, 104, 252, + 34, 38, 185, 2, 248, 113, 38, 235, 46, 242, 238, 238, 56, 248, 91, 242, + 238, 238, 56, 253, 227, 242, 238, 231, 88, 242, 238, 240, 58, 238, 76, + 235, 47, 53, 235, 47, 248, 135, 235, 47, 236, 196, 240, 123, 238, 168, + 40, 240, 52, 240, 173, 234, 21, 236, 170, 38, 240, 52, 240, 173, 234, 21, + 236, 170, 40, 234, 21, 236, 170, 38, 234, 21, 236, 170, 224, 242, 219, + 238, 113, 242, 225, 238, 56, 253, 227, 242, 225, 238, 56, 248, 91, 45, + 238, 87, 45, 235, 84, 45, 231, 88, 45, 240, 58, 234, 234, 95, 19, 236, + 200, 87, 235, 44, 2, 248, 40, 232, 68, 2, 248, 40, 249, 194, 248, 168, + 234, 3, 249, 194, 248, 168, 231, 85, 235, 44, 95, 153, 128, 231, 85, 232, + 68, 95, 153, 128, 234, 3, 95, 153, 128, 234, 3, 95, 153, 128, 231, 85, + 95, 153, 128, 235, 107, 95, 153, 128, 235, 111, 248, 86, 161, 239, 165, + 128, 240, 32, 248, 86, 161, 239, 209, 128, 240, 32, 161, 31, 243, 11, + 147, 128, 95, 87, 161, 31, 236, 209, 147, 128, 95, 87, 31, 243, 11, 147, + 128, 161, 95, 87, 31, 236, 209, 147, 128, 161, 95, 87, 235, 44, 253, 230, + 161, 234, 5, 87, 232, 68, 253, 230, 161, 234, 5, 87, 236, 176, 253, 230, + 161, 234, 5, 87, 236, 178, 253, 230, 161, 234, 5, 87, 161, 240, 52, 236, + 203, 253, 174, 248, 86, 161, 238, 131, 255, 24, 240, 52, 235, 144, 161, + 240, 52, 236, 203, 147, 128, 95, 87, 248, 86, 161, 238, 131, 255, 24, + 240, 52, 236, 203, 128, 240, 32, 59, 235, 69, 239, 136, 163, 235, 69, 88, + 38, 236, 159, 235, 69, 92, 38, 236, 159, 235, 69, 238, 68, 147, 2, 183, + 163, 108, 238, 68, 147, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, + 108, 3, 238, 68, 147, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, 108, + 238, 68, 147, 2, 53, 48, 238, 68, 147, 2, 236, 163, 3, 238, 68, 147, 2, + 236, 163, 238, 68, 147, 2, 235, 50, 238, 68, 147, 2, 171, 163, 237, 45, + 236, 180, 2, 183, 163, 108, 236, 180, 2, 59, 253, 144, 255, 31, 253, 165, + 147, 163, 108, 3, 236, 180, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, + 108, 236, 180, 2, 236, 163, 3, 236, 180, 2, 236, 163, 255, 97, 126, 254, + 52, 233, 217, 237, 105, 52, 237, 149, 56, 241, 168, 88, 234, 7, 92, 234, + 7, 233, 226, 232, 193, 248, 103, 242, 224, 40, 236, 251, 38, 236, 251, + 40, 240, 175, 38, 240, 175, 240, 17, 38, 243, 55, 240, 17, 40, 243, 55, + 253, 159, 38, 243, 55, 253, 159, 40, 243, 55, 224, 161, 52, 31, 236, 231, + 248, 113, 238, 4, 239, 187, 235, 113, 236, 87, 237, 239, 234, 30, 238, + 42, 238, 59, 243, 245, 147, 237, 181, 52, 205, 161, 52, 240, 252, 234, + 39, 253, 159, 40, 238, 67, 253, 159, 38, 238, 67, 240, 17, 40, 238, 67, + 240, 17, 38, 238, 67, 253, 159, 137, 235, 60, 240, 17, 137, 235, 60, 241, + 118, 242, 118, 88, 235, 76, 239, 7, 171, 163, 244, 191, 242, 42, 251, + 145, 243, 169, 153, 253, 145, 225, 255, 113, 255, 22, 134, 236, 89, 248, + 92, 236, 45, 231, 87, 185, 104, 231, 36, 185, 104, 243, 169, 153, 253, + 145, 242, 220, 239, 6, 242, 233, 231, 121, 254, 51, 229, 64, 236, 125, + 247, 156, 239, 175, 235, 205, 239, 154, 239, 31, 242, 141, 242, 116, 232, + 124, 232, 125, 141, 142, 12, 239, 96, 141, 142, 12, 242, 127, 243, 43, + 141, 142, 12, 248, 62, 240, 32, 141, 142, 12, 248, 62, 238, 177, 141, + 142, 12, 248, 62, 236, 164, 141, 142, 12, 248, 62, 248, 115, 141, 142, + 12, 248, 62, 238, 51, 141, 142, 12, 218, 240, 103, 141, 142, 12, 218, + 248, 115, 141, 142, 12, 247, 94, 125, 141, 142, 12, 235, 177, 125, 141, + 142, 12, 248, 62, 240, 37, 141, 142, 12, 248, 62, 234, 25, 141, 142, 12, + 248, 62, 234, 3, 141, 142, 12, 248, 62, 231, 85, 141, 142, 12, 139, 243, + 79, 141, 142, 12, 77, 243, 79, 141, 142, 12, 248, 62, 139, 56, 141, 142, + 12, 248, 62, 77, 56, 141, 142, 12, 218, 234, 25, 141, 142, 12, 92, 248, + 84, 235, 50, 141, 142, 12, 243, 92, 240, 103, 141, 142, 12, 248, 62, 92, + 240, 130, 141, 142, 12, 248, 62, 240, 28, 141, 142, 12, 92, 248, 84, 248, + 115, 141, 142, 12, 226, 226, 243, 79, 141, 142, 12, 248, 62, 226, 226, + 56, 141, 142, 12, 88, 248, 84, 236, 163, 141, 142, 12, 254, 56, 240, 103, + 141, 142, 12, 248, 62, 88, 240, 130, 141, 142, 12, 248, 62, 250, 189, + 141, 142, 12, 88, 248, 84, 248, 115, 141, 142, 12, 235, 45, 243, 79, 141, + 142, 12, 248, 62, 235, 45, 56, 141, 142, 12, 243, 249, 235, 50, 141, 142, + 12, 243, 92, 235, 50, 141, 142, 12, 238, 76, 235, 50, 141, 142, 12, 254, + 104, 235, 50, 141, 142, 12, 218, 235, 50, 141, 142, 12, 88, 248, 247, + 248, 115, 141, 142, 12, 243, 249, 243, 43, 141, 142, 12, 218, 242, 229, + 141, 142, 12, 248, 62, 240, 24, 141, 142, 12, 88, 248, 84, 175, 141, 142, + 12, 254, 56, 175, 141, 142, 12, 248, 135, 175, 141, 142, 12, 254, 104, + 175, 141, 142, 12, 218, 175, 141, 142, 12, 92, 248, 247, 240, 103, 141, + 142, 12, 40, 248, 247, 240, 103, 141, 142, 12, 242, 219, 175, 141, 142, + 12, 232, 68, 175, 141, 142, 12, 242, 244, 125, 141, 142, 12, 254, 56, + 169, 141, 142, 12, 242, 207, 141, 142, 12, 247, 122, 169, 141, 142, 12, + 236, 99, 235, 50, 141, 142, 12, 248, 62, 161, 240, 32, 141, 142, 12, 248, + 62, 236, 85, 141, 142, 12, 92, 243, 25, 169, 141, 142, 12, 88, 243, 25, + 169, 141, 142, 12, 242, 237, 141, 142, 12, 248, 73, 141, 142, 12, 240, + 20, 141, 142, 12, 194, 235, 50, 141, 142, 12, 238, 57, 235, 50, 141, 142, + 12, 248, 42, 235, 50, 141, 142, 12, 211, 235, 50, 141, 142, 12, 240, 22, + 161, 243, 53, 69, 38, 185, 2, 235, 45, 240, 126, 56, 235, 0, 248, 35, + 248, 92, 250, 114, 91, 59, 248, 41, 2, 240, 1, 248, 40, 235, 128, 91, + 234, 104, 235, 157, 91, 231, 128, 235, 157, 91, 237, 8, 91, 233, 126, 91, + 64, 31, 2, 240, 46, 59, 242, 224, 245, 82, 91, 233, 68, 254, 105, 91, + 251, 51, 91, 29, 163, 253, 144, 2, 242, 23, 29, 236, 152, 242, 236, 240, + 129, 218, 2, 236, 64, 56, 252, 252, 91, 234, 224, 91, 234, 201, 91, 226, + 236, 241, 143, 91, 226, 236, 241, 209, 91, 226, 227, 91, 226, 230, 91, + 240, 169, 239, 33, 12, 248, 38, 111, 227, 7, 91, 141, 142, 12, 243, 43, + 238, 176, 235, 95, 254, 105, 91, 237, 242, 243, 240, 252, 16, 243, 240, + 246, 254, 240, 218, 91, 245, 23, 240, 218, 91, 40, 233, 56, 189, 90, 40, + 233, 56, 234, 10, 40, 233, 56, 168, 90, 38, 233, 56, 189, 90, 38, 233, + 56, 234, 10, 38, 233, 56, 168, 90, 40, 31, 238, 52, 189, 238, 67, 40, 31, + 238, 52, 234, 10, 40, 31, 238, 52, 168, 238, 67, 38, 31, 238, 52, 189, + 238, 67, 38, 31, 238, 52, 234, 10, 38, 31, 238, 52, 168, 238, 67, 40, + 242, 225, 238, 52, 189, 90, 40, 242, 225, 238, 52, 240, 1, 240, 119, 40, + 242, 225, 238, 52, 168, 90, 242, 225, 238, 52, 234, 10, 38, 242, 225, + 238, 52, 189, 90, 38, 242, 225, 238, 52, 240, 1, 240, 119, 38, 242, 225, + 238, 52, 168, 90, 236, 167, 234, 10, 163, 248, 41, 234, 10, 189, 40, 128, + 168, 38, 242, 225, 238, 52, 236, 210, 189, 38, 128, 168, 40, 242, 225, + 238, 52, 236, 210, 235, 112, 249, 3, 235, 112, 238, 128, 253, 159, 31, + 104, 240, 17, 31, 104, 240, 17, 31, 238, 52, 248, 59, 253, 159, 31, 104, + 25, 12, 238, 128, 40, 59, 66, 242, 224, 38, 59, 66, 242, 224, 163, 248, + 183, 239, 119, 163, 248, 183, 239, 120, 163, 248, 183, 239, 121, 163, + 248, 183, 239, 122, 235, 58, 12, 136, 59, 19, 253, 159, 225, 235, 58, 12, + 136, 59, 19, 240, 17, 225, 235, 58, 12, 136, 59, 2, 238, 51, 235, 58, 12, + 136, 92, 19, 163, 2, 238, 51, 235, 58, 12, 136, 88, 19, 163, 2, 238, 51, + 235, 58, 12, 136, 59, 2, 235, 46, 235, 58, 12, 136, 92, 19, 163, 2, 235, + 46, 235, 58, 12, 136, 88, 19, 163, 2, 235, 46, 235, 58, 12, 136, 59, 19, + 243, 80, 235, 58, 12, 136, 92, 19, 163, 2, 243, 80, 235, 58, 12, 136, 88, + 19, 163, 2, 243, 80, 235, 58, 12, 136, 92, 19, 233, 50, 235, 58, 12, 136, + 88, 19, 233, 50, 235, 58, 12, 136, 59, 19, 253, 159, 242, 220, 235, 58, + 12, 136, 59, 19, 240, 17, 242, 220, 31, 243, 94, 242, 80, 91, 245, 81, + 91, 59, 248, 41, 234, 10, 236, 183, 239, 255, 236, 183, 183, 248, 59, + 242, 108, 236, 183, 242, 215, 248, 59, 243, 66, 236, 183, 183, 248, 59, + 171, 239, 194, 236, 183, 171, 240, 228, 248, 59, 243, 66, 236, 183, 171, + 240, 228, 239, 103, 236, 183, 237, 49, 236, 183, 234, 82, 236, 183, 234, + 62, 243, 168, 239, 85, 245, 94, 12, 28, 246, 193, 12, 28, 243, 124, 147, + 237, 173, 12, 28, 243, 124, 147, 244, 28, 12, 28, 253, 165, 147, 244, 28, + 12, 28, 253, 165, 147, 232, 62, 12, 28, 237, 150, 12, 28, 232, 103, 12, + 28, 244, 215, 12, 28, 234, 96, 12, 28, 163, 233, 107, 12, 28, 248, 41, + 243, 171, 12, 28, 59, 233, 107, 12, 28, 248, 38, 243, 171, 12, 28, 237, + 84, 238, 211, 12, 28, 244, 11, 248, 235, 12, 28, 244, 11, 253, 247, 12, + 28, 250, 185, 251, 197, 238, 183, 12, 28, 240, 113, 238, 110, 127, 12, + 28, 240, 113, 238, 110, 111, 12, 28, 240, 113, 238, 110, 166, 12, 28, + 240, 113, 238, 110, 177, 12, 28, 236, 146, 232, 103, 12, 28, 233, 250, + 245, 224, 12, 28, 253, 165, 147, 233, 44, 240, 13, 12, 28, 239, 16, 12, + 28, 253, 165, 147, 239, 132, 12, 28, 233, 249, 12, 28, 238, 183, 12, 28, + 250, 244, 234, 6, 12, 28, 245, 128, 234, 6, 12, 28, 242, 79, 234, 6, 12, + 28, 252, 253, 234, 6, 12, 28, 240, 15, 12, 28, 239, 39, 244, 224, 91, + 248, 35, 248, 92, 12, 28, 237, 219, 12, 28, 241, 81, 248, 38, 111, 12, + 28, 235, 5, 248, 38, 111, 253, 207, 90, 253, 207, 241, 50, 253, 207, 243, + 175, 253, 207, 236, 145, 243, 175, 253, 207, 250, 115, 239, 15, 253, 207, + 254, 146, 248, 139, 253, 207, 241, 36, 250, 102, 229, 67, 253, 207, 241, + 9, 147, 240, 162, 253, 207, 242, 235, 253, 207, 237, 97, 238, 158, 239, + 147, 253, 207, 45, 234, 25, 29, 26, 127, 29, 26, 111, 29, 26, 166, 29, + 26, 177, 29, 26, 176, 29, 26, 187, 29, 26, 203, 29, 26, 195, 29, 26, 202, + 29, 61, 248, 53, 29, 61, 238, 91, 29, 61, 238, 97, 29, 61, 235, 85, 29, + 61, 235, 82, 29, 61, 236, 207, 29, 61, 236, 202, 29, 61, 234, 22, 29, 61, + 235, 81, 29, 61, 235, 83, 29, 61, 238, 77, 82, 26, 127, 82, 26, 111, 82, + 26, 166, 82, 26, 177, 82, 26, 176, 82, 26, 187, 82, 26, 203, 82, 26, 195, + 82, 26, 202, 82, 61, 248, 53, 82, 61, 238, 91, 82, 61, 238, 97, 82, 61, + 235, 85, 82, 61, 235, 82, 82, 61, 236, 207, 82, 61, 236, 202, 82, 61, + 234, 22, 82, 61, 235, 81, 82, 61, 235, 83, 82, 61, 238, 77, 26, 253, 125, + 248, 37, 208, 26, 171, 248, 37, 208, 26, 204, 248, 37, 208, 26, 248, 58, + 248, 37, 208, 26, 248, 48, 248, 37, 208, 26, 254, 31, 248, 37, 208, 26, + 243, 31, 248, 37, 208, 26, 242, 254, 248, 37, 208, 26, 248, 173, 248, 37, + 208, 61, 253, 219, 248, 37, 208, 61, 241, 93, 248, 37, 208, 61, 240, 251, + 248, 37, 208, 61, 238, 26, 248, 37, 208, 61, 237, 161, 248, 37, 208, 61, + 239, 70, 248, 37, 208, 61, 238, 216, 248, 37, 208, 61, 236, 100, 248, 37, + 208, 61, 237, 147, 248, 37, 208, 61, 237, 222, 248, 37, 208, 61, 240, 48, + 248, 37, 208, 82, 8, 3, 1, 67, 82, 8, 3, 1, 217, 82, 8, 3, 1, 255, 18, + 82, 8, 3, 1, 209, 82, 8, 3, 1, 72, 82, 8, 3, 1, 255, 19, 82, 8, 3, 1, + 210, 82, 8, 3, 1, 192, 82, 8, 3, 1, 71, 82, 8, 3, 1, 221, 82, 8, 3, 1, + 255, 15, 82, 8, 3, 1, 162, 82, 8, 3, 1, 173, 82, 8, 3, 1, 197, 82, 8, 3, + 1, 73, 82, 8, 3, 1, 223, 82, 8, 3, 1, 255, 20, 82, 8, 3, 1, 144, 82, 8, + 3, 1, 193, 82, 8, 3, 1, 214, 82, 8, 3, 1, 79, 82, 8, 3, 1, 179, 82, 8, 3, + 1, 255, 16, 82, 8, 3, 1, 206, 82, 8, 3, 1, 255, 14, 82, 8, 3, 1, 255, 17, + 29, 8, 5, 1, 67, 29, 8, 5, 1, 217, 29, 8, 5, 1, 255, 18, 29, 8, 5, 1, + 209, 29, 8, 5, 1, 72, 29, 8, 5, 1, 255, 19, 29, 8, 5, 1, 210, 29, 8, 5, + 1, 192, 29, 8, 5, 1, 71, 29, 8, 5, 1, 221, 29, 8, 5, 1, 255, 15, 29, 8, + 5, 1, 162, 29, 8, 5, 1, 173, 29, 8, 5, 1, 197, 29, 8, 5, 1, 73, 29, 8, 5, + 1, 223, 29, 8, 5, 1, 255, 20, 29, 8, 5, 1, 144, 29, 8, 5, 1, 193, 29, 8, + 5, 1, 214, 29, 8, 5, 1, 79, 29, 8, 5, 1, 179, 29, 8, 5, 1, 255, 16, 29, + 8, 5, 1, 206, 29, 8, 5, 1, 255, 14, 29, 8, 5, 1, 255, 17, 29, 8, 3, 1, + 67, 29, 8, 3, 1, 217, 29, 8, 3, 1, 255, 18, 29, 8, 3, 1, 209, 29, 8, 3, + 1, 72, 29, 8, 3, 1, 255, 19, 29, 8, 3, 1, 210, 29, 8, 3, 1, 192, 29, 8, + 3, 1, 71, 29, 8, 3, 1, 221, 29, 8, 3, 1, 255, 15, 29, 8, 3, 1, 162, 29, + 8, 3, 1, 173, 29, 8, 3, 1, 197, 29, 8, 3, 1, 73, 29, 8, 3, 1, 223, 29, 8, + 3, 1, 255, 20, 29, 8, 3, 1, 144, 29, 8, 3, 1, 193, 29, 8, 3, 1, 214, 29, + 8, 3, 1, 79, 29, 8, 3, 1, 179, 29, 8, 3, 1, 255, 16, 29, 8, 3, 1, 206, + 29, 8, 3, 1, 255, 14, 29, 8, 3, 1, 255, 17, 29, 26, 242, 217, 236, 146, + 29, 61, 238, 91, 236, 146, 29, 61, 238, 97, 236, 146, 29, 61, 235, 85, + 236, 146, 29, 61, 235, 82, 236, 146, 29, 61, 236, 207, 236, 146, 29, 61, + 236, 202, 236, 146, 29, 61, 234, 22, 236, 146, 29, 61, 235, 81, 236, 146, + 29, 61, 235, 83, 236, 146, 29, 61, 238, 77, 45, 29, 26, 127, 45, 29, 26, + 111, 45, 29, 26, 166, 45, 29, 26, 177, 45, 29, 26, 176, 45, 29, 26, 187, + 45, 29, 26, 203, 45, 29, 26, 195, 45, 29, 26, 202, 45, 29, 61, 248, 53, + 236, 146, 29, 26, 242, 217, 66, 70, 136, 233, 50, 66, 70, 96, 233, 50, + 66, 70, 136, 235, 63, 66, 70, 96, 235, 63, 66, 70, 136, 240, 3, 248, 63, + 233, 50, 66, 70, 96, 240, 3, 248, 63, 233, 50, 66, 70, 136, 240, 3, 248, + 63, 235, 63, 66, 70, 96, 240, 3, 248, 63, 235, 63, 66, 70, 136, 235, 71, + 248, 63, 233, 50, 66, 70, 96, 235, 71, 248, 63, 233, 50, 66, 70, 136, + 235, 71, 248, 63, 235, 63, 66, 70, 96, 235, 71, 248, 63, 235, 63, 66, 70, + 136, 92, 19, 225, 66, 70, 92, 136, 19, 38, 240, 11, 66, 70, 92, 96, 19, + 38, 240, 9, 66, 70, 96, 92, 19, 225, 66, 70, 136, 92, 19, 242, 220, 66, + 70, 92, 136, 19, 40, 240, 11, 66, 70, 92, 96, 19, 40, 240, 9, 66, 70, 96, + 92, 19, 242, 220, 66, 70, 136, 88, 19, 225, 66, 70, 88, 136, 19, 38, 240, + 11, 66, 70, 88, 96, 19, 38, 240, 9, 66, 70, 96, 88, 19, 225, 66, 70, 136, + 88, 19, 242, 220, 66, 70, 88, 136, 19, 40, 240, 11, 66, 70, 88, 96, 19, + 40, 240, 9, 66, 70, 96, 88, 19, 242, 220, 66, 70, 136, 59, 19, 225, 66, + 70, 59, 136, 19, 38, 240, 11, 66, 70, 88, 96, 19, 38, 92, 240, 9, 66, 70, + 92, 96, 19, 38, 88, 240, 9, 66, 70, 59, 96, 19, 38, 240, 9, 66, 70, 92, + 136, 19, 38, 88, 240, 11, 66, 70, 88, 136, 19, 38, 92, 240, 11, 66, 70, + 96, 59, 19, 225, 66, 70, 136, 59, 19, 242, 220, 66, 70, 59, 136, 19, 40, + 240, 11, 66, 70, 88, 96, 19, 40, 92, 240, 9, 66, 70, 92, 96, 19, 40, 88, + 240, 9, 66, 70, 59, 96, 19, 40, 240, 9, 66, 70, 92, 136, 19, 40, 88, 240, + 11, 66, 70, 88, 136, 19, 40, 92, 240, 11, 66, 70, 96, 59, 19, 242, 220, + 66, 70, 136, 92, 19, 233, 50, 66, 70, 40, 96, 19, 38, 92, 240, 9, 66, 70, + 38, 96, 19, 40, 92, 240, 9, 66, 70, 92, 136, 19, 163, 240, 11, 66, 70, + 92, 96, 19, 163, 240, 9, 66, 70, 38, 136, 19, 40, 92, 240, 11, 66, 70, + 40, 136, 19, 38, 92, 240, 11, 66, 70, 96, 92, 19, 233, 50, 66, 70, 136, + 88, 19, 233, 50, 66, 70, 40, 96, 19, 38, 88, 240, 9, 66, 70, 38, 96, 19, + 40, 88, 240, 9, 66, 70, 88, 136, 19, 163, 240, 11, 66, 70, 88, 96, 19, + 163, 240, 9, 66, 70, 38, 136, 19, 40, 88, 240, 11, 66, 70, 40, 136, 19, + 38, 88, 240, 11, 66, 70, 96, 88, 19, 233, 50, 66, 70, 136, 59, 19, 233, + 50, 66, 70, 40, 96, 19, 38, 59, 240, 9, 66, 70, 38, 96, 19, 40, 59, 240, + 9, 66, 70, 59, 136, 19, 163, 240, 11, 66, 70, 88, 96, 19, 92, 163, 240, + 9, 66, 70, 92, 96, 19, 88, 163, 240, 9, 66, 70, 59, 96, 19, 163, 240, 9, + 66, 70, 40, 88, 96, 19, 38, 92, 240, 9, 66, 70, 38, 88, 96, 19, 40, 92, + 240, 9, 66, 70, 40, 92, 96, 19, 38, 88, 240, 9, 66, 70, 38, 92, 96, 19, + 40, 88, 240, 9, 66, 70, 92, 136, 19, 88, 163, 240, 11, 66, 70, 88, 136, + 19, 92, 163, 240, 11, 66, 70, 38, 136, 19, 40, 59, 240, 11, 66, 70, 40, + 136, 19, 38, 59, 240, 11, 66, 70, 96, 59, 19, 233, 50, 66, 70, 136, 45, + 248, 63, 233, 50, 66, 70, 96, 45, 248, 63, 233, 50, 66, 70, 136, 45, 248, + 63, 235, 63, 66, 70, 96, 45, 248, 63, 235, 63, 66, 70, 45, 233, 50, 66, + 70, 45, 235, 63, 66, 70, 92, 240, 12, 19, 38, 238, 78, 66, 70, 92, 45, + 19, 38, 238, 82, 66, 70, 45, 92, 19, 225, 66, 70, 92, 240, 12, 19, 40, + 238, 78, 66, 70, 92, 45, 19, 40, 238, 82, 66, 70, 45, 92, 19, 242, 220, + 66, 70, 88, 240, 12, 19, 38, 238, 78, 66, 70, 88, 45, 19, 38, 238, 82, + 66, 70, 45, 88, 19, 225, 66, 70, 88, 240, 12, 19, 40, 238, 78, 66, 70, + 88, 45, 19, 40, 238, 82, 66, 70, 45, 88, 19, 242, 220, 66, 70, 59, 240, + 12, 19, 38, 238, 78, 66, 70, 59, 45, 19, 38, 238, 82, 66, 70, 45, 59, 19, + 225, 66, 70, 59, 240, 12, 19, 40, 238, 78, 66, 70, 59, 45, 19, 40, 238, + 82, 66, 70, 45, 59, 19, 242, 220, 66, 70, 92, 240, 12, 19, 163, 238, 78, + 66, 70, 92, 45, 19, 163, 238, 82, 66, 70, 45, 92, 19, 233, 50, 66, 70, + 88, 240, 12, 19, 163, 238, 78, 66, 70, 88, 45, 19, 163, 238, 82, 66, 70, + 45, 88, 19, 233, 50, 66, 70, 59, 240, 12, 19, 163, 238, 78, 66, 70, 59, + 45, 19, 163, 238, 82, 66, 70, 45, 59, 19, 233, 50, 66, 70, 136, 253, 183, + 92, 19, 225, 66, 70, 136, 253, 183, 92, 19, 242, 220, 66, 70, 136, 253, + 183, 88, 19, 242, 220, 66, 70, 136, 253, 183, 88, 19, 225, 66, 70, 136, + 236, 159, 189, 38, 153, 168, 242, 220, 66, 70, 136, 236, 159, 189, 40, + 153, 168, 225, 66, 70, 136, 236, 159, 240, 34, 66, 70, 136, 242, 220, 66, + 70, 136, 253, 176, 66, 70, 136, 225, 66, 70, 136, 242, 236, 66, 70, 96, + 242, 220, 66, 70, 96, 253, 176, 66, 70, 96, 225, 66, 70, 96, 242, 236, + 66, 70, 136, 40, 19, 96, 225, 66, 70, 136, 88, 19, 96, 242, 236, 66, 70, + 96, 40, 19, 136, 225, 66, 70, 96, 88, 19, 136, 242, 236, 189, 137, 240, + 13, 168, 253, 125, 240, 62, 240, 13, 168, 253, 125, 238, 80, 240, 13, + 168, 204, 238, 98, 240, 13, 168, 137, 240, 13, 168, 248, 48, 238, 98, + 240, 13, 168, 204, 236, 236, 240, 13, 168, 243, 31, 238, 98, 240, 13, + 248, 37, 240, 13, 40, 243, 31, 238, 98, 240, 13, 40, 204, 236, 236, 240, + 13, 40, 248, 48, 238, 98, 240, 13, 40, 137, 240, 13, 40, 204, 238, 98, + 240, 13, 40, 253, 125, 238, 80, 240, 13, 40, 253, 125, 240, 62, 240, 13, + 38, 137, 240, 13, 136, 240, 146, 240, 19, 240, 146, 250, 183, 240, 146, + 189, 253, 125, 240, 62, 240, 13, 38, 253, 125, 240, 62, 240, 13, 236, + 158, 168, 242, 220, 236, 158, 168, 225, 236, 158, 189, 242, 220, 236, + 158, 189, 40, 19, 168, 40, 19, 168, 225, 236, 158, 189, 40, 19, 168, 225, + 236, 158, 189, 40, 19, 189, 38, 19, 168, 242, 220, 236, 158, 189, 40, 19, + 189, 38, 19, 168, 225, 236, 158, 189, 225, 236, 158, 189, 38, 19, 168, + 242, 220, 236, 158, 189, 38, 19, 168, 40, 19, 168, 225, 86, 238, 59, 64, + 238, 59, 64, 31, 2, 238, 121, 237, 0, 64, 31, 234, 34, 86, 3, 238, 59, + 31, 2, 163, 243, 19, 31, 2, 59, 243, 19, 31, 2, 234, 230, 234, 51, 243, + 19, 31, 2, 189, 40, 153, 168, 38, 243, 19, 31, 2, 189, 38, 153, 168, 40, + 243, 19, 31, 2, 236, 159, 234, 51, 243, 19, 86, 3, 238, 59, 64, 3, 238, + 59, 86, 234, 31, 64, 234, 31, 86, 59, 234, 31, 64, 59, 234, 31, 86, 231, + 48, 64, 231, 48, 86, 233, 60, 235, 46, 64, 233, 60, 235, 46, 86, 233, 60, + 3, 235, 46, 64, 233, 60, 3, 235, 46, 86, 231, 36, 235, 46, 64, 231, 36, + 235, 46, 86, 231, 36, 3, 235, 46, 64, 231, 36, 3, 235, 46, 86, 231, 36, + 236, 217, 64, 231, 36, 236, 217, 86, 231, 91, 235, 46, 64, 231, 91, 235, + 46, 86, 231, 91, 3, 235, 46, 64, 231, 91, 3, 235, 46, 86, 231, 87, 235, + 46, 64, 231, 87, 235, 46, 86, 231, 87, 3, 235, 46, 64, 231, 87, 3, 235, + 46, 86, 231, 87, 236, 217, 64, 231, 87, 236, 217, 86, 236, 164, 64, 236, + 164, 64, 238, 76, 234, 34, 86, 3, 236, 164, 237, 157, 236, 231, 64, 238, + 51, 240, 4, 238, 51, 218, 2, 59, 243, 19, 235, 183, 86, 238, 51, 218, 2, + 40, 137, 240, 0, 218, 2, 38, 137, 240, 0, 218, 2, 168, 137, 240, 0, 218, + 2, 189, 137, 240, 0, 218, 2, 189, 38, 236, 158, 240, 0, 218, 2, 254, 51, + 253, 230, 189, 40, 236, 158, 240, 0, 40, 137, 86, 238, 51, 38, 137, 86, + 238, 51, 238, 116, 238, 69, 238, 116, 64, 238, 51, 189, 137, 238, 116, + 64, 238, 51, 168, 137, 238, 116, 64, 238, 51, 189, 40, 236, 158, 236, + 211, 248, 113, 189, 38, 236, 158, 236, 211, 248, 113, 168, 38, 236, 158, + 236, 211, 248, 113, 168, 40, 236, 158, 236, 211, 248, 113, 189, 137, 238, + 51, 168, 137, 238, 51, 86, 168, 38, 235, 46, 86, 168, 40, 235, 46, 86, + 189, 40, 235, 46, 86, 189, 38, 235, 46, 64, 238, 69, 31, 2, 40, 137, 240, + 0, 31, 2, 38, 137, 240, 0, 31, 2, 189, 40, 236, 159, 137, 240, 0, 31, 2, + 168, 38, 236, 159, 137, 240, 0, 64, 31, 2, 59, 235, 180, 242, 224, 64, + 233, 60, 236, 152, 2, 248, 40, 233, 60, 236, 152, 2, 40, 137, 240, 0, + 233, 60, 236, 152, 2, 38, 137, 240, 0, 243, 22, 238, 51, 64, 31, 2, 189, + 40, 235, 70, 64, 31, 2, 168, 40, 235, 70, 64, 31, 2, 168, 38, 235, 70, + 64, 31, 2, 189, 38, 235, 70, 64, 218, 2, 189, 40, 235, 70, 64, 218, 2, + 168, 40, 235, 70, 64, 218, 2, 168, 38, 235, 70, 64, 218, 2, 189, 38, 235, + 70, 189, 40, 235, 46, 189, 38, 235, 46, 168, 40, 235, 46, 64, 240, 19, + 238, 59, 86, 240, 19, 238, 59, 64, 240, 19, 3, 238, 59, 86, 240, 19, 3, + 238, 59, 168, 38, 235, 46, 86, 254, 126, 2, 243, 251, 241, 61, 236, 135, + 238, 9, 241, 64, 86, 242, 229, 64, 242, 229, 234, 219, 232, 60, 248, 136, + 235, 172, 243, 235, 234, 110, 243, 235, 232, 120, 233, 73, 86, 234, 81, + 64, 234, 81, 240, 91, 248, 92, 240, 91, 66, 2, 240, 162, 240, 91, 66, 2, + 206, 237, 255, 238, 38, 2, 252, 128, 241, 90, 254, 96, 235, 178, 64, 244, + 12, 240, 119, 86, 244, 12, 240, 119, 236, 101, 224, 238, 120, 240, 135, + 243, 16, 238, 69, 86, 40, 236, 150, 240, 76, 86, 38, 236, 150, 240, 76, + 64, 40, 236, 150, 240, 76, 64, 88, 236, 150, 240, 76, 64, 38, 236, 150, + 240, 76, 64, 92, 236, 150, 240, 76, 247, 92, 19, 233, 129, 239, 19, 52, + 233, 227, 52, 235, 179, 52, 235, 185, 244, 81, 237, 228, 240, 34, 254, + 83, 248, 73, 243, 38, 147, 236, 53, 243, 38, 147, 234, 210, 248, 135, 19, + 235, 196, 243, 26, 91, 254, 139, 239, 192, 240, 185, 19, 239, 196, 246, + 239, 91, 254, 15, 243, 50, 238, 89, 28, 238, 139, 238, 89, 28, 243, 213, + 238, 89, 28, 243, 27, 238, 89, 28, 237, 48, 238, 89, 28, 243, 82, 238, + 89, 28, 240, 105, 238, 89, 28, 235, 102, 238, 89, 28, 240, 49, 247, 195, + 147, 239, 42, 64, 237, 162, 243, 39, 64, 238, 219, 243, 39, 86, 238, 219, + 243, 39, 64, 254, 126, 2, 243, 251, 243, 41, 238, 80, 243, 30, 251, 184, + 238, 80, 243, 30, 237, 208, 240, 96, 52, 240, 49, 248, 95, 52, 237, 185, + 239, 180, 239, 236, 237, 218, 242, 62, 241, 15, 239, 215, 239, 81, 239, + 17, 251, 188, 242, 179, 241, 215, 236, 98, 232, 203, 234, 99, 235, 167, + 239, 163, 64, 242, 252, 243, 208, 64, 242, 252, 240, 213, 64, 242, 252, + 244, 0, 64, 242, 252, 238, 167, 64, 242, 252, 238, 196, 64, 242, 252, + 243, 241, 86, 242, 252, 243, 208, 86, 242, 252, 240, 213, 86, 242, 252, + 244, 0, 86, 242, 252, 238, 167, 86, 242, 252, 238, 196, 86, 242, 252, + 243, 241, 86, 244, 22, 243, 17, 64, 243, 16, 243, 17, 64, 238, 76, 243, + 17, 86, 249, 41, 243, 17, 64, 244, 22, 243, 17, 86, 243, 16, 243, 17, 86, + 238, 76, 243, 17, 64, 249, 41, 243, 17, 254, 96, 238, 11, 238, 80, 243, + 9, 240, 62, 243, 9, 240, 157, 240, 62, 240, 203, 240, 157, 235, 108, 240, + 203, 243, 108, 248, 209, 52, 243, 108, 238, 146, 52, 243, 108, 243, 74, + 52, 248, 56, 129, 240, 34, 248, 43, 129, 240, 34, 235, 159, 235, 65, 91, + 235, 65, 12, 28, 242, 164, 235, 75, 235, 65, 12, 28, 242, 165, 235, 75, + 235, 65, 12, 28, 242, 166, 235, 75, 235, 65, 12, 28, 242, 167, 235, 75, + 235, 65, 12, 28, 242, 168, 235, 75, 235, 65, 12, 28, 242, 169, 235, 75, + 235, 65, 12, 28, 242, 170, 235, 75, 235, 65, 12, 28, 239, 82, 234, 221, + 86, 235, 159, 235, 65, 91, 237, 249, 243, 113, 91, 226, 250, 243, 113, + 91, 236, 74, 243, 113, 52, 235, 41, 91, 254, 2, 239, 60, 254, 2, 239, 61, + 254, 2, 239, 62, 254, 2, 239, 63, 254, 2, 239, 64, 254, 2, 239, 65, 64, + 218, 2, 53, 225, 64, 218, 2, 171, 243, 5, 86, 218, 2, 64, 53, 225, 86, + 218, 2, 171, 64, 243, 5, 236, 184, 28, 243, 50, 236, 184, 28, 249, 23, + 240, 56, 28, 238, 188, 243, 50, 240, 56, 28, 240, 198, 249, 23, 240, 56, + 28, 240, 198, 243, 50, 240, 56, 28, 238, 188, 249, 23, 64, 243, 173, 86, + 243, 173, 240, 185, 19, 246, 248, 238, 159, 238, 133, 239, 211, 244, 24, + 147, 232, 113, 239, 181, 237, 58, 239, 77, 245, 98, 244, 24, 147, 239, + 92, 249, 242, 91, 231, 138, 239, 246, 52, 200, 239, 245, 52, 238, 179, + 240, 96, 52, 238, 179, 248, 95, 52, 233, 212, 240, 96, 19, 248, 95, 52, + 248, 95, 19, 240, 96, 52, 248, 95, 2, 240, 5, 52, 248, 95, 2, 240, 5, 19, + 248, 95, 19, 240, 96, 52, 59, 248, 95, 2, 240, 5, 52, 163, 248, 95, 2, + 240, 5, 52, 240, 19, 64, 238, 51, 240, 19, 86, 238, 51, 240, 19, 3, 64, + 238, 51, 237, 202, 91, 239, 45, 91, 236, 137, 233, 94, 91, 239, 30, 239, + 79, 253, 3, 189, 243, 148, 235, 93, 86, 235, 93, 168, 243, 148, 235, 93, + 64, 235, 93, 235, 113, 237, 195, 52, 252, 210, 241, 89, 235, 162, 236, + 12, 239, 242, 243, 59, 239, 249, 243, 59, 168, 38, 238, 148, 238, 148, + 189, 38, 238, 148, 64, 249, 120, 86, 249, 120, 243, 53, 69, 96, 243, 53, + 69, 231, 37, 206, 96, 231, 37, 206, 240, 91, 206, 96, 240, 91, 206, 236, + 199, 17, 240, 34, 96, 17, 240, 34, 248, 35, 240, 46, 240, 34, 96, 248, + 35, 240, 46, 240, 34, 8, 240, 34, 236, 189, 64, 8, 240, 34, 236, 199, 8, + 240, 34, 239, 126, 240, 34, 248, 135, 147, 241, 74, 248, 58, 229, 58, + 235, 52, 248, 58, 231, 39, 235, 52, 96, 248, 58, 231, 39, 235, 52, 248, + 58, 233, 123, 235, 52, 86, 248, 58, 238, 74, 242, 229, 64, 248, 58, 238, + 74, 242, 229, 240, 148, 236, 199, 64, 242, 229, 29, 64, 242, 229, 248, + 35, 240, 46, 86, 242, 229, 86, 240, 46, 64, 242, 229, 236, 199, 86, 242, + 229, 96, 236, 199, 86, 242, 229, 236, 235, 242, 229, 236, 189, 64, 242, + 229, 96, 235, 52, 248, 35, 240, 46, 235, 52, 242, 254, 242, 124, 235, 52, + 242, 254, 238, 74, 86, 242, 229, 242, 254, 238, 74, 236, 235, 242, 229, + 254, 31, 238, 74, 86, 242, 229, 242, 254, 238, 74, 233, 98, 86, 242, 229, + 96, 242, 254, 238, 74, 233, 98, 86, 242, 229, 240, 251, 238, 74, 86, 242, + 229, 238, 216, 238, 74, 235, 52, 229, 58, 235, 52, 248, 35, 240, 46, 229, + 58, 235, 52, 96, 229, 58, 235, 52, 254, 31, 237, 30, 86, 19, 64, 235, 88, + 86, 235, 88, 64, 235, 88, 242, 254, 237, 30, 236, 199, 86, 235, 88, 29, + 248, 35, 240, 46, 242, 254, 238, 74, 242, 229, 96, 229, 58, 236, 235, + 235, 52, 234, 42, 247, 150, 235, 35, 234, 42, 96, 239, 23, 234, 42, 237, + 42, 96, 237, 42, 231, 39, 235, 52, 242, 254, 229, 58, 235, 139, 235, 52, + 96, 242, 254, 229, 58, 235, 139, 235, 52, 236, 189, 64, 238, 51, 168, 38, + 231, 103, 64, 238, 59, 189, 38, 231, 103, 64, 238, 59, 168, 38, 236, 189, + 64, 238, 59, 189, 38, 236, 189, 64, 238, 59, 86, 238, 76, 242, 250, 64, + 206, 136, 59, 125, 240, 19, 59, 125, 96, 59, 125, 96, 240, 12, 205, 242, + 244, 235, 51, 158, 235, 53, 96, 240, 12, 242, 244, 235, 51, 158, 235, 53, + 96, 45, 205, 242, 244, 235, 51, 158, 235, 53, 96, 45, 242, 244, 235, 51, + 158, 235, 53, 240, 95, 252, 190, 235, 91, 21, 235, 53, 96, 233, 54, 158, + 235, 53, 96, 243, 16, 233, 54, 158, 235, 53, 96, 86, 240, 138, 238, 120, + 96, 86, 243, 16, 238, 69, 240, 135, 240, 138, 238, 120, 240, 135, 243, + 16, 238, 69, 240, 19, 40, 233, 56, 235, 53, 240, 19, 38, 233, 56, 235, + 53, 240, 19, 235, 122, 40, 233, 56, 235, 53, 240, 19, 235, 122, 38, 233, + 56, 235, 53, 240, 19, 231, 87, 185, 238, 52, 235, 53, 240, 19, 231, 36, + 185, 238, 52, 235, 53, 96, 231, 87, 185, 235, 51, 158, 235, 53, 96, 231, + 36, 185, 235, 51, 158, 235, 53, 96, 231, 87, 185, 238, 52, 235, 53, 96, + 231, 36, 185, 238, 52, 235, 53, 136, 40, 236, 171, 242, 255, 238, 52, + 235, 53, 136, 38, 236, 171, 242, 255, 238, 52, 235, 53, 240, 19, 40, 242, + 225, 238, 52, 235, 53, 240, 19, 38, 242, 225, 238, 52, 235, 53, 238, 55, + 236, 146, 29, 26, 127, 238, 55, 236, 146, 29, 26, 111, 238, 55, 236, 146, + 29, 26, 166, 238, 55, 236, 146, 29, 26, 177, 238, 55, 236, 146, 29, 26, + 176, 238, 55, 236, 146, 29, 26, 187, 238, 55, 236, 146, 29, 26, 203, 238, + 55, 236, 146, 29, 26, 195, 238, 55, 236, 146, 29, 26, 202, 238, 55, 236, + 146, 29, 61, 248, 53, 238, 55, 29, 27, 26, 127, 238, 55, 29, 27, 26, 111, + 238, 55, 29, 27, 26, 166, 238, 55, 29, 27, 26, 177, 238, 55, 29, 27, 26, + 176, 238, 55, 29, 27, 26, 187, 238, 55, 29, 27, 26, 203, 238, 55, 29, 27, + 26, 195, 238, 55, 29, 27, 26, 202, 238, 55, 29, 27, 61, 248, 53, 238, 55, + 236, 146, 29, 27, 26, 127, 238, 55, 236, 146, 29, 27, 26, 111, 238, 55, + 236, 146, 29, 27, 26, 166, 238, 55, 236, 146, 29, 27, 26, 177, 238, 55, + 236, 146, 29, 27, 26, 176, 238, 55, 236, 146, 29, 27, 26, 187, 238, 55, + 236, 146, 29, 27, 26, 203, 238, 55, 236, 146, 29, 27, 26, 195, 238, 55, + 236, 146, 29, 27, 26, 202, 238, 55, 236, 146, 29, 27, 61, 248, 53, 96, + 234, 1, 77, 56, 96, 242, 228, 248, 43, 56, 96, 77, 56, 96, 242, 223, 248, + 43, 56, 237, 142, 242, 232, 77, 56, 96, 232, 202, 77, 56, 229, 60, 77, + 56, 96, 229, 60, 77, 56, 240, 55, 229, 60, 77, 56, 96, 240, 55, 229, 60, + 77, 56, 86, 77, 56, 238, 229, 233, 253, 77, 234, 7, 238, 229, 231, 60, + 77, 234, 7, 86, 77, 234, 7, 96, 86, 240, 95, 235, 45, 19, 77, 56, 96, 86, + 240, 95, 226, 226, 19, 77, 56, 244, 23, 86, 77, 56, 96, 229, 65, 86, 77, + 56, 232, 200, 64, 77, 56, 233, 215, 64, 77, 56, 233, 119, 236, 189, 64, + 77, 56, 232, 166, 236, 189, 64, 77, 56, 96, 168, 231, 38, 64, 77, 56, 96, + 189, 231, 38, 64, 77, 56, 238, 204, 168, 231, 38, 64, 77, 56, 238, 204, + 189, 231, 38, 64, 77, 56, 29, 96, 64, 77, 56, 231, 34, 77, 56, 229, 59, + 242, 228, 248, 43, 56, 229, 59, 77, 56, 229, 59, 242, 223, 248, 43, 56, + 96, 229, 59, 242, 228, 248, 43, 56, 96, 229, 59, 77, 56, 96, 229, 59, + 242, 223, 248, 43, 56, 231, 31, 77, 56, 96, 229, 56, 77, 56, 232, 112, + 77, 56, 96, 232, 112, 77, 56, 231, 150, 77, 56, 204, 233, 133, 240, 54, + 64, 236, 152, 234, 34, 3, 64, 235, 46, 231, 49, 248, 35, 238, 87, 248, + 35, 235, 84, 40, 237, 35, 254, 52, 234, 35, 38, 237, 35, 254, 52, 234, + 35, 64, 238, 76, 2, 238, 130, 248, 40, 19, 2, 248, 40, 238, 68, 147, 238, + 96, 236, 206, 168, 38, 240, 31, 2, 248, 40, 189, 40, 240, 31, 2, 248, 40, + 40, 243, 111, 243, 61, 38, 243, 111, 243, 61, 248, 37, 243, 111, 243, 61, + 243, 22, 88, 242, 234, 243, 22, 92, 242, 234, 40, 19, 38, 45, 234, 15, + 40, 19, 38, 242, 234, 40, 235, 103, 183, 38, 242, 234, 183, 40, 242, 234, + 88, 248, 84, 2, 218, 48, 239, 124, 238, 135, 255, 25, 163, 247, 53, 64, + 231, 95, 236, 164, 64, 231, 95, 238, 76, 2, 139, 243, 36, 64, 231, 95, + 238, 76, 2, 77, 243, 36, 64, 31, 2, 139, 243, 36, 64, 31, 2, 77, 243, 36, + 10, 40, 64, 31, 104, 10, 38, 64, 31, 104, 10, 40, 185, 104, 10, 38, 185, + 104, 10, 40, 45, 185, 104, 10, 38, 45, 185, 104, 226, 226, 235, 71, 56, + 235, 45, 235, 71, 56, 231, 86, 240, 178, 218, 56, 235, 62, 240, 178, 218, + 56, 38, 65, 2, 29, 243, 12, 183, 139, 56, 183, 77, 56, 183, 40, 38, 56, + 183, 139, 45, 56, 183, 77, 45, 56, 183, 40, 38, 45, 56, 183, 139, 65, + 248, 44, 125, 183, 77, 65, 248, 44, 125, 183, 139, 45, 65, 248, 44, 125, + 183, 77, 45, 65, 248, 44, 125, 183, 77, 236, 240, 56, 35, 36, 241, 33, + 35, 36, 239, 46, 35, 36, 239, 47, 35, 36, 237, 113, 35, 36, 239, 48, 35, + 36, 237, 114, 35, 36, 237, 120, 35, 36, 235, 206, 35, 36, 239, 49, 35, + 36, 237, 115, 35, 36, 237, 121, 35, 36, 235, 207, 35, 36, 237, 126, 35, + 36, 235, 212, 35, 36, 235, 227, 35, 36, 234, 113, 35, 36, 239, 50, 35, + 36, 237, 116, 35, 36, 237, 122, 35, 36, 235, 208, 35, 36, 237, 127, 35, + 36, 235, 213, 35, 36, 235, 228, 35, 36, 234, 114, 35, 36, 237, 131, 35, + 36, 235, 217, 35, 36, 235, 232, 35, 36, 234, 118, 35, 36, 235, 242, 35, + 36, 234, 128, 35, 36, 234, 148, 35, 36, 233, 138, 35, 36, 239, 51, 35, + 36, 237, 117, 35, 36, 237, 123, 35, 36, 235, 209, 35, 36, 237, 128, 35, + 36, 235, 214, 35, 36, 235, 229, 35, 36, 234, 115, 35, 36, 237, 132, 35, + 36, 235, 218, 35, 36, 235, 233, 35, 36, 234, 119, 35, 36, 235, 243, 35, + 36, 234, 129, 35, 36, 234, 149, 35, 36, 233, 139, 35, 36, 237, 135, 35, + 36, 235, 221, 35, 36, 235, 236, 35, 36, 234, 122, 35, 36, 235, 246, 35, + 36, 234, 132, 35, 36, 234, 152, 35, 36, 233, 142, 35, 36, 235, 252, 35, + 36, 234, 138, 35, 36, 234, 158, 35, 36, 233, 148, 35, 36, 234, 168, 35, + 36, 233, 158, 35, 36, 233, 173, 35, 36, 232, 134, 35, 36, 239, 52, 35, + 36, 237, 118, 35, 36, 237, 124, 35, 36, 235, 210, 35, 36, 237, 129, 35, + 36, 235, 215, 35, 36, 235, 230, 35, 36, 234, 116, 35, 36, 237, 133, 35, + 36, 235, 219, 35, 36, 235, 234, 35, 36, 234, 120, 35, 36, 235, 244, 35, + 36, 234, 130, 35, 36, 234, 150, 35, 36, 233, 140, 35, 36, 237, 136, 35, + 36, 235, 222, 35, 36, 235, 237, 35, 36, 234, 123, 35, 36, 235, 247, 35, + 36, 234, 133, 35, 36, 234, 153, 35, 36, 233, 143, 35, 36, 235, 253, 35, + 36, 234, 139, 35, 36, 234, 159, 35, 36, 233, 149, 35, 36, 234, 169, 35, + 36, 233, 159, 35, 36, 233, 174, 35, 36, 232, 135, 35, 36, 237, 138, 35, + 36, 235, 224, 35, 36, 235, 239, 35, 36, 234, 125, 35, 36, 235, 249, 35, + 36, 234, 135, 35, 36, 234, 155, 35, 36, 233, 145, 35, 36, 235, 255, 35, + 36, 234, 141, 35, 36, 234, 161, 35, 36, 233, 151, 35, 36, 234, 171, 35, + 36, 233, 161, 35, 36, 233, 176, 35, 36, 232, 137, 35, 36, 236, 2, 35, 36, + 234, 144, 35, 36, 234, 164, 35, 36, 233, 154, 35, 36, 234, 174, 35, 36, + 233, 164, 35, 36, 233, 179, 35, 36, 232, 140, 35, 36, 234, 178, 35, 36, + 233, 168, 35, 36, 233, 183, 35, 36, 232, 144, 35, 36, 233, 188, 35, 36, + 232, 149, 35, 36, 232, 155, 35, 36, 231, 129, 35, 36, 239, 53, 35, 36, + 237, 119, 35, 36, 237, 125, 35, 36, 235, 211, 35, 36, 237, 130, 35, 36, + 235, 216, 35, 36, 235, 231, 35, 36, 234, 117, 35, 36, 237, 134, 35, 36, + 235, 220, 35, 36, 235, 235, 35, 36, 234, 121, 35, 36, 235, 245, 35, 36, + 234, 131, 35, 36, 234, 151, 35, 36, 233, 141, 35, 36, 237, 137, 35, 36, + 235, 223, 35, 36, 235, 238, 35, 36, 234, 124, 35, 36, 235, 248, 35, 36, + 234, 134, 35, 36, 234, 154, 35, 36, 233, 144, 35, 36, 235, 254, 35, 36, + 234, 140, 35, 36, 234, 160, 35, 36, 233, 150, 35, 36, 234, 170, 35, 36, + 233, 160, 35, 36, 233, 175, 35, 36, 232, 136, 35, 36, 237, 139, 35, 36, + 235, 225, 35, 36, 235, 240, 35, 36, 234, 126, 35, 36, 235, 250, 35, 36, + 234, 136, 35, 36, 234, 156, 35, 36, 233, 146, 35, 36, 236, 0, 35, 36, + 234, 142, 35, 36, 234, 162, 35, 36, 233, 152, 35, 36, 234, 172, 35, 36, + 233, 162, 35, 36, 233, 177, 35, 36, 232, 138, 35, 36, 236, 3, 35, 36, + 234, 145, 35, 36, 234, 165, 35, 36, 233, 155, 35, 36, 234, 175, 35, 36, + 233, 165, 35, 36, 233, 180, 35, 36, 232, 141, 35, 36, 234, 179, 35, 36, + 233, 169, 35, 36, 233, 184, 35, 36, 232, 145, 35, 36, 233, 189, 35, 36, + 232, 150, 35, 36, 232, 156, 35, 36, 231, 130, 35, 36, 237, 140, 35, 36, + 235, 226, 35, 36, 235, 241, 35, 36, 234, 127, 35, 36, 235, 251, 35, 36, + 234, 137, 35, 36, 234, 157, 35, 36, 233, 147, 35, 36, 236, 1, 35, 36, + 234, 143, 35, 36, 234, 163, 35, 36, 233, 153, 35, 36, 234, 173, 35, 36, + 233, 163, 35, 36, 233, 178, 35, 36, 232, 139, 35, 36, 236, 4, 35, 36, + 234, 146, 35, 36, 234, 166, 35, 36, 233, 156, 35, 36, 234, 176, 35, 36, + 233, 166, 35, 36, 233, 181, 35, 36, 232, 142, 35, 36, 234, 180, 35, 36, + 233, 170, 35, 36, 233, 185, 35, 36, 232, 146, 35, 36, 233, 190, 35, 36, + 232, 151, 35, 36, 232, 157, 35, 36, 231, 131, 35, 36, 236, 5, 35, 36, + 234, 147, 35, 36, 234, 167, 35, 36, 233, 157, 35, 36, 234, 177, 35, 36, + 233, 167, 35, 36, 233, 182, 35, 36, 232, 143, 35, 36, 234, 181, 35, 36, + 233, 171, 35, 36, 233, 186, 35, 36, 232, 147, 35, 36, 233, 191, 35, 36, + 232, 152, 35, 36, 232, 158, 35, 36, 231, 132, 35, 36, 234, 182, 35, 36, + 233, 172, 35, 36, 233, 187, 35, 36, 232, 148, 35, 36, 233, 192, 35, 36, + 232, 153, 35, 36, 232, 159, 35, 36, 231, 133, 35, 36, 233, 193, 35, 36, + 232, 154, 35, 36, 232, 160, 35, 36, 231, 134, 35, 36, 232, 161, 35, 36, + 231, 135, 35, 36, 231, 136, 35, 36, 231, 64, 77, 234, 16, 65, 2, 59, 108, + 77, 234, 16, 65, 2, 45, 59, 108, 139, 45, 65, 2, 59, 108, 77, 45, 65, 2, + 59, 108, 40, 38, 45, 65, 2, 59, 108, 77, 234, 16, 65, 248, 44, 125, 139, + 45, 65, 248, 44, 125, 77, 45, 65, 248, 44, 125, 235, 45, 65, 2, 163, 108, + 226, 226, 65, 2, 163, 108, 226, 226, 240, 3, 56, 235, 45, 240, 3, 56, + 139, 45, 248, 63, 56, 77, 45, 248, 63, 56, 139, 240, 3, 248, 63, 56, 77, + 240, 3, 248, 63, 56, 77, 234, 16, 240, 3, 248, 63, 56, 77, 65, 2, 240, 4, + 243, 46, 226, 226, 65, 153, 125, 235, 45, 65, 153, 125, 77, 65, 2, 248, + 138, 2, 59, 108, 77, 65, 2, 248, 138, 2, 45, 59, 108, 77, 234, 16, 65, 2, + 242, 226, 77, 234, 16, 65, 2, 248, 138, 2, 59, 108, 77, 234, 16, 65, 2, + 248, 138, 2, 45, 59, 108, 139, 233, 64, 77, 233, 64, 139, 45, 233, 64, + 77, 45, 233, 64, 139, 65, 153, 86, 236, 164, 77, 65, 153, 86, 236, 164, + 139, 65, 248, 44, 253, 144, 153, 86, 236, 164, 77, 65, 248, 44, 253, 144, + 153, 86, 236, 164, 242, 223, 248, 56, 19, 242, 228, 248, 43, 56, 242, + 223, 248, 43, 19, 242, 228, 248, 56, 56, 242, 223, 248, 56, 65, 2, 90, + 242, 223, 248, 43, 65, 2, 90, 242, 228, 248, 43, 65, 2, 90, 242, 228, + 248, 56, 65, 2, 90, 242, 223, 248, 56, 65, 19, 242, 223, 248, 43, 56, + 242, 223, 248, 43, 65, 19, 242, 228, 248, 43, 56, 242, 228, 248, 43, 65, + 19, 242, 228, 248, 56, 56, 242, 228, 248, 56, 65, 19, 242, 223, 248, 56, + 56, 240, 69, 236, 159, 236, 185, 238, 105, 235, 86, 238, 105, 236, 159, + 236, 185, 240, 69, 235, 86, 242, 228, 248, 43, 65, 236, 185, 242, 223, + 248, 43, 56, 242, 223, 248, 43, 65, 236, 185, 242, 228, 248, 43, 56, 238, + 105, 236, 159, 236, 185, 242, 223, 248, 43, 56, 240, 69, 236, 159, 236, + 185, 242, 228, 248, 43, 56, 242, 223, 248, 43, 65, 236, 185, 242, 223, + 248, 56, 56, 242, 223, 248, 56, 65, 236, 185, 242, 223, 248, 43, 56, 248, + 141, 65, 236, 150, 237, 111, 225, 65, 236, 150, 77, 248, 187, 238, 111, + 236, 206, 65, 236, 150, 77, 248, 187, 238, 111, 234, 9, 65, 236, 150, + 235, 45, 248, 187, 238, 111, 234, 18, 65, 236, 150, 235, 45, 248, 187, + 238, 111, 233, 63, 234, 250, 253, 183, 235, 62, 56, 236, 50, 253, 183, + 231, 86, 56, 253, 159, 253, 183, 231, 86, 56, 240, 17, 253, 183, 231, 86, + 56, 253, 159, 253, 183, 235, 62, 65, 2, 240, 68, 253, 159, 253, 183, 231, + 86, 65, 2, 243, 12, 168, 38, 232, 98, 235, 62, 56, 168, 40, 232, 98, 231, + 86, 56, 231, 86, 240, 23, 218, 56, 235, 62, 240, 23, 218, 56, 77, 65, 60, + 242, 215, 139, 56, 139, 65, 60, 242, 215, 77, 56, 242, 215, 77, 65, 60, + 139, 56, 77, 65, 2, 248, 49, 46, 139, 65, 2, 248, 49, 46, 77, 65, 238, + 108, 206, 40, 38, 65, 238, 108, 3, 238, 51, 226, 226, 234, 16, 65, 248, + 44, 3, 238, 51, 40, 154, 88, 38, 154, 92, 236, 175, 40, 154, 92, 38, 154, + 88, 236, 175, 88, 154, 38, 92, 154, 40, 236, 175, 88, 154, 40, 92, 154, + 38, 236, 175, 40, 154, 88, 38, 154, 88, 236, 175, 88, 154, 38, 92, 154, + 38, 236, 175, 40, 154, 92, 38, 154, 92, 236, 175, 88, 154, 40, 92, 154, + 40, 236, 175, 139, 186, 2, 154, 88, 153, 125, 77, 186, 2, 154, 88, 153, + 125, 226, 226, 186, 2, 154, 38, 153, 125, 235, 45, 186, 2, 154, 38, 153, + 125, 139, 186, 2, 154, 92, 153, 125, 77, 186, 2, 154, 92, 153, 125, 226, + 226, 186, 2, 154, 40, 153, 125, 235, 45, 186, 2, 154, 40, 153, 125, 139, + 186, 2, 154, 88, 248, 44, 125, 77, 186, 2, 154, 88, 248, 44, 125, 226, + 226, 186, 2, 154, 38, 248, 44, 125, 235, 45, 186, 2, 154, 38, 248, 44, + 125, 139, 186, 2, 154, 92, 248, 44, 125, 77, 186, 2, 154, 92, 248, 44, + 125, 226, 226, 186, 2, 154, 40, 248, 44, 125, 235, 45, 186, 2, 154, 40, + 248, 44, 125, 139, 186, 2, 154, 88, 60, 139, 186, 2, 154, 242, 236, 226, + 226, 186, 2, 154, 40, 240, 45, 226, 226, 186, 2, 154, 225, 77, 186, 2, + 154, 88, 60, 77, 186, 2, 154, 242, 236, 235, 45, 186, 2, 154, 40, 240, + 45, 235, 45, 186, 2, 154, 225, 139, 186, 2, 154, 88, 60, 77, 186, 2, 154, + 253, 176, 139, 186, 2, 154, 92, 60, 77, 186, 2, 154, 242, 236, 77, 186, + 2, 154, 88, 60, 139, 186, 2, 154, 253, 176, 77, 186, 2, 154, 92, 60, 139, + 186, 2, 154, 242, 236, 139, 186, 2, 154, 88, 60, 183, 242, 235, 139, 186, + 2, 154, 92, 242, 230, 183, 242, 235, 77, 186, 2, 154, 88, 60, 183, 242, + 235, 77, 186, 2, 154, 92, 242, 230, 183, 242, 235, 226, 226, 186, 2, 154, + 40, 240, 45, 235, 45, 186, 2, 154, 225, 235, 45, 186, 2, 154, 40, 240, + 45, 226, 226, 186, 2, 154, 225, 38, 45, 65, 2, 238, 121, 243, 99, 240, 7, + 21, 60, 77, 56, 242, 219, 236, 208, 60, 77, 56, 139, 65, 60, 242, 219, + 235, 47, 77, 65, 60, 242, 219, 235, 47, 77, 65, 60, 240, 40, 95, 87, 235, + 44, 60, 139, 56, 139, 65, 238, 108, 234, 3, 232, 68, 60, 77, 56, 240, 26, + 60, 77, 56, 139, 65, 238, 108, 238, 87, 236, 154, 60, 139, 56, 40, 248, + 157, 242, 226, 38, 248, 157, 242, 226, 88, 248, 157, 242, 226, 92, 248, + 157, 242, 226, 240, 3, 59, 253, 144, 234, 35, 255, 97, 126, 247, 97, 255, + 97, 126, 249, 9, 240, 24, 40, 64, 242, 225, 104, 38, 64, 242, 225, 104, + 40, 64, 232, 74, 38, 64, 232, 74, 255, 97, 126, 40, 243, 11, 104, 255, + 97, 126, 38, 243, 11, 104, 255, 97, 126, 40, 238, 166, 104, 255, 97, 126, + 38, 238, 166, 104, 40, 31, 238, 52, 2, 235, 50, 38, 31, 238, 52, 2, 235, + 50, 40, 31, 238, 52, 2, 248, 188, 255, 22, 253, 159, 238, 67, 38, 31, + 238, 52, 2, 248, 188, 255, 22, 240, 17, 238, 67, 40, 31, 238, 52, 2, 248, + 188, 255, 22, 240, 17, 238, 67, 38, 31, 238, 52, 2, 248, 188, 255, 22, + 253, 159, 238, 67, 40, 185, 238, 52, 2, 248, 40, 38, 185, 238, 52, 2, + 248, 40, 40, 253, 183, 235, 44, 104, 38, 253, 183, 232, 68, 104, 45, 40, + 253, 183, 232, 68, 104, 45, 38, 253, 183, 235, 44, 104, 40, 86, 236, 171, + 242, 255, 104, 38, 86, 236, 171, 242, 255, 104, 240, 4, 240, 97, 59, 240, + 126, 242, 224, 236, 168, 185, 238, 96, 242, 220, 38, 185, 239, 240, 2, + 238, 59, 236, 168, 38, 185, 2, 248, 40, 185, 2, 255, 99, 238, 94, 242, + 241, 240, 54, 235, 109, 185, 238, 96, 242, 220, 235, 109, 185, 238, 96, + 253, 176, 205, 240, 54, 224, 240, 54, 185, 2, 235, 50, 224, 185, 2, 235, + 50, 238, 106, 185, 238, 96, 253, 176, 238, 106, 185, 238, 96, 242, 236, + 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, 88, + 19, 225, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, + 150, 88, 19, 242, 220, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, + 22, 65, 236, 150, 92, 19, 225, 236, 168, 185, 2, 248, 35, 253, 229, 240, + 63, 255, 22, 65, 236, 150, 92, 19, 242, 220, 236, 168, 185, 2, 248, 35, + 253, 229, 240, 63, 255, 22, 65, 236, 150, 38, 19, 253, 176, 236, 168, + 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, 40, 19, 253, + 176, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, + 38, 19, 242, 236, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, + 65, 236, 150, 40, 19, 242, 236, 224, 243, 15, 249, 160, 243, 15, 254, 30, + 2, 236, 163, 243, 15, 254, 30, 2, 3, 218, 48, 243, 15, 254, 30, 2, 38, + 65, 48, 243, 15, 254, 30, 2, 40, 65, 48, 218, 2, 163, 125, 29, 59, 125, + 29, 235, 105, 29, 238, 75, 236, 177, 29, 231, 49, 218, 238, 135, 255, 25, + 163, 253, 144, 19, 253, 159, 137, 238, 135, 255, 25, 59, 125, 218, 2, + 233, 39, 206, 29, 226, 231, 236, 196, 52, 88, 65, 238, 108, 238, 51, 29, + 64, 238, 69, 29, 238, 69, 29, 234, 3, 29, 231, 85, 218, 2, 3, 218, 153, + 253, 145, 225, 218, 2, 171, 163, 239, 207, 153, 253, 145, 225, 238, 84, + 240, 69, 236, 159, 240, 37, 238, 84, 238, 105, 236, 159, 240, 37, 238, + 84, 235, 52, 238, 84, 3, 238, 51, 238, 84, 238, 59, 171, 240, 116, 238, + 12, 236, 152, 2, 53, 48, 236, 152, 2, 235, 50, 255, 99, 255, 22, 235, 46, + 236, 152, 2, 240, 220, 255, 31, 238, 128, 38, 236, 152, 60, 40, 235, 46, + 40, 236, 152, 240, 45, 59, 125, 59, 253, 144, 240, 45, 38, 235, 46, 240, + 161, 2, 40, 137, 240, 0, 240, 161, 2, 38, 137, 240, 0, 86, 238, 168, 243, + 48, 2, 40, 137, 240, 0, 243, 48, 2, 38, 137, 240, 0, 64, 234, 39, 86, + 234, 39, 40, 240, 125, 240, 97, 38, 240, 125, 240, 97, 40, 45, 240, 125, + 240, 97, 38, 45, 240, 125, 240, 97, 234, 204, 235, 101, 254, 248, 248, + 59, 235, 101, 237, 180, 238, 203, 2, 59, 125, 232, 162, 235, 103, 31, 2, + 235, 194, 237, 229, 236, 40, 254, 143, 239, 195, 236, 170, 240, 7, 21, + 19, 238, 58, 235, 105, 240, 7, 21, 19, 238, 58, 236, 200, 2, 242, 219, + 48, 235, 89, 153, 19, 238, 58, 235, 105, 241, 138, 242, 132, 231, 83, + 231, 91, 236, 152, 2, 40, 137, 240, 0, 231, 91, 236, 152, 2, 38, 137, + 240, 0, 86, 238, 76, 2, 92, 56, 86, 236, 231, 64, 218, 2, 92, 56, 86, + 218, 2, 92, 56, 232, 78, 64, 238, 59, 232, 78, 86, 238, 59, 232, 78, 64, + 236, 164, 232, 78, 86, 236, 164, 232, 78, 64, 238, 51, 232, 78, 86, 238, + 51, 231, 152, 238, 75, 238, 83, 235, 47, 238, 83, 2, 236, 163, 238, 75, + 238, 83, 2, 163, 108, 253, 213, 236, 177, 253, 213, 238, 75, 236, 177, + 45, 243, 12, 240, 3, 243, 12, 231, 87, 240, 95, 185, 104, 231, 36, 240, + 95, 185, 104, 247, 152, 246, 87, 242, 238, 29, 53, 235, 47, 242, 238, 29, + 248, 49, 235, 47, 242, 238, 29, 243, 48, 235, 47, 242, 238, 243, 2, 236, + 208, 2, 248, 40, 242, 238, 243, 2, 236, 208, 2, 243, 12, 242, 238, 31, + 232, 76, 235, 47, 242, 238, 31, 243, 2, 235, 47, 171, 238, 56, 19, 235, + 47, 171, 238, 56, 128, 235, 47, 242, 238, 243, 48, 235, 47, 241, 247, + 171, 252, 192, 235, 112, 2, 235, 60, 235, 71, 236, 167, 235, 47, 241, + 110, 249, 134, 235, 60, 236, 167, 2, 45, 108, 236, 167, 238, 255, 2, 240, + 37, 233, 122, 236, 29, 231, 86, 232, 177, 248, 41, 233, 70, 2, 233, 97, + 249, 135, 240, 127, 243, 116, 248, 41, 233, 70, 2, 232, 98, 249, 135, + 240, 127, 243, 116, 248, 41, 233, 70, 161, 236, 39, 253, 145, 243, 116, + 236, 167, 240, 127, 134, 242, 232, 235, 47, 234, 242, 236, 167, 235, 47, + 236, 167, 2, 139, 65, 2, 90, 236, 167, 2, 243, 48, 52, 236, 167, 2, 231, + 88, 236, 167, 2, 240, 58, 236, 167, 2, 236, 163, 236, 167, 2, 235, 50, + 243, 61, 243, 22, 40, 236, 152, 235, 47, 255, 97, 126, 240, 144, 232, + 104, 255, 97, 126, 240, 144, 239, 162, 255, 97, 126, 240, 144, 233, 225, + 248, 49, 21, 2, 3, 218, 48, 248, 49, 21, 2, 190, 240, 2, 48, 248, 49, 21, + 2, 242, 219, 48, 248, 49, 21, 2, 53, 46, 248, 49, 21, 2, 242, 219, 46, + 248, 49, 21, 2, 235, 48, 111, 248, 49, 21, 2, 86, 235, 46, 242, 250, 21, + 2, 242, 244, 48, 242, 250, 21, 2, 53, 46, 242, 250, 21, 2, 238, 105, 243, + 5, 242, 250, 21, 2, 240, 69, 243, 5, 248, 49, 21, 255, 22, 40, 137, 238, + 51, 248, 49, 21, 255, 22, 38, 137, 238, 51, 242, 176, 128, 243, 38, 236, + 170, 231, 37, 21, 2, 53, 48, 231, 37, 21, 2, 235, 50, 234, 21, 239, 167, + 2, 240, 17, 239, 29, 244, 20, 236, 170, 231, 37, 21, 255, 22, 40, 137, + 238, 51, 231, 37, 21, 255, 22, 38, 137, 238, 51, 29, 231, 37, 21, 2, 190, + 238, 54, 231, 37, 21, 255, 22, 45, 238, 51, 29, 236, 196, 52, 248, 49, + 21, 255, 22, 235, 46, 242, 250, 21, 255, 22, 235, 46, 231, 37, 21, 255, + 22, 235, 46, 237, 14, 236, 170, 236, 93, 237, 14, 236, 170, 255, 97, 126, + 234, 246, 232, 104, 232, 115, 128, 234, 50, 232, 76, 2, 248, 40, 243, 2, + 2, 242, 250, 52, 243, 2, 2, 236, 163, 232, 76, 2, 236, 163, 232, 76, 2, + 238, 56, 248, 91, 243, 2, 2, 238, 56, 253, 227, 243, 2, 60, 231, 88, 232, + 76, 60, 240, 58, 243, 2, 60, 253, 144, 60, 231, 88, 232, 76, 60, 253, + 144, 60, 240, 58, 243, 2, 240, 45, 19, 240, 116, 2, 240, 58, 232, 76, + 240, 45, 19, 240, 116, 2, 231, 88, 240, 23, 243, 2, 2, 238, 214, 240, 23, + 232, 76, 2, 238, 214, 45, 31, 231, 88, 45, 31, 240, 58, 240, 23, 243, 2, + 2, 240, 220, 19, 244, 20, 236, 170, 238, 56, 19, 2, 53, 48, 238, 56, 128, + 2, 53, 48, 45, 238, 56, 248, 91, 45, 238, 56, 253, 227, 171, 232, 105, + 238, 56, 248, 91, 171, 232, 105, 238, 56, 253, 227, 238, 217, 243, 22, + 253, 227, 238, 217, 243, 22, 248, 91, 238, 56, 128, 233, 91, 238, 56, + 248, 91, 238, 56, 19, 2, 240, 1, 243, 46, 238, 56, 128, 2, 240, 1, 243, + 46, 238, 56, 19, 2, 163, 242, 235, 238, 56, 128, 2, 163, 242, 235, 238, + 56, 19, 2, 45, 236, 163, 238, 56, 19, 2, 235, 50, 238, 56, 19, 2, 45, + 235, 50, 3, 254, 255, 2, 235, 50, 238, 56, 128, 2, 45, 236, 163, 238, 56, + 128, 2, 45, 235, 50, 255, 97, 126, 241, 87, 227, 10, 255, 97, 126, 247, + 28, 227, 10, 240, 7, 21, 2, 53, 46, 235, 89, 2, 53, 48, 240, 3, 163, 253, + 144, 2, 45, 59, 108, 240, 3, 163, 253, 144, 2, 240, 3, 59, 108, 242, 219, + 236, 208, 2, 53, 48, 242, 219, 236, 208, 2, 240, 69, 243, 5, 238, 81, + 242, 250, 238, 5, 235, 192, 2, 53, 48, 240, 7, 2, 235, 52, 240, 40, 95, + 153, 2, 190, 238, 54, 231, 89, 95, 128, 95, 87, 240, 7, 21, 60, 248, 49, + 52, 248, 49, 21, 60, 240, 7, 52, 240, 7, 21, 60, 242, 219, 235, 47, 45, + 243, 14, 240, 32, 171, 233, 82, 240, 7, 240, 232, 204, 233, 82, 240, 7, + 240, 232, 240, 7, 21, 2, 171, 181, 60, 19, 171, 181, 46, 234, 5, 2, 248, + 58, 181, 48, 235, 44, 2, 218, 238, 94, 232, 68, 2, 218, 238, 94, 235, 44, + 2, 236, 156, 158, 48, 232, 68, 2, 236, 156, 158, 48, 235, 44, 128, 238, + 58, 95, 87, 232, 68, 128, 238, 58, 95, 87, 235, 44, 128, 238, 58, 95, + 153, 2, 53, 238, 94, 232, 68, 128, 238, 58, 95, 153, 2, 53, 238, 94, 235, + 44, 128, 238, 58, 95, 153, 2, 53, 48, 232, 68, 128, 238, 58, 95, 153, 2, + 53, 48, 235, 44, 128, 238, 58, 95, 153, 2, 53, 60, 225, 232, 68, 128, + 238, 58, 95, 153, 2, 53, 60, 242, 220, 235, 44, 128, 232, 81, 232, 68, + 128, 232, 81, 235, 44, 19, 233, 61, 161, 95, 87, 232, 68, 19, 233, 61, + 161, 95, 87, 235, 44, 19, 161, 232, 81, 232, 68, 19, 161, 232, 81, 235, + 44, 60, 233, 57, 95, 60, 231, 85, 232, 68, 60, 233, 57, 95, 60, 234, 3, + 235, 44, 60, 238, 81, 128, 240, 32, 232, 68, 60, 238, 81, 128, 240, 32, + 235, 44, 60, 238, 81, 60, 231, 85, 232, 68, 60, 238, 81, 60, 234, 3, 235, + 44, 60, 232, 68, 60, 233, 57, 240, 32, 232, 68, 60, 235, 44, 60, 233, 57, + 240, 32, 235, 44, 60, 238, 58, 95, 60, 232, 68, 60, 238, 58, 240, 32, + 232, 68, 60, 238, 58, 95, 60, 235, 44, 60, 238, 58, 240, 32, 238, 58, 95, + 153, 128, 234, 3, 238, 58, 95, 153, 128, 231, 85, 238, 58, 95, 153, 128, + 235, 44, 2, 53, 238, 94, 238, 58, 95, 153, 128, 232, 68, 2, 53, 238, 94, + 233, 57, 95, 153, 128, 234, 3, 233, 57, 95, 153, 128, 231, 85, 233, 57, + 238, 58, 95, 153, 128, 234, 3, 233, 57, 238, 58, 95, 153, 128, 231, 85, + 238, 81, 128, 234, 3, 238, 81, 128, 231, 85, 238, 81, 60, 235, 44, 60, + 240, 7, 52, 238, 81, 60, 232, 68, 60, 240, 7, 52, 45, 240, 102, 234, 3, + 45, 240, 102, 231, 85, 45, 240, 102, 235, 44, 2, 235, 50, 232, 68, 233, + 91, 234, 3, 232, 68, 240, 45, 234, 3, 235, 44, 240, 23, 255, 25, 240, + 163, 232, 68, 240, 23, 255, 25, 240, 163, 235, 44, 240, 23, 255, 25, 243, + 158, 60, 238, 58, 240, 32, 232, 68, 240, 23, 255, 25, 243, 158, 60, 238, + 58, 240, 32, 238, 218, 243, 127, 240, 196, 243, 127, 238, 218, 249, 1, + 128, 95, 87, 240, 196, 249, 1, 128, 95, 87, 240, 7, 21, 2, 244, 232, 48, + 236, 176, 60, 233, 61, 240, 7, 52, 236, 178, 60, 233, 61, 240, 7, 52, + 236, 176, 60, 233, 61, 161, 95, 87, 236, 178, 60, 233, 61, 161, 95, 87, + 236, 176, 60, 240, 7, 52, 236, 178, 60, 240, 7, 52, 236, 176, 60, 161, + 95, 87, 236, 178, 60, 161, 95, 87, 236, 176, 60, 240, 40, 95, 87, 236, + 178, 60, 240, 40, 95, 87, 236, 176, 60, 161, 240, 40, 95, 87, 236, 178, + 60, 161, 240, 40, 95, 87, 45, 235, 107, 45, 235, 111, 240, 26, 2, 248, + 40, 236, 154, 2, 248, 40, 240, 26, 2, 248, 49, 21, 46, 236, 154, 2, 248, + 49, 21, 46, 240, 26, 2, 231, 37, 21, 46, 236, 154, 2, 231, 37, 21, 46, + 240, 26, 147, 128, 95, 153, 2, 53, 48, 236, 154, 147, 128, 95, 153, 2, + 53, 48, 240, 26, 147, 60, 240, 7, 52, 236, 154, 147, 60, 240, 7, 52, 240, + 26, 147, 60, 242, 219, 235, 47, 236, 154, 147, 60, 242, 219, 235, 47, + 240, 26, 147, 60, 240, 40, 95, 87, 236, 154, 147, 60, 240, 40, 95, 87, + 240, 26, 147, 60, 161, 95, 87, 236, 154, 147, 60, 161, 95, 87, 31, 40, + 248, 35, 66, 235, 47, 31, 38, 248, 35, 66, 235, 47, 240, 23, 238, 87, + 240, 23, 235, 84, 240, 23, 240, 26, 128, 95, 87, 240, 23, 236, 154, 128, + 95, 87, 240, 26, 60, 235, 84, 236, 154, 60, 238, 87, 240, 26, 60, 238, + 87, 236, 154, 60, 235, 84, 236, 154, 240, 45, 238, 87, 236, 154, 240, 45, + 19, 240, 116, 255, 25, 248, 63, 2, 238, 87, 238, 68, 147, 238, 96, 234, + 9, 236, 75, 2, 254, 246, 249, 3, 233, 254, 231, 88, 237, 160, 233, 220, + 242, 215, 40, 242, 234, 242, 215, 92, 242, 234, 242, 215, 88, 242, 234, + 231, 151, 2, 193, 59, 253, 144, 240, 3, 38, 234, 15, 45, 59, 253, 144, + 40, 234, 15, 59, 253, 144, 45, 40, 234, 15, 45, 59, 253, 144, 45, 40, + 234, 15, 183, 248, 63, 248, 44, 40, 241, 234, 147, 45, 235, 63, 242, 215, + 92, 248, 84, 2, 236, 163, 242, 215, 88, 248, 84, 2, 235, 50, 242, 215, + 88, 248, 84, 60, 242, 215, 92, 242, 234, 45, 92, 242, 234, 45, 88, 242, + 234, 45, 240, 5, 161, 52, 224, 45, 240, 5, 161, 52, 248, 86, 161, 241, + 86, 2, 224, 237, 217, 240, 37, 59, 248, 41, 2, 218, 48, 59, 248, 41, 2, + 218, 46, 92, 248, 84, 2, 218, 46, 236, 200, 2, 163, 108, 236, 200, 2, + 242, 219, 235, 47, 240, 3, 59, 253, 144, 240, 159, 235, 92, 240, 3, 59, + 253, 144, 2, 163, 108, 240, 3, 243, 14, 235, 47, 240, 3, 240, 102, 234, + 3, 240, 3, 240, 102, 231, 85, 233, 57, 238, 58, 235, 44, 128, 95, 87, + 233, 57, 238, 58, 232, 68, 128, 95, 87, 240, 3, 238, 83, 240, 159, 235, + 92, 243, 22, 240, 3, 59, 253, 144, 235, 47, 45, 238, 83, 235, 47, 64, 59, + 125, 242, 238, 64, 59, 125, 242, 223, 248, 43, 64, 56, 242, 223, 248, 56, + 64, 56, 242, 228, 248, 43, 64, 56, 242, 228, 248, 56, 64, 56, 40, 38, 64, + 56, 139, 86, 56, 226, 226, 86, 56, 235, 45, 86, 56, 242, 223, 248, 43, + 86, 56, 242, 223, 248, 56, 86, 56, 242, 228, 248, 43, 86, 56, 242, 228, + 248, 56, 86, 56, 40, 38, 86, 56, 88, 92, 86, 56, 77, 65, 2, 253, 241, + 234, 9, 77, 65, 2, 253, 241, 236, 206, 139, 65, 2, 253, 241, 234, 9, 139, + 65, 2, 253, 241, 236, 206, 31, 2, 253, 159, 137, 240, 0, 31, 2, 240, 17, + 137, 240, 0, 98, 5, 1, 249, 29, 98, 5, 1, 243, 152, 98, 5, 1, 244, 45, + 98, 5, 1, 237, 12, 98, 5, 1, 240, 170, 98, 5, 1, 240, 254, 98, 5, 1, 237, + 52, 98, 5, 1, 240, 171, 98, 5, 1, 238, 235, 98, 5, 1, 243, 60, 98, 5, 1, + 54, 243, 60, 98, 5, 1, 71, 98, 5, 1, 238, 178, 98, 5, 1, 243, 204, 98, 5, + 1, 237, 21, 98, 5, 1, 236, 216, 98, 5, 1, 240, 202, 98, 5, 1, 249, 131, + 98, 5, 1, 238, 210, 98, 5, 1, 240, 217, 98, 5, 1, 240, 235, 98, 5, 1, + 238, 230, 98, 5, 1, 249, 190, 98, 5, 1, 240, 177, 98, 5, 1, 243, 193, 98, + 5, 1, 249, 132, 98, 5, 1, 253, 175, 98, 5, 1, 244, 14, 98, 5, 1, 248, + 140, 98, 5, 1, 238, 170, 98, 5, 1, 248, 46, 98, 5, 1, 243, 83, 98, 5, 1, + 244, 57, 98, 5, 1, 244, 56, 98, 5, 1, 238, 221, 219, 98, 5, 1, 253, 161, + 98, 5, 1, 3, 248, 74, 98, 5, 1, 3, 254, 136, 2, 242, 226, 98, 5, 1, 253, + 162, 98, 5, 1, 238, 117, 3, 248, 74, 98, 5, 1, 253, 213, 248, 74, 98, 5, + 1, 238, 117, 253, 213, 248, 74, 98, 5, 1, 243, 57, 98, 5, 1, 236, 215, + 98, 5, 1, 237, 40, 98, 5, 1, 234, 87, 67, 98, 5, 1, 237, 19, 236, 216, + 98, 3, 1, 249, 29, 98, 3, 1, 243, 152, 98, 3, 1, 244, 45, 98, 3, 1, 237, + 12, 98, 3, 1, 240, 170, 98, 3, 1, 240, 254, 98, 3, 1, 237, 52, 98, 3, 1, + 240, 171, 98, 3, 1, 238, 235, 98, 3, 1, 243, 60, 98, 3, 1, 54, 243, 60, + 98, 3, 1, 71, 98, 3, 1, 238, 178, 98, 3, 1, 243, 204, 98, 3, 1, 237, 21, + 98, 3, 1, 236, 216, 98, 3, 1, 240, 202, 98, 3, 1, 249, 131, 98, 3, 1, + 238, 210, 98, 3, 1, 240, 217, 98, 3, 1, 240, 235, 98, 3, 1, 238, 230, 98, + 3, 1, 249, 190, 98, 3, 1, 240, 177, 98, 3, 1, 243, 193, 98, 3, 1, 249, + 132, 98, 3, 1, 253, 175, 98, 3, 1, 244, 14, 98, 3, 1, 248, 140, 98, 3, 1, + 238, 170, 98, 3, 1, 248, 46, 98, 3, 1, 243, 83, 98, 3, 1, 244, 57, 98, 3, + 1, 244, 56, 98, 3, 1, 238, 221, 219, 98, 3, 1, 253, 161, 98, 3, 1, 3, + 248, 74, 98, 3, 1, 3, 254, 136, 2, 242, 226, 98, 3, 1, 253, 162, 98, 3, + 1, 238, 117, 3, 248, 74, 98, 3, 1, 253, 213, 248, 74, 98, 3, 1, 238, 117, + 253, 213, 248, 74, 98, 3, 1, 243, 57, 98, 3, 1, 236, 215, 98, 3, 1, 237, + 40, 98, 3, 1, 234, 87, 67, 98, 3, 1, 237, 19, 236, 216, 62, 5, 1, 243, + 141, 62, 3, 1, 243, 141, 62, 5, 1, 244, 47, 62, 3, 1, 244, 47, 62, 5, 1, + 240, 10, 62, 3, 1, 240, 10, 62, 5, 1, 240, 164, 62, 3, 1, 240, 164, 62, + 5, 1, 248, 154, 62, 3, 1, 248, 154, 62, 5, 1, 249, 167, 62, 3, 1, 249, + 167, 62, 5, 1, 244, 65, 62, 3, 1, 244, 65, 62, 5, 1, 243, 190, 62, 3, 1, + 243, 190, 62, 5, 1, 238, 226, 62, 3, 1, 238, 226, 62, 5, 1, 240, 191, 62, + 3, 1, 240, 191, 62, 5, 1, 243, 62, 62, 3, 1, 243, 62, 62, 5, 1, 240, 197, + 62, 3, 1, 240, 197, 62, 5, 1, 253, 180, 62, 3, 1, 253, 180, 62, 5, 1, + 253, 166, 62, 3, 1, 253, 166, 62, 5, 1, 248, 163, 62, 3, 1, 248, 163, 62, + 5, 1, 73, 62, 3, 1, 73, 62, 5, 1, 253, 147, 62, 3, 1, 253, 147, 62, 5, 1, + 253, 160, 62, 3, 1, 253, 160, 62, 5, 1, 243, 123, 62, 3, 1, 243, 123, 62, + 5, 1, 248, 85, 62, 3, 1, 248, 85, 62, 5, 1, 254, 74, 62, 3, 1, 254, 74, + 62, 5, 1, 253, 245, 62, 3, 1, 253, 245, 62, 5, 1, 248, 219, 62, 3, 1, + 248, 219, 62, 5, 1, 248, 69, 62, 3, 1, 248, 69, 62, 5, 1, 248, 179, 62, + 3, 1, 248, 179, 62, 5, 1, 235, 67, 243, 3, 62, 3, 1, 235, 67, 243, 3, 62, + 5, 1, 76, 62, 248, 105, 62, 3, 1, 76, 62, 248, 105, 62, 5, 1, 231, 93, + 248, 154, 62, 3, 1, 231, 93, 248, 154, 62, 5, 1, 235, 67, 243, 62, 62, 3, + 1, 235, 67, 243, 62, 62, 5, 1, 235, 67, 253, 166, 62, 3, 1, 235, 67, 253, + 166, 62, 5, 1, 231, 93, 253, 166, 62, 3, 1, 231, 93, 253, 166, 62, 5, 1, + 76, 62, 248, 179, 62, 3, 1, 76, 62, 248, 179, 62, 5, 1, 240, 121, 62, 3, + 1, 240, 121, 62, 5, 1, 238, 133, 243, 32, 62, 3, 1, 238, 133, 243, 32, + 62, 5, 1, 76, 62, 243, 32, 62, 3, 1, 76, 62, 243, 32, 62, 5, 1, 76, 62, + 248, 93, 62, 3, 1, 76, 62, 248, 93, 62, 5, 1, 236, 245, 243, 64, 62, 3, + 1, 236, 245, 243, 64, 62, 5, 1, 235, 67, 243, 28, 62, 3, 1, 235, 67, 243, + 28, 62, 5, 1, 76, 62, 243, 28, 62, 3, 1, 76, 62, 243, 28, 62, 5, 1, 76, + 62, 219, 62, 3, 1, 76, 62, 219, 62, 5, 1, 237, 18, 219, 62, 3, 1, 237, + 18, 219, 62, 5, 1, 76, 62, 249, 81, 62, 3, 1, 76, 62, 249, 81, 62, 5, 1, + 76, 62, 248, 214, 62, 3, 1, 76, 62, 248, 214, 62, 5, 1, 76, 62, 238, 115, + 62, 3, 1, 76, 62, 238, 115, 62, 5, 1, 76, 62, 249, 54, 62, 3, 1, 76, 62, + 249, 54, 62, 5, 1, 76, 62, 240, 88, 62, 3, 1, 76, 62, 240, 88, 62, 5, 1, + 76, 240, 43, 240, 88, 62, 3, 1, 76, 240, 43, 240, 88, 62, 5, 1, 76, 240, + 43, 248, 232, 62, 3, 1, 76, 240, 43, 248, 232, 62, 5, 1, 76, 240, 43, + 248, 178, 62, 3, 1, 76, 240, 43, 248, 178, 62, 5, 1, 76, 240, 43, 249, + 198, 62, 3, 1, 76, 240, 43, 249, 198, 62, 12, 249, 91, 62, 12, 255, 82, + 253, 160, 62, 12, 255, 29, 253, 160, 62, 12, 238, 13, 62, 12, 254, 244, + 253, 160, 62, 12, 254, 184, 253, 160, 62, 12, 247, 74, 243, 123, 62, 76, + 240, 43, 248, 37, 208, 62, 76, 240, 43, 240, 169, 236, 156, 69, 62, 76, + 240, 43, 237, 179, 236, 156, 69, 62, 76, 240, 43, 244, 46, 236, 213, 62, + 236, 155, 253, 125, 243, 7, 62, 248, 37, 208, 62, 231, 149, 236, 213, 75, + 3, 1, 254, 19, 75, 3, 1, 248, 195, 75, 3, 1, 248, 158, 75, 3, 1, 248, + 205, 75, 3, 1, 253, 202, 75, 3, 1, 249, 11, 75, 3, 1, 249, 25, 75, 3, 1, + 248, 253, 75, 3, 1, 253, 247, 75, 3, 1, 248, 162, 75, 3, 1, 248, 224, 75, + 3, 1, 248, 131, 75, 3, 1, 248, 171, 75, 3, 1, 254, 9, 75, 3, 1, 248, 236, + 75, 3, 1, 243, 138, 75, 3, 1, 248, 243, 75, 3, 1, 248, 134, 75, 3, 1, + 248, 254, 75, 3, 1, 254, 75, 75, 3, 1, 243, 115, 75, 3, 1, 243, 103, 75, + 3, 1, 243, 95, 75, 3, 1, 248, 242, 75, 3, 1, 243, 33, 75, 3, 1, 243, 88, + 75, 3, 1, 248, 100, 75, 3, 1, 248, 217, 75, 3, 1, 248, 201, 75, 3, 1, + 243, 87, 75, 3, 1, 249, 16, 75, 3, 1, 243, 101, 75, 3, 1, 248, 212, 75, + 3, 1, 253, 168, 75, 3, 1, 248, 160, 75, 3, 1, 253, 170, 75, 3, 1, 248, + 213, 75, 3, 1, 248, 215, 174, 1, 216, 174, 1, 253, 65, 174, 1, 247, 213, + 174, 1, 253, 68, 174, 1, 242, 193, 174, 1, 240, 158, 238, 157, 249, 202, + 174, 1, 249, 202, 174, 1, 253, 66, 174, 1, 247, 216, 174, 1, 247, 215, + 174, 1, 242, 192, 174, 1, 253, 79, 174, 1, 253, 67, 174, 1, 249, 20, 174, + 1, 240, 66, 249, 20, 174, 1, 242, 194, 174, 1, 249, 19, 174, 1, 240, 158, + 238, 157, 249, 19, 174, 1, 240, 66, 249, 19, 174, 1, 247, 218, 174, 1, + 248, 191, 174, 1, 244, 55, 174, 1, 240, 66, 244, 55, 174, 1, 249, 204, + 174, 1, 240, 66, 249, 204, 174, 1, 253, 189, 174, 1, 243, 135, 174, 1, + 238, 239, 243, 135, 174, 1, 240, 66, 243, 135, 174, 1, 253, 69, 174, 1, + 253, 70, 174, 1, 249, 203, 174, 1, 240, 66, 247, 217, 174, 1, 240, 66, + 243, 50, 174, 1, 253, 71, 174, 1, 253, 161, 174, 1, 253, 72, 174, 1, 247, + 219, 174, 1, 243, 134, 174, 1, 240, 66, 243, 134, 174, 1, 249, 246, 243, + 134, 174, 1, 253, 73, 174, 1, 247, 221, 174, 1, 247, 220, 174, 1, 249, + 21, 174, 1, 247, 222, 174, 1, 247, 214, 174, 1, 247, 223, 174, 1, 253, + 74, 174, 1, 253, 75, 174, 1, 253, 76, 174, 1, 249, 205, 174, 1, 235, 32, + 249, 205, 174, 1, 247, 224, 174, 49, 1, 231, 146, 69, 22, 4, 251, 202, + 22, 4, 251, 239, 22, 4, 252, 142, 22, 4, 252, 183, 22, 4, 247, 75, 22, 4, + 250, 128, 22, 4, 252, 226, 22, 4, 250, 165, 22, 4, 252, 32, 22, 4, 246, + 205, 22, 4, 238, 62, 254, 117, 22, 4, 253, 109, 22, 4, 250, 202, 22, 4, + 245, 49, 22, 4, 251, 122, 22, 4, 247, 145, 22, 4, 245, 4, 22, 4, 246, + 246, 22, 4, 252, 71, 22, 4, 245, 116, 22, 4, 245, 118, 22, 4, 241, 135, + 22, 4, 245, 117, 22, 4, 248, 66, 22, 4, 248, 251, 22, 4, 248, 249, 22, 4, + 247, 99, 22, 4, 247, 103, 22, 4, 249, 168, 22, 4, 248, 250, 22, 4, 250, + 148, 22, 4, 250, 152, 22, 4, 250, 150, 22, 4, 244, 245, 22, 4, 244, 246, + 22, 4, 250, 149, 22, 4, 250, 151, 22, 4, 249, 224, 22, 4, 249, 228, 22, + 4, 249, 226, 22, 4, 248, 15, 22, 4, 248, 19, 22, 4, 249, 225, 22, 4, 249, + 227, 22, 4, 244, 247, 22, 4, 244, 251, 22, 4, 244, 249, 22, 4, 241, 45, + 22, 4, 241, 46, 22, 4, 244, 248, 22, 4, 244, 250, 22, 4, 252, 115, 22, 4, + 252, 122, 22, 4, 252, 117, 22, 4, 247, 23, 22, 4, 247, 24, 22, 4, 252, + 116, 22, 4, 252, 118, 22, 4, 251, 175, 22, 4, 251, 179, 22, 4, 251, 177, + 22, 4, 246, 31, 22, 4, 246, 32, 22, 4, 251, 176, 22, 4, 251, 178, 22, 4, + 253, 56, 22, 4, 253, 63, 22, 4, 253, 58, 22, 4, 247, 208, 22, 4, 247, + 209, 22, 4, 253, 57, 22, 4, 253, 59, 22, 4, 251, 39, 22, 4, 251, 44, 22, + 4, 251, 42, 22, 4, 245, 136, 22, 4, 245, 137, 22, 4, 251, 40, 22, 4, 251, + 43, 38, 185, 232, 79, 238, 95, 38, 185, 240, 4, 232, 79, 238, 95, 40, + 232, 79, 104, 38, 232, 79, 104, 40, 240, 4, 232, 79, 104, 38, 240, 4, + 232, 79, 104, 240, 84, 231, 107, 238, 95, 240, 84, 240, 4, 231, 107, 238, + 95, 240, 4, 231, 100, 238, 95, 40, 231, 100, 104, 38, 231, 100, 104, 240, + 84, 238, 59, 40, 240, 84, 237, 26, 104, 38, 240, 84, 237, 26, 104, 236, + 11, 237, 92, 232, 95, 240, 176, 232, 95, 224, 240, 176, 232, 95, 231, + 140, 240, 4, 239, 149, 235, 45, 238, 160, 226, 226, 238, 160, 240, 4, + 231, 36, 240, 54, 45, 238, 106, 238, 93, 40, 170, 234, 61, 104, 38, 170, + 234, 61, 104, 7, 25, 239, 173, 7, 25, 240, 131, 7, 25, 240, 87, 127, 7, + 25, 240, 87, 111, 7, 25, 240, 87, 166, 7, 25, 239, 160, 7, 25, 248, 92, + 7, 25, 240, 241, 7, 25, 243, 209, 127, 7, 25, 243, 209, 111, 7, 25, 233, + 83, 7, 25, 244, 5, 7, 25, 3, 127, 7, 25, 3, 111, 7, 25, 248, 164, 127, 7, + 25, 248, 164, 111, 7, 25, 248, 164, 166, 7, 25, 248, 164, 177, 7, 25, + 242, 119, 7, 25, 238, 228, 7, 25, 244, 21, 127, 7, 25, 244, 21, 111, 7, + 25, 243, 16, 127, 7, 25, 243, 16, 111, 7, 25, 243, 59, 7, 25, 248, 244, + 7, 25, 241, 54, 7, 25, 248, 136, 7, 25, 243, 30, 7, 25, 240, 167, 7, 25, + 239, 140, 7, 25, 235, 189, 7, 25, 244, 50, 127, 7, 25, 244, 50, 111, 7, + 25, 243, 27, 7, 25, 254, 122, 127, 7, 25, 254, 122, 111, 7, 25, 234, 23, + 137, 249, 185, 240, 247, 7, 25, 248, 202, 7, 25, 249, 56, 7, 25, 243, + 199, 7, 25, 249, 33, 147, 240, 132, 7, 25, 249, 59, 7, 25, 240, 237, 127, + 7, 25, 240, 237, 111, 7, 25, 238, 164, 7, 25, 243, 122, 7, 25, 232, 72, + 243, 122, 7, 25, 254, 41, 127, 7, 25, 254, 41, 111, 7, 25, 254, 41, 166, + 7, 25, 254, 41, 177, 7, 25, 246, 65, 7, 25, 240, 225, 7, 25, 249, 151, 7, + 25, 249, 58, 7, 25, 249, 129, 7, 25, 243, 151, 127, 7, 25, 243, 151, 111, + 7, 25, 243, 222, 7, 25, 238, 202, 7, 25, 243, 97, 127, 7, 25, 243, 97, + 111, 7, 25, 243, 97, 166, 7, 25, 240, 245, 7, 25, 236, 255, 7, 25, 248, + 56, 127, 7, 25, 248, 56, 111, 7, 25, 232, 72, 248, 184, 7, 25, 234, 23, + 243, 8, 7, 25, 243, 8, 7, 25, 232, 72, 238, 220, 7, 25, 232, 72, 240, + 227, 7, 25, 243, 94, 7, 25, 232, 72, 243, 154, 7, 25, 234, 23, 244, 48, + 7, 25, 249, 13, 127, 7, 25, 249, 13, 111, 7, 25, 243, 156, 7, 25, 232, + 72, 243, 96, 7, 25, 183, 127, 7, 25, 183, 111, 7, 25, 232, 72, 243, 66, + 7, 25, 232, 72, 243, 178, 7, 25, 243, 227, 127, 7, 25, 243, 227, 111, 7, + 25, 243, 250, 7, 25, 243, 149, 7, 25, 232, 72, 240, 242, 236, 230, 7, 25, + 232, 72, 243, 214, 7, 25, 232, 72, 243, 82, 7, 25, 232, 72, 249, 63, 7, + 25, 254, 58, 127, 7, 25, 254, 58, 111, 7, 25, 254, 58, 166, 7, 25, 232, + 72, 248, 207, 7, 25, 243, 99, 7, 25, 232, 72, 240, 189, 7, 25, 243, 150, + 7, 25, 240, 181, 7, 25, 232, 72, 243, 172, 7, 25, 232, 72, 243, 85, 7, + 25, 232, 72, 244, 4, 7, 25, 234, 23, 240, 153, 7, 25, 234, 23, 238, 232, + 7, 25, 232, 72, 243, 176, 7, 25, 232, 84, 243, 93, 7, 25, 232, 72, 243, + 93, 7, 25, 232, 84, 240, 151, 7, 25, 232, 72, 240, 151, 7, 25, 232, 84, + 238, 137, 7, 25, 232, 72, 238, 137, 7, 25, 238, 125, 7, 25, 232, 84, 238, + 125, 7, 25, 232, 72, 238, 125, 43, 25, 127, 43, 25, 242, 224, 43, 25, + 248, 40, 43, 25, 240, 37, 43, 25, 239, 185, 43, 25, 90, 43, 25, 111, 43, + 25, 251, 195, 43, 25, 248, 131, 43, 25, 246, 41, 43, 25, 241, 95, 43, 25, + 195, 43, 25, 92, 248, 92, 43, 25, 241, 67, 43, 25, 249, 84, 43, 25, 240, + 241, 43, 25, 248, 35, 248, 92, 43, 25, 241, 204, 43, 25, 240, 210, 43, + 25, 247, 197, 43, 25, 242, 125, 43, 25, 38, 248, 35, 248, 92, 43, 25, + 241, 150, 234, 36, 43, 25, 248, 53, 43, 25, 233, 83, 43, 25, 244, 5, 43, + 25, 240, 131, 43, 25, 237, 243, 43, 25, 241, 6, 43, 25, 240, 201, 43, 25, + 234, 36, 43, 25, 240, 49, 43, 25, 238, 2, 43, 25, 253, 234, 43, 25, 255, + 75, 239, 198, 43, 25, 237, 153, 43, 25, 250, 123, 43, 25, 240, 253, 43, + 25, 241, 52, 43, 25, 247, 34, 43, 25, 245, 227, 43, 25, 240, 147, 43, 25, + 246, 37, 43, 25, 239, 32, 43, 25, 239, 202, 43, 25, 235, 102, 43, 25, + 242, 84, 43, 25, 247, 196, 43, 25, 237, 226, 43, 25, 239, 232, 43, 25, + 250, 207, 43, 25, 242, 215, 238, 228, 43, 25, 240, 4, 240, 131, 43, 25, + 183, 239, 206, 43, 25, 171, 241, 147, 43, 25, 242, 107, 43, 25, 248, 198, + 43, 25, 242, 120, 43, 25, 237, 80, 43, 25, 247, 121, 43, 25, 240, 138, + 43, 25, 237, 169, 43, 25, 245, 72, 43, 25, 243, 59, 43, 25, 239, 12, 43, + 25, 248, 244, 43, 25, 239, 183, 43, 25, 239, 44, 43, 25, 249, 245, 43, + 25, 238, 59, 43, 25, 248, 233, 43, 25, 248, 136, 43, 25, 252, 169, 43, + 25, 243, 30, 43, 25, 244, 37, 43, 25, 246, 35, 43, 25, 208, 43, 25, 240, + 167, 43, 25, 239, 247, 43, 25, 255, 48, 248, 233, 43, 25, 237, 89, 43, + 25, 249, 64, 43, 25, 245, 21, 43, 25, 242, 133, 43, 25, 240, 105, 43, 25, + 243, 27, 43, 25, 245, 22, 43, 25, 239, 67, 43, 25, 45, 206, 43, 25, 137, + 249, 185, 240, 247, 43, 25, 242, 115, 43, 25, 245, 89, 43, 25, 248, 202, + 43, 25, 249, 56, 43, 25, 236, 80, 43, 25, 243, 199, 43, 25, 241, 233, 43, + 25, 247, 151, 43, 25, 242, 136, 43, 25, 246, 51, 43, 25, 253, 5, 43, 25, + 241, 106, 43, 25, 249, 33, 147, 240, 132, 43, 25, 236, 103, 43, 25, 240, + 4, 247, 139, 43, 25, 240, 39, 43, 25, 247, 91, 43, 25, 245, 68, 43, 25, + 249, 59, 43, 25, 240, 236, 43, 25, 56, 43, 25, 242, 134, 43, 25, 239, + 201, 43, 25, 242, 156, 43, 25, 241, 140, 43, 25, 244, 243, 43, 25, 242, + 131, 43, 25, 238, 164, 43, 25, 247, 30, 43, 25, 243, 122, 43, 25, 251, + 111, 43, 25, 252, 14, 43, 25, 240, 225, 43, 25, 237, 156, 43, 25, 249, + 129, 43, 25, 248, 91, 43, 25, 246, 252, 43, 25, 248, 206, 43, 25, 241, + 39, 43, 25, 243, 222, 43, 25, 236, 61, 43, 25, 244, 6, 43, 25, 238, 249, + 43, 25, 238, 202, 43, 25, 238, 156, 43, 25, 239, 153, 43, 25, 244, 226, + 43, 25, 236, 108, 43, 25, 241, 63, 43, 25, 241, 142, 43, 25, 240, 245, + 43, 25, 239, 100, 43, 25, 241, 34, 43, 25, 249, 13, 234, 36, 43, 25, 236, + 255, 43, 25, 247, 194, 43, 25, 248, 184, 43, 25, 243, 8, 43, 25, 238, + 220, 43, 25, 239, 238, 43, 25, 244, 213, 43, 25, 252, 66, 43, 25, 239, 1, + 43, 25, 240, 227, 43, 25, 252, 131, 43, 25, 252, 151, 43, 25, 243, 94, + 43, 25, 244, 227, 43, 25, 243, 154, 43, 25, 239, 9, 43, 25, 237, 214, 43, + 25, 244, 48, 43, 25, 243, 156, 43, 25, 243, 133, 43, 25, 232, 132, 43, + 25, 238, 43, 43, 25, 243, 96, 43, 25, 243, 66, 43, 25, 243, 178, 43, 25, + 241, 249, 43, 25, 242, 114, 43, 25, 242, 215, 242, 139, 243, 85, 43, 25, + 243, 250, 43, 25, 243, 149, 43, 25, 242, 187, 43, 25, 243, 39, 43, 25, + 236, 230, 43, 25, 240, 242, 236, 230, 43, 25, 246, 40, 43, 25, 242, 121, + 43, 25, 243, 214, 43, 25, 243, 82, 43, 25, 249, 63, 43, 25, 248, 207, 43, + 25, 243, 99, 43, 25, 236, 27, 43, 25, 240, 189, 43, 25, 243, 150, 43, 25, + 247, 137, 43, 25, 245, 140, 43, 25, 241, 108, 43, 25, 233, 232, 243, 133, + 43, 25, 235, 117, 43, 25, 240, 181, 43, 25, 243, 172, 43, 25, 243, 85, + 43, 25, 244, 4, 43, 25, 243, 164, 43, 25, 240, 153, 43, 25, 245, 141, 43, + 25, 238, 232, 43, 25, 239, 137, 43, 25, 240, 0, 43, 25, 233, 195, 43, 25, + 243, 176, 43, 25, 239, 229, 43, 25, 245, 74, 43, 25, 249, 152, 43, 25, + 246, 176, 43, 25, 243, 93, 43, 25, 240, 151, 43, 25, 238, 137, 43, 25, + 238, 125, 43, 25, 241, 112, 80, 233, 55, 99, 40, 153, 225, 80, 233, 55, + 99, 60, 153, 46, 80, 233, 55, 99, 40, 153, 240, 1, 19, 225, 80, 233, 55, + 99, 60, 153, 240, 1, 19, 46, 80, 233, 55, 99, 248, 37, 236, 121, 80, 233, + 55, 99, 236, 204, 248, 44, 48, 80, 233, 55, 99, 236, 204, 248, 44, 46, + 80, 233, 55, 99, 236, 204, 248, 44, 242, 220, 80, 233, 55, 99, 236, 204, + 248, 44, 189, 242, 220, 80, 233, 55, 99, 236, 204, 248, 44, 189, 225, 80, + 233, 55, 99, 236, 204, 248, 44, 168, 242, 220, 80, 233, 55, 99, 236, 66, + 80, 240, 15, 80, 240, 27, 80, 248, 37, 208, 245, 69, 69, 237, 184, 234, + 206, 237, 44, 91, 80, 235, 77, 69, 80, 238, 171, 69, 80, 61, 242, 217, + 40, 185, 104, 38, 185, 104, 40, 45, 185, 104, 38, 45, 185, 104, 40, 240, + 31, 104, 38, 240, 31, 104, 40, 64, 240, 31, 104, 38, 64, 240, 31, 104, + 40, 86, 234, 11, 104, 38, 86, 234, 11, 104, 240, 142, 69, 251, 16, 69, + 40, 236, 171, 242, 255, 104, 38, 236, 171, 242, 255, 104, 40, 64, 234, + 11, 104, 38, 64, 234, 11, 104, 40, 64, 236, 171, 242, 255, 104, 38, 64, + 236, 171, 242, 255, 104, 40, 64, 31, 104, 38, 64, 31, 104, 248, 141, 242, + 235, 224, 45, 243, 117, 235, 51, 69, 45, 243, 117, 235, 51, 69, 170, 45, + 243, 117, 235, 51, 69, 240, 142, 158, 243, 39, 236, 166, 178, 127, 236, + 166, 178, 111, 236, 166, 178, 166, 236, 166, 178, 177, 236, 166, 178, + 176, 236, 166, 178, 187, 236, 166, 178, 203, 236, 166, 178, 195, 236, + 166, 178, 202, 80, 246, 42, 188, 69, 80, 240, 69, 188, 69, 80, 235, 98, + 188, 69, 80, 237, 151, 188, 69, 23, 240, 12, 53, 188, 69, 23, 45, 53, + 188, 69, 248, 103, 242, 235, 59, 248, 130, 240, 64, 69, 59, 248, 130, + 240, 64, 2, 240, 59, 243, 1, 69, 59, 248, 130, 240, 64, 158, 189, 243, 7, + 59, 248, 130, 240, 64, 2, 240, 59, 243, 1, 158, 189, 243, 7, 59, 248, + 130, 240, 64, 158, 168, 243, 7, 29, 240, 142, 69, 80, 145, 248, 41, 250, + 237, 235, 95, 91, 236, 166, 178, 248, 53, 236, 166, 178, 238, 77, 236, + 166, 178, 238, 101, 59, 80, 235, 77, 69, 251, 219, 69, 249, 134, 233, + 112, 69, 80, 34, 234, 30, 80, 137, 250, 245, 240, 15, 105, 1, 3, 67, 105, + 1, 67, 105, 1, 3, 71, 105, 1, 71, 105, 1, 3, 79, 105, 1, 79, 105, 1, 3, + 72, 105, 1, 72, 105, 1, 3, 73, 105, 1, 73, 105, 1, 201, 105, 1, 253, 139, + 105, 1, 253, 215, 105, 1, 254, 6, 105, 1, 253, 203, 105, 1, 253, 235, + 105, 1, 253, 172, 105, 1, 254, 5, 105, 1, 253, 190, 105, 1, 253, 234, + 105, 1, 253, 132, 105, 1, 253, 163, 105, 1, 253, 198, 105, 1, 254, 17, + 105, 1, 253, 211, 105, 1, 254, 18, 105, 1, 253, 210, 105, 1, 253, 228, + 105, 1, 253, 186, 105, 1, 253, 222, 105, 1, 253, 126, 105, 1, 253, 133, + 105, 1, 253, 212, 105, 1, 253, 201, 105, 1, 3, 253, 196, 105, 1, 253, + 196, 105, 1, 253, 232, 105, 1, 253, 195, 105, 1, 253, 200, 105, 1, 87, + 105, 1, 253, 225, 105, 1, 253, 131, 105, 1, 253, 166, 105, 1, 253, 150, + 105, 1, 253, 197, 105, 1, 253, 173, 105, 1, 219, 105, 1, 253, 141, 105, + 1, 253, 129, 105, 1, 253, 214, 105, 1, 254, 34, 105, 1, 253, 147, 105, 1, + 253, 236, 105, 1, 253, 243, 105, 1, 253, 239, 105, 1, 253, 168, 105, 1, + 253, 242, 105, 1, 253, 175, 105, 1, 253, 184, 105, 1, 254, 1, 105, 1, + 253, 208, 105, 1, 222, 105, 1, 253, 180, 105, 1, 253, 154, 105, 1, 253, + 206, 105, 1, 253, 181, 105, 1, 3, 216, 105, 1, 216, 105, 1, 3, 253, 161, + 105, 1, 253, 161, 105, 1, 3, 253, 162, 105, 1, 253, 162, 105, 1, 253, + 130, 105, 1, 253, 209, 105, 1, 253, 185, 105, 1, 253, 194, 105, 1, 253, + 160, 105, 1, 3, 253, 138, 105, 1, 253, 138, 105, 1, 253, 187, 105, 1, + 253, 170, 105, 1, 253, 177, 105, 1, 197, 105, 1, 254, 49, 105, 1, 3, 201, + 105, 1, 3, 253, 172, 50, 226, 254, 240, 59, 243, 1, 69, 50, 226, 254, + 233, 75, 243, 1, 69, 226, 254, 240, 59, 243, 1, 69, 226, 254, 233, 75, + 243, 1, 69, 105, 235, 77, 69, 105, 240, 59, 235, 77, 69, 105, 238, 112, + 247, 233, 226, 254, 45, 238, 93, 42, 1, 3, 67, 42, 1, 67, 42, 1, 3, 71, + 42, 1, 71, 42, 1, 3, 79, 42, 1, 79, 42, 1, 3, 72, 42, 1, 72, 42, 1, 3, + 73, 42, 1, 73, 42, 1, 201, 42, 1, 253, 139, 42, 1, 253, 215, 42, 1, 254, + 6, 42, 1, 253, 203, 42, 1, 253, 235, 42, 1, 253, 172, 42, 1, 254, 5, 42, + 1, 253, 190, 42, 1, 253, 234, 42, 1, 253, 132, 42, 1, 253, 163, 42, 1, + 253, 198, 42, 1, 254, 17, 42, 1, 253, 211, 42, 1, 254, 18, 42, 1, 253, + 210, 42, 1, 253, 228, 42, 1, 253, 186, 42, 1, 253, 222, 42, 1, 253, 126, + 42, 1, 253, 133, 42, 1, 253, 212, 42, 1, 253, 201, 42, 1, 3, 253, 196, + 42, 1, 253, 196, 42, 1, 253, 232, 42, 1, 253, 195, 42, 1, 253, 200, 42, + 1, 87, 42, 1, 253, 225, 42, 1, 253, 131, 42, 1, 253, 166, 42, 1, 253, + 150, 42, 1, 253, 197, 42, 1, 253, 173, 42, 1, 219, 42, 1, 253, 141, 42, + 1, 253, 129, 42, 1, 253, 214, 42, 1, 254, 34, 42, 1, 253, 147, 42, 1, + 253, 236, 42, 1, 253, 243, 42, 1, 253, 239, 42, 1, 253, 168, 42, 1, 253, + 242, 42, 1, 253, 175, 42, 1, 253, 184, 42, 1, 254, 1, 42, 1, 253, 208, + 42, 1, 222, 42, 1, 253, 180, 42, 1, 253, 154, 42, 1, 253, 206, 42, 1, + 253, 181, 42, 1, 3, 216, 42, 1, 216, 42, 1, 3, 253, 161, 42, 1, 253, 161, + 42, 1, 3, 253, 162, 42, 1, 253, 162, 42, 1, 253, 130, 42, 1, 253, 209, + 42, 1, 253, 185, 42, 1, 253, 194, 42, 1, 253, 160, 42, 1, 3, 253, 138, + 42, 1, 253, 138, 42, 1, 253, 187, 42, 1, 253, 170, 42, 1, 253, 177, 42, + 1, 197, 42, 1, 254, 49, 42, 1, 3, 201, 42, 1, 3, 253, 172, 42, 1, 253, + 171, 42, 1, 254, 48, 42, 1, 254, 12, 42, 1, 254, 13, 42, 240, 1, 248, 40, + 226, 254, 235, 138, 243, 1, 69, 42, 235, 77, 69, 42, 240, 59, 235, 77, + 69, 42, 238, 112, 246, 19, 155, 1, 217, 155, 1, 223, 155, 1, 173, 155, 1, + 255, 19, 155, 1, 209, 155, 1, 214, 155, 1, 197, 155, 1, 162, 155, 1, 210, + 155, 1, 255, 15, 155, 1, 192, 155, 1, 221, 155, 1, 255, 20, 155, 1, 206, + 155, 1, 255, 11, 155, 1, 254, 151, 155, 1, 254, 72, 155, 1, 144, 155, 1, + 255, 17, 155, 1, 255, 18, 155, 1, 193, 155, 1, 67, 155, 1, 73, 155, 1, + 72, 155, 1, 254, 36, 155, 1, 253, 149, 155, 1, 254, 89, 155, 1, 253, 151, + 155, 1, 254, 10, 155, 1, 254, 19, 155, 1, 253, 202, 155, 1, 248, 124, + 155, 1, 248, 108, 155, 1, 254, 4, 155, 1, 71, 155, 1, 79, 155, 1, 254, + 101, 155, 1, 179, 155, 1, 254, 26, 155, 1, 254, 168, 23, 1, 238, 99, 23, + 1, 232, 87, 23, 1, 232, 91, 23, 1, 240, 80, 23, 1, 232, 93, 23, 1, 232, + 94, 23, 1, 238, 102, 23, 1, 232, 101, 23, 1, 240, 85, 23, 1, 231, 98, 23, + 1, 232, 96, 23, 1, 232, 97, 23, 1, 233, 74, 23, 1, 231, 43, 23, 1, 231, + 42, 23, 1, 232, 85, 23, 1, 240, 78, 23, 1, 240, 83, 23, 1, 233, 79, 23, + 1, 233, 66, 23, 1, 243, 34, 23, 1, 234, 32, 23, 1, 240, 75, 23, 1, 240, + 71, 23, 1, 233, 77, 23, 1, 236, 195, 23, 1, 236, 198, 23, 1, 236, 205, + 23, 1, 236, 201, 23, 1, 240, 74, 23, 1, 67, 23, 1, 253, 178, 23, 1, 216, + 23, 1, 249, 18, 23, 1, 254, 59, 23, 1, 72, 23, 1, 249, 22, 23, 1, 253, + 254, 23, 1, 73, 23, 1, 253, 138, 23, 1, 249, 12, 23, 1, 253, 193, 23, 1, + 253, 162, 23, 1, 79, 23, 1, 249, 14, 23, 1, 253, 170, 23, 1, 253, 187, + 23, 1, 253, 161, 23, 1, 254, 61, 23, 1, 253, 189, 23, 1, 71, 23, 238, + 114, 23, 1, 233, 105, 23, 1, 231, 97, 23, 1, 233, 90, 23, 1, 231, 47, 23, + 1, 226, 245, 23, 1, 231, 111, 23, 1, 226, 255, 23, 1, 231, 54, 23, 1, + 226, 246, 23, 1, 232, 92, 23, 1, 233, 86, 23, 1, 231, 46, 23, 1, 231, 40, + 23, 1, 231, 109, 23, 1, 231, 110, 23, 1, 226, 243, 23, 1, 226, 244, 23, + 1, 232, 106, 23, 1, 231, 52, 23, 1, 231, 41, 23, 1, 226, 235, 23, 1, 232, + 99, 23, 1, 233, 102, 23, 1, 232, 100, 23, 1, 233, 76, 23, 1, 233, 101, + 23, 1, 236, 234, 23, 1, 233, 78, 23, 1, 235, 115, 23, 1, 231, 58, 23, 1, + 227, 0, 23, 1, 227, 9, 23, 1, 233, 104, 23, 1, 232, 102, 23, 1, 240, 255, + 23, 1, 238, 233, 23, 1, 244, 58, 23, 1, 238, 234, 23, 1, 241, 0, 23, 1, + 244, 60, 23, 1, 240, 156, 23, 1, 238, 247, 80, 234, 4, 239, 123, 69, 80, + 234, 4, 238, 75, 69, 80, 234, 4, 253, 125, 69, 80, 234, 4, 171, 69, 80, + 234, 4, 204, 69, 80, 234, 4, 248, 58, 69, 80, 234, 4, 253, 159, 69, 80, + 234, 4, 240, 1, 69, 80, 234, 4, 240, 17, 69, 80, 234, 4, 243, 41, 69, 80, + 234, 4, 240, 87, 69, 80, 234, 4, 243, 129, 69, 80, 234, 4, 240, 137, 69, + 80, 234, 4, 241, 148, 69, 80, 234, 4, 243, 168, 69, 80, 234, 4, 254, 111, + 69, 155, 1, 253, 243, 155, 1, 254, 17, 155, 1, 254, 7, 155, 1, 253, 235, + 155, 1, 253, 164, 155, 1, 250, 224, 155, 1, 253, 156, 155, 1, 249, 130, + 155, 1, 254, 177, 155, 1, 249, 238, 155, 1, 251, 105, 155, 1, 252, 254, + 155, 1, 254, 175, 155, 1, 252, 18, 155, 1, 244, 73, 155, 1, 244, 86, 155, + 1, 254, 32, 155, 1, 254, 43, 155, 1, 252, 59, 155, 1, 245, 229, 155, 30, + 1, 223, 155, 30, 1, 214, 155, 30, 1, 255, 15, 155, 30, 1, 192, 7, 240, 5, + 214, 7, 240, 5, 255, 3, 7, 240, 5, 255, 5, 7, 240, 5, 250, 137, 7, 240, + 5, 254, 128, 7, 240, 5, 251, 96, 7, 240, 5, 251, 93, 7, 240, 5, 254, 97, + 7, 240, 5, 245, 219, 7, 240, 5, 247, 134, 7, 240, 5, 251, 94, 7, 240, 5, + 245, 220, 7, 240, 5, 245, 202, 7, 240, 5, 251, 95, 7, 240, 5, 245, 221, + 7, 240, 5, 197, 42, 1, 3, 253, 203, 42, 1, 3, 253, 198, 42, 1, 3, 253, + 211, 42, 1, 3, 87, 42, 1, 3, 253, 150, 42, 1, 3, 219, 42, 1, 3, 253, 214, + 42, 1, 3, 253, 236, 42, 1, 3, 253, 168, 42, 1, 3, 253, 184, 42, 1, 3, + 253, 154, 42, 1, 3, 253, 130, 42, 1, 3, 253, 209, 42, 1, 3, 253, 185, 42, + 1, 3, 253, 194, 42, 1, 3, 253, 160, 82, 23, 238, 99, 82, 23, 240, 80, 82, + 23, 238, 102, 82, 23, 240, 85, 82, 23, 240, 78, 82, 23, 240, 83, 82, 23, + 243, 34, 82, 23, 240, 75, 82, 23, 240, 71, 82, 23, 236, 195, 82, 23, 236, + 198, 82, 23, 236, 205, 82, 23, 236, 201, 82, 23, 240, 74, 82, 23, 240, + 193, 67, 82, 23, 243, 233, 67, 82, 23, 240, 246, 67, 82, 23, 243, 254, + 67, 82, 23, 243, 226, 67, 82, 23, 243, 242, 67, 82, 23, 249, 164, 67, 82, + 23, 243, 100, 67, 82, 23, 243, 90, 67, 82, 23, 238, 169, 67, 82, 23, 238, + 194, 67, 82, 23, 238, 227, 67, 82, 23, 238, 206, 67, 82, 23, 243, 195, + 67, 82, 23, 243, 90, 79, 82, 240, 99, 99, 242, 39, 82, 240, 99, 99, 117, + 253, 236, 82, 110, 127, 82, 110, 111, 82, 110, 166, 82, 110, 177, 82, + 110, 176, 82, 110, 187, 82, 110, 203, 82, 110, 195, 82, 110, 202, 82, + 110, 248, 53, 82, 110, 243, 30, 82, 110, 243, 27, 82, 110, 240, 105, 82, + 110, 244, 52, 82, 110, 240, 199, 82, 110, 240, 49, 82, 110, 248, 136, 82, + 110, 240, 238, 82, 110, 243, 191, 82, 110, 237, 41, 82, 110, 243, 230, + 82, 110, 237, 43, 82, 110, 234, 53, 82, 110, 229, 61, 82, 110, 240, 195, + 82, 110, 234, 247, 82, 110, 244, 241, 82, 110, 240, 239, 82, 110, 234, + 66, 82, 110, 233, 84, 82, 110, 235, 140, 82, 110, 235, 116, 82, 110, 236, + 20, 82, 110, 242, 239, 82, 110, 244, 6, 82, 110, 240, 215, 233, 94, 52, + 29, 61, 240, 48, 127, 29, 61, 240, 48, 111, 29, 61, 240, 48, 166, 29, 61, + 240, 48, 177, 29, 61, 240, 48, 176, 29, 61, 240, 48, 187, 29, 61, 240, + 48, 203, 29, 61, 240, 48, 195, 29, 61, 240, 48, 202, 29, 61, 238, 101, + 29, 61, 240, 53, 127, 29, 61, 240, 53, 111, 29, 61, 240, 53, 166, 29, 61, + 240, 53, 177, 29, 61, 240, 53, 176, 29, 23, 238, 99, 29, 23, 240, 80, 29, + 23, 238, 102, 29, 23, 240, 85, 29, 23, 240, 78, 29, 23, 240, 83, 29, 23, + 243, 34, 29, 23, 240, 75, 29, 23, 240, 71, 29, 23, 236, 195, 29, 23, 236, + 198, 29, 23, 236, 205, 29, 23, 236, 201, 29, 23, 240, 74, 29, 23, 240, + 193, 67, 29, 23, 243, 233, 67, 29, 23, 240, 246, 67, 29, 23, 243, 254, + 67, 29, 23, 243, 226, 67, 29, 23, 243, 242, 67, 29, 23, 249, 164, 67, 29, + 23, 243, 100, 67, 29, 23, 243, 90, 67, 29, 23, 238, 169, 67, 29, 23, 238, + 194, 67, 29, 23, 238, 227, 67, 29, 23, 238, 206, 67, 29, 23, 243, 195, + 67, 29, 240, 99, 99, 239, 20, 29, 240, 99, 99, 241, 190, 29, 23, 243, + 100, 79, 240, 99, 237, 44, 91, 29, 110, 127, 29, 110, 111, 29, 110, 166, + 29, 110, 177, 29, 110, 176, 29, 110, 187, 29, 110, 203, 29, 110, 195, 29, + 110, 202, 29, 110, 248, 53, 29, 110, 243, 30, 29, 110, 243, 27, 29, 110, + 240, 105, 29, 110, 244, 52, 29, 110, 240, 199, 29, 110, 240, 49, 29, 110, + 248, 136, 29, 110, 240, 238, 29, 110, 243, 191, 29, 110, 237, 41, 29, + 110, 243, 230, 29, 110, 237, 43, 29, 110, 234, 53, 29, 110, 229, 61, 29, + 110, 240, 195, 29, 110, 239, 186, 29, 110, 246, 62, 29, 110, 239, 68, 29, + 110, 236, 120, 29, 110, 234, 188, 29, 110, 242, 65, 29, 110, 234, 95, 29, + 110, 245, 232, 29, 110, 242, 239, 29, 110, 245, 27, 29, 110, 237, 93, 29, + 110, 245, 146, 29, 110, 238, 129, 29, 110, 251, 207, 29, 110, 242, 220, + 29, 110, 225, 29, 110, 236, 59, 29, 110, 236, 91, 29, 110, 240, 239, 29, + 110, 234, 66, 29, 110, 233, 84, 29, 110, 235, 140, 29, 110, 235, 116, 29, + 110, 242, 11, 29, 61, 240, 53, 187, 29, 61, 240, 53, 203, 29, 61, 240, + 53, 195, 29, 61, 240, 53, 202, 29, 61, 240, 136, 29, 61, 243, 6, 127, 29, + 61, 243, 6, 111, 29, 61, 243, 6, 166, 29, 61, 243, 6, 177, 29, 61, 243, + 6, 176, 29, 61, 243, 6, 187, 29, 61, 243, 6, 203, 29, 61, 243, 6, 195, + 29, 61, 243, 6, 202, 29, 61, 240, 50, 80, 145, 12, 28, 237, 183, 80, 145, + 12, 28, 236, 19, 80, 145, 12, 28, 241, 229, 80, 145, 12, 28, 241, 12, 80, + 145, 12, 28, 251, 222, 80, 145, 12, 28, 245, 253, 80, 145, 12, 28, 245, + 252, 80, 145, 12, 28, 238, 253, 80, 145, 12, 28, 234, 252, 80, 145, 12, + 28, 237, 224, 80, 145, 12, 28, 236, 65, 80, 145, 12, 28, 235, 200, 31, + 254, 171, 31, 250, 227, 31, 254, 160, 239, 118, 236, 51, 52, 29, 42, 67, + 29, 42, 71, 29, 42, 79, 29, 42, 72, 29, 42, 73, 29, 42, 201, 29, 42, 253, + 215, 29, 42, 253, 203, 29, 42, 253, 172, 29, 42, 253, 190, 29, 42, 253, + 132, 29, 42, 253, 198, 29, 42, 253, 211, 29, 42, 253, 210, 29, 42, 253, + 186, 29, 42, 253, 126, 29, 42, 253, 212, 29, 42, 253, 196, 29, 42, 253, + 195, 29, 42, 87, 29, 42, 253, 131, 29, 42, 253, 166, 29, 42, 253, 150, + 29, 42, 253, 197, 29, 42, 253, 173, 29, 42, 219, 29, 42, 253, 214, 29, + 42, 253, 236, 29, 42, 253, 168, 29, 42, 253, 184, 29, 42, 222, 29, 42, + 253, 180, 29, 42, 253, 154, 29, 42, 253, 206, 29, 42, 253, 181, 29, 42, + 216, 29, 42, 253, 161, 29, 42, 253, 162, 29, 42, 253, 130, 29, 42, 253, + 209, 29, 42, 253, 185, 29, 42, 253, 194, 29, 42, 253, 160, 29, 42, 253, + 138, 29, 42, 253, 187, 29, 42, 253, 170, 29, 42, 253, 177, 31, 238, 246, + 31, 238, 251, 31, 241, 10, 31, 244, 68, 31, 239, 99, 31, 245, 230, 31, + 252, 255, 31, 236, 15, 31, 241, 91, 31, 246, 232, 31, 246, 233, 31, 241, + 192, 31, 237, 187, 31, 237, 188, 31, 241, 124, 31, 241, 123, 31, 245, + 124, 31, 241, 137, 31, 239, 112, 31, 237, 165, 31, 246, 16, 31, 233, 213, + 31, 232, 180, 31, 234, 214, 31, 239, 87, 31, 234, 198, 31, 234, 216, 31, + 237, 192, 31, 241, 196, 31, 239, 110, 31, 241, 205, 31, 237, 254, 31, + 236, 95, 31, 238, 7, 31, 242, 101, 31, 242, 102, 31, 241, 70, 31, 245, + 63, 31, 245, 73, 31, 252, 227, 31, 246, 105, 31, 242, 24, 31, 241, 146, + 31, 236, 67, 31, 242, 46, 31, 237, 69, 31, 234, 233, 31, 239, 161, 31, + 246, 251, 31, 244, 223, 31, 236, 36, 31, 239, 95, 31, 235, 184, 31, 241, + 170, 31, 234, 199, 31, 246, 242, 31, 239, 159, 31, 239, 93, 31, 242, 55, + 31, 242, 52, 31, 241, 26, 31, 239, 164, 31, 239, 11, 31, 251, 77, 31, + 242, 64, 31, 241, 167, 31, 245, 200, 31, 237, 197, 31, 241, 225, 31, 241, + 224, 31, 239, 129, 31, 237, 199, 31, 237, 210, 31, 246, 88, 31, 234, 223, + 31, 243, 106, 31, 237, 207, 31, 237, 206, 31, 242, 190, 31, 242, 191, 31, + 247, 237, 31, 237, 252, 31, 247, 32, 31, 242, 90, 31, 237, 253, 31, 247, + 29, 31, 236, 92, 31, 242, 183, 80, 145, 12, 28, 248, 52, 242, 217, 80, + 145, 12, 28, 248, 52, 127, 80, 145, 12, 28, 248, 52, 111, 80, 145, 12, + 28, 248, 52, 166, 80, 145, 12, 28, 248, 52, 177, 80, 145, 12, 28, 248, + 52, 176, 80, 145, 12, 28, 248, 52, 187, 80, 145, 12, 28, 248, 52, 203, + 80, 145, 12, 28, 248, 52, 195, 80, 145, 12, 28, 248, 52, 202, 80, 145, + 12, 28, 248, 52, 248, 53, 80, 145, 12, 28, 248, 52, 238, 91, 80, 145, 12, + 28, 248, 52, 238, 97, 80, 145, 12, 28, 248, 52, 235, 85, 80, 145, 12, 28, + 248, 52, 235, 82, 80, 145, 12, 28, 248, 52, 236, 207, 80, 145, 12, 28, + 248, 52, 236, 202, 80, 145, 12, 28, 248, 52, 234, 22, 80, 145, 12, 28, + 248, 52, 235, 81, 80, 145, 12, 28, 248, 52, 235, 83, 80, 145, 12, 28, + 248, 52, 238, 77, 80, 145, 12, 28, 248, 52, 233, 110, 80, 145, 12, 28, + 248, 52, 233, 111, 80, 145, 12, 28, 248, 52, 231, 114, 80, 145, 12, 28, + 248, 52, 232, 111, 31, 251, 82, 31, 253, 133, 31, 253, 151, 31, 125, 31, + 254, 219, 31, 254, 222, 31, 254, 156, 31, 255, 53, 236, 191, 31, 255, 53, + 240, 94, 31, 254, 101, 31, 254, 37, 248, 170, 239, 89, 31, 254, 37, 248, + 170, 239, 213, 31, 254, 37, 248, 170, 238, 21, 31, 254, 37, 248, 170, + 241, 232, 31, 232, 123, 31, 255, 87, 244, 79, 31, 253, 131, 31, 255, 27, + 67, 31, 222, 31, 201, 31, 254, 182, 31, 254, 199, 31, 254, 166, 31, 250, + 143, 31, 246, 7, 31, 254, 224, 31, 254, 211, 31, 255, 27, 255, 19, 31, + 255, 27, 210, 31, 254, 202, 31, 254, 106, 31, 254, 173, 31, 251, 147, 31, + 251, 230, 31, 251, 20, 31, 252, 220, 31, 255, 27, 162, 31, 254, 204, 31, + 254, 155, 31, 254, 186, 31, 254, 164, 31, 254, 215, 31, 255, 27, 173, 31, + 254, 205, 31, 254, 152, 31, 254, 187, 31, 255, 61, 236, 191, 31, 255, 52, + 236, 191, 31, 255, 108, 236, 191, 31, 255, 50, 236, 191, 31, 255, 61, + 240, 94, 31, 255, 52, 240, 94, 31, 255, 108, 240, 94, 31, 255, 50, 240, + 94, 31, 255, 108, 248, 59, 193, 31, 255, 108, 248, 59, 255, 99, 236, 191, + 31, 253, 129, 31, 251, 163, 31, 249, 115, 31, 251, 28, 31, 252, 126, 31, + 254, 71, 248, 59, 193, 31, 254, 71, 248, 59, 255, 99, 236, 191, 31, 254, + 229, 31, 254, 216, 31, 255, 27, 193, 31, 254, 206, 31, 254, 230, 31, 254, + 115, 31, 255, 27, 179, 31, 254, 207, 31, 254, 189, 31, 255, 84, 243, 106, + 31, 254, 231, 31, 254, 217, 31, 255, 27, 255, 16, 31, 254, 208, 31, 254, + 108, 31, 255, 85, 243, 106, 31, 255, 109, 249, 126, 31, 255, 108, 249, + 126, 31, 254, 32, 31, 254, 147, 31, 254, 149, 31, 254, 150, 31, 255, 105, + 248, 59, 254, 106, 31, 253, 224, 31, 254, 154, 31, 254, 170, 31, 219, 31, + 254, 97, 31, 253, 247, 31, 254, 107, 31, 255, 50, 237, 83, 31, 254, 188, + 31, 254, 194, 31, 254, 195, 31, 251, 203, 31, 254, 197, 31, 255, 80, 240, + 147, 31, 251, 233, 31, 251, 240, 31, 254, 225, 31, 254, 226, 31, 252, 75, + 31, 254, 228, 31, 254, 241, 31, 254, 127, 31, 255, 2, 31, 255, 110, 248, + 59, 173, 31, 134, 248, 59, 173, 80, 145, 12, 28, 253, 137, 127, 80, 145, + 12, 28, 253, 137, 111, 80, 145, 12, 28, 253, 137, 166, 80, 145, 12, 28, + 253, 137, 177, 80, 145, 12, 28, 253, 137, 176, 80, 145, 12, 28, 253, 137, + 187, 80, 145, 12, 28, 253, 137, 203, 80, 145, 12, 28, 253, 137, 195, 80, + 145, 12, 28, 253, 137, 202, 80, 145, 12, 28, 253, 137, 248, 53, 80, 145, + 12, 28, 253, 137, 238, 91, 80, 145, 12, 28, 253, 137, 238, 97, 80, 145, + 12, 28, 253, 137, 235, 85, 80, 145, 12, 28, 253, 137, 235, 82, 80, 145, + 12, 28, 253, 137, 236, 207, 80, 145, 12, 28, 253, 137, 236, 202, 80, 145, + 12, 28, 253, 137, 234, 22, 80, 145, 12, 28, 253, 137, 235, 81, 80, 145, + 12, 28, 253, 137, 235, 83, 80, 145, 12, 28, 253, 137, 238, 77, 80, 145, + 12, 28, 253, 137, 233, 110, 80, 145, 12, 28, 253, 137, 233, 111, 80, 145, + 12, 28, 253, 137, 231, 114, 80, 145, 12, 28, 253, 137, 232, 111, 80, 145, + 12, 28, 253, 137, 233, 45, 80, 145, 12, 28, 253, 137, 233, 255, 80, 145, + 12, 28, 253, 137, 232, 64, 80, 145, 12, 28, 253, 137, 232, 63, 80, 145, + 12, 28, 253, 137, 233, 46, 80, 145, 12, 28, 253, 137, 238, 101, 80, 145, + 12, 28, 253, 137, 233, 252, 31, 251, 7, 156, 28, 253, 145, 237, 94, 238, + 139, 156, 28, 253, 145, 236, 86, 240, 49, 156, 28, 234, 112, 255, 31, + 253, 145, 234, 97, 156, 28, 238, 48, 241, 113, 156, 28, 237, 51, 156, 28, + 235, 191, 156, 28, 253, 145, 244, 84, 156, 28, 238, 189, 235, 153, 156, + 28, 3, 238, 222, 156, 28, 236, 130, 156, 28, 242, 51, 156, 28, 233, 247, + 156, 28, 233, 201, 156, 28, 243, 58, 233, 224, 156, 28, 237, 212, 156, + 28, 233, 197, 156, 28, 234, 54, 156, 28, 253, 37, 255, 34, 253, 145, 237, + 102, 156, 28, 235, 166, 156, 28, 231, 63, 156, 28, 241, 32, 238, 27, 156, + 28, 241, 139, 156, 28, 236, 104, 241, 11, 156, 28, 238, 211, 156, 28, + 234, 208, 156, 28, 243, 58, 238, 222, 156, 28, 246, 91, 237, 0, 156, 28, + 243, 58, 231, 53, 156, 28, 253, 145, 238, 236, 240, 105, 156, 28, 253, + 145, 237, 87, 243, 27, 156, 28, 234, 207, 156, 28, 236, 9, 156, 28, 237, + 251, 156, 28, 243, 58, 240, 210, 156, 28, 236, 81, 156, 28, 235, 198, + 147, 253, 145, 240, 9, 156, 28, 253, 145, 239, 66, 156, 28, 233, 73, 156, + 28, 232, 189, 156, 28, 232, 128, 156, 28, 235, 201, 156, 28, 235, 127, + 156, 28, 231, 119, 156, 28, 241, 65, 153, 243, 224, 156, 28, 235, 124, + 235, 153, 156, 28, 239, 170, 239, 235, 156, 28, 233, 221, 156, 28, 253, + 145, 247, 193, 156, 28, 233, 231, 156, 28, 253, 145, 235, 117, 156, 28, + 253, 145, 237, 67, 237, 48, 156, 28, 253, 145, 238, 193, 247, 123, 235, + 102, 156, 28, 232, 131, 156, 28, 253, 145, 237, 203, 239, 125, 156, 28, + 234, 89, 156, 28, 253, 145, 236, 139, 156, 28, 253, 145, 241, 125, 243, + 82, 156, 28, 253, 145, 241, 188, 243, 213, 156, 28, 233, 135, 156, 28, + 233, 216, 156, 28, 245, 228, 242, 158, 156, 28, 3, 231, 53, 156, 28, 244, + 70, 233, 69, 156, 28, 241, 27, 233, 69, 6, 4, 254, 179, 6, 4, 254, 180, + 6, 4, 71, 6, 4, 254, 176, 6, 4, 251, 102, 6, 4, 251, 103, 6, 4, 253, 237, + 6, 4, 251, 101, 6, 4, 254, 20, 6, 4, 254, 144, 6, 4, 67, 6, 4, 254, 141, + 6, 4, 253, 1, 6, 4, 254, 252, 6, 4, 253, 0, 6, 4, 254, 67, 6, 4, 254, + 220, 6, 4, 73, 6, 4, 254, 120, 6, 4, 254, 161, 6, 4, 72, 6, 4, 254, 14, + 6, 4, 250, 125, 6, 4, 250, 126, 6, 4, 254, 34, 6, 4, 250, 124, 6, 4, 244, + 221, 6, 4, 244, 222, 6, 4, 250, 122, 6, 4, 244, 220, 6, 4, 250, 104, 6, + 4, 250, 105, 6, 4, 253, 141, 6, 4, 250, 103, 6, 4, 244, 235, 6, 4, 250, + 131, 6, 4, 244, 234, 6, 4, 250, 130, 6, 4, 248, 92, 6, 4, 254, 1, 6, 4, + 250, 129, 6, 4, 250, 119, 6, 4, 253, 242, 6, 4, 250, 116, 6, 4, 250, 133, + 6, 4, 250, 134, 6, 4, 253, 243, 6, 4, 250, 132, 6, 4, 244, 236, 6, 4, + 249, 35, 6, 4, 250, 140, 6, 4, 250, 141, 6, 4, 254, 82, 6, 4, 250, 138, + 6, 4, 244, 238, 6, 4, 250, 139, 6, 4, 252, 68, 6, 4, 252, 69, 6, 4, 253, + 147, 6, 4, 252, 67, 6, 4, 246, 250, 6, 4, 252, 65, 6, 4, 246, 249, 6, 4, + 252, 61, 6, 4, 252, 62, 6, 4, 253, 129, 6, 4, 252, 60, 6, 4, 247, 0, 6, + 4, 252, 78, 6, 4, 246, 255, 6, 4, 252, 73, 6, 4, 252, 74, 6, 4, 253, 208, + 6, 4, 252, 72, 6, 4, 249, 142, 6, 4, 252, 81, 6, 4, 253, 239, 6, 4, 252, + 79, 6, 4, 247, 1, 6, 4, 252, 80, 6, 4, 249, 144, 6, 4, 252, 84, 6, 4, + 254, 232, 6, 4, 252, 82, 6, 4, 247, 3, 6, 4, 252, 83, 6, 4, 244, 200, 6, + 4, 244, 201, 6, 4, 250, 108, 6, 4, 244, 199, 6, 4, 241, 21, 6, 4, 241, + 22, 6, 4, 244, 198, 6, 4, 241, 20, 6, 4, 244, 194, 6, 4, 244, 195, 6, 4, + 250, 106, 6, 4, 244, 193, 6, 4, 241, 24, 6, 4, 244, 205, 6, 4, 241, 23, + 6, 4, 244, 203, 6, 4, 244, 204, 6, 4, 250, 109, 6, 4, 244, 202, 6, 4, + 244, 197, 6, 4, 250, 107, 6, 4, 244, 196, 6, 4, 243, 145, 6, 4, 244, 208, + 6, 4, 250, 110, 6, 4, 244, 206, 6, 4, 241, 25, 6, 4, 244, 207, 6, 4, 244, + 210, 6, 4, 244, 211, 6, 4, 250, 111, 6, 4, 244, 209, 6, 4, 246, 110, 6, + 4, 246, 111, 6, 4, 252, 3, 6, 4, 246, 109, 6, 4, 242, 0, 6, 4, 243, 232, + 6, 4, 241, 255, 6, 4, 246, 107, 6, 4, 246, 108, 6, 4, 252, 2, 6, 4, 246, + 106, 6, 4, 246, 113, 6, 4, 246, 114, 6, 4, 252, 4, 6, 4, 246, 112, 6, 4, + 246, 117, 6, 4, 246, 118, 6, 4, 252, 5, 6, 4, 246, 115, 6, 4, 242, 1, 6, + 4, 246, 116, 6, 4, 246, 121, 6, 4, 246, 122, 6, 4, 252, 6, 6, 4, 246, + 119, 6, 4, 242, 2, 6, 4, 246, 120, 6, 4, 245, 173, 6, 4, 245, 174, 6, 4, + 251, 71, 6, 4, 245, 172, 6, 4, 241, 158, 6, 4, 245, 171, 6, 4, 241, 157, + 6, 4, 245, 169, 6, 4, 245, 170, 6, 4, 251, 70, 6, 4, 245, 168, 6, 4, 241, + 160, 6, 4, 245, 178, 6, 4, 241, 159, 6, 4, 245, 176, 6, 4, 245, 177, 6, + 4, 249, 82, 6, 4, 245, 175, 6, 4, 245, 181, 6, 4, 245, 182, 6, 4, 251, + 72, 6, 4, 245, 179, 6, 4, 241, 161, 6, 4, 245, 180, 6, 4, 245, 185, 6, 4, + 251, 73, 6, 4, 245, 183, 6, 4, 241, 162, 6, 4, 245, 184, 6, 4, 251, 237, + 6, 4, 251, 238, 6, 4, 253, 180, 6, 4, 251, 236, 6, 4, 246, 83, 6, 4, 251, + 231, 6, 4, 246, 82, 6, 4, 251, 220, 6, 4, 251, 221, 6, 4, 222, 6, 4, 251, + 218, 6, 4, 246, 97, 6, 4, 246, 98, 6, 4, 251, 243, 6, 4, 246, 96, 6, 4, + 251, 241, 6, 4, 251, 242, 6, 4, 253, 181, 6, 4, 249, 114, 6, 4, 251, 226, + 6, 4, 253, 206, 6, 4, 251, 246, 6, 4, 251, 247, 6, 4, 253, 154, 6, 4, + 251, 244, 6, 4, 246, 100, 6, 4, 251, 245, 6, 4, 251, 250, 6, 4, 251, 251, + 6, 4, 254, 209, 6, 4, 251, 249, 6, 4, 250, 247, 6, 4, 250, 248, 6, 4, + 253, 245, 6, 4, 250, 246, 6, 4, 250, 235, 6, 4, 250, 236, 6, 4, 253, 179, + 6, 4, 250, 234, 6, 4, 250, 251, 6, 4, 254, 63, 6, 4, 250, 250, 6, 4, 250, + 253, 6, 4, 250, 254, 6, 4, 254, 93, 6, 4, 250, 252, 6, 4, 245, 93, 6, 4, + 249, 64, 6, 4, 251, 3, 6, 4, 251, 4, 6, 4, 254, 165, 6, 4, 251, 2, 6, 4, + 253, 14, 6, 4, 253, 15, 6, 4, 254, 48, 6, 4, 253, 13, 6, 4, 247, 187, 6, + 4, 247, 188, 6, 4, 253, 12, 6, 4, 247, 186, 6, 4, 253, 8, 6, 4, 253, 9, + 6, 4, 253, 171, 6, 4, 253, 7, 6, 4, 253, 18, 6, 4, 253, 20, 6, 4, 254, + 13, 6, 4, 253, 17, 6, 4, 253, 11, 6, 4, 249, 193, 6, 4, 253, 22, 6, 4, + 253, 23, 6, 4, 254, 49, 6, 4, 253, 21, 6, 4, 247, 189, 6, 4, 249, 197, 6, + 4, 253, 27, 6, 4, 253, 28, 6, 4, 255, 1, 6, 4, 253, 25, 6, 4, 247, 190, + 6, 4, 253, 26, 6, 4, 250, 196, 6, 4, 250, 197, 6, 4, 253, 201, 6, 4, 250, + 195, 6, 4, 245, 66, 6, 4, 250, 194, 6, 4, 245, 65, 6, 4, 250, 184, 6, 4, + 250, 187, 6, 4, 253, 133, 6, 4, 250, 182, 6, 4, 245, 75, 6, 4, 250, 209, + 6, 4, 248, 40, 6, 4, 250, 205, 6, 4, 253, 225, 6, 4, 250, 204, 6, 4, 250, + 191, 6, 4, 253, 200, 6, 4, 250, 190, 6, 4, 250, 212, 6, 4, 250, 213, 6, + 4, 253, 232, 6, 4, 250, 210, 6, 4, 245, 76, 6, 4, 250, 211, 6, 4, 252, + 223, 6, 4, 252, 224, 6, 4, 253, 212, 6, 4, 252, 222, 6, 4, 247, 149, 6, + 4, 248, 139, 6, 4, 247, 148, 6, 4, 249, 174, 6, 4, 252, 212, 6, 4, 253, + 126, 6, 4, 252, 209, 6, 4, 247, 174, 6, 4, 247, 175, 6, 4, 252, 233, 6, + 4, 247, 173, 6, 4, 249, 184, 6, 4, 252, 228, 6, 4, 87, 6, 4, 249, 3, 6, + 4, 252, 217, 6, 4, 253, 195, 6, 4, 252, 214, 6, 4, 252, 236, 6, 4, 252, + 237, 6, 4, 253, 196, 6, 4, 252, 234, 6, 4, 247, 176, 6, 4, 252, 235, 6, + 4, 245, 47, 6, 4, 245, 48, 6, 4, 249, 51, 6, 4, 245, 46, 6, 4, 241, 77, + 6, 4, 245, 45, 6, 4, 241, 76, 6, 4, 245, 39, 6, 4, 245, 40, 6, 4, 248, + 75, 6, 4, 245, 38, 6, 4, 241, 79, 6, 4, 245, 53, 6, 4, 241, 78, 6, 4, + 245, 51, 6, 4, 245, 52, 6, 4, 248, 204, 6, 4, 245, 50, 6, 4, 245, 43, 6, + 4, 249, 50, 6, 4, 245, 42, 6, 4, 245, 55, 6, 4, 245, 56, 6, 4, 249, 52, + 6, 4, 245, 54, 6, 4, 241, 80, 6, 4, 243, 163, 6, 4, 246, 130, 6, 4, 246, + 131, 6, 4, 252, 9, 6, 4, 246, 129, 6, 4, 242, 3, 6, 4, 246, 128, 6, 4, + 246, 124, 6, 4, 246, 125, 6, 4, 252, 7, 6, 4, 246, 123, 6, 4, 246, 133, + 6, 4, 246, 134, 6, 4, 252, 10, 6, 4, 246, 132, 6, 4, 246, 127, 6, 4, 252, + 8, 6, 4, 246, 126, 6, 4, 246, 137, 6, 4, 246, 138, 6, 4, 252, 11, 6, 4, + 246, 135, 6, 4, 242, 4, 6, 4, 246, 136, 6, 4, 245, 193, 6, 4, 245, 194, + 6, 4, 251, 75, 6, 4, 245, 192, 6, 4, 241, 164, 6, 4, 241, 165, 6, 4, 245, + 191, 6, 4, 241, 163, 6, 4, 245, 187, 6, 4, 245, 188, 6, 4, 249, 83, 6, 4, + 245, 186, 6, 4, 241, 166, 6, 4, 245, 198, 6, 4, 245, 196, 6, 4, 245, 197, + 6, 4, 245, 195, 6, 4, 245, 190, 6, 4, 251, 74, 6, 4, 245, 189, 6, 4, 245, + 199, 6, 4, 252, 24, 6, 4, 252, 25, 6, 4, 253, 166, 6, 4, 252, 23, 6, 4, + 246, 155, 6, 4, 252, 21, 6, 4, 246, 154, 6, 4, 252, 1, 6, 4, 253, 131, 6, + 4, 251, 255, 6, 4, 246, 195, 6, 4, 252, 41, 6, 4, 246, 194, 6, 4, 248, + 233, 6, 4, 252, 35, 6, 4, 253, 173, 6, 4, 252, 33, 6, 4, 252, 15, 6, 4, + 253, 197, 6, 4, 252, 13, 6, 4, 252, 44, 6, 4, 252, 45, 6, 4, 253, 150, 6, + 4, 252, 42, 6, 4, 246, 196, 6, 4, 252, 43, 6, 4, 245, 155, 6, 4, 245, + 156, 6, 4, 251, 66, 6, 4, 245, 154, 6, 4, 241, 152, 6, 4, 245, 153, 6, 4, + 241, 151, 6, 4, 245, 149, 6, 4, 245, 150, 6, 4, 251, 64, 6, 4, 245, 148, + 6, 4, 241, 154, 6, 4, 245, 159, 6, 4, 241, 153, 6, 4, 245, 158, 6, 4, + 251, 67, 6, 4, 245, 157, 6, 4, 245, 152, 6, 4, 251, 65, 6, 4, 245, 151, + 6, 4, 245, 162, 6, 4, 245, 163, 6, 4, 251, 68, 6, 4, 245, 160, 6, 4, 241, + 155, 6, 4, 245, 161, 6, 4, 245, 166, 6, 4, 245, 167, 6, 4, 251, 69, 6, 4, + 245, 164, 6, 4, 241, 156, 6, 4, 245, 165, 6, 4, 251, 200, 6, 4, 251, 201, + 6, 4, 253, 251, 6, 4, 251, 198, 6, 4, 246, 49, 6, 4, 246, 50, 6, 4, 249, + 105, 6, 4, 246, 48, 6, 4, 251, 185, 6, 4, 251, 186, 6, 4, 253, 134, 6, 4, + 251, 183, 6, 4, 246, 57, 6, 4, 246, 58, 6, 4, 251, 209, 6, 4, 246, 56, 6, + 4, 251, 206, 6, 4, 251, 208, 6, 4, 253, 216, 6, 4, 251, 205, 6, 4, 251, + 191, 6, 4, 253, 250, 6, 4, 251, 189, 6, 4, 251, 212, 6, 4, 251, 213, 6, + 4, 254, 8, 6, 4, 251, 210, 6, 4, 246, 59, 6, 4, 251, 211, 6, 4, 251, 215, + 6, 4, 251, 216, 6, 4, 254, 110, 6, 4, 251, 214, 6, 4, 246, 60, 6, 4, 249, + 109, 6, 4, 251, 23, 6, 4, 251, 24, 6, 4, 254, 6, 6, 4, 251, 22, 6, 4, + 245, 122, 6, 4, 245, 123, 6, 4, 251, 21, 6, 4, 245, 121, 6, 4, 251, 10, + 6, 4, 251, 11, 6, 4, 253, 139, 6, 4, 251, 8, 6, 4, 245, 131, 6, 4, 245, + 132, 6, 4, 251, 31, 6, 4, 245, 130, 6, 4, 249, 78, 6, 4, 251, 27, 6, 4, + 253, 234, 6, 4, 251, 26, 6, 4, 251, 15, 6, 4, 251, 17, 6, 4, 254, 5, 6, + 4, 249, 69, 6, 4, 251, 34, 6, 4, 251, 35, 6, 4, 253, 235, 6, 4, 251, 32, + 6, 4, 245, 133, 6, 4, 251, 33, 6, 4, 249, 95, 6, 4, 251, 152, 6, 4, 253, + 215, 6, 4, 251, 151, 6, 4, 246, 15, 6, 4, 251, 148, 6, 4, 246, 14, 6, 4, + 251, 138, 6, 4, 251, 140, 6, 4, 201, 6, 4, 251, 137, 6, 4, 246, 21, 6, 4, + 251, 165, 6, 4, 246, 20, 6, 4, 251, 161, 6, 4, 251, 162, 6, 4, 253, 190, + 6, 4, 251, 160, 6, 4, 251, 143, 6, 4, 251, 144, 6, 4, 253, 172, 6, 4, + 251, 142, 6, 4, 251, 168, 6, 4, 251, 169, 6, 4, 253, 203, 6, 4, 251, 166, + 6, 4, 246, 23, 6, 4, 251, 167, 6, 4, 245, 108, 6, 4, 245, 109, 6, 4, 249, + 72, 6, 4, 241, 129, 6, 4, 245, 107, 6, 4, 241, 128, 6, 4, 245, 101, 6, 4, + 245, 102, 6, 4, 249, 70, 6, 4, 245, 100, 6, 4, 241, 131, 6, 4, 241, 132, + 6, 4, 243, 181, 6, 4, 241, 130, 6, 4, 245, 110, 6, 4, 245, 111, 6, 4, + 249, 73, 6, 4, 243, 180, 6, 4, 245, 105, 6, 4, 245, 106, 6, 4, 249, 71, + 6, 4, 245, 104, 6, 4, 245, 114, 6, 4, 245, 115, 6, 4, 249, 74, 6, 4, 245, + 112, 6, 4, 241, 133, 6, 4, 245, 113, 6, 4, 241, 238, 6, 4, 246, 72, 6, 4, + 246, 68, 6, 4, 246, 69, 6, 4, 251, 227, 6, 4, 246, 67, 6, 4, 241, 240, 6, + 4, 246, 76, 6, 4, 241, 239, 6, 4, 246, 74, 6, 4, 246, 75, 6, 4, 248, 167, + 6, 4, 246, 73, 6, 4, 246, 71, 6, 4, 251, 228, 6, 4, 246, 70, 6, 4, 246, + 79, 6, 4, 246, 80, 6, 4, 251, 229, 6, 4, 246, 77, 6, 4, 241, 241, 6, 4, + 246, 78, 6, 4, 243, 196, 6, 4, 245, 216, 6, 4, 251, 91, 6, 4, 245, 215, + 6, 4, 241, 172, 6, 4, 241, 173, 6, 4, 245, 214, 6, 4, 241, 171, 6, 4, + 245, 210, 6, 4, 245, 211, 6, 4, 251, 89, 6, 4, 245, 209, 6, 4, 241, 175, + 6, 4, 241, 176, 6, 4, 243, 198, 6, 4, 241, 174, 6, 4, 245, 217, 6, 4, + 245, 218, 6, 4, 251, 92, 6, 4, 243, 197, 6, 4, 245, 213, 6, 4, 251, 90, + 6, 4, 245, 212, 6, 4, 242, 7, 6, 4, 246, 146, 6, 4, 242, 6, 6, 4, 246, + 142, 6, 4, 246, 143, 6, 4, 248, 50, 6, 4, 246, 141, 6, 4, 242, 9, 6, 4, + 242, 10, 6, 4, 246, 153, 6, 4, 246, 151, 6, 4, 246, 152, 6, 4, 248, 172, + 6, 4, 246, 150, 6, 4, 246, 145, 6, 4, 252, 17, 6, 4, 246, 144, 6, 4, 251, + 63, 6, 4, 245, 145, 6, 4, 248, 160, 6, 4, 248, 214, 6, 4, 251, 48, 6, 4, + 219, 6, 4, 251, 47, 6, 4, 245, 206, 6, 4, 245, 207, 6, 4, 251, 83, 6, 4, + 245, 205, 6, 4, 251, 80, 6, 4, 251, 81, 6, 4, 253, 184, 6, 4, 251, 79, 6, + 4, 251, 55, 6, 4, 253, 168, 6, 4, 251, 53, 6, 4, 253, 30, 6, 4, 253, 31, + 6, 4, 253, 138, 6, 4, 253, 29, 6, 4, 247, 200, 6, 4, 253, 39, 6, 4, 247, + 199, 6, 4, 253, 38, 6, 4, 253, 177, 6, 4, 253, 36, 6, 4, 253, 33, 6, 4, + 253, 170, 6, 4, 253, 32, 6, 4, 253, 106, 6, 4, 253, 107, 6, 4, 254, 17, + 6, 4, 253, 105, 6, 4, 248, 10, 6, 4, 253, 104, 6, 4, 248, 9, 6, 4, 253, + 99, 6, 4, 253, 100, 6, 4, 253, 163, 6, 4, 253, 98, 6, 4, 248, 12, 6, 4, + 253, 114, 6, 4, 248, 11, 6, 4, 249, 221, 6, 4, 253, 112, 6, 4, 253, 222, + 6, 4, 253, 111, 6, 4, 253, 102, 6, 4, 253, 228, 6, 4, 253, 101, 6, 4, + 253, 115, 6, 4, 253, 116, 6, 4, 254, 18, 6, 4, 249, 222, 6, 4, 248, 13, + 6, 4, 249, 223, 6, 4, 253, 120, 6, 4, 253, 121, 6, 4, 255, 13, 6, 4, 253, + 118, 6, 4, 248, 14, 6, 4, 253, 119, 6, 4, 250, 163, 6, 4, 250, 164, 6, 4, + 254, 55, 6, 4, 249, 40, 6, 4, 245, 19, 6, 4, 245, 20, 6, 4, 250, 161, 6, + 4, 245, 18, 6, 4, 250, 146, 6, 4, 250, 147, 6, 4, 253, 152, 6, 4, 249, + 38, 6, 4, 245, 28, 6, 4, 250, 170, 6, 4, 243, 157, 6, 4, 250, 167, 6, 4, + 250, 168, 6, 4, 253, 224, 6, 4, 250, 166, 6, 4, 250, 157, 6, 4, 254, 54, + 6, 4, 250, 156, 6, 4, 250, 172, 6, 4, 250, 173, 6, 4, 254, 84, 6, 4, 249, + 43, 6, 4, 245, 29, 6, 4, 250, 171, 6, 4, 249, 48, 6, 4, 250, 176, 6, 4, + 254, 85, 6, 4, 249, 47, 6, 4, 245, 30, 6, 4, 250, 175, 6, 4, 248, 24, 6, + 4, 248, 25, 6, 4, 249, 226, 6, 4, 248, 23, 6, 4, 241, 1, 6, 4, 242, 211, + 6, 4, 248, 22, 6, 4, 242, 210, 6, 4, 248, 17, 6, 4, 248, 18, 6, 4, 249, + 224, 6, 4, 248, 16, 6, 4, 248, 27, 6, 4, 249, 227, 6, 4, 248, 26, 6, 4, + 248, 21, 6, 4, 249, 225, 6, 4, 248, 20, 6, 4, 248, 30, 6, 4, 249, 228, 6, + 4, 248, 28, 6, 4, 242, 212, 6, 4, 248, 29, 6, 4, 248, 33, 6, 4, 248, 34, + 6, 4, 253, 122, 6, 4, 248, 31, 6, 4, 242, 213, 6, 4, 248, 32, 6, 4, 246, + 219, 6, 4, 246, 220, 6, 4, 252, 49, 6, 4, 246, 218, 6, 4, 242, 34, 6, 4, + 246, 217, 6, 4, 242, 33, 6, 4, 246, 214, 6, 4, 246, 215, 6, 4, 252, 47, + 6, 4, 246, 213, 6, 4, 242, 35, 6, 4, 246, 223, 6, 4, 246, 222, 6, 4, 246, + 221, 6, 4, 246, 216, 6, 4, 252, 48, 6, 4, 246, 225, 6, 4, 252, 50, 6, 4, + 243, 239, 6, 4, 242, 36, 6, 4, 246, 224, 6, 4, 246, 228, 6, 4, 246, 229, + 6, 4, 252, 51, 6, 4, 246, 226, 6, 4, 242, 37, 6, 4, 246, 227, 6, 4, 252, + 180, 6, 4, 187, 6, 4, 253, 198, 6, 4, 252, 179, 6, 4, 247, 88, 6, 4, 252, + 176, 6, 4, 247, 87, 6, 4, 252, 167, 6, 4, 252, 168, 6, 4, 253, 132, 6, 4, + 252, 166, 6, 4, 247, 126, 6, 4, 252, 193, 6, 4, 247, 125, 6, 4, 252, 186, + 6, 4, 252, 188, 6, 4, 253, 186, 6, 4, 252, 185, 6, 4, 252, 172, 6, 4, + 253, 210, 6, 4, 252, 171, 6, 4, 252, 196, 6, 4, 252, 197, 6, 4, 253, 211, + 6, 4, 252, 194, 6, 4, 247, 128, 6, 4, 252, 195, 6, 4, 252, 200, 6, 4, + 252, 201, 6, 4, 254, 243, 6, 4, 252, 198, 6, 4, 247, 130, 6, 4, 252, 199, + 6, 4, 247, 108, 6, 4, 247, 109, 6, 4, 248, 249, 6, 4, 247, 107, 6, 4, + 242, 129, 6, 4, 247, 106, 6, 4, 242, 128, 6, 4, 247, 101, 6, 4, 247, 102, + 6, 4, 248, 66, 6, 4, 247, 100, 6, 4, 247, 111, 6, 4, 247, 112, 6, 4, 248, + 250, 6, 4, 247, 110, 6, 4, 247, 105, 6, 4, 249, 168, 6, 4, 247, 104, 6, + 4, 247, 114, 6, 4, 247, 115, 6, 4, 248, 251, 6, 4, 247, 113, 6, 4, 247, + 118, 6, 4, 247, 119, 6, 4, 252, 189, 6, 4, 247, 116, 6, 4, 242, 130, 6, + 4, 247, 117, 6, 4, 247, 247, 6, 4, 247, 248, 6, 4, 248, 99, 6, 4, 247, + 246, 6, 4, 242, 204, 6, 4, 247, 255, 6, 4, 242, 203, 6, 4, 247, 253, 6, + 4, 247, 254, 6, 4, 249, 218, 6, 4, 247, 252, 6, 4, 247, 250, 6, 4, 247, + 251, 6, 4, 248, 123, 6, 4, 247, 249, 6, 4, 248, 2, 6, 4, 248, 3, 6, 4, + 249, 219, 6, 4, 248, 0, 6, 4, 242, 205, 6, 4, 248, 1, 6, 4, 248, 7, 6, 4, + 248, 8, 6, 4, 253, 103, 6, 4, 248, 5, 6, 4, 242, 206, 6, 4, 248, 6, 6, 4, + 244, 255, 6, 4, 245, 0, 6, 4, 248, 57, 6, 4, 244, 254, 6, 4, 241, 57, 6, + 4, 241, 58, 6, 4, 245, 9, 6, 4, 241, 56, 6, 4, 245, 7, 6, 4, 245, 8, 6, + 4, 248, 125, 6, 4, 245, 6, 6, 4, 245, 2, 6, 4, 245, 3, 6, 4, 248, 88, 6, + 4, 245, 1, 6, 4, 245, 12, 6, 4, 248, 200, 6, 4, 245, 10, 6, 4, 241, 59, + 6, 4, 245, 11, 6, 4, 245, 16, 6, 4, 245, 17, 6, 4, 250, 160, 6, 4, 245, + 14, 6, 4, 241, 60, 6, 4, 245, 15, 6, 4, 247, 35, 6, 4, 248, 96, 6, 4, + 242, 87, 6, 4, 247, 43, 6, 4, 247, 41, 6, 4, 247, 42, 6, 4, 249, 157, 6, + 4, 247, 40, 6, 4, 247, 38, 6, 4, 247, 39, 6, 4, 252, 147, 6, 4, 247, 37, + 6, 4, 247, 46, 6, 4, 247, 47, 6, 4, 252, 148, 6, 4, 247, 44, 6, 4, 242, + 88, 6, 4, 247, 45, 6, 4, 247, 50, 6, 4, 247, 51, 6, 4, 252, 149, 6, 4, + 247, 48, 6, 4, 242, 89, 6, 4, 247, 49, 6, 4, 246, 178, 6, 4, 246, 179, 6, + 4, 249, 123, 6, 4, 246, 177, 6, 4, 246, 184, 6, 4, 252, 37, 6, 4, 246, + 183, 6, 4, 246, 181, 6, 4, 246, 182, 6, 4, 252, 36, 6, 4, 246, 180, 6, 4, + 246, 187, 6, 4, 246, 188, 6, 4, 252, 38, 6, 4, 246, 185, 6, 4, 242, 25, + 6, 4, 246, 186, 6, 4, 246, 191, 6, 4, 246, 192, 6, 4, 252, 39, 6, 4, 246, + 189, 6, 4, 242, 26, 6, 4, 246, 190, 6, 4, 244, 8, 6, 4, 247, 69, 6, 4, + 248, 46, 6, 4, 247, 68, 6, 4, 242, 110, 6, 4, 247, 79, 6, 4, 242, 109, 6, + 4, 247, 77, 6, 4, 247, 78, 6, 4, 248, 110, 6, 4, 244, 13, 6, 4, 247, 71, + 6, 4, 247, 72, 6, 4, 248, 118, 6, 4, 247, 70, 6, 4, 247, 81, 6, 4, 247, + 82, 6, 4, 248, 248, 6, 4, 247, 80, 6, 4, 242, 111, 6, 4, 244, 15, 6, 4, + 247, 85, 6, 4, 247, 86, 6, 4, 249, 163, 6, 4, 247, 83, 6, 4, 242, 112, 6, + 4, 247, 84, 6, 4, 249, 152, 6, 4, 252, 130, 6, 4, 253, 130, 6, 4, 248, + 244, 6, 4, 247, 55, 6, 4, 252, 152, 6, 4, 247, 54, 6, 4, 252, 145, 6, 4, + 252, 146, 6, 4, 253, 160, 6, 4, 252, 144, 6, 4, 252, 135, 6, 4, 253, 194, + 6, 4, 252, 133, 6, 4, 252, 155, 6, 4, 252, 156, 6, 4, 253, 185, 6, 4, + 252, 153, 6, 4, 247, 56, 6, 4, 252, 154, 6, 4, 252, 161, 6, 4, 252, 162, + 6, 4, 254, 125, 6, 4, 252, 159, 6, 4, 247, 58, 6, 4, 252, 160, 6, 4, 251, + 118, 6, 4, 251, 119, 6, 4, 254, 7, 6, 4, 251, 117, 6, 4, 245, 236, 6, 4, + 245, 237, 6, 4, 251, 116, 6, 4, 245, 235, 6, 4, 245, 255, 6, 4, 246, 0, + 6, 4, 251, 126, 6, 4, 245, 254, 6, 4, 248, 115, 6, 4, 251, 124, 6, 4, + 253, 248, 6, 4, 251, 123, 6, 4, 251, 129, 6, 4, 251, 130, 6, 4, 254, 25, + 6, 4, 251, 127, 6, 4, 246, 1, 6, 4, 251, 128, 6, 4, 251, 134, 6, 4, 251, + 135, 6, 4, 254, 181, 6, 4, 251, 132, 6, 4, 246, 2, 6, 4, 251, 133, 6, 4, + 252, 96, 6, 4, 252, 97, 6, 4, 254, 28, 6, 4, 252, 95, 6, 4, 247, 13, 6, + 4, 247, 14, 6, 4, 252, 94, 6, 4, 247, 12, 6, 4, 247, 17, 6, 4, 247, 18, + 6, 4, 249, 149, 6, 4, 247, 16, 6, 4, 249, 148, 6, 4, 252, 102, 6, 4, 254, + 45, 6, 4, 252, 101, 6, 4, 252, 109, 6, 4, 252, 111, 6, 4, 254, 29, 6, 4, + 252, 107, 6, 4, 247, 19, 6, 4, 252, 108, 6, 4, 252, 121, 6, 4, 252, 123, + 6, 4, 254, 234, 6, 4, 252, 119, 6, 4, 247, 25, 6, 4, 252, 120, 6, 4, 245, + 240, 6, 4, 245, 241, 6, 4, 249, 86, 6, 4, 245, 239, 6, 4, 241, 183, 6, 4, + 241, 184, 6, 4, 243, 202, 6, 4, 241, 182, 6, 4, 241, 186, 6, 4, 245, 245, + 6, 4, 241, 185, 6, 4, 245, 243, 6, 4, 245, 244, 6, 4, 249, 87, 6, 4, 245, + 242, 6, 4, 243, 203, 6, 4, 245, 248, 6, 4, 249, 88, 6, 4, 245, 246, 6, 4, + 241, 187, 6, 4, 245, 247, 6, 4, 245, 250, 6, 4, 245, 251, 6, 4, 249, 89, + 6, 4, 245, 249, 6, 4, 246, 159, 6, 4, 246, 160, 6, 4, 252, 26, 6, 4, 246, + 158, 6, 4, 242, 14, 6, 4, 242, 15, 6, 4, 246, 157, 6, 4, 242, 13, 6, 4, + 242, 16, 6, 4, 246, 164, 6, 4, 246, 162, 6, 4, 246, 163, 6, 4, 252, 27, + 6, 4, 246, 161, 6, 4, 246, 167, 6, 4, 252, 28, 6, 4, 246, 165, 6, 4, 242, + 17, 6, 4, 246, 166, 6, 4, 246, 170, 6, 4, 246, 171, 6, 4, 252, 29, 6, 4, + 246, 168, 6, 4, 242, 18, 6, 4, 246, 169, 6, 4, 246, 203, 6, 4, 246, 204, + 6, 4, 248, 178, 6, 4, 243, 237, 6, 4, 242, 29, 6, 4, 242, 30, 6, 4, 246, + 202, 6, 4, 242, 28, 6, 4, 242, 32, 6, 4, 246, 208, 6, 4, 242, 31, 6, 4, + 246, 206, 6, 4, 246, 207, 6, 4, 248, 133, 6, 4, 243, 238, 6, 4, 246, 210, + 6, 4, 246, 211, 6, 4, 249, 125, 6, 4, 246, 209, 6, 4, 253, 45, 6, 4, 253, + 46, 6, 4, 253, 188, 6, 4, 253, 44, 6, 4, 247, 202, 6, 4, 247, 203, 6, 4, + 253, 43, 6, 4, 247, 201, 6, 4, 247, 205, 6, 4, 253, 52, 6, 4, 253, 50, 6, + 4, 253, 51, 6, 4, 254, 133, 6, 4, 253, 48, 6, 4, 253, 62, 6, 4, 253, 64, + 6, 4, 255, 7, 6, 4, 253, 60, 6, 4, 247, 210, 6, 4, 253, 61, 6, 4, 249, + 209, 6, 4, 253, 83, 6, 4, 253, 189, 6, 4, 253, 82, 6, 4, 247, 228, 6, 4, + 247, 229, 6, 4, 253, 80, 6, 4, 247, 227, 6, 4, 247, 240, 6, 4, 247, 241, + 6, 4, 253, 88, 6, 4, 247, 239, 6, 4, 249, 211, 6, 4, 253, 86, 6, 4, 253, + 162, 6, 4, 253, 85, 6, 4, 253, 91, 6, 4, 253, 92, 6, 4, 253, 161, 6, 4, + 253, 89, 6, 4, 247, 242, 6, 4, 253, 90, 6, 4, 253, 95, 6, 4, 253, 96, 6, + 4, 254, 77, 6, 4, 253, 93, 6, 4, 247, 243, 6, 4, 253, 94, 6, 25, 249, + 148, 6, 25, 253, 251, 6, 25, 249, 95, 6, 25, 243, 237, 6, 25, 249, 47, 6, + 25, 248, 249, 6, 25, 243, 180, 6, 25, 249, 69, 6, 25, 253, 180, 6, 25, + 243, 196, 6, 25, 249, 109, 6, 25, 243, 145, 6, 25, 249, 114, 6, 25, 253, + 162, 6, 25, 249, 142, 6, 25, 243, 198, 6, 25, 249, 174, 6, 25, 253, 139, + 6, 25, 249, 222, 6, 25, 249, 48, 6, 25, 243, 163, 6, 25, 249, 35, 6, 25, + 243, 181, 6, 25, 243, 238, 6, 25, 253, 196, 6, 25, 254, 120, 6, 25, 243, + 203, 6, 25, 249, 221, 6, 25, 249, 144, 6, 25, 249, 82, 6, 25, 249, 209, + 6, 25, 249, 197, 6, 25, 249, 163, 6, 25, 249, 193, 6, 25, 253, 163, 6, + 25, 253, 248, 6, 25, 243, 239, 6, 25, 249, 89, 6, 25, 249, 78, 6, 25, + 243, 202, 6, 25, 253, 177, 6, 25, 253, 232, 6, 25, 244, 15, 6, 25, 249, + 105, 6, 25, 254, 85, 6, 25, 243, 157, 6, 25, 249, 40, 6, 25, 243, 197, 6, + 25, 244, 8, 6, 25, 249, 223, 6, 25, 244, 13, 6, 25, 248, 88, 6, 25, 241, + 1, 6, 25, 243, 232, 6, 25, 253, 172, 49, 1, 238, 85, 188, 254, 15, 243, + 243, 49, 1, 238, 85, 188, 248, 122, 243, 243, 49, 1, 238, 85, 188, 254, + 15, 240, 222, 49, 1, 238, 85, 188, 248, 122, 240, 222, 49, 1, 238, 85, + 188, 254, 15, 254, 29, 49, 1, 238, 85, 188, 248, 122, 254, 29, 49, 1, + 238, 85, 188, 254, 15, 253, 185, 49, 1, 238, 85, 188, 248, 122, 253, 185, + 49, 1, 234, 27, 240, 4, 188, 125, 49, 1, 200, 240, 4, 188, 125, 49, 1, + 254, 40, 240, 4, 188, 125, 49, 1, 170, 240, 4, 188, 125, 49, 1, 235, 87, + 240, 4, 188, 125, 49, 1, 234, 27, 240, 4, 235, 64, 188, 125, 49, 1, 200, + 240, 4, 235, 64, 188, 125, 49, 1, 254, 40, 240, 4, 235, 64, 188, 125, 49, + 1, 170, 240, 4, 235, 64, 188, 125, 49, 1, 235, 87, 240, 4, 235, 64, 188, + 125, 49, 1, 234, 27, 235, 64, 188, 125, 49, 1, 200, 235, 64, 188, 125, + 49, 1, 254, 40, 235, 64, 188, 125, 49, 1, 170, 235, 64, 188, 125, 49, 1, + 235, 87, 235, 64, 188, 125, 239, 253, 242, 214, 1, 67, 239, 253, 242, + 214, 1, 71, 239, 253, 242, 214, 21, 236, 10, 239, 253, 242, 214, 1, 79, + 239, 253, 242, 214, 1, 72, 239, 253, 242, 214, 1, 73, 239, 253, 242, 214, + 21, 237, 170, 239, 253, 242, 214, 1, 253, 190, 239, 253, 242, 214, 1, + 248, 220, 239, 253, 242, 214, 1, 253, 234, 239, 253, 242, 214, 1, 249, + 75, 239, 253, 242, 214, 21, 235, 61, 239, 253, 242, 214, 1, 253, 224, + 239, 253, 242, 214, 1, 248, 125, 239, 253, 242, 214, 1, 253, 248, 239, + 253, 242, 214, 1, 251, 114, 239, 253, 242, 214, 1, 249, 6, 239, 253, 242, + 214, 1, 243, 131, 239, 253, 242, 214, 1, 248, 204, 239, 253, 242, 214, 1, + 245, 44, 239, 253, 242, 214, 1, 87, 239, 253, 242, 214, 1, 248, 97, 239, + 253, 242, 214, 1, 253, 225, 239, 253, 242, 214, 1, 250, 193, 239, 253, + 242, 214, 1, 253, 173, 239, 253, 242, 214, 1, 253, 208, 239, 253, 242, + 214, 1, 248, 238, 239, 253, 242, 214, 1, 254, 1, 239, 253, 242, 214, 1, + 250, 120, 239, 253, 242, 214, 1, 253, 181, 239, 253, 242, 214, 1, 253, + 160, 239, 253, 242, 214, 1, 253, 216, 239, 253, 242, 214, 1, 249, 157, + 239, 253, 242, 214, 1, 253, 186, 239, 253, 242, 214, 1, 253, 184, 239, + 253, 242, 214, 33, 21, 67, 239, 253, 242, 214, 33, 21, 71, 239, 253, 242, + 214, 33, 21, 79, 239, 253, 242, 214, 33, 21, 72, 239, 253, 242, 214, 33, + 21, 253, 156, 239, 253, 242, 214, 240, 120, 238, 200, 239, 253, 242, 214, + 240, 120, 238, 201, 239, 253, 242, 214, 240, 120, 239, 127, 239, 253, + 242, 214, 240, 120, 239, 128, 7, 9, 229, 68, 7, 9, 229, 69, 7, 9, 229, + 70, 7, 9, 229, 71, 7, 9, 229, 72, 7, 9, 229, 73, 7, 9, 229, 74, 7, 9, + 229, 75, 7, 9, 229, 76, 7, 9, 229, 77, 7, 9, 229, 78, 7, 9, 229, 79, 7, + 9, 229, 80, 7, 9, 229, 81, 7, 9, 229, 82, 7, 9, 229, 83, 7, 9, 229, 84, + 7, 9, 229, 85, 7, 9, 229, 86, 7, 9, 229, 87, 7, 9, 229, 88, 7, 9, 229, + 89, 7, 9, 229, 90, 7, 9, 229, 91, 7, 9, 229, 92, 7, 9, 229, 93, 7, 9, + 229, 94, 7, 9, 229, 95, 7, 9, 229, 96, 7, 9, 229, 97, 7, 9, 229, 98, 7, + 9, 229, 99, 7, 9, 229, 100, 7, 9, 229, 101, 7, 9, 229, 102, 7, 9, 229, + 103, 7, 9, 229, 104, 7, 9, 229, 105, 7, 9, 229, 106, 7, 9, 229, 107, 7, + 9, 229, 108, 7, 9, 229, 109, 7, 9, 229, 110, 7, 9, 229, 111, 7, 9, 229, + 112, 7, 9, 229, 113, 7, 9, 229, 114, 7, 9, 229, 115, 7, 9, 229, 116, 7, + 9, 229, 117, 7, 9, 229, 118, 7, 9, 229, 119, 7, 9, 229, 120, 7, 9, 229, + 121, 7, 9, 229, 122, 7, 9, 229, 123, 7, 9, 229, 124, 7, 9, 229, 125, 7, + 9, 229, 126, 7, 9, 229, 127, 7, 9, 229, 128, 7, 9, 229, 129, 7, 9, 229, + 130, 7, 9, 229, 131, 7, 9, 229, 132, 7, 9, 229, 133, 7, 9, 229, 134, 7, + 9, 229, 135, 7, 9, 229, 136, 7, 9, 229, 137, 7, 9, 229, 138, 7, 9, 229, + 139, 7, 9, 229, 140, 7, 9, 229, 141, 7, 9, 229, 142, 7, 9, 229, 143, 7, + 9, 229, 144, 7, 9, 229, 145, 7, 9, 229, 146, 7, 9, 229, 147, 7, 9, 229, + 148, 7, 9, 229, 149, 7, 9, 229, 150, 7, 9, 229, 151, 7, 9, 229, 152, 7, + 9, 229, 153, 7, 9, 229, 154, 7, 9, 229, 155, 7, 9, 229, 156, 7, 9, 229, + 157, 7, 9, 229, 158, 7, 9, 229, 159, 7, 9, 229, 160, 7, 9, 229, 161, 7, + 9, 229, 162, 7, 9, 229, 163, 7, 9, 229, 164, 7, 9, 229, 165, 7, 9, 229, + 166, 7, 9, 229, 167, 7, 9, 229, 168, 7, 9, 229, 169, 7, 9, 229, 170, 7, + 9, 229, 171, 7, 9, 229, 172, 7, 9, 229, 173, 7, 9, 229, 174, 7, 9, 229, + 175, 7, 9, 229, 176, 7, 9, 229, 177, 7, 9, 229, 178, 7, 9, 229, 179, 7, + 9, 229, 180, 7, 9, 229, 181, 7, 9, 229, 182, 7, 9, 229, 183, 7, 9, 229, + 184, 7, 9, 229, 185, 7, 9, 229, 186, 7, 9, 229, 187, 7, 9, 229, 188, 7, + 9, 229, 189, 7, 9, 229, 190, 7, 9, 229, 191, 7, 9, 229, 192, 7, 9, 229, + 193, 7, 9, 229, 194, 7, 9, 229, 195, 7, 9, 229, 196, 7, 9, 229, 197, 7, + 9, 229, 198, 7, 9, 229, 199, 7, 9, 229, 200, 7, 9, 229, 201, 7, 9, 229, + 202, 7, 9, 229, 203, 7, 9, 229, 204, 7, 9, 229, 205, 7, 9, 229, 206, 7, + 9, 229, 207, 7, 9, 229, 208, 7, 9, 229, 209, 7, 9, 229, 210, 7, 9, 229, + 211, 7, 9, 229, 212, 7, 9, 229, 213, 7, 9, 229, 214, 7, 9, 229, 215, 7, + 9, 229, 216, 7, 9, 229, 217, 7, 9, 229, 218, 7, 9, 229, 219, 7, 9, 229, + 220, 7, 9, 229, 221, 7, 9, 229, 222, 7, 9, 229, 223, 7, 9, 229, 224, 7, + 9, 229, 225, 7, 9, 229, 226, 7, 9, 229, 227, 7, 9, 229, 228, 7, 9, 229, + 229, 7, 9, 229, 230, 7, 9, 229, 231, 7, 9, 229, 232, 7, 9, 229, 233, 7, + 9, 229, 234, 7, 9, 229, 235, 7, 9, 229, 236, 7, 9, 229, 237, 7, 9, 229, + 238, 7, 9, 229, 239, 7, 9, 229, 240, 7, 9, 229, 241, 7, 9, 229, 242, 7, + 9, 229, 243, 7, 9, 229, 244, 7, 9, 229, 245, 7, 9, 229, 246, 7, 9, 229, + 247, 7, 9, 229, 248, 7, 9, 229, 249, 7, 9, 229, 250, 7, 9, 229, 251, 7, + 9, 229, 252, 7, 9, 229, 253, 7, 9, 229, 254, 7, 9, 229, 255, 7, 9, 230, + 0, 7, 9, 230, 1, 7, 9, 230, 2, 7, 9, 230, 3, 7, 9, 230, 4, 7, 9, 230, 5, + 7, 9, 230, 6, 7, 9, 230, 7, 7, 9, 230, 8, 7, 9, 230, 9, 7, 9, 230, 10, 7, + 9, 230, 11, 7, 9, 230, 12, 7, 9, 230, 13, 7, 9, 230, 14, 7, 9, 230, 15, + 7, 9, 230, 16, 7, 9, 230, 17, 7, 9, 230, 18, 7, 9, 230, 19, 7, 9, 230, + 20, 7, 9, 230, 21, 7, 9, 230, 22, 7, 9, 230, 23, 7, 9, 230, 24, 7, 9, + 230, 25, 7, 9, 230, 26, 7, 9, 230, 27, 7, 9, 230, 28, 7, 9, 230, 29, 7, + 9, 230, 30, 7, 9, 230, 31, 7, 9, 230, 32, 7, 9, 230, 33, 7, 9, 230, 34, + 7, 9, 230, 35, 7, 9, 230, 36, 7, 9, 230, 37, 7, 9, 230, 38, 7, 9, 230, + 39, 7, 9, 230, 40, 7, 9, 230, 41, 7, 9, 230, 42, 7, 9, 230, 43, 7, 9, + 230, 44, 7, 9, 230, 45, 7, 9, 230, 46, 7, 9, 230, 47, 7, 9, 230, 48, 7, + 9, 230, 49, 7, 9, 230, 50, 7, 9, 230, 51, 7, 9, 230, 52, 7, 9, 230, 53, + 7, 9, 230, 54, 7, 9, 230, 55, 7, 9, 230, 56, 7, 9, 230, 57, 7, 9, 230, + 58, 7, 9, 230, 59, 7, 9, 230, 60, 7, 9, 230, 61, 7, 9, 230, 62, 7, 9, + 230, 63, 7, 9, 230, 64, 7, 9, 230, 65, 7, 9, 230, 66, 7, 9, 230, 67, 7, + 9, 230, 68, 7, 9, 230, 69, 7, 9, 230, 70, 7, 9, 230, 71, 7, 9, 230, 72, + 7, 9, 230, 73, 7, 9, 230, 74, 7, 9, 230, 75, 7, 9, 230, 76, 7, 9, 230, + 77, 7, 9, 230, 78, 7, 9, 230, 79, 7, 9, 230, 80, 7, 9, 230, 81, 7, 9, + 230, 82, 7, 9, 230, 83, 7, 9, 230, 84, 7, 9, 230, 85, 7, 9, 230, 86, 7, + 9, 230, 87, 7, 9, 230, 88, 7, 9, 230, 89, 7, 9, 230, 90, 7, 9, 230, 91, + 7, 9, 230, 92, 7, 9, 230, 93, 7, 9, 230, 94, 7, 9, 230, 95, 7, 9, 230, + 96, 7, 9, 230, 97, 7, 9, 230, 98, 7, 9, 230, 99, 7, 9, 230, 100, 7, 9, + 230, 101, 7, 9, 230, 102, 7, 9, 230, 103, 7, 9, 230, 104, 7, 9, 230, 105, + 7, 9, 230, 106, 7, 9, 230, 107, 7, 9, 230, 108, 7, 9, 230, 109, 7, 9, + 230, 110, 7, 9, 230, 111, 7, 9, 230, 112, 7, 9, 230, 113, 7, 9, 230, 114, + 7, 9, 230, 115, 7, 9, 230, 116, 7, 9, 230, 117, 7, 9, 230, 118, 7, 9, + 230, 119, 7, 9, 230, 120, 7, 9, 230, 121, 7, 9, 230, 122, 7, 9, 230, 123, + 7, 9, 230, 124, 7, 9, 230, 125, 7, 9, 230, 126, 7, 9, 230, 127, 7, 9, + 230, 128, 7, 9, 230, 129, 7, 9, 230, 130, 7, 9, 230, 131, 7, 9, 230, 132, + 7, 9, 230, 133, 7, 9, 230, 134, 7, 9, 230, 135, 7, 9, 230, 136, 7, 9, + 230, 137, 7, 9, 230, 138, 7, 9, 230, 139, 7, 9, 230, 140, 7, 9, 230, 141, + 7, 9, 230, 142, 7, 9, 230, 143, 7, 9, 230, 144, 7, 9, 230, 145, 7, 9, + 230, 146, 7, 9, 230, 147, 7, 9, 230, 148, 7, 9, 230, 149, 7, 9, 230, 150, + 7, 9, 230, 151, 7, 9, 230, 152, 7, 9, 230, 153, 7, 9, 230, 154, 7, 9, + 230, 155, 7, 9, 230, 156, 7, 9, 230, 157, 7, 9, 230, 158, 7, 9, 230, 159, + 7, 9, 230, 160, 7, 9, 230, 161, 7, 9, 230, 162, 7, 9, 230, 163, 7, 9, + 230, 164, 7, 9, 230, 165, 7, 9, 230, 166, 7, 9, 230, 167, 7, 9, 230, 168, + 7, 9, 230, 169, 7, 9, 230, 170, 7, 9, 230, 171, 7, 9, 230, 172, 7, 9, + 230, 173, 7, 9, 230, 174, 7, 9, 230, 175, 7, 9, 230, 176, 7, 9, 230, 177, + 7, 9, 230, 178, 7, 9, 230, 179, 7, 9, 230, 180, 7, 9, 230, 181, 7, 9, + 230, 182, 7, 9, 230, 183, 7, 9, 230, 184, 7, 9, 230, 185, 7, 9, 230, 186, + 7, 9, 230, 187, 7, 9, 230, 188, 7, 9, 230, 189, 7, 9, 230, 190, 7, 9, + 230, 191, 7, 9, 230, 192, 7, 9, 230, 193, 7, 9, 230, 194, 7, 9, 230, 195, + 7, 9, 230, 196, 7, 9, 230, 197, 7, 9, 230, 198, 7, 9, 230, 199, 7, 9, + 230, 200, 7, 9, 230, 201, 7, 9, 230, 202, 7, 9, 230, 203, 7, 9, 230, 204, + 7, 9, 230, 205, 7, 9, 230, 206, 7, 9, 230, 207, 7, 9, 230, 208, 7, 9, + 230, 209, 7, 9, 230, 210, 7, 9, 230, 211, 7, 9, 230, 212, 7, 9, 230, 213, + 7, 9, 230, 214, 7, 9, 230, 215, 7, 9, 230, 216, 7, 9, 230, 217, 7, 9, + 230, 218, 7, 9, 230, 219, 7, 9, 230, 220, 7, 9, 230, 221, 7, 9, 230, 222, + 7, 9, 230, 223, 7, 9, 230, 224, 7, 9, 230, 225, 7, 9, 230, 226, 7, 9, + 230, 227, 7, 9, 230, 228, 7, 9, 230, 229, 7, 9, 230, 230, 7, 9, 230, 231, + 7, 9, 230, 232, 7, 9, 230, 233, 7, 9, 230, 234, 7, 9, 230, 235, 7, 9, + 230, 236, 7, 9, 230, 237, 7, 9, 230, 238, 7, 9, 230, 239, 7, 9, 230, 240, + 7, 9, 230, 241, 7, 9, 230, 242, 7, 9, 230, 243, 7, 9, 230, 244, 7, 9, + 230, 245, 7, 9, 230, 246, 7, 9, 230, 247, 7, 9, 230, 248, 7, 9, 230, 249, + 7, 9, 230, 250, 7, 9, 230, 251, 7, 9, 230, 252, 7, 9, 230, 253, 7, 9, + 230, 254, 7, 9, 230, 255, 7, 9, 231, 0, 7, 9, 231, 1, 7, 9, 231, 2, 7, 9, + 231, 3, 7, 9, 231, 4, 7, 9, 231, 5, 7, 9, 231, 6, 7, 9, 231, 7, 7, 9, + 231, 8, 7, 9, 231, 9, 7, 9, 231, 10, 7, 9, 231, 11, 7, 9, 231, 12, 7, 9, + 231, 13, 7, 9, 231, 14, 7, 9, 231, 15, 7, 9, 231, 16, 7, 9, 231, 17, 7, + 9, 231, 18, 7, 9, 231, 19, 7, 9, 231, 20, 7, 9, 231, 21, 7, 9, 231, 22, + 8, 3, 18, 254, 162, 8, 3, 18, 253, 245, 8, 3, 18, 254, 163, 8, 3, 18, + 250, 241, 8, 3, 18, 250, 242, 8, 3, 18, 183, 255, 99, 214, 8, 3, 18, 254, + 242, 100, 3, 18, 254, 39, 248, 175, 100, 3, 18, 254, 39, 248, 208, 100, + 3, 18, 254, 39, 248, 216, 100, 3, 18, 255, 0, 248, 175, 100, 3, 18, 254, + 39, 249, 17, 68, 1, 254, 50, 2, 240, 187, 68, 242, 232, 231, 144, 239, + 241, 68, 18, 238, 126, 254, 50, 254, 50, 240, 118, 68, 1, 233, 68, 243, + 144, 68, 1, 248, 98, 243, 3, 68, 1, 248, 98, 240, 165, 68, 1, 248, 98, + 253, 168, 68, 1, 248, 98, 248, 116, 68, 1, 248, 98, 240, 139, 68, 1, 248, + 98, 30, 248, 166, 68, 1, 248, 98, 243, 253, 68, 1, 248, 98, 249, 175, 68, + 1, 233, 68, 248, 49, 52, 68, 1, 248, 102, 2, 248, 102, 248, 40, 68, 1, + 248, 102, 2, 254, 73, 248, 40, 68, 1, 248, 102, 2, 240, 133, 19, 248, + 102, 248, 40, 68, 1, 248, 102, 2, 240, 133, 19, 254, 73, 248, 40, 68, 1, + 83, 2, 240, 118, 68, 1, 83, 2, 238, 149, 68, 1, 83, 2, 240, 140, 68, 1, + 254, 53, 2, 238, 61, 68, 1, 243, 184, 2, 238, 61, 68, 1, 243, 162, 2, + 238, 61, 68, 1, 255, 76, 2, 240, 140, 68, 1, 254, 76, 2, 238, 61, 68, 1, + 247, 244, 2, 238, 61, 68, 1, 254, 247, 2, 238, 61, 68, 1, 254, 50, 2, + 238, 61, 68, 1, 30, 253, 135, 2, 238, 61, 68, 1, 253, 135, 2, 238, 61, + 68, 1, 246, 38, 2, 238, 61, 68, 1, 254, 201, 2, 238, 61, 68, 1, 254, 114, + 2, 238, 61, 68, 1, 242, 94, 2, 238, 61, 68, 1, 30, 255, 38, 2, 238, 61, + 68, 1, 255, 38, 2, 238, 61, 68, 1, 247, 161, 2, 238, 61, 68, 1, 254, 233, + 2, 238, 61, 68, 1, 252, 134, 2, 238, 61, 68, 1, 248, 102, 2, 238, 61, 68, + 1, 254, 245, 2, 238, 61, 68, 1, 254, 76, 2, 240, 188, 68, 1, 254, 53, 2, + 243, 70, 68, 1, 253, 135, 2, 243, 70, 68, 1, 255, 38, 2, 243, 70, 68, 18, + 83, 240, 139, 11, 1, 83, 244, 49, 39, 13, 11, 1, 83, 244, 49, 30, 13, 11, + 1, 248, 147, 39, 13, 11, 1, 248, 147, 30, 13, 11, 1, 248, 147, 54, 13, + 11, 1, 248, 147, 113, 13, 11, 1, 254, 44, 39, 13, 11, 1, 254, 44, 30, 13, + 11, 1, 254, 44, 54, 13, 11, 1, 254, 44, 113, 13, 11, 1, 243, 52, 39, 13, + 11, 1, 243, 52, 30, 13, 11, 1, 243, 52, 54, 13, 11, 1, 243, 52, 113, 13, + 11, 1, 240, 124, 39, 13, 11, 1, 240, 124, 30, 13, 11, 1, 240, 124, 54, + 13, 11, 1, 240, 124, 113, 13, 11, 1, 243, 75, 39, 13, 11, 1, 243, 75, 30, + 13, 11, 1, 243, 75, 54, 13, 11, 1, 243, 75, 113, 13, 11, 1, 248, 189, 39, + 13, 11, 1, 248, 189, 30, 13, 11, 1, 248, 189, 54, 13, 11, 1, 248, 189, + 113, 13, 11, 1, 254, 47, 39, 13, 11, 1, 254, 47, 30, 13, 11, 1, 254, 47, + 54, 13, 11, 1, 254, 47, 113, 13, 11, 1, 243, 69, 39, 13, 11, 1, 243, 69, + 30, 13, 11, 1, 243, 69, 54, 13, 11, 1, 243, 69, 113, 13, 11, 1, 248, 152, + 39, 13, 11, 1, 248, 152, 30, 13, 11, 1, 248, 152, 54, 13, 11, 1, 248, + 152, 113, 13, 11, 1, 248, 177, 39, 13, 11, 1, 248, 177, 30, 13, 11, 1, + 248, 177, 54, 13, 11, 1, 248, 177, 113, 13, 11, 1, 243, 47, 39, 13, 11, + 1, 243, 47, 30, 13, 11, 1, 243, 47, 54, 13, 11, 1, 243, 47, 113, 13, 11, + 1, 238, 123, 39, 13, 11, 1, 238, 123, 30, 13, 11, 1, 238, 123, 54, 13, + 11, 1, 238, 123, 113, 13, 11, 1, 240, 166, 39, 13, 11, 1, 240, 166, 30, + 13, 11, 1, 243, 161, 39, 13, 11, 1, 243, 161, 30, 13, 11, 1, 254, 87, 39, + 13, 11, 1, 254, 87, 30, 13, 11, 1, 249, 49, 39, 13, 11, 1, 249, 49, 30, + 13, 11, 1, 254, 103, 39, 13, 11, 1, 254, 103, 30, 13, 11, 1, 249, 156, + 39, 13, 11, 1, 249, 156, 30, 13, 11, 1, 243, 21, 39, 13, 11, 1, 243, 21, + 30, 13, 11, 1, 243, 21, 54, 13, 11, 1, 243, 21, 113, 13, 11, 1, 253, 246, + 39, 13, 11, 1, 253, 246, 30, 13, 11, 1, 253, 246, 54, 13, 11, 1, 253, + 246, 113, 13, 11, 1, 248, 159, 39, 13, 11, 1, 248, 159, 30, 13, 11, 1, + 248, 159, 54, 13, 11, 1, 248, 159, 113, 13, 11, 1, 243, 67, 39, 13, 11, + 1, 243, 67, 30, 13, 11, 1, 243, 67, 54, 13, 11, 1, 243, 67, 113, 13, 11, + 1, 198, 240, 182, 39, 13, 11, 1, 198, 240, 182, 30, 13, 11, 1, 243, 71, + 39, 13, 11, 1, 243, 71, 30, 13, 11, 1, 243, 71, 54, 13, 11, 1, 243, 71, + 113, 13, 11, 1, 253, 124, 2, 57, 60, 39, 13, 11, 1, 253, 124, 2, 57, 60, + 30, 13, 11, 1, 253, 124, 248, 128, 39, 13, 11, 1, 253, 124, 248, 128, 30, + 13, 11, 1, 253, 124, 248, 128, 54, 13, 11, 1, 253, 124, 248, 128, 113, + 13, 11, 1, 253, 124, 233, 65, 39, 13, 11, 1, 253, 124, 233, 65, 30, 13, + 11, 1, 253, 124, 233, 65, 54, 13, 11, 1, 253, 124, 233, 65, 113, 13, 11, + 1, 57, 240, 92, 39, 13, 11, 1, 57, 240, 92, 30, 13, 11, 1, 57, 240, 92, + 2, 143, 60, 39, 13, 11, 1, 57, 240, 92, 2, 143, 60, 30, 13, 11, 1, 255, + 44, 39, 13, 11, 1, 255, 44, 30, 13, 11, 1, 255, 44, 54, 13, 11, 1, 255, + 44, 113, 13, 11, 1, 132, 39, 13, 11, 1, 132, 30, 13, 11, 1, 255, 33, 39, + 13, 11, 1, 255, 33, 30, 13, 11, 1, 255, 36, 39, 13, 11, 1, 255, 36, 30, + 13, 11, 1, 132, 2, 143, 60, 39, 13, 11, 1, 255, 65, 39, 13, 11, 1, 255, + 65, 30, 13, 11, 1, 238, 73, 255, 33, 39, 13, 11, 1, 238, 73, 255, 33, 30, + 13, 11, 1, 238, 73, 255, 36, 39, 13, 11, 1, 238, 73, 255, 36, 30, 13, 11, + 1, 157, 39, 13, 11, 1, 157, 30, 13, 11, 1, 157, 54, 13, 11, 1, 157, 113, + 13, 11, 1, 240, 104, 240, 192, 238, 73, 83, 150, 54, 13, 11, 1, 240, 104, + 240, 192, 238, 73, 83, 150, 113, 13, 11, 18, 57, 2, 143, 60, 2, 83, 39, + 13, 11, 18, 57, 2, 143, 60, 2, 83, 30, 13, 11, 18, 57, 2, 143, 60, 2, + 255, 30, 39, 13, 11, 18, 57, 2, 143, 60, 2, 255, 30, 30, 13, 11, 18, 57, + 2, 143, 60, 2, 253, 220, 39, 13, 11, 18, 57, 2, 143, 60, 2, 253, 220, 30, + 13, 11, 18, 57, 2, 143, 60, 2, 132, 39, 13, 11, 18, 57, 2, 143, 60, 2, + 132, 30, 13, 11, 18, 57, 2, 143, 60, 2, 255, 33, 39, 13, 11, 18, 57, 2, + 143, 60, 2, 255, 33, 30, 13, 11, 18, 57, 2, 143, 60, 2, 255, 36, 39, 13, + 11, 18, 57, 2, 143, 60, 2, 255, 36, 30, 13, 11, 18, 57, 2, 143, 60, 2, + 157, 39, 13, 11, 18, 57, 2, 143, 60, 2, 157, 30, 13, 11, 18, 57, 2, 143, + 60, 2, 157, 54, 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, + 150, 39, 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, 150, 30, + 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, 150, 54, 13, 11, 1, + 243, 26, 57, 39, 13, 11, 1, 243, 26, 57, 30, 13, 11, 1, 243, 26, 57, 54, + 13, 11, 1, 243, 26, 57, 113, 13, 11, 18, 57, 2, 143, 60, 2, 103, 39, 13, + 11, 18, 57, 2, 143, 60, 2, 94, 39, 13, 11, 18, 57, 2, 143, 60, 2, 51, 39, + 13, 11, 18, 57, 2, 143, 60, 2, 83, 150, 39, 13, 11, 18, 57, 2, 143, 60, + 2, 57, 39, 13, 11, 18, 253, 136, 2, 103, 39, 13, 11, 18, 253, 136, 2, 94, + 39, 13, 11, 18, 253, 136, 2, 164, 39, 13, 11, 18, 253, 136, 2, 51, 39, + 13, 11, 18, 253, 136, 2, 83, 150, 39, 13, 11, 18, 253, 136, 2, 57, 39, + 13, 11, 18, 253, 127, 2, 103, 39, 13, 11, 18, 253, 127, 2, 94, 39, 13, + 11, 18, 253, 127, 2, 164, 39, 13, 11, 18, 253, 127, 2, 51, 39, 13, 11, + 18, 253, 127, 2, 83, 150, 39, 13, 11, 18, 253, 127, 2, 57, 39, 13, 11, + 18, 248, 70, 2, 103, 39, 13, 11, 18, 248, 70, 2, 51, 39, 13, 11, 18, 248, + 70, 2, 83, 150, 39, 13, 11, 18, 248, 70, 2, 57, 39, 13, 11, 18, 103, 2, + 94, 39, 13, 11, 18, 103, 2, 51, 39, 13, 11, 18, 94, 2, 103, 39, 13, 11, + 18, 94, 2, 51, 39, 13, 11, 18, 164, 2, 103, 39, 13, 11, 18, 164, 2, 94, + 39, 13, 11, 18, 164, 2, 51, 39, 13, 11, 18, 248, 39, 2, 103, 39, 13, 11, + 18, 248, 39, 2, 94, 39, 13, 11, 18, 248, 39, 2, 164, 39, 13, 11, 18, 248, + 39, 2, 51, 39, 13, 11, 18, 253, 157, 2, 94, 39, 13, 11, 18, 253, 157, 2, + 51, 39, 13, 11, 18, 253, 155, 2, 103, 39, 13, 11, 18, 253, 155, 2, 94, + 39, 13, 11, 18, 253, 155, 2, 164, 39, 13, 11, 18, 253, 155, 2, 51, 39, + 13, 11, 18, 253, 169, 2, 94, 39, 13, 11, 18, 253, 169, 2, 51, 39, 13, 11, + 18, 253, 255, 2, 51, 39, 13, 11, 18, 253, 158, 2, 103, 39, 13, 11, 18, + 253, 158, 2, 51, 39, 13, 11, 18, 242, 240, 2, 103, 39, 13, 11, 18, 242, + 240, 2, 51, 39, 13, 11, 18, 253, 153, 2, 103, 39, 13, 11, 18, 253, 153, + 2, 94, 39, 13, 11, 18, 253, 153, 2, 164, 39, 13, 11, 18, 253, 153, 2, 51, + 39, 13, 11, 18, 253, 153, 2, 83, 150, 39, 13, 11, 18, 253, 153, 2, 57, + 39, 13, 11, 18, 253, 167, 2, 94, 39, 13, 11, 18, 253, 167, 2, 51, 39, 13, + 11, 18, 253, 167, 2, 83, 150, 39, 13, 11, 18, 253, 167, 2, 57, 39, 13, + 11, 18, 253, 135, 2, 83, 39, 13, 11, 18, 253, 135, 2, 103, 39, 13, 11, + 18, 253, 135, 2, 94, 39, 13, 11, 18, 253, 135, 2, 164, 39, 13, 11, 18, + 253, 135, 2, 182, 39, 13, 11, 18, 253, 135, 2, 51, 39, 13, 11, 18, 253, + 135, 2, 83, 150, 39, 13, 11, 18, 253, 135, 2, 57, 39, 13, 11, 18, 182, 2, + 103, 39, 13, 11, 18, 182, 2, 94, 39, 13, 11, 18, 182, 2, 164, 39, 13, 11, + 18, 182, 2, 51, 39, 13, 11, 18, 182, 2, 83, 150, 39, 13, 11, 18, 182, 2, + 57, 39, 13, 11, 18, 51, 2, 103, 39, 13, 11, 18, 51, 2, 94, 39, 13, 11, + 18, 51, 2, 164, 39, 13, 11, 18, 51, 2, 51, 39, 13, 11, 18, 51, 2, 83, + 150, 39, 13, 11, 18, 51, 2, 57, 39, 13, 11, 18, 198, 2, 103, 39, 13, 11, + 18, 198, 2, 94, 39, 13, 11, 18, 198, 2, 164, 39, 13, 11, 18, 198, 2, 51, + 39, 13, 11, 18, 198, 2, 83, 150, 39, 13, 11, 18, 198, 2, 57, 39, 13, 11, + 18, 253, 124, 2, 103, 39, 13, 11, 18, 253, 124, 2, 51, 39, 13, 11, 18, + 253, 124, 2, 83, 150, 39, 13, 11, 18, 253, 124, 2, 57, 39, 13, 11, 18, + 57, 2, 103, 39, 13, 11, 18, 57, 2, 94, 39, 13, 11, 18, 57, 2, 164, 39, + 13, 11, 18, 57, 2, 51, 39, 13, 11, 18, 57, 2, 83, 150, 39, 13, 11, 18, + 57, 2, 57, 39, 13, 11, 18, 249, 0, 2, 233, 49, 83, 39, 13, 11, 18, 253, + 143, 2, 233, 49, 83, 39, 13, 11, 18, 83, 150, 2, 233, 49, 83, 39, 13, 11, + 18, 240, 47, 2, 237, 1, 39, 13, 11, 18, 240, 47, 2, 237, 15, 39, 13, 11, + 18, 240, 47, 2, 243, 40, 39, 13, 11, 18, 240, 47, 2, 243, 56, 39, 13, 11, + 18, 240, 47, 2, 243, 63, 39, 13, 11, 18, 240, 47, 2, 233, 49, 83, 39, 13, + 11, 18, 57, 2, 143, 60, 2, 253, 143, 30, 13, 11, 18, 57, 2, 143, 60, 2, + 248, 104, 30, 13, 11, 18, 57, 2, 143, 60, 2, 51, 30, 13, 11, 18, 57, 2, + 143, 60, 2, 198, 30, 13, 11, 18, 57, 2, 143, 60, 2, 83, 150, 30, 13, 11, + 18, 57, 2, 143, 60, 2, 57, 30, 13, 11, 18, 253, 136, 2, 253, 143, 30, 13, + 11, 18, 253, 136, 2, 248, 104, 30, 13, 11, 18, 253, 136, 2, 51, 30, 13, + 11, 18, 253, 136, 2, 198, 30, 13, 11, 18, 253, 136, 2, 83, 150, 30, 13, + 11, 18, 253, 136, 2, 57, 30, 13, 11, 18, 253, 127, 2, 253, 143, 30, 13, + 11, 18, 253, 127, 2, 248, 104, 30, 13, 11, 18, 253, 127, 2, 51, 30, 13, + 11, 18, 253, 127, 2, 198, 30, 13, 11, 18, 253, 127, 2, 83, 150, 30, 13, + 11, 18, 253, 127, 2, 57, 30, 13, 11, 18, 248, 70, 2, 253, 143, 30, 13, + 11, 18, 248, 70, 2, 248, 104, 30, 13, 11, 18, 248, 70, 2, 51, 30, 13, 11, + 18, 248, 70, 2, 198, 30, 13, 11, 18, 248, 70, 2, 83, 150, 30, 13, 11, 18, + 248, 70, 2, 57, 30, 13, 11, 18, 253, 153, 2, 83, 150, 30, 13, 11, 18, + 253, 153, 2, 57, 30, 13, 11, 18, 253, 167, 2, 83, 150, 30, 13, 11, 18, + 253, 167, 2, 57, 30, 13, 11, 18, 253, 135, 2, 83, 30, 13, 11, 18, 253, + 135, 2, 182, 30, 13, 11, 18, 253, 135, 2, 51, 30, 13, 11, 18, 253, 135, + 2, 83, 150, 30, 13, 11, 18, 253, 135, 2, 57, 30, 13, 11, 18, 182, 2, 51, + 30, 13, 11, 18, 182, 2, 83, 150, 30, 13, 11, 18, 182, 2, 57, 30, 13, 11, + 18, 51, 2, 83, 30, 13, 11, 18, 51, 2, 51, 30, 13, 11, 18, 198, 2, 253, + 143, 30, 13, 11, 18, 198, 2, 248, 104, 30, 13, 11, 18, 198, 2, 51, 30, + 13, 11, 18, 198, 2, 198, 30, 13, 11, 18, 198, 2, 83, 150, 30, 13, 11, 18, + 198, 2, 57, 30, 13, 11, 18, 83, 150, 2, 233, 49, 83, 30, 13, 11, 18, 57, + 2, 253, 143, 30, 13, 11, 18, 57, 2, 248, 104, 30, 13, 11, 18, 57, 2, 51, + 30, 13, 11, 18, 57, 2, 198, 30, 13, 11, 18, 57, 2, 83, 150, 30, 13, 11, + 18, 57, 2, 57, 30, 13, 11, 18, 57, 2, 143, 60, 2, 103, 54, 13, 11, 18, + 57, 2, 143, 60, 2, 94, 54, 13, 11, 18, 57, 2, 143, 60, 2, 164, 54, 13, + 11, 18, 57, 2, 143, 60, 2, 51, 54, 13, 11, 18, 57, 2, 143, 60, 2, 253, + 124, 54, 13, 11, 18, 253, 136, 2, 103, 54, 13, 11, 18, 253, 136, 2, 94, + 54, 13, 11, 18, 253, 136, 2, 164, 54, 13, 11, 18, 253, 136, 2, 51, 54, + 13, 11, 18, 253, 136, 2, 253, 124, 54, 13, 11, 18, 253, 127, 2, 103, 54, + 13, 11, 18, 253, 127, 2, 94, 54, 13, 11, 18, 253, 127, 2, 164, 54, 13, + 11, 18, 253, 127, 2, 51, 54, 13, 11, 18, 253, 127, 2, 253, 124, 54, 13, + 11, 18, 248, 70, 2, 51, 54, 13, 11, 18, 103, 2, 94, 54, 13, 11, 18, 103, + 2, 51, 54, 13, 11, 18, 94, 2, 103, 54, 13, 11, 18, 94, 2, 51, 54, 13, 11, + 18, 164, 2, 103, 54, 13, 11, 18, 164, 2, 51, 54, 13, 11, 18, 248, 39, 2, + 103, 54, 13, 11, 18, 248, 39, 2, 94, 54, 13, 11, 18, 248, 39, 2, 164, 54, + 13, 11, 18, 248, 39, 2, 51, 54, 13, 11, 18, 253, 157, 2, 94, 54, 13, 11, + 18, 253, 157, 2, 164, 54, 13, 11, 18, 253, 157, 2, 51, 54, 13, 11, 18, + 253, 155, 2, 103, 54, 13, 11, 18, 253, 155, 2, 94, 54, 13, 11, 18, 253, + 155, 2, 164, 54, 13, 11, 18, 253, 155, 2, 51, 54, 13, 11, 18, 253, 169, + 2, 94, 54, 13, 11, 18, 253, 255, 2, 51, 54, 13, 11, 18, 253, 158, 2, 103, + 54, 13, 11, 18, 253, 158, 2, 51, 54, 13, 11, 18, 242, 240, 2, 103, 54, + 13, 11, 18, 242, 240, 2, 51, 54, 13, 11, 18, 253, 153, 2, 103, 54, 13, + 11, 18, 253, 153, 2, 94, 54, 13, 11, 18, 253, 153, 2, 164, 54, 13, 11, + 18, 253, 153, 2, 51, 54, 13, 11, 18, 253, 167, 2, 94, 54, 13, 11, 18, + 253, 167, 2, 51, 54, 13, 11, 18, 253, 135, 2, 103, 54, 13, 11, 18, 253, + 135, 2, 94, 54, 13, 11, 18, 253, 135, 2, 164, 54, 13, 11, 18, 253, 135, + 2, 182, 54, 13, 11, 18, 253, 135, 2, 51, 54, 13, 11, 18, 182, 2, 103, 54, + 13, 11, 18, 182, 2, 94, 54, 13, 11, 18, 182, 2, 164, 54, 13, 11, 18, 182, + 2, 51, 54, 13, 11, 18, 182, 2, 253, 124, 54, 13, 11, 18, 51, 2, 103, 54, + 13, 11, 18, 51, 2, 94, 54, 13, 11, 18, 51, 2, 164, 54, 13, 11, 18, 51, 2, + 51, 54, 13, 11, 18, 198, 2, 103, 54, 13, 11, 18, 198, 2, 94, 54, 13, 11, + 18, 198, 2, 164, 54, 13, 11, 18, 198, 2, 51, 54, 13, 11, 18, 198, 2, 253, + 124, 54, 13, 11, 18, 253, 124, 2, 103, 54, 13, 11, 18, 253, 124, 2, 51, + 54, 13, 11, 18, 253, 124, 2, 233, 49, 83, 54, 13, 11, 18, 57, 2, 103, 54, + 13, 11, 18, 57, 2, 94, 54, 13, 11, 18, 57, 2, 164, 54, 13, 11, 18, 57, 2, + 51, 54, 13, 11, 18, 57, 2, 253, 124, 54, 13, 11, 18, 57, 2, 143, 60, 2, + 51, 113, 13, 11, 18, 57, 2, 143, 60, 2, 253, 124, 113, 13, 11, 18, 253, + 136, 2, 51, 113, 13, 11, 18, 253, 136, 2, 253, 124, 113, 13, 11, 18, 253, + 127, 2, 51, 113, 13, 11, 18, 253, 127, 2, 253, 124, 113, 13, 11, 18, 248, + 70, 2, 51, 113, 13, 11, 18, 248, 70, 2, 253, 124, 113, 13, 11, 18, 248, + 39, 2, 51, 113, 13, 11, 18, 248, 39, 2, 253, 124, 113, 13, 11, 18, 242, + 216, 2, 51, 113, 13, 11, 18, 242, 216, 2, 253, 124, 113, 13, 11, 18, 253, + 135, 2, 182, 113, 13, 11, 18, 253, 135, 2, 51, 113, 13, 11, 18, 182, 2, + 51, 113, 13, 11, 18, 198, 2, 51, 113, 13, 11, 18, 198, 2, 253, 124, 113, + 13, 11, 18, 57, 2, 51, 113, 13, 11, 18, 57, 2, 253, 124, 113, 13, 11, 18, + 240, 47, 2, 243, 40, 113, 13, 11, 18, 240, 47, 2, 243, 56, 113, 13, 11, + 18, 240, 47, 2, 243, 63, 113, 13, 11, 18, 253, 169, 2, 83, 150, 39, 13, + 11, 18, 253, 169, 2, 57, 39, 13, 11, 18, 253, 158, 2, 83, 150, 39, 13, + 11, 18, 253, 158, 2, 57, 39, 13, 11, 18, 242, 240, 2, 83, 150, 39, 13, + 11, 18, 242, 240, 2, 57, 39, 13, 11, 18, 248, 39, 2, 83, 150, 39, 13, 11, + 18, 248, 39, 2, 57, 39, 13, 11, 18, 242, 216, 2, 83, 150, 39, 13, 11, 18, + 242, 216, 2, 57, 39, 13, 11, 18, 94, 2, 83, 150, 39, 13, 11, 18, 94, 2, + 57, 39, 13, 11, 18, 103, 2, 83, 150, 39, 13, 11, 18, 103, 2, 57, 39, 13, + 11, 18, 164, 2, 83, 150, 39, 13, 11, 18, 164, 2, 57, 39, 13, 11, 18, 253, + 157, 2, 83, 150, 39, 13, 11, 18, 253, 157, 2, 57, 39, 13, 11, 18, 253, + 155, 2, 83, 150, 39, 13, 11, 18, 253, 155, 2, 57, 39, 13, 11, 18, 242, + 216, 2, 103, 39, 13, 11, 18, 242, 216, 2, 94, 39, 13, 11, 18, 242, 216, + 2, 164, 39, 13, 11, 18, 242, 216, 2, 51, 39, 13, 11, 18, 242, 216, 2, + 253, 143, 39, 13, 11, 18, 248, 39, 2, 253, 143, 39, 13, 11, 18, 253, 157, + 2, 253, 143, 39, 13, 11, 18, 253, 155, 2, 253, 143, 39, 13, 11, 18, 253, + 169, 2, 83, 150, 30, 13, 11, 18, 253, 169, 2, 57, 30, 13, 11, 18, 253, + 158, 2, 83, 150, 30, 13, 11, 18, 253, 158, 2, 57, 30, 13, 11, 18, 242, + 240, 2, 83, 150, 30, 13, 11, 18, 242, 240, 2, 57, 30, 13, 11, 18, 248, + 39, 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 57, 30, 13, 11, 18, 242, 216, + 2, 83, 150, 30, 13, 11, 18, 242, 216, 2, 57, 30, 13, 11, 18, 94, 2, 83, + 150, 30, 13, 11, 18, 94, 2, 57, 30, 13, 11, 18, 103, 2, 83, 150, 30, 13, + 11, 18, 103, 2, 57, 30, 13, 11, 18, 164, 2, 83, 150, 30, 13, 11, 18, 164, + 2, 57, 30, 13, 11, 18, 253, 157, 2, 83, 150, 30, 13, 11, 18, 253, 157, 2, + 57, 30, 13, 11, 18, 253, 155, 2, 83, 150, 30, 13, 11, 18, 253, 155, 2, + 57, 30, 13, 11, 18, 242, 216, 2, 103, 30, 13, 11, 18, 242, 216, 2, 94, + 30, 13, 11, 18, 242, 216, 2, 164, 30, 13, 11, 18, 242, 216, 2, 51, 30, + 13, 11, 18, 242, 216, 2, 253, 143, 30, 13, 11, 18, 248, 39, 2, 253, 143, + 30, 13, 11, 18, 253, 157, 2, 253, 143, 30, 13, 11, 18, 253, 155, 2, 253, + 143, 30, 13, 11, 18, 242, 216, 2, 103, 54, 13, 11, 18, 242, 216, 2, 94, + 54, 13, 11, 18, 242, 216, 2, 164, 54, 13, 11, 18, 242, 216, 2, 51, 54, + 13, 11, 18, 248, 39, 2, 253, 124, 54, 13, 11, 18, 242, 216, 2, 253, 124, + 54, 13, 11, 18, 253, 169, 2, 51, 54, 13, 11, 18, 248, 39, 2, 103, 113, + 13, 11, 18, 248, 39, 2, 94, 113, 13, 11, 18, 248, 39, 2, 164, 113, 13, + 11, 18, 242, 216, 2, 103, 113, 13, 11, 18, 242, 216, 2, 94, 113, 13, 11, + 18, 242, 216, 2, 164, 113, 13, 11, 18, 253, 169, 2, 51, 113, 13, 11, 18, + 253, 255, 2, 51, 113, 13, 11, 18, 83, 2, 236, 214, 30, 13, 11, 18, 83, 2, + 236, 214, 39, 13, 240, 206, 40, 232, 74, 240, 206, 38, 232, 74, 11, 18, + 253, 127, 2, 103, 2, 51, 54, 13, 11, 18, 253, 127, 2, 94, 2, 103, 30, 13, + 11, 18, 253, 127, 2, 94, 2, 103, 54, 13, 11, 18, 253, 127, 2, 94, 2, 51, + 54, 13, 11, 18, 253, 127, 2, 164, 2, 51, 54, 13, 11, 18, 253, 127, 2, 51, + 2, 103, 54, 13, 11, 18, 253, 127, 2, 51, 2, 94, 54, 13, 11, 18, 253, 127, + 2, 51, 2, 164, 54, 13, 11, 18, 103, 2, 51, 2, 94, 30, 13, 11, 18, 103, 2, + 51, 2, 94, 54, 13, 11, 18, 94, 2, 51, 2, 57, 30, 13, 11, 18, 94, 2, 51, + 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 94, 2, 103, 54, 13, 11, 18, 248, + 39, 2, 103, 2, 94, 54, 13, 11, 18, 248, 39, 2, 103, 2, 83, 150, 30, 13, + 11, 18, 248, 39, 2, 51, 2, 94, 30, 13, 11, 18, 248, 39, 2, 51, 2, 94, 54, + 13, 11, 18, 248, 39, 2, 51, 2, 103, 54, 13, 11, 18, 248, 39, 2, 51, 2, + 51, 30, 13, 11, 18, 248, 39, 2, 51, 2, 51, 54, 13, 11, 18, 253, 157, 2, + 94, 2, 94, 30, 13, 11, 18, 253, 157, 2, 94, 2, 94, 54, 13, 11, 18, 253, + 157, 2, 51, 2, 51, 30, 13, 11, 18, 242, 216, 2, 94, 2, 51, 30, 13, 11, + 18, 242, 216, 2, 94, 2, 51, 54, 13, 11, 18, 242, 216, 2, 103, 2, 57, 30, + 13, 11, 18, 242, 216, 2, 51, 2, 164, 30, 13, 11, 18, 242, 216, 2, 51, 2, + 164, 54, 13, 11, 18, 242, 216, 2, 51, 2, 51, 30, 13, 11, 18, 242, 216, 2, + 51, 2, 51, 54, 13, 11, 18, 253, 155, 2, 94, 2, 83, 150, 30, 13, 11, 18, + 253, 155, 2, 164, 2, 51, 30, 13, 11, 18, 253, 155, 2, 164, 2, 51, 54, 13, + 11, 18, 253, 169, 2, 51, 2, 94, 30, 13, 11, 18, 253, 169, 2, 51, 2, 94, + 54, 13, 11, 18, 253, 169, 2, 51, 2, 51, 54, 13, 11, 18, 253, 169, 2, 51, + 2, 57, 30, 13, 11, 18, 253, 158, 2, 103, 2, 51, 30, 13, 11, 18, 253, 158, + 2, 51, 2, 51, 30, 13, 11, 18, 253, 158, 2, 51, 2, 51, 54, 13, 11, 18, + 253, 158, 2, 51, 2, 83, 150, 30, 13, 11, 18, 242, 240, 2, 51, 2, 51, 30, + 13, 11, 18, 242, 240, 2, 51, 2, 57, 30, 13, 11, 18, 242, 240, 2, 51, 2, + 83, 150, 30, 13, 11, 18, 253, 153, 2, 164, 2, 51, 30, 13, 11, 18, 253, + 153, 2, 164, 2, 51, 54, 13, 11, 18, 253, 167, 2, 51, 2, 94, 30, 13, 11, + 18, 253, 167, 2, 51, 2, 51, 30, 13, 11, 18, 182, 2, 94, 2, 51, 30, 13, + 11, 18, 182, 2, 94, 2, 57, 30, 13, 11, 18, 182, 2, 94, 2, 83, 150, 30, + 13, 11, 18, 182, 2, 103, 2, 103, 54, 13, 11, 18, 182, 2, 103, 2, 103, 30, + 13, 11, 18, 182, 2, 164, 2, 51, 30, 13, 11, 18, 182, 2, 164, 2, 51, 54, + 13, 11, 18, 182, 2, 51, 2, 94, 30, 13, 11, 18, 182, 2, 51, 2, 94, 54, 13, + 11, 18, 51, 2, 94, 2, 103, 54, 13, 11, 18, 51, 2, 94, 2, 51, 54, 13, 11, + 18, 51, 2, 94, 2, 57, 30, 13, 11, 18, 51, 2, 103, 2, 94, 54, 13, 11, 18, + 51, 2, 103, 2, 51, 54, 13, 11, 18, 51, 2, 164, 2, 103, 54, 13, 11, 18, + 51, 2, 164, 2, 51, 54, 13, 11, 18, 51, 2, 103, 2, 164, 54, 13, 11, 18, + 253, 124, 2, 51, 2, 103, 54, 13, 11, 18, 253, 124, 2, 51, 2, 51, 54, 13, + 11, 18, 198, 2, 94, 2, 51, 54, 13, 11, 18, 198, 2, 94, 2, 83, 150, 30, + 13, 11, 18, 198, 2, 103, 2, 51, 30, 13, 11, 18, 198, 2, 103, 2, 51, 54, + 13, 11, 18, 198, 2, 103, 2, 83, 150, 30, 13, 11, 18, 198, 2, 51, 2, 57, + 30, 13, 11, 18, 198, 2, 51, 2, 83, 150, 30, 13, 11, 18, 57, 2, 51, 2, 51, + 30, 13, 11, 18, 57, 2, 51, 2, 51, 54, 13, 11, 18, 253, 136, 2, 164, 2, + 57, 30, 13, 11, 18, 253, 127, 2, 103, 2, 57, 30, 13, 11, 18, 253, 127, 2, + 103, 2, 83, 150, 30, 13, 11, 18, 253, 127, 2, 164, 2, 57, 30, 13, 11, 18, + 253, 127, 2, 164, 2, 83, 150, 30, 13, 11, 18, 253, 127, 2, 51, 2, 57, 30, + 13, 11, 18, 253, 127, 2, 51, 2, 83, 150, 30, 13, 11, 18, 103, 2, 51, 2, + 57, 30, 13, 11, 18, 103, 2, 94, 2, 83, 150, 30, 13, 11, 18, 103, 2, 51, + 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 164, 2, 83, 150, 30, 13, 11, 18, + 253, 157, 2, 94, 2, 57, 30, 13, 11, 18, 242, 216, 2, 94, 2, 57, 30, 13, + 11, 18, 253, 155, 2, 94, 2, 57, 30, 13, 11, 18, 182, 2, 103, 2, 57, 30, + 13, 11, 18, 182, 2, 51, 2, 57, 30, 13, 11, 18, 57, 2, 94, 2, 57, 30, 13, + 11, 18, 57, 2, 103, 2, 57, 30, 13, 11, 18, 57, 2, 51, 2, 57, 30, 13, 11, + 18, 51, 2, 51, 2, 57, 30, 13, 11, 18, 253, 167, 2, 51, 2, 57, 30, 13, 11, + 18, 198, 2, 94, 2, 57, 30, 13, 11, 18, 253, 167, 2, 51, 2, 94, 54, 13, + 11, 18, 182, 2, 94, 2, 51, 54, 13, 11, 18, 253, 158, 2, 51, 2, 57, 30, + 13, 11, 18, 253, 135, 2, 51, 2, 57, 30, 13, 11, 18, 198, 2, 103, 2, 94, + 54, 13, 11, 18, 51, 2, 164, 2, 57, 30, 13, 11, 18, 182, 2, 103, 2, 51, + 54, 13, 11, 18, 253, 135, 2, 51, 2, 51, 30, 13, 11, 18, 182, 2, 103, 2, + 51, 30, 13, 11, 18, 198, 2, 103, 2, 94, 30, 13, 11, 18, 103, 2, 94, 2, + 57, 30, 13, 11, 18, 94, 2, 103, 2, 57, 30, 13, 11, 18, 51, 2, 103, 2, 57, + 30, 13, 11, 18, 253, 153, 2, 51, 2, 57, 30, 13, 11, 18, 253, 136, 2, 94, + 2, 57, 30, 13, 11, 18, 253, 135, 2, 51, 2, 51, 54, 13, 11, 18, 253, 158, + 2, 103, 2, 51, 54, 13, 11, 18, 253, 157, 2, 51, 2, 51, 54, 13, 11, 18, + 248, 39, 2, 164, 2, 57, 30, 13, 11, 18, 198, 2, 103, 2, 57, 30, 13, 11, + 18, 244, 3, 249, 191, 255, 24, 238, 197, 248, 119, 21, 39, 13, 11, 18, + 252, 85, 249, 191, 255, 24, 238, 197, 248, 119, 21, 39, 13, 11, 18, 244, + 77, 39, 13, 11, 18, 244, 75, 39, 13, 11, 18, 237, 213, 39, 13, 11, 18, + 247, 64, 39, 13, 11, 18, 242, 77, 39, 13, 11, 18, 240, 107, 39, 13, 11, + 18, 238, 45, 39, 13, 11, 18, 244, 3, 39, 13, 11, 18, 233, 100, 240, 107, + 236, 140, 11, 18, 229, 46, 252, 136, 52, 11, 18, 235, 181, 235, 168, 234, + 93, 34, 233, 233, 34, 233, 234, 34, 233, 235, 34, 233, 236, 34, 233, 237, + 34, 233, 238, 34, 233, 239, 34, 233, 240, 34, 233, 241, 34, 232, 204, 34, + 232, 205, 34, 232, 206, 34, 232, 207, 34, 232, 208, 34, 232, 209, 34, + 232, 210, 232, 70, 248, 38, 28, 59, 240, 27, 232, 70, 248, 38, 28, 59, + 80, 240, 27, 232, 70, 248, 38, 28, 59, 80, 248, 37, 208, 232, 70, 248, + 38, 28, 59, 240, 24, 232, 70, 248, 38, 28, 59, 234, 14, 232, 70, 248, 38, + 28, 59, 233, 54, 69, 232, 70, 248, 38, 28, 59, 236, 156, 69, 232, 70, + 248, 38, 28, 59, 40, 64, 234, 11, 104, 232, 70, 248, 38, 28, 59, 38, 64, + 234, 11, 237, 79, 232, 70, 248, 38, 28, 59, 163, 235, 69, 50, 18, 40, + 243, 7, 50, 18, 38, 243, 7, 50, 45, 242, 219, 40, 243, 7, 50, 45, 242, + 219, 38, 243, 7, 232, 70, 248, 38, 28, 59, 171, 53, 238, 143, 232, 70, + 248, 38, 28, 59, 255, 28, 242, 235, 232, 70, 248, 38, 28, 59, 255, 23, + 242, 235, 232, 70, 248, 38, 28, 59, 170, 242, 224, 232, 70, 248, 38, 28, + 59, 248, 103, 170, 242, 224, 232, 70, 248, 38, 28, 59, 40, 232, 74, 232, + 70, 248, 38, 28, 59, 38, 232, 74, 232, 70, 248, 38, 28, 59, 40, 242, 225, + 104, 232, 70, 248, 38, 28, 59, 38, 242, 225, 104, 232, 70, 248, 38, 28, + 59, 40, 236, 171, 242, 255, 104, 232, 70, 248, 38, 28, 59, 38, 236, 171, + 242, 255, 104, 232, 70, 248, 38, 28, 59, 40, 86, 234, 11, 104, 232, 70, + 248, 38, 28, 59, 38, 86, 234, 11, 104, 232, 70, 248, 38, 28, 59, 40, 45, + 185, 104, 232, 70, 248, 38, 28, 59, 38, 45, 185, 104, 232, 70, 248, 38, + 28, 59, 40, 185, 104, 232, 70, 248, 38, 28, 59, 38, 185, 104, 232, 70, + 248, 38, 28, 59, 40, 240, 31, 104, 232, 70, 248, 38, 28, 59, 38, 240, 31, + 104, 232, 70, 248, 38, 28, 59, 40, 64, 240, 31, 104, 232, 70, 248, 38, + 28, 59, 38, 64, 240, 31, 104, 240, 221, 248, 40, 64, 240, 221, 248, 40, + 232, 70, 248, 38, 28, 59, 40, 31, 104, 232, 70, 248, 38, 28, 59, 38, 31, + 104, 240, 55, 235, 74, 234, 48, 235, 74, 248, 103, 235, 74, 45, 248, 103, + 235, 74, 240, 55, 170, 242, 224, 234, 48, 170, 242, 224, 248, 103, 170, + 242, 224, 3, 240, 27, 3, 80, 240, 27, 3, 248, 37, 208, 3, 234, 14, 3, + 240, 24, 3, 236, 156, 69, 3, 233, 54, 69, 3, 255, 28, 242, 235, 3, 40, + 232, 74, 3, 38, 232, 74, 3, 40, 242, 225, 104, 3, 38, 242, 225, 104, 3, + 40, 236, 171, 242, 255, 104, 3, 38, 236, 171, 242, 255, 104, 3, 61, 52, + 3, 234, 17, 3, 235, 52, 3, 248, 49, 52, 3, 231, 94, 3, 235, 44, 52, 3, + 232, 68, 52, 3, 240, 7, 52, 3, 238, 75, 236, 177, 3, 240, 114, 52, 3, + 238, 107, 52, 3, 234, 20, 254, 20, 11, 236, 214, 39, 13, 11, 239, 214, 2, + 236, 214, 48, 11, 237, 1, 39, 13, 11, 248, 138, 236, 26, 11, 237, 15, 39, + 13, 11, 243, 40, 39, 13, 11, 243, 40, 113, 13, 11, 243, 56, 39, 13, 11, + 243, 56, 113, 13, 11, 243, 63, 39, 13, 11, 243, 63, 113, 13, 11, 240, 47, + 39, 13, 11, 240, 47, 113, 13, 11, 244, 25, 39, 13, 11, 244, 25, 113, 13, + 11, 1, 143, 39, 13, 11, 1, 83, 2, 243, 42, 60, 39, 13, 11, 1, 83, 2, 243, + 42, 60, 30, 13, 11, 1, 83, 2, 143, 60, 39, 13, 11, 1, 83, 2, 143, 60, 30, + 13, 11, 1, 253, 220, 2, 143, 60, 39, 13, 11, 1, 253, 220, 2, 143, 60, 30, + 13, 11, 1, 83, 2, 143, 242, 230, 39, 13, 11, 1, 83, 2, 143, 242, 230, 30, + 13, 11, 1, 57, 2, 143, 60, 39, 13, 11, 1, 57, 2, 143, 60, 30, 13, 11, 1, + 57, 2, 143, 60, 54, 13, 11, 1, 57, 2, 143, 60, 113, 13, 11, 1, 83, 39, + 13, 11, 1, 83, 30, 13, 11, 1, 253, 136, 39, 13, 11, 1, 253, 136, 30, 13, + 11, 1, 253, 136, 54, 13, 11, 1, 253, 136, 113, 13, 11, 1, 253, 127, 238, + 144, 39, 13, 11, 1, 253, 127, 238, 144, 30, 13, 11, 1, 253, 127, 39, 13, + 11, 1, 253, 127, 30, 13, 11, 1, 253, 127, 54, 13, 11, 1, 253, 127, 113, + 13, 11, 1, 248, 70, 39, 13, 11, 1, 248, 70, 30, 13, 11, 1, 248, 70, 54, + 13, 11, 1, 248, 70, 113, 13, 11, 1, 103, 39, 13, 11, 1, 103, 30, 13, 11, + 1, 103, 54, 13, 11, 1, 103, 113, 13, 11, 1, 94, 39, 13, 11, 1, 94, 30, + 13, 11, 1, 94, 54, 13, 11, 1, 94, 113, 13, 11, 1, 164, 39, 13, 11, 1, + 164, 30, 13, 11, 1, 164, 54, 13, 11, 1, 164, 113, 13, 11, 1, 253, 199, + 39, 13, 11, 1, 253, 199, 30, 13, 11, 1, 249, 0, 39, 13, 11, 1, 249, 0, + 30, 13, 11, 1, 253, 143, 39, 13, 11, 1, 253, 143, 30, 13, 11, 1, 248, + 104, 39, 13, 11, 1, 248, 104, 30, 13, 11, 1, 248, 39, 39, 13, 11, 1, 248, + 39, 30, 13, 11, 1, 248, 39, 54, 13, 11, 1, 248, 39, 113, 13, 11, 1, 242, + 216, 39, 13, 11, 1, 242, 216, 30, 13, 11, 1, 242, 216, 54, 13, 11, 1, + 242, 216, 113, 13, 11, 1, 253, 157, 39, 13, 11, 1, 253, 157, 30, 13, 11, + 1, 253, 157, 54, 13, 11, 1, 253, 157, 113, 13, 11, 1, 253, 155, 39, 13, + 11, 1, 253, 155, 30, 13, 11, 1, 253, 155, 54, 13, 11, 1, 253, 155, 113, + 13, 11, 1, 253, 169, 39, 13, 11, 1, 253, 169, 30, 13, 11, 1, 253, 169, + 54, 13, 11, 1, 253, 169, 113, 13, 11, 1, 253, 255, 39, 13, 11, 1, 253, + 255, 30, 13, 11, 1, 253, 255, 54, 13, 11, 1, 253, 255, 113, 13, 11, 1, + 253, 158, 39, 13, 11, 1, 253, 158, 30, 13, 11, 1, 253, 158, 54, 13, 11, + 1, 253, 158, 113, 13, 11, 1, 242, 240, 39, 13, 11, 1, 242, 240, 30, 13, + 11, 1, 242, 240, 54, 13, 11, 1, 242, 240, 113, 13, 11, 1, 253, 153, 39, + 13, 11, 1, 253, 153, 30, 13, 11, 1, 253, 153, 54, 13, 11, 1, 253, 153, + 113, 13, 11, 1, 253, 167, 39, 13, 11, 1, 253, 167, 30, 13, 11, 1, 253, + 167, 54, 13, 11, 1, 253, 167, 113, 13, 11, 1, 253, 135, 39, 13, 11, 1, + 253, 135, 30, 13, 11, 1, 253, 135, 54, 13, 11, 1, 253, 135, 113, 13, 11, + 1, 182, 39, 13, 11, 1, 182, 30, 13, 11, 1, 182, 54, 13, 11, 1, 182, 113, + 13, 11, 1, 51, 39, 13, 11, 1, 51, 30, 13, 11, 1, 51, 54, 13, 11, 1, 51, + 113, 13, 11, 1, 198, 39, 13, 11, 1, 198, 30, 13, 11, 1, 198, 54, 13, 11, + 1, 198, 113, 13, 11, 1, 253, 124, 39, 13, 11, 1, 253, 124, 30, 13, 11, 1, + 253, 124, 54, 13, 11, 1, 253, 124, 113, 13, 11, 1, 253, 220, 39, 13, 11, + 1, 253, 220, 30, 13, 11, 1, 83, 150, 39, 13, 11, 1, 83, 150, 30, 13, 11, + 1, 57, 39, 13, 11, 1, 57, 30, 13, 11, 1, 57, 54, 13, 11, 1, 57, 113, 13, + 11, 18, 182, 2, 83, 2, 243, 42, 60, 39, 13, 11, 18, 182, 2, 83, 2, 243, + 42, 60, 30, 13, 11, 18, 182, 2, 83, 2, 143, 60, 39, 13, 11, 18, 182, 2, + 83, 2, 143, 60, 30, 13, 11, 18, 182, 2, 83, 2, 143, 242, 230, 39, 13, 11, + 18, 182, 2, 83, 2, 143, 242, 230, 30, 13, 11, 18, 182, 2, 83, 39, 13, 11, + 18, 182, 2, 83, 30, 13, 248, 145, 243, 81, 236, 233, 240, 15, 89, 233, + 54, 69, 89, 235, 51, 69, 89, 61, 52, 89, 240, 114, 52, 89, 238, 107, 52, + 89, 234, 17, 89, 233, 59, 89, 40, 232, 74, 89, 38, 232, 74, 89, 235, 52, + 89, 248, 49, 52, 89, 240, 27, 89, 231, 94, 89, 248, 37, 208, 89, 236, + 177, 89, 26, 242, 217, 89, 26, 127, 89, 26, 111, 89, 26, 166, 89, 26, + 177, 89, 26, 176, 89, 26, 187, 89, 26, 203, 89, 26, 195, 89, 26, 202, 89, + 240, 24, 89, 234, 14, 89, 235, 44, 52, 89, 240, 7, 52, 89, 232, 68, 52, + 89, 236, 156, 69, 89, 234, 20, 254, 20, 89, 8, 5, 1, 67, 89, 8, 5, 1, + 217, 89, 8, 5, 1, 255, 18, 89, 8, 5, 1, 209, 89, 8, 5, 1, 72, 89, 8, 5, + 1, 255, 19, 89, 8, 5, 1, 210, 89, 8, 5, 1, 192, 89, 8, 5, 1, 71, 89, 8, + 5, 1, 221, 89, 8, 5, 1, 255, 15, 89, 8, 5, 1, 162, 89, 8, 5, 1, 173, 89, + 8, 5, 1, 197, 89, 8, 5, 1, 73, 89, 8, 5, 1, 223, 89, 8, 5, 1, 255, 20, + 89, 8, 5, 1, 144, 89, 8, 5, 1, 193, 89, 8, 5, 1, 214, 89, 8, 5, 1, 79, + 89, 8, 5, 1, 179, 89, 8, 5, 1, 255, 16, 89, 8, 5, 1, 206, 89, 8, 5, 1, + 255, 14, 89, 8, 5, 1, 255, 17, 89, 40, 31, 104, 89, 238, 75, 236, 177, + 89, 38, 31, 104, 89, 190, 238, 54, 89, 170, 242, 224, 89, 242, 245, 238, + 54, 89, 8, 3, 1, 67, 89, 8, 3, 1, 217, 89, 8, 3, 1, 255, 18, 89, 8, 3, 1, + 209, 89, 8, 3, 1, 72, 89, 8, 3, 1, 255, 19, 89, 8, 3, 1, 210, 89, 8, 3, + 1, 192, 89, 8, 3, 1, 71, 89, 8, 3, 1, 221, 89, 8, 3, 1, 255, 15, 89, 8, + 3, 1, 162, 89, 8, 3, 1, 173, 89, 8, 3, 1, 197, 89, 8, 3, 1, 73, 89, 8, 3, + 1, 223, 89, 8, 3, 1, 255, 20, 89, 8, 3, 1, 144, 89, 8, 3, 1, 193, 89, 8, + 3, 1, 214, 89, 8, 3, 1, 79, 89, 8, 3, 1, 179, 89, 8, 3, 1, 255, 16, 89, + 8, 3, 1, 206, 89, 8, 3, 1, 255, 14, 89, 8, 3, 1, 255, 17, 89, 40, 242, + 225, 104, 89, 59, 242, 224, 89, 38, 242, 225, 104, 89, 169, 89, 40, 64, + 232, 74, 89, 38, 64, 232, 74, 74, 80, 248, 37, 208, 74, 40, 240, 31, 104, + 74, 38, 240, 31, 104, 74, 80, 240, 27, 74, 42, 240, 1, 248, 40, 74, 42, + 1, 253, 177, 74, 42, 1, 3, 67, 74, 42, 1, 3, 71, 74, 42, 1, 3, 79, 74, + 42, 1, 3, 72, 74, 42, 1, 3, 73, 74, 42, 1, 3, 216, 74, 42, 1, 3, 253, + 161, 74, 42, 1, 3, 253, 162, 74, 42, 1, 3, 253, 196, 74, 226, 254, 235, + 138, 243, 1, 69, 74, 42, 1, 67, 74, 42, 1, 71, 74, 42, 1, 79, 74, 42, 1, + 72, 74, 42, 1, 73, 74, 42, 1, 201, 74, 42, 1, 253, 215, 74, 42, 1, 253, + 203, 74, 42, 1, 253, 172, 74, 42, 1, 253, 190, 74, 42, 1, 253, 132, 74, + 42, 1, 253, 198, 74, 42, 1, 253, 211, 74, 42, 1, 253, 210, 74, 42, 1, + 253, 186, 74, 42, 1, 253, 126, 74, 42, 1, 253, 212, 74, 42, 1, 253, 196, + 74, 42, 1, 253, 195, 74, 42, 1, 87, 74, 42, 1, 253, 131, 74, 42, 1, 253, + 166, 74, 42, 1, 253, 150, 74, 42, 1, 253, 197, 74, 42, 1, 253, 173, 74, + 42, 1, 219, 74, 42, 1, 253, 214, 74, 42, 1, 253, 236, 74, 42, 1, 253, + 168, 74, 42, 1, 253, 184, 74, 42, 1, 222, 74, 42, 1, 253, 180, 74, 42, 1, + 253, 154, 74, 42, 1, 253, 206, 74, 42, 1, 253, 181, 74, 42, 1, 216, 74, + 42, 1, 253, 161, 74, 42, 1, 253, 162, 74, 42, 1, 253, 130, 74, 42, 1, + 253, 209, 74, 42, 1, 253, 185, 74, 42, 1, 253, 194, 74, 42, 1, 253, 160, + 74, 42, 1, 253, 138, 74, 42, 1, 197, 74, 42, 240, 59, 243, 1, 69, 74, 42, + 233, 75, 243, 1, 69, 74, 23, 238, 114, 74, 23, 1, 238, 99, 74, 23, 1, + 232, 87, 74, 23, 1, 232, 91, 74, 23, 1, 240, 80, 74, 23, 1, 232, 93, 74, + 23, 1, 232, 94, 74, 23, 1, 238, 102, 74, 23, 1, 232, 101, 74, 23, 1, 240, + 85, 74, 23, 1, 231, 98, 74, 23, 1, 232, 96, 74, 23, 1, 232, 97, 74, 23, + 1, 233, 74, 74, 23, 1, 231, 43, 74, 23, 1, 231, 42, 74, 23, 1, 232, 85, + 74, 23, 1, 240, 78, 74, 23, 1, 240, 83, 74, 23, 1, 233, 79, 74, 23, 1, + 233, 66, 74, 23, 1, 243, 34, 74, 23, 1, 234, 32, 74, 23, 1, 240, 75, 74, + 23, 1, 240, 71, 74, 23, 1, 233, 77, 74, 23, 1, 236, 195, 74, 23, 1, 236, + 198, 74, 23, 1, 236, 205, 74, 23, 1, 236, 201, 74, 23, 1, 240, 74, 74, + 23, 1, 67, 74, 23, 1, 253, 178, 74, 23, 1, 216, 74, 23, 1, 249, 18, 74, + 23, 1, 254, 59, 74, 23, 1, 72, 74, 23, 1, 249, 22, 74, 23, 1, 253, 254, + 74, 23, 1, 73, 74, 23, 1, 253, 138, 74, 23, 1, 249, 12, 74, 23, 1, 253, + 193, 74, 23, 1, 253, 162, 74, 23, 1, 79, 74, 23, 1, 249, 14, 74, 23, 1, + 253, 170, 74, 23, 1, 253, 187, 74, 23, 1, 253, 161, 74, 23, 1, 254, 61, + 74, 23, 1, 253, 189, 74, 23, 1, 71, 89, 249, 39, 52, 89, 243, 246, 52, + 89, 161, 52, 89, 196, 89, 240, 129, 125, 89, 254, 134, 52, 89, 254, 131, + 52, 74, 245, 91, 136, 235, 63, 74, 139, 56, 74, 226, 226, 56, 74, 77, 56, + 74, 235, 45, 56, 74, 86, 238, 59, 74, 64, 238, 51, 233, 71, 234, 4, 238, + 159, 233, 71, 234, 4, 234, 6, 233, 71, 234, 4, 233, 251, 242, 38, 233, + 99, 234, 49, 233, 99, 234, 49, 44, 41, 4, 249, 254, 67, 44, 41, 4, 250, + 23, 72, 44, 41, 4, 250, 15, 71, 44, 41, 4, 250, 43, 73, 44, 41, 4, 250, + 0, 79, 44, 41, 4, 249, 247, 253, 133, 44, 41, 4, 250, 30, 253, 200, 44, + 41, 4, 249, 253, 253, 201, 44, 41, 4, 250, 4, 253, 225, 44, 41, 4, 250, + 34, 253, 232, 44, 41, 4, 250, 39, 253, 146, 44, 41, 4, 250, 31, 254, 24, + 44, 41, 4, 250, 21, 253, 248, 44, 41, 4, 250, 45, 254, 25, 44, 41, 4, + 250, 57, 201, 44, 41, 4, 250, 29, 253, 172, 44, 41, 4, 250, 47, 253, 215, + 44, 41, 4, 250, 50, 253, 190, 44, 41, 4, 250, 60, 253, 203, 44, 41, 4, + 250, 59, 222, 44, 41, 4, 250, 3, 253, 206, 44, 41, 4, 250, 53, 253, 180, + 44, 41, 4, 250, 5, 253, 181, 44, 41, 4, 250, 10, 253, 154, 44, 41, 4, + 249, 252, 253, 131, 44, 41, 4, 250, 11, 253, 197, 44, 41, 4, 250, 17, + 253, 166, 44, 41, 4, 250, 35, 253, 173, 44, 41, 4, 250, 38, 253, 150, 44, + 41, 4, 249, 249, 253, 129, 44, 41, 4, 250, 52, 253, 175, 44, 41, 4, 250, + 24, 253, 147, 44, 41, 4, 250, 1, 253, 208, 44, 41, 4, 250, 33, 253, 239, + 44, 41, 4, 250, 6, 253, 217, 44, 41, 4, 250, 58, 254, 70, 44, 41, 4, 250, + 9, 254, 28, 44, 41, 4, 250, 19, 254, 45, 44, 41, 4, 250, 42, 253, 130, + 44, 41, 4, 250, 14, 253, 194, 44, 41, 4, 250, 36, 253, 209, 44, 41, 4, + 249, 248, 253, 160, 44, 41, 4, 250, 13, 253, 185, 44, 41, 4, 250, 18, + 253, 132, 44, 41, 4, 249, 255, 253, 210, 44, 41, 4, 250, 26, 253, 198, + 44, 41, 4, 250, 2, 253, 186, 44, 41, 4, 250, 40, 253, 211, 44, 41, 4, + 250, 41, 253, 126, 44, 41, 4, 249, 250, 253, 195, 44, 41, 4, 250, 22, + 253, 212, 44, 41, 4, 249, 251, 87, 44, 41, 4, 250, 49, 253, 196, 44, 41, + 4, 250, 37, 253, 138, 44, 41, 4, 250, 55, 253, 170, 44, 41, 4, 250, 25, + 253, 187, 44, 41, 4, 250, 27, 253, 177, 44, 41, 4, 250, 7, 253, 163, 44, + 41, 4, 250, 54, 253, 228, 44, 41, 4, 250, 8, 253, 222, 44, 41, 4, 250, + 12, 254, 137, 44, 41, 4, 250, 28, 254, 138, 44, 41, 4, 250, 61, 253, 151, + 44, 41, 4, 250, 51, 250, 215, 44, 41, 4, 250, 63, 250, 216, 44, 41, 4, + 250, 32, 248, 176, 44, 41, 4, 250, 16, 252, 77, 44, 41, 4, 250, 44, 252, + 76, 44, 41, 4, 250, 56, 252, 124, 44, 41, 4, 250, 20, 252, 125, 44, 41, + 4, 250, 48, 252, 141, 44, 41, 4, 250, 46, 252, 207, 44, 41, 4, 250, 62, + 249, 8, 44, 41, 4, 250, 64, 111, 44, 41, 12, 244, 88, 44, 41, 12, 244, + 89, 44, 41, 12, 244, 90, 44, 41, 12, 244, 91, 44, 41, 12, 244, 92, 44, + 41, 12, 244, 93, 44, 41, 12, 244, 94, 44, 41, 12, 244, 95, 44, 41, 12, + 244, 96, 44, 41, 12, 244, 97, 44, 41, 12, 244, 98, 44, 41, 12, 244, 99, + 44, 41, 12, 244, 100, 44, 41, 12, 244, 101, 44, 41, 78, 250, 65, 248, + 131, 44, 41, 78, 250, 66, 240, 253, 44, 41, 78, 250, 67, 243, 164, 44, + 41, 78, 250, 68, 241, 98, 44, 41, 78, 244, 102, 246, 63, 44, 41, 78, 244, + 103, 236, 106, 44, 41, 78, 244, 104, 249, 58, 44, 41, 78, 244, 105, 249, + 151, 44, 41, 78, 244, 106, 236, 102, 44, 41, 78, 244, 107, 237, 172, 44, + 41, 78, 244, 108, 252, 187, 44, 41, 78, 244, 109, 244, 225, 44, 41, 78, + 244, 110, 248, 202, 44, 41, 78, 244, 111, 244, 231, 44, 41, 78, 250, 69, + 240, 153, 44, 41, 78, 250, 70, 239, 4, 44, 41, 78, 250, 71, 242, 40, 44, + 41, 78, 250, 72, 242, 123, 44, 41, 78, 250, 73, 237, 99, 44, 41, 236, + 184, 250, 74, 246, 6, 44, 41, 236, 184, 250, 75, 239, 104, 44, 41, 78, + 250, 76, 249, 127, 44, 41, 78, 250, 77, 243, 133, 44, 41, 78, 244, 112, + 44, 41, 236, 184, 250, 78, 241, 13, 44, 41, 236, 184, 250, 79, 246, 64, + 44, 41, 78, 250, 80, 239, 14, 44, 41, 78, 250, 81, 243, 96, 44, 41, 78, + 244, 113, 44, 41, 78, 250, 82, 244, 53, 44, 41, 78, 244, 114, 44, 41, 78, + 244, 115, 44, 41, 78, 250, 83, 243, 8, 44, 41, 78, 244, 116, 44, 41, 78, + 244, 117, 44, 41, 78, 244, 118, 44, 41, 236, 184, 250, 84, 242, 163, 44, + 41, 78, 244, 120, 44, 41, 78, 244, 121, 44, 41, 78, 250, 85, 240, 132, + 44, 41, 78, 244, 122, 44, 41, 78, 244, 123, 44, 41, 78, 250, 86, 237, + 164, 44, 41, 78, 250, 87, 238, 248, 44, 41, 78, 244, 124, 44, 41, 78, + 244, 125, 44, 41, 78, 244, 126, 44, 41, 78, 244, 127, 44, 41, 78, 244, + 128, 44, 41, 78, 244, 129, 44, 41, 78, 244, 130, 44, 41, 78, 244, 131, + 44, 41, 78, 244, 132, 44, 41, 78, 250, 88, 241, 248, 44, 41, 78, 244, + 133, 44, 41, 78, 250, 89, 244, 37, 44, 41, 78, 244, 134, 44, 41, 78, 244, + 135, 44, 41, 78, 244, 136, 44, 41, 78, 244, 137, 44, 41, 78, 244, 138, + 44, 41, 78, 244, 139, 44, 41, 78, 244, 140, 44, 41, 78, 244, 141, 44, 41, + 78, 244, 142, 44, 41, 78, 244, 143, 44, 41, 78, 244, 144, 44, 41, 78, + 250, 90, 239, 90, 44, 41, 78, 250, 91, 234, 190, 44, 41, 78, 250, 92, + 237, 73, 44, 41, 78, 250, 93, 240, 236, 44, 41, 78, 250, 94, 56, 44, 41, + 78, 244, 171, 44, 41, 78, 250, 95, 242, 137, 44, 41, 78, 244, 172, 44, + 41, 78, 244, 173, 44, 41, 78, 250, 96, 239, 248, 236, 252, 44, 41, 78, + 250, 97, 236, 252, 44, 41, 78, 250, 98, 239, 22, 241, 116, 44, 41, 78, + 250, 99, 242, 184, 44, 41, 78, 244, 174, 44, 41, 78, 244, 175, 44, 41, + 236, 184, 250, 100, 241, 85, 44, 41, 78, 244, 176, 44, 41, 78, 244, 177, + 44, 41, 78, 244, 179, 44, 41, 78, 244, 180, 44, 41, 78, 244, 181, 44, 41, + 78, 250, 101, 245, 35, 44, 41, 78, 244, 182, 44, 41, 78, 244, 183, 44, + 41, 78, 244, 184, 44, 41, 78, 244, 185, 44, 41, 78, 244, 186, 44, 41, 78, + 240, 6, 244, 119, 44, 41, 78, 240, 6, 244, 145, 44, 41, 78, 240, 6, 244, + 146, 44, 41, 78, 240, 6, 244, 147, 44, 41, 78, 240, 6, 244, 148, 44, 41, + 78, 240, 6, 244, 149, 44, 41, 78, 240, 6, 244, 150, 44, 41, 78, 240, 6, + 244, 151, 44, 41, 78, 240, 6, 244, 152, 44, 41, 78, 240, 6, 244, 153, 44, + 41, 78, 240, 6, 244, 154, 44, 41, 78, 240, 6, 244, 155, 44, 41, 78, 240, + 6, 244, 156, 44, 41, 78, 240, 6, 244, 157, 44, 41, 78, 240, 6, 244, 158, + 44, 41, 78, 240, 6, 244, 159, 44, 41, 78, 240, 6, 244, 160, 44, 41, 78, + 240, 6, 244, 161, 44, 41, 78, 240, 6, 244, 162, 44, 41, 78, 240, 6, 244, + 163, 44, 41, 78, 240, 6, 244, 164, 44, 41, 78, 240, 6, 244, 165, 44, 41, + 78, 240, 6, 244, 166, 44, 41, 78, 240, 6, 244, 167, 44, 41, 78, 240, 6, + 244, 168, 44, 41, 78, 240, 6, 244, 169, 44, 41, 78, 240, 6, 244, 170, 44, + 41, 78, 240, 6, 244, 178, 44, 41, 78, 240, 6, 244, 187, 167, 248, 143, + 235, 95, 242, 224, 167, 248, 143, 235, 95, 248, 40, 167, 243, 53, 69, + 167, 61, 127, 167, 61, 111, 167, 61, 166, 167, 61, 177, 167, 61, 176, + 167, 61, 187, 167, 61, 203, 167, 61, 195, 167, 61, 202, 167, 61, 248, 53, + 167, 61, 238, 77, 167, 61, 238, 101, 167, 61, 240, 136, 167, 61, 240, 50, + 167, 61, 240, 234, 167, 61, 237, 38, 167, 61, 238, 182, 167, 61, 238, + 147, 167, 61, 253, 125, 236, 149, 167, 61, 171, 236, 149, 167, 61, 204, + 236, 149, 167, 61, 248, 58, 236, 149, 167, 61, 248, 48, 236, 149, 167, + 61, 254, 31, 236, 149, 167, 61, 243, 31, 236, 149, 167, 61, 242, 254, + 236, 149, 167, 61, 248, 173, 236, 149, 167, 61, 253, 125, 235, 49, 167, + 61, 171, 235, 49, 167, 61, 204, 235, 49, 167, 61, 248, 58, 235, 49, 167, + 61, 248, 48, 235, 49, 167, 61, 254, 31, 235, 49, 167, 61, 243, 31, 235, + 49, 167, 61, 242, 254, 235, 49, 167, 61, 248, 173, 235, 49, 167, 61, 253, + 219, 235, 49, 167, 61, 240, 48, 235, 49, 167, 61, 240, 53, 235, 49, 167, + 61, 243, 6, 235, 49, 167, 61, 243, 18, 235, 49, 167, 61, 247, 90, 235, + 49, 167, 61, 239, 190, 235, 49, 167, 61, 241, 92, 235, 49, 167, 61, 242, + 12, 235, 49, 167, 240, 106, 248, 196, 247, 183, 167, 240, 106, 243, 41, + 236, 188, 167, 240, 106, 240, 87, 236, 188, 167, 240, 106, 243, 129, 236, + 188, 167, 240, 106, 240, 137, 236, 188, 167, 254, 157, 238, 119, 243, 41, + 236, 188, 167, 241, 218, 238, 119, 243, 41, 236, 188, 167, 238, 119, 240, + 87, 236, 188, 167, 238, 119, 243, 129, 236, 188, 17, 180, 242, 227, 253, + 125, 237, 33, 17, 180, 242, 227, 253, 125, 243, 7, 17, 180, 242, 227, + 253, 125, 237, 141, 17, 180, 242, 227, 176, 17, 180, 242, 227, 240, 50, + 17, 180, 242, 227, 248, 48, 236, 149, 17, 180, 242, 227, 248, 48, 235, + 49, 17, 180, 242, 227, 243, 18, 235, 49, 17, 180, 242, 227, 248, 48, 236, + 192, 17, 180, 242, 227, 253, 219, 236, 192, 17, 180, 242, 227, 243, 18, + 236, 192, 17, 180, 242, 227, 253, 125, 238, 92, 236, 192, 17, 180, 242, + 227, 248, 48, 238, 92, 236, 192, 17, 180, 242, 227, 253, 125, 236, 193, + 236, 192, 17, 180, 242, 227, 248, 48, 236, 193, 236, 192, 17, 180, 242, + 227, 248, 48, 236, 187, 17, 180, 242, 227, 253, 219, 236, 187, 17, 180, + 242, 227, 243, 18, 236, 187, 17, 180, 242, 227, 253, 125, 238, 92, 236, + 187, 17, 180, 242, 227, 248, 48, 238, 92, 236, 187, 17, 180, 242, 227, + 253, 125, 236, 193, 236, 187, 17, 180, 242, 227, 253, 219, 236, 193, 236, + 187, 17, 180, 242, 227, 243, 18, 236, 193, 236, 187, 17, 180, 242, 227, + 253, 219, 243, 107, 17, 180, 239, 91, 253, 125, 236, 76, 17, 180, 236, + 179, 127, 17, 180, 234, 38, 127, 17, 180, 234, 37, 111, 17, 180, 236, + 179, 111, 17, 180, 237, 100, 171, 235, 121, 17, 180, 234, 37, 171, 235, + 121, 17, 180, 234, 19, 176, 17, 180, 234, 19, 248, 53, 17, 180, 234, 19, + 253, 219, 235, 96, 13, 17, 180, 234, 38, 248, 53, 17, 180, 236, 60, 248, + 53, 17, 180, 236, 179, 248, 53, 17, 180, 236, 179, 238, 101, 17, 180, + 234, 19, 240, 50, 17, 180, 234, 19, 243, 18, 235, 96, 13, 17, 180, 234, + 38, 240, 50, 17, 180, 236, 179, 240, 50, 17, 180, 236, 179, 253, 125, + 236, 149, 17, 180, 236, 179, 204, 236, 149, 17, 180, 234, 37, 248, 48, + 236, 149, 17, 180, 234, 19, 248, 48, 236, 149, 17, 180, 236, 179, 248, + 48, 236, 149, 17, 180, 235, 186, 248, 48, 236, 149, 17, 180, 241, 254, + 248, 48, 236, 149, 17, 180, 236, 179, 253, 125, 235, 49, 17, 180, 236, + 179, 248, 48, 235, 49, 17, 180, 239, 40, 248, 48, 243, 107, 17, 180, 238, + 16, 243, 18, 243, 107, 17, 253, 125, 137, 52, 17, 253, 125, 137, 21, 235, + 96, 13, 17, 171, 242, 149, 52, 17, 204, 236, 236, 52, 17, 249, 206, 52, + 17, 242, 140, 52, 17, 238, 180, 52, 17, 252, 57, 52, 17, 171, 243, 68, + 52, 17, 204, 243, 68, 52, 17, 248, 58, 243, 68, 52, 17, 248, 48, 243, 68, + 52, 17, 237, 209, 52, 17, 239, 111, 248, 196, 52, 17, 246, 52, 52, 17, + 242, 44, 52, 17, 242, 188, 52, 17, 241, 19, 52, 17, 241, 17, 52, 17, 241, + 141, 52, 17, 238, 33, 248, 196, 52, 17, 248, 145, 52, 76, 24, 1, 67, 76, + 24, 1, 253, 242, 76, 24, 1, 253, 172, 76, 24, 1, 253, 200, 76, 24, 1, 72, + 76, 24, 1, 254, 12, 76, 24, 1, 253, 228, 76, 24, 1, 253, 168, 76, 24, 1, + 248, 111, 76, 24, 1, 71, 76, 24, 1, 201, 76, 24, 1, 254, 3, 76, 24, 1, + 254, 22, 76, 24, 1, 253, 202, 76, 24, 1, 248, 93, 76, 24, 1, 73, 76, 24, + 1, 253, 175, 76, 24, 1, 248, 118, 76, 24, 1, 253, 203, 76, 24, 1, 254, 4, + 76, 24, 1, 254, 23, 76, 24, 1, 253, 195, 76, 24, 1, 79, 76, 24, 1, 250, + 223, 76, 24, 1, 249, 136, 76, 24, 1, 249, 94, 76, 24, 1, 254, 21, 76, 24, + 1, 250, 229, 76, 24, 1, 248, 88, 76, 24, 1, 253, 142, 76, 24, 1, 253, + 148, 76, 24, 178, 127, 76, 24, 178, 176, 76, 24, 178, 248, 53, 76, 24, + 178, 240, 50, 240, 8, 1, 244, 71, 240, 8, 1, 237, 70, 240, 8, 1, 245, + 120, 240, 8, 1, 245, 32, 240, 8, 1, 238, 240, 240, 8, 1, 236, 83, 240, 8, + 1, 245, 233, 240, 8, 1, 245, 139, 240, 8, 1, 239, 221, 240, 8, 1, 250, + 222, 240, 8, 1, 241, 206, 240, 8, 1, 241, 211, 240, 8, 1, 241, 226, 240, + 8, 1, 239, 142, 240, 8, 1, 251, 113, 240, 8, 1, 247, 184, 240, 8, 1, 236, + 68, 240, 8, 1, 238, 147, 240, 8, 1, 242, 75, 240, 8, 1, 242, 98, 240, 8, + 1, 242, 144, 240, 8, 1, 242, 185, 240, 8, 1, 241, 102, 240, 8, 1, 241, + 179, 240, 8, 1, 240, 190, 240, 8, 1, 242, 43, 240, 8, 1, 248, 173, 236, + 149, 236, 147, 1, 244, 78, 236, 147, 1, 242, 242, 236, 147, 1, 241, 122, + 236, 147, 1, 248, 61, 236, 147, 1, 240, 28, 236, 147, 1, 253, 184, 236, + 147, 1, 253, 177, 236, 147, 1, 242, 251, 236, 147, 1, 245, 201, 236, 147, + 1, 249, 176, 236, 147, 1, 248, 193, 236, 147, 1, 248, 116, 236, 147, 1, + 243, 33, 236, 147, 1, 240, 33, 236, 147, 1, 248, 166, 236, 147, 1, 245, + 64, 236, 147, 1, 248, 132, 236, 147, 1, 254, 18, 236, 147, 1, 242, 95, + 236, 147, 1, 248, 105, 236, 147, 1, 253, 239, 236, 147, 1, 247, 61, 236, + 147, 1, 247, 15, 236, 147, 1, 242, 76, 236, 147, 1, 239, 219, 236, 147, + 1, 240, 180, 236, 147, 1, 87, 236, 147, 1, 71, 236, 147, 1, 79, 236, 147, + 1, 248, 251, 236, 147, 248, 143, 236, 213, 76, 184, 21, 67, 76, 184, 21, + 71, 76, 184, 21, 79, 76, 184, 21, 201, 76, 184, 21, 253, 203, 76, 184, + 21, 253, 139, 76, 184, 21, 253, 235, 76, 184, 21, 253, 253, 76, 184, 21, + 253, 152, 76, 184, 21, 253, 146, 76, 184, 21, 254, 7, 76, 184, 21, 253, + 126, 76, 184, 21, 253, 196, 76, 184, 21, 253, 133, 76, 184, 21, 253, 201, + 76, 184, 21, 253, 232, 76, 184, 21, 248, 55, 76, 184, 21, 253, 129, 76, + 184, 21, 253, 141, 76, 184, 21, 253, 179, 76, 184, 21, 253, 131, 76, 184, + 21, 253, 150, 76, 184, 21, 222, 76, 184, 21, 253, 180, 76, 184, 21, 253, + 154, 76, 184, 21, 216, 76, 184, 21, 253, 171, 76, 184, 21, 254, 48, 76, + 184, 21, 253, 130, 76, 184, 21, 253, 185, 76, 184, 21, 253, 134, 76, 184, + 21, 253, 132, 76, 184, 21, 253, 163, 76, 184, 21, 248, 46, 76, 184, 21, + 248, 66, 76, 184, 21, 219, 76, 184, 21, 233, 118, 76, 184, 21, 231, 117, + 76, 184, 21, 231, 118, 76, 184, 21, 232, 66, 76, 184, 21, 234, 107, 76, + 184, 21, 232, 126, 76, 184, 21, 244, 189, 76, 184, 21, 237, 81, 76, 184, + 248, 143, 236, 213, 76, 184, 61, 127, 76, 184, 61, 111, 76, 184, 61, 248, + 53, 76, 184, 61, 238, 77, 76, 184, 61, 236, 149, 121, 5, 1, 183, 71, 121, + 5, 1, 183, 72, 121, 5, 1, 183, 67, 121, 5, 1, 183, 254, 0, 121, 5, 1, + 183, 73, 121, 5, 1, 183, 253, 156, 121, 5, 1, 242, 215, 71, 121, 5, 1, + 242, 215, 72, 121, 5, 1, 242, 215, 67, 121, 5, 1, 242, 215, 254, 0, 121, + 5, 1, 242, 215, 73, 121, 5, 1, 242, 215, 253, 156, 121, 5, 1, 254, 33, + 121, 5, 1, 254, 121, 121, 5, 1, 254, 14, 121, 5, 1, 248, 192, 121, 5, 1, + 192, 121, 5, 1, 248, 180, 121, 5, 1, 248, 197, 121, 5, 1, 248, 255, 121, + 5, 1, 248, 149, 121, 5, 1, 243, 54, 121, 5, 1, 248, 161, 121, 5, 1, 249, + 92, 121, 5, 1, 249, 67, 121, 5, 1, 254, 21, 121, 5, 1, 249, 10, 121, 5, + 1, 248, 109, 121, 5, 1, 243, 77, 121, 5, 1, 254, 23, 121, 5, 1, 248, 194, + 121, 5, 1, 248, 93, 121, 5, 1, 243, 139, 121, 5, 1, 254, 4, 121, 5, 1, + 254, 3, 121, 5, 1, 254, 22, 121, 5, 1, 253, 202, 121, 5, 1, 248, 108, + 121, 5, 1, 254, 42, 121, 5, 1, 254, 91, 121, 3, 1, 183, 71, 121, 3, 1, + 183, 72, 121, 3, 1, 183, 67, 121, 3, 1, 183, 254, 0, 121, 3, 1, 183, 73, + 121, 3, 1, 183, 253, 156, 121, 3, 1, 242, 215, 71, 121, 3, 1, 242, 215, + 72, 121, 3, 1, 242, 215, 67, 121, 3, 1, 242, 215, 254, 0, 121, 3, 1, 242, + 215, 73, 121, 3, 1, 242, 215, 253, 156, 121, 3, 1, 254, 33, 121, 3, 1, + 254, 121, 121, 3, 1, 254, 14, 121, 3, 1, 248, 192, 121, 3, 1, 192, 121, + 3, 1, 248, 180, 121, 3, 1, 248, 197, 121, 3, 1, 248, 255, 121, 3, 1, 248, + 149, 121, 3, 1, 243, 54, 121, 3, 1, 248, 161, 121, 3, 1, 249, 92, 121, 3, + 1, 249, 67, 121, 3, 1, 254, 21, 121, 3, 1, 249, 10, 121, 3, 1, 248, 109, + 121, 3, 1, 243, 77, 121, 3, 1, 254, 23, 121, 3, 1, 248, 194, 121, 3, 1, + 248, 93, 121, 3, 1, 243, 139, 121, 3, 1, 254, 4, 121, 3, 1, 254, 3, 121, + 3, 1, 254, 22, 121, 3, 1, 253, 202, 121, 3, 1, 248, 108, 121, 3, 1, 254, + 42, 121, 3, 1, 254, 91, 207, 1, 246, 240, 207, 1, 249, 184, 207, 1, 246, + 13, 207, 1, 249, 61, 207, 1, 242, 147, 207, 1, 253, 186, 207, 1, 247, + 127, 207, 1, 239, 25, 207, 1, 253, 77, 207, 1, 245, 204, 207, 1, 250, + 121, 207, 1, 245, 58, 207, 1, 251, 6, 207, 1, 253, 19, 207, 1, 247, 144, + 207, 1, 253, 110, 207, 1, 237, 23, 207, 1, 241, 189, 207, 1, 253, 35, + 207, 1, 241, 144, 207, 1, 246, 53, 207, 1, 246, 86, 207, 1, 254, 174, + 207, 1, 250, 221, 207, 1, 249, 241, 207, 1, 249, 234, 207, 1, 254, 9, + 207, 1, 244, 53, 207, 1, 248, 235, 207, 1, 254, 0, 207, 1, 247, 33, 207, + 1, 248, 132, 207, 1, 248, 207, 207, 1, 249, 235, 207, 1, 249, 84, 207, 1, + 253, 176, 207, 1, 252, 55, 207, 1, 246, 234, 207, 1, 249, 127, 207, 1, + 249, 244, 207, 1, 249, 240, 207, 1, 253, 227, 207, 1, 249, 236, 207, 1, + 250, 228, 207, 1, 241, 18, 207, 1, 248, 206, 207, 1, 251, 100, 207, 1, + 253, 78, 238, 50, 1, 243, 3, 238, 50, 1, 253, 141, 238, 50, 1, 253, 126, + 238, 50, 1, 253, 146, 238, 50, 1, 253, 253, 238, 50, 1, 248, 61, 238, 50, + 1, 245, 60, 238, 50, 1, 253, 130, 238, 50, 1, 253, 132, 238, 50, 1, 242, + 106, 238, 50, 1, 248, 76, 238, 50, 1, 244, 244, 238, 50, 1, 253, 139, + 238, 50, 1, 253, 179, 238, 50, 1, 247, 4, 238, 50, 1, 246, 3, 238, 50, 1, + 246, 34, 238, 50, 1, 246, 84, 238, 50, 1, 246, 197, 238, 50, 1, 248, 142, + 238, 50, 1, 219, 238, 50, 1, 216, 238, 50, 1, 67, 238, 50, 1, 72, 238, + 50, 1, 71, 238, 50, 1, 73, 238, 50, 1, 79, 238, 50, 1, 253, 140, 238, 50, + 1, 253, 164, 238, 50, 1, 253, 156, 238, 50, 26, 242, 217, 238, 50, 26, + 127, 238, 50, 26, 111, 238, 50, 26, 166, 238, 50, 26, 177, 238, 50, 26, + 176, 238, 50, 26, 187, 238, 50, 26, 203, 238, 50, 26, 195, 238, 50, 26, + 202, 172, 4, 67, 172, 4, 72, 172, 4, 71, 172, 4, 73, 172, 4, 79, 172, 4, + 253, 146, 172, 4, 253, 248, 172, 4, 201, 172, 4, 253, 172, 172, 4, 253, + 215, 172, 4, 253, 190, 172, 4, 253, 203, 172, 4, 253, 134, 172, 4, 253, + 250, 172, 4, 253, 251, 172, 4, 253, 216, 172, 4, 254, 8, 172, 4, 222, + 172, 4, 253, 206, 172, 4, 253, 180, 172, 4, 253, 181, 172, 4, 253, 154, + 172, 4, 253, 131, 172, 4, 253, 197, 172, 4, 253, 166, 172, 4, 253, 173, + 172, 4, 253, 150, 172, 4, 253, 129, 172, 4, 253, 175, 172, 4, 253, 147, + 172, 4, 253, 208, 172, 4, 253, 239, 172, 4, 253, 130, 172, 4, 253, 194, + 172, 4, 253, 209, 172, 4, 253, 160, 172, 4, 253, 185, 172, 4, 253, 132, + 172, 4, 253, 210, 172, 4, 253, 198, 172, 4, 253, 186, 172, 4, 253, 211, + 172, 4, 253, 126, 172, 4, 253, 195, 172, 4, 253, 212, 172, 4, 87, 172, 4, + 253, 196, 172, 4, 253, 138, 172, 4, 253, 170, 172, 4, 253, 187, 172, 4, + 253, 177, 172, 4, 253, 253, 172, 4, 254, 132, 172, 4, 253, 163, 172, 4, + 253, 222, 151, 1, 67, 151, 33, 21, 71, 151, 33, 21, 79, 151, 33, 21, 165, + 144, 151, 33, 21, 72, 151, 33, 21, 73, 151, 33, 240, 51, 69, 151, 21, 45, + 248, 51, 46, 151, 21, 235, 61, 151, 21, 236, 173, 151, 1, 201, 151, 1, + 248, 61, 151, 1, 253, 139, 151, 1, 248, 77, 151, 1, 253, 152, 151, 1, + 248, 57, 151, 1, 253, 146, 151, 1, 248, 78, 151, 1, 248, 71, 151, 1, 242, + 247, 151, 1, 248, 75, 151, 1, 242, 249, 151, 1, 248, 82, 151, 1, 253, + 126, 151, 1, 248, 55, 151, 1, 253, 133, 151, 1, 248, 76, 151, 1, 253, + 131, 151, 1, 253, 129, 151, 1, 248, 65, 151, 1, 253, 141, 151, 1, 248, + 81, 151, 1, 222, 151, 1, 216, 151, 1, 253, 130, 151, 1, 253, 134, 151, 1, + 253, 171, 151, 1, 248, 46, 151, 1, 248, 66, 151, 1, 253, 132, 151, 1, + 253, 163, 151, 1, 219, 151, 1, 249, 97, 151, 1, 242, 161, 151, 21, 253, + 144, 48, 151, 21, 241, 44, 151, 21, 53, 46, 151, 238, 72, 151, 26, 127, + 151, 26, 111, 151, 26, 166, 151, 26, 177, 151, 61, 248, 53, 151, 61, 238, + 77, 151, 61, 253, 125, 236, 149, 151, 61, 253, 125, 235, 49, 151, 233, + 51, 248, 40, 151, 233, 51, 3, 238, 51, 151, 233, 51, 238, 51, 151, 233, + 51, 237, 95, 125, 151, 233, 51, 236, 57, 151, 233, 51, 241, 220, 151, + 233, 51, 240, 111, 151, 233, 51, 45, 240, 111, 151, 233, 51, 241, 217, + 37, 20, 12, 240, 29, 37, 20, 12, 239, 37, 37, 20, 12, 232, 71, 37, 20, + 12, 243, 112, 232, 83, 37, 20, 12, 243, 112, 240, 73, 37, 20, 12, 240, + 152, 232, 83, 37, 20, 12, 240, 152, 240, 73, 37, 20, 12, 236, 44, 37, 20, + 12, 235, 30, 37, 20, 12, 232, 191, 37, 20, 12, 235, 43, 37, 20, 12, 236, + 142, 240, 73, 37, 20, 12, 236, 48, 37, 20, 12, 243, 142, 232, 83, 37, 20, + 12, 254, 92, 232, 83, 37, 20, 12, 238, 223, 37, 20, 12, 234, 213, 37, 20, + 12, 233, 116, 37, 20, 12, 234, 45, 240, 73, 37, 20, 12, 238, 20, 37, 20, + 12, 242, 150, 37, 20, 12, 240, 205, 235, 55, 37, 20, 12, 240, 98, 235, + 55, 37, 20, 12, 239, 168, 37, 20, 12, 235, 187, 37, 20, 12, 242, 175, 37, + 20, 12, 249, 85, 235, 55, 37, 20, 12, 238, 118, 235, 55, 37, 20, 12, 235, + 90, 235, 55, 37, 20, 12, 236, 96, 37, 20, 12, 236, 71, 37, 20, 12, 239, + 203, 235, 164, 37, 20, 12, 242, 45, 235, 55, 37, 20, 12, 239, 239, 235, + 55, 37, 20, 12, 236, 246, 235, 55, 37, 20, 12, 235, 165, 37, 20, 12, 238, + 195, 37, 20, 12, 242, 82, 37, 20, 12, 240, 207, 235, 55, 37, 20, 12, 238, + 29, 37, 20, 12, 231, 116, 37, 20, 12, 239, 188, 37, 20, 12, 238, 153, + 235, 55, 37, 20, 12, 238, 153, 251, 225, 238, 15, 37, 20, 12, 235, 132, + 235, 55, 37, 20, 12, 242, 146, 37, 20, 12, 241, 214, 37, 20, 12, 250, + 217, 37, 20, 12, 247, 158, 37, 20, 12, 238, 25, 37, 20, 12, 234, 215, 37, + 20, 12, 243, 142, 254, 92, 248, 64, 37, 20, 12, 240, 18, 235, 55, 37, 20, + 12, 234, 203, 37, 20, 12, 236, 242, 235, 55, 37, 20, 12, 241, 194, 236, + 132, 37, 20, 12, 236, 73, 37, 20, 12, 234, 241, 37, 20, 12, 236, 46, 37, + 20, 12, 236, 253, 235, 55, 37, 20, 12, 237, 246, 37, 20, 12, 233, 92, + 235, 55, 37, 20, 12, 233, 93, 235, 55, 37, 20, 12, 237, 177, 37, 20, 12, + 243, 231, 37, 20, 12, 237, 234, 37, 20, 12, 237, 190, 243, 84, 37, 20, + 12, 236, 242, 243, 84, 37, 20, 12, 232, 59, 37, 20, 12, 231, 139, 37, 20, + 12, 249, 85, 248, 64, 37, 20, 12, 240, 205, 248, 64, 37, 20, 12, 243, + 112, 248, 64, 37, 20, 12, 237, 235, 37, 20, 12, 236, 47, 37, 20, 12, 229, + 51, 37, 20, 12, 229, 47, 37, 20, 12, 237, 233, 248, 64, 37, 20, 12, 235, + 90, 253, 238, 248, 106, 37, 20, 12, 238, 118, 253, 238, 248, 106, 37, 20, + 12, 239, 252, 37, 20, 12, 234, 45, 248, 64, 37, 20, 12, 234, 44, 236, + 126, 248, 64, 37, 20, 12, 238, 49, 37, 20, 12, 229, 48, 37, 20, 12, 237, + 148, 37, 20, 12, 237, 86, 37, 20, 12, 241, 243, 245, 231, 37, 20, 12, + 240, 152, 248, 64, 37, 20, 12, 240, 207, 248, 64, 37, 20, 12, 236, 82, + 248, 64, 37, 20, 12, 239, 151, 37, 20, 12, 233, 114, 37, 20, 12, 237, + 196, 37, 20, 12, 233, 93, 248, 64, 37, 20, 12, 233, 92, 248, 64, 37, 20, + 12, 240, 172, 232, 190, 37, 20, 12, 237, 193, 37, 20, 12, 227, 12, 37, + 20, 12, 236, 242, 248, 64, 37, 20, 12, 233, 194, 37, 20, 12, 238, 153, + 248, 64, 37, 20, 12, 242, 138, 37, 20, 12, 236, 253, 248, 64, 37, 20, 12, + 236, 13, 37, 20, 12, 242, 100, 248, 64, 37, 20, 12, 247, 204, 238, 195, + 37, 20, 12, 227, 8, 37, 20, 12, 229, 53, 37, 20, 12, 231, 32, 37, 20, 12, + 226, 242, 37, 20, 12, 226, 233, 37, 20, 12, 231, 33, 37, 20, 12, 229, 54, + 37, 20, 12, 229, 66, 37, 20, 12, 231, 44, 37, 20, 12, 240, 172, 231, 44, + 37, 20, 12, 235, 132, 248, 64, 37, 20, 12, 233, 109, 250, 230, 37, 20, + 12, 233, 109, 250, 232, 37, 20, 12, 247, 143, 238, 161, 37, 20, 12, 252, + 218, 254, 65, 237, 63, 37, 20, 12, 234, 211, 37, 20, 12, 234, 186, 37, + 20, 12, 249, 208, 243, 20, 37, 20, 12, 249, 208, 248, 106, 37, 20, 12, + 238, 14, 37, 20, 12, 240, 194, 248, 106, 37, 20, 12, 245, 67, 235, 55, + 37, 20, 12, 238, 142, 235, 55, 37, 20, 12, 238, 142, 243, 84, 37, 20, 12, + 238, 142, 248, 64, 37, 20, 12, 236, 246, 248, 64, 37, 20, 12, 244, 83, + 37, 20, 12, 240, 73, 37, 20, 12, 239, 228, 37, 20, 12, 236, 128, 37, 20, + 12, 236, 229, 37, 20, 12, 240, 100, 250, 225, 236, 254, 37, 20, 12, 240, + 100, 254, 57, 236, 221, 37, 20, 12, 240, 100, 247, 159, 236, 221, 37, 20, + 12, 240, 100, 238, 24, 236, 221, 37, 20, 12, 240, 100, 239, 97, 236, 254, + 37, 20, 12, 240, 98, 253, 238, 248, 106, 37, 20, 12, 240, 98, 231, 92, + 235, 171, 37, 20, 12, 240, 98, 231, 92, 240, 168, 37, 20, 12, 235, 204, + 37, 20, 12, 236, 223, 231, 92, 236, 247, 243, 20, 37, 20, 12, 236, 223, + 231, 92, 236, 247, 248, 106, 37, 20, 12, 236, 223, 231, 92, 240, 168, 37, + 20, 12, 235, 37, 37, 20, 12, 241, 14, 37, 20, 12, 233, 209, 37, 20, 12, + 237, 106, 37, 20, 12, 243, 13, 249, 139, 243, 143, 37, 20, 12, 243, 13, + 235, 170, 37, 20, 12, 243, 13, 243, 143, 37, 20, 12, 243, 13, 239, 135, + 37, 20, 12, 243, 13, 246, 66, 37, 20, 12, 243, 13, 240, 184, 37, 20, 12, + 243, 13, 234, 196, 37, 20, 12, 243, 13, 249, 139, 240, 184, 37, 20, 12, + 236, 162, 240, 211, 240, 35, 37, 20, 12, 236, 162, 249, 27, 240, 211, + 240, 35, 37, 20, 12, 236, 162, 237, 5, 240, 35, 37, 20, 12, 236, 162, + 249, 27, 237, 5, 240, 35, 37, 20, 12, 236, 162, 242, 157, 240, 35, 37, + 20, 12, 236, 162, 235, 36, 37, 20, 12, 236, 162, 236, 241, 240, 35, 37, + 20, 12, 236, 162, 236, 241, 238, 198, 240, 35, 37, 20, 12, 236, 162, 238, + 198, 240, 35, 37, 20, 12, 236, 162, 238, 209, 240, 35, 37, 20, 12, 241, + 181, 240, 243, 234, 58, 37, 20, 12, 234, 44, 240, 243, 234, 58, 37, 20, + 12, 235, 99, 233, 40, 37, 20, 12, 235, 99, 233, 87, 37, 20, 12, 235, 99, + 235, 119, 37, 20, 12, 236, 162, 247, 185, 240, 35, 37, 20, 12, 236, 162, + 234, 240, 240, 35, 37, 20, 12, 236, 162, 238, 209, 236, 241, 240, 35, 37, + 20, 12, 234, 57, 255, 98, 238, 161, 37, 20, 12, 234, 57, 255, 98, 237, + 110, 37, 20, 12, 239, 56, 254, 65, 240, 18, 249, 196, 37, 20, 12, 236, + 38, 37, 20, 12, 233, 210, 37, 20, 12, 240, 18, 237, 66, 237, 103, 241, + 178, 37, 20, 12, 240, 18, 235, 72, 253, 129, 37, 20, 12, 240, 18, 235, + 72, 243, 231, 37, 20, 12, 240, 18, 251, 254, 240, 35, 37, 20, 12, 240, + 18, 235, 72, 253, 201, 37, 20, 12, 240, 18, 238, 150, 237, 107, 253, 201, + 37, 20, 12, 240, 18, 235, 72, 253, 172, 37, 20, 12, 240, 18, 235, 72, + 253, 222, 37, 20, 12, 240, 18, 235, 72, 255, 62, 243, 20, 37, 20, 12, + 240, 18, 235, 72, 255, 62, 248, 106, 37, 20, 12, 240, 18, 238, 199, 240, + 110, 235, 119, 37, 20, 12, 240, 18, 238, 199, 240, 110, 233, 87, 37, 20, + 12, 241, 105, 238, 150, 240, 110, 242, 174, 37, 20, 12, 240, 18, 238, + 150, 240, 110, 239, 212, 37, 20, 12, 240, 18, 239, 143, 37, 20, 12, 243, + 89, 242, 209, 37, 20, 12, 243, 89, 239, 109, 37, 20, 12, 243, 89, 239, + 200, 37, 20, 12, 240, 18, 220, 240, 90, 231, 55, 37, 20, 12, 240, 18, + 234, 184, 234, 91, 37, 20, 12, 240, 90, 232, 110, 37, 20, 12, 240, 72, + 232, 110, 37, 20, 12, 240, 72, 231, 55, 37, 20, 12, 240, 72, 248, 146, + 254, 57, 235, 68, 37, 20, 12, 240, 72, 233, 88, 238, 225, 235, 68, 37, + 20, 12, 240, 72, 235, 120, 255, 56, 235, 68, 37, 20, 12, 240, 72, 234, + 86, 249, 128, 235, 68, 37, 20, 12, 240, 90, 248, 146, 254, 57, 235, 68, + 37, 20, 12, 240, 90, 233, 88, 238, 225, 235, 68, 37, 20, 12, 240, 90, + 235, 120, 255, 56, 235, 68, 37, 20, 12, 240, 90, 234, 86, 249, 128, 235, + 68, 37, 20, 12, 240, 179, 239, 43, 37, 20, 12, 240, 179, 239, 250, 37, + 20, 12, 236, 212, 248, 146, 241, 242, 37, 20, 12, 236, 212, 248, 146, + 239, 133, 37, 20, 12, 236, 212, 240, 73, 37, 20, 12, 236, 212, 237, 47, + 37, 20, 12, 236, 186, 237, 47, 37, 20, 12, 236, 186, 238, 155, 237, 7, + 37, 20, 12, 236, 186, 238, 155, 235, 154, 37, 20, 12, 236, 186, 238, 155, + 233, 108, 37, 20, 12, 236, 186, 238, 250, 37, 20, 12, 236, 186, 240, 128, + 237, 7, 37, 20, 12, 236, 186, 240, 128, 235, 154, 37, 20, 12, 236, 186, + 240, 128, 233, 108, 37, 20, 12, 237, 108, 254, 167, 37, 20, 12, 235, 203, + 254, 10, 37, 20, 12, 238, 152, 37, 20, 12, 238, 90, 253, 129, 37, 20, 12, + 238, 90, 249, 196, 37, 20, 12, 238, 90, 253, 139, 37, 20, 12, 238, 90, + 253, 201, 37, 20, 12, 238, 90, 253, 172, 37, 20, 12, 238, 90, 253, 222, + 37, 20, 12, 238, 90, 253, 166, 37, 20, 12, 235, 90, 253, 238, 243, 225, + 37, 20, 12, 238, 118, 253, 238, 243, 225, 37, 20, 12, 235, 90, 253, 238, + 243, 20, 37, 20, 12, 238, 118, 253, 238, 243, 20, 37, 20, 12, 240, 194, + 243, 20, 37, 20, 12, 240, 98, 253, 238, 243, 20, 20, 12, 240, 12, 236, + 194, 20, 12, 45, 236, 194, 20, 12, 30, 236, 194, 20, 12, 238, 75, 30, + 236, 194, 20, 12, 240, 55, 236, 194, 20, 12, 242, 215, 236, 194, 20, 12, + 40, 240, 64, 52, 20, 12, 38, 240, 64, 52, 20, 12, 240, 64, 243, 5, 20, + 12, 253, 199, 240, 219, 20, 12, 255, 70, 244, 242, 20, 12, 240, 219, 20, + 12, 245, 25, 20, 12, 236, 237, 236, 21, 20, 12, 236, 237, 236, 22, 20, + 12, 236, 237, 236, 23, 20, 12, 237, 10, 20, 12, 239, 69, 46, 20, 12, 241, + 37, 69, 20, 12, 237, 82, 20, 12, 241, 35, 20, 12, 104, 20, 12, 237, 225, + 240, 89, 20, 12, 238, 35, 240, 89, 20, 12, 235, 34, 240, 89, 20, 12, 236, + 25, 240, 89, 20, 12, 236, 24, 240, 89, 20, 12, 238, 8, 240, 89, 20, 12, + 235, 2, 234, 55, 20, 12, 233, 204, 234, 55, 20, 12, 255, 104, 243, 37, + 20, 12, 255, 104, 248, 148, 240, 82, 243, 51, 20, 12, 255, 104, 248, 148, + 240, 82, 240, 108, 20, 12, 255, 105, 243, 37, 20, 12, 255, 112, 243, 37, + 20, 12, 255, 112, 248, 148, 240, 82, 243, 51, 20, 12, 255, 112, 248, 148, + 240, 82, 240, 108, 20, 12, 249, 57, 239, 26, 20, 12, 249, 57, 239, 27, + 20, 12, 45, 240, 223, 20, 12, 45, 243, 174, 20, 12, 248, 209, 253, 176, + 20, 12, 248, 209, 242, 236, 20, 12, 238, 146, 253, 176, 20, 12, 238, 146, + 242, 236, 20, 12, 243, 74, 253, 176, 20, 12, 243, 74, 242, 236, 20, 12, + 238, 80, 188, 240, 223, 20, 12, 238, 80, 188, 243, 174, 20, 12, 241, 66, + 244, 31, 20, 12, 254, 153, 244, 31, 20, 12, 240, 82, 243, 51, 20, 12, + 240, 82, 240, 108, 20, 12, 232, 107, 243, 51, 20, 12, 232, 107, 240, 108, + 20, 12, 246, 95, 242, 239, 20, 12, 244, 51, 242, 239, 20, 12, 137, 242, + 239, 20, 12, 238, 80, 242, 239, 20, 12, 240, 62, 242, 239, 20, 12, 235, + 108, 242, 239, 20, 12, 231, 112, 242, 239, 20, 12, 232, 109, 242, 239, + 20, 12, 253, 125, 238, 92, 231, 113, 242, 239, 20, 12, 255, 113, 235, 78, + 20, 12, 248, 49, 235, 78, 20, 12, 218, 255, 113, 235, 78, 20, 12, 31, + 236, 153, 240, 39, 20, 12, 31, 236, 153, 240, 0, 20, 12, 236, 152, 236, + 153, 88, 240, 39, 20, 12, 236, 152, 236, 153, 88, 240, 0, 20, 12, 236, + 152, 236, 153, 40, 240, 39, 20, 12, 236, 152, 236, 153, 40, 240, 0, 20, + 12, 236, 152, 236, 153, 38, 240, 39, 20, 12, 236, 152, 236, 153, 38, 240, + 0, 20, 12, 236, 152, 236, 153, 92, 240, 39, 20, 12, 236, 152, 236, 153, + 92, 240, 0, 20, 12, 236, 152, 236, 153, 88, 38, 240, 39, 20, 12, 236, + 152, 236, 153, 88, 38, 240, 0, 20, 12, 249, 113, 236, 153, 240, 39, 20, + 12, 249, 113, 236, 153, 240, 0, 20, 12, 231, 57, 236, 153, 92, 240, 39, + 20, 12, 231, 57, 236, 153, 92, 240, 0, 20, 12, 233, 56, 235, 78, 20, 12, + 253, 16, 235, 78, 20, 12, 236, 153, 240, 0, 20, 12, 252, 40, 235, 78, 20, + 12, 238, 172, 236, 153, 240, 39, 20, 12, 238, 172, 236, 153, 240, 0, 20, + 12, 239, 255, 20, 12, 244, 51, 243, 9, 20, 12, 137, 243, 9, 20, 12, 238, + 80, 243, 9, 20, 12, 240, 62, 243, 9, 20, 12, 235, 108, 243, 9, 20, 12, + 231, 112, 243, 9, 20, 12, 232, 109, 243, 9, 20, 12, 253, 125, 238, 92, + 231, 113, 243, 9, 20, 12, 50, 243, 46, 20, 12, 50, 233, 38, 243, 46, 20, + 12, 50, 234, 83, 20, 12, 50, 234, 84, 20, 12, 50, 234, 85, 20, 12, 236, + 225, 234, 83, 20, 12, 236, 225, 234, 84, 20, 12, 236, 225, 234, 85, 20, + 12, 50, 232, 117, 248, 40, 20, 12, 50, 239, 71, 20, 12, 50, 239, 72, 20, + 12, 50, 239, 73, 20, 12, 50, 239, 74, 20, 12, 50, 239, 75, 20, 12, 243, + 24, 243, 146, 20, 12, 253, 165, 243, 146, 20, 12, 243, 24, 248, 139, 20, + 12, 253, 165, 248, 139, 20, 12, 243, 24, 244, 19, 20, 12, 253, 165, 244, + 19, 20, 12, 243, 24, 238, 207, 20, 12, 253, 165, 238, 207, 20, 12, 50, + 238, 54, 20, 12, 50, 236, 105, 20, 12, 50, 239, 216, 20, 12, 50, 231, 81, + 20, 12, 50, 237, 201, 20, 12, 50, 227, 2, 20, 12, 50, 227, 11, 20, 12, + 50, 241, 221, 20, 12, 234, 46, 253, 176, 20, 12, 234, 46, 242, 236, 20, + 12, 50, 245, 71, 20, 12, 50, 252, 138, 20, 12, 50, 245, 90, 20, 12, 50, + 242, 117, 20, 12, 50, 244, 217, 20, 12, 50, 45, 238, 156, 20, 12, 50, + 240, 3, 238, 156, 20, 12, 232, 201, 20, 12, 239, 208, 20, 12, 255, 17, + 20, 12, 242, 61, 20, 12, 241, 237, 20, 12, 241, 115, 20, 12, 234, 106, + 20, 12, 232, 127, 20, 12, 243, 186, 249, 122, 240, 37, 20, 12, 243, 186, + 249, 122, 255, 51, 240, 37, 20, 12, 254, 250, 20, 12, 244, 41, 20, 12, + 236, 145, 244, 41, 20, 12, 249, 188, 240, 37, 20, 12, 249, 188, 253, 176, + 20, 12, 236, 172, 236, 111, 20, 12, 236, 172, 236, 112, 20, 12, 236, 172, + 236, 113, 20, 12, 236, 172, 236, 114, 20, 12, 236, 172, 236, 115, 20, 12, + 236, 172, 236, 116, 20, 12, 236, 172, 236, 117, 20, 12, 236, 172, 236, + 118, 20, 12, 236, 172, 236, 119, 20, 12, 236, 172, 235, 3, 20, 12, 236, + 172, 235, 4, 20, 12, 232, 168, 20, 12, 232, 186, 20, 12, 253, 165, 147, + 239, 204, 20, 12, 240, 112, 240, 37, 20, 12, 50, 92, 248, 198, 20, 12, + 50, 88, 248, 198, 20, 12, 50, 236, 34, 20, 12, 50, 252, 182, 234, 235, + 20, 12, 243, 114, 69, 20, 12, 243, 114, 88, 69, 20, 12, 137, 243, 114, + 69, 20, 12, 235, 125, 253, 176, 20, 12, 235, 125, 242, 236, 20, 12, 2, + 232, 165, 20, 12, 245, 34, 20, 12, 250, 181, 249, 26, 20, 12, 239, 131, + 20, 12, 241, 219, 20, 12, 239, 13, 20, 12, 234, 40, 240, 39, 20, 12, 234, + 40, 240, 0, 20, 12, 239, 138, 20, 12, 240, 200, 240, 0, 20, 12, 234, 41, + 240, 39, 20, 12, 234, 41, 240, 0, 20, 12, 249, 65, 240, 39, 20, 12, 249, + 65, 240, 0, 20, 12, 243, 217, 237, 29, 242, 239, 20, 12, 243, 217, 234, + 29, 242, 239, 20, 12, 241, 38, 242, 239, 20, 12, 234, 40, 242, 239, 20, + 12, 240, 200, 242, 239, 20, 12, 234, 41, 242, 239, 20, 12, 240, 65, 235, + 106, 253, 231, 234, 13, 235, 134, 20, 12, 240, 65, 235, 106, 253, 231, + 234, 13, 233, 85, 20, 12, 240, 65, 235, 106, 253, 231, 234, 13, 237, 29, + 231, 102, 20, 12, 240, 65, 233, 62, 253, 231, 234, 13, 235, 134, 20, 12, + 240, 65, 233, 62, 253, 231, 234, 13, 233, 85, 20, 12, 240, 65, 233, 62, + 253, 231, 234, 13, 234, 29, 231, 102, 20, 12, 240, 65, 233, 62, 253, 231, + 234, 13, 234, 29, 231, 126, 20, 12, 240, 65, 233, 62, 253, 231, 234, 13, + 234, 29, 231, 127, 20, 12, 241, 69, 20, 12, 235, 126, 255, 105, 243, 37, + 20, 12, 235, 126, 255, 112, 243, 37, 20, 12, 31, 217, 20, 12, 242, 178, + 20, 12, 237, 238, 20, 12, 239, 28, 20, 12, 234, 251, 20, 12, 235, 190, + 20, 12, 236, 129, 20, 12, 234, 237, 20, 12, 236, 77, 238, 185, 20, 12, + 236, 97, 238, 185, 20, 12, 238, 31, 234, 249, 20, 12, 254, 223, 233, 248, + 17, 242, 222, 126, 235, 146, 17, 242, 222, 126, 235, 147, 17, 242, 222, + 126, 236, 122, 17, 242, 222, 126, 235, 148, 17, 242, 222, 126, 235, 149, + 17, 242, 222, 126, 236, 123, 17, 242, 222, 126, 235, 150, 17, 242, 222, + 126, 235, 151, 17, 242, 222, 126, 236, 124, 17, 242, 222, 126, 235, 7, + 17, 242, 222, 126, 234, 67, 17, 242, 222, 126, 234, 68, 17, 242, 222, + 126, 234, 69, 17, 242, 222, 126, 234, 70, 17, 242, 222, 126, 235, 8, 17, + 242, 222, 126, 235, 9, 17, 242, 222, 126, 234, 71, 17, 242, 222, 126, + 234, 72, 17, 242, 222, 126, 234, 73, 17, 242, 222, 126, 235, 10, 17, 242, + 222, 126, 235, 11, 17, 242, 222, 126, 235, 12, 17, 242, 222, 126, 234, + 74, 17, 242, 222, 126, 234, 75, 17, 242, 222, 126, 234, 76, 17, 242, 222, + 126, 234, 77, 17, 242, 222, 126, 234, 78, 17, 242, 222, 126, 234, 79, 17, + 242, 222, 126, 234, 80, 17, 232, 69, 126, 235, 146, 17, 232, 69, 126, + 235, 147, 17, 232, 69, 126, 235, 148, 17, 232, 69, 126, 235, 149, 17, + 232, 69, 126, 235, 150, 17, 232, 69, 126, 235, 151, 17, 232, 69, 126, + 234, 67, 17, 232, 69, 126, 234, 68, 17, 232, 69, 126, 234, 69, 17, 232, + 69, 126, 234, 70, 17, 232, 69, 126, 234, 71, 17, 232, 69, 126, 234, 72, + 17, 232, 69, 126, 234, 73, 17, 232, 69, 126, 234, 74, 17, 232, 69, 126, + 234, 75, 17, 232, 69, 126, 235, 13, 17, 232, 69, 126, 235, 14, 17, 232, + 69, 126, 235, 15, 17, 232, 69, 126, 235, 16, 17, 232, 69, 126, 235, 17, + 17, 232, 69, 126, 235, 18, 17, 232, 69, 126, 235, 19, 17, 232, 69, 126, + 235, 20, 17, 232, 69, 126, 235, 21, 17, 232, 69, 126, 235, 22, 17, 232, + 69, 126, 235, 23, 17, 232, 69, 126, 235, 24, 17, 232, 69, 126, 235, 25, + 17, 232, 69, 126, 235, 26, 17, 232, 69, 126, 235, 27, 17, 232, 69, 126, + 235, 28, 17, 232, 69, 126, 235, 29, 17, 232, 69, 126, 234, 76, 17, 232, + 69, 126, 234, 77, 17, 232, 69, 126, 234, 78, 17, 232, 69, 126, 234, 79, + 17, 232, 69, 126, 234, 80, 50, 17, 20, 237, 49, 50, 17, 20, 234, 82, 50, + 17, 20, 234, 62, 17, 20, 239, 116, 236, 184, 28, 240, 49, 240, 56, 28, + 237, 174, 240, 49, 240, 56, 28, 245, 203, 240, 49, 240, 56, 28, 238, 181, + 238, 139, 240, 56, 28, 238, 181, 241, 169, 240, 56, 28, 240, 49, 120, 28, + 238, 129, 120, 28, 248, 37, 238, 51, 120, 28, 241, 244, 120, 28, 237, 72, + 120, 28, 238, 193, 240, 147, 120, 28, 232, 122, 120, 28, 238, 252, 120, + 28, 233, 73, 120, 28, 235, 182, 248, 235, 120, 28, 231, 123, 128, 233, + 136, 120, 28, 233, 137, 120, 28, 232, 67, 120, 28, 235, 127, 120, 28, + 232, 192, 120, 28, 240, 215, 120, 28, 237, 91, 120, 28, 238, 189, 244, + 188, 120, 28, 237, 51, 120, 28, 234, 54, 120, 28, 237, 55, 120, 28, 237, + 250, 120, 28, 233, 229, 120, 28, 245, 79, 120, 28, 251, 125, 120, 28, + 233, 127, 120, 28, 234, 185, 120, 28, 239, 54, 120, 28, 239, 21, 120, 28, + 231, 122, 120, 28, 16, 233, 230, 120, 28, 237, 230, 120, 28, 239, 115, + 120, 28, 234, 101, 120, 28, 237, 189, 120, 28, 234, 193, 120, 28, 236, + 109, 120, 28, 239, 169, 120, 28, 236, 28, 120, 28, 234, 248, 120, 28, + 254, 190, 128, 241, 246, 120, 28, 235, 141, 120, 28, 245, 125, 153, 243, + 224, 120, 28, 233, 196, 120, 28, 242, 135, 120, 28, 234, 197, 120, 28, + 232, 164, 120, 28, 237, 232, 120, 28, 239, 174, 120, 28, 239, 76, 120, + 28, 238, 40, 128, 238, 46, 120, 28, 234, 103, 120, 28, 237, 23, 120, 28, + 236, 16, 120, 28, 242, 171, 120, 28, 231, 125, 120, 28, 240, 23, 240, + 201, 120, 28, 232, 167, 120, 28, 235, 124, 253, 247, 120, 28, 237, 204, + 120, 28, 231, 115, 120, 28, 231, 65, 120, 28, 241, 88, 120, 28, 240, 252, + 120, 28, 238, 6, 120, 28, 241, 180, 120, 28, 234, 109, 120, 28, 234, 108, + 120, 28, 237, 109, 120, 28, 233, 199, 120, 28, 234, 253, 120, 28, 236, + 107, 120, 28, 236, 33, 120, 28, 233, 69, 120, 28, 237, 88, 120, 28, 237, + 154, 120, 28, 232, 114, 120, 28, 233, 125, 120, 28, 255, 34, 253, 145, + 242, 177, 120, 28, 231, 124, 120, 28, 234, 217, 120, 28, 234, 191, 10, + 16, 5, 67, 10, 16, 5, 217, 10, 16, 5, 255, 18, 10, 16, 5, 209, 10, 16, 5, + 72, 10, 16, 5, 255, 19, 10, 16, 5, 210, 10, 16, 5, 192, 10, 16, 5, 71, + 10, 16, 5, 221, 10, 16, 5, 255, 15, 10, 16, 5, 162, 10, 16, 5, 173, 10, + 16, 5, 197, 10, 16, 5, 73, 10, 16, 5, 223, 10, 16, 5, 255, 20, 10, 16, 5, + 144, 10, 16, 5, 193, 10, 16, 5, 214, 10, 16, 5, 79, 10, 16, 5, 179, 10, + 16, 5, 255, 16, 10, 16, 5, 206, 10, 16, 5, 255, 14, 10, 16, 5, 255, 17, + 10, 16, 3, 67, 10, 16, 3, 217, 10, 16, 3, 255, 18, 10, 16, 3, 209, 10, + 16, 3, 72, 10, 16, 3, 255, 19, 10, 16, 3, 210, 10, 16, 3, 192, 10, 16, 3, + 71, 10, 16, 3, 221, 10, 16, 3, 255, 15, 10, 16, 3, 162, 10, 16, 3, 173, + 10, 16, 3, 197, 10, 16, 3, 73, 10, 16, 3, 223, 10, 16, 3, 255, 20, 10, + 16, 3, 144, 10, 16, 3, 193, 10, 16, 3, 214, 10, 16, 3, 79, 10, 16, 3, + 179, 10, 16, 3, 255, 16, 10, 16, 3, 206, 10, 16, 3, 255, 14, 10, 16, 3, + 255, 17, 10, 24, 5, 67, 10, 24, 5, 217, 10, 24, 5, 255, 18, 10, 24, 5, + 209, 10, 24, 5, 72, 10, 24, 5, 255, 19, 10, 24, 5, 210, 10, 24, 5, 192, + 10, 24, 5, 71, 10, 24, 5, 221, 10, 24, 5, 255, 15, 10, 24, 5, 162, 10, + 24, 5, 173, 10, 24, 5, 197, 10, 24, 5, 73, 10, 24, 5, 223, 10, 24, 5, + 255, 20, 10, 24, 5, 144, 10, 24, 5, 193, 10, 24, 5, 214, 10, 24, 5, 79, + 10, 24, 5, 179, 10, 24, 5, 255, 16, 10, 24, 5, 206, 10, 24, 5, 255, 14, + 10, 24, 5, 255, 17, 10, 24, 3, 67, 10, 24, 3, 217, 10, 24, 3, 255, 18, + 10, 24, 3, 209, 10, 24, 3, 72, 10, 24, 3, 255, 19, 10, 24, 3, 210, 10, + 24, 3, 71, 10, 24, 3, 221, 10, 24, 3, 255, 15, 10, 24, 3, 162, 10, 24, 3, + 173, 10, 24, 3, 197, 10, 24, 3, 73, 10, 24, 3, 223, 10, 24, 3, 255, 20, + 10, 24, 3, 144, 10, 24, 3, 193, 10, 24, 3, 214, 10, 24, 3, 79, 10, 24, 3, + 179, 10, 24, 3, 255, 16, 10, 24, 3, 206, 10, 24, 3, 255, 14, 10, 24, 3, + 255, 17, 10, 16, 24, 5, 67, 10, 16, 24, 5, 217, 10, 16, 24, 5, 255, 18, + 10, 16, 24, 5, 209, 10, 16, 24, 5, 72, 10, 16, 24, 5, 255, 19, 10, 16, + 24, 5, 210, 10, 16, 24, 5, 192, 10, 16, 24, 5, 71, 10, 16, 24, 5, 221, + 10, 16, 24, 5, 255, 15, 10, 16, 24, 5, 162, 10, 16, 24, 5, 173, 10, 16, + 24, 5, 197, 10, 16, 24, 5, 73, 10, 16, 24, 5, 223, 10, 16, 24, 5, 255, + 20, 10, 16, 24, 5, 144, 10, 16, 24, 5, 193, 10, 16, 24, 5, 214, 10, 16, + 24, 5, 79, 10, 16, 24, 5, 179, 10, 16, 24, 5, 255, 16, 10, 16, 24, 5, + 206, 10, 16, 24, 5, 255, 14, 10, 16, 24, 5, 255, 17, 10, 16, 24, 3, 67, + 10, 16, 24, 3, 217, 10, 16, 24, 3, 255, 18, 10, 16, 24, 3, 209, 10, 16, + 24, 3, 72, 10, 16, 24, 3, 255, 19, 10, 16, 24, 3, 210, 10, 16, 24, 3, + 192, 10, 16, 24, 3, 71, 10, 16, 24, 3, 221, 10, 16, 24, 3, 255, 15, 10, + 16, 24, 3, 162, 10, 16, 24, 3, 173, 10, 16, 24, 3, 197, 10, 16, 24, 3, + 73, 10, 16, 24, 3, 223, 10, 16, 24, 3, 255, 20, 10, 16, 24, 3, 144, 10, + 16, 24, 3, 193, 10, 16, 24, 3, 214, 10, 16, 24, 3, 79, 10, 16, 24, 3, + 179, 10, 16, 24, 3, 255, 16, 10, 16, 24, 3, 206, 10, 16, 24, 3, 255, 14, + 10, 16, 24, 3, 255, 17, 10, 84, 5, 67, 10, 84, 5, 255, 18, 10, 84, 5, + 209, 10, 84, 5, 210, 10, 84, 5, 221, 10, 84, 5, 255, 15, 10, 84, 5, 197, + 10, 84, 5, 73, 10, 84, 5, 223, 10, 84, 5, 255, 20, 10, 84, 5, 193, 10, + 84, 5, 214, 10, 84, 5, 79, 10, 84, 5, 179, 10, 84, 5, 255, 16, 10, 84, 5, + 206, 10, 84, 5, 255, 14, 10, 84, 5, 255, 17, 10, 84, 3, 67, 10, 84, 3, + 217, 10, 84, 3, 255, 18, 10, 84, 3, 209, 10, 84, 3, 255, 19, 10, 84, 3, + 192, 10, 84, 3, 71, 10, 84, 3, 221, 10, 84, 3, 255, 15, 10, 84, 3, 162, + 10, 84, 3, 173, 10, 84, 3, 197, 10, 84, 3, 223, 10, 84, 3, 255, 20, 10, + 84, 3, 144, 10, 84, 3, 193, 10, 84, 3, 214, 10, 84, 3, 79, 10, 84, 3, + 179, 10, 84, 3, 255, 16, 10, 84, 3, 206, 10, 84, 3, 255, 14, 10, 84, 3, + 255, 17, 10, 16, 84, 5, 67, 10, 16, 84, 5, 217, 10, 16, 84, 5, 255, 18, + 10, 16, 84, 5, 209, 10, 16, 84, 5, 72, 10, 16, 84, 5, 255, 19, 10, 16, + 84, 5, 210, 10, 16, 84, 5, 192, 10, 16, 84, 5, 71, 10, 16, 84, 5, 221, + 10, 16, 84, 5, 255, 15, 10, 16, 84, 5, 162, 10, 16, 84, 5, 173, 10, 16, + 84, 5, 197, 10, 16, 84, 5, 73, 10, 16, 84, 5, 223, 10, 16, 84, 5, 255, + 20, 10, 16, 84, 5, 144, 10, 16, 84, 5, 193, 10, 16, 84, 5, 214, 10, 16, + 84, 5, 79, 10, 16, 84, 5, 179, 10, 16, 84, 5, 255, 16, 10, 16, 84, 5, + 206, 10, 16, 84, 5, 255, 14, 10, 16, 84, 5, 255, 17, 10, 16, 84, 3, 67, + 10, 16, 84, 3, 217, 10, 16, 84, 3, 255, 18, 10, 16, 84, 3, 209, 10, 16, + 84, 3, 72, 10, 16, 84, 3, 255, 19, 10, 16, 84, 3, 210, 10, 16, 84, 3, + 192, 10, 16, 84, 3, 71, 10, 16, 84, 3, 221, 10, 16, 84, 3, 255, 15, 10, + 16, 84, 3, 162, 10, 16, 84, 3, 173, 10, 16, 84, 3, 197, 10, 16, 84, 3, + 73, 10, 16, 84, 3, 223, 10, 16, 84, 3, 255, 20, 10, 16, 84, 3, 144, 10, + 16, 84, 3, 193, 10, 16, 84, 3, 214, 10, 16, 84, 3, 79, 10, 16, 84, 3, + 179, 10, 16, 84, 3, 255, 16, 10, 16, 84, 3, 206, 10, 16, 84, 3, 255, 14, + 10, 16, 84, 3, 255, 17, 10, 93, 5, 67, 10, 93, 5, 217, 10, 93, 5, 209, + 10, 93, 5, 72, 10, 93, 5, 255, 19, 10, 93, 5, 210, 10, 93, 5, 221, 10, + 93, 5, 255, 15, 10, 93, 5, 162, 10, 93, 5, 173, 10, 93, 5, 197, 10, 93, + 5, 73, 10, 93, 5, 223, 10, 93, 5, 255, 20, 10, 93, 5, 193, 10, 93, 5, + 214, 10, 93, 5, 79, 10, 93, 5, 179, 10, 93, 5, 255, 16, 10, 93, 5, 206, + 10, 93, 5, 255, 14, 10, 93, 3, 67, 10, 93, 3, 217, 10, 93, 3, 255, 18, + 10, 93, 3, 209, 10, 93, 3, 72, 10, 93, 3, 255, 19, 10, 93, 3, 210, 10, + 93, 3, 192, 10, 93, 3, 71, 10, 93, 3, 221, 10, 93, 3, 255, 15, 10, 93, 3, + 162, 10, 93, 3, 173, 10, 93, 3, 197, 10, 93, 3, 73, 10, 93, 3, 223, 10, + 93, 3, 255, 20, 10, 93, 3, 144, 10, 93, 3, 193, 10, 93, 3, 214, 10, 93, + 3, 79, 10, 93, 3, 179, 10, 93, 3, 255, 16, 10, 93, 3, 206, 10, 93, 3, + 255, 14, 10, 93, 3, 255, 17, 10, 138, 5, 67, 10, 138, 5, 217, 10, 138, 5, + 209, 10, 138, 5, 72, 10, 138, 5, 255, 19, 10, 138, 5, 210, 10, 138, 5, + 71, 10, 138, 5, 221, 10, 138, 5, 255, 15, 10, 138, 5, 162, 10, 138, 5, + 173, 10, 138, 5, 73, 10, 138, 5, 193, 10, 138, 5, 214, 10, 138, 5, 79, + 10, 138, 5, 179, 10, 138, 5, 255, 16, 10, 138, 5, 206, 10, 138, 5, 255, + 14, 10, 138, 3, 67, 10, 138, 3, 217, 10, 138, 3, 255, 18, 10, 138, 3, + 209, 10, 138, 3, 72, 10, 138, 3, 255, 19, 10, 138, 3, 210, 10, 138, 3, + 192, 10, 138, 3, 71, 10, 138, 3, 221, 10, 138, 3, 255, 15, 10, 138, 3, + 162, 10, 138, 3, 173, 10, 138, 3, 197, 10, 138, 3, 73, 10, 138, 3, 223, + 10, 138, 3, 255, 20, 10, 138, 3, 144, 10, 138, 3, 193, 10, 138, 3, 214, + 10, 138, 3, 79, 10, 138, 3, 179, 10, 138, 3, 255, 16, 10, 138, 3, 206, + 10, 138, 3, 255, 14, 10, 138, 3, 255, 17, 10, 16, 93, 5, 67, 10, 16, 93, + 5, 217, 10, 16, 93, 5, 255, 18, 10, 16, 93, 5, 209, 10, 16, 93, 5, 72, + 10, 16, 93, 5, 255, 19, 10, 16, 93, 5, 210, 10, 16, 93, 5, 192, 10, 16, + 93, 5, 71, 10, 16, 93, 5, 221, 10, 16, 93, 5, 255, 15, 10, 16, 93, 5, + 162, 10, 16, 93, 5, 173, 10, 16, 93, 5, 197, 10, 16, 93, 5, 73, 10, 16, + 93, 5, 223, 10, 16, 93, 5, 255, 20, 10, 16, 93, 5, 144, 10, 16, 93, 5, + 193, 10, 16, 93, 5, 214, 10, 16, 93, 5, 79, 10, 16, 93, 5, 179, 10, 16, + 93, 5, 255, 16, 10, 16, 93, 5, 206, 10, 16, 93, 5, 255, 14, 10, 16, 93, + 5, 255, 17, 10, 16, 93, 3, 67, 10, 16, 93, 3, 217, 10, 16, 93, 3, 255, + 18, 10, 16, 93, 3, 209, 10, 16, 93, 3, 72, 10, 16, 93, 3, 255, 19, 10, + 16, 93, 3, 210, 10, 16, 93, 3, 192, 10, 16, 93, 3, 71, 10, 16, 93, 3, + 221, 10, 16, 93, 3, 255, 15, 10, 16, 93, 3, 162, 10, 16, 93, 3, 173, 10, + 16, 93, 3, 197, 10, 16, 93, 3, 73, 10, 16, 93, 3, 223, 10, 16, 93, 3, + 255, 20, 10, 16, 93, 3, 144, 10, 16, 93, 3, 193, 10, 16, 93, 3, 214, 10, + 16, 93, 3, 79, 10, 16, 93, 3, 179, 10, 16, 93, 3, 255, 16, 10, 16, 93, 3, + 206, 10, 16, 93, 3, 255, 14, 10, 16, 93, 3, 255, 17, 10, 27, 5, 67, 10, + 27, 5, 217, 10, 27, 5, 255, 18, 10, 27, 5, 209, 10, 27, 5, 72, 10, 27, 5, + 255, 19, 10, 27, 5, 210, 10, 27, 5, 192, 10, 27, 5, 71, 10, 27, 5, 221, + 10, 27, 5, 255, 15, 10, 27, 5, 162, 10, 27, 5, 173, 10, 27, 5, 197, 10, + 27, 5, 73, 10, 27, 5, 223, 10, 27, 5, 255, 20, 10, 27, 5, 144, 10, 27, 5, + 193, 10, 27, 5, 214, 10, 27, 5, 79, 10, 27, 5, 179, 10, 27, 5, 255, 16, + 10, 27, 5, 206, 10, 27, 5, 255, 14, 10, 27, 5, 255, 17, 10, 27, 3, 67, + 10, 27, 3, 217, 10, 27, 3, 255, 18, 10, 27, 3, 209, 10, 27, 3, 72, 10, + 27, 3, 255, 19, 10, 27, 3, 210, 10, 27, 3, 192, 10, 27, 3, 71, 10, 27, 3, + 221, 10, 27, 3, 255, 15, 10, 27, 3, 162, 10, 27, 3, 173, 10, 27, 3, 197, + 10, 27, 3, 73, 10, 27, 3, 223, 10, 27, 3, 255, 20, 10, 27, 3, 144, 10, + 27, 3, 193, 10, 27, 3, 214, 10, 27, 3, 79, 10, 27, 3, 179, 10, 27, 3, + 255, 16, 10, 27, 3, 206, 10, 27, 3, 255, 14, 10, 27, 3, 255, 17, 10, 27, + 16, 5, 67, 10, 27, 16, 5, 217, 10, 27, 16, 5, 255, 18, 10, 27, 16, 5, + 209, 10, 27, 16, 5, 72, 10, 27, 16, 5, 255, 19, 10, 27, 16, 5, 210, 10, + 27, 16, 5, 192, 10, 27, 16, 5, 71, 10, 27, 16, 5, 221, 10, 27, 16, 5, + 255, 15, 10, 27, 16, 5, 162, 10, 27, 16, 5, 173, 10, 27, 16, 5, 197, 10, + 27, 16, 5, 73, 10, 27, 16, 5, 223, 10, 27, 16, 5, 255, 20, 10, 27, 16, 5, + 144, 10, 27, 16, 5, 193, 10, 27, 16, 5, 214, 10, 27, 16, 5, 79, 10, 27, + 16, 5, 179, 10, 27, 16, 5, 255, 16, 10, 27, 16, 5, 206, 10, 27, 16, 5, + 255, 14, 10, 27, 16, 5, 255, 17, 10, 27, 16, 3, 67, 10, 27, 16, 3, 217, + 10, 27, 16, 3, 255, 18, 10, 27, 16, 3, 209, 10, 27, 16, 3, 72, 10, 27, + 16, 3, 255, 19, 10, 27, 16, 3, 210, 10, 27, 16, 3, 192, 10, 27, 16, 3, + 71, 10, 27, 16, 3, 221, 10, 27, 16, 3, 255, 15, 10, 27, 16, 3, 162, 10, + 27, 16, 3, 173, 10, 27, 16, 3, 197, 10, 27, 16, 3, 73, 10, 27, 16, 3, + 223, 10, 27, 16, 3, 255, 20, 10, 27, 16, 3, 144, 10, 27, 16, 3, 193, 10, + 27, 16, 3, 214, 10, 27, 16, 3, 79, 10, 27, 16, 3, 179, 10, 27, 16, 3, + 255, 16, 10, 27, 16, 3, 206, 10, 27, 16, 3, 255, 14, 10, 27, 16, 3, 255, + 17, 10, 27, 24, 5, 67, 10, 27, 24, 5, 217, 10, 27, 24, 5, 255, 18, 10, + 27, 24, 5, 209, 10, 27, 24, 5, 72, 10, 27, 24, 5, 255, 19, 10, 27, 24, 5, + 210, 10, 27, 24, 5, 192, 10, 27, 24, 5, 71, 10, 27, 24, 5, 221, 10, 27, + 24, 5, 255, 15, 10, 27, 24, 5, 162, 10, 27, 24, 5, 173, 10, 27, 24, 5, + 197, 10, 27, 24, 5, 73, 10, 27, 24, 5, 223, 10, 27, 24, 5, 255, 20, 10, + 27, 24, 5, 144, 10, 27, 24, 5, 193, 10, 27, 24, 5, 214, 10, 27, 24, 5, + 79, 10, 27, 24, 5, 179, 10, 27, 24, 5, 255, 16, 10, 27, 24, 5, 206, 10, + 27, 24, 5, 255, 14, 10, 27, 24, 5, 255, 17, 10, 27, 24, 3, 67, 10, 27, + 24, 3, 217, 10, 27, 24, 3, 255, 18, 10, 27, 24, 3, 209, 10, 27, 24, 3, + 72, 10, 27, 24, 3, 255, 19, 10, 27, 24, 3, 210, 10, 27, 24, 3, 192, 10, + 27, 24, 3, 71, 10, 27, 24, 3, 221, 10, 27, 24, 3, 255, 15, 10, 27, 24, 3, + 162, 10, 27, 24, 3, 173, 10, 27, 24, 3, 197, 10, 27, 24, 3, 73, 10, 27, + 24, 3, 223, 10, 27, 24, 3, 255, 20, 10, 27, 24, 3, 144, 10, 27, 24, 3, + 193, 10, 27, 24, 3, 214, 10, 27, 24, 3, 79, 10, 27, 24, 3, 179, 10, 27, + 24, 3, 255, 16, 10, 27, 24, 3, 206, 10, 27, 24, 3, 255, 14, 10, 27, 24, + 3, 255, 17, 10, 27, 16, 24, 5, 67, 10, 27, 16, 24, 5, 217, 10, 27, 16, + 24, 5, 255, 18, 10, 27, 16, 24, 5, 209, 10, 27, 16, 24, 5, 72, 10, 27, + 16, 24, 5, 255, 19, 10, 27, 16, 24, 5, 210, 10, 27, 16, 24, 5, 192, 10, + 27, 16, 24, 5, 71, 10, 27, 16, 24, 5, 221, 10, 27, 16, 24, 5, 255, 15, + 10, 27, 16, 24, 5, 162, 10, 27, 16, 24, 5, 173, 10, 27, 16, 24, 5, 197, + 10, 27, 16, 24, 5, 73, 10, 27, 16, 24, 5, 223, 10, 27, 16, 24, 5, 255, + 20, 10, 27, 16, 24, 5, 144, 10, 27, 16, 24, 5, 193, 10, 27, 16, 24, 5, + 214, 10, 27, 16, 24, 5, 79, 10, 27, 16, 24, 5, 179, 10, 27, 16, 24, 5, + 255, 16, 10, 27, 16, 24, 5, 206, 10, 27, 16, 24, 5, 255, 14, 10, 27, 16, + 24, 5, 255, 17, 10, 27, 16, 24, 3, 67, 10, 27, 16, 24, 3, 217, 10, 27, + 16, 24, 3, 255, 18, 10, 27, 16, 24, 3, 209, 10, 27, 16, 24, 3, 72, 10, + 27, 16, 24, 3, 255, 19, 10, 27, 16, 24, 3, 210, 10, 27, 16, 24, 3, 192, + 10, 27, 16, 24, 3, 71, 10, 27, 16, 24, 3, 221, 10, 27, 16, 24, 3, 255, + 15, 10, 27, 16, 24, 3, 162, 10, 27, 16, 24, 3, 173, 10, 27, 16, 24, 3, + 197, 10, 27, 16, 24, 3, 73, 10, 27, 16, 24, 3, 223, 10, 27, 16, 24, 3, + 255, 20, 10, 27, 16, 24, 3, 144, 10, 27, 16, 24, 3, 193, 10, 27, 16, 24, + 3, 214, 10, 27, 16, 24, 3, 79, 10, 27, 16, 24, 3, 179, 10, 27, 16, 24, 3, + 255, 16, 10, 27, 16, 24, 3, 206, 10, 27, 16, 24, 3, 255, 14, 10, 27, 16, + 24, 3, 255, 17, 10, 160, 5, 67, 10, 160, 5, 217, 10, 160, 5, 255, 18, 10, + 160, 5, 209, 10, 160, 5, 72, 10, 160, 5, 255, 19, 10, 160, 5, 210, 10, + 160, 5, 192, 10, 160, 5, 71, 10, 160, 5, 221, 10, 160, 5, 255, 15, 10, + 160, 5, 162, 10, 160, 5, 173, 10, 160, 5, 197, 10, 160, 5, 73, 10, 160, + 5, 223, 10, 160, 5, 255, 20, 10, 160, 5, 144, 10, 160, 5, 193, 10, 160, + 5, 214, 10, 160, 5, 79, 10, 160, 5, 179, 10, 160, 5, 255, 16, 10, 160, 5, + 206, 10, 160, 5, 255, 14, 10, 160, 5, 255, 17, 10, 160, 3, 67, 10, 160, + 3, 217, 10, 160, 3, 255, 18, 10, 160, 3, 209, 10, 160, 3, 72, 10, 160, 3, + 255, 19, 10, 160, 3, 210, 10, 160, 3, 192, 10, 160, 3, 71, 10, 160, 3, + 221, 10, 160, 3, 255, 15, 10, 160, 3, 162, 10, 160, 3, 173, 10, 160, 3, + 197, 10, 160, 3, 73, 10, 160, 3, 223, 10, 160, 3, 255, 20, 10, 160, 3, + 144, 10, 160, 3, 193, 10, 160, 3, 214, 10, 160, 3, 79, 10, 160, 3, 179, + 10, 160, 3, 255, 16, 10, 160, 3, 206, 10, 160, 3, 255, 14, 10, 160, 3, + 255, 17, 10, 24, 3, 238, 70, 71, 10, 24, 3, 238, 70, 221, 10, 16, 5, 240, + 22, 10, 16, 5, 242, 242, 10, 16, 5, 240, 10, 10, 16, 5, 240, 28, 10, 16, + 5, 236, 165, 10, 16, 5, 242, 251, 10, 16, 5, 248, 87, 10, 16, 5, 240, 38, + 10, 16, 5, 242, 237, 10, 16, 5, 240, 41, 10, 16, 5, 240, 33, 10, 16, 5, + 253, 154, 10, 16, 5, 253, 150, 10, 16, 5, 253, 188, 10, 16, 5, 236, 169, + 10, 16, 5, 253, 147, 10, 16, 5, 248, 73, 10, 16, 5, 243, 0, 91, 10, 16, + 5, 240, 21, 10, 16, 5, 248, 85, 10, 16, 5, 236, 160, 10, 16, 5, 248, 68, + 10, 16, 5, 248, 67, 10, 16, 5, 248, 69, 10, 16, 5, 240, 20, 10, 16, 240, + 79, 10, 16, 3, 240, 22, 10, 16, 3, 242, 242, 10, 16, 3, 240, 10, 10, 16, + 3, 240, 28, 10, 16, 3, 236, 165, 10, 16, 3, 242, 251, 10, 16, 3, 248, 87, + 10, 16, 3, 240, 38, 10, 16, 3, 242, 237, 10, 16, 3, 240, 41, 10, 16, 3, + 240, 33, 10, 16, 3, 253, 154, 10, 16, 3, 253, 150, 10, 16, 3, 253, 188, + 10, 16, 3, 236, 169, 10, 16, 3, 253, 147, 10, 16, 3, 248, 73, 10, 16, 3, + 30, 240, 21, 10, 16, 3, 240, 21, 10, 16, 3, 248, 85, 10, 16, 3, 236, 160, + 10, 16, 3, 248, 68, 10, 16, 3, 248, 67, 10, 16, 3, 248, 69, 10, 16, 3, + 240, 20, 10, 16, 238, 100, 231, 90, 10, 16, 238, 57, 91, 10, 16, 243, 0, + 91, 10, 16, 243, 29, 91, 10, 16, 254, 11, 91, 10, 16, 253, 218, 91, 10, + 16, 255, 29, 91, 10, 24, 5, 240, 22, 10, 24, 5, 242, 242, 10, 24, 5, 240, + 10, 10, 24, 5, 240, 28, 10, 24, 5, 236, 165, 10, 24, 5, 242, 251, 10, 24, + 5, 248, 87, 10, 24, 5, 240, 38, 10, 24, 5, 242, 237, 10, 24, 5, 240, 41, + 10, 24, 5, 240, 33, 10, 24, 5, 253, 154, 10, 24, 5, 253, 150, 10, 24, 5, + 253, 188, 10, 24, 5, 236, 169, 10, 24, 5, 253, 147, 10, 24, 5, 248, 73, + 10, 24, 5, 243, 0, 91, 10, 24, 5, 240, 21, 10, 24, 5, 248, 85, 10, 24, 5, + 236, 160, 10, 24, 5, 248, 68, 10, 24, 5, 248, 67, 10, 24, 5, 248, 69, 10, + 24, 5, 240, 20, 10, 24, 240, 79, 10, 24, 3, 240, 22, 10, 24, 3, 242, 242, + 10, 24, 3, 240, 10, 10, 24, 3, 240, 28, 10, 24, 3, 236, 165, 10, 24, 3, + 242, 251, 10, 24, 3, 248, 87, 10, 24, 3, 240, 38, 10, 24, 3, 242, 237, + 10, 24, 3, 240, 41, 10, 24, 3, 240, 33, 10, 24, 3, 253, 154, 10, 24, 3, + 253, 150, 10, 24, 3, 253, 188, 10, 24, 3, 236, 169, 10, 24, 3, 253, 147, + 10, 24, 3, 248, 73, 10, 24, 3, 30, 240, 21, 10, 24, 3, 240, 21, 10, 24, + 3, 248, 85, 10, 24, 3, 236, 160, 10, 24, 3, 248, 68, 10, 24, 3, 248, 67, + 10, 24, 3, 248, 69, 10, 24, 3, 240, 20, 10, 24, 238, 100, 231, 90, 10, + 24, 238, 57, 91, 10, 24, 243, 0, 91, 10, 24, 243, 29, 91, 10, 24, 254, + 11, 91, 10, 24, 253, 218, 91, 10, 24, 255, 29, 91, 10, 16, 24, 5, 240, + 22, 10, 16, 24, 5, 242, 242, 10, 16, 24, 5, 240, 10, 10, 16, 24, 5, 240, + 28, 10, 16, 24, 5, 236, 165, 10, 16, 24, 5, 242, 251, 10, 16, 24, 5, 248, + 87, 10, 16, 24, 5, 240, 38, 10, 16, 24, 5, 242, 237, 10, 16, 24, 5, 240, + 41, 10, 16, 24, 5, 240, 33, 10, 16, 24, 5, 253, 154, 10, 16, 24, 5, 253, + 150, 10, 16, 24, 5, 253, 188, 10, 16, 24, 5, 236, 169, 10, 16, 24, 5, + 253, 147, 10, 16, 24, 5, 248, 73, 10, 16, 24, 5, 243, 0, 91, 10, 16, 24, + 5, 240, 21, 10, 16, 24, 5, 248, 85, 10, 16, 24, 5, 236, 160, 10, 16, 24, + 5, 248, 68, 10, 16, 24, 5, 248, 67, 10, 16, 24, 5, 248, 69, 10, 16, 24, + 5, 240, 20, 10, 16, 24, 240, 79, 10, 16, 24, 3, 240, 22, 10, 16, 24, 3, + 242, 242, 10, 16, 24, 3, 240, 10, 10, 16, 24, 3, 240, 28, 10, 16, 24, 3, + 236, 165, 10, 16, 24, 3, 242, 251, 10, 16, 24, 3, 248, 87, 10, 16, 24, 3, + 240, 38, 10, 16, 24, 3, 242, 237, 10, 16, 24, 3, 240, 41, 10, 16, 24, 3, + 240, 33, 10, 16, 24, 3, 253, 154, 10, 16, 24, 3, 253, 150, 10, 16, 24, 3, + 253, 188, 10, 16, 24, 3, 236, 169, 10, 16, 24, 3, 253, 147, 10, 16, 24, + 3, 248, 73, 10, 16, 24, 3, 30, 240, 21, 10, 16, 24, 3, 240, 21, 10, 16, + 24, 3, 248, 85, 10, 16, 24, 3, 236, 160, 10, 16, 24, 3, 248, 68, 10, 16, + 24, 3, 248, 67, 10, 16, 24, 3, 248, 69, 10, 16, 24, 3, 240, 20, 10, 16, + 24, 238, 100, 231, 90, 10, 16, 24, 238, 57, 91, 10, 16, 24, 243, 0, 91, + 10, 16, 24, 243, 29, 91, 10, 16, 24, 254, 11, 91, 10, 16, 24, 253, 218, + 91, 10, 16, 24, 255, 29, 91, 10, 27, 16, 5, 240, 22, 10, 27, 16, 5, 242, + 242, 10, 27, 16, 5, 240, 10, 10, 27, 16, 5, 240, 28, 10, 27, 16, 5, 236, + 165, 10, 27, 16, 5, 242, 251, 10, 27, 16, 5, 248, 87, 10, 27, 16, 5, 240, + 38, 10, 27, 16, 5, 242, 237, 10, 27, 16, 5, 240, 41, 10, 27, 16, 5, 240, + 33, 10, 27, 16, 5, 253, 154, 10, 27, 16, 5, 253, 150, 10, 27, 16, 5, 253, + 188, 10, 27, 16, 5, 236, 169, 10, 27, 16, 5, 253, 147, 10, 27, 16, 5, + 248, 73, 10, 27, 16, 5, 243, 0, 91, 10, 27, 16, 5, 240, 21, 10, 27, 16, + 5, 248, 85, 10, 27, 16, 5, 236, 160, 10, 27, 16, 5, 248, 68, 10, 27, 16, + 5, 248, 67, 10, 27, 16, 5, 248, 69, 10, 27, 16, 5, 240, 20, 10, 27, 16, + 240, 79, 10, 27, 16, 3, 240, 22, 10, 27, 16, 3, 242, 242, 10, 27, 16, 3, + 240, 10, 10, 27, 16, 3, 240, 28, 10, 27, 16, 3, 236, 165, 10, 27, 16, 3, + 242, 251, 10, 27, 16, 3, 248, 87, 10, 27, 16, 3, 240, 38, 10, 27, 16, 3, + 242, 237, 10, 27, 16, 3, 240, 41, 10, 27, 16, 3, 240, 33, 10, 27, 16, 3, + 253, 154, 10, 27, 16, 3, 253, 150, 10, 27, 16, 3, 253, 188, 10, 27, 16, + 3, 236, 169, 10, 27, 16, 3, 253, 147, 10, 27, 16, 3, 248, 73, 10, 27, 16, + 3, 30, 240, 21, 10, 27, 16, 3, 240, 21, 10, 27, 16, 3, 248, 85, 10, 27, + 16, 3, 236, 160, 10, 27, 16, 3, 248, 68, 10, 27, 16, 3, 248, 67, 10, 27, + 16, 3, 248, 69, 10, 27, 16, 3, 240, 20, 10, 27, 16, 238, 100, 231, 90, + 10, 27, 16, 238, 57, 91, 10, 27, 16, 243, 0, 91, 10, 27, 16, 243, 29, 91, + 10, 27, 16, 254, 11, 91, 10, 27, 16, 253, 218, 91, 10, 27, 16, 255, 29, + 91, 10, 27, 16, 24, 5, 240, 22, 10, 27, 16, 24, 5, 242, 242, 10, 27, 16, + 24, 5, 240, 10, 10, 27, 16, 24, 5, 240, 28, 10, 27, 16, 24, 5, 236, 165, + 10, 27, 16, 24, 5, 242, 251, 10, 27, 16, 24, 5, 248, 87, 10, 27, 16, 24, + 5, 240, 38, 10, 27, 16, 24, 5, 242, 237, 10, 27, 16, 24, 5, 240, 41, 10, + 27, 16, 24, 5, 240, 33, 10, 27, 16, 24, 5, 253, 154, 10, 27, 16, 24, 5, + 253, 150, 10, 27, 16, 24, 5, 253, 188, 10, 27, 16, 24, 5, 236, 169, 10, + 27, 16, 24, 5, 253, 147, 10, 27, 16, 24, 5, 248, 73, 10, 27, 16, 24, 5, + 243, 0, 91, 10, 27, 16, 24, 5, 240, 21, 10, 27, 16, 24, 5, 248, 85, 10, + 27, 16, 24, 5, 236, 160, 10, 27, 16, 24, 5, 248, 68, 10, 27, 16, 24, 5, + 248, 67, 10, 27, 16, 24, 5, 248, 69, 10, 27, 16, 24, 5, 240, 20, 10, 27, + 16, 24, 240, 79, 10, 27, 16, 24, 3, 240, 22, 10, 27, 16, 24, 3, 242, 242, + 10, 27, 16, 24, 3, 240, 10, 10, 27, 16, 24, 3, 240, 28, 10, 27, 16, 24, + 3, 236, 165, 10, 27, 16, 24, 3, 242, 251, 10, 27, 16, 24, 3, 248, 87, 10, + 27, 16, 24, 3, 240, 38, 10, 27, 16, 24, 3, 242, 237, 10, 27, 16, 24, 3, + 240, 41, 10, 27, 16, 24, 3, 240, 33, 10, 27, 16, 24, 3, 253, 154, 10, 27, + 16, 24, 3, 253, 150, 10, 27, 16, 24, 3, 253, 188, 10, 27, 16, 24, 3, 236, + 169, 10, 27, 16, 24, 3, 253, 147, 10, 27, 16, 24, 3, 248, 73, 10, 27, 16, + 24, 3, 30, 240, 21, 10, 27, 16, 24, 3, 240, 21, 10, 27, 16, 24, 3, 248, + 85, 10, 27, 16, 24, 3, 236, 160, 10, 27, 16, 24, 3, 248, 68, 10, 27, 16, + 24, 3, 248, 67, 10, 27, 16, 24, 3, 248, 69, 10, 27, 16, 24, 3, 240, 20, + 10, 27, 16, 24, 238, 100, 231, 90, 10, 27, 16, 24, 238, 57, 91, 10, 27, + 16, 24, 243, 0, 91, 10, 27, 16, 24, 243, 29, 91, 10, 27, 16, 24, 254, 11, + 91, 10, 27, 16, 24, 253, 218, 91, 10, 27, 16, 24, 255, 29, 91, 10, 16, + 26, 242, 217, 10, 16, 26, 127, 10, 16, 26, 111, 10, 16, 26, 166, 10, 16, + 26, 177, 10, 16, 26, 176, 10, 16, 26, 187, 10, 16, 26, 203, 10, 16, 26, + 195, 10, 16, 26, 202, 10, 138, 26, 242, 217, 10, 138, 26, 127, 10, 138, + 26, 111, 10, 138, 26, 166, 10, 138, 26, 177, 10, 138, 26, 176, 10, 138, + 26, 187, 10, 138, 26, 203, 10, 138, 26, 195, 10, 138, 26, 202, 10, 27, + 26, 242, 217, 10, 27, 26, 127, 10, 27, 26, 111, 10, 27, 26, 166, 10, 27, + 26, 177, 10, 27, 26, 176, 10, 27, 26, 187, 10, 27, 26, 203, 10, 27, 26, + 195, 10, 27, 26, 202, 10, 27, 16, 26, 242, 217, 10, 27, 16, 26, 127, 10, + 27, 16, 26, 111, 10, 27, 16, 26, 166, 10, 27, 16, 26, 177, 10, 27, 16, + 26, 176, 10, 27, 16, 26, 187, 10, 27, 16, 26, 203, 10, 27, 16, 26, 195, + 10, 27, 16, 26, 202, 10, 160, 26, 242, 217, 10, 160, 26, 127, 10, 160, + 26, 111, 10, 160, 26, 166, 10, 160, 26, 177, 10, 160, 26, 176, 10, 160, + 26, 187, 10, 160, 26, 203, 10, 160, 26, 195, 10, 160, 26, 202, 7, 9, 227, + 16, 7, 9, 227, 17, 7, 9, 227, 18, 7, 9, 227, 19, 7, 9, 227, 20, 7, 9, + 227, 21, 7, 9, 227, 22, 7, 9, 227, 23, 7, 9, 227, 24, 7, 9, 227, 25, 7, + 9, 227, 26, 7, 9, 227, 27, 7, 9, 227, 28, 7, 9, 227, 29, 7, 9, 227, 30, + 7, 9, 227, 31, 7, 9, 227, 32, 7, 9, 227, 33, 7, 9, 227, 34, 7, 9, 227, + 35, 7, 9, 227, 36, 7, 9, 227, 37, 7, 9, 227, 38, 7, 9, 227, 39, 7, 9, + 227, 40, 7, 9, 227, 41, 7, 9, 227, 42, 7, 9, 227, 43, 7, 9, 227, 44, 7, + 9, 227, 45, 7, 9, 227, 46, 7, 9, 227, 47, 7, 9, 227, 48, 7, 9, 227, 49, + 7, 9, 227, 50, 7, 9, 227, 51, 7, 9, 227, 52, 7, 9, 227, 53, 7, 9, 227, + 54, 7, 9, 227, 55, 7, 9, 227, 56, 7, 9, 227, 57, 7, 9, 227, 58, 7, 9, + 227, 59, 7, 9, 227, 60, 7, 9, 227, 61, 7, 9, 227, 62, 7, 9, 227, 63, 7, + 9, 227, 64, 7, 9, 227, 65, 7, 9, 227, 66, 7, 9, 227, 67, 7, 9, 227, 68, + 7, 9, 227, 69, 7, 9, 227, 70, 7, 9, 227, 71, 7, 9, 227, 72, 7, 9, 227, + 73, 7, 9, 227, 74, 7, 9, 227, 75, 7, 9, 227, 76, 7, 9, 227, 77, 7, 9, + 227, 78, 7, 9, 227, 79, 7, 9, 227, 80, 7, 9, 227, 81, 7, 9, 227, 82, 7, + 9, 227, 83, 7, 9, 227, 84, 7, 9, 227, 85, 7, 9, 227, 86, 7, 9, 227, 87, + 7, 9, 227, 88, 7, 9, 227, 89, 7, 9, 227, 90, 7, 9, 227, 91, 7, 9, 227, + 92, 7, 9, 227, 93, 7, 9, 227, 94, 7, 9, 227, 95, 7, 9, 227, 96, 7, 9, + 227, 97, 7, 9, 227, 98, 7, 9, 227, 99, 7, 9, 227, 100, 7, 9, 227, 101, 7, + 9, 227, 102, 7, 9, 227, 103, 7, 9, 227, 104, 7, 9, 227, 105, 7, 9, 227, + 106, 7, 9, 227, 107, 7, 9, 227, 108, 7, 9, 227, 109, 7, 9, 227, 110, 7, + 9, 227, 111, 7, 9, 227, 112, 7, 9, 227, 113, 7, 9, 227, 114, 7, 9, 227, + 115, 7, 9, 227, 116, 7, 9, 227, 117, 7, 9, 227, 118, 7, 9, 227, 119, 7, + 9, 227, 120, 7, 9, 227, 121, 7, 9, 227, 122, 7, 9, 227, 123, 7, 9, 227, + 124, 7, 9, 227, 125, 7, 9, 227, 126, 7, 9, 227, 127, 7, 9, 227, 128, 7, + 9, 227, 129, 7, 9, 227, 130, 7, 9, 227, 131, 7, 9, 227, 132, 7, 9, 227, + 133, 7, 9, 227, 134, 7, 9, 227, 135, 7, 9, 227, 136, 7, 9, 227, 137, 7, + 9, 227, 138, 7, 9, 227, 139, 7, 9, 227, 140, 7, 9, 227, 141, 7, 9, 227, + 142, 7, 9, 227, 143, 7, 9, 227, 144, 7, 9, 227, 145, 7, 9, 227, 146, 7, + 9, 227, 147, 7, 9, 227, 148, 7, 9, 227, 149, 7, 9, 227, 150, 7, 9, 227, + 151, 7, 9, 227, 152, 7, 9, 227, 153, 7, 9, 227, 154, 7, 9, 227, 155, 7, + 9, 227, 156, 7, 9, 227, 157, 7, 9, 227, 158, 7, 9, 227, 159, 7, 9, 227, + 160, 7, 9, 227, 161, 7, 9, 227, 162, 7, 9, 227, 163, 7, 9, 227, 164, 7, + 9, 227, 165, 7, 9, 227, 166, 7, 9, 227, 167, 7, 9, 227, 168, 7, 9, 227, + 169, 7, 9, 227, 170, 7, 9, 227, 171, 7, 9, 227, 172, 7, 9, 227, 173, 7, + 9, 227, 174, 7, 9, 227, 175, 7, 9, 227, 176, 7, 9, 227, 177, 7, 9, 227, + 178, 7, 9, 227, 179, 7, 9, 227, 180, 7, 9, 227, 181, 7, 9, 227, 182, 7, + 9, 227, 183, 7, 9, 227, 184, 7, 9, 227, 185, 7, 9, 227, 186, 7, 9, 227, + 187, 7, 9, 227, 188, 7, 9, 227, 189, 7, 9, 227, 190, 7, 9, 227, 191, 7, + 9, 227, 192, 7, 9, 227, 193, 7, 9, 227, 194, 7, 9, 227, 195, 7, 9, 227, + 196, 7, 9, 227, 197, 7, 9, 227, 198, 7, 9, 227, 199, 7, 9, 227, 200, 7, + 9, 227, 201, 7, 9, 227, 202, 7, 9, 227, 203, 7, 9, 227, 204, 7, 9, 227, + 205, 7, 9, 227, 206, 7, 9, 227, 207, 7, 9, 227, 208, 7, 9, 227, 209, 7, + 9, 227, 210, 7, 9, 227, 211, 7, 9, 227, 212, 7, 9, 227, 213, 7, 9, 227, + 214, 7, 9, 227, 215, 7, 9, 227, 216, 7, 9, 227, 217, 7, 9, 227, 218, 7, + 9, 227, 219, 7, 9, 227, 220, 7, 9, 227, 221, 7, 9, 227, 222, 7, 9, 227, + 223, 7, 9, 227, 224, 7, 9, 227, 225, 7, 9, 227, 226, 7, 9, 227, 227, 7, + 9, 227, 228, 7, 9, 227, 229, 7, 9, 227, 230, 7, 9, 227, 231, 7, 9, 227, + 232, 7, 9, 227, 233, 7, 9, 227, 234, 7, 9, 227, 235, 7, 9, 227, 236, 7, + 9, 227, 237, 7, 9, 227, 238, 7, 9, 227, 239, 7, 9, 227, 240, 7, 9, 227, + 241, 7, 9, 227, 242, 7, 9, 227, 243, 7, 9, 227, 244, 7, 9, 227, 245, 7, + 9, 227, 246, 7, 9, 227, 247, 7, 9, 227, 248, 7, 9, 227, 249, 7, 9, 227, + 250, 7, 9, 227, 251, 7, 9, 227, 252, 7, 9, 227, 253, 7, 9, 227, 254, 7, + 9, 227, 255, 7, 9, 228, 0, 7, 9, 228, 1, 7, 9, 228, 2, 7, 9, 228, 3, 7, + 9, 228, 4, 7, 9, 228, 5, 7, 9, 228, 6, 7, 9, 228, 7, 7, 9, 228, 8, 7, 9, + 228, 9, 7, 9, 228, 10, 7, 9, 228, 11, 7, 9, 228, 12, 7, 9, 228, 13, 7, 9, + 228, 14, 7, 9, 228, 15, 7, 9, 228, 16, 7, 9, 228, 17, 7, 9, 228, 18, 7, + 9, 228, 19, 7, 9, 228, 20, 7, 9, 228, 21, 7, 9, 228, 22, 7, 9, 228, 23, + 7, 9, 228, 24, 7, 9, 228, 25, 7, 9, 228, 26, 7, 9, 228, 27, 7, 9, 228, + 28, 7, 9, 228, 29, 7, 9, 228, 30, 7, 9, 228, 31, 7, 9, 228, 32, 7, 9, + 228, 33, 7, 9, 228, 34, 7, 9, 228, 35, 7, 9, 228, 36, 7, 9, 228, 37, 7, + 9, 228, 38, 7, 9, 228, 39, 7, 9, 228, 40, 7, 9, 228, 41, 7, 9, 228, 42, + 7, 9, 228, 43, 7, 9, 228, 44, 7, 9, 228, 45, 7, 9, 228, 46, 7, 9, 228, + 47, 7, 9, 228, 48, 7, 9, 228, 49, 7, 9, 228, 50, 7, 9, 228, 51, 7, 9, + 228, 52, 7, 9, 228, 53, 7, 9, 228, 54, 7, 9, 228, 55, 7, 9, 228, 56, 7, + 9, 228, 57, 7, 9, 228, 58, 7, 9, 228, 59, 7, 9, 228, 60, 7, 9, 228, 61, + 7, 9, 228, 62, 7, 9, 228, 63, 7, 9, 228, 64, 7, 9, 228, 65, 7, 9, 228, + 66, 7, 9, 228, 67, 7, 9, 228, 68, 7, 9, 228, 69, 7, 9, 228, 70, 7, 9, + 228, 71, 7, 9, 228, 72, 7, 9, 228, 73, 7, 9, 228, 74, 7, 9, 228, 75, 7, + 9, 228, 76, 7, 9, 228, 77, 7, 9, 228, 78, 7, 9, 228, 79, 7, 9, 228, 80, + 7, 9, 228, 81, 7, 9, 228, 82, 7, 9, 228, 83, 7, 9, 228, 84, 7, 9, 228, + 85, 7, 9, 228, 86, 7, 9, 228, 87, 7, 9, 228, 88, 7, 9, 228, 89, 7, 9, + 228, 90, 7, 9, 228, 91, 7, 9, 228, 92, 7, 9, 228, 93, 7, 9, 228, 94, 7, + 9, 228, 95, 7, 9, 228, 96, 7, 9, 228, 97, 7, 9, 228, 98, 7, 9, 228, 99, + 7, 9, 228, 100, 7, 9, 228, 101, 7, 9, 228, 102, 7, 9, 228, 103, 7, 9, + 228, 104, 7, 9, 228, 105, 7, 9, 228, 106, 7, 9, 228, 107, 7, 9, 228, 108, + 7, 9, 228, 109, 7, 9, 228, 110, 7, 9, 228, 111, 7, 9, 228, 112, 7, 9, + 228, 113, 7, 9, 228, 114, 7, 9, 228, 115, 7, 9, 228, 116, 7, 9, 228, 117, + 7, 9, 228, 118, 7, 9, 228, 119, 7, 9, 228, 120, 7, 9, 228, 121, 7, 9, + 228, 122, 7, 9, 228, 123, 7, 9, 228, 124, 7, 9, 228, 125, 7, 9, 228, 126, + 7, 9, 228, 127, 7, 9, 228, 128, 7, 9, 228, 129, 7, 9, 228, 130, 7, 9, + 228, 131, 7, 9, 228, 132, 7, 9, 228, 133, 7, 9, 228, 134, 7, 9, 228, 135, + 7, 9, 228, 136, 7, 9, 228, 137, 7, 9, 228, 138, 7, 9, 228, 139, 7, 9, + 228, 140, 7, 9, 228, 141, 7, 9, 228, 142, 7, 9, 228, 143, 7, 9, 228, 144, + 7, 9, 228, 145, 7, 9, 228, 146, 7, 9, 228, 147, 7, 9, 228, 148, 7, 9, + 228, 149, 7, 9, 228, 150, 7, 9, 228, 151, 7, 9, 228, 152, 7, 9, 228, 153, + 7, 9, 228, 154, 7, 9, 228, 155, 7, 9, 228, 156, 7, 9, 228, 157, 7, 9, + 228, 158, 7, 9, 228, 159, 7, 9, 228, 160, 7, 9, 228, 161, 7, 9, 228, 162, + 7, 9, 228, 163, 7, 9, 228, 164, 7, 9, 228, 165, 7, 9, 228, 166, 7, 9, + 228, 167, 7, 9, 228, 168, 7, 9, 228, 169, 7, 9, 228, 170, 7, 9, 228, 171, + 7, 9, 228, 172, 7, 9, 228, 173, 7, 9, 228, 174, 7, 9, 228, 175, 7, 9, + 228, 176, 7, 9, 228, 177, 7, 9, 228, 178, 7, 9, 228, 179, 7, 9, 228, 180, + 7, 9, 228, 181, 7, 9, 228, 182, 7, 9, 228, 183, 7, 9, 228, 184, 7, 9, + 228, 185, 7, 9, 228, 186, 7, 9, 228, 187, 7, 9, 228, 188, 7, 9, 228, 189, + 7, 9, 228, 190, 7, 9, 228, 191, 7, 9, 228, 192, 7, 9, 228, 193, 7, 9, + 228, 194, 7, 9, 228, 195, 7, 9, 228, 196, 7, 9, 228, 197, 7, 9, 228, 198, + 7, 9, 228, 199, 7, 9, 228, 200, 7, 9, 228, 201, 7, 9, 228, 202, 7, 9, + 228, 203, 7, 9, 228, 204, 7, 9, 228, 205, 7, 9, 228, 206, 7, 9, 228, 207, + 7, 9, 228, 208, 7, 9, 228, 209, 7, 9, 228, 210, 7, 9, 228, 211, 7, 9, + 228, 212, 7, 9, 228, 213, 7, 9, 228, 214, 7, 9, 228, 215, 7, 9, 228, 216, + 7, 9, 228, 217, 7, 9, 228, 218, 7, 9, 228, 219, 7, 9, 228, 220, 7, 9, + 228, 221, 7, 9, 228, 222, 7, 9, 228, 223, 7, 9, 228, 224, 7, 9, 228, 225, + 7, 9, 228, 226, 7, 9, 228, 227, 7, 9, 228, 228, 7, 9, 228, 229, 7, 9, + 228, 230, 7, 9, 228, 231, 7, 9, 228, 232, 7, 9, 228, 233, 7, 9, 228, 234, + 7, 9, 228, 235, 7, 9, 228, 236, 7, 9, 228, 237, 7, 9, 228, 238, 7, 9, + 228, 239, 7, 9, 228, 240, 7, 9, 228, 241, 7, 9, 228, 242, 7, 9, 228, 243, + 7, 9, 228, 244, 7, 9, 228, 245, 7, 9, 228, 246, 7, 9, 228, 247, 7, 9, + 228, 248, 7, 9, 228, 249, 7, 9, 228, 250, 7, 9, 228, 251, 7, 9, 228, 252, + 7, 9, 228, 253, 7, 9, 228, 254, 7, 9, 228, 255, 7, 9, 229, 0, 7, 9, 229, + 1, 7, 9, 229, 2, 7, 9, 229, 3, 7, 9, 229, 4, 7, 9, 229, 5, 7, 9, 229, 6, + 7, 9, 229, 7, 7, 9, 229, 8, 7, 9, 229, 9, 7, 9, 229, 10, 7, 9, 229, 11, + 7, 9, 229, 12, 7, 9, 229, 13, 7, 9, 229, 14, 7, 9, 229, 15, 7, 9, 229, + 16, 7, 9, 229, 17, 7, 9, 229, 18, 7, 9, 229, 19, 7, 9, 229, 20, 7, 9, + 229, 21, 7, 9, 229, 22, 7, 9, 229, 23, 7, 9, 229, 24, 7, 9, 229, 25, 7, + 9, 229, 26, 7, 9, 229, 27, 7, 9, 229, 28, 7, 9, 229, 29, 7, 9, 229, 30, + 7, 9, 229, 31, 7, 9, 229, 32, 7, 9, 229, 33, 7, 9, 229, 34, 7, 9, 229, + 35, 7, 9, 229, 36, 7, 9, 229, 37, 7, 9, 229, 38, 7, 9, 229, 39, 7, 9, + 229, 40, 7, 9, 229, 41, 7, 9, 229, 42, 7, 9, 229, 43, 7, 9, 229, 44, 7, + 9, 229, 45, 237, 194, 249, 173, 97, 240, 15, 97, 233, 54, 69, 97, 235, + 51, 69, 97, 61, 52, 97, 240, 114, 52, 97, 238, 107, 52, 97, 234, 17, 97, + 233, 59, 97, 40, 232, 74, 97, 38, 232, 74, 97, 235, 52, 97, 248, 49, 52, + 97, 240, 27, 97, 231, 94, 97, 248, 37, 208, 97, 236, 177, 97, 26, 242, + 217, 97, 26, 127, 97, 26, 111, 97, 26, 166, 97, 26, 177, 97, 26, 176, 97, + 26, 187, 97, 26, 203, 97, 26, 195, 97, 26, 202, 97, 240, 24, 97, 234, 14, + 97, 235, 44, 52, 97, 240, 7, 52, 97, 232, 68, 52, 97, 236, 156, 69, 97, + 234, 20, 254, 20, 97, 8, 5, 1, 67, 97, 8, 5, 1, 217, 97, 8, 5, 1, 255, + 18, 97, 8, 5, 1, 209, 97, 8, 5, 1, 72, 97, 8, 5, 1, 255, 19, 97, 8, 5, 1, + 210, 97, 8, 5, 1, 192, 97, 8, 5, 1, 71, 97, 8, 5, 1, 221, 97, 8, 5, 1, + 255, 15, 97, 8, 5, 1, 162, 97, 8, 5, 1, 173, 97, 8, 5, 1, 197, 97, 8, 5, + 1, 73, 97, 8, 5, 1, 223, 97, 8, 5, 1, 255, 20, 97, 8, 5, 1, 144, 97, 8, + 5, 1, 193, 97, 8, 5, 1, 214, 97, 8, 5, 1, 79, 97, 8, 5, 1, 179, 97, 8, 5, + 1, 255, 16, 97, 8, 5, 1, 206, 97, 8, 5, 1, 255, 14, 97, 8, 5, 1, 255, 17, + 97, 40, 31, 104, 97, 238, 75, 236, 177, 97, 38, 31, 104, 97, 190, 238, + 54, 97, 170, 242, 224, 97, 242, 245, 238, 54, 97, 8, 3, 1, 67, 97, 8, 3, + 1, 217, 97, 8, 3, 1, 255, 18, 97, 8, 3, 1, 209, 97, 8, 3, 1, 72, 97, 8, + 3, 1, 255, 19, 97, 8, 3, 1, 210, 97, 8, 3, 1, 192, 97, 8, 3, 1, 71, 97, + 8, 3, 1, 221, 97, 8, 3, 1, 255, 15, 97, 8, 3, 1, 162, 97, 8, 3, 1, 173, + 97, 8, 3, 1, 197, 97, 8, 3, 1, 73, 97, 8, 3, 1, 223, 97, 8, 3, 1, 255, + 20, 97, 8, 3, 1, 144, 97, 8, 3, 1, 193, 97, 8, 3, 1, 214, 97, 8, 3, 1, + 79, 97, 8, 3, 1, 179, 97, 8, 3, 1, 255, 16, 97, 8, 3, 1, 206, 97, 8, 3, + 1, 255, 14, 97, 8, 3, 1, 255, 17, 97, 40, 242, 225, 104, 97, 59, 242, + 224, 97, 38, 242, 225, 104, 97, 169, 241, 43, 249, 173, 34, 232, 211, 34, + 232, 212, 34, 232, 213, 34, 232, 214, 34, 232, 215, 34, 232, 216, 34, + 232, 217, 34, 232, 218, 34, 232, 219, 34, 232, 220, 34, 232, 221, 34, + 232, 222, 34, 232, 223, 34, 232, 224, 34, 232, 225, 34, 232, 226, 34, + 232, 227, 34, 232, 228, 34, 232, 229, 34, 232, 230, 34, 232, 231, 34, + 232, 232, 34, 232, 233, 34, 232, 234, 34, 232, 235, 34, 232, 236, 34, + 232, 237, 34, 232, 238, 34, 232, 239, 34, 232, 240, 34, 232, 241, 34, + 232, 242, 34, 232, 243, 34, 232, 244, 34, 232, 245, 34, 232, 246, 34, + 232, 247, 34, 232, 248, 34, 232, 249, 34, 232, 250, 34, 232, 251, 34, + 232, 252, 34, 232, 253, 34, 232, 254, 34, 232, 255, 34, 233, 0, 34, 233, + 1, 34, 233, 2, 34, 233, 3, 34, 233, 4, 34, 233, 5, 34, 233, 6, 34, 233, + 7, 34, 233, 8, 34, 233, 9, 34, 233, 10, 34, 233, 11, 34, 233, 12, 34, + 233, 13, 34, 233, 14, 34, 233, 15, 34, 233, 16, 34, 233, 17, 34, 233, 18, + 34, 233, 19, 34, 233, 20, 34, 233, 21, 34, 233, 22, 34, 233, 23, 34, 233, + 24, 34, 233, 25, 34, 233, 26, 34, 233, 27, 34, 233, 28, 34, 233, 29, 34, + 233, 30, 34, 233, 31, 34, 233, 32, 34, 233, 33, 34, 233, 34, 34, 233, 35, + 34, 233, 36, 34, 233, 37, 34, 231, 153, 34, 231, 154, 34, 231, 155, 34, + 231, 156, 34, 231, 157, 34, 231, 158, 34, 231, 159, 34, 231, 160, 34, + 231, 161, 34, 231, 162, 34, 231, 163, 34, 231, 164, 34, 231, 165, 34, + 231, 166, 34, 231, 167, 34, 231, 168, 34, 231, 169, 34, 231, 170, 34, + 231, 171, 34, 231, 172, 34, 231, 173, 34, 231, 174, 34, 231, 175, 34, + 231, 176, 34, 231, 177, 34, 231, 178, 34, 231, 179, 34, 231, 180, 34, + 231, 181, 34, 231, 182, 34, 231, 183, 34, 231, 184, 34, 231, 185, 34, + 231, 186, 34, 231, 187, 34, 231, 188, 34, 231, 189, 34, 231, 190, 34, + 231, 191, 34, 231, 192, 34, 231, 193, 34, 231, 194, 34, 231, 195, 34, + 231, 196, 34, 231, 197, 34, 231, 198, 34, 231, 199, 34, 231, 200, 34, + 231, 201, 34, 231, 202, 34, 231, 203, 34, 231, 204, 34, 231, 205, 34, + 231, 206, 34, 231, 207, 34, 231, 208, 34, 231, 209, 34, 231, 210, 34, + 231, 211, 34, 231, 212, 34, 231, 213, 34, 231, 214, 34, 231, 215, 34, + 231, 216, 34, 231, 217, 34, 231, 218, 34, 231, 219, 34, 231, 220, 34, + 231, 221, 34, 231, 222, 34, 231, 223, 34, 231, 224, 34, 231, 225, 34, + 231, 226, 34, 231, 227, 34, 231, 228, 34, 231, 229, 34, 231, 230, 34, + 231, 231, 34, 231, 232, 34, 231, 233, 34, 231, 234, 34, 231, 235, 34, + 231, 236, 34, 231, 237, 34, 231, 238, 34, 231, 239, 34, 231, 240, 34, + 231, 241, 34, 231, 242, 34, 231, 243, 34, 231, 244, 34, 231, 245, 34, + 231, 246, 34, 231, 247, 34, 231, 248, 34, 231, 249, 34, 231, 250, 34, + 231, 251, 34, 231, 252, 34, 231, 253, 34, 231, 254, 34, 231, 255, 34, + 232, 0, 34, 232, 1, 34, 232, 2, 34, 232, 3, 34, 232, 4, 34, 232, 5, 34, + 232, 6, 34, 232, 7, 34, 232, 8, 34, 232, 9, 34, 232, 10, 34, 232, 11, 34, + 232, 12, 34, 232, 13, 34, 232, 14, 34, 232, 15, 34, 232, 16, 34, 232, 17, + 34, 232, 18, 34, 232, 19, 34, 232, 20, 34, 232, 21, 34, 232, 22, 34, 232, + 23, 34, 232, 24, 34, 232, 25, 34, 232, 26, 34, 232, 27, 34, 232, 28, 34, + 232, 29, 34, 232, 30, 34, 232, 31, 34, 232, 32, 34, 232, 33, 34, 232, 34, + 34, 232, 35, 34, 232, 36, 34, 232, 37, 34, 232, 38, 34, 232, 39, 34, 232, + 40, 34, 232, 41, 34, 232, 42, 34, 232, 43, 34, 232, 44, 34, 232, 45, 34, + 232, 46, 34, 232, 47, 34, 232, 48, 34, 232, 49, 34, 232, 50, 34, 232, 51, + 34, 232, 52, 34, 232, 53, }; static unsigned char phrasebook_offset1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 8, 8, 8, 8, 8, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 8, 8, 8, 38, 39, 40, 41, 42, 43, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 44, 45, 46, 47, 48, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 49, 50, - 51, 52, 53, 54, 55, 8, 8, 8, 56, 57, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 58, - 59, 8, 8, 60, 61, 62, 63, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 64, 65, 66, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 16, 16, 16, 16, + 16, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 16, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 97, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 16, 16, 16, 16, 108, 16, 109, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 16, 16, 128, + 129, 130, 131, 16, 16, 16, 16, 16, 16, 132, 16, 16, 16, 133, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 134, 135, 136, + 137, 138, 16, 139, 16, 140, 141, 142, 143, 144, 145, 146, 147, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 148, 149, + 150, 151, 152, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 153, 16, 154, 155, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, }; static unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 9, 11, 14, 17, 19, 21, 24, 27, 29, 32, - 34, 36, 38, 40, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 70, - 72, 75, 79, 83, 87, 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, 131, - 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 186, - 190, 193, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, 240, - 244, 248, 252, 256, 260, 264, 268, 272, 276, 280, 284, 288, 292, 296, - 300, 304, 308, 312, 315, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 324, 329, - 332, 335, 338, 341, 344, 347, 348, 351, 357, 364, 366, 370, 373, 374, - 377, 380, 383, 386, 390, 393, 396, 399, 401, 404, 410, 417, 425, 433, - 441, 446, 452, 458, 465, 471, 477, 485, 490, 498, 504, 510, 517, 523, - 529, 535, 542, 548, 553, 560, 566, 572, 579, 585, 591, 594, 600, 606, - 612, 619, 625, 632, 637, 643, 649, 655, 662, 668, 674, 682, 687, 695, - 701, 707, 714, 720, 726, 732, 739, 745, 750, 757, 763, 769, 776, 782, - 788, 791, 797, 803, 809, 816, 822, 829, 834, 841, 847, 853, 859, 865, - 872, 879, 886, 893, 901, 909, 917, 925, 932, 939, 946, 953, 960, 967, - 973, 979, 985, 991, 998, 1005, 1012, 1019, 1025, 1031, 1039, 1047, 1054, - 1061, 1069, 1077, 1085, 1093, 1101, 1109, 1116, 1123, 1129, 1135, 1141, - 1147, 1153, 1159, 1166, 1173, 1180, 1186, 1191, 1196, 1204, 1212, 1220, - 1228, 1233, 1240, 1247, 1255, 1263, 1270, 1277, 1286, 1295, 1302, 1309, - 1316, 1323, 1331, 1339, 1346, 1353, 1364, 1369, 1374, 1380, 1386, 1392, - 1398, 1405, 1412, 1417, 1422, 1429, 1436, 1444, 1452, 1459, 1466, 1473, - 1480, 1488, 1496, 1504, 1512, 1519, 1526, 1534, 1542, 1549, 1556, 1563, - 1570, 1576, 1582, 1588, 1594, 1600, 1606, 1614, 1622, 1629, 1636, 1643, - 1650, 1658, 1666, 1674, 1682, 1689, 1696, 1703, 1711, 1719, 1726, 1733, - 1738, 1745, 1752, 1760, 1768, 1774, 1780, 1786, 1793, 1800, 1806, 1813, - 1821, 1829, 1836, 1841, 1846, 1852, 1859, 1866, 1873, 1878, 1883, 1888, - 1894, 1901, 1908, 1915, 1922, 1928, 1936, 1946, 1954, 1961, 1968, 1973, - 1978, 1985, 1992, 1996, 2002, 2008, 2013, 2020, 2029, 2036, 2043, 2052, - 2059, 2066, 2071, 2078, 2085, 2092, 2099, 2106, 2111, 2118, 2125, 2133, - 2138, 2144, 2150, 2160, 2164, 2170, 2176, 2182, 2188, 2195, 2207, 2214, - 2219, 2228, 2233, 2238, 2247, 2252, 2258, 2264, 2270, 2276, 2282, 2288, - 2294, 2300, 2309, 2318, 2327, 2336, 2345, 2354, 2363, 2372, 2378, 2387, - 2396, 2405, 2414, 2421, 2428, 2435, 2442, 2449, 2456, 2463, 2470, 2477, - 2484, 2493, 2502, 2509, 2516, 2523, 2528, 2537, 2542, 2549, 2556, 2561, - 2566, 2573, 2580, 2590, 2600, 2607, 2614, 2623, 2632, 2639, 2646, 2654, - 2662, 2669, 2676, 2684, 2692, 2699, 2706, 2714, 2722, 2729, 2736, 2744, - 2752, 2760, 2768, 2777, 2786, 2793, 2800, 2808, 2816, 2825, 2834, 2843, - 2852, 2857, 2862, 2869, 2876, 0, 2886, 2891, 2896, 2903, 2910, 2917, - 2924, 2931, 2938, 2947, 2956, 2964, 2972, 2979, 2986, 2995, 3004, 3011, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3018, 3024, 3029, 3036, 3043, 3049, 3057, 3065, 3072, 3077, - 3082, 3089, 3095, 3102, 3111, 3120, 3129, 3136, 3141, 3146, 3151, 3158, - 3164, 3171, 3178, 3184, 3189, 3194, 3203, 3211, 3220, 3225, 3231, 3242, - 3249, 3257, 3266, 3271, 3277, 3283, 3290, 3295, 3301, 3312, 3321, 3330, - 3338, 3346, 3355, 3360, 3367, 3374, 3379, 3391, 3399, 3407, 3413, 3422, - 3427, 3432, 3439, 3445, 3451, 3457, 3462, 3471, 3479, 3484, 3492, 3497, - 3505, 3512, 3517, 3523, 3528, 3536, 3544, 3549, 3557, 3563, 3568, 3575, - 3583, 3592, 3599, 3606, 3616, 3623, 3630, 3640, 3647, 3654, 3661, 3667, - 0, 0, 3673, 3677, 3684, 3688, 3692, 3698, 3707, 3714, 3718, 3722, 3726, - 3731, 3737, 3741, 3746, 3752, 3758, 3763, 3769, 3774, 3779, 3784, 3789, - 3794, 3795, 3800, 3803, 3809, 3815, 3822, 3827, 3835, 3843, 3849, 3856, - 3864, 3872, 3877, 3882, 3887, 3892, 3893, 3895, 3898, 3900, 3902, 3907, - 3912, 3918, 3923, 3927, 3931, 3935, 3942, 3949, 3956, 3963, 3970, 3977, - 3986, 3995, 3999, 4003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4008, 4013, 4018, 4022, 4024, 4026, 4029, 4031, 4034, 4036, 4040, - 4044, 4050, 4052, 4056, 4061, 4067, 4070, 4074, 4080, 4084, 4089, 4094, - 4099, 4104, 4109, 4114, 4118, 4121, 4127, 4132, 4137, 4142, 4147, 4153, - 4159, 4162, 4166, 4170, 4174, 4177, 4180, 4184, 4188, 4195, 4199, 4203, - 4207, 4213, 4216, 4220, 4225, 4231, 4235, 4241, 4247, 4253, 4259, 4265, - 4271, 4274, 4278, 4282, 4285, 4289, 4295, 4301, 4305, 4309, 4315, 4318, - 4322, 4327, 4332, 4336, 4340, 4344, 4350, 4355, 4359, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4364, 4367, 4372, 4377, 4382, 4387, 4392, - 4397, 4402, 4407, 4412, 4417, 4422, 4427, 4432, 4437, 0, 0, 0, 0, 4442, - 4445, 0, 0, 0, 0, 4449, 0, 0, 0, 4451, 0, 0, 0, 0, 0, 4455, 4458, 4463, - 4470, 4475, 4483, 4490, 0, 4497, 0, 4505, 4513, 4520, 4530, 4535, 4540, - 4545, 4550, 4555, 4560, 4565, 4570, 4575, 4580, 4585, 4590, 4595, 4600, - 4605, 4610, 0, 4615, 4620, 4625, 4630, 4635, 4640, 4645, 4650, 4657, - 4665, 4672, 4680, 4687, 4694, 4705, 4710, 4715, 4720, 4725, 4730, 4735, - 4740, 4745, 4750, 4755, 4760, 4765, 4770, 4775, 4780, 4785, 4790, 4796, - 4801, 4806, 4811, 4816, 4821, 4826, 4831, 4838, 4846, 4854, 4862, 0, - 4869, 4873, 4877, 4884, 4894, 4904, 4908, 4912, 4916, 4922, 4929, 4933, - 4938, 4942, 4947, 4951, 4956, 4960, 4965, 4971, 4977, 4983, 4989, 4995, - 5001, 5007, 5013, 5019, 5025, 5031, 5037, 5043, 5049, 5053, 5057, 5063, - 5067, 5072, 5078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5085, 5092, 5097, 5102, - 5107, 5114, 5119, 5125, 5130, 5135, 5140, 5145, 5150, 5155, 5161, 5166, - 5171, 5175, 5180, 5185, 5190, 5195, 5200, 5205, 5210, 5214, 5219, 5223, - 5228, 5233, 5238, 5242, 5247, 5252, 5257, 5262, 5266, 5271, 5276, 5281, - 5286, 5291, 5296, 5302, 5307, 5313, 5317, 5322, 5326, 5330, 5335, 5340, - 5345, 5350, 5355, 5360, 5365, 5369, 5374, 5378, 5383, 5388, 5393, 5397, - 5402, 5407, 5412, 5417, 5421, 5426, 5431, 5436, 5441, 5446, 5451, 5457, - 5462, 5468, 5472, 5477, 5481, 5488, 5493, 5498, 5503, 5510, 5515, 5521, - 5526, 5531, 5536, 5541, 5546, 5551, 5557, 5562, 5567, 5572, 5577, 5582, - 5587, 5593, 5599, 5606, 5613, 5622, 5631, 5638, 5645, 5654, 5663, 5668, - 5673, 5678, 5683, 5688, 5693, 5698, 5703, 5714, 5725, 5730, 5735, 5742, - 5749, 5756, 5763, 5768, 5773, 5778, 5783, 5787, 5791, 5795, 5800, 0, - 5805, 5812, 5817, 5825, 5833, 5839, 5845, 5853, 5861, 5869, 5877, 5884, - 5891, 5900, 5909, 5917, 5925, 5933, 5941, 5949, 5957, 5965, 5973, 5980, - 5987, 5993, 5999, 6007, 6015, 6022, 6029, 6038, 6047, 6054, 6061, 6069, - 6077, 6085, 6093, 6099, 6105, 6113, 6121, 6129, 6137, 6144, 6151, 6159, - 6167, 6175, 6183, 6188, 6193, 6200, 6207, 6217, 6227, 6231, 6238, 6245, - 6252, 6259, 6267, 6275, 6282, 6289, 6297, 6305, 6312, 6319, 6327, 0, - 6335, 6341, 6347, 6353, 6359, 6365, 6371, 6378, 6385, 6390, 6395, 6402, - 6409, 6416, 6423, 6430, 6437, 6444, 6451, 6457, 6463, 6469, 6475, 6481, - 6487, 6493, 6499, 6507, 6515, 6521, 6527, 6533, 6539, 6545, 6551, 6558, - 6565, 6572, 0, 0, 6579, 6586, 0, 0, 0, 0, 0, 0, 6593, 6600, 6607, 6614, - 6621, 6628, 6635, 6642, 6649, 6656, 6663, 6670, 6677, 6684, 6691, 6698, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6705, 6710, 6715, 6720, 6725, 6730, 6735, - 6740, 6745, 6749, 6754, 6759, 6764, 6769, 6774, 6779, 6784, 6789, 6794, - 6799, 6804, 6809, 6814, 6819, 6824, 6829, 6834, 6839, 6844, 6849, 6854, - 6859, 6864, 6869, 6874, 6879, 6884, 6889, 0, 0, 6894, 6901, 6904, 6908, - 6912, 6915, 6919, 0, 6923, 6928, 6933, 6938, 6943, 6948, 6953, 6958, - 6963, 6967, 6972, 6977, 6982, 6987, 6992, 6997, 7002, 7007, 7012, 7017, - 7022, 7027, 7032, 7037, 7042, 7047, 7052, 7057, 7062, 7067, 7072, 7077, - 7082, 7087, 7092, 7097, 7102, 7107, 7112, 0, 7119, 7122, 0, 0, 0, 0, 0, - 0, 7125, 7129, 7133, 7137, 7143, 7149, 7153, 7157, 7161, 7165, 7169, - 7173, 7177, 7183, 7187, 7193, 7199, 0, 7203, 7207, 7211, 7215, 7221, - 7225, 7229, 7235, 7243, 7247, 7251, 7255, 7259, 7265, 7270, 7277, 7284, - 7291, 7296, 7301, 7306, 7311, 7316, 0, 7321, 7326, 7334, 7339, 7344, - 7349, 7354, 7360, 7366, 7373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7377, - 7381, 7385, 7389, 7393, 7397, 7401, 7405, 7409, 7413, 7417, 7422, 7426, - 7430, 7435, 7439, 7444, 7448, 7452, 7456, 7461, 7465, 7470, 7474, 7478, - 7482, 7486, 0, 0, 0, 0, 0, 7490, 7497, 7505, 7512, 7517, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7522, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7525, 0, 0, 0, 7528, 0, 7532, 7536, 7543, - 7549, 7556, 7562, 7568, 7572, 7576, 7581, 7585, 7589, 7593, 7597, 7601, - 7605, 7609, 7613, 7617, 7621, 7625, 7629, 7633, 7637, 7641, 7645, 0, 0, - 0, 0, 0, 7649, 7652, 7656, 7660, 7664, 7668, 7672, 7676, 7680, 7684, - 7689, 7693, 7696, 7699, 7702, 7705, 7708, 7711, 7714, 7717, 7721, 7724, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7727, 7732, 7736, 7740, 7744, 7748, 7752, - 7756, 7760, 7764, 7768, 7772, 7777, 7782, 7789, 7795, 7801, 7807, 7812, - 7820, 7828, 7834, 7841, 7848, 7854, 7861, 7865, 7869, 7873, 7879, 7890, - 7894, 7898, 7902, 7908, 7917, 7921, 7925, 7934, 7938, 7942, 7946, 7953, - 7960, 7972, 7976, 7980, 7984, 7996, 8006, 8010, 8017, 8024, 8031, 8040, - 8051, 8060, 8064, 8074, 8084, 8093, 8109, 8118, 8128, 8138, 8148, 8154, - 8163, 8170, 8174, 8184, 8188, 8195, 8205, 8209, 8215, 8222, 8229, 8233, - 8243, 8247, 8254, 8258, 8267, 8271, 8281, 8287, 8293, 8302, 8311, 8317, - 8322, 8326, 8332, 8341, 8346, 8353, 8359, 8364, 8372, 8379, 8386, 8392, - 8396, 8399, 8403, 8409, 8418, 8422, 8428, 8434, 8440, 8447, 8450, 8459, - 8464, 8472, 8475, 8479, 8492, 8505, 8512, 8519, 8525, 8533, 8539, 8545, - 8555, 8563, 8573, 8584, 8591, 8597, 8603, 8607, 8611, 8617, 8623, 8629, - 8637, 8645, 8657, 0, 0, 8663, 8670, 8676, 8682, 8688, 8694, 8700, 8706, - 8712, 8718, 8724, 8730, 8737, 8744, 8750, 0, 8758, 8764, 8769, 8774, - 8779, 8784, 8788, 8795, 8801, 8810, 8818, 8821, 8826, 8831, 0, 8836, - 8840, 8844, 8850, 8854, 8858, 8864, 8868, 8876, 8880, 8884, 8888, 8892, - 8896, 8902, 8906, 8912, 8916, 8920, 8924, 8928, 8932, 8937, 8940, 8944, - 8949, 8953, 8957, 8961, 8965, 0, 0, 0, 8969, 8973, 8977, 8982, 8986, - 8990, 8995, 8999, 9003, 9010, 9017, 9021, 9025, 9030, 9034, 9038, 9041, - 9045, 9048, 9051, 9057, 9063, 9069, 9075, 9080, 9085, 9088, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9091, 9095, 9099, 9103, 9107, 9111, 9115, 9119, 9123, 9127, 9131, - 9135, 9139, 9143, 9147, 9151, 9155, 9159, 9163, 9167, 9171, 9175, 9179, - 9183, 9187, 9191, 9195, 9199, 9203, 9207, 9211, 9215, 9219, 9222, 9226, - 9230, 9234, 9238, 9242, 9245, 9248, 9251, 9254, 9257, 9260, 9263, 9266, - 9269, 9272, 9275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9279, 9283, 9287, 0, 9291, 9294, 9298, 9301, 9305, 9308, - 9312, 9316, 9320, 9325, 9329, 9332, 9336, 9341, 9345, 9348, 9352, 9355, - 9359, 9363, 9367, 9371, 9375, 9379, 9383, 9387, 9391, 9395, 9399, 9403, - 9407, 9411, 9415, 9419, 9423, 9427, 9431, 9435, 9439, 9443, 9447, 9451, - 9454, 9457, 9461, 9465, 9469, 9473, 9477, 9481, 9485, 9489, 9493, 0, 0, - 9497, 9501, 9505, 9510, 9514, 9519, 9523, 9528, 9533, 9539, 9545, 9550, - 9554, 9559, 9565, 9570, 9574, 9579, 0, 0, 9583, 9586, 9592, 9598, 9603, - 0, 0, 0, 9608, 9612, 9616, 9620, 9624, 9628, 9632, 9636, 9640, 9645, - 9650, 9655, 9661, 9664, 9668, 9672, 9675, 9678, 9681, 9684, 9687, 9690, - 9693, 9696, 9699, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9703, - 9707, 9711, 0, 9715, 9718, 9722, 9725, 9729, 9732, 9736, 9740, 0, 0, - 9744, 9747, 0, 0, 9751, 9754, 9758, 9761, 9765, 9769, 9773, 9777, 9781, - 9785, 9789, 9793, 9797, 9801, 9805, 9809, 9813, 9817, 9821, 9825, 9829, - 9833, 0, 9837, 9841, 9845, 9849, 9853, 9856, 9859, 0, 9863, 0, 0, 0, - 9867, 9871, 9875, 9879, 0, 0, 9883, 0, 9887, 9892, 9896, 9901, 9905, - 9910, 9915, 0, 0, 9921, 9925, 0, 0, 9930, 9934, 9939, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9943, 0, 0, 0, 0, 9949, 9953, 0, 9957, 9961, 9966, 9971, 9976, - 0, 0, 9982, 9986, 9989, 9992, 9995, 9998, 10001, 10004, 10007, 10010, - 10013, 10022, 10030, 10034, 10038, 10044, 10050, 10056, 10062, 10077, - 10084, 0, 0, 0, 0, 0, 0, 0, 10087, 0, 0, 10091, 10094, 10098, 10101, - 10105, 10108, 0, 0, 0, 0, 10112, 10116, 0, 0, 10120, 10124, 10128, 10131, - 10135, 10139, 10143, 10147, 10151, 10155, 10159, 10163, 10167, 10171, - 10175, 10179, 10183, 10187, 10191, 10195, 10199, 10203, 0, 10207, 10211, - 10215, 10219, 10223, 10226, 10229, 0, 10233, 10237, 0, 10241, 10245, 0, - 10249, 10253, 0, 0, 10257, 0, 10261, 10266, 10270, 10275, 10279, 0, 0, 0, - 0, 10284, 10289, 0, 0, 10294, 10299, 10304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10308, 10312, 10316, 10320, 0, 10324, 0, 0, 0, 0, 0, 0, 0, 10328, - 10332, 10335, 10338, 10341, 10344, 10347, 10350, 10353, 10356, 10359, - 10362, 10365, 10368, 10371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10376, - 10380, 10384, 0, 10388, 10391, 10395, 10398, 10402, 10405, 10409, 0, - 10413, 0, 10418, 10421, 10425, 0, 10430, 10433, 10437, 10440, 10444, - 10448, 10452, 10456, 10460, 10464, 10468, 10472, 10476, 10480, 10484, - 10488, 10492, 10496, 10500, 10504, 10508, 10512, 0, 10516, 10520, 10524, - 10528, 10532, 10535, 10538, 0, 10542, 10546, 0, 10550, 10554, 10558, - 10562, 10566, 0, 0, 10570, 10574, 10578, 10583, 10587, 10592, 10596, - 10601, 10606, 10612, 0, 10618, 10622, 10627, 0, 10633, 10637, 10642, 0, - 0, 10646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10649, 0, 0, 0, 0, - 0, 10654, 10658, 10661, 10664, 10667, 10670, 10673, 10676, 10679, 10682, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10685, 10689, 10693, - 0, 10697, 10700, 10704, 10707, 10711, 10714, 10718, 10722, 0, 0, 10726, - 10729, 0, 0, 10733, 10736, 10740, 10743, 10747, 10751, 10755, 10759, - 10763, 10767, 10771, 10775, 10779, 10783, 10787, 10791, 10795, 10799, - 10803, 10807, 10811, 10815, 0, 10819, 10823, 10827, 10831, 10835, 10838, - 10841, 0, 10845, 10849, 0, 0, 10853, 10857, 10861, 10865, 0, 0, 10869, - 10873, 10877, 10882, 10886, 10891, 10895, 10900, 0, 0, 0, 10905, 10909, - 0, 0, 10914, 10918, 10923, 0, 0, 0, 0, 0, 0, 0, 0, 10927, 10933, 0, 0, 0, - 0, 10939, 10943, 0, 10947, 10951, 10956, 0, 0, 0, 0, 10961, 10965, 10968, - 10971, 10974, 10977, 10980, 10983, 10986, 10989, 10992, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10995, 10999, 0, 11003, 11006, 11010, - 11013, 11017, 11020, 0, 0, 0, 11024, 11027, 11031, 0, 11035, 11038, - 11042, 11046, 0, 0, 0, 11049, 11053, 0, 11057, 0, 11061, 11065, 0, 0, 0, - 11069, 11073, 0, 0, 0, 11077, 11081, 11085, 0, 0, 0, 11089, 11092, 11095, - 11099, 11103, 11107, 11111, 11115, 0, 11119, 11123, 11127, 0, 0, 0, 0, - 11131, 11136, 11140, 11145, 11149, 0, 0, 0, 11154, 11158, 11163, 0, - 11168, 11172, 11177, 11182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11186, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11192, 11195, 11198, 11201, 11204, - 11207, 11210, 11213, 11216, 11219, 11223, 11229, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11235, 11239, 11243, 0, 11247, 11250, 11254, 11257, - 11261, 11264, 11268, 11272, 0, 11276, 11279, 11283, 0, 11287, 11290, - 11294, 11298, 11301, 11305, 11309, 11313, 11317, 11321, 11325, 11329, - 11333, 11337, 11341, 11345, 11349, 11353, 11357, 11361, 11365, 11369, - 11373, 0, 11377, 11381, 11385, 11389, 11393, 11396, 11399, 11403, 11407, - 11411, 0, 11415, 11419, 11423, 11427, 11431, 0, 0, 0, 0, 11435, 11440, - 11444, 11449, 11453, 11458, 11463, 0, 11469, 11473, 11478, 0, 11483, - 11487, 11492, 11497, 0, 0, 0, 0, 0, 0, 0, 11501, 11505, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11511, 11516, 0, 0, 0, 0, 11521, 11525, 11528, 11531, 11534, - 11537, 11540, 11543, 11546, 11549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11552, 11556, 0, 11560, 11563, 11567, 11570, 11574, 11577, - 11581, 11585, 0, 11589, 11592, 11596, 0, 11600, 11603, 11607, 11611, - 11614, 11618, 11622, 11626, 11630, 11634, 11638, 11642, 11646, 11650, - 11654, 11658, 11662, 11666, 11670, 11674, 11678, 11682, 11686, 0, 11690, - 11694, 11698, 11702, 11706, 11709, 11712, 11716, 11720, 11724, 0, 11728, - 11732, 11736, 11740, 11744, 0, 0, 0, 0, 11748, 11753, 11757, 11762, - 11766, 11771, 11776, 0, 11782, 11786, 11791, 0, 11796, 11800, 11805, - 11810, 0, 0, 0, 0, 0, 0, 0, 11814, 11818, 0, 0, 0, 0, 0, 0, 0, 11824, 0, - 11828, 11833, 0, 0, 0, 0, 11838, 11842, 11845, 11848, 11851, 11854, - 11857, 11860, 11863, 11866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11869, 11873, 0, 11877, 11880, 11884, 11887, 11891, 11894, - 11898, 11902, 0, 11906, 11909, 11913, 0, 11917, 11920, 11924, 11928, - 11931, 11935, 11939, 11943, 11947, 11951, 11955, 11959, 11963, 11967, - 11971, 11975, 11979, 11983, 11987, 11991, 11995, 11999, 12003, 0, 12007, - 12011, 12015, 12019, 12023, 12026, 12029, 12033, 12037, 12041, 12045, - 12049, 12053, 12057, 12061, 12065, 0, 0, 0, 0, 12069, 12074, 12078, - 12083, 12087, 12092, 0, 0, 12097, 12101, 12106, 0, 12111, 12115, 12120, - 12125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12129, 0, 0, 0, 0, 0, 0, 0, 0, 12135, - 12140, 0, 0, 0, 0, 12145, 12149, 12152, 12155, 12158, 12161, 12164, - 12167, 12170, 12173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 12176, 12180, 0, 12184, 12188, 12192, 12196, 12200, 12204, 12208, - 12212, 12216, 12220, 12224, 12228, 12232, 12236, 12240, 12244, 12248, - 12252, 0, 0, 0, 12256, 12262, 12268, 12274, 12280, 12286, 12292, 12298, - 12304, 12310, 12316, 12322, 12330, 12336, 12342, 12348, 12354, 12360, - 12366, 12372, 12378, 12384, 12390, 12396, 0, 12402, 12408, 12414, 12420, - 12426, 12432, 12436, 12442, 12446, 0, 12450, 0, 0, 12456, 12460, 12466, - 12472, 12478, 12482, 12488, 0, 0, 0, 12492, 0, 0, 0, 0, 12496, 12501, - 12508, 12515, 12522, 12529, 0, 12536, 0, 12543, 12548, 12553, 12560, - 12567, 12576, 12587, 12596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12601, 12608, 12615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12620, - 12626, 12632, 12638, 12644, 12650, 12656, 12662, 12668, 12674, 12680, - 12686, 12692, 12698, 12704, 12709, 12715, 12721, 12727, 12733, 12739, - 12744, 12750, 12756, 12762, 12768, 12774, 12780, 12786, 12792, 12798, - 12804, 12810, 12815, 12821, 12827, 12831, 12837, 12841, 12847, 12853, - 12859, 12865, 12871, 12877, 12882, 12888, 12892, 12897, 12903, 12909, - 12915, 12920, 12926, 12932, 12938, 12943, 12949, 0, 0, 0, 0, 12953, - 12959, 12964, 12970, 12975, 12983, 12991, 12995, 12999, 13003, 13009, - 13015, 13021, 13027, 13031, 13035, 13039, 13043, 13047, 13050, 13053, - 13056, 13059, 13062, 13065, 13068, 13071, 13074, 13078, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 13082, 13086, 0, 13092, 0, 0, 13098, 13102, 0, - 13106, 0, 0, 13112, 0, 0, 0, 0, 0, 0, 13116, 13120, 13123, 13129, 0, - 13135, 13139, 13143, 13147, 13153, 13159, 13165, 0, 13171, 13175, 13179, - 0, 13185, 0, 13191, 0, 0, 13195, 13201, 0, 13207, 13210, 13216, 13219, - 13223, 13230, 13235, 13240, 13244, 13249, 13253, 13258, 13262, 0, 13267, - 13274, 13280, 0, 0, 13286, 13290, 13295, 13299, 13304, 0, 13309, 0, - 13314, 13321, 13328, 13335, 13342, 13346, 0, 0, 13349, 13353, 13356, - 13359, 13362, 13365, 13368, 13371, 13374, 13377, 0, 0, 13380, 13385, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13390, 13394, 13405, 13420, 13435, 13445, - 13456, 13469, 13480, 13486, 13494, 13504, 13510, 13518, 13522, 13528, - 13534, 13542, 13552, 13560, 13573, 13579, 13587, 13595, 13607, 13615, - 13623, 13631, 13639, 13647, 13655, 13663, 13673, 13677, 13680, 13683, - 13686, 13689, 13692, 13695, 13698, 13701, 13704, 13708, 13712, 13716, - 13720, 13724, 13728, 13732, 13736, 13740, 13745, 13751, 13761, 13775, - 13785, 13791, 13797, 13805, 13813, 13821, 13829, 13835, 13841, 13844, - 13848, 13852, 13856, 13860, 13864, 13868, 0, 13872, 13876, 13880, 13884, - 13888, 13892, 13896, 13900, 13904, 13908, 13912, 13916, 13920, 13924, - 13928, 13932, 13935, 13939, 13943, 13947, 13951, 13955, 13959, 13963, - 13967, 13970, 13974, 13978, 13982, 13986, 13990, 13994, 13997, 14001, 0, - 0, 0, 0, 0, 0, 14007, 14012, 14016, 14021, 14025, 14030, 14035, 14041, - 14046, 14052, 14056, 14061, 14065, 14070, 14080, 14086, 14091, 14097, - 14107, 14113, 14117, 14121, 14127, 14133, 14141, 14147, 14155, 0, 0, 0, - 0, 14163, 14167, 14172, 14177, 14182, 14187, 14192, 14197, 0, 14202, - 14207, 14212, 14217, 14222, 14227, 14232, 14237, 14242, 14247, 14252, - 14257, 14262, 14267, 14272, 14277, 14281, 14286, 14291, 14296, 14301, - 14306, 14311, 14316, 14321, 14325, 14330, 14335, 14340, 14345, 14350, - 14355, 14359, 14364, 14371, 14377, 0, 14384, 14391, 14404, 14411, 14418, - 14426, 14434, 14440, 14446, 14452, 14462, 14468, 14474, 14484, 14494, 0, - 0, 14504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14512, 14515, 14519, 14523, 14527, 14531, 14535, 14539, 14543, - 14547, 14551, 14555, 14559, 14563, 14567, 14571, 14575, 14579, 14583, - 14587, 14591, 14595, 14599, 14603, 14607, 14611, 14614, 14617, 14621, - 14625, 14629, 14633, 14637, 14641, 0, 14644, 14647, 14651, 14654, 14658, - 0, 14661, 14664, 0, 14668, 14673, 14677, 14682, 14686, 14691, 14695, 0, - 0, 0, 14700, 14704, 14708, 14712, 0, 0, 0, 0, 0, 0, 14716, 14720, 14723, - 14726, 14729, 14732, 14735, 14738, 14741, 14744, 14747, 14753, 14757, - 14761, 14765, 14769, 14773, 14777, 14781, 14785, 14790, 14794, 14799, - 14804, 14810, 14815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14821, 14826, 14831, 14836, 14841, 14846, 14851, 14856, - 14861, 14866, 14871, 14876, 14881, 14886, 14891, 14896, 14901, 14906, - 14911, 14916, 14921, 14926, 14931, 14936, 14941, 14946, 14951, 14956, - 14961, 14966, 14971, 14976, 14981, 14986, 14991, 14996, 15001, 15006, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 15011, 15015, 15019, 15023, 15027, 15031, - 15035, 15039, 15043, 15047, 15051, 15055, 15059, 15063, 15067, 15071, - 15075, 15079, 15083, 15087, 15091, 15095, 15099, 15103, 15107, 15111, - 15115, 15119, 15123, 15127, 15131, 15135, 15139, 15143, 15147, 15151, - 15155, 15159, 15163, 15167, 15171, 0, 0, 15175, 0, 0, 0, 0, 15180, 15184, - 15188, 15192, 15196, 15200, 15204, 15208, 15212, 15216, 15220, 15224, - 15228, 15232, 15236, 15240, 15244, 15248, 15252, 15256, 15260, 15264, - 15268, 15272, 15276, 15280, 15284, 15288, 15292, 15296, 15300, 15304, - 15308, 15312, 15316, 15320, 15324, 15328, 15332, 15336, 15340, 15344, - 15348, 15352, 15356, 15360, 15364, 15368, 15372, 15376, 15380, 15384, - 15388, 15392, 15396, 15400, 15404, 15408, 15412, 15416, 15420, 15424, - 15428, 15432, 15436, 15440, 15444, 15448, 15452, 15456, 15460, 15464, - 15468, 15472, 15476, 15480, 15484, 15488, 15492, 15496, 15500, 15504, - 15508, 15512, 15516, 15520, 15524, 15528, 15532, 15536, 0, 0, 0, 0, 0, - 15540, 15544, 15548, 15551, 15555, 15558, 15562, 15566, 15569, 15573, - 15577, 15580, 15584, 15588, 15592, 15596, 15599, 15603, 15607, 15611, - 15615, 15619, 15623, 15626, 15630, 15634, 15638, 15642, 15646, 15650, - 15654, 15658, 15662, 15666, 15670, 15674, 15678, 15682, 15686, 15690, - 15694, 15698, 15702, 15706, 15710, 15714, 15718, 15722, 15726, 15730, - 15734, 15738, 15742, 15746, 15750, 15754, 15758, 15762, 15766, 15770, - 15774, 15778, 15782, 15786, 15790, 15794, 15798, 15802, 0, 0, 0, 0, 0, - 15806, 15810, 15814, 15818, 15822, 15826, 15830, 15834, 15838, 15842, - 15846, 15850, 15854, 15858, 15862, 15866, 15870, 15874, 15878, 15882, - 15886, 15890, 15894, 15898, 15902, 15906, 15910, 15914, 15918, 15922, - 15926, 15930, 15934, 15938, 15942, 15946, 15950, 15954, 15958, 15962, - 15966, 15970, 15974, 15978, 15982, 15986, 15990, 15994, 15998, 16002, - 16006, 16010, 16014, 16018, 16022, 16026, 16030, 16034, 16038, 16042, - 16046, 16050, 16054, 16058, 16062, 16066, 16070, 16074, 16078, 16082, + 34, 36, 39, 41, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 69, 72, + 75, 78, 82, 86, 90, 95, 99, 103, 108, 112, 116, 120, 124, 129, 133, 137, + 141, 145, 149, 154, 158, 162, 166, 170, 174, 179, 183, 188, 193, 196, + 200, 203, 206, 209, 213, 217, 221, 226, 230, 234, 239, 243, 247, 251, + 255, 260, 264, 268, 272, 276, 280, 285, 289, 293, 297, 301, 305, 310, + 314, 319, 324, 328, 331, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 340, 345, + 348, 351, 354, 357, 360, 363, 364, 367, 373, 380, 382, 386, 389, 390, + 393, 396, 399, 402, 406, 409, 412, 416, 418, 421, 427, 434, 442, 450, + 457, 462, 468, 474, 481, 487, 493, 501, 506, 514, 520, 526, 533, 539, + 545, 551, 558, 564, 569, 576, 582, 588, 595, 601, 607, 610, 616, 622, + 628, 635, 641, 648, 653, 659, 665, 671, 678, 684, 690, 698, 703, 711, + 717, 723, 730, 736, 742, 748, 755, 761, 766, 773, 779, 785, 792, 798, + 804, 807, 813, 819, 825, 832, 838, 845, 850, 857, 863, 869, 876, 883, + 890, 897, 904, 911, 919, 927, 935, 943, 951, 959, 967, 975, 982, 989, + 995, 1001, 1008, 1015, 1022, 1029, 1036, 1043, 1050, 1057, 1065, 1073, + 1081, 1089, 1097, 1105, 1113, 1121, 1129, 1137, 1144, 1151, 1157, 1163, + 1169, 1175, 1182, 1189, 1196, 1203, 1210, 1216, 1221, 1226, 1234, 1242, + 1250, 1258, 1263, 1270, 1277, 1285, 1293, 1301, 1309, 1319, 1329, 1336, + 1343, 1350, 1357, 1365, 1373, 1381, 1389, 1400, 1405, 1410, 1416, 1422, + 1429, 1436, 1443, 1450, 1455, 1460, 1467, 1474, 1482, 1490, 1498, 1506, + 1513, 1520, 1528, 1536, 1544, 1552, 1560, 1568, 1576, 1584, 1592, 1600, + 1607, 1614, 1620, 1626, 1632, 1638, 1645, 1652, 1660, 1668, 1675, 1682, + 1689, 1696, 1704, 1712, 1720, 1728, 1735, 1742, 1749, 1757, 1765, 1773, + 1781, 1786, 1792, 1798, 1805, 1812, 1817, 1822, 1828, 1835, 1842, 1848, + 1855, 1863, 1871, 1877, 1882, 1887, 1893, 1900, 1907, 1914, 1919, 1924, + 1929, 1935, 1942, 1949, 1956, 1963, 1968, 1976, 1986, 1994, 2001, 2008, + 2013, 2018, 2025, 2032, 2036, 2041, 2046, 2051, 2058, 2067, 2074, 2081, + 2090, 2097, 2104, 2109, 2116, 2123, 2130, 2137, 2144, 2149, 2156, 2163, + 2171, 2176, 2181, 2186, 2196, 2200, 2206, 2212, 2218, 2224, 2232, 2245, + 2253, 2258, 2267, 2272, 2277, 2286, 2291, 2298, 2305, 2312, 2319, 2326, + 2333, 2340, 2347, 2356, 2365, 2374, 2383, 2393, 2403, 2412, 2421, 2426, + 2435, 2444, 2453, 2462, 2469, 2476, 2483, 2490, 2498, 2506, 2514, 2522, + 2529, 2536, 2545, 2554, 2562, 2570, 2578, 2583, 2593, 2598, 2605, 2612, + 2617, 2622, 2629, 2636, 2646, 2656, 2663, 2670, 2679, 2688, 2695, 2702, + 2711, 2720, 2727, 2734, 2743, 2752, 2759, 2766, 2775, 2784, 2791, 2798, + 2807, 2816, 2824, 2832, 2842, 2852, 2859, 2866, 2875, 2884, 2893, 2902, + 2911, 2920, 2925, 2930, 2938, 2946, 2956, 2964, 2969, 2974, 2981, 2988, + 2995, 3002, 3009, 3016, 3025, 3034, 3043, 3052, 3059, 3066, 3075, 3084, + 3091, 3098, 3106, 3114, 3122, 3128, 3135, 3142, 3148, 3155, 3162, 3169, + 3178, 3188, 3198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3204, 3209, + 3214, 3220, 3226, 3232, 3240, 3248, 3255, 3260, 3265, 3272, 3278, 3285, + 3294, 3303, 3312, 3319, 3324, 3329, 3334, 3341, 3346, 3353, 3360, 3366, + 3371, 3376, 3385, 3393, 3402, 3407, 3412, 3422, 3429, 3437, 3446, 3451, + 3457, 3463, 3470, 3475, 3480, 3490, 3498, 3507, 3515, 3523, 3532, 3537, + 3544, 3551, 3556, 3568, 3576, 3584, 3589, 3598, 3603, 3608, 3615, 3620, + 3626, 3632, 3638, 3647, 3655, 3660, 3668, 3673, 3681, 3688, 3694, 3700, + 3705, 3713, 3721, 3726, 3734, 3740, 3745, 3752, 3760, 3769, 3776, 3783, + 3793, 3800, 3807, 3817, 3824, 3831, 3838, 3844, 3850, 3859, 3871, 3875, + 3882, 3886, 3890, 3895, 3903, 3910, 3915, 3920, 3924, 3929, 3934, 3938, + 3943, 3949, 3955, 3960, 3966, 3971, 3976, 3981, 3986, 3991, 3993, 3998, + 4001, 4007, 4013, 4019, 4023, 4030, 4037, 4043, 4050, 4058, 4066, 4071, + 4076, 4081, 4086, 4088, 4090, 4093, 4095, 4097, 4102, 4107, 4113, 4118, + 4122, 4126, 4130, 4137, 4143, 4148, 4154, 4159, 4165, 4173, 4181, 4185, + 4189, 4194, 4200, 4206, 4212, 4218, 4223, 4231, 4240, 4249, 4253, 4259, + 4266, 4273, 4280, 4287, 4291, 4297, 4302, 4307, 4312, 4316, 4318, 4320, + 4323, 4326, 4329, 4331, 4335, 4339, 4345, 4348, 4353, 4359, 4365, 4368, + 4373, 4378, 4382, 4387, 4392, 4398, 4404, 4409, 4414, 4418, 4421, 4427, + 4432, 4437, 4442, 4447, 4453, 4459, 4462, 4466, 4470, 4474, 4477, 4480, + 4485, 4489, 4496, 4500, 4505, 4509, 4515, 4519, 4523, 4527, 4532, 4537, + 4544, 4550, 4557, 4563, 4569, 4575, 4578, 4582, 4586, 4589, 4593, 4598, + 4603, 4607, 4611, 4617, 4621, 4625, 4630, 4636, 4640, 4645, 4649, 4655, + 4660, 4665, 4670, 4675, 4681, 4684, 4688, 4693, 4698, 4707, 4713, 4717, + 4721, 4726, 4730, 4735, 4739, 4742, 4747, 4750, 4756, 4761, 4766, 4771, + 4776, 4781, 4786, 4792, 4797, 4802, 4807, 4812, 4817, 4822, 0, 0, 0, 0, + 4827, 4830, 0, 0, 0, 0, 4834, 0, 0, 0, 4837, 0, 0, 0, 0, 0, 4841, 4844, + 4849, 4856, 4861, 4869, 4877, 0, 4885, 0, 4893, 4901, 4908, 4919, 4924, + 4929, 4934, 4939, 4944, 4949, 4954, 4959, 4964, 4969, 4974, 4979, 4984, + 4989, 4994, 4999, 0, 5004, 5009, 5014, 5019, 5024, 5029, 5034, 5039, + 5047, 5055, 5062, 5070, 5078, 5086, 5097, 5102, 5107, 5112, 5117, 5122, + 5127, 5132, 5137, 5142, 5147, 5152, 5157, 5162, 5167, 5172, 5177, 5182, + 5188, 5193, 5198, 5203, 5208, 5213, 5218, 5223, 5231, 5239, 5247, 5255, + 0, 5262, 5266, 5270, 5277, 5287, 5297, 5301, 5305, 5309, 5315, 5322, + 5326, 5331, 5335, 5340, 5344, 5349, 5353, 5358, 5363, 5368, 5373, 5378, + 5383, 5388, 5393, 5398, 5403, 5408, 5413, 5418, 5423, 5428, 5432, 5436, + 5442, 5446, 5451, 5457, 5464, 5469, 5474, 5481, 5486, 5491, 5498, 5506, + 5515, 5525, 5532, 5537, 5542, 5547, 5554, 5559, 5565, 5570, 5575, 5580, + 5585, 5590, 5595, 5601, 5607, 5612, 5616, 5621, 5626, 5631, 5636, 5641, + 5646, 5651, 5655, 5661, 5665, 5670, 5675, 5680, 5684, 5689, 5694, 5699, + 5704, 5708, 5713, 5717, 5722, 5727, 5732, 5737, 5743, 5748, 5754, 5758, + 5763, 5767, 5771, 5776, 5781, 5786, 5791, 5796, 5801, 5806, 5810, 5816, + 5820, 5825, 5830, 5835, 5839, 5844, 5849, 5854, 5859, 5863, 5868, 5872, + 5877, 5882, 5887, 5892, 5898, 5903, 5909, 5913, 5918, 5922, 5929, 5934, + 5939, 5944, 5951, 5956, 5962, 5967, 5972, 5977, 5982, 5987, 5992, 5998, + 6004, 6009, 6014, 6019, 6024, 6029, 6035, 6041, 6048, 6055, 6064, 6073, + 6080, 6087, 6096, 6105, 6110, 6115, 6120, 6125, 6130, 6135, 6140, 6145, + 6156, 6167, 6172, 6177, 6184, 6191, 6198, 6205, 6210, 6215, 6220, 6225, + 6229, 6233, 6237, 6242, 0, 6247, 6254, 6259, 6268, 6277, 6283, 6289, + 6297, 6305, 6313, 6321, 6328, 6335, 6344, 6353, 6361, 6369, 6377, 6385, + 6393, 6401, 6409, 6417, 6424, 6431, 6437, 6443, 6451, 6459, 6466, 6473, + 6482, 6491, 6497, 6503, 6511, 6519, 6527, 6535, 6541, 6547, 6555, 6563, + 6571, 6579, 6586, 6593, 6601, 6609, 6617, 6625, 6630, 6635, 6642, 6649, + 6659, 6669, 6673, 6681, 6689, 6696, 6703, 6711, 6719, 6726, 6733, 6741, + 6749, 6756, 6763, 6771, 0, 6779, 6786, 6793, 6799, 6805, 6811, 6817, + 6825, 6833, 6838, 6843, 6850, 6857, 6864, 6871, 6878, 6885, 6892, 6899, + 6905, 6911, 6917, 6923, 6929, 6935, 6941, 6947, 6955, 6963, 6969, 6975, + 6981, 6987, 6993, 6999, 7006, 7013, 7020, 7027, 7035, 7043, 7050, 0, 0, + 0, 0, 0, 0, 7057, 7064, 7071, 7078, 7085, 7092, 7099, 7106, 7113, 7120, + 7127, 7134, 7141, 7148, 7155, 7162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7169, + 7174, 7179, 7184, 7189, 7194, 7199, 7204, 7209, 7213, 7218, 7223, 7228, + 7233, 7238, 7243, 7248, 7253, 7258, 7263, 7268, 7273, 7278, 7283, 7288, + 7293, 7298, 7303, 7308, 7313, 7318, 7323, 7328, 7333, 7338, 7343, 7348, + 7353, 0, 0, 7358, 7365, 7368, 7372, 7376, 7379, 7383, 0, 7387, 7392, + 7397, 7402, 7407, 7412, 7417, 7422, 7427, 7431, 7436, 7441, 7446, 7451, + 7456, 7461, 7466, 7471, 7476, 7481, 7486, 7491, 7496, 7501, 7506, 7511, + 7516, 7521, 7526, 7531, 7536, 7541, 7546, 7551, 7556, 7561, 7566, 7571, + 7576, 0, 7583, 7587, 0, 0, 0, 0, 0, 0, 7590, 7595, 7600, 7605, 7612, + 7619, 7624, 7629, 7634, 7639, 7644, 7649, 7654, 7661, 7666, 7673, 7680, + 7685, 7692, 7697, 7702, 7707, 7714, 7719, 7724, 7731, 7740, 7745, 7750, + 7755, 7760, 7766, 7771, 7778, 7785, 7792, 7797, 7802, 7807, 7812, 7817, + 0, 7822, 7827, 7835, 7840, 7845, 7850, 7855, 7862, 7869, 7876, 7881, + 7886, 7893, 0, 0, 0, 0, 0, 0, 0, 0, 7900, 7904, 7908, 7912, 7916, 7920, + 7924, 7928, 7932, 7936, 7940, 7945, 7949, 7953, 7958, 7962, 7967, 7971, + 7975, 7979, 7984, 7988, 7993, 7997, 8001, 8005, 8009, 0, 0, 0, 0, 0, + 8013, 8020, 8028, 8035, 8040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8045, + 8048, 8052, 8057, 0, 0, 0, 0, 0, 0, 0, 8061, 8064, 8067, 8072, 8078, + 8082, 8090, 8096, 8102, 8110, 8114, 0, 0, 0, 0, 0, 8119, 0, 0, 8122, + 8129, 0, 8133, 8137, 8144, 8150, 8157, 8163, 8169, 8173, 8177, 8183, + 8187, 8191, 8195, 8199, 8203, 8207, 8211, 8215, 8219, 8223, 8227, 8231, + 8235, 8239, 8243, 8247, 0, 0, 0, 0, 0, 8251, 8254, 8258, 8262, 8266, + 8270, 8274, 8278, 8282, 8286, 8291, 8295, 8298, 8301, 8304, 8307, 8310, + 8313, 8316, 8319, 8323, 8326, 8329, 8334, 8339, 8344, 8347, 8354, 8363, + 8368, 8372, 0, 8379, 8384, 8388, 8392, 8396, 8400, 8404, 8408, 8412, + 8416, 8420, 8424, 8429, 8434, 8441, 8447, 8453, 8459, 8464, 8472, 8480, + 8485, 8491, 8497, 8503, 8509, 8513, 8517, 8521, 8528, 8538, 8542, 8546, + 8550, 8556, 8564, 8568, 8572, 8579, 8583, 8587, 8591, 8598, 8605, 8617, + 8621, 8625, 8629, 8639, 8648, 8652, 8659, 8666, 8673, 8682, 8693, 8701, + 8705, 8714, 8725, 8733, 8746, 8754, 8762, 8770, 8778, 8784, 8793, 8800, + 8804, 8812, 8816, 8823, 8831, 8835, 8841, 8848, 8855, 8859, 8867, 8871, + 8878, 8882, 8890, 8894, 8902, 8908, 8914, 8921, 8928, 8934, 8939, 8943, + 8949, 8956, 8962, 8969, 8976, 8982, 8991, 8999, 9006, 9012, 9016, 9019, + 9023, 9029, 9037, 9041, 9047, 9053, 9059, 9066, 9069, 9076, 9081, 9089, + 9093, 9097, 9109, 9121, 9127, 9133, 9138, 9144, 9149, 9155, 9165, 9172, + 9181, 9191, 9197, 9202, 9207, 9211, 9215, 9220, 9225, 9231, 9238, 9245, + 9256, 9261, 9269, 9277, 9284, 9290, 9296, 9302, 9308, 9314, 9320, 9326, + 9332, 9338, 9345, 9352, 9359, 9365, 9373, 9381, 9387, 9393, 9399, 9404, + 9409, 9413, 9420, 9426, 9435, 9443, 9446, 9451, 9456, 0, 9461, 9465, + 9469, 9475, 9479, 9483, 9489, 9493, 9501, 9505, 9509, 9513, 9517, 9521, + 9527, 9531, 9537, 9541, 9545, 9549, 9553, 9557, 9562, 9565, 9569, 9574, + 9578, 9582, 9586, 9590, 9594, 9599, 9604, 9609, 9613, 9617, 9622, 9626, + 9630, 9635, 9639, 9643, 9650, 9657, 9661, 9665, 9670, 9674, 9678, 9681, + 9686, 9689, 9692, 9697, 9702, 9706, 9710, 9716, 9722, 9725, 0, 0, 9728, + 9734, 9740, 9746, 9756, 9768, 9780, 9797, 9809, 9820, 9827, 9834, 9845, + 9860, 9871, 9877, 9886, 9894, 9906, 9916, 9924, 9936, 9943, 9951, 9963, + 9969, 9975, 9982, 9989, 9995, 10000, 10010, 10017, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10027, 10031, 10035, 10039, 10043, + 10047, 10051, 10055, 10059, 10063, 10067, 10071, 10075, 10079, 10083, + 10087, 10091, 10095, 10099, 10103, 10107, 10111, 10115, 10119, 10123, + 10127, 10131, 10135, 10139, 10143, 10147, 10151, 10155, 10158, 10162, + 10166, 10170, 10174, 10178, 10181, 10184, 10187, 10190, 10193, 10196, + 10199, 10202, 10205, 10208, 10211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10215, 10219, 10223, 10227, 10232, 10235, 10239, 10242, 10246, + 10249, 10253, 10257, 10261, 10266, 10271, 10274, 10278, 10283, 10288, + 10291, 10295, 10298, 10302, 10306, 10310, 10314, 10318, 10322, 10326, + 10330, 10334, 10338, 10342, 10346, 10350, 10354, 10358, 10362, 10366, + 10370, 10374, 10378, 10382, 10386, 10390, 10394, 10397, 10400, 10404, + 10408, 10412, 10416, 10420, 10424, 10428, 10432, 10436, 0, 0, 10439, + 10443, 10447, 10452, 10456, 10461, 10465, 10470, 10475, 10481, 10487, + 10493, 10497, 10502, 10508, 10514, 10518, 10523, 0, 0, 10527, 10530, + 10536, 10542, 10547, 0, 0, 0, 10552, 10556, 10560, 10564, 10568, 10572, + 10576, 10580, 10584, 10589, 10594, 10599, 10605, 10608, 10612, 10616, + 10619, 10622, 10625, 10628, 10631, 10634, 10637, 10640, 10643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10647, 0, 0, 0, 10652, 10656, 10660, 0, 10664, + 10667, 10671, 10674, 10678, 10681, 10685, 10689, 0, 0, 10693, 10696, 0, + 0, 10700, 10703, 10707, 10710, 10714, 10718, 10722, 10726, 10730, 10734, + 10738, 10742, 10746, 10750, 10754, 10758, 10762, 10766, 10770, 10774, + 10778, 10782, 0, 10786, 10790, 10794, 10798, 10802, 10805, 10808, 0, + 10812, 0, 0, 0, 10816, 10820, 10824, 10828, 0, 0, 10831, 10835, 10839, + 10844, 10848, 10853, 10857, 10862, 10867, 0, 0, 10873, 10877, 0, 0, + 10882, 10886, 10891, 10895, 0, 0, 0, 0, 0, 0, 0, 0, 10901, 0, 0, 0, 0, + 10907, 10911, 0, 10915, 10919, 10924, 10929, 10934, 0, 0, 10940, 10944, + 10947, 10950, 10953, 10956, 10959, 10962, 10965, 10968, 10971, 10980, + 10988, 10992, 10996, 11002, 11008, 11014, 11020, 11035, 11042, 0, 0, 0, + 0, 0, 0, 11045, 11051, 11055, 0, 11059, 11062, 11066, 11069, 11073, + 11076, 0, 0, 0, 0, 11080, 11084, 0, 0, 11088, 11092, 11096, 11099, 11103, + 11107, 11111, 11115, 11119, 11123, 11127, 11131, 11135, 11139, 11143, + 11147, 11151, 11155, 11159, 11163, 11167, 11171, 0, 11175, 11179, 11183, + 11187, 11191, 11194, 11197, 0, 11201, 11205, 0, 11209, 11213, 0, 11217, + 11221, 0, 0, 11224, 0, 11228, 11233, 11237, 11242, 11246, 0, 0, 0, 0, + 11251, 11256, 0, 0, 11261, 11266, 11271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11275, 11279, 11283, 11287, 0, 11291, 0, 0, 0, 0, 0, 0, 0, 11295, 11299, + 11302, 11305, 11308, 11311, 11314, 11317, 11320, 11323, 11326, 11329, + 11332, 11335, 11338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11343, 11347, + 11351, 0, 11355, 11358, 11362, 11365, 11369, 11372, 11376, 11380, 11384, + 0, 11389, 11392, 11396, 0, 11401, 11404, 11408, 11411, 11415, 11419, + 11423, 11427, 11431, 11435, 11439, 11443, 11447, 11451, 11455, 11459, + 11463, 11467, 11471, 11475, 11479, 11483, 0, 11487, 11491, 11495, 11499, + 11503, 11506, 11509, 0, 11513, 11517, 0, 11521, 11525, 11529, 11533, + 11537, 0, 0, 11540, 11544, 11548, 11553, 11557, 11562, 11566, 11571, + 11576, 11582, 0, 11588, 11592, 11597, 0, 11603, 11607, 11612, 0, 0, + 11616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11619, 11624, 11629, + 11634, 0, 0, 11640, 11644, 11647, 11650, 11653, 11656, 11659, 11662, + 11665, 11668, 0, 11671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11675, 11679, 11683, 0, 11687, 11690, 11694, 11697, 11701, 11704, 11708, + 11712, 0, 0, 11716, 11719, 0, 0, 11723, 11726, 11730, 11733, 11737, + 11741, 11745, 11749, 11753, 11757, 11761, 11765, 11769, 11773, 11777, + 11781, 11785, 11789, 11793, 11797, 11801, 11805, 0, 11809, 11813, 11817, + 11821, 11825, 11828, 11831, 0, 11835, 11839, 0, 11843, 11847, 11851, + 11855, 11859, 0, 0, 11862, 11866, 11870, 11875, 11879, 11884, 11888, + 11893, 0, 0, 0, 11898, 11902, 0, 0, 11907, 11911, 11916, 0, 0, 0, 0, 0, + 0, 0, 0, 11920, 11926, 0, 0, 0, 0, 11932, 11936, 0, 11940, 11944, 11949, + 0, 0, 0, 0, 11954, 11958, 11961, 11964, 11967, 11970, 11973, 11976, + 11979, 11982, 11985, 11988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11992, 11996, 0, 12000, 12003, 12007, 12010, 12014, 12017, 0, 0, 0, + 12021, 12024, 12028, 0, 12032, 12035, 12039, 12043, 0, 0, 0, 12046, + 12050, 0, 12054, 0, 12058, 12062, 0, 0, 0, 12066, 12070, 0, 0, 0, 12074, + 12078, 12082, 0, 0, 0, 12086, 12089, 12092, 12096, 12100, 12104, 12108, + 12112, 12116, 12120, 12124, 12128, 0, 0, 0, 0, 12131, 12136, 12140, + 12145, 12149, 0, 0, 0, 12154, 12158, 12163, 0, 12168, 12172, 12177, + 12182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12192, 12196, 12199, 12202, 12205, 12208, 12211, 12214, 12217, + 12220, 12223, 12227, 12233, 12239, 12243, 12247, 12251, 12255, 12259, + 12264, 12268, 0, 0, 0, 0, 0, 0, 12271, 12275, 12279, 0, 12283, 12286, + 12290, 12293, 12297, 12300, 12304, 12308, 0, 12312, 12315, 12319, 0, + 12323, 12326, 12330, 12334, 12337, 12341, 12345, 12349, 12353, 12357, + 12361, 12365, 12369, 12373, 12377, 12381, 12385, 12389, 12393, 12397, + 12401, 12405, 12409, 0, 12413, 12417, 12421, 12425, 12429, 12432, 12435, + 12439, 12443, 12447, 0, 12451, 12455, 12459, 12463, 12467, 0, 0, 0, 0, + 12470, 12475, 12479, 12484, 12488, 12493, 12498, 0, 12504, 12508, 12513, + 0, 12518, 12522, 12527, 12532, 0, 0, 0, 0, 0, 0, 0, 12536, 12540, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12546, 12551, 0, 0, 0, 0, 12556, 12560, 12563, + 12566, 12569, 12572, 12575, 12578, 12581, 12584, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12587, 12591, 0, 12595, 12598, 12602, + 12605, 12609, 12612, 12616, 12620, 0, 12624, 12627, 12631, 0, 12635, + 12638, 12642, 12646, 12649, 12653, 12657, 12661, 12665, 12669, 12673, + 12677, 12681, 12685, 12689, 12693, 12697, 12701, 12705, 12709, 12713, + 12717, 12721, 0, 12725, 12729, 12733, 12737, 12741, 12744, 12747, 12751, + 12755, 12759, 0, 12763, 12767, 12771, 12775, 12779, 0, 0, 12782, 12786, + 12790, 12795, 12799, 12804, 12808, 12813, 12818, 0, 12824, 12828, 12833, + 0, 12838, 12842, 12847, 12852, 0, 0, 0, 0, 0, 0, 0, 12856, 12860, 0, 0, + 0, 0, 0, 0, 0, 12866, 0, 12870, 12875, 0, 0, 0, 0, 12880, 12884, 12887, + 12890, 12893, 12896, 12899, 12902, 12905, 12908, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12911, 12915, 0, 12919, 12922, 12926, + 12929, 12933, 12936, 12940, 12944, 0, 12948, 12951, 12955, 0, 12959, + 12962, 12966, 12970, 12973, 12977, 12981, 12985, 12989, 12993, 12997, + 13001, 13005, 13009, 13013, 13017, 13021, 13025, 13029, 13033, 13037, + 13041, 13045, 0, 13049, 13053, 13057, 13061, 13065, 13068, 13071, 13075, + 13079, 13083, 13087, 13091, 13095, 13099, 13103, 13107, 0, 0, 0, 0, + 13110, 13115, 13119, 13124, 13128, 13133, 0, 0, 13138, 13142, 13147, 0, + 13152, 13156, 13161, 13166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13170, 0, 0, 0, 0, + 0, 0, 0, 0, 13176, 13181, 0, 0, 0, 0, 13186, 13190, 13193, 13196, 13199, + 13202, 13205, 13208, 13211, 13214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13217, 13221, 0, 13225, 13229, 13233, 13237, 13241, 13245, + 13249, 13253, 13257, 13261, 13265, 13269, 13273, 13277, 13281, 13285, + 13289, 13293, 0, 0, 0, 13297, 13303, 13309, 13315, 13321, 13327, 13333, + 13339, 13345, 13351, 13357, 13363, 13371, 13377, 13383, 13389, 13395, + 13401, 13407, 13413, 13419, 13425, 13431, 13437, 0, 13443, 13449, 13455, + 13461, 13467, 13473, 13477, 13483, 13487, 0, 13491, 0, 0, 13497, 13501, + 13507, 13513, 13519, 13523, 13529, 0, 0, 0, 13533, 0, 0, 0, 0, 13537, + 13542, 13549, 13556, 13563, 13570, 0, 13577, 0, 13584, 13589, 13594, + 13601, 13608, 13617, 13628, 13637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13642, 13649, 13656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13661, 13667, 13673, 13679, 13685, 13691, 13697, 13703, 13709, 13715, + 13721, 13727, 13733, 13739, 13745, 13750, 13756, 13762, 13768, 13774, + 13780, 13785, 13791, 13797, 13803, 13809, 13815, 13821, 13827, 13833, + 13839, 13845, 13851, 13856, 13862, 13868, 13872, 13878, 13882, 13888, + 13894, 13900, 13906, 13912, 13918, 13923, 13929, 13933, 13938, 13944, + 13950, 13956, 13961, 13967, 13973, 13979, 13984, 13990, 0, 0, 0, 0, + 13994, 14000, 14005, 14011, 14016, 14024, 14032, 14036, 14040, 14044, + 14050, 14056, 14062, 14068, 14072, 14076, 14080, 14084, 14088, 14091, + 14094, 14097, 14100, 14103, 14106, 14109, 14112, 14115, 14119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14123, 14127, 0, 14133, 0, 0, 14139, 14143, + 0, 14147, 0, 0, 14153, 0, 0, 0, 0, 0, 0, 14157, 14161, 14164, 14170, 0, + 14176, 14180, 14184, 14188, 14194, 14200, 14206, 0, 14212, 14216, 14220, + 0, 14226, 0, 14232, 0, 0, 14236, 14242, 0, 14248, 14251, 14257, 14260, + 14264, 14271, 14276, 14281, 14285, 14290, 14295, 14300, 14304, 0, 14309, + 14316, 14322, 0, 0, 14328, 14332, 14337, 14341, 14346, 0, 14351, 0, + 14356, 14362, 14368, 14374, 14380, 14384, 0, 0, 14387, 14391, 14394, + 14397, 14400, 14403, 14406, 14409, 14412, 14415, 0, 0, 14418, 14423, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14428, 14432, 14443, 14458, 14473, 14483, + 14494, 14507, 14518, 14524, 14532, 14542, 14548, 14556, 14560, 14566, + 14572, 14580, 14590, 14598, 14611, 14617, 14625, 14633, 14645, 14653, + 14661, 14669, 14677, 14685, 14693, 14701, 14711, 14715, 14718, 14721, + 14724, 14727, 14730, 14733, 14736, 14739, 14742, 14746, 14750, 14754, + 14758, 14762, 14766, 14770, 14774, 14778, 14783, 14789, 14799, 14813, + 14823, 14829, 14835, 14843, 14851, 14859, 14867, 14873, 14879, 14882, + 14886, 14890, 14894, 14898, 14902, 14906, 0, 14910, 14914, 14918, 14922, + 14926, 14930, 14934, 14938, 14942, 14946, 14950, 14954, 14958, 14962, + 14966, 14970, 14973, 14977, 14981, 14985, 14989, 14993, 14997, 15001, + 15005, 15008, 15012, 15016, 15020, 15024, 15028, 15031, 15034, 15038, 0, + 0, 0, 0, 0, 0, 15044, 15049, 15053, 15058, 15062, 15067, 15072, 15078, + 15083, 15089, 15093, 15098, 15102, 15107, 15117, 15123, 15128, 15134, + 15144, 15150, 15154, 15158, 15164, 15170, 15178, 15184, 15192, 0, 0, 0, + 0, 15200, 15204, 15209, 15214, 15219, 15224, 15229, 15234, 0, 15239, + 15244, 15249, 15254, 15259, 15264, 15269, 15274, 15279, 15284, 15289, + 15294, 15299, 15304, 15309, 15314, 15318, 15323, 15328, 15333, 15338, + 15343, 15348, 15353, 15358, 15362, 15367, 15372, 15377, 15382, 15387, + 15391, 15395, 15400, 15407, 15413, 0, 15420, 15427, 15440, 15447, 15454, + 15462, 15470, 15476, 15482, 15488, 15498, 15504, 15510, 15520, 15530, 0, + 0, 15540, 15548, 15560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15572, 15575, 15579, 15583, 15587, 15591, 15595, 15599, + 15603, 15607, 15611, 15615, 15619, 15623, 15627, 15631, 15635, 15639, + 15643, 15647, 15651, 15655, 15659, 15663, 15667, 15671, 15674, 15677, + 15681, 15685, 15689, 15693, 15696, 15700, 0, 15703, 15706, 15710, 15713, + 15717, 0, 15720, 15723, 0, 15727, 15732, 15736, 15741, 15745, 15750, + 15754, 0, 0, 0, 15759, 15763, 15767, 15771, 0, 0, 0, 0, 0, 0, 15775, + 15779, 15782, 15785, 15788, 15791, 15794, 15797, 15800, 15803, 15806, + 15812, 15816, 15820, 15824, 15828, 15832, 15836, 15840, 15844, 15849, + 15853, 15858, 15863, 15869, 15874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15880, 15885, 15890, 15895, 15900, 15905, + 15910, 15915, 15920, 15925, 15930, 15935, 15940, 15945, 15950, 15955, + 15960, 15965, 15970, 15975, 15980, 15985, 15990, 15995, 16000, 16005, + 16010, 16015, 16020, 16025, 16030, 16035, 16040, 16045, 16050, 16055, + 16060, 16065, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16070, 16074, 16078, 16082, 16086, 16090, 16094, 16098, 16102, 16106, 16110, 16114, 16118, 16122, - 16126, 16130, 0, 0, 0, 0, 0, 0, 16134, 16138, 16142, 16146, 16150, 16154, - 16158, 0, 16162, 16166, 16170, 16174, 16178, 16182, 16186, 16190, 16194, - 16198, 16202, 16206, 16210, 16214, 16218, 16222, 16226, 16229, 16233, - 16237, 16241, 16245, 16249, 16253, 16257, 16261, 16265, 16269, 16273, - 16277, 16281, 16285, 16289, 16293, 16297, 16301, 16305, 16309, 16313, - 16317, 16321, 16325, 16329, 16333, 16337, 16341, 16345, 16349, 16353, - 16357, 16361, 16365, 16369, 16373, 16377, 16381, 16385, 16389, 16393, - 16397, 16401, 16405, 16409, 0, 16413, 0, 16417, 16421, 16425, 16429, 0, - 0, 16433, 16437, 16441, 16445, 16449, 16453, 16457, 0, 16461, 0, 16465, - 16469, 16473, 16477, 0, 0, 16481, 16485, 16489, 16493, 16497, 16501, - 16505, 16509, 16513, 16517, 16521, 16525, 16529, 16533, 16537, 16541, - 16545, 16549, 16553, 16557, 16561, 16565, 16569, 16572, 16576, 16580, - 16584, 16588, 16592, 16596, 16600, 16604, 16608, 16612, 16616, 16620, - 16624, 16628, 16632, 0, 16636, 0, 16640, 16644, 16648, 16652, 0, 0, - 16656, 16660, 16664, 16668, 16672, 16676, 16680, 16684, 16688, 16692, - 16696, 16700, 16704, 16708, 16712, 16716, 16720, 16725, 16730, 16735, - 16741, 16747, 16752, 16757, 16763, 16766, 16770, 16774, 16778, 16782, - 16786, 0, 16790, 0, 16794, 16798, 16802, 16806, 0, 0, 16810, 16814, - 16818, 16822, 16826, 16830, 16834, 0, 16838, 0, 16842, 16846, 16850, - 16854, 0, 0, 16858, 16862, 16866, 16870, 16874, 16878, 16882, 0, 16886, - 16891, 16896, 16901, 16907, 16913, 16918, 0, 16923, 16927, 16931, 16935, - 16939, 16943, 16947, 16951, 16955, 16959, 16963, 16967, 16971, 16975, - 16979, 16983, 16987, 16990, 16994, 16998, 17002, 17006, 17010, 0, 17014, - 17018, 17022, 17026, 17030, 17034, 17038, 17042, 17046, 17050, 17054, - 17058, 17062, 17066, 17070, 17074, 17078, 17082, 17086, 17090, 17094, - 17098, 17102, 17106, 17110, 17114, 17118, 17122, 17126, 17130, 17134, 0, - 17138, 0, 17142, 17146, 17150, 17154, 0, 0, 17158, 17162, 17166, 17170, - 17174, 17178, 17182, 0, 17186, 17190, 17194, 17198, 17202, 17206, 17210, + 16126, 16130, 16134, 16138, 16142, 16146, 16150, 16154, 16158, 16162, + 16166, 16170, 16174, 16178, 16182, 16186, 16190, 16194, 16198, 16202, + 16206, 16210, 16214, 16218, 16222, 16226, 16230, 16234, 16239, 16243, + 16248, 0, 0, 0, 16253, 16257, 16261, 16265, 16269, 16273, 16277, 16281, + 16285, 16289, 16293, 16297, 16301, 16305, 16309, 16313, 16317, 16321, + 16325, 16329, 16333, 16337, 16341, 16345, 16349, 16353, 16357, 16361, + 16365, 16369, 16373, 16377, 16381, 16385, 16389, 16393, 16397, 16401, + 16405, 16409, 16413, 16417, 16421, 16425, 16429, 16433, 16437, 16441, + 16445, 16449, 16453, 16457, 16461, 16465, 16469, 16473, 16477, 16481, + 16485, 16489, 16493, 16497, 16501, 16505, 16509, 16513, 16517, 16521, + 16525, 16529, 16533, 16537, 16541, 16545, 16549, 16553, 16557, 16561, + 16565, 16569, 16573, 16577, 16581, 16585, 16589, 16593, 16597, 16601, + 16605, 16609, 0, 0, 0, 0, 0, 16613, 16617, 16621, 16624, 16628, 16631, + 16635, 16639, 16642, 16646, 16650, 16653, 16657, 16661, 16665, 16669, + 16672, 16676, 16680, 16684, 16688, 16692, 16696, 16699, 16703, 16707, + 16711, 16715, 16719, 16723, 16727, 16731, 16735, 16739, 16743, 16747, + 16751, 16755, 16759, 16763, 16767, 16771, 16775, 16779, 16783, 16787, + 16791, 16795, 16799, 16803, 16807, 16811, 16815, 16819, 16823, 16827, + 16831, 16835, 16839, 16843, 16847, 16851, 16855, 16859, 16863, 16867, + 16871, 16875, 0, 0, 0, 0, 0, 16879, 16883, 16887, 16891, 16895, 16899, + 16903, 16907, 16911, 16915, 16919, 16923, 16927, 16931, 16935, 16939, + 16943, 16947, 16951, 16955, 16959, 16963, 16967, 16971, 16975, 16979, + 16983, 16987, 16991, 16995, 16999, 17003, 17007, 17011, 17015, 17019, + 17023, 17027, 17031, 17035, 17039, 17043, 17047, 17051, 17055, 17059, + 17063, 17067, 17071, 17075, 17079, 17083, 17087, 17091, 17095, 17099, + 17103, 17107, 17111, 17115, 17119, 17123, 17127, 17131, 17135, 17139, + 17143, 17147, 17151, 17155, 17159, 17163, 17167, 17171, 17175, 17179, + 17183, 17187, 17191, 17195, 17199, 17203, 0, 0, 0, 0, 0, 0, 17207, 17210, 17214, 17218, 17222, 17226, 17230, 17234, 17238, 17242, 17246, 17250, 17254, 17258, 17262, 17266, 17270, 17274, 17278, 17282, 17286, 17290, - 17294, 17298, 17302, 17306, 17310, 17314, 17318, 17322, 17326, 17330, - 17334, 17338, 0, 17342, 17346, 17350, 17354, 17358, 17362, 17366, 17370, - 17374, 17378, 17382, 17386, 17390, 17394, 17398, 17402, 17406, 17410, - 17414, 0, 0, 0, 0, 0, 0, 17418, 17421, 17424, 17427, 17430, 17433, 17438, - 17442, 17447, 17450, 17453, 17456, 17459, 17462, 17465, 17468, 17471, - 17474, 17478, 17482, 17486, 17490, 17494, 17498, 17502, 17506, 17510, - 17514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17520, 17523, 17526, 17529, 17532, - 17535, 17538, 17542, 17545, 17549, 17553, 17557, 17561, 17565, 17569, - 17573, 17577, 17581, 17585, 17589, 17593, 17597, 17601, 17605, 17609, - 17613, 17616, 17620, 17624, 17628, 17632, 17636, 17640, 17644, 17648, - 17652, 17656, 17660, 17664, 17668, 17672, 17676, 17680, 17684, 17688, - 17692, 17695, 17699, 17703, 17707, 17711, 17715, 17719, 17723, 17727, - 17731, 17735, 17739, 17743, 17747, 17751, 17755, 17759, 17763, 17767, - 17771, 17775, 17779, 17783, 17787, 17791, 17795, 17799, 17803, 17807, - 17811, 17815, 17819, 17823, 17827, 17830, 17834, 17838, 17842, 17846, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17850, 17853, 17857, 17860, 17864, - 17867, 17871, 17877, 17882, 17886, 17889, 17893, 17897, 17902, 17906, - 17911, 17915, 17920, 17924, 17929, 17933, 17938, 17944, 17948, 17953, - 17957, 17962, 17968, 17972, 17977, 17982, 17986, 17990, 17998, 18006, - 18013, 18018, 18023, 18031, 18037, 18043, 18048, 18054, 18058, 18062, - 18066, 18070, 18074, 18078, 18082, 18086, 18090, 18094, 18100, 18105, - 18110, 18114, 18118, 18122, 18127, 18131, 18136, 18140, 18145, 18149, - 18154, 18158, 18163, 18167, 18172, 18176, 18181, 18187, 18190, 18194, - 18198, 18202, 18206, 18210, 18214, 18217, 18221, 18227, 18232, 18237, - 18241, 18245, 18249, 18254, 18258, 18263, 18267, 18272, 18275, 18279, - 18283, 18288, 18292, 18297, 18301, 18306, 18312, 18315, 18319, 18323, - 18327, 18331, 18335, 18339, 18343, 18347, 18351, 18355, 18361, 18364, - 18368, 18372, 18377, 18381, 18386, 18390, 18395, 18399, 18404, 18408, - 18413, 18417, 18422, 18426, 18431, 18437, 18440, 18444, 18450, 18456, - 18462, 18468, 18472, 18476, 18480, 18484, 18488, 18492, 18498, 18502, - 18506, 18510, 18515, 18519, 18524, 18528, 18533, 18537, 18542, 18546, - 18551, 18555, 18560, 18564, 18569, 18575, 18578, 18584, 18588, 18592, - 18596, 18600, 18604, 18608, 18614, 18617, 18621, 18625, 18630, 18634, - 18639, 18643, 18648, 18652, 18657, 18661, 18666, 18670, 18675, 18679, - 18684, 18690, 18693, 18697, 18701, 18706, 18711, 18715, 18719, 18723, - 18727, 18731, 18735, 18741, 18745, 18749, 18753, 18758, 18762, 18767, - 18771, 18776, 18782, 18785, 18790, 18794, 18798, 18802, 18806, 18810, - 18814, 18818, 18824, 18828, 18832, 18836, 18841, 18845, 18850, 18854, - 18859, 18863, 18868, 18872, 18877, 18881, 18886, 18890, 18895, 18898, - 18902, 18906, 18910, 18914, 18918, 18922, 18926, 18930, 18936, 18940, - 18944, 18948, 18953, 18957, 18962, 18966, 18971, 18975, 18980, 18984, - 18989, 18993, 18998, 19002, 19007, 19013, 19016, 19021, 19025, 19030, - 19036, 19042, 19048, 19054, 19060, 19066, 19072, 19076, 19080, 19084, - 19088, 19092, 19096, 19100, 19104, 19109, 19113, 19118, 19122, 19127, - 19131, 19136, 19140, 19145, 19149, 19154, 19158, 19163, 19167, 19171, - 19175, 19179, 19183, 19187, 19191, 19197, 19200, 19204, 19208, 19213, - 19217, 19222, 19226, 19231, 19235, 19240, 19244, 19249, 19253, 19258, - 19262, 19267, 19273, 19276, 19281, 19285, 19291, 19295, 19301, 19306, - 19310, 19314, 19318, 19322, 19326, 19331, 19335, 19339, 19344, 19348, - 19353, 19356, 19360, 19364, 19368, 19372, 19376, 19380, 19384, 19388, - 19392, 19396, 19400, 19405, 19408, 19412, 19418, 19422, 19428, 19432, - 19438, 19442, 19446, 19450, 19454, 19458, 19463, 19467, 19471, 19475, - 19479, 19483, 19487, 19491, 19495, 19499, 19503, 19509, 19515, 19521, - 19527, 19533, 19539, 19545, 19550, 19555, 19559, 19563, 19567, 19571, - 19575, 19579, 19583, 19587, 19590, 19594, 19598, 19602, 19606, 19611, - 19616, 19621, 19626, 19630, 19634, 19638, 19642, 19646, 19650, 19654, - 19658, 19662, 19668, 19674, 19680, 19686, 19692, 19698, 19704, 19710, - 19716, 19720, 19724, 19728, 19732, 19736, 19740, 19744, 19750, 19756, - 19762, 19768, 19774, 19780, 19786, 19792, 19797, 19802, 19807, 19812, - 19817, 19823, 19829, 19835, 19841, 19847, 19853, 19859, 19865, 19871, - 19877, 19883, 19888, 19894, 19900, 19906, 19912, 19917, 19922, 19927, - 19932, 19937, 19942, 19947, 19952, 19957, 19962, 19967, 19972, 19977, - 19982, 19987, 19992, 19997, 20002, 20007, 20012, 20017, 20022, 20027, - 20032, 20037, 20042, 20047, 20052, 20057, 20062, 20067, 20072, 20077, - 20082, 20087, 20092, 20097, 20102, 20107, 20112, 20117, 20122, 20126, - 20131, 20136, 20141, 20146, 20151, 20156, 20161, 20166, 20171, 20176, - 20181, 20186, 20191, 20196, 20201, 20206, 20211, 20216, 20221, 20226, - 20231, 20236, 20241, 20246, 20251, 20256, 20261, 20266, 20271, 20276, - 20280, 20285, 20290, 20295, 20300, 20305, 20309, 20314, 20320, 20325, - 20330, 20335, 20340, 20346, 20351, 20356, 20361, 20366, 20371, 20376, - 20381, 20386, 20391, 20396, 20401, 20406, 20411, 20416, 20421, 20426, - 20431, 20436, 20441, 20446, 20451, 20456, 20461, 20466, 20471, 20476, - 20481, 20486, 20491, 20496, 20501, 20506, 20511, 20516, 20521, 20526, - 20531, 20536, 20541, 20546, 20551, 20556, 20561, 20565, 20570, 20575, - 20580, 20585, 20590, 20595, 20600, 20605, 20610, 20615, 20620, 20625, - 20630, 20635, 20640, 20645, 20650, 20655, 20660, 20665, 20670, 20675, - 20680, 20685, 20690, 20695, 20700, 20705, 20710, 20715, 20720, 20725, - 20730, 20735, 20740, 20745, 20750, 20755, 20760, 20764, 20768, 20772, - 20776, 20780, 20784, 20788, 20792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20796, - 20801, 20806, 20811, 20816, 20821, 20826, 20831, 20836, 20841, 20846, - 20851, 20856, 20861, 20866, 20871, 20876, 20881, 20886, 20891, 20896, - 20901, 20906, 20911, 20916, 20921, 20926, 20931, 20936, 0, 0, 0, 20942, - 20951, 20954, 20961, 20965, 20968, 20971, 20979, 20983, 20988, 20993, - 20998, 21002, 21007, 21012, 21015, 21019, 21023, 21032, 21036, 21040, - 21045, 21048, 21052, 21059, 21063, 21070, 21075, 21080, 21085, 21090, - 21099, 21104, 21108, 21117, 21120, 21125, 21129, 21135, 21140, 21146, - 21153, 21159, 21164, 21171, 21176, 21179, 21182, 21191, 21196, 21199, - 21208, 21213, 21217, 21221, 21228, 21235, 21240, 21245, 21254, 21258, - 21262, 21266, 21273, 21280, 21284, 21288, 21292, 21296, 21300, 21304, - 21308, 21312, 21316, 21319, 21322, 21327, 21332, 21337, 21341, 21345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21349, 21353, 21357, 21361, - 21365, 21370, 21375, 21380, 21385, 21390, 21395, 21400, 21404, 0, 21408, - 21413, 21418, 21423, 21428, 21433, 21438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21443, 21447, 21451, 21455, 21459, 21464, 21469, 21474, 21479, 21484, - 21489, 21494, 21498, 21502, 21507, 21512, 21517, 21522, 21527, 21532, - 21537, 21542, 21548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21553, 21557, 21561, - 21565, 21569, 21574, 21579, 21584, 21589, 21594, 21599, 21604, 21608, - 21612, 21617, 21622, 21627, 21632, 21637, 21642, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21647, 21651, 21655, 21659, 21663, 21668, 21673, 21678, - 21683, 21688, 21693, 21698, 21702, 0, 21706, 21711, 21716, 0, 21721, - 21726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21731, 21734, 21738, 21742, - 21746, 21750, 21754, 21758, 21762, 21766, 21770, 21774, 21778, 21782, - 21786, 21790, 21794, 21798, 21801, 21805, 21809, 21813, 21817, 21821, - 21825, 21829, 21833, 21837, 21841, 21845, 21849, 21853, 21857, 21861, - 21865, 21869, 21875, 21881, 21887, 21893, 21899, 21905, 21911, 21917, - 21923, 21929, 21935, 21941, 21947, 21953, 21962, 21971, 21977, 21983, - 21989, 21994, 21998, 22003, 22007, 22012, 22016, 22021, 22026, 22031, - 22035, 22040, 22044, 22049, 22054, 22059, 22064, 22068, 22072, 22076, - 22080, 22084, 22088, 22092, 22096, 22100, 22104, 22110, 22114, 22118, - 22122, 22126, 22130, 22138, 22144, 22148, 22154, 22158, 22164, 0, 0, 0, - 22168, 22172, 22175, 22178, 22181, 22184, 22187, 22190, 22193, 22196, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22199, - 22202, 22205, 22208, 22211, 22214, 22219, 22226, 22234, 22239, 22244, - 22247, 22255, 22263, 22271, 0, 22275, 22279, 22282, 22285, 22288, 22291, - 22294, 22297, 22300, 22303, 0, 0, 0, 0, 0, 0, 22306, 22309, 22312, 22315, - 22318, 22321, 22325, 22329, 22333, 22337, 22341, 22345, 22349, 22353, - 22357, 22360, 22364, 22368, 22372, 22376, 22380, 22384, 22388, 22391, - 22395, 22399, 22403, 22406, 22410, 22414, 22418, 22422, 22426, 22430, - 22434, 22438, 22445, 22450, 22455, 22460, 22465, 22471, 22477, 22483, - 22489, 22495, 22501, 22507, 22512, 22518, 22524, 22530, 22536, 22542, - 22547, 22553, 22558, 22564, 22570, 22576, 22582, 22588, 22593, 22598, - 22604, 22610, 22615, 22621, 22626, 22632, 22638, 22644, 22650, 22656, - 22662, 22668, 22674, 22680, 22686, 22692, 22698, 22704, 22710, 22716, - 22721, 22726, 22732, 22738, 0, 0, 0, 0, 0, 0, 0, 0, 22744, 22751, 22758, - 22764, 22770, 22778, 22784, 22792, 22797, 22802, 22807, 22813, 22819, - 22825, 22831, 22837, 22843, 22849, 22855, 22861, 22867, 22873, 22879, - 22885, 22891, 22899, 22907, 22915, 22923, 22931, 22939, 22947, 22955, - 22963, 22971, 22979, 22987, 22995, 23003, 23009, 23015, 23023, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23029, 23037, 23045, 23053, 23061, - 23069, 23077, 23085, 23093, 23103, 23113, 23121, 23129, 23137, 23145, - 23153, 23161, 23169, 23177, 23185, 23193, 23202, 23211, 23220, 23229, - 23236, 23243, 23250, 23257, 23266, 23275, 23283, 23291, 23298, 23305, - 23313, 23321, 23329, 23337, 23344, 23351, 23359, 23367, 23376, 23385, - 23392, 23399, 23408, 23417, 23424, 23431, 23439, 23447, 23455, 23463, - 23471, 23479, 23490, 23501, 23509, 23517, 23525, 23533, 23540, 23547, - 23555, 23563, 23571, 23579, 23587, 23595, 23603, 23611, 23619, 23627, - 23635, 23643, 23651, 23659, 23667, 23675, 23684, 23693, 23702, 23711, - 23718, 23725, 23733, 23741, 23749, 23757, 23765, 23773, 23784, 23795, - 23803, 23811, 23819, 23827, 23835, 23843, 23854, 23865, 23876, 23887, - 23899, 23911, 23919, 23927, 23935, 23943, 23951, 23959, 23967, 23975, - 23983, 23991, 23998, 24005, 24012, 24019, 24027, 24035, 24044, 24053, - 24060, 24067, 24075, 24083, 24090, 24097, 24104, 24111, 24118, 24125, - 24133, 24141, 24149, 24157, 24165, 24173, 24180, 24187, 24195, 24203, - 24211, 24219, 24227, 24235, 24243, 24251, 24259, 24266, 24275, 24284, - 24293, 0, 0, 0, 0, 24302, 24309, 24316, 24324, 24332, 24340, 24348, - 24356, 24364, 24374, 24384, 24392, 24400, 24409, 24418, 24427, 24436, - 24445, 24454, 24465, 24476, 24485, 24494, 24504, 24514, 24521, 24528, - 24536, 24544, 24550, 24556, 24564, 24572, 24580, 24588, 24598, 24608, - 24616, 24624, 24633, 24642, 24650, 24658, 24665, 24672, 24679, 24686, - 24694, 24702, 24710, 24718, 24726, 24734, 24744, 24754, 24762, 24770, - 24779, 24788, 24797, 24806, 24815, 24824, 24835, 24846, 24855, 24864, - 24874, 24884, 24891, 24898, 24906, 24914, 24923, 24932, 24941, 24950, - 24961, 24972, 24981, 24990, 25000, 25010, 25017, 25024, 25032, 25040, - 25049, 25058, 25065, 0, 0, 0, 0, 0, 0, 25072, 25079, 25086, 25094, 25102, - 25110, 25118, 25127, 25136, 25143, 25150, 25158, 25166, 25174, 25182, - 25191, 25200, 25208, 25216, 25225, 25234, 25243, 0, 0, 25252, 25260, - 25268, 25277, 25286, 25295, 0, 0, 25304, 25311, 25318, 25326, 25334, - 25342, 25350, 25359, 25368, 25375, 25382, 25390, 25398, 25406, 25414, - 25423, 25432, 25439, 25446, 25454, 25462, 25470, 25478, 25487, 25496, - 25503, 25510, 25518, 25526, 25534, 25542, 25551, 25560, 25568, 25576, - 25585, 25594, 25603, 0, 0, 25612, 25620, 25628, 25637, 25646, 25655, 0, - 0, 25664, 25672, 25680, 25689, 25698, 25707, 25716, 25726, 0, 25736, 0, - 25744, 0, 25753, 0, 25762, 25772, 25779, 25786, 25794, 25802, 25810, - 25818, 25827, 25836, 25843, 25850, 25858, 25866, 25874, 25882, 25891, - 25900, 25906, 25912, 25919, 25926, 25932, 25938, 25944, 25950, 25957, - 25964, 25971, 25978, 25984, 0, 0, 25990, 25998, 26006, 26017, 26028, - 26039, 26050, 26061, 26072, 26081, 26090, 26102, 26114, 26126, 26138, - 26150, 26162, 26170, 26178, 26189, 26200, 26211, 26222, 26233, 26244, - 26253, 26262, 26274, 26286, 26298, 26310, 26322, 26334, 26342, 26350, - 26361, 26372, 26383, 26394, 26405, 26416, 26425, 26434, 26446, 26458, - 26470, 26482, 26494, 26506, 26513, 26519, 26528, 26534, 0, 26543, 26550, - 26559, 26566, 26572, 26578, 26584, 26591, 26594, 26597, 26600, 26603, - 26609, 26618, 26624, 0, 26633, 26640, 26649, 26656, 26663, 26669, 26675, - 26682, 26686, 26690, 26695, 26702, 26708, 26717, 0, 0, 26726, 26733, - 26743, 26750, 26756, 26762, 0, 26768, 26772, 26776, 26781, 26789, 26796, - 26806, 26816, 26824, 26832, 26840, 26851, 26859, 26866, 26873, 26880, - 26888, 26893, 26898, 0, 0, 26900, 26909, 26915, 0, 26924, 26931, 26940, - 26947, 26954, 26960, 26966, 26973, 26975, 0, 26978, 26982, 26986, 26990, - 26994, 26998, 27002, 27006, 27010, 27014, 27018, 27022, 27028, 27034, - 27040, 27043, 27046, 27048, 27052, 27056, 27060, 27064, 27066, 27070, - 27075, 27081, 27087, 27094, 27101, 27106, 27111, 27117, 27123, 27125, - 27128, 27130, 27134, 27139, 27143, 27146, 27150, 27153, 27157, 27161, - 27165, 27171, 27175, 27179, 27185, 27190, 27197, 27199, 27202, 27206, - 27209, 27213, 27218, 27220, 27228, 27236, 27239, 27243, 27245, 27247, - 27249, 27252, 27258, 27260, 27264, 27268, 27274, 27280, 27284, 27289, - 27294, 27299, 27303, 27307, 27311, 27315, 27318, 27322, 27329, 0, 0, 0, - 0, 27334, 0, 0, 0, 0, 0, 0, 0, 27338, 27343, 27347, 27351, 27355, 0, 0, - 0, 0, 0, 0, 27359, 27365, 27371, 27378, 27385, 27390, 27395, 27399, 0, 0, - 27405, 27408, 27411, 27414, 27417, 27420, 27423, 27428, 27432, 27437, - 27442, 27447, 27453, 27457, 27460, 27463, 27466, 27469, 27472, 27475, - 27478, 27481, 27484, 27489, 27493, 27498, 27503, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27508, 27511, 27514, 27517, 27522, 27525, - 27528, 27531, 27534, 27537, 27540, 27545, 27548, 27551, 27554, 27557, - 27560, 27565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27568, 27572, 27576, 27582, 27588, 27593, - 27598, 27602, 27606, 27611, 27618, 27625, 27631, 27637, 27642, 27647, - 27652, 27658, 27663, 27668, 27673, 27681, 27688, 27695, 27699, 27704, - 27710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 27715, 27719, 27726, 27729, 27733, 27737, 27741, 27745, 27749, 27751, - 27755, 27758, 27761, 27765, 27768, 27772, 27781, 27784, 27788, 27791, - 27794, 27801, 27804, 27807, 27813, 27816, 27819, 27822, 27825, 27829, - 27832, 27836, 27838, 27841, 27844, 27848, 27850, 27853, 27856, 27859, - 27864, 27868, 27875, 27878, 27881, 27884, 27888, 27891, 27894, 27897, - 27900, 27904, 27907, 27910, 27912, 27915, 27918, 27921, 27925, 0, 0, - 27929, 27933, 27937, 27941, 27946, 27951, 27956, 27960, 27965, 27969, - 27973, 27977, 27981, 27985, 27989, 0, 0, 0, 0, 0, 0, 0, 27993, 28001, - 28008, 28016, 28023, 28031, 28039, 28047, 28055, 28063, 28071, 28079, - 28087, 28092, 28095, 28098, 28101, 28104, 28107, 28110, 28113, 28116, - 28119, 28123, 28127, 28131, 28135, 28141, 28147, 28153, 28157, 28161, - 28165, 28169, 28173, 28177, 28181, 28185, 28189, 28194, 28199, 28204, - 28209, 28216, 28223, 28230, 28239, 28245, 28251, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28258, 28260, 28262, 28264, 28266, 28269, 28272, 28277, - 28282, 28287, 28292, 28296, 28300, 28304, 28308, 28313, 28318, 28323, - 28328, 28333, 28338, 28343, 28348, 28353, 28358, 28364, 28368, 28372, - 28377, 28382, 28387, 28392, 28396, 28403, 28410, 28417, 28424, 28431, - 28438, 28445, 28452, 28460, 28471, 28477, 28483, 28489, 28495, 28501, - 28507, 28513, 28519, 28525, 28531, 28537, 28543, 28549, 28554, 28559, - 28564, 28569, 28576, 28583, 28588, 28594, 28599, 28602, 28605, 28608, - 28611, 28615, 28619, 28625, 28631, 28637, 28643, 28647, 28651, 28655, - 28659, 28664, 28669, 28673, 28677, 28681, 28685, 28689, 28693, 28696, - 28699, 28702, 28705, 28711, 28718, 28728, 28738, 28742, 28750, 28757, - 28765, 28773, 28777, 28783, 28789, 28794, 28799, 28804, 28810, 28816, - 28822, 28829, 28833, 28837, 28842, 28845, 28847, 28851, 28855, 28862, - 28866, 28868, 28870, 28874, 28881, 28886, 28892, 28901, 28908, 28913, - 28917, 28921, 28925, 28928, 28931, 28934, 28938, 28942, 28945, 28948, - 28951, 28954, 28958, 28962, 28965, 28967, 28970, 28972, 28976, 28980, - 28982, 28987, 28990, 28994, 28998, 29002, 29004, 29006, 29008, 29011, - 29015, 29019, 29023, 29027, 29031, 29037, 29043, 29045, 29047, 29049, - 29051, 29054, 29056, 29060, 29062, 29064, 29066, 29071, 29075, 29079, - 29081, 29084, 29088, 29093, 29097, 29106, 29116, 29120, 29125, 29131, - 29134, 29138, 29141, 29146, 29150, 29156, 29160, 29171, 29179, 29183, - 29187, 29193, 29197, 29200, 29202, 29205, 29209, 29213, 29219, 29223, - 29227, 29230, 29233, 29237, 29242, 29246, 29250, 29255, 29260, 29266, - 29272, 29276, 29280, 29282, 29286, 29289, 29292, 29299, 29306, 29311, - 29316, 29324, 29332, 29336, 29340, 29347, 29354, 29356, 29358, 29363, - 29368, 29374, 29380, 29385, 29390, 29394, 29398, 29404, 29410, 29416, - 29422, 29432, 29442, 29449, 29456, 29458, 29462, 29466, 29471, 29476, - 29483, 29490, 29493, 29496, 29499, 29502, 29505, 29510, 29513, 29517, - 29521, 29524, 29527, 29531, 29535, 29539, 29543, 29546, 29549, 29552, - 29555, 29557, 29559, 29561, 29563, 29571, 29579, 29584, 29587, 29592, - 29602, 29608, 29614, 29620, 29628, 29636, 29647, 29651, 29655, 29657, - 29663, 29665, 29667, 29669, 29671, 29676, 29678, 29684, 29690, 29694, - 29698, 29701, 29703, 29706, 29710, 29712, 29721, 29730, 29735, 29740, - 29744, 29750, 29756, 29759, 29762, 29765, 29768, 29770, 29775, 29778, - 29781, 29787, 29793, 29799, 29805, 29810, 29815, 29820, 29825, 29833, - 29841, 29849, 29857, 29865, 29873, 29880, 29887, 29895, 29903, 29910, - 29921, 29930, 29944, 29947, 29952, 29958, 29964, 29971, 29985, 30000, - 30006, 30012, 30019, 30025, 30033, 30039, 30052, 30066, 30071, 30077, - 30085, 30088, 30091, 30093, 30096, 30099, 30101, 30103, 30107, 30110, - 30113, 30116, 30119, 30124, 30129, 30134, 30139, 30142, 30145, 30147, - 30149, 30151, 30155, 30159, 30163, 30169, 30173, 30175, 30177, 30182, - 30187, 30192, 30197, 30202, 30207, 30209, 30211, 30220, 30224, 30230, - 30239, 30241, 30245, 30249, 30256, 30260, 30262, 30266, 30268, 30272, - 30276, 30280, 30282, 30284, 30286, 30291, 30298, 30305, 30312, 30319, - 30326, 30333, 30339, 30345, 30351, 30357, 30364, 30371, 30378, 30385, - 30391, 30397, 30404, 30411, 30417, 30425, 30432, 30440, 30447, 30455, - 30461, 30468, 30476, 30483, 30491, 30498, 30506, 30512, 30519, 30526, - 30533, 30540, 30547, 30553, 30561, 30568, 30574, 30581, 30588, 30594, - 30600, 30606, 30611, 30619, 30627, 30632, 30637, 30643, 30649, 30654, - 30660, 30667, 30675, 30682, 30689, 30696, 30701, 30706, 30711, 30717, - 30724, 30730, 30736, 30741, 30745, 30752, 30758, 30761, 30767, 30770, - 30775, 30780, 30783, 30786, 30794, 30797, 30802, 30805, 30812, 30817, - 30824, 30827, 30830, 30833, 30838, 30843, 30846, 30849, 30857, 30860, - 30865, 30872, 30876, 30880, 30885, 30890, 30895, 30900, 30905, 30910, - 30915, 30920, 30926, 30931, 30937, 30943, 30948, 30954, 30960, 30968, - 30974, 30979, 30985, 30993, 30999, 31003, 31007, 31017, 31027, 31031, - 31035, 31039, 31043, 31053, 31057, 31062, 31067, 31072, 31077, 31082, - 31087, 31096, 31105, 31113, 31123, 31133, 31140, 31149, 31158, 31166, - 31176, 31186, 31194, 31202, 31212, 31222, 31225, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31228, 31232, 31239, - 31246, 31253, 31260, 31264, 31268, 31272, 31276, 31281, 31286, 31291, - 31297, 31303, 31309, 31315, 31323, 31330, 31337, 31344, 31351, 31357, - 31363, 31372, 31376, 31383, 31387, 31391, 31397, 31403, 31409, 31415, - 31419, 31423, 31426, 31430, 31434, 31441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31448, 31451, 31455, 31459, - 31465, 31471, 31477, 31485, 31492, 31496, 31504, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31509, 31512, 31515, 31518, 31521, - 31524, 31527, 31530, 31533, 31536, 31540, 31544, 31548, 31552, 31556, - 31560, 31564, 31568, 31572, 31576, 31580, 31583, 31586, 31589, 31592, - 31595, 31598, 31601, 31604, 31607, 31611, 31615, 31619, 31623, 31627, - 31631, 31635, 31639, 31643, 31647, 31651, 31656, 31660, 31665, 31670, - 31675, 31680, 31685, 31690, 31695, 31700, 31705, 31710, 31715, 31720, - 31725, 31730, 31735, 31740, 31745, 31750, 31755, 31760, 31765, 31770, - 31775, 31780, 31785, 31790, 31795, 31800, 31805, 31810, 31815, 31820, - 31825, 31830, 31835, 31840, 31845, 31850, 31855, 31860, 31865, 31870, - 31875, 31880, 31885, 31890, 31895, 31900, 31905, 31910, 31915, 31920, - 31925, 31930, 31935, 31940, 31945, 31950, 31955, 31960, 31965, 31970, - 31975, 31980, 31985, 31990, 31995, 32000, 32005, 32010, 32015, 32020, - 32025, 32030, 32035, 32040, 32045, 32050, 32055, 32060, 32065, 32070, - 32075, 32080, 32085, 32090, 32095, 32100, 32105, 32110, 32115, 32120, - 32125, 32130, 32135, 32140, 32144, 32150, 32156, 32162, 32168, 32174, - 32180, 32186, 32192, 32198, 32204, 32208, 32212, 32216, 32220, 32224, - 32228, 32232, 32236, 32240, 0, 32245, 32250, 32255, 32260, 32265, 32274, - 32283, 32292, 32301, 32310, 32319, 32328, 32337, 32343, 32351, 32359, - 32365, 32372, 32380, 32388, 32395, 32401, 32409, 32417, 32423, 32430, - 32438, 32446, 32453, 32459, 32467, 32476, 32485, 32493, 32502, 32511, - 32517, 32524, 32532, 32541, 32550, 32558, 32567, 32576, 32583, 32590, - 32599, 32608, 32616, 32624, 32633, 32642, 32649, 32656, 32665, 32674, - 32682, 32690, 32699, 32708, 32715, 32722, 32731, 32740, 32748, 32757, - 32766, 32774, 32784, 32794, 32804, 32814, 32823, 32832, 32841, 32850, - 32857, 32865, 32873, 32881, 32889, 32894, 32899, 32908, 32916, 32922, - 32931, 32939, 32946, 32955, 32963, 32969, 32978, 32986, 32993, 33002, - 33010, 33016, 33025, 33033, 33040, 33049, 33057, 33064, 33073, 33081, - 33088, 33097, 33105, 33112, 33120, 33129, 33138, 33146, 33157, 33167, - 33174, 33179, 33184, 33188, 33193, 33198, 33203, 33207, 33212, 33219, - 33227, 33234, 33242, 33246, 33253, 33260, 33267, 33271, 33278, 33285, - 33292, 33295, 33302, 33309, 33316, 33320, 33327, 33334, 33341, 33345, - 33348, 33352, 33356, 33363, 33370, 33375, 33379, 33384, 33394, 33401, - 33412, 33422, 33426, 33434, 33444, 33447, 33450, 33457, 33465, 33470, - 33475, 33483, 33492, 33501, 33509, 33513, 33517, 33520, 33523, 33527, - 33531, 33534, 33537, 33541, 33545, 33550, 33555, 33559, 33563, 33568, - 33573, 33578, 33583, 33587, 33591, 33596, 33601, 33605, 33609, 33614, - 33619, 33624, 33629, 33632, 33635, 33644, 33646, 33648, 33651, 33655, - 33660, 33662, 33665, 33671, 33677, 33683, 33689, 33697, 33709, 33714, - 33719, 33723, 33728, 33735, 33742, 33750, 33758, 33766, 33774, 33778, - 33782, 33786, 33790, 33794, 33798, 33801, 33807, 33813, 33822, 33831, - 33839, 33846, 33855, 33864, 33868, 33875, 33882, 33889, 33896, 33903, - 33910, 33917, 33924, 33927, 33930, 33933, 33938, 33943, 33949, 33955, - 33958, 33964, 33966, 33968, 33970, 33972, 33975, 33978, 33980, 33982, - 33984, 33988, 33992, 33994, 33996, 33999, 34002, 34006, 34012, 34017, 0, - 0, 34019, 34024, 0, 34029, 34038, 34044, 34050, 34056, 34062, 34068, - 34074, 34079, 34082, 34085, 34088, 34090, 34092, 34096, 34100, 34105, - 34110, 34115, 34118, 34122, 34127, 34130, 34134, 34139, 34144, 34149, - 34154, 34159, 34164, 34169, 34174, 34179, 34184, 34189, 34194, 34200, - 34206, 34212, 34214, 34217, 34219, 34222, 34224, 34226, 34228, 34230, - 34232, 34234, 34236, 34238, 34240, 34242, 34244, 34246, 34248, 34250, - 34252, 34254, 34256, 34261, 34266, 34271, 34276, 34281, 34286, 34291, - 34296, 34301, 34306, 34311, 34316, 34321, 34326, 34331, 34336, 34341, - 34346, 34351, 34356, 34360, 34364, 34368, 34374, 34380, 34385, 34390, - 34395, 34400, 34405, 34410, 34418, 34426, 34434, 34442, 34450, 34458, - 34466, 34474, 34480, 34485, 0, 0, 34490, 34494, 34498, 34502, 34506, - 34510, 34514, 34519, 34525, 34531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34538, 34543, 34546, 34551, 0, 34554, - 34559, 34563, 34565, 0, 0, 34567, 34571, 34575, 34579, 34581, 34585, - 34588, 34591, 34594, 34598, 34601, 34605, 34608, 34612, 34617, 34621, - 34627, 34634, 34637, 34643, 34648, 34652, 34657, 34663, 34669, 34676, - 34682, 34689, 0, 34696, 34703, 34707, 34714, 34720, 34725, 34731, 34735, - 34740, 34743, 34749, 34755, 34762, 34770, 34777, 34786, 34796, 34803, - 34809, 34813, 34821, 34826, 34835, 34838, 34841, 34850, 34861, 34868, - 34870, 34876, 34881, 34883, 34886, 34890, 34898, 0, 34907, 0, 34912, - 34919, 34926, 34933, 0, 0, 0, 34940, 0, 34947, 34950, 34954, 34957, - 34969, 34979, 34990, 0, 0, 34999, 35008, 35014, 35022, 35026, 35034, - 35038, 35046, 35053, 35060, 35069, 35078, 35086, 35094, 35103, 35112, - 35119, 35126, 35135, 35144, 35152, 35160, 35167, 35174, 35181, 35188, - 35195, 35202, 35209, 35216, 35223, 35231, 35237, 35243, 35249, 35255, - 35261, 35267, 35273, 35279, 35285, 35292, 35300, 35308, 35316, 35324, - 35332, 35340, 35348, 35356, 35364, 35373, 0, 0, 0, 35378, 35384, 35387, - 35393, 35399, 35404, 35408, 35413, 35419, 35426, 35429, 35436, 35443, - 35447, 35455, 35463, 35468, 35474, 35479, 35484, 35491, 35498, 35505, - 35512, 0, 35520, 35528, 35533, 35537, 35544, 35548, 35555, 35563, 35568, - 35576, 35580, 35585, 35589, 35594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 35598, 35605, 35608, 35615, 35621, 35627, 35632, 35637, - 35642, 35647, 35652, 35658, 35663, 35666, 35670, 35674, 35680, 35689, - 35694, 35703, 35712, 35718, 35724, 35729, 35734, 35738, 35742, 35747, 0, - 0, 0, 0, 35752, 35756, 35760, 35766, 35772, 35778, 35781, 35784, 35788, - 35792, 35796, 35801, 35807, 35813, 35820, 35827, 35832, 35836, 35840, - 35844, 35848, 35852, 35856, 35860, 35864, 35868, 35872, 35876, 35880, - 35884, 35888, 35892, 35896, 35900, 35904, 35908, 35912, 35916, 35920, - 35924, 35928, 35932, 35936, 35940, 35944, 35948, 35952, 35956, 35960, - 35964, 35968, 35972, 35976, 35980, 35984, 35988, 35992, 35996, 36000, - 36004, 36008, 36012, 36016, 36020, 36024, 36028, 36032, 36036, 36040, - 36044, 36048, 36052, 36056, 36060, 36064, 36068, 36072, 36076, 36080, - 36084, 36088, 36092, 36096, 36100, 36104, 36108, 36112, 36116, 36120, - 36124, 36128, 36132, 36136, 36140, 36144, 36148, 36152, 36156, 36160, - 36164, 36168, 36172, 36176, 36180, 36184, 36188, 36192, 36196, 36200, - 36204, 36208, 36212, 36216, 36220, 36224, 36228, 36232, 36236, 36240, - 36244, 36248, 36252, 36256, 36260, 36264, 36268, 36272, 36276, 36280, - 36284, 36288, 36292, 36296, 36300, 36304, 36308, 36312, 36316, 36320, - 36324, 36328, 36332, 36336, 36340, 36344, 36348, 36352, 36356, 36360, - 36364, 36368, 36372, 36376, 36380, 36384, 36388, 36392, 36396, 36400, - 36404, 36408, 36412, 36416, 36420, 36424, 36428, 36432, 36436, 36440, - 36444, 36448, 36452, 36456, 36460, 36464, 36468, 36472, 36476, 36480, - 36484, 36488, 36492, 36496, 36500, 36504, 36508, 36512, 36516, 36520, - 36524, 36528, 36532, 36536, 36540, 36544, 36548, 36552, 36556, 36560, - 36564, 36568, 36572, 36576, 36580, 36584, 36588, 36592, 36596, 36600, - 36604, 36608, 36612, 36616, 36620, 36624, 36628, 36632, 36636, 36640, - 36644, 36648, 36652, 36656, 36660, 36664, 36668, 36672, 36676, 36680, - 36684, 36688, 36692, 36696, 36700, 36704, 36708, 36712, 36716, 36720, - 36724, 36728, 36732, 36736, 36740, 36744, 36748, 36752, 36756, 36760, - 36764, 36768, 36772, 36776, 36780, 36784, 36788, 36792, 36796, 36800, - 36804, 36808, 36812, 36816, 36820, 36824, 36828, 36832, 36836, 36840, - 36844, 36848, 36852, 36856, 36863, 36871, 36877, 36883, 36890, 36897, - 36903, 36909, 36914, 36919, 36923, 36927, 36932, 36937, 36943, 36949, - 36957, 36964, 36968, 36972, 36980, 36989, 36996, 37006, 37017, 37020, - 37023, 37027, 37031, 37037, 37043, 37053, 37063, 37073, 37083, 37090, - 37097, 37104, 37111, 37122, 37133, 37144, 37155, 37165, 37175, 37187, - 37199, 37210, 37221, 37233, 37245, 37253, 37263, 37273, 37283, 37293, - 37300, 37307, 37314, 37321, 37331, 37341, 37348, 37355, 37361, 37367, - 37373, 37379, 37385, 37391, 37397, 37402, 37410, 37419, 37427, 37435, - 37443, 37451, 37459, 37467, 37475, 37483, 37490, 37497, 37504, 37511, - 37518, 37525, 37532, 37539, 37547, 37555, 37563, 37571, 37579, 37587, - 37595, 37603, 37615, 37627, 37639, 37651, 37663, 37675, 37687, 37699, - 37708, 37718, 37727, 37737, 37749, 37761, 37769, 37775, 37781, 37786, - 37791, 37798, 37802, 37808, 37812, 37817, 37823, 37828, 37833, 37838, - 37843, 37848, 37855, 37861, 37869, 37874, 37879, 37883, 37887, 37895, - 37903, 37911, 37919, 37925, 37931, 37943, 37955, 37967, 37979, 37984, - 37989, 37994, 37999, 38005, 38011, 38018, 38025, 38029, 38034, 38041, - 38048, 38054, 38060, 38064, 38071, 38078, 38082, 38085, 38089, 38094, - 38101, 38108, 38126, 38145, 38163, 38182, 38201, 38220, 38239, 38258, - 38263, 38270, 38278, 38286, 38294, 38298, 38301, 38304, 38309, 38312, - 38330, 38335, 38341, 38347, 38351, 38354, 38357, 38360, 38368, 38378, - 38386, 38394, 38398, 38403, 38407, 38412, 38417, 38422, 38427, 38436, - 38442, 38449, 38456, 38463, 38470, 38473, 38480, 38487, 38490, 38493, - 38498, 38503, 38509, 38515, 38519, 38525, 38532, 38536, 38542, 38546, - 38550, 38558, 38569, 38577, 38581, 38583, 38592, 38601, 38607, 38610, - 38615, 38620, 38625, 38630, 38635, 38640, 38645, 38650, 38652, 38657, - 38662, 38669, 38673, 38679, 38682, 38686, 38692, 38698, 38700, 38702, - 38707, 38713, 38719, 38727, 38736, 38742, 38748, 38753, 38758, 38763, - 38768, 38773, 38778, 38784, 38789, 38796, 38800, 38804, 38816, 38828, - 38838, 38846, 38851, 38858, 38864, 38869, 38874, 38879, 38884, 38886, - 38892, 38900, 38908, 38916, 38923, 38930, 38936, 38942, 38948, 38955, - 38961, 38968, 38974, 38982, 38990, 38999, 39008, 39015, 39021, 39027, - 39036, 39040, 39049, 39058, 39066, 39074, 39078, 39084, 39090, 39096, - 39100, 39106, 39114, 39119, 39123, 39129, 39134, 39139, 39146, 39153, - 39158, 39163, 39171, 39179, 39189, 39199, 39206, 39213, 39217, 39221, - 39233, 39239, 39245, 39250, 39255, 39262, 39269, 39275, 39281, 39290, - 39298, 39306, 39313, 39320, 39327, 39333, 39340, 39346, 39353, 39360, - 39368, 39376, 39382, 39387, 39396, 39406, 39412, 39420, 39426, 39431, - 39436, 39444, 39450, 39457, 39464, 39470, 39475, 39482, 39490, 39503, - 39511, 39516, 39521, 39527, 39533, 39539, 39545, 39555, 39565, 39574, - 39583, 39593, 39604, 39608, 39612, 39619, 39626, 39631, 39636, 39644, - 39652, 39659, 39666, 39673, 39680, 39688, 39696, 39708, 39720, 39727, - 39734, 39744, 39754, 39761, 39768, 39777, 39786, 39791, 39796, 39804, - 39812, 39817, 39822, 39829, 39834, 39839, 39846, 39853, 39865, 39877, - 39881, 39885, 39892, 39899, 39906, 39914, 39922, 39930, 39938, 39944, - 39950, 39956, 39962, 39969, 39976, 39984, 39992, 39995, 39998, 40002, - 40006, 40013, 40020, 40027, 40034, 40043, 40052, 40059, 40066, 40072, - 40078, 40086, 40094, 40101, 40108, 40114, 40120, 40124, 40128, 40135, - 40142, 40147, 40152, 40157, 40162, 40168, 40182, 40189, 40196, 40200, - 40202, 40204, 40208, 40212, 40216, 40220, 40228, 40235, 40242, 40250, - 40262, 40269, 40276, 40285, 40289, 40293, 40298, 40304, 40315, 40320, - 40325, 40331, 40336, 40341, 40350, 40358, 40363, 40369, 40375, 40383, - 40391, 40399, 40407, 40411, 40414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40419, 40423, - 40427, 40432, 40437, 40442, 40446, 40450, 40454, 40459, 40464, 40468, - 40472, 40476, 40480, 40485, 40490, 40495, 40500, 40504, 40508, 40513, - 40518, 40523, 40528, 40532, 0, 40536, 40540, 40544, 40548, 40552, 40556, - 40560, 40565, 40570, 40574, 40579, 40584, 40593, 40597, 40601, 40605, - 40612, 40616, 40621, 40626, 40630, 40634, 40640, 40645, 40650, 40655, - 40660, 40664, 40668, 40672, 40676, 40680, 40685, 40690, 40694, 40698, - 40703, 40708, 40713, 40717, 40721, 40726, 40731, 40737, 40743, 40747, - 40753, 40759, 40763, 40769, 40775, 40780, 40785, 40789, 40795, 40799, - 40803, 40809, 40815, 40820, 40825, 40829, 40833, 40841, 40847, 40853, - 40859, 40864, 40869, 40874, 40880, 40884, 40890, 40894, 40898, 40904, - 40910, 40916, 40922, 40928, 40934, 40940, 40946, 40952, 40958, 40964, - 40970, 40974, 40980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40986, 40989, - 40993, 40996, 41000, 41004, 41007, 41010, 41014, 41018, 41022, 41026, - 41029, 41034, 41038, 41042, 41046, 41052, 41056, 41060, 41064, 41068, - 41075, 41081, 41085, 41089, 41093, 41097, 41101, 41105, 41109, 41113, - 41117, 41121, 41125, 41131, 41135, 41139, 41143, 41147, 41151, 41155, - 41159, 41163, 41167, 41171, 41175, 41179, 41183, 41187, 41191, 41195, - 41200, 41206, 41211, 41216, 41220, 41224, 41228, 41232, 41236, 41240, - 41244, 41248, 41252, 41256, 41260, 41264, 41268, 41272, 41276, 41280, - 41284, 41288, 41292, 41296, 41300, 41303, 41307, 41311, 41317, 41321, - 41325, 41329, 41333, 41337, 41341, 41345, 41349, 41353, 41360, 41364, - 41368, 41372, 41376, 41380, 41384, 41388, 41392, 41396, 41400, 41404, - 41408, 41415, 41419, 41425, 41429, 41433, 41437, 41441, 41445, 41448, - 41452, 41456, 41460, 41464, 41468, 41472, 41476, 41480, 41484, 41488, - 41492, 41496, 41500, 41504, 41508, 41512, 41516, 41520, 41524, 41528, - 41532, 41536, 41540, 41544, 41548, 41552, 41556, 41560, 41564, 41568, - 41572, 41576, 41582, 41586, 41590, 41594, 41598, 41602, 41606, 41610, - 41614, 41618, 41622, 41626, 41630, 41634, 41638, 41642, 41646, 41650, - 41654, 41658, 41662, 41666, 41670, 41674, 41678, 41682, 41686, 41690, - 41697, 41701, 41705, 41709, 41713, 41717, 41723, 41727, 41731, 41735, - 41739, 41743, 41747, 41751, 41755, 41759, 41763, 41767, 41771, 41775, - 41781, 41785, 41789, 41793, 41797, 41801, 41805, 41809, 41813, 41817, - 41821, 41825, 41829, 41833, 41837, 41841, 41845, 41849, 41853, 41857, - 41861, 41865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 41869, 41876, 41883, 41893, 41903, 41910, 41919, 41928, - 41938, 41949, 41959, 41970, 0, 0, 0, 0, 41976, 41979, 41982, 41985, - 41988, 41995, 41999, 42003, 42007, 42010, 42013, 42017, 42021, 42025, - 42029, 42034, 42039, 42044, 42049, 42052, 42055, 42061, 42067, 42072, - 42077, 42084, 42091, 42095, 42099, 42103, 42110, 42116, 42124, 42129, - 42133, 42137, 42141, 42145, 42149, 42153, 42157, 42161, 42165, 42171, - 42177, 42183, 42189, 42196, 42202, 42206, 42212, 42223, 42232, 42246, - 42255, 42259, 42267, 42272, 42277, 42282, 42287, 42290, 42295, 42300, 0, - 42306, 42310, 42313, 42317, 42320, 42324, 42327, 42331, 42334, 42338, - 42341, 42344, 42348, 42352, 42356, 42360, 42364, 42368, 42372, 42376, - 42380, 42384, 42388, 42392, 42396, 42400, 42404, 42408, 42412, 42416, - 42420, 42424, 42428, 42432, 42436, 42441, 42445, 42449, 42453, 42457, - 42460, 42464, 42468, 42472, 42476, 42480, 42484, 42488, 42492, 42496, - 42500, 42504, 42508, 42512, 42516, 42520, 42524, 42528, 42532, 42536, - 42540, 42544, 42547, 42551, 42555, 42559, 42563, 42567, 42570, 42575, - 42579, 42584, 42588, 42592, 42596, 42600, 42604, 42608, 42613, 42617, - 42621, 42625, 42629, 42632, 42636, 42640, 0, 0, 42645, 42653, 42661, - 42668, 42675, 42679, 42685, 42690, 42695, 42699, 42702, 42706, 42709, - 42713, 42716, 42720, 42723, 42727, 42730, 42733, 42737, 42741, 42745, - 42749, 42753, 42757, 42761, 42765, 42769, 42773, 42777, 42781, 42785, - 42789, 42793, 42797, 42801, 42805, 42809, 42813, 42817, 42821, 42825, - 42830, 42834, 42838, 42842, 42846, 42849, 42853, 42857, 42861, 42865, - 42869, 42873, 42877, 42881, 42885, 42889, 42893, 42897, 42901, 42905, - 42909, 42913, 42917, 42921, 42925, 42929, 42933, 42936, 42940, 42944, - 42948, 42952, 42956, 42959, 42964, 42968, 42973, 42977, 42981, 42985, - 42989, 42993, 42997, 43002, 43006, 43010, 43014, 43018, 43021, 43025, - 43029, 43034, 43038, 43042, 43046, 43050, 43054, 43061, 43065, 43071, 0, - 0, 0, 0, 0, 43076, 43079, 43082, 43085, 43088, 43091, 43094, 43097, - 43100, 43103, 43106, 43109, 43112, 43115, 43118, 43122, 43126, 43130, - 43133, 43136, 43139, 43142, 43145, 43148, 43151, 43155, 43159, 43163, - 43167, 43171, 43175, 43179, 43183, 43187, 43191, 43194, 43197, 43201, - 43204, 43208, 0, 0, 0, 0, 43212, 43216, 43220, 43224, 43228, 43232, - 43236, 43240, 43244, 43248, 43252, 43256, 43260, 43264, 43268, 43272, - 43276, 43280, 43284, 43288, 43292, 43296, 43300, 43304, 43308, 43312, - 43316, 43320, 43324, 43328, 43332, 43335, 43339, 43342, 43346, 43350, - 43353, 43357, 43361, 43364, 43368, 43372, 43376, 43380, 43383, 43387, - 43391, 43395, 43399, 43403, 43407, 43410, 43413, 43417, 43421, 43425, - 43429, 43433, 43437, 43441, 43445, 43449, 43453, 43457, 43461, 43465, - 43469, 43473, 43477, 43481, 43485, 43489, 43493, 43497, 43501, 43505, - 43509, 43513, 43517, 43521, 43525, 43529, 43533, 43537, 43541, 43545, - 43549, 43553, 43557, 43561, 43565, 43569, 43573, 43577, 0, 43581, 43587, - 43593, 43599, 43604, 43610, 43616, 43622, 43628, 43634, 43640, 43646, - 43652, 43658, 43664, 43670, 43676, 43680, 43684, 43688, 43692, 43696, - 43700, 43704, 43708, 43712, 43716, 43720, 43724, 43728, 43732, 43736, - 43740, 43744, 43748, 43752, 43756, 43760, 43764, 43768, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43772, 43777, 43782, 43787, 43791, 43796, 43801, 43806, 43811, - 43816, 43821, 43826, 43831, 43836, 43841, 43846, 43851, 43855, 43859, - 43863, 43867, 43871, 43875, 43879, 43883, 43887, 43891, 43895, 43899, - 43903, 43907, 43912, 43917, 43922, 43927, 43932, 43937, 43942, 43947, - 43952, 43957, 43962, 43967, 43972, 43977, 0, 0, 0, 43982, 43985, 43988, - 43991, 43994, 43997, 44000, 44003, 44006, 44009, 44013, 44017, 44021, - 44025, 44029, 44033, 44037, 44041, 44045, 44049, 44053, 44057, 44061, - 44065, 44069, 44073, 44077, 44081, 44085, 44089, 44093, 44097, 44101, - 44105, 44109, 44113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44117, 44122, - 44127, 44132, 44137, 44142, 44147, 44152, 44157, 44162, 44166, 44171, - 44176, 44181, 44186, 44191, 44195, 44199, 44203, 44207, 44211, 44215, - 44219, 44223, 44227, 44231, 44235, 44239, 44243, 44247, 44252, 44257, - 44262, 44267, 44272, 44277, 44282, 44287, 44292, 44297, 44302, 44307, - 44312, 0, 0, 0, 44317, 44322, 44325, 44328, 44331, 44334, 44337, 44340, - 44343, 44346, 44349, 44353, 44357, 44361, 44365, 44369, 44373, 44377, - 44381, 44385, 44389, 44393, 44397, 44401, 44405, 44409, 44413, 44417, - 44421, 44425, 44429, 44433, 44437, 44441, 44445, 44449, 44453, 44457, - 44461, 44465, 44469, 44473, 44476, 44480, 44484, 44488, 44492, 44496, - 44500, 44504, 44508, 44513, 44518, 44523, 44528, 44532, 44537, 44542, - 44547, 44552, 44557, 44562, 44567, 44572, 44577, 44581, 44587, 44593, - 44599, 44605, 44611, 44617, 44623, 44629, 44635, 44641, 44647, 0, 0, 0, - 0, 44653, 44656, 44659, 44662, 44665, 44668, 44671, 44675, 44679, 44683, - 44687, 44691, 44695, 44699, 44703, 44707, 44711, 44715, 44719, 44723, - 44726, 44730, 44734, 44738, 44742, 44746, 44750, 44754, 44758, 44762, - 44766, 44769, 44773, 44777, 44781, 44785, 44788, 44792, 44796, 44800, - 44804, 44808, 44812, 44816, 44820, 44824, 44828, 0, 44832, 44835, 44838, - 44841, 44844, 44847, 44850, 44853, 44856, 44859, 44862, 44865, 44868, - 44871, 44874, 44877, 44880, 44883, 44886, 44889, 44892, 44895, 44898, - 44901, 44904, 44907, 44910, 44913, 44916, 44919, 44922, 44925, 44928, - 44931, 44934, 44937, 44940, 44943, 44946, 44949, 44952, 44955, 44958, - 44961, 44964, 44967, 44970, 44973, 44976, 44979, 44982, 44985, 44988, - 44991, 44994, 44997, 45000, 45003, 45006, 45009, 45012, 45015, 45018, - 45021, 45024, 45027, 45030, 45033, 45036, 45039, 45042, 45045, 45048, - 45051, 45054, 45057, 45060, 45063, 45066, 45069, 45072, 45075, 45078, - 45081, 45084, 45087, 45090, 45093, 45096, 45104, 45111, 45118, 45125, - 45132, 45139, 45146, 45153, 45160, 45167, 45175, 45183, 45191, 45199, - 45207, 45215, 45223, 45231, 45239, 45247, 45255, 45263, 45271, 45279, - 45287, 45290, 45293, 45296, 45298, 45301, 0, 0, 0, 0, 45304, 45311, - 45318, 45325, 45332, 45335, 45340, 45343, 45347, 45349, 45351, 45354, - 45357, 45360, 45363, 45366, 45369, 45372, 45376, 45380, 45383, 45386, - 45389, 45392, 45395, 45398, 45401, 45405, 45408, 45411, 45414, 45417, - 45420, 45424, 45427, 45430, 45433, 45438, 45443, 45448, 45453, 45458, - 45463, 45468, 45473, 45479, 45488, 45491, 45494, 45497, 45500, 45503, - 45509, 45518, 45521, 45524, 45528, 45531, 45534, 45537, 45541, 45544, - 45547, 45552, 45555, 45558, 45562, 45565, 45568, 45573, 45578, 45583, - 45586, 45589, 45592, 45595, 45602, 45605, 45608, 45611, 45614, 45617, - 45620, 45623, 45628, 45631, 45634, 45637, 45640, 45643, 45648, 45651, - 45654, 45657, 45660, 45663, 45666, 45669, 45672, 0, 0, 45675, 45682, - 45689, 45696, 45703, 45710, 45717, 45724, 45731, 45738, 45746, 45754, - 45762, 45770, 45778, 45786, 45794, 45802, 45810, 45818, 45826, 45834, - 45842, 45850, 45858, 45866, 45874, 45882, 45890, 45898, 45906, 0, 45914, - 45918, 45922, 45925, 45929, 45933, 45937, 45941, 45945, 45949, 45953, - 45956, 45960, 45964, 45968, 45972, 45976, 45980, 45983, 45987, 45991, - 45994, 45998, 46002, 46006, 46010, 46014, 46018, 46022, 46026, 46030, - 46034, 46038, 46042, 46046, 46050, 46054, 46058, 46062, 46066, 46070, - 46074, 46078, 46082, 46086, 46090, 46094, 46098, 46102, 46106, 46110, - 46114, 46118, 46122, 46126, 46130, 46134, 46138, 46142, 46146, 46150, - 46154, 46158, 46162, 46166, 46170, 46174, 46178, 46182, 46186, 46190, - 46194, 46198, 46202, 46206, 46210, 46214, 46218, 46222, 46226, 46230, - 46234, 46238, 46242, 46246, 46250, 46254, 46258, 46262, 46266, 46270, - 46274, 46278, 46282, 46286, 46290, 46294, 46298, 46302, 46306, 46310, - 46314, 46318, 46322, 46326, 46330, 46334, 46338, 46342, 46346, 46350, - 46354, 46358, 46362, 46366, 46370, 46374, 46378, 46382, 46386, 46390, - 46394, 46398, 46402, 46406, 46410, 46414, 46418, 46422, 46426, 46430, - 46434, 46438, 46442, 46446, 46450, 46454, 46458, 46462, 46466, 46470, - 46474, 46478, 46482, 46486, 46490, 46494, 46498, 46502, 46506, 46510, - 46514, 46518, 46522, 46526, 46530, 46534, 46538, 46542, 46546, 46550, - 46554, 46558, 46562, 46566, 46570, 46574, 46578, 46582, 46586, 46590, - 46594, 46598, 46602, 46606, 46610, 46614, 46618, 46622, 46626, 46630, - 46634, 46638, 46642, 46645, 46649, 46653, 46657, 46661, 46665, 46669, - 46673, 46677, 46681, 46685, 46689, 46693, 46697, 46701, 46705, 46709, - 46713, 46717, 46721, 46725, 46729, 46733, 46737, 46741, 46745, 46749, - 46753, 46757, 46761, 46765, 46769, 46773, 46777, 46781, 46785, 46789, - 46793, 46797, 46801, 46805, 46809, 46813, 46817, 46821, 46825, 46829, - 46833, 46837, 46841, 46845, 46849, 46853, 46857, 46861, 46865, 46869, - 46873, 46877, 46881, 46885, 46889, 46893, 46897, 46901, 46905, 46909, - 46913, 46917, 46921, 46925, 46929, 46933, 46937, 46941, 46945, 46949, - 46953, 46957, 46961, 46965, 46969, 46973, 46977, 46981, 46985, 46988, - 46992, 46996, 47000, 47004, 47008, 47012, 47016, 47020, 47024, 47028, - 47032, 47036, 47040, 47044, 47048, 47052, 47056, 47060, 47064, 47068, - 47072, 47076, 47080, 47084, 47088, 47092, 47096, 47100, 47104, 47107, - 47111, 47115, 47119, 47123, 47127, 47131, 47135, 47139, 47143, 47147, - 47151, 47155, 47159, 47163, 47167, 47171, 47175, 47179, 47183, 47187, - 47191, 47195, 47199, 47203, 47207, 47211, 47215, 47219, 47223, 47227, - 47231, 47235, 47239, 47243, 47247, 47251, 47255, 47259, 47263, 47267, - 47271, 47275, 47279, 47283, 47287, 47291, 47295, 47299, 47303, 47307, - 47311, 47315, 47319, 47323, 47327, 47331, 47335, 47339, 47343, 47347, - 47351, 47355, 47359, 47363, 47367, 47371, 47375, 47379, 47383, 47387, - 47391, 47395, 47399, 47403, 47407, 47411, 47415, 47419, 47423, 47427, - 47431, 47435, 47439, 47443, 47447, 47451, 47455, 47459, 47463, 47467, - 47471, 47475, 47479, 47483, 47487, 47491, 47495, 47499, 47503, 47507, - 47511, 47515, 47519, 47523, 47527, 47531, 47535, 47539, 47543, 47547, - 47551, 47555, 47559, 47563, 47567, 47571, 47575, 47579, 47583, 47587, - 47591, 47595, 47599, 47603, 47607, 47611, 47615, 47619, 47623, 47627, - 47631, 47635, 47639, 47643, 47647, 47651, 47655, 47659, 47663, 47667, - 47671, 47675, 47679, 47683, 47687, 47691, 47695, 47699, 47703, 47707, - 47711, 47715, 47719, 47723, 47727, 47731, 47735, 47739, 47743, 47747, - 47751, 47755, 47759, 47763, 47767, 47771, 47775, 47779, 47783, 47787, - 47791, 47795, 47799, 47803, 47807, 47811, 47815, 47819, 47823, 47827, - 47831, 47835, 47839, 47843, 47847, 47851, 47855, 47859, 47863, 47867, - 47871, 47875, 47879, 47883, 47887, 47891, 47895, 47899, 47903, 47907, - 47911, 47915, 47919, 47923, 47927, 47931, 47935, 47939, 47943, 47947, - 47951, 47955, 47959, 47962, 47966, 47970, 47974, 47978, 47982, 47986, - 47990, 47994, 47998, 48002, 48006, 48010, 48014, 48018, 48022, 48026, - 48030, 48034, 48038, 48042, 48046, 48050, 48054, 48058, 48062, 48066, - 48070, 48074, 48078, 48082, 48086, 48090, 48094, 48098, 48102, 48106, - 48110, 48114, 48118, 48122, 48126, 48130, 48134, 48138, 48142, 48146, - 48150, 48154, 48158, 48162, 48166, 48170, 48174, 48178, 48182, 48186, - 48190, 48194, 48198, 48202, 48206, 48210, 48214, 48218, 48222, 48226, - 48230, 48234, 48238, 48242, 48246, 48250, 48254, 48258, 48262, 48266, - 48270, 48274, 48278, 48282, 48286, 48290, 48294, 48298, 48302, 48306, - 48310, 48314, 48318, 48322, 48326, 48330, 48334, 48338, 48342, 48346, - 48350, 48354, 48358, 48362, 48366, 48370, 48374, 48378, 48382, 48386, - 48390, 48394, 48398, 48402, 48406, 48410, 48414, 48418, 48422, 48426, - 48430, 48434, 48438, 48442, 48446, 48450, 48454, 48458, 48462, 48466, - 48470, 48474, 48478, 48482, 48486, 48490, 48494, 48498, 48502, 48506, - 48510, 48514, 48518, 48522, 48526, 48530, 48534, 48538, 48542, 48546, - 48550, 48554, 48558, 48562, 48566, 48570, 48574, 48578, 48582, 48586, - 48590, 48594, 48598, 48602, 48606, 48610, 48614, 48618, 48622, 48626, - 48630, 48634, 48638, 48642, 48646, 48650, 48654, 48658, 48662, 48666, - 48670, 48674, 48678, 48682, 48686, 48690, 48694, 48698, 48702, 48706, - 48710, 48714, 48718, 48722, 48726, 48730, 48734, 48738, 48742, 48746, - 48750, 48754, 48758, 48762, 48766, 48770, 48774, 48778, 48782, 48786, - 48790, 48794, 48798, 48802, 48806, 48810, 48814, 48818, 48822, 48826, - 48830, 48834, 48838, 48842, 48846, 48850, 48854, 48858, 48862, 48866, - 48870, 48874, 48878, 48882, 48886, 48890, 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, 49021, 49025, - 49029, 49033, 49037, 49041, 49045, 49049, 49053, 49057, 49061, 49065, - 49069, 49073, 49077, 49081, 49085, 49089, 49093, 49097, 49101, 49105, - 49109, 49113, 49117, 49121, 49125, 49129, 49133, 49137, 49141, 49145, - 49149, 49153, 49157, 49161, 49165, 49169, 49173, 49177, 49181, 49185, - 49189, 49193, 49197, 49201, 49205, 49209, 49213, 49217, 49221, 49225, - 49229, 49233, 49237, 49241, 49245, 49249, 49253, 49257, 49261, 49265, - 49269, 49273, 49277, 49281, 49285, 49289, 49293, 49297, 49301, 49305, - 49309, 49313, 49317, 49321, 49325, 49329, 49333, 49337, 49341, 49345, - 49349, 49353, 49357, 49361, 49365, 49369, 49373, 49377, 49381, 49385, - 49389, 49393, 49397, 49401, 49405, 49409, 49413, 49417, 49421, 49425, - 49429, 49433, 49437, 49441, 49445, 49449, 49453, 49457, 49461, 49465, - 49469, 49473, 49477, 49481, 49485, 49489, 49493, 49497, 49501, 49505, - 49509, 49513, 49517, 49521, 49525, 49529, 49533, 49537, 49541, 49545, - 49549, 49553, 49557, 49561, 49565, 49569, 49573, 49577, 49581, 49585, - 49589, 49593, 49597, 49601, 49605, 49609, 49613, 49617, 49621, 49625, - 49629, 49633, 49637, 49641, 49645, 49649, 49653, 49657, 49661, 49665, - 49669, 49673, 49677, 49681, 49685, 49689, 49693, 49697, 49701, 49705, - 49709, 49713, 49717, 49721, 49725, 49729, 49733, 49737, 49741, 49745, - 49749, 49753, 49757, 49761, 49765, 49769, 49773, 49777, 49781, 49785, - 49789, 49793, 49797, 49801, 49805, 49809, 49813, 49817, 49821, 49825, - 49829, 49833, 49837, 49841, 49845, 49849, 49853, 49857, 49861, 49865, - 49869, 49873, 49877, 49881, 49885, 49889, 49893, 49897, 49901, 49905, - 49909, 49913, 49917, 49921, 49925, 49929, 49933, 49937, 49941, 49945, - 49949, 49953, 49957, 49961, 49965, 49969, 49973, 49977, 49981, 49985, - 49989, 49993, 49997, 50001, 50005, 50009, 50013, 50017, 50021, 50025, - 50029, 50033, 50037, 50041, 50045, 50049, 50053, 50057, 50061, 50065, - 50069, 50073, 50077, 50081, 50085, 50089, 50093, 50097, 50101, 50105, - 50109, 50113, 50117, 50121, 50125, 50129, 50133, 50137, 50141, 50145, - 50149, 50153, 50157, 50161, 50165, 50169, 50173, 50177, 50181, 50185, - 50189, 50193, 50197, 50201, 50205, 50209, 50213, 50217, 50221, 50225, - 50229, 50233, 50237, 50241, 50245, 50249, 50253, 50257, 50261, 50265, - 50269, 50273, 50277, 50281, 50285, 50289, 50293, 50297, 50301, 50305, - 50309, 50313, 50317, 50321, 50325, 50329, 50333, 50337, 50341, 50345, - 50349, 50353, 50357, 50361, 50365, 50369, 50373, 50377, 50381, 50385, - 50389, 50393, 50397, 50401, 50405, 50409, 50413, 50417, 50421, 50425, - 50429, 50433, 50437, 50441, 50445, 50449, 50453, 50457, 50461, 50465, - 50469, 50473, 50477, 50481, 50485, 50489, 50493, 50497, 50501, 50505, - 50509, 50513, 50517, 50521, 50525, 50529, 50533, 50537, 50541, 50545, - 50549, 50553, 50557, 50561, 0, 0, 0, 50565, 50569, 50573, 50577, 50581, - 50585, 50589, 50593, 50597, 50601, 50605, 50609, 50613, 50617, 50621, - 50625, 50629, 50633, 50637, 50641, 50645, 50649, 50653, 50657, 50661, - 50665, 50669, 50673, 50677, 50681, 50685, 50689, 50693, 50697, 50701, - 50705, 50709, 50713, 50717, 50721, 50725, 50729, 50733, 50737, 50741, - 50745, 50749, 50753, 50757, 50761, 50765, 50769, 50773, 50777, 50781, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50785, 50789, 50793, 50797, 50801, 50805, 50809, - 50813, 50817, 50821, 50825, 50829, 50833, 50837, 50841, 50845, 50849, - 50853, 50857, 50861, 50865, 50869, 50873, 50877, 50881, 50885, 50889, - 50893, 50897, 50901, 50905, 50909, 50913, 50917, 50921, 50925, 50929, - 50933, 50937, 50941, 50945, 50949, 50953, 50957, 50961, 50965, 50969, - 50973, 50977, 50981, 50985, 50989, 50993, 50997, 51001, 51005, 51009, - 51013, 51017, 51021, 51025, 51029, 51033, 51037, 51041, 51045, 51049, - 51053, 51057, 51061, 51065, 51069, 51073, 51077, 51081, 51085, 51089, - 51093, 51097, 51101, 51105, 51109, 51113, 51117, 51121, 51125, 51129, - 51133, 51137, 51141, 51145, 51149, 51153, 51157, 51161, 51165, 51169, - 51173, 51177, 51181, 51185, 51189, 51193, 51197, 51201, 51205, 51209, - 51213, 51217, 51221, 51225, 51229, 51233, 51237, 51241, 51245, 51249, - 51253, 51257, 51261, 51265, 51269, 51273, 51277, 51281, 51285, 51289, - 51293, 51297, 51301, 51305, 51309, 51313, 51317, 51321, 51325, 51329, - 51333, 51337, 51341, 51345, 51349, 51353, 51357, 51361, 51365, 51369, - 51373, 51377, 51381, 51385, 51389, 51393, 51397, 51401, 51405, 51409, - 51413, 51417, 51421, 51425, 51429, 51433, 51437, 51441, 51445, 51449, - 51453, 51457, 51461, 51465, 51469, 51473, 51477, 51481, 51485, 51489, - 51493, 51497, 51501, 51505, 51509, 51513, 51517, 51521, 51525, 51529, - 51533, 51537, 51541, 51545, 51549, 51553, 51557, 51561, 51565, 51569, - 51573, 51577, 51581, 51585, 51589, 51593, 51597, 51601, 51605, 51609, - 51613, 51617, 51621, 51625, 51629, 51633, 51637, 51641, 51645, 51649, - 51653, 51657, 51661, 51665, 51669, 51673, 51677, 51681, 51685, 51689, - 51693, 51697, 51701, 51705, 51709, 51713, 51717, 51721, 51725, 51729, - 51733, 51737, 51741, 51745, 51749, 51753, 51757, 51761, 51765, 51769, - 51773, 51777, 51781, 51785, 51789, 51793, 51797, 51801, 51805, 51809, - 51813, 51817, 51821, 51825, 51829, 51833, 51837, 51841, 51845, 51849, - 51853, 51857, 51861, 51865, 51869, 51873, 51877, 51881, 51885, 51889, - 51893, 51897, 51901, 51905, 51909, 51913, 51917, 51921, 51925, 51929, - 51933, 51937, 51941, 51945, 51949, 51953, 51957, 51961, 51965, 51969, - 51973, 51977, 51981, 51985, 51989, 0, 0, 51993, 51997, 52001, 52005, - 52009, 52013, 52017, 52021, 52025, 52029, 52033, 52037, 52041, 52045, - 52049, 52053, 52057, 52061, 52065, 52069, 52073, 52077, 52081, 52085, - 52089, 52093, 52097, 52101, 52105, 52109, 52113, 52117, 52121, 52125, - 52129, 52133, 52137, 52141, 52145, 52149, 52153, 52157, 52161, 52165, - 52169, 52173, 52177, 52181, 52185, 52189, 52193, 52197, 52201, 52205, - 52209, 52213, 52217, 52221, 52225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52229, 52234, 52239, - 52244, 52249, 52254, 52261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52266, - 52273, 52280, 52287, 52294, 0, 0, 0, 0, 0, 52301, 52308, 52315, 52325, - 52331, 52337, 52343, 52349, 52355, 52361, 52368, 52374, 52380, 52387, - 52395, 52403, 52414, 52425, 52431, 52437, 52443, 52450, 52457, 52464, - 52471, 52478, 0, 52485, 52492, 52499, 52507, 52514, 0, 52521, 0, 52528, - 52535, 0, 52542, 52550, 0, 52557, 52564, 52571, 52578, 52585, 52592, - 52599, 52606, 52613, 52620, 52625, 52632, 52639, 52645, 52651, 52657, - 52663, 52669, 52675, 52681, 52687, 52693, 52699, 52705, 52711, 52717, - 52723, 52729, 52735, 52741, 52747, 52753, 52759, 52765, 52771, 52777, - 52783, 52789, 52795, 52801, 52807, 52813, 52819, 52825, 52831, 52837, - 52843, 52849, 52855, 52861, 52867, 52873, 52879, 52885, 52891, 52897, - 52903, 52909, 52915, 52921, 52927, 52933, 52939, 52945, 52951, 52957, - 52963, 52969, 52975, 52981, 52987, 52993, 52999, 53005, 53011, 53017, - 53023, 53029, 53035, 53041, 53047, 53053, 53059, 53065, 53071, 53077, - 53083, 53089, 53095, 53102, 53109, 53115, 53121, 53127, 53133, 53141, - 53149, 53156, 53163, 53170, 53177, 53184, 53191, 53198, 53205, 53212, - 53219, 53229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53239, 53245, 53251, 53257, 53263, - 53268, 53273, 53279, 53285, 53291, 53297, 53305, 53311, 53317, 53325, - 53333, 53341, 53349, 53354, 53359, 53364, 53369, 53381, 53393, 53403, - 53413, 53424, 53435, 53446, 53457, 53467, 53477, 53488, 53499, 53510, - 53521, 53531, 53541, 53551, 53566, 53581, 53596, 53603, 53610, 53617, - 53624, 53634, 53644, 53654, 53665, 53675, 53683, 53691, 53699, 53707, - 53716, 53724, 53731, 53738, 53745, 53752, 53760, 53767, 53775, 53783, - 53792, 53800, 53807, 53814, 53821, 53828, 53835, 53842, 53849, 53856, - 53863, 53870, 53877, 53885, 53893, 53901, 53909, 53917, 53925, 53933, - 53941, 53949, 53957, 53965, 53973, 53981, 53989, 53997, 54005, 54013, - 54022, 54030, 54038, 54046, 54055, 54063, 54071, 54079, 54087, 54095, - 54103, 54111, 54120, 54128, 54135, 54142, 54149, 54156, 54164, 54171, - 54178, 54185, 54192, 54199, 54207, 54214, 54221, 54228, 54235, 54242, - 54250, 54257, 54264, 54271, 54279, 54286, 54293, 54300, 54307, 54314, - 54322, 54329, 54339, 54349, 54359, 54368, 54377, 54386, 54395, 54404, - 54414, 54425, 54436, 54446, 54456, 54467, 54477, 54486, 54495, 54503, - 54511, 54520, 54528, 54536, 54544, 54551, 54558, 54566, 54573, 54582, - 54591, 54599, 54607, 54616, 54624, 54633, 54641, 54650, 54658, 54666, - 54674, 54682, 54691, 54699, 54706, 54714, 54721, 54728, 54735, 54743, - 54751, 54758, 54765, 54773, 54780, 54790, 54798, 54806, 54813, 54820, - 54828, 54835, 54845, 54855, 54865, 54875, 54885, 54893, 54901, 54909, - 54917, 54925, 54932, 54939, 54946, 54953, 54960, 54968, 54975, 54982, - 54989, 54996, 55003, 55010, 55017, 55024, 55031, 55038, 55046, 55054, - 55062, 55070, 55078, 55086, 55094, 55102, 55110, 55118, 55126, 55134, - 55142, 55150, 55158, 55166, 55174, 55182, 55190, 55198, 55206, 55214, - 55222, 55230, 55237, 55244, 55251, 55258, 55265, 55272, 55279, 55286, - 55293, 55300, 55307, 55314, 55321, 55328, 55335, 55342, 55351, 55358, - 55365, 55372, 55379, 55386, 55396, 55406, 55414, 55422, 55429, 55436, - 55444, 55452, 55459, 55466, 55473, 55480, 55488, 55496, 55503, 55510, - 55517, 55524, 55531, 55540, 55549, 55558, 55567, 55575, 55584, 55592, - 55601, 55609, 55617, 55624, 55632, 55639, 55647, 55654, 55662, 55669, - 55677, 55684, 55693, 55701, 55710, 55718, 55725, 55732, 55739, 55746, - 55754, 55762, 55771, 55780, 55789, 55797, 55806, 55814, 55823, 55831, - 55839, 55846, 55854, 55861, 55869, 55876, 55884, 55891, 55899, 55906, - 55915, 55923, 55932, 55940, 55947, 55954, 55961, 55968, 55976, 55984, - 55993, 56002, 56009, 56016, 56023, 56030, 56037, 56044, 56052, 56059, - 56066, 56073, 56080, 56087, 56094, 56102, 56110, 56118, 56126, 56131, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56136, 56145, 56154, 56163, - 56172, 56181, 56190, 56199, 56208, 56217, 56226, 56235, 56245, 56254, - 56263, 56273, 56282, 56291, 56300, 56309, 56318, 56328, 56338, 56348, - 56357, 56366, 56375, 56384, 56393, 56402, 56411, 56422, 56432, 56442, - 56452, 56462, 56472, 56482, 56492, 56502, 56512, 56523, 56533, 56543, - 56554, 56564, 56574, 56584, 56594, 56603, 56612, 56622, 56631, 56640, - 56649, 56658, 56667, 56676, 56685, 56694, 56703, 56712, 56721, 56730, 0, - 0, 56739, 56748, 56757, 56766, 56775, 56785, 56794, 56803, 56813, 56822, - 56832, 56841, 56850, 56860, 56869, 56879, 56888, 56898, 56907, 56917, - 56926, 56936, 56946, 56956, 56966, 56975, 56985, 56994, 57003, 57012, - 57021, 57030, 57039, 57049, 57058, 57068, 57077, 57087, 57097, 57106, - 57115, 57124, 57134, 57143, 57152, 57161, 57170, 57179, 57189, 57199, - 57209, 57219, 57229, 57238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 57247, 57262, 57277, 57283, 57289, 57295, 57301, 57307, 57313, 57319, - 57325, 57333, 57337, 0, 0, 0, 57340, 57344, 57348, 57352, 57356, 57360, - 57364, 57368, 57372, 57376, 57380, 57384, 57388, 57392, 57396, 57400, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57404, 57409, 57414, 57420, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57426, 57436, 57446, 57456, 57466, - 57478, 57487, 57496, 57506, 57516, 57528, 57540, 57551, 57562, 57572, - 57582, 57591, 57600, 57610, 57620, 57631, 57642, 57645, 0, 0, 57649, - 57653, 57657, 57661, 57666, 57672, 57678, 57684, 57687, 57691, 0, 57694, - 57697, 57700, 57704, 57708, 57713, 57717, 57721, 57726, 57731, 57738, - 57745, 57748, 57751, 57754, 57758, 57761, 57764, 57767, 0, 57771, 57776, - 57780, 57784, 0, 0, 0, 0, 57789, 57794, 57801, 57806, 57811, 0, 57816, - 57821, 57826, 57831, 57836, 57841, 57846, 57851, 57856, 57861, 57866, - 57871, 57880, 57889, 57897, 57905, 57914, 57923, 57932, 57941, 57949, - 57957, 57965, 57973, 57978, 57983, 57989, 57995, 58001, 58007, 58014, - 58021, 58026, 58031, 58036, 58041, 58047, 58053, 58059, 58065, 58070, - 58075, 58080, 58085, 58090, 58095, 58100, 58105, 58110, 58115, 58120, - 58125, 58131, 58137, 58143, 58149, 58155, 58161, 58167, 58173, 58178, - 58183, 58188, 58193, 58198, 58203, 58208, 58213, 58219, 58225, 58231, - 58237, 58243, 58249, 58255, 58261, 58267, 58273, 58279, 58285, 58291, - 58297, 58303, 58309, 58315, 58321, 58327, 58333, 58339, 58345, 58351, - 58357, 58363, 58369, 58375, 58381, 58387, 58393, 58399, 58405, 58411, - 58417, 58423, 58429, 58434, 58439, 58444, 58449, 58454, 58459, 58464, - 58469, 58474, 58479, 58484, 58489, 58494, 58499, 58504, 58509, 58515, - 58521, 58527, 58533, 58538, 58543, 58548, 58553, 58564, 58575, 58585, - 58595, 58606, 58617, 58624, 0, 0, 58631, 0, 58639, 58643, 58647, 58650, - 58654, 58658, 58661, 58664, 58668, 58672, 58675, 58679, 58682, 58685, - 58688, 58691, 58695, 58698, 58701, 58704, 58707, 58710, 58713, 58716, - 58719, 58722, 58725, 58728, 58731, 58735, 58738, 58742, 58747, 58752, - 58757, 58762, 58767, 58772, 58777, 58782, 58787, 58792, 58797, 58802, - 58807, 58812, 58817, 58822, 58827, 58832, 58837, 58842, 58847, 58852, - 58857, 58862, 58867, 58872, 58877, 58881, 58886, 58890, 58894, 58899, - 58904, 58909, 58914, 58919, 58924, 58929, 58934, 58939, 58944, 58949, - 58954, 58959, 58964, 58969, 58974, 58979, 58984, 58989, 58994, 58999, - 59004, 59009, 59014, 59019, 59024, 59029, 59034, 59039, 59043, 59048, - 59050, 59055, 59060, 59064, 59069, 59074, 59078, 59083, 59088, 59093, - 59098, 59103, 59108, 59113, 59118, 59124, 59130, 59136, 59144, 59148, - 59152, 59156, 59160, 59164, 59168, 59173, 59178, 59183, 59188, 59193, - 59198, 59203, 59208, 59213, 59218, 59223, 59228, 59233, 59237, 59242, - 59247, 59252, 59257, 59262, 59267, 59272, 59277, 59282, 59287, 59291, - 59296, 59301, 59306, 59311, 59315, 59320, 59325, 59330, 59335, 59340, - 59345, 59350, 59355, 59359, 59366, 59373, 59377, 59382, 59387, 59392, - 59397, 59402, 59407, 59412, 59417, 59422, 59427, 59432, 59437, 59442, - 59447, 59452, 59457, 59462, 59467, 59472, 59477, 59482, 59487, 59492, - 59497, 59502, 59507, 59512, 59517, 59522, 0, 0, 0, 59527, 59531, 59536, - 59540, 59545, 59550, 0, 0, 59554, 59559, 59564, 59568, 59573, 59578, 0, - 0, 59583, 59588, 59592, 59597, 59602, 59607, 0, 0, 59612, 59617, 59622, - 0, 0, 0, 59626, 59630, 59634, 59637, 59639, 59643, 59647, 0, 59651, - 59657, 59660, 59663, 59666, 59669, 59673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 59677, 59683, 59689, 59695, 59701, 0, 0, 59705, 59709, 59714, 59719, - 59724, 59728, 59733, 59738, 59743, 59748, 59752, 59756, 59761, 59766, - 59771, 59776, 59780, 59785, 59790, 59795, 59800, 59805, 59810, 59814, - 59819, 59824, 59829, 59834, 59839, 59844, 59849, 0, 59854, 59858, 59862, - 59867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59872, 59877, 59882, 59887, - 59892, 59897, 59902, 59907, 59912, 59917, 59922, 59927, 59932, 59937, - 59942, 59947, 59952, 59957, 59962, 59967, 59972, 59977, 59982, 59987, - 59992, 59997, 60002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60009, 60014, - 60019, 60024, 60030, 60035, 60041, 60046, 60051, 60056, 60062, 60067, - 60073, 60078, 60083, 60088, 60093, 60097, 60102, 60107, 60112, 60117, - 60122, 60127, 60132, 60137, 60142, 60147, 60152, 60157, 60162, 60167, - 60172, 60177, 60182, 60187, 60192, 60197, 0, 0, 60202, 60207, 60212, - 60217, 60223, 60228, 60234, 60239, 60244, 60249, 60255, 60260, 60266, - 60271, 60276, 60281, 60286, 60290, 60295, 60300, 60305, 60310, 60315, - 60320, 60325, 60330, 60335, 60340, 60345, 60350, 60355, 60360, 60365, - 60370, 60375, 60380, 60385, 60390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60395, - 60400, 60405, 60410, 60417, 60424, 60431, 60438, 60443, 60448, 60453, - 60458, 60465, 60470, 60477, 60484, 60489, 60494, 60499, 60506, 60511, - 60516, 60523, 60530, 60535, 60540, 60545, 60552, 60559, 60566, 60571, - 60576, 60583, 60590, 60597, 60604, 60609, 60614, 60619, 60626, 60631, - 60636, 60641, 60648, 60657, 60664, 60669, 60674, 60679, 60684, 60689, - 60694, 60703, 60710, 60715, 60722, 60729, 60734, 60739, 60744, 60751, - 60756, 60763, 60770, 60775, 60780, 60785, 60792, 60799, 60804, 60809, - 60816, 60823, 60830, 60835, 60840, 60845, 60850, 60857, 60866, 60875, - 60880, 60887, 60896, 60901, 60906, 60911, 60916, 60923, 60930, 60937, - 60944, 60949, 60954, 60959, 60966, 60973, 60980, 60985, 60990, 60997, - 61002, 61009, 61014, 61021, 61026, 61033, 61040, 61045, 61050, 61055, - 61060, 61065, 61070, 61075, 61080, 61085, 61092, 61099, 61106, 61113, - 61120, 61129, 61134, 61139, 61146, 61153, 61158, 61165, 61172, 61179, - 61186, 61193, 61200, 61205, 61210, 61215, 61220, 61225, 61234, 61243, - 61252, 61261, 61270, 61279, 61288, 61297, 61302, 61313, 61324, 61333, - 61338, 61343, 61348, 61353, 61362, 61369, 61376, 61383, 61390, 61397, - 61404, 61413, 61422, 61433, 61442, 61453, 61462, 61469, 61478, 61489, - 61498, 61507, 61516, 61525, 61532, 61539, 61546, 61555, 61564, 61575, - 61584, 61593, 61604, 61609, 61614, 61625, 61634, 61643, 61652, 61661, - 61672, 61681, 61690, 61701, 61712, 61723, 61734, 61745, 61756, 61763, - 61770, 61777, 61784, 61794, 61803, 61810, 61817, 61824, 61835, 61846, - 61857, 61868, 61879, 61890, 61901, 61912, 61919, 61926, 61935, 61944, - 61951, 61958, 61965, 61974, 61983, 61992, 61999, 62008, 62017, 62026, - 62033, 62040, 62045, 62052, 62059, 62066, 62073, 62080, 62087, 62094, - 62103, 62112, 62121, 62130, 62137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62146, - 62152, 62157, 62162, 62169, 62175, 62180, 62186, 62192, 62198, 62204, - 62210, 62214, 62218, 62224, 62230, 62236, 62240, 62245, 62250, 62254, - 62258, 62261, 62267, 62273, 62279, 62285, 62291, 62297, 62303, 62309, - 62315, 62325, 62335, 62341, 62347, 62357, 62367, 62373, 0, 0, 0, 62379, - 62384, 62389, 62395, 62401, 62407, 62413, 62419, 62425, 62433, 62441, - 62447, 62453, 62459, 62465, 62471, 62477, 62483, 62489, 62494, 62500, - 62506, 62512, 62518, 62524, 62534, 62540, 62546, 62553, 62560, 62567, - 62576, 62585, 62594, 62603, 62612, 62621, 62630, 62639, 62649, 62659, - 62667, 62675, 62684, 62693, 62699, 62705, 62711, 62717, 62725, 62733, - 62736, 62742, 62747, 62753, 62759, 62765, 62771, 62777, 62787, 62792, - 62799, 62804, 62809, 62814, 62820, 62826, 62832, 62838, 62843, 62848, - 62853, 62858, 62863, 62869, 62875, 62881, 62887, 62893, 62899, 62905, - 62911, 62916, 62921, 62926, 62931, 62936, 62941, 62946, 62951, 62957, - 62963, 62968, 62973, 62978, 62983, 62988, 62994, 63001, 63005, 63009, - 63012, 63016, 63020, 63024, 63028, 63032, 63040, 63050, 63054, 63058, - 63064, 63070, 63076, 63082, 63088, 63094, 63100, 63106, 63112, 63118, - 63124, 63130, 63136, 63142, 63146, 63150, 63157, 63163, 63169, 63175, - 63180, 63187, 63192, 63198, 63204, 63210, 63216, 63221, 63225, 63231, - 63235, 63239, 63243, 63249, 63255, 63259, 63265, 63271, 63277, 63283, - 63289, 63297, 63305, 63311, 63317, 63323, 63329, 63341, 63353, 63367, - 63379, 63391, 63405, 63419, 63433, 63437, 63445, 63453, 63457, 63461, - 63465, 63469, 63473, 63477, 63481, 63485, 63491, 63497, 63503, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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, 0, 63849, 63853, - 63857, 63861, 63865, 63869, 63873, 63877, 63881, 63885, 63889, 63893, - 63897, 63901, 63905, 63909, 63913, 63917, 63921, 63926, 63931, 63936, - 63941, 63946, 63951, 63956, 63961, 63966, 63971, 63976, 63981, 63986, - 63991, 63996, 64001, 64006, 64011, 64016, 64021, 64026, 64031, 64036, - 64041, 64046, 64051, 64056, 64061, 64066, 64071, 64076, 64081, 64086, - 64091, 64096, 64101, 64106, 64111, 64116, 64121, 64126, 64131, 64136, - 64141, 64146, 64151, 64156, 64161, 64166, 64171, 64176, 64181, 0, 64185, - 64189, 0, 0, 64193, 0, 0, 64197, 64201, 0, 0, 64205, 64209, 64213, 64217, - 0, 64221, 64225, 64229, 64233, 64237, 64241, 64245, 64249, 64253, 64257, - 64261, 64265, 0, 64269, 0, 64273, 64277, 64281, 64285, 0, 64289, 64293, - 0, 64297, 64301, 64305, 64309, 64313, 64317, 64321, 64325, 64329, 64333, - 64337, 64341, 64346, 64351, 64356, 64361, 64366, 64371, 64376, 64381, - 64386, 64391, 64396, 64401, 64406, 64411, 64416, 64421, 64426, 64431, - 64436, 64441, 64446, 64451, 64456, 64461, 64466, 64471, 64476, 64481, - 64486, 64491, 64496, 64501, 64506, 64511, 64516, 64521, 64526, 64531, - 64536, 64541, 64546, 64551, 64556, 64561, 64566, 64571, 64576, 64581, - 64586, 64591, 64596, 64601, 64605, 0, 64609, 64613, 64617, 64621, 0, 0, - 64625, 64629, 64633, 64637, 64641, 64645, 64649, 64653, 0, 64657, 64661, - 64665, 64669, 64673, 64677, 64681, 0, 64685, 64689, 64693, 64697, 64701, - 64705, 64709, 64713, 64717, 64721, 64725, 64729, 64733, 64737, 64741, - 64745, 64749, 64753, 64757, 64761, 64765, 64769, 64773, 64777, 64781, - 64785, 64789, 64793, 0, 64797, 64801, 64805, 64809, 0, 64813, 64817, - 64821, 64825, 64829, 0, 64833, 0, 0, 0, 64837, 64841, 64845, 64849, - 64853, 64857, 64861, 0, 64865, 64869, 64873, 64877, 64881, 64885, 64889, - 64893, 64897, 64901, 64905, 64909, 64913, 64917, 64921, 64925, 64929, - 64933, 64937, 64941, 64945, 64949, 64953, 64957, 64961, 64965, 64969, - 64974, 64979, 64984, 64989, 64994, 64999, 65004, 65009, 65014, 65019, - 65024, 65029, 65034, 65039, 65044, 65049, 65054, 65059, 65064, 65069, - 65074, 65079, 65084, 65089, 65094, 65099, 65104, 65109, 65114, 65119, - 65124, 65129, 65134, 65139, 65144, 65149, 65154, 65159, 65164, 65169, - 65174, 65179, 65184, 65189, 65194, 65199, 65204, 65209, 65214, 65219, - 65224, 65229, 65233, 65237, 65241, 65245, 65249, 65253, 65257, 65261, - 65265, 65269, 65273, 65277, 65281, 65285, 65289, 65293, 65297, 65301, - 65305, 65309, 65313, 65317, 65321, 65325, 65329, 65333, 65337, 65341, - 65345, 65349, 65353, 65357, 65361, 65365, 65369, 65373, 65377, 65381, - 65385, 65389, 65393, 65397, 65401, 65405, 65409, 65413, 65417, 65421, - 65425, 65429, 65433, 65437, 65442, 65447, 65452, 65457, 65462, 65467, - 65472, 65477, 65482, 65487, 65492, 65497, 65502, 65507, 65512, 65517, - 65522, 65527, 65532, 65537, 65542, 65547, 65552, 65557, 65562, 65567, - 65572, 65577, 65582, 65587, 65592, 65597, 65602, 65607, 65612, 65617, - 65622, 65627, 65632, 65637, 65642, 65647, 65652, 65657, 65662, 65667, - 65672, 65677, 65682, 65687, 65692, 65697, 65702, 65707, 65712, 65717, - 65722, 65727, 65732, 65737, 65742, 65747, 65752, 65757, 65762, 65767, - 65772, 65777, 65782, 65787, 65792, 65797, 65802, 65807, 65812, 65817, - 65822, 65827, 65832, 65837, 65842, 65847, 65852, 65857, 65862, 65867, - 65872, 65877, 65882, 65887, 65892, 65897, 65902, 65907, 65912, 65917, - 65922, 65927, 65932, 65937, 65942, 65947, 65952, 65957, 65963, 65969, - 65975, 65981, 65987, 65993, 65999, 66005, 66011, 66017, 66023, 66029, - 66035, 66041, 66047, 66053, 66059, 66065, 66071, 66077, 66083, 66089, - 66095, 66101, 66107, 66113, 66119, 66125, 66131, 66137, 66143, 66149, - 66155, 66161, 66167, 66173, 66179, 66185, 66191, 66197, 66203, 66209, - 66215, 66221, 66227, 66233, 66239, 66245, 66251, 66257, 66263, 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, 0, 0, 0, 0, 66477, 66482, 66487, 66492, 66497, 66502, 66507, - 66512, 66517, 66522, 66527, 66532, 66537, 66542, 66547, 66552, 66557, - 66562, 66568, 66573, 66578, 66583, 66588, 66593, 66598, 66603, 66607, - 66612, 66617, 66622, 66627, 66632, 66637, 66642, 66647, 66652, 66657, - 66662, 66667, 66672, 66677, 66682, 66687, 66692, 66698, 66703, 66708, - 66713, 66718, 66723, 66728, 66733, 66739, 66744, 66749, 66754, 66759, - 66764, 66769, 66774, 66779, 66784, 66789, 66794, 66799, 66804, 66809, - 66814, 66819, 66824, 66829, 66834, 66839, 66844, 66849, 66854, 66860, - 66865, 66870, 66875, 66880, 66885, 66890, 66895, 66899, 66904, 66909, - 66914, 66919, 66924, 66929, 66934, 66939, 66944, 66949, 66954, 66959, - 66964, 66969, 66974, 66979, 66984, 66990, 66995, 67000, 67005, 67010, - 67015, 67020, 67025, 67031, 67036, 67041, 67046, 67051, 67056, 67061, - 67067, 67073, 67079, 67085, 67091, 67097, 67103, 67109, 67115, 67121, - 67127, 67133, 67139, 67145, 67151, 67157, 67163, 67170, 67176, 67182, - 67188, 67194, 67200, 67206, 67212, 67217, 67223, 67229, 67235, 67241, - 67247, 67253, 67259, 67265, 67271, 67277, 67283, 67289, 67295, 67301, - 67307, 67313, 67319, 67326, 67332, 67338, 67344, 67350, 67356, 67362, - 67368, 67375, 67381, 67387, 67393, 67399, 67405, 67411, 67417, 67423, - 67429, 67435, 67441, 67447, 67453, 67459, 67465, 67471, 67477, 67483, - 67489, 67495, 67501, 67507, 67513, 67520, 67526, 67532, 67538, 67544, - 67550, 67556, 67562, 67567, 67573, 67579, 67585, 67591, 67597, 67603, - 67609, 67615, 67621, 67627, 67633, 67639, 67645, 67651, 67657, 67663, - 67669, 67676, 67682, 67688, 67694, 67700, 67706, 67712, 67718, 67725, - 67731, 67737, 67743, 67749, 67755, 67761, 67768, 67775, 67782, 67789, - 67796, 67803, 67810, 67817, 67824, 67831, 67838, 67845, 67852, 67859, - 67866, 67873, 67880, 67888, 67895, 67902, 67909, 67916, 67923, 67930, - 67937, 67943, 67950, 67957, 67964, 67971, 67978, 67985, 67992, 67999, - 68006, 68013, 68020, 68027, 68034, 68041, 68048, 68055, 68062, 68070, - 68077, 68084, 68091, 68098, 68105, 68112, 68119, 68127, 68134, 68141, - 68148, 68155, 68162, 0, 0, 0, 0, 68169, 68174, 68178, 68182, 68186, - 68190, 68194, 68198, 68202, 68206, 68210, 68215, 68219, 68223, 68227, - 68231, 68235, 68239, 68243, 68247, 68251, 68256, 68260, 68264, 68268, - 68272, 68276, 68280, 68284, 68288, 68292, 68298, 68303, 68308, 68313, - 68318, 68323, 68328, 68333, 68338, 68343, 68348, 68352, 68356, 68360, - 68364, 68368, 68372, 68376, 68380, 68384, 68388, 68392, 68396, 68400, - 68404, 68408, 68412, 68416, 68420, 68424, 68428, 68432, 68436, 68440, - 68444, 68448, 68452, 68456, 68460, 68464, 68468, 68472, 68476, 68480, - 68484, 68488, 68492, 68496, 68500, 68504, 68508, 68512, 68516, 68520, - 68524, 68528, 68532, 68536, 68540, 68544, 68548, 68552, 68556, 68560, - 68564, 68568, 68572, 68576, 68580, 68584, 68588, 68592, 68596, 68600, - 68604, 68608, 68612, 68616, 68620, 68624, 68628, 68632, 68636, 68640, - 68644, 68648, 68652, 68656, 68660, 68664, 68668, 68672, 68676, 68680, - 68684, 68688, 68692, 68696, 68700, 68704, 68708, 68712, 68716, 68720, - 68724, 68728, 68732, 68736, 68740, 68744, 68748, 68752, 68756, 68760, - 68764, 68768, 68772, 68776, 68780, 68784, 68788, 68792, 68796, 68800, - 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836, 68840, - 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, - 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, - 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, - 68964, 68968, 68972, 68976, 68980, 68984, 68988, 68992, 68996, 69000, - 69004, 69008, 69012, 69016, 69020, 69024, 69028, 69032, 69036, 69040, - 69044, 69048, 69052, 69056, 69060, 69064, 69068, 69072, 69076, 69080, - 69084, 69088, 69092, 69096, 69100, 69104, 69108, 69112, 69116, 69120, - 69124, 69128, 69132, 69136, 69140, 69144, 69148, 69152, 69156, 69160, - 69164, 69168, 69172, 69176, 69180, 69184, 69188, 69192, 69196, 69200, - 69204, 69208, 69212, 69216, 69220, 69224, 69228, 69232, 69236, 69240, - 69244, 69248, 69252, 69256, 69260, 69264, 69268, 69272, 69276, 69280, - 69284, 69288, 69292, 69296, 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, 69476, 69480, - 69484, 69488, 69492, 69496, 69500, 69504, 69508, 69512, 69516, 69520, - 69524, 69528, 69532, 69536, 69540, 69544, 69548, 69552, 69556, 69560, - 69564, 69568, 69572, 69576, 69580, 69584, 69588, 69592, 69596, 69600, - 69604, 69608, 69612, 69616, 69620, 69624, 69628, 69632, 69636, 69640, - 69644, 69648, 69652, 69656, 69660, 69664, 69668, 69672, 69676, 69680, - 69684, 69688, 69692, 69696, 69700, 69704, 69708, 69712, 69716, 69720, - 69724, 69728, 69732, 69736, 69740, 69744, 69748, 69752, 69756, 69760, - 69764, 69768, 69772, 69776, 69780, 69784, 69788, 69792, 69796, 69800, - 69804, 69808, 69812, 69816, 69820, 69824, 69828, 69832, 69836, 69840, - 69844, 69848, 69852, 69856, 69860, 69864, 69868, 69872, 69876, 69880, - 69884, 69888, 69892, 69896, 69900, 69904, 69908, 69912, 69916, 69920, - 69924, 69928, 69932, 69936, 69940, 69944, 69948, 69952, 69956, 69960, - 69964, 69968, 69972, 69976, 69980, 69984, 69988, 69992, 69996, 70000, - 70004, 70008, 70012, 70016, 70020, 70024, 70028, 70032, 70036, 70040, - 70044, 70048, 70052, 70056, 70060, 70064, 70068, 70072, 70076, 70080, - 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, 70116, 70120, - 70124, 70128, 70132, 70136, 70140, 70144, 70148, 70152, 70156, 70160, - 70164, 70168, 70172, 70176, 70180, 70184, 70188, 70192, 70196, 70200, - 70204, 70208, 70212, 70216, 70220, 70224, 70228, 70232, 70236, 70240, - 70244, 70248, 70252, 70256, 70260, 70264, 70268, 70272, 70276, 70280, - 70284, 70288, 70292, 70296, 70300, 70304, 70308, 70312, 70316, 70320, - 70324, 70328, 70332, 70336, 70340, 70344, 70348, 70352, 70356, 70360, - 70364, 70368, 70372, 70376, 70380, 70384, 70388, 70392, 70396, 70400, - 70404, 70408, 70412, 70416, 70420, 70424, 70428, 70432, 70436, 70440, - 70444, 70448, 70452, 70456, 70460, 70464, 70468, 70472, 70476, 70480, - 70484, 70488, 70492, 70496, 70500, 70504, 70508, 70512, 70516, 70520, - 70524, 70528, 70532, 70536, 70540, 70544, 70548, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 70552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70556, 70559, 70563, 70567, 70570, - 70574, 70578, 70581, 70584, 70588, 70592, 70595, 70599, 70602, 70605, - 70608, 70611, 70615, 70618, 70621, 70624, 70627, 70630, 70633, 70636, - 70639, 70642, 70645, 70648, 70651, 70655, 70658, 70662, 70667, 70672, - 70677, 70682, 70687, 70692, 70697, 70702, 70707, 70712, 70717, 70722, - 70727, 70732, 70737, 70742, 70747, 70752, 70757, 70762, 70767, 70772, - 70777, 70782, 70787, 70792, 70797, 70801, 70806, 70810, 70814, 70819, - 70824, 70829, 70834, 70839, 70844, 70849, 70854, 70859, 70864, 70869, - 70874, 70879, 70884, 70889, 70894, 70899, 70904, 70909, 70914, 70919, - 70924, 70929, 70934, 70939, 70944, 70949, 70954, 70959, 70963, 70968, - 70970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17294, 17298, 17302, 17305, 17309, 17313, 17317, 17321, 17325, 17329, + 17333, 17337, 17341, 17345, 17349, 17353, 17357, 17361, 17365, 17369, + 17373, 17377, 17381, 17385, 17389, 17393, 17397, 17401, 17405, 17409, + 17413, 17417, 17421, 17425, 17429, 17433, 17437, 17441, 17445, 17449, + 17453, 17457, 17461, 17465, 17469, 17473, 17477, 17481, 17485, 17489, + 17493, 0, 17497, 17501, 17505, 17509, 0, 0, 17513, 17517, 17521, 17525, + 17529, 17533, 17537, 0, 17541, 0, 17545, 17549, 17553, 17557, 0, 0, + 17561, 17565, 17569, 17573, 17577, 17581, 17585, 17589, 17593, 17597, + 17601, 17605, 17609, 17613, 17617, 17621, 17625, 17629, 17633, 17637, + 17641, 17645, 17649, 17652, 17656, 17660, 17664, 17668, 17672, 17676, + 17680, 17684, 17688, 17692, 17696, 17700, 17704, 17708, 17712, 17716, + 17720, 0, 17724, 17728, 17732, 17736, 0, 0, 17740, 17744, 17748, 17752, + 17756, 17760, 17764, 17768, 17772, 17776, 17780, 17784, 17788, 17792, + 17796, 17800, 17804, 17809, 17814, 17819, 17825, 17831, 17836, 17841, + 17847, 17850, 17854, 17858, 17862, 17866, 17870, 17874, 17878, 0, 17882, + 17886, 17890, 17894, 0, 0, 17898, 17902, 17906, 17910, 17914, 17918, + 17922, 0, 17926, 0, 17930, 17934, 17938, 17942, 0, 0, 17946, 17950, + 17954, 17958, 17962, 17966, 17970, 17974, 17978, 17983, 17988, 17993, + 17999, 18005, 18010, 0, 18015, 18019, 18023, 18027, 18031, 18035, 18039, + 18043, 18047, 18051, 18055, 18059, 18063, 18067, 18071, 18075, 18079, + 18082, 18086, 18090, 18094, 18098, 18102, 18106, 18110, 18114, 18118, + 18122, 18126, 18130, 18134, 18138, 18142, 18146, 18150, 18154, 18158, + 18162, 18166, 18170, 18174, 18178, 18182, 18186, 18190, 18194, 18198, + 18202, 18206, 18210, 18214, 18218, 18222, 18226, 18230, 18234, 18238, 0, + 18242, 18246, 18250, 18254, 0, 0, 18258, 18262, 18266, 18270, 18274, + 18278, 18282, 18286, 18290, 18294, 18298, 18302, 18306, 18310, 18314, + 18318, 18322, 18326, 18330, 18334, 18338, 18342, 18346, 18350, 18354, + 18358, 18362, 18366, 18370, 18374, 18378, 18382, 18386, 18390, 18394, + 18398, 18402, 18406, 18410, 18414, 18418, 18422, 18426, 18430, 18434, + 18438, 18442, 18446, 18450, 18454, 18458, 18462, 18466, 18470, 18474, + 18478, 18482, 18486, 18490, 18494, 18498, 18502, 18506, 18510, 18514, + 18518, 18522, 0, 0, 0, 0, 18526, 18531, 18535, 18538, 18542, 18545, + 18548, 18551, 18556, 18560, 18565, 18568, 18571, 18574, 18577, 18580, + 18583, 18586, 18589, 18592, 18596, 18600, 18604, 18608, 18612, 18616, + 18620, 18624, 18628, 18632, 0, 0, 0, 18638, 18644, 18648, 18652, 18656, + 18662, 18666, 18670, 18674, 18680, 18684, 18688, 18692, 18698, 18702, + 18706, 18710, 18716, 18722, 18728, 18736, 18742, 18748, 18754, 18760, + 18766, 0, 0, 0, 0, 0, 0, 18772, 18775, 18778, 18781, 18784, 18787, 18790, + 18794, 18797, 18801, 18805, 18809, 18813, 18817, 18820, 18824, 18828, + 18832, 18836, 18840, 18844, 18848, 18852, 18856, 18860, 18864, 18867, + 18871, 18875, 18879, 18883, 18887, 18891, 18895, 18899, 18903, 18907, + 18911, 18915, 18919, 18923, 18927, 18931, 18935, 18939, 18943, 18946, + 18950, 18954, 18958, 18962, 18966, 18970, 18974, 18978, 18982, 18986, + 18990, 18994, 18998, 19002, 19006, 19010, 19014, 19018, 19022, 19026, + 19030, 19034, 19038, 19042, 19046, 19050, 19054, 19058, 19062, 19066, + 19070, 19074, 19078, 19081, 19085, 19089, 19093, 19097, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19101, 19104, 19108, 19111, 19115, 19118, 19122, 19128, + 19133, 19137, 19140, 19144, 19148, 19153, 19157, 19162, 19166, 19171, + 19175, 19180, 19184, 19189, 19195, 19199, 19204, 19208, 19213, 19219, + 19223, 19229, 19234, 19238, 19242, 19250, 19258, 19265, 19270, 19275, + 19284, 19291, 19298, 19303, 19309, 19313, 19317, 19321, 19325, 19329, + 19333, 19337, 19341, 19345, 19349, 19355, 19360, 19365, 19369, 19373, + 19377, 19382, 19386, 19391, 19395, 19400, 19404, 19409, 19413, 19418, + 19422, 19427, 19431, 19436, 19442, 19445, 19449, 19453, 19457, 19461, + 19465, 19469, 19472, 19476, 19482, 19487, 19492, 19496, 19500, 19504, + 19509, 19513, 19518, 19522, 19527, 19530, 19534, 19538, 19543, 19547, + 19552, 19556, 19561, 19567, 19570, 19574, 19578, 19582, 19586, 19590, + 19594, 19598, 19602, 19606, 19610, 19616, 19619, 19623, 19627, 19632, + 19636, 19641, 19645, 19650, 19654, 19659, 19663, 19668, 19672, 19677, + 19681, 19686, 19692, 19696, 19700, 19706, 19712, 19718, 19724, 19728, + 19732, 19736, 19740, 19744, 19748, 19754, 19758, 19762, 19766, 19771, + 19775, 19780, 19784, 19789, 19793, 19798, 19802, 19807, 19811, 19816, + 19820, 19825, 19831, 19835, 19841, 19845, 19849, 19853, 19857, 19861, + 19865, 19871, 19874, 19878, 19882, 19887, 19891, 19896, 19900, 19905, + 19909, 19914, 19918, 19923, 19927, 19932, 19936, 19941, 19947, 19950, + 19954, 19958, 19963, 19968, 19972, 19976, 19980, 19984, 19988, 19992, + 19998, 20002, 20006, 20010, 20015, 20019, 20024, 20028, 20033, 20039, + 20042, 20047, 20051, 20055, 20059, 20063, 20067, 20071, 20075, 20081, + 20085, 20089, 20093, 20098, 20102, 20107, 20111, 20116, 20120, 20125, + 20129, 20134, 20138, 20143, 20147, 20152, 20155, 20159, 20163, 20167, + 20171, 20175, 20179, 20183, 20187, 20193, 20197, 20201, 20205, 20210, + 20214, 20219, 20223, 20228, 20232, 20237, 20241, 20246, 20250, 20255, + 20259, 20264, 20270, 20273, 20278, 20282, 20287, 20293, 20299, 20305, + 20311, 20317, 20323, 20329, 20333, 20337, 20341, 20345, 20349, 20353, + 20357, 20361, 20366, 20370, 20375, 20379, 20384, 20388, 20393, 20397, + 20402, 20406, 20411, 20415, 20420, 20424, 20428, 20432, 20436, 20440, + 20444, 20448, 20454, 20457, 20461, 20465, 20470, 20474, 20479, 20483, + 20488, 20492, 20497, 20501, 20506, 20510, 20515, 20519, 20524, 20530, + 20534, 20540, 20545, 20551, 20555, 20561, 20566, 20570, 20574, 20578, + 20582, 20586, 20591, 20595, 20599, 20604, 20608, 20613, 20616, 20620, + 20624, 20628, 20632, 20636, 20640, 20644, 20648, 20652, 20656, 20660, + 20665, 20669, 20673, 20679, 20683, 20689, 20693, 20699, 20703, 20707, + 20711, 20715, 20719, 20724, 20728, 20732, 20736, 20740, 20744, 20748, + 20752, 20756, 20760, 20764, 20770, 20776, 20782, 20788, 20794, 20799, + 20805, 20810, 20815, 20819, 20823, 20827, 20831, 20835, 20839, 20843, + 20847, 20851, 20855, 20859, 20863, 20867, 20872, 20877, 20882, 20887, + 20891, 20895, 20899, 20903, 20907, 20911, 20915, 20919, 20923, 20929, + 20935, 20941, 20947, 20953, 20959, 20965, 20971, 20977, 20981, 20985, + 20989, 20993, 20997, 21001, 21005, 21011, 21017, 21023, 21029, 21035, + 21041, 21047, 21053, 21058, 21063, 21068, 21073, 21078, 21084, 21090, + 21096, 21102, 21108, 21114, 21120, 21126, 21132, 21138, 21144, 21149, + 21155, 21161, 21167, 21172, 21177, 21182, 21187, 21192, 21197, 21202, + 21207, 21212, 21217, 21222, 21227, 21232, 21237, 21242, 21247, 21252, + 21257, 21262, 21267, 21272, 21277, 21282, 21287, 21292, 21297, 21302, + 21307, 21312, 21317, 21322, 21327, 21332, 21337, 21342, 21347, 21352, + 21357, 21362, 21367, 21372, 21377, 21382, 21386, 21391, 21396, 21401, + 21406, 21411, 21416, 21421, 21426, 21431, 21436, 21441, 21446, 21451, + 21456, 21461, 21466, 21471, 21476, 21481, 21486, 21491, 21496, 21501, + 21506, 21511, 21516, 21521, 21526, 21531, 21536, 21540, 21545, 21550, + 21555, 21560, 21565, 21569, 21574, 21580, 21585, 21590, 21595, 21600, + 21606, 21611, 21616, 21621, 21626, 21631, 21636, 21641, 21646, 21651, + 21656, 21661, 21666, 21671, 21676, 21681, 21686, 21691, 21696, 21701, + 21706, 21711, 21716, 21721, 21726, 21731, 21736, 21741, 21746, 21751, + 21756, 21761, 21766, 21771, 21776, 21781, 21786, 21791, 21796, 21801, + 21806, 21811, 21816, 21821, 21826, 21832, 21837, 21842, 21847, 21852, + 21857, 21862, 21867, 21872, 21877, 21882, 21887, 21892, 21897, 21902, + 21907, 21912, 21917, 21922, 21927, 21932, 21937, 21942, 21947, 21952, + 21957, 21962, 21967, 21972, 21977, 21982, 21987, 21992, 21997, 22002, + 22007, 22012, 22017, 22022, 22027, 22031, 22035, 22039, 22043, 22047, + 22051, 22055, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22059, 22064, 22069, 22074, + 22079, 22084, 22089, 22094, 22099, 22104, 22109, 22114, 22119, 22124, + 22129, 22134, 22139, 22144, 22149, 22154, 22159, 22164, 22169, 22174, + 22179, 22184, 22189, 22194, 22199, 0, 0, 0, 22205, 22215, 22218, 22225, + 22229, 22233, 22237, 22245, 22249, 22254, 22259, 22264, 22268, 22273, + 22278, 22281, 22285, 22289, 22298, 22302, 22306, 22312, 22315, 22319, + 22326, 22330, 22338, 22343, 22348, 22353, 22358, 22367, 22372, 22376, + 22385, 22388, 22393, 22397, 22403, 22408, 22414, 22421, 22427, 22432, + 22439, 22444, 22448, 22452, 22461, 22466, 22469, 22478, 22483, 22487, + 22491, 22498, 22505, 22510, 22515, 22524, 22528, 22532, 22536, 22543, + 22550, 22554, 22558, 22562, 22566, 22570, 22574, 22578, 22582, 22586, + 22590, 22593, 22598, 22603, 22608, 22612, 22616, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22620, 22624, 22628, 22632, 22636, 22641, 22646, + 22651, 22656, 22661, 22666, 22671, 22675, 0, 22679, 22684, 22689, 22694, + 22698, 22703, 22708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22713, 22717, + 22721, 22725, 22729, 22734, 22739, 22744, 22749, 22754, 22759, 22764, + 22768, 22772, 22777, 22782, 22787, 22792, 22796, 22801, 22806, 22811, + 22817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22822, 22826, 22830, 22834, 22838, + 22843, 22848, 22853, 22858, 22863, 22868, 22873, 22877, 22881, 22886, + 22891, 22896, 22901, 22905, 22910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22915, 22919, 22923, 22927, 22931, 22936, 22941, 22946, 22951, 22956, + 22961, 22966, 22970, 0, 22974, 22979, 22984, 0, 22989, 22994, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22999, 23002, 23006, 23010, 23014, 23018, 23022, + 23026, 23030, 23034, 23038, 23042, 23046, 23050, 23054, 23058, 23062, + 23066, 23069, 23073, 23077, 23081, 23085, 23089, 23093, 23097, 23101, + 23105, 23109, 23113, 23117, 23121, 23125, 23128, 23132, 23136, 23142, + 23148, 23154, 23160, 23166, 23172, 23178, 23184, 23190, 23196, 23202, + 23208, 23214, 23220, 23229, 23238, 23244, 23250, 23256, 23261, 23265, + 23270, 23275, 23280, 23284, 23289, 23294, 23299, 23303, 23308, 23312, + 23317, 23322, 23327, 23332, 23336, 23340, 23344, 23348, 23352, 23356, + 23360, 23364, 23368, 23372, 23378, 23382, 23386, 23390, 23394, 23398, + 23406, 23412, 23416, 23422, 23426, 23432, 23436, 0, 0, 23440, 23444, + 23447, 23450, 23453, 23456, 23459, 23462, 23465, 23468, 0, 0, 0, 0, 0, 0, + 23471, 23479, 23487, 23495, 23503, 23511, 23519, 23527, 23535, 23543, 0, + 0, 0, 0, 0, 0, 23551, 23554, 23557, 23560, 23564, 23567, 23572, 23579, + 23587, 23592, 23598, 23601, 23608, 23615, 23622, 0, 23626, 23630, 23633, + 23636, 23639, 23642, 23645, 23648, 23651, 23654, 0, 0, 0, 0, 0, 0, 23657, + 23660, 23663, 23666, 23669, 23672, 23676, 23680, 23684, 23688, 23692, + 23696, 23700, 23704, 23708, 23711, 23715, 23719, 23723, 23727, 23731, + 23735, 23739, 23742, 23746, 23750, 23754, 23757, 23761, 23765, 23769, + 23773, 23777, 23781, 23785, 23789, 23796, 23801, 23806, 23811, 23816, + 23822, 23828, 23834, 23840, 23846, 23852, 23858, 23863, 23869, 23875, + 23881, 23887, 23893, 23898, 23904, 23909, 23915, 23921, 23927, 23933, + 23939, 23944, 23949, 23955, 23961, 23966, 23972, 23977, 23983, 23988, + 23994, 24000, 24006, 24012, 24018, 24024, 24030, 24036, 24042, 24048, + 24054, 24060, 24066, 24071, 24076, 24082, 24088, 0, 0, 0, 0, 0, 0, 0, 0, + 24094, 24103, 24112, 24120, 24128, 24138, 24146, 24155, 24162, 24169, + 24176, 24184, 24192, 24200, 24208, 24216, 24224, 24232, 24240, 24248, + 24256, 24264, 24272, 24280, 24288, 24298, 24308, 24318, 24328, 24338, + 24348, 24358, 24368, 24378, 24388, 24398, 24408, 24418, 24428, 24436, + 24444, 24454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24462, 24467, + 24470, 24474, 24478, 24482, 24486, 24490, 24494, 24498, 24502, 24506, + 24510, 24514, 24518, 24522, 24526, 24530, 24534, 24538, 24542, 24545, + 24548, 24552, 24556, 24560, 24564, 24568, 24572, 0, 0, 0, 24575, 24579, + 24583, 24587, 24592, 24597, 24602, 24607, 24611, 24615, 24619, 24624, 0, + 0, 0, 0, 24629, 24633, 24638, 24643, 24648, 24653, 24658, 24662, 24667, + 24672, 24676, 24680, 0, 0, 0, 0, 24684, 0, 0, 0, 24688, 24692, 24696, + 24700, 24703, 24706, 24709, 24712, 24715, 24718, 24721, 24724, 24727, + 24732, 24738, 24744, 24750, 24756, 24761, 24767, 24773, 24779, 24785, + 24791, 24796, 24802, 24808, 24813, 24819, 24825, 24831, 24837, 24842, + 24847, 24853, 24859, 24864, 24870, 24875, 24881, 24886, 24892, 0, 0, + 24898, 24904, 24910, 24916, 24922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24928, 24935, 24942, 24948, 24955, 24962, 24968, 24975, 24982, 24989, + 24996, 25002, 25009, 25016, 25022, 25029, 25036, 25043, 25050, 25057, + 25064, 25071, 25078, 25084, 25091, 25098, 25104, 25111, 25118, 25125, + 25132, 25139, 25146, 25152, 25159, 25166, 25172, 25179, 25186, 25193, + 25200, 25207, 0, 0, 0, 0, 0, 0, 25214, 25222, 25229, 25236, 25242, 25249, + 25255, 25262, 25268, 25275, 25282, 25289, 25296, 25303, 25310, 25317, + 25324, 25331, 25337, 25344, 25350, 25356, 25363, 25369, 25375, 25381, 0, + 0, 0, 0, 0, 0, 25387, 25393, 25398, 25403, 25408, 25413, 25418, 25423, + 25428, 25433, 0, 0, 0, 0, 25438, 25444, 25450, 25454, 25460, 25466, + 25472, 25478, 25484, 25490, 25496, 25502, 25508, 25514, 25520, 25526, + 25532, 25538, 25544, 25548, 25554, 25560, 25566, 25572, 25578, 25584, + 25590, 25596, 25602, 25608, 25614, 25620, 25626, 25632, 25638, 25642, + 25647, 25652, 25657, 25662, 25667, 25671, 25676, 25681, 25686, 25691, + 25696, 25701, 25706, 25711, 25716, 25720, 25725, 25730, 25735, 25740, + 25744, 25748, 25753, 25758, 25763, 25768, 0, 0, 25774, 25778, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25785, 25790, + 25796, 25802, 25809, 25815, 25820, 25826, 25831, 25838, 25843, 25848, + 25854, 25862, 25867, 25873, 25878, 25885, 25891, 25899, 25907, 25913, + 25919, 25926, 25933, 25938, 25944, 25950, 25955, 25960, 25966, 25974, + 25981, 25986, 25992, 25998, 26004, 26012, 26016, 26022, 26028, 26034, + 26040, 26046, 26052, 26056, 26061, 26065, 26071, 26075, 26079, 26084, + 26088, 26092, 26096, 26100, 26105, 26109, 26113, 26117, 26122, 26126, + 26131, 26135, 26139, 26143, 26147, 26152, 26156, 26161, 26166, 26172, + 26176, 26180, 26184, 26189, 26195, 26202, 26206, 26211, 26216, 26220, + 26225, 26229, 26235, 26242, 26249, 26253, 26257, 26261, 26267, 26272, + 26276, 26281, 26286, 26292, 26297, 26303, 26308, 26314, 26320, 26326, + 26332, 26339, 26346, 26353, 26360, 26367, 26372, 26380, 26389, 26398, + 26407, 26416, 26425, 26434, 26446, 26455, 26464, 26473, 26478, 26483, + 26489, 26497, 26504, 26511, 26518, 26525, 26532, 26540, 26549, 26558, + 26567, 26576, 26585, 26594, 26603, 26612, 26621, 26630, 26639, 26648, + 26657, 26666, 26674, 26682, 26693, 26701, 26711, 26722, 26731, 26739, + 26749, 26758, 26766, 26775, 26781, 26786, 26794, 26799, 26806, 26811, + 26820, 26825, 26830, 26836, 26841, 26846, 26853, 26861, 26870, 26879, + 26884, 26891, 26901, 26909, 26918, 26923, 26929, 26934, 26941, 26946, + 26955, 26960, 26965, 26970, 26977, 26982, 26987, 26996, 27004, 27009, + 27014, 27021, 27028, 27032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27036, + 27044, 27052, 27059, 27066, 27073, 27080, 27088, 27096, 27106, 27116, + 27124, 27132, 27140, 27148, 27157, 27166, 27174, 27182, 27190, 27198, + 27207, 27216, 27225, 27234, 27241, 27248, 27256, 27264, 27274, 27284, + 27292, 27300, 27307, 27314, 27322, 27330, 27338, 27346, 27353, 27360, + 27368, 27376, 27385, 27394, 27402, 27410, 27419, 27428, 27435, 27442, + 27450, 27458, 27467, 27476, 27484, 27492, 27503, 27514, 27523, 27532, + 27540, 27548, 27555, 27562, 27570, 27578, 27586, 27594, 27602, 27610, + 27618, 27626, 27635, 27644, 27652, 27660, 27669, 27678, 27687, 27696, + 27705, 27714, 27723, 27732, 27739, 27746, 27754, 27762, 27770, 27778, + 27786, 27794, 27805, 27816, 27825, 27834, 27842, 27850, 27858, 27866, + 27877, 27888, 27899, 27910, 27922, 27934, 27942, 27950, 27958, 27966, + 27975, 27984, 27992, 28000, 28008, 28016, 28024, 28032, 28039, 28046, + 28055, 28064, 28073, 28082, 28089, 28096, 28104, 28112, 28119, 28126, + 28133, 28140, 28147, 28154, 28162, 28170, 28178, 28186, 28194, 28202, + 28209, 28216, 28224, 28232, 28240, 28248, 28256, 28264, 28273, 28282, + 28291, 28298, 28307, 28316, 28325, 0, 0, 0, 0, 28334, 28341, 28348, + 28356, 28364, 28372, 28380, 28388, 28396, 28406, 28416, 28424, 28432, + 28441, 28450, 28459, 28468, 28477, 28486, 28497, 28508, 28517, 28526, + 28536, 28546, 28553, 28560, 28568, 28576, 28582, 28588, 28596, 28604, + 28612, 28620, 28630, 28640, 28648, 28656, 28665, 28674, 28682, 28690, + 28697, 28704, 28711, 28718, 28726, 28734, 28742, 28750, 28758, 28766, + 28776, 28786, 28794, 28802, 28811, 28820, 28829, 28838, 28847, 28856, + 28867, 28878, 28887, 28896, 28906, 28916, 28923, 28930, 28938, 28946, + 28955, 28964, 28973, 28982, 28993, 29004, 29013, 29022, 29032, 29042, + 29049, 29056, 29064, 29072, 29081, 29090, 29097, 0, 0, 0, 0, 0, 0, 29104, + 29111, 29118, 29126, 29134, 29142, 29150, 29159, 29168, 29175, 29182, + 29190, 29198, 29206, 29214, 29223, 29232, 29240, 29248, 29257, 29266, + 29275, 0, 0, 29284, 29292, 29300, 29309, 29318, 29327, 0, 0, 29336, + 29344, 29352, 29361, 29370, 29379, 29388, 29398, 29408, 29416, 29424, + 29433, 29442, 29451, 29460, 29470, 29480, 29488, 29496, 29505, 29514, + 29523, 29532, 29542, 29552, 29560, 29568, 29577, 29586, 29595, 29604, + 29614, 29624, 29632, 29640, 29649, 29658, 29667, 0, 0, 29676, 29684, + 29692, 29701, 29710, 29719, 0, 0, 29728, 29736, 29744, 29753, 29762, + 29771, 29780, 29790, 0, 29800, 0, 29808, 0, 29817, 0, 29826, 29836, + 29843, 29850, 29858, 29866, 29874, 29882, 29891, 29900, 29907, 29914, + 29922, 29930, 29938, 29946, 29955, 29964, 29970, 29976, 29983, 29990, + 29997, 30004, 30011, 30018, 30025, 30032, 30039, 30046, 30052, 0, 0, + 30058, 30067, 30076, 30088, 30100, 30112, 30124, 30136, 30148, 30157, + 30166, 30178, 30190, 30202, 30214, 30226, 30238, 30248, 30258, 30271, + 30284, 30297, 30310, 30323, 30336, 30346, 30356, 30369, 30382, 30395, + 30408, 30421, 30434, 30443, 30452, 30464, 30476, 30488, 30500, 30512, + 30524, 30533, 30542, 30554, 30566, 30578, 30590, 30602, 30614, 30621, + 30627, 30637, 30644, 0, 30654, 30661, 30671, 30678, 30684, 30690, 30696, + 30703, 30706, 30709, 30712, 30715, 30721, 30732, 30740, 0, 30751, 30759, + 30770, 30777, 30784, 30791, 30798, 30806, 30810, 30814, 30819, 30827, + 30834, 30844, 0, 0, 30854, 30862, 30873, 30881, 30888, 30895, 0, 30902, + 30906, 30910, 30915, 30923, 30930, 30940, 30950, 30958, 30966, 30974, + 30985, 30993, 31000, 31007, 31014, 31022, 31027, 31032, 0, 0, 31034, + 31044, 31051, 0, 31061, 31068, 31078, 31085, 31092, 31098, 31104, 31111, + 31113, 0, 31116, 31120, 31124, 31128, 31132, 31136, 31140, 31144, 31148, + 31152, 31156, 31160, 31166, 31172, 31178, 31181, 31184, 31186, 31190, + 31194, 31198, 31202, 31204, 31208, 31212, 31218, 31224, 31231, 31238, + 31243, 31248, 31254, 31260, 31262, 31265, 31267, 31271, 31276, 31280, + 31283, 31287, 31291, 31295, 31299, 31303, 31309, 31313, 31317, 31323, + 31328, 31335, 31337, 31340, 31344, 31347, 31351, 31356, 31358, 31366, + 31374, 31377, 31381, 31383, 31385, 31387, 31390, 31396, 31398, 31402, + 31406, 31413, 31420, 31424, 31429, 31434, 31439, 31443, 31447, 31451, + 31454, 31457, 31461, 31468, 31473, 31477, 31481, 31486, 31490, 31494, + 31499, 31504, 31508, 31512, 31516, 31518, 31523, 31528, 31532, 31536, + 31540, 0, 0, 0, 0, 0, 0, 31544, 31550, 31556, 31563, 31570, 31575, 31580, + 31584, 0, 0, 31590, 31593, 31596, 31599, 31602, 31605, 31608, 31613, + 31617, 31622, 31627, 31632, 31638, 31642, 31645, 31648, 31651, 31654, + 31657, 31660, 31663, 31666, 31669, 31674, 31678, 31683, 31688, 0, 31693, + 31699, 31705, 31711, 31717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31724, + 31727, 31730, 31733, 31738, 31741, 31744, 31747, 31750, 31753, 31756, + 31760, 31763, 31766, 31769, 31772, 31775, 31780, 31783, 31786, 31789, + 31792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31795, 31799, 31803, 31810, 31818, 31823, 31828, 31832, + 31836, 31841, 31848, 31855, 31859, 31864, 31869, 31874, 31879, 31885, + 31890, 31895, 31900, 31909, 31916, 31923, 31927, 31932, 31938, 31943, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31950, 31954, + 31961, 31965, 31969, 31974, 31978, 31982, 31986, 31988, 31992, 31995, + 31998, 32002, 32005, 32009, 32018, 32021, 32025, 32028, 32031, 32037, + 32040, 32043, 32049, 32052, 32055, 32059, 32062, 32066, 32069, 32073, + 32075, 32078, 32081, 32085, 32087, 32091, 32094, 32097, 32102, 32107, + 32113, 32116, 32119, 32122, 32127, 32130, 32133, 32136, 32140, 32144, + 32147, 32150, 32152, 32155, 32158, 32161, 32165, 32170, 32173, 32177, + 32181, 32185, 32189, 32194, 32198, 32202, 32206, 32211, 32215, 32219, + 32223, 32227, 32231, 32235, 32238, 0, 0, 0, 0, 0, 0, 32241, 32249, 32256, + 32264, 32271, 32278, 32286, 32294, 32302, 32310, 32317, 32325, 32333, + 32338, 32342, 32346, 32350, 32354, 32358, 32362, 32366, 32370, 32374, + 32379, 32384, 32389, 32394, 32401, 32408, 32415, 32420, 32425, 32430, + 32435, 32440, 32445, 32450, 32455, 32460, 32466, 32472, 32478, 32484, + 32492, 32500, 32508, 32518, 32525, 32532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32540, 32542, 32545, 32547, 32550, 32553, 32556, 32561, 32566, + 32571, 32576, 32580, 32584, 32588, 32592, 32597, 32603, 32608, 32614, + 32619, 32624, 32629, 32635, 32640, 32646, 32652, 32656, 32660, 32665, + 32670, 32675, 32680, 32685, 32693, 32701, 32709, 32717, 32724, 32732, + 32739, 32746, 32754, 32765, 32771, 32777, 32783, 32789, 32796, 32803, + 32809, 32815, 32822, 32829, 32835, 32843, 32849, 32854, 32860, 32865, + 32871, 32878, 32885, 32890, 32896, 32901, 32904, 32908, 32911, 32915, + 32919, 32923, 32929, 32935, 32941, 32947, 32951, 32955, 32959, 32963, + 32969, 32975, 32979, 32984, 32988, 32993, 32997, 33001, 33004, 33008, + 33011, 33015, 33022, 33030, 33041, 33052, 33057, 33066, 33073, 33081, + 33089, 33093, 33099, 33107, 33111, 33116, 33121, 33127, 33133, 33139, + 33146, 33150, 33154, 33159, 33162, 33164, 33168, 33172, 33179, 33183, + 33185, 33187, 33191, 33198, 33203, 33209, 33218, 33225, 33230, 33234, + 33238, 33242, 33245, 33248, 33251, 33255, 33259, 33263, 33267, 33271, + 33274, 33278, 33282, 33285, 33287, 33290, 33292, 33296, 33300, 33302, + 33307, 33310, 33314, 33318, 33322, 33324, 33326, 33328, 33331, 33335, + 33339, 33343, 33347, 33351, 33357, 33363, 33365, 33367, 33369, 33371, + 33374, 33376, 33380, 33382, 33386, 33388, 33393, 33397, 33401, 33403, + 33406, 33410, 33415, 33419, 33428, 33438, 33442, 33447, 33453, 33456, + 33460, 33463, 33468, 33472, 33478, 33482, 33493, 33501, 33505, 33509, + 33515, 33519, 33522, 33524, 33527, 33531, 33535, 33541, 33545, 33549, + 33552, 33555, 33559, 33564, 33569, 33574, 33580, 33586, 33593, 33600, + 33604, 33608, 33610, 33614, 33617, 33620, 33628, 33636, 33642, 33648, + 33657, 33666, 33671, 33676, 33684, 33692, 33694, 33696, 33701, 33706, + 33712, 33718, 33723, 33728, 33732, 33736, 33742, 33748, 33754, 33760, + 33770, 33780, 33787, 33794, 33796, 33800, 33804, 33809, 33814, 33821, + 33828, 33831, 33834, 33837, 33840, 33843, 33848, 33852, 33857, 33862, + 33865, 33868, 33872, 33876, 33880, 33885, 33888, 33891, 33894, 33897, + 33899, 33901, 33903, 33905, 33913, 33921, 33926, 33929, 33934, 33944, + 33950, 33956, 33962, 33970, 33978, 33989, 33993, 33997, 33999, 34005, + 34007, 34009, 34011, 34013, 34018, 34021, 34027, 34033, 34037, 34041, + 34045, 34048, 34052, 34056, 34058, 34067, 34076, 34081, 34086, 34091, + 34097, 34103, 34106, 34109, 34112, 34115, 34117, 34122, 34127, 34132, + 34138, 34144, 34151, 34158, 34163, 34168, 34173, 34178, 34186, 34194, + 34202, 34210, 34218, 34226, 34234, 34242, 34250, 34258, 34265, 34276, + 34285, 34299, 34302, 34307, 34313, 34319, 34326, 34340, 34355, 34361, + 34367, 34374, 34380, 34388, 34394, 34407, 34421, 34426, 34432, 34439, + 34442, 34445, 34447, 34450, 34453, 34455, 34457, 34461, 34464, 34467, + 34470, 34473, 34478, 34483, 34488, 34493, 34496, 34499, 34501, 34503, + 34505, 34509, 34513, 34517, 34523, 34526, 34528, 34530, 34535, 34540, + 34545, 34550, 34555, 34560, 34562, 34564, 34573, 34577, 34583, 34592, + 34594, 34598, 34602, 34609, 34613, 34615, 34619, 34621, 34625, 34629, + 34633, 34635, 34637, 34639, 34644, 34651, 34658, 34665, 34672, 34679, + 34686, 34692, 34698, 34704, 34710, 34717, 34724, 34731, 34738, 34744, + 34750, 34757, 34764, 34770, 34778, 34785, 34793, 34800, 34808, 34815, + 34823, 34831, 34838, 34846, 34853, 34861, 34868, 34876, 34883, 34890, + 34897, 34904, 34910, 34918, 34925, 34931, 34938, 34945, 34951, 34957, + 34963, 34968, 34976, 34984, 34990, 34996, 35002, 35008, 35013, 35019, + 35026, 35034, 35041, 35048, 35055, 35060, 35065, 35070, 35076, 35083, + 35090, 35096, 35101, 35105, 35113, 35119, 35122, 35130, 35133, 35138, + 35143, 35146, 35149, 35157, 35160, 35165, 35168, 35175, 35180, 35187, + 35190, 35193, 35196, 35201, 35206, 35209, 35212, 35220, 35223, 35228, + 35235, 35239, 35243, 35248, 35253, 35258, 35263, 35268, 35273, 35278, + 35283, 35290, 35296, 35303, 35310, 35316, 35323, 35330, 35339, 35346, + 35352, 35359, 35368, 35375, 35379, 35384, 35395, 35406, 35410, 35414, + 35418, 35422, 35433, 35437, 35442, 35447, 35452, 35457, 35462, 35467, + 35476, 35485, 35493, 35503, 35513, 35521, 35531, 35541, 35549, 35559, + 35569, 35577, 35585, 35595, 35605, 35608, 35611, 35614, 35619, 35623, + 35630, 35638, 35646, 35655, 35662, 35666, 35670, 35674, 35678, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 35680, 35684, 35691, 35698, 35705, 35712, + 35716, 35720, 35724, 35728, 35733, 35739, 35744, 35750, 35756, 35762, + 35768, 35776, 35783, 35790, 35797, 35804, 35810, 35816, 35825, 35829, + 35836, 35840, 35844, 35850, 35856, 35862, 35868, 35872, 35876, 35879, + 35883, 35887, 35894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35901, 35904, 35908, 35912, 35918, 35924, 35930, + 35938, 35945, 35949, 35957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35962, 35965, 35968, 35971, 35974, 35977, 35980, 35983, + 35986, 35989, 35993, 35997, 36001, 36005, 36009, 36013, 36017, 36021, + 36025, 36029, 36033, 36036, 36039, 36042, 36045, 36048, 36051, 36054, + 36057, 36060, 36064, 36068, 36072, 36076, 36080, 36084, 36088, 36092, + 36096, 36100, 36104, 36110, 36115, 36120, 36126, 36132, 36138, 36144, + 36150, 36156, 36162, 36168, 36174, 36180, 36186, 36192, 36198, 36204, + 36210, 36216, 36222, 36227, 36232, 36238, 36243, 36248, 36254, 36259, + 36264, 36269, 36274, 36280, 36285, 36290, 36295, 36300, 36305, 36311, + 36316, 36321, 36326, 36331, 36336, 36342, 36347, 36353, 36359, 36364, + 36369, 36375, 36380, 36385, 36391, 36396, 36401, 36406, 36411, 36417, + 36422, 36427, 36432, 36437, 36442, 36448, 36453, 36458, 36463, 36468, + 36473, 36479, 36484, 36490, 36496, 36501, 36506, 36512, 36517, 36522, + 36528, 36533, 36538, 36543, 36548, 36554, 36559, 36564, 36569, 36574, + 36579, 36585, 36590, 36595, 36600, 36605, 36610, 36616, 36621, 36627, + 36633, 36637, 36643, 36649, 36655, 36661, 36667, 36673, 36679, 36685, + 36691, 36697, 36701, 36705, 36709, 36713, 36717, 36721, 36725, 36729, + 36733, 36738, 36744, 36749, 36754, 36759, 36764, 36773, 36782, 36791, + 36800, 36809, 36818, 36827, 36836, 36842, 36850, 36858, 36864, 36871, + 36879, 36887, 36894, 36900, 36908, 36916, 36922, 36929, 36937, 36945, + 36952, 36958, 36966, 36975, 36984, 36992, 37001, 37010, 37016, 37023, + 37031, 37040, 37049, 37057, 37066, 37075, 37082, 37089, 37098, 37107, + 37115, 37123, 37132, 37141, 37148, 37155, 37164, 37173, 37181, 37189, + 37198, 37207, 37214, 37221, 37230, 37239, 37247, 37256, 37265, 37273, + 37283, 37293, 37303, 37313, 37322, 37331, 37340, 37349, 37356, 37364, + 37372, 37380, 37388, 37393, 37398, 37407, 37415, 37421, 37430, 37438, + 37445, 37454, 37462, 37468, 37477, 37485, 37492, 37501, 37509, 37515, + 37524, 37532, 37539, 37548, 37556, 37563, 37572, 37580, 37587, 37596, + 37604, 37611, 37619, 37628, 37637, 37645, 37656, 37666, 37673, 37678, + 37683, 37687, 37692, 37697, 37702, 37706, 37711, 37718, 37726, 37733, + 37741, 37745, 37752, 37759, 37765, 37769, 37776, 37782, 37789, 37793, + 37800, 37806, 37813, 37817, 37823, 37830, 37837, 37841, 37844, 37848, + 37852, 37859, 37866, 37871, 37875, 37880, 37890, 37897, 37908, 37918, + 37922, 37930, 37940, 37943, 37946, 37953, 37961, 37966, 37971, 37979, + 37988, 37997, 38005, 38009, 38013, 38016, 38019, 38023, 38027, 38030, + 38033, 38038, 38043, 38049, 38055, 38060, 38065, 38071, 38077, 38082, + 38087, 38092, 38097, 38103, 38109, 38114, 38119, 38125, 38131, 38136, + 38141, 38144, 38147, 38156, 38158, 38160, 38163, 38167, 38172, 38174, + 38177, 38183, 38189, 38195, 38201, 38209, 38221, 38226, 38231, 38235, + 38240, 38247, 38254, 38262, 38270, 38278, 38286, 38290, 38294, 38299, + 38304, 38309, 38314, 38317, 38323, 38329, 38338, 38347, 38355, 38363, + 38372, 38381, 38385, 38392, 38399, 38406, 38413, 38420, 38427, 38434, + 38441, 38445, 38449, 38453, 38458, 38463, 38469, 38475, 38479, 38485, + 38487, 38489, 38491, 38493, 38496, 38499, 38501, 38503, 38505, 38509, + 38513, 38515, 38517, 38520, 38523, 38527, 38533, 38538, 38540, 38547, + 38551, 38556, 38561, 38563, 38572, 38578, 38584, 38590, 38596, 38602, + 38608, 38613, 38616, 38619, 38622, 38624, 38626, 38630, 38634, 38639, + 38644, 38649, 38652, 38656, 38661, 38664, 38668, 38673, 38678, 38683, + 38688, 38693, 38698, 38703, 38708, 38713, 38718, 38723, 38728, 38734, + 38740, 38746, 38748, 38751, 38753, 38756, 38758, 38760, 38762, 38764, + 38766, 38768, 38770, 38772, 38774, 38776, 38778, 38780, 38782, 38784, + 38786, 38788, 38790, 38795, 38800, 38805, 38810, 38815, 38820, 38825, + 38830, 38835, 38840, 38845, 38850, 38855, 38860, 38865, 38870, 38875, + 38880, 38885, 38890, 38894, 38898, 38902, 38908, 38914, 38919, 38924, + 38929, 38934, 38939, 38944, 38952, 38960, 38968, 38976, 38984, 38992, + 39000, 39008, 39014, 39019, 39024, 39029, 39032, 39036, 39040, 39044, + 39048, 39052, 39056, 39061, 39067, 39073, 39080, 39085, 39090, 39097, + 39104, 39111, 39118, 39121, 39124, 39129, 39131, 39135, 39140, 39142, + 39144, 39146, 39148, 39153, 39156, 0, 0, 0, 39158, 39161, 39165, 39170, + 39175, 39183, 39189, 39195, 39207, 39214, 39221, 39226, 39231, 39237, + 39240, 39243, 39248, 39250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39254, 39259, 39262, + 39267, 0, 39270, 39275, 39279, 39281, 0, 0, 39283, 39287, 39291, 39295, + 39297, 39301, 39304, 39307, 39310, 39314, 39317, 39321, 39324, 39328, + 39333, 39337, 39343, 39350, 39353, 39359, 39364, 39368, 39373, 39379, + 39385, 39392, 39398, 39405, 0, 39412, 39419, 39423, 39430, 39436, 39441, + 39447, 39451, 39456, 39459, 39465, 39471, 39478, 39486, 39493, 39502, + 39512, 39519, 39525, 39529, 39537, 39542, 39551, 39554, 39557, 39566, + 39577, 39584, 39586, 39592, 39597, 39599, 39602, 39606, 39614, 0, 39623, + 0, 39628, 39635, 39642, 39649, 0, 0, 0, 39656, 0, 39663, 39666, 39670, + 39673, 39684, 39694, 39704, 0, 0, 39713, 39722, 39728, 39736, 39740, + 39748, 39752, 39760, 39767, 39774, 39783, 39792, 39801, 39810, 39819, + 39828, 39836, 39844, 39854, 39864, 39873, 39882, 39889, 39896, 39903, + 39910, 39917, 39924, 39931, 39938, 39945, 39953, 39959, 39965, 39971, + 39977, 39983, 39989, 39995, 40001, 40007, 40014, 40022, 40030, 40038, + 40046, 40054, 40062, 40070, 40078, 40086, 40095, 0, 0, 0, 40100, 40106, + 40109, 40115, 40121, 40126, 40130, 40135, 40141, 40148, 40151, 40158, + 40165, 40169, 40178, 40187, 40192, 40198, 40203, 40208, 40215, 40222, + 40229, 40236, 0, 40244, 40252, 40257, 40261, 40268, 40272, 40279, 40287, + 40292, 40300, 40304, 40309, 40313, 40318, 0, 40322, 40327, 40336, 40338, + 40342, 40346, 40353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40360, 40368, 40372, + 40379, 40386, 40393, 40398, 40403, 40409, 40414, 40419, 40425, 40430, + 40433, 40437, 40441, 40447, 40456, 40461, 40470, 40479, 40485, 40491, + 40496, 40501, 40505, 40509, 40514, 0, 0, 0, 0, 40519, 40524, 40529, + 40535, 40541, 40547, 40550, 40553, 40557, 40561, 40565, 40570, 40576, + 40582, 40589, 40596, 40601, 40605, 40609, 40613, 40617, 40621, 40625, + 40629, 40633, 40637, 40641, 40645, 40649, 40653, 40657, 40661, 40665, + 40669, 40673, 40677, 40681, 40685, 40689, 40693, 40697, 40701, 40705, + 40709, 40713, 40717, 40721, 40725, 40729, 40733, 40737, 40741, 40745, + 40749, 40753, 40757, 40761, 40765, 40769, 40773, 40777, 40781, 40785, + 40789, 40793, 40797, 40801, 40805, 40809, 40813, 40817, 40821, 40825, + 40829, 40833, 40837, 40841, 40845, 40849, 40853, 40857, 40861, 40865, + 40869, 40873, 40877, 40881, 40885, 40889, 40893, 40897, 40901, 40905, + 40909, 40913, 40917, 40921, 40925, 40929, 40933, 40937, 40941, 40945, + 40949, 40953, 40957, 40961, 40965, 40969, 40973, 40977, 40981, 40985, + 40989, 40993, 40997, 41001, 41005, 41009, 41013, 41017, 41021, 41025, + 41029, 41033, 41037, 41041, 41045, 41049, 41053, 41057, 41061, 41065, + 41069, 41073, 41077, 41081, 41085, 41089, 41093, 41097, 41101, 41105, + 41109, 41113, 41117, 41121, 41125, 41129, 41133, 41137, 41141, 41145, + 41149, 41153, 41157, 41161, 41165, 41169, 41173, 41177, 41181, 41185, + 41189, 41193, 41197, 41201, 41205, 41209, 41213, 41217, 41221, 41225, + 41229, 41233, 41237, 41241, 41245, 41249, 41253, 41257, 41261, 41265, + 41269, 41273, 41277, 41281, 41285, 41289, 41293, 41297, 41301, 41305, + 41309, 41313, 41317, 41321, 41325, 41329, 41333, 41337, 41341, 41345, + 41349, 41353, 41357, 41361, 41365, 41369, 41373, 41377, 41381, 41385, + 41389, 41393, 41397, 41401, 41405, 41409, 41413, 41417, 41421, 41425, + 41429, 41433, 41437, 41441, 41445, 41449, 41453, 41457, 41461, 41465, + 41469, 41473, 41477, 41481, 41485, 41489, 41493, 41497, 41501, 41505, + 41509, 41513, 41517, 41521, 41525, 41529, 41533, 41537, 41541, 41545, + 41549, 41553, 41557, 41561, 41565, 41569, 41573, 41577, 41581, 41585, + 41589, 41593, 41597, 41601, 41605, 41609, 41613, 41617, 41621, 41625, + 41632, 41640, 41646, 41652, 41659, 41666, 41672, 41678, 41684, 41690, + 41695, 41700, 41705, 41710, 41716, 41722, 41730, 41737, 41742, 41747, + 41755, 41764, 41771, 41781, 41792, 41795, 41798, 41802, 41806, 41812, + 41818, 41828, 41838, 41848, 41858, 41865, 41872, 41879, 41886, 41897, + 41908, 41919, 41930, 41940, 41950, 41962, 41974, 41985, 41996, 42008, + 42020, 42028, 42038, 42048, 42059, 42070, 42077, 42084, 42091, 42098, + 42108, 42118, 42125, 42132, 42138, 42144, 42151, 42158, 42165, 42171, + 42177, 42182, 42190, 42200, 42208, 42216, 42224, 42232, 42240, 42248, + 42256, 42264, 42271, 42278, 42286, 42294, 42301, 42308, 42316, 42324, + 42332, 42340, 42349, 42358, 42366, 42374, 42383, 42392, 42404, 42418, + 42430, 42444, 42456, 42468, 42480, 42492, 42501, 42511, 42520, 42530, + 42544, 42558, 42566, 42572, 42579, 42586, 42593, 42600, 42605, 42611, + 42616, 42621, 42627, 42632, 42637, 42642, 42647, 42652, 42659, 42664, + 42671, 42676, 42681, 42685, 42689, 42696, 42703, 42710, 42717, 42724, + 42731, 42744, 42757, 42770, 42783, 42790, 42797, 42803, 42809, 42816, + 42823, 42830, 42837, 42841, 42846, 42853, 42860, 42867, 42873, 42877, + 42884, 42891, 42894, 42897, 42901, 42906, 42913, 42920, 42938, 42957, + 42975, 42994, 43013, 43032, 43051, 43070, 43075, 43082, 43090, 43098, + 43106, 43110, 43113, 43116, 43121, 43124, 43142, 43147, 43153, 43159, + 43163, 43166, 43169, 43172, 43180, 43190, 43198, 43206, 43210, 43215, + 43219, 43224, 43229, 43234, 43240, 43249, 43256, 43263, 43271, 43278, + 43285, 43288, 43295, 43302, 43305, 43308, 43313, 43318, 43324, 43330, + 43334, 43340, 43347, 43351, 43357, 43361, 43365, 43373, 43385, 43393, + 43397, 43399, 43408, 43417, 43423, 43426, 43431, 43436, 43441, 43446, + 43451, 43456, 43461, 43466, 43468, 43474, 43479, 43486, 43490, 43496, + 43499, 43503, 43509, 43515, 43517, 43519, 43525, 43532, 43539, 43548, + 43557, 43564, 43571, 43577, 43583, 43589, 43594, 43599, 43605, 43611, + 43616, 43623, 43627, 43631, 43644, 43657, 43668, 43677, 43683, 43690, + 43696, 43701, 43706, 43711, 43716, 43718, 43725, 43732, 43739, 43746, + 43753, 43761, 43768, 43774, 43781, 43788, 43795, 43802, 43808, 43816, + 43824, 43833, 43842, 43849, 43855, 43861, 43870, 43874, 43883, 43892, + 43900, 43908, 43912, 43919, 43926, 43933, 43937, 43943, 43950, 43955, + 43960, 43966, 43971, 43976, 43983, 43990, 43995, 44000, 44008, 44016, + 44026, 44036, 44043, 44050, 44054, 44058, 44070, 44076, 44082, 44087, + 44092, 44099, 44106, 44112, 44118, 44127, 44135, 44143, 44150, 44157, + 44164, 44170, 44177, 44183, 44190, 44197, 44204, 44211, 44217, 44222, + 44231, 44241, 44248, 44257, 44263, 44268, 44273, 44281, 44287, 44294, + 44301, 44309, 44314, 44321, 44328, 44339, 44346, 44352, 44358, 44365, + 44372, 44379, 44386, 44397, 44408, 44418, 44428, 44439, 44451, 44456, + 44461, 44469, 44477, 44483, 44489, 44498, 44507, 44515, 44523, 44531, + 44539, 44549, 44559, 44573, 44587, 44594, 44601, 44612, 44623, 44630, + 44637, 44646, 44655, 44660, 44665, 44674, 44683, 44688, 44693, 44701, + 44707, 44713, 44721, 44729, 44742, 44755, 44759, 44763, 44770, 44777, + 44784, 44792, 44800, 44808, 44816, 44822, 44828, 44834, 44840, 44847, + 44854, 44862, 44870, 44873, 44876, 44881, 44886, 44893, 44900, 44907, + 44914, 44923, 44932, 44939, 44946, 44954, 44962, 44970, 44978, 44985, + 44992, 44999, 45006, 45010, 45014, 45021, 45028, 45033, 45038, 45043, + 45048, 45054, 45068, 45075, 45082, 45086, 45088, 45090, 45095, 45100, + 45105, 45109, 45117, 45124, 45131, 45139, 45151, 45159, 45167, 45178, + 45182, 45186, 45191, 45197, 45208, 45214, 45220, 45226, 45231, 45238, + 45247, 45255, 45261, 45267, 45273, 45282, 45291, 45299, 45308, 45313, + 45316, 45321, 45327, 45333, 45339, 45345, 45349, 45352, 45356, 45360, + 45366, 45372, 45378, 45384, 45388, 45392, 45399, 45406, 45413, 45420, + 45427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45434, 45439, 45444, 45449, + 45454, 45459, 45464, 45469, 45474, 45479, 45484, 45490, 45494, 45499, + 45504, 45509, 45514, 45519, 45524, 45529, 45534, 45539, 45544, 45549, + 45554, 45559, 45564, 45569, 45574, 45579, 45584, 45589, 45594, 45599, + 45604, 45610, 45615, 45621, 45630, 45635, 45643, 45650, 45659, 45664, + 45669, 45674, 45680, 0, 45687, 45692, 45697, 45702, 45707, 45712, 45717, + 45722, 45727, 45732, 45737, 45743, 45747, 45752, 45757, 45762, 45767, + 45772, 45777, 45782, 45787, 45792, 45797, 45802, 45807, 45812, 45817, + 45822, 45827, 45832, 45837, 45842, 45847, 45852, 45857, 45863, 45868, + 45874, 45883, 45888, 45896, 45903, 45912, 45917, 45922, 45927, 45933, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45940, 45945, 45950, 45955, 45960, 45965, 45970, + 45975, 45980, 45985, 45990, 45995, 46000, 46005, 46010, 46015, 46020, + 46025, 46030, 46035, 46040, 46045, 46050, 46055, 46060, 46065, 46070, + 46075, 46080, 46085, 46090, 46094, 46098, 46103, 46108, 46113, 46118, + 46123, 46128, 46133, 46138, 46143, 46148, 46153, 46158, 46163, 46168, + 46173, 46178, 46183, 46188, 46195, 46202, 46209, 46216, 46223, 46230, + 46237, 46244, 46251, 46258, 46265, 46272, 46279, 46286, 46291, 46296, + 46303, 46310, 46317, 46324, 46331, 46338, 46345, 46352, 46359, 46366, + 46373, 46380, 46386, 46392, 46398, 46404, 46411, 46418, 46425, 46432, + 46439, 46446, 46453, 46460, 46467, 46474, 46482, 46490, 46498, 46506, + 46514, 46522, 46530, 46538, 46542, 46548, 46554, 46558, 46564, 46570, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46576, 46583, 46592, 46601, 46609, + 46616, 46620, 46625, 46630, 46635, 46640, 46645, 46650, 46655, 46660, + 46665, 46670, 46675, 46680, 46685, 46690, 46695, 46700, 46705, 46710, + 46715, 46720, 46725, 46730, 46735, 46740, 46745, 46750, 46755, 46760, + 46765, 46770, 46775, 46780, 46785, 46790, 46795, 46800, 46805, 46810, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46815, 46818, 46822, 46826, 46830, 46834, + 46842, 46846, 46850, 46854, 46858, 46862, 46866, 46870, 46874, 46880, + 46884, 46888, 46896, 46902, 46906, 46910, 46914, 46920, 46924, 46930, + 46934, 46938, 46944, 46950, 46954, 46958, 46962, 46968, 46974, 46978, + 46982, 46986, 46990, 46994, 47000, 47006, 47010, 47014, 47018, 47022, + 47026, 47030, 47034, 47038, 47042, 47046, 47050, 47056, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 47060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47066, + 47070, 47074, 47078, 47082, 47086, 47090, 47094, 47098, 47102, 47106, + 47112, 47116, 47120, 47124, 47128, 47132, 47136, 47140, 47144, 47148, + 47152, 47156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47160, 47164, 47168, 47172, + 47176, 47180, 47184, 0, 47188, 47192, 47196, 47200, 47204, 47208, 47212, + 0, 47216, 47220, 47224, 47228, 47232, 47236, 47240, 0, 47244, 47248, + 47252, 47256, 47260, 47264, 47268, 0, 47272, 47276, 47280, 47284, 47288, + 47292, 47296, 0, 47300, 47304, 47308, 47312, 47316, 47320, 47324, 0, + 47328, 47332, 47336, 47340, 47344, 47348, 47352, 0, 47356, 47360, 47364, + 47368, 47372, 47376, 47380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47384, 47390, + 47398, 47402, 47406, 47412, 47418, 47424, 47432, 47438, 47442, 47446, + 47450, 47456, 47462, 47466, 47468, 47472, 47477, 47479, 47483, 47487, + 47491, 47497, 0, 0, 0, 0, 47502, 47507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47512, 47516, 47520, 47525, + 47530, 47535, 47539, 47543, 47547, 47552, 47557, 47561, 47565, 47569, + 47573, 47578, 47583, 47588, 47593, 47597, 47601, 47606, 47611, 47616, + 47621, 47625, 0, 47629, 47633, 47637, 47641, 47645, 47649, 47653, 47658, + 47663, 47667, 47672, 47677, 47686, 47690, 47694, 47698, 47705, 47709, + 47714, 47719, 47723, 47727, 47733, 47738, 47743, 47748, 47753, 47757, + 47761, 47765, 47769, 47773, 47778, 47783, 47787, 47791, 47796, 47801, + 47806, 47810, 47814, 47819, 47824, 47830, 47836, 47840, 47846, 47852, + 47856, 47862, 47868, 47873, 47878, 47882, 47888, 47892, 47896, 47902, + 47908, 47913, 47918, 47922, 47926, 47934, 47940, 47946, 47952, 47957, + 47962, 47967, 47973, 47977, 47983, 47987, 47991, 47997, 48003, 48009, + 48015, 48021, 48027, 48033, 48039, 48045, 48051, 48057, 48063, 48067, + 48073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48079, 48082, 48086, 48090, + 48094, 48098, 48101, 48104, 48108, 48112, 48116, 48120, 48123, 48128, + 48132, 48136, 48140, 48146, 48150, 48154, 48158, 48162, 48169, 48175, + 48179, 48183, 48187, 48191, 48195, 48199, 48203, 48207, 48211, 48215, + 48219, 48225, 48229, 48233, 48237, 48241, 48245, 48249, 48253, 48257, + 48261, 48265, 48269, 48273, 48277, 48281, 48285, 48289, 48295, 48301, + 48306, 48311, 48315, 48319, 48323, 48327, 48331, 48335, 48339, 48343, + 48347, 48351, 48355, 48359, 48363, 48367, 48371, 48375, 48379, 48383, + 48387, 48391, 48395, 48398, 48402, 48406, 48412, 48416, 48420, 48424, + 48428, 48432, 48436, 48440, 48444, 48448, 48455, 48459, 48463, 48467, + 48471, 48475, 48479, 48483, 48487, 48491, 48495, 48499, 48503, 48510, + 48514, 48520, 48524, 48528, 48532, 48536, 48540, 48543, 48547, 48551, + 48555, 48559, 48563, 48567, 48571, 48575, 48579, 48583, 48587, 48591, + 48595, 48599, 48603, 48607, 48611, 48615, 48619, 48623, 48627, 48631, + 48635, 48639, 48643, 48647, 48651, 48655, 48659, 48663, 48667, 48671, + 48677, 48681, 48685, 48689, 48693, 48697, 48701, 48705, 48709, 48713, + 48717, 48721, 48725, 48729, 48733, 48737, 48741, 48745, 48749, 48753, + 48757, 48761, 48765, 48769, 48773, 48777, 48781, 48785, 48793, 48797, + 48801, 48805, 48809, 48813, 48819, 48823, 48827, 48831, 48835, 48839, + 48843, 48847, 48851, 48855, 48859, 48863, 48867, 48871, 48877, 48881, + 48885, 48889, 48893, 48897, 48901, 48905, 48909, 48913, 48917, 48921, + 48925, 48929, 48933, 48937, 48941, 48945, 48949, 48953, 48957, 48961, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48965, 48972, 48979, 48989, 48999, 49007, 49016, 49025, 49035, 49046, + 49056, 49067, 0, 0, 0, 0, 49073, 49076, 49079, 49083, 49086, 49093, + 49097, 49101, 49105, 49108, 49111, 49115, 49119, 49123, 49127, 49132, + 49137, 49142, 49147, 49150, 49153, 49159, 49165, 49170, 49175, 49182, + 49189, 49193, 49197, 49201, 49208, 49214, 49221, 49226, 49230, 49234, + 49238, 49242, 49246, 49250, 49254, 49258, 49262, 49267, 49272, 49277, + 49282, 49288, 49293, 49297, 49303, 49314, 49323, 49337, 49346, 49350, + 49359, 49364, 49369, 49374, 49379, 49382, 49387, 49391, 0, 49397, 49401, + 49404, 49408, 49411, 49415, 49418, 49422, 49425, 49429, 49432, 49435, + 49439, 49443, 49447, 49451, 49455, 49459, 49463, 49467, 49471, 49475, + 49479, 49483, 49487, 49491, 49495, 49499, 49503, 49507, 49511, 49515, + 49519, 49523, 49527, 49532, 49536, 49540, 49544, 49548, 49551, 49555, + 49559, 49563, 49567, 49571, 49575, 49578, 49582, 49586, 49590, 49594, + 49598, 49602, 49606, 49610, 49614, 49618, 49622, 49626, 49630, 49634, + 49637, 49641, 49645, 49649, 49653, 49657, 49660, 49665, 49669, 49674, + 49678, 49682, 49686, 49690, 49694, 49698, 49703, 49707, 49711, 49715, + 49719, 49722, 49726, 49730, 0, 0, 49735, 49743, 49751, 49758, 49765, + 49769, 49775, 49780, 49785, 49789, 49792, 49796, 49799, 49803, 49806, + 49810, 49813, 49817, 49820, 49823, 49827, 49831, 49835, 49839, 49843, + 49847, 49851, 49855, 49859, 49863, 49867, 49871, 49875, 49879, 49883, + 49887, 49891, 49895, 49899, 49903, 49907, 49911, 49915, 49920, 49924, + 49928, 49932, 49936, 49939, 49943, 49947, 49951, 49955, 49959, 49963, + 49966, 49970, 49974, 49978, 49982, 49986, 49990, 49994, 49998, 50002, + 50006, 50010, 50014, 50018, 50022, 50025, 50029, 50033, 50037, 50041, + 50045, 50048, 50053, 50057, 50062, 50066, 50070, 50074, 50078, 50082, + 50086, 50091, 50095, 50099, 50103, 50107, 50110, 50114, 50118, 50123, + 50127, 50131, 50135, 50139, 50144, 50151, 50155, 50161, 0, 0, 0, 0, 0, + 50166, 50169, 50172, 50175, 50179, 50182, 50185, 50188, 50191, 50194, + 50198, 50201, 50204, 50208, 50211, 50215, 50219, 50223, 50226, 50230, + 50234, 50237, 50240, 50243, 50246, 50250, 50254, 50258, 50262, 50266, + 50270, 50274, 50278, 50282, 50286, 50289, 50292, 50296, 50299, 50303, 0, + 0, 0, 0, 50307, 50311, 50315, 50319, 50323, 50327, 50331, 50335, 50339, + 50343, 50347, 50351, 50355, 50359, 50363, 50367, 50371, 50375, 50379, + 50383, 50387, 50391, 50395, 50399, 50403, 50407, 50411, 50415, 50419, + 50423, 50427, 50430, 50434, 50437, 50441, 50445, 50448, 50452, 50456, + 50459, 50463, 50467, 50471, 50475, 50478, 50482, 50486, 50490, 50494, + 50498, 50502, 50505, 50508, 50512, 50516, 50520, 50524, 50528, 50532, + 50536, 50540, 50544, 50548, 50552, 50556, 50560, 50564, 50568, 50572, + 50576, 50580, 50584, 50588, 50592, 50596, 50600, 50604, 50608, 50612, + 50616, 50620, 50624, 50628, 50632, 50636, 50640, 50644, 50648, 50652, + 50656, 50660, 50664, 50668, 50672, 0, 50676, 50682, 50688, 50694, 50699, + 50704, 50710, 50716, 50722, 50728, 50734, 50740, 50746, 50752, 50758, + 50764, 50770, 50774, 50778, 50782, 50786, 50790, 50794, 50798, 50802, + 50806, 50810, 50814, 50818, 50822, 50826, 50830, 50834, 50838, 50842, + 50846, 50850, 50854, 50858, 50863, 0, 0, 0, 0, 0, 0, 0, 0, 50867, 50871, + 50876, 50881, 50886, 50891, 50896, 50901, 50906, 50911, 50916, 50921, + 50926, 50931, 50936, 50941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50945, 50950, 50955, + 50960, 50964, 50969, 50973, 50978, 50983, 50988, 50993, 50998, 51003, + 51008, 51013, 51018, 51023, 51027, 51031, 51035, 51039, 51043, 51047, + 51051, 51055, 51059, 51063, 51067, 51071, 51075, 51079, 51084, 51089, + 51094, 51099, 51104, 51109, 51114, 51119, 51124, 51129, 51134, 51139, + 51144, 51149, 51154, 51160, 0, 51167, 51170, 51173, 51176, 51179, 51182, + 51185, 51188, 51191, 51194, 51198, 51202, 51206, 51210, 51214, 51218, + 51222, 51226, 51230, 51234, 51238, 51242, 51246, 51250, 51254, 51258, + 51262, 51266, 51270, 51274, 51278, 51282, 51286, 51290, 51294, 51298, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51302, 51305, 51310, 51315, 51320, + 51325, 51330, 51335, 51340, 51345, 51350, 51354, 51359, 51364, 51369, + 51374, 51379, 51383, 51387, 51391, 51395, 51399, 51403, 51407, 51411, + 51415, 51419, 51423, 51427, 51431, 51435, 51440, 51445, 51450, 51455, + 51460, 51465, 51470, 51475, 51480, 51485, 51490, 51495, 51500, 51505, + 51511, 51517, 51522, 51527, 51530, 51533, 51536, 51539, 51542, 51545, + 51548, 51551, 51554, 51558, 51562, 51566, 51570, 51574, 51578, 51582, + 51586, 51590, 51594, 51598, 51602, 51606, 51610, 51614, 51618, 51622, + 51626, 51630, 51634, 51638, 51642, 51646, 51650, 51654, 51658, 51662, + 51666, 51670, 51674, 51678, 51681, 51685, 51689, 51693, 51697, 51701, + 51705, 51709, 51713, 51718, 51723, 51728, 51733, 51737, 51742, 51747, + 51752, 51757, 51762, 51767, 51772, 51777, 51782, 51786, 51792, 51798, + 51804, 51810, 51816, 51822, 51828, 51834, 51840, 51846, 51852, 51858, + 51861, 51864, 51867, 51872, 51875, 51878, 51881, 51884, 51887, 51890, + 51894, 51898, 51902, 51906, 51910, 51914, 51918, 51922, 51926, 51930, + 51934, 51938, 51942, 51945, 51949, 51953, 51957, 51961, 51965, 51968, + 51972, 51976, 51980, 51984, 51987, 51991, 51995, 51999, 52003, 52006, + 52010, 52014, 52018, 52022, 52026, 52030, 52034, 52038, 52042, 52046, 0, + 52050, 52053, 52056, 52059, 52062, 52065, 52068, 52071, 52074, 52077, + 52080, 52083, 52086, 52089, 52092, 52095, 52098, 52101, 52104, 52107, + 52110, 52113, 52116, 52119, 52122, 52125, 52128, 52131, 52134, 52137, + 52140, 52143, 52146, 52149, 52152, 52155, 52158, 52161, 52164, 52167, + 52170, 52173, 52176, 52179, 52182, 52185, 52188, 52191, 52194, 52197, + 52200, 52203, 52206, 52209, 52212, 52215, 52218, 52221, 52224, 52227, + 52230, 52233, 52236, 52239, 52242, 52245, 52248, 52251, 52254, 52257, + 52260, 52263, 52266, 52269, 52272, 52275, 52278, 52281, 52284, 52287, + 52290, 52293, 52296, 52299, 52302, 52305, 52308, 52311, 52314, 52322, + 52329, 52336, 52343, 52350, 52357, 52364, 52371, 52378, 52385, 52393, + 52401, 52409, 52417, 52425, 52433, 52441, 52449, 52457, 52465, 52473, + 52481, 52489, 52497, 52505, 52508, 52511, 52514, 52516, 52519, 52522, + 52525, 52530, 52535, 52538, 52545, 52552, 52559, 52566, 52569, 52574, + 52577, 52581, 52583, 52585, 52588, 52591, 52594, 52597, 52600, 52603, + 52606, 52611, 52615, 52618, 52621, 52624, 52627, 52630, 52633, 52636, + 52640, 52643, 52646, 52649, 52652, 52655, 52659, 52662, 52665, 52668, + 52673, 52678, 52683, 52688, 52693, 52698, 52703, 52708, 52714, 52723, + 52726, 52729, 52732, 52735, 52738, 52744, 52753, 52756, 52759, 52763, + 52766, 52769, 52772, 52776, 52779, 52782, 52787, 52790, 52793, 52798, + 52801, 52804, 52809, 52814, 52819, 52822, 52825, 52828, 52831, 52838, + 52841, 52844, 52847, 52849, 52852, 52855, 52858, 52863, 52866, 52869, + 52872, 52875, 52878, 52883, 52886, 52889, 52892, 52895, 52898, 52901, + 52904, 52907, 52910, 52916, 52921, 52928, 52935, 52942, 52949, 52956, + 52963, 52970, 52977, 52984, 52992, 53000, 53008, 53016, 53024, 53032, + 53040, 53048, 53056, 53064, 53072, 53080, 53088, 53096, 53104, 53112, + 53120, 53128, 53136, 53144, 53152, 53160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 53163, 53171, 53179, 53189, 53195, 53199, 53203, 53209, + 53215, 53220, 53224, 53228, 53232, 53236, 53242, 53246, 53250, 53254, + 53264, 53268, 53272, 53278, 53282, 53288, 53292, 53296, 53302, 53308, + 53314, 53322, 53330, 53334, 53338, 53342, 53348, 53352, 53361, 53367, + 53371, 53375, 53379, 53383, 53387, 53391, 53398, 53404, 53410, 53414, + 53420, 53424, 53430, 53438, 53448, 53452, 53460, 53464, 53470, 53478, + 53486, 53490, 53494, 53500, 53505, 53511, 53517, 53521, 53525, 53528, + 53532, 53536, 53540, 53544, 53548, 53552, 53556, 53559, 53563, 53567, + 53571, 53575, 53579, 53583, 53586, 53590, 53594, 53597, 53601, 53605, + 53609, 53613, 53617, 53621, 53625, 53629, 53633, 53637, 53641, 53645, + 53649, 53653, 53657, 53661, 53665, 53669, 53673, 53677, 53681, 53685, + 53689, 53693, 53697, 53701, 53705, 53709, 53713, 53717, 53721, 53725, + 53729, 53733, 53737, 53741, 53745, 53749, 53753, 53757, 53761, 53765, + 53769, 53773, 53777, 53781, 53785, 53789, 53793, 53797, 53801, 53805, + 53809, 53813, 53817, 53821, 53825, 53829, 53833, 53837, 53841, 53845, + 53849, 53853, 53857, 53861, 53865, 53869, 53873, 53877, 53881, 53885, + 53889, 53893, 53897, 53901, 53905, 53909, 53913, 53917, 53921, 53925, + 53929, 53933, 53937, 53941, 53945, 53949, 53953, 53957, 53961, 53965, + 53969, 53973, 53977, 53981, 53985, 53989, 53993, 53997, 54001, 54005, + 54009, 54013, 54017, 54021, 54025, 54029, 54033, 54037, 54041, 54045, + 54049, 54053, 54057, 54061, 54065, 54069, 54073, 54077, 54081, 54085, + 54089, 54093, 54097, 54101, 54105, 54109, 54113, 54117, 54121, 54125, + 54129, 54133, 54137, 54141, 54145, 54149, 54153, 54157, 54161, 54165, + 54169, 54173, 54177, 54181, 54185, 54189, 54193, 54197, 54201, 54205, + 54209, 54213, 54217, 54221, 54225, 54229, 54233, 54237, 54241, 54245, + 54248, 54252, 54256, 54260, 54264, 54268, 54272, 54276, 54280, 54284, + 54288, 54292, 54296, 54300, 54304, 54308, 54312, 54316, 54320, 54324, + 54328, 54332, 54336, 54340, 54344, 54348, 54352, 54356, 54360, 54364, + 54368, 54372, 54376, 54380, 54384, 54388, 54392, 54396, 54400, 54404, + 54408, 54412, 54416, 54420, 54424, 54428, 54432, 54436, 54440, 54444, + 54448, 54452, 54456, 54460, 54464, 54468, 54472, 54476, 54480, 54484, + 54488, 54492, 54496, 54500, 54504, 54508, 54512, 54516, 54520, 54524, + 54528, 54532, 54536, 54540, 54544, 54548, 54552, 54556, 54560, 54564, + 54568, 54572, 54576, 54580, 54584, 54588, 54592, 54596, 54600, 54604, + 54608, 54612, 54616, 54620, 54624, 54628, 54632, 54636, 54640, 54644, + 54648, 54652, 54656, 54660, 54664, 54668, 54672, 54676, 54680, 54684, + 54688, 54692, 54696, 54700, 54704, 54708, 54711, 54715, 54719, 54723, + 54727, 54731, 54735, 54739, 54743, 54747, 54751, 54755, 54759, 54763, + 54767, 54771, 54775, 54779, 54783, 54787, 54791, 54795, 54799, 54803, + 54807, 54811, 54815, 54819, 54823, 54827, 54831, 54835, 54839, 54843, + 54847, 54851, 54855, 54859, 54863, 54867, 54871, 54875, 54879, 54883, + 54887, 54891, 54895, 54899, 54903, 54907, 54911, 54915, 54919, 54923, + 54927, 54931, 54935, 54939, 54943, 54947, 54951, 54955, 54959, 54963, + 54967, 54971, 54975, 54979, 54983, 54987, 54991, 54995, 54999, 55003, + 55007, 55011, 55015, 55019, 55023, 55027, 55031, 55035, 55039, 55043, + 55047, 55051, 55055, 55059, 55063, 55067, 55071, 55075, 55079, 55083, + 55087, 55091, 55095, 55099, 55103, 55107, 55111, 55115, 55119, 55123, + 55127, 55131, 55135, 55139, 55143, 55147, 55151, 55155, 55159, 55163, + 55167, 55171, 55175, 55179, 55183, 55187, 55191, 55195, 55199, 55203, + 55207, 55211, 55215, 55219, 55223, 55227, 55231, 55235, 55239, 55243, + 55247, 55251, 55255, 55259, 55263, 55267, 55271, 55275, 55279, 55283, + 55287, 55291, 55295, 55299, 55303, 55307, 55311, 55315, 55319, 55323, + 55327, 55331, 55335, 55339, 55343, 55347, 55351, 55355, 55359, 55363, + 55367, 55371, 55375, 55379, 55383, 55387, 55391, 55395, 55399, 55403, + 55407, 55411, 55415, 55419, 55423, 55427, 55431, 55435, 55439, 55443, + 55447, 55451, 55455, 55459, 55463, 55467, 55471, 55475, 55479, 55483, + 55487, 55491, 55495, 55499, 55503, 55507, 55511, 55515, 55519, 55523, + 55527, 55531, 55535, 55539, 55543, 55547, 55551, 55555, 55559, 55563, + 55566, 55570, 55574, 55578, 55582, 55586, 55590, 55594, 55598, 55602, + 55606, 55610, 55614, 55618, 55622, 55626, 55630, 55634, 55638, 55642, + 55646, 55650, 55654, 55658, 55662, 55666, 55670, 55674, 55678, 55682, + 55686, 55690, 55694, 55698, 55702, 55706, 55710, 55714, 55718, 55722, + 55726, 55730, 55734, 55738, 55742, 55746, 55750, 55754, 55758, 55762, + 55766, 55770, 55774, 55778, 55782, 55786, 55790, 55794, 55798, 55802, + 55806, 55810, 55814, 55818, 55822, 55826, 55830, 55834, 55838, 55842, + 55846, 55850, 55854, 55858, 55862, 55866, 55870, 55874, 55878, 55882, + 55886, 55890, 55894, 55898, 55902, 55906, 55910, 55914, 55918, 55922, + 55926, 55930, 55934, 55938, 55942, 55946, 55950, 55954, 55958, 55962, + 55966, 55970, 55974, 55978, 55982, 55986, 55990, 55994, 55998, 56002, + 56006, 56010, 56014, 56018, 56021, 56025, 56029, 56033, 56037, 56041, + 56045, 56049, 56053, 56057, 56061, 56065, 56069, 56073, 56077, 56081, + 56085, 56089, 56093, 56097, 56101, 56105, 56109, 56113, 56117, 56121, + 56125, 56129, 56133, 56137, 56141, 56145, 56149, 56153, 56157, 56161, + 56165, 56169, 56173, 56177, 56181, 56185, 56189, 56193, 56197, 56201, + 56205, 56209, 56213, 56217, 56221, 56225, 56229, 56233, 56237, 56241, + 56245, 56249, 56253, 56257, 56261, 56265, 56269, 56273, 56277, 56281, + 56285, 56289, 56293, 56297, 56301, 56305, 56309, 56313, 56317, 56321, + 56325, 56329, 56333, 56337, 56341, 56345, 56349, 56353, 56357, 56361, + 56365, 56369, 56373, 56377, 56381, 56385, 56389, 56393, 56397, 56401, + 56405, 56409, 56413, 56417, 56421, 56425, 56429, 56433, 56437, 56441, + 56445, 56449, 56453, 56457, 56461, 56465, 56469, 56473, 56477, 56481, + 56485, 56489, 56493, 56497, 56501, 56505, 56509, 56513, 56517, 56521, + 56525, 56529, 56533, 56537, 56541, 56545, 56549, 56553, 56557, 56561, + 56565, 56569, 56573, 56577, 56581, 56585, 56589, 56593, 56597, 56601, + 56605, 56609, 56613, 56617, 56621, 56624, 56628, 56632, 56636, 56640, + 56644, 56648, 56652, 56656, 56660, 56664, 56668, 56672, 56676, 56680, + 56684, 56688, 56692, 56696, 56700, 56704, 56708, 56712, 56716, 56720, + 56724, 56728, 56732, 56736, 56740, 56744, 56748, 56752, 56756, 56760, + 56764, 56768, 56772, 56776, 56780, 56784, 56788, 56792, 56796, 56800, + 56804, 56808, 56812, 56816, 56820, 56824, 56828, 56832, 56836, 56840, + 56844, 56848, 56852, 56856, 56860, 56864, 56868, 56872, 56876, 56880, + 56884, 56888, 56892, 56896, 56900, 56904, 56908, 56912, 56916, 56920, + 56924, 56928, 56932, 56936, 56940, 56944, 56948, 56952, 56956, 56960, + 56964, 56968, 56972, 56976, 56980, 56984, 56988, 56992, 56996, 57000, + 57004, 57008, 57012, 57016, 57020, 57024, 57028, 57032, 57036, 57040, + 57044, 57048, 57052, 57056, 57060, 57064, 57068, 57072, 57076, 57080, + 57084, 57088, 57092, 57096, 57100, 57104, 57108, 57112, 57116, 57120, + 57124, 57128, 57132, 57136, 57140, 57144, 57148, 57152, 57156, 57160, + 57164, 57168, 57172, 57176, 57180, 57184, 57188, 57192, 57196, 57200, + 57204, 57208, 57212, 57216, 57220, 57224, 57228, 57232, 57236, 57240, + 57244, 57248, 57252, 57256, 57260, 57264, 57268, 57272, 57276, 57280, + 57284, 57288, 57292, 57296, 57300, 57304, 57308, 57312, 57316, 57320, + 57324, 57328, 57332, 57336, 57340, 57344, 57348, 57352, 57356, 57360, + 57364, 57368, 57372, 57376, 57380, 57384, 57388, 57392, 57396, 57400, + 57404, 57408, 57412, 57416, 57420, 57424, 57428, 57432, 57436, 57440, + 57444, 57448, 57452, 57456, 57460, 57464, 57468, 57472, 57476, 57480, + 57484, 57488, 57492, 57496, 57500, 57504, 57508, 57512, 57516, 57520, + 57524, 57528, 57532, 57536, 57540, 57544, 57548, 57552, 57556, 57560, + 57564, 57568, 57572, 57576, 57580, 57584, 57588, 57592, 57596, 57600, + 57604, 57608, 57612, 57616, 57620, 57624, 57628, 57632, 57636, 57640, + 57644, 57648, 57652, 57656, 57660, 57664, 57668, 57672, 57676, 57680, + 57684, 57688, 57692, 57696, 57700, 57704, 57708, 57712, 57716, 57720, + 57724, 57728, 57732, 57736, 57740, 57744, 57748, 57752, 57756, 57760, + 57764, 57768, 57772, 57776, 57780, 57784, 57788, 57792, 57796, 57800, + 57804, 57808, 57812, 57816, 57820, 57824, 57828, 57832, 57836, 57840, + 57844, 57848, 57852, 57856, 57860, 57864, 57868, 57872, 57876, 57880, + 57884, 57888, 57892, 57896, 57900, 57904, 57908, 57912, 57916, 57920, + 57924, 57928, 57932, 57936, 57940, 57944, 57948, 57952, 57956, 57960, + 57964, 57968, 57972, 57976, 57980, 57984, 57988, 57992, 57996, 58000, + 58004, 58008, 58012, 58016, 58020, 58024, 58028, 58032, 58036, 58040, + 58044, 58048, 58052, 58056, 58060, 58064, 58068, 58072, 58076, 58080, + 58084, 58088, 58092, 58096, 58100, 58104, 58108, 58112, 58116, 58120, + 58124, 58128, 58132, 58136, 58140, 58144, 58148, 58152, 58156, 58160, + 58164, 0, 0, 0, 58168, 58172, 58176, 58180, 58184, 58188, 58192, 58196, + 58200, 58204, 58208, 58212, 58216, 58220, 58224, 58228, 58232, 58236, + 58240, 58244, 58248, 58252, 58256, 58260, 58264, 58268, 58272, 58276, + 58280, 58284, 58288, 58292, 58296, 58300, 58304, 58308, 58312, 58316, + 58320, 58324, 58328, 58332, 58336, 58340, 58344, 58348, 58352, 58356, + 58360, 58364, 58368, 58372, 58376, 58380, 58384, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 58388, 58397, 58406, 58415, 58424, 58433, 58442, 58451, 58460, 58468, + 58475, 58483, 58490, 58498, 58508, 58517, 58527, 58536, 58546, 58554, + 58561, 58569, 58576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58584, 58590, 58596, + 58603, 58609, 58615, 58621, 58628, 58635, 58642, 58649, 58656, 58663, + 58670, 58677, 58684, 58691, 58698, 58705, 58712, 58719, 58725, 58732, + 58739, 58746, 58753, 58760, 58767, 58774, 58781, 58788, 58795, 58802, + 58809, 58816, 58823, 58830, 58837, 58844, 58851, 58859, 58867, 58875, + 58883, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58891, 58895, 58899, 58903, + 58907, 58911, 58915, 58919, 58923, 58927, 58931, 58935, 58939, 58943, + 58947, 58951, 58955, 58959, 58963, 58967, 58971, 58975, 58979, 58983, + 58987, 58991, 58995, 58999, 59003, 59007, 59011, 59015, 59019, 59023, + 59027, 59031, 59035, 59039, 59043, 59047, 59051, 59055, 59059, 59063, + 59067, 59071, 59075, 59079, 59083, 59087, 59091, 59095, 59099, 59103, + 59107, 59111, 59115, 59119, 59123, 59127, 59131, 59135, 59139, 59143, + 59147, 59151, 59155, 59159, 59163, 59167, 59171, 59175, 59179, 59183, + 59187, 59191, 59195, 59199, 59203, 59207, 59211, 59215, 59219, 59223, + 59227, 59231, 59235, 59239, 59243, 59247, 59251, 59255, 59259, 59263, + 59267, 59271, 59275, 59279, 59283, 59287, 59291, 59295, 59299, 59303, + 59307, 59311, 59315, 59319, 59323, 59327, 59331, 59335, 59339, 59343, + 59347, 59351, 59355, 59359, 59363, 59367, 59371, 59375, 59379, 59383, + 59387, 59391, 59395, 59399, 59403, 59407, 59411, 59415, 59419, 59423, + 59427, 59431, 59435, 59439, 59443, 59447, 59451, 59455, 59459, 59463, + 59467, 59471, 59475, 59479, 59483, 59487, 59491, 59495, 59499, 59503, + 59507, 59511, 59515, 59519, 59523, 59527, 59531, 59535, 59539, 59543, + 59547, 59551, 59555, 59559, 59563, 59567, 59571, 59575, 59579, 59583, + 59587, 59591, 59595, 59599, 59603, 59607, 59611, 59615, 59619, 59623, + 59627, 59631, 59635, 59639, 59643, 59647, 59651, 59655, 59659, 59663, + 59667, 59671, 59675, 59679, 59683, 59687, 59691, 59695, 59699, 59703, + 59707, 59711, 59715, 59719, 59723, 59727, 59731, 59735, 59739, 59743, + 59747, 59751, 59755, 59759, 59763, 59767, 59771, 59775, 59779, 59783, + 59787, 59791, 59795, 59799, 59803, 59807, 59811, 59815, 59819, 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, + 59947, 59951, 59955, 59959, 59963, 59967, 59971, 59975, 59979, 59983, + 59987, 59991, 59995, 59999, 60003, 60007, 60011, 60015, 60019, 60023, + 60027, 60031, 60035, 60039, 60043, 60047, 60051, 60055, 60059, 60063, + 60067, 60071, 60075, 60079, 60083, 60087, 60091, 60095, 0, 0, 60099, + 60103, 60107, 60111, 60115, 60119, 60123, 60127, 60131, 60135, 60139, + 60143, 60147, 60151, 60155, 60159, 60163, 60167, 60171, 60175, 60179, + 60183, 60187, 60191, 60195, 60199, 60203, 60207, 60211, 60215, 60219, + 60223, 60227, 60231, 60235, 60239, 60243, 60247, 60251, 60255, 60259, + 60263, 60267, 60271, 60275, 60279, 60283, 60287, 60291, 60295, 60299, + 60303, 60307, 60311, 60315, 60319, 60323, 60327, 60331, 0, 0, 0, 0, 0, + 60335, 60339, 60343, 60347, 60351, 60355, 60359, 60363, 60367, 60371, + 60375, 60379, 60383, 60387, 60391, 60395, 60399, 60403, 60407, 60411, + 60415, 60419, 60423, 60427, 60431, 60435, 60439, 60443, 60447, 60451, + 60455, 60459, 60463, 60467, 60471, 60475, 60479, 60483, 60487, 60491, + 60495, 60499, 60503, 60507, 60511, 60515, 60519, 60523, 60527, 60531, + 60535, 60539, 60543, 60547, 60551, 60555, 60559, 60563, 60567, 60571, + 60575, 60579, 60583, 60587, 60591, 60595, 60599, 60603, 60607, 60611, + 60615, 60619, 60623, 60627, 60631, 60635, 60639, 60643, 60647, 60651, + 60655, 60659, 60663, 60667, 60671, 60675, 60679, 60683, 60687, 60691, + 60695, 60699, 60703, 60707, 60711, 60715, 60719, 60723, 60727, 60731, + 60735, 60739, 60743, 60747, 60751, 60755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 60759, 60764, 60769, 60774, 60779, 60784, 60791, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 60796, 60803, 60810, 60817, 60824, 0, 0, 0, 0, 0, + 60831, 60838, 60845, 60855, 60861, 60867, 60873, 60879, 60885, 60891, + 60898, 60904, 60910, 60917, 60926, 60935, 60947, 60959, 60965, 60971, + 60977, 60984, 60991, 60998, 61005, 61012, 0, 61019, 61026, 61033, 61041, + 61048, 0, 61055, 0, 61062, 61069, 0, 61076, 61084, 0, 61091, 61098, + 61105, 61112, 61119, 61126, 61133, 61140, 61147, 61154, 61159, 61166, + 61173, 61179, 61185, 61191, 61197, 61203, 61209, 61215, 61221, 61227, + 61233, 61239, 61245, 61251, 61257, 61263, 61269, 61275, 61281, 61287, + 61293, 61299, 61305, 61311, 61317, 61323, 61329, 61335, 61341, 61347, + 61353, 61359, 61365, 61371, 61377, 61383, 61389, 61395, 61401, 61407, + 61413, 61419, 61425, 61431, 61437, 61443, 61449, 61455, 61461, 61467, + 61473, 61479, 61485, 61491, 61497, 61503, 61509, 61515, 61521, 61527, + 61533, 61539, 61545, 61551, 61557, 61563, 61569, 61575, 61581, 61587, + 61593, 61599, 61605, 61611, 61617, 61623, 61629, 61636, 61643, 61649, + 61655, 61661, 61667, 61676, 61685, 61693, 61701, 61709, 61717, 61725, + 61733, 61741, 61749, 61756, 61763, 61773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61783, 61789, 61795, 61801, 61807, 61812, 61817, 61823, 61829, 61835, + 61841, 61849, 61855, 61861, 61869, 61877, 61885, 61893, 61898, 61903, + 61908, 61913, 61925, 61937, 61947, 61957, 61968, 61979, 61990, 62001, + 62011, 62021, 62032, 62043, 62054, 62065, 62075, 62085, 62095, 62110, + 62125, 62140, 62147, 62154, 62161, 62168, 62178, 62188, 62198, 62209, + 62219, 62227, 62235, 62243, 62251, 62260, 62268, 62276, 62284, 62292, + 62300, 62309, 62317, 62325, 62333, 62342, 62350, 62357, 62364, 62371, + 62378, 62385, 62392, 62399, 62407, 62415, 62423, 62431, 62439, 62447, + 62455, 62463, 62471, 62479, 62487, 62495, 62503, 62511, 62519, 62527, + 62535, 62543, 62551, 62559, 62567, 62576, 62584, 62592, 62600, 62609, + 62617, 62625, 62633, 62641, 62649, 62657, 62665, 62674, 62682, 62689, + 62696, 62703, 62710, 62718, 62725, 62732, 62739, 62746, 62753, 62761, + 62768, 62775, 62782, 62789, 62796, 62804, 62811, 62819, 62827, 62836, + 62844, 62851, 62858, 62865, 62872, 62880, 62887, 62897, 62907, 62917, + 62926, 62935, 62944, 62953, 62962, 62972, 62983, 62994, 63004, 63014, + 63025, 63035, 63044, 63053, 63061, 63069, 63078, 63086, 63095, 63104, + 63112, 63120, 63129, 63137, 63146, 63155, 63163, 63171, 63180, 63188, + 63197, 63205, 63214, 63222, 63230, 63238, 63246, 63255, 63263, 63270, + 63278, 63285, 63292, 63299, 63307, 63315, 63322, 63329, 63337, 63344, + 63354, 63362, 63370, 63377, 63384, 63392, 63399, 63409, 63419, 63429, + 63439, 63450, 63458, 63466, 63474, 63482, 63491, 63499, 63507, 63515, + 63523, 63532, 63540, 63547, 63554, 63561, 63568, 63575, 63582, 63590, + 63598, 63606, 63614, 63622, 63630, 63638, 63646, 63654, 63662, 63670, + 63678, 63686, 63694, 63702, 63710, 63718, 63726, 63734, 63742, 63750, + 63758, 63766, 63774, 63782, 63790, 63798, 63806, 63813, 63820, 63827, + 63834, 63842, 63849, 63856, 63863, 63870, 63877, 63884, 63891, 63898, + 63906, 63914, 63922, 63932, 63939, 63946, 63953, 63960, 63968, 63978, + 63989, 63997, 64006, 64014, 64023, 64031, 64040, 64048, 64057, 64065, + 64074, 64082, 64090, 64097, 64104, 64112, 64119, 64127, 64136, 64145, + 64154, 64163, 64171, 64180, 64188, 64197, 64205, 64214, 64222, 64231, + 64239, 64247, 64254, 64262, 64269, 64277, 64284, 64293, 64301, 64310, + 64318, 64326, 64334, 64342, 64350, 64359, 64368, 64377, 64386, 64395, + 64403, 64412, 64420, 64429, 64437, 64446, 64454, 64463, 64471, 64479, + 64486, 64494, 64501, 64509, 64516, 64525, 64533, 64542, 64550, 64558, + 64566, 64574, 64582, 64591, 64600, 64609, 64618, 64626, 64634, 64642, + 64650, 64659, 64668, 64676, 64684, 64692, 64700, 64708, 64716, 64724, + 64732, 64740, 64748, 64756, 64761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64766, 64776, 64786, 64796, 64806, 64816, 64826, 64836, 64846, + 64855, 64864, 64873, 64883, 64893, 64903, 64914, 64924, 64934, 64944, + 64954, 64964, 64974, 64984, 64994, 65004, 65014, 65024, 65034, 65044, + 65054, 65064, 65075, 65085, 65095, 65105, 65115, 65125, 65135, 65145, + 65155, 65165, 65176, 65186, 65196, 65207, 65217, 65227, 65237, 65247, + 65256, 65265, 65275, 65284, 65293, 65302, 65311, 65320, 65329, 65338, + 65347, 65356, 65365, 65374, 65383, 0, 0, 65392, 65401, 65411, 65421, + 65430, 65440, 65449, 65458, 65468, 65477, 65487, 65496, 65505, 65515, + 65525, 65536, 65546, 65557, 65567, 65578, 65587, 65597, 65607, 65618, + 65628, 65638, 65648, 65657, 65666, 65675, 65684, 65693, 65702, 65712, + 65721, 65731, 65740, 65750, 65760, 65769, 65778, 65787, 65797, 65806, + 65815, 65824, 65833, 65842, 65852, 65862, 65872, 65882, 65892, 65902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65911, 65926, 65941, 65947, + 65953, 65959, 65965, 65971, 65977, 65983, 65989, 65997, 66001, 66004, 0, + 0, 66012, 66015, 66018, 66021, 66024, 66027, 66030, 66033, 66036, 66039, + 66042, 66045, 66048, 66051, 66054, 66057, 66060, 66068, 66077, 66087, + 66095, 66103, 66112, 66121, 66132, 66144, 0, 0, 0, 0, 0, 0, 66153, 66158, + 66163, 66170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66177, 66187, 66197, + 66207, 66216, 66227, 66236, 66245, 66255, 66265, 66277, 66289, 66300, + 66311, 66321, 66331, 66340, 66349, 66359, 66369, 66380, 66391, 66395, + 66400, 66409, 66418, 66422, 66426, 66430, 66435, 66440, 66445, 66450, + 66453, 66457, 0, 66461, 66464, 66467, 66471, 66475, 66480, 66484, 66488, + 66493, 66498, 66505, 66512, 66515, 66518, 66521, 66525, 66528, 66532, + 66536, 0, 66540, 66545, 66549, 66553, 0, 0, 0, 0, 66558, 66563, 66570, + 66575, 66580, 0, 66585, 66590, 66595, 66600, 66605, 66610, 66615, 66620, + 66625, 66630, 66635, 66640, 66649, 66658, 66666, 66674, 66683, 66692, + 66701, 66710, 66718, 66726, 66734, 66742, 66747, 66752, 66758, 66764, + 66770, 66776, 66784, 66792, 66798, 66804, 66810, 66816, 66822, 66828, + 66834, 66840, 66845, 66850, 66855, 66860, 66865, 66870, 66875, 66880, + 66885, 66890, 66895, 66900, 66906, 66912, 66918, 66924, 66930, 66936, + 66942, 66948, 66954, 66960, 66966, 66972, 66978, 66984, 66990, 66996, + 67002, 67008, 67014, 67020, 67026, 67032, 67038, 67044, 67050, 67056, + 67062, 67068, 67074, 67080, 67086, 67092, 67098, 67104, 67110, 67116, + 67122, 67128, 67134, 67140, 67146, 67152, 67158, 67164, 67170, 67176, + 67182, 67188, 67194, 67200, 67206, 67212, 67217, 67222, 67227, 67232, + 67237, 67242, 67247, 67252, 67257, 67262, 67267, 67272, 67278, 67284, + 67290, 67296, 67302, 67308, 67314, 67320, 67325, 67330, 67335, 67340, + 67351, 67362, 67372, 67382, 67393, 67404, 67411, 0, 0, 67418, 0, 67426, + 67430, 67434, 67437, 67441, 67445, 67448, 67451, 67455, 67459, 67462, + 67466, 67469, 67472, 67476, 67479, 67483, 67486, 67489, 67492, 67495, + 67498, 67501, 67504, 67507, 67510, 67513, 67516, 67520, 67524, 67528, + 67532, 67537, 67542, 67547, 67553, 67558, 67563, 67569, 67574, 67579, + 67584, 67589, 67595, 67600, 67605, 67610, 67615, 67620, 67626, 67631, + 67636, 67641, 67646, 67651, 67657, 67662, 67668, 67674, 67678, 67683, + 67687, 67691, 67695, 67700, 67705, 67710, 67716, 67721, 67726, 67732, + 67737, 67742, 67747, 67752, 67758, 67763, 67768, 67773, 67778, 67783, + 67789, 67794, 67799, 67804, 67809, 67814, 67820, 67825, 67831, 67837, + 67842, 67846, 67851, 67853, 67858, 67863, 67868, 67873, 67878, 67882, + 67888, 67893, 67898, 67903, 67908, 67913, 67918, 67923, 67929, 67935, + 67941, 67949, 67953, 67957, 67961, 67965, 67969, 67973, 67978, 67983, + 67988, 67993, 67998, 68003, 68008, 68013, 68018, 68023, 68028, 68033, + 68038, 68042, 68047, 68052, 68057, 68062, 68067, 68071, 68076, 68081, + 68086, 68091, 68095, 68100, 68105, 68110, 68115, 68119, 68124, 68129, + 68134, 68139, 68144, 68149, 68154, 68159, 68163, 68170, 68177, 68181, + 68186, 68191, 68196, 68201, 68206, 68211, 68216, 68221, 68226, 68231, + 68236, 68241, 68246, 68251, 68256, 68261, 68266, 68271, 68276, 68281, + 68286, 68291, 68296, 68301, 68306, 68311, 68316, 68321, 68326, 0, 0, 0, + 68331, 68335, 68340, 68344, 68349, 68354, 0, 0, 68358, 68363, 68368, + 68372, 68377, 68382, 0, 0, 68387, 68392, 68396, 68401, 68406, 68411, 0, + 0, 68416, 68421, 68426, 0, 0, 0, 68430, 68434, 68438, 68441, 68443, + 68447, 68451, 0, 68455, 68461, 68464, 68468, 68471, 68475, 68479, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68483, 68489, 68495, 68501, 68507, 0, 0, 68511, + 68517, 68523, 68529, 68535, 68541, 68548, 68555, 68562, 68569, 68576, + 68583, 0, 68590, 68597, 68604, 68610, 68617, 68624, 68631, 68638, 68644, + 68651, 68658, 68665, 68672, 68679, 68686, 68693, 68700, 68707, 68714, + 68721, 68728, 68735, 68742, 68749, 68756, 68763, 0, 68770, 68777, 68784, + 68791, 68798, 68805, 68812, 68819, 68826, 68833, 68840, 68847, 68854, + 68861, 68867, 68874, 68881, 68888, 68895, 0, 68902, 68909, 0, 68916, + 68923, 68930, 68937, 68944, 68951, 68958, 68965, 68972, 68979, 68986, + 68993, 69000, 69007, 69014, 0, 0, 69020, 69025, 69030, 69035, 69040, + 69045, 69050, 69055, 69060, 69065, 69070, 69075, 69080, 69085, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69090, 69097, 69104, 69111, 69118, 69125, 69132, + 69139, 69146, 69153, 69160, 69167, 69174, 69181, 69188, 69195, 69202, + 69209, 69216, 69223, 69231, 69239, 69246, 69253, 69258, 69266, 69274, + 69281, 69288, 69293, 69300, 69305, 69310, 69317, 69322, 69327, 69332, + 69340, 69345, 69350, 69357, 69362, 69367, 69374, 69381, 69386, 69391, + 69396, 69401, 69406, 69411, 69416, 69421, 69426, 69433, 69438, 69445, + 69450, 69455, 69460, 69465, 69470, 69475, 69480, 69485, 69490, 69495, + 69500, 69507, 69514, 69521, 69528, 69534, 69539, 69546, 69551, 69556, + 69565, 69572, 69581, 69588, 69593, 69598, 69606, 69611, 69616, 69621, + 69626, 69631, 69638, 69643, 69648, 69653, 69658, 69663, 69670, 69677, + 69684, 69691, 69698, 69705, 69712, 69719, 69726, 69733, 69740, 69747, + 69754, 69761, 69768, 69775, 69782, 69789, 69796, 69803, 69810, 69817, + 69824, 69831, 69838, 69845, 69852, 69859, 0, 0, 0, 0, 0, 69866, 69873, + 69880, 0, 0, 0, 0, 69884, 69887, 69890, 69893, 69896, 69899, 69902, + 69905, 69908, 69911, 69915, 69919, 69923, 69927, 69931, 69935, 69939, + 69943, 69947, 69953, 69958, 69963, 69969, 69975, 69981, 69987, 69993, + 69999, 70005, 70010, 70015, 70021, 70027, 70033, 70039, 70045, 70051, + 70057, 70063, 70069, 70075, 70081, 70087, 70093, 70099, 0, 0, 0, 70105, + 70112, 70119, 70126, 70133, 70140, 70149, 70158, 70165, 70172, 70180, + 70188, 70196, 70201, 70207, 70215, 70223, 70231, 70239, 70247, 70255, + 70265, 70275, 70285, 70295, 70303, 70311, 70319, 70329, 70339, 70349, + 70359, 70369, 70377, 70385, 70390, 70395, 70400, 70405, 70412, 70419, + 70424, 70430, 70439, 70445, 70451, 70457, 70463, 70469, 70478, 70484, + 70490, 70498, 70505, 70513, 70521, 70529, 70537, 70545, 70553, 70561, + 70569, 70577, 70582, 70590, 70595, 70600, 70604, 70608, 70612, 70616, + 70621, 70626, 70632, 70638, 70642, 70648, 70652, 70656, 70660, 70664, + 70668, 70672, 70678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70682, 70686, 70691, 70696, 70701, 70705, 70710, 70715, + 70720, 70725, 70729, 70733, 70738, 70743, 70748, 70753, 70757, 70762, + 70767, 70772, 70777, 70782, 70787, 70791, 70796, 70801, 70806, 70811, + 70816, 70821, 70826, 0, 70831, 70835, 70839, 70844, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 70849, 70854, 70859, 70864, 70869, 70874, 70879, 70884, + 70889, 70894, 70899, 70904, 70909, 70914, 70919, 70924, 70929, 70934, + 70939, 70944, 70949, 70954, 70959, 70964, 70969, 70974, 70979, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 70986, 70991, 70996, 71001, 71006, 71011, 71016, 71021, 71026, + 71031, 71036, 71041, 71046, 71051, 71056, 71061, 71066, 71071, 71076, + 71081, 71086, 71091, 71096, 71101, 71106, 71111, 71116, 71120, 71124, + 71128, 0, 71133, 71139, 71143, 71147, 71151, 71155, 71160, 71165, 71170, + 71175, 71180, 71185, 71190, 71195, 71200, 71205, 71210, 71215, 71220, + 71225, 71230, 71235, 71240, 71245, 71249, 71254, 71259, 71263, 71268, + 71273, 71278, 71283, 71288, 71293, 71298, 71303, 71308, 0, 0, 0, 0, + 71312, 71317, 71322, 71327, 71332, 71337, 71342, 71347, 71352, 71358, + 71362, 71366, 71371, 71376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 71381, 71386, 71391, 71396, 71402, 71407, 71413, 71419, 71425, + 71431, 71438, 71444, 71451, 71456, 71461, 71466, 71471, 71475, 71480, + 71485, 71490, 71495, 71500, 71505, 71510, 71515, 71520, 71525, 71530, + 71535, 71540, 71545, 71550, 71555, 71560, 71565, 71570, 71575, 71580, + 71585, 71590, 71595, 71600, 71605, 71611, 71616, 71622, 71628, 71634, + 71640, 71647, 71653, 71660, 71665, 71670, 71675, 71680, 71684, 71689, + 71694, 71699, 71704, 71709, 71714, 71719, 71724, 71729, 71734, 71739, + 71744, 71749, 71754, 71759, 71764, 71769, 71774, 71779, 71784, 71789, + 71794, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, 71831, + 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, 71871, + 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, 71911, + 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, 71951, + 71955, 71959, 71963, 71967, 71971, 71975, 71979, 71983, 71987, 71991, + 71996, 72001, 72006, 72011, 72016, 72021, 72026, 72031, 72036, 72041, + 72046, 72051, 72056, 72061, 72066, 72071, 72076, 72081, 72086, 72091, + 72095, 72099, 72103, 72107, 72111, 72115, 72119, 72124, 72129, 0, 0, + 72134, 72139, 72143, 72147, 72151, 72155, 72159, 72163, 72167, 72171, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72175, 72178, 72181, 72184, 72187, + 72190, 0, 0, 72194, 0, 72198, 72201, 72205, 72209, 72213, 72217, 72221, + 72225, 72229, 72233, 72237, 72240, 72244, 72248, 72252, 72256, 72260, + 72264, 72268, 72272, 72276, 72280, 72284, 72288, 72292, 72296, 72300, + 72304, 72308, 72312, 72316, 72320, 72324, 72328, 72332, 72336, 72340, + 72344, 72348, 72351, 72355, 72359, 72363, 72367, 0, 72371, 72375, 0, 0, + 0, 72379, 0, 0, 72383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72387, 72390, 72394, 72398, 0, 72403, 72407, 0, 0, 0, 0, 0, 72411, 72416, + 72422, 72426, 72430, 72433, 72437, 72441, 0, 72445, 72449, 72453, 0, + 72457, 72461, 72465, 72469, 72473, 72477, 72481, 72485, 72489, 72493, + 72497, 72501, 72505, 72509, 72513, 72517, 72520, 72523, 72527, 72531, + 72535, 72539, 72543, 72547, 72551, 72554, 72558, 0, 0, 0, 0, 72562, + 72567, 72571, 0, 0, 0, 0, 72575, 72578, 72581, 72584, 72587, 72590, + 72594, 72598, 72604, 0, 0, 0, 0, 0, 0, 0, 0, 72610, 72615, 72621, 72626, + 72632, 72637, 72642, 72647, 72653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72658, 72663, 72668, 72673, 72680, 72687, 72694, 72701, 72706, + 72711, 72716, 72721, 72728, 72733, 72740, 72747, 72752, 72757, 72762, + 72769, 72774, 72779, 72786, 72793, 72798, 72803, 72808, 72815, 72822, + 72829, 72834, 72839, 72846, 72853, 72860, 72867, 72872, 72877, 72882, + 72889, 72894, 72899, 72904, 72911, 72920, 72927, 72932, 72937, 72942, + 72947, 72952, 72957, 72966, 72973, 72978, 72985, 72992, 72997, 73002, + 73007, 73014, 73019, 73026, 73033, 73038, 73043, 73048, 73055, 73062, + 73067, 73072, 73079, 73086, 73093, 73098, 73103, 73108, 73113, 73120, + 73129, 73138, 73143, 73150, 73159, 73164, 73169, 73174, 73179, 73186, + 73193, 73200, 73207, 73212, 73217, 73222, 73229, 73236, 73243, 73248, + 73253, 73260, 73265, 73272, 73277, 73284, 73289, 73296, 73303, 73308, + 73313, 73318, 73323, 73328, 73333, 73338, 73343, 73348, 73355, 73362, + 73369, 73376, 73383, 73392, 73397, 73402, 73409, 73416, 73421, 73428, + 73435, 73442, 73449, 73456, 73463, 73468, 73473, 73478, 73483, 73488, + 73497, 73506, 73515, 73524, 73533, 73542, 73551, 73560, 73565, 73576, + 73587, 73596, 73601, 73606, 73611, 73616, 73625, 73632, 73639, 73646, + 73653, 73660, 73667, 73676, 73685, 73696, 73705, 73716, 73725, 73732, + 73741, 73752, 73761, 73770, 73779, 73788, 73795, 73802, 73809, 73818, + 73827, 73838, 73847, 73856, 73867, 73872, 73877, 73888, 73897, 73906, + 73915, 73924, 73935, 73944, 73953, 73964, 73975, 73986, 73997, 74008, + 74019, 74026, 74033, 74040, 74047, 74057, 74066, 74073, 74080, 74087, + 74098, 74109, 74120, 74131, 74142, 74153, 74164, 74175, 74182, 74189, + 74198, 74207, 74214, 74221, 74228, 74237, 74246, 74255, 74262, 74271, + 74280, 74289, 74296, 74303, 74308, 74315, 74322, 74329, 74336, 74343, + 74350, 74357, 74366, 74375, 74384, 74393, 74400, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74409, 74415, 74420, 74425, 74432, 74438, 74444, 74450, 74456, + 74462, 74468, 74474, 74478, 74482, 74488, 74494, 74500, 74504, 74509, + 74514, 74518, 74522, 74525, 74531, 74537, 74543, 74549, 74555, 74561, + 74567, 74573, 74579, 74589, 74599, 74605, 74611, 74621, 74631, 74637, 0, + 0, 0, 74643, 74648, 74653, 74659, 74665, 74671, 74677, 74683, 74689, + 74696, 74703, 74709, 74715, 74721, 74727, 74733, 74739, 74745, 74751, + 74756, 74762, 74768, 74774, 74780, 74786, 74796, 74802, 74808, 74815, + 74822, 74829, 74838, 74847, 74856, 74865, 74874, 74883, 74892, 74901, + 74911, 74921, 74929, 74937, 74946, 74955, 74961, 74967, 74973, 74979, + 74987, 74995, 74999, 75005, 75010, 75016, 75022, 75028, 75034, 75040, + 75050, 75055, 75062, 75067, 75072, 75077, 75083, 75089, 75095, 75102, + 75107, 75112, 75117, 75122, 75127, 75133, 75139, 75145, 75151, 75157, + 75163, 75169, 75175, 75180, 75185, 75190, 75195, 75200, 75205, 75210, + 75215, 75221, 75227, 75232, 75237, 75242, 75247, 75252, 75258, 75265, + 75269, 75273, 75277, 75281, 75285, 75289, 75293, 75297, 75305, 75315, + 75319, 75323, 75329, 75335, 75341, 75347, 75353, 75359, 75365, 75371, + 75377, 75383, 75389, 75395, 75401, 75407, 75411, 75415, 75422, 75428, + 75434, 75440, 75445, 75452, 75457, 75463, 75469, 75475, 75481, 75486, + 75490, 75496, 75500, 75504, 75508, 75514, 75520, 75524, 75530, 75536, + 75542, 75548, 75554, 75562, 75570, 75576, 75582, 75588, 75594, 75606, + 75618, 75632, 75644, 75656, 75670, 75684, 75698, 75702, 75710, 75718, + 75722, 75726, 75730, 75734, 75738, 75742, 75746, 75750, 75756, 75762, + 75768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75774, 75780, 75786, 75792, 75798, + 75804, 75810, 75816, 75822, 75828, 75834, 75840, 75846, 75852, 75858, + 75864, 75870, 75876, 75882, 75888, 75894, 75900, 75906, 75912, 75918, + 75924, 75930, 75936, 75942, 75948, 75954, 75960, 75966, 75972, 75978, + 75984, 75990, 75996, 76002, 76008, 76014, 76020, 76026, 76032, 76038, + 76044, 76050, 76056, 76062, 76068, 76074, 76080, 76086, 76092, 76098, + 76104, 76110, 76116, 76122, 76128, 76134, 76140, 76146, 76152, 76158, + 76164, 76170, 76175, 76180, 76185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76189, + 76194, 76201, 76208, 76215, 76222, 76227, 76231, 76237, 76241, 76245, + 76251, 76255, 76259, 76263, 76269, 76276, 76280, 76284, 76288, 76292, + 76296, 76300, 76306, 76310, 76314, 76318, 76322, 76326, 76330, 76334, + 76338, 76342, 76346, 76350, 76354, 76359, 76363, 76367, 76371, 76375, + 76379, 76383, 76387, 76391, 76395, 76402, 76406, 76413, 76417, 76421, + 76425, 76429, 76433, 76437, 76441, 76448, 76452, 76456, 76460, 76464, + 76468, 76474, 76478, 76484, 76488, 76492, 76496, 76500, 76504, 76508, + 76512, 76516, 76520, 76524, 76528, 76532, 76536, 76540, 76544, 76548, + 76552, 76556, 76560, 76568, 76572, 76576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 76580, 76584, 76588, 76593, 76597, 76601, 76606, + 76610, 76614, 76618, 76622, 76627, 76631, 76635, 76639, 76643, 76647, + 76652, 76656, 76660, 76664, 76668, 76672, 76677, 76681, 76686, 76691, + 76695, 76699, 76704, 76708, 76712, 76717, 76721, 76725, 76729, 76733, + 76738, 76742, 76746, 76750, 76754, 76758, 76763, 76767, 76771, 76775, + 76779, 76783, 76788, 76792, 76797, 76802, 76806, 76810, 76815, 76819, + 76823, 76828, 76832, 76836, 76840, 76844, 76849, 76853, 76857, 76861, + 76865, 76869, 76874, 76878, 76882, 76886, 76890, 76894, 76899, 76903, + 76908, 76913, 76917, 76921, 76926, 76930, 76934, 76939, 0, 76943, 76947, + 76951, 76956, 76960, 76964, 76968, 76972, 76976, 76981, 76985, 76989, + 76993, 76997, 77001, 77006, 77010, 77015, 77020, 77025, 77030, 77036, + 77041, 77046, 77052, 77057, 77062, 77067, 77072, 77078, 77083, 77088, + 77093, 77098, 77103, 77109, 77114, 77119, 77124, 77129, 77134, 77140, + 77145, 77151, 77157, 77162, 77167, 77173, 77178, 77183, 77189, 77194, + 77199, 77204, 77209, 77215, 77220, 77225, 77230, 77235, 77240, 77246, + 77251, 77256, 77261, 77266, 77271, 77277, 77282, 77288, 77294, 0, 77298, + 77303, 0, 0, 77307, 0, 0, 77311, 77315, 0, 0, 77320, 77324, 77328, 77332, + 0, 77337, 77341, 77345, 77349, 77353, 77358, 77362, 77367, 77372, 77376, + 77380, 77385, 0, 77389, 0, 77394, 77398, 77402, 77406, 77411, 77415, + 77419, 0, 77423, 77427, 77432, 77436, 77440, 77444, 77448, 77452, 77457, + 77461, 77466, 77471, 77476, 77481, 77487, 77492, 77497, 77503, 77508, + 77513, 77518, 77523, 77529, 77534, 77539, 77544, 77549, 77554, 77560, + 77565, 77570, 77575, 77580, 77585, 77591, 77596, 77602, 77608, 77613, + 77618, 77624, 77629, 77634, 77640, 77645, 77650, 77655, 77660, 77666, + 77671, 77676, 77681, 77686, 77691, 77697, 77702, 77707, 77712, 77717, + 77722, 77728, 77733, 77739, 77745, 77749, 0, 77753, 77757, 77761, 77766, + 0, 0, 77770, 77774, 77779, 77783, 77787, 77791, 77795, 77799, 0, 77804, + 77808, 77812, 77816, 77820, 77825, 77829, 0, 77834, 77838, 77842, 77847, + 77851, 77855, 77860, 77864, 77868, 77872, 77876, 77881, 77885, 77889, + 77893, 77897, 77901, 77906, 77910, 77914, 77918, 77922, 77926, 77931, + 77935, 77940, 77945, 77949, 0, 77953, 77957, 77961, 77966, 0, 77970, + 77974, 77978, 77983, 77987, 0, 77991, 0, 0, 0, 77995, 77999, 78003, + 78007, 78011, 78016, 78020, 0, 78025, 78029, 78033, 78038, 78042, 78046, + 78051, 78055, 78059, 78063, 78067, 78072, 78076, 78080, 78084, 78088, + 78092, 78097, 78101, 78105, 78109, 78113, 78117, 78122, 78126, 78131, + 78136, 78141, 78146, 78152, 78157, 78162, 78168, 78173, 78178, 78183, + 78188, 78194, 78199, 78204, 78209, 78214, 78219, 78225, 78230, 78235, + 78240, 78245, 78250, 78256, 78261, 78267, 78273, 78278, 78283, 78289, + 78294, 78299, 78305, 78310, 78315, 78320, 78325, 78331, 78336, 78341, + 78346, 78351, 78356, 78362, 78367, 78372, 78377, 78382, 78387, 78393, + 78398, 78404, 78410, 78414, 78418, 78423, 78427, 78431, 78436, 78440, + 78444, 78448, 78452, 78457, 78461, 78465, 78469, 78473, 78477, 78482, + 78486, 78490, 78494, 78498, 78502, 78507, 78511, 78516, 78521, 78525, + 78529, 78534, 78538, 78542, 78547, 78551, 78555, 78559, 78563, 78568, + 78572, 78576, 78580, 78584, 78588, 78593, 78597, 78601, 78605, 78609, + 78613, 78618, 78622, 78627, 78632, 78637, 78642, 78648, 78653, 78658, + 78664, 78669, 78674, 78679, 78684, 78690, 78695, 78700, 78705, 78710, + 78715, 78721, 78726, 78731, 78736, 78741, 78746, 78752, 78757, 78763, + 78769, 78774, 78779, 78785, 78790, 78795, 78801, 78806, 78811, 78816, + 78821, 78827, 78832, 78837, 78842, 78847, 78852, 78858, 78863, 78868, + 78873, 78878, 78883, 78889, 78894, 78900, 78906, 78911, 78916, 78922, + 78927, 78932, 78938, 78943, 78948, 78953, 78958, 78964, 78969, 78974, + 78979, 78984, 78989, 78995, 79000, 79005, 79010, 79015, 79020, 79026, + 79031, 79037, 79043, 79048, 79053, 79059, 79064, 79069, 79075, 79080, + 79085, 79090, 79095, 79101, 79106, 79111, 79116, 79121, 79126, 79132, + 79137, 79142, 79147, 79152, 79157, 79163, 79168, 79174, 79180, 79186, + 79192, 79199, 79205, 79211, 79218, 79224, 79230, 79236, 79242, 79249, + 79255, 79261, 79267, 79273, 79279, 79286, 79292, 79298, 79304, 79310, + 79316, 79323, 79329, 79336, 79343, 79349, 79355, 79362, 79368, 79374, + 79381, 79387, 79393, 79399, 79405, 79412, 79418, 79424, 79430, 79436, + 79442, 79449, 79455, 79461, 79467, 79473, 79479, 79486, 79492, 79499, + 79506, 79510, 79514, 79519, 79523, 79527, 79532, 79536, 79540, 79544, + 79548, 79553, 79557, 79561, 79565, 79569, 79573, 79578, 79582, 79586, + 79590, 79594, 79598, 79603, 79607, 79612, 79617, 79621, 79625, 79630, + 79634, 79638, 79643, 79647, 79651, 79655, 79659, 79664, 79668, 79672, + 79676, 79680, 79684, 79689, 79693, 79697, 79701, 79705, 79709, 79714, + 79718, 79723, 79728, 79734, 0, 0, 79740, 79745, 79750, 79755, 79760, + 79765, 79770, 79775, 79780, 79785, 79790, 79795, 79800, 79805, 79810, + 79815, 79820, 79825, 79831, 79836, 79841, 79846, 79851, 79856, 79861, + 79866, 79870, 79875, 79880, 79885, 79890, 79895, 79900, 79905, 79910, + 79915, 79920, 79925, 79930, 79935, 79940, 79945, 79950, 79955, 79961, + 79966, 79971, 79976, 79981, 79986, 79991, 79996, 80002, 80007, 80012, + 80017, 80022, 80027, 80032, 80037, 80042, 80047, 80052, 80057, 80062, + 80067, 80072, 80077, 80082, 80087, 80092, 80097, 80102, 80107, 80112, + 80117, 80123, 80128, 80133, 80138, 80143, 80148, 80153, 80158, 80162, + 80167, 80172, 80177, 80182, 80187, 80192, 80197, 80202, 80207, 80212, + 80217, 80222, 80227, 80232, 80237, 80242, 80247, 80253, 80258, 80263, + 80268, 80273, 80278, 80283, 80288, 80294, 80299, 80304, 80309, 80314, + 80319, 80324, 80330, 80336, 80342, 80348, 80354, 80360, 80366, 80372, + 80378, 80384, 80390, 80396, 80402, 80408, 80414, 80420, 80426, 80433, + 80439, 80445, 80451, 80457, 80463, 80469, 80475, 80480, 80486, 80492, + 80498, 80504, 80510, 80516, 80522, 80528, 80534, 80540, 80546, 80552, + 80558, 80564, 80570, 80576, 80582, 80589, 80595, 80601, 80607, 80613, + 80619, 80625, 80631, 80638, 80644, 80650, 80656, 80662, 80668, 80674, + 80680, 80686, 80692, 80698, 80704, 80710, 80716, 80722, 80728, 80734, + 80740, 80746, 80752, 80758, 80764, 80770, 80776, 80783, 80789, 80795, + 80801, 80807, 80813, 80819, 80825, 80830, 80836, 80842, 80848, 80854, + 80860, 80866, 80872, 80878, 80884, 80890, 80896, 80902, 80908, 80914, + 80920, 80926, 80932, 80939, 80945, 80951, 80957, 80963, 80969, 80975, + 80981, 80988, 80994, 81000, 81006, 81012, 81018, 81024, 81031, 81038, + 81045, 81052, 81059, 81066, 81073, 81080, 81087, 81094, 81101, 81108, + 81115, 81122, 81129, 81136, 81143, 81151, 81158, 81165, 81172, 81179, + 81186, 81193, 81200, 81206, 81213, 81220, 81227, 81234, 81241, 81248, + 81255, 81262, 81269, 81276, 81283, 81290, 81297, 81304, 81311, 81318, + 81325, 81333, 81340, 81347, 81354, 81361, 81368, 81375, 81382, 81390, + 81397, 81404, 81411, 81418, 81425, 0, 0, 0, 0, 81432, 81437, 81441, + 81445, 81449, 81453, 81457, 81461, 81465, 81469, 81473, 81478, 81482, + 81486, 81490, 81494, 81498, 81502, 81506, 81510, 81514, 81519, 81523, + 81527, 81531, 81535, 81539, 81543, 81547, 81551, 81555, 81561, 81566, + 81571, 81576, 81581, 81586, 81591, 81596, 81601, 81606, 81611, 81615, + 81619, 81623, 81627, 81631, 81635, 81639, 81643, 81647, 81651, 81655, + 81659, 81663, 81667, 81671, 81675, 81679, 81683, 81687, 81691, 81695, + 81699, 81703, 81707, 81711, 81715, 81719, 81723, 81727, 81731, 81735, + 81739, 81743, 81747, 81751, 81755, 81759, 81763, 81767, 81771, 81775, + 81779, 81783, 81787, 81791, 81795, 81799, 81803, 81807, 81811, 81815, + 81819, 81823, 81827, 81831, 81835, 81839, 81843, 81847, 81851, 81855, + 81859, 81863, 81867, 81871, 81875, 81879, 81883, 81887, 81891, 81895, + 81899, 81903, 81907, 81911, 81915, 81919, 81923, 81927, 81931, 81935, + 81939, 81943, 81947, 81951, 81955, 81959, 81963, 81967, 81971, 81975, + 81979, 81983, 81987, 81991, 81995, 81999, 82003, 82007, 82011, 82015, + 82019, 82023, 82027, 82031, 82035, 82039, 82043, 82047, 82051, 82055, + 82059, 82063, 82067, 82071, 82075, 82079, 82083, 82087, 82091, 82095, + 82099, 82103, 82107, 82111, 82115, 82119, 82123, 82127, 82131, 82135, + 82139, 82143, 82147, 82151, 82155, 82159, 82163, 82167, 82171, 82175, + 82179, 82183, 82187, 82191, 82195, 82199, 82203, 82207, 82211, 82215, + 82219, 82223, 82227, 82231, 82235, 82239, 82243, 82247, 82251, 82255, + 82259, 82263, 82267, 82271, 82275, 82279, 82283, 82287, 82291, 82295, + 82299, 82303, 82307, 82311, 82315, 82319, 82323, 82327, 82331, 82335, + 82339, 82343, 82347, 82351, 82355, 82359, 82363, 82367, 82371, 82375, + 82379, 82383, 82387, 82391, 82395, 82399, 82403, 82407, 82411, 82415, + 82419, 82423, 82427, 82431, 82435, 82439, 82443, 82447, 82451, 82455, + 82459, 82463, 82467, 82471, 82475, 82479, 82483, 82487, 82491, 82495, + 82499, 82503, 82507, 82511, 82515, 82519, 82523, 82527, 82531, 82535, + 82539, 82543, 82547, 82551, 82555, 82559, 82563, 82567, 82571, 82575, + 82579, 82583, 82587, 82591, 82595, 82599, 82603, 82607, 82611, 82615, + 82619, 82623, 82627, 82631, 82635, 82639, 82643, 82647, 82651, 82655, + 82659, 82663, 82667, 82671, 82675, 82679, 82683, 82687, 82691, 82695, + 82699, 82703, 82707, 82711, 82715, 82719, 82723, 82727, 82731, 82735, + 82739, 82743, 82747, 82751, 82755, 82759, 82763, 82767, 82771, 82775, + 82779, 82783, 82787, 82791, 82795, 82799, 82803, 82807, 82811, 82815, + 82819, 82823, 82827, 82831, 82835, 82839, 82843, 82847, 82851, 82855, + 82859, 82863, 82867, 82871, 82875, 82879, 82883, 82887, 82891, 82895, + 82899, 82903, 82907, 82911, 82915, 82919, 82923, 82927, 82931, 82935, + 82939, 82943, 82947, 82951, 82955, 82959, 82963, 82967, 82971, 82975, + 82979, 82983, 82987, 82991, 82995, 82999, 83003, 83007, 83011, 83015, + 83019, 83023, 83027, 83031, 83035, 83039, 83043, 83047, 83051, 83055, + 83059, 83063, 83067, 83071, 83075, 83079, 83083, 83087, 83091, 83095, + 83099, 83103, 83107, 83111, 83115, 83119, 83123, 83127, 83131, 83135, + 83139, 83143, 83147, 83151, 83155, 83159, 83163, 83167, 83171, 83175, + 83179, 83183, 83187, 83191, 83195, 83199, 83203, 83207, 83211, 83215, + 83219, 83223, 83227, 83231, 83235, 83239, 83243, 83247, 83251, 83255, + 83259, 83263, 83267, 83271, 83275, 83279, 83283, 83287, 83291, 83295, + 83299, 83303, 83307, 83311, 83315, 83319, 83323, 83327, 83331, 83335, + 83339, 83343, 83347, 83351, 83355, 83359, 83363, 83367, 83371, 83375, + 83379, 83383, 83387, 83391, 83395, 83399, 83403, 83407, 83411, 83415, + 83419, 83423, 83427, 83431, 83435, 83439, 83443, 83447, 83451, 83455, + 83459, 83463, 83467, 83471, 83475, 83479, 83483, 83487, 83491, 83495, + 83499, 83503, 83507, 83511, 83515, 83519, 83523, 83527, 83531, 83535, + 83539, 83543, 83547, 83551, 83555, 83559, 83563, 83567, 83571, 83575, + 83579, 83583, 83587, 83591, 83595, 83599, 83603, 83607, 83611, 83615, + 83619, 83623, 83627, 83631, 83635, 83639, 83643, 83647, 83651, 83655, + 83659, 83663, 83667, 83671, 83675, 83679, 83683, 83687, 83691, 83695, + 83699, 83703, 83707, 83711, 83715, 83719, 83723, 83727, 83731, 83735, + 83739, 83743, 83747, 83751, 83755, 83759, 83763, 83767, 83771, 83775, + 83779, 83783, 83787, 83791, 83795, 83799, 83803, 83807, 83811, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 83815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 83819, 83822, 83826, 83830, 83833, 83837, 83841, + 83844, 83847, 83851, 83855, 83858, 83862, 83865, 83868, 83872, 83875, + 83879, 83882, 83885, 83888, 83891, 83894, 83897, 83900, 83903, 83906, + 83909, 83912, 83916, 83920, 83924, 83928, 83933, 83938, 83943, 83949, + 83954, 83959, 83965, 83970, 83975, 83980, 83985, 83991, 83996, 84001, + 84006, 84011, 84016, 84022, 84027, 84032, 84037, 84042, 84047, 84053, + 84058, 84064, 84070, 84074, 84079, 84083, 84087, 84091, 84096, 84101, + 84106, 84112, 84117, 84122, 84128, 84133, 84138, 84143, 84148, 84154, + 84159, 84164, 84169, 84174, 84179, 84185, 84190, 84195, 84200, 84205, + 84210, 84216, 84221, 84227, 84233, 84238, 84242, 84247, 84249, 84253, + 84256, 84259, 84262, 84265, 84268, 84271, 84274, 84277, 84280, 84283, + 84286, 84289, 84292, 84295, 84298, 84301, 84304, 84307, 84310, 84313, + 84316, 84319, 84322, 84325, 84328, 84331, 84334, 84337, 84340, 84343, + 84346, 84349, 84352, 84355, 84358, 84361, 84364, 84367, 84370, 84373, + 84376, 84379, 84382, 84385, 84388, 84391, 84394, 84397, 84400, 84403, + 84406, 84409, 84412, 84415, 84418, 84421, 84424, 84427, 84430, 84433, + 84436, 84439, 84442, 84445, 84448, 84451, 84454, 84457, 84460, 84463, + 84466, 84469, 84472, 84475, 84478, 84481, 84484, 84487, 84490, 84493, + 84496, 84499, 84502, 84505, 84508, 84511, 84514, 84517, 84520, 84523, + 84526, 84529, 84532, 84535, 84538, 84541, 84544, 84547, 84550, 84553, + 84556, 84559, 84562, 84565, 84568, 84571, 84574, 84577, 84580, 84583, + 84586, 84589, 84592, 84595, 84598, 84601, 84604, 84607, 84610, 84613, + 84616, 84619, 84622, 84625, 84628, 84631, 84634, 84637, 84640, 84643, + 84646, 84649, 84652, 84655, 84658, 84661, 84664, 84667, 84670, 84673, + 84676, 84679, 84682, 84685, 84688, 84691, 84694, 84697, 84700, 84703, + 84706, 84709, 84712, 84715, 84718, 84721, 84724, 84727, 84730, 84733, + 84736, 84739, 84742, 84745, 84748, 84751, 84754, 84757, 84760, 84763, + 84766, 84769, 84772, 84775, 84778, 84781, 84784, 84787, 84790, 84793, + 84796, 84799, 84802, 84805, 84808, 84811, 84814, 84817, 84820, 84823, + 84826, 84829, 84832, 84835, 84838, 84841, 84844, 84847, 84850, 84853, + 84856, 84859, 84862, 84865, 84868, 84871, 84874, 84877, 84880, 84883, + 84886, 84889, 84892, 84895, 84898, 84901, 84904, 84907, 84910, 84913, + 84916, 84919, 84922, 84925, 84928, 84931, 84934, 84937, 84940, 84943, + 84946, 84949, 84952, 84955, 84958, 84961, 84964, 84967, 84970, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static unsigned int code_hash[] = { - 0, 4851, 118860, 0, 0, 66306, 7929, 64584, 9518, 64710, 0, 42166, 0, - 1097, 0, 12064, 41730, 596, 8570, 0, 120216, 8651, 41728, 41721, 41835, - 12995, 41202, 1373, 0, 13110, 5816, 119067, 64810, 1000, 0, 11951, 41140, - 1209, 9717, 0, 0, 1073, 0, 65470, 41138, 8851, 0, 0, 12167, 1115, 8874, - 9794, 194660, 0, 0, 12237, 3966, 41603, 8308, 9290, 120763, 41600, 9231, - 120183, 2959, 1457, 3535, 0, 42179, 63860, 41538, 12927, 8618, 42175, - 3404, 64661, 5148, 41737, 1759, 0, 119974, 0, 118949, 12290, 66577, - 120019, 9860, 12312, 10151, 8205, 0, 5131, 0, 9627, 0, 9834, 3055, 9852, - 1944, 1248, 10148, 63884, 119990, 119991, 12701, 119204, 12235, 603, 0, - 65327, 119998, 65305, 120000, 3350, 66576, 64318, 0, 8154, 3390, 120007, - 41817, 119956, 64603, 66328, 120012, 120013, 3400, 120015, 6041, 65020, - 41899, 119879, 8002, 8562, 4364, 0, 4043, 8712, 119988, 7813, 119117, - 120759, 10124, 11966, 8601, 6069, 10143, 4814, 12041, 1418, 10885, 12673, - 0, 0, 9660, 2764, 13012, 4571, 5704, 0, 119946, 12078, 2970, 5457, 5440, - 8857, 0, 0, 2843, 5355, 41599, 118883, 119175, 5194, 12950, 0, 3486, - 65324, 194602, 10123, 65167, 0, 10717, 64570, 2637, 64629, 8460, 10682, - 8476, 10602, 800, 0, 120583, 194632, 7799, 64930, 0, 8465, 12289, 0, - 2384, 13172, 13119, 8488, 5412, 10906, 1353, 0, 41351, 41823, 5828, 8206, - 120674, 8933, 1601, 9072, 5867, 13302, 12458, 0, 8090, 5418, 12452, 0, - 9483, 3351, 917544, 64510, 10817, 0, 41539, 2750, 0, 556, 41855, 41246, - 0, 12213, 0, 2760, 10620, 0, 12210, 120743, 0, 5498, 9998, 41536, 0, 0, - 9242, 3459, 8997, 0, 0, 194888, 0, 0, 4839, 12604, 0, 4435, 119016, 4975, - 4635, 295, 120026, 195039, 6050, 64898, 0, 7688, 0, 63903, 9036, 63901, - 0, 3971, 118975, 0, 2952, 917618, 6287, 8031, 2725, 63899, 63898, 5482, - 667, 12332, 1177, 6086, 12322, 12069, 5172, 41617, 64102, 7859, 1945, - 64099, 9815, 10453, 63883, 63882, 7997, 8555, 63878, 63877, 8705, 64097, - 64096, 9571, 528, 0, 0, 12132, 41723, 63875, 41578, 63873, 63855, 63854, - 41913, 9056, 0, 6188, 64593, 6155, 10806, 446, 41911, 64065, 41318, - 63850, 63, 64069, 63846, 2972, 9455, 63843, 64064, 63849, 63848, 63847, - 1176, 0, 8302, 9577, 63842, 4178, 13208, 13188, 10948, 10041, 8105, 4333, - 0, 118983, 1105, 4180, 5388, 12094, 120165, 0, 7714, 63890, 63889, 7768, - 5538, 9987, 0, 118932, 1678, 917611, 552, 9560, 64077, 10785, 8996, - 12280, 4471, 119112, 9159, 10171, 63861, 10486, 5540, 63858, 63865, 281, - 63863, 12075, 42041, 0, 5174, 0, 63857, 1388, 3123, 0, 1077, 13272, 8408, - 64704, 194821, 0, 9223, 0, 65318, 0, 194822, 42105, 1116, 13274, 194972, - 3663, 0, 1112, 119122, 8686, 8881, 5334, 42108, 0, 64092, 64091, 9322, 0, - 120595, 64095, 5327, 8111, 63870, 63869, 3478, 63867, 6199, 2903, 0, - 3001, 1158, 8745, 64081, 4741, 63866, 4737, 4370, 4846, 0, 4742, 41335, - 4118, 1797, 64600, 805, 120130, 46, 65101, 8760, 298, 118987, 12212, - 120123, 65174, 63836, 32, 5965, 0, 0, 12225, 3665, 63837, 64793, 65330, - 41336, 4305, 66360, 8083, 0, 119938, 63821, 4412, 63819, 63818, 12244, - 5227, 9047, 12702, 4181, 4752, 63975, 4634, 560, 5643, 8226, 6181, 63812, - 41181, 63810, 63790, 3639, 63815, 10122, 63813, 6047, 7937, 63974, 780, - 206, 0, 4936, 65147, 1098, 63930, 0, 1093, 41729, 3016, 4869, 63932, - 917554, 63929, 3546, 1605, 0, 6182, 0, 65058, 8400, 41533, 63920, 0, - 5471, 2984, 5314, 9287, 5473, 44, 0, 195075, 13169, 5290, 5283, 1695, - 63827, 1088, 5961, 8304, 1084, 1085, 63829, 1083, 10131, 5576, 0, 64405, - 4263, 1092, 4754, 8947, 5252, 0, 65253, 64938, 0, 7908, 120622, 120719, - 120673, 0, 2965, 0, 8808, 0, 1089, 7761, 41641, 42119, 12355, 65204, 940, - 5787, 9992, 63938, 5057, 64679, 12463, 2994, 5054, 41694, 0, 9664, 41026, - 1437, 9399, 658, 3497, 12920, 0, 660, 5060, 666, 9022, 5532, 118951, - 5533, 5059, 4727, 6118, 222, 979, 3884, 12459, 65154, 5773, 978, 120748, - 120690, 41619, 10239, 12465, 0, 194863, 64411, 63946, 1707, 0, 12461, - 63895, 63949, 63948, 63947, 3376, 6038, 63943, 63942, 63894, 65323, 0, - 65508, 7776, 64278, 2379, 8703, 917591, 64668, 801, 8125, 1690, 63919, - 63918, 63917, 2369, 0, 12844, 0, 119235, 5486, 2334, 64893, 4463, 5483, - 10207, 0, 2367, 5484, 63909, 264, 2375, 8060, 6194, 5485, 1844, 119084, - 9061, 5534, 10672, 4502, 0, 253, 0, 1823, 8800, 10746, 64470, 0, 11957, - 6192, 0, 0, 118942, 0, 725, 4550, 13257, 120800, 118944, 12892, 0, 0, - 41775, 8413, 0, 0, 5693, 10397, 0, 13209, 5074, 5073, 0, 8983, 0, 119183, - 66586, 5072, 63982, 6198, 12478, 917609, 196, 66608, 3111, 64725, 4929, - 12445, 0, 0, 0, 66606, 64942, 1076, 0, 1436, 4934, 64415, 41323, 9758, 0, - 12807, 63907, 63906, 4548, 4329, 6113, 4979, 3048, 4423, 41320, 0, 10515, - 6218, 8971, 5071, 0, 3642, 1430, 5070, 10042, 120606, 3987, 5068, 120483, - 3255, 3493, 0, 8905, 10735, 120217, 41635, 3378, 4531, 1245, 9105, 66311, - 4921, 4481, 3771, 194649, 2710, 41693, 0, 41724, 64709, 41682, 41690, - 120790, 4922, 325, 992, 0, 4925, 10914, 0, 9526, 4920, 65262, 948, 10783, - 120208, 4930, 917570, 4462, 194855, 4933, 5339, 6115, 120210, 4928, - 917603, 4457, 0, 65290, 42163, 722, 5684, 8678, 12637, 0, 5689, 8753, - 1509, 120617, 5468, 9511, 195043, 65183, 1672, 6205, 5832, 6310, 5686, 0, - 120818, 0, 0, 0, 50, 0, 41607, 120115, 1679, 120116, 10759, 120113, 0, - 3183, 13259, 4448, 119225, 401, 119139, 120109, 64763, 5761, 342, 8553, - 1151, 8143, 0, 11983, 64384, 624, 120715, 65500, 0, 5078, 12501, 5656, 0, - 5076, 118870, 8812, 0, 41601, 685, 9025, 1524, 8003, 194714, 5539, 8087, - 12971, 120101, 120094, 1252, 0, 194612, 4636, 0, 118985, 8053, 9732, 0, - 5080, 13121, 5036, 5035, 120590, 12277, 119187, 195042, 8074, 275, 13084, - 194594, 8741, 4432, 120610, 5033, 120668, 64605, 4836, 3888, 473, 0, - 8502, 120250, 120681, 1087, 12499, 0, 63844, 12496, 3601, 1922, 194626, - 64965, 65422, 12502, 194624, 12505, 66321, 0, 9489, 0, 3432, 4384, - 917548, 6094, 0, 8815, 13295, 64753, 0, 1676, 1154, 3857, 1205, 5030, 0, - 13100, 12958, 10519, 9622, 0, 64723, 4421, 10592, 0, 495, 0, 10544, 7983, - 118882, 10749, 119835, 8494, 13297, 10979, 41710, 947, 0, 437, 41709, - 10969, 119935, 119934, 9465, 13290, 4795, 119930, 64306, 8826, 120181, - 41714, 120611, 8626, 4590, 4711, 120769, 120195, 2739, 119918, 8044, - 40964, 251, 12686, 7895, 4395, 119927, 119926, 119929, 1779, 8146, - 119922, 41543, 5325, 642, 120753, 8880, 7685, 194653, 0, 6234, 13229, - 625, 8187, 9990, 1113, 194643, 7915, 1104, 120176, 8179, 10655, 0, 9316, - 10980, 2489, 1082, 8150, 1359, 194645, 0, 0, 0, 5042, 5041, 0, 12084, - 8049, 41548, 0, 40962, 0, 0, 4761, 10506, 4766, 1616, 1273, 0, 8795, - 118876, 0, 63957, 9232, 1138, 10483, 12677, 41545, 12881, 3239, 0, 0, - 66614, 194582, 42128, 3484, 64545, 194801, 12620, 8503, 5122, 41527, - 5040, 4924, 194913, 0, 120535, 0, 5039, 41926, 8303, 0, 5038, 0, 10003, - 0, 917543, 120586, 1686, 0, 9359, 66609, 3664, 0, 8238, 64299, 0, 0, - 3863, 126, 4835, 0, 0, 13245, 4309, 7744, 194569, 119902, 194568, 13184, - 0, 0, 12222, 8136, 194987, 711, 1633, 0, 0, 4762, 1103, 194561, 12281, - 4765, 41331, 1006, 13040, 4760, 9461, 8201, 10871, 0, 1102, 5031, 118904, - 194664, 0, 64636, 13042, 337, 194781, 0, 119184, 12279, 1111, 120309, - 194636, 4707, 194635, 5511, 7883, 8822, 7880, 4522, 8255, 5512, 13010, - 119232, 66378, 64313, 194667, 5906, 1119, 120233, 13038, 120639, 2455, - 64734, 13008, 41652, 4385, 12492, 12821, 8714, 64775, 119161, 13009, 160, - 0, 0, 64262, 5052, 64031, 5821, 6186, 41792, 0, 5051, 0, 1429, 64573, - 5050, 302, 388, 12058, 735, 0, 1079, 3867, 5708, 12726, 0, 9117, 5706, - 10679, 5513, 8791, 4005, 0, 5510, 10991, 0, 65458, 2470, 917581, 41399, - 1925, 194805, 917577, 917576, 917571, 5048, 5047, 41532, 10058, 0, - 917569, 9070, 0, 3339, 8089, 1106, 639, 120456, 63967, 3340, 3109, 3653, - 4599, 10799, 917583, 10605, 917585, 1476, 648, 1754, 11001, 3233, 864, - 41782, 10164, 8972, 0, 3530, 9750, 0, 13240, 41781, 5192, 4338, 5046, - 8512, 63770, 13199, 8967, 1236, 5045, 12012, 13189, 7986, 5044, 120556, - 9006, 13128, 5043, 9553, 1590, 63777, 63776, 9669, 12341, 8654, 8402, - 63779, 1583, 4740, 13260, 3586, 13276, 0, 120306, 0, 194661, 41523, - 13296, 517, 12922, 120140, 194658, 41528, 123, 65454, 12393, 63807, - 41997, 10531, 7784, 13271, 1334, 120445, 4479, 1126, 119004, 120663, 0, - 8520, 3925, 0, 8069, 4357, 42154, 489, 120450, 120440, 8848, 63786, 8450, - 120434, 11926, 41557, 1145, 63788, 7910, 63785, 63784, 10456, 8711, 6183, - 8183, 120741, 8928, 0, 7952, 0, 125, 9235, 64861, 0, 12689, 0, 10779, - 10990, 3523, 1074, 13258, 9536, 8477, 0, 4427, 10517, 63757, 7726, 12217, - 41802, 267, 1349, 10713, 1371, 120293, 195070, 2458, 63753, 6201, 41084, - 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 8140, 42084, 6260, - 3391, 41075, 2476, 41956, 11988, 3898, 10625, 10201, 10988, 13017, 63794, - 10367, 12521, 10431, 13014, 13013, 1068, 194806, 12523, 12945, 12524, - 12438, 7950, 10804, 13233, 12082, 4386, 9053, 12473, 2793, 12475, 704, 0, - 6195, 9530, 12238, 12232, 0, 194944, 5681, 12629, 4595, 63760, 792, 0, - 64803, 0, 8742, 0, 64947, 65448, 63744, 12948, 64787, 195002, 63748, - 1693, 63746, 63745, 5055, 0, 4287, 1090, 4902, 1131, 41180, 194721, 4558, - 1816, 9523, 41712, 168, 0, 4898, 64298, 6157, 63775, 4901, 1821, 13191, - 12170, 3500, 3139, 791, 9162, 12485, 10306, 119001, 194945, 0, 64433, - 8354, 10033, 941, 0, 64422, 120185, 0, 8234, 64559, 8228, 8424, 10246, - 194996, 12811, 194998, 3946, 195000, 8057, 0, 673, 194854, 64357, 0, 0, - 9547, 288, 64296, 194976, 2448, 10025, 194981, 2918, 2452, 65300, 41529, - 8729, 64726, 2790, 7845, 3793, 0, 4408, 4122, 0, 41535, 8723, 65178, - 10087, 0, 731, 42109, 12923, 2438, 64855, 65396, 0, 1175, 13256, 1282, - 373, 119172, 5396, 8653, 8557, 7723, 0, 3330, 0, 41952, 0, 5273, 8248, - 5269, 3304, 5202, 2404, 5267, 0, 0, 0, 5277, 12963, 5371, 6189, 4125, - 1826, 12133, 65241, 118873, 8785, 917589, 0, 64643, 9035, 3864, 13185, - 4631, 3879, 118785, 0, 4166, 164, 0, 0, 64484, 0, 10212, 5384, 41882, 0, - 64346, 0, 120098, 0, 41388, 0, 12005, 12666, 41387, 13207, 8706, 5552, - 10172, 700, 5929, 5553, 12978, 194610, 5356, 12906, 8563, 41888, 3180, 0, - 0, 5554, 971, 12344, 8724, 0, 13201, 63874, 0, 2866, 8517, 12446, 13190, - 64632, 120227, 5555, 10045, 12882, 13275, 120672, 41522, 13206, 9143, - 194957, 41525, 120539, 195069, 656, 194614, 65037, 4577, 12229, 8715, 0, - 0, 120261, 4269, 64813, 119163, 41609, 10476, 950, 0, 3932, 41450, 0, 0, - 0, 120014, 11974, 118884, 369, 119096, 41784, 119099, 5097, 194869, 9848, - 0, 10381, 4796, 10317, 3651, 10285, 194616, 10269, 5102, 5101, 120511, - 9064, 8138, 120455, 404, 5100, 1439, 12093, 1247, 8092, 195064, 5099, - 1831, 1441, 4793, 3842, 650, 0, 746, 120784, 195041, 41453, 12018, 9031, - 12182, 120305, 9078, 8545, 4422, 4708, 3799, 3268, 0, 9118, 119127, 2676, - 7750, 4374, 195052, 6190, 1364, 195053, 8038, 195055, 9857, 0, 9858, - 195033, 66585, 12129, 13174, 8481, 12412, 6202, 64380, 10920, 10872, - 2365, 7841, 195038, 5108, 5107, 0, 13210, 6176, 195093, 5541, 41785, - 41171, 12613, 5284, 4372, 207, 0, 4275, 120171, 0, 119147, 0, 12965, 384, - 5103, 10404, 10340, 10702, 0, 488, 13236, 12937, 10017, 9733, 13187, - 10014, 11982, 41373, 13198, 5203, 120517, 13232, 5106, 349, 4863, 41371, - 13194, 41367, 5105, 13133, 12861, 4398, 5104, 5672, 304, 1096, 0, 0, 932, - 12441, 0, 238, 195008, 4318, 10452, 195013, 8032, 13243, 13237, 12719, - 194884, 119059, 64814, 64884, 119872, 10670, 8597, 1178, 64017, 9864, - 13195, 8803, 309, 0, 8151, 10858, 64961, 7722, 12553, 10459, 12568, - 64824, 12549, 66590, 12570, 9712, 41417, 41496, 0, 65165, 4965, 0, 10538, - 0, 41401, 0, 0, 6191, 6261, 0, 0, 11965, 1957, 10420, 982, 2756, 9370, - 2720, 12357, 119260, 2925, 118817, 13056, 3222, 13212, 10116, 41644, - 10105, 10624, 41581, 10834, 118793, 64407, 5242, 41963, 64476, 1694, - 8216, 10814, 0, 7781, 6306, 64568, 0, 120738, 12077, 42057, 41444, 0, - 120325, 64799, 3475, 66566, 2479, 9709, 3632, 120322, 10698, 0, 3648, - 3907, 194963, 194962, 3636, 40979, 2979, 8837, 65229, 1843, 3936, 0, 0, - 41347, 65119, 13235, 3640, 41248, 120579, 4379, 13239, 12692, 7969, - 120120, 66353, 194951, 118908, 120509, 41846, 2529, 734, 10808, 65146, - 42083, 194955, 194954, 42055, 1846, 66367, 12181, 9634, 120310, 9988, - 12991, 1670, 5740, 120317, 10072, 5379, 120318, 41163, 41157, 785, 8236, - 194942, 9027, 63897, 13267, 64383, 64688, 925, 0, 120541, 41773, 41071, - 9586, 120312, 41984, 9217, 6151, 12110, 0, 194901, 64580, 4016, 13265, - 13264, 381, 12936, 6100, 42077, 120768, 5808, 5184, 8200, 12967, 10810, - 5612, 4583, 0, 5860, 120506, 64575, 0, 812, 3615, 65284, 5178, 194929, - 119015, 9825, 5188, 9698, 7814, 194935, 10692, 1166, 64429, 41921, 924, - 9756, 12359, 119258, 0, 2442, 10703, 194940, 194939, 8012, 5674, 0, 0, - 12361, 5677, 0, 0, 40972, 12453, 41920, 5673, 0, 5676, 8542, 12694, - 118978, 2468, 1294, 41294, 3336, 3883, 64388, 1727, 194991, 0, 3605, - 120638, 0, 12034, 8718, 3550, 736, 7806, 4505, 2715, 806, 5826, 41884, - 5813, 0, 65391, 5841, 5837, 64731, 66325, 3105, 2405, 5838, 5796, 0, - 65259, 5793, 5735, 5866, 5797, 1432, 5865, 12143, 7956, 598, 0, 41886, - 2480, 0, 66334, 9037, 5671, 5537, 0, 0, 10932, 0, 1211, 847, 120615, - 9529, 118832, 12318, 194601, 0, 5645, 10622, 41391, 194967, 120033, - 64597, 0, 5650, 120039, 119102, 64864, 194968, 9624, 0, 0, 0, 2748, 3589, - 0, 4035, 10297, 0, 4265, 194969, 3977, 65344, 12051, 836, 5698, 2488, - 194634, 4582, 120713, 5644, 10292, 66627, 8046, 0, 10550, 120081, 65116, - 119206, 120022, 65120, 1374, 64878, 119014, 41013, 10568, 41374, 4030, - 41010, 0, 41015, 120516, 65325, 400, 12597, 120621, 0, 120593, 41375, - 5659, 64827, 4759, 118906, 390, 10266, 41349, 1170, 3473, 7718, 118962, - 1609, 902, 0, 0, 66352, 0, 8122, 5712, 0, 8004, 3861, 9540, 10278, 2554, - 5158, 5714, 41136, 194970, 64351, 807, 0, 194691, 64677, 976, 0, 6146, - 65518, 771, 10954, 41356, 9673, 13168, 0, 41143, 8676, 7904, 5579, 953, - 451, 194585, 5578, 12635, 0, 9724, 0, 0, 9524, 120794, 118789, 1440, - 3379, 10310, 120016, 120722, 471, 0, 0, 3795, 120220, 12586, 10701, 0, - 41060, 10094, 64900, 194959, 10857, 2474, 120640, 9590, 93, 10615, 10213, - 8128, 12551, 10049, 8171, 3544, 0, 6017, 65311, 383, 120223, 13306, - 10533, 7870, 0, 5187, 120711, 1456, 0, 42164, 0, 194702, 5232, 0, 41009, - 2472, 41005, 120699, 8710, 6019, 4256, 120776, 4980, 8860, 9640, 10028, - 12845, 119114, 13182, 65121, 120685, 0, 10631, 65126, 7972, 118928, 8066, - 0, 7900, 8316, 0, 120213, 120555, 0, 120830, 0, 10347, 445, 120566, 0, - 12931, 0, 8330, 0, 0, 0, 64366, 64369, 8814, 3902, 64607, 1770, 0, 12836, - 0, 64552, 0, 4584, 9684, 0, 0, 10866, 0, 1118, 0, 0, 9349, 1081, 120464, - 0, 8162, 9342, 5996, 0, 4903, 64332, 41386, 5162, 41007, 1330, 64486, - 40995, 12209, 12047, 41384, 0, 0, 1848, 4334, 120334, 41975, 64777, - 10674, 5522, 0, 61, 120157, 0, 3633, 917582, 65162, 41234, 12089, 118800, - 9771, 120333, 13251, 41959, 64749, 6262, 2784, 0, 9334, 8126, 0, 64967, - 7975, 441, 194591, 0, 66621, 4884, 40999, 120269, 0, 66314, 6313, 10890, - 0, 119090, 8324, 7855, 2345, 0, 463, 64737, 0, 0, 3117, 5460, 0, 1193, - 10056, 1148, 12396, 13252, 7829, 42173, 0, 7743, 0, 13248, 5499, 120549, - 120557, 9034, 6039, 0, 5663, 119182, 41018, 0, 10338, 2482, 1471, 195027, - 120079, 66370, 12378, 41966, 41970, 0, 12374, 10903, 9592, 0, 911, 2460, - 120499, 11944, 12376, 41032, 40996, 120614, 12380, 5520, 64473, 10869, - 5870, 64670, 13310, 2603, 12326, 539, 0, 65180, 0, 3853, 41327, 64901, - 120796, 0, 10722, 0, 8659, 0, 12474, 0, 5857, 65342, 2478, 119120, 4162, - 7942, 4260, 12953, 119245, 120090, 12470, 0, 0, 2742, 12476, 5439, 10946, - 9101, 12472, 0, 12302, 3018, 12942, 5748, 194895, 10773, 6161, 0, 8796, - 0, 194583, 118986, 8519, 13146, 119954, 42053, 9422, 10333, 2882, 4366, - 0, 12843, 4520, 0, 0, 10648, 0, 4014, 12842, 0, 12015, 13117, 0, 3893, - 66362, 5810, 0, 0, 42147, 64747, 13292, 0, 12938, 10427, 9154, 3844, - 63934, 9755, 1110, 65239, 10892, 8231, 10775, 0, 41968, 783, 12161, 3591, - 41969, 0, 2453, 8518, 3620, 119181, 12443, 4556, 10349, 10413, 0, 41159, - 3202, 119097, 10510, 4382, 0, 0, 10842, 41265, 120088, 8902, 0, 1840, - 41751, 12891, 0, 4883, 285, 4723, 41917, 9788, 4459, 66635, 1634, 41958, - 9155, 240, 9786, 65082, 41919, 8579, 9743, 7981, 13134, 118878, 4508, - 64883, 41999, 120231, 120664, 118885, 63887, 3081, 63886, 120080, 0, 0, - 10445, 41720, 0, 0, 2614, 9024, 64620, 1729, 0, 64289, 65221, 0, 65466, - 64852, 64509, 120235, 63916, 194984, 41203, 0, 41879, 0, 4121, 12957, - 884, 41214, 63879, 4943, 5150, 0, 5278, 7773, 643, 3086, 118912, 64652, - 120068, 58, 0, 6167, 120083, 63872, 8491, 0, 0, 41495, 3624, 0, 0, 64655, - 2721, 9616, 63988, 41955, 41321, 10500, 10440, 9611, 4264, 120077, 0, - 7738, 63986, 63985, 12638, 0, 3435, 3094, 12916, 9754, 66376, 4437, - 41292, 8899, 0, 42058, 9517, 65143, 0, 65360, 0, 119047, 63956, 4306, - 41380, 11995, 63960, 9591, 63958, 10217, 118845, 120657, 120578, 12456, - 2723, 0, 5088, 5086, 0, 0, 7752, 41378, 2880, 0, 0, 2872, 1386, 65034, - 3498, 4378, 65039, 4270, 12392, 65036, 7853, 0, 12101, 5822, 5230, 0, - 710, 0, 12390, 1666, 8161, 371, 12013, 63891, 42092, 119103, 415, 63851, - 63892, 63962, 42096, 5183, 3362, 12377, 7924, 2927, 4324, 63961, 4472, - 1244, 331, 0, 12683, 10662, 64678, 4756, 195017, 119021, 10730, 7691, - 10331, 0, 41964, 6238, 8938, 8628, 6043, 0, 64895, 1604, 9565, 10539, - 120814, 41220, 13032, 120791, 194575, 10032, 8750, 12373, 63828, 11992, - 1351, 0, 8698, 12190, 3622, 1930, 194573, 9621, 12427, 63981, 4967, - 13031, 1966, 2330, 0, 3657, 0, 65202, 6000, 4347, 4416, 42098, 13180, - 10694, 8099, 402, 41916, 13147, 0, 42100, 12429, 9695, 41757, 41281, - 3515, 5170, 65261, 41755, 676, 6259, 41742, 0, 41870, 0, 3536, 0, 41305, - 63902, 6162, 10532, 0, 10113, 41829, 120545, 5159, 12422, 41832, 439, 0, - 194948, 12316, 12481, 2325, 40970, 41830, 194947, 0, 5145, 12486, 65018, - 194723, 5409, 8976, 0, 12336, 4135, 9685, 341, 2727, 4129, 3539, 66616, - 0, 41736, 7913, 5405, 63859, 4131, 41267, 64721, 63871, 4133, 63864, 210, - 4600, 64690, 3254, 4137, 120608, 0, 119062, 0, 0, 4591, 65077, 118982, 0, - 3355, 9508, 3393, 561, 12159, 195, 64261, 3377, 12497, 41269, 0, 13135, - 0, 8368, 119224, 41499, 0, 0, 0, 41498, 0, 1379, 246, 12603, 0, 3788, - 2924, 64587, 12812, 8728, 64906, 119213, 8917, 0, 301, 64765, 3969, - 64964, 9575, 64562, 0, 9652, 0, 64590, 42086, 0, 0, 13163, 0, 41877, - 120443, 3182, 327, 0, 9042, 120298, 0, 42169, 4755, 0, 119882, 13223, - 12431, 8668, 12434, 608, 600, 5999, 1219, 3934, 9494, 0, 0, 1726, 0, - 64686, 8212, 12115, 0, 13160, 7759, 65363, 485, 0, 65291, 9828, 927, - 42102, 194979, 12436, 9351, 7778, 64379, 0, 0, 10126, 1208, 0, 64757, - 9337, 64362, 0, 64535, 120735, 9021, 0, 0, 0, 119237, 5411, 0, 9648, - 64617, 63834, 9150, 63835, 1117, 13037, 2594, 63809, 10691, 12052, 10643, - 41503, 65212, 64536, 2546, 119216, 213, 65309, 10554, 3972, 0, 194678, - 65442, 194677, 12416, 11914, 5452, 8230, 0, 41951, 12418, 42049, 3882, - 8532, 2713, 1573, 9650, 42136, 4596, 66339, 1406, 194682, 40990, 194593, - 12414, 8287, 4143, 194687, 10489, 1143, 4141, 9682, 12415, 1508, 64515, - 8779, 10569, 8725, 120783, 65264, 64487, 119064, 4145, 194761, 194794, - 66613, 0, 8027, 120192, 0, 9550, 0, 0, 194799, 120189, 64070, 10740, - 195020, 64816, 10998, 66333, 12955, 0, 2888, 0, 0, 7715, 3881, 41487, - 12118, 194778, 2878, 5390, 0, 3009, 41476, 41489, 63765, 3007, 1448, - 2975, 10429, 3889, 8521, 5083, 5082, 0, 5235, 803, 194966, 3014, 5081, - 8986, 11002, 10632, 11934, 0, 1332, 64802, 3929, 4597, 65532, 64767, - 9107, 5191, 9288, 9657, 2892, 10577, 6031, 555, 120188, 0, 194927, 12367, - 42170, 13151, 0, 629, 1924, 0, 12037, 0, 5858, 8462, 8005, 12365, 1784, - 1361, 118939, 12369, 7905, 120041, 5077, 194668, 10880, 63927, 5075, - 194973, 9371, 65075, 41193, 11007, 0, 10997, 0, 1342, 0, 0, 3434, 4843, - 4506, 0, 5266, 0, 5272, 4482, 4507, 9578, 63923, 66319, 7979, 64381, - 9831, 64417, 0, 461, 9803, 41972, 4504, 444, 0, 9127, 5276, 64522, 0, - 120179, 0, 64911, 12848, 5177, 41324, 12055, 8722, 120805, 1197, 65512, - 1149, 4114, 409, 4383, 8900, 8948, 7684, 3492, 721, 41191, 9108, 0, 0, - 11954, 119191, 118819, 40963, 3099, 0, 65088, 0, 119834, 12587, 194703, - 0, 12036, 0, 65123, 41576, 8152, 120721, 64428, 12227, 8578, 5995, 12828, - 41575, 2922, 63950, 63944, 120643, 0, 2670, 4167, 0, 65009, 120025, - 65173, 118958, 13023, 938, 0, 0, 0, 9721, 0, 41017, 9606, 12413, 4024, - 41063, 0, 12334, 0, 4153, 11911, 10793, 5250, 12407, 3395, 4404, 0, - 12401, 42007, 5775, 42005, 194739, 119251, 0, 12205, 1344, 8870, 194744, - 4940, 4735, 7683, 1167, 12822, 4983, 0, 63939, 64907, 0, 0, 0, 63896, 0, - 12039, 10559, 11956, 119841, 118892, 9472, 4282, 11929, 0, 12816, 9596, - 0, 12710, 0, 12721, 4101, 0, 0, 5992, 119840, 0, 120280, 1004, 9632, - 120602, 0, 0, 12627, 10953, 0, 6290, 0, 0, 0, 9491, 9686, 5890, 0, 65232, - 12712, 0, 194748, 10718, 13154, 3461, 9139, 64756, 0, 119151, 0, 0, - 13227, 12585, 10565, 119152, 12177, 41708, 12860, 41098, 10015, 10838, - 4900, 10352, 0, 10061, 5903, 4119, 5140, 209, 64002, 41704, 9702, 119100, - 41132, 9245, 13048, 4927, 4138, 41093, 65286, 0, 2410, 993, 194975, - 13054, 12394, 0, 0, 0, 12685, 120011, 119040, 10781, 41230, 0, 0, 1680, - 10507, 118809, 10659, 3600, 13049, 120027, 1336, 41518, 0, 5896, 119838, - 5993, 2819, 64820, 12706, 12966, 41134, 120581, 63915, 0, 8184, 272, - 1363, 8793, 8411, 63908, 41502, 3077, 983, 0, 1512, 0, 1190, 4109, 1335, - 841, 5888, 41358, 9836, 9544, 120820, 41481, 8313, 7832, 118954, 3090, - 2409, 817, 1664, 1850, 120757, 3079, 4731, 10118, 66629, 64541, 12033, - 1255, 12386, 9247, 64350, 66633, 12389, 66610, 0, 41996, 63990, 64936, - 5864, 1147, 63992, 5835, 5328, 66625, 5480, 7858, 41990, 4116, 12391, - 66634, 1094, 194, 12384, 0, 8180, 41686, 12313, 0, 63904, 195018, 6114, - 10898, 0, 64578, 8247, 507, 91, 0, 10695, 0, 12070, 0, 10036, 7857, 6067, - 774, 119829, 2744, 119815, 5994, 12539, 41857, 64321, 8359, 119820, 6028, - 119819, 13167, 0, 7719, 119875, 2486, 7893, 41059, 162, 5436, 0, 119809, - 9687, 64956, 6304, 119078, 6051, 0, 5262, 5904, 0, 12681, 0, 0, 12406, - 12219, 3652, 10537, 0, 10492, 64550, 0, 279, 0, 119978, 64619, 12403, - 1489, 195016, 4132, 4899, 3899, 1007, 42124, 4976, 2343, 4103, 0, 0, - 10750, 1345, 0, 120801, 12859, 8956, 4098, 65267, 5861, 0, 11999, 12151, - 64804, 0, 12645, 5146, 0, 0, 0, 41094, 492, 8685, 12974, 0, 118865, - 41551, 5147, 2582, 0, 64538, 0, 1928, 0, 9594, 5991, 13304, 0, 2527, 0, - 197, 2799, 8241, 0, 119810, 120199, 0, 64958, 0, 5524, 194809, 10138, - 119808, 0, 8897, 119072, 41553, 8357, 4124, 1799, 65371, 42148, 0, 12954, - 194688, 65340, 1123, 963, 2434, 10120, 12405, 195015, 0, 398, 392, 9723, - 7894, 119011, 7945, 64935, 4402, 10896, 12402, 119106, 41880, 8414, - 12408, 120554, 0, 406, 0, 9164, 12411, 0, 4560, 8554, 4961, 0, 1575, - 64682, 5438, 165, 9993, 41467, 63953, 8064, 9093, 9599, 9147, 0, 0, 4987, - 9148, 2399, 4096, 53, 10944, 12368, 65435, 195011, 8178, 64598, 3367, - 12910, 10884, 727, 65272, 0, 5805, 1947, 0, 195022, 42176, 12370, 120397, - 1705, 9331, 8898, 0, 12372, 120642, 195023, 8017, 65287, 8813, 12366, - 10963, 6066, 1329, 4909, 3052, 9220, 120696, 4904, 120274, 10803, 1365, - 9253, 0, 41264, 0, 120712, 0, 119814, 1499, 0, 8055, 0, 8740, 5398, - 63964, 120419, 8924, 0, 5988, 3660, 12017, 64646, 9476, 8788, 1357, - 42113, 0, 3629, 8774, 42114, 0, 3628, 120172, 0, 1933, 3469, 1567, 42116, - 11969, 64809, 2928, 4905, 2487, 4910, 3121, 1804, 3311, 194916, 9114, 0, - 12083, 9315, 4822, 4906, 3852, 2847, 0, 3236, 0, 1251, 7777, 41852, 7951, - 1198, 9132, 0, 12274, 510, 10259, 9865, 0, 4561, 6018, 1398, 0, 12276, - 120683, 41569, 0, 120750, 8167, 12127, 41932, 840, 120300, 2443, 10918, - 10410, 0, 1001, 9241, 1927, 333, 41930, 0, 8144, 8034, 119833, 0, 118828, - 0, 12867, 0, 8260, 7769, 64910, 12621, 65364, 8904, 518, 4764, 0, 41168, - 13204, 4387, 4127, 10530, 65369, 0, 120724, 41044, 0, 0, 9358, 0, 42078, - 5136, 1968, 0, 0, 1337, 10581, 0, 4533, 796, 195001, 0, 0, 12038, 120649, - 12664, 0, 65461, 9798, 6120, 478, 1948, 119007, 10962, 952, 6016, 0, 0, - 9512, 4276, 1206, 3619, 41638, 0, 3843, 8142, 8853, 3361, 41795, 490, - 10715, 3436, 0, 63841, 12817, 9847, 12348, 3930, 12854, 0, 6154, 9551, - 65354, 65346, 784, 65357, 334, 64797, 1453, 65356, 8940, 120329, 8500, - 10428, 10364, 64715, 778, 4317, 10004, 7989, 64676, 3227, 120238, 194654, - 120782, 0, 10855, 13102, 41702, 10309, 9718, 10277, 194958, 120308, - 41624, 5415, 9613, 9001, 4526, 3462, 65215, 64520, 41020, 0, 120042, - 42056, 9759, 64957, 3963, 120304, 8114, 1469, 65445, 65381, 194709, 4988, - 0, 118956, 9598, 904, 352, 0, 1451, 1356, 8453, 4134, 0, 0, 1619, 9703, - 41745, 0, 8575, 119180, 1201, 64732, 12846, 0, 41860, 11919, 64962, - 41550, 5289, 13144, 8511, 9460, 823, 9675, 12305, 5940, 226, 2649, 12387, - 1253, 0, 0, 500, 64521, 9081, 1658, 11936, 64735, 120705, 64660, 63845, - 64784, 9785, 42123, 64783, 194619, 0, 5152, 8935, 41754, 119101, 5304, 0, - 616, 4323, 64666, 4684, 0, 120613, 194912, 65339, 10560, 6048, 4763, - 4112, 118935, 10870, 5260, 9821, 65129, 326, 9681, 4475, 0, 10771, 2876, - 194915, 194833, 6035, 41398, 41192, 9802, 13261, 194880, 453, 41396, - 917564, 13159, 12140, 9572, 65274, 10392, 10328, 40998, 7704, 917542, - 194886, 9800, 4123, 0, 42103, 41000, 7854, 119239, 0, 10977, 64061, - 10344, 9808, 64014, 5394, 4126, 12800, 9521, 9589, 64755, 194917, 4425, - 194897, 10464, 63802, 64769, 1288, 0, 64016, 64024, 12173, 679, 64012, - 194893, 5850, 12049, 118937, 10796, 4474, 10742, 10693, 64006, 1587, - 64005, 0, 120519, 65490, 1369, 12134, 119050, 7927, 0, 1139, 64030, - 64026, 64029, 8970, 64948, 4430, 0, 10774, 4514, 0, 12421, 8194, 0, 1852, - 3057, 65483, 8893, 64032, 12542, 12973, 65341, 120497, 0, 7925, 12423, - 10475, 0, 3496, 1352, 10933, 7707, 9102, 627, 42034, 6158, 8327, 64497, - 0, 6040, 917592, 10129, 64863, 9336, 65451, 5730, 7844, 7798, 64474, - 64259, 1682, 64290, 7820, 119049, 12951, 194906, 7746, 1492, 0, 8288, - 12563, 10728, 5127, 120163, 65509, 5495, 4273, 118922, 9644, 10849, 1833, - 2999, 120612, 64373, 194622, 185, 65085, 6023, 169, 5497, 64611, 8085, 0, - 194850, 194789, 8224, 119010, 1949, 4117, 7847, 120489, 119982, 5321, 0, - 120534, 9313, 2589, 64408, 1689, 7802, 4683, 120502, 120716, 64667, 0, - 1184, 0, 815, 8273, 0, 6049, 120530, 4027, 834, 0, 1803, 64683, 1503, - 8995, 0, 0, 5731, 1381, 2387, 0, 12430, 8289, 10981, 12654, 2881, 65514, - 917600, 9601, 332, 9668, 9766, 5142, 2407, 119221, 0, 6036, 64881, 4026, - 8645, 64789, 2887, 119832, 3526, 6298, 119136, 64475, 4833, 1834, 195095, - 8572, 6021, 10940, 65249, 119848, 8662, 119207, 0, 2652, 10959, 119849, - 10784, 120720, 0, 166, 0, 8635, 9706, 10623, 408, 1828, 0, 13298, 0, - 8531, 8168, 6280, 12324, 8811, 10639, 0, 4832, 64557, 41643, 6279, 12508, - 8713, 10690, 9161, 41645, 1620, 0, 646, 0, 195091, 42129, 609, 119858, - 3472, 8697, 41086, 0, 4343, 6212, 0, 0, 5809, 1950, 239, 119828, 637, - 120048, 41592, 119855, 917539, 120449, 0, 3247, 120754, 12985, 12696, - 119854, 0, 119827, 12929, 10983, 712, 120291, 0, 41567, 0, 0, 0, 119852, - 120793, 119137, 1506, 41565, 0, 4509, 0, 12651, 12216, 64628, 40988, - 11961, 120626, 41727, 7803, 64341, 2396, 42036, 118844, 0, 120264, 355, - 9719, 3886, 9814, 63912, 0, 65444, 996, 42075, 64880, 917578, 65199, - 194810, 8655, 8222, 0, 7939, 10342, 917574, 3178, 917590, 0, 5907, 42071, - 3976, 0, 42161, 0, 5833, 12561, 12555, 5969, 5699, 12562, 12550, 9488, - 40982, 8489, 0, 1488, 0, 13149, 0, 9799, 5265, 66612, 1563, 119091, 9619, - 12464, 0, 917557, 119842, 64508, 5803, 7797, 6070, 10006, 64919, 465, - 6082, 13078, 9692, 194745, 12567, 8116, 795, 0, 7843, 12462, 3607, 12715, - 10046, 9612, 42153, 8218, 9485, 120811, 0, 12468, 8607, 1008, 65322, - 3306, 120321, 65138, 6057, 508, 0, 1766, 119074, 11996, 1820, 4547, 0, - 638, 6083, 120265, 12308, 0, 2305, 0, 0, 9470, 6056, 10878, 65236, 4818, - 6085, 0, 65207, 3915, 41634, 5382, 41639, 0, 6235, 119060, 4028, 1787, - 42180, 41979, 0, 3249, 1768, 1130, 12328, 501, 42016, 10601, 195087, - 917629, 65294, 7742, 0, 13280, 41922, 10747, 118925, 5310, 9475, 0, - 120810, 8959, 5526, 119085, 0, 0, 8568, 119818, 65155, 64939, 5403, 0, - 41703, 64926, 1771, 12460, 8936, 120631, 119023, 0, 10760, 119115, 9158, - 0, 120259, 0, 120582, 5410, 5783, 10365, 8403, 5400, 120526, 120295, - 5027, 9326, 10491, 0, 4831, 120698, 5028, 5587, 0, 0, 5026, 4923, 65086, - 8981, 12382, 8931, 120755, 1415, 8866, 0, 65513, 10461, 12103, 0, 8642, - 5029, 64788, 1580, 3598, 0, 41070, 10053, 0, 0, 120258, 6026, 41515, 0, - 64592, 1716, 1461, 910, 11907, 620, 41001, 3658, 41541, 120107, 120332, - 64758, 5024, 12888, 41003, 118811, 5025, 120767, 41514, 0, 5703, 119124, - 41517, 41504, 41519, 0, 40989, 119160, 5849, 623, 781, 670, 10660, 5769, - 613, 6105, 120774, 477, 1268, 65275, 8906, 592, 1578, 2636, 64404, 10815, - 917602, 8225, 194928, 654, 0, 653, 652, 7721, 647, 7869, 633, 120224, - 42152, 64361, 12480, 6119, 829, 39, 12487, 0, 120529, 0, 12482, 0, 12489, - 9667, 391, 5550, 0, 482, 0, 1203, 0, 1813, 64544, 41311, 9503, 120623, - 2877, 120249, 120758, 1675, 4939, 5315, 0, 66567, 10070, 10595, 65443, - 4576, 0, 64304, 120241, 4277, 40997, 4039, 0, 64472, 368, 13036, 3960, - 65460, 119073, 120247, 120244, 0, 3958, 0, 1849, 194564, 270, 13086, - 10714, 194650, 42064, 11959, 0, 64657, 41608, 3618, 120240, 9069, 6273, - 5156, 364, 9595, 929, 119980, 42035, 707, 41155, 41725, 8691, 0, 224, - 41662, 0, 9332, 4966, 0, 0, 4578, 64513, 3841, 0, 0, 10732, 13074, 9580, - 4972, 9356, 0, 2909, 118847, 1286, 10166, 8682, 12147, 10203, 9608, - 12815, 7730, 11962, 41540, 12507, 1196, 0, 0, 777, 10020, 4375, 41372, - 41924, 525, 12198, 0, 8763, 0, 41628, 533, 11931, 8658, 0, 41520, 2705, - 65010, 13126, 9838, 4377, 8559, 7765, 120234, 63780, 13193, 2701, 119051, - 8679, 5767, 1576, 7735, 9809, 8353, 63747, 41960, 63772, 0, 10889, 1748, - 7757, 65265, 120226, 12803, 0, 2718, 4168, 0, 13308, 63764, 63787, 1179, - 4440, 0, 7694, 363, 8896, 63768, 3485, 12987, 41701, 64908, 120826, 0, - 1591, 42168, 64625, 10192, 0, 119192, 13053, 10013, 5630, 0, 0, 9492, - 10390, 13083, 12833, 5543, 120609, 1640, 12495, 630, 0, 3138, 10996, - 41127, 1043, 0, 12498, 10090, 0, 0, 313, 0, 8615, 120746, 41878, 493, - 41426, 5750, 1717, 9417, 479, 9405, 120771, 0, 9398, 9403, 3520, 8426, - 12490, 64315, 65185, 0, 12493, 5815, 10707, 1002, 12491, 0, 12934, 631, - 120146, 64922, 13161, 41303, 0, 10546, 120147, 118901, 13305, 0, 2797, - 13107, 120095, 306, 714, 3058, 0, 0, 917555, 119961, 194824, 0, 12644, 0, - 0, 194815, 7909, 9157, 4569, 63758, 63805, 0, 63804, 40986, 180, 244, 0, - 12898, 12494, 12674, 8244, 362, 0, 118967, 8037, 0, 0, 120680, 4882, - 5185, 0, 5521, 4885, 5519, 42155, 10302, 4880, 10104, 1027, 1360, 248, - 12424, 10523, 1446, 4319, 41646, 991, 5189, 63754, 10494, 120527, 1722, - 5581, 120151, 470, 118965, 65271, 5523, 0, 64527, 4579, 0, 9549, 12511, - 10549, 12514, 9661, 0, 12000, 9602, 8623, 0, 0, 0, 0, 12512, 41341, - 13041, 6150, 9846, 659, 6098, 0, 1174, 10334, 0, 8311, 12510, 63856, - 13039, 0, 12513, 9284, 12471, 0, 12330, 0, 63853, 0, 2323, 65288, 2319, - 6293, 12477, 0, 2311, 194867, 4415, 237, 6281, 0, 0, 9010, 2309, 7897, - 8173, 64894, 12469, 0, 118979, 1736, 10609, 3894, 12228, 9397, 10987, - 3383, 9396, 9393, 693, 9130, 314, 9389, 6209, 9387, 9388, 4932, 9386, - 9383, 5332, 12204, 9285, 10436, 8185, 41808, 1751, 273, 8165, 13166, - 2313, 65449, 7948, 9236, 8544, 4528, 2584, 6301, 119185, 6289, 10484, - 9463, 0, 9339, 10922, 3757, 3147, 195092, 12420, 10421, 120488, 2310, - 64389, 2326, 9382, 2565, 9380, 9377, 7921, 9375, 9376, 1683, 9374, 2567, - 8596, 12444, 4044, 41274, 12527, 8210, 120756, 8334, 474, 12331, 0, - 42032, 8744, 726, 9839, 120313, 0, 0, 41276, 42030, 10467, 12522, 9835, - 0, 4951, 634, 12275, 10895, 65492, 274, 120236, 1858, 4744, 4746, 0, - 9548, 120596, 403, 120117, 12503, 9610, 8068, 8197, 63996, 699, 120634, - 41665, 1819, 10496, 0, 42182, 0, 13262, 0, 41667, 12506, 194835, 1923, 0, - 12500, 118849, 12509, 64393, 194755, 120692, 10589, 64279, 41047, 2996, - 1937, 194716, 917505, 8084, 4047, 3608, 63840, 65016, 1107, 194718, 9076, - 8862, 120636, 293, 194841, 64766, 64791, 41827, 13222, 65416, 10579, - 8560, 10463, 63994, 118835, 4803, 9043, 1739, 1941, 498, 64471, 1713, 0, - 12529, 8042, 0, 2344, 12528, 6297, 2414, 0, 0, 3231, 0, 12200, 0, 65156, - 12530, 2537, 969, 41429, 12658, 13034, 6165, 13035, 0, 41433, 4719, 469, - 119240, 4363, 5211, 8914, 0, 119948, 1772, 1435, 64876, 2969, 6046, - 64812, 6208, 64101, 5746, 12215, 0, 4931, 1951, 8612, 917599, 9607, 0, - 338, 0, 5061, 10675, 41106, 10767, 1491, 8115, 0, 11941, 41061, 8227, - 8270, 1218, 0, 41993, 41509, 0, 63808, 12889, 120603, 41108, 4486, 41995, - 1075, 1958, 10925, 41992, 41506, 0, 0, 120326, 10257, 0, 10273, 120327, - 7692, 12669, 8008, 120320, 330, 8566, 65083, 9046, 41117, 41126, 12532, - 0, 120114, 3508, 7794, 0, 0, 9645, 65026, 10770, 3669, 3968, 65028, 0, - 13028, 194890, 12537, 194802, 120112, 0, 12536, 2350, 13029, 66320, 0, - 12116, 13030, 118980, 4527, 1588, 12538, 8409, 119026, 10683, 65398, 787, - 9502, 4948, 12484, 4032, 118940, 41654, 65399, 6207, 0, 6117, 65401, - 8412, 65247, 194842, 8734, 644, 9769, 41657, 10149, 3659, 9533, 184, - 9853, 10827, 12488, 65382, 10502, 41556, 12623, 65474, 2354, 0, 8220, - 118856, 6295, 901, 41510, 7953, 118826, 5157, 4020, 63811, 11927, 66584, - 64818, 0, 41687, 64303, 0, 63816, 0, 0, 119868, 65198, 0, 0, 118930, - 64094, 118926, 7877, 2352, 0, 120726, 64576, 13299, 1407, 10911, 0, - 13026, 0, 7941, 0, 8362, 8903, 9777, 0, 10399, 5869, 8636, 0, 1343, 0, - 12649, 9325, 13025, 6283, 64499, 12643, 0, 0, 13027, 8543, 10051, 9216, - 8263, 13019, 41258, 8625, 194754, 13021, 10477, 3136, 8733, 120742, 8315, - 13022, 10196, 64588, 0, 6152, 0, 5477, 917566, 10112, 194763, 13020, - 194765, 8675, 194767, 194766, 119870, 0, 10978, 8029, 6091, 120350, 4485, - 3335, 118886, 3590, 9776, 41397, 66578, 5215, 194750, 3333, 1632, 63900, - 3588, 3342, 9341, 5363, 917559, 12725, 120564, 0, 64076, 223, 64079, - 1611, 13246, 13018, 120319, 63792, 65245, 3337, 1171, 194605, 194587, 0, - 1805, 8772, 41423, 119241, 11945, 8708, 13046, 8838, 425, 4025, 10709, - 41868, 0, 2392, 13047, 4530, 120105, 10617, 1213, 119233, 120103, 797, - 118814, 7888, 13050, 194742, 64387, 4115, 0, 194735, 0, 3277, 8929, 4947, - 41055, 0, 64276, 426, 194724, 13045, 8251, 10136, 7751, 194727, 9726, - 119253, 1224, 12806, 8768, 13044, 0, 1764, 3101, 119817, 8480, 1078, - 9757, 65439, 41057, 120167, 0, 8663, 9312, 4413, 4539, 3787, 42160, 9222, - 0, 9165, 1572, 9092, 12593, 41961, 2346, 12724, 8958, 0, 9646, 3773, - 41825, 1293, 7947, 12003, 120228, 13043, 8056, 2454, 5349, 208, 0, - 120168, 64849, 120525, 8816, 10699, 10840, 0, 7825, 5661, 0, 12595, 3603, - 41109, 2398, 3548, 1157, 64903, 8638, 0, 0, 3115, 0, 0, 118787, 8235, - 4405, 10086, 4876, 0, 0, 119256, 65430, 64493, 6079, 12646, 10764, 8158, - 41561, 41472, 998, 13051, 13105, 3143, 194674, 194673, 41559, 8509, 7882, - 13052, 118948, 5665, 530, 119071, 41986, 0, 12002, 64526, 5742, 5664, - 4692, 8979, 12310, 4007, 63970, 194686, 7896, 1121, 119168, 3382, 63959, - 66373, 13231, 0, 64874, 4732, 6311, 0, 12004, 63976, 8627, 63977, 10110, - 194671, 41705, 0, 42028, 64327, 10509, 2795, 63979, 65308, 0, 0, 6275, - 917573, 41699, 120324, 194655, 3229, 65517, 63952, 41133, 0, 5407, 12823, - 2331, 41678, 42026, 12156, 2336, 119046, 0, 120323, 0, 0, 1921, 120003, - 194642, 0, 822, 65529, 12691, 4284, 194657, 194648, 194659, 12841, 9229, - 10956, 41255, 12607, 5311, 1795, 965, 3521, 10587, 5774, 8325, 0, 65403, - 0, 1854, 10794, 119250, 10057, 6294, 3144, 64780, 5280, 65019, 4344, - 12905, 41610, 6076, 748, 12385, 768, 535, 442, 12375, 194652, 194629, - 10556, 2475, 12388, 4889, 8968, 6071, 3593, 64093, 4804, 2342, 0, 1800, - 0, 4894, 467, 4890, 120803, 194800, 120707, 4893, 8421, 12433, 10666, - 4888, 502, 64080, 64615, 41490, 0, 12043, 10119, 316, 0, 10230, 65191, - 64087, 64924, 64086, 64746, 2332, 4860, 412, 194567, 11997, 12432, 9583, - 8058, 5546, 8019, 917553, 66561, 63750, 12203, 5544, 2355, 8913, 120390, - 4875, 10613, 120381, 12137, 5548, 9344, 6250, 7944, 120395, 13104, 6077, - 12383, 65452, 120405, 0, 3134, 0, 120775, 4669, 0, 0, 0, 3050, 63839, - 10319, 119075, 10383, 118842, 4592, 120694, 10809, 0, 4691, 0, 9345, 621, - 0, 120055, 4918, 10734, 120032, 64631, 0, 7804, 0, 10811, 8457, 10545, - 4914, 10271, 3786, 8886, 4917, 0, 64914, 7923, 3716, 5464, 9996, 118893, - 2361, 7971, 8195, 0, 9566, 7682, 3722, 8086, 41707, 10845, 8319, 2312, - 40977, 10050, 10874, 8305, 8859, 41458, 40980, 65110, 13202, 0, 12582, - 9119, 0, 7920, 41521, 4021, 6288, 7985, 0, 5653, 120063, 10891, 7698, - 5658, 410, 41552, 1802, 120789, 4913, 0, 41659, 41671, 1827, 0, 64396, - 41668, 9077, 2327, 8810, 12959, 120372, 12705, 3860, 10756, 9239, 8821, - 6153, 2867, 120364, 42158, 698, 120359, 8749, 10356, 12698, 64858, 361, - 12641, 845, 194599, 41560, 11970, 4562, 63756, 2926, 194639, 4099, - 194692, 194695, 7936, 194697, 611, 0, 4716, 118891, 0, 120528, 7686, - 120568, 0, 194700, 120543, 118875, 194701, 6291, 5462, 10823, 41669, - 9734, 65455, 9071, 4655, 4151, 0, 0, 0, 839, 42162, 7695, 8769, 65246, - 10737, 119194, 4859, 64467, 65504, 4826, 118998, 41090, 0, 12172, 120387, - 0, 0, 120345, 12576, 7842, 12839, 0, 804, 2699, 0, 10542, 2985, 119222, - 194596, 8271, 10091, 0, 9468, 0, 9827, 64106, 0, 286, 12323, 118830, - 66592, 0, 0, 1425, 35, 119229, 65084, 0, 41210, 64432, 8482, 0, 6090, - 5032, 7812, 10534, 195035, 664, 194633, 5034, 4272, 65211, 40967, 40965, - 42024, 12704, 13294, 66589, 64869, 6032, 120367, 9129, 119867, 0, 120166, - 0, 194813, 5244, 120169, 120170, 41161, 5518, 4174, 10993, 8189, 968, - 120161, 1169, 434, 41437, 66573, 6034, 41164, 64744, 12574, 118867, 0, - 524, 0, 118934, 788, 0, 12679, 64506, 64528, 1663, 10419, 0, 41227, - 120398, 12346, 12855, 64848, 120399, 10415, 41562, 0, 120432, 118850, - 119141, 0, 0, 194662, 959, 8885, 12564, 64333, 120339, 9469, 5195, 5445, - 9355, 64323, 42151, 4644, 8989, 221, 310, 41253, 41564, 8010, 120396, - 4962, 63766, 8855, 10054, 120413, 120618, 0, 9012, 120415, 12088, 41002, - 13215, 120287, 10451, 64260, 374, 120153, 816, 64634, 120148, 120054, - 41934, 3873, 8367, 0, 64608, 4715, 6101, 11987, 41936, 0, 64511, 12723, - 65089, 0, 307, 120416, 9585, 5374, 120178, 1462, 10235, 0, 194670, 0, - 12119, 120498, 13024, 1929, 120426, 12142, 120425, 12236, 41419, 194618, - 120427, 12982, 64374, 5378, 194666, 64295, 41421, 0, 741, 10083, 0, - 120662, 821, 0, 2498, 5800, 10755, 2992, 1760, 8124, 4469, 2324, 828, - 3611, 194865, 0, 1185, 194728, 531, 0, 10628, 194683, 0, 7999, 8204, - 3614, 2827, 9696, 10942, 7713, 2348, 4354, 10904, 4380, 194608, 7833, - 10573, 5320, 41240, 194611, 3000, 10301, 1810, 3673, 5137, 9525, 64569, - 194849, 118861, 0, 120821, 10121, 64940, 194592, 120406, 12824, 13066, - 4748, 7970, 120630, 12608, 194600, 5871, 41160, 9700, 12580, 0, 120777, - 119811, 3967, 7898, 13137, 8775, 64560, 12713, 2963, 9090, 8410, 4454, - 723, 1734, 966, 4449, 0, 64594, 2456, 231, 2320, 194589, 339, 4968, - 194590, 63752, 8075, 1230, 120795, 8047, 3597, 9761, 10584, 41542, 65404, - 1290, 66358, 8352, 0, 5687, 120505, 3840, 1584, 0, 6045, 0, 10498, 9704, - 0, 120338, 119869, 119992, 12311, 8660, 0, 8365, 8643, 0, 0, 4483, 1709, - 64399, 9780, 6080, 13092, 120044, 1746, 6072, 8667, 12121, 194579, 13140, - 194581, 194584, 2531, 4480, 120765, 0, 1226, 1259, 0, 10394, 0, 10897, - 194560, 605, 120164, 641, 5219, 12342, 64100, 41500, 41129, 311, 12283, - 6221, 9075, 120358, 5466, 10877, 118868, 64885, 120737, 4535, 2667, 4271, - 65406, 0, 345, 41410, 10829, 41198, 0, 41407, 64104, 5037, 41131, 1776, - 8422, 41201, 64103, 41508, 4660, 323, 0, 0, 64338, 1295, 0, 4625, 8323, - 4630, 247, 0, 0, 12338, 4651, 2668, 12080, 0, 64574, 11933, 2519, 0, - 41903, 41079, 5053, 194787, 5049, 0, 65459, 706, 7754, 7727, 8738, 4031, - 6278, 0, 9672, 649, 5514, 118920, 0, 10280, 12670, 1013, 41218, 0, 705, - 41591, 8755, 0, 1183, 65252, 8268, 917549, 0, 8157, 9736, 64503, 65418, - 118921, 4747, 0, 194843, 11913, 4718, 0, 10837, 5141, 10614, 0, 7962, - 12211, 9837, 0, 64722, 119008, 5719, 119977, 9773, 119068, 0, 1857, - 119921, 4626, 8464, 8472, 0, 4629, 8499, 6059, 0, 4624, 7818, 8535, - 119914, 65179, 7805, 64805, 64811, 12242, 41011, 194905, 0, 10558, 0, 0, - 0, 8492, 0, 8459, 0, 1788, 1579, 10766, 0, 0, 8048, 9543, 9028, 120522, - 119177, 0, 41455, 1285, 64882, 194620, 10092, 8684, 12640, 6102, 0, 5298, - 12625, 5294, 0, 42013, 3940, 41597, 119917, 0, 9816, 8665, 0, 12073, - 12630, 1653, 64669, 10153, 0, 6166, 118791, 119913, 0, 5292, 0, 0, 1939, - 913, 3970, 64599, 12455, 1793, 0, 120162, 0, 7878, 8211, 65263, 0, 0, - 118910, 0, 119125, 3514, 13219, 9569, 10865, 120645, 5263, 13286, 0, - 5500, 10022, 65387, 118831, 65384, 5322, 980, 66354, 10008, 5324, 0, - 3784, 41614, 64751, 6230, 0, 63885, 10085, 3360, 8098, 41616, 0, 41734, - 10096, 41613, 8072, 120299, 0, 41821, 1249, 7783, 41731, 12032, 8237, 0, - 64899, 12395, 41149, 12818, 120565, 10462, 41150, 194574, 9795, 119057, - 194609, 13213, 0, 0, 41152, 194679, 9249, 12518, 7808, 1829, 194780, - 41811, 4358, 65315, 10831, 0, 0, 0, 64354, 1710, 0, 10168, 120597, 9781, - 49, 194613, 194953, 6258, 8269, 120594, 9741, 0, 5649, 194617, 315, - 12813, 1643, 194615, 12397, 3470, 8884, 65175, 41099, 65314, 120008, - 1378, 65163, 1072, 120647, 118802, 0, 0, 0, 120002, 0, 1080, 120411, - 8787, 194828, 1101, 41618, 0, 8405, 0, 12632, 1086, 10968, 42088, 7680, - 8847, 10805, 120714, 12639, 3380, 8123, 1091, 6121, 7977, 4501, 12665, - 8119, 12998, 66309, 0, 1494, 0, 3127, 0, 64945, 12930, 1394, 119230, 0, - 12363, 5345, 9789, 0, 9527, 120659, 64582, 12977, 12309, 42090, 8022, - 10635, 12939, 12404, 65168, 42003, 2495, 5848, 8726, 5570, 2587, 12410, - 41722, 1012, 8100, 7890, 120296, 0, 10649, 5569, 6229, 1593, 65319, 6063, - 619, 0, 65080, 6053, 194598, 4120, 65337, 64727, 9160, 0, 119214, 0, - 9366, 9016, 42006, 6055, 3870, 4279, 2500, 10757, 1507, 8497, 8602, - 65320, 41991, 65334, 65333, 65332, 65331, 42059, 42061, 9080, 120099, - 9128, 64480, 5571, 3674, 9740, 9121, 4371, 5798, 10408, 42085, 10107, - 4106, 41989, 65313, 42074, 63999, 41228, 0, 10233, 13098, 120423, 41239, - 0, 0, 8182, 0, 119831, 0, 11947, 0, 5847, 1505, 9131, 0, 12606, 12695, - 41988, 41250, 12175, 0, 64075, 120739, 7809, 0, 0, 562, 8120, 120701, 0, - 13033, 64738, 3219, 120532, 10664, 1366, 1037, 194747, 4551, 0, 118945, - 0, 10637, 4568, 549, 1570, 10478, 2835, 12517, 557, 9457, 5952, 64649, - 41056, 12519, 41004, 0, 2825, 66636, 10825, 8079, 2821, 41046, 0, 195065, - 12111, 3927, 13071, 12515, 452, 5271, 5492, 64718, 2831, 10604, 10144, - 41706, 5212, 5493, 41120, 8916, 0, 9747, 12019, 41332, 1618, 12333, - 917584, 1668, 10430, 0, 5853, 1187, 10363, 118990, 12956, 0, 119107, 0, - 3240, 12060, 12194, 120100, 41631, 41065, 5323, 8166, 4557, 0, 2707, - 8309, 0, 65297, 41052, 0, 2697, 8752, 194689, 4912, 2695, 65172, 0, - 119223, 8864, 0, 64798, 10736, 2693, 12125, 41124, 0, 1164, 0, 0, 1035, - 41067, 120219, 7881, 701, 12178, 3489, 0, 12340, 120751, 5248, 12218, - 120538, 6303, 3796, 41123, 0, 3994, 120283, 10457, 9991, 41128, 64485, - 5792, 120282, 64857, 42171, 2855, 7994, 64762, 6104, 0, 0, 9340, 10654, - 1589, 119226, 296, 3246, 7906, 2879, 41981, 41620, 0, 7815, 120797, - 120482, 0, 0, 10585, 12579, 1496, 747, 12708, 942, 2378, 10960, 119830, - 5299, 0, 9320, 5449, 1232, 8139, 6216, 41431, 0, 65373, 5295, 66624, 0, - 1223, 1642, 174, 120824, 12158, 4161, 2374, 120546, 8475, 3212, 66313, - 3211, 194576, 5286, 0, 0, 917546, 9728, 3846, 8070, 5536, 0, 7705, 11942, - 0, 12136, 3309, 0, 66377, 41491, 0, 4986, 12189, 41653, 1280, 1241, - 917537, 4257, 8496, 0, 6220, 9004, 65411, 194580, 41513, 41650, 0, - 194578, 194878, 12914, 120740, 0, 12797, 6078, 10237, 0, 1475, 119118, - 11979, 6084, 118900, 41064, 41062, 9635, 12600, 3256, 41236, 42076, 0, 0, - 119866, 8727, 65304, 64866, 41237, 64073, 64867, 10562, 118947, 65329, - 64071, 10640, 3248, 2613, 119865, 9015, 0, 66568, 3635, 64337, 41651, - 41241, 64944, 3494, 0, 0, 10588, 0, 0, 0, 0, 635, 0, 194797, 0, 65312, - 5447, 0, 0, 64382, 4010, 7984, 8600, 41915, 120139, 4176, 41105, 5812, - 119933, 6232, 0, 0, 194588, 318, 5302, 0, 0, 4335, 3649, 3941, 42145, - 41110, 3634, 64892, 9113, 1954, 12155, 7866, 0, 0, 42146, 120134, 120138, - 120129, 2849, 120128, 0, 7938, 12960, 1761, 4586, 65379, 350, 10930, - 119936, 509, 0, 0, 0, 0, 542, 5133, 41680, 0, 9500, 0, 1514, 64741, 0, - 5453, 65533, 64921, 0, 2496, 8493, 944, 9368, 3890, 12168, 1438, 8817, - 120592, 10818, 41947, 1220, 120828, 63931, 1194, 3242, 1571, 9555, 8598, - 0, 6169, 943, 41946, 2798, 312, 0, 41980, 119025, 120717, 8877, 269, - 3495, 6272, 9617, 1460, 8988, 120660, 4891, 0, 10862, 0, 41119, 41416, 0, - 4173, 0, 194637, 0, 12895, 64955, 41418, 0, 119022, 120286, 41415, 6296, - 9582, 193, 12188, 0, 64680, 41122, 1730, 2457, 4493, 2314, 10469, 1362, - 9822, 7703, 8840, 5807, 0, 120451, 8534, 0, 4426, 0, 0, 120209, 119123, - 7874, 8681, 5220, 120281, 13136, 119825, 2416, 3310, 10972, 118881, 379, - 119215, 13220, 0, 0, 3223, 5517, 1284, 8041, 4549, 120475, 5240, 9811, - 10012, 3096, 120275, 0, 0, 8515, 8688, 12866, 0, 3294, 9501, 0, 1272, - 65485, 64514, 64654, 120035, 65210, 1467, 10158, 10040, 5288, 9519, - 41861, 8132, 64090, 118899, 12193, 66615, 65493, 3215, 0, 7710, 1610, - 120271, 0, 63881, 0, 0, 5181, 5275, 0, 228, 8637, 1501, 120476, 3789, - 5179, 0, 6225, 118927, 0, 1725, 66603, 8196, 9352, 12042, 0, 0, 9537, - 3961, 5762, 1967, 2605, 4500, 64561, 8104, 4981, 917545, 3405, 0, 63876, - 10414, 13001, 8141, 9559, 2600, 41649, 41647, 64851, 0, 3237, 8631, 2545, - 10466, 8541, 0, 0, 41866, 0, 120430, 64517, 10127, 0, 1650, 262, 1637, - 10958, 7901, 3238, 41945, 0, 41941, 3308, 65158, 10860, 8614, 65220, - 41493, 120624, 41943, 10762, 0, 45, 0, 0, 8106, 4128, 10065, 64083, 4494, - 0, 4012, 10395, 0, 9084, 4537, 8737, 64089, 11004, 695, 739, 696, 7912, - 2620, 64398, 195044, 9227, 0, 179, 5098, 691, 738, 2853, 0, 118813, 3868, - 688, 0, 690, 2548, 737, 974, 64084, 119837, 10854, 119839, 10034, 3985, - 8783, 118838, 9362, 0, 0, 4682, 118869, 12809, 8082, 4685, 3158, 10879, - 4389, 4680, 923, 41863, 3851, 292, 13002, 119845, 119844, 3221, 1763, - 64468, 4612, 119851, 119850, 12999, 41219, 12349, 64644, 10782, 3637, - 12996, 0, 11949, 63922, 10594, 3228, 41826, 64624, 0, 10967, 2731, 0, - 9651, 651, 3891, 7696, 0, 2337, 1735, 0, 0, 4177, 195098, 9089, 66312, - 64695, 120580, 64500, 1860, 2654, 0, 1856, 12240, 8599, 195049, 66356, - 118999, 3458, 3208, 12975, 8498, 119121, 8949, 8758, 9450, 194859, 1569, - 63888, 12534, 12124, 7690, 119254, 12533, 917551, 7740, 4543, 41471, 0, - 64674, 0, 0, 0, 11980, 0, 41544, 41689, 63789, 12282, 64909, 13064, - 63893, 64556, 8850, 9238, 0, 8561, 4573, 0, 0, 12791, 120605, 0, 0, - 120744, 8778, 10630, 12900, 0, 10950, 8314, 194936, 12790, 8804, 65092, - 66607, 12792, 120435, 42018, 1744, 12789, 10366, 12317, 41310, 0, 13164, - 10723, 967, 120253, 64546, 12690, 120454, 3257, 0, 9862, 1845, 2974, - 10446, 41848, 0, 278, 10580, 10089, 870, 0, 3499, 8609, 42149, 876, 871, - 877, 6002, 878, 42015, 879, 0, 4563, 65176, 41308, 0, 65306, 867, 9520, - 872, 8646, 868, 873, 0, 0, 869, 874, 195048, 1940, 875, 790, 220, 65193, - 194845, 10678, 10044, 194877, 5429, 13082, 0, 917541, 5707, 10393, 0, - 120267, 42067, 41890, 5433, 10657, 7911, 0, 3742, 9775, 3959, 0, 5425, - 4977, 2467, 5317, 5423, 4611, 120553, 8040, 5069, 9679, 4182, 0, 4676, - 120501, 41073, 4418, 4184, 4628, 10208, 12989, 118784, 917540, 1851, - 12186, 120601, 11908, 120254, 9360, 9083, 0, 41764, 194565, 12837, 8829, - 7711, 64423, 119218, 194777, 120260, 118855, 8809, 64371, 365, 12056, - 41382, 0, 0, 65395, 42080, 195040, 5516, 2845, 7717, 4588, 41717, 63830, - 544, 12045, 2433, 0, 5515, 3352, 0, 64377, 65437, 793, 65194, 0, 305, 0, - 119002, 842, 120576, 8208, 0, 41695, 1647, 118877, 5608, 63824, 917625, - 818, 5337, 917622, 917621, 120531, 9638, 8061, 8735, 12483, 120468, - 13003, 119140, 10973, 66359, 1372, 118858, 917608, 4969, 1254, 917605, - 989, 64257, 118862, 65228, 6060, 0, 4326, 2840, 64601, 13068, 0, 65242, - 3245, 9068, 119069, 949, 0, 0, 6148, 8605, 2651, 0, 0, 0, 0, 0, 65106, - 120418, 0, 0, 41796, 1269, 195028, 63868, 41777, 64372, 5144, 3226, 655, - 120467, 4431, 4331, 8777, 3285, 41834, 5279, 0, 10336, 8312, 0, 12091, - 671, 250, 0, 618, 668, 610, 65195, 0, 1152, 5256, 640, 41229, 12207, - 1067, 255, 3905, 917593, 9493, 120466, 41014, 10795, 0, 0, 120728, 0, - 10653, 41272, 0, 13287, 0, 65166, 9019, 0, 0, 120695, 987, 64410, 5527, - 2768, 10684, 3365, 5135, 0, 12796, 11953, 0, 0, 5139, 346, 119144, 6305, - 12609, 4675, 5168, 5530, 5210, 0, 4627, 8253, 5208, 1136, 65433, 120587, - 5218, 7976, 118864, 65285, 3244, 5529, 0, 0, 0, 5432, 64258, 4041, 8784, - 2357, 0, 5528, 229, 42140, 119884, 0, 0, 119881, 119880, 119197, 4000, - 119877, 119876, 665, 119045, 3206, 7770, 7884, 64853, 0, 118916, 0, 211, - 2509, 7790, 10470, 7861, 3220, 10791, 64050, 450, 8951, 5214, 10432, - 8118, 5450, 10768, 1233, 4661, 5852, 0, 66338, 41865, 1708, 13293, 40985, - 2623, 10927, 1701, 0, 2388, 4698, 41761, 1066, 8361, 4701, 41758, 5444, - 2617, 64889, 8267, 119863, 119089, 0, 0, 120633, 2625, 8801, 3053, 4340, - 120412, 3631, 10955, 7850, 120292, 8416, 917607, 120203, 65507, 194803, - 12660, 8232, 65434, 194807, 194713, 41069, 194808, 0, 12099, 4310, 4336, - 6252, 713, 41068, 7990, 3990, 194811, 65113, 64638, 65243, 13145, 4489, - 194791, 42138, 1030, 5358, 64577, 9513, 10370, 9357, 194764, 1773, 10250, - 10258, 2712, 1635, 7745, 1410, 0, 0, 94, 194965, 120149, 194731, 8908, - 559, 120421, 12862, 0, 10752, 4892, 10876, 64537, 41307, 8732, 120336, - 5777, 1757, 9539, 4696, 2586, 65248, 8945, 8466, 3641, 5419, 41803, - 42062, 0, 0, 120344, 3668, 120823, 8610, 12226, 0, 194949, 2340, 936, - 13289, 64478, 120436, 1459, 0, 10499, 2962, 0, 2321, 1504, 10465, 41312, - 8921, 195025, 120206, 195026, 64525, 41901, 63814, 4113, 2949, 2372, 336, - 194774, 2958, 12152, 5348, 682, 2395, 120061, 13291, 64743, 10593, 1703, - 4013, 194779, 8033, 120064, 65152, 9810, 10198, 4150, 12970, 8318, 41790, - 10109, 41893, 2360, 41794, 12858, 0, 3999, 3777, 118946, 1965, 9796, - 2411, 194950, 799, 0, 10276, 10308, 10372, 63832, 8501, 63833, 2317, - 10260, 41317, 120513, 5417, 0, 10384, 0, 9353, 0, 7753, 2351, 10641, - 64489, 41314, 0, 119812, 0, 119236, 230, 65431, 12009, 0, 4855, 4165, - 8746, 5441, 9654, 10288, 10320, 0, 10596, 0, 0, 4784, 0, 13270, 7786, - 10098, 41147, 194570, 63769, 680, 6274, 10312, 1181, 0, 3174, 13127, 0, - 64822, 41887, 0, 4862, 9735, 120709, 0, 917604, 3914, 41037, 10828, 9065, - 12961, 41039, 119173, 0, 6231, 289, 65302, 4694, 64504, 4690, 0, 118955, - 0, 4693, 65257, 40987, 4667, 4688, 0, 8828, 0, 0, 1246, 3110, 64705, - 12197, 41008, 4749, 0, 0, 921, 218, 0, 1520, 242, 4786, 41700, 8217, - 8932, 64653, 7834, 10088, 0, 0, 64681, 5313, 951, 8888, 64534, 4816, 0, - 0, 4009, 194694, 0, 120562, 41549, 195031, 64860, 119138, 119900, 4689, - 119888, 0, 120158, 119209, 120159, 1646, 120156, 119891, 4040, 194734, - 65118, 119889, 2579, 119905, 3177, 8207, 9099, 4107, 0, 119894, 662, - 120706, 9244, 0, 63781, 10084, 0, 0, 118840, 194858, 41929, 3399, 9851, - 120442, 8739, 9059, 0, 7687, 64637, 8854, 40993, 52, 13241, 0, 0, 120444, - 1777, 9151, 1137, 0, 749, 120809, 120584, 5385, 3978, 917594, 0, 0, 5989, - 0, 10170, 65013, 0, 41685, 64702, 120438, 8425, 41684, 0, 519, 10369, - 64547, 1585, 195030, 10249, 422, 1500, 10305, 986, 0, 3666, 5781, 5599, - 3098, 2494, 120202, 4861, 0, 64334, 194712, 0, 0, 41221, 65102, 8961, - 252, 10243, 10245, 63936, 0, 120452, 194707, 63751, 9478, 2508, 9060, - 917630, 202, 10761, 120747, 1242, 12899, 120447, 194705, 63940, 64533, 0, - 9593, 10543, 2403, 12979, 64609, 0, 65260, 2504, 9784, 41024, 7764, - 64701, 9514, 120825, 5859, 119259, 2858, 8298, 0, 120700, 65478, 9691, - 4971, 12992, 2753, 1936, 0, 8456, 2751, 12662, 2763, 8953, 42104, 10731, - 7774, 4780, 9792, 63991, 0, 194871, 0, 120764, 2856, 10019, 47, 63989, - 2823, 4365, 120629, 0, 3647, 7899, 2602, 8417, 119903, 0, 41135, 120437, - 4033, 118854, 194848, 172, 194720, 212, 41137, 12350, 12320, 118808, - 64623, 0, 8257, 8915, 2759, 945, 3732, 120230, 0, 5344, 194851, 1291, 0, - 9062, 119252, 9531, 13155, 8505, 64479, 12062, 119018, 64703, 65487, 0, - 10900, 41531, 1263, 3720, 12048, 63935, 64292, 41524, 64692, 12652, 6099, - 41534, 0, 63933, 64426, 299, 0, 119892, 63951, 3524, 64785, 8831, 0, - 8674, 3075, 0, 8245, 0, 12624, 0, 1673, 4811, 63928, 5845, 9338, 6243, - 65414, 2581, 4001, 0, 9820, 64098, 12187, 5551, 0, 5984, 0, 195073, 4393, - 10566, 120407, 8680, 0, 194726, 2588, 5422, 0, 0, 3491, 2471, 0, 2883, - 2749, 63921, 0, 10913, 0, 194725, 119134, 675, 120551, 63924, 0, 41287, - 6219, 63926, 0, 41232, 9329, 63925, 41153, 219, 63945, 41330, 692, 65200, - 0, 9240, 3181, 9688, 0, 1222, 66369, 8262, 119155, 64530, 0, 64610, 3092, - 12092, 9615, 64808, 120691, 8013, 0, 0, 195019, 8895, 5253, 0, 5458, 0, - 922, 118805, 0, 65111, 0, 3218, 12618, 63997, 120469, 63831, 8962, 8569, - 9641, 11932, 12202, 3214, 120461, 9604, 12053, 3207, 120465, 63826, - 118941, 64392, 120141, 63825, 2844, 3205, 41974, 41286, 12139, 66588, - 64708, 0, 3358, 2606, 0, 3104, 2608, 0, 1173, 0, 5308, 195007, 290, 0, - 194937, 2862, 2792, 64498, 66371, 378, 2610, 66591, 65079, 0, 65372, 0, - 37, 0, 0, 1814, 120479, 3209, 118843, 0, 10638, 9768, 64648, 0, 66372, 0, - 2591, 2837, 4341, 41403, 64105, 0, 5233, 65270, 64792, 195090, 3570, - 9112, 0, 40991, 9490, 63761, 1685, 595, 64856, 194730, 1292, 6222, - 120142, 3654, 120552, 9637, 0, 2535, 41293, 0, 10656, 194983, 3243, 9014, - 5606, 63762, 538, 11006, 5602, 7807, 8073, 0, 10629, 8203, 0, 3056, 8458, - 41778, 8495, 8762, 10508, 917552, 779, 9818, 64367, 2465, 3463, 8193, 0, - 9730, 8695, 4738, 0, 5811, 12345, 64904, 0, 504, 0, 10899, 8982, 0, 0, 0, - 782, 4867, 10883, 1262, 64771, 732, 3737, 917614, 1548, 0, 120589, 1832, - 5604, 5611, 41141, 0, 4376, 64612, 11991, 3745, 41738, 119928, 1502, 0, - 0, 3869, 11937, 5702, 3655, 1783, 0, 5728, 195086, 13285, 120521, 11918, - 9603, 5724, 5254, 5727, 7724, 0, 119901, 5723, 5129, 194898, 0, 10597, - 9033, 5614, 5893, 6223, 12303, 42073, 0, 120702, 0, 119862, 4792, 0, - 1964, 0, 41950, 12146, 0, 120648, 66570, 195082, 894, 300, 194595, 10037, - 120675, 195085, 0, 9783, 2562, 2607, 64740, 64830, 0, 0, 0, 119861, - 64056, 13062, 64946, 5096, 5095, 2863, 3424, 0, 10454, 118801, 5094, - 10093, 4369, 13156, 12306, 5401, 5093, 119909, 194597, 65251, 5092, 526, - 0, 41295, 5091, 176, 41691, 8985, 4104, 119911, 6285, 1215, 11985, 5744, - 12272, 9832, 0, 3713, 13218, 0, 0, 8980, 118988, 12293, 8844, 13106, - 41505, 42082, 4278, 1737, 8987, 12917, 0, 9074, 917560, 9335, 12850, - 118991, 8113, 10339, 5255, 1786, 661, 0, 5475, 0, 41854, 120620, 0, - 12419, 1160, 1267, 119238, 41217, 0, 10018, 360, 194792, 3621, 64662, - 5863, 3137, 0, 12108, 12928, 41216, 1228, 2616, 119190, 64401, 65234, - 10745, 1714, 3135, 0, 0, 0, 3142, 0, 0, 10819, 917565, 0, 0, 64, 1470, - 194566, 10291, 6227, 2826, 41749, 0, 119864, 6163, 9708, 13250, 0, 42011, - 0, 8603, 12206, 5839, 1702, 1240, 41461, 6286, 194995, 5834, 0, 3858, 0, - 1765, 12086, 42001, 1600, 64309, 0, 0, 8401, 120786, 42014, 9282, 8882, - 118929, 10479, 2570, 2852, 5367, 4601, 194941, 0, 1234, 9678, 13115, - 66310, 12667, 0, 41973, 10147, 12935, 0, 0, 118829, 0, 8163, 41716, - 12727, 194816, 120533, 41289, 0, 13129, 2864, 8977, 602, 10435, 9395, - 41675, 120340, 2765, 64540, 41279, 120414, 119246, 0, 0, 0, 119220, - 10887, 65206, 118963, 64920, 66593, 63914, 12150, 263, 194563, 41288, 0, - 9633, 10886, 119042, 7831, 12067, 0, 0, 0, 8076, 118827, 8290, 8291, 0, - 0, 0, 2596, 10852, 63911, 13113, 0, 42019, 2393, 8766, 9087, 750, 0, - 41574, 10163, 120654, 63913, 10441, 5954, 64931, 4314, 194675, 198, 0, - 730, 41441, 7819, 194826, 0, 13165, 1720, 63905, 8619, 678, 8240, 118960, - 194852, 3751, 0, 0, 4262, 1798, 709, 0, 1354, 10778, 13152, 0, 3892, - 8137, 10449, 0, 0, 41470, 245, 41045, 41719, 41233, 64801, 0, 497, 12100, - 5953, 0, 7796, 41235, 0, 42045, 9804, 8449, 432, 1281, 64355, 65393, - 64339, 10677, 604, 41097, 9120, 1859, 0, 10460, 3425, 0, 0, 2836, 8797, - 8490, 9052, 64888, 0, 2356, 95, 64786, 1738, 0, 0, 2832, 64640, 9670, - 6096, 0, 64918, 65151, 10063, 2822, 12199, 4436, 0, 2566, 11971, 12090, - 64872, 1065, 1331, 0, 0, 2576, 0, 41142, 5090, 5089, 120263, 9505, - 119109, 514, 41692, 319, 2921, 0, 9477, 5772, 12968, 5087, 118822, - 917567, 96, 2580, 0, 10522, 41223, 5085, 1463, 41342, 0, 5293, 0, 0, - 3733, 3772, 13090, 12054, 64496, 41254, 64300, 12575, 13091, 0, 0, 9680, - 0, 0, 41413, 64419, 118953, 0, 0, 118923, 0, 0, 10939, 6106, 0, 41271, - 1132, 0, 4534, 41270, 0, 9224, 195099, 0, 64761, 0, 3671, 8510, 0, 0, - 41275, 0, 0, 10807, 7963, 42012, 0, 0, 65227, 6187, 13109, 3854, 41479, - 13141, 9715, 0, 8258, 0, 4185, 41334, 65148, 8871, 42, 0, 0, 4102, 0, - 9029, 118995, 0, 2353, 6308, 41604, 11958, 2611, 119186, 41021, 0, - 194631, 66336, 8045, 120428, 12946, 4484, 8747, 118976, 12826, 65233, - 5557, 41224, 9737, 13216, 3747, 9467, 5291, 8878, 1691, 41226, 0, 12107, - 10146, 10905, 9086, 64566, 697, 0, 628, 0, 12594, 0, 10468, 4546, 7731, - 65256, 12010, 0, 0, 3805, 0, 64293, 0, 9844, 0, 6307, 118950, 0, 0, - 12166, 64697, 10516, 194706, 10152, 12648, 10354, 0, 9532, 5785, 41309, - 9764, 41316, 120160, 0, 13230, 41299, 5559, 0, 8704, 2397, 5556, 0, - 66368, 13122, 9011, 191, 9630, 41837, 42040, 5506, 0, 0, 64850, 41072, - 12598, 8845, 41577, 194790, 10002, 8889, 119113, 42141, 41570, 41838, - 683, 396, 41580, 12526, 0, 12901, 12351, 65115, 343, 66597, 194680, - 41360, 0, 10481, 4559, 0, 1956, 118857, 0, 0, 1724, 1210, 120066, 9412, - 3739, 6263, 0, 0, 3964, 8984, 38, 8533, 9234, 10947, 65073, 13063, 0, - 1778, 3956, 65091, 42070, 42069, 119846, 8743, 8369, 118807, 10941, - 12467, 0, 5547, 66618, 0, 0, 8175, 0, 284, 8108, 934, 5696, 0, 173, 0, - 8652, 0, 120670, 1750, 0, 4394, 65056, 1807, 9354, 0, 0, 5889, 63783, 0, - 64714, 917624, 0, 12162, 12120, 41087, 1721, 7767, 7891, 120446, 10563, - 2583, 4512, 63973, 2462, 7693, 64294, 10434, 3855, 8107, 41337, 63972, - 4952, 65413, 0, 5504, 41340, 3975, 0, 0, 65420, 12672, 3798, 2703, 0, - 64347, 0, 9774, 41847, 1127, 455, 41095, 3962, 10100, 3483, 41101, 3954, - 41091, 4513, 9104, 3503, 65375, 41298, 1468, 65386, 1864, 41851, 0, - 41446, 2540, 7736, 41080, 41849, 917619, 4320, 3224, 12909, 9705, 64684, - 8604, 195006, 1510, 11978, 6149, 3887, 194882, 1411, 2824, 194708, 10106, - 8770, 1403, 0, 1347, 9631, 8671, 0, 4283, 0, 194785, 8640, 13124, 258, - 1654, 41408, 8858, 0, 42139, 3741, 0, 4042, 4581, 2873, 119029, 0, 0, - 8549, 10861, 0, 41673, 64829, 1733, 4392, 2568, 10786, 63983, 0, 376, - 41486, 9221, 64871, 119907, 8823, 41222, 12857, 6217, 7965, 4896, 0, - 10154, 0, 41350, 8301, 0, 0, 1684, 64501, 10974, 458, 41199, 0, 0, - 195046, 11916, 340, 194980, 12298, 10864, 0, 12288, 0, 4388, 1493, 10521, - 0, 4097, 0, 13080, 65203, 195051, 41642, 6030, 8059, 3210, 13131, 120190, - 917597, 0, 8794, 41278, 41629, 12154, 0, 10043, 64658, 1186, 41571, - 41297, 617, 9464, 0, 3675, 5207, 63955, 5213, 118896, 833, 41348, 41568, - 0, 3253, 63954, 41088, 8630, 6062, 0, 5596, 5545, 194982, 933, 1341, - 9842, 5217, 0, 8942, 64800, 0, 0, 41615, 2635, 0, 194768, 41632, 120152, - 0, 7835, 41622, 9002, 0, 194770, 64558, 0, 9716, 0, 9805, 5990, 900, - 5784, 194775, 9317, 0, 3612, 4011, 64376, 41953, 5389, 7864, 0, 65336, - 2839, 5600, 3903, 0, 10447, 3749, 1207, 9319, 0, 3501, 0, 119142, 4403, - 0, 1124, 5597, 195009, 0, 9321, 4429, 917606, 0, 194572, 1719, 64873, - 546, 9671, 1125, 4399, 9542, 472, 7716, 8452, 5488, 65223, 42025, 0, - 5491, 3602, 8328, 41182, 2604, 41949, 5490, 41183, 5489, 8522, 10287, - 684, 6300, 0, 2854, 0, 4390, 454, 7823, 194784, 195061, 0, 195062, 0, 0, - 64572, 8478, 194788, 2394, 2575, 3415, 3746, 0, 8648, 0, 65421, 65505, - 119092, 11989, 65142, 418, 118810, 917616, 10295, 8249, 10391, 41752, - 4565, 8641, 41449, 2598, 513, 0, 41475, 8656, 0, 1024, 65008, 7961, 0, - 8941, 917563, 4554, 0, 9023, 40973, 194977, 12126, 10964, 0, 63799, 9509, - 0, 1036, 65114, 0, 1723, 0, 9049, 41185, 41579, 2444, 41200, 10705, - 41447, 194795, 65224, 0, 740, 63963, 917613, 118874, 194986, 5300, 10407, - 9459, 0, 0, 195060, 7856, 8121, 10438, 12050, 41698, 2860, 12157, 5238, - 0, 5690, 5743, 10424, 12065, 0, 13095, 0, 0, 8875, 8694, 9506, 13254, - 5575, 12847, 2413, 118917, 0, 962, 12176, 1122, 317, 9040, 119116, 1582, - 0, 1920, 41477, 10173, 827, 10801, 0, 118798, 0, 5223, 496, 10439, 4313, - 5226, 12602, 7860, 120627, 906, 7758, 2842, 10215, 5224, 5487, 798, 5692, - 12801, 8406, 1153, 5695, 41711, 64627, 8054, 12626, 120131, 5691, 287, - 866, 233, 4642, 66574, 0, 0, 0, 65140, 42089, 8830, 9008, 0, 10524, - 41175, 42079, 65423, 119065, 5296, 0, 0, 10663, 0, 3302, 0, 0, 0, 0, 0, - 0, 0, 42093, 3920, 8690, 120036, 0, 12122, 4580, 41967, 6116, 1785, - 41965, 120635, 3021, 42004, 5138, 0, 0, 41998, 41867, 4540, 41179, - 194804, 6200, 63796, 5134, 42021, 322, 4643, 5132, 42010, 194988, 64589, - 5143, 64875, 8790, 0, 194796, 64604, 9365, 8869, 0, 64400, 42060, 0, - 64887, 194814, 64941, 10270, 10286, 10318, 10382, 0, 4110, 0, 41530, - 10929, 64277, 3234, 120607, 13058, 8617, 41982, 6025, 120736, 12805, - 8767, 0, 0, 9597, 41283, 5201, 0, 6215, 12714, 6214, 13101, 65282, - 120490, 65268, 120504, 120045, 194681, 187, 0, 10059, 10511, 4963, 9767, - 789, 1749, 8964, 0, 194577, 320, 41948, 41833, 195047, 3049, 41139, 9787, - 9449, 10081, 10528, 42121, 118894, 0, 7954, 5549, 0, 195071, 8485, 4671, - 1189, 905, 480, 10985, 10240, 10610, 5414, 8647, 1745, 4286, 5421, 5427, - 9554, 0, 0, 65465, 41507, 8806, 42047, 9442, 6213, 9443, 9436, 7867, - 64720, 6236, 42052, 0, 2406, 0, 12851, 4566, 348, 5474, 3801, 3103, - 10406, 5246, 5236, 64395, 0, 5200, 64305, 41739, 41733, 64518, 10931, - 13181, 41402, 395, 5391, 5198, 8786, 9428, 41259, 5196, 0, 2691, 42009, - 5205, 41244, 5562, 0, 118973, 41262, 66364, 64421, 0, 41251, 9126, 435, - 3979, 12014, 12893, 8093, 9079, 3203, 192, 120785, 3385, 41266, 64430, - 5383, 10294, 10326, 0, 5738, 9574, 2666, 0, 5361, 831, 419, 8256, 10716, - 7872, 64583, 194758, 1260, 3149, 5359, 7766, 0, 7914, 5357, 916, 769, - 2624, 5364, 64739, 120599, 5563, 547, 1943, 41188, 5560, 41212, 487, 0, - 4497, 3754, 0, 0, 9039, 10619, 41776, 0, 8716, 120126, 40983, 64072, - 41516, 0, 119044, 0, 41376, 0, 3232, 12185, 0, 120632, 0, 120458, 41889, - 0, 8634, 1161, 41895, 118804, 9701, 8622, 120215, 0, 0, 120588, 669, - 5679, 41362, 120125, 118961, 11921, 42087, 5678, 0, 0, 41364, 460, 0, - 41352, 41361, 195101, 41366, 0, 3356, 6178, 917, 0, 119915, 64068, 7782, - 9044, 4974, 677, 119916, 0, 119932, 41912, 1216, 12504, 11952, 3349, - 195097, 12296, 8927, 4739, 3738, 5802, 194997, 5683, 10368, 0, 491, 0, - 120503, 0, 0, 5682, 6206, 8670, 0, 5680, 917568, 10001, 41881, 118823, - 1449, 10241, 3768, 65255, 3776, 9095, 7741, 12684, 41885, 1046, 0, 5567, - 2717, 4620, 5171, 5564, 64571, 41908, 41786, 5565, 12819, 12578, 194992, - 194771, 5169, 5566, 3465, 64694, 3175, 11904, 120065, 120804, 5176, 5942, - 8468, 4871, 10361, 10425, 119210, 118952, 64729, 1128, 194722, 10548, - 64664, 10647, 9408, 9409, 9410, 457, 3662, 9413, 1934, 9415, 9416, 8802, - 9418, 8909, 9420, 9421, 5897, 9423, 5165, 5126, 41385, 8043, 8950, - 194562, 8955, 3374, 9400, 9401, 9402, 8939, 9404, 3507, 9406, 9407, 0, - 65515, 9499, 10035, 183, 65078, 2631, 0, 10636, 41130, 0, 3996, 120650, - 64675, 1667, 41584, 65486, 41582, 0, 4332, 64825, 10741, 10726, 12912, - 41125, 5899, 8101, 3610, 12085, 41748, 0, 955, 120092, 5340, 5350, 41058, - 5446, 64549, 10875, 64796, 5442, 120424, 0, 9782, 5451, 12896, 3616, 0, - 0, 3874, 7708, 64370, 10859, 0, 10345, 10409, 0, 11909, 120591, 120303, - 41038, 0, 194733, 4447, 8536, 120708, 917586, 0, 194732, 724, 42048, - 1455, 205, 0, 10351, 64618, 0, 4175, 12307, 0, 120380, 939, 41355, 5505, - 119154, 5503, 8021, 0, 119150, 9819, 41357, 8011, 6088, 5507, 12044, 190, - 0, 10026, 4356, 8188, 1191, 0, 4417, 10329, 5476, 8991, 0, 7827, 0, 5829, - 8550, 0, 5592, 2919, 64925, 2675, 5595, 0, 7918, 4367, 0, 0, 5478, 1728, - 5594, 120710, 178, 12972, 5590, 10727, 13067, 118909, 65254, 0, 9731, 0, - 64633, 0, 12113, 13065, 118863, 9252, 12278, 4652, 0, 66563, 194879, 0, - 0, 12887, 10551, 10710, 0, 0, 0, 120570, 41804, 5199, 9497, 1120, 120471, - 8333, 1444, 9486, 120808, 13142, 4538, 194830, 5285, 6177, 5894, 0, - 11910, 13224, 0, 8963, 4034, 13162, 65389, 3334, 64003, 41747, 10708, - 194571, 8677, 120734, 1651, 9350, 8861, 0, 8836, 1142, 0, 4396, 10928, 0, - 8922, 8856, 66611, 4002, 0, 10442, 10676, 3344, 120402, 64963, 10813, - 2592, 12853, 120242, 120243, 3438, 119912, 7871, 120239, 65516, 12321, - 120391, 118890, 120389, 10007, 120246, 9588, 120248, 4700, 66366, 41994, - 120051, 8661, 120365, 66572, 0, 120401, 4973, 5573, 12588, 9629, 40981, - 119873, 118981, 7993, 64328, 42002, 64754, 41766, 8825, 13016, 0, 0, - 10346, 6107, 0, 9243, 2464, 0, 6108, 3372, 335, 6247, 64689, 438, 4510, - 5765, 8721, 119878, 4036, 6092, 12840, 120229, 8876, 10303, 8096, 10284, - 3354, 10268, 0, 9289, 8689, 10316, 3876, 10335, 0, 42044, 0, 0, 0, 8050, - 120030, 0, 64591, 0, 120053, 0, 843, 120495, 194829, 120770, 0, 10117, - 66560, 41902, 118871, 6312, 215, 1963, 118889, 64494, 1953, 9579, 41938, - 1256, 3910, 13015, 6242, 41329, 9662, 41257, 41900, 3366, 10700, 8805, - 1742, 5542, 9333, 8202, 120459, 120232, 41611, 0, 0, 120385, 499, 118846, - 8593, 0, 0, 41169, 1712, 5932, 8097, 41762, 12292, 194685, 11967, 11963, - 65296, 41243, 118957, 5662, 416, 9458, 64687, 0, 0, 194844, 10984, 64386, - 64672, 0, 0, 0, 41172, 0, 66355, 120669, 41937, 194825, 12540, 65446, - 3804, 41760, 5794, 201, 2662, 9419, 64579, 8254, 41726, 10975, 0, 120625, - 65131, 9507, 4108, 3880, 8023, 1200, 12243, 0, 5282, 0, 0, 65032, 5891, - 65031, 3343, 1636, 195057, 65029, 65024, 3896, 195056, 9674, 2947, 99, - 98, 97, 120571, 64414, 13059, 8221, 64085, 3381, 0, 7892, 0, 10777, 0, - 65310, 3913, 0, 0, 64959, 8039, 1265, 4316, 6309, 118815, 12969, 12596, - 66595, 66596, 41939, 5593, 195059, 5998, 9163, 12300, 6061, 64854, 119, - 118, 117, 116, 8930, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, - 112, 103, 102, 101, 100, 107, 106, 105, 104, 41793, 917572, 534, 120515, - 0, 42027, 12114, 0, 917579, 0, 194698, 6020, 12716, 10561, 10075, 475, - 118888, 13266, 9144, 120383, 917580, 195088, 194741, 10645, 1212, 5079, - 0, 8134, 8483, 2913, 10330, 4908, 1866, 1639, 119189, 0, 8923, 1645, - 12059, 64505, 0, 194873, 0, 4817, 5935, 1250, 0, 8174, 9600, 9856, 9859, - 7916, 9861, 5343, 5258, 4328, 41206, 64794, 10882, 405, 0, 4659, 195045, - 657, 12610, 4970, 4461, 1134, 41170, 1454, 41242, 65130, 4468, 5987, - 195079, 9762, 4456, 5206, 10720, 0, 10480, 41718, 5818, 0, 8264, 10229, - 260, 645, 195054, 10687, 118837, 4821, 4466, 120500, 5824, 984, 0, 10688, - 5851, 5705, 7729, 41406, 10591, 41797, 119983, 65438, 119985, 119984, - 119979, 41404, 1165, 7879, 4451, 13087, 0, 195067, 119987, 119986, 41909, - 118902, 2791, 9363, 9552, 3375, 0, 5900, 12997, 7889, 2722, 0, 13173, - 2381, 12883, 10994, 10529, 12437, 194756, 8644, 63791, 12425, 10661, - 10856, 9614, 0, 41478, 0, 10064, 10901, 10748, 120542, 11005, 4868, - 119162, 1952, 0, 8455, 10082, 0, 8467, 12577, 194760, 5182, 12183, 6145, - 119188, 64929, 4465, 42120, 12135, 5732, 4464, 7728, 3922, 977, 4458, 0, - 195068, 64770, 120772, 3353, 344, 0, 41626, 1395, 64635, 120089, 5776, - 8558, 786, 65153, 0, 64340, 120082, 10202, 120084, 41027, 120086, 10132, - 64413, 120087, 120074, 119119, 120059, 0, 120078, 63862, 41896, 8657, 0, - 8594, 10204, 0, 120477, 120069, 120072, 1399, 119203, 120056, 0, 8852, - 64492, 241, 194759, 4907, 0, 9738, 0, 9727, 7851, 119196, 10951, 4439, 0, - 119199, 195021, 9085, 0, 119200, 9327, 6160, 0, 8650, 64865, 8088, 64933, - 41910, 118872, 65217, 3965, 120050, 0, 0, 13300, 0, 0, 65491, 65145, - 9041, 0, 65017, 10826, 4420, 41263, 10583, 7760, 194798, 0, 0, 120047, - 13217, 8748, 65415, 0, 42159, 9066, 194860, 11993, 0, 2626, 7762, 10902, - 0, 0, 41526, 64285, 10472, 2995, 120704, 12907, 41184, 2371, 0, 10038, - 259, 1009, 0, 2402, 2333, 65011, 0, 12962, 65125, 0, 12417, 65380, 9103, - 12700, 3148, 0, 119145, 7779, 10219, 0, 9479, 6029, 120369, 119910, 9689, - 41261, 0, 8993, 8613, 0, 118989, 3368, 606, 41492, 7697, 10228, 41596, - 4311, 194769, 6027, 120572, 4322, 41661, 7991, 0, 10578, 0, 41465, 41054, - 2735, 41664, 0, 63778, 65273, 1287, 65408, 9348, 120656, 6164, 0, 41273, - 0, 65027, 0, 9576, 0, 3347, 4160, 5154, 0, 3794, 66564, 65219, 11925, - 7709, 9088, 3743, 65099, 1396, 4572, 0, 3847, 0, 65081, 4985, 1615, 672, - 809, 12980, 63806, 0, 65218, 5799, 0, 65072, 1577, 194934, 0, 5928, 4525, - 10658, 120561, 1266, 0, 0, 195024, 12622, 9347, 0, 0, 64424, 41048, 7789, - 773, 63910, 41112, 283, 64416, 66374, 532, 0, 120049, 41115, 3051, 5862, - 3370, 0, 119132, 5443, 3250, 8153, 0, 120278, 9510, 120279, 120493, 9541, - 0, 41066, 64706, 0, 0, 3505, 8707, 9466, 64286, 8537, 120802, 3626, 3471, - 0, 915, 195094, 12990, 120034, 0, 118797, 195074, 0, 41906, 0, 195072, 0, - 64365, 0, 3225, 0, 4433, 5186, 0, 41933, 1443, 4381, 9829, 65124, 10926, - 0, 195076, 64879, 64699, 0, 65476, 0, 0, 10021, 5160, 1387, 65495, 6103, - 120388, 41480, 0, 0, 217, 0, 0, 12466, 10443, 10789, 41158, 41460, 0, 0, - 41483, 195096, 12565, 64287, 10077, 12890, 5931, 195014, 9283, 7700, - 41252, 6042, 65499, 0, 41249, 512, 2990, 0, 0, 65456, 0, 632, 12940, 0, - 41296, 9545, 41291, 5957, 0, 8926, 3511, 41282, 5923, 10400, 10174, - 41456, 64581, 5386, 4274, 5786, 10633, 0, 5056, 119860, 417, 41474, - 120773, 13263, 9812, 5934, 4460, 66583, 119231, 64877, 65410, 64481, 0, - 0, 10937, 0, 120218, 0, 0, 0, 2953, 5819, 1801, 12835, 917627, 0, 194743, - 0, 66375, 8867, 702, 120410, 1237, 10274, 4552, 65447, 119966, 0, 1375, - 12106, 194693, 10264, 1755, 10482, 9228, 10376, 1163, 2951, 7840, 64336, - 64890, 10252, 0, 3384, 120703, 10167, 830, 194656, 65425, 10769, 8451, - 41368, 12520, 9753, 120762, 8944, 0, 0, 10473, 2908, 0, 0, 64902, 10299, - 119165, 12097, 64733, 12952, 4441, 10503, 0, 41430, 9330, 0, 10267, 411, - 10315, 10379, 0, 0, 13281, 10009, 7865, 2730, 10388, 9677, 5428, 118993, - 3364, 64806, 66363, 119179, 118816, 65463, 9535, 216, 10332, 1401, - 119895, 622, 0, 885, 64772, 1602, 4467, 41405, 5768, 0, 12160, 41328, - 484, 65187, 41051, 12071, 9609, 9806, 41497, 3338, 0, 120671, 10411, - 2736, 10255, 10263, 10279, 2794, 8807, 64491, 119896, 4315, 5222, 5381, - 0, 0, 5193, 5125, 5456, 5509, 41177, 0, 9534, 0, 64431, 1603, 3430, 0, - 10298, 0, 0, 981, 41176, 4330, 994, 120536, 1824, 10908, 0, 41681, 41683, - 5921, 194925, 2597, 3957, 5922, 118903, 0, 674, 194971, 0, 2946, 5354, - 5251, 4406, 5307, 3759, 65160, 8364, 5123, 1433, 5281, 5469, 5121, 5924, - 5920, 0, 5130, 64606, 0, 0, 8418, 41420, 1221, 2733, 0, 742, 5216, 2893, - 10772, 65276, 5937, 3468, 2553, 9230, 5939, 3997, 0, 8363, 120677, 2993, - 7772, 3916, 10289, 194932, 1141, 120301, 8159, 718, 10137, 973, 9666, - 120718, 3235, 2415, 5938, 0, 8018, 12448, 0, 10401, 10337, 0, 0, 65390, - 0, 8719, 1202, 0, 64651, 12983, 0, 12165, 119095, 0, 9067, 13116, 8077, - 65388, 0, 8419, 63773, 65419, 63774, 0, 0, 10725, 10433, 0, 0, 1431, - 64519, 66565, 10821, 4359, 12804, 12192, 8229, 1235, 3307, 41928, 0, - 3146, 4544, 9009, 8551, 118820, 1740, 194749, 65469, 985, 2724, 13076, - 120806, 12068, 119949, 515, 10141, 119944, 119945, 63763, 4476, 119146, - 119941, 12655, 8907, 13226, 4589, 4521, 119077, 9141, 64645, 10665, 2741, - 41572, 6197, 1370, 10101, 41573, 194746, 3931, 194924, 0, 6184, 8606, - 3303, 11968, 65475, 9473, 13103, 63771, 8879, 41390, 120600, 4478, - 917588, 41735, 120349, 717, 10754, 4477, 0, 814, 42066, 119962, 63767, - 1780, 41031, 119958, 41392, 819, 10611, 9694, 11955, 119952, 119953, - 41111, 9462, 0, 7788, 12820, 66327, 66580, 0, 118966, 0, 1581, 12650, - 41173, 3346, 430, 64698, 0, 66628, 268, 0, 4945, 0, 4950, 12918, 9456, - 10923, 5936, 0, 5964, 12908, 13081, 308, 0, 12933, 0, 41746, 4949, 0, - 443, 41030, 4944, 5467, 194938, 5926, 1862, 6044, 65392, 8820, 4946, - 194793, 9038, 7887, 0, 7830, 41306, 13093, 2698, 41144, 0, 12072, 41753, - 41914, 41304, 824, 0, 8595, 65225, 119813, 119816, 4673, 41354, 4678, - 13283, 12697, 65059, 12381, 3488, 5933, 5481, 3490, 1199, 65014, 8356, - 12297, 119153, 1955, 12688, 3102, 10474, 4672, 119822, 119821, 5531, - 119823, 119826, 66332, 8835, 4674, 119041, 5831, 0, 64896, 12379, 8025, - 119947, 64542, 1855, 65128, 5472, 64425, 7852, 194993, 119943, 0, 0, - 2745, 5470, 65171, 9124, 119110, 4654, 65289, 291, 0, 120285, 10525, - 4649, 65209, 120284, 12647, 4648, 4640, 64713, 10224, 120429, 6246, - 64950, 7828, 4650, 41464, 0, 119086, 4653, 7822, 120331, 118824, 120330, - 8669, 194921, 10729, 65093, 5778, 6302, 2716, 194606, 12680, 119130, - 1417, 10916, 0, 9452, 8547, 2711, 42165, 120798, 64953, 7992, 64663, - 41907, 4662, 65453, 120408, 9149, 9146, 599, 4641, 11990, 64819, 63782, - 4656, 10130, 41469, 7811, 40994, 12426, 4646, 5967, 865, 3725, 5713, - 5814, 4645, 42033, 120422, 41756, 13132, 64728, 9026, 10833, 64673, 1659, - 919, 41935, 1671, 195089, 3054, 9219, 9744, 1661, 13120, 4622, 119087, - 10140, 9713, 0, 119143, 194961, 9045, 2306, 10485, 118943, 6068, 10612, - 65307, 4617, 120294, 194964, 41462, 4616, 10518, 10423, 10359, 0, 5958, - 0, 9564, 4618, 826, 195083, 4321, 4621, 195084, 41313, 522, 5368, 1808, - 7848, 0, 5366, 12201, 5372, 0, 66632, 0, 4391, 64331, 2696, 120155, - 11003, 4638, 64490, 1790, 66304, 167, 10921, 9791, 0, 9840, 5376, 1835, - 5335, 10313, 41370, 4633, 64320, 10265, 1180, 4632, 118970, 5387, 5333, - 64256, 12903, 41, 5331, 1792, 11928, 64363, 5338, 4637, 0, 5971, 12066, - 120393, 385, 4152, 2585, 0, 10909, 3126, 1427, 194812, 10957, 5970, 3431, - 120394, 10358, 10422, 4758, 0, 1608, 2738, 12707, 10455, 4753, 0, 0, 0, - 6240, 5231, 119013, 12541, 65216, 6248, 0, 2593, 8463, 7810, 119923, - 5229, 4757, 65192, 66581, 2728, 4411, 64563, 65235, 5234, 119924, 194914, - 0, 10066, 9746, 0, 2622, 6033, 13061, 8016, 41196, 8954, 64831, 65189, - 2632, 13228, 10108, 1011, 5574, 1853, 2709, 65139, 5577, 42091, 41165, - 393, 12450, 8965, 41166, 42177, 5316, 0, 171, 5941, 5572, 120062, 5312, - 12531, 5525, 5330, 5319, 64066, 195100, 64647, 8937, 63798, 12454, 12291, - 42132, 12063, 0, 64343, 3230, 0, 10350, 10644, 5209, 297, 5721, 12109, - 8415, 8632, 10102, 119925, 0, 2497, 5720, 960, 1692, 118792, 4610, 8696, - 4292, 64760, 4609, 10512, 4614, 541, 0, 5287, 5309, 2503, 119243, 1762, - 4647, 56, 10743, 5844, 41381, 601, 4613, 10194, 4663, 64469, 4608, 2507, - 13273, 5190, 119963, 63759, 195010, 66357, 8892, 0, 119942, 119931, 2734, - 5782, 420, 64368, 63795, 65105, 10797, 5960, 63797, 8992, 65293, 41238, - 1782, 12814, 63852, 12525, 10686, 41383, 5501, 0, 3650, 119955, 120749, - 359, 4183, 119957, 6239, 41670, 41256, 329, 66582, 12573, 120462, 0, - 9346, 66331, 13244, 119048, 42167, 3767, 5737, 5380, 4865, 0, 1155, - 917538, 5736, 4368, 64724, 63749, 0, 5601, 5739, 41023, 4866, 9985, 7987, - 64406, 1172, 120563, 0, 6253, 0, 8574, 5603, 41666, 4473, 119847, 4870, - 0, 65347, 41799, 65345, 8199, 0, 5347, 119063, 9280, 4864, 10398, 4144, - 0, 120567, 6245, 120478, 2732, 5598, 745, 4555, 5341, 0, 4777, 0, 5351, - 0, 0, 65244, 120729, 195080, 3097, 63817, 5966, 120363, 4778, 0, 10863, - 1660, 4781, 0, 271, 0, 65370, 8577, 65368, 12653, 65366, 10216, 4782, - 10000, 65362, 65361, 11912, 12325, 65358, 8717, 41583, 65355, 4776, - 65353, 65352, 8700, 65350, 65349, 10575, 10426, 0, 120150, 10362, 0, - 1715, 4849, 8242, 9561, 0, 0, 0, 0, 0, 5963, 0, 0, 4916, 4850, 380, 1607, - 466, 4853, 0, 4854, 0, 5164, 41096, 1350, 5124, 64420, 0, 5362, 8471, - 2708, 119131, 7946, 3785, 234, 0, 120481, 41268, 4848, 2530, 41636, 4798, - 1225, 41842, 0, 10458, 0, 8576, 5197, 0, 2704, 4794, 8329, 63823, 8322, - 4797, 66326, 5725, 2694, 2595, 3363, 2439, 65104, 5607, 41089, 303, - 41162, 195037, 2665, 2437, 0, 9817, 4844, 8764, 0, 8934, 0, 0, 4492, 0, - 9843, 2441, 10739, 65090, 1188, 120290, 1100, 2451, 2714, 41081, 2912, 0, - 4937, 119104, 0, 3572, 10023, 12343, 13079, 9248, 0, 9729, 0, 65190, - 119094, 2726, 3107, 0, 4941, 7996, 10995, 9140, 1408, 5261, 0, 41451, - 181, 0, 4942, 63801, 4938, 0, 972, 5259, 9369, 64868, 4142, 5257, 0, 0, - 4964, 5264, 9538, 0, 0, 41225, 0, 63800, 0, 119058, 9482, 4873, 3265, - 1822, 0, 12601, 41078, 3865, 261, 5927, 7791, 0, 0, 0, 10696, 9830, 6073, - 389, 10893, 6255, 6075, 4872, 282, 0, 3125, 9567, 195012, 4878, 5459, - 4874, 0, 9557, 3474, 64774, 120356, 194704, 6081, 9563, 9411, 13139, 0, - 11940, 41744, 0, 10788, 119176, 8751, 10385, 120273, 7816, 9414, 4665, - 12628, 4670, 119871, 41555, 0, 9642, 10912, 958, 119853, 3082, 0, 4666, - 0, 4915, 0, 2891, 5856, 12096, 5163, 4664, 10836, 1817, 120010, 12231, - 41554, 10564, 7763, 13077, 42099, 4400, 9697, 3606, 10275, 8925, 10371, - 10307, 1063, 10227, 120251, 9772, 4541, 6299, 1389, 0, 120257, 9823, - 42081, 12941, 65197, 10520, 120255, 120256, 12301, 120266, 10505, 120268, - 66604, 120262, 66601, 41814, 13282, 66600, 523, 505, 1447, 846, 0, 41813, - 0, 8608, 120537, 65482, 2543, 12163, 3108, 9745, 4529, 120472, 64764, - 118825, 7919, 0, 1641, 119874, 64949, 8966, 10251, 10247, 5908, 715, - 64353, 0, 9453, 1699, 10943, 10763, 0, 118992, 550, 10169, 0, 64385, - 66579, 3766, 120457, 5780, 9504, 9051, 257, 10373, 13153, 12061, 10261, - 10253, 7821, 2599, 9433, 11984, 9156, 5930, 120377, 0, 0, 3128, 4789, - 5067, 5066, 3760, 1718, 9438, 8827, 1146, 5065, 41435, 4352, 0, 2435, - 41839, 5064, 5326, 120453, 3778, 1809, 8873, 7824, 41434, 5062, 1264, - 64817, 41586, 41440, 3764, 8473, 64716, 8469, 3933, 12947, 4564, 12337, - 0, 10375, 0, 120362, 64768, 0, 0, 5225, 0, 42130, 7903, 5151, 0, 0, - 64685, 5626, 2569, 0, 3800, 65424, 0, 0, 5353, 5625, 10894, 954, 64927, - 1010, 41043, 0, 41438, 41439, 120357, 10711, 4593, 120752, 119003, 2590, - 5629, 13309, 10293, 10325, 5632, 10471, 120038, 64759, 42054, 5166, 5628, - 120031, 970, 120029, 4772, 2400, 5627, 118972, 120018, 12885, 3119, - 120021, 10961, 65103, 203, 9986, 0, 64344, 636, 120550, 120652, 64378, - 42111, 64356, 0, 554, 120761, 8320, 64275, 8863, 120520, 42042, 41883, - 63803, 0, 120792, 5694, 7689, 42142, 9323, 4325, 3047, 3937, 175, 195077, - 3169, 64335, 64781, 912, 1243, 4536, 5431, 120005, 0, 6244, 120154, 0, - 3935, 120665, 1129, 0, 11950, 5392, 118859, 7846, 118806, 5397, 0, 12046, - 12599, 3845, 4490, 5395, 0, 5393, 354, 120544, 11977, 0, 8366, 0, 7756, - 3901, 65484, 51, 626, 41602, 5895, 9568, 64057, 456, 0, 8145, 1168, 9251, - 9082, 119964, 64055, 0, 3866, 8818, 41512, 0, 0, 10324, 3918, 5377, 3797, - 1644, 10405, 9658, 4140, 13057, 42029, 42037, 9030, 813, 119973, 41454, - 4146, 195036, 5360, 2466, 236, 195032, 0, 6249, 42117, 5898, 0, 41457, - 119148, 5855, 1969, 4911, 988, 0, 12838, 64483, 0, 10341, 10552, 65479, - 5854, 0, 0, 118933, 119989, 119940, 10416, 11981, 3872, 0, 0, 120725, - 6093, 0, 2838, 119939, 0, 170, 0, 13143, 4169, 118931, 41859, 6058, - 120813, 10553, 1662, 65295, 0, 64342, 5892, 195081, 0, 42106, 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, 4736, 10357, 120400, 8170, 1704, 8556, 120661, 9659, - 120403, 1743, 120512, 9556, 9496, 4503, 41977, 9647, 7876, 0, 120575, - 3928, 11948, 65283, 10706, 66562, 66308, 4842, 7771, 0, 9109, 4841, 1289, - 4171, 12008, 6251, 3923, 1490, 2447, 120347, 0, 10907, 5245, 0, 10114, - 64000, 9790, 4845, 8332, 10582, 0, 4840, 5675, 254, 1747, 65429, 4825, - 10626, 8918, 10281, 5716, 64004, 66594, 0, 119019, 0, 8080, 118895, 367, - 1472, 120386, 0, 4829, 64693, 5905, 12339, 8919, 9515, 120384, 194651, - 65266, 0, 4830, 9134, 41365, 64671, 41978, 1412, 4594, 1391, 10536, 7720, - 4824, 7775, 0, 120392, 0, 1960, 3140, 0, 7960, 41836, 41844, 6052, 6064, - 54, 1428, 12214, 0, 6211, 7699, 358, 0, 10557, 65161, 10758, 8223, - 120341, 4261, 12642, 0, 120343, 0, 0, 119053, 120382, 119055, 119054, - 194902, 64554, 10574, 3878, 4017, 12827, 1752, 0, 0, 41118, 3924, 10199, - 0, 64966, 0, 0, 0, 41116, 720, 324, 0, 120684, 12057, 11917, 1464, 41343, - 4721, 7974, 65407, 8957, 0, 64488, 120371, 0, 64041, 195058, 120091, 0, - 4722, 917617, 0, 0, 4725, 9690, 4726, 0, 194956, 119843, 118969, 5204, 0, - 0, 118851, 4015, 3995, 8052, 476, 3714, 10073, 3595, 10232, 10999, 1382, - 120558, 12636, 0, 120404, 1656, 41831, 8130, 8672, 8832, 8720, 3908, - 1452, 13111, 64523, 64067, 0, 8552, 12398, 41845, 3849, 0, 0, 9778, 468, - 612, 42150, 55, 118959, 0, 0, 1674, 120277, 5823, 120276, 1114, 42110, - 540, 120052, 119017, 12516, 41743, 3938, 120057, 65417, 64316, 120060, - 12400, 820, 41741, 6292, 65303, 7955, 64074, 4713, 3359, 7800, 41566, - 65177, 6226, 353, 719, 9656, 9474, 64742, 120043, 4532, 65412, 120046, - 10868, 4717, 2349, 5902, 0, 4712, 9481, 119012, 65400, 3623, 8155, 1195, - 3942, 4714, 9625, 41151, 0, 41589, 12006, 0, 12074, 12409, 0, 4360, - 12964, 9739, 1229, 63793, 0, 0, 0, 8539, 65100, 120508, 4809, 9623, 4788, - 0, 0, 64745, 0, 65405, 120104, 13075, 194866, 5365, 4545, 8901, 8000, - 2492, 4813, 65432, 0, 5925, 4808, 64330, 9649, 41154, 65030, 5128, 4038, - 12718, 4810, 64859, 12794, 64928, 1648, 5435, 3522, 120689, 414, 10236, - 0, 12709, 41359, 120494, 0, 11905, 41082, 119859, 12581, 10374, 5175, - 119857, 0, 10254, 63820, 9751, 10262, 64088, 41363, 3919, 607, 0, 120288, - 9018, 5270, 10314, 10282, 65477, 10378, 64310, 40976, 8265, 7737, 0, - 40975, 5840, 0, 10162, 40978, 0, 8454, 42072, 42038, 387, 119098, 119083, - 0, 2550, 0, 119836, 118971, 41344, 3525, 120297, 0, 64641, 41590, 5619, - 41346, 13157, 375, 12703, 0, 5616, 64943, 64324, 0, 119202, 9454, 5615, - 0, 2315, 0, 1938, 5455, 64752, 808, 5568, 119201, 119198, 1026, 5620, - 194887, 195078, 13150, 5617, 0, 9225, 64639, 12902, 9145, 64595, 1338, - 120352, 119178, 9863, 0, 3084, 64553, 0, 41025, 6037, 0, 3974, 7998, - 10290, 10888, 3083, 10322, 2316, 118821, 64297, 41036, 0, 917615, 0, 0, - 0, 12904, 5373, 194773, 64700, 3762, 1445, 40961, 0, 11986, 0, 40960, 0, - 3780, 12808, 5779, 64952, 10402, 12011, 3906, 9707, 10603, 8326, 0, - 65498, 3763, 194923, 5618, 0, 3779, 194922, 9324, 118852, 63822, 9073, 0, - 64302, 10704, 280, 4787, 0, 917556, 13072, 9999, 0, 0, 9570, 0, 8699, - 2689, 917626, 65426, 0, 42135, 119061, 2551, 40966, 10011, 10200, 3998, - 120448, 120788, 503, 0, 4470, 2690, 118853, 7780, 5369, 41954, 5249, - 1652, 772, 8756, 8310, 65428, 3487, 120585, 3585, 1688, 917610, 119159, - 41822, 194874, 65359, 41904, 9720, 41697, 41319, 13125, 10650, 5836, - 12358, 4668, 4355, 9048, 1465, 10850, 3943, 65025, 41205, 41315, 41488, - 0, 917601, 5352, 12362, 12435, 8839, 41053, 3266, 7785, 12356, 8616, - 12104, 0, 0, 194621, 0, 3638, 5420, 3897, 3216, 0, 2358, 4018, 8633, - 2850, 0, 9639, 0, 0, 0, 64630, 65427, 3542, 120023, 12076, 5303, 8078, - 12676, 64418, 6276, 1706, 0, 41819, 41422, 12943, 65150, 10792, 41484, - 194607, 10847, 41050, 8872, 41824, 13099, 0, 0, 120378, 8504, 10830, 0, - 615, 10668, 10139, 0, 10504, 9779, 3625, 64650, 41409, 0, 41425, 65087, - 41688, 8789, 41427, 4022, 0, 0, 0, 120355, 41424, 917598, 0, 41820, 0, - 65292, 4812, 1261, 0, 3911, 12102, 120727, 1033, 0, 64642, 0, 3904, - 119205, 10514, 3275, 0, 0, 13123, 10846, 0, 118936, 195029, 12138, 10989, - 0, 6233, 10598, 449, 2669, 903, 118997, 2920, 9636, 65240, 10738, 0, - 9367, 593, 41085, 3917, 64622, 41713, 64307, 0, 41448, 3596, 0, 0, 9763, - 64082, 8819, 12347, 124, 12981, 41113, 232, 12234, 120646, 0, 0, 10820, - 194978, 0, 9094, 1769, 41715, 2463, 0, 1064, 13307, 41976, 10115, 64482, - 0, 0, 7862, 7795, 1474, 8516, 4828, 1258, 118994, 0, 0, 0, 9498, 0, 2911, - 120289, 41178, 3939, 64823, 8846, 8943, 12617, 41174, 2650, 4491, 1961, - 41463, 64291, 41167, 1959, 775, 120311, 41732, 41016, 6074, 9618, 194903, - 1511, 3613, 0, 4259, 41436, 3656, 0, 65436, 41019, 12428, 0, 0, 194896, - 8514, 8513, 9054, 1613, 41828, 0, 65531, 0, 118879, 0, 0, 5741, 10145, - 8865, 64551, 120379, 5788, 7917, 0, 66622, 7733, 64359, 9558, 120375, 0, - 120376, 0, 4268, 41247, 120524, 120370, 3871, 194892, 10881, 9111, 10621, - 41696, 65462, 120366, 119111, 120745, 9765, 120368, 0, 0, 42118, 10321, - 65281, 41587, 10949, 0, 42107, 0, 0, 5416, 10802, 195050, 66318, 65298, - 0, 5685, 0, 12633, 7928, 120354, 8094, 41595, 120510, 0, 794, 194907, - 12656, 10355, 64665, 5274, 1665, 41598, 3993, 194909, 64512, 40971, 536, - 189, 12611, 119234, 0, 2859, 4838, 63838, 4834, 2338, 0, 194839, 4837, - 41944, 770, 41452, 811, 1687, 41042, 66620, 120730, 64427, 64326, 40969, - 10526, 3895, 5406, 40968, 1339, 0, 120473, 10193, 3116, 7747, 0, 8020, - 10843, 41012, 12825, 0, 8266, 41006, 12371, 2871, 64614, 41245, 999, - 119129, 64567, 41876, 2663, 64586, 0, 120651, 120687, 10150, 65367, - 64308, 1522, 597, 4775, 10917, 12571, 10448, 12583, 12560, 12558, 12556, - 12584, 1741, 65097, 1227, 9676, 12566, 12569, 12554, 0, 10812, 1586, - 4978, 0, 3078, 1402, 118924, 9391, 40984, 9379, 9372, 394, 3088, 6284, 0, - 41663, 3991, 64391, 0, 9237, 424, 41648, 41208, 0, 9384, 41076, 1830, 0, - 0, 41656, 8246, 120307, 0, 0, 41840, 0, 2377, 41676, 0, 12572, 12552, - 12557, 12559, 5479, 2796, 1003, 2373, 9446, 9447, 9448, 48, 0, 9480, 481, - 2359, 9125, 9439, 9440, 9441, 548, 9153, 9444, 9445, 9430, 9431, 9432, - 397, 9434, 9435, 3984, 9437, 0, 1614, 9424, 9425, 9426, 9427, 1358, 9429, - 428, 9620, 9655, 0, 10982, 9096, 1333, 65170, 407, 12299, 0, 0, 5955, - 194985, 1108, 5804, 11976, 41231, 41466, 64782, 3926, 9057, 64613, 8798, - 0, 0, 1392, 8250, 10952, 5986, 5985, 8065, 41326, 10353, 10417, 0, 0, - 4407, 64524, 4019, 0, 118919, 8448, 8219, 118914, 1812, 12675, 12659, 0, - 194823, 119167, 42172, 42068, 6054, 10697, 2386, 0, 41759, 10642, 3909, - 64585, 10296, 41763, 119171, 42051, 64862, 4164, 1049, 0, 120569, 11943, - 41806, 8709, 10606, 3921, 120637, 64691, 41985, 8994, 1038, 120373, 8470, - 0, 0, 4008, 0, 8773, 10733, 36, 0, 5153, 41805, 13097, 0, 64937, 8736, - 1414, 64495, 9683, 0, 0, 0, 2536, 119951, 66330, 0, 8621, 65157, 12852, - 3031, 120441, 41345, 66317, 182, 66315, 66316, 0, 10210, 120492, 9058, - 366, 0, 120102, 961, 63755, 10848, 4570, 65301, 3106, 0, 41284, 1696, - 41189, 4003, 12105, 0, 5766, 12802, 3264, 8824, 13268, 0, 10936, 63980, - 0, 0, 194604, 120523, 0, 2322, 917561, 65506, 8300, 120374, 917536, - 41285, 3547, 120144, 8112, 0, 41459, 41369, 6089, 13000, 0, 12117, 4170, - 1029, 10540, 12315, 9063, 0, 120666, 744, 0, 12897, 3792, 4926, 917623, - 6065, 3551, 0, 0, 4623, 41186, 41816, 4598, 41818, 12795, 5968, 7922, - 12614, 10851, 8523, 6179, 119066, 6180, 1863, 4710, 0, 5956, 11972, - 41290, 0, 4705, 716, 177, 120831, 4704, 12360, 120270, 64719, 161, 9020, - 120272, 0, 4706, 10646, 0, 120037, 4709, 10680, 8754, 0, 120237, 120245, - 119164, 0, 41377, 9136, 1700, 4401, 41280, 194711, 8974, 4004, 0, 10634, - 41791, 2318, 8506, 66361, 8198, 42022, 1005, 937, 118996, 4734, 2870, - 41277, 12319, 66619, 5404, 4729, 3667, 235, 1384, 4728, 41049, 120420, - 120644, 120017, 8109, 120020, 119920, 4730, 447, 13186, 1513, 4733, 8664, - 63978, 0, 120252, 12911, 9665, 1383, 8565, 2469, 120024, 12663, 6156, - 120417, 0, 0, 4288, 120225, 2674, 13238, 11922, 41145, 41468, 3510, - 13234, 41148, 8683, 5605, 42095, 10497, 12221, 1380, 12314, 41146, - 118964, 13196, 13197, 3512, 120682, 9495, 8103, 0, 5959, 65184, 0, 41563, - 0, 120028, 41925, 13205, 13211, 5801, 41923, 0, 120316, 1283, 120302, - 4779, 7988, 3719, 4006, 3271, 66569, 64711, 8355, 118799, 8842, 0, 64870, - 13070, 0, 3875, 5962, 1095, 120106, 3599, 119149, 5827, 0, 7787, 0, - 65494, 120816, 64565, 0, 4773, 64531, 64034, 0, 0, 12785, 42043, 65467, - 119227, 0, 42046, 9742, 521, 65136, 10800, 41473, 8404, 917595, 483, 0, - 1450, 12986, 928, 0, 65441, 0, 10599, 0, 3989, 10971, 120431, 5771, 9841, - 8843, 12145, 119950, 119959, 194856, 9807, 3769, 41190, 3973, 119105, - 4575, 9573, 7982, 429, 8849, 0, 0, 41771, 1796, 118918, 118968, 194853, - 8164, 41301, 3502, 0, 0, 0, 4919, 10590, 5825, 7755, 0, 0, 64548, 12661, - 1621, 10214, 10418, 41962, 0, 41971, 1409, 12195, 1617, 3112, 10824, - 42101, 1390, 64403, 0, 421, 1756, 5846, 0, 8666, 120132, 0, 120360, - 42174, 3630, 5408, 2817, 1214, 119000, 120124, 10218, 41769, 3168, 0, - 42134, 7957, 2370, 2846, 1056, 119070, 12798, 0, 120314, 1836, 8757, 0, + 120470, 4851, 118860, 43024, 0, 66306, 7929, 64584, 9518, 6609, 120203, + 42166, 11319, 1097, 917856, 12064, 41730, 596, 8570, 66517, 12650, 8651, + 41728, 12738, 41835, 12995, 41202, 1373, 0, 11403, 5816, 119067, 64810, + 1000, 120676, 11951, 41140, 1209, 9717, 195073, 118972, 1073, 194579, + 65470, 41138, 8851, 917962, 64500, 12167, 1115, 8874, 9794, 194660, + 917846, 120753, 12237, 3966, 41603, 6587, 9290, 65222, 41600, 9231, + 120183, 2959, 1457, 3535, 195021, 42179, 63860, 41538, 6671, 8618, 42175, + 3404, 64661, 5148, 41737, 1759, 917565, 119974, 65257, 118949, 12290, + 66577, 120019, 9386, 12312, 10151, 8205, 118818, 5131, 917899, 9627, + 65930, 9834, 3055, 9852, 1944, 1248, 10148, 11398, 119990, 64543, 12701, + 119204, 9348, 603, 917851, 65327, 119998, 63781, 65111, 3350, 66576, + 64318, 917828, 8154, 3390, 119985, 41817, 119956, 64603, 66328, 65668, + 120013, 3400, 120015, 6041, 65020, 41899, 66446, 8002, 8562, 4364, 63991, + 4043, 8712, 64134, 7813, 11297, 120759, 10124, 7526, 8601, 6069, 10143, + 4814, 12041, 1418, 10885, 12673, 118961, 65307, 9660, 2764, 13012, 4571, + 5704, 120483, 119946, 12078, 2970, 5457, 5440, 8857, 917898, 118803, + 2843, 5355, 41599, 118883, 119004, 5194, 11657, 119362, 3486, 65324, + 12472, 10123, 65167, 194738, 10717, 8714, 2637, 64629, 8460, 10682, 8476, + 10602, 800, 917613, 66506, 65673, 1019, 64335, 11631, 8465, 12289, 64144, + 762, 13172, 10681, 8488, 5412, 10906, 1353, 194636, 41351, 41823, 5828, + 8206, 120166, 8933, 1601, 9072, 858, 13302, 12458, 120774, 8090, 5418, + 12452, 120081, 9483, 3351, 120602, 64510, 10817, 917939, 41539, 2750, + 11570, 556, 41855, 41246, 65564, 11277, 65892, 2760, 10620, 12195, 7608, + 65809, 64156, 5498, 9998, 41536, 64151, 63876, 9242, 3459, 8997, 11787, + 64153, 64152, 65734, 120184, 4839, 6615, 68115, 1874, 119016, 4975, 4635, + 295, 64124, 64123, 6050, 64898, 917804, 7600, 7590, 63903, 9036, 63901, + 19941, 3971, 66609, 119195, 2952, 64116, 6287, 8031, 2725, 63899, 63898, + 5482, 667, 12332, 1177, 6086, 12322, 11027, 5172, 41617, 64102, 7859, + 1945, 64099, 9815, 10453, 19934, 63882, 7997, 8555, 63878, 63877, 8705, + 64097, 64096, 9571, 528, 9172, 120170, 9828, 41723, 63875, 41578, 11460, + 7432, 63854, 41913, 9056, 195005, 6188, 64593, 6155, 10806, 446, 6494, + 64065, 41318, 63850, 63, 41878, 63846, 2972, 9455, 6639, 64064, 63849, + 63848, 63847, 1176, 120649, 8302, 8276, 63842, 4178, 13208, 13188, 10948, + 10041, 8105, 4333, 9855, 64112, 1105, 4180, 5388, 12094, 65879, 65197, + 7714, 63890, 5443, 7768, 5538, 9987, 194803, 118932, 1678, 917611, 552, + 9560, 64077, 10785, 8996, 4992, 4471, 12080, 9159, 10171, 63861, 10486, + 5540, 63858, 41781, 281, 63863, 12075, 42041, 64646, 5174, 120337, 3589, + 1388, 3123, 43018, 1077, 13272, 8408, 11531, 120387, 43042, 9223, 195029, + 65318, 42773, 119117, 42105, 1116, 13274, 43049, 3663, 43050, 1112, + 119122, 8686, 8881, 5334, 42108, 119937, 13087, 64091, 9322, 194701, + 6509, 64095, 5327, 8111, 19907, 41877, 3478, 7583, 6199, 2903, 195093, + 3001, 1158, 8745, 11329, 4741, 63866, 4737, 4370, 4846, 41616, 4742, + 41335, 4118, 1797, 64600, 805, 65691, 46, 12070, 8760, 298, 65452, 12212, + 120123, 65174, 63836, 32, 5965, 65469, 11495, 12225, 3665, 63837, 64793, + 65330, 41336, 4305, 66360, 8083, 917590, 119333, 63821, 4412, 63819, + 63818, 12244, 5227, 9047, 12283, 4181, 4752, 9029, 4634, 560, 5643, 8226, + 6181, 63812, 13247, 63810, 63790, 3639, 63815, 10122, 63813, 6047, 7937, + 63961, 780, 206, 42008, 4936, 7498, 1098, 19923, 120205, 1093, 9882, + 3016, 4869, 63932, 917554, 63929, 3546, 1605, 65058, 6182, 65566, 13176, + 8400, 11343, 63920, 917550, 5471, 2984, 5314, 9287, 5473, 44, 194667, + 194682, 13169, 5290, 5283, 1695, 63827, 1088, 5961, 1900, 1084, 1085, + 63829, 1083, 6581, 5576, 917793, 64184, 4263, 1092, 4754, 8947, 5252, + 120431, 65253, 64183, 917819, 7908, 11011, 120390, 6579, 194878, 2965, + 119177, 8808, 64710, 1089, 7761, 41641, 42119, 12355, 63889, 940, 5787, + 9992, 63938, 5057, 64679, 12463, 2994, 5054, 41694, 65794, 9664, 41026, + 1437, 9399, 658, 3497, 12920, 7486, 660, 5060, 666, 9022, 5532, 118941, + 5533, 5059, 4727, 6118, 222, 979, 3884, 12459, 7488, 5773, 978, 120163, + 7489, 41619, 10239, 12465, 917761, 118902, 64411, 13271, 1707, 120319, + 12461, 63895, 63949, 63948, 63947, 3376, 6038, 63943, 63942, 63894, + 65323, 194944, 65508, 7776, 64278, 2379, 8703, 63893, 64668, 801, 8125, + 1690, 63919, 63918, 63917, 2369, 65042, 12844, 65800, 119235, 5486, 2334, + 64893, 4463, 5483, 10207, 917608, 2367, 5484, 63909, 264, 2375, 8060, + 6194, 5485, 1844, 64035, 9061, 5534, 10672, 4502, 13178, 253, 118819, + 1823, 8800, 10746, 7912, 0, 10256, 6192, 194946, 42771, 11576, 119616, + 725, 4550, 13257, 120800, 118944, 12892, 917868, 64087, 41775, 8413, + 194805, 120146, 5693, 10397, 120440, 13209, 5074, 5073, 120438, 8983, + 120525, 41132, 66586, 5072, 19964, 6198, 11614, 65731, 196, 13206, 3111, + 64725, 4929, 12445, 0, 119074, 194646, 66606, 6628, 1076, 11294, 1436, + 4934, 64415, 41323, 7543, 195098, 12807, 63907, 63906, 4548, 4329, 6113, + 4979, 3048, 4423, 41320, 194963, 10515, 6218, 8971, 5071, 65583, 3642, + 1430, 5070, 10042, 118835, 3987, 5068, 7619, 3255, 3493, 917952, 8905, + 10735, 120134, 41635, 3378, 4531, 1245, 9105, 66311, 4921, 4481, 3771, + 65544, 2710, 41693, 64084, 41724, 64709, 41682, 41690, 120120, 4922, 325, + 992, 120305, 4925, 1628, 0, 9526, 4920, 65262, 948, 10783, 120208, 4930, + 917570, 4462, 194855, 4933, 5339, 6115, 65359, 4928, 917603, 4457, + 120506, 65290, 42163, 722, 5684, 8678, 12637, 65624, 5689, 8753, 1509, + 120180, 5468, 9511, 194968, 65183, 1672, 6205, 5832, 6310, 5686, 194931, + 64800, 64536, 120713, 41475, 50, 917926, 9871, 120115, 1679, 11982, + 10759, 41883, 66468, 3183, 13259, 4448, 119225, 401, 6427, 64930, 64763, + 5761, 342, 8553, 1151, 8143, 67589, 11983, 64384, 624, 65443, 42014, + 119630, 5078, 12501, 5656, 120168, 5076, 118870, 8812, 119170, 11538, + 685, 9025, 1524, 8003, 66467, 5539, 8087, 12971, 120101, 9894, 1252, + 12925, 194611, 4636, 194615, 118985, 8053, 9732, 917983, 5080, 13121, + 5036, 5035, 118968, 12277, 65904, 194780, 8074, 275, 12158, 194594, 8741, + 4432, 120610, 5033, 120668, 64605, 4836, 3888, 473, 65584, 8502, 120250, + 1873, 1087, 12499, 917808, 63844, 12345, 3601, 1922, 6409, 64965, 65422, + 12502, 120683, 12505, 66321, 66477, 9489, 119140, 3432, 4384, 63964, + 6094, 41530, 8815, 12851, 64753, 119950, 1676, 1154, 3857, 1205, 5030, + 917917, 13100, 12958, 10519, 9622, 194674, 64723, 4421, 10592, 0, 495, + 119007, 10544, 7983, 118882, 10749, 64186, 8494, 11980, 10979, 41710, + 947, 64187, 437, 41709, 10969, 65894, 7613, 9465, 13290, 4795, 4997, + 64306, 8826, 11486, 4999, 120611, 8626, 4590, 4711, 120255, 65037, 2739, + 19942, 8044, 40964, 251, 12686, 7895, 4395, 119927, 119926, 119929, 1779, + 6600, 6601, 41543, 5325, 642, 65830, 8880, 7685, 120071, 66729, 6234, + 13229, 625, 8187, 9990, 1113, 194643, 7915, 1104, 120176, 8179, 10655, + 195043, 9316, 10980, 2489, 1082, 8150, 1359, 194645, 194726, 119304, + 119555, 5042, 5041, 42769, 12084, 8049, 7509, 194806, 6458, 120182, + 119575, 4761, 10506, 4766, 1616, 1273, 120187, 8795, 118876, 194835, + 63957, 9232, 1138, 10483, 12677, 41545, 12881, 3239, 65517, 119558, + 66614, 119111, 42128, 3484, 64545, 11778, 11572, 8503, 5122, 41527, 5040, + 4924, 119014, 119085, 120201, 120748, 5039, 41926, 8303, 8282, 5038, + 65736, 10003, 7427, 65611, 120586, 1686, 120190, 9359, 11467, 3664, + 65921, 8238, 6662, 66472, 119329, 3863, 126, 4835, 68119, 120605, 13245, + 4309, 7744, 63867, 119846, 119023, 13184, 63870, 65431, 569, 8136, + 119010, 711, 1633, 120583, 63869, 4762, 1103, 194560, 12281, 4765, 41331, + 1006, 13040, 4760, 1550, 8201, 10871, 917990, 1102, 5031, 118904, 66671, + 64499, 11546, 13042, 337, 194781, 65781, 65678, 12279, 1111, 65780, + 119900, 4707, 194635, 5008, 7883, 8822, 7880, 4522, 8255, 5512, 13010, + 119232, 8304, 64313, 11611, 5906, 1119, 13039, 13038, 64910, 2455, 64734, + 13008, 41652, 4385, 12492, 11020, 6499, 64775, 119161, 13009, 160, 68110, + 120679, 64262, 5052, 64031, 5821, 6186, 41792, 42770, 5051, 65773, 1429, + 64573, 5050, 302, 388, 12058, 735, 6637, 1079, 3867, 5708, 12726, 119879, + 9117, 5706, 10679, 5513, 6666, 4005, 0, 5510, 10991, 120454, 65458, 2470, + 917581, 13305, 1925, 65760, 194914, 41924, 10092, 5048, 5047, 41532, + 10058, 917559, 119999, 9070, 12049, 3339, 8089, 1106, 639, 65764, 63967, + 3340, 3109, 3653, 4599, 10799, 6674, 10605, 917585, 1476, 648, 1754, + 11001, 3233, 864, 41782, 10164, 8972, 41865, 3530, 9750, 120690, 11024, + 6656, 5192, 4338, 5046, 8512, 63770, 13199, 8967, 1236, 5045, 12012, + 13189, 7986, 5044, 120102, 7440, 13128, 5043, 9553, 1590, 63777, 63776, + 9669, 12341, 8654, 8402, 63779, 1583, 4740, 13260, 3586, 13276, 11444, + 120306, 67634, 119606, 41523, 13296, 517, 12922, 11354, 11700, 41528, + 123, 65454, 12393, 11394, 41997, 10531, 7784, 13194, 1334, 11978, 4479, + 1126, 65586, 120663, 195061, 8520, 3925, 917621, 8069, 4357, 42154, 489, + 120450, 119836, 8848, 6476, 8450, 43044, 11926, 41557, 1145, 63788, 7910, + 63785, 63784, 754, 8711, 6183, 8183, 120741, 8928, 65166, 7952, 10747, + 125, 9235, 64861, 64207, 12689, 66445, 10779, 10990, 3523, 1074, 13258, + 9536, 8477, 11014, 4427, 10517, 63757, 7726, 11325, 19922, 267, 1349, + 10713, 1371, 12149, 195003, 2458, 63753, 6201, 41084, 41074, 4266, 10652, + 6483, 41077, 3402, 9050, 3398, 8140, 42084, 6260, 3391, 41075, 2476, + 41956, 11988, 3898, 10625, 10201, 10988, 11524, 63794, 10367, 12521, + 10431, 13014, 6289, 1068, 6673, 12523, 12945, 12524, 12438, 7950, 10804, + 13233, 12082, 4386, 9053, 12473, 2793, 12475, 704, 195020, 6195, 9530, + 6660, 12232, 194892, 64159, 5681, 12629, 4595, 63760, 792, 65538, 13004, + 9897, 8742, 195013, 64947, 65448, 63744, 12948, 64787, 7588, 63748, 1693, + 63746, 63745, 5055, 9883, 4287, 1090, 4902, 1131, 11665, 194602, 4558, + 1816, 9523, 41712, 168, 194897, 4898, 63857, 6157, 12960, 4901, 1821, + 13191, 12170, 3500, 3139, 791, 9162, 12485, 10306, 119001, 64200, 13006, + 64433, 8354, 10033, 941, 12037, 7557, 65570, 10565, 8234, 64559, 8228, + 8424, 10246, 64193, 12811, 65925, 3946, 42764, 8057, 41990, 673, 194853, + 64357, 917971, 194799, 9547, 288, 8752, 120820, 2448, 10025, 10267, 2918, + 2452, 65300, 41529, 8729, 64726, 2790, 7845, 3793, 194715, 4408, 4122, + 11568, 41535, 8723, 10709, 10087, 119302, 731, 42109, 11548, 2438, 64587, + 65396, 119169, 1175, 13256, 1282, 373, 119172, 5396, 8653, 8557, 7723, 0, + 3330, 120278, 41952, 917566, 5273, 8248, 5269, 3304, 5202, 2404, 5267, + 119357, 1627, 65549, 5277, 12963, 5371, 6189, 4125, 1826, 12133, 65241, + 8260, 1271, 917589, 195006, 64643, 9035, 3864, 12707, 4631, 3879, 118785, + 68125, 4166, 164, 9331, 7567, 7459, 119568, 10212, 5384, 41882, 67647, + 64346, 0, 68159, 917822, 41388, 120518, 12005, 12666, 13175, 13207, 8706, + 5552, 10172, 700, 5929, 5553, 12978, 120384, 5356, 7499, 8563, 41888, + 3180, 917818, 917960, 5554, 971, 12344, 8724, 194608, 6665, 63874, + 120275, 2866, 8517, 11455, 13190, 64632, 120227, 5555, 10045, 12882, + 13275, 120672, 41522, 11480, 9143, 6668, 41525, 120539, 195035, 656, + 118808, 43034, 4577, 12229, 8715, 68133, 194613, 120261, 4269, 64813, + 119163, 41609, 10476, 950, 118980, 3932, 41450, 68140, 66683, 68130, + 120014, 11974, 118884, 369, 119096, 41784, 66459, 5097, 4935, 9848, + 64216, 10293, 4796, 10317, 3651, 10127, 120603, 10269, 5102, 5101, 66628, + 9064, 8138, 120455, 404, 5100, 1439, 12093, 1247, 8092, 119330, 5099, + 1831, 1441, 4793, 3063, 650, 12292, 746, 120165, 120769, 7461, 12018, + 9031, 12182, 10115, 9078, 8545, 4422, 4708, 3799, 3268, 64556, 9118, + 119127, 2676, 7750, 4374, 64398, 6190, 1364, 64589, 8038, 68121, 9857, + 120638, 9858, 195033, 64170, 12129, 13174, 8481, 12412, 6202, 64380, + 10920, 10872, 2365, 7841, 120059, 5108, 5107, 11010, 13210, 6176, 65561, + 5541, 41785, 41171, 11291, 5284, 4372, 207, 194904, 4275, 119930, 854, + 68147, 120189, 12965, 384, 5103, 10404, 10340, 10702, 1556, 488, 13236, + 12937, 10017, 9733, 13187, 10014, 7844, 41373, 13198, 5203, 120517, + 13232, 5106, 349, 4863, 41371, 10965, 41367, 5105, 11721, 12861, 4398, + 5104, 5672, 304, 1096, 120557, 0, 932, 12441, 6567, 238, 65681, 4318, + 10452, 19905, 8032, 13243, 13237, 12719, 67640, 66570, 64814, 64884, + 119872, 10670, 8597, 1178, 64017, 9864, 13195, 8803, 309, 6622, 8151, + 10858, 64961, 7722, 12553, 10459, 12568, 12066, 12549, 66590, 12570, + 9712, 41417, 41496, 194943, 9805, 4965, 13150, 10538, 19944, 41401, + 120252, 120164, 6191, 6261, 119342, 119341, 11965, 1957, 10420, 982, + 2756, 9370, 2720, 12357, 41455, 2925, 118817, 13056, 3222, 13212, 10116, + 41644, 10105, 10378, 41581, 10834, 118793, 64407, 5242, 41963, 64476, + 1694, 8216, 10814, 67598, 7781, 6306, 64568, 917916, 120738, 11793, + 42057, 7594, 64598, 120325, 64799, 3475, 64206, 2479, 9709, 3632, 120322, + 10698, 65616, 3648, 3907, 10297, 67639, 3636, 19928, 2979, 8837, 8286, + 1843, 3936, 119052, 11699, 41347, 65119, 13235, 3640, 41248, 120579, + 4379, 13239, 12692, 7969, 12927, 66353, 194951, 12703, 120509, 41846, + 2529, 734, 10808, 65146, 42083, 9872, 957, 42055, 1846, 66367, 12181, + 9634, 120310, 9988, 12991, 1670, 5740, 119597, 10072, 5379, 120318, + 41163, 41157, 785, 8236, 194812, 9027, 63897, 13267, 64383, 64688, 925, + 41955, 120541, 41773, 41071, 9586, 120312, 41984, 9217, 6151, 12110, + 120689, 65572, 64580, 4016, 13265, 13264, 381, 12386, 6100, 42077, + 120768, 5808, 5184, 8200, 12967, 10810, 5612, 4583, 19943, 5860, 67633, + 64575, 194842, 812, 3615, 65284, 5178, 194929, 119015, 9825, 5188, 9698, + 7814, 120063, 10692, 1166, 64429, 41921, 924, 9756, 12359, 119258, + 194843, 2442, 10703, 120696, 67632, 8012, 5674, 12353, 119561, 12361, + 5677, 67626, 66657, 40972, 12453, 41920, 5673, 12751, 5676, 8542, 12694, + 118978, 2468, 1294, 41294, 3336, 3883, 64388, 1727, 194680, 64054, 3605, + 119632, 195015, 12034, 8718, 3550, 736, 7806, 4505, 2715, 806, 5826, + 41884, 5813, 64279, 65391, 5841, 5837, 64731, 12702, 3105, 2405, 5838, + 5796, 120604, 65259, 5793, 5735, 5866, 5797, 1432, 5865, 12143, 7956, + 598, 66448, 41886, 2480, 120152, 19952, 9037, 5671, 5537, 12749, 67601, + 10932, 41359, 1211, 847, 65690, 9529, 11799, 12318, 120766, 43026, 5645, + 10622, 41391, 194967, 64378, 6566, 917913, 5650, 11358, 119102, 13110, + 194834, 9624, 194928, 8284, 65896, 2748, 1554, 194733, 4035, 6492, 66504, + 4265, 2929, 3977, 65344, 12051, 836, 5698, 2488, 194634, 4582, 66514, + 5644, 10292, 12926, 8046, 7528, 8372, 11707, 65116, 119206, 11439, 13201, + 1374, 64878, 12742, 41013, 10568, 41374, 4030, 2869, 120776, 41015, + 65897, 2785, 400, 12597, 42051, 120540, 64477, 6661, 5659, 9884, 4759, + 118906, 390, 10266, 41349, 1170, 3473, 7718, 118962, 1609, 902, 917855, + 120062, 66352, 11661, 8122, 5712, 66308, 8004, 1887, 9540, 10278, 2554, + 5158, 5714, 41136, 194970, 64351, 807, 66652, 120793, 64677, 976, 5511, + 6146, 65518, 771, 10954, 41356, 9673, 11412, 11026, 41143, 8676, 7904, + 5579, 953, 451, 119560, 5578, 12635, 11491, 9724, 194697, 118881, 9524, + 7490, 118789, 1440, 3379, 10310, 7487, 12561, 471, 7484, 7482, 3795, + 7480, 7479, 7478, 7477, 6501, 7475, 64900, 7473, 7472, 2474, 7470, 6546, + 93, 10615, 10213, 8128, 12551, 10049, 8171, 3544, 194628, 6017, 65311, + 383, 120216, 13306, 10533, 7870, 63884, 5187, 119991, 1456, 120217, + 42164, 64217, 194702, 5232, 917994, 19961, 2472, 41005, 120699, 8710, + 6019, 4256, 119959, 4980, 8860, 9640, 10028, 12845, 66607, 13182, 65121, + 120685, 120308, 10631, 65126, 7972, 118928, 8066, 119623, 7900, 8316, + 11309, 11273, 119040, 64211, 120309, 64212, 10347, 445, 119029, 195074, + 12931, 64927, 8330, 65783, 66597, 64213, 64366, 64369, 8814, 3902, 64607, + 1770, 194723, 12836, 64208, 64552, 65821, 4584, 9684, 120714, 917944, + 10866, 65792, 1118, 7464, 194989, 8964, 1081, 7436, 64565, 8162, 9342, + 5996, 119245, 4903, 64332, 41386, 5162, 41007, 1330, 64486, 40995, 12209, + 12047, 41384, 194789, 195067, 1848, 4334, 65352, 9880, 64066, 10674, + 5522, 195014, 61, 120157, 195065, 3633, 41980, 65162, 41234, 12089, + 65871, 9771, 66685, 13251, 41959, 64749, 6262, 2784, 195040, 9334, 8126, + 66483, 64967, 7975, 441, 194591, 917599, 11608, 4884, 40999, 120269, + 120334, 10495, 6313, 10890, 119354, 65834, 8324, 7855, 2345, 67599, 463, + 64737, 194821, 119607, 3117, 5460, 119356, 1193, 10056, 1148, 12396, + 13252, 7829, 42173, 118994, 7743, 917981, 13248, 5499, 63763, 118960, + 9034, 6039, 120544, 5663, 119182, 41018, 65683, 10338, 2482, 1471, + 120086, 120077, 66370, 12378, 41966, 41970, 3084, 12374, 10903, 6638, + 10422, 911, 2460, 120499, 11944, 12376, 41032, 40996, 120614, 12380, + 5520, 64473, 10869, 5870, 64670, 13310, 2603, 12326, 539, 10826, 65105, + 917932, 3853, 11949, 64901, 120260, 64883, 10722, 41810, 8659, 120090, + 12474, 66721, 5857, 65342, 2478, 119120, 4162, 7942, 4260, 12953, 42028, + 120089, 12470, 64941, 11798, 2742, 12476, 1891, 10946, 9101, 5000, 66647, + 12302, 3018, 12942, 5748, 194584, 7771, 6161, 917934, 8796, 0, 6412, + 118986, 8519, 13146, 41973, 12906, 9422, 10333, 2882, 4366, 119123, + 12843, 4520, 917810, 65626, 10648, 118898, 4014, 12842, 194724, 12015, + 13117, 8275, 3893, 66362, 5810, 12210, 195071, 42147, 11536, 13292, + 65685, 12938, 10427, 9154, 3844, 63934, 9755, 1110, 6612, 10892, 8231, + 10775, 6473, 41968, 783, 10219, 3591, 41969, 917997, 2453, 8518, 3620, + 11466, 12443, 4556, 10349, 10413, 194569, 41159, 3202, 8599, 10510, 4382, + 66482, 195002, 10842, 687, 9177, 8902, 63950, 1840, 41751, 12400, 120177, + 4883, 285, 4723, 41917, 9788, 4459, 64158, 1634, 41958, 9155, 240, 9786, + 65082, 41919, 8579, 9743, 7981, 13134, 118878, 4508, 64178, 41999, 11328, + 119817, 65589, 63887, 3081, 11463, 120080, 119051, 119353, 10445, 41720, + 194662, 120229, 2614, 9024, 64620, 1729, 119840, 64289, 65221, 63883, + 65466, 64852, 64509, 41447, 63916, 64855, 41203, 5001, 41879, 11355, + 4121, 5003, 884, 41214, 63879, 4943, 5150, 7500, 5278, 7773, 643, 3086, + 118912, 64652, 120068, 58, 194621, 6167, 66656, 63872, 6594, 66366, + 11295, 41495, 3624, 43036, 118901, 64655, 2721, 9616, 63988, 19929, + 11296, 10500, 10440, 9611, 4264, 119303, 194657, 7738, 41857, 11446, + 12638, 64522, 3435, 3094, 12916, 9754, 66314, 4437, 41292, 8899, 12748, + 42058, 9517, 11518, 917889, 65360, 120700, 119047, 63956, 4306, 41380, + 11995, 63960, 9591, 8323, 10217, 67602, 11469, 120578, 12456, 2723, + 120061, 5088, 5086, 917783, 8524, 7752, 11397, 2880, 0, 194669, 2872, + 1386, 65034, 3498, 4378, 65039, 4270, 12392, 65036, 7853, 6633, 12101, + 5822, 5230, 194573, 710, 917790, 11663, 1666, 8161, 371, 12013, 63891, + 42092, 119103, 415, 63851, 63892, 11708, 42096, 5183, 1877, 7538, 7924, + 2927, 4324, 6608, 4472, 1244, 331, 194858, 12683, 10662, 64678, 4756, + 63831, 65852, 10730, 7691, 10331, 65320, 41964, 6238, 8938, 8628, 6043, + 118801, 64895, 1604, 9565, 10539, 120814, 41220, 13032, 120519, 120193, + 10032, 8750, 12373, 63828, 11992, 1351, 194868, 8698, 12190, 3622, 1930, + 65237, 9621, 10463, 63981, 4967, 13031, 1966, 2330, 195099, 3657, 120498, + 65202, 6000, 4347, 4416, 42098, 11009, 10694, 8099, 402, 41916, 13147, + 41912, 42100, 12217, 9695, 1897, 7562, 3515, 5170, 11805, 11796, 676, + 6259, 41742, 65558, 41870, 65553, 3536, 65093, 9752, 63902, 6162, 10532, + 66490, 10113, 41829, 65886, 5159, 12422, 41832, 439, 66640, 119611, + 11280, 12481, 2325, 40970, 41830, 120647, 917799, 5145, 12486, 65018, + 66516, 5409, 8976, 120051, 12336, 4135, 9685, 341, 2727, 4129, 3539, + 66616, 11530, 41736, 7913, 5405, 63859, 4131, 41267, 64721, 63865, 4133, + 63864, 210, 4600, 8082, 3254, 4137, 119205, 119853, 119062, 194577, + 120534, 4591, 65077, 64671, 194671, 3355, 9508, 3393, 561, 5723, 195, + 64261, 3377, 12497, 41269, 917545, 13135, 917993, 8368, 119224, 41499, + 917798, 11435, 917920, 41498, 120628, 1379, 246, 12603, 9680, 3788, 2924, + 42168, 12812, 8728, 64906, 119213, 8917, 120645, 301, 64765, 3969, 64964, + 9575, 64562, 40966, 9652, 64919, 42064, 42086, 120542, 194728, 8491, + 194962, 41876, 63772, 3182, 327, 120323, 9042, 118827, 917776, 42169, + 4755, 194684, 64660, 11443, 12431, 8668, 12434, 608, 600, 5999, 1219, + 3934, 9494, 11483, 917919, 1726, 1015, 64686, 8212, 11395, 64202, 13160, + 7759, 65363, 485, 43037, 65291, 8811, 927, 42102, 194979, 12436, 9351, + 7778, 64379, 7496, 65335, 7491, 1208, 7495, 64757, 9337, 64362, 917778, + 11348, 12235, 9021, 194949, 917830, 120066, 19914, 3742, 8758, 9648, + 64617, 63834, 9150, 63835, 1117, 13037, 2594, 63809, 10691, 12052, 6550, + 10469, 65212, 11265, 2546, 119216, 213, 65309, 10554, 3972, 917972, + 194678, 64194, 6554, 12416, 11914, 5452, 8230, 64197, 41951, 12418, + 42049, 3882, 8532, 2713, 1573, 9650, 42136, 4596, 66339, 1406, 120041, + 40990, 194593, 12414, 8287, 4143, 120378, 10489, 1143, 4141, 9682, 12415, + 1508, 42763, 8779, 10569, 8725, 120783, 65045, 11724, 119064, 4145, + 64872, 65751, 66613, 119576, 8027, 41505, 9171, 9550, 11400, 12518, + 65178, 65397, 6528, 10740, 65753, 64816, 10998, 66333, 12955, 10596, + 2888, 119572, 65033, 7715, 3881, 41487, 12118, 67622, 2878, 5390, 64167, + 3009, 41476, 41489, 63765, 3007, 1448, 2975, 10429, 3889, 8521, 5083, + 5082, 7503, 5235, 803, 194590, 3014, 5081, 8986, 11002, 10632, 11934, + 11452, 1332, 64802, 3929, 4597, 65532, 64767, 1791, 5191, 9288, 9657, + 2892, 10577, 6031, 555, 64173, 0, 194927, 12367, 42170, 11540, 63930, + 629, 1924, 119880, 11270, 64162, 5858, 8462, 8005, 12365, 1784, 1361, + 118939, 12369, 7905, 67644, 5077, 194668, 10880, 63927, 5075, 120065, + 9371, 65075, 41193, 11007, 1625, 10997, 917907, 1342, 66684, 64171, 3434, + 4843, 4506, 195060, 5266, 120521, 5272, 4482, 4507, 9578, 63923, 66319, + 7979, 64381, 9831, 64417, 65529, 461, 7984, 41972, 4504, 444, 42145, + 9127, 5276, 43021, 118922, 120179, 119638, 11349, 12848, 5177, 41324, + 12055, 8722, 120805, 1197, 65512, 1149, 4114, 409, 4383, 8900, 8948, + 7684, 3492, 721, 10182, 9108, 119005, 195041, 11954, 119191, 12993, + 40963, 3099, 917979, 65088, 41087, 119834, 12587, 66643, 120374, 12036, + 194736, 65123, 41576, 8152, 120721, 64428, 12227, 8578, 5995, 7573, + 41575, 2922, 63946, 63944, 11493, 194883, 2670, 4167, 194873, 11723, + 120025, 65173, 68154, 13023, 938, 917954, 195044, 11737, 9721, 118937, + 41017, 9606, 8504, 4024, 41063, 11411, 12334, 65231, 4153, 11911, 10793, + 5250, 12407, 3395, 4404, 6056, 12401, 11490, 5775, 42005, 41607, 68183, + 41091, 12205, 1344, 8870, 194744, 4940, 4735, 7683, 1167, 12822, 4983, + 120554, 861, 64907, 120045, 120458, 65149, 63896, 120651, 12039, 10559, + 11956, 119841, 118892, 9472, 4282, 6631, 120188, 12816, 9596, 7618, + 12710, 64147, 11579, 4101, 0, 64704, 5992, 7616, 65828, 64422, 1004, + 9632, 120185, 853, 0, 12627, 10953, 194681, 5016, 65619, 120441, 11300, + 9491, 9686, 5890, 917914, 7558, 12712, 195077, 65627, 10718, 13154, 3461, + 9139, 64756, 194990, 119151, 65628, 0, 13227, 12585, 6669, 119152, 12177, + 41708, 12860, 41098, 10015, 10838, 4900, 10352, 120742, 10061, 5903, + 4119, 5140, 209, 64002, 11520, 9702, 11702, 8277, 9245, 13048, 4927, + 4138, 41093, 65286, 64412, 2410, 993, 41025, 13054, 12394, 120020, + 917579, 68162, 12685, 64938, 65475, 10781, 41230, 64299, 5010, 1680, + 9107, 118809, 10659, 3600, 10968, 120027, 1336, 41518, 194796, 5896, + 119838, 5993, 2819, 12950, 12706, 12966, 1893, 120462, 63915, 917768, + 8184, 272, 1363, 8793, 8411, 63908, 41502, 3077, 983, 68118, 1512, + 119941, 1190, 4109, 1335, 841, 5888, 41358, 9836, 9544, 120021, 41481, + 8313, 7832, 65515, 3090, 2409, 817, 1664, 1850, 66690, 3079, 4731, 10118, + 66629, 64541, 12033, 1255, 11689, 9247, 64350, 66633, 12389, 66610, + 195078, 41996, 11526, 63985, 5864, 1147, 11690, 5835, 1551, 66625, 5480, + 7858, 11653, 4116, 11688, 66634, 1094, 194, 12384, 118987, 8180, 41686, + 12313, 41531, 63904, 13273, 6114, 10898, 195082, 64578, 8247, 507, 91, + 7545, 10695, 10952, 7534, 10896, 10036, 7857, 6067, 774, 65915, 2744, + 119815, 5994, 12539, 41420, 41601, 8359, 65264, 6028, 66511, 13167, + 120277, 7719, 119875, 2486, 7893, 41059, 162, 5436, 917583, 119809, 9687, + 64956, 6304, 65457, 6051, 120495, 5262, 5904, 66658, 12681, 194710, + 194616, 12406, 12219, 3652, 10537, 917946, 10492, 64550, 6549, 279, + 195030, 119978, 64619, 12403, 1489, 120771, 4132, 4899, 3899, 1007, + 42124, 4976, 2343, 4103, 19946, 120806, 10750, 1345, 120355, 120801, + 12859, 8956, 4098, 65267, 5861, 65559, 11999, 12151, 64804, 194856, + 12645, 5146, 11320, 64730, 64174, 41094, 492, 8685, 12974, 41060, 67613, + 41551, 5147, 2582, 11470, 64538, 7444, 1928, 118998, 9594, 5991, 10862, + 67609, 2527, 194809, 197, 2799, 8241, 64181, 65348, 65874, 194840, 64179, + 767, 4127, 120464, 10138, 119808, 0, 8897, 63911, 41553, 8357, 4124, + 1799, 65371, 42148, 194663, 12954, 120231, 65340, 1123, 963, 2434, 10120, + 12405, 41339, 2493, 398, 392, 9723, 6407, 119011, 7945, 64935, 4402, + 7570, 12402, 65926, 41392, 8414, 12408, 41265, 65713, 406, 120326, 9164, + 12411, 0, 4560, 6623, 4961, 64494, 1575, 64682, 5438, 165, 9993, 41467, + 63953, 8064, 9093, 9599, 9147, 118831, 63958, 4987, 9148, 2399, 4096, 53, + 10944, 12368, 65435, 119192, 8178, 64149, 3367, 12910, 10884, 727, 65272, + 119238, 5805, 1947, 11527, 194589, 42176, 12370, 11655, 1705, 5411, 8898, + 118810, 12372, 120642, 195023, 8017, 65287, 8813, 12366, 10963, 6066, + 1329, 4909, 3052, 9220, 66464, 4904, 66666, 10803, 1365, 9253, 42757, + 41264, 7462, 120712, 119350, 119814, 1499, 66727, 8055, 120803, 8740, + 5398, 63962, 13120, 8924, 917764, 5988, 3660, 12017, 11781, 9476, 8788, + 1357, 42113, 65743, 3629, 8774, 13005, 119082, 3628, 120172, 64394, 1933, + 3469, 1567, 42116, 11969, 64809, 2928, 4905, 2487, 851, 3121, 1804, 3311, + 67615, 9114, 194880, 12083, 9315, 4822, 4906, 3852, 2847, 6675, 3236, + 11317, 1251, 7777, 41852, 7951, 1198, 9132, 120767, 12274, 510, 10259, + 9865, 65686, 4561, 6018, 1398, 917869, 12276, 66487, 19931, 119061, + 11406, 8167, 12127, 41932, 840, 120300, 2443, 10918, 10410, 120338, 1001, + 9241, 1927, 333, 41930, 120272, 8144, 8034, 10680, 119598, 66663, 64199, + 12867, 64198, 6678, 7769, 7519, 12621, 65150, 8904, 518, 4764, 65165, + 41168, 13204, 4387, 857, 10530, 65369, 12736, 120724, 41044, 66458, + 11543, 9358, 67594, 42078, 5136, 1968, 19937, 66605, 1337, 10581, 1629, + 4533, 796, 66494, 6490, 194921, 12038, 119338, 12664, 195037, 65461, + 9798, 6120, 478, 1948, 68128, 10962, 952, 6016, 195055, 195088, 9512, + 4276, 1206, 3619, 41638, 13263, 3843, 8142, 8853, 3361, 41795, 490, + 10715, 3436, 65011, 63841, 12817, 9847, 6676, 3930, 12854, 13240, 6154, + 9551, 65354, 65346, 784, 65357, 334, 64797, 1453, 7541, 8940, 120329, + 8500, 10428, 10364, 64715, 778, 4317, 10004, 7989, 64676, 3227, 119583, + 67606, 120514, 120684, 10855, 13102, 41702, 10309, 6672, 10277, 194958, + 66691, 41624, 5415, 9613, 9001, 4526, 3462, 65215, 64520, 41020, 6664, + 66701, 42056, 9759, 64957, 3963, 120304, 8114, 1469, 65244, 65381, 41744, + 4988, 66453, 118956, 9598, 904, 352, 194760, 1451, 1356, 8453, 4134, + 120377, 917802, 1619, 9703, 41745, 3955, 8575, 119180, 1201, 64732, + 12846, 917980, 41860, 11919, 64962, 41550, 5289, 13144, 8511, 9460, 823, + 9675, 12305, 5940, 226, 2649, 12387, 1253, 13183, 65766, 500, 64521, + 9081, 1658, 11936, 64735, 65761, 8702, 11606, 64784, 9785, 42123, 64783, + 194619, 917779, 5152, 8935, 7533, 119101, 5304, 119820, 616, 4323, 64666, + 4684, 65103, 120613, 65735, 65339, 10560, 6048, 4763, 4112, 118935, + 10870, 5260, 5328, 65129, 326, 9681, 4475, 917933, 10771, 2876, 194915, + 119935, 6035, 41398, 41192, 9802, 13261, 120532, 453, 41396, 917564, + 6481, 12140, 9572, 41937, 10392, 10328, 40998, 7704, 66432, 120317, 9800, + 4123, 917900, 42103, 41000, 7854, 119239, 6487, 8334, 64061, 10344, 9808, + 11271, 5394, 4126, 12800, 9521, 9589, 41200, 41306, 4425, 119856, 10464, + 63802, 64769, 1288, 64514, 11528, 63984, 12173, 679, 64012, 41914, 5850, + 758, 7536, 10796, 4474, 10742, 10693, 64006, 1587, 64005, 10541, 64581, + 65490, 1369, 12134, 119050, 7927, 64009, 1139, 64030, 64026, 64029, 8970, + 64948, 4430, 195016, 10774, 4514, 66434, 12421, 8194, 194765, 1852, 3057, + 65483, 8893, 64032, 12542, 12973, 65341, 120497, 41206, 7925, 12423, + 10475, 917572, 3496, 1352, 10933, 7707, 9102, 627, 42034, 6158, 8327, + 64497, 65605, 6040, 917592, 10129, 64863, 9336, 11696, 5730, 1018, 7798, + 64474, 64259, 1682, 64290, 7820, 42756, 12951, 119873, 7746, 1492, 0, + 8288, 12563, 10728, 5127, 11285, 65509, 5495, 4273, 11577, 9644, 10849, + 1833, 2999, 120612, 64373, 120471, 185, 65085, 6023, 169, 5497, 7535, + 8085, 917909, 65717, 9749, 8224, 6131, 1949, 4117, 7847, 120489, 119982, + 5321, 66355, 65765, 9313, 2589, 64408, 1689, 7802, 4683, 120167, 12303, + 64667, 66704, 1184, 0, 815, 8273, 120807, 6049, 120530, 4027, 834, + 119833, 1803, 64683, 1503, 8995, 120653, 917924, 5731, 1381, 2387, 64511, + 12430, 8289, 10981, 12654, 2881, 65514, 917600, 9601, 332, 9668, 9766, + 5142, 2407, 65618, 66601, 6036, 64881, 4026, 8645, 64789, 2887, 6489, + 3526, 6298, 119136, 64475, 4833, 1834, 65621, 8572, 6021, 10940, 65249, + 119848, 8662, 65739, 119604, 2652, 7463, 11539, 10784, 120720, 64391, + 166, 19913, 8635, 9706, 10623, 408, 1828, 195084, 13298, 194889, 7426, + 8168, 6280, 12324, 7607, 10639, 66713, 4832, 64557, 41643, 6279, 12508, + 8713, 10690, 9161, 41645, 1620, 6645, 646, 66726, 66711, 42129, 609, + 11555, 3472, 8697, 41086, 119594, 4343, 6212, 917557, 11413, 5809, 1950, + 239, 119021, 637, 65785, 41592, 43029, 917539, 120285, 194837, 3247, + 120754, 12985, 12696, 65213, 66668, 65260, 12929, 10983, 712, 120291, + 119337, 41567, 65592, 194969, 120171, 119852, 120178, 119137, 1506, 8285, + 65617, 4509, 65608, 12651, 12216, 64628, 40988, 11961, 6204, 41727, 7494, + 64341, 2396, 41703, 41493, 13062, 41757, 355, 9719, 3886, 9814, 63912, + 68123, 65444, 996, 42075, 64880, 43045, 65199, 194810, 8655, 8222, + 194839, 7939, 10342, 64720, 3178, 68184, 120552, 5907, 19932, 3976, + 917849, 42161, 9471, 5833, 11966, 12555, 5969, 5699, 12562, 12550, 9488, + 40982, 8489, 0, 1488, 194829, 13149, 119997, 9799, 5265, 66612, 1563, + 11487, 9619, 12464, 119210, 120758, 118952, 41704, 5803, 7797, 6070, + 10006, 41181, 465, 6082, 13078, 9692, 194745, 12567, 8116, 795, 66480, + 7843, 12462, 3607, 10831, 10046, 9612, 42153, 8218, 9485, 66714, 120301, + 12468, 8607, 1008, 65322, 3306, 66485, 65138, 6057, 508, 120264, 1766, + 11282, 11996, 1820, 4547, 0, 638, 6083, 120160, 12308, 0, 2305, 917595, + 64777, 9470, 4345, 6659, 65236, 4818, 6085, 9899, 65207, 3915, 41634, + 5382, 41639, 119591, 6235, 119060, 4028, 1787, 19920, 41979, 120786, + 3249, 1768, 1130, 12328, 501, 42016, 10601, 43023, 6503, 65294, 7742, + 63992, 13280, 41922, 6505, 118925, 5310, 9475, 66716, 120810, 6500, 5526, + 65049, 11408, 65889, 8568, 119818, 11449, 9678, 5403, 120311, 9869, + 63780, 1771, 12460, 8936, 120631, 118832, 64903, 10760, 119115, 9158, + 66567, 120259, 119025, 120582, 5410, 5783, 10365, 8403, 5400, 11594, + 120295, 5027, 9326, 10491, 119348, 4831, 120698, 5028, 5587, 66492, 7540, + 5026, 4923, 65086, 8981, 12382, 8931, 120755, 1415, 8866, 917785, 65513, + 10461, 12103, 119602, 8642, 5029, 42766, 1580, 3598, 120067, 41070, + 10053, 120819, 6663, 119325, 6026, 41515, 118796, 64592, 1716, 1461, 910, + 11907, 620, 41001, 3658, 41541, 119980, 66728, 7617, 5024, 12888, 41003, + 68180, 5025, 11529, 41514, 64561, 5703, 119124, 41517, 41504, 41519, + 66473, 9726, 119160, 5849, 623, 781, 670, 10660, 5769, 613, 6105, 11584, + 477, 1268, 65275, 8906, 592, 1578, 2636, 64404, 10815, 11619, 8225, + 119578, 654, 6451, 653, 652, 7721, 647, 7869, 633, 120224, 42152, 64361, + 12480, 6119, 829, 39, 12487, 19950, 120399, 65865, 6616, 65672, 12489, + 9667, 391, 5550, 194870, 482, 917886, 1203, 120345, 1813, 64544, 41311, + 9503, 120623, 2877, 120249, 64135, 1675, 4939, 5315, 194801, 64128, + 10070, 10595, 13293, 4576, 42094, 12808, 119569, 4277, 40997, 4039, + 120429, 64472, 368, 13036, 3960, 65460, 8406, 68176, 120121, 66679, 3958, + 12132, 1849, 194564, 270, 13086, 10714, 194617, 11929, 11959, 917824, + 64657, 41608, 3618, 65009, 9069, 6273, 5156, 364, 9595, 929, 67616, + 42035, 707, 1555, 41725, 8691, 66435, 224, 41662, 68164, 9332, 4966, + 194977, 917538, 4578, 64513, 3841, 194647, 65922, 10732, 13074, 850, + 4972, 9356, 12820, 2909, 63968, 1286, 10166, 8682, 11544, 10203, 9608, + 12815, 7730, 11962, 41540, 12507, 1196, 0, 66471, 777, 10020, 4375, + 41372, 6641, 525, 12198, 120443, 8763, 120526, 41628, 533, 11931, 8658, + 120743, 41520, 2705, 65010, 13126, 9838, 4377, 8559, 7765, 119925, 8280, + 13193, 2701, 11666, 8679, 5767, 1576, 7735, 9809, 8353, 11513, 41960, + 42007, 66452, 10889, 1748, 7757, 65265, 120226, 12803, 66493, 2718, 4168, + 3061, 13308, 63764, 6596, 1179, 4440, 194759, 7694, 363, 8896, 63768, + 3485, 12987, 41586, 64908, 120332, 41149, 1591, 6593, 64625, 10192, + 64143, 66455, 13053, 10013, 5630, 194622, 120686, 9492, 10390, 13083, + 12833, 5543, 41327, 1640, 12495, 630, 120091, 3138, 10996, 41127, 1043, + 120674, 12498, 10090, 917568, 917609, 313, 65543, 8615, 119144, 12540, + 493, 41426, 5750, 1717, 9417, 479, 9405, 11268, 0, 9398, 9403, 3520, + 8426, 12490, 63855, 65185, 12586, 12493, 5815, 10707, 1002, 12491, + 194884, 12934, 631, 66474, 64922, 13161, 41303, 917957, 10546, 67635, + 65711, 11600, 65786, 2797, 13107, 65599, 306, 714, 3058, 8507, 65576, + 66700, 119961, 120731, 120694, 11607, 65591, 64711, 68166, 7909, 9157, + 4569, 63758, 63805, 13297, 7603, 40986, 180, 244, 11542, 12898, 12494, + 12674, 8244, 362, 65776, 64145, 8037, 194830, 11535, 120680, 4882, 5185, + 64866, 5521, 4885, 5519, 42155, 10302, 4880, 10104, 1027, 1360, 248, + 12424, 10523, 1446, 4319, 41646, 991, 5189, 63754, 10494, 65777, 1722, + 1870, 120151, 470, 9427, 65271, 5523, 194716, 64527, 4579, 120446, 9549, + 12511, 10549, 12514, 9661, 66486, 12000, 9602, 8623, 65172, 120042, + 119855, 13095, 12512, 11615, 13041, 6150, 9846, 659, 6098, 0, 1174, + 10334, 194592, 8311, 12510, 63856, 12107, 120341, 12513, 9284, 12471, + 120733, 12330, 917571, 63853, 119854, 2323, 65288, 2319, 6293, 12477, + 118807, 2311, 194661, 4415, 237, 6281, 917902, 0, 9010, 2309, 7897, 8173, + 64894, 12469, 7483, 118979, 1736, 10609, 3894, 12228, 9397, 10987, 3383, + 9396, 9393, 693, 9130, 314, 9389, 6209, 9387, 9388, 4932, 3842, 9383, + 5332, 12204, 9285, 10436, 8185, 41808, 1751, 273, 8165, 13166, 2313, + 65449, 7948, 9236, 8544, 4528, 2584, 6301, 41880, 6133, 10484, 9463, + 917823, 9339, 7943, 3757, 3147, 195092, 12420, 10421, 120488, 2310, + 41112, 2326, 9382, 2565, 9380, 7596, 7921, 9375, 9376, 1683, 9374, 2567, + 8596, 12444, 4044, 41274, 12527, 8210, 120756, 1023, 474, 12331, 0, + 42032, 8744, 726, 9839, 120313, 5005, 120383, 41276, 42030, 5007, 12522, + 9835, 65442, 4951, 634, 12213, 10895, 65492, 274, 120236, 1858, 4744, + 4746, 917852, 9548, 65899, 403, 120117, 12503, 9610, 8068, 8197, 63996, + 699, 42000, 41665, 1819, 10496, 13007, 42182, 7581, 13262, 194649, 41667, + 12506, 10840, 1923, 13084, 12500, 64507, 12509, 64393, 10507, 120692, + 10589, 6464, 41047, 2996, 1937, 41931, 12990, 8084, 4047, 3608, 8281, + 65016, 1107, 68101, 9076, 8862, 120636, 293, 9369, 64766, 64791, 7803, + 13222, 65416, 10579, 8560, 8546, 11553, 12678, 4803, 9043, 1739, 1941, + 498, 64471, 1713, 119091, 12529, 8042, 11407, 2344, 12528, 6297, 2414, + 64139, 66710, 3231, 11716, 6422, 9902, 65156, 12530, 2537, 969, 41429, + 12658, 13034, 6165, 13035, 917620, 6632, 4719, 469, 119240, 4363, 5211, + 8914, 119299, 119334, 1772, 1435, 64876, 2969, 6046, 64812, 6208, 64101, + 5746, 12215, 119332, 4931, 1951, 8612, 119363, 9607, 917904, 338, 118797, + 5061, 10675, 41106, 10767, 1491, 8115, 65459, 11941, 10139, 8227, 8270, + 1218, 12126, 41993, 12168, 6642, 63808, 12889, 1622, 41108, 4486, 41995, + 1075, 1958, 10925, 41992, 41506, 118975, 10249, 64122, 10257, 41569, + 10273, 120327, 7692, 12669, 8008, 120320, 330, 8566, 65083, 9046, 41117, + 41126, 12532, 120648, 64131, 3508, 7794, 119943, 64129, 9645, 64662, + 10770, 3669, 3968, 64115, 66644, 13028, 120302, 12537, 194802, 64120, + 65720, 12536, 2350, 13029, 6583, 120072, 12116, 13030, 66678, 4527, 1588, + 12538, 8409, 65718, 10683, 41670, 787, 9502, 4948, 12484, 4032, 118940, + 7449, 65399, 6207, 120536, 6117, 65401, 8412, 65247, 7438, 8734, 644, + 9769, 41657, 10149, 3659, 9533, 184, 1553, 10827, 12488, 65382, 10502, + 41556, 12623, 65474, 2354, 120214, 8220, 118856, 6295, 901, 41510, 7953, + 118826, 5157, 4020, 63811, 11927, 66584, 13079, 194959, 41687, 64303, + 120735, 7520, 848, 9868, 65620, 6424, 194714, 65916, 66495, 64094, + 118926, 7877, 2352, 41826, 120726, 64576, 11289, 1407, 10911, 65607, + 13026, 120503, 7941, 11715, 8362, 8903, 9777, 66715, 1871, 5869, 8636, + 120290, 1343, 65160, 12649, 9325, 13025, 6283, 11738, 12643, 194623, + 65181, 11741, 8543, 10051, 9216, 8263, 11279, 41258, 8625, 118840, 11290, + 10477, 3136, 8733, 11582, 8315, 13022, 8772, 64588, 0, 6152, 41456, 5477, + 6629, 10112, 19916, 13020, 66723, 8675, 120324, 194766, 67600, 120351, + 10978, 8029, 6091, 120350, 4485, 3335, 64591, 3590, 9776, 41397, 66578, + 5215, 194750, 3333, 1632, 63900, 3588, 3342, 9341, 5363, 12957, 12725, + 68113, 63852, 64076, 223, 64079, 1611, 13246, 13018, 65835, 63792, 65245, + 3337, 1171, 11275, 11736, 41097, 1805, 6482, 41423, 64113, 11945, 8708, + 13046, 8838, 425, 4025, 5013, 41868, 120235, 2392, 13047, 4530, 120105, + 10617, 1213, 119233, 120103, 797, 118814, 7888, 13050, 120349, 64387, + 4115, 65557, 65862, 65587, 3277, 8929, 4947, 41055, 195072, 64276, 426, + 66497, 13045, 8251, 10136, 7751, 120109, 8371, 119253, 1224, 12806, 8768, + 13044, 10701, 1764, 3101, 64469, 8480, 1078, 9757, 65223, 41057, 65567, + 120572, 8663, 9312, 4413, 4539, 3787, 42160, 9222, 67617, 9165, 1572, + 9092, 12593, 41961, 2346, 12724, 8958, 66653, 9646, 3773, 41825, 1293, + 7947, 12003, 120228, 13043, 8056, 2454, 5349, 208, 194718, 65869, 64849, + 65888, 8816, 10699, 6408, 0, 7825, 5661, 917587, 12595, 3603, 41109, + 2398, 3548, 1157, 64291, 8638, 68167, 917821, 3115, 194771, 11321, + 118787, 8235, 4405, 10086, 4876, 194808, 195085, 119256, 65430, 10624, + 6079, 12646, 10764, 8158, 41561, 41472, 998, 13051, 13105, 3143, 120156, + 194673, 41559, 1896, 7882, 13052, 118948, 5665, 530, 65814, 11269, + 120566, 12002, 64526, 5742, 5664, 4692, 8979, 12310, 4007, 5004, 11330, + 7896, 751, 6595, 3382, 63959, 66373, 13231, 11533, 64874, 4732, 6311, + 194936, 11596, 63976, 1626, 63977, 10110, 64056, 41705, 6420, 6598, + 64327, 6599, 2795, 4910, 65308, 118825, 119328, 6275, 6597, 41699, 8340, + 119335, 3229, 6423, 42774, 11019, 65390, 5407, 12823, 2331, 41678, 42026, + 6137, 2336, 7524, 194816, 66720, 42759, 8339, 1921, 120003, 19927, + 195038, 822, 64870, 9903, 4284, 119593, 194648, 43010, 12841, 9229, + 10956, 41255, 12607, 5311, 1795, 965, 3521, 10587, 5774, 8325, 917931, + 65403, 917915, 1854, 10794, 119250, 10057, 6294, 3144, 64780, 5280, + 65019, 4344, 12905, 41610, 6076, 748, 12385, 768, 535, 442, 9507, 194641, + 119346, 10556, 2475, 12388, 4889, 8968, 6071, 3593, 64093, 4804, 2342, + 917797, 1800, 120098, 4894, 467, 4890, 120342, 64644, 120707, 4893, 8421, + 12433, 10666, 4888, 502, 64080, 64615, 41490, 120142, 12043, 10119, 316, + 65878, 10230, 65191, 41297, 64924, 64086, 64746, 2332, 4860, 412, 65728, + 11997, 12432, 9583, 8058, 5546, 8019, 194597, 66561, 63750, 12203, 5544, + 2355, 8913, 65725, 4875, 10613, 66692, 12137, 5548, 9344, 6250, 7944, + 65582, 13104, 6077, 12383, 64519, 119132, 11301, 3134, 119339, 65696, + 4669, 917812, 917789, 194894, 3050, 63839, 10319, 119075, 10383, 118842, + 4592, 11008, 10809, 194800, 4691, 6543, 9345, 621, 917597, 120055, 4328, + 10734, 120032, 64631, 917906, 7804, 19904, 10811, 8457, 10545, 4914, + 10271, 3786, 8886, 4917, 66461, 64914, 7923, 3716, 5464, 9996, 8508, + 2361, 7971, 8195, 194706, 9566, 7682, 3722, 8086, 41707, 10845, 545, + 2312, 40977, 10050, 10874, 8305, 8859, 41458, 40980, 65110, 13202, + 195028, 12582, 9119, 2787, 7920, 41521, 4021, 6288, 7985, 119349, 5653, + 65802, 10891, 7698, 5658, 410, 41552, 1802, 12220, 4913, 120466, 41659, + 41671, 1827, 917894, 64396, 41668, 9077, 2327, 8810, 11422, 120372, + 12705, 3860, 10756, 9239, 8821, 6153, 2867, 119118, 42158, 698, 120359, + 8749, 10356, 12698, 64858, 361, 12641, 845, 194599, 41560, 11970, 4562, + 63756, 2926, 119566, 4099, 66439, 194695, 7936, 120303, 611, 68124, 4716, + 118891, 41382, 119207, 7686, 120568, 194595, 68178, 120543, 118875, + 119612, 6291, 5462, 10823, 41669, 9734, 65455, 9071, 4655, 4151, 13295, + 0, 66632, 839, 42162, 7695, 8769, 65246, 10737, 119194, 4859, 64467, + 65504, 4826, 64157, 41090, 917837, 6647, 64727, 66447, 63845, 2700, + 12576, 7842, 12839, 120825, 804, 2699, 66596, 10542, 2985, 119222, 64806, + 8271, 10091, 11915, 9468, 119312, 9827, 64106, 119311, 286, 12323, + 118830, 11481, 118942, 119305, 1425, 35, 119229, 65084, 66694, 41210, + 64432, 8482, 119113, 6090, 5032, 7812, 10534, 7894, 664, 119588, 5034, + 4272, 65211, 40967, 40965, 42024, 12704, 13294, 66589, 64869, 6032, + 120367, 9129, 7430, 917922, 119609, 68112, 194813, 5244, 6130, 65714, + 41161, 5518, 4174, 1879, 8189, 968, 12222, 1169, 434, 11541, 66573, 6034, + 9739, 64744, 12574, 118867, 194995, 524, 118990, 118934, 788, 120433, + 12679, 64506, 64150, 1663, 10419, 8574, 41227, 118805, 12346, 12855, + 64848, 41030, 10415, 41562, 120599, 65623, 118850, 64571, 0, 19939, + 67614, 959, 8885, 12564, 64333, 118855, 9469, 5195, 5445, 9355, 64323, + 42151, 4644, 8989, 221, 310, 41253, 41564, 8010, 119301, 4962, 63766, + 8855, 10054, 6497, 9091, 917544, 9012, 19958, 12088, 41002, 13215, 65047, + 10451, 64260, 374, 120153, 816, 64634, 120148, 120054, 41934, 3873, 8367, + 917784, 64608, 4715, 6101, 11987, 41936, 194572, 4879, 12723, 65089, + 11683, 307, 120416, 9585, 5374, 64286, 1462, 10235, 41390, 8627, 65579, + 12119, 65028, 13024, 1929, 120426, 12142, 8611, 12236, 41419, 194618, + 66507, 12982, 64374, 5378, 194666, 64295, 41421, 917838, 741, 10083, + 119309, 65026, 821, 65350, 2498, 5800, 10755, 2992, 1760, 8124, 4469, + 2324, 828, 3611, 119084, 757, 1185, 120271, 531, 120728, 10628, 119020, + 120437, 7999, 8204, 3614, 2827, 9696, 10942, 7713, 2348, 4354, 10904, + 4380, 19936, 7833, 10573, 5320, 41240, 862, 3000, 10301, 1810, 3673, + 5137, 9525, 64569, 9354, 65622, 0, 7566, 10121, 64940, 120716, 66693, + 12824, 13066, 3062, 7970, 64741, 12608, 194600, 5871, 41160, 9700, 12580, + 917591, 65748, 119811, 3967, 7898, 13137, 8775, 64560, 12713, 2963, 9090, + 8410, 4454, 723, 1734, 966, 4449, 917815, 64594, 2456, 231, 2320, 120225, + 339, 4968, 120535, 40989, 8075, 1230, 120795, 8047, 3597, 9761, 10584, + 41542, 65404, 1290, 66358, 8352, 917874, 5687, 66698, 3840, 1584, 119963, + 6045, 0, 10498, 9704, 64136, 64138, 10992, 7537, 12311, 8660, 120357, + 8365, 8643, 65029, 119049, 4483, 1709, 64399, 7466, 6080, 13092, 64140, + 1746, 6072, 8667, 12121, 65604, 13140, 11414, 65031, 2531, 4480, 120765, + 64141, 1226, 1259, 7517, 10394, 41231, 10897, 120257, 605, 67619, 641, + 5219, 12342, 64100, 41500, 41129, 311, 11453, 6221, 9075, 120358, 5466, + 10877, 118868, 11451, 120737, 4535, 2667, 4271, 65406, 64188, 345, 41410, + 10829, 41198, 195027, 41407, 64104, 5037, 41131, 1776, 8422, 11266, + 64103, 41508, 4660, 323, 65305, 917813, 6649, 1295, 120010, 4625, 2563, + 4630, 247, 119135, 119870, 12338, 4651, 2668, 6657, 194941, 13223, 11933, + 2519, 119973, 41903, 41079, 5053, 194787, 5049, 119924, 11335, 706, 7754, + 7727, 8738, 4031, 6278, 5009, 9672, 649, 5514, 118920, 66702, 10280, + 12670, 1013, 41218, 3877, 705, 41591, 8755, 194900, 1183, 4184, 8268, + 65918, 65301, 8157, 9736, 64503, 65418, 118921, 4747, 4712, 43013, 11913, + 4718, 194632, 10837, 5141, 10614, 65733, 7962, 12211, 9837, 65831, 64722, + 119008, 5719, 65706, 9773, 119068, 119147, 1857, 65547, 4626, 8464, 859, + 194795, 4629, 8499, 6059, 41134, 4624, 7818, 8535, 119914, 65179, 7805, + 64805, 11488, 12242, 41011, 120220, 64119, 10558, 917955, 917918, 118950, + 8492, 8250, 8459, 120597, 1788, 1579, 10766, 64117, 195050, 8048, 9543, + 9028, 120522, 64516, 65849, 13185, 1285, 64114, 120777, 8240, 8684, 8170, + 6102, 41762, 5298, 12625, 5294, 65204, 42013, 3940, 41597, 119917, + 917873, 9816, 8665, 65851, 11436, 12630, 1653, 64669, 10153, 120601, + 6166, 118791, 118989, 41377, 5292, 66673, 65046, 1939, 913, 3970, 64599, + 12455, 1793, 66637, 120162, 118837, 6643, 8211, 65263, 0, 194703, 64127, + 64081, 119125, 3514, 13219, 9569, 10865, 11958, 5263, 13286, 64126, 5500, + 10022, 65387, 65500, 65384, 5322, 980, 66354, 10008, 5324, 66600, 3784, + 41614, 64751, 6230, 194767, 63885, 10085, 3360, 8098, 11523, 6634, 41734, + 10096, 41613, 8072, 119321, 119322, 41821, 1249, 7783, 41731, 12032, + 8237, 63840, 64899, 12395, 7425, 12818, 120565, 10462, 41150, 194574, + 9795, 66680, 64664, 13213, 194601, 120222, 41152, 194679, 9249, 6565, + 7808, 1829, 120479, 11670, 4358, 65315, 6670, 11426, 194865, 120223, + 12391, 1710, 12160, 10168, 8777, 9781, 49, 6627, 66708, 6258, 8269, + 120594, 9741, 194923, 5649, 119100, 315, 12813, 1643, 119988, 12397, + 3470, 8884, 65175, 41099, 65314, 13299, 1378, 65163, 1072, 120607, + 118802, 3066, 6576, 119300, 120002, 65675, 1080, 41293, 8787, 194828, + 1101, 41618, 120001, 8405, 0, 12632, 1086, 1869, 42088, 7680, 8847, + 10805, 65884, 12639, 3380, 8123, 1091, 6121, 7977, 4501, 12665, 8119, + 12998, 66309, 917927, 1494, 11693, 3127, 194567, 64945, 12930, 1394, + 119230, 65872, 12363, 5345, 9789, 2998, 9527, 120659, 64582, 12977, + 12309, 42090, 3861, 10635, 12939, 12404, 12413, 42003, 2495, 5848, 8726, + 5570, 1881, 12410, 41722, 1012, 8100, 7890, 120296, 11298, 10649, 5569, + 6229, 1593, 65319, 6063, 619, 65128, 65080, 6053, 65602, 4120, 65337, + 64372, 9160, 917928, 119214, 11776, 9366, 9016, 42006, 6055, 3870, 4279, + 2500, 10757, 1507, 8497, 8602, 65316, 13021, 65334, 65333, 11694, 65331, + 42059, 42061, 9080, 120099, 9128, 64480, 5571, 3674, 9740, 9121, 4371, + 5798, 10408, 42085, 10107, 4106, 41989, 65313, 42074, 63999, 11326, 0, + 10233, 13098, 65813, 41239, 10094, 195026, 8182, 0, 119831, 68152, 11947, + 9803, 5847, 1505, 9131, 65161, 4615, 12695, 41988, 41250, 12175, 917864, + 19966, 119582, 7809, 120626, 120445, 562, 8120, 6590, 194565, 13033, + 64738, 3219, 68097, 10664, 1366, 1037, 67623, 4551, 65545, 68131, 66334, + 10637, 4568, 549, 1570, 10478, 2835, 12517, 557, 9457, 5952, 64649, + 41056, 12519, 41004, 119307, 2825, 66636, 10825, 8079, 2821, 41046, 0, + 42071, 12111, 3927, 13071, 12515, 452, 5271, 5492, 64718, 2831, 10604, + 10144, 11465, 5212, 5493, 41120, 8916, 13027, 9747, 12019, 41332, 1618, + 12069, 917584, 1668, 10430, 917766, 5853, 1187, 10363, 1121, 12956, + 120656, 119107, 11314, 3240, 12060, 12194, 65180, 41631, 11591, 5323, + 8166, 4557, 6415, 2707, 8309, 1623, 65297, 41052, 571, 2697, 4918, 11339, + 4912, 2695, 11598, 65048, 66438, 8864, 64755, 64798, 10736, 2693, 12125, + 7615, 12826, 1164, 194583, 6411, 1035, 41067, 119142, 7881, 701, 9758, + 3489, 119296, 7469, 11569, 5248, 12218, 120538, 6303, 3796, 41123, 65688, + 3994, 11421, 10457, 9991, 41128, 64485, 5792, 12347, 9873, 42171, 2855, + 7994, 64762, 6104, 65351, 6591, 9340, 9532, 1589, 119226, 296, 3246, + 7906, 2879, 41981, 41620, 64942, 7815, 65855, 120482, 917817, 66457, + 10585, 12579, 1496, 747, 6416, 942, 2378, 10960, 11618, 5299, 0, 9320, + 5449, 1232, 8139, 6216, 41431, 917970, 11409, 5295, 66624, 64392, 1223, + 1642, 174, 120824, 11612, 4161, 2374, 120546, 8475, 3212, 66313, 3211, + 194576, 5286, 119297, 0, 64142, 9728, 3846, 8070, 5536, 6636, 7705, + 11942, 11305, 12136, 3309, 67612, 66377, 41491, 66325, 4986, 12189, + 41653, 1280, 1241, 917537, 4257, 8496, 67608, 6220, 9004, 65411, 65203, + 41513, 41650, 120791, 194578, 120608, 12914, 12884, 194575, 9890, 6078, + 10237, 917943, 1475, 64917, 11979, 6084, 118900, 41064, 41061, 9635, + 12600, 3256, 41236, 42039, 0, 6469, 65377, 8727, 10654, 4679, 41237, + 64073, 64867, 6531, 65285, 65329, 64069, 10640, 3248, 2613, 3261, 9015, + 119829, 66568, 3635, 64337, 41651, 41241, 64944, 3494, 6449, 6555, 10588, + 66588, 120581, 194783, 67597, 635, 13139, 65898, 65613, 65312, 5447, + 68108, 194826, 64382, 4010, 7445, 8600, 41915, 65804, 4176, 41105, 5812, + 65820, 6232, 65891, 68142, 194588, 318, 5302, 195022, 6538, 4335, 3649, + 3941, 41122, 41110, 3634, 64892, 9113, 1954, 12155, 7866, 120297, 11402, + 11733, 64296, 120138, 66470, 2849, 66375, 66697, 7938, 11728, 1761, 4586, + 65379, 350, 10930, 119090, 509, 194792, 119603, 9365, 66687, 542, 5133, + 41680, 64551, 9500, 11534, 1514, 11668, 65823, 5453, 65533, 64921, + 119967, 2496, 8493, 944, 9368, 3890, 1624, 1438, 8817, 120592, 10818, + 41947, 1220, 120828, 63931, 1194, 3242, 1571, 9555, 8598, 11457, 6169, + 943, 564, 2798, 312, 194999, 11532, 66363, 120161, 8877, 269, 3495, 6272, + 9617, 1460, 8988, 120660, 4891, 195031, 10641, 0, 41119, 41416, 917602, + 4173, 120289, 63786, 120574, 12895, 64955, 41418, 11357, 119022, 120286, + 41415, 6296, 9582, 193, 12188, 917835, 64680, 11428, 1730, 2457, 4493, + 2314, 8427, 1362, 9822, 7703, 8840, 5807, 119054, 120451, 8534, 6658, + 4426, 917796, 41612, 42758, 11497, 7874, 8681, 5220, 120281, 13136, + 119825, 2416, 3310, 10972, 63886, 379, 119215, 13220, 63787, 120449, + 3223, 5517, 1284, 8041, 4549, 120475, 5240, 9811, 10012, 3096, 65239, + 42768, 43040, 8515, 8688, 12866, 64146, 3294, 9501, 119631, 1272, 65485, + 7564, 64654, 7467, 65210, 1467, 10158, 10040, 5288, 9519, 41861, 8132, + 64090, 118899, 12193, 66615, 65493, 3215, 917863, 7710, 1610, 65114, + 12307, 63881, 65682, 66465, 5181, 5275, 120195, 228, 8637, 1501, 66676, + 3789, 5179, 11471, 6225, 10765, 11474, 1725, 66603, 8196, 9352, 12042, + 42752, 917543, 9537, 3961, 5762, 1967, 2605, 4500, 63873, 8104, 4981, + 7474, 3405, 64862, 11667, 10414, 9821, 8141, 9559, 2600, 1557, 7589, + 64851, 64549, 3237, 8631, 2545, 10466, 8541, 917616, 194747, 41866, + 917973, 120430, 42762, 7481, 0, 1650, 262, 1637, 10958, 7901, 3238, + 41945, 65556, 41941, 3308, 65158, 10860, 8614, 65220, 7527, 120624, + 41943, 6419, 120244, 45, 6401, 120022, 8106, 4128, 10065, 64083, 4494, + 9590, 4012, 10395, 917762, 9084, 4537, 8737, 64089, 11004, 695, 739, 696, + 7611, 2620, 42755, 194913, 9227, 7506, 179, 5098, 691, 738, 2853, 7512, + 7515, 3868, 688, 119009, 690, 2548, 737, 974, 2801, 119837, 10854, + 119012, 10034, 3985, 8783, 65860, 9362, 10177, 120247, 4682, 118869, + 12809, 6406, 4685, 3158, 10879, 4389, 4680, 923, 41863, 3851, 292, 13002, + 119845, 119844, 3221, 1763, 64468, 4612, 119851, 119850, 12999, 41219, + 11718, 41314, 10782, 3637, 12996, 119141, 11717, 63922, 10594, 3228, + 11712, 64624, 120405, 10967, 2731, 194721, 9651, 651, 3891, 7696, 66706, + 2337, 1735, 120630, 917891, 4177, 11283, 9089, 66312, 64695, 120580, + 11438, 1860, 2654, 7580, 1856, 7497, 7584, 194722, 66356, 10914, 3458, + 3208, 12975, 8498, 119121, 8949, 3065, 9450, 120472, 1569, 63888, 12534, + 12124, 7690, 119254, 12533, 120251, 6418, 4543, 41471, 917629, 64674, + 42180, 194881, 0, 10859, 917615, 41544, 41689, 63789, 12282, 64909, 6646, + 11790, 8108, 8850, 9238, 5066, 8561, 4573, 13108, 6421, 12791, 119849, 0, + 8257, 12891, 8778, 10630, 12900, 917992, 10950, 8314, 6459, 12790, 8804, + 65092, 41153, 12792, 11342, 42018, 1744, 12789, 10366, 12317, 10137, + 67610, 13164, 10723, 967, 120253, 64546, 12690, 41307, 3257, 65550, 9862, + 1845, 2974, 10446, 11315, 0, 278, 10580, 10089, 870, 66569, 3499, 8609, + 42149, 876, 871, 877, 6002, 878, 42015, 879, 120336, 4563, 65176, 41308, + 7591, 65306, 867, 9520, 872, 8646, 868, 873, 119868, 11514, 869, 874, + 63989, 1940, 875, 790, 220, 65193, 194845, 10678, 10044, 41589, 5429, + 13082, 194585, 6403, 5707, 10393, 120005, 120267, 42067, 41890, 5433, + 10657, 7911, 120266, 1547, 9775, 3959, 119316, 5425, 4977, 2467, 5317, + 5423, 4611, 63843, 8040, 5069, 9679, 4182, 119244, 4676, 120501, 41073, + 4418, 2510, 4628, 10208, 12989, 118784, 10399, 1851, 12186, 119574, + 11908, 120254, 9360, 9083, 13180, 41764, 11601, 12837, 8829, 7711, 64423, + 12115, 67636, 12377, 41281, 8809, 41647, 365, 12056, 10857, 917831, + 41716, 65395, 41228, 119865, 5516, 2845, 7717, 4588, 41717, 63830, 544, + 12045, 2433, 917897, 5515, 3352, 65373, 64377, 65437, 793, 65194, 194740, + 305, 567, 119002, 842, 66627, 8208, 917556, 41695, 1647, 118877, 5608, + 63824, 65407, 818, 5337, 119143, 13278, 65597, 9638, 8061, 8735, 12483, + 120468, 13003, 6667, 10973, 66359, 1372, 118858, 7556, 4969, 1254, 11264, + 989, 64257, 118862, 65228, 6060, 65266, 4326, 2840, 64601, 13068, 194985, + 65242, 3245, 5768, 65601, 949, 119351, 194893, 6148, 8605, 2651, 119634, + 64570, 917912, 119563, 194888, 65106, 120418, 41451, 63871, 41796, 1269, + 6530, 63868, 41777, 6414, 5144, 3226, 655, 752, 4431, 4331, 7452, 3285, + 41834, 5279, 12908, 10336, 8312, 41754, 12091, 671, 250, 7434, 618, 668, + 610, 6428, 7431, 1152, 5256, 640, 41229, 7448, 1067, 255, 3905, 65196, + 9493, 65588, 41014, 10795, 194791, 194741, 120421, 917772, 10653, 41272, + 195001, 13287, 917805, 6560, 9019, 118943, 195052, 65409, 987, 64410, + 5527, 2768, 10684, 3365, 5135, 118924, 12796, 11953, 120412, 65732, 5139, + 346, 11334, 6305, 12609, 4675, 5168, 5530, 5210, 917774, 4627, 8253, + 5208, 1136, 65433, 120587, 5218, 7976, 118864, 11963, 3244, 5529, 0, + 194742, 917794, 5432, 64258, 4041, 8784, 2357, 11521, 5528, 229, 42140, + 65876, 12350, 65848, 119881, 12241, 119197, 4000, 7429, 7428, 665, 7424, + 3206, 7770, 7884, 64853, 0, 65838, 194779, 211, 2509, 7790, 10470, 7861, + 3220, 9156, 64050, 450, 8951, 5214, 10432, 8118, 5450, 10768, 1233, 4661, + 5852, 8984, 66338, 41802, 1708, 1839, 40985, 2623, 10927, 1701, 195064, + 2388, 4698, 41761, 1066, 8361, 4701, 41758, 5444, 2617, 64889, 8267, + 66645, 65610, 194642, 7516, 118958, 2625, 8801, 3053, 4340, 120139, 3631, + 10955, 7850, 120292, 8416, 119977, 4008, 65507, 12644, 12660, 8232, + 12156, 194807, 194624, 41069, 41719, 65812, 12099, 4310, 4336, 6252, 713, + 41068, 7990, 3990, 119203, 65113, 64638, 5017, 13145, 4489, 118959, + 42138, 1030, 5358, 64577, 9513, 10196, 9357, 194764, 1773, 10250, 10258, + 2712, 1635, 7745, 1410, 12077, 64650, 94, 1880, 120149, 194731, 8908, + 559, 118879, 12862, 194984, 10752, 4892, 10876, 64537, 6542, 8732, 8472, + 5777, 1757, 759, 4696, 2586, 65248, 8945, 8466, 3641, 5419, 41803, 42062, + 67596, 118806, 120344, 3668, 65754, 8610, 12226, 7592, 856, 2340, 936, + 13289, 64478, 66631, 1459, 65747, 10499, 2962, 19953, 2321, 1504, 10465, + 41312, 8921, 120548, 7529, 65154, 64525, 41901, 63814, 4113, 2949, 2372, + 336, 194774, 2958, 12152, 5348, 682, 2395, 65252, 13291, 7513, 10593, + 1703, 4013, 64764, 8033, 120064, 65152, 9810, 6534, 4150, 12970, 8318, + 41790, 10109, 41893, 2360, 41794, 12858, 120493, 3999, 3777, 65629, 1965, + 9796, 2411, 11336, 799, 195097, 10276, 10308, 10372, 41714, 8501, 63833, + 2317, 10260, 41317, 65767, 5417, 917969, 10384, 120073, 9353, 917546, + 7753, 2351, 6655, 64489, 6569, 13119, 119812, 41287, 119236, 230, 11293, + 12009, 119813, 4855, 4165, 8746, 5441, 9654, 10288, 10320, 65665, 855, + 120396, 6109, 4784, 12337, 13270, 7786, 10098, 41147, 194570, 63769, 680, + 6274, 10312, 1181, 19915, 3174, 13127, 120011, 64822, 41887, 41444, 4862, + 9735, 6537, 119237, 66650, 3914, 41037, 10828, 9007, 12961, 41039, + 118861, 9033, 6231, 289, 65302, 4694, 11420, 4690, 120654, 42760, 194898, + 4693, 63816, 40987, 4667, 4688, 120591, 8828, 194637, 65763, 1246, 3110, + 19940, 12197, 11021, 4749, 917895, 43035, 921, 218, 64868, 1520, 242, + 4786, 1566, 8217, 8932, 64653, 7834, 10088, 6548, 118908, 64681, 5313, + 951, 8888, 64534, 4816, 7604, 43032, 4009, 194694, 194717, 65440, 41549, + 119069, 12340, 119138, 119887, 4689, 119888, 4048, 120158, 119209, 6507, + 1646, 41755, 119891, 4040, 194734, 65118, 68134, 2579, 119905, 3177, + 8207, 9099, 4107, 120130, 119894, 662, 120706, 9244, 66623, 13059, 10084, + 120339, 65669, 65836, 10179, 41929, 3399, 9851, 40991, 8739, 9059, 0, + 7687, 64637, 8854, 40993, 52, 13241, 6475, 917901, 120444, 1777, 9151, + 1137, 118914, 749, 65169, 120584, 5385, 3978, 65842, 120283, 11592, 5989, + 65827, 10170, 65013, 6544, 41685, 64702, 119365, 8425, 41684, 917780, + 519, 10369, 11740, 1585, 194987, 9888, 422, 1500, 10305, 986, 41170, + 3666, 5781, 5599, 3098, 2494, 120202, 4861, 0, 64334, 63986, 6558, 64818, + 41221, 42165, 8961, 252, 10243, 10245, 63936, 917505, 120398, 194707, + 63751, 9478, 2508, 9060, 119587, 202, 10761, 119114, 1242, 12899, 120447, + 11734, 63940, 11730, 917937, 9593, 10543, 2403, 12979, 64609, 0, 9787, + 2504, 9784, 41024, 7764, 42076, 9514, 64132, 5859, 119259, 2858, 8298, + 12333, 65040, 65478, 9691, 4971, 12992, 2753, 1936, 917877, 8456, 2751, + 12662, 2763, 8953, 42104, 10731, 7774, 4780, 9792, 63990, 194753, 194871, + 194693, 118927, 2856, 10019, 47, 10482, 2823, 4365, 120629, 917551, 3647, + 7899, 2602, 8417, 65903, 917558, 41135, 118824, 4033, 118854, 194761, + 172, 194720, 212, 41137, 1889, 12320, 6545, 64623, 917859, 7597, 8915, + 2759, 945, 3732, 120230, 917567, 5344, 194851, 1291, 11485, 9062, 119252, + 9531, 13155, 8505, 64479, 12062, 119018, 64703, 65487, 42065, 10900, + 10370, 1263, 3720, 12048, 63935, 64292, 41524, 64692, 12652, 6099, 41534, + 64133, 63933, 64426, 299, 65540, 118859, 63951, 3524, 12933, 8831, 65752, + 8674, 3075, 119890, 8245, 917867, 12624, 120559, 1673, 4811, 63928, 5845, + 9338, 3046, 65414, 2581, 4001, 41811, 9820, 64098, 12187, 5551, 68114, + 5984, 63791, 120687, 4393, 10566, 68182, 8680, 65555, 118851, 2588, 5422, + 65900, 43028, 3491, 2471, 917626, 2883, 2749, 63921, 195054, 7492, 7740, + 119355, 119134, 675, 120551, 63924, 194568, 7502, 6219, 63926, 65726, + 41232, 9329, 63925, 7610, 219, 63945, 41330, 692, 65200, 120775, 9240, + 3181, 9688, 119816, 1222, 65775, 8262, 11785, 64530, 0, 64610, 3092, + 12092, 9615, 7453, 120128, 8013, 119857, 120456, 195019, 8895, 5253, + 65774, 5458, 917816, 922, 65923, 119318, 11338, 194930, 3218, 12618, + 63997, 120469, 11664, 8962, 8569, 9641, 11932, 12202, 3214, 120461, 9604, + 12053, 3207, 120465, 63826, 1901, 63939, 120141, 63825, 2844, 3205, + 41974, 41286, 12139, 65666, 64708, 119580, 3358, 2606, 119364, 3104, + 2608, 11496, 1173, 10901, 5308, 120079, 290, 917988, 11779, 2862, 2792, + 64498, 66371, 378, 2610, 66591, 65079, 6552, 65372, 66707, 37, 64195, + 120154, 1814, 64860, 3209, 118843, 120804, 10638, 9768, 64648, 917984, + 66372, 7606, 2591, 2837, 4341, 41403, 64105, 42159, 5233, 65270, 64792, + 120794, 3570, 9112, 119948, 863, 9490, 63761, 1685, 595, 12715, 118871, + 1292, 6222, 65705, 3654, 66638, 9637, 120268, 2535, 6541, 119181, 10656, + 120246, 3243, 9014, 5606, 63762, 538, 11006, 5602, 7807, 8073, 6547, + 10629, 8203, 63994, 3056, 8458, 41778, 8495, 8762, 10508, 917552, 779, + 9818, 64367, 2465, 3463, 8193, 65721, 9730, 8695, 4738, 11322, 5811, + 4346, 64904, 194735, 504, 64321, 10899, 8982, 119954, 0, 0, 782, 4867, + 10883, 1262, 64771, 732, 3737, 194954, 1548, 13151, 120589, 1832, 5604, + 5611, 41141, 7460, 4376, 64612, 11991, 3745, 41738, 10011, 1502, 65712, + 194670, 3869, 11937, 5702, 3655, 1783, 119899, 5728, 120564, 13285, + 42174, 11918, 9603, 5724, 5254, 5727, 7724, 119573, 119901, 764, 5129, + 120655, 120460, 10597, 7579, 5614, 5893, 6223, 11720, 42073, 11423, + 119863, 64409, 119862, 4792, 917770, 1964, 6559, 11726, 12146, 65378, + 10687, 43019, 119629, 894, 300, 65744, 10037, 12223, 118936, 1478, 9783, + 2562, 2607, 64740, 64830, 0, 11652, 917627, 11777, 41780, 6132, 64946, + 5096, 5095, 2863, 3424, 0, 10454, 68146, 5094, 10093, 4369, 13156, 12306, + 5401, 5093, 119909, 12004, 65251, 5092, 526, 11327, 41295, 5091, 176, + 41691, 8985, 4104, 119911, 6285, 1215, 11985, 5744, 12272, 9832, 65590, + 3713, 13218, 41191, 119343, 8980, 118988, 12293, 8844, 7433, 11794, + 42036, 4278, 1737, 8987, 12917, 195068, 9074, 4348, 9335, 7760, 118991, + 6553, 10339, 5255, 1786, 661, 120126, 5475, 917876, 41854, 68102, 194754, + 12419, 1160, 1267, 68143, 41217, 65858, 10018, 360, 67586, 3621, 64635, + 5863, 3137, 11345, 6562, 12928, 41216, 1228, 2616, 119190, 64401, 65234, + 10745, 1714, 3135, 120637, 120143, 0, 3142, 119186, 119995, 10819, 64163, + 6577, 65772, 64, 1470, 194566, 10291, 6227, 2826, 41749, 66433, 119864, + 6163, 9708, 13250, 0, 42011, 41224, 8603, 12206, 5839, 1702, 1240, 41461, + 6286, 119882, 5834, 66451, 3858, 119089, 1765, 12086, 42001, 1600, 13228, + 64729, 0, 8401, 120520, 11310, 9282, 8882, 118929, 10479, 2570, 2852, + 5367, 4601, 120818, 64075, 1234, 6540, 13115, 66310, 12667, 194686, 5002, + 10147, 12935, 917601, 194965, 118829, 194672, 8163, 6551, 12727, 120744, + 120533, 41289, 0, 13129, 2864, 8977, 602, 10435, 9395, 41675, 119554, + 2765, 64540, 41279, 120414, 65924, 0, 119922, 66662, 119220, 10887, + 65206, 118963, 64920, 66593, 63914, 12150, 263, 120012, 41288, 917982, + 9633, 10886, 119042, 7831, 12067, 10381, 917978, 11484, 8076, 43048, + 8290, 8291, 43051, 65833, 11616, 2596, 10852, 10285, 13113, 120711, + 42019, 2393, 8766, 9087, 750, 65232, 41574, 10163, 11015, 63913, 10441, + 5954, 10225, 4314, 65856, 198, 917956, 730, 41441, 7819, 120199, 917555, + 13165, 1720, 63905, 8619, 678, 6529, 68122, 41654, 3751, 917769, 119923, + 4262, 1798, 709, 917841, 1354, 1876, 13152, 6557, 3892, 8137, 10449, + 120035, 120428, 41470, 245, 41045, 11456, 41233, 64801, 120315, 497, + 6136, 5953, 65677, 7796, 41235, 65434, 42045, 9804, 8449, 432, 1281, + 64355, 65393, 64339, 10677, 604, 7511, 9120, 1859, 65541, 10460, 3425, + 917870, 65782, 2836, 8797, 8490, 9052, 64888, 120206, 2356, 95, 64786, + 1738, 120415, 194654, 2832, 64640, 9670, 6096, 917871, 64918, 65151, + 10063, 2822, 12199, 4436, 194852, 2566, 11971, 12090, 13064, 1065, 1331, + 119097, 0, 2576, 12708, 41142, 5090, 5089, 120263, 9505, 67595, 514, + 41692, 319, 2921, 11659, 9477, 5772, 12968, 5087, 118822, 41310, 96, + 2580, 0, 10522, 41223, 5085, 1463, 41342, 11346, 5293, 10550, 64389, + 3733, 3772, 13090, 12054, 4748, 12482, 64300, 12575, 13091, 63982, + 194794, 6677, 7601, 119078, 41413, 64419, 118953, 195086, 195100, 66648, + 118945, 64597, 10939, 6106, 65757, 1270, 1132, 120746, 4534, 41270, + 66655, 9224, 65574, 66331, 64761, 917881, 3671, 8510, 120695, 65770, + 41275, 120823, 917935, 10807, 7963, 42012, 119877, 568, 65227, 6187, + 13109, 3854, 41479, 13141, 9715, 66696, 8258, 13253, 4185, 41334, 65148, + 8871, 42, 8509, 0, 4102, 120258, 7458, 118995, 65863, 2353, 6308, 41604, + 7457, 2611, 7456, 41021, 120563, 194631, 66336, 8045, 11550, 12946, 4484, + 8747, 118976, 11789, 41065, 5557, 11990, 9737, 13216, 3747, 9467, 5291, + 8878, 1691, 41226, 7451, 7435, 10146, 10905, 9086, 64566, 697, 194675, + 628, 7454, 12594, 65261, 10468, 4546, 7731, 65256, 12010, 0, 120598, + 3805, 64304, 64293, 120284, 9844, 68111, 6307, 19949, 0, 7544, 12166, + 64697, 10516, 120074, 10152, 12648, 10354, 0, 7602, 5785, 41309, 9764, + 41316, 65877, 194640, 13230, 41299, 5559, 119835, 8704, 2397, 5556, 9877, + 66368, 13122, 9011, 191, 9630, 41837, 42040, 5506, 119842, 120697, 64850, + 41072, 12598, 8845, 41577, 194790, 10002, 8889, 6533, 11620, 41570, + 41838, 683, 396, 41580, 12526, 917610, 12901, 12351, 65115, 343, 7552, + 120553, 41360, 9898, 10481, 4559, 0, 1956, 118857, 917836, 64048, 1724, + 1210, 119323, 9412, 3739, 6263, 1886, 194869, 3964, 6592, 38, 8533, 9234, + 10947, 65073, 13063, 194752, 1778, 3956, 65091, 42070, 6563, 119324, + 8743, 8369, 11739, 10941, 12467, 65722, 5547, 66618, 120432, 120513, + 8175, 8843, 284, 2429, 934, 5696, 917996, 173, 65560, 8652, 12699, 11650, + 1750, 120709, 4394, 65056, 1807, 6613, 12606, 64528, 5889, 63783, 917949, + 64714, 41848, 11516, 12162, 12120, 12478, 1721, 7767, 7891, 65864, 10563, + 2583, 4512, 63973, 2462, 7693, 1837, 10434, 3855, 8107, 41337, 63972, + 4952, 65413, 64405, 5504, 41340, 3975, 65715, 65716, 65420, 12672, 3798, + 2703, 194709, 64347, 9349, 9774, 41847, 1127, 455, 41095, 3962, 10100, + 3483, 41101, 3954, 6457, 4513, 9104, 3503, 7688, 41298, 1468, 65386, + 1864, 41851, 63970, 41446, 2540, 7736, 41080, 41849, 917619, 4320, 3224, + 12909, 9705, 41565, 8604, 118903, 1510, 11306, 6149, 3887, 11393, 1411, + 2824, 194708, 10106, 8770, 1403, 120811, 1347, 9631, 8671, 65737, 4283, + 64074, 119936, 8640, 13124, 258, 1654, 41408, 8858, 65738, 42139, 3741, + 42761, 4042, 4581, 2873, 11617, 11522, 120114, 8549, 10861, 194784, + 41673, 64829, 1733, 4392, 2568, 10786, 63983, 67629, 376, 41486, 9221, + 64871, 119907, 8823, 41222, 12857, 6217, 7965, 4896, 64911, 10154, + 119108, 41350, 8301, 118823, 7446, 1684, 64501, 10974, 458, 41199, + 917562, 917576, 194798, 11916, 340, 119000, 12298, 10864, 119918, 12288, + 120287, 4388, 1493, 10521, 7553, 4097, 194971, 13080, 11656, 65808, 6610, + 6030, 8059, 3210, 13131, 119073, 194827, 13301, 8794, 41278, 41629, + 12154, 119131, 9461, 64658, 1186, 41571, 6625, 617, 9464, 12691, 3675, + 5207, 63955, 5213, 118896, 833, 41348, 41568, 917775, 3253, 63954, 41088, + 8630, 6062, 41440, 5596, 5545, 119313, 933, 1341, 9842, 5217, 194886, + 8942, 40962, 194730, 68126, 9905, 2635, 64504, 65130, 12620, 7493, + 917577, 7835, 41434, 9002, 19918, 194770, 64558, 194974, 9716, 19954, + 5651, 5990, 900, 5784, 194775, 9317, 119057, 3612, 4011, 64376, 41953, + 5389, 7864, 917548, 65336, 2839, 5600, 3903, 65609, 10447, 3749, 1207, + 7569, 194980, 3501, 194685, 64705, 4403, 19962, 1124, 5597, 195009, + 119921, 9321, 4429, 65810, 120515, 119072, 1719, 7598, 546, 9671, 1125, + 4399, 9542, 472, 7716, 8452, 5488, 41946, 42025, 194903, 5491, 3602, + 8328, 41182, 2604, 41949, 5490, 41183, 5489, 8522, 10287, 684, 6300, + 194777, 2854, 119586, 4390, 454, 7823, 65750, 9875, 7593, 65338, 119310, + 120625, 64487, 8478, 9881, 2394, 2575, 3415, 3746, 11016, 8648, 66515, + 65421, 43047, 119092, 11989, 65142, 418, 65025, 66378, 10295, 8249, + 10391, 41752, 4565, 6640, 41449, 2598, 513, 120763, 6586, 8656, 65826, + 1024, 11621, 7961, 120809, 8941, 917563, 4554, 11681, 9023, 11682, + 120788, 10176, 10964, 119315, 11437, 9509, 0, 1036, 12850, 917787, 1723, + 120577, 9049, 41185, 41579, 2444, 11680, 10705, 11686, 118792, 65224, + 63804, 740, 63963, 120113, 118874, 120681, 5300, 10407, 9459, 194739, + 1875, 66466, 7856, 8121, 10438, 5524, 41698, 2860, 12157, 5238, 120797, + 5690, 5743, 10424, 12065, 65805, 7578, 65859, 195051, 8875, 8694, 9506, + 13254, 5575, 12847, 2413, 68099, 119340, 962, 12176, 1122, 317, 9040, + 119116, 1582, 119251, 1920, 41477, 10173, 827, 10801, 195096, 118798, + 120401, 5223, 496, 10439, 4313, 5226, 12602, 7860, 120627, 906, 7758, + 2842, 6405, 5224, 5487, 798, 5692, 12801, 7791, 1153, 5695, 12100, 64627, + 8054, 9174, 120131, 5691, 287, 866, 233, 4642, 66574, 11556, 7514, 66436, + 65140, 42089, 8830, 9008, 120417, 10524, 41175, 42079, 7587, 65709, 5296, + 120505, 10688, 10663, 917814, 3302, 66478, 6437, 6516, 6515, 6514, 6513, + 6512, 41798, 3920, 8690, 119590, 41201, 12122, 4580, 6568, 6116, 1785, + 41965, 120635, 3021, 42004, 5138, 120129, 194587, 41998, 41867, 4540, + 41179, 194804, 6200, 11462, 5134, 42021, 322, 4643, 5132, 42010, 194988, + 43008, 5143, 64875, 8790, 917807, 65594, 64604, 6626, 8869, 66510, 64400, + 42060, 19908, 9878, 194814, 41133, 10270, 10286, 10318, 10382, 65671, + 4110, 120507, 11286, 10929, 64277, 3234, 66703, 13058, 8617, 41982, 6025, + 120736, 12805, 8767, 194580, 194690, 9597, 41283, 5201, 120293, 6215, + 12714, 6214, 13101, 65282, 120490, 65268, 120504, 64524, 120215, 187, 0, + 10059, 10511, 4963, 9767, 789, 1749, 7441, 64574, 9901, 320, 41948, + 41833, 194831, 3049, 41139, 6471, 9449, 10081, 10528, 42121, 118894, + 120562, 4960, 5549, 119359, 65882, 8485, 4671, 1189, 905, 480, 10985, + 10240, 10610, 5414, 3064, 1745, 4286, 5421, 5427, 9554, 119077, 66357, + 65465, 6653, 8806, 42047, 9442, 6213, 9443, 9436, 7867, 11613, 6236, + 42052, 195070, 2406, 119858, 11430, 4566, 348, 5474, 3801, 3103, 10406, + 5246, 5236, 64395, 195059, 5200, 64305, 41739, 41733, 64518, 10931, + 13181, 41402, 395, 5391, 5198, 8786, 9428, 41259, 5196, 120037, 2691, + 42009, 5205, 41244, 5562, 917578, 118973, 41262, 66364, 64421, 119615, + 41251, 9126, 435, 3979, 12014, 12893, 8093, 9079, 3203, 192, 119912, + 3385, 41266, 64430, 5383, 10294, 10326, 65741, 5738, 9574, 2666, 119861, + 5361, 831, 419, 8256, 10716, 7872, 64583, 66688, 1260, 3149, 5359, 7766, + 6432, 7914, 5357, 916, 769, 2624, 5364, 64739, 6433, 5563, 547, 1943, + 6439, 5560, 4994, 487, 119553, 4497, 3754, 120082, 120615, 9039, 10619, + 41776, 194797, 8716, 41622, 40983, 64072, 41516, 0, 9319, 195024, 41376, + 11610, 3232, 12185, 119928, 119331, 65905, 119347, 41889, 64071, 8634, + 1161, 41895, 118804, 9701, 8622, 41385, 120403, 65612, 120588, 669, 5679, + 41362, 43011, 64210, 11921, 42087, 5678, 120750, 66489, 41364, 460, + 64636, 41352, 41361, 194824, 41366, 0, 3356, 6178, 917, 7799, 118812, + 64068, 7782, 9044, 4974, 677, 119916, 7577, 64189, 41507, 1216, 12504, + 11952, 3349, 194683, 12296, 8927, 4739, 3738, 5802, 120474, 5683, 10368, + 120661, 491, 1549, 119621, 194659, 0, 5682, 6206, 8670, 9891, 5680, + 64297, 10001, 7586, 65580, 1449, 10241, 3768, 65255, 3776, 9095, 7741, + 12684, 41885, 1046, 120547, 5567, 2717, 4620, 5171, 5564, 41967, 41908, + 41786, 5565, 12819, 12578, 64743, 65708, 5169, 5566, 3465, 64694, 3175, + 11904, 1537, 119155, 5176, 5942, 8468, 4871, 10361, 10425, 65697, 65698, + 41991, 1128, 65920, 10548, 9711, 10647, 9408, 9409, 9410, 457, 3662, + 9413, 1934, 9415, 9416, 8802, 9418, 8909, 9420, 9421, 5897, 9423, 5165, + 5126, 9889, 8043, 8950, 65694, 8955, 3374, 9400, 9401, 9402, 8939, 9404, + 3507, 9406, 9407, 119241, 19925, 9499, 10035, 183, 65078, 2631, 119308, + 10636, 41130, 64958, 3996, 120650, 64675, 1667, 41584, 65486, 41582, + 6580, 4332, 64825, 10741, 10726, 12912, 11281, 5899, 8101, 3610, 12085, + 41748, 574, 955, 120092, 5340, 5350, 41058, 5446, 63799, 10875, 64796, + 5442, 65692, 12437, 9782, 5451, 12896, 3616, 64857, 917959, 3874, 7708, + 64370, 5505, 65867, 10345, 10409, 65603, 11909, 65687, 43015, 41038, + 120719, 120561, 4447, 8536, 64701, 65143, 66661, 120194, 724, 42048, + 1455, 205, 917593, 10351, 64618, 8571, 4175, 6588, 119059, 120380, 939, + 41355, 4743, 119154, 5503, 8021, 64622, 119150, 9819, 41357, 8011, 6088, + 5507, 12044, 190, 120282, 10026, 4356, 8188, 1191, 13106, 4417, 10329, + 5476, 8991, 195008, 7827, 120361, 5829, 8550, 67627, 5592, 2919, 64925, + 2675, 5595, 917967, 7918, 4367, 194626, 65554, 5478, 1728, 5594, 120710, + 178, 12972, 5590, 10727, 13067, 118909, 65254, 917941, 9731, 120600, + 64633, 917987, 12113, 13065, 118863, 9252, 12278, 4652, 119041, 12349, + 65907, 194704, 120688, 12887, 10551, 10710, 194833, 195017, 64663, + 120570, 41804, 5199, 9497, 1120, 11429, 8333, 1444, 9486, 7554, 13142, + 4538, 65096, 1442, 6177, 5894, 917833, 11910, 13224, 8278, 5591, 4034, + 9452, 65389, 3334, 64003, 41747, 10708, 194571, 8677, 118828, 1651, 9350, + 8861, 120040, 8836, 1142, 12747, 4396, 10928, 66705, 8922, 8856, 66611, + 4002, 119188, 10442, 10676, 3344, 11012, 64963, 10813, 2592, 12853, + 120242, 66642, 3438, 6536, 7871, 120239, 65516, 12321, 68141, 118890, + 120389, 10007, 11784, 9588, 10126, 4700, 11308, 41994, 65801, 8661, + 41721, 66572, 12240, 119876, 4973, 5573, 12588, 9629, 40981, 119176, + 118981, 5006, 64328, 42002, 64754, 41766, 8825, 13016, 195062, 0, 10346, + 6107, 42093, 9243, 2464, 194677, 6108, 3372, 335, 6247, 64689, 438, 4510, + 5765, 8721, 119878, 4036, 6092, 11654, 65914, 8876, 10303, 8096, 10284, + 3354, 10268, 119830, 9289, 8689, 10316, 3876, 10335, 9725, 42044, 11783, + 917893, 119581, 8050, 120030, 195025, 11603, 194820, 120053, 6589, 843, + 120419, 119260, 120770, 195053, 10117, 66560, 41902, 12829, 6312, 215, + 1963, 13225, 13192, 1953, 9579, 7550, 1256, 3910, 13015, 6242, 41329, + 9662, 41257, 41900, 3366, 10700, 8805, 1742, 5542, 9333, 8202, 120459, + 120232, 41611, 65895, 120159, 120385, 499, 118846, 8593, 119627, 917974, + 41169, 1712, 5932, 8097, 41642, 11519, 119562, 11967, 1775, 65296, 41243, + 118957, 5662, 416, 9458, 64687, 6470, 195081, 66675, 10984, 64386, 64672, + 65274, 12880, 195083, 41172, 41254, 64758, 120669, 41062, 194825, 9006, + 65446, 565, 41760, 5794, 201, 2662, 9419, 11332, 8254, 41726, 10975, + 120173, 1021, 65131, 1022, 4108, 3880, 8023, 1200, 12243, 194991, 5282, + 7507, 41881, 11545, 5891, 64406, 3343, 1636, 67587, 1885, 65024, 3896, + 195056, 9674, 2947, 99, 98, 97, 120571, 64414, 4049, 8221, 64085, 3381, + 194978, 7892, 120705, 10777, 194687, 5867, 3913, 66376, 66722, 64315, + 8039, 1265, 4316, 6309, 118815, 12969, 12596, 66595, 11791, 12541, 5593, + 67585, 5998, 9163, 12300, 6061, 64854, 119, 118, 117, 116, 8930, 122, + 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, 102, 101, 100, + 107, 106, 105, 104, 6436, 194788, 534, 41212, 119599, 1536, 12114, + 120381, 64287, 64936, 64324, 6020, 12716, 10561, 10075, 475, 118888, + 13266, 9144, 64590, 917580, 118887, 65749, 10645, 1212, 5079, 119619, + 8134, 8483, 2913, 6624, 4908, 1866, 1639, 119189, 194762, 8923, 1645, + 12059, 64505, 917977, 194664, 41503, 4817, 5935, 1250, 194727, 8174, + 9600, 9856, 9859, 7916, 9861, 5343, 5258, 1882, 1892, 11304, 10882, 405, + 11454, 4659, 12343, 657, 12610, 4970, 4461, 1134, 1838, 1454, 41242, + 6477, 4468, 5987, 65803, 9762, 4456, 5206, 10720, 194625, 10480, 41718, + 5818, 194773, 8264, 10229, 260, 645, 119827, 7609, 40973, 4821, 4466, + 120500, 5824, 984, 119027, 8791, 5851, 5705, 7729, 41166, 10591, 41797, + 119983, 65438, 66580, 119984, 42101, 41404, 1165, 7879, 4451, 11401, + 194849, 11284, 119987, 66566, 41909, 43014, 2791, 9363, 9552, 3375, 8641, + 5900, 7539, 7889, 2722, 194854, 13173, 2381, 11602, 10994, 10529, 10773, + 11574, 8644, 11581, 12425, 10661, 10856, 9614, 194917, 41478, 11571, + 10064, 8308, 10748, 66695, 11005, 4868, 119162, 1952, 41406, 8455, 10082, + 11575, 8467, 12577, 12721, 5182, 12183, 6145, 41759, 64929, 4465, 42120, + 12135, 5732, 4464, 7728, 3922, 977, 4458, 120043, 120545, 64770, 119556, + 3353, 344, 917963, 41626, 1395, 41939, 65832, 5776, 8558, 786, 65153, + 120191, 64340, 119352, 10202, 120084, 41027, 7612, 10132, 64413, 120087, + 12840, 119119, 119913, 119314, 119139, 63862, 41896, 8657, 194996, 8594, + 10204, 195049, 120477, 120069, 65819, 1399, 41375, 120056, 917938, 8852, + 64492, 241, 68135, 4907, 194757, 9738, 194975, 9727, 7851, 119196, 10951, + 4439, 11588, 119199, 65008, 9085, 65853, 41911, 9327, 6160, 917594, 8650, + 64865, 8088, 64933, 41910, 118872, 65217, 3965, 120050, 194713, 0, 13300, + 65902, 66654, 65491, 65145, 9041, 65847, 65017, 7504, 4420, 9900, 6410, + 7501, 11278, 65825, 9577, 120047, 13217, 8748, 65415, 0, 9867, 9066, + 12924, 11993, 917829, 2626, 7762, 10902, 7510, 119577, 41526, 64285, + 10472, 2995, 120704, 12907, 41184, 2371, 194994, 10038, 259, 1009, + 118838, 2402, 2333, 6440, 194768, 12050, 65125, 0, 12417, 65380, 9103, + 10181, 3148, 65873, 6434, 7779, 10198, 194952, 9479, 6029, 65325, 65157, + 9689, 41261, 119175, 8993, 8613, 0, 41167, 3368, 606, 41492, 7697, 10228, + 41596, 1890, 194769, 6027, 8370, 4322, 41661, 7991, 66512, 10578, 119168, + 41465, 41054, 2735, 41664, 120330, 63778, 65273, 1287, 65408, 6635, + 66659, 6164, 194563, 41273, 917951, 65027, 41271, 9576, 65043, 3347, + 4160, 5154, 917541, 3794, 66564, 9175, 11925, 7709, 9088, 3743, 65099, + 1396, 4572, 7546, 3847, 66327, 65081, 4985, 1615, 672, 809, 12980, 63806, + 0, 65218, 5799, 41615, 65072, 1577, 194934, 65875, 5928, 4525, 10658, + 65911, 1266, 10180, 120702, 6129, 12622, 9347, 917986, 6532, 64424, + 41048, 7789, 773, 19933, 1539, 283, 64416, 66374, 532, 917800, 120049, + 41115, 3051, 5862, 3370, 120789, 43033, 5439, 3250, 8153, 0, 66649, 9510, + 120279, 64647, 9541, 118916, 41066, 64706, 194612, 43038, 3505, 8707, + 9466, 11479, 8537, 120802, 3626, 3471, 194860, 915, 194689, 6686, 119584, + 120238, 5011, 42754, 120723, 41906, 65569, 119128, 119552, 64365, 119886, + 3225, 68161, 4433, 5186, 194957, 41933, 1443, 4381, 9829, 65124, 10926, + 194746, 195076, 64879, 10562, 194751, 65476, 64579, 66456, 10021, 5160, + 1387, 65495, 6103, 118923, 41480, 12786, 195000, 217, 119898, 11714, + 12466, 10443, 10789, 41158, 41460, 1630, 120782, 41483, 65818, 12565, + 41700, 10077, 12890, 5931, 194732, 9283, 7700, 41252, 6042, 65499, + 119637, 41249, 512, 2990, 917786, 120240, 6413, 917985, 632, 12940, + 194875, 41296, 9545, 41291, 5957, 120353, 8926, 3511, 41282, 5923, 10400, + 10174, 12073, 760, 5386, 4274, 5786, 10633, 120531, 5056, 119860, 417, + 41474, 120773, 11022, 9812, 5934, 4460, 66583, 119231, 64877, 65410, + 64481, 194692, 194705, 10937, 194748, 120218, 10509, 65829, 917540, 2953, + 5819, 1801, 12835, 194942, 120484, 194743, 65910, 41985, 8867, 702, + 120410, 1237, 10274, 4552, 65447, 119966, 194961, 1375, 12106, 120815, + 10264, 1755, 9065, 9228, 10376, 1163, 2951, 7840, 64336, 13282, 10252, + 120033, 3384, 120703, 10167, 830, 194656, 65425, 10769, 8451, 41368, + 12520, 9753, 120147, 8944, 194882, 120248, 10473, 2908, 119614, 19965, + 43025, 10299, 65041, 12097, 64733, 12952, 4441, 10503, 917839, 41430, + 9330, 194859, 6614, 411, 10315, 9676, 4996, 120213, 13281, 10009, 7865, + 2730, 10388, 9677, 5428, 118993, 3364, 7565, 12828, 41711, 118816, 65463, + 9535, 216, 10332, 1401, 119895, 622, 65095, 885, 64772, 1602, 4467, + 41405, 852, 119635, 12108, 41328, 484, 65187, 41051, 12071, 9609, 9806, + 41008, 3338, 120796, 572, 10411, 2736, 10255, 10263, 10279, 2794, 8807, + 64491, 10330, 4315, 5222, 5381, 119058, 917995, 5193, 5125, 5456, 5509, + 41177, 917832, 9534, 195042, 64431, 1603, 3430, 118982, 10298, 120407, + 917885, 981, 41176, 4330, 994, 65841, 1824, 10908, 917879, 41681, 41683, + 5921, 65600, 2597, 3957, 5922, 64547, 65784, 674, 119839, 194945, 2946, + 5354, 5251, 4406, 5307, 3759, 10131, 8364, 5123, 1433, 5281, 5469, 5121, + 5924, 5920, 65758, 5130, 64606, 66481, 119624, 8418, 7576, 1221, 2733, 0, + 742, 5216, 2893, 10772, 65276, 5937, 3468, 2553, 9230, 5939, 3997, + 195091, 8363, 120677, 2993, 7772, 3916, 10289, 64613, 1141, 41706, 8159, + 718, 7572, 973, 9666, 120718, 3235, 2415, 5938, 119620, 8018, 12448, + 120556, 9592, 10337, 194918, 917622, 11729, 120727, 8719, 1202, 195080, + 64651, 12983, 118970, 12165, 119095, 63747, 9067, 3260, 8077, 65388, + 68179, 8419, 63773, 65419, 63774, 194986, 63775, 10725, 10433, 64496, + 194861, 1431, 41843, 66565, 10821, 4359, 12804, 12192, 8229, 1235, 3307, + 11472, 120617, 3146, 4544, 9009, 8551, 118820, 1740, 194749, 7575, 985, + 2724, 13076, 65233, 12068, 119949, 515, 10141, 119944, 9539, 8785, 4476, + 119146, 10959, 12655, 8907, 13226, 4589, 4521, 64205, 9141, 64645, 10665, + 2741, 41572, 6197, 1370, 10101, 41573, 64294, 3931, 194924, 120585, 6184, + 8606, 3303, 11968, 11786, 9473, 13103, 63771, 8879, 11593, 66508, 4478, + 917588, 41735, 65837, 717, 10754, 4477, 120376, 814, 42066, 119962, + 63767, 1780, 41031, 119958, 41387, 819, 10611, 9694, 11955, 65919, + 119953, 41111, 9462, 119071, 7788, 4847, 65542, 6578, 8338, 7523, 120666, + 1581, 6535, 7525, 3346, 430, 64698, 66699, 575, 268, 194940, 4945, 66463, + 4950, 12918, 9456, 8336, 5936, 43017, 5964, 8337, 13081, 308, 917964, + 7522, 64309, 41746, 4949, 118946, 443, 11658, 4944, 5467, 65885, 5926, + 1862, 6044, 65392, 8820, 4946, 119247, 9038, 7887, 65667, 7830, 11651, + 13093, 2698, 41144, 65742, 12072, 41753, 11590, 41304, 824, 120095, 8595, + 65225, 42141, 11415, 4673, 41354, 4678, 13283, 12697, 65059, 12381, 3488, + 5933, 5481, 3490, 1199, 65014, 8356, 12297, 119153, 1955, 12375, 3102, + 10474, 4672, 118849, 119821, 5531, 119823, 119826, 66332, 8835, 4674, + 119006, 5831, 194932, 64896, 12379, 8025, 119947, 64542, 1855, 11957, + 5472, 64425, 7852, 119867, 64951, 120467, 11445, 2745, 5470, 65171, 9124, + 119110, 4654, 65289, 291, 120762, 12688, 10525, 4649, 65209, 11797, + 12647, 4648, 4640, 64713, 10224, 64902, 6246, 64950, 7828, 4650, 41464, + 917624, 119086, 4653, 7822, 120331, 12923, 65674, 8669, 194655, 10729, + 43031, 5778, 6302, 2716, 194606, 12680, 119130, 1417, 10916, 917569, + 6441, 8547, 2711, 11552, 120798, 64953, 7992, 12429, 41907, 4662, 65453, + 120408, 9149, 9146, 599, 4641, 9179, 64819, 63782, 4656, 10130, 41469, + 7811, 40994, 12426, 4646, 5967, 865, 3725, 5713, 5814, 4645, 42033, + 120422, 41756, 13132, 64728, 9026, 10833, 64673, 1659, 919, 41935, 1671, + 11459, 3054, 9219, 9744, 1661, 7605, 4622, 119087, 10140, 9713, 12427, + 41938, 66674, 9045, 2306, 10485, 19926, 6068, 10612, 10401, 4617, 119596, + 120463, 41462, 4616, 10518, 10423, 10359, 66491, 5958, 917842, 9564, + 4618, 826, 65577, 4321, 4621, 195048, 41313, 522, 5368, 1808, 7848, + 194992, 5366, 12201, 5372, 10913, 12668, 917781, 4391, 64331, 2696, + 120155, 11003, 4638, 64490, 1790, 66304, 167, 10921, 9791, 917631, 9840, + 5376, 1835, 5335, 10313, 41370, 4633, 64320, 10265, 1180, 4632, 43009, + 5387, 5333, 64256, 12903, 41, 5331, 1792, 11928, 41548, 5338, 4637, + 120373, 5971, 4289, 120393, 385, 4152, 2585, 194605, 10909, 3126, 1427, + 65551, 10957, 5970, 3431, 64890, 10358, 7531, 4758, 917573, 1608, 2738, + 7443, 10455, 4753, 917854, 11344, 65729, 6240, 5231, 119013, 12147, + 65216, 6248, 0, 2593, 8463, 7810, 65807, 5229, 4757, 65192, 66581, 2728, + 4411, 64563, 65235, 5234, 41124, 120424, 9580, 10066, 9746, 119559, 2622, + 6033, 13061, 8016, 41196, 8954, 64831, 65189, 2632, 12390, 10108, 1011, + 5574, 1853, 2709, 65139, 5577, 42091, 41165, 393, 12450, 8965, 11458, + 42177, 5316, 917940, 171, 5941, 5572, 68127, 5312, 12531, 5525, 5330, + 5319, 10043, 65710, 42080, 8937, 63798, 12454, 7548, 42132, 12063, + 917991, 64343, 3230, 0, 10350, 10644, 5209, 297, 5721, 12109, 8415, 8632, + 10102, 11267, 120219, 2497, 5720, 960, 1692, 42146, 4610, 8696, 4292, + 64760, 4609, 10512, 4614, 541, 194890, 5287, 5309, 2503, 119243, 1762, + 4647, 56, 10743, 5844, 41381, 601, 4613, 10194, 4663, 1899, 4608, 2507, + 11025, 5190, 67628, 63759, 68145, 11405, 8892, 120348, 67620, 66639, + 2734, 5782, 420, 64368, 63795, 41649, 10797, 5960, 63797, 8992, 65293, + 41238, 1782, 12814, 8959, 12525, 10686, 41383, 5501, 41842, 3650, 7442, + 120749, 359, 4183, 119957, 6239, 12787, 41256, 329, 66582, 12573, 120452, + 7437, 9346, 41188, 13196, 7439, 42167, 3767, 5737, 5380, 4865, 195047, + 1155, 120434, 5736, 4368, 64724, 63749, 68137, 5601, 5739, 41023, 4866, + 9985, 7987, 41928, 1172, 64572, 917596, 6253, 120365, 6650, 5603, 41666, + 4473, 64148, 4870, 65901, 65347, 41799, 65345, 8199, 195007, 5347, + 119063, 9280, 4864, 10398, 4144, 119633, 120567, 6245, 120478, 2732, + 5598, 745, 4555, 5341, 119847, 4777, 7821, 5351, 120747, 119589, 41950, + 120729, 120210, 3097, 63817, 5966, 120363, 4778, 120596, 10863, 1660, + 4781, 66460, 271, 41940, 65370, 8577, 65368, 12653, 65366, 10216, 4782, + 10000, 65362, 65361, 11912, 12325, 11323, 8717, 41583, 65355, 4776, + 65353, 11492, 8700, 761, 13168, 10575, 10426, 917905, 120150, 10362, + 11272, 1715, 4849, 8242, 9561, 194982, 195090, 10607, 120511, 120675, + 5963, 66563, 41509, 4916, 4850, 380, 1607, 466, 4853, 194905, 4854, + 917625, 5164, 41096, 1350, 5124, 64420, 120354, 5362, 8471, 2708, 64716, + 7946, 3785, 234, 19963, 120481, 41268, 4848, 2530, 41636, 4798, 1225, + 6630, 65684, 10458, 120595, 8576, 5197, 195087, 2704, 4794, 8329, 63823, + 8322, 4797, 66326, 5725, 2694, 2595, 3363, 2439, 65104, 5607, 41089, 303, + 41162, 119044, 2665, 2437, 917791, 9817, 4844, 8764, 13013, 8934, 65398, + 917929, 4492, 120347, 9843, 2441, 10739, 65090, 1188, 119327, 1100, 2451, + 2714, 41081, 2912, 194817, 4937, 65746, 753, 3572, 10023, 4959, 11722, + 9248, 65815, 9729, 11725, 65190, 119094, 2726, 3107, 194658, 4941, 7996, + 10995, 9140, 1408, 5261, 41412, 9068, 181, 119819, 4942, 43043, 4938, + 41341, 972, 5259, 4004, 64185, 4142, 5257, 194712, 120529, 4964, 5264, + 9538, 64177, 64176, 41225, 64182, 63800, 64180, 11396, 9482, 4873, 3265, + 1822, 194867, 12601, 41078, 3865, 261, 5927, 7568, 118931, 118930, + 917858, 10696, 9830, 6073, 389, 10467, 6255, 6075, 4872, 282, 194633, + 3125, 9567, 195012, 4878, 5459, 4874, 119046, 9557, 3474, 64774, 120356, + 11494, 6081, 9563, 9411, 11017, 13017, 11940, 41033, 65928, 10788, 64190, + 8751, 10385, 120273, 7816, 9414, 4665, 12628, 4670, 119871, 41555, + 120485, 9642, 10912, 958, 12959, 3082, 119112, 4666, 0, 4915, 917896, + 2891, 5856, 12096, 5163, 4664, 10836, 1817, 66724, 12231, 41554, 10564, + 7450, 13077, 42099, 4400, 9697, 3606, 10275, 8925, 10371, 10307, 1063, + 10227, 11410, 9772, 4541, 6299, 1389, 64203, 64201, 9823, 42081, 12941, + 19906, 10520, 118839, 119557, 12301, 64192, 10505, 10878, 42772, 64196, + 12172, 41814, 1017, 64175, 523, 505, 1447, 846, 0, 41813, 917827, 8608, + 120537, 65482, 2543, 12163, 3108, 9745, 4529, 64166, 64165, 64164, 7919, + 120639, 1641, 64168, 64949, 8966, 10251, 10247, 5908, 715, 64161, 64160, + 7542, 1699, 10943, 10763, 120379, 11352, 550, 10169, 11515, 64385, 66579, + 3766, 64856, 5780, 9504, 6611, 257, 10373, 13153, 12061, 10261, 10253, + 6404, 2599, 9433, 6496, 1552, 5930, 66664, 11476, 11447, 3128, 4789, + 5067, 4911, 3760, 1718, 9438, 8827, 1146, 5065, 41435, 4352, 68136, 2435, + 41839, 5064, 5326, 120453, 3778, 1809, 8873, 7824, 19919, 5062, 1264, + 64817, 765, 11697, 3764, 8473, 64092, 8469, 3933, 12947, 4564, 7954, + 917908, 10375, 917872, 119902, 64768, 194983, 41012, 5225, 63910, 42130, + 7903, 5151, 194862, 64121, 64685, 5626, 2569, 66498, 3800, 65424, 119859, + 917575, 5353, 5625, 10894, 954, 8022, 1010, 41043, 65456, 41438, 41439, + 9904, 10711, 4593, 119564, 119003, 2590, 5629, 13309, 7551, 10325, 5632, + 10471, 120038, 64759, 42054, 5166, 5628, 120031, 970, 120029, 4772, 2400, + 5627, 64130, 120018, 12885, 3119, 63998, 10961, 3060, 203, 9986, 917574, + 64344, 636, 11698, 120652, 63832, 42111, 11701, 120448, 554, 64137, 8320, + 64275, 8863, 120442, 42042, 1477, 63803, 194864, 120792, 5694, 7689, + 42142, 9323, 4325, 3047, 3937, 175, 194815, 3169, 64016, 64781, 912, + 1243, 4536, 5431, 6652, 120058, 6244, 65839, 120480, 3935, 120665, 1129, + 917936, 11950, 5392, 68177, 7846, 64024, 5397, 120008, 12046, 12599, + 3845, 4490, 5395, 6556, 5393, 354, 7530, 11977, 41029, 8366, 119183, + 7756, 3901, 65484, 51, 626, 41602, 5895, 9568, 64057, 456, 120333, 8145, + 1168, 9251, 9082, 119964, 9854, 4311, 3866, 8818, 41512, 119952, 118865, + 10324, 3918, 5377, 3797, 1644, 10405, 9658, 4140, 13057, 42029, 42037, + 9030, 813, 119945, 41454, 4146, 195036, 5360, 2466, 236, 195032, 119942, + 6249, 42117, 5898, 120670, 41457, 119148, 5855, 1969, 2384, 988, 119106, + 12838, 64483, 917834, 10341, 10552, 65479, 5854, 120397, 10583, 118933, + 119989, 119940, 10416, 11981, 3872, 119361, 64014, 120725, 6093, 9748, + 2838, 119939, 65843, 170, 120516, 13143, 4169, 118847, 13311, 6058, 6448, + 10553, 1662, 65295, 917782, 64342, 5892, 120822, 10178, 42106, 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, 4736, 10357, 64155, 849, 1704, 8556, 120402, + 9659, 64926, 1743, 120512, 9556, 9496, 4503, 11353, 9647, 7876, 68132, + 120575, 3928, 11948, 65283, 10706, 63975, 65427, 4842, 6438, 66509, 9109, + 4841, 1289, 4171, 12008, 6251, 3923, 1490, 2447, 65539, 119187, 10907, + 5245, 119218, 10114, 64000, 9790, 4845, 8332, 10582, 119622, 4840, 5675, + 254, 1747, 65429, 4825, 10626, 8918, 10281, 5716, 64004, 65799, 120576, + 19955, 917989, 8080, 118895, 367, 1472, 120386, 6687, 4829, 64693, 5905, + 12339, 8919, 9515, 4435, 118992, 11023, 119109, 4830, 9134, 41365, 64125, + 41978, 1412, 4594, 1391, 10536, 7720, 4824, 7775, 120425, 120392, 1888, + 1960, 3140, 66449, 7960, 41836, 41844, 6052, 6064, 54, 1428, 12214, + 68098, 6211, 7699, 358, 66592, 10557, 11442, 10758, 8223, 65759, 4261, + 12642, 194844, 120343, 120400, 120496, 119053, 41858, 119055, 64118, + 194902, 64554, 10574, 3878, 4017, 12827, 1752, 65195, 12962, 41118, 3924, + 10199, 118965, 64966, 119019, 120107, 65664, 41116, 720, 324, 194964, + 41977, 12057, 11917, 1464, 41343, 4721, 7974, 64353, 8957, 66484, 64488, + 120371, 9853, 64041, 195058, 12740, 12640, 4722, 917617, 917820, 0, 4725, + 9690, 4726, 194756, 41173, 119843, 118969, 5204, 119248, 67588, 67605, + 4015, 3995, 8052, 476, 3714, 10073, 3595, 10232, 10999, 1382, 64209, + 12636, 64215, 64214, 1656, 41831, 8130, 8672, 8832, 8720, 3908, 1452, + 13111, 64523, 64067, 194926, 8552, 12398, 41845, 3849, 120657, 195063, + 9778, 468, 612, 42150, 55, 65546, 917911, 64515, 1674, 118951, 5823, + 120276, 1114, 42110, 540, 120052, 119017, 12516, 41743, 3938, 120057, + 65417, 64316, 120060, 11340, 820, 41741, 6292, 65303, 7955, 6452, 4713, + 3359, 7800, 41566, 65177, 6226, 353, 719, 9656, 9474, 64742, 41986, 4532, + 65412, 42114, 10868, 4717, 2349, 5902, 66450, 1884, 9481, 64070, 65400, + 3623, 8155, 1195, 3942, 4714, 9625, 41151, 194653, 5012, 12006, 917604, + 12074, 12409, 42027, 4360, 12964, 6454, 1229, 63793, 66437, 41344, + 917880, 8539, 65100, 120508, 4809, 9623, 4788, 120299, 64885, 64745, + 120207, 65405, 65032, 13075, 194866, 5365, 4545, 8901, 8000, 2492, 4813, + 65432, 917999, 5925, 4808, 64330, 9649, 41154, 65030, 5128, 4038, 12718, + 4810, 64859, 12794, 64928, 1648, 5435, 3522, 11303, 414, 10236, 65439, + 12709, 6456, 120494, 65120, 11905, 41082, 65243, 12581, 10374, 5175, + 63796, 68181, 10254, 63820, 9751, 10262, 64088, 41363, 3919, 607, 194698, + 120288, 9018, 5270, 10314, 10282, 65477, 6564, 64310, 40976, 8265, 7737, + 120752, 40975, 5840, 65436, 10162, 40978, 41632, 8454, 42072, 42038, 387, + 119098, 12737, 120294, 2550, 917910, 42069, 118971, 6442, 3525, 66617, + 9860, 64641, 41590, 5619, 41346, 13157, 375, 7455, 66444, 5616, 8531, + 11473, 42753, 119202, 9454, 5615, 194652, 2315, 120830, 1938, 5455, + 64752, 808, 5568, 11347, 119198, 1026, 5620, 65593, 120787, 11350, 5617, + 10893, 9225, 64639, 12902, 9145, 64595, 1338, 120352, 119178, 9863, + 12161, 2587, 64553, 120274, 6455, 6037, 12834, 3974, 7998, 10290, 10888, + 3083, 10322, 2316, 12348, 64027, 41036, 120369, 66442, 12552, 65606, + 119822, 12739, 5373, 120784, 64700, 3762, 1445, 40961, 65304, 11986, + 120708, 40960, 917923, 3780, 7485, 5779, 64952, 10402, 12011, 3906, 9707, + 10603, 8326, 0, 65498, 3763, 11468, 5618, 194688, 3779, 120078, 9324, + 118852, 63822, 9073, 66585, 64302, 10704, 280, 4787, 917861, 68138, + 13072, 1894, 41180, 120111, 9570, 64020, 8699, 2689, 7878, 65426, 65793, + 42135, 41824, 2551, 10456, 6453, 10200, 3998, 65229, 66562, 503, 194691, + 4470, 2690, 118853, 7780, 5369, 41954, 5249, 1652, 772, 8756, 8310, + 65428, 3487, 64873, 3585, 1688, 194956, 119159, 41822, 194874, 6468, + 41904, 9720, 41697, 41319, 13125, 10650, 5836, 12358, 4668, 4355, 9048, + 1465, 10850, 3943, 19947, 41205, 41315, 41488, 120827, 119613, 5352, + 12362, 12435, 8839, 41053, 3266, 7785, 12356, 8616, 12104, 917875, 65625, + 11450, 194755, 3638, 5420, 3897, 3216, 195011, 2358, 4018, 8633, 2850, + 13304, 9639, 65445, 0, 41263, 2561, 63807, 3542, 120023, 12076, 5303, + 8078, 12676, 64418, 6276, 1706, 194785, 41819, 41422, 12943, 11464, + 10792, 41484, 194607, 10847, 41050, 8872, 860, 13099, 118844, 194819, + 118886, 6435, 10830, 194935, 615, 10668, 7574, 917582, 10504, 9779, 3625, + 43016, 41409, 66651, 41425, 65087, 9178, 8789, 41427, 4022, 64531, 11804, + 118889, 11288, 41424, 917598, 118811, 41820, 195010, 65292, 4812, 1261, + 120340, 3911, 12102, 119179, 1033, 64939, 64642, 917921, 3904, 65822, + 10514, 3275, 65226, 917961, 13123, 10846, 11392, 41321, 66513, 12138, + 10989, 119048, 6233, 10598, 449, 2669, 903, 118997, 2920, 9636, 65240, + 10738, 118897, 9367, 593, 41085, 3917, 64172, 11732, 64307, 120457, + 41448, 3596, 119832, 0, 9763, 64082, 8819, 8113, 124, 12981, 41113, 232, + 12234, 120646, 9168, 65811, 10820, 194895, 64053, 9094, 1769, 41715, + 2463, 119065, 1064, 13307, 41976, 1538, 19924, 0, 120476, 7862, 7795, + 1474, 8516, 4828, 1258, 7561, 12744, 11585, 1878, 9498, 0, 2911, 120094, + 41178, 3939, 64823, 8846, 8943, 12617, 41174, 2650, 4491, 1961, 41463, + 11525, 11292, 1959, 775, 66488, 41732, 41016, 6074, 9618, 64827, 1511, + 3613, 66440, 4259, 41436, 3656, 19930, 64533, 41019, 12428, 68160, 11333, + 6243, 8514, 8513, 9054, 1613, 41828, 119360, 65531, 194879, 68139, + 194877, 67604, 5741, 10145, 8865, 6402, 119099, 5788, 7917, 64808, 65730, + 7733, 64359, 4998, 120375, 119904, 65494, 917968, 4268, 41247, 120524, + 120370, 3871, 8036, 10881, 9111, 10621, 41696, 65462, 67584, 10993, + 120745, 9765, 120368, 195089, 11648, 42118, 10321, 65281, 41587, 10949, + 194644, 42107, 917607, 917860, 5416, 10802, 41164, 66318, 65298, 65723, + 5685, 118845, 12633, 7928, 10848, 8094, 41595, 118821, 6474, 794, 65909, + 12656, 10355, 64665, 5274, 1665, 41598, 3993, 119165, 64512, 40971, 536, + 189, 12611, 119234, 194651, 2859, 4838, 63838, 4834, 2338, 195075, + 119145, 4837, 41944, 770, 41452, 811, 1687, 41042, 66620, 120730, 64427, + 64326, 40969, 10526, 3895, 5406, 40968, 1339, 11731, 120473, 10193, 3116, + 7747, 119185, 8020, 10843, 11554, 12825, 0, 8266, 41006, 12371, 2871, + 64614, 41245, 999, 119129, 64567, 12745, 2663, 64586, 119636, 64191, + 68096, 10150, 65367, 64308, 1522, 597, 4775, 10917, 12571, 10448, 12583, + 12560, 12558, 12556, 12584, 1741, 65097, 1227, 4783, 12566, 11013, 12554, + 120558, 10812, 1586, 4978, 195046, 3078, 1402, 5285, 9391, 40984, 9379, + 9372, 394, 3088, 6284, 917966, 41663, 3991, 9377, 120785, 9237, 424, + 41648, 41208, 120366, 9384, 41076, 1830, 120816, 8647, 41656, 8246, + 120307, 917948, 195039, 41840, 119605, 2377, 41676, 64864, 12572, 11318, + 12557, 12559, 5479, 2796, 1003, 2373, 9446, 9447, 9448, 48, 194920, 9480, + 481, 2359, 9125, 9439, 9440, 9441, 548, 9153, 9444, 9445, 9430, 9431, + 9432, 397, 9434, 9435, 3984, 9437, 195057, 1614, 9424, 9425, 9426, 6651, + 1358, 9429, 428, 9620, 9655, 917760, 10982, 9096, 1333, 65170, 407, 6425, + 917630, 917763, 5955, 66320, 1108, 5804, 11976, 8554, 41466, 64782, 3926, + 9057, 11434, 8798, 120734, 917857, 1392, 1883, 7476, 5986, 5985, 8065, + 41326, 10353, 7468, 0, 917866, 4407, 6502, 4019, 119595, 118919, 8448, + 8219, 41688, 1812, 12675, 12659, 41793, 194823, 119167, 42172, 42068, + 6054, 10697, 2386, 119810, 9170, 10642, 3909, 64585, 10296, 41763, + 119171, 10977, 42082, 4164, 1049, 195045, 65707, 11943, 41806, 8709, + 10606, 3921, 12275, 64691, 12936, 8994, 1038, 118966, 8470, 65695, 0, + 577, 119585, 8773, 10733, 36, 194793, 5153, 41805, 13097, 194782, 763, + 8736, 1414, 64495, 9683, 194841, 66681, 120831, 2536, 119951, 66330, + 119625, 8621, 8963, 12852, 3031, 120034, 41345, 66317, 182, 66315, 64402, + 65562, 10210, 120492, 9058, 366, 120764, 9892, 961, 63755, 6426, 4570, + 11478, 3106, 65917, 41284, 1696, 41189, 4003, 12105, 68109, 5766, 12802, + 3264, 8824, 13268, 917801, 10936, 63980, 11287, 6128, 119083, 19956, + 10923, 2322, 12797, 65506, 8300, 65861, 917536, 41285, 3547, 120144, + 8112, 119600, 41459, 41369, 6089, 13000, 43027, 12117, 4170, 1029, 10540, + 12315, 9063, 65101, 119979, 744, 120821, 12897, 3792, 4926, 917623, 6065, + 3551, 194598, 118800, 4623, 41186, 41816, 4598, 41818, 12795, 5968, 7922, + 12614, 10851, 8523, 6179, 119066, 6180, 1863, 4710, 194981, 5956, 11972, + 41290, 65552, 4705, 716, 177, 120739, 4704, 12360, 120270, 64719, 161, + 9020, 3362, 119931, 4706, 10646, 66594, 64788, 4709, 7518, 8754, 19909, + 120237, 120245, 119164, 68144, 7508, 9136, 1700, 4401, 41280, 194711, + 8974, 2308, 119910, 10634, 41791, 2318, 8506, 66361, 8198, 42022, 1005, + 937, 118996, 4734, 2870, 41277, 12319, 66619, 5404, 4729, 3667, 235, + 1384, 4728, 41049, 120420, 120644, 120017, 8109, 65505, 119920, 4730, + 447, 13186, 1513, 4733, 8664, 63978, 65219, 119221, 12911, 9665, 1383, + 8565, 2469, 119866, 12663, 6156, 68117, 917586, 7993, 4288, 119828, 2674, + 13238, 11922, 41145, 41468, 3510, 13234, 41148, 8683, 5605, 42095, 10497, + 12221, 1380, 12314, 41146, 118964, 11441, 13197, 3512, 120682, 9495, + 8103, 194596, 5959, 65184, 11780, 41563, 11586, 120028, 41925, 13205, + 13211, 5801, 41923, 119344, 120316, 1283, 11924, 4779, 7988, 3719, 4006, + 3271, 19957, 64038, 8355, 118799, 8842, 64747, 3804, 13070, 11557, 3875, + 5962, 1095, 64371, 3599, 65880, 5827, 120411, 7787, 120140, 41378, 7465, + 64493, 12207, 4773, 11684, 64034, 119565, 917865, 12785, 42043, 64943, + 66677, 917965, 42046, 9742, 521, 65136, 10800, 41473, 8404, 66725, 483, + 0, 1450, 12986, 928, 11605, 65441, 917882, 10599, 120435, 3989, 10971, + 120016, 5771, 9841, 6539, 12145, 118983, 10074, 194778, 9807, 3769, + 41190, 3973, 12821, 4575, 9573, 7982, 429, 8849, 118967, 65573, 41771, + 1796, 118918, 64887, 6417, 8164, 41301, 3502, 120382, 194912, 64959, + 4919, 10590, 5825, 7755, 68165, 0, 64548, 12661, 1621, 10214, 10418, + 41962, 65868, 41971, 1409, 11551, 1617, 3112, 10824, 5015, 1390, 64403, + 194976, 421, 1756, 5846, 66476, 8666, 120132, 7595, 120360, 7555, 3630, + 5408, 2817, 1214, 12883, 120124, 10218, 41769, 3168, 194916, 42134, 7957, + 2370, 2846, 1056, 119070, 12798, 118910, 120314, 1836, 8757, 65850, 12327, 3740, 119028, 5622, 65374, 41765, 2341, 3944, 8484, 8474, 120817, - 120433, 3118, 8461, 41942, 12153, 5621, 12799, 8127, 8975, 9451, 7943, - 13073, 12169, 10618, 681, 0, 703, 120812, 3272, 8781, 12894, 0, 12223, 0, - 6204, 0, 0, 8279, 8776, 64954, 3276, 0, 65222, 4267, 194627, 41325, 0, - 64795, 0, 12171, 10047, 9710, 3262, 0, 0, 0, 42020, 118788, 163, 3877, - 10495, 1655, 5842, 12479, 3122, 0, 7793, 0, 9328, 64352, 10039, 6003, - 42094, 5623, 0, 5717, 3986, 0, 0, 8912, 64555, 41858, 64078, 0, 3627, - 4523, 194836, 12241, 8540, 12993, 8887, 4574, 41040, 2459, 64886, 13060, - 41041, 8946, 10348, 10412, 5718, 0, 10450, 8147, 13221, 66329, 120353, - 3765, 119885, 0, 1606, 120348, 120351, 3093, 119126, 4619, 10600, 119247, - 7712, 0, 4312, 41918, 120337, 10128, 11923, 4023, 41892, 5763, 120335, - 4827, 2401, 12810, 8792, 120346, 4455, 7826, 433, 120342, 0, 2499, 41812, - 12886, 0, 11973, 13089, 4293, 10300, 10161, 10396, 12196, 66322, 66630, - 0, 0, 3010, 5817, 120604, 1458, 3120, 9797, 9643, 0, 4984, 10389, 120111, - 9100, 0, 0, 0, 1061, 4699, 9115, 3509, 0, 486, 4290, 120201, 0, 0, 0, - 1045, 120361, 5631, 10380, 9626, 2380, 0, 0, 120678, 2376, 8486, 0, 9824, - 2335, 4362, 12174, 0, 2366, 1025, 0, 12634, 120760, 0, 41443, 120732, 0, - 64035, 9711, 1523, 0, 5058, 41445, 120058, 0, 8567, 41442, 3988, 0, 0, - 1847, 0, 10403, 8564, 65385, 65076, 65117, 0, 0, 0, 12616, 0, 6256, 0, - 12671, 0, 10206, 118974, 0, 2673, 11960, 5820, 0, 4488, 194740, 7926, 0, - 10444, 42137, 120787, 2754, 9850, 0, 4487, 13192, 41957, 1032, 65530, - 1711, 0, 120067, 3114, 614, 0, 118938, 119261, 0, 926, 120822, 0, 0, 0, - 0, 10832, 0, 1050, 41798, 41035, 0, 9314, 41801, 119088, 120616, 520, - 10437, 12699, 8331, 0, 3091, 41034, 0, 2307, 8360, 10097, 0, 321, 41028, - 64543, 0, 0, 0, 0, 2861, 10360, 10095, 0, 66307, 440, 1861, 13085, 9233, - 0, 64532, 0, 119158, 12123, 0, 3859, 10570, 41660, 8209, 0, 118841, - 10910, 0, 1521, 7875, 41658, 10487, 0, 5760, 13011, 743, 4414, 120766, - 120628, 0, 5243, 9849, 5239, 0, 0, 1405, 5237, 0, 65112, 10103, 5247, - 4769, 42063, 5508, 120829, 5764, 0, 3513, 3008, 9378, 0, 194960, 10125, - 120686, 41103, 9394, 13225, 1397, 120548, 65365, 119093, 4770, 0, 9392, - 8731, 65378, 12079, 120619, 12682, 9122, 0, 4774, 3019, 9997, 12834, 0, - 1099, 10490, 120547, 1340, 9390, 0, 0, 464, 4281, 4768, 9385, 0, 1346, - 9017, 917631, 12087, 64516, 423, 1818, 65144, 0, 8272, 0, 66324, 120676, - 3087, 64960, 10111, 65181, 64707, 0, 9584, 8214, 0, 0, 0, 9106, 118907, - 119248, 5806, 64750, 119195, 8243, 9123, 5709, 0, 265, 64409, 13255, - 12605, 0, 2752, 64626, 0, 1434, 59, 5637, 0, 0, 64897, 0, 41810, 42008, - 66305, 0, 41809, 10283, 41983, 64826, 917596, 1156, 8009, 3305, 3782, - 511, 41843, 0, 1014, 64360, 11906, 194676, 10835, 10157, 0, 1400, 10323, - 10685, 7702, 41211, 10387, 4453, 2440, 3758, 1150, 10547, 5700, 41213, - 118812, 65383, 2339, 64019, 5697, 41156, 63984, 9116, 120480, 0, 462, - 41841, 10493, 3862, 8129, 0, 0, 12864, 42065, 9845, 0, 8261, 5701, 9722, - 9581, 1385, 1426, 120474, 194943, 41872, 0, 41033, 8571, 194870, 13288, - 120108, 5167, 0, 1681, 12184, 1204, 3755, 11935, 7748, 8213, 3286, 8911, - 64712, 10744, 0, 990, 5647, 5726, 64915, 10377, 0, 194989, 5646, 195063, - 13253, 2851, 3945, 120096, 120119, 4373, 0, 64402, 9587, 1789, 5651, - 120097, 3100, 0, 5648, 64748, 118897, 0, 10205, 3545, 8190, 10016, 64616, - 0, 8479, 64312, 120118, 2368, 63993, 4419, 120460, 0, 3439, 1825, 1192, - 119166, 8891, 3080, 118836, 2347, 5430, 1140, 8990, 2848, 10159, 0, - 120212, 249, 0, 66623, 12191, 1815, 0, 890, 8883, 3267, 728, 42144, 995, - 0, 4410, 1041, 10576, 8102, 10099, 10343, 0, 8091, 558, 120110, 12273, 0, - 0, 12112, 0, 41389, 0, 65214, 5375, 10142, 8548, 8215, 3129, 10074, - 12913, 9005, 41856, 13242, 64891, 7725, 11938, 194757, 0, 8624, 5173, - 65348, 527, 0, 41894, 10327, 6277, 10608, 11915, 10010, 0, 3540, 41672, - 835, 2329, 0, 41029, 0, 7849, 12245, 5426, 4258, 63987, 41787, 5424, - 12016, 9699, 0, 5434, 0, 0, 8067, 6144, 0, 10311, 118977, 1404, 3095, - 64917, 120211, 3464, 494, 4819, 0, 65098, 10965, 956, 3672, 13112, 1498, - 194864, 0, 120667, 431, 10029, 65159, 0, 8761, 41537, 13171, 13096, 0, - 65108, 0, 9516, 1044, 5268, 0, 4954, 0, 4450, 120723, 0, 64358, 11946, - 356, 3477, 227, 10488, 13214, 382, 41940, 12295, 0, 66631, 0, 3020, - 120819, 120560, 2541, 0, 12364, 64934, 0, 1057, 957, 9110, 194974, 2743, - 0, 63965, 120463, 9097, 66571, 0, 8782, 3006, 776, 2524, 1592, 8573, 0, - 10924, 65164, 63941, 41593, 4397, 8952, 3856, 118818, 0, 5872, 65377, 0, - 917620, 0, 1698, 0, 64477, 5413, 3953, 1053, 120827, 65094, 11994, 4339, - 1052, 1051, 459, 1060, 0, 194647, 65299, 0, 5228, 0, 7868, 689, 12984, - 4163, 0, 8639, 0, 65226, 65510, 1162, 12130, 2671, 0, 8095, 64375, - 119005, 42178, 4553, 0, 0, 195005, 0, 195004, 0, 195003, 0, 194623, 4567, - 41891, 1926, 0, 119056, 4820, 8110, 10935, 194646, 194665, 5830, 119212, - 1377, 0, 4897, 12932, 9250, 8693, 4438, 0, 0, 1753, 194641, 6147, 917558, - 64621, 8833, 0, 0, 194644, 41428, 64596, 10719, 65440, 194669, 1413, - 194994, 65394, 802, 12141, 0, 5561, 10607, 10671, 2528, 41774, 41379, - 42023, 838, 5669, 120697, 844, 8036, 194891, 256, 0, 5583, 41987, 0, 0, - 5580, 65464, 2923, 10853, 5582, 10048, 0, 13069, 5795, 13158, 119006, - 195066, 6087, 120514, 41322, 12180, 0, 194640, 0, 0, 8894, 5370, 119997, - 194628, 1638, 10966, 120491, 194630, 118848, 5733, 0, 64288, 0, 8172, - 42017, 5729, 10844, 194715, 64054, 9760, 0, 120121, 1238, 200, 0, 1062, - 119993, 194946, 118905, 0, 0, 1070, 9361, 0, 6095, 3394, 0, 3015, 0, 0, - 4037, 0, 119995, 65186, 66626, 7817, 1841, 13183, 12976, 120496, 372, - 1669, 10776, 63937, 7701, 41585, 64397, 119211, 1732, 276, 41862, 2828, - 33, 65326, 41768, 9007, 118796, 41588, 914, 427, 8071, 3538, 3900, 65321, - 41864, 1031, 6257, 65279, 41869, 0, 0, 2328, 917550, 1071, 41400, 194717, - 13249, 10841, 41627, 5301, 1047, 0, 5734, 8960, 120688, 8001, 10651, - 119970, 65012, 9663, 194990, 12304, 41621, 5711, 12921, 12098, 119244, - 9166, 12164, 5710, 119082, 194782, 65213, 12447, 10571, 0, 0, 0, 119108, - 5558, 0, 5715, 10915, 0, 12007, 3670, 2761, 11975, 0, 3074, 5722, 194876, - 8629, 0, 0, 4499, 2757, 4496, 9725, 0, 8910, 10689, 0, 12717, 0, 64730, - 0, 0, 0, 41630, 41640, 120143, 0, 118911, 4280, 13118, 8765, 12784, 7792, - 1393, 0, 8701, 119027, 8487, 8233, 0, 0, 0, 120009, 4495, 12144, 2841, - 12543, 0, 1473, 10992, 64329, 118984, 0, 120006, 9318, 357, 1048, 41100, - 0, 41104, 65457, 8035, 1054, 0, 1040, 65450, 5454, 4434, 1069, 0, 0, 0, - 0, 5084, 65402, 119133, 9693, 12354, 733, 41931, 41677, 41102, 4353, - 41674, 1059, 9218, 1731, 0, 0, 0, 194786, 41679, 8299, 0, 118833, 64390, - 0, 5155, 12786, 12787, 42122, 63998, 0, 41779, 0, 3587, 12131, 41432, - 10986, 66602, 9605, 64807, 12788, 194926, 41767, 3371, 0, 13114, 8771, - 3955, 41022, 0, 1109, 11000, 0, 65351, 9770, 9246, 12230, 64507, 8868, - 399, 65137, 41783, 41772, 64045, 12149, 2755, 551, 0, 10156, 4857, 0, - 4428, 2544, 65074, 0, 0, 0, 917612, 351, 5747, 12179, 194603, 7978, - 41092, 120731, 0, 11924, 0, 10712, 65015, 120733, 563, 64815, 0, 9013, - 5588, 57, 0, 10386, 65269, 119043, 5585, 0, 2549, 694, 0, 0, 5584, 8358, - 64717, 10238, 194919, 10919, 277, 7980, 0, 41815, 194920, 41800, 5589, - 41807, 2664, 12793, 5586, 1574, 10513, 0, 2525, 4852, 5749, 0, 41605, - 64696, 0, 1039, 9801, 10155, 5745, 188, 8135, 0, 10055, 120655, 9055, - 41853, 4858, 5657, 0, 436, 4771, 0, 0, 5654, 4856, 8051, 120799, 0, 0, - 5652, 10945, 0, 0, 0, 3661, 7863, 118834, 0, 41302, 0, 0, 5402, 10234, - 5843, 11939, 5655, 42157, 0, 3157, 1055, 917628, 0, 3504, 0, 0, 10822, - 5149, 41927, 10226, 41871, 0, 3594, 10272, 10304, 40, 12657, 594, 10244, - 386, 10256, 8834, 10816, 118866, 3467, 0, 0, 3331, 946, 10231, 1495, - 8131, 13179, 194752, 9562, 4304, 0, 8160, 0, 194753, 64529, 64656, 63995, - 1348, 12239, 64013, 5666, 13303, 10555, 194729, 119919, 9091, 10798, - 65230, 13269, 10195, 194931, 7732, 41905, 9793, 0, 6097, 5668, 8780, - 4982, 119883, 5670, 63969, 0, 194762, 2672, 3735, 5667, 13138, 120807, - 9484, 10724, 13203, 119024, 65258, 194933, 4361, 9487, 64314, 9286, 1497, - 195034, 1932, 12442, 6193, 3571, 13247, 0, 7973, 119157, 64821, 11964, - 41339, 7873, 63968, 119219, 553, 120653, 194690, 194857, 3604, 0, 4587, - 0, 0, 119020, 65149, 1962, 194861, 194696, 5633, 194862, 66337, 0, 0, - 64905, 12856, 5437, 65208, 10669, 8702, 7964, 63971, 9135, 199, 10976, - 4105, 63880, 194699, 194736, 194710, 12148, 13148, 194684, 0, 9226, - 120439, 12399, 10765, 5634, 4524, 12720, 4724, 0, 8407, 66323, 12224, - 120815, 0, 5221, 64348, 328, 7886, 0, 5448, 5636, 120071, 5329, 0, 5638, - 118839, 7940, 119076, 0, 65182, 5635, 3373, 2986, 118880, 194751, 3437, - 194832, 6203, 9833, 12693, 11920, 8274, 194838, 64394, 1657, 41558, - 194672, 118887, 5639, 2954, 5660, 5640, 65376, 194818, 194817, 194820, - 194819, 5297, 41637, 13284, 6112, 7968, 41625, 194737, 194738, 120507, - 41780, 5642, 0, 194827, 42181, 4342, 42039, 194831, 1677, 0, 4585, 5641, - 8259, 13301, 1058, 2719, 194625, 194638, 917587, 1144, 5868, 0, 10867, - 65169, 13277, 4308, 2539, 0, 65122, 543, 64916, 64736, 2547, 10209, - 119170, 65317, 5399, 65316, 0, 41633, 7902, 64932, 9000, 12233, 0, - 120315, 1865, 0, 5613, 194772, 12994, 65057, 5610, 0, 6228, 4307, 3482, - 42133, 10787, 194840, 2997, 506, 5609, 41194, 12863, 194776, 64412, - 41195, 2412, 8169, 8186, 8841, 9522, 516, 13130, 41197, 0, 34, 64007, - 10030, 5306, 1612, 120187, 120182, 64951, 120184, 12001, 10211, 120177, - 64564, 66365, 120174, 120173, 7749, 120175, 118898, 1758, 413, 10667, - 4677, 120197, 9133, 1935, 120194, 1042, 120196, 64779, 1931, 10248, 6185, - 64776, 1217, 10242, 708, 825, 118913, 0, 12294, 0, 194908, 9138, 2534, - 810, 12631, 194911, 0, 4424, 119255, 5591, 1239, 2364, 0, 917562, 3403, - 119193, 0, 64364, 0, 65250, 10027, 8998, 0, 0, 9152, 194952, 120191, - 2980, 119169, 41850, 931, 3433, 13170, 12615, 1594, 119937, 65397, 0, - 12944, 41623, 8730, 41353, 65409, 119009, 4337, 65188, 41394, 918, - 194899, 935, 7681, 194900, 377, 41393, 12668, 194904, 2477, 64301, 0, 0, - 0, 65201, 9528, 0, 12884, 194881, 7907, 194883, 120186, 194885, 65328, - 10673, 119217, 194889, 119128, 917575, 1781, 5496, 3357, 62, 1649, - 120641, 964, 119242, 65033, 194894, 0, 0, 65035, 194872, 65038, 0, 64602, - 119856, 0, 12220, 12711, 66575, 4542, 194875, 8423, 3348, 448, 120573, - 2991, 9364, 0, 997, 7949, 194918, 12849, 0, 0, 3073, 42000, 9714, 120679, - 4657, 12988, 4658, 65335, 12335, 119228, 65237, 6241, 2818, 4877, 2385, - 5463, 41897, 4172, 10052, 4409, 0, 10873, 12095, 0, 5346, 120328, 0, - 6237, 5461, 118803, 12722, 119999, 40974, 65231, 64828, 12678, 194868, - 8592, 1257, 0, 10970, 2408, 3251, 66617, 3274, 5465, 41501, 2461, 0, 0, - 5342, 8317, 194663, 194999, 3263, 120559, 8673, 194719, 3270, 64539, - 65338, 0, 120518, 0, 0, 5535, 9142, 0, 4289, 8687, 10938, 120658, 118790, - 1182, 2542, 186, 0, 119156, 5770, 529, 65196, 12612, 12949, 10586, 10790, - 10839, 8920, 5241, 41207, 0, 0, 41594, 225, 0, 5688, 41300, 41204, 0, - 118794, 10721, 41209, 9254, 42097, 1794, 41875, 65238, 5624, 266, 120221, - 120222, 41873, 3617, 120040, 41494, 119824, 8420, 13088, 120214, 10225, - 41338, 3734, 7734, 0, 5502, 66605, 4452, 41260, 0, 0, 4511, 5161, 10572, - 0, 42115, 42050, 64349, 41083, 0, 0, 0, 9003, 8192, 0, 5305, 9653, 10616, - 1697, 9546, 0, 194847, 119174, 41482, 65205, 10031, 64063, 12353, 12535, - 8620, 120207, 64058, 8799, 42131, 42031, 64062, 1028, 64060, 64059, 837, - 10567, 119960, 41606, 3176, 64773, 0, 2902, 64043, 64042, 41740, 3609, - 120577, 13200, 832, 64044, 42156, 10076, 64040, 64039, 12919, 1034, 3392, - 10753, 5180, 64033, 41395, 65468, 64038, 64037, 64036, 41898, 4291, - 63966, 64015, 41114, 243, 194930, 0, 6024, 194586, 12128, 194910, 3476, - 8973, 8538, 64011, 64010, 64008, 4285, 4800, 7706, 41750, 0, 2538, 64009, - 204, 0, 4802, 4111, 8239, 9098, 4805, 64001, 214, 7885, 42143, 8321, 0, - 12208, 4767, 9343, 64049, 64048, 0, 1133, 64053, 64052, 64051, 41187, - 8692, 6022, 119052, 10005, 12329, 41333, 0, 43, 1942, 0, 0, 41107, 12619, - 41121, 3885, 92, 64023, 64022, 64021, 64020, 0, 12451, 64025, 41412, - 41485, 12035, 119208, 6254, 10501, 64018, 8890, 12457, 66587, 194837, 0, - 64778, 118915, 194834, 120193, 0, 66637, 7995, 8759, 41411, 13094, 12449, - 8546, 41414, 65109, 3179, 0, 4720, 10165, 0, 119249, 0, 10751, 0, 12915, - 120180, 10535, 0, 0, 0, 6168, 10934, 1946, 294, 41874, 5494, 4639, 0, - 12040, 6196, 4498, 0, 64028, 64027, 41789, 41788, 2960, 118786, 118795, - 8969, 119887, 10197, 0, 119886, 2950, 11998, 6210, 119890, 370, 3549, - 64790, 7801, 4953, 119967, 0, 0, 3297, 10681, 120693, 1135, 194783, 0, - 5063, 3517, 2964, 119257, 0, 2552, 41546, 60, 10627, 8649, 8252, 729, - 120598, 0, 10541, 0, 64923, 41770, 41547, 9032, 0, 0, 119899, 41215, - 119897, 119898, 12832, 119904, 8081, 3761, 3537, 119908, 9137, 119906, - 8999, 65343, 3850, 3466, 4327, 0, 9373, 0, 908, 6282, 8611, 9813, 0, - 41655, 537, 41511, 4179, 8978, 120540, 119135, 1842, 10527, 120409, 9628, - 3848, 12081, 9826, 64502, 1767, 5336, 120200, 64659, 663, 194846, 10780, - 0, 13108, 120574, 120204, 120198, 120205, 347, 42112, 40992, 4100, 920, - 1811, 1355, 7739, 917547, 3592, 10078, 5318, 0, 0, 120073, 0, 6224, - 120470, 9381, 0, 64345, 0, 9281, 3296, 12865, 0, 0, + 6135, 3118, 8461, 41942, 12153, 5621, 12799, 8127, 8975, 9451, 7571, + 13073, 12169, 10618, 681, 194562, 703, 120812, 3272, 8781, 12894, 120527, + 11709, 119601, 4815, 42053, 6561, 8279, 8776, 64954, 3276, 917976, 6290, + 4267, 120104, 41325, 65021, 11706, 917825, 12171, 10047, 9710, 3262, + 194604, 194939, 119200, 42020, 118788, 163, 576, 9895, 1655, 5842, 12479, + 3122, 10417, 7793, 65581, 9328, 64352, 10039, 6003, 12569, 5623, 120026, + 5717, 3986, 120634, 42023, 8912, 64555, 12604, 64078, 65700, 3627, 4523, + 64934, 11595, 8540, 11498, 8887, 4574, 41040, 2459, 64886, 13060, 41041, + 8946, 10348, 10412, 5718, 120088, 10450, 8147, 13221, 66329, 9999, 3765, + 119885, 68153, 1606, 12178, 686, 3093, 119126, 4619, 10600, 6654, 7712, + 64826, 4312, 41918, 65689, 10128, 11923, 4023, 41892, 5763, 120335, 4827, + 2401, 12810, 8792, 120346, 4455, 7826, 433, 64824, 66660, 2499, 41812, + 12886, 65375, 11973, 13089, 4293, 10300, 10161, 10396, 12196, 66322, + 66630, 194901, 119319, 3010, 5817, 65719, 1458, 3120, 9797, 9643, 119317, + 4984, 10389, 66682, 9100, 9017, 120364, 120243, 1061, 4699, 9115, 3509, + 0, 486, 4290, 9896, 12291, 120620, 194887, 1045, 120204, 5631, 10380, + 9626, 2380, 0, 194863, 120678, 2376, 8486, 120618, 9824, 2335, 4362, + 12174, 194909, 2366, 1025, 195101, 12634, 120760, 65423, 41443, 120732, + 917847, 11713, 1774, 1523, 917561, 5058, 41445, 65762, 65310, 8567, + 41442, 3988, 0, 64882, 1847, 917947, 10403, 8564, 65385, 65076, 65117, + 120413, 194811, 65908, 12616, 65887, 6256, 119628, 12671, 194933, 10206, + 118974, 917792, 2673, 11960, 5820, 9318, 4488, 119567, 7926, 65358, + 10444, 42137, 9893, 2754, 9850, 41437, 4487, 12722, 41957, 1032, 65530, + 1711, 12984, 43039, 3114, 614, 120691, 13116, 64923, 120790, 926, 120640, + 65670, 64204, 194848, 194676, 10832, 120362, 1050, 7549, 41035, 11583, + 9314, 41801, 119088, 120616, 520, 10437, 9558, 8331, 917806, 3091, 41034, + 917887, 2307, 8360, 10097, 65768, 321, 41028, 12750, 917903, 65563, + 120241, 120262, 2861, 10360, 10095, 0, 66307, 440, 1861, 13085, 9233, + 120265, 64532, 43041, 119158, 12123, 13133, 3859, 10570, 41660, 8209, + 65778, 118841, 10910, 120423, 1521, 7875, 41658, 10487, 120606, 5760, + 13011, 743, 4414, 119571, 118873, 65769, 5243, 9849, 5239, 65771, 10778, + 1405, 5237, 917878, 65112, 10103, 5247, 4769, 42063, 5508, 120829, 5764, + 11792, 3513, 3008, 9378, 120395, 194960, 10125, 65364, 41103, 9394, 6485, + 1397, 64795, 65365, 119093, 4770, 120590, 9392, 8731, 7471, 12079, + 120619, 11316, 9122, 194725, 4774, 3019, 9997, 11549, 194919, 1099, + 10215, 65565, 1340, 9390, 66717, 41453, 464, 4281, 4768, 9385, 64470, + 1346, 4995, 65679, 12087, 9780, 423, 1818, 65144, 66665, 8272, 917844, + 66324, 12904, 3087, 64960, 10111, 19967, 64707, 0, 9584, 8214, 194998, + 12159, 12626, 9106, 118907, 40979, 5806, 64750, 64517, 8243, 9123, 5709, + 0, 265, 10922, 13255, 12605, 917628, 2752, 64626, 120256, 1434, 59, 5637, + 11573, 0, 64897, 68129, 19951, 10379, 66305, 119345, 41809, 10283, 41983, + 7547, 64684, 1156, 8009, 3305, 3782, 511, 12496, 63752, 1014, 64360, + 11906, 120125, 10835, 10157, 65536, 1400, 10323, 10685, 7702, 41211, + 10387, 4453, 2440, 3758, 1150, 10547, 5700, 19910, 65349, 65383, 2339, + 64019, 5697, 41156, 6617, 9116, 119227, 0, 462, 41841, 10493, 3862, 8129, + 917958, 120404, 12864, 6644, 9845, 64794, 8261, 5701, 9722, 9581, 1385, + 1426, 119992, 41125, 41872, 194620, 11404, 6493, 119896, 13288, 120108, + 5167, 120717, 1681, 12184, 1204, 3755, 11935, 7748, 8213, 3286, 8911, + 64712, 10744, 65356, 990, 5647, 5726, 64915, 10377, 118947, 11477, 5646, + 65044, 11018, 2851, 3945, 120096, 120119, 4373, 194948, 12997, 9587, + 1789, 1020, 120097, 3100, 41497, 5648, 64748, 13162, 119336, 10205, 3545, + 8190, 10016, 64616, 917890, 6506, 64312, 66669, 2368, 63993, 4419, 65727, + 66469, 3439, 1825, 1192, 119166, 8891, 3080, 118836, 2347, 5430, 1140, + 8990, 2848, 10159, 41859, 120212, 249, 917777, 9173, 12191, 1815, 194832, + 890, 8883, 3267, 728, 42144, 995, 120633, 4410, 1041, 10576, 8102, 10099, + 10343, 19945, 8091, 558, 120110, 12273, 13163, 19938, 12112, 12446, + 41389, 64482, 65214, 5375, 10142, 8548, 8215, 3129, 6134, 12913, 9005, + 41856, 13242, 64891, 7725, 11938, 11662, 119326, 8624, 5173, 19959, 527, + 120701, 41894, 10327, 6277, 10608, 10010, 9879, 917612, 3540, 41672, 835, + 2329, 120813, 12238, 13001, 7849, 12245, 5426, 4258, 63987, 41787, 5424, + 12016, 8283, 120808, 5434, 194561, 194937, 8067, 6144, 194758, 10311, + 118977, 1404, 3095, 11432, 120211, 3464, 494, 4819, 119608, 65098, 570, + 956, 3672, 13112, 1498, 120100, 65857, 119184, 431, 10029, 65159, 195066, + 8761, 41537, 13171, 13096, 194953, 65108, 118911, 9516, 1044, 5268, 0, + 4954, 194972, 4450, 11795, 11547, 64358, 11946, 356, 3477, 227, 10488, + 13214, 382, 11418, 12295, 120641, 11475, 917845, 3020, 11537, 6484, 2541, + 917998, 12364, 11337, 65568, 1057, 566, 9110, 119104, 2743, 64931, 63965, + 64338, 9097, 66571, 41305, 8782, 3006, 776, 2524, 1592, 8573, 917843, + 10924, 65164, 63941, 41593, 4397, 8952, 3856, 66505, 119892, 5872, 6495, + 120510, 6486, 41155, 1698, 13177, 12830, 5413, 3953, 1053, 19917, 65094, + 11448, 4339, 1052, 1051, 459, 1060, 917853, 66479, 65299, 65703, 5228, + 119955, 7868, 689, 6508, 4163, 120757, 8639, 66641, 43022, 65510, 1162, + 12130, 2671, 65806, 8095, 64375, 7521, 42178, 4553, 195034, 0, 12299, + 41433, 195004, 19921, 64298, 11424, 64169, 4567, 41891, 1926, 66646, + 119056, 4820, 8110, 10935, 64690, 194665, 5830, 119212, 1377, 119889, + 4897, 12932, 9250, 8693, 4438, 194947, 917560, 1753, 11331, 6147, 11431, + 64621, 8833, 120671, 0, 6504, 41428, 64596, 10719, 43012, 1898, 1413, + 194763, 65394, 802, 12141, 917953, 5561, 6648, 10671, 2528, 41774, 41379, + 9169, 838, 5669, 64484, 844, 5014, 65854, 256, 0, 5583, 41987, 120280, + 41399, 5580, 65464, 2923, 10853, 5582, 10048, 65699, 13069, 5795, 13158, + 66598, 65702, 6087, 65701, 41322, 12180, 65704, 120662, 194850, 194582, + 8894, 5370, 64055, 118917, 1638, 10966, 12200, 194630, 118848, 5733, + 67631, 64288, 194966, 8172, 42017, 5729, 10844, 8319, 6498, 9760, 0, + 120106, 1238, 200, 120555, 1062, 119993, 118893, 118905, 917606, 195069, + 1070, 9361, 917942, 6095, 3394, 120664, 3015, 120609, 41827, 4037, 7763, + 6400, 65186, 66626, 7817, 1841, 11276, 12976, 65724, 372, 1669, 10776, + 63937, 7701, 41585, 64397, 119211, 1732, 276, 41862, 2828, 33, 65326, + 41768, 6491, 65332, 41588, 914, 427, 8071, 3538, 3900, 65321, 41864, + 1031, 6257, 7614, 41869, 120826, 120573, 2328, 12399, 1071, 41400, 65537, + 13249, 10841, 41627, 5301, 1047, 195094, 5734, 8960, 11312, 8001, 10651, + 119970, 65012, 9663, 66441, 12304, 41621, 5711, 12921, 12098, 65571, + 9166, 12164, 5710, 64363, 65585, 65168, 12447, 10571, 917975, 119617, + 119246, 64611, 5558, 917888, 5715, 10915, 120118, 12007, 3670, 2761, + 11975, 64811, 3074, 5722, 194876, 8629, 120632, 11307, 4499, 2757, 4496, + 9718, 120116, 8910, 10689, 120391, 12717, 65451, 11782, 194822, 66316, + 194729, 41630, 41640, 65596, 917840, 11416, 4280, 13118, 8765, 12784, + 7792, 1393, 917542, 8701, 6585, 8487, 8233, 917788, 119874, 6683, 120009, + 4495, 12144, 2841, 12543, 119320, 1473, 10490, 64329, 118984, 65467, + 120006, 6488, 357, 1048, 41100, 917809, 41104, 65122, 8035, 1054, 917950, + 1040, 65450, 5454, 4434, 1069, 195095, 13019, 194906, 119261, 5084, + 65402, 119133, 9693, 12354, 733, 10762, 41677, 41102, 4353, 41674, 1059, + 9218, 1731, 917883, 120528, 120000, 120643, 41679, 8299, 11994, 118833, + 64390, 194922, 5155, 11599, 12743, 42122, 6480, 65740, 41779, 0, 3587, + 12131, 41432, 10986, 66602, 9605, 64807, 12788, 43020, 41767, 3371, + 917549, 13114, 8771, 1479, 41022, 194950, 1109, 11000, 120740, 64508, + 9770, 9246, 12230, 63801, 8868, 399, 65137, 41783, 41772, 64045, 11742, + 2755, 551, 917803, 10156, 4857, 9874, 4428, 2544, 65074, 194614, 120209, + 917811, 194786, 351, 5747, 12179, 194603, 7978, 41092, 118954, 120502, + 10791, 19935, 10712, 65015, 120667, 563, 64815, 120722, 9013, 5588, 57, + 0, 10386, 65269, 119043, 5585, 65881, 2549, 694, 66712, 9876, 5584, 8358, + 64717, 10238, 65279, 10919, 277, 7980, 119298, 41815, 120233, 41800, + 5589, 41807, 2664, 12793, 5586, 1574, 10513, 11356, 2525, 4852, 5749, + 917765, 41605, 64696, 119306, 1039, 9801, 10155, 5745, 188, 8135, 6450, + 10055, 66604, 9055, 41853, 4858, 5657, 194700, 436, 4771, 194639, 2786, + 5654, 4856, 8051, 120799, 119026, 194891, 5652, 10945, 194581, 120761, + 12280, 3661, 7863, 118834, 119933, 41302, 66608, 64699, 5402, 10234, + 5843, 11939, 5655, 42157, 195079, 3157, 1055, 194955, 917553, 3504, + 64785, 118790, 10822, 5149, 41927, 10226, 41871, 13159, 3594, 10272, + 10304, 40, 12657, 594, 10244, 386, 9453, 8834, 10816, 118866, 3467, + 41010, 119579, 3331, 946, 10231, 1495, 8131, 13179, 119045, 9562, 4304, + 65927, 8160, 120234, 63974, 64529, 64656, 63995, 1348, 12239, 64013, + 5666, 13303, 10555, 120751, 119919, 7599, 10798, 65230, 13269, 10195, + 119932, 7732, 41905, 9793, 0, 6097, 5668, 8780, 4982, 119883, 5670, + 63969, 120298, 12741, 2672, 3735, 5667, 13138, 119915, 9484, 10724, + 13203, 119024, 65258, 66496, 4361, 9487, 64314, 9286, 1497, 120169, 1932, + 12442, 6193, 3571, 11984, 917945, 7973, 119157, 64821, 11964, 12613, + 7873, 11399, 119219, 553, 13049, 41533, 194857, 3604, 65912, 4587, 66709, + 120048, 66667, 12746, 1962, 120083, 194696, 5633, 11660, 66337, 7559, + 120593, 64905, 12856, 5437, 65208, 10669, 6443, 7964, 63971, 9135, 199, + 10976, 4105, 63880, 120622, 120181, 65816, 12148, 13148, 7560, 66686, + 9226, 120439, 11669, 6472, 5634, 4524, 12720, 4724, 67625, 8407, 66323, + 12224, 119201, 194938, 5221, 64348, 328, 7886, 41701, 5448, 5636, 6680, + 5329, 194650, 5638, 6679, 7940, 119076, 118938, 65182, 5635, 3373, 2986, + 118880, 194629, 3437, 119358, 6203, 9833, 12693, 11920, 8274, 194838, + 11685, 1657, 41558, 119610, 7585, 5639, 2954, 5660, 5640, 65376, 194818, + 65102, 19960, 66475, 5297, 41637, 13284, 6112, 7968, 41625, 194737, + 194699, 118955, 11705, 5642, 0, 64630, 42181, 4342, 11710, 67630, 1677, + 64803, 4585, 5641, 8259, 10643, 1058, 2719, 119570, 194638, 194993, 1144, + 5868, 120436, 10867, 11302, 13277, 4308, 2539, 917848, 7505, 543, 64916, + 64736, 2547, 10209, 66670, 65317, 5399, 19911, 917850, 41633, 7902, + 64932, 9000, 12233, 11299, 66499, 1865, 119618, 5613, 194772, 12994, + 65057, 5610, 0, 6228, 4307, 3482, 42133, 10787, 194609, 2997, 506, 5609, + 41194, 12863, 194776, 12316, 41195, 2412, 8169, 8186, 8841, 9522, 516, + 13130, 41197, 917795, 34, 64007, 10030, 5306, 1612, 66622, 42765, 11704, + 65756, 12001, 10211, 119869, 64564, 66365, 65147, 6584, 7749, 120175, + 65693, 1758, 413, 10667, 4677, 120197, 9133, 1935, 11517, 1042, 120196, + 64779, 1931, 10248, 6185, 64776, 1217, 10242, 708, 825, 118913, 65680, + 12294, 41207, 119903, 9138, 2534, 810, 12631, 194911, 120491, 4424, + 119255, 4895, 1239, 2364, 11313, 119149, 3403, 119193, 194610, 64364, + 63952, 65250, 10027, 8998, 194627, 917771, 9152, 194896, 67592, 2980, + 755, 41850, 931, 3433, 13170, 12615, 1594, 42767, 11274, 67603, 12944, + 41623, 8730, 41353, 11587, 67611, 4337, 65188, 41394, 918, 119223, 935, + 7681, 65676, 377, 41393, 11649, 120621, 2477, 64301, 66454, 917826, + 194899, 65201, 9528, 65155, 573, 19912, 7907, 11417, 120186, 194885, + 65328, 10673, 119217, 119938, 67607, 11482, 1781, 5496, 3357, 62, 1649, + 120549, 964, 119242, 64535, 41009, 917773, 11589, 65035, 194872, 65038, + 917605, 64602, 67618, 65840, 11580, 12711, 66575, 4542, 65779, 8423, + 3348, 448, 119173, 2991, 9364, 120036, 997, 7949, 120772, 12849, 11341, + 11440, 3073, 9866, 9714, 11692, 4657, 12988, 4658, 6478, 12335, 119228, + 41975, 6241, 2818, 4877, 2385, 5463, 41897, 4172, 10052, 4409, 8373, + 10873, 12095, 65745, 5346, 120328, 194925, 6237, 5461, 64058, 9176, + 11597, 40974, 64937, 64828, 11419, 120406, 766, 1257, 917547, 10970, + 2408, 3251, 64154, 3274, 5465, 41501, 2461, 120523, 120321, 5342, 8317, + 120394, 68163, 3263, 120046, 8673, 194719, 3270, 64539, 11489, 118999, + 120388, 66672, 120560, 5535, 9142, 195018, 756, 8687, 10938, 120658, + 66443, 1182, 2542, 186, 917862, 119156, 5770, 529, 42115, 12612, 12949, + 10586, 10790, 10839, 8920, 5241, 6479, 41713, 120427, 41594, 225, 11578, + 5688, 41300, 41204, 119105, 118794, 10721, 41209, 9254, 42097, 1794, + 41875, 65238, 5624, 266, 120221, 67637, 41873, 3617, 11324, 41494, + 119824, 8420, 13088, 65755, 1872, 41338, 3734, 7734, 120174, 5502, 65890, + 4452, 41260, 917767, 0, 4511, 5161, 10572, 917614, 11425, 42050, 64349, + 41083, 917884, 917925, 63979, 9003, 8192, 120039, 5305, 9653, 10616, + 1697, 9546, 917930, 194847, 119174, 41482, 65205, 10031, 64063, 9870, + 12535, 8620, 65824, 5581, 8799, 42131, 42031, 64062, 1028, 64060, 64059, + 837, 10567, 119960, 41606, 3176, 64773, 11427, 2902, 64043, 64042, 41740, + 3609, 120550, 13200, 832, 64044, 42156, 10076, 64040, 64039, 12919, 1034, + 3392, 10753, 5180, 64033, 41395, 65468, 11691, 64037, 64036, 41898, 4291, + 63966, 64015, 41114, 243, 8479, 64354, 6024, 11351, 12128, 194908, 3476, + 8973, 8538, 64011, 64010, 64008, 4285, 4800, 7706, 41750, 11604, 2538, + 11609, 204, 7563, 4802, 4111, 8239, 9098, 4805, 64001, 214, 7885, 42143, + 8321, 65893, 12208, 4767, 9343, 64049, 41729, 119986, 1133, 19948, 64052, + 64051, 41187, 8692, 6022, 11788, 10005, 12329, 41333, 120569, 43, 1942, + 12682, 1016, 41107, 12619, 41121, 3885, 92, 64023, 64022, 64021, 6582, + 43030, 12451, 64025, 9167, 41485, 12035, 119208, 6254, 10501, 64018, + 8890, 12457, 66587, 194836, 7582, 64778, 118915, 118813, 66635, 120044, + 66621, 7995, 8759, 41411, 13094, 12449, 7532, 41414, 65109, 3179, 13279, + 4720, 10165, 917618, 119249, 120673, 10751, 9051, 12915, 65913, 10535, + 917892, 4993, 194586, 6168, 10934, 1946, 294, 41874, 5494, 4639, 65929, + 12040, 6196, 4498, 194907, 64028, 8146, 41789, 41788, 2960, 118786, + 118795, 8969, 119884, 10197, 66599, 67621, 2950, 11998, 6210, 11433, 370, + 3549, 64790, 7801, 4953, 11461, 64356, 194973, 3297, 9699, 120693, 1135, + 12700, 7447, 5063, 3517, 2964, 119257, 0, 2552, 41546, 60, 10627, 8649, + 8252, 729, 67624, 119934, 6682, 120007, 43046, 41770, 41547, 9032, 64820, + 65906, 65817, 41215, 119897, 65883, 12832, 119592, 8081, 3761, 3537, + 119908, 9137, 119906, 8999, 65343, 3850, 3466, 4327, 120112, 9373, 66369, + 908, 6282, 6681, 9813, 194997, 41655, 537, 41511, 4179, 8978, 41213, + 65866, 1842, 10527, 120409, 9628, 3848, 12081, 9826, 64502, 1767, 5336, + 120200, 64659, 663, 194846, 10780, 0, 3059, 120024, 119626, 120198, + 66689, 347, 42112, 40992, 4100, 920, 1811, 1355, 7739, 65198, 3592, + 10078, 5318, 194910, 65578, 8592, 65870, 6224, 120192, 9381, 13244, + 64345, 118885, 9281, 3296, 12865, 120715, 1895, }; #define code_magic 47 Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Fri Mar 10 00:38:20 2006 @@ -1898,7 +1898,7 @@ /* found a name. look it up in the unicode database */ message = "unknown Unicode character name"; s++; - if (ucnhash_CAPI->getcode(start, (int)(s-start-1), &chr)) + if (ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1), &chr)) goto store; } } Modified: python/trunk/Objects/unicodetype_db.h ============================================================================== --- python/trunk/Objects/unicodetype_db.h (original) +++ python/trunk/Objects/unicodetype_db.h Fri Mar 10 00:38:20 2006 @@ -1,4 +1,4 @@ -/* this file was generated by Tools/unicode/makeunicodedata.py 2.3 */ +/* this file was generated by Tools/unicode/makeunicodedata.py 2.5 */ /* a list of unique character type descriptors */ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { @@ -19,7 +19,10 @@ {0, 32, 0, 0, 0, 129}, {65504, 0, 65504, 0, 0, 9}, {0, 0, 0, 0, 0, 9}, + {0, 0, 0, 0, 2, 4}, + {0, 0, 0, 0, 3, 4}, {743, 0, 743, 0, 0, 9}, + {0, 0, 0, 0, 1, 4}, {121, 0, 121, 0, 0, 9}, {0, 1, 0, 0, 0, 129}, {65535, 0, 65535, 0, 0, 9}, @@ -37,6 +40,7 @@ {97, 0, 97, 0, 0, 9}, {0, 211, 0, 0, 0, 129}, {0, 209, 0, 0, 0, 129}, + {163, 0, 163, 0, 0, 9}, {0, 213, 0, 0, 0, 129}, {130, 0, 130, 0, 0, 9}, {0, 214, 0, 0, 0, 129}, @@ -52,6 +56,9 @@ {0, 65439, 0, 0, 0, 129}, {0, 65480, 0, 0, 0, 129}, {0, 65406, 0, 0, 0, 129}, + {0, 0, 0, 0, 0, 129}, + {0, 65373, 0, 0, 0, 129}, + {0, 83, 0, 0, 0, 129}, {65326, 0, 65326, 0, 0, 9}, {65330, 0, 65330, 0, 0, 9}, {65331, 0, 65331, 0, 0, 9}, @@ -65,6 +72,7 @@ {65318, 0, 65318, 0, 0, 9}, {65319, 0, 65319, 0, 0, 9}, {65317, 0, 65317, 0, 0, 9}, + {65453, 0, 65453, 0, 0, 9}, {84, 0, 84, 0, 0, 0}, {0, 38, 0, 0, 0, 129}, {0, 37, 0, 0, 0, 129}, @@ -77,16 +85,24 @@ {65473, 0, 65473, 0, 0, 9}, {65474, 0, 65474, 0, 0, 9}, {65479, 0, 65479, 0, 0, 9}, - {0, 0, 0, 0, 0, 129}, {65489, 0, 65489, 0, 0, 9}, {65482, 0, 65482, 0, 0, 9}, {65450, 0, 65450, 0, 0, 9}, {65456, 0, 65456, 0, 0, 9}, + {7, 0, 7, 0, 0, 9}, {0, 65476, 0, 0, 0, 129}, {65440, 0, 65440, 0, 0, 9}, + {0, 65529, 0, 0, 0, 129}, {0, 80, 0, 0, 0, 129}, {0, 48, 0, 0, 0, 129}, {65488, 0, 65488, 0, 0, 9}, + {0, 7264, 0, 0, 0, 129}, + {0, 0, 0, 0, 4, 4}, + {0, 0, 0, 0, 5, 4}, + {0, 0, 0, 0, 6, 4}, + {0, 0, 0, 0, 7, 4}, + {0, 0, 0, 0, 8, 4}, + {0, 0, 0, 0, 9, 4}, {65477, 0, 65477, 0, 0, 9}, {8, 0, 8, 0, 0, 9}, {0, 65528, 0, 0, 0, 129}, @@ -103,28 +119,18 @@ {58331, 0, 58331, 0, 0, 9}, {0, 65450, 0, 0, 0, 129}, {0, 65436, 0, 0, 0, 129}, - {7, 0, 7, 0, 0, 9}, {0, 65424, 0, 0, 0, 129}, - {0, 65529, 0, 0, 0, 129}, {0, 65408, 0, 0, 0, 129}, {0, 65410, 0, 0, 0, 129}, + {0, 0, 0, 0, 0, 4}, {0, 58019, 0, 0, 0, 129}, {0, 57153, 0, 0, 0, 129}, {0, 57274, 0, 0, 0, 129}, {0, 16, 0, 0, 0, 0}, {65520, 0, 65520, 0, 0, 0}, - {0, 0, 0, 0, 1, 4}, - {0, 0, 0, 0, 2, 4}, - {0, 0, 0, 0, 3, 4}, - {0, 0, 0, 0, 4, 4}, - {0, 0, 0, 0, 5, 4}, - {0, 0, 0, 0, 6, 4}, - {0, 0, 0, 0, 7, 4}, - {0, 0, 0, 0, 8, 4}, - {0, 0, 0, 0, 9, 4}, {0, 26, 0, 0, 0, 0}, {65510, 0, 65510, 0, 0, 0}, - {0, 0, 0, 0, 0, 4}, + {58272, 0, 58272, 0, 0, 9}, {0, 40, 0, 0, 0, 129}, {65496, 0, 65496, 0, 0, 9}, }; @@ -133,30 +139,30 @@ #define SHIFT 8 static unsigned char index1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 8, 8, 8, 8, 8, 25, 26, 27, 28, 29, 30, 31, 29, 32, 33, - 29, 29, 29, 8, 8, 8, 34, 35, 36, 37, 38, 39, 21, 21, 21, 21, 21, 21, 21, + 21, 22, 23, 24, 25, 26, 8, 8, 27, 28, 29, 30, 31, 32, 33, 34, 32, 35, 36, + 32, 32, 32, 37, 38, 39, 40, 41, 42, 43, 44, 32, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 40, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 45, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 41, 21, 21, 21, 21, 42, 8, 8, 8, - 8, 8, 8, 8, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 46, 21, 21, 21, 21, 47, 8, 8, + 48, 49, 8, 8, 8, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 43, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 21, 44, 45, 21, 46, 47, 48, 8, 8, 8, 49, - 50, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 50, 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, 21, 51, 52, 21, 53, 54, 55, 56, 57, + 8, 58, 59, 8, 8, 8, 60, 8, 61, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 51, 52, 8, 8, 53, 54, 55, 56, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, 21, 21, 21, 21, 21, 21, 21, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 62, 63, 64, 65, 66, 67, 68, + 69, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -165,11 +171,11 @@ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 57, 8, 8, 8, 8, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 70, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 21, 21, 58, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 21, 21, 71, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, @@ -286,8 +292,8 @@ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 59, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 72, 73, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, @@ -297,35 +303,36 @@ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 60, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 60, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 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, 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, 74, 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, 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, 74, }; static unsigned char index2[] = { @@ -337,97 +344,100 @@ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, - 1, 1, 1, 1, 6, 7, 1, 17, 1, 1, 1, 5, 16, 1, 1, 1, 1, 1, 14, 14, 14, 14, + 1, 1, 1, 1, 17, 18, 1, 19, 1, 1, 1, 20, 16, 1, 1, 1, 1, 1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 1, 14, 14, 14, 14, 14, 14, 14, 16, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 15, 15, - 15, 15, 15, 15, 15, 18, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 21, 22, 19, 20, 19, 20, 19, 20, 16, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 16, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 23, 19, 20, 19, 20, 19, 20, 24, 16, 25, 19, 20, 19, 20, 26, 19, 20, 27, - 27, 19, 20, 16, 28, 29, 30, 19, 20, 27, 31, 32, 33, 34, 19, 20, 16, 16, - 33, 35, 36, 37, 19, 20, 19, 20, 19, 20, 38, 19, 20, 38, 16, 16, 19, 20, - 38, 19, 20, 39, 39, 19, 20, 19, 20, 40, 19, 20, 16, 41, 19, 20, 16, 42, - 41, 41, 41, 41, 43, 44, 45, 43, 44, 45, 43, 44, 45, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 46, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 16, 43, 44, 45, 19, 20, - 47, 48, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 49, 0, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 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, 16, 16, 16, 50, 51, 16, 52, 52, - 16, 53, 16, 54, 16, 16, 16, 16, 52, 16, 16, 55, 16, 16, 16, 16, 56, 57, - 16, 16, 16, 16, 16, 57, 16, 16, 58, 16, 16, 59, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 60, 16, 16, 60, 16, 16, 16, 16, 60, 16, 61, 61, 16, 16, - 16, 16, 16, 16, 62, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, - 1, 64, 1, 65, 65, 65, 0, 66, 0, 67, 67, 16, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 68, 69, 69, 69, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 70, 15, 15, 15, 15, 15, 15, 15, 15, 15, 71, 72, - 72, 0, 73, 74, 75, 75, 75, 76, 77, 16, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 78, 79, - 46, 16, 80, 81, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 1, 14, 14, 14, 14, 14, 14, 14, 16, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 15, + 15, 15, 15, 15, 15, 15, 21, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 24, 25, 22, 23, 22, 23, 22, 23, 16, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 16, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 26, 22, 23, 22, 23, 22, 23, 27, 16, 28, 22, 23, 22, 23, 29, 22, 23, + 30, 30, 22, 23, 16, 31, 32, 33, 22, 23, 30, 34, 35, 36, 37, 22, 23, 38, + 16, 36, 39, 40, 41, 22, 23, 22, 23, 22, 23, 42, 22, 23, 42, 16, 16, 22, + 23, 42, 22, 23, 43, 43, 22, 23, 22, 23, 44, 22, 23, 16, 45, 22, 23, 16, + 46, 45, 45, 45, 45, 47, 48, 49, 47, 48, 49, 47, 48, 49, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 50, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 16, 47, 48, 49, 22, + 23, 51, 52, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 53, 16, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 16, 16, 16, 16, 16, 16, 54, 22, 23, + 55, 54, 16, 16, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, + 57, 58, 16, 59, 59, 16, 60, 16, 61, 16, 16, 16, 16, 59, 16, 16, 62, 16, + 16, 16, 16, 63, 64, 16, 16, 16, 16, 16, 64, 16, 16, 65, 16, 16, 66, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 67, 16, 16, 67, 16, 16, 16, 16, 67, + 16, 68, 68, 16, 16, 16, 16, 16, 16, 69, 16, 70, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 71, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 45, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 72, 1, 73, 73, 73, 0, 74, 0, 75, + 75, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 76, 77, 77, 77, 16, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 78, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 79, 80, 80, 0, 81, 82, 54, 54, 54, 83, 84, + 16, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 85, 86, 87, 16, 88, 89, 1, 22, 23, 90, 22, + 23, 16, 54, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 1, 1, 1, 1, - 1, 0, 1, 1, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 75, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 0, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 0, 0, 19, 20, 0, 0, 0, 0, 0, 0, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 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, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 0, 0, 41, 1, 1, 1, 1, 1, 1, 0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 16, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 0, 0, 0, 0, 0, 41, 41, 41, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, - 1, 1, 41, 41, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 41, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 41, 41, 41, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 1, 41, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 1, 1, 1, 1, 1, 0, 1, 1, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 54, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 0, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 0, 0, 0, 0, 0, 0, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 45, 1, 1, 1, 1, 1, + 1, 0, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 16, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 45, + 45, 45, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 45, 45, 1, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 45, 45, 1, 1, 1, 1, 1, 1, 1, 45, 45, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 45, 45, 45, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 45, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -440,258 +450,297 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 45, 1, 1, 1, 1, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, + 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 45, 0, 0, 0, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, + 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 0, 0, + 0, 45, 45, 45, 45, 0, 0, 1, 45, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 1, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 45, 45, 0, 45, 45, 45, + 1, 1, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 45, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 0, 0, 0, + 0, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 0, 45, 45, 0, 45, 45, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 0, 45, 0, 0, 0, + 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 45, 45, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, + 45, 0, 45, 45, 45, 45, 45, 0, 0, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 0, 1, 1, 1, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, + 45, 1, 1, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, + 0, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 0, 45, 45, 45, 45, 45, 0, 0, 1, 45, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 45, 45, 0, 45, 45, + 45, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 45, 0, 45, 45, 45, 45, 45, 45, 0, 0, + 0, 45, 45, 45, 0, 45, 45, 45, 45, 0, 0, 0, 45, 45, 0, 45, 0, 45, 45, 0, + 0, 0, 45, 45, 0, 0, 0, 45, 45, 45, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, + 45, 45, 45, 45, 45, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 0, + 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, + 45, 45, 45, 45, 45, 0, 0, 1, 45, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 45, 0, 45, 45, + 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, + 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 45, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 0, 0, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 1, 45, 45, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 45, 45, + 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 45, 0, 0, + 45, 45, 0, 45, 0, 0, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 0, 45, 45, 45, + 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 0, 45, 0, 0, 45, 45, 0, 45, 45, 45, + 45, 1, 45, 45, 1, 1, 1, 1, 1, 1, 0, 1, 1, 45, 0, 0, 45, 45, 45, 45, 45, + 0, 45, 0, 1, 1, 1, 1, 1, 1, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, + 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 0, + 45, 45, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, + 45, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, + 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 0, 45, 45, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 0, + 45, 0, 45, 45, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 0, 45, 45, 45, 45, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 45, 45, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 17, 18, 95, 96, 97, + 98, 99, 100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 1, 1, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 45, 45, 45, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 45, 1, 1, 1, 1, 45, 1, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 45, + 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, + 45, 45, 45, 45, 45, 45, 1, 1, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 0, 0, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 41, 1, - 1, 1, 1, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 0, 0, 0, 41, 41, - 41, 41, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 41, 41, 0, 41, 41, 41, 1, 1, 0, 0, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 41, 41, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 0, 41, 41, 0, - 41, 41, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 0, 41, 0, 0, 0, 0, 0, 0, 0, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, 41, - 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 0, 41, 41, - 41, 41, 41, 0, 0, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, - 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 0, - 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 0, 0, 41, - 41, 41, 41, 0, 0, 1, 41, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 41, 41, 0, 41, 41, 41, 0, 0, 0, - 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 41, 0, 41, 41, 41, 41, 41, 41, 0, 0, 0, 41, 41, 41, - 0, 41, 41, 41, 41, 0, 0, 0, 41, 41, 0, 41, 0, 41, 41, 0, 0, 0, 41, 41, 0, - 0, 0, 41, 41, 41, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 0, 0, 0, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 41, 0, 41, 41, 0, 0, 0, 0, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 0, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 0, 0, 0, 0, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 0, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 1, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 41, - 41, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 0, 41, 0, 0, 41, 41, 0, 41, 0, 0, 41, - 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, - 41, 41, 0, 41, 0, 41, 0, 0, 41, 41, 0, 41, 41, 41, 41, 1, 41, 41, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 41, 0, 0, 41, 41, 41, 41, 41, 0, 41, 0, 1, 1, 1, 1, - 1, 1, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 41, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 0, 41, 41, 0, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 1, 0, 0, 0, 0, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, - 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, - 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 41, 41, 41, - 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, - 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, 41, 41, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 0, 41, 0, 41, 41, 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, 41, 41, 0, 0, 41, 41, 41, 41, - 41, 41, 41, 0, 41, 0, 41, 41, 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, - 0, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, 41, 41, 0, 0, 41, - 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 0, 0, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 41, 41, 41, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 41, 0, 0, 0, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 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, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, - 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 16, - 16, 16, 16, 16, 85, 0, 0, 0, 0, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, 19, 20, - 19, 20, 19, 20, 19, 20, 19, 20, 0, 0, 0, 0, 0, 0, 86, 86, 86, 86, 86, 86, - 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 86, 86, 86, 86, 86, 86, 0, 0, 87, - 87, 87, 87, 87, 87, 0, 0, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, - 87, 87, 87, 87, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, - 87, 87, 86, 86, 86, 86, 86, 86, 0, 0, 87, 87, 87, 87, 87, 87, 0, 0, 16, - 86, 16, 86, 16, 86, 16, 86, 0, 87, 0, 87, 0, 87, 0, 87, 86, 86, 86, 86, - 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 89, 89, 89, 89, - 90, 90, 91, 91, 92, 92, 93, 93, 0, 0, 86, 86, 86, 86, 86, 86, 86, 86, 94, - 94, 94, 94, 94, 94, 94, 94, 86, 86, 86, 86, 86, 86, 86, 86, 94, 94, 94, - 94, 94, 94, 94, 94, 86, 86, 86, 86, 86, 86, 86, 86, 94, 94, 94, 94, 94, - 94, 94, 94, 86, 86, 16, 95, 16, 0, 16, 16, 87, 87, 96, 96, 97, 1, 98, 1, - 1, 1, 16, 95, 16, 0, 16, 16, 99, 99, 99, 99, 97, 1, 1, 1, 86, 86, 16, 16, - 0, 0, 16, 16, 87, 87, 100, 100, 0, 1, 1, 1, 86, 86, 16, 16, 16, 101, 16, - 16, 87, 87, 102, 102, 103, 1, 1, 1, 0, 0, 16, 95, 16, 0, 16, 16, 104, - 104, 105, 105, 97, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 4, 16, 0, 0, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 16, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 75, 1, 1, 1, 1, 75, 1, 1, 16, 75, 75, 75, 16, 16, 75, - 75, 75, 16, 1, 75, 1, 1, 1, 75, 75, 75, 75, 75, 1, 1, 1, 1, 1, 1, 75, 1, - 106, 1, 75, 1, 107, 108, 75, 75, 1, 16, 75, 75, 1, 75, 16, 41, 41, 41, - 41, 16, 1, 0, 0, 16, 75, 75, 1, 1, 1, 1, 1, 75, 16, 16, 16, 16, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 16, 16, 16, 16, 16, 101, 0, 0, 0, 0, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, + 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 0, 0, 0, 0, 0, 0, + 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, + 103, 103, 102, 102, 102, 102, 102, 102, 0, 0, 103, 103, 103, 103, 103, + 103, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, + 103, 103, 103, 103, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, + 103, 103, 103, 103, 103, 103, 102, 102, 102, 102, 102, 102, 0, 0, 103, + 103, 103, 103, 103, 103, 0, 0, 16, 102, 16, 102, 16, 102, 16, 102, 0, + 103, 0, 103, 0, 103, 0, 103, 102, 102, 102, 102, 102, 102, 102, 102, 103, + 103, 103, 103, 103, 103, 103, 103, 104, 104, 105, 105, 105, 105, 106, + 106, 107, 107, 108, 108, 109, 109, 0, 0, 102, 102, 102, 102, 102, 102, + 102, 102, 110, 110, 110, 110, 110, 110, 110, 110, 102, 102, 102, 102, + 102, 102, 102, 102, 110, 110, 110, 110, 110, 110, 110, 110, 102, 102, + 102, 102, 102, 102, 102, 102, 110, 110, 110, 110, 110, 110, 110, 110, + 102, 102, 16, 111, 16, 0, 16, 16, 103, 103, 112, 112, 113, 1, 114, 1, 1, + 1, 16, 111, 16, 0, 16, 16, 115, 115, 115, 115, 113, 1, 1, 1, 102, 102, + 16, 16, 0, 0, 16, 16, 103, 103, 116, 116, 0, 1, 1, 1, 102, 102, 16, 16, + 16, 87, 16, 16, 103, 103, 117, 117, 90, 1, 1, 1, 0, 0, 16, 111, 16, 0, + 16, 16, 118, 118, 119, 119, 113, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 120, 16, 0, 0, 95, 96, 97, 98, 99, 100, 1, 1, 1, 1, 1, + 16, 120, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 1, 1, 1, 1, 0, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 54, 1, 1, 1, 1, 54, 1, + 1, 16, 54, 54, 54, 16, 16, 54, 54, 54, 16, 1, 54, 1, 1, 1, 54, 54, 54, + 54, 54, 1, 1, 1, 1, 1, 1, 54, 1, 121, 1, 54, 1, 122, 123, 54, 54, 1, 16, + 54, 54, 1, 54, 16, 45, 45, 45, 45, 16, 1, 1, 16, 16, 54, 54, 1, 1, 1, 1, + 1, 54, 16, 16, 16, 16, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -715,30 +764,29 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 120, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 120, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 120, 120, 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, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 111, 112, 113, 114, 115, 116, 117, 118, 119, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, @@ -746,223 +794,322 @@ 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 1, 111, 112, 113, 114, 115, 116, 117, 118, 119, 1, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, + 20, 17, 18, 95, 96, 97, 98, 99, 100, 1, 20, 17, 18, 95, 96, 97, 98, 99, + 100, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, 22, 23, + 22, 23, 22, 23, 22, 23, 22, 23, 16, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 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, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, + 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, + 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, + 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 41, 41, 1, 1, - 1, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 1, 1, - 1, 1, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 1, 41, 41, 41, 41, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, - 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, + 45, 45, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 0, 1, 1, 1, 1, 45, 45, 45, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 45, 45, 45, 45, 0, 0, 0, 0, 0, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 45, 45, 1, 45, 45, 45, 1, 45, 45, 45, 45, 1, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 16, 16, 16, 16, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, - 41, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 0, 41, 0, 41, 41, 0, - 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 16, 16, 16, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 0, 0, 0, + 0, 0, 45, 1, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 0, 45, 0, 45, + 45, 0, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, - 41, 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 1, 0, + 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 1, 1, 1, 1, 1, 1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 1, 1, 1, 1, 1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, - 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 41, - 41, 41, 41, 0, 0, 41, 41, 41, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 0, 0, 0, 0, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 0, 0, 45, 45, 45, + 45, 45, 45, 0, 0, 45, 45, 45, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 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, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, - 0, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 1, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 0, 0, + 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 0, 0, 0, 45, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 45, 45, 45, 45, 0, 45, + 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 1, 20, 17, 18, 95, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -972,9 +1119,9 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -982,80 +1129,101 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 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, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 0, 54, 54, 0, 0, 54, 0, 0, + 54, 54, 0, 0, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, + 16, 16, 0, 16, 0, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, - 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 54, 54, 0, 54, 54, 54, 54, 0, 0, 54, 54, 54, 54, 54, 54, 54, + 54, 0, 54, 54, 54, 54, 54, 54, 54, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, + 54, 0, 54, 54, 54, 54, 0, 54, 54, 54, 54, 54, 0, 54, 0, 0, 0, 54, 54, 54, + 54, 54, 54, 54, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 75, 0, 75, 75, 0, 0, 75, 0, 0, 75, 75, 0, 0, 75, 75, 75, 75, 0, 75, - 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 0, 16, 0, 16, 16, 16, 16, 0, - 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, 75, 0, 75, 75, 75, - 75, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, 0, 75, 75, 75, 75, 75, 75, 75, - 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, 75, 0, 75, 75, 75, 75, 0, 75, 75, - 75, 75, 75, 0, 75, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 0, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, - 16, 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 1, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 1, 16, 16, 16, 16, 16, 16, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 1, 16, 16, + 16, 1, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 0, 0, 0, - 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, + 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, + 16, 16, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, + 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1064,17 +1232,28 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1085,6 +1264,6 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, }; Modified: python/trunk/Tools/unicode/makeunicodedata.py ============================================================================== --- python/trunk/Tools/unicode/makeunicodedata.py (original) +++ python/trunk/Tools/unicode/makeunicodedata.py Fri Mar 10 00:38:20 2006 @@ -26,13 +26,15 @@ import sys SCRIPT = sys.argv[0] -VERSION = "2.3" +VERSION = "2.5" # The Unicode Database -UNIDATA_VERSION = "3.2.0" -UNICODE_DATA = "UnicodeData.txt" -COMPOSITION_EXCLUSIONS = "CompositionExclusions.txt" -EASTASIAN_WIDTH = "EastAsianWidth.txt" +UNIDATA_VERSION = "4.1.0" +UNICODE_DATA = "UnicodeData%s.txt" +COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" +EASTASIAN_WIDTH = "EastAsianWidth%s.txt" + +old_versions = ["3.2.0"] CATEGORY_NAMES = [ "Cn", "Lu", "Ll", "Lt", "Mn", "Mc", "Me", "Nd", "Nl", "No", "Zs", "Zl", "Zp", "Cc", "Cf", "Cs", "Co", "Cn", "Lm", @@ -57,13 +59,23 @@ def maketables(trace=0): - print "--- Reading", UNICODE_DATA, "..." + print "--- Reading", UNICODE_DATA % "", "..." - unicode = UnicodeData(UNICODE_DATA, COMPOSITION_EXCLUSIONS, - EASTASIAN_WIDTH) + version = "" + unicode = UnicodeData(UNICODE_DATA % version, + COMPOSITION_EXCLUSIONS % version, + EASTASIAN_WIDTH % version) print len(filter(None, unicode.table)), "characters" + for version in old_versions: + print "--- Reading", UNICODE_DATA % ("-"+version), "..." + old_unicode = UnicodeData(UNICODE_DATA % ("-"+version), + COMPOSITION_EXCLUSIONS % ("-"+version), + EASTASIAN_WIDTH % ("-"+version)) + print len(filter(None, old_unicode.table)), "characters" + merge_old_version(version, unicode, old_unicode) + makeunicodename(unicode, trace) makeunicodedata(unicode, trace) makeunicodetype(unicode, trace) @@ -119,6 +131,8 @@ if record: if record[5]: decomp = record[5].split() + if len(decomp) > 19: + raise Exception, "character %x has a decomposition too large for nfd_nfkd" % char # prefix if decomp[0][0] == "<": prefix = decomp.pop(0) @@ -278,6 +292,44 @@ Array("comp_index", index).dump(fp, trace) Array("comp_data", index2).dump(fp, trace) + # Generate delta tables for old versions + for version, table, normalization in unicode.changed: + cversion = version.replace(".","_") + records = [table[0]] + cache = {table[0]:0} + index = [0] * len(table) + for i, record in enumerate(table): + try: + index[i] = cache[record] + except KeyError: + index[i] = cache[record] = len(records) + records.append(record) + index1, index2, shift = splitbins(index, trace) + print >>fp, "static const change_record change_records_%s[] = {" % cversion + for record in records: + print >>fp, "\t{ %s }," % ", ".join(map(str,record)) + print >>fp, "};" + Array("changes_%s_index" % cversion, index1).dump(fp, trace) + Array("changes_%s_data" % cversion, index2).dump(fp, trace) + print >>fp, "static const change_record* get_change_%s(Py_UCS4 n)" % cversion + print >>fp, "{" + print >>fp, "\tint index;" + print >>fp, "\tif (n >= 0x110000) index = 0;" + print >>fp, "\telse {" + print >>fp, "\t\tindex = changes_%s_index[n>>%d];" % (cversion, shift) + print >>fp, "\t\tindex = changes_%s_data[(index<<%d)+(n & %d)];" % \ + (cversion, shift, ((1<>fp, "\t}" + print >>fp, "\treturn change_records_%s+index;" % cversion + print >>fp, "}\n" + print >>fp, "static Py_UCS4 normalization_%s(Py_UCS4 n)" % cversion + print >>fp, "{" + print >>fp, "\tswitch(n) {" + for k, v in normalization: + print >>fp, "\tcase %s: return 0x%s;" % (hex(k), v) + print >>fp, "\tdefault: return 0;" + print >>fp, "\t}\n}\n" + fp.close() # -------------------------------------------------------------------- @@ -540,6 +592,82 @@ fp.close() + +def merge_old_version(version, new, old): + # Changes to exclusion file not implemented yet + if old.exclusions != new.exclusions: + raise NotImplementedError, "exclusions differ" + + # In these change records, 0xFF means "no change" + bidir_changes = [0xFF]*0x110000 + category_changes = [0xFF]*0x110000 + decimal_changes = [0xFF]*0x110000 + # In numeric data, 0 means "no change", + # -1 means "did not have a numeric value + numeric_changes = [0] * 0x110000 + # normalization_changes is a list of key-value pairs + normalization_changes = [] + for i in range(0x110000): + if new.table[i] is None: + # Characters unassigned in the new version ought to + # be unassigned in the old one + assert old.table[i] is None + continue + # check characters unassigned in the old version + if old.table[i] is None: + # category 0 is "unassigned" + category_changes[i] = 0 + continue + # check characters that differ + if old.table[i] != new.table[i]: + for k in range(len(old.table[i])): + if old.table[i][k] != new.table[i][k]: + value = old.table[i][k] + if k == 2: + #print "CATEGORY",hex(i), old.table[i][k], new.table[i][k] + category_changes[i] = CATEGORY_NAMES.index(value) + elif k == 4: + #print "BIDIR",hex(i), old.table[i][k], new.table[i][k] + bidir_changes[i] = BIDIRECTIONAL_NAMES.index(value) + elif k == 5: + #print "DECOMP",hex(i), old.table[i][k], new.table[i][k] + # We assume that all normalization changes are in 1:1 mappings + assert " " not in value + normalization_changes.append((i, value)) + elif k == 6: + #print "DECIMAL",hex(i), old.table[i][k], new.table[i][k] + # we only support changes where the old value is a single digit + assert value in "0123456789" + decimal_changes[i] = int(value) + elif k == 8: + # print "NUMERIC",hex(i), `old.table[i][k]`, new.table[i][k] + # Since 0 encodes "no change", the old value is better not 0 + assert value != "0" and value != "-1" + if not value: + numeric_changes[i] = -1 + else: + assert re.match("^[0-9]+$", value) + numeric_changes[i] = int(value) + elif k == 11: + # change to ISO comment, ignore + pass + elif k == 12: + # change to simple uppercase mapping; ignore + pass + elif k == 13: + # change to simple lowercase mapping; ignore + pass + elif k == 14: + # change to simple titlecase mapping; ignore + pass + else: + class Difference(Exception):pass + raise Difference, (hex(i), k, old.table[i], new.table[i]) + new.changed.append((version, zip(bidir_changes, category_changes, + decimal_changes, numeric_changes), + normalization_changes)) + + # -------------------------------------------------------------------- # the following support code is taken from the unidb utilities # Copyright (c) 1999-2000 by Secret Labs AB @@ -551,6 +679,7 @@ class UnicodeData: def __init__(self, filename, exclusions, eastasianwidth, expand=1): + self.changed = [] file = open(filename) table = [None] * 0x110000 while 1: @@ -569,13 +698,14 @@ if s: if s[1][-6:] == "First>": s[1] = "" - field = s[:] + field = s elif s[1][-5:] == "Last>": s[1] = "" field = None elif field: - field[0] = hex(i) - table[i] = field + f2 = field[:] + f2[0] = "%X" % i + table[i] = f2 # public attributes self.filename = filename From python-checkins at python.org Fri Mar 10 03:04:31 2006 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 10 Mar 2006 03:04:31 +0100 (CET) Subject: [Python-checkins] r42951 - python/trunk/Objects/typeobject.c Message-ID: <20060310020431.BED971E4003@bag.python.org> Author: guido.van.rossum Date: Fri Mar 10 03:04:28 2006 New Revision: 42951 Modified: python/trunk/Objects/typeobject.c Log: Fix three nits found by Coverity, adding null checks and comments. Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Fri Mar 10 03:04:28 2006 @@ -3186,6 +3186,10 @@ Py_INCREF(base); } + /* Now the only way base can still be NULL is if type is + * &PyBaseObject_Type. + */ + /* Initialize the base class */ if (base && base->tp_dict == NULL) { if (PyType_Ready(base) < 0) @@ -3195,7 +3199,11 @@ /* Initialize ob_type if NULL. This means extensions that want to be compilable separately on Windows can call PyType_Ready() instead of initializing the ob_type field of their type objects. */ - if (type->ob_type == NULL) + /* The test for base != NULL is really unnecessary, since base is only + NULL when type is &PyBaseObject_Type, and we know its ob_type is + not NULL (it's initialized to &PyType_Type). But coverity doesn't + know that. */ + if (type->ob_type == NULL && base != NULL) type->ob_type = base->ob_type; /* Initialize tp_bases */ @@ -3750,7 +3758,9 @@ PyTypeObject *type = self->ob_type; while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE) type = type->tp_base; - if (type->tp_setattro != func) { + /* If type is NULL now, this is a really weird type. + In the same of backwards compatibility (?), just shut up. */ + if (type && type->tp_setattro != func) { PyErr_Format(PyExc_TypeError, "can't apply this %s to %s object", what, @@ -3965,7 +3975,9 @@ staticbase = subtype; while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE)) staticbase = staticbase->tp_base; - if (staticbase->tp_new != type->tp_new) { + /* If staticbase is NULL now, it is a really weird type. + In the same of backwards compatibility (?), just shut up. */ + if (staticbase && staticbase->tp_new != type->tp_new) { PyErr_Format(PyExc_TypeError, "%s.__new__(%s) is not safe, use %s.__new__()", type->tp_name, From python-checkins at python.org Fri Mar 10 03:28:43 2006 From: python-checkins at python.org (guido.van.rossum) Date: Fri, 10 Mar 2006 03:28:43 +0100 (CET) Subject: [Python-checkins] r42952 - in python/trunk: Lib/compiler/pyassem.py Lib/compiler/pycodegen.py Lib/contextlib.py Lib/decimal.py Lib/test/test_with.py Lib/threading.py Modules/threadmodule.c Objects/fileobject.c Python/ceval.c Python/compile.c Python/import.c Message-ID: <20060310022843.203771E4003@bag.python.org> Author: guido.van.rossum Date: Fri Mar 10 03:28:35 2006 New Revision: 42952 Modified: python/trunk/Lib/compiler/pyassem.py python/trunk/Lib/compiler/pycodegen.py python/trunk/Lib/contextlib.py python/trunk/Lib/decimal.py python/trunk/Lib/test/test_with.py python/trunk/Lib/threading.py python/trunk/Modules/threadmodule.c python/trunk/Objects/fileobject.c python/trunk/Python/ceval.c python/trunk/Python/compile.c python/trunk/Python/import.c Log: Um, I thought I'd already checked this in. Anyway, this is the changes to the with-statement so that __exit__ must return a true value in order for a pending exception to be ignored. The PEP (343) is already updated. Modified: python/trunk/Lib/compiler/pyassem.py ============================================================================== --- python/trunk/Lib/compiler/pyassem.py (original) +++ python/trunk/Lib/compiler/pyassem.py Fri Mar 10 03:28:35 2006 @@ -779,7 +779,7 @@ 'SETUP_EXCEPT': 3, 'SETUP_FINALLY': 3, 'FOR_ITER': 1, - 'WITH_CLEANUP': 3, + 'WITH_CLEANUP': -1, } # use pattern match patterns = [ Modified: python/trunk/Lib/compiler/pycodegen.py ============================================================================== --- python/trunk/Lib/compiler/pycodegen.py (original) +++ python/trunk/Lib/compiler/pycodegen.py Fri Mar 10 03:28:35 2006 @@ -858,8 +858,6 @@ self.nextBlock(final) self.setups.push((END_FINALLY, final)) self.emit('WITH_CLEANUP') - self.emit('CALL_FUNCTION', 3) - self.emit('POP_TOP') self.emit('END_FINALLY') self.setups.pop() self.__with_count -= 1 Modified: python/trunk/Lib/contextlib.py ============================================================================== --- python/trunk/Lib/contextlib.py (original) +++ python/trunk/Lib/contextlib.py Fri Mar 10 03:28:35 2006 @@ -30,8 +30,9 @@ else: try: self.gen.throw(type, value, traceback) + return True except StopIteration: - pass + return True def contextmanager(func): @@ -91,6 +92,7 @@ """ exits = [] vars = [] + exc = (None, None, None) try: try: for context in contexts: @@ -102,17 +104,14 @@ yield vars except: exc = sys.exc_info() - else: - exc = (None, None, None) finally: while exits: exit = exits.pop() try: - exit(*exc) + if exit(*exc): + exc = (None, None, None) except: exc = sys.exc_info() - else: - exc = (None, None, None) if exc != (None, None, None): raise Modified: python/trunk/Lib/decimal.py ============================================================================== --- python/trunk/Lib/decimal.py (original) +++ python/trunk/Lib/decimal.py Fri Mar 10 03:28:35 2006 @@ -2196,8 +2196,6 @@ return self.new_context def __exit__(self, t, v, tb): setcontext(self.saved_context) - if t is not None: - raise t, v, tb class Context(object): """Contains the context for a Decimal instance. Modified: python/trunk/Lib/test/test_with.py ============================================================================== --- python/trunk/Lib/test/test_with.py (original) +++ python/trunk/Lib/test/test_with.py Fri Mar 10 03:28:35 2006 @@ -78,8 +78,8 @@ vars.append(mgr.__enter__()) self.entered.appendleft(mgr) except: - self.__exit__(*sys.exc_info()) - raise + if not self.__exit__(*sys.exc_info()): + raise return vars def __exit__(self, *exc_info): @@ -89,7 +89,8 @@ ex = exc_info for mgr in self.entered: try: - mgr.__exit__(*ex) + if mgr.__exit__(*ex): + ex = (None, None, None) except: ex = sys.exc_info() self.entered = None @@ -574,9 +575,7 @@ class C: def __context__(self): return self def __enter__(self): return 1, 2, 3 - def __exit__(self, t, v, tb): - if t is not None: - raise t, v, tb + def __exit__(self, t, v, tb): pass targets = {1: [0, 1, 2]} with C() as (targets[1][0], targets[1][1], targets[1][2]): self.assertEqual(targets, {1: [1, 2, 3]}) @@ -594,17 +593,30 @@ class ExitSwallowsExceptionTestCase(unittest.TestCase): - def testExitSwallowsException(self): - class AfricanOrEuropean: + def testExitTrueSwallowsException(self): + class AfricanSwallow: def __context__(self): return self def __enter__(self): pass - def __exit__(self, t, v, tb): pass + def __exit__(self, t, v, tb): return True try: - with AfricanOrEuropean(): + with AfricanSwallow(): 1/0 except ZeroDivisionError: self.fail("ZeroDivisionError should have been swallowed") + def testExitFalseDoesntSwallowException(self): + class EuropeanSwallow: + def __context__(self): return self + def __enter__(self): pass + def __exit__(self, t, v, tb): return False + try: + with EuropeanSwallow(): + 1/0 + except ZeroDivisionError: + pass + else: + self.fail("ZeroDivisionError should have been raised") + def test_main(): run_unittest(FailureTestCase, NonexceptionalTestCase, Modified: python/trunk/Lib/threading.py ============================================================================== --- python/trunk/Lib/threading.py (original) +++ python/trunk/Lib/threading.py Fri Mar 10 03:28:35 2006 @@ -128,8 +128,6 @@ def __exit__(self, t, v, tb): self.release() - if t is not None: - raise t, v, tb # Internal methods used by condition variables @@ -190,8 +188,6 @@ def __exit__(self, t, v, tb): self.release() - if t is not None: - raise t, v, tb def __repr__(self): return "" % (self.__lock, len(self.__waiters)) @@ -321,8 +317,6 @@ def __exit__(self, t, v, tb): self.release() - if t is not None: - raise t, v, tb def BoundedSemaphore(*args, **kwargs): Modified: python/trunk/Modules/threadmodule.c ============================================================================== --- python/trunk/Modules/threadmodule.c (original) +++ python/trunk/Modules/threadmodule.c Fri Mar 10 03:28:35 2006 @@ -68,7 +68,7 @@ PyDoc_STRVAR(acquire_doc, "acquire([wait]) -> None or bool\n\ -(PyThread_acquire_lock() is an obsolete synonym)\n\ +(acquire_lock() is an obsolete synonym)\n\ \n\ Lock the lock. Without argument, this blocks if the lock is already\n\ locked (even by the same thread), waiting for another thread to release\n\ @@ -94,7 +94,7 @@ PyDoc_STRVAR(release_doc, "release()\n\ -(PyThread_release_lock() is an obsolete synonym)\n\ +(release_lock() is an obsolete synonym)\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\ @@ -123,29 +123,6 @@ return (PyObject *)self; } -PyDoc_STRVAR(lock_exit_doc, -"__exit__(type, value, tb)\n\ -\n\ -Releases the lock; then re-raises the exception if type is not None."); - -static PyObject * -lock_exit(lockobject *self, PyObject *args) -{ - PyObject *type, *value, *tb, *result; - if (!PyArg_ParseTuple(args, "OOO:__exit__", &type, &value, &tb)) - return NULL; - result = lock_PyThread_release_lock(self); - if (result != NULL && type != Py_None) { - Py_DECREF(result); - result = NULL; - Py_INCREF(type); - Py_INCREF(value); - Py_INCREF(tb); - PyErr_Restore(type, value, tb); - } - return result; -} - static PyMethodDef lock_methods[] = { {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock, METH_VARARGS, acquire_doc}, @@ -163,8 +140,8 @@ METH_NOARGS, PyDoc_STR("__context__() -> self.")}, {"__enter__", (PyCFunction)lock_PyThread_acquire_lock, METH_VARARGS, acquire_doc}, - {"__exit__", (PyCFunction)lock_exit, - METH_VARARGS, lock_exit_doc}, + {"__exit__", (PyCFunction)lock_PyThread_release_lock, + METH_VARARGS, release_doc}, {NULL, NULL} /* sentinel */ }; Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Fri Mar 10 03:28:35 2006 @@ -1617,24 +1617,6 @@ return (PyObject *)f; } -static PyObject * -file_exit(PyFileObject *f, PyObject *args) -{ - PyObject *type, *value, *tb, *result; - if (!PyArg_ParseTuple(args, "OOO:__exit__", &type, &value, &tb)) - return NULL; - result = file_close(f); - if (result != NULL && type != Py_None) { - Py_DECREF(result); - result = NULL; - Py_INCREF(type); - Py_INCREF(value); - Py_INCREF(tb); - PyErr_Restore(type, value, tb); - } - return result; -} - PyDoc_STRVAR(readline_doc, "readline([size]) -> next line from the file, as a string.\n" "\n" @@ -1725,13 +1707,6 @@ PyDoc_STRVAR(enter_doc, "__enter__() -> self."); -PyDoc_STRVAR(exit_doc, -"__exit__(type, value, traceback).\n\ -\n\ -Closes the file; then re-raises the exception if type is not None.\n\ -If no exception is re-raised, the return value is the same as for close().\n\ -"); - static PyMethodDef file_methods[] = { {"readline", (PyCFunction)file_readline, METH_VARARGS, readline_doc}, {"read", (PyCFunction)file_read, METH_VARARGS, read_doc}, @@ -1751,7 +1726,7 @@ {"isatty", (PyCFunction)file_isatty, METH_NOARGS, isatty_doc}, {"__context__", (PyCFunction)file_self, METH_NOARGS, context_doc}, {"__enter__", (PyCFunction)file_self, METH_NOARGS, enter_doc}, - {"__exit__", (PyCFunction)file_exit, METH_VARARGS, exit_doc}, + {"__exit__", (PyCFunction)file_close, METH_VARARGS, close_doc}, {NULL, NULL} /* sentinel */ }; Modified: python/trunk/Python/ceval.c ============================================================================== --- python/trunk/Python/ceval.c (original) +++ python/trunk/Python/ceval.c Fri Mar 10 03:28:35 2006 @@ -2189,48 +2189,51 @@ Below that are 1-3 values indicating how/why we entered the finally clause: - SECOND = None - - (SECOND, THIRD) = (WHY_RETURN or WHY_CONTINUE), retval + - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval - SECOND = WHY_*; no retval below it - (SECOND, THIRD, FOURTH) = exc_info() In the last case, we must call TOP(SECOND, THIRD, FOURTH) otherwise we must call TOP(None, None, None) - but we must preserve the stack entries below TOP. - The code here just sets the stack up for the call; - separate CALL_FUNCTION(3) and POP_TOP opcodes are - emitted by the compiler. In addition, if the stack represents an exception, - we "zap" this information; __exit__() should - re-raise the exception if it wants to, and if - __exit__() returns normally, END_FINALLY should - *not* re-raise the exception. (But non-local - gotos should still be resumed.) + *and* the function call returns a 'true' value, we + "zap" this information, to prevent END_FINALLY from + re-raising the exception. (But non-local gotos + should still be resumed.) */ x = TOP(); u = SECOND(); if (PyInt_Check(u) || u == Py_None) { u = v = w = Py_None; - Py_INCREF(u); - Py_INCREF(v); - Py_INCREF(w); } else { v = THIRD(); w = FOURTH(); - /* Zap the exception from the stack, - to fool END_FINALLY. */ - STACKADJ(-2); - SET_TOP(x); + } + /* XXX Not the fastest way to call it... */ + x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL); + if (x == NULL) + break; /* Go to error exit */ + if (u != Py_None && PyObject_IsTrue(x)) { + /* There was an exception and a true return */ + Py_DECREF(x); + x = TOP(); /* Again */ + STACKADJ(-3); Py_INCREF(Py_None); - SET_SECOND(Py_None); + SET_TOP(Py_None); + Py_DECREF(x); + Py_DECREF(u); + Py_DECREF(v); + Py_DECREF(w); + } else { + /* Let END_FINALLY do its thing */ + Py_DECREF(x); + x = POP(); + Py_DECREF(x); } - STACKADJ(3); - SET_THIRD(u); - SET_SECOND(v); - SET_TOP(w); break; } Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Fri Mar 10 03:28:35 2006 @@ -1382,7 +1382,7 @@ case BREAK_LOOP: return 0; case WITH_CLEANUP: - return 3; + return -1; /* XXX Sometimes more */ case LOAD_LOCALS: return 1; case RETURN_VALUE: @@ -3472,8 +3472,6 @@ !compiler_nameop(c, tmpexit, Del)) return 0; ADDOP(c, WITH_CLEANUP); - ADDOP_I(c, CALL_FUNCTION, 3); - ADDOP(c, POP_TOP); /* Finally block ends. */ ADDOP(c, END_FINALLY); Modified: python/trunk/Python/import.c ============================================================================== --- python/trunk/Python/import.c (original) +++ python/trunk/Python/import.c Fri Mar 10 03:28:35 2006 @@ -55,6 +55,7 @@ Python 2.5a0: 62071 Python 2.5a0: 62081 (ast-branch) Python 2.5a0: 62091 (with) + Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) . */ #define MAGIC (62092 | ((long)'\r'<<16) | ((long)'\n'<<24)) From python-checkins at python.org Fri Mar 10 08:29:51 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 10 Mar 2006 08:29:51 +0100 (CET) Subject: [Python-checkins] r42953 - peps/trunk/pep-0356.txt Message-ID: <20060310072951.B296E1E4004@bag.python.org> Author: neal.norwitz Date: Fri Mar 10 08:29:48 2006 New Revision: 42953 Modified: peps/trunk/pep-0356.txt Log: Reformat/organize planned features and update unicode, PEP 338 Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Fri Mar 10 08:29:48 2006 @@ -76,34 +76,40 @@ - Add ctypes to the standard library, make it an optional component in the windows installer. Thomas Heller will maintain it. + - Add support for the Unicode 4.1 UCD + Planned features for 2.5 - Target for inclusion of each feature by March 16. At that point, - we should re-evaluate schedule or consider dropping feature. + Each feature below should implemented prior to alpha2 or + will require BDFL approval for inclusion in 2.5. + + - PEP 338 (still needs to be accepted and patch checked in) + + - SyntaxWarnings for the following proposed keywords: - Prepare for 'do' becoming a keyword in 2.6 (PEP 315)? - And as long as we're going wild, how about 'super'? - And what about 'interface' and 'implements'? (PEP 245) - Or 'switch' and 'case'? (PEP 275) + - 'do'? (PEP 315) + - 'super' + - 'interface' and 'implements'? (PEP 245) + - 'switch' and 'case'? (PEP 275) - Add builtin @deprecated decorator? + - Add builtin @deprecated decorator? - Add bdist_msi to the distutils package. (MvL plans to import after pycon) + - Modules under consideration for inclusion: - Add bdist_deb to the distutils package? - (see http://mail.python.org/pipermail/python-dev/2006-February/060926.html) + - bdist_msi in distutils package. (MvL plans to import after pycon) - Add bdist_egg to the distutils package??? + - bdist_deb in distutils package + http://mail.python.org/pipermail/python-dev/2006-February/060926.html - Add setuptools to the standard library. + - bdist_egg in distutils package - Add wsgiref to the standard library. - (Phillip Eby has volunteered to maintain it.) + - setuptools to the standard library - Add pure python pgen module. + - wsgiref to the standard library + (Phillip Eby has volunteered to maintain it.) - Add support for the Unicode 4.1 UCD. + - pure python pgen module Deferred until 2.6: @@ -113,12 +119,8 @@ Open issues - This PEP needs to be updated and release managers confirmed. - - Review PEP 4: Deprecate and/or remove the modules - Should PEP 338 be accepted and implemented. - Copyright From neal at metaslash.com Fri Mar 10 10:11:53 2006 From: neal at metaslash.com (Neal Norwitz) Date: Fri, 10 Mar 2006 04:11:53 -0500 Subject: [Python-checkins] Python Regression Test Failures basics (2) Message-ID: <20060310091153.GA26727@python.psfb.org> case $MAKEFLAGS in \ *-s*) CC='gcc -pthread' LDSHARED='gcc -pthread -shared' OPT='-g -Wall -Wstrict-prototypes' ./python -E ./setup.py -q build;; \ *) CC='gcc -pthread' LDSHARED='gcc -pthread -shared' OPT='-g -Wall -Wstrict-prototypes' ./python -E ./setup.py build;; \ esac running build running build_ext db.h: found (4, 1) in /usr/include db lib: using (4, 1) db-4.1 INFO: Can't locate Tcl/Tk libs and/or headers running build_scripts [35781 refs] ./python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform [9253 refs] find ./Lib -name '*.py[co]' -print | xargs rm -f ./python -E -tt ./Lib/test/regrtest.py -l test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bsddb3 skipped -- Use of the `bsddb' resource not enabled test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_curses test_curses skipped -- Use of the `curses' resource not enabled test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_linuxaudiodev test_linuxaudiodev skipped -- Use of the `audio' resource not enabled test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test test_normalization crashed -- : 1017 test_ntpath test_openpty test_operator test_optparse test_os test_ossaudiodev test_ossaudiodev skipped -- Use of the `audio' resource not enabled test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9258 refs] [9258 refs] [9258 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9453 refs] [9453 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socket_ssl skipped -- Use of the `network' resource not enabled test_socketserver test_socketserver skipped -- Use of the `network' resource not enabled test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9253 refs] [9255 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9254 refs] [9254 refs] [9253 refs] [9254 refs] [9253 refs] [9470 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] this bit of output is from a test of stdout in a different process ... [9254 refs] [9253 refs] [9470 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9253 refs] [9253 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9255 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_timeout skipped -- Use of the `network' resource not enabled test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllib2net skipped -- Use of the `network' resource not enabled test_urllibnet test_urllibnet skipped -- Use of the `network' resource not enabled test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 278 tests OK. 1 test failed: test_normalization 30 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_bsddb3 test_cd test_cl test_curses test_gl test_hashlib_speed test_imgfile test_ioctl test_linuxaudiodev test_macfs test_macostools test_nis test_ossaudiodev test_pep277 test_plistlib test_scriptpackages test_socket_ssl test_socketserver test_sunaudiodev test_tcl test_timeout test_unicode_file test_urllib2net test_urllibnet test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [380808 refs] make: [test] Error 1 (ignored) ./python -E -tt ./Lib/test/regrtest.py -l test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bsddb3 skipped -- Use of the `bsddb' resource not enabled test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_curses test_curses skipped -- Use of the `curses' resource not enabled test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_linuxaudiodev test_linuxaudiodev skipped -- Use of the `audio' resource not enabled test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test test_normalization crashed -- : 1017 test_ntpath test_openpty test_operator test_optparse test_os test_ossaudiodev test_ossaudiodev skipped -- Use of the `audio' resource not enabled test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9258 refs] [9258 refs] [9258 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9453 refs] [9453 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socket_ssl skipped -- Use of the `network' resource not enabled test_socketserver test_socketserver skipped -- Use of the `network' resource not enabled test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9253 refs] [9255 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9254 refs] [9254 refs] [9253 refs] [9254 refs] [9253 refs] [9470 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] this bit of output is from a test of stdout in a different process ... [9254 refs] [9253 refs] [9470 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9253 refs] [9253 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9255 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_timeout skipped -- Use of the `network' resource not enabled test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllib2net skipped -- Use of the `network' resource not enabled test_urllibnet test_urllibnet skipped -- Use of the `network' resource not enabled test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 278 tests OK. 1 test failed: test_normalization 30 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_bsddb3 test_cd test_cl test_curses test_gl test_hashlib_speed test_imgfile test_ioctl test_linuxaudiodev test_macfs test_macostools test_nis test_ossaudiodev test_pep277 test_plistlib test_scriptpackages test_socket_ssl test_socketserver test_sunaudiodev test_tcl test_timeout test_unicode_file test_urllib2net test_urllibnet test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [380207 refs] make: *** [test] Error 1 From neal at metaslash.com Fri Mar 10 11:08:03 2006 From: neal at metaslash.com (Neal Norwitz) Date: Fri, 10 Mar 2006 05:08:03 -0500 Subject: [Python-checkins] Python Regression Test Failures all (1) Message-ID: <20060310100803.GA343@python.psfb.org> test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test test_normalization crashed -- : 1017 test_ntpath test_openpty test_operator test_optparse test_os test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9258 refs] [9258 refs] [9258 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9453 refs] [9453 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socketserver test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9253 refs] [9255 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9254 refs] [9254 refs] [9253 refs] [9254 refs] [9253 refs] [9470 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] this bit of output is from a test of stdout in a different process ... [9254 refs] [9253 refs] [9470 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9253 refs] [9253 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9255 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllibnet test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 284 tests OK. 1 test failed: test_normalization 21 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_cd test_cl test_gl test_hashlib_speed test_imgfile test_ioctl test_macfs test_macostools test_nis test_pep277 test_plistlib test_scriptpackages test_sunaudiodev test_tcl test_unicode_file test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [389899 refs] From python-checkins at python.org Fri Mar 10 12:20:09 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 12:20:09 +0100 (CET) Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c Message-ID: <20060310112009.D8E041E402D@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 12:20:04 2006 New Revision: 42954 Modified: python/trunk/Doc/lib/libunicodedata.tex python/trunk/Include/ucnhash.h python/trunk/Lib/encodings/idna.py python/trunk/Lib/stringprep.py python/trunk/Modules/unicodedata.c Log: Avoid forward-declaring the methods array. Rename unicodedata.db* to unicodedata.ucd* Modified: python/trunk/Doc/lib/libunicodedata.tex ============================================================================== --- python/trunk/Doc/lib/libunicodedata.tex (original) +++ python/trunk/Doc/lib/libunicodedata.tex Fri Mar 10 12:20:04 2006 @@ -131,7 +131,7 @@ \versionadded{2.3} \end{datadesc} -\begin{datadesc}{db_3_2_0} +\begin{datadesc}{ucd_3_2_0} This is an object that has the same methods as the entire module, but uses the Unicode database version 3.2 instead, for applications that require this specific version of Modified: python/trunk/Include/ucnhash.h ============================================================================== --- python/trunk/Include/ucnhash.h (original) +++ python/trunk/Include/ucnhash.h Fri Mar 10 12:20:04 2006 @@ -16,7 +16,7 @@ /* Get name for a given character code. Returns non-zero if success, zero if not. Does not set Python exceptions. If self is NULL, data come from the default version of the database. - If it is not NULL, it should be a unicodedata.db_X_Y_Z object */ + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); /* Get character code for a given name. Same error handling Modified: python/trunk/Lib/encodings/idna.py ============================================================================== --- python/trunk/Lib/encodings/idna.py (original) +++ python/trunk/Lib/encodings/idna.py Fri Mar 10 12:20:04 2006 @@ -1,7 +1,7 @@ # This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) import stringprep, re, codecs -from unicodedata import db_3_2_0 as unicodedata +from unicodedata import ucd_3_2_0 as unicodedata # IDNA section 3.1 dots = re.compile(u"[\u002E\u3002\uFF0E\uFF61]") Modified: python/trunk/Lib/stringprep.py ============================================================================== --- python/trunk/Lib/stringprep.py (original) +++ python/trunk/Lib/stringprep.py Fri Mar 10 12:20:04 2006 @@ -5,7 +5,7 @@ and mappings, for which a mapping function is provided. """ -from unicodedata import db_3_2_0 as unicodedata +from unicodedata import ucd_3_2_0 as unicodedata assert unicodedata.unidata_version == '3.2.0' Modified: python/trunk/Modules/unicodedata.c ============================================================================== --- python/trunk/Modules/unicodedata.c (original) +++ python/trunk/Modules/unicodedata.c Fri Mar 10 12:20:04 2006 @@ -70,67 +70,20 @@ #define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v)) -/* Forward declaration */ -static PyMethodDef unicodedata_functions[]; - static PyMemberDef DB_members[] = { {"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY}, {NULL} }; -static PyTypeObject Xxo_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "unicodedata.DB", /*tp_name*/ - sizeof(PreviousDBVersion), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PyObject_Del, /*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*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - unicodedata_functions, /*tp_methods*/ - DB_members, /*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*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; +// forward declaration +static PyTypeObject UCD_Type; static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), Py_UCS4 (*normalization)(Py_UCS4)) { PreviousDBVersion *self; - self = PyObject_New(PreviousDBVersion, &Xxo_Type); + self = PyObject_New(PreviousDBVersion, &UCD_Type); if (self == NULL) return NULL; self->name = name; @@ -1163,7 +1116,52 @@ {NULL, NULL} /* sentinel */ }; - +static PyTypeObject UCD_Type = { + /* The ob_type field must be initialized in the module init function + * to be portable to Windows without using C++. */ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "unicodedata.UCD", /*tp_name*/ + sizeof(PreviousDBVersion), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyObject_Del, /*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*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + unicodedata_functions, /*tp_methods*/ + DB_members, /*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*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ +}; PyDoc_STRVAR(unicodedata_docstring, "This module provides access to the Unicode Character Database which\n\ @@ -1180,17 +1178,20 @@ { PyObject *m, *v; + UCD_Type.ob_type = &PyType_Type; + m = Py_InitModule3( "unicodedata", unicodedata_functions, unicodedata_docstring); if (!m) return; PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); + PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type); /* Previous versions */ v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0); if (v != NULL) - PyModule_AddObject(m, "db_3_2_0", v); + PyModule_AddObject(m, "ucd_3_2_0", v); /* Export C API */ v = PyCObject_FromVoidPtr((void *) &hashAPI, NULL); From python-checkins at python.org Fri Mar 10 12:29:32 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 12:29:32 +0100 (CET) Subject: [Python-checkins] r42955 - python/trunk/Modules/unicodedata.c Message-ID: <20060310112932.C22391E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 12:29:32 2006 New Revision: 42955 Modified: python/trunk/Modules/unicodedata.c Log: Fix refcounting bug. Modified: python/trunk/Modules/unicodedata.c ============================================================================== --- python/trunk/Modules/unicodedata.c (original) +++ python/trunk/Modules/unicodedata.c Fri Mar 10 12:29:32 2006 @@ -1186,6 +1186,7 @@ return; PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); + Py_INCREF(&UCD_Type); PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type); /* Previous versions */ From python-checkins at python.org Fri Mar 10 12:59:48 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 12:59:48 +0100 (CET) Subject: [Python-checkins] r42956 - python/trunk/Lib/test/test_normalization.py Message-ID: <20060310115948.0BC221E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 12:59:47 2006 New Revision: 42956 Modified: python/trunk/Lib/test/test_normalization.py Log: Update test data to 4.1; disable PRI #29 for now. Modified: python/trunk/Lib/test/test_normalization.py ============================================================================== --- python/trunk/Lib/test/test_normalization.py (original) +++ python/trunk/Lib/test/test_normalization.py Fri Mar 10 12:59:47 2006 @@ -4,8 +4,8 @@ import os from unicodedata import normalize -TESTDATAFILE = "NormalizationTest-3.2.0" + os.extsep + "txt" -TESTDATAURL = "http://www.unicode.org/Public/3.2-Update/" + TESTDATAFILE +TESTDATAFILE = "NormalizationTest" + os.extsep + "txt" +TESTDATAURL = "http://www.unicode.org/Public/4.1.0/ucd/" + TESTDATAFILE class RangeError: pass @@ -38,12 +38,23 @@ if not line: continue if line.startswith("@Part"): - part = line + part = line.split()[0] + continue + if part == "@Part3": + # XXX we don't support PRI #29 yet, so skip these tests for now continue try: c1,c2,c3,c4,c5 = [unistr(x) for x in line.split(';')[:-1]] except RangeError: - # Skip unsupported characters + # Skip unsupported characters; + # try atleast adding c1 if we are in part1 + if part == "@Part1": + try: + c1=unistr(line.split(';')[0]) + except RangeError: + pass + else: + part1_data[c1] = 1 continue if verbose: From mal at egenix.com Fri Mar 10 13:04:09 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Fri, 10 Mar 2006 13:04:09 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <20060310112009.D8E041E402D@bag.python.org> References: <20060310112009.D8E041E402D@bag.python.org> Message-ID: <44116B39.60103@egenix.com> Hallo Martin, ich habe f?r diesen UCDB 4.1 Patch gar keinen SF-Eintrag gesehen. Ich verstehe zwar, weswegen Du UCBD 3.2 kompatibel bleiben willst, allerdings denke ich, da? der eingeschlagene Weg der falsche ist: es w?re wesentlich einfacher gewesen, das bisherige Modul unicodedata (zusammen mit den zugeh?rigen .c und .h Dateien) umzubenennen in z.B. unicodedata32 und dann unicodedata auf 4.1 umzustellen. Mit Deinem Patch m?ssen jetzt Anwender von unicodedata stets zwei Versionen der kompletten Datenbank laden. Ein neues Objekt f?r den Lookup w?re mit dem einfacheren Ansatz auch nicht notwendig gewesen, genausowenig wie die API-?nderung im C Objekt f?r ucnhash. martin.v.loewis wrote: > Author: martin.v.loewis > Date: Fri Mar 10 12:20:04 2006 > New Revision: 42954 > > Modified: > python/trunk/Doc/lib/libunicodedata.tex > python/trunk/Include/ucnhash.h > python/trunk/Lib/encodings/idna.py > python/trunk/Lib/stringprep.py > python/trunk/Modules/unicodedata.c > Log: > Avoid forward-declaring the methods array. > Rename unicodedata.db* to unicodedata.ucd* -- Marc-Andre Lemburg eGenix.com Professional Python Software directly from the Source >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Fri Mar 10 16:36:29 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 16:36:29 +0100 (CET) Subject: [Python-checkins] r42957 - python/trunk/Tools/msi/msi.py Message-ID: <20060310153629.714161E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 16:36:28 2006 New Revision: 42957 Modified: python/trunk/Tools/msi/msi.py Log: Add ctypes. Modified: python/trunk/Tools/msi/msi.py ============================================================================== --- python/trunk/Tools/msi/msi.py (original) +++ python/trunk/Tools/msi/msi.py Fri Mar 10 16:36:28 2006 @@ -108,6 +108,8 @@ '_testcapi.pyd', '_tkinter.pyd', '_msi.pyd', + '_ctypes.pyd', + '_ctypes_test.pyd' ] if major+minor <= "24": From python-checkins at python.org Fri Mar 10 17:03:04 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 17:03:04 +0100 (CET) Subject: [Python-checkins] r42958 - python/trunk/PCbuild/_ctypes.vcproj python/trunk/PCbuild/_ctypes_test.vcproj python/trunk/PCbuild/pcbuild.sln Message-ID: <20060310160304.B1BF01E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 17:02:59 2006 New Revision: 42958 Modified: python/trunk/PCbuild/_ctypes.vcproj python/trunk/PCbuild/_ctypes_test.vcproj python/trunk/PCbuild/pcbuild.sln Log: Add AMD64 and Itanium configurationgs to ctypes; disable them in the solution since ctypes doesn't support these processors on Windows. Modified: python/trunk/PCbuild/_ctypes.vcproj ============================================================================== --- python/trunk/PCbuild/_ctypes.vcproj (original) +++ python/trunk/PCbuild/_ctypes.vcproj Fri Mar 10 17:02:59 2006 @@ -116,6 +116,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: python/trunk/PCbuild/_ctypes_test.vcproj ============================================================================== --- python/trunk/PCbuild/_ctypes_test.vcproj (original) +++ python/trunk/PCbuild/_ctypes_test.vcproj Fri Mar 10 17:02:59 2006 @@ -116,6 +116,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: python/trunk/PCbuild/pcbuild.sln ============================================================================== --- python/trunk/PCbuild/pcbuild.sln (original) +++ python/trunk/PCbuild/pcbuild.sln Fri Mar 10 17:02:59 2006 @@ -252,18 +252,14 @@ {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Debug.Build.0 = Debug|Win32 {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Release.ActiveCfg = Release|Win32 {F22F40F4-D318-40DC-96B3-88DC81CE0894}.Release.Build.0 = Release|Win32 - {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseAMD64.ActiveCfg = Release|Win32 - {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseAMD64.Build.0 = Release|Win32 - {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseItanium.ActiveCfg = Release|Win32 - {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseItanium.Build.0 = Release|Win32 + {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32 + {F22F40F4-D318-40DC-96B3-88DC81CE0894}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32 {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Debug.ActiveCfg = Debug|Win32 {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Debug.Build.0 = Debug|Win32 {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Release.ActiveCfg = Release|Win32 {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.Release.Build.0 = Release|Win32 - {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseAMD64.ActiveCfg = Release|Win32 - {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseAMD64.Build.0 = Release|Win32 - {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseItanium.ActiveCfg = Release|Win32 - {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseItanium.Build.0 = Release|Win32 + {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseAMD64.ActiveCfg = ReleaseAMD64|Win32 + {8CF334D9-4F82-42EB-97AF-83592C5AFD2F}.ReleaseItanium.ActiveCfg = ReleaseItanium|Win32 EndGlobalSection GlobalSection(SolutionItems) = postSolution ..\Modules\getbuildinfo.c = ..\Modules\getbuildinfo.c From python-checkins at python.org Fri Mar 10 19:50:10 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 10 Mar 2006 19:50:10 +0100 (CET) Subject: [Python-checkins] r42959 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060310185010.4DB841E4004@bag.python.org> Author: andrew.kuchling Date: Fri Mar 10 19:50:08 2006 New Revision: 42959 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Unicode database updated; use SVN instead of CVS Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 10 19:50:08 2006 @@ -507,7 +507,7 @@ bug fixes. Here's a partial list of the most notable changes, sorted alphabetically by module name. Consult the \file{Misc/NEWS} file in the source tree for a more -complete list of changes, or look through the CVS logs for all the +complete list of changes, or look through the SVN logs for all the details. \begin{itemize} @@ -614,6 +614,11 @@ % patch 918101 (Contributed by Lars Gust\"abel.) +\item The \module{unicodedata} module has been updated to use version 4.1.0 +of the Unicode character database. Version 3.2.0 is required +by some specifications, so it's still available as +\member{unicodedata.db_3_2_0}. + \item A new package \module{xml.etree} has been added, which contains a subset of the ElementTree XML library. Available modules are \module{ElementTree}, \module{ElementPath}, and @@ -696,7 +701,7 @@ \section{Other Changes and Fixes \label{section-other}} As usual, there were a bunch of other improvements and bugfixes -scattered throughout the source tree. A search through the CVS change +scattered throughout the source tree. A search through the SVN change logs finds there were XXX patches applied and YYY bugs fixed between Python 2.4 and 2.5. Both figures are likely to be underestimates. From martin at v.loewis.de Fri Mar 10 21:18:07 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Fri, 10 Mar 2006 21:18:07 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <44116B39.60103@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> Message-ID: <4411DEFF.8050804@v.loewis.de> M.-A. Lemburg wrote: > ich habe f?r diesen UCDB 4.1 Patch gar keinen SF-Eintrag gesehen. Nein, ich hatte auch keinen gemacht. > Ich verstehe zwar, weswegen Du UCBD 3.2 kompatibel bleiben willst, > allerdings denke ich, da? der eingeschlagene Weg der falsche ist: > es w?re wesentlich einfacher gewesen, das bisherige Modul unicodedata > (zusammen mit den zugeh?rigen .c und .h Dateien) umzubenennen in > z.B. unicodedata32 und dann unicodedata auf 4.1 umzustellen. Einfacher vielleicht: warum aber falsch? Es sind so deutlich weniger Daten. > Mit Deinem Patch m?ssen jetzt Anwender von unicodedata > stets zwei Versionen der kompletten Datenbank laden. Das ist ja genau der Trick: sie m?ssen das nicht. Die Unterst?tzung von Unicode 3.2 kostet nur 18kB. > Ein neues Objekt f?r den Lookup w?re mit dem einfacheren > Ansatz auch nicht notwendig gewesen, genausowenig wie > die API-?nderung im C Objekt f?r ucnhash. Richtig - das war allerdings insgesamt nicht so viel Aufwand. Ciao, Martin From python-checkins at python.org Fri Mar 10 22:26:19 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 22:26:19 +0100 (CET) Subject: [Python-checkins] r42960 - in python/trunk: Lib/test/regrtest.py Misc/NEWS Message-ID: <20060310212619.54C941E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 22:26:16 2006 New Revision: 42960 Modified: python/trunk/Lib/test/regrtest.py python/trunk/Misc/NEWS Log: Add regrtest -w option. Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Fri Mar 10 22:26:16 2006 @@ -9,6 +9,7 @@ Command line options: -v: verbose -- run tests in verbose mode with output to stdout +-w: verbose2 -- re-run failed tests in verbose mode -q: quiet -- don't print anything except if a test fails -g: generate -- write the output file for a test instead of comparing it -x: exclude -- arguments are tests to *exclude* @@ -154,7 +155,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False): + runleaks=False, huntrleaks=False, verbose2=False): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -179,12 +180,12 @@ test_support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:', + opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:w', ['help', 'verbose', 'quiet', 'generate', 'exclude', 'single', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', - 'huntrleaks=' + 'huntrleaks=', 'verbose2', ]) except getopt.error, msg: usage(2, msg) @@ -197,6 +198,8 @@ usage(0) elif o in ('-v', '--verbose'): verbose += 1 + elif o in ('-w', '--verbose2'): + verbose2 = True elif o in ('-q', '--quiet'): quiet = True; verbose = 0 @@ -398,6 +401,20 @@ print "Ask someone to teach regrtest.py about which tests are" print "expected to get skipped on", plat + "." + if verbose2 and bad: + print "Re-running failed tests in verbose mode" + for test in bad: + try: + test_support.verbose = 1 + ok = runtest(test, generate, 1, quiet, testdir, + huntrleaks) + except KeyboardInterrupt: + # print a newline separate from the ^C + print + break + except: + raise + if single: alltests = findtests(testdir, stdtests, nottests) for i in range(len(alltests)): Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 10 22:26:16 2006 @@ -440,6 +440,8 @@ Library ------- +- A regrtest option -w was added to re-run failed tests in verbose mode. + - Patch #1446372: quit and exit can now be called from the interactive interpreter to exit. From python-checkins at python.org Fri Mar 10 23:15:52 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 23:15:52 +0100 (CET) Subject: [Python-checkins] r42961 - in python/branches/release24-maint: Lib/test/regrtest.py Misc/NEWS Message-ID: <20060310221552.424CA1E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 23:15:48 2006 New Revision: 42961 Modified: python/branches/release24-maint/Lib/test/regrtest.py python/branches/release24-maint/Misc/NEWS Log: Backport of 42960, to support the options buildbot uses. Modified: python/branches/release24-maint/Lib/test/regrtest.py ============================================================================== --- python/branches/release24-maint/Lib/test/regrtest.py (original) +++ python/branches/release24-maint/Lib/test/regrtest.py Fri Mar 10 23:15:48 2006 @@ -9,6 +9,7 @@ Command line options: -v: verbose -- run tests in verbose mode with output to stdout +-w: verbose2 -- re-run failed tests in verbose mode -q: quiet -- don't print anything except if a test fails -g: generate -- write the output file for a test instead of comparing it -x: exclude -- arguments are tests to *exclude* @@ -150,7 +151,7 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False, exclude=False, single=False, randomize=False, fromfile=None, findleaks=False, use_resources=None, trace=False, coverdir='coverage', - runleaks=False, huntrleaks=False): + runleaks=False, huntrleaks=False, verbose2=False): """Execute a test suite. This also parses command-line options and modifies its behavior @@ -175,12 +176,12 @@ test_support.record_original_stdout(sys.stdout) try: - opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:', + opts, args = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:w', ['help', 'verbose', 'quiet', 'generate', 'exclude', 'single', 'random', 'fromfile', 'findleaks', 'use=', 'threshold=', 'trace', 'coverdir=', 'nocoverdir', 'runleaks', - 'huntrleaks=' + 'huntrleaks=', 'verbose2', ]) except getopt.error, msg: usage(2, msg) @@ -193,6 +194,8 @@ usage(0) elif o in ('-v', '--verbose'): verbose += 1 + elif o in ('-w', '--verbose2'): + verbose2 = True elif o in ('-q', '--quiet'): quiet = True; verbose = 0 @@ -386,6 +389,20 @@ print "Ask someone to teach regrtest.py about which tests are" print "expected to get skipped on", plat + "." + if verbose2 and bad: + print "Re-running failed tests in verbose mode" + for test in bad: + try: + test_support.verbose = 1 + ok = runtest(test, generate, 1, quiet, testdir, + huntrleaks) + except KeyboardInterrupt: + # print a newline separate from the ^C + print + break + except: + raise + if single: alltests = findtests(testdir, stdtests, nottests) for i in range(len(alltests)): Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Fri Mar 10 23:15:48 2006 @@ -89,6 +89,8 @@ Library ------- +- A regrtest option -w was added to re-run failed tests in verbose mode. + - Patch #1337756: fileinput now handles Unicode filenames correctly. - Patch #1373643: The chunk module can now read chunks larger than From python-checkins at python.org Fri Mar 10 23:56:27 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 10 Mar 2006 23:56:27 +0100 (CET) Subject: [Python-checkins] r42962 - python/branches/release24-maint/Makefile.pre.in Message-ID: <20060310225627.0B8C91E4004@bag.python.org> Author: martin.v.loewis Date: Fri Mar 10 23:56:20 2006 New Revision: 42962 Modified: python/branches/release24-maint/Makefile.pre.in Log: Backport of 42551 (EXTRATESTOPTS). Modified: python/branches/release24-maint/Makefile.pre.in ============================================================================== --- python/branches/release24-maint/Makefile.pre.in (original) +++ python/branches/release24-maint/Makefile.pre.in Fri Mar 10 23:56:20 2006 @@ -533,7 +533,7 @@ # generated bytecode. This is sometimes a very shy bug needing a lot of # sample data. -TESTOPTS= -l +TESTOPTS= -l $(EXTRATESTOPTS) TESTPROG= $(srcdir)/Lib/test/regrtest.py TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) -E -tt test: all platform From python-checkins at python.org Sat Mar 11 00:37:21 2006 From: python-checkins at python.org (tim.peters) Date: Sat, 11 Mar 2006 00:37:21 +0100 (CET) Subject: [Python-checkins] r42963 - python/trunk/Lib/test/regrtest.py Message-ID: <20060310233721.8B2C81E4005@bag.python.org> Author: tim.peters Date: Sat Mar 11 00:37:10 2006 New Revision: 42963 Modified: python/trunk/Lib/test/regrtest.py Log: When the new -w option (yay! great idea) reruns a failed test, first display the name of the test (else it's not always clear from the output which test is getting run). Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Sat Mar 11 00:37:10 2006 @@ -404,6 +404,8 @@ if verbose2 and bad: print "Re-running failed tests in verbose mode" for test in bad: + print "Re-running test %r in verbose mode" % test + sys.stdout.flush() try: test_support.verbose = 1 ok = runtest(test, generate, 1, quiet, testdir, From python-checkins at python.org Sat Mar 11 00:39:59 2006 From: python-checkins at python.org (tim.peters) Date: Sat, 11 Mar 2006 00:39:59 +0100 (CET) Subject: [Python-checkins] r42964 - in python/trunk: Lib/site.py Lib/test/test_normalization.py Tools/unicode/makeunicodedata.py Message-ID: <20060310233959.80EAB1E4004@bag.python.org> Author: tim.peters Date: Sat Mar 11 00:39:56 2006 New Revision: 42964 Modified: python/trunk/Lib/site.py python/trunk/Lib/test/test_normalization.py python/trunk/Tools/unicode/makeunicodedata.py Log: Whitespace normalization. Modified: python/trunk/Lib/site.py ============================================================================== --- python/trunk/Lib/site.py (original) +++ python/trunk/Lib/site.py Sat Mar 11 00:39:56 2006 @@ -232,7 +232,7 @@ eof = 'Ctrl-Z plus Return' else: eof = 'Ctrl-D (i.e. EOF)' - + class Quitter(object): def __init__(self, name): self.name = name Modified: python/trunk/Lib/test/test_normalization.py ============================================================================== --- python/trunk/Lib/test/test_normalization.py (original) +++ python/trunk/Lib/test/test_normalization.py Sat Mar 11 00:39:56 2006 @@ -46,10 +46,10 @@ try: c1,c2,c3,c4,c5 = [unistr(x) for x in line.split(';')[:-1]] except RangeError: - # Skip unsupported characters; + # Skip unsupported characters; # try atleast adding c1 if we are in part1 if part == "@Part1": - try: + try: c1=unistr(line.split(';')[0]) except RangeError: pass Modified: python/trunk/Tools/unicode/makeunicodedata.py ============================================================================== --- python/trunk/Tools/unicode/makeunicodedata.py (original) +++ python/trunk/Tools/unicode/makeunicodedata.py Sat Mar 11 00:39:56 2006 @@ -666,7 +666,7 @@ new.changed.append((version, zip(bidir_changes, category_changes, decimal_changes, numeric_changes), normalization_changes)) - + # -------------------------------------------------------------------- # the following support code is taken from the unidb utilities From python-checkins at python.org Sat Mar 11 01:39:13 2006 From: python-checkins at python.org (phillip.eby) Date: Sat, 11 Mar 2006 01:39:13 +0100 (CET) Subject: [Python-checkins] r42965 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools/command/develop.py setuptools/command/easy_install.py site.py Message-ID: <20060311003913.929471E4004@bag.python.org> Author: phillip.eby Date: Sat Mar 11 01:39:09 2006 New Revision: 42965 Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools/command/develop.py sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/site.py Log: Added automatic handling of installation conflicts. Eggs are now shifted to the front of sys.path, in an order consistent with where they came from, making EasyInstall seamlessly co-operate with system package managers. The ``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk`` options are now no longer necessary, and will generate warnings at the end of a run if you use them. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Sat Mar 11 01:39:09 2006 @@ -465,6 +465,15 @@ Dealing with Installation Conflicts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +(NOTE: As of 0.6a11, this section is obsolete; it is retained here only so that +people using older versions of EasyInstall can consult it. As of version +0.6a11, installation conflicts are handled automatically without deleting the +old or system-installed packages, and without ignoring the issue. Instead, +eggs are automatically shifted to the front of ``sys.path`` using special +code added to the ``easy-install.pth`` file. So, if you are using version +0.6a11 or better of setuptools, you do not need to worry about conflicts, +and the following issues do not apply to you.) + EasyInstall installs distributions in a "managed" way, such that each distribution can be independently activated or deactivated on ``sys.path``. However, packages that were not installed by EasyInstall are "unmanaged", @@ -715,7 +724,9 @@ package not being available locally, or due to the use of the ``--update`` or ``-U`` option. -``--delete-conflicting, -D`` (New in 0.5a9) +``--delete-conflicting, -D`` (Removed in 0.6a11) + (As of 0.6a11, this option is no longer necessary; please do not use it!) + If you are replacing a package that was previously installed *without* using EasyInstall, the old version may end up on ``sys.path`` before the version being installed with EasyInstall. EasyInstall will normally abort @@ -724,7 +735,9 @@ option, however, EasyInstall will attempt to delete the files or directories itself, and then proceed with the installation. -``--ignore-conflicts-at-my-risk`` (New in 0.5a9) +``--ignore-conflicts-at-my-risk`` (Removed in 0.6a11) + (As of 0.6a11, this option is no longer necessary; please do not use it!) + Ignore conflicting packages and proceed with installation anyway, even though it means the package probably won't work properly. If the conflicting package is in a directory you can't write to, this may be your @@ -1066,6 +1079,14 @@ time out or be missing a file. 0.6a11 + * Added automatic handling of installation conflicts. Eggs are now shifted to + the front of sys.path, in an order consistent with where they came from, + making EasyInstall seamlessly co-operate with system package managers. + + The ``--delete-conflicting`` and ``--ignore-conflicts-at-my-risk`` options + are now no longer necessary, and will generate warnings at the end of a + run if you use them. + * Don't recursively traverse subdirectories given to ``--find-links``. 0.6a10 Modified: sandbox/trunk/setuptools/setuptools/command/develop.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/develop.py (original) +++ sandbox/trunk/setuptools/setuptools/command/develop.py Sat Mar 11 01:39:09 2006 @@ -24,6 +24,7 @@ self.uninstall_link() else: self.install_for_development() + self.warn_deprecated_options() def initialize_options(self): self.uninstall = None @@ -38,7 +39,6 @@ - def finalize_options(self): ei = self.get_finalized_command("egg_info") if ei.broken_egg_info: Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Sat Mar 11 01:39:09 2006 @@ -9,7 +9,7 @@ __ http://peak.telecommunity.com/DevCenter/EasyInstall """ -import sys, os.path, zipimport, shutil, tempfile, zipfile, re, stat +import sys, os.path, zipimport, shutil, tempfile, zipfile, re, stat, random from glob import glob from setuptools import Command from setuptools.sandbox import run_setup @@ -55,10 +55,9 @@ ("always-copy", "a", "Copy all needed packages to install dir"), ("index-url=", "i", "base URL of Python Package Index"), ("find-links=", "f", "additional URL(s) to search for packages"), - ("delete-conflicting", "D", "delete old packages that get in the way"), + ("delete-conflicting", "D", "no longer needed; don't use this"), ("ignore-conflicts-at-my-risk", None, - "install even if old packages are in the way, even though it " - "most likely means the new package won't work."), + "no longer needed; don't use this"), ("build-directory=", "b", "download/extract/build in DIR; keep the results"), ('optimize=', 'O', @@ -80,6 +79,7 @@ negative_opt = {'always-unzip': 'zip-ok'} create_index = PackageIndex + def initialize_options(self): self.zip_ok = None self.install_dir = self.script_dir = self.exclude_scripts = None @@ -221,28 +221,28 @@ "writing list of installed files to '%s'" % self.record ) + self.warn_deprecated_options() finally: log.set_verbosity(self.distribution.verbose) - def pseudo_tempname(self): """Return a pseudo-tempname base in the install directory. - This code is intentionally naive; if a malicious party can write to the target directory you're already in deep doodoo. """ try: pid = os.getpid() except: - import random pid = random.randint(0,sys.maxint) return os.path.join(self.install_dir, "test-easy-install-%s" % pid) - - - - - + def warn_deprecated_options(self): + if self.delete_conflicting or self.ignore_conflicts_at_my_risk: + log.warn( + "Note: The -D, --delete-conflicting and" + " --ignore-conflicts-at-my-risk no longer have any purpose" + " and should not be used." + ) def check_site_dir(self): """Verify that self.install_dir is .pth-capable dir, if needed""" @@ -786,6 +786,7 @@ def check_conflicts(self, dist): """Verify that there are no conflicting "old-style" packages""" + return dist # XXX temporarily disable until new strategy is stable from imp import find_module, get_suffixes from glob import glob @@ -812,7 +813,6 @@ blockers.append(filename) elif ext in exts and base!='site': # XXX ugh blockers.append(os.path.join(path,filename)) - if blockers: self.found_conflicts(dist, blockers) @@ -1072,16 +1072,18 @@ sitepy = os.path.join(self.install_dir, "site.py") source = resource_string(Requirement.parse("setuptools"), "site.py") + current = "" if os.path.exists(sitepy): log.debug("Checking existing site.py in %s", self.install_dir) current = open(sitepy,'rb').read() - if current != source: + if not current.startswith('def __boot():'): raise DistutilsError( "%s is not a setuptools-generated site.py; please" " remove it." % sitepy ) - else: + + if current != source: log.info("Creating %s", sitepy) if not self.dry_run: ensure_directory(sitepy) @@ -1103,8 +1105,6 @@ - - INSTALL_SCHEMES = dict( posix = dict( install_dir = '$base/lib/python$py_version_short/site-packages', @@ -1323,9 +1323,13 @@ def _load(self): self.paths = [] + saw_import = False seen = {} if os.path.isfile(self.filename): for line in open(self.filename,'rt'): + if line.startswith('import'): + saw_import = True + continue path = line.rstrip() self.paths.append(path) if not path.strip() or path.strip().startswith('#'): @@ -1339,17 +1343,41 @@ continue seen[path] = 1 - while self.paths and not self.paths[-1].strip(): self.paths.pop() + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): """Write changed .pth file back to disk""" - if self.dirty: + if not self.dirty: + return + + data = '\n'.join(self.paths) + if data: log.debug("Saving %s", self.filename) - data = '\n'.join(self.paths+['']) + data = ( + "import sys; sys.__plen = len(sys.path)\n" + "%s\n" + "import sys; new=sys.path[sys.__plen:];" + " del sys.path[sys.__plen:];" + " p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;" + " sys.__egginsert = p+len(new)\n" + ) % data + if os.path.islink(self.filename): os.unlink(self.filename) - f = open(self.filename,'wt'); f.write(data); f.close() - self.dirty = False + f = open(self.filename,'wb') + f.write(data); f.close() + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False def add(self,dist): """Add `dist` to the distribution map""" @@ -1392,6 +1420,19 @@ + + + + + + + + + + + + + def get_script_args(dist, executable=sys_executable): """Yield write_script() argument tuples for a distribution's entrypoints""" spec = str(dist.as_requirement()) Modified: sandbox/trunk/setuptools/site.py ============================================================================== --- sandbox/trunk/setuptools/site.py (original) +++ sandbox/trunk/setuptools/site.py Sat Mar 11 01:39:09 2006 @@ -41,12 +41,16 @@ known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp + oldpos = getattr(sys,'__egginsert',0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + for item in PYTHONPATH: addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position d,nd = makepath(stdpath[0]) insert_at = None - skipped = [] new_path = [] for item in sys.path: @@ -54,22 +58,15 @@ if np==nd and insert_at is None: # We've hit the first 'system' path entry, so added entries go here - new_path.extend(skipped) insert_at = len(new_path) - skipped = [] - if np in known_paths: - # Old path, just copy + if np in known_paths or insert_at is None: new_path.append(item) - elif insert_at is None: - # New path before the insert point, buffer it - skipped.append(item) else: # new path after the insert point, back-insert it new_path.insert(insert_at, item) insert_at += 1 - new_path.extend(skipped) sys.path[:] = new_path if __name__=='site': @@ -80,3 +77,6 @@ + + + From python-checkins at python.org Sat Mar 11 05:55:46 2006 From: python-checkins at python.org (tim.peters) Date: Sat, 11 Mar 2006 05:55:46 +0100 (CET) Subject: [Python-checkins] r42966 - in python/branches/release24-maint: Lib/test/test_hotshot.py Modules/_hotshot.c Message-ID: <20060311045546.A64AC1E4004@bag.python.org> Author: tim.peters Date: Sat Mar 11 05:55:45 2006 New Revision: 42966 Modified: python/branches/release24-maint/Lib/test/test_hotshot.py python/branches/release24-maint/Modules/_hotshot.c Log: Merge rev 42904 from the trunk. _hotshot hotshot_profiler(): If write_header() returned an error code, this let `self` leak. This is a disaster on Windows, since `self` already points to a newly-opened file object, and it was impossible for Python code to close the thing since the only reference to it was in a blob of leaked C memory. test_hotshot test_bad_sys_path(): This new test provoked the C bug above. This test passed, but left an open "@test" file behind, which caused a massive cascade of bogus test failures in later, unrelated tests on Windows. Changed the test code to remove the @test file it leaves behind, which relies on the change above to close that file first. Modified: python/branches/release24-maint/Lib/test/test_hotshot.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_hotshot.py (original) +++ python/branches/release24-maint/Lib/test/test_hotshot.py Sat Mar 11 05:55:45 2006 @@ -109,17 +109,20 @@ def test_bad_sys_path(self): import sys + import os orig_path = sys.path coverage = hotshot._hotshot.coverage try: # verify we require a list for sys.path sys.path = 'abc' self.assertRaises(RuntimeError, coverage, test_support.TESTFN) - # verify sys.path exists + # verify that we require sys.path exists del sys.path self.assertRaises(RuntimeError, coverage, test_support.TESTFN) finally: sys.path = orig_path + if os.path.exists(test_support.TESTFN): + os.remove(test_support.TESTFN) def test_main(): test_support.run_unittest(HotShotTestCase) Modified: python/branches/release24-maint/Modules/_hotshot.c ============================================================================== --- python/branches/release24-maint/Modules/_hotshot.c (original) +++ python/branches/release24-maint/Modules/_hotshot.c Sat Mar 11 05:55:45 2006 @@ -1556,9 +1556,11 @@ calibrate(); calibrate(); } - if (write_header(self)) + if (write_header(self)) { /* some error occurred, exception has been set */ + Py_DECREF(self); self = NULL; + } } return (PyObject *) self; } From python-checkins at python.org Sat Mar 11 13:16:28 2006 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 11 Mar 2006 13:16:28 +0100 (CET) Subject: [Python-checkins] r42967 - python/trunk/Modules/unicodedata.c Message-ID: <20060311121628.9E05C1E4005@bag.python.org> Author: martin.v.loewis Date: Sat Mar 11 13:16:23 2006 New Revision: 42967 Modified: python/trunk/Modules/unicodedata.c Log: Adjust CJK Ideograph range to Unicode 4.1. Modified: python/trunk/Modules/unicodedata.c ============================================================================== --- python/trunk/Modules/unicodedata.c (original) +++ python/trunk/Modules/unicodedata.c Sat Mar 11 13:16:23 2006 @@ -803,7 +803,7 @@ { return ( (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */ - (0x4E00 <= code && code <= 0x9FA5) || /* CJK Ideograph */ + (0x4E00 <= code && code <= 0x9FBB) || /* CJK Ideograph */ (0x20000 <= code && code <= 0x2A6D6));/* CJK Ideograph Extension B */ } @@ -815,6 +815,17 @@ int word; unsigned char* w; + if (code >= 0x110000) + return 0; + + if (self) { + const change_record *old = get_old_record(self, code); + if (old->category_changed == 0) { + /* unassigned */ + return 0; + } + } + if (SBase <= code && code < SBase+SCount) { /* Hangul syllable. */ int SIndex = code - SBase; @@ -845,18 +856,6 @@ return 1; } - if (code >= 0x110000) - return 0; - - if (self) { - const change_record *old = get_old_record(self, code); - if (old->category_changed == 0) { - /* unassigned */ - return 0; - } - } - - /* get offset into phrasebook */ offset = phrasebook_offset1[(code>>phrasebook_shift)]; offset = phrasebook_offset2[(offset< Author: martin.v.loewis Date: Sat Mar 11 13:43:44 2006 New Revision: 42968 Modified: python/trunk/Tools/unicode/makeunicodedata.py Log: Add changelog entry. Modified: python/trunk/Tools/unicode/makeunicodedata.py ============================================================================== --- python/trunk/Tools/unicode/makeunicodedata.py (original) +++ python/trunk/Tools/unicode/makeunicodedata.py Sat Mar 11 13:43:44 2006 @@ -19,6 +19,7 @@ # 2002-11-24 mvl expand all ranges, sort names version-independently # 2002-11-25 mvl add UNIDATA_VERSION # 2004-05-29 perky add east asian width information +# 2006-03-10 mvl update to Unicode 4.1; add UCD 3.2 delta # # written by Fredrik Lundh (fredrik at pythonware.com) # From python-checkins at python.org Sun Mar 12 00:05:40 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 00:05:40 +0100 (CET) Subject: [Python-checkins] r42969 - python/trunk/PCbuild/_ssl.vcproj Message-ID: <20060311230540.06A341E400C@bag.python.org> Author: tim.peters Date: Sun Mar 12 00:05:39 2006 New Revision: 42969 Modified: python/trunk/PCbuild/_ssl.vcproj Log: Give the _ssl project a harmless command to perform for its "clean" action. Else the clean step run by the buildbot reports failure, due to the _ssl project whining about not being able to spawn an empty string. Modified: python/trunk/PCbuild/_ssl.vcproj ============================================================================== --- python/trunk/PCbuild/_ssl.vcproj (original) +++ python/trunk/PCbuild/_ssl.vcproj Sun Mar 12 00:05:39 2006 @@ -3,6 +3,7 @@ ProjectType="Visual C++" Version="7.10" Name="_ssl" + RootNamespace="_ssl" SccProjectName="" SccLocalPath="" Keyword="MakeFileProj"> @@ -22,6 +23,7 @@ Name="VCNMakeTool" BuildCommandLine="python build_ssl.py" ReBuildCommandLine="python build_ssl.py -a" + CleanCommandLine="echo Nothing to do" Output="_ssl.pyd"/> Author: martin.v.loewis Date: Sun Mar 12 00:56:39 2006 New Revision: 42970 Added: python/trunk/PCbuild/pytest.bat (contents, props changed) Log: Add buildbot test script. Added: python/trunk/PCbuild/pytest.bat ============================================================================== --- (empty file) +++ python/trunk/PCbuild/pytest.bat Sun Mar 12 00:56:39 2006 @@ -0,0 +1,4 @@ +cd PCbuild +call rt.bat -d -uall -rw + + From python-checkins at python.org Sun Mar 12 01:01:41 2006 From: python-checkins at python.org (thomas.wouters) Date: Sun, 12 Mar 2006 01:01:41 +0100 (CET) Subject: [Python-checkins] r42971 - python/trunk/Modules/_bsddb.c Message-ID: <20060312000141.07EAD1E401F@bag.python.org> Author: thomas.wouters Date: Sun Mar 12 01:01:38 2006 New Revision: 42971 Modified: python/trunk/Modules/_bsddb.c Log: Fix another leak in bsddb, and avoid use of uninitialized value -- funny how gcc 4.0.x wasn't complaining about *that* one ;) Modified: python/trunk/Modules/_bsddb.c ============================================================================== --- python/trunk/Modules/_bsddb.c (original) +++ python/trunk/Modules/_bsddb.c Sun Mar 12 01:01:38 2006 @@ -1742,6 +1742,7 @@ return NULL; } cursors[x] = ((DBCursorObject*)item)->dbc; + Py_DECREF(item); } MYDB_BEGIN_ALLOW_THREADS; @@ -2017,7 +2018,7 @@ { int res = 0; PyObject *args; - PyObject *result; + PyObject *result = NULL; DBObject *self = (DBObject *)db->app_private; if (self == NULL || self->btCompareCallback == NULL) { From python-checkins at python.org Sun Mar 12 01:13:10 2006 From: python-checkins at python.org (thomas.wouters) Date: Sun, 12 Mar 2006 01:13:10 +0100 (CET) Subject: [Python-checkins] r42972 - python/trunk/Lib/bsddb/test/test_associate.py Message-ID: <20060312001310.0A5E61E400C@bag.python.org> Author: thomas.wouters Date: Sun Mar 12 01:13:09 2006 New Revision: 42972 Modified: python/trunk/Lib/bsddb/test/test_associate.py Log: Plug the last 657 referenceleaks in test_bsddb3: a circular reference between a TestCase instance, the database it opened (or a cursor to a database) and a bound method as a registered database callback, and a lack of GC-handling in bsddb caused the TestCases to linger. Fix the test, for now, as backward compatibility makes adding GC to bsddb annoying. Modified: python/trunk/Lib/bsddb/test/test_associate.py ============================================================================== --- python/trunk/Lib/bsddb/test/test_associate.py (original) +++ python/trunk/Lib/bsddb/test/test_associate.py Sun Mar 12 01:13:09 2006 @@ -105,6 +105,7 @@ def tearDown(self): self.env.close() + self.env = None import glob files = glob.glob(os.path.join(self.homeDir, '*')) for file in files: @@ -166,6 +167,7 @@ def tearDown(self): self.closeDB() self.env.close() + self.env = None import glob files = glob.glob(os.path.join(self.homeDir, '*')) for file in files: @@ -192,9 +194,12 @@ def closeDB(self): if self.cur: self.cur.close() + self.cur = None if self.secDB: self.secDB.close() + self.secDB = None self.primary.close() + self.primary = None def getDB(self): return self.primary From python-checkins at python.org Sun Mar 12 01:29:36 2006 From: python-checkins at python.org (thomas.wouters) Date: Sun, 12 Mar 2006 01:29:36 +0100 (CET) Subject: [Python-checkins] r42973 - python/trunk/Objects/unicodeobject.c Message-ID: <20060312002936.E0FBC1E400C@bag.python.org> Author: thomas.wouters Date: Sun Mar 12 01:29:36 2006 New Revision: 42973 Modified: python/trunk/Objects/unicodeobject.c Log: - Reindent a confusingly indented piece of code (no intended code changes there) - Add missing DECREFs of inner-scope 'temp' variable - Add various missing DECREFs by changing 'return NULL' into 'goto onError' - Avoid double DECREF when last _PyUnicode_Resize() fails Coverity found one of the missing DECREFs, but oddly enough not the others. Modified: python/trunk/Objects/unicodeobject.c ============================================================================== --- python/trunk/Objects/unicodeobject.c (original) +++ python/trunk/Objects/unicodeobject.c Sun Mar 12 01:29:36 2006 @@ -7068,15 +7068,15 @@ /* nothing to do */; else if (PyString_Check(temp)) { /* convert to string to Unicode */ - unicode = PyUnicode_Decode(PyString_AS_STRING(temp), + unicode = PyUnicode_Decode(PyString_AS_STRING(temp), PyString_GET_SIZE(temp), - NULL, + NULL, "strict"); - Py_DECREF(temp); - temp = unicode; - if (temp == NULL) - goto onError; - } + Py_DECREF(temp); + temp = unicode; + if (temp == NULL) + goto onError; + } else { Py_DECREF(temp); PyErr_SetString(PyExc_TypeError, @@ -7172,11 +7172,13 @@ reslen += rescnt; if (reslen < 0) { Py_XDECREF(temp); - Py_DECREF(result); - return PyErr_NoMemory(); + PyErr_NoMemory(); + goto onError; + } + if (_PyUnicode_Resize(&result, reslen) < 0) { + Py_XDECREF(temp); + goto onError; } - if (_PyUnicode_Resize(&result, reslen) < 0) - return NULL; res = PyUnicode_AS_UNICODE(result) + reslen - rescnt; } @@ -7226,6 +7228,7 @@ if (dict && (argidx < arglen) && c != '%') { PyErr_SetString(PyExc_TypeError, "not all arguments converted during string formatting"); + Py_XDECREF(temp); goto onError; } Py_XDECREF(temp); @@ -7237,12 +7240,12 @@ goto onError; } + if (_PyUnicode_Resize(&result, reslen - rescnt) < 0) + goto onError; if (args_owned) { Py_DECREF(args); } Py_DECREF(uformat); - if (_PyUnicode_Resize(&result, reslen - rescnt) < 0) - goto onError; return (PyObject *)result; onError: From python-checkins at python.org Sun Mar 12 07:47:37 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 07:47:37 +0100 (CET) Subject: [Python-checkins] r42974 - python/trunk/PCbuild/pybuild.bat python/trunk/PCbuild/pyclean.bat Message-ID: <20060312064737.7F8851E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 07:47:36 2006 New Revision: 42974 Modified: python/trunk/PCbuild/pybuild.bat python/trunk/PCbuild/pyclean.bat Log: Added brief comments. Modified: python/trunk/PCbuild/pybuild.bat ============================================================================== --- python/trunk/PCbuild/pybuild.bat (original) +++ python/trunk/PCbuild/pybuild.bat Sun Mar 12 07:47:36 2006 @@ -1,3 +1,3 @@ + at rem Used by the buildbot "compile" step. call "%VS71COMNTOOLS%vsvars32.bat" devenv.com /build Debug PCbuild\pcbuild.sln - Modified: python/trunk/PCbuild/pyclean.bat ============================================================================== --- python/trunk/PCbuild/pyclean.bat (original) +++ python/trunk/PCbuild/pyclean.bat Sun Mar 12 07:47:36 2006 @@ -1,3 +1,3 @@ + at rem Used by the buildbot "clean" step. call "%VS71COMNTOOLS%vsvars32.bat" devenv.com /clean Debug PCbuild\pcbuild.sln - From python-checkins at python.org Sun Mar 12 07:48:58 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 07:48:58 +0100 (CET) Subject: [Python-checkins] r42975 - python/branches/release24-maint/PCbuild/pybuild.bat Message-ID: <20060312064858.256931E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 07:48:57 2006 New Revision: 42975 Added: python/branches/release24-maint/PCbuild/pybuild.bat - copied unchanged from r42974, python/trunk/PCbuild/pybuild.bat Log: Copy from the trunk, for the buildbot. From python-checkins at python.org Sun Mar 12 07:49:18 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 07:49:18 +0100 (CET) Subject: [Python-checkins] r42976 - python/branches/release24-maint/PCbuild/pyclean.bat Message-ID: <20060312064918.DC1A81E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 07:49:18 2006 New Revision: 42976 Added: python/branches/release24-maint/PCbuild/pyclean.bat - copied unchanged from r42975, python/trunk/PCbuild/pyclean.bat Log: Copy from the trunk, for the buildbot. From python-checkins at python.org Sun Mar 12 08:00:56 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 08:00:56 +0100 (CET) Subject: [Python-checkins] r42977 - python/trunk/PCbuild/pytest.bat Message-ID: <20060312070056.671AC1E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 08:00:54 2006 New Revision: 42977 Modified: python/trunk/PCbuild/pytest.bat Log: Added brief comment. Modified: python/trunk/PCbuild/pytest.bat ============================================================================== --- python/trunk/PCbuild/pytest.bat (original) +++ python/trunk/PCbuild/pytest.bat Sun Mar 12 08:00:54 2006 @@ -1,4 +1,3 @@ + at rem Used by the buildbot "test" step. cd PCbuild call rt.bat -d -uall -rw - - From python-checkins at python.org Sun Mar 12 08:01:31 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 08:01:31 +0100 (CET) Subject: [Python-checkins] r42978 - python/branches/release24-maint/PCbuild/pytest.bat Message-ID: <20060312070131.CD1961E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 08:01:31 2006 New Revision: 42978 Added: python/branches/release24-maint/PCbuild/pytest.bat - copied unchanged from r42977, python/trunk/PCbuild/pytest.bat Log: Copied from the trunk for buildbot use. From python-checkins at python.org Sun Mar 12 08:05:36 2006 From: python-checkins at python.org (tim.peters) Date: Sun, 12 Mar 2006 08:05:36 +0100 (CET) Subject: [Python-checkins] r42979 - python/branches/release24-maint/PCbuild/_ssl.vcproj Message-ID: <20060312070536.B2A001E4007@bag.python.org> Author: tim.peters Date: Sun Mar 12 08:05:34 2006 New Revision: 42979 Modified: python/branches/release24-maint/PCbuild/_ssl.vcproj Log: Add a do-nothing "clean" operation to the _ssl project, so the buildbot's "clean" step doesn't fail due to _ssl whining that it can't spawn an empty string. Modified: python/branches/release24-maint/PCbuild/_ssl.vcproj ============================================================================== --- python/branches/release24-maint/PCbuild/_ssl.vcproj (original) +++ python/branches/release24-maint/PCbuild/_ssl.vcproj Sun Mar 12 08:05:34 2006 @@ -22,6 +22,7 @@ Name="VCNMakeTool" BuildCommandLine="python build_ssl.py" ReBuildCommandLine="python build_ssl.py -a" + CleanCommandLine="echo Nothing to do" Output="_ssl.pyd"/> From python-checkins at python.org Sun Mar 12 10:50:44 2006 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 12 Mar 2006 10:50:44 +0100 (CET) Subject: [Python-checkins] r42980 - in python/trunk: PCbuild/pybuild.bat PCbuild/pyclean.bat PCbuild/pytest.bat Tools/buildbot Tools/buildbot/build.bat Tools/buildbot/clean.bat Tools/buildbot/test.bat Message-ID: <20060312095044.E658D1E4007@bag.python.org> Author: martin.v.loewis Date: Sun Mar 12 10:50:39 2006 New Revision: 42980 Added: python/trunk/Tools/buildbot/ python/trunk/Tools/buildbot/build.bat - copied unchanged from r42979, python/trunk/PCbuild/pybuild.bat python/trunk/Tools/buildbot/clean.bat - copied unchanged from r42979, python/trunk/PCbuild/pyclean.bat python/trunk/Tools/buildbot/test.bat - copied unchanged from r42979, python/trunk/PCbuild/pytest.bat Removed: python/trunk/PCbuild/pybuild.bat python/trunk/PCbuild/pyclean.bat python/trunk/PCbuild/pytest.bat Log: Move buildbot scripts to Tools/buildbot. Deleted: /python/trunk/PCbuild/pybuild.bat ============================================================================== --- /python/trunk/PCbuild/pybuild.bat Sun Mar 12 10:50:39 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "compile" step. -call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /build Debug PCbuild\pcbuild.sln Deleted: /python/trunk/PCbuild/pyclean.bat ============================================================================== --- /python/trunk/PCbuild/pyclean.bat Sun Mar 12 10:50:39 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "clean" step. -call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /clean Debug PCbuild\pcbuild.sln Deleted: /python/trunk/PCbuild/pytest.bat ============================================================================== --- /python/trunk/PCbuild/pytest.bat Sun Mar 12 10:50:39 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "test" step. -cd PCbuild -call rt.bat -d -uall -rw From python-checkins at python.org Sun Mar 12 10:51:54 2006 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 12 Mar 2006 10:51:54 +0100 (CET) Subject: [Python-checkins] r42981 - in python/branches/release24-maint: PCbuild/pybuild.bat PCbuild/pyclean.bat PCbuild/pytest.bat Tools/buildbot Tools/buildbot/build.bat Tools/buildbot/clean.bat Tools/buildbot/test.bat Message-ID: <20060312095154.0C6321E4007@bag.python.org> Author: martin.v.loewis Date: Sun Mar 12 10:51:52 2006 New Revision: 42981 Added: python/branches/release24-maint/Tools/buildbot/ python/branches/release24-maint/Tools/buildbot/build.bat - copied unchanged from r42979, python/branches/release24-maint/PCbuild/pybuild.bat python/branches/release24-maint/Tools/buildbot/clean.bat - copied unchanged from r42979, python/branches/release24-maint/PCbuild/pyclean.bat python/branches/release24-maint/Tools/buildbot/test.bat - copied unchanged from r42979, python/branches/release24-maint/PCbuild/pytest.bat Removed: python/branches/release24-maint/PCbuild/pybuild.bat python/branches/release24-maint/PCbuild/pyclean.bat python/branches/release24-maint/PCbuild/pytest.bat Log: Move buildbot scripts to Tools/buildbot. Deleted: /python/branches/release24-maint/PCbuild/pybuild.bat ============================================================================== --- /python/branches/release24-maint/PCbuild/pybuild.bat Sun Mar 12 10:51:52 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "compile" step. -call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /build Debug PCbuild\pcbuild.sln Deleted: /python/branches/release24-maint/PCbuild/pyclean.bat ============================================================================== --- /python/branches/release24-maint/PCbuild/pyclean.bat Sun Mar 12 10:51:52 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "clean" step. -call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /clean Debug PCbuild\pcbuild.sln Deleted: /python/branches/release24-maint/PCbuild/pytest.bat ============================================================================== --- /python/branches/release24-maint/PCbuild/pytest.bat Sun Mar 12 10:51:52 2006 +++ (empty file) @@ -1,3 +0,0 @@ - at rem Used by the buildbot "test" step. -cd PCbuild -call rt.bat -d -uall -rw From python-checkins at python.org Sun Mar 12 22:06:38 2006 From: python-checkins at python.org (fredrik.lundh) Date: Sun, 12 Mar 2006 22:06:38 +0100 (CET) Subject: [Python-checkins] r42982 - python/trunk/Modules/_elementtree.c Message-ID: <20060312210638.1D4F21E4007@bag.python.org> Author: fredrik.lundh Date: Sun Mar 12 22:06:35 2006 New Revision: 42982 Modified: python/trunk/Modules/_elementtree.c Log: merged with cElementTree development trunk (1.0.6 snapshot): Fixed a number of potential null-pointer-reference-under-pressure glitches, based on input from the Coverity analysis tool and Simo Salminen. Modified: python/trunk/Modules/_elementtree.c ============================================================================== --- python/trunk/Modules/_elementtree.c (original) +++ python/trunk/Modules/_elementtree.c Sun Mar 12 22:06:35 2006 @@ -1,6 +1,6 @@ /* * ElementTree - * $Id: /work/modules/celementtree/cElementTree.c 1128 2005-12-16T21:57:13.668520Z Fredrik $ + * $Id: _elementtree.c 2657 2006-03-12 20:50:32Z fredrik $ * * elementtree accelerator * @@ -33,9 +33,11 @@ * 2005-08-11 fl added runtime test for copy workaround (1.0.3) * 2005-12-13 fl added expat_capi support (for xml.etree) (1.0.4) * 2005-12-16 fl added support for non-standard encodings + * 2006-03-08 fl fixed a couple of potential null-refs and leaks + * 2006-03-12 fl merge in 2.5 ssize_t changes * - * Copyright (c) 1999-2005 by Secret Labs AB. All rights reserved. - * Copyright (c) 1999-2005 by Fredrik Lundh. + * Copyright (c) 1999-2006 by Secret Labs AB. All rights reserved. + * Copyright (c) 1999-2006 by Fredrik Lundh. * * info at pythonware.com * http://www.pythonware.com @@ -46,7 +48,7 @@ #include "Python.h" -#define VERSION "1.0.5" +#define VERSION "1.0.6-snapshot" /* -------------------------------------------------------------------- */ /* configuration */ @@ -94,7 +96,9 @@ /* compatibility macros */ #if (PY_VERSION_HEX < 0x02050000) typedef int Py_ssize_t; +#define lenfunc inquiry #endif + #if (PY_VERSION_HEX < 0x02040000) #define PyDict_CheckExact PyDict_Check #if (PY_VERSION_HEX < 0x02020000) @@ -143,6 +147,9 @@ } args = PyTuple_New(2); + if (!args) + return NULL; + Py_INCREF(object); PyTuple_SET_ITEM(args, 0, (PyObject*) object); Py_INCREF(memo); PyTuple_SET_ITEM(args, 1, (PyObject*) memo); @@ -188,6 +195,9 @@ } args = PyTuple_New(1); + if (!args) + return NULL; + PyTuple_SET_ITEM(args, 0, list); result = PyObject_CallObject(function, args); @@ -513,8 +523,10 @@ Py_DECREF(attrib); - if (element_add_subelement(parent, elem) < 0) + if (element_add_subelement(parent, elem) < 0) { + Py_DECREF(elem); return NULL; + } return elem; } @@ -598,8 +610,10 @@ if (self->extra) { - if (element_resize(element, self->extra->length) < 0) + if (element_resize(element, self->extra->length) < 0) { + Py_DECREF(element); return NULL; + } for (i = 0; i < self->extra->length; i++) { Py_INCREF(self->extra->children[i]); @@ -902,8 +916,8 @@ } args = PyTuple_New(2); - if (args == NULL) - return NULL; + if (!args) + return NULL; Py_INCREF(self); PyTuple_SET_ITEM(args, 0, (PyObject*) self); Py_INCREF(tag); PyTuple_SET_ITEM(args, 1, (PyObject*) tag); @@ -916,9 +930,10 @@ } static PyObject* -element_getitem(PyObject* _self, Py_ssize_t index) +element_getitem(PyObject* self_, Py_ssize_t index) { - ElementObject* self = (ElementObject*)_self; + ElementObject* self = (ElementObject*) self_; + if (!self->extra || index < 0 || index >= self->extra->length) { PyErr_SetString( PyExc_IndexError, @@ -932,9 +947,9 @@ } static PyObject* -element_getslice(PyObject* _self, Py_ssize_t start, Py_ssize_t end) +element_getslice(PyObject* self_, Py_ssize_t start, Py_ssize_t end) { - ElementObject* self = (ElementObject*)_self; + ElementObject* self = (ElementObject*) self_; Py_ssize_t i; PyObject* list; @@ -1160,9 +1175,9 @@ } static int -element_setslice(PyObject* _self, Py_ssize_t start, Py_ssize_t end, PyObject* item) +element_setslice(PyObject* self_, Py_ssize_t start, Py_ssize_t end, PyObject* item) { - ElementObject* self = (ElementObject*)_self; + ElementObject* self = (ElementObject*) self_; int i, new, old; PyObject* recycle = NULL; @@ -1231,9 +1246,9 @@ } static int -element_setitem(PyObject* _self, Py_ssize_t index, PyObject* item) +element_setitem(PyObject* self_, Py_ssize_t index, PyObject* item) { - ElementObject* self = (ElementObject*)_self; + ElementObject* self = (ElementObject*) self_; int i; PyObject* old; @@ -1505,12 +1520,12 @@ if (self->data) { if (self->this == self->last) { - Py_DECREF(self->last->text); + Py_DECREF(JOIN_OBJ(self->last->text)); self->last->text = JOIN_SET( self->data, PyList_CheckExact(self->data) ); } else { - Py_DECREF(self->last->tail); + Py_DECREF(JOIN_OBJ(self->last->tail)); self->last->tail = JOIN_SET( self->data, PyList_CheckExact(self->data) ); @@ -1526,14 +1541,14 @@ if (this != Py_None) { if (element_add_subelement((ElementObject*) this, node) < 0) - return NULL; + goto error; } else { if (self->root) { PyErr_SetString( PyExc_SyntaxError, "multiple elements on top level" ); - return NULL; + goto error; } Py_INCREF(node); self->root = node; @@ -1541,11 +1556,11 @@ if (self->index < PyList_GET_SIZE(self->stack)) { if (PyList_SetItem(self->stack, self->index, this) < 0) - return NULL; + goto error; Py_INCREF(this); } else { if (PyList_Append(self->stack, this) < 0) - return NULL; + goto error; } self->index++; @@ -1571,6 +1586,10 @@ } return node; + + error: + Py_DECREF(node); + return NULL; } LOCAL(PyObject*) @@ -1612,12 +1631,12 @@ if (self->data) { if (self->this == self->last) { - Py_DECREF(self->last->text); + Py_DECREF(JOIN_OBJ(self->last->text)); self->last->text = JOIN_SET( self->data, PyList_CheckExact(self->data) ); } else { - Py_DECREF(self->last->tail); + Py_DECREF(JOIN_OBJ(self->last->tail)); self->last->tail = JOIN_SET( self->data, PyList_CheckExact(self->data) ); @@ -2042,6 +2061,8 @@ PyObject* res; data = makestring(data_in, data_len); + if (!data) + return; /* parser will look for errors */ if (TreeBuilder_CheckExact(self->target)) /* shortcut */ @@ -2207,13 +2228,14 @@ self->entity = PyDict_New(); if (!self->entity) { PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ + return NULL; } self->names = PyDict_New(); if (!self->names) { + PyObject_Del(self->entity); PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ + return NULL; } memory_handler.malloc_fcn = PyObject_Malloc; @@ -2222,16 +2244,22 @@ self->parser = EXPAT(ParserCreate_MM)(encoding, &memory_handler, "}"); if (!self->parser) { + PyObject_Del(self->names); + PyObject_Del(self->entity); + PyObject_Del(self); PyErr_NoMemory(); - return NULL; /* FIXME: cleanup on error */ + return NULL; } /* setup target handlers */ if (!target) { target = treebuilder_new(); if (!target) { + EXPAT(ParserFree)(self->parser); + PyObject_Del(self->names); + PyObject_Del(self->entity); PyObject_Del(self); - return NULL; /* FIXME: cleanup on error */ + return NULL; } } else Py_INCREF(target); @@ -2594,14 +2622,14 @@ #endif m = Py_InitModule("_elementtree", _functions); - if (m == NULL) - return; + if (!m) + return; /* python glue code */ g = PyDict_New(); - if (g == NULL) - return; + if (!g) + return; PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); From python-checkins at python.org Sun Mar 12 23:22:36 2006 From: python-checkins at python.org (georg.brandl) Date: Sun, 12 Mar 2006 23:22:36 +0100 (CET) Subject: [Python-checkins] r42983 - peps/trunk/pep-0356.txt Message-ID: <20060312222236.996301E4007@bag.python.org> Author: georg.brandl Date: Sun Mar 12 23:22:36 2006 New Revision: 42983 Modified: peps/trunk/pep-0356.txt Log: msilib is now imported add True and False to possible (pseudo-)keywords Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Sun Mar 12 23:22:36 2006 @@ -78,6 +78,9 @@ - Add support for the Unicode 4.1 UCD + - Add msilib module for creating MSI files and bdist_msi in distutils. + There are no docs yet. + Planned features for 2.5 @@ -92,13 +95,12 @@ - 'super' - 'interface' and 'implements'? (PEP 245) - 'switch' and 'case'? (PEP 275) + - 'True' and 'False'? - Add builtin @deprecated decorator? - Modules under consideration for inclusion: - - bdist_msi in distutils package. (MvL plans to import after pycon) - - bdist_deb in distutils package http://mail.python.org/pipermail/python-dev/2006-February/060926.html From python-checkins at python.org Mon Mar 13 00:40:58 2006 From: python-checkins at python.org (trent.mick) Date: Mon, 13 Mar 2006 00:40:58 +0100 (CET) Subject: [Python-checkins] r42984 - python/trunk/Tools/buildbot/build.bat Message-ID: <20060312234058.924151E4007@bag.python.org> Author: trent.mick Date: Mon Mar 13 00:40:58 2006 New Revision: 42984 Modified: python/trunk/Tools/buildbot/build.bat Log: Adding the /useenv means that one's PATH actually gets through. This is important for the _ssl.vproj build. It calls build_ssl.py which tries to find a Perl to use. Without "/useenv" Visual Studio is getting a PATH from somewhere else (presumably from its internal environment configuration). The result is that build_ssl.py fallsback to its "well-known" locations for a Perl install. Modified: python/trunk/Tools/buildbot/build.bat ============================================================================== --- python/trunk/Tools/buildbot/build.bat (original) +++ python/trunk/Tools/buildbot/build.bat Mon Mar 13 00:40:58 2006 @@ -1,3 +1,3 @@ @rem Used by the buildbot "compile" step. call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /build Debug PCbuild\pcbuild.sln +devenv.com /useenv /build Debug PCbuild\pcbuild.sln From python-checkins at python.org Mon Mar 13 05:17:44 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 05:17:44 +0100 (CET) Subject: [Python-checkins] r42985 - python/branches/release24-maint/Tools/buildbot/build.bat Message-ID: <20060313041744.7EB951E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 05:17:40 2006 New Revision: 42985 Modified: python/branches/release24-maint/Tools/buildbot/build.bat Log: Merge rev 42984 from trunk. Adding the /useenv means that one's PATH actually gets through. This is important for the _ssl.vproj build. It calls build_ssl.py which tries to find a Perl to use. Without "/useenv" Visual Studio is getting a PATH from somewhere else (presumably from its internal environment configuration). The result is that build_ssl.py fallsback to its "well-known" locations for a Perl install. Modified: python/branches/release24-maint/Tools/buildbot/build.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/build.bat (original) +++ python/branches/release24-maint/Tools/buildbot/build.bat Mon Mar 13 05:17:40 2006 @@ -1,3 +1,3 @@ @rem Used by the buildbot "compile" step. call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /build Debug PCbuild\pcbuild.sln +devenv.com /useenv /build Debug PCbuild\pcbuild.sln From python-checkins at python.org Mon Mar 13 05:50:35 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 05:50:35 +0100 (CET) Subject: [Python-checkins] r42986 - python/branches/release24-maint/Lib/test/test_logging.py Message-ID: <20060313045035.08D9B1E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 05:50:34 2006 New Revision: 42986 Modified: python/branches/release24-maint/Lib/test/test_logging.py Log: Merge rev 41859 from the trunk. test_main(): Restore the original root logger level after running the tests. This stops the confusing/annoying: No handlers could be found for logger "cookielib" message we got whenever some test running after test_logging happened to use cookielib.py (when not using regrtest's -r, this happened during test_urllib2; when using -r, it varied). Modified: python/branches/release24-maint/Lib/test/test_logging.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_logging.py (original) +++ python/branches/release24-maint/Lib/test/test_logging.py Mon Mar 13 05:50:34 2006 @@ -487,11 +487,20 @@ # or a Mac OS X box which supports very little locale stuff at all original_locale = None + # Save and restore the original root logger level across the tests. + # Otherwise, e.g., if any test using cookielib runs after test_logging, + # cookielib's debug-level logger tries to log messages, leading to + # confusing: + # No handlers could be found for logger "cookielib" + # output while the tests are running. + root_logger = logging.getLogger("") + original_logging_level = root_logger.getEffectiveLevel() try: test_main_inner() finally: if original_locale is not None: locale.setlocale(locale.LC_ALL, original_locale) + root_logger.setLevel(original_logging_level) if __name__ == "__main__": sys.stdout.write("test_logging\n") From python-checkins at python.org Mon Mar 13 06:53:05 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 06:53:05 +0100 (CET) Subject: [Python-checkins] r42987 - python/branches/release24-maint/Lib/test/regrtest.py Message-ID: <20060313055305.231961E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 06:53:04 2006 New Revision: 42987 Modified: python/branches/release24-maint/Lib/test/regrtest.py Log: Merge rev 42963 from the trunk. When the new -w option (yay! great idea) reruns a failed test, first display the name of the test (else it's not always clear from the output which test is getting run). Modified: python/branches/release24-maint/Lib/test/regrtest.py ============================================================================== --- python/branches/release24-maint/Lib/test/regrtest.py (original) +++ python/branches/release24-maint/Lib/test/regrtest.py Mon Mar 13 06:53:04 2006 @@ -392,6 +392,8 @@ if verbose2 and bad: print "Re-running failed tests in verbose mode" for test in bad: + print "Re-running test %r in verbose mode" % test + sys.stdout.flush() try: test_support.verbose = 1 ok = runtest(test, generate, 1, quiet, testdir, From python-checkins at python.org Mon Mar 13 08:33:38 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 13 Mar 2006 08:33:38 +0100 (CET) Subject: [Python-checkins] r42988 - python/trunk/Lib/ctypes/test/test_functions.py python/trunk/Lib/ctypes/test/test_leaks.py Message-ID: <20060313073338.97B891E4007@bag.python.org> Author: thomas.heller Date: Mon Mar 13 08:33:38 2006 New Revision: 42988 Removed: python/trunk/Lib/ctypes/test/test_leaks.py Modified: python/trunk/Lib/ctypes/test/test_functions.py Log: Remove the slightly broken test_leaks.py. Change test_functions.py so that it can be run multiple time without failing: Assign a restype to the function in test_intresult, and move the definition of class POINT to module level so that no new class is created each time the test is run. Modified: python/trunk/Lib/ctypes/test/test_functions.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_functions.py (original) +++ python/trunk/Lib/ctypes/test/test_functions.py Mon Mar 13 08:33:38 2006 @@ -19,6 +19,9 @@ if sys.platform == "win32": windll = windll.load(_ctypes_test.__file__) +class POINT(Structure): + _fields_ = [("x", c_int), ("y", c_int)] + class FunctionTestCase(unittest.TestCase): def test_mro(self): @@ -91,6 +94,7 @@ def test_intresult(self): f = dll._testfunc_i_bhilfd f.argtypes = [c_byte, c_short, c_int, c_long, c_float, c_double] + f.restype = c_int result = f(1, 2, 3, 4, 5.0, 6.0) self.failUnlessEqual(result, 21) self.failUnlessEqual(type(result), int) @@ -299,9 +303,6 @@ def test_byval(self): - class POINT(Structure): - _fields_ = [("x", c_int), ("y", c_int)] - # without prototype ptin = POINT(1, 2) ptout = POINT() Deleted: /python/trunk/Lib/ctypes/test/test_leaks.py ============================================================================== --- /python/trunk/Lib/ctypes/test/test_leaks.py Mon Mar 13 08:33:38 2006 +++ (empty file) @@ -1,88 +0,0 @@ -import unittest, sys, gc -from ctypes import * -from ctypes import _pointer_type_cache - -class LeakTestCase(unittest.TestCase): - - ################ - - def make_noncyclic_structures(self, repeat): - for i in xrange(repeat): - class POINT(Structure): - _fields_ = [("x", c_int), ("y", c_int)] - class RECT(Structure): - _fields_ = [("ul", POINT), - ("br", POINT)] - - if hasattr(sys, "gettotalrefcount"): - - def test_no_cycles_refcount(self): - last_refcount = 0 - for x in xrange(20): - self.make_noncyclic_structures(1000) - while gc.collect(): - pass - total_refcount = sys.gettotalrefcount() - if last_refcount >= total_refcount: - return # test passed - last_refcount = total_refcount - self.fail("leaking refcounts") - - def test_no_cycles_objcount(self): - # not correct - gc.get_objects() returns only thos objects - # that the garbage collector tracks. Correct would be to use - # sys.getobjects(), but this is only available in debug build. - last_objcount = 0 - for x in xrange(20): - self.make_noncyclic_structures(1000) - while gc.collect(): - pass - total_objcount = gc.get_objects() - if last_objcount >= total_objcount: - return # test passed - last_objcount = total_objcount - self.fail("leaking objects") - - ################ - - def make_cyclic_structures(self, repeat): - for i in xrange(repeat): - PLIST = POINTER("LIST") - class LIST(Structure): - _fields_ = [("pnext", PLIST)] - SetPointerType(PLIST, LIST) - del _pointer_type_cache[LIST] # XXX should this be a weakkeydict? - - if hasattr(sys, "gettotalrefcount"): - - def test_cycles_refcount(self): - last_refcount = 0 - for x in xrange(5): - self.make_cyclic_structures(1000) - while gc.collect(): - pass - total_refcount = sys.gettotalrefcount() - if last_refcount >= total_refcount: - return - last_refcount = total_refcount - self.fail("leaking refcounts") - - else: - - def test_cycles_objcount(self): - # not correct - gc.get_objects() returns only thos objects - # that the garbage collector tracks. Correct would be to use - # sys.getobjects(), but this is only available in debug build. - last_objcount = 0 - for x in xrange(8): - self.make_cyclic_structures(1000) - while gc.collect(): - pass - total_objcount = len(gc.get_objects()) - if last_objcount >= total_objcount: - return - last_objcount = total_objcount - self.fail("leaking objects") - -if __name__ == "__main__": - unittest.main() From neal at metaslash.com Mon Mar 13 10:55:39 2006 From: neal at metaslash.com (Neal Norwitz) Date: Mon, 13 Mar 2006 04:55:39 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060313095539.GA14123@python.psfb.org> test_cfgparser leaked [2, 0, 0] references test_charmapcodec leaked [0, -54, 0] references test_compiler leaked [37, 3, 137] references test_generators leaked [255, 255, 255] references test_threadedtempfile leaked [12, 2, 1] references test_threading_local leaked [35, 27, 27] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [528, 528, 527] references From python-checkins at python.org Mon Mar 13 11:20:09 2006 From: python-checkins at python.org (hyeshik.chang) Date: Mon, 13 Mar 2006 11:20:09 +0100 (CET) Subject: [Python-checkins] r42989 - in python/trunk: Lib/test/test_multibytecodec.py Misc/NEWS Modules/cjkcodecs/_codecs_iso2022.c Message-ID: <20060313102009.A0A7F1E4014@bag.python.org> Author: hyeshik.chang Date: Mon Mar 13 11:20:08 2006 New Revision: 42989 Modified: python/trunk/Lib/test/test_multibytecodec.py python/trunk/Misc/NEWS python/trunk/Modules/cjkcodecs/_codecs_iso2022.c Log: Bug #1448490: Fix a bug that ISO-2022 codecs could not handle SS2 (single-shift 2) escape sequences correctly. Modified: python/trunk/Lib/test/test_multibytecodec.py ============================================================================== --- python/trunk/Lib/test/test_multibytecodec.py (original) +++ python/trunk/Lib/test/test_multibytecodec.py Mon Mar 13 11:20:08 2006 @@ -75,9 +75,16 @@ wr.write('abcd') self.assertEqual(s.getvalue(), 'abcd') +class Test_ISO2022(unittest.TestCase): + def test_g2(self): + iso2022jp2 = '\x1b(B:hu4:unit\x1b.A\x1bNi de famille' + uni = u':hu4:unit\xe9 de famille' + self.assertEqual(iso2022jp2.decode('iso2022-jp-2'), uni) + def test_main(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Test_StreamWriter)) + suite.addTest(unittest.makeSuite(Test_ISO2022)) test_support.run_suite(suite) if __name__ == "__main__": Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Mar 13 11:20:08 2006 @@ -279,6 +279,9 @@ Extension Modules ----------------- +- Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle + SS2 (single-shift 2) escape sequences correctly. + - The unicodedata module was updated to the 4.1 version of the Unicode database. The 3.2 version is still available as unicodedata.db_3_2_0 for applications that require this specific version (such as IDNA). Modified: python/trunk/Modules/cjkcodecs/_codecs_iso2022.c ============================================================================== --- python/trunk/Modules/cjkcodecs/_codecs_iso2022.c (original) +++ python/trunk/Modules/cjkcodecs/_codecs_iso2022.c Mon Mar 13 11:20:08 2006 @@ -414,7 +414,7 @@ (*inbuf) += 3; *inleft -= 3; (*outbuf) += 1; - *outbuf -= 1; + *outleft -= 1; return 0; } From python-checkins at python.org Mon Mar 13 11:24:42 2006 From: python-checkins at python.org (hyeshik.chang) Date: Mon, 13 Mar 2006 11:24:42 +0100 (CET) Subject: [Python-checkins] r42991 - in python/branches/release24-maint: Lib/test/test_multibytecodec.py Misc/NEWS Modules/cjkcodecs/_codecs_iso2022.c Message-ID: <20060313102442.E13891E4007@bag.python.org> Author: hyeshik.chang Date: Mon Mar 13 11:24:31 2006 New Revision: 42991 Modified: python/branches/release24-maint/Lib/test/test_multibytecodec.py python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Modules/cjkcodecs/_codecs_iso2022.c Log: Backport from trunk r42989: Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle SS2 (single-shift 2) escape sequences correctly. Modified: python/branches/release24-maint/Lib/test/test_multibytecodec.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_multibytecodec.py (original) +++ python/branches/release24-maint/Lib/test/test_multibytecodec.py Mon Mar 13 11:24:31 2006 @@ -75,9 +75,16 @@ wr.write('abcd') self.assertEqual(s.getvalue(), 'abcd') +class Test_ISO2022(unittest.TestCase): + def test_g2(self): + iso2022jp2 = '\x1b(B:hu4:unit\x1b.A\x1bNi de famille' + uni = u':hu4:unit\xe9 de famille' + self.assertEqual(iso2022jp2.decode('iso2022-jp-2'), uni) + def test_main(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Test_StreamWriter)) + suite.addTest(unittest.makeSuite(Test_ISO2022)) test_support.run_suite(suite) if __name__ == "__main__": Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Mon Mar 13 11:24:31 2006 @@ -57,6 +57,9 @@ Extension Modules ----------------- +- Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle + SS2 (single-shift 2) escape sequences correctly. + - Bug #854823: socketmodule now builds on Sun platforms even when INET_ADDRSTRLEN is not defined. Modified: python/branches/release24-maint/Modules/cjkcodecs/_codecs_iso2022.c ============================================================================== --- python/branches/release24-maint/Modules/cjkcodecs/_codecs_iso2022.c (original) +++ python/branches/release24-maint/Modules/cjkcodecs/_codecs_iso2022.c Mon Mar 13 11:24:31 2006 @@ -415,7 +415,7 @@ (*inbuf) += 3; *inleft -= 3; (*outbuf) += 1; - *outbuf -= 1; + *outleft -= 1; return 0; } From python-checkins at python.org Mon Mar 13 11:47:03 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 13 Mar 2006 11:47:03 +0100 (CET) Subject: [Python-checkins] r42992 - python/trunk/Lib/ctypes/test/test_checkretval.py python/trunk/Lib/ctypes/test/test_repr.py Message-ID: <20060313104703.5413A1E4007@bag.python.org> Author: thomas.heller Date: Mon Mar 13 11:47:02 2006 New Revision: 42992 Modified: python/trunk/Lib/ctypes/test/test_checkretval.py python/trunk/Lib/ctypes/test/test_repr.py Log: Plug some refcount leaks when tests are run repeatedly. Modified: python/trunk/Lib/ctypes/test/test_checkretval.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_checkretval.py (original) +++ python/trunk/Lib/ctypes/test/test_checkretval.py Mon Mar 13 11:47:02 2006 @@ -3,16 +3,16 @@ from ctypes import * +class CHECKED(c_int): + def _check_retval_(value): + # Receives a CHECKED instance. + return str(value.value) + _check_retval_ = staticmethod(_check_retval_) + class Test(unittest.TestCase): def test_checkretval(self): - class CHECKED(c_int): - def _check_retval_(value): - # Receives a CHECKED instance. - return str(value.value) - _check_retval_ = staticmethod(_check_retval_) - import _ctypes_test dll = cdll.load(_ctypes_test.__file__) self.failUnlessEqual(42, dll._testfunc_p_p(42)) Modified: python/trunk/Lib/ctypes/test/test_repr.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_repr.py (original) +++ python/trunk/Lib/ctypes/test/test_repr.py Mon Mar 13 11:47:02 2006 @@ -1,23 +1,28 @@ from ctypes import * import unittest -nums = [c_byte, c_short, c_int, c_long, c_longlong, +subclasses = [] +for base in [c_byte, c_short, c_int, c_long, c_longlong, c_ubyte, c_ushort, c_uint, c_ulong, c_ulonglong, - c_float, c_double] + c_float, c_double]: + class X(base): + pass + subclasses.append(X) + +class X(c_char): + pass + +# This test checks if the __repr__ is correct for subclasses of simple types class ReprTest(unittest.TestCase): def test_numbers(self): - for typ in nums: - self.failUnless(repr(typ(42)).startswith(typ.__name__)) - class X(typ): - pass - self.failUnlessEqual(" Author: martin.v.loewis Date: Mon Mar 13 11:52:04 2006 New Revision: 42993 Added: python/trunk/Tools/buildbot/external.bat Modified: python/trunk/PCbuild/bz2.vcproj python/trunk/PCbuild/readme.txt python/trunk/Tools/buildbot/build.bat Log: Update to bzip2 1.0.3 Make buildbot slaves automatically fetch bzip2 1.0.3. Modified: python/trunk/PCbuild/bz2.vcproj ============================================================================== --- python/trunk/PCbuild/bz2.vcproj (original) +++ python/trunk/PCbuild/bz2.vcproj Mon Mar 13 11:52:04 2006 @@ -21,7 +21,7 @@ Configuration -> Miscellaneous -> Other) for the duration. + Download the source from the python.org copy: + svn export http://svn.python.org/projects/external/bzip2-1.0.3 A custom pre-link step in the bz2 project settings should manage to build bzip2-1.0.2\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is linked in PCbuild\. However, the bz2 project is not smart enough to remove anything under - bzip2-1.0.2\ when you do a clean, so if you want to rebuild bzip2.lib - you need to clean up bzip2-1.0.2\ by hand. + bzip2-1.0.3\ when you do a clean, so if you want to rebuild bzip2.lib + you need to clean up bzip2-1.0.3\ by hand. The build step shouldn't yield any warnings or errors, and should end by displaying 6 blocks each terminated with @@ -145,7 +143,7 @@ If FC finds differences, see the warning abou WinZip above (when I first tried it, sample3.ref failed due to CRLF conversion). - All of this managed to build bzip2-1.0.2\libbz2.lib, which the Python + All of this managed to build bzip2-1.0.3\libbz2.lib, which the Python project links in. Modified: python/trunk/Tools/buildbot/build.bat ============================================================================== --- python/trunk/Tools/buildbot/build.bat (original) +++ python/trunk/Tools/buildbot/build.bat Mon Mar 13 11:52:04 2006 @@ -1,3 +1,4 @@ @rem Used by the buildbot "compile" step. +cmd /c Tools\buildbot\external.bat call "%VS71COMNTOOLS%vsvars32.bat" devenv.com /useenv /build Debug PCbuild\pcbuild.sln Added: python/trunk/Tools/buildbot/external.bat ============================================================================== --- (empty file) +++ python/trunk/Tools/buildbot/external.bat Mon Mar 13 11:52:04 2006 @@ -0,0 +1,8 @@ + at rem Fetches (and builds if necessary) external dependencies + + at rem Assume we start inside the Python source directory +cd .. + + at rem bzip +if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 + From python-checkins at python.org Mon Mar 13 11:59:32 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 11:59:32 +0100 (CET) Subject: [Python-checkins] r42994 - in python/trunk: Makefile.pre.in Tools/buildbot/test.bat Message-ID: <20060313105932.F3BE21E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 11:59:32 2006 New Revision: 42994 Modified: python/trunk/Makefile.pre.in python/trunk/Tools/buildbot/test.bat Log: Let the buildbot make a single pass in the test suite only. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Mon Mar 13 11:59:32 2006 @@ -563,6 +563,10 @@ -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall +# Like testall, but with a single pass only +buildbottest: all platform + $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall -rw + QUICKTESTOPTS= $(TESTOPTS) -x test_thread test_signal test_strftime \ test_unicodedata test_re test_sre test_select test_poll \ test_linuxaudiodev test_struct test_sunaudiodev test_zlib Modified: python/trunk/Tools/buildbot/test.bat ============================================================================== --- python/trunk/Tools/buildbot/test.bat (original) +++ python/trunk/Tools/buildbot/test.bat Mon Mar 13 11:59:32 2006 @@ -1,3 +1,3 @@ @rem Used by the buildbot "test" step. cd PCbuild -call rt.bat -d -uall -rw +call rt.bat -d -q -uall -rw From python-checkins at python.org Mon Mar 13 13:18:07 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 13:18:07 +0100 (CET) Subject: [Python-checkins] r42996 - external/db-4.4.20/qam/qam_files.c Message-ID: <20060313121807.5E98C1E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 13:18:04 2006 New Revision: 42996 Modified: external/db-4.4.20/qam/qam_files.c Log: Apply http://www.sleepycat.com/update/4.4.20/patch.4.4.20.1 Modified: external/db-4.4.20/qam/qam_files.c ============================================================================== --- external/db-4.4.20/qam/qam_files.c (original) +++ external/db-4.4.20/qam/qam_files.c Mon Mar 13 13:18:04 2006 @@ -411,6 +411,12 @@ DB_APP_DATA, buf, 0, NULL, &real_name)) != 0) goto err; #endif + + mpf = array->mpfarray[offset].mpf; + /* This extent my already be marked for delete and closed. */ + if (mpf == NULL) + goto err; + /* * The log must be flushed before the file is deleted. We depend on * the log record of the last delete to recreate the file if we crash. @@ -418,7 +424,6 @@ if (LOGGING_ON(dbenv) && (ret = __log_flush(dbenv, NULL)) != 0) goto err; - mpf = array->mpfarray[offset].mpf; (void)__memp_set_flags(mpf, DB_MPOOL_UNLINK, 1); /* Someone could be real slow, let them close it down. */ if (array->mpfarray[offset].pinref != 0) From python-checkins at python.org Mon Mar 13 13:18:51 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 13:18:51 +0100 (CET) Subject: [Python-checkins] r42997 - external/db-4.4.20/txn/txn.c Message-ID: <20060313121851.D62FF1E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 13:18:51 2006 New Revision: 42997 Modified: external/db-4.4.20/txn/txn.c Log: Apply http://www.sleepycat.com/update/4.4.20/patch.4.4.20.2 Modified: external/db-4.4.20/txn/txn.c ============================================================================== --- external/db-4.4.20/txn/txn.c (original) +++ external/db-4.4.20/txn/txn.c Mon Mar 13 13:18:51 2006 @@ -1049,12 +1049,14 @@ return (ret); memcpy(txn->name, name, len); + TXN_SYSTEM_LOCK(dbenv); if (td->name != INVALID_ROFF) { __db_shalloc_free( &mgr->reginfo, R_ADDR(&mgr->reginfo, td->name)); td->name = INVALID_ROFF; } if ((ret = __db_shalloc(&mgr->reginfo, len, 0, &p)) != 0) { + TXN_SYSTEM_UNLOCK(dbenv); __db_err(dbenv, "Unable to allocate memory for transaction name"); @@ -1063,6 +1065,7 @@ return (ret); } + TXN_SYSTEM_UNLOCK(dbenv); td->name = R_OFFSET(&mgr->reginfo, p); memcpy(p, name, len); From python-checkins at python.org Mon Mar 13 13:32:01 2006 From: python-checkins at python.org (nick.coghlan) Date: Mon, 13 Mar 2006 13:32:01 +0100 (CET) Subject: [Python-checkins] r42998 - in python/trunk: Lib/test/test_compile.py Python/compile.c Message-ID: <20060313123201.936091E4007@bag.python.org> Author: nick.coghlan Date: Mon Mar 13 13:31:58 2006 New Revision: 42998 Modified: python/trunk/Lib/test/test_compile.py python/trunk/Python/compile.c Log: Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly Modified: python/trunk/Lib/test/test_compile.py ============================================================================== --- python/trunk/Lib/test/test_compile.py (original) +++ python/trunk/Lib/test/test_compile.py Mon Mar 13 13:31:58 2006 @@ -284,6 +284,78 @@ f1, f2 = f() self.assertNotEqual(id(f1.func_code), id(f2.func_code)) + def test_subscripts(self): + # SF bug 1448804 + # Class to make testing subscript results easy + class str_map(object): + def __init__(self): + self.data = {} + def __getitem__(self, key): + return self.data[str(key)] + def __setitem__(self, key, value): + self.data[str(key)] = value + def __delitem__(self, key): + del self.data[str(key)] + def __contains__(self, key): + return str(key) in self.data + d = str_map() + # Index + d[1] = 1 + self.assertEqual(d[1], 1) + d[1] += 1 + self.assertEqual(d[1], 2) + del d[1] + self.assertEqual(1 in d, False) + # Tuple of indices + d[1, 1] = 1 + self.assertEqual(d[1, 1], 1) + d[1, 1] += 1 + self.assertEqual(d[1, 1], 2) + del d[1, 1] + self.assertEqual((1, 1) in d, False) + # Simple slice + d[1:2] = 1 + self.assertEqual(d[1:2], 1) + d[1:2] += 1 + self.assertEqual(d[1:2], 2) + del d[1:2] + self.assertEqual(slice(1, 2) in d, False) + # Tuple of simple slices + d[1:2, 1:2] = 1 + self.assertEqual(d[1:2, 1:2], 1) + d[1:2, 1:2] += 1 + self.assertEqual(d[1:2, 1:2], 2) + del d[1:2, 1:2] + self.assertEqual((slice(1, 2), slice(1, 2)) in d, False) + # Extended slice + d[1:2:3] = 1 + self.assertEqual(d[1:2:3], 1) + d[1:2:3] += 1 + self.assertEqual(d[1:2:3], 2) + del d[1:2:3] + self.assertEqual(slice(1, 2, 3) in d, False) + # Tuple of extended slices + d[1:2:3, 1:2:3] = 1 + self.assertEqual(d[1:2:3, 1:2:3], 1) + d[1:2:3, 1:2:3] += 1 + self.assertEqual(d[1:2:3, 1:2:3], 2) + del d[1:2:3, 1:2:3] + self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False) + # Ellipsis + d[...] = 1 + self.assertEqual(d[...], 1) + d[...] += 1 + self.assertEqual(d[...], 2) + del d[...] + self.assertEqual(Ellipsis in d, False) + # Tuple of Ellipses + d[..., ...] = 1 + self.assertEqual(d[..., ...], 1) + d[..., ...] += 1 + self.assertEqual(d[..., ...], 2) + del d[..., ...] + self.assertEqual((Ellipsis, Ellipsis) in d, False) + def test_main(): test_support.run_unittest(TestSpecifics) Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Mon Mar 13 13:31:58 2006 @@ -3853,42 +3853,47 @@ static int compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) { + char * kindname = NULL; switch (s->kind) { + case Index_kind: + kindname = "index"; + if (ctx != AugStore) { + VISIT(c, expr, s->v.Index.value); + } + break; case Ellipsis_kind: - ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); + kindname = "ellipsis"; + if (ctx != AugStore) { + ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); + } break; case Slice_kind: + kindname = "slice"; if (!s->v.Slice.step) return compiler_simple_slice(c, s, ctx); - if (!compiler_slice(c, s, ctx)) - return 0; - if (ctx == AugLoad) { - ADDOP_I(c, DUP_TOPX, 2); - } - else if (ctx == AugStore) { - ADDOP(c, ROT_THREE); - } - return compiler_handle_subscr(c, "slice", ctx); - case ExtSlice_kind: { - int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); - for (i = 0; i < n; i++) { - slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); - if (!compiler_visit_nested_slice(c, sub, ctx)) + if (ctx != AugStore) { + if (!compiler_slice(c, s, ctx)) return 0; } - ADDOP_I(c, BUILD_TUPLE, n); - return compiler_handle_subscr(c, "extended slice", ctx); - } - case Index_kind: - if (ctx != AugStore) - VISIT(c, expr, s->v.Index.value); - return compiler_handle_subscr(c, "index", ctx); + break; + case ExtSlice_kind: + kindname = "extended slice"; + if (ctx != AugStore) { + int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); + for (i = 0; i < n; i++) { + slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); + if (!compiler_visit_nested_slice(c, sub, ctx)) + return 0; + } + ADDOP_I(c, BUILD_TUPLE, n); + } + break; default: PyErr_Format(PyExc_SystemError, - "invalid slice %d", s->kind); + "invalid subscript kind %d", s->kind); return 0; } - return 1; + return compiler_handle_subscr(c, kindname, ctx); } /* do depth-first search of basic block graph, starting with block. From python-checkins at python.org Mon Mar 13 13:37:39 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 13:37:39 +0100 (CET) Subject: [Python-checkins] r42999 - external/db-4.4.20/build_win32/Berkeley_DB.sln external/db-4.4.20/build_win32/build_all.vcproj external/db-4.4.20/build_win32/db_archive.vcproj external/db-4.4.20/build_win32/db_checkpoint.vcproj external/db-4.4.20/build_win32/db_deadlock.vcproj external/db-4.4.20/build_win32/db_dll.vcproj external/db-4.4.20/build_win32/db_dump.vcproj external/db-4.4.20/build_win32/db_hotbackup.vcproj external/db-4.4.20/build_win32/db_java.vcproj external/db-4.4.20/build_win32/db_load.vcproj external/db-4.4.20/build_win32/db_printlog.vcproj external/db-4.4.20/build_win32/db_recover.vcproj external/db-4.4.20/build_win32/db_small.vcproj external/db-4.4.20/build_win32/db_stat.vcproj external/db-4.4.20/build_win32/db_static.vcproj external/db-4.4.20/build_win32/db_tcl.vcproj external/db-4.4.20/build_win32/db_test.vcproj external/db-4.4.20/build_win32/db_upgrade.vcproj external/db-4.4.20/build_win32/db_verify.vcproj external/db-4.4.20/build_win32/ex_access.vcproj external/db-4.4.20/build_win32/ex_btrec.vcproj external/db-4.4.20/build_win32/ex_csvcode.vcproj external/db-4.4.20/build_win32/ex_csvload.vcproj external/db-4.4.20/build_win32/ex_csvquery.vcproj external/db-4.4.20/build_win32/ex_env.vcproj external/db-4.4.20/build_win32/ex_lock.vcproj external/db-4.4.20/build_win32/ex_mpool.vcproj external/db-4.4.20/build_win32/ex_repquote.vcproj external/db-4.4.20/build_win32/ex_sequence.vcproj external/db-4.4.20/build_win32/ex_tpcb.vcproj external/db-4.4.20/build_win32/ex_txnguide.vcproj external/db-4.4.20/build_win32/ex_txnguide_inmem.vcproj external/db-4.4.20/build_win32/example_database_load.vcproj external/db-4.4.20/build_win32/example_database_read.vcproj external/db-4.4.20/build_win32/excxx_access.vcproj external/db-4.4.20/build_win32/excxx_btrec.vcproj external/db-4.4.20/build_win32/excxx_env.vcproj external/db-4.4.20/build_win32/excxx_example_database_load.vcproj external/db-4.4.20/build_win32/excxx_example_database_read.vcproj external/db-4.4.20/build_win32/excxx_lock.vcproj external/db-4.4.20/build_win32/excxx_mpool.vcproj external/db-4.4.20/build_win32/excxx_sequence.vcproj external/db-4.4.20/build_win32/excxx_tpcb.vcproj external/db-4.4.20/build_win32/excxx_txnguide.vcproj external/db-4.4.20/build_win32/excxx_txnguide_inmem.vcproj Message-ID: <20060313123739.6EBE91E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 13:37:35 2006 New Revision: 42999 Added: external/db-4.4.20/build_win32/Berkeley_DB.sln external/db-4.4.20/build_win32/build_all.vcproj external/db-4.4.20/build_win32/db_archive.vcproj external/db-4.4.20/build_win32/db_checkpoint.vcproj external/db-4.4.20/build_win32/db_deadlock.vcproj external/db-4.4.20/build_win32/db_dll.vcproj external/db-4.4.20/build_win32/db_dump.vcproj external/db-4.4.20/build_win32/db_hotbackup.vcproj external/db-4.4.20/build_win32/db_java.vcproj external/db-4.4.20/build_win32/db_load.vcproj external/db-4.4.20/build_win32/db_printlog.vcproj external/db-4.4.20/build_win32/db_recover.vcproj external/db-4.4.20/build_win32/db_small.vcproj external/db-4.4.20/build_win32/db_stat.vcproj external/db-4.4.20/build_win32/db_static.vcproj external/db-4.4.20/build_win32/db_tcl.vcproj external/db-4.4.20/build_win32/db_test.vcproj external/db-4.4.20/build_win32/db_upgrade.vcproj external/db-4.4.20/build_win32/db_verify.vcproj external/db-4.4.20/build_win32/ex_access.vcproj external/db-4.4.20/build_win32/ex_btrec.vcproj external/db-4.4.20/build_win32/ex_csvcode.vcproj external/db-4.4.20/build_win32/ex_csvload.vcproj external/db-4.4.20/build_win32/ex_csvquery.vcproj external/db-4.4.20/build_win32/ex_env.vcproj external/db-4.4.20/build_win32/ex_lock.vcproj external/db-4.4.20/build_win32/ex_mpool.vcproj external/db-4.4.20/build_win32/ex_repquote.vcproj external/db-4.4.20/build_win32/ex_sequence.vcproj external/db-4.4.20/build_win32/ex_tpcb.vcproj external/db-4.4.20/build_win32/ex_txnguide.vcproj external/db-4.4.20/build_win32/ex_txnguide_inmem.vcproj external/db-4.4.20/build_win32/example_database_load.vcproj external/db-4.4.20/build_win32/example_database_read.vcproj external/db-4.4.20/build_win32/excxx_access.vcproj external/db-4.4.20/build_win32/excxx_btrec.vcproj external/db-4.4.20/build_win32/excxx_env.vcproj external/db-4.4.20/build_win32/excxx_example_database_load.vcproj external/db-4.4.20/build_win32/excxx_example_database_read.vcproj external/db-4.4.20/build_win32/excxx_lock.vcproj external/db-4.4.20/build_win32/excxx_mpool.vcproj external/db-4.4.20/build_win32/excxx_sequence.vcproj external/db-4.4.20/build_win32/excxx_tpcb.vcproj external/db-4.4.20/build_win32/excxx_txnguide.vcproj external/db-4.4.20/build_win32/excxx_txnguide_inmem.vcproj Log: Convert project files to VS.NET 2003. Added: external/db-4.4.20/build_win32/Berkeley_DB.sln ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/Berkeley_DB.sln Mon Mar 13 13:37:35 2006 @@ -0,0 +1,978 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build_all", "build_all.vcproj", "{5BE6A7BC-7CE3-48C6-B855-D90E545FD625}" + ProjectSection(ProjectDependencies) = postProject + {F7F26B95-3624-49CF-9A79-6C6F69B72078} = {F7F26B95-3624-49CF-9A79-6C6F69B72078} + {3A8EA457-87A3-4F20-A993-452D104FFD16} = {3A8EA457-87A3-4F20-A993-452D104FFD16} + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04} = {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04} + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C} = {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C} + {927F260A-19CF-4E55-A154-109A0BF80AE9} = {927F260A-19CF-4E55-A154-109A0BF80AE9} + {5F2C44DE-5466-4CF1-9962-415FFC4F3246} = {5F2C44DE-5466-4CF1-9962-415FFC4F3246} + {07BA8001-E8DA-4CD2-A800-A4239741C4ED} = {07BA8001-E8DA-4CD2-A800-A4239741C4ED} + {47E23751-01E8-43C9-83C2-06EE68C121EF} = {47E23751-01E8-43C9-83C2-06EE68C121EF} + {A27263BC-8BED-412C-944D-7EC7D9F194EC} = {A27263BC-8BED-412C-944D-7EC7D9F194EC} + {D5938761-AD96-4C0C-9C46-BC375358DFE9} = {D5938761-AD96-4C0C-9C46-BC375358DFE9} + {10429E06-7C29-477D-8993-46773DC3FFE9} = {10429E06-7C29-477D-8993-46773DC3FFE9} + {E53D7716-2173-47DC-AA6A-E06867A9D5D0} = {E53D7716-2173-47DC-AA6A-E06867A9D5D0} + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3} = {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3} + {EE86A96A-D00A-44C9-8914-850E57B8E677} = {EE86A96A-D00A-44C9-8914-850E57B8E677} + {6E39EDB9-D55A-43C7-B740-9221B03FA458} = {6E39EDB9-D55A-43C7-B740-9221B03FA458} + {40373079-658E-451A-8249-5986B2190133} = {40373079-658E-451A-8249-5986B2190133} + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB} = {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB} + {389384D4-75A5-4B53-A7C2-AC61375C430B} = {389384D4-75A5-4B53-A7C2-AC61375C430B} + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA} = {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA} + {3505C707-1445-4E79-894A-D30CFE5E90DA} = {3505C707-1445-4E79-894A-D30CFE5E90DA} + {14301406-3348-4D7A-A47B-EC6180017F50} = {14301406-3348-4D7A-A47B-EC6180017F50} + {3E497868-A70B-45BE-B113-1F04D368DA93} = {3E497868-A70B-45BE-B113-1F04D368DA93} + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA} = {93D80BE1-BE99-4D39-B02D-31294C9E9DFA} + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4} = {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4} + {861A5FAD-25FB-4884-8F28-2CE407B54AAD} = {861A5FAD-25FB-4884-8F28-2CE407B54AAD} + {A2F71ABC-96B2-450D-973A-5BE661034CCE} = {A2F71ABC-96B2-450D-973A-5BE661034CCE} + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E} = {B44968C4-3243-4D6D-9A59-4C0F9F875C4E} + {F1A92B38-F912-45B0-93A9-72770E70BEF4} = {F1A92B38-F912-45B0-93A9-72770E70BEF4} + {4F1C44D8-2893-4FD6-A832-21F372F19596} = {4F1C44D8-2893-4FD6-A832-21F372F19596} + {23394132-218F-4F7A-BA9F-37C7F7007765} = {23394132-218F-4F7A-BA9F-37C7F7007765} + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A} = {E685D09D-0E46-482B-8546-4FA0BEC4EB8A} + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D} = {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D} + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + {97E39181-72A5-4BA5-B962-BCDACCA2FE83} = {97E39181-72A5-4BA5-B962-BCDACCA2FE83} + {939E539C-7144-4FD2-B318-6B70791E4FB0} = {939E539C-7144-4FD2-B318-6B70791E4FB0} + {B42CC051-97A0-4C0A-BDD7-45791B92C61C} = {B42CC051-97A0-4C0A-BDD7-45791B92C61C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_archive", "db_archive.vcproj", "{B42CC051-97A0-4C0A-BDD7-45791B92C61C}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_checkpoint", "db_checkpoint.vcproj", "{939E539C-7144-4FD2-B318-6B70791E4FB0}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_deadlock", "db_deadlock.vcproj", "{97E39181-72A5-4BA5-B962-BCDACCA2FE83}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_dll", "db_dll.vcproj", "{BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_dump", "db_dump.vcproj", "{5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_hotbackup", "db_hotbackup.vcproj", "{E685D09D-0E46-482B-8546-4FA0BEC4EB8A}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_java", "db_java.vcproj", "{B440697C-3D0A-44F4-90CF-A37EBA37B228}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_load", "db_load.vcproj", "{23394132-218F-4F7A-BA9F-37C7F7007765}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_printlog", "db_printlog.vcproj", "{4F1C44D8-2893-4FD6-A832-21F372F19596}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_recover", "db_recover.vcproj", "{F1A92B38-F912-45B0-93A9-72770E70BEF4}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_small", "db_small.vcproj", "{171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_stat", "db_stat.vcproj", "{B44968C4-3243-4D6D-9A59-4C0F9F875C4E}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_static", "db_static.vcproj", "{C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_tcl", "db_tcl.vcproj", "{F7C5312E-EB20-411F-AC5B-A463D3DE028F}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_test", "db_test.vcproj", "{070DC608-CBBF-4AFB-BA2C-BFE0785038F4}" + ProjectSection(ProjectDependencies) = postProject + {F7C5312E-EB20-411F-AC5B-A463D3DE028F} = {F7C5312E-EB20-411F-AC5B-A463D3DE028F} + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625} = {5BE6A7BC-7CE3-48C6-B855-D90E545FD625} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_upgrade", "db_upgrade.vcproj", "{A2F71ABC-96B2-450D-973A-5BE661034CCE}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "db_verify", "db_verify.vcproj", "{861A5FAD-25FB-4884-8F28-2CE407B54AAD}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_access", "ex_access.vcproj", "{93D80BE1-BE99-4D39-B02D-31294C9E9DFA}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_btrec", "ex_btrec.vcproj", "{3E497868-A70B-45BE-B113-1F04D368DA93}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_csvcode", "ex_csvcode.vcproj", "{894E4674-B620-44CF-915C-EA171C279B0B}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_csvload", "ex_csvload.vcproj", "{EA1286CA-295F-4666-8101-EAE5A254B78A}" + ProjectSection(ProjectDependencies) = postProject + {894E4674-B620-44CF-915C-EA171C279B0B} = {894E4674-B620-44CF-915C-EA171C279B0B} + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_csvquery", "ex_csvquery.vcproj", "{207C3746-0D9C-4ADB-AF4D-876039022870}" + ProjectSection(ProjectDependencies) = postProject + {894E4674-B620-44CF-915C-EA171C279B0B} = {894E4674-B620-44CF-915C-EA171C279B0B} + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_env", "ex_env.vcproj", "{14301406-3348-4D7A-A47B-EC6180017F50}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_lock", "ex_lock.vcproj", "{3505C707-1445-4E79-894A-D30CFE5E90DA}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_mpool", "ex_mpool.vcproj", "{8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_repquote", "ex_repquote.vcproj", "{927F260A-19CF-4E55-A154-109A0BF80AE9}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_sequence", "ex_sequence.vcproj", "{389384D4-75A5-4B53-A7C2-AC61375C430B}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_tpcb", "ex_tpcb.vcproj", "{B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_txnguide", "ex_txnguide.vcproj", "{5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_txnguide_inmem", "ex_txnguide_inmem.vcproj", "{3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_database_load", "example_database_load.vcproj", "{40373079-658E-451A-8249-5986B2190133}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_database_read", "example_database_read.vcproj", "{6E39EDB9-D55A-43C7-B740-9221B03FA458}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_access", "excxx_access.vcproj", "{EE86A96A-D00A-44C9-8914-850E57B8E677}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_btrec", "excxx_btrec.vcproj", "{22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_env", "excxx_env.vcproj", "{E53D7716-2173-47DC-AA6A-E06867A9D5D0}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_example_database_load", "excxx_example_database_load.vcproj", "{07BA8001-E8DA-4CD2-A800-A4239741C4ED}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_example_database_read", "excxx_example_database_read.vcproj", "{5F2C44DE-5466-4CF1-9962-415FFC4F3246}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_lock", "excxx_lock.vcproj", "{10429E06-7C29-477D-8993-46773DC3FFE9}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_mpool", "excxx_mpool.vcproj", "{D5938761-AD96-4C0C-9C46-BC375358DFE9}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_sequence", "excxx_sequence.vcproj", "{A27263BC-8BED-412C-944D-7EC7D9F194EC}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_tpcb", "excxx_tpcb.vcproj", "{47E23751-01E8-43C9-83C2-06EE68C121EF}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_txnguide", "excxx_txnguide.vcproj", "{3A8EA457-87A3-4F20-A993-452D104FFD16}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "excxx_txnguide_inmem", "excxx_txnguide_inmem.vcproj", "{F7F26B95-3624-49CF-9A79-6C6F69B72078}" + ProjectSection(ProjectDependencies) = postProject + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} = {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + ASCII Debug = ASCII Debug + ASCII Release = ASCII Release + Debug = Debug + Debug AMD64 = Debug AMD64 + Debug IA64 = Debug IA64 + Release = Release + Release AMD64 = Release AMD64 + Release IA64 = Release IA64 + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.ASCII Release.Build.0 = ASCII Release|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug.ActiveCfg = Debug|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug.Build.0 = Debug|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Debug IA64.Build.0 = Debug IA64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release.ActiveCfg = Release|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release.Build.0 = Release|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release AMD64.Build.0 = Release AMD64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release IA64.ActiveCfg = Release IA64|Win32 + {5BE6A7BC-7CE3-48C6-B855-D90E545FD625}.Release IA64.Build.0 = Release IA64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.ASCII Release.Build.0 = ASCII Release|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug.ActiveCfg = Debug|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug.Build.0 = Debug|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Debug IA64.Build.0 = Debug IA64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release.ActiveCfg = Release|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release.Build.0 = Release|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release AMD64.Build.0 = Release AMD64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release IA64.ActiveCfg = Release IA64|Win32 + {B42CC051-97A0-4C0A-BDD7-45791B92C61C}.Release IA64.Build.0 = Release IA64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.ASCII Release.Build.0 = ASCII Release|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug.ActiveCfg = Debug|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug.Build.0 = Debug|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Debug IA64.Build.0 = Debug IA64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release.ActiveCfg = Release|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release.Build.0 = Release|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release AMD64.Build.0 = Release AMD64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release IA64.ActiveCfg = Release IA64|Win32 + {939E539C-7144-4FD2-B318-6B70791E4FB0}.Release IA64.Build.0 = Release IA64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.ASCII Release.Build.0 = ASCII Release|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug.ActiveCfg = Debug|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug.Build.0 = Debug|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Debug IA64.Build.0 = Debug IA64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release.ActiveCfg = Release|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release.Build.0 = Release|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release AMD64.Build.0 = Release AMD64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release IA64.ActiveCfg = Release IA64|Win32 + {97E39181-72A5-4BA5-B962-BCDACCA2FE83}.Release IA64.Build.0 = Release IA64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.ASCII Release.Build.0 = ASCII Release|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug.ActiveCfg = Debug|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug.Build.0 = Debug|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Debug IA64.Build.0 = Debug IA64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release.ActiveCfg = Release|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release.Build.0 = Release|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release AMD64.Build.0 = Release AMD64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release IA64.ActiveCfg = Release IA64|Win32 + {BDFBE3FD-385D-4816-90E5-A0FEC0925E5F}.Release IA64.Build.0 = Release IA64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.ASCII Release.Build.0 = ASCII Release|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug.ActiveCfg = Debug|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug.Build.0 = Debug|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Debug IA64.Build.0 = Debug IA64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release.ActiveCfg = Release|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release.Build.0 = Release|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release AMD64.Build.0 = Release AMD64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release IA64.ActiveCfg = Release IA64|Win32 + {5AFD87D8-688B-4CC1-9DC9-AD8943EF596D}.Release IA64.Build.0 = Release IA64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.ASCII Release.Build.0 = ASCII Release|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug.ActiveCfg = Debug|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug.Build.0 = Debug|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Debug IA64.Build.0 = Debug IA64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release.ActiveCfg = Release|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release.Build.0 = Release|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release AMD64.Build.0 = Release AMD64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release IA64.ActiveCfg = Release IA64|Win32 + {E685D09D-0E46-482B-8546-4FA0BEC4EB8A}.Release IA64.Build.0 = Release IA64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.ASCII Release.Build.0 = ASCII Release|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug.ActiveCfg = Debug|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug.Build.0 = Debug|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Debug IA64.Build.0 = Debug IA64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release.ActiveCfg = Release|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release.Build.0 = Release|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release AMD64.Build.0 = Release AMD64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release IA64.ActiveCfg = Release IA64|Win32 + {B440697C-3D0A-44F4-90CF-A37EBA37B228}.Release IA64.Build.0 = Release IA64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.ASCII Release.Build.0 = ASCII Release|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug.ActiveCfg = Debug|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug.Build.0 = Debug|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Debug IA64.Build.0 = Debug IA64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release.ActiveCfg = Release|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release.Build.0 = Release|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release AMD64.Build.0 = Release AMD64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release IA64.ActiveCfg = Release IA64|Win32 + {23394132-218F-4F7A-BA9F-37C7F7007765}.Release IA64.Build.0 = Release IA64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.ASCII Release.Build.0 = ASCII Release|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug.ActiveCfg = Debug|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug.Build.0 = Debug|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Debug IA64.Build.0 = Debug IA64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release.ActiveCfg = Release|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release.Build.0 = Release|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release AMD64.Build.0 = Release AMD64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release IA64.ActiveCfg = Release IA64|Win32 + {4F1C44D8-2893-4FD6-A832-21F372F19596}.Release IA64.Build.0 = Release IA64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.ASCII Release.Build.0 = ASCII Release|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug.ActiveCfg = Debug|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug.Build.0 = Debug|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Debug IA64.Build.0 = Debug IA64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release.ActiveCfg = Release|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release.Build.0 = Release|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release AMD64.Build.0 = Release AMD64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release IA64.ActiveCfg = Release IA64|Win32 + {F1A92B38-F912-45B0-93A9-72770E70BEF4}.Release IA64.Build.0 = Release IA64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.ASCII Release.Build.0 = ASCII Release|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug.ActiveCfg = Debug|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug.Build.0 = Debug|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Debug IA64.Build.0 = Debug IA64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release.ActiveCfg = Release|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release.Build.0 = Release|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release AMD64.Build.0 = Release AMD64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release IA64.ActiveCfg = Release IA64|Win32 + {171A24B8-2BDB-4511-B0E7-0E5E6447B1FB}.Release IA64.Build.0 = Release IA64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.ASCII Release.Build.0 = ASCII Release|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug.ActiveCfg = Debug|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug.Build.0 = Debug|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Debug IA64.Build.0 = Debug IA64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release.ActiveCfg = Release|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release.Build.0 = Release|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release AMD64.Build.0 = Release AMD64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release IA64.ActiveCfg = Release IA64|Win32 + {B44968C4-3243-4D6D-9A59-4C0F9F875C4E}.Release IA64.Build.0 = Release IA64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.ASCII Release.Build.0 = ASCII Release|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug.ActiveCfg = Debug|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug.Build.0 = Debug|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Debug IA64.Build.0 = Debug IA64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release.ActiveCfg = Release|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release.Build.0 = Release|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release AMD64.Build.0 = Release AMD64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release IA64.ActiveCfg = Release IA64|Win32 + {C6112BAF-38D0-415D-B5B4-AC7F1ECD00F4}.Release IA64.Build.0 = Release IA64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.ASCII Release.Build.0 = ASCII Release|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug.ActiveCfg = Debug|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug.Build.0 = Debug|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Debug IA64.Build.0 = Debug IA64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release.ActiveCfg = Release|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release.Build.0 = Release|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release AMD64.Build.0 = Release AMD64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release IA64.ActiveCfg = Release IA64|Win32 + {F7C5312E-EB20-411F-AC5B-A463D3DE028F}.Release IA64.Build.0 = Release IA64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.ASCII Release.Build.0 = ASCII Release|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug.ActiveCfg = Debug|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug.Build.0 = Debug|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Debug IA64.Build.0 = Debug IA64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release.ActiveCfg = Release|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release.Build.0 = Release|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release AMD64.Build.0 = Release AMD64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release IA64.ActiveCfg = Release IA64|Win32 + {070DC608-CBBF-4AFB-BA2C-BFE0785038F4}.Release IA64.Build.0 = Release IA64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.ASCII Release.Build.0 = ASCII Release|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug.ActiveCfg = Debug|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug.Build.0 = Debug|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Debug IA64.Build.0 = Debug IA64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release.ActiveCfg = Release|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release.Build.0 = Release|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release AMD64.Build.0 = Release AMD64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release IA64.ActiveCfg = Release IA64|Win32 + {A2F71ABC-96B2-450D-973A-5BE661034CCE}.Release IA64.Build.0 = Release IA64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.ASCII Release.Build.0 = ASCII Release|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug.ActiveCfg = Debug|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug.Build.0 = Debug|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Debug IA64.Build.0 = Debug IA64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release.ActiveCfg = Release|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release.Build.0 = Release|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release AMD64.Build.0 = Release AMD64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release IA64.ActiveCfg = Release IA64|Win32 + {861A5FAD-25FB-4884-8F28-2CE407B54AAD}.Release IA64.Build.0 = Release IA64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.ASCII Release.Build.0 = ASCII Release|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug.ActiveCfg = Debug|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug.Build.0 = Debug|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Debug IA64.Build.0 = Debug IA64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release.ActiveCfg = Release|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release.Build.0 = Release|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release AMD64.Build.0 = Release AMD64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release IA64.ActiveCfg = Release IA64|Win32 + {93D80BE1-BE99-4D39-B02D-31294C9E9DFA}.Release IA64.Build.0 = Release IA64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.ASCII Release.Build.0 = ASCII Release|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug.ActiveCfg = Debug|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug.Build.0 = Debug|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Debug IA64.Build.0 = Debug IA64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release.ActiveCfg = Release|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release.Build.0 = Release|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release AMD64.Build.0 = Release AMD64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release IA64.ActiveCfg = Release IA64|Win32 + {3E497868-A70B-45BE-B113-1F04D368DA93}.Release IA64.Build.0 = Release IA64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.ASCII Release.Build.0 = ASCII Release|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug.ActiveCfg = Debug|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug.Build.0 = Debug|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Debug IA64.Build.0 = Debug IA64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release.ActiveCfg = Release|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release.Build.0 = Release|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release AMD64.Build.0 = Release AMD64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release IA64.ActiveCfg = Release IA64|Win32 + {894E4674-B620-44CF-915C-EA171C279B0B}.Release IA64.Build.0 = Release IA64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.ASCII Release.Build.0 = ASCII Release|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug.ActiveCfg = Debug|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug.Build.0 = Debug|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Debug IA64.Build.0 = Debug IA64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release.ActiveCfg = Release|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release.Build.0 = Release|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release AMD64.Build.0 = Release AMD64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release IA64.ActiveCfg = Release IA64|Win32 + {EA1286CA-295F-4666-8101-EAE5A254B78A}.Release IA64.Build.0 = Release IA64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.ASCII Release.Build.0 = ASCII Release|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug.ActiveCfg = Debug|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug.Build.0 = Debug|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Debug IA64.Build.0 = Debug IA64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release.ActiveCfg = Release|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release.Build.0 = Release|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release AMD64.Build.0 = Release AMD64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release IA64.ActiveCfg = Release IA64|Win32 + {207C3746-0D9C-4ADB-AF4D-876039022870}.Release IA64.Build.0 = Release IA64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.ASCII Release.Build.0 = ASCII Release|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug.ActiveCfg = Debug|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug.Build.0 = Debug|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Debug IA64.Build.0 = Debug IA64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release.ActiveCfg = Release|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release.Build.0 = Release|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release AMD64.Build.0 = Release AMD64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release IA64.ActiveCfg = Release IA64|Win32 + {14301406-3348-4D7A-A47B-EC6180017F50}.Release IA64.Build.0 = Release IA64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.ASCII Release.Build.0 = ASCII Release|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug.ActiveCfg = Debug|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug.Build.0 = Debug|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Debug IA64.Build.0 = Debug IA64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release.ActiveCfg = Release|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release.Build.0 = Release|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release AMD64.Build.0 = Release AMD64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release IA64.ActiveCfg = Release IA64|Win32 + {3505C707-1445-4E79-894A-D30CFE5E90DA}.Release IA64.Build.0 = Release IA64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.ASCII Release.Build.0 = ASCII Release|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug.ActiveCfg = Debug|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug.Build.0 = Debug|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Debug IA64.Build.0 = Debug IA64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release.ActiveCfg = Release|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release.Build.0 = Release|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release AMD64.Build.0 = Release AMD64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release IA64.ActiveCfg = Release IA64|Win32 + {8F1A8687-4CA8-4F49-AD58-D0ECA0E0E1CA}.Release IA64.Build.0 = Release IA64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.ASCII Release.Build.0 = ASCII Release|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug.ActiveCfg = Debug|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug.Build.0 = Debug|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Debug IA64.Build.0 = Debug IA64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release.ActiveCfg = Release|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release.Build.0 = Release|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release AMD64.Build.0 = Release AMD64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release IA64.ActiveCfg = Release IA64|Win32 + {927F260A-19CF-4E55-A154-109A0BF80AE9}.Release IA64.Build.0 = Release IA64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.ASCII Release.Build.0 = ASCII Release|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug.ActiveCfg = Debug|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug.Build.0 = Debug|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Debug IA64.Build.0 = Debug IA64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release.ActiveCfg = Release|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release.Build.0 = Release|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release AMD64.Build.0 = Release AMD64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release IA64.ActiveCfg = Release IA64|Win32 + {389384D4-75A5-4B53-A7C2-AC61375C430B}.Release IA64.Build.0 = Release IA64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.ASCII Release.Build.0 = ASCII Release|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug.ActiveCfg = Debug|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug.Build.0 = Debug|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Debug IA64.Build.0 = Debug IA64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release.ActiveCfg = Release|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release.Build.0 = Release|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release AMD64.Build.0 = Release AMD64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release IA64.ActiveCfg = Release IA64|Win32 + {B0C9B69A-89CA-4378-90E2-180F8C6DA0EB}.Release IA64.Build.0 = Release IA64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.ASCII Release.Build.0 = ASCII Release|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug.ActiveCfg = Debug|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug.Build.0 = Debug|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Debug IA64.Build.0 = Debug IA64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release.ActiveCfg = Release|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release.Build.0 = Release|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release AMD64.Build.0 = Release AMD64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release IA64.ActiveCfg = Release IA64|Win32 + {5A50D272-4CE6-4DBA-A20E-B4649BDAB28C}.Release IA64.Build.0 = Release IA64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.ASCII Release.Build.0 = ASCII Release|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug.ActiveCfg = Debug|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug.Build.0 = Debug|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Debug IA64.Build.0 = Debug IA64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release.ActiveCfg = Release|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release.Build.0 = Release|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release AMD64.Build.0 = Release AMD64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release IA64.ActiveCfg = Release IA64|Win32 + {3C064356-0ECF-4BA2-A9F8-EA0E073F1A04}.Release IA64.Build.0 = Release IA64|Win32 + {40373079-658E-451A-8249-5986B2190133}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {40373079-658E-451A-8249-5986B2190133}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {40373079-658E-451A-8249-5986B2190133}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {40373079-658E-451A-8249-5986B2190133}.ASCII Release.Build.0 = ASCII Release|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug.ActiveCfg = Debug|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug.Build.0 = Debug|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Debug IA64.Build.0 = Debug IA64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release.ActiveCfg = Release|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release.Build.0 = Release|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release AMD64.Build.0 = Release AMD64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release IA64.ActiveCfg = Release IA64|Win32 + {40373079-658E-451A-8249-5986B2190133}.Release IA64.Build.0 = Release IA64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.ASCII Release.Build.0 = ASCII Release|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug.ActiveCfg = Debug|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug.Build.0 = Debug|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Debug IA64.Build.0 = Debug IA64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release.ActiveCfg = Release|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release.Build.0 = Release|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release AMD64.Build.0 = Release AMD64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release IA64.ActiveCfg = Release IA64|Win32 + {6E39EDB9-D55A-43C7-B740-9221B03FA458}.Release IA64.Build.0 = Release IA64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.ASCII Release.Build.0 = ASCII Release|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug.ActiveCfg = Debug|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug.Build.0 = Debug|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Debug IA64.Build.0 = Debug IA64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release.ActiveCfg = Release|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release.Build.0 = Release|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release AMD64.Build.0 = Release AMD64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release IA64.ActiveCfg = Release IA64|Win32 + {EE86A96A-D00A-44C9-8914-850E57B8E677}.Release IA64.Build.0 = Release IA64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.ASCII Release.Build.0 = ASCII Release|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug.ActiveCfg = Debug|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug.Build.0 = Debug|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Debug IA64.Build.0 = Debug IA64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release.ActiveCfg = Release|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release.Build.0 = Release|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release AMD64.Build.0 = Release AMD64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release IA64.ActiveCfg = Release IA64|Win32 + {22CBF051-19CD-4E61-B5C6-B5F8072F1DD3}.Release IA64.Build.0 = Release IA64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.ASCII Release.Build.0 = ASCII Release|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug.ActiveCfg = Debug|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug.Build.0 = Debug|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Debug IA64.Build.0 = Debug IA64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release.ActiveCfg = Release|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release.Build.0 = Release|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release AMD64.Build.0 = Release AMD64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release IA64.ActiveCfg = Release IA64|Win32 + {E53D7716-2173-47DC-AA6A-E06867A9D5D0}.Release IA64.Build.0 = Release IA64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.ASCII Release.Build.0 = ASCII Release|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug.ActiveCfg = Debug|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug.Build.0 = Debug|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Debug IA64.Build.0 = Debug IA64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release.ActiveCfg = Release|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release.Build.0 = Release|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release AMD64.Build.0 = Release AMD64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release IA64.ActiveCfg = Release IA64|Win32 + {07BA8001-E8DA-4CD2-A800-A4239741C4ED}.Release IA64.Build.0 = Release IA64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.ASCII Release.Build.0 = ASCII Release|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug.ActiveCfg = Debug|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug.Build.0 = Debug|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Debug IA64.Build.0 = Debug IA64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release.ActiveCfg = Release|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release.Build.0 = Release|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release AMD64.Build.0 = Release AMD64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release IA64.ActiveCfg = Release IA64|Win32 + {5F2C44DE-5466-4CF1-9962-415FFC4F3246}.Release IA64.Build.0 = Release IA64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.ASCII Release.Build.0 = ASCII Release|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug.ActiveCfg = Debug|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug.Build.0 = Debug|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Debug IA64.Build.0 = Debug IA64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release.ActiveCfg = Release|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release.Build.0 = Release|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release AMD64.Build.0 = Release AMD64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release IA64.ActiveCfg = Release IA64|Win32 + {10429E06-7C29-477D-8993-46773DC3FFE9}.Release IA64.Build.0 = Release IA64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.ASCII Release.Build.0 = ASCII Release|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug.ActiveCfg = Debug|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug.Build.0 = Debug|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Debug IA64.Build.0 = Debug IA64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release.ActiveCfg = Release|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release.Build.0 = Release|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release AMD64.Build.0 = Release AMD64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release IA64.ActiveCfg = Release IA64|Win32 + {D5938761-AD96-4C0C-9C46-BC375358DFE9}.Release IA64.Build.0 = Release IA64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.ASCII Release.Build.0 = ASCII Release|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug.ActiveCfg = Debug|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug.Build.0 = Debug|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Debug IA64.Build.0 = Debug IA64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release.ActiveCfg = Release|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release.Build.0 = Release|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release AMD64.Build.0 = Release AMD64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release IA64.ActiveCfg = Release IA64|Win32 + {A27263BC-8BED-412C-944D-7EC7D9F194EC}.Release IA64.Build.0 = Release IA64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.ASCII Release.Build.0 = ASCII Release|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug.ActiveCfg = Debug|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug.Build.0 = Debug|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Debug IA64.Build.0 = Debug IA64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release.ActiveCfg = Release|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release.Build.0 = Release|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release AMD64.Build.0 = Release AMD64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release IA64.ActiveCfg = Release IA64|Win32 + {47E23751-01E8-43C9-83C2-06EE68C121EF}.Release IA64.Build.0 = Release IA64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.ASCII Release.Build.0 = ASCII Release|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug.ActiveCfg = Debug|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug.Build.0 = Debug|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Debug IA64.Build.0 = Debug IA64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release.ActiveCfg = Release|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release.Build.0 = Release|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release AMD64.Build.0 = Release AMD64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release IA64.ActiveCfg = Release IA64|Win32 + {3A8EA457-87A3-4F20-A993-452D104FFD16}.Release IA64.Build.0 = Release IA64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.ASCII Debug.ActiveCfg = ASCII Debug|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.ASCII Debug.Build.0 = ASCII Debug|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.ASCII Release.ActiveCfg = ASCII Release|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.ASCII Release.Build.0 = ASCII Release|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug.ActiveCfg = Debug|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug.Build.0 = Debug|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug AMD64.ActiveCfg = Debug AMD64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug AMD64.Build.0 = Debug AMD64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug IA64.ActiveCfg = Debug IA64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Debug IA64.Build.0 = Debug IA64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release.ActiveCfg = Release|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release.Build.0 = Release|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release AMD64.ActiveCfg = Release AMD64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release AMD64.Build.0 = Release AMD64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release IA64.ActiveCfg = Release IA64|Win32 + {F7F26B95-3624-49CF-9A79-6C6F69B72078}.Release IA64.Build.0 = Release IA64|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal Added: external/db-4.4.20/build_win32/build_all.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/build_all.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_archive.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_archive.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_checkpoint.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_checkpoint.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_deadlock.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_deadlock.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_dll.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_dll.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,7669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_dump.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_dump.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_hotbackup.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_hotbackup.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_java.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_java.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_load.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_load.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_printlog.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_printlog.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,767 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_recover.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_recover.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_small.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_small.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,6321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_stat.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_stat.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_static.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_static.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,7581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_tcl.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_tcl.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,868 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_test.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_test.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,460 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_upgrade.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_upgrade.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/db_verify.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/db_verify.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_access.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_access.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_btrec.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_btrec.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_csvcode.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_csvcode.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,460 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_csvload.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_csvload.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,627 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_csvquery.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_csvquery.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,627 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_env.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_env.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_lock.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_lock.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_mpool.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_mpool.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_repquote.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_repquote.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_sequence.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_sequence.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_tpcb.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_tpcb.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_txnguide.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_txnguide.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/ex_txnguide_inmem.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/ex_txnguide_inmem.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/example_database_load.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/example_database_load.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/example_database_read.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/example_database_read.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_access.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_access.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_btrec.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_btrec.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_env.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_env.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_example_database_load.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_example_database_load.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_example_database_read.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_example_database_read.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_lock.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_lock.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_mpool.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_mpool.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_sequence.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_sequence.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_tpcb.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_tpcb.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_txnguide.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_txnguide.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: external/db-4.4.20/build_win32/excxx_txnguide_inmem.vcproj ============================================================================== --- (empty file) +++ external/db-4.4.20/build_win32/excxx_txnguide_inmem.vcproj Mon Mar 13 13:37:35 2006 @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From python-checkins at python.org Mon Mar 13 14:06:48 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 14:06:48 +0100 (CET) Subject: [Python-checkins] r43000 - in python/branches/release24-maint: PCbuild/bz2.vcproj PCbuild/readme.txt Tools/buildbot/build.bat Tools/buildbot/external.bat Message-ID: <20060313130648.5AD561E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 14:06:46 2006 New Revision: 43000 Added: python/branches/release24-maint/Tools/buildbot/external.bat Modified: python/branches/release24-maint/PCbuild/bz2.vcproj python/branches/release24-maint/PCbuild/readme.txt python/branches/release24-maint/Tools/buildbot/build.bat Log: Backport of 42993: Update to bzip2 1.0.3 Make buildbot slaves automatically fetch bzip2 1.0.3. Modified: python/branches/release24-maint/PCbuild/bz2.vcproj ============================================================================== --- python/branches/release24-maint/PCbuild/bz2.vcproj (original) +++ python/branches/release24-maint/PCbuild/bz2.vcproj Mon Mar 13 14:06:46 2006 @@ -21,7 +21,7 @@ Configuration -> Miscellaneous -> Other) for the duration. + Download the source from the python.org copy: + svn export http://svn.python.org/projects/external/bzip2-1.0.3 A custom pre-link step in the bz2 project settings should manage to build bzip2-1.0.2\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is linked in PCbuild\. However, the bz2 project is not smart enough to remove anything under - bzip2-1.0.2\ when you do a clean, so if you want to rebuild bzip2.lib - you need to clean up bzip2-1.0.2\ by hand. + bzip2-1.0.3\ when you do a clean, so if you want to rebuild bzip2.lib + you need to clean up bzip2-1.0.3\ by hand. The build step shouldn't yield any warnings or errors, and should end by displaying 6 blocks each terminated with @@ -157,7 +155,7 @@ If FC finds differences, see the warning abou WinZip above (when I first tried it, sample3.ref failed due to CRLF conversion). - All of this managed to build bzip2-1.0.2\libbz2.lib, which the Python + All of this managed to build bzip2-1.0.3\libbz2.lib, which the Python project links in. Modified: python/branches/release24-maint/Tools/buildbot/build.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/build.bat (original) +++ python/branches/release24-maint/Tools/buildbot/build.bat Mon Mar 13 14:06:46 2006 @@ -1,3 +1,4 @@ @rem Used by the buildbot "compile" step. +cmd /c Tools\buildbot\external.bat call "%VS71COMNTOOLS%vsvars32.bat" devenv.com /useenv /build Debug PCbuild\pcbuild.sln Added: python/branches/release24-maint/Tools/buildbot/external.bat ============================================================================== --- (empty file) +++ python/branches/release24-maint/Tools/buildbot/external.bat Mon Mar 13 14:06:46 2006 @@ -0,0 +1,8 @@ + at rem Fetches (and builds if necessary) external dependencies + + at rem Assume we start inside the Python source directory +cd .. + + at rem bzip +if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 + From python-checkins at python.org Mon Mar 13 14:08:45 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 14:08:45 +0100 (CET) Subject: [Python-checkins] r43001 - in python/branches/release24-maint: Makefile.pre.in Tools/buildbot/test.bat Message-ID: <20060313130845.8A5B61E400F@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 14:08:41 2006 New Revision: 43001 Modified: python/branches/release24-maint/Makefile.pre.in python/branches/release24-maint/Tools/buildbot/test.bat Log: Backport of 42994: Let the buildbot make a single pass in the test suite only. Modified: python/branches/release24-maint/Makefile.pre.in ============================================================================== --- python/branches/release24-maint/Makefile.pre.in (original) +++ python/branches/release24-maint/Makefile.pre.in Mon Mar 13 14:08:41 2006 @@ -546,6 +546,10 @@ -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall +# Like testall, but with a single pass only +buildbottest: all platform + $(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -uall -rw + QUICKTESTOPTS= $(TESTOPTS) -x test_thread test_signal test_strftime \ test_unicodedata test_re test_sre test_select test_poll \ test_linuxaudiodev test_struct test_sunaudiodev test_zlib Modified: python/branches/release24-maint/Tools/buildbot/test.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/test.bat (original) +++ python/branches/release24-maint/Tools/buildbot/test.bat Mon Mar 13 14:08:41 2006 @@ -1,3 +1,3 @@ @rem Used by the buildbot "test" step. cd PCbuild -call rt.bat -d -uall -rw +call rt.bat -d -q -uall -rw From python-checkins at python.org Mon Mar 13 14:48:08 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 14:48:08 +0100 (CET) Subject: [Python-checkins] r43002 - in python/trunk: PCbuild/_bsddb.vcproj PCbuild/readme.txt Tools/buildbot/external.bat Message-ID: <20060313134808.99BAA1E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 14:48:05 2006 New Revision: 43002 Modified: python/trunk/PCbuild/_bsddb.vcproj python/trunk/PCbuild/readme.txt python/trunk/Tools/buildbot/external.bat Log: Update to bsddb 4.4.20. Modified: python/trunk/PCbuild/_bsddb.vcproj ============================================================================== --- python/trunk/PCbuild/_bsddb.vcproj (original) +++ python/trunk/PCbuild/_bsddb.vcproj Mon Mar 13 14:48:05 2006 @@ -20,7 +20,7 @@ Building Berkeley DB with Visual C++ .NET" instructions for building the Sleepycat software. Note that Berkeley_DB.dsw is in the build_win32 subdirectory. - Build the "Release Static" version. - - XXX We're linking against Release_static\libdb42s.lib. - XXX This yields the following warnings: -""" -Compiling... -_bsddb.c -Linking... - Creating library ./_bsddb.lib and object ./_bsddb.exp -_bsddb.obj : warning LNK4217: locally defined symbol _malloc imported in function __db_associateCallback -_bsddb.obj : warning LNK4217: locally defined symbol _free imported in function __DB_consume -_bsddb.obj : warning LNK4217: locally defined symbol _fclose imported in function _DB_verify -_bsddb.obj : warning LNK4217: locally defined symbol _fopen imported in function _DB_verify -_bsddb.obj : warning LNK4217: locally defined symbol _strncpy imported in function _init_pybsddb -__bsddb - 0 error(s), 5 warning(s) -""" - XXX This isn't encouraging, but I don't know what to do about it. + Build the "db_static" project, for "Release" mode. To run extensive tests, pass "-u bsddb" to regrtest.py. test_bsddb3.py is then enabled. Running in verbose mode may be helpful. Modified: python/trunk/Tools/buildbot/external.bat ============================================================================== --- python/trunk/Tools/buildbot/external.bat (original) +++ python/trunk/Tools/buildbot/external.bat Mon Mar 13 14:48:05 2006 @@ -6,3 +6,8 @@ @rem bzip if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 + at rem Sleepycat db +if not exist db-4.4.20 svn export http://svn.python.org/projects/external/db-4.4.20 +if not exist db-4.4.20\build_win32\debug\libdb44sd.lib ( + devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Debug /project db_static +) From python-checkins at python.org Mon Mar 13 15:12:48 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 15:12:48 +0100 (CET) Subject: [Python-checkins] r43003 - python/trunk/Tools/buildbot/external.bat Message-ID: <20060313141248.59D671E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 15:12:47 2006 New Revision: 43003 Modified: python/trunk/Tools/buildbot/external.bat Log: Initialize VS environment in external.bat as well. Modified: python/trunk/Tools/buildbot/external.bat ============================================================================== --- python/trunk/Tools/buildbot/external.bat (original) +++ python/trunk/Tools/buildbot/external.bat Mon Mar 13 15:12:47 2006 @@ -2,6 +2,7 @@ @rem Assume we start inside the Python source directory cd .. +call "%VS71COMNTOOLS%vsvars32.bat" @rem bzip if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 From python-checkins at python.org Mon Mar 13 15:13:57 2006 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 13 Mar 2006 15:13:57 +0100 (CET) Subject: [Python-checkins] r43004 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060313141357.BAF671E4007@bag.python.org> Author: andrew.kuchling Date: Mon Mar 13 15:13:56 2006 New Revision: 43004 Added: sandbox/trunk/pycon/feedback.txt Log: Add copy of feedback Added: sandbox/trunk/pycon/feedback.txt ============================================================================== --- (empty file) +++ sandbox/trunk/pycon/feedback.txt Mon Mar 13 15:13:56 2006 @@ -0,0 +1,1180 @@ +The questions are presented in the attachment followed by every answer +grouped where possible. If the format needs to be improved, let me know +what you would rather see and I'll get on it. + +Cheers // Martin + + + +Question: What were your 3 favorite talks? +TurboGears How-to (count: 5 ) +Effective AJAX with TurboGears (count: 9 ) +Django supercharge web (count: 13 ) +Django How-To (count: 6 ) +Python Eggs (count: 1 ) +IronPython implementation (count: 17 ) +Scripting .NET with IronPython (count: 3 ) +Unicode (count: 3 ) +Creating Presentations With Docutils and S5 (count: 5 ) +Lightning talks (count: 17) + +Agile Documentation (count: 1 ) +Agile testing open space talk (count: 3 ) +An Interactive Adventure Game Engine Built Using Pyparsing (count: 3 ) +Bazaar-ng Distributed Version Control (count: 2 ) +Bram Cohen interview (count: 5 ) +Chandler BoF (count: 1 ) +Compiler/AST OpenSpace (all good) (count: 1 ) +Creating presentations with S5 (count: 1 ) +Cuaima, it was very topical for me (count: 1 ) +Dabo (count: 1 ) +Decimal for Beginners (count: 5 ) +Desktop Application Programming With PyGTK and Glade (count: 1 ) +Eve online Stackless python (count: 2 ) +Gudio on the origins of Python (count: 1 ) +Guido's Keynote (count: 17 ) +Guido's history of python (count: 6 ) +Implementation of the Python Bytecode Compiler (another good speaker) (count: 1 ) +Internationalization (Chandler) (count: 1 ) +Intro to PyParsing (count: 2 ) +Keynote Plone: It' Ain't About the Software (count: 1 ) +Lunch Talk (history of Python) (count: 1 ) +Making Apples from Applesauce: The Evolution of cvs2svn (count: 2 ) +Making Apples from Applesauce: The Evolution of cvs2svn (very good speaker) (count: 1 ) +New Tools for Testing Web Applications with Python (count: 3 ) +New tools for testing web applications with python (count: 1 ) +Not Sure Yet (count: 1 ) +Open Space Talk: wxPython bof (count: 1 ) +Openspace talks - wxPython, Dabo (count: 1 ) +Origins of Python (count: 1 ) +Packaging Programs w/ py2exe (count: 1 ) +Packaging Programs with py2exe (count: 1 ) +Plone KeyNote (count: 1 ) +Py-mycms (count: 1 ) +Py2exe (count: 1 ) +PyGTk (count: 1 ) +PyParsing (count: 1 ) +PyPy (count: 10 ) +PySense (count: 1 ) +Pyparsing (count: 1 ) +Pysense (count: 1 ) +Python Can Survive In The Enterprise (count: 10 ) +Python for S60 (count: 7 ) +Stackless Python in EVE Online (count: 3 ) +State of Zope (count: 3 ) +State-of-the-art Python IDEs (count: 2 ) +Teaching Python - Anecdotes from the Field (count: 3 ) +The EWT BoF (betting $100M with Python) (count: 1 ) +The Rest Of The Web Stack (count: 3 ) +The State of Dabo (count: 8 ) +The state of Dabo (count: 1 ) +The tutorials rocked. (count: 1 ) +The web topics i liked because it's a pain-point for me, no talk in particular. (count: 1 ) +Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (count: 1 ) +Virtual Collaboratory (count: 1 ) +What is Nabu (count: 1 ) +chandler talks (count: 1 ) +osh shell (count: 2 ) +py2exe (count: 2 ) +pysense: Humanoid Robots, a Wearable System, and Python (count: 2 ) +python AST--BOF (count: 1 ) +python tools for hydrologic modeling (count: 1 ) +the "source control track" of Extending life of CVS, cvs2svn, then bazaar-ng (count: 1 ) +tutorial: Agile Development (count: 1 ) +wxPython BoF (count: 3 ) +wxPython Tutorial (count: 1 ) +wxPython open space (count: 1 ) + + +Question: What 3 topics should have been covered at PyCon? +distutils (count: 1 ) +Nevow (count: 1 ) +Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (count: 1 ) +Twisted (count: 4 ) +PyObjC (count: 1 ) +more django/turbogears/other web frameworks (count: 1 ) +more testing (count: 1 ) +introducing python into your job (count: 1 ) +Programming Bluetooth products (count: 1 ) +wxPython (as a more in depth tutorial) (count: 1 ) +A session about Python 2.5 changes (count: 1 ) +some real usage of another new feature 2.5 (count: 1 ) +overview of gui toolkits available to developers (count: 1 ) +State of Python on Macintosh (count: 1 ) +Matplotlib (count: 1 ) +seriously advanced twisted (count: 1 ) +Twisted (I understand that several Divmod members couldn't make it) (count: 1 ) +Python Language perspective from non-Guido PEP members (count: 1 ) +more on portable computing (count: 1 ) +Some theory of compilers and how to implement a toy compiler in Python (count: 1 ) +Decimal for Experts (count: 1 ) +Component-based application development (count: 1 ) +Python in Scientific Computing (count: 1 ) +Zope/Plone (count: 1 ) +Python on the Maemo SDK (Nokia) (count: 1 ) +Creating Python Server Pages (Spyce or mod_python/GGI) (count: 1 ) +Standard library gems/ unsung modules (count: 1 ) +Setuptools, eggs, and paste *technical* presentation (count: 1 ) +trac (count: 1 ) +Wiki (Moin) Hacking (count: 1 ) +the rest of the coverage was great (count: 1 ) +pyFLTK (now that it's at version >= 1.0) (count: 1 ) +how to talk to non-technical decision makers about the benefits of python (count: 1 ) +Anything on Twisted/Nevow (count: 1 ) +Extending Editors with Python (count: 1 ) +NumPy (count: 1 ) +Mod Python (count: 1 ) +various python based revision control systems (count: 1 ) +strategies for integrating C and Python (count: 2 ) +Anything Alex Martelli wants to talk about. (count: 1 ) +Some innovative project with more exposure to the "under-the-hood" aspects. (count: 1 ) +getting started hacking python source (count: 1 ) +Cool features of core Python (e.g. generators and decorators) (count: 1 ) +Design patterns in python (count: 1 ) +Python Best Practices (count: 1 ) +Using Python in team development (locally and remotely) (count: 1 ) +Database interfaces (count: 1 ) +SpreadModule (count: 1 ) +More on Python internals (count: 1 ) +Object Relational Mapping (count: 1 ) +using python in embedded/small devices (count: 1 ) +How to share your software, packaging for the CheeseShop (count: 1 ) +matplotlib (count: 1 ) +Porting Python to PDAs (count: 1 ) +Not Sure Yet (count: 1 ) +MoinMoin (count: 1 ) +numarray or the like (count: 1 ) +Python on the Mac including PyObjC (count: 1 ) +Network Programming (count: 1 ) +Advanced Python: metaclasses, descriptors, decorators (count: 1 ) +more praticle libraries/patterns/etc (count: 1 ) +More about money (count: 1 ) +more on scientific computing with python (count: 1 ) +itertools (count: 1 ) +overview of web frameworks (yes, again) (count: 1 ) +Like to see Alex Martelli present some selected recipes from the Cookbook (count: 1 ) +Grid computing with Python (count: 1 ) +metaclasses and descriptors (count: 1 ) +Pyrex/SWIG/Pyste/SIP, etc. (count: 1 ) +Iterators and Generators (count: 1 ) +Zope 3 Concepts (adapters, interfaces, view, events) (count: 1 ) +I would have been interested in more database revolutionary stuff. (count: 1 ) +mod_python (count: 1 ) +Panel discussion with web framework developers explaining why theirs is the best (count: 1 ) +twisted (count: 1 ) +'Good Taste' in Python code (count: 1 ) +Web framework comparisons (count: 1 ) +Security Issues (Secure Access/Encryption) (count: 1 ) +sqlalchemy (count: 1 ) +REST APIs (count: 1 ) +metaclass programming (count: 1 ) +More user-developed apps and end-user items (count: 1 ) +More on eggs, especially for beginners (count: 1 ) +WebOff II (count: 1 ) +Cherry Py (count: 1 ) +Better Development Practices with Python (count: 1 ) +Python and education (count: 1 ) +Zope 3 (count: 1 ) +New/Interesting Language Features, showcase new functionality (count: 1 ) +Libraries/modules interfacing to services like maps.google.com etc (count: 1 ) +Cross-platform data synchronization (count: 1 ) +Applications using various frameworks (count: 1 ) +WSGI (count: 1 ) +Libraries (not all talks have to be about large programs) (count: 1 ) +some real usage of a new feature in 2.5 (count: 1 ) +being more productive with Python (count: 1 ) +Utilizing Python 2.4/2.5 (count: 1 ) +scientific applications (numarray, matplotlib) (count: 1 ) +Jython (count: 1 ) +New Style Classes (count: 1 ) +Design Patterns in Python (count: 1 ) +Common cookbook solutions (like Alex Martelli's presentations last year) (count: 1 ) +Core language Features, Usage (advanced usage) (count: 1 ) +problems with python (count: 2 ) +Python in handhelds -- familiar, OEM+embedded, etc. (count: 1 ) +Promoting Python (count: 1 ) +Review/comparision of IDEs (count: 1 ) +More about the core language. (count: 1 ) +Intermediate/Advanced Coding Techniques (count: 1 ) +PySci (count: 1 ) +Program Structure, Application/Library design (count: 1 ) +Ways to improve performance of Python code (count: 1 ) +Mashups (count: 1 ) +Database talks, esp. pysqlite (SQLite's small footprint seems esp. pythonic) (count: 1 ) +python and high performance computing (count: 1 ) +wxPython (count: 2 ) +Py3K (count: 1 ) +audio (count: 1 ) +use of advanced python features (count: 2 ) + + +Question: What 3 topics would you like to see repeated next year? +Python Internals (count: 1 ) +Web (count: 1 ) +Any web development talks (count: 1 ) +TurboGears (count: 3 ) +WebOff III (count: 1 ) +Twisted (count: 1 ) +Eggs/Setuptools information/howto (count: 1 ) +Testing Methodologies (count: 1 ) +unicode (count: 1 ) +buildbot (count: 1 ) +web topics (count: 1 ) +an actual eggs presentation (count: 1 ) +web dev platforms (count: 1 ) +Lightning talks. (count: 1 ) +Lightning Talks (count: 2 ) +success stories from enterprise and high performance/demanding applications (count: 1 ) +state of python (guido) (count: 1 ) +MIT Robotics project update (count: 1 ) +NerdBooks Party! :-) (count: 1 ) +Agile development and testing (count: 1 ) +Django (count: 4 ) +AJAX (count: 1 ) +IronPython (count: 3 ) +Testing/QA sessions (count: 1 ) +pypy (count: 1 ) +Zope-related talks (count: 1 ) +Teaching Python (count: 1 ) +More wxPython stuff (count: 1 ) +testing and agile development (count: 1 ) +overview talks on the history and future of python (count: 1 ) +Testing (count: 1 ) +bazaar-ng (count: 1 ) +Doctutils (count: 1 ) +Zope development (count: 1 ) +Origins of Python for newcomers (count: 1 ) +Lightning talks (count: 2 ) +Testing Frameworks (count: 1 ) +turbogears (count: 1 ) +testing (count: 2 ) +Turbo Gears (count: 1 ) +Any lightning talk sessions (count: 1 ) +Agile testing (count: 1 ) +Web and application testing (count: 1 ) +Scripting .NET with IronPython (count: 1 ) +Anything TurboGears (count: 1 ) +Chandler-related talks (count: 1 ) +More on IronPython, esp. integrating with Win/Office env, DLLs, plug-ins, etc. (count: 1 ) +Lightning Talks in Main Ballroom (count: 1 ) +more testing talks (count: 1 ) +IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (count: 1 ) +Web development (Django) (count: 1 ) +web frameworks howtos--more detail (count: 1 ) +state of python and/or python 3000 (count: 1 ) +Python Language from Guido's perspective (count: 1 ) +Real-world examples: how Python is used in the workplace (count: 1 ) +PyPy (except by someone more guruish) (count: 1 ) +Frameworks (count: 1 ) +ajax (count: 1 ) +Not Sure Yet (count: 1 ) +Interpreter/Language changes, new implementations (count: 1 ) +PyParsing (count: 1 ) +pygame intro (count: 1 ) +More Series 60 (count: 1 ) +Python in the Enterprise (anything showing Python rocking!) (count: 1 ) +PyGTk (count: 1 ) +Unicode (count: 1 ) +State of Dabo (count: 1 ) +python games (count: 1 ) +tools available for developers (count: 1 ) +Funding for projects (count: 1 ) +Eggs (count: 1 ) +Web frameworks (count: 1 ) +state of pypy (count: 2 ) +zope 3 (count: 1 ) +pysense (count: 1 ) +Python GUI Frameworks (count: 1 ) +Frameworks - Django, Turbogears (count: 1 ) +PyPy (count: 3 ) +Getting Started with the Twisted Framework (count: 1 ) +AST (count: 1 ) +Further application development talks (count: 1 ) +twisted (count: 1 ) +PySense (count: 1 ) +Guido on whatever (count: 1 ) +python implementation talks (count: 1 ) +Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (count: 1 ) +SFWMI Hydrology project update (count: 1 ) +# + +A Game-Free Introduction to PyGame (count: 1 ) +Lunchtime with Guido with up-coming python features (count: 1 ) +I would do a pyparsing follow-up if there is interest (count: 1 ) +Docutils development tutorial (count: 1 ) +More Django (count: 1 ) +Breadth and Depth of python (eg. Pysense) (count: 1 ) +Iron Python (count: 1 ) +State of Zope (count: 1 ) +Agile Testing (count: 1 ) +basic talk on good python programming practices (count: 1 ) +Web app frameworks (count: 1 ) +web stuff (count: 1 ) +Web frameworks update (Django/TurboGears/Zope) (count: 1 ) +Anything PyPy (hopefully it will be done by then) (count: 1 ) +py.* talks (count: 1 ) +py2exe (count: 1 ) +Python on embedded systems like the Nokia S60 (count: 1 ) +Python on Mobile devices (count: 1 ) +Web applications (Django/Turbo gear/Webware) (count: 1 ) +large scale systems (count: 1 ) +Dabo (count: 3 ) +testing at all levels and automating the testing (count: 1 ) +State of the Python Universe (count: 1 ) +Getting Started with wxPython (count: 1 ) +Guido talking through lunch (really enjoyed this) (count: 1 ) +state of python (count: 3 ) +Implementation of the Python Bytecode Compiler (count: 1 ) +wxPython (count: 3 ) +new applications of python (count: 1 ) +Python for Series 60 (count: 1 ) +pysense: Humanoid Robots, a Wearable System, and Python (count: 1 ) +Using Django to supercharge Web development (count: 1 ) +Plone (count: 1 ) + + +Question: Where did you stay? +Hotel (count: 72 ) +Am local resident (count: 3 ) +Hostel (count: 1 ) +With friends (count: 3 ) + + +Question: If you stayed at a hotel other than the conference hotel, what was its name? +Crowne Plaza (count: 1 ) +Comfort Inn (count: 1 ) +Super 8 (count: 1 ) + + +Question: Would you recommend the hotel to other attendees? +True (count: 60 ) + + +Question: What is your maximum per-person nightly room budget for accommodations? +$100 (count: 25 ) +$200 (count: 4 ) +$75 or less (count: 15 ) +$150 (count: 10 ) +More than $200 (count: 1 ) +$125 (count: 15 ) + + +Question: If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? +Anywhere on the east coast, shorter flight for me from Ireland :) (count: 1 ) +New Orleans, it can handle a conference this size and needs the traffic (count: 1 ) +Northern VA (count: 1 ) +San-Francisco/Bay area (count: 1 ) +Orlando, FL (the 2nd asshole of the unvierse, but nearby) (count: 1 ) +NYC (count: 3 ) +West coast (count: 1 ) +Texas (count: 1 ) +San Antonio TX (count: 2 ) +denver (count: 1 ) +Washington, DC (count: 4 ) +RTP, NC (count: 1 ) +Atlanta, GA (count: 1 ) +Atlanta (count: 1 ) +midwest (count: 1 ) +San Diego CA (count: 1 ) +Kansas City, MO (count: 2 ) +East Coast (Boston, DC, not NYC) (count: 1 ) +SoCal (count: 1 ) +Somewhere in the east coast (count: 1 ) +Tampa, FL (ibid) (count: 1 ) +Washington (count: 2 ) +Minneapolis (count: 1 ) +west coast (count: 1 ) +Seattle (count: 4 ) +Houston, TX (count: 1 ) +Minneapolis (In the early or late summer though ;) (count: 1 ) +Boston MA (count: 2 ) +San Antonio, TX (count: 3 ) +Denver (count: 2 ) +San Francisco area (count: 1 ) +San Francisco (count: 7 ) +anywhere in oregon (count: 1 ) +no preference (count: 1 ) +San Francisco Bay Area (count: 1 ) +Bay Area (count: 1 ) +New York City (count: 1 ) +Los Angeles (count: 1 ) +San Antonio (count: 1 ) +sf would be great (could stay home) (count: 1 ) +Boston / Washington / Florida (count: 1 ) +Boston, MA (count: 1 ) +San Jose (count: 1 ) +Florida (count: 1 ) +Fort Worth TX (count: 1 ) +Atlantic City, NJ (count: 1 ) +Boston (count: 8 ) +new england (count: 1 ) +florida (count: 1 ) +North Carolina (count: 2 ) +East Coast (count: 1 ) +Las Vegas (count: 3 ) +West Coast (count: 1 ) +New Orleans, LA (count: 1 ) +was hoping to spend time in dc, would of taken vacation time there. (count: 1 ) +New Mexico (count: 1 ) +san francisco (count: 1 ) +Midwest (count: 1 ) +Portland OR (count: 3 ) +Europe (count: 1 ) +West Coast (LA, SF) (count: 1 ) +San Diego, CA (count: 2 ) +new orleans (count: 1 ) +California (count: 2 ) +Chicago (Also in the early summer or early fall) (count: 1 ) +Midwest (Chicago, St Louis) (count: 1 ) +Washington D.C. (count: 3 ) +Portlan, OR (count: 1 ) +Bay area (count: 2 ) +San Francisco, CA (count: 4 ) +Austin TX (count: 1 ) +Little Rock (count: 1 ) +Toronto, ONT (count: 1 ) +Austin (count: 2 ) +Columbus, OH (count: 1 ) +Colorado (count: 1 ) +Portland, OR (count: 4 ) +New York (count: 5 ) +san fransisco (count: 1 ) +Chicago IL (count: 1 ) +Boston/Cambridge MA (count: 1 ) +Chicago (count: 9 ) +boston (count: 1 ) +Seattle WA (count: 2 ) +Mars (count: 1 ) +center of the country works well to limit flight time (count: 1 ) +DC (count: 3 ) +Irvine, CA (count: 1 ) +New York, NY (count: 3 ) +Rockwall, TX (count: 1 ) +Washington DC (count: 6 ) +seattle (count: 1 ) +Baltimore, MD (count: 2 ) +San Jose CA (count: 1 ) +Phoenix (count: 1 ) +LA (count: 1 ) +san diego (count: 1 ) +Virginia (count: 1 ) +Las Vegas, NV (count: 3 ) +New Orleans LA (count: 1 ) +vancouver (count: 1 ) +Austin, TX (count: 4 ) +anywhere on the west coast (count: 1 ) +phoenix (count: 1 ) +Kansas City (count: 1 ) +Atlanta. (count: 1 ) +New-York City (count: 1 ) +sf bay area (count: 1 ) +Denver, CO (count: 2 ) +Chicago, IL (count: 6 ) +Washington, DC, particularly GWU. (count: 1 ) +chicago (count: 3 ) +Portland (count: 1 ) +Orlando, FL (count: 1 ) + + +Question: Would you be interested in attending half-day (3-hour) tutorials next year? +False (count: 24 ) +True (count: 52 ) + + +Question: How much would you be willing to pay for a half-day (3 hour) tutorial? +$50 (count: 21 ) +$100 (count: 20 ) +$150 (count: 5 ) +Nothing (count: 7 ) +$25 (count: 8 ) + + +Question: If yes, please list 3 tutorial subjects you would like to attend: +Mod Python (count: 1 ) +text processing/introductory stuff (count: 1 ) +matplotlib and more data parsing (count: 1 ) +Web Applications (count: 1 ) +Advanced Python: Metaclasses, descriptors, decorators (count: 1 ) +Python 103 -special topics (i.e. iterators and generators) (count: 1 ) +Python & XML (count: 1 ) +extending & integrating trac (count: 1 ) +web testing and automating (count: 1 ) +testing (count: 1 ) +Twisted (count: 4 ) +Network programming (count: 1 ) +Advanced Zope3 (count: 1 ) +Zope dev setup (count: 1 ) +Advanced python topics, generators, extension writing, metaclasses... (count: 1 ) +Python for mobile devices (count: 1 ) +PyObjC (count: 1 ) +Really, really advanced techniques (count: 1 ) +Zope (count: 2 ) +Agile testing (count: 2 ) +Web development (count: 1 ) +Web application development, with case study/mock application. (count: 1 ) +AJAX with Python (count: 1 ) +Large scale systems (count: 1 ) +Advanced Language Features (count: 1 ) +Using Python to serve web pages (count: 1 ) +GUI development (count: 1 ) +Django or Turbo Gears (count: 1 ) +Python 301: An unscripted Q&A (should have pre-con questions/topics) (count: 1 ) +advanced zope (count: 1 ) +Constraint Based Local Searching (count: 1 ) +Tk and wxPy GUI building (count: 1 ) +matplotlib (count: 1 ) +Intermediate Python (count: 1 ) +wxPython (count: 4 ) +Beginning Graphics a la GTK (not tkinter or wxPython) (count: 1 ) +Implementing pluggable architectures (count: 1 ) +Metaclasses (count: 1 ) +One of the popular web frameworks (count: 1 ) +Advanced wxPython (count: 4 ) +Classes usage, Design (count: 1 ) +Object Oriented Design Patterns (count: 1 ) +Web Development (count: 1 ) +Python and Databases (count: 1 ) +Metaclasses, decorators, generators, slots, ast, other "advanced" topics (count: 1 ) +Advanced Twisted (count: 1 ) +python on embedded devices (count: 1 ) +Managing Projects with Python (count: 1 ) +Dabo (count: 1 ) +GUI Development (count: 1 ) +Intro to Audio Synthesis? (or something like that) (count: 1 ) +metaclass programming (count: 1 ) +Agile development and testing (count: 1 ) +Making effective use of WSGI (count: 1 ) +Django (count: 5 ) +python gaming (count: 1 ) +SQLAlchemy and ORM tools (count: 1 ) +Text/Data Processing (count: 1 ) +twisted (count: 1 ) +Text Parsing (count: 1 ) +IronPython (count: 2 ) +Python on handhelds (count: 1 ) +numarray or the like (count: 1 ) +Network programming, with case study/mock application. (count: 1 ) +MetaProgramming (count: 1 ) +advanced twisted (count: 1 ) +Turbogears or Django (count: 1 ) +dabo (count: 1 ) +django, turbogears, (count: 1 ) +Latest Dev Practices (count: 1 ) +database (count: 1 ) +Introduction to Object Oriented Programming (count: 1 ) +SQL Alchemy (count: 1 ) +Testing (count: 3 ) +Zope 3 Component Development Practices (count: 1 ) +gui toolkits --an overview (count: 1 ) +Library Design/Structure (count: 1 ) +Embedding python as a scripting language, with case study/mock application. (count: 1 ) +Creating Cocoa apps in PyObjC (count: 1 ) +Scientific computing (count: 1 ) +New features of Python for 2.5 (and a review of new features for 2.4) (count: 1 ) +NumPy (count: 1 ) +Plone (count: 2 ) +Building SWIG/ctypes Interfaces to other people's code (count: 1 ) + + +Question: Other comments: +---- + +The wxPython tutorial was great! I want a sequel. + +The Agile tutorial wasn't really a tutorial, but more like a regular talk but longer. They gave a brief overview of a lot of testing technologies rather than actually teaching any single one. Useful, but not really a tutorial. +---- + +I think the interview idea for the keynote was not a very good idea. It was a bit boring and not very effective. +Some talks didn't have any coordinators so presenters were a bit lost at start. +---- + +overall really good. i have been to oscon twice and the level of service has been about the same. they had wireless problem there one year also and still throughout the conference. + +i like marriot, the beds are really comfy, would love to have them get a reduced/free internet from the room rate. + +better way to guage interest in specific talks to guage room size (oscon struggled with this also) + +there seems to be two different descriptions of each talk on the web site.. one in a wiki and one in a db. the wiki one was much easier to read. +---- + +Less tippy, spilly food (pasta, soup). We need to figure the wireless situation out, it was obviously horrible. Otherwise, I really liked the hotel. I wasn't sure why the Plone thing was a keynote. I kind of liked the friday+weekend situation, because otherwise my work tends to intrude. +---- + +I would like to see more about approaching a collaborative approach to combining some of the best features of the various frameworks available. Too often, I feel, each project is so closely held to the ego of the original creators. I think that this is a great detriment to the advancement of the frameworks themselves as well as the usability of the language as a whole. Perhaps a talk about comperitive frameworks, a meeting of the creators of the various frameworks to discuss "lesson's learned" and sharing (what a new concept, especially for open source)... +---- + +The tutorials all started at ground zero, and went from there. I don't need an intro on most topics, I want to learn advanced features of technologies I already work with. +---- + +I wish the talks were fewer but longer, more tutorial in nature. Some were very rushed. +---- + +I thought the tutorials were the most productive time I had at Pycon. I would like to see more and, perhaps, even have some during the main conference (with limited enrollment). There were many sessions where none of the talks appealed to me and I would have rather paid more to take more tutorials. +---- + +It would have been nice to have an exhibit room for vendors, even a small one. I liked the lightning talks. I liked the tables set up in the main conf. Having wireless was great, not sure what could be done to help the bandwidth without spending a ton of money. For some reason the sound system kept getting worse in the main hall over the course of conference not better. The feedback got to be really annoying and loud at the end. All in all I thought it was a well organized conference and I plan to attend next year. The price was very reasonable. +---- + +The wireless networking coverage sucked. Unreliable, and frequently unavailable. +---- + +Network was almost "non-existant". I would refuse to pay them for the service received! + +Maybe having a sprinting area (in the staging room?) on tutorial day would be good. The +space is already reserved. + +It is still important to have both wired and wireless... especially when the capabilities of +the network staff are as limited as those used by the Marriott Hotel used for PyCon 2006. +---- + +I attended the wxWidgets tutorial, and was slightly disappointed. Too much time spent on basics (how an app interacts with window manager, events, etc), and full specification of various widgets, and not enough time spent on the key elements of GUI design (e.g. no mention at all about MVC techniques). Even important things like sizers seemed very rushed. + +All the APs were on channel 1. + +More infrastructure for people to coordinate out-of-conference activities (dinners, drinking, hanging out with people doing interesting things, etc). (I guess people *could have* created a wiki page, but it wasn't clear that doing so would have been acceptable/encouraged). + +Other topics for next year (why do you limit us to only 3?): +"How to manage a 100,000+ line python application" +"Python for Security Practitioners" (I'll be submitting a talk proposal on this :-) ) +"State of Python Operating Systems" (e.g. unununium.org and cleese.sf.net) +"Guerilla's Guide to Getting Python into your Company" +PyGame (or python media/graphics in general) + +---- + +My first PyCon. Really enjoyed it. Could be longer (1-2 days longer). Love the sprint concept. Network needs to work better. +---- + +The rooms need more power strips! That would have helped my experience immensely. In the main conference hall, there were power strips only for about a third of the seats. That was unacceptable. +---- + +The tutorials were okay this year, however they could be much better. The topics seemed a little broad for three hours. +---- + +I'm interested in _giving_ tutorials (again) next year. These answers are based on if you decide not to ask me to return. (kww) + +Another thought, and I'm not sure if this is a subject for a talk or a tutorial, would be some 'live code' that uses some of the more esoteric features of Python. (Metaclass functions, decorators, etc) Rather than the contrived examples, I'd like to see situations where these features solve a problem that can't easily be solved by other means. +---- + +Many of the speakers seemed unprepared -- in some cases I really felt like they were not being respectful of my time by just how poorly prepared they were. It was clear that many talks hadn't been practiced (or cursorily if they were) -- I've been to many conferences (and PyCon last year) and it felt like there was a substantial difference this year as compared to years past. I'm not sure what could be done to remedy this, but something needs to be done. + +The new tables/seating style was both good and bad -- I feel as though it made it less lively because people were less inclined to pay attention to the speakers because it was so much easier to have your laptop out. + +The hotel was far too isolated -- to get around one really needs a car because the area is pedestrian unfriendly and the sidewalks that are there are frequently topped by scores of birds on the powerlines making it, um, an adventure in looking up and dodging while walking. Amusing until they don't miss (trust me ;) So, either more frequent shuttles (and better info on the surrounding area) are needed or a less suburban location would be preferable. + +For all of the bad stuff above, I really did enjoy the conference and this year's venue felt much more fitting to the size of the PyCon crowd than the D.C. location did. Thanks to all the volunteers who put in all of the hard work!! + + + + +---- + +-Wireless was *terrible*. I'm sure you're aware of it already. This really needs to be fixed or next year may be my last PyCon. I usually need to have access to my work while on travel and this is a must. + +-Lunch was great, snacks--less so. Why was there no coffee *before* the keynotes, which were 1 1/2 hours? I would be willing to spend an extra $10 on registration to have coffee and breakfast foods available before and after the keynote, but even just having them before would be nice. + +-It would be nice to know in advance what talks will be available after the Con in audio/video. Several talks I wanted to see overlapped, and it would be nice to know if one of them would be available at a later date. Perhaps also leaving a couple slots open for encore presentations if the presenters are interested (this happened with Ian Bicking's eggs talk) +---- + +This was my first PyCon and I thoroughly enjoyed it. It couldn't have been much better (short of actually meeting Alex Martelli-but meeting Anna Maretelli Ravenscroft more than made up for that ;-)) + + +---- + +The keynote talk on Plone was bad. It was like the speakers hadn't prepared anything at all. + +The talk by AG Interactive, Python in the Enterprise was embarassingly bad. Essentially, they said "Python is great. We used python, but we can't tell you anything else because it's proprietary." + +Python for Series 60 was also too much advocacy and too little technical detail. + + +---- + +The keynotes should not be tied to a particular product, IMO. Aside from that problem, the Plone Keynote was terrible. The presenters may have built a fine product, but they have no ability to talk about it intelligently. The interview with Bram Cohen keynote wasn't much better. Guido's keynote was great. + +Some of the sessions were rather lame. If only there was a test for presentation ability that presenters would have to pass to get a slot. The PyGTK presentation for example, was just awful. It belonged in a Open Space Talk, not a a talk with official billing. Perhaps all presenters should show up a day early and spend a few hours with Kevin Dangoor about how to present! +---- + +Tutorial proceedings were a great buy for $25, keep doing this (if tutorial presenters will permit) +---- + +Were the tutorials intended for beginners? IF so then that should be clear. Maybe the tutorial should have a "difficulty" rating. We are a rather experienced group of pythonistas so we didn't get lots out of "Text and Data Processing", for example, but I got tons out of "Agile development and testing" + +I think talks and tutorials where they showed real world stuff was the most helpful. When the talks are generic they are light on content. People start naming functions foo and bar, and it is hard to really get into it. But when people show real examples it is much better. +---- + +I'd attend a tutorial only if I were *really* interested in the topic. +---- + +It's hard to suggest topics for next year this far in advance since it's hard to know what gaps I'd like to fill a year from now. +---- + +Overall, I had a good time. Had to leave the sprints early... wah. + +Thought the hotel was so-so. I thought the "quiet" rooms should have been enforced. +---- + +I must say that the social/personal networking aspect of this conferencce was unparalleled. Just fantastic. It was a HUGE success having such great hotel rates that most everyone stayed under the same roof. + +As many have noted, the wireless network left a tremendous amount to be desired. I was actually one of the lucky ones, and didn't have any issues until the sprint days, the last few days of which the wireless was just abysmally poor. +---- + +If tutorial costs are reasonable our management will pay for them. +---- + +The wireless access on the conference floor was pretty poor. I ended up (in order to keep needed communications open) paying the hotel the extra $10/night for a wired connection in my room. I would rather have kept my laptop with me. + +Nice work, AMK and everybody else. It's still my favorite technical conference. +---- + +I attended the tutorials this year and found them helpful, but the time went by quickly and there were more that I wanted to attend than I had time for. Next year perhaps having longer sessions (4 hours perhaps) and maybe a second day of sessions would be great. +---- + +Badges should show nickname, company, and city/country. + +---- + +Put company names on name tags. + +---- + +I'd like to learn to use a specific part of Python for applications on Linux, not just overviews of apps written in Python. + + +Question: What days did you attend PyCon? +Sunday (count: 74 ) +Friday (count: 78 ) +Saturday (count: 77 ) + + +Question: Please rate your overall satisfaction with PyCon 2006. +high (count: 48 ) +very high (count: 27 ) +low (count: 5 ) + + +Question: Please rate your overall satisfaction with the keynotes. +high (count: 43 ) +very high (count: 20 ) +low (count: 16 ) + + +Question: Please rate your overall satisfaction with the talks. +high (count: 55 ) +very high (count: 11 ) +low (count: 13 ) + + +Question: Please rate your overall satisfaction with the network. +high (count: 11 ) +very high (count: 2 ) +very low (count: 31 ) +low (count: 27 ) + + +Question: Please rate your overall satisfaction with the food. +high (count: 48 ) +very high (count: 19 ) +very low (count: 1 ) +low (count: 9 ) + + +Question: Please rate your likelihood of attending next year. +high (count: 30 ) +very high (count: 35 ) +very low (count: 1 ) +low (count: 12 ) + + +Question: Would you prefer a conference that took place: +just as it was (count: 1 ) +better to end on a weekend, this years way worked (count: 1 ) +Includes one weekend day (starts on Sunday or ends on Saturday) (count: 15 ) +This was a good schedule (count: 1 ) +not important (count: 1 ) +Only on weekdays (count: 16 ) +Includes two weekend days (count: 38 ) + + +Question: How can we improve PyCon next year? +---- + +The current location felt fairly isolated from the outside world -- I would prefer a more urban location, however the hotel environment worked much better than the previous DC location as far as feeling spacious, connected. The crowd flow felt smoother than in years past. + +The food was good this year, but given the relative isolation of the hotel from cheap breakfast options, a small breakfast offering every day would be worth another $20 in registration fee to me but at the least, coffee being available before the morning sessions start would be huge. + +Overall this has been a good experience and I want to thank all of the volunteers that put it all together! +---- + +I heard several presenters declined. Make them a bit more special, by destinguishing them on the nametag (use ''speaker' like at EuroPython, it gets you the inquiries from what do you speak on from the girls, that missed you presentation) + +---- + +There is a huge, hard-to-cross gap between intro Python and advanced +usage. This applies to all sources of Python knowledge: books, +material available on the web, and this conference. + +I would like to know more about advanced features of the language: +metaclasses, descriptors, decorators. I checked every Python book on +display at Nerdbooks last night, and found only one chapter in the Python +cookbook. And because that's a cookbook, it was pretty poor on +concepts. + +There is a need for an advanced Python book, and it would be wonderful +if there were a concerted effort to improve coverage of these topics +at next year's pycon, perhaps at tutorials. + +I have to say that this conference was somewhat disappointing -- I +came away knowing way too much about this year's fads (aka web +frameworks), without increasing my understanding of the language +itself. +---- + +Better wireless which allows peer networking. Or else have ethernet switches everywhere. +Get Alex Martelli, Bruce Eckel +Serve breakfast. +More volunteers for room setup night before. +Capture VGA signal going to projectors so we can have video + audio recordings. + + +---- + +Turn off the air condition...all rooms where fucking cold...colder than outside. +---- + +coffee and tea available before keynotes! +---- + +better wireless + +better way to know about schedule changes (maybe e-mail alerts) + +have talk feedback forms available at start of conference so they can be filled out right after each talk. + + +---- + +Better keynotes -- I wasn't impressed with the Plone one or the Cohen one. (Although the interview format was an interesting experiment, I don't think it worked.) + +I did like the "bonus lunch keynote" on Friday. + +Food was excellent overall. No complaints there. +---- + +I believe it's been covered above. +---- + +Review the talks more, perhaps work with the presenters in advance to ensure a smooth process and optimal experience. +---- + +More repeats of the good talks. Repeat highly rated talks on subsequent days during openspace +---- + +The "snack" breaks wiped the food out... and if the session you attended went long, you just went hungry. +Publicize wired networking... some of us are still in the dark ages. ;) +The schedule of talks had too much churn, especially on Sunday; I understand that people back out, but it made it hard to plan where you were going. +The nerdbooks.com party was a great way to meet people; more of that would be good. +The lightning talks were good... a couple of flops, a few homeruns, but overall pretty good. +Needed better moderation of speakers going until the start of the next timeslot, particularly in the open space talks. +Encourage "main" speakers to also hold an open space Q&A/BoF sometime later on during the conference. + +---- + +There's no place for general comments, so I'll do that here. + +I didn't use the network, so no comments. + +I thought the food was very good. The catering staff was really the best I've ever seen. Very helpful, and didn't mind interacting with attendees. That's unusual. + +---- + +* The wireless BITES! Extremely annoying. + +* A better mechanism for impromtu announcements, similar to the bulletin board sheets of years past, with scribblings of all sorts: GPG key signings, BOF's, "Joe meet me at 8:00", etc. + +* Food was pretty good. + +* Comraderie is, as always, excellent. I'm participating in my first sprint, though I'm leaving Tuesday. I feel completely out of my element, but folks are very tolerant of my slow nature. + +* Nothing you can do about this, but I was surprised by Andrew's comments that most found the beds comfy. I wanted to add another data point: I found lying in the bed to be akin to drowning, and keep wishing for a much firmer mattress. I usually find hotel beds to be pretty firm and have been sleeping horribly here. (That, and the thermostat has been set to 80 F for four days and the room is still cold. The thermostat is making something blow, but it ain't heat. It's not AC either. Seems to be just air.) + + +---- + +We need to get more volunters involved. There were a handful of people working the registration desk and hosting sessions. + +Serving food in the hallway made tigs quite crowded. Is there a way to solve that? + +It would be nice to have more tee shirts available. Perhaps we could allow people to order extra when they register? Also, we need to have a way to match up the size they ordered at registration so that we do not run out of specific sizes. This could be as easy as having a list of the registrants avail able to check off as they register. + +Perhaps more organized evening activities? Professional sports or a shuttle running to the Galaria. + +Pycon is a great time and I would like to help more for Pycon 2007. Please make your needs known earlier. I was on the volunteer mailing list but felt that there must have been another form of communication because often we would just see what had been done; not very often was a task thown out for someone to pick up. +---- + +More tutorials, better wireless, some new social networking gimic +---- + +My only real complaint is about the cleanliness of the ballroom. I think the lack of convienient +trash cans (particularly at the beginning of the conference) contributed to the problem. And with +as many soda can's that are emptied during the conference, the trash recepticals should be +paired with clearly marked recycle containers too. I'm not normally a neat freak, but it kind of +bothered me this week. +---- + +Please provide coffee during registration not just at first break. the hallways were a bit crowded during the lunch breaks. I'm not sure how that could be made better though. It worked though. The lunch choices were excellent. some of the afternoon snacks were kind of odd like the trail mix. +---- + +More of everything! Free student places? Competitions, prizes. How about an "installfest"? +---- + +Better network access - when the network was up, it was fast enough but wireless APs got knocked out by the door motors in the ballroom, and signal strenghts fluctuated a lot. + + +---- + +Not as many "intro" talks. Maybe intro + usage/example code would be better? I already knew a lot about the topics before so I'd rather get into the heart of things. + +Would be nice to have coffee available before the keynotes! +---- + +I expanded my thoughts in general in my blog, http://pyjesse.blogspot.com/2006/02/pycon-my-critique.html - and I come off as overly critical, but I would like to take some time and take a more proactive role in improving the conference as much as I can. + +I believe that as a language conference, we can not concentrate on the "hype du-jour" of the day - while that does help recent adoption, I think we need to cover our "core" bases as well. I think we need to go back to systems/program design, and showcasing the core feature of the language. + +We can not simply show those successful applications written with the language - we have to show people how to make those successful applications and tools. + +For instance, TurboGears is really cool - and a lot of the web frameworks get a lot of soundbites, but how do I, as someone knowing the core language build something like that? +---- + + * Have breakfast before the keynotes so people can be encouraged to mingle in the mornings too. + * Make sure the mics are working for people to ask questions + * seamless wifi access + +Otherwise I had a great time and will be back next year for sure!!! Good job to all involved. +---- + +Since it will be at the same venue... + +MAKE SURE THAT THE HOTEL UNDERSTANDS THAT THEIR NETWORK SERVICES WERE A DISASTER!! + +They should be completely embarrassed. + +If we paid for all of the food/drinks that were set out... then IMO they were far to quick to take things away. Some of us were busy and didn't get to the lines until stuff was being taken away. + +For next year, at the end if the serving time, consolidate items to the one side (between the +registration desk and the kitchen and leave it up until it is clear that all are done). +---- + +More Talks on WxPython +---- + +I had 4 coworkers who expressed a desire to go to the conference (and had management approval) but ended up not going due to spanning over the weekend (family events interfered). I'm sure for everyone of those types of situations, you'd be hurting someone who didn't have management approval and wouldn't be able to attend if it meant taking off of work though. +---- + +Work out network issues. Maybe stretch out conference to allow longer talks + more time between talks. +---- + +Publish speaker slides and notes before conference if possible. + +Shuttle to and from airport. +---- + +email receipt need to list the tutorials you signed up for. + +Descriptions of talks need to be available earlier (same for tutorials). + +I think the time for individual talks were way too short. Every one of them ended up having to be cut short. Consider adding 5 minutes to each talk. + +BTW, the tutorials were great! David Goodger was great! +---- + +Less talks but longer higher quality sessions. 30 minute sessions are too short. Be more critical on who you take for talks. You should have a good idea of who the good speakers are. Dump talks that are very abstract like "Vertical Fractal Analysis". + +Perhaps you can have two levels of talks. Better speakers with more popular topics can get 45 to 60 minutes. Lump others into open space talks of 15 - 30 minutes. +---- + +A comment on that last question - I was one of those who originally objected to the weekend format. I've now changed my mind. In a couple different ways, the weekend structure worked out a lot better for me personally. +---- + +Coffee and/or breakfast in the early AM would be hugely helpful. I'd gladly pay more for this addition if cost is an issue. +---- + +Tell people to prepare more engaging presentations and tell them to rehearse to co-workers several times in advance. +---- + +See "Other comments" above. In summary: +-fix the wireless ASAP +-coffee first thing +-have a schedule of talks whose audio/video will be available post-Con +---- + +I felt that the keynotes were weak, especially the interview. I felt that the entire conference was a little thin on technical details, and that it would be much better to have half as many talks that were twice as long, or at least one track of talks that were focused on providing more detail. + +A lot of times, I went to a presentation to only come out of it with an idea of what something does, not how to do it. I can get this information from the project's website. In my mind, some more detailed technical howto sessions and best-practices sessions would be great. + +I would also like to see this extended into having a "track" of talks in multiple parts, to replace the concept of tutorials. So, maybe three sessions on TurboGears, in ascending order of detail (general overview, intermediate level implementation, advanced stuff). + +Far and away the biggest advantage of being at PyCon was meeting people, and sharing ideas. There should be more facilitating of this. +---- + +More code and demos, fewer slide/informational talks. I also found that I began to look for good speakers, and the topic almost doesn't matter. It's harder to deal with that when deciding which talks to allow of course. + +More smaller spaces for folks to sprint during the conference might be nice too. This was my first pycon, and the number of people I met really surprised me. The Python community is very friendly, and the more we can do to promote the social aspect (as geeks and people) I think the better the conference would be. + +I'd hate to see a sign-up for a talk form, but something like the party interest form for talks so we don't have what happened with the Python Eggs talk (which really turned out not to be about eggs). + +You already know about the wireless, but if you could have someway of folding in-room internet into the special room rate for pycon it might be at least a good option for next year. +---- + +These are more just general comments rather than specific improvement suggestions. + +Wireless coverage was horrible. We could have probably done a better job ourselves by buying 10 WAPs and sprinkling them liberally around. + +I only attended Guido's keynote, the other topics didn't really interest me. + +If a speaker is going to code, make sure the text is readable on screen or provide handouts or have a follow along website. (not specific to pycon but to a speaker) + + + +---- + +Promote it more heavily and starting earlier. The more attendees there are, the more valuable the conference is, since we learn so much from each other. +---- + +1. Have more social activities - may be a visit to a Dave and Busters or similar, if logistically possible. +2. This time, the trail mix supplied on the first day of the conference (snack time) was stale. +---- + +I was disappointed at the quality of the talks. I think the bar for doing a talk should be raised, even if that means there are less talks. + +In addition, perhaps people should be encouraged to organize workshops or other interactive activities. + +---- + +The keynote speakers should not be 'selling' a product, telling us it's a great way to get a consulting gig. That's not about Python. The keynotes should be about Python. I would like to see some kind of filter for the talks. Several of the talks were of such low quality that I felt dumber for having attended! +---- + +Everything was pretty much ok. + +Presenter access to internet during presentations really helped in live demos. + +Encourage presenters to do at least a little live demo at the Python prompt. +---- + +- add country/state to name tags +- provide wired tcp/ip access for speakers +- add a survey before conference to find hot topics and try to put those talks in large rooms. +- provide a message board for posting of adhoc meetings (like dinner groups) + +---- + +Include more general talks. The talks this year seemed to be intensely focused on particular niches of Python, but there wasn't much for general Python coding practices. +---- + +Somehow getting Internet access in the rooms enabled as part of the group-rate would be excellent. + +It would be nice if there was a feature on the website to allow people to publish some info about themselves, a picture, maybe a paragraph listing some interests, and most importantly a URL to an RSS feed (hopefully Python-related). Then have the website do some feed-aggregation, to have a sort of Planet-Pycon, so that in the months leading up to the conference (and even afterwards) you could get to know the people you'll be crossing paths with. + +Thanks for the conference +---- + +BOTTLED WATER!!! The water was undrinkable, so I drank pop. +More healthy snacks (pronounced lower-carb ;-). +I gained 10 pounds in a week! :-(( + +Maybe something like a Linux install fest. Where people can try to get things running on their laptops. Things like setting up buildbot or selenium or implementing a simple CherryPy/Django server. The tutorials and talks were mostly lecture, it might be useful to have labs. I realize that labs can take a lot of time and effort but it might be useful. Maybe Saturday evening could be labs. +---- + +i think one good idea would be to add IRC nicks to the conf badge. there are a lot of people i talk to on IRC and don't neccesarily know their real name. an option to add this upon registration would be a neat idea. + +better network. i'm sure you are going to get a lot of that ;) + +session management was a little flaky. i was in a couple talks that ran over and i missed the start of the next talk. i noticed steve holden did a nice job of this. he was very adamant that the talks ended when they were supposed to. +---- + +Have three Lightning Talk sessions, one per day. We had two sessions with 20 speakers, but there were easily 30 speakers available, if not more. Every PyCon has had more speakers than time, and the audience does not get bored. Let's find the saturation point. Only the first needs to be plenary; the second fit into a regular (largish) session room. + +Bring back the bulletin board for Open Space. The computer-based scheduling allowed only one topic per timeslot and described them all as "talks". Open Space became an overflow for session talks. That's important but it misses something that made the DC Open Spaces such a success: several simultaneous roundtable discussions.I wanted to do a Cheetah roundtable but all the timeslots were filled with "talks". I could have pushed but it didn't seem worth the bother. + +The Marriott's additional space and layout was definitely an improvement over last year, and the hotel rooms were quite a bargain. The only thing I missed space-wise was a full-size ballroom with round tables for the Open Space. + +We should make sure the schedule is clearer when unexpected things happen. The first day, the lunch talk started late and ended late. People were confused all afternoon whether all the sessions were moved back or the after-lunch session squashed. Some people thought one, some the other. So you'd go to a talk and the previous one was still going on, and small talks (Open Space) didn't know when to begin. When something like this happens, we need to adjust the times on all the posted schedule sheets and make an announcement. + +The evening party at Nerdbooks was great. I was impressed with the amount and variety of food they contributed, and it gave people a chance to browse/buy technical references. Better than just selling a few titles at the conference. + +I felt a bit isolated from Dallas. Maybe we can have an excursion downtown the day before or after, or something. +---- + +[This is one feedback submitted as two entries, because the software submitted it while I was in the middle of typing.] +---- + +Improve the quality of the talks.. breadth and depth. +---- + +The technical aspects of the talks seemed to be different this year, perhaps with a target audience of beginner to intermediate skill level. + +It would be really nice to have more advanced talks next year, perhaps with "Advaned Topic" prepended to the talk title, to give beginners a heads-up. + +Have Sean Reifschneider/tummy.com do the networking ;-) +---- + +WIRELESS: +very spotty this year--up and down all the time, lots of dropped packets. I don't mind if it's a little slow, as long as it is up consistently. + +FOOD: +Please provide continental breakfast a la PyCon 2005. I thought that was a great way to get people there early and is very convenient for attendees. Food was better at PyCon 05 than 06. This year the snacks were not up to par. Preferred 05 where there was fresh fruit and baked goods at snacks. This year we got bagels once or twice, but the oatmeal bars and a nuts-only snack don't cut it. Lunches were OK. + +---- + +better wireless, it's great otherwise. +---- + +Offer transportation for evening meals each night. There were several evenings where a group would get together and go out for dinner, which is fine, but many people did not have rental cars or transportation which limited dining options. It would be nice to have some type of shuttle or car pool available each night to a central location with dining options for those who have no transportation and do not want to eat at the hotel every night. + +The internet connectivity was very lacking as well. Granted, the hotel is probably not used to having 400 geeks hammering their network all weekend long, but perhaps next year they can offer a better service for the conference. There were many issues with limited connectivity to the wireless network and very slow speeds. The in-room connections which were not free also had connectivity and speed issues. If the hotel wants to keep the conference they really should address this issue next year. +---- + +Better and more snacks. + +---- + +Plone keynote was awful. After the talk I had no idea what it was, what it did, what it looked like, how it works, what its relation to Zope is, etc. + +Microphones that don't work are unacceptable. + +Slides that have very small fonts are unacceptable. + +---- + +Somewhere that's more of a walking city would be better (even San Antonio). + +There seem to be more people developing the Python language than working on applications. + +---- + +Don't let the Plone guys keynote ever again. + +Longer time slots for presentations so it doesn't feel so rushed and there is time for questions. + +More emphasis on working code demonstrations. + +Fix the audio. Even in small rooms you could not hear the speaker. + +---- + +Improve the sound capabilities. +---- + +Dallas is boring. I'll wait until 2008 when we hopefully find a better host city. + +Have an organized Friday evening party or social activity. OSCON has lots of events with free beer, which really help the shy to connect with others. + +---- + +Less web development, more Linux apps. + +Put on the web site "computer recommended". + +The conference was more of a technology fair and not what I expected. More of an overview of products available. + From python-checkins at python.org Mon Mar 13 15:27:44 2006 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 13 Mar 2006 15:27:44 +0100 (CET) Subject: [Python-checkins] r43005 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060313142744.22E231E4007@bag.python.org> Author: andrew.kuchling Date: Mon Mar 13 15:27:43 2006 New Revision: 43005 Modified: sandbox/trunk/pycon/feedback.txt Log: Merge identical votes Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Mon Mar 13 15:27:43 2006 @@ -7,83 +7,61 @@ Question: What were your 3 favorite talks? + TurboGears How-to (count: 5 ) Effective AJAX with TurboGears (count: 9 ) Django supercharge web (count: 13 ) Django How-To (count: 6 ) -Python Eggs (count: 1 ) +Python Eggs (count: 2 ) IronPython implementation (count: 17 ) Scripting .NET with IronPython (count: 3 ) Unicode (count: 3 ) -Creating Presentations With Docutils and S5 (count: 5 ) +Creating Presentations With Docutils and S5 (count: 6 ) Lightning talks (count: 17) - +Python in Your Pocket: Python for Series 60 (count: 14 ) Agile Documentation (count: 1 ) -Agile testing open space talk (count: 3 ) +Agile Testing open space talk (count: 3 ) An Interactive Adventure Game Engine Built Using Pyparsing (count: 3 ) -Bazaar-ng Distributed Version Control (count: 2 ) +Bazaar-ng Distributed Version Control (count: 3 ) Bram Cohen interview (count: 5 ) -Chandler BoF (count: 1 ) -Compiler/AST OpenSpace (all good) (count: 1 ) -Creating presentations with S5 (count: 1 ) -Cuaima, it was very topical for me (count: 1 ) -Dabo (count: 1 ) +Chandler BoF (count: 2 ) +Internationalization (Chandler) (count: 2 ) +Cuaima (count: 1 ) Decimal for Beginners (count: 5 ) -Desktop Application Programming With PyGTK and Glade (count: 1 ) -Eve online Stackless python (count: 2 ) -Gudio on the origins of Python (count: 1 ) +Desktop Application Programming With PyGTK and Glade (count: 2 ) Guido's Keynote (count: 17 ) -Guido's history of python (count: 6 ) -Implementation of the Python Bytecode Compiler (another good speaker) (count: 1 ) -Internationalization (Chandler) (count: 1 ) -Intro to PyParsing (count: 2 ) -Keynote Plone: It' Ain't About the Software (count: 1 ) -Lunch Talk (history of Python) (count: 1 ) -Making Apples from Applesauce: The Evolution of cvs2svn (count: 2 ) -Making Apples from Applesauce: The Evolution of cvs2svn (very good speaker) (count: 1 ) -New Tools for Testing Web Applications with Python (count: 3 ) -New tools for testing web applications with python (count: 1 ) -Not Sure Yet (count: 1 ) -Open Space Talk: wxPython bof (count: 1 ) -Openspace talks - wxPython, Dabo (count: 1 ) -Origins of Python (count: 1 ) -Packaging Programs w/ py2exe (count: 1 ) -Packaging Programs with py2exe (count: 1 ) +Guido's history of python (count: 9 ) +Implementation of the Python Bytecode Compiler (count: 1 ) +Intro to PyParsing (count: 5 ) +Making Apples from Applesauce: The Evolution of cvs2svn (count: 4 ) +New Tools for Testing Web Applications with Python (count: 4 ) +Packaging Programs with py2exe (count: 5 ) Plone KeyNote (count: 1 ) Py-mycms (count: 1 ) -Py2exe (count: 1 ) -PyGTk (count: 1 ) -PyParsing (count: 1 ) PyPy (count: 10 ) -PySense (count: 1 ) -Pyparsing (count: 1 ) -Pysense (count: 1 ) Python Can Survive In The Enterprise (count: 10 ) -Python for S60 (count: 7 ) -Stackless Python in EVE Online (count: 3 ) +Stackless Python in EVE Online (count: 5 ) State of Zope (count: 3 ) State-of-the-art Python IDEs (count: 2 ) Teaching Python - Anecdotes from the Field (count: 3 ) The EWT BoF (betting $100M with Python) (count: 1 ) -The Rest Of The Web Stack (count: 3 ) -The State of Dabo (count: 8 ) -The state of Dabo (count: 1 ) -The tutorials rocked. (count: 1 ) -The web topics i liked because it's a pain-point for me, no talk in particular. (count: 1 ) +The Rest Of The Web Stack (count: 4 ) +The State of Dabo (count: 11 ) Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (count: 1 ) Virtual Collaboratory (count: 1 ) What is Nabu (count: 1 ) -chandler talks (count: 1 ) -osh shell (count: 2 ) -py2exe (count: 2 ) -pysense: Humanoid Robots, a Wearable System, and Python (count: 2 ) -python AST--BOF (count: 1 ) +Osh shell (count: 2 ) +PySense: Humanoid Robots, a Wearable System, and Python (count: 4 ) python tools for hydrologic modeling (count: 1 ) -the "source control track" of Extending life of CVS, cvs2svn, then bazaar-ng (count: 1 ) + +python AST--BOF (count: 1 ) +wxPython BoF (count: 6 ) + tutorial: Agile Development (count: 1 ) -wxPython BoF (count: 3 ) wxPython Tutorial (count: 1 ) -wxPython open space (count: 1 ) + +The tutorials rocked. (count: 1 ) +The web topics i liked because it's a pain-point for me, no talk in particular. (count: 1 ) Question: What 3 topics should have been covered at PyCon? From python-checkins at python.org Mon Mar 13 15:46:34 2006 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 13 Mar 2006 15:46:34 +0100 (CET) Subject: [Python-checkins] r43006 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060313144634.6C57E1E4007@bag.python.org> Author: andrew.kuchling Date: Mon Mar 13 15:46:33 2006 New Revision: 43006 Modified: sandbox/trunk/pycon/feedback.txt Log: Wrap long paragraphs; add percentages for multiple-choice questions Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Mon Mar 13 15:46:33 2006 @@ -312,10 +312,10 @@ Question: Where did you stay? -Hotel (count: 72 ) -Am local resident (count: 3 ) -Hostel (count: 1 ) -With friends (count: 3 ) +91% Hotel (count: 72 ) + 4% Am local resident (count: 3 ) + 1% Hostel (count: 1 ) + 4% With friends (count: 3 ) Question: If you stayed at a hotel other than the conference hotel, what was its name? @@ -329,12 +329,12 @@ Question: What is your maximum per-person nightly room budget for accommodations? -$100 (count: 25 ) -$200 (count: 4 ) -$75 or less (count: 15 ) -$150 (count: 10 ) -More than $200 (count: 1 ) -$125 (count: 15 ) +21% $75 or less (count: 15 ) +36% $100 (count: 25 ) +21% $125 (count: 15 ) +14% $150 (count: 10 ) + 6% $200 (count: 4 ) + 1% More than $200 (count: 1 ) Question: If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? @@ -455,16 +455,16 @@ Question: Would you be interested in attending half-day (3-hour) tutorials next year? -False (count: 24 ) -True (count: 52 ) +32% False (count: 24 ) +52% True (count: 52 ) Question: How much would you be willing to pay for a half-day (3 hour) tutorial? -$50 (count: 21 ) -$100 (count: 20 ) -$150 (count: 5 ) -Nothing (count: 7 ) -$25 (count: 8 ) +11% Nothing (count: 7 ) +13% $25 (count: 8 ) +34% $50 (count: 21 ) +33% $100 (count: 20 ) + 8% $150 (count: 5 ) Question: If yes, please list 3 tutorial subjects you would like to attend: @@ -555,61 +555,124 @@ Question: Other comments: + ---- The wxPython tutorial was great! I want a sequel. -The Agile tutorial wasn't really a tutorial, but more like a regular talk but longer. They gave a brief overview of a lot of testing technologies rather than actually teaching any single one. Useful, but not really a tutorial. +The Agile tutorial wasn't really a tutorial, but more like a regular +talk but longer. They gave a brief overview of a lot of testing +technologies rather than actually teaching any single one. Useful, but +not really a tutorial. + ---- -I think the interview idea for the keynote was not a very good idea. It was a bit boring and not very effective. -Some talks didn't have any coordinators so presenters were a bit lost at start. +I think the interview idea for the keynote was not a very good +idea. It was a bit boring and not very effective. + +Some talks didn't have any coordinators so presenters were a bit lost +at start. + ---- -overall really good. i have been to oscon twice and the level of service has been about the same. they had wireless problem there one year also and still throughout the conference. +overall really good. i have been to oscon twice and the level of +service has been about the same. they had wireless problem there one +year also and still throughout the conference. + +i like marriot, the beds are really comfy, would love to have them get +a reduced/free internet from the room rate. -i like marriot, the beds are really comfy, would love to have them get a reduced/free internet from the room rate. +better way to guage interest in specific talks to guage room size +(oscon struggled with this also) -better way to guage interest in specific talks to guage room size (oscon struggled with this also) +there seems to be two different descriptions of each talk on the web +site.. one in a wiki and one in a db. the wiki one was much easier to +read. -there seems to be two different descriptions of each talk on the web site.. one in a wiki and one in a db. the wiki one was much easier to read. ---- -Less tippy, spilly food (pasta, soup). We need to figure the wireless situation out, it was obviously horrible. Otherwise, I really liked the hotel. I wasn't sure why the Plone thing was a keynote. I kind of liked the friday+weekend situation, because otherwise my work tends to intrude. +Less tippy, spilly food (pasta, soup). We need to figure the wireless +situation out, it was obviously horrible. Otherwise, I really liked +the hotel. I wasn't sure why the Plone thing was a keynote. I kind +of liked the friday+weekend situation, because otherwise my work tends +to intrude. + ---- -I would like to see more about approaching a collaborative approach to combining some of the best features of the various frameworks available. Too often, I feel, each project is so closely held to the ego of the original creators. I think that this is a great detriment to the advancement of the frameworks themselves as well as the usability of the language as a whole. Perhaps a talk about comperitive frameworks, a meeting of the creators of the various frameworks to discuss "lesson's learned" and sharing (what a new concept, especially for open source)... +I would like to see more about approaching a collaborative approach to +combining some of the best features of the various frameworks +available. Too often, I feel, each project is so closely held to the +ego of the original creators. I think that this is a great detriment +to the advancement of the frameworks themselves as well as the +usability of the language as a whole. Perhaps a talk about +comperitive frameworks, a meeting of the creators of the various +frameworks to discuss "lesson's learned" and sharing (what a new +concept, especially for open source)... + ---- -The tutorials all started at ground zero, and went from there. I don't need an intro on most topics, I want to learn advanced features of technologies I already work with. +The tutorials all started at ground zero, and went from there. I +don't need an intro on most topics, I want to learn advanced features +of technologies I already work with. + ---- -I wish the talks were fewer but longer, more tutorial in nature. Some were very rushed. +I wish the talks were fewer but longer, more tutorial in nature. Some +were very rushed. + ---- -I thought the tutorials were the most productive time I had at Pycon. I would like to see more and, perhaps, even have some during the main conference (with limited enrollment). There were many sessions where none of the talks appealed to me and I would have rather paid more to take more tutorials. +I thought the tutorials were the most productive time I had at Pycon. +I would like to see more and, perhaps, even have some during the main +conference (with limited enrollment). There were many sessions where +none of the talks appealed to me and I would have rather paid more to +take more tutorials. + ---- -It would have been nice to have an exhibit room for vendors, even a small one. I liked the lightning talks. I liked the tables set up in the main conf. Having wireless was great, not sure what could be done to help the bandwidth without spending a ton of money. For some reason the sound system kept getting worse in the main hall over the course of conference not better. The feedback got to be really annoying and loud at the end. All in all I thought it was a well organized conference and I plan to attend next year. The price was very reasonable. +It would have been nice to have an exhibit room for vendors, even a +small one. I liked the lightning talks. I liked the tables set up in +the main conf. Having wireless was great, not sure what could be done +to help the bandwidth without spending a ton of money. For some reason +the sound system kept getting worse in the main hall over the course +of conference not better. The feedback got to be really annoying and +loud at the end. All in all I thought it was a well organized +conference and I plan to attend next year. The price was very +reasonable. + ---- -The wireless networking coverage sucked. Unreliable, and frequently unavailable. +The wireless networking coverage sucked. Unreliable, and frequently +unavailable. + ---- -Network was almost "non-existant". I would refuse to pay them for the service received! +Network was almost "non-existant". I would refuse to pay them for the +service received! -Maybe having a sprinting area (in the staging room?) on tutorial day would be good. The -space is already reserved. +Maybe having a sprinting area (in the staging room?) on tutorial day +would be good. The space is already reserved. + +It is still important to have both wired and wireless... especially +when the capabilities of the network staff are as limited as those +used by the Marriott Hotel used for PyCon 2006. -It is still important to have both wired and wireless... especially when the capabilities of -the network staff are as limited as those used by the Marriott Hotel used for PyCon 2006. ---- -I attended the wxWidgets tutorial, and was slightly disappointed. Too much time spent on basics (how an app interacts with window manager, events, etc), and full specification of various widgets, and not enough time spent on the key elements of GUI design (e.g. no mention at all about MVC techniques). Even important things like sizers seemed very rushed. +I attended the wxWidgets tutorial, and was slightly disappointed. Too +much time spent on basics (how an app interacts with window manager, +events, etc), and full specification of various widgets, and not +enough time spent on the key elements of GUI design (e.g. no mention +at all about MVC techniques). Even important things like sizers seemed +very rushed. All the APs were on channel 1. -More infrastructure for people to coordinate out-of-conference activities (dinners, drinking, hanging out with people doing interesting things, etc). (I guess people *could have* created a wiki page, but it wasn't clear that doing so would have been acceptable/encouraged). +More infrastructure for people to coordinate out-of-conference +activities (dinners, drinking, hanging out with people doing +interesting things, etc). (I guess people *could have* created a wiki +page, but it wasn't clear that doing so would have been +acceptable/encouraged). Other topics for next year (why do you limit us to only 3?): "How to manage a 100,000+ line python application" @@ -620,92 +683,179 @@ ---- -My first PyCon. Really enjoyed it. Could be longer (1-2 days longer). Love the sprint concept. Network needs to work better. ----- +My first PyCon. Really enjoyed it. Could be longer (1-2 days +longer). Love the sprint concept. Network needs to work better. -The rooms need more power strips! That would have helped my experience immensely. In the main conference hall, there were power strips only for about a third of the seats. That was unacceptable. ---- -The tutorials were okay this year, however they could be much better. The topics seemed a little broad for three hours. +The rooms need more power strips! That would have helped my experience +immensely. In the main conference hall, there were power strips only +for about a third of the seats. That was unacceptable. + ---- -I'm interested in _giving_ tutorials (again) next year. These answers are based on if you decide not to ask me to return. (kww) +The tutorials were okay this year, however they could be much +better. The topics seemed a little broad for three hours. -Another thought, and I'm not sure if this is a subject for a talk or a tutorial, would be some 'live code' that uses some of the more esoteric features of Python. (Metaclass functions, decorators, etc) Rather than the contrived examples, I'd like to see situations where these features solve a problem that can't easily be solved by other means. ---- -Many of the speakers seemed unprepared -- in some cases I really felt like they were not being respectful of my time by just how poorly prepared they were. It was clear that many talks hadn't been practiced (or cursorily if they were) -- I've been to many conferences (and PyCon last year) and it felt like there was a substantial difference this year as compared to years past. I'm not sure what could be done to remedy this, but something needs to be done. +I'm interested in _giving_ tutorials (again) next year. These answers +are based on if you decide not to ask me to return. -The new tables/seating style was both good and bad -- I feel as though it made it less lively because people were less inclined to pay attention to the speakers because it was so much easier to have your laptop out. +Another thought, and I'm not sure if this is a subject for a talk or a +tutorial, would be some 'live code' that uses some of the more +esoteric features of Python. (Metaclass functions, decorators, etc) +Rather than the contrived examples, I'd like to see situations where +these features solve a problem that can't easily be solved by other +means. -The hotel was far too isolated -- to get around one really needs a car because the area is pedestrian unfriendly and the sidewalks that are there are frequently topped by scores of birds on the powerlines making it, um, an adventure in looking up and dodging while walking. Amusing until they don't miss (trust me ;) So, either more frequent shuttles (and better info on the surrounding area) are needed or a less suburban location would be preferable. +---- + +Many of the speakers seemed unprepared -- in some cases I really felt +like they were not being respectful of my time by just how poorly +prepared they were. It was clear that many talks hadn't been +practiced (or cursorily if they were) -- I've been to many conferences +(and PyCon last year) and it felt like there was a substantial +difference this year as compared to years past. I'm not sure what +could be done to remedy this, but something needs to be done. -For all of the bad stuff above, I really did enjoy the conference and this year's venue felt much more fitting to the size of the PyCon crowd than the D.C. location did. Thanks to all the volunteers who put in all of the hard work!! +The new tables/seating style was both good and bad -- I feel as though +it made it less lively because people were less inclined to pay +attention to the speakers because it was so much easier to have your +laptop out. +The hotel was far too isolated -- to get around one really needs a car +because the area is pedestrian unfriendly and the sidewalks that are +there are frequently topped by scores of birds on the powerlines +making it, um, an adventure in looking up and dodging while walking. +Amusing until they don't miss (trust me ;) So, either more frequent +shuttles (and better info on the surrounding area) are needed or a +less suburban location would be preferable. +For all of the bad stuff above, I really did enjoy the conference and +this year's venue felt much more fitting to the size of the PyCon +crowd than the D.C. location did. Thanks to all the volunteers who +put in all of the hard work!! ---- --Wireless was *terrible*. I'm sure you're aware of it already. This really needs to be fixed or next year may be my last PyCon. I usually need to have access to my work while on travel and this is a must. +-Wireless was *terrible*. I'm sure you're aware of it already. This +really needs to be fixed or next year may be my last PyCon. I usually +need to have access to my work while on travel and this is a must. --Lunch was great, snacks--less so. Why was there no coffee *before* the keynotes, which were 1 1/2 hours? I would be willing to spend an extra $10 on registration to have coffee and breakfast foods available before and after the keynote, but even just having them before would be nice. +-Lunch was great, snacks--less so. Why was there no coffee *before* +the keynotes, which were 1 1/2 hours? I would be willing to spend an +extra $10 on registration to have coffee and breakfast foods available +before and after the keynote, but even just having them before would +be nice. --It would be nice to know in advance what talks will be available after the Con in audio/video. Several talks I wanted to see overlapped, and it would be nice to know if one of them would be available at a later date. Perhaps also leaving a couple slots open for encore presentations if the presenters are interested (this happened with Ian Bicking's eggs talk) ----- +-It would be nice to know in advance what talks will be available +after the Con in audio/video. Several talks I wanted to see +overlapped, and it would be nice to know if one of them would be +available at a later date. Perhaps also leaving a couple slots open +for encore presentations if the presenters are interested (this +happened with Ian Bicking's eggs talk) -This was my first PyCon and I thoroughly enjoyed it. It couldn't have been much better (short of actually meeting Alex Martelli-but meeting Anna Maretelli Ravenscroft more than made up for that ;-)) +---- +This was my first PyCon and I thoroughly enjoyed it. It couldn't have +been much better (short of actually meeting Alex Martelli-but meeting +Anna Martelli Ravenscroft more than made up for that ;-)) ---- -The keynote talk on Plone was bad. It was like the speakers hadn't prepared anything at all. +The keynote talk on Plone was bad. It was like the speakers hadn't +prepared anything at all. -The talk by AG Interactive, Python in the Enterprise was embarassingly bad. Essentially, they said "Python is great. We used python, but we can't tell you anything else because it's proprietary." +The talk by AG Interactive, Python in the Enterprise was embarassingly +bad. Essentially, they said "Python is great. We used python, but we +can't tell you anything else because it's proprietary." -Python for Series 60 was also too much advocacy and too little technical detail. +Python for Series 60 was also too much advocacy and too little +technical detail. ---- -The keynotes should not be tied to a particular product, IMO. Aside from that problem, the Plone Keynote was terrible. The presenters may have built a fine product, but they have no ability to talk about it intelligently. The interview with Bram Cohen keynote wasn't much better. Guido's keynote was great. +The keynotes should not be tied to a particular product, IMO. Aside +from that problem, the Plone Keynote was terrible. The presenters may +have built a fine product, but they have no ability to talk about it +intelligently. The interview with Bram Cohen keynote wasn't much +better. Guido's keynote was great. + +Some of the sessions were rather lame. If only there was a test for +presentation ability that presenters would have to pass to get a +slot. The PyGTK presentation for example, was just awful. It belonged +in a Open Space Talk, not a a talk with official billing. Perhaps all +presenters should show up a day early and spend a few hours with Kevin +Dangoor about how to present! -Some of the sessions were rather lame. If only there was a test for presentation ability that presenters would have to pass to get a slot. The PyGTK presentation for example, was just awful. It belonged in a Open Space Talk, not a a talk with official billing. Perhaps all presenters should show up a day early and spend a few hours with Kevin Dangoor about how to present! ---- -Tutorial proceedings were a great buy for $25, keep doing this (if tutorial presenters will permit) +Tutorial proceedings were a great buy for $25, keep doing this (if +tutorial presenters will permit) + ---- -Were the tutorials intended for beginners? IF so then that should be clear. Maybe the tutorial should have a "difficulty" rating. We are a rather experienced group of pythonistas so we didn't get lots out of "Text and Data Processing", for example, but I got tons out of "Agile development and testing" +Were the tutorials intended for beginners? IF so then that should be +clear. Maybe the tutorial should have a "difficulty" rating. We are +a rather experienced group of pythonistas so we didn't get lots out of +"Text and Data Processing", for example, but I got tons out of "Agile +development and testing" + +I think talks and tutorials where they showed real world stuff was the +most helpful. When the talks are generic they are light on content. +People start naming functions foo and bar, and it is hard to really +get into it. But when people show real examples it is much better. -I think talks and tutorials where they showed real world stuff was the most helpful. When the talks are generic they are light on content. People start naming functions foo and bar, and it is hard to really get into it. But when people show real examples it is much better. ---- I'd attend a tutorial only if I were *really* interested in the topic. + ---- -It's hard to suggest topics for next year this far in advance since it's hard to know what gaps I'd like to fill a year from now. +It's hard to suggest topics for next year this far in advance since +it's hard to know what gaps I'd like to fill a year from now. + ---- Overall, I had a good time. Had to leave the sprints early... wah. Thought the hotel was so-so. I thought the "quiet" rooms should have been enforced. + ---- -I must say that the social/personal networking aspect of this conferencce was unparalleled. Just fantastic. It was a HUGE success having such great hotel rates that most everyone stayed under the same roof. +I must say that the social/personal networking aspect of this +conferencce was unparalleled. Just fantastic. It was a HUGE success +having such great hotel rates that most everyone stayed under the same +roof. + +As many have noted, the wireless network left a tremendous amount to +be desired. I was actually one of the lucky ones, and didn't have any +issues until the sprint days, the last few days of which the wireless +was just abysmally poor. -As many have noted, the wireless network left a tremendous amount to be desired. I was actually one of the lucky ones, and didn't have any issues until the sprint days, the last few days of which the wireless was just abysmally poor. ---- If tutorial costs are reasonable our management will pay for them. + ---- -The wireless access on the conference floor was pretty poor. I ended up (in order to keep needed communications open) paying the hotel the extra $10/night for a wired connection in my room. I would rather have kept my laptop with me. +The wireless access on the conference floor was pretty poor. I ended +up (in order to keep needed communications open) paying the hotel the +extra $10/night for a wired connection in my room. I would rather +have kept my laptop with me. Nice work, AMK and everybody else. It's still my favorite technical conference. + ---- -I attended the tutorials this year and found them helpful, but the time went by quickly and there were more that I wanted to attend than I had time for. Next year perhaps having longer sessions (4 hours perhaps) and maybe a second day of sessions would be great. +I attended the tutorials this year and found them helpful, but the +time went by quickly and there were more that I wanted to attend than +I had time for. Next year perhaps having longer sessions (4 hours +perhaps) and maybe a second day of sessions would be great. + ---- Badges should show nickname, company, and city/country. @@ -726,65 +876,79 @@ Question: Please rate your overall satisfaction with PyCon 2006. -high (count: 48 ) -very high (count: 27 ) -low (count: 5 ) +34% very high (count: 27 ) +60% high (count: 48 ) + 6% low (count: 5 ) Question: Please rate your overall satisfaction with the keynotes. -high (count: 43 ) -very high (count: 20 ) -low (count: 16 ) +25% very high (count: 20 ) +54% high (count: 43 ) +20% low (count: 16 ) Question: Please rate your overall satisfaction with the talks. -high (count: 55 ) -very high (count: 11 ) -low (count: 13 ) +14% very high (count: 11 ) +70% high (count: 55 ) +16% low (count: 13 ) Question: Please rate your overall satisfaction with the network. -high (count: 11 ) -very high (count: 2 ) -very low (count: 31 ) -low (count: 27 ) + 3% very high (count: 2 ) +15% high (count: 11 ) +38% low (count: 27 ) +44% very low (count: 31 ) Question: Please rate your overall satisfaction with the food. -high (count: 48 ) -very high (count: 19 ) -very low (count: 1 ) -low (count: 9 ) +19% very high (count: 19 ) +62% high (count: 48 ) + 9% low (count: 9 ) + 1% very low (count: 1 ) Question: Please rate your likelihood of attending next year. -high (count: 30 ) -very high (count: 35 ) -very low (count: 1 ) -low (count: 12 ) +45% very high (count: 35 ) +38% high (count: 30 ) +15% low (count: 12 ) + 1% very low (count: 1 ) Question: Would you prefer a conference that took place: + just as it was (count: 1 ) better to end on a weekend, this years way worked (count: 1 ) -Includes one weekend day (starts on Sunday or ends on Saturday) (count: 15 ) This was a good schedule (count: 1 ) not important (count: 1 ) -Only on weekdays (count: 16 ) -Includes two weekend days (count: 38 ) + +22% Includes one weekend day (starts on Sunday or ends on Saturday) (count: 15 ) +23% Only on weekdays (count: 16 ) +55% Includes two weekend days (count: 38 ) Question: How can we improve PyCon next year? ---- -The current location felt fairly isolated from the outside world -- I would prefer a more urban location, however the hotel environment worked much better than the previous DC location as far as feeling spacious, connected. The crowd flow felt smoother than in years past. - -The food was good this year, but given the relative isolation of the hotel from cheap breakfast options, a small breakfast offering every day would be worth another $20 in registration fee to me but at the least, coffee being available before the morning sessions start would be huge. +The current location felt fairly isolated from the outside world -- I +would prefer a more urban location, however the hotel environment +worked much better than the previous DC location as far as feeling +spacious, connected. The crowd flow felt smoother than in years past. + +The food was good this year, but given the relative isolation of the +hotel from cheap breakfast options, a small breakfast offering every +day would be worth another $20 in registration fee to me but at the +least, coffee being available before the morning sessions start would +be huge. + +Overall this has been a good experience and I want to thank all of the +volunteers that put it all together! -Overall this has been a good experience and I want to thank all of the volunteers that put it all together! ---- -I heard several presenters declined. Make them a bit more special, by destinguishing them on the nametag (use ''speaker' like at EuroPython, it gets you the inquiries from what do you speak on from the girls, that missed you presentation) +I heard several presenters declined. Make them a bit more special, by +destinguishing them on the nametag (use ''speaker' like at EuroPython, +it gets you the inquiries from what do you speak on from the girls, +that missed you presentation) ---- @@ -794,8 +958,8 @@ I would like to know more about advanced features of the language: metaclasses, descriptors, decorators. I checked every Python book on -display at Nerdbooks last night, and found only one chapter in the Python -cookbook. And because that's a cookbook, it was pretty poor on +display at Nerdbooks last night, and found only one chapter in the +Python cookbook. And because that's a cookbook, it was pretty poor on concepts. There is a need for an advanced Python book, and it would be wonderful @@ -805,56 +969,89 @@ I have to say that this conference was somewhat disappointing -- I came away knowing way too much about this year's fads (aka web frameworks), without increasing my understanding of the language -itself. +itself. + ---- -Better wireless which allows peer networking. Or else have ethernet switches everywhere. +Better wireless which allows peer networking. Or else have ethernet +switches everywhere. + Get Alex Martelli, Bruce Eckel + Serve breakfast. + More volunteers for room setup night before. -Capture VGA signal going to projectors so we can have video + audio recordings. + +Capture VGA signal going to projectors so we can have video + audio +recordings. ---- -Turn off the air condition...all rooms where fucking cold...colder than outside. +Turn off the air condition...all rooms were fucking cold...colder +than outside. + ---- coffee and tea available before keynotes! + ---- better wireless better way to know about schedule changes (maybe e-mail alerts) -have talk feedback forms available at start of conference so they can be filled out right after each talk. +have talk feedback forms available at start of conference so they can +be filled out right after each talk. ---- -Better keynotes -- I wasn't impressed with the Plone one or the Cohen one. (Although the interview format was an interesting experiment, I don't think it worked.) +Better keynotes -- I wasn't impressed with the Plone one or the Cohen +one. (Although the interview format was an interesting experiment, I +don't think it worked.) I did like the "bonus lunch keynote" on Friday. Food was excellent overall. No complaints there. + ---- I believe it's been covered above. + ---- -Review the talks more, perhaps work with the presenters in advance to ensure a smooth process and optimal experience. +Review the talks more, perhaps work with the presenters in advance to +ensure a smooth process and optimal experience. + ---- -More repeats of the good talks. Repeat highly rated talks on subsequent days during openspace +More repeats of the good talks. Repeat highly rated talks on +subsequent days during openspace + ---- -The "snack" breaks wiped the food out... and if the session you attended went long, you just went hungry. -Publicize wired networking... some of us are still in the dark ages. ;) -The schedule of talks had too much churn, especially on Sunday; I understand that people back out, but it made it hard to plan where you were going. -The nerdbooks.com party was a great way to meet people; more of that would be good. -The lightning talks were good... a couple of flops, a few homeruns, but overall pretty good. -Needed better moderation of speakers going until the start of the next timeslot, particularly in the open space talks. -Encourage "main" speakers to also hold an open space Q&A/BoF sometime later on during the conference. +The "snack" breaks wiped the food out... and if the session you +attended went long, you just went hungry. + +Publicize wired networking... some of us are still in the dark +ages. ;) + +The schedule of talks had too much churn, especially on Sunday; I +understand that people back out, but it made it hard to plan where you +were going. + +The nerdbooks.com party was a great way to meet people; more of that +would be good. + +The lightning talks were good... a couple of flops, a few homeruns, +but overall pretty good. + +Needed better moderation of speakers going until the start of the next +timeslot, particularly in the open space talks. + +Encourage "main" speakers to also hold an open space Q&A/BoF sometime +later on during the conference. ---- @@ -862,71 +1059,123 @@ I didn't use the network, so no comments. -I thought the food was very good. The catering staff was really the best I've ever seen. Very helpful, and didn't mind interacting with attendees. That's unusual. +I thought the food was very good. The catering staff was really the +best I've ever seen. Very helpful, and didn't mind interacting with +attendees. That's unusual. ---- * The wireless BITES! Extremely annoying. -* A better mechanism for impromtu announcements, similar to the bulletin board sheets of years past, with scribblings of all sorts: GPG key signings, BOF's, "Joe meet me at 8:00", etc. +* A better mechanism for impromtu announcements, similar to the +* bulletin board sheets of years past, with scribblings of all sorts: +* GPG key signings, BOF's, "Joe meet me at 8:00", etc. * Food was pretty good. -* Comraderie is, as always, excellent. I'm participating in my first sprint, though I'm leaving Tuesday. I feel completely out of my element, but folks are very tolerant of my slow nature. +* Comraderie is, as always, excellent. I'm participating in my first +* sprint, though I'm leaving Tuesday. I feel completely out of my +* element, but folks are very tolerant of my slow nature. -* Nothing you can do about this, but I was surprised by Andrew's comments that most found the beds comfy. I wanted to add another data point: I found lying in the bed to be akin to drowning, and keep wishing for a much firmer mattress. I usually find hotel beds to be pretty firm and have been sleeping horribly here. (That, and the thermostat has been set to 80 F for four days and the room is still cold. The thermostat is making something blow, but it ain't heat. It's not AC either. Seems to be just air.) +* Nothing you can do about this, but I was surprised by Andrew's +* comments that most found the beds comfy. I wanted to add another +* data point: I found lying in the bed to be akin to drowning, and +* keep wishing for a much firmer mattress. I usually find hotel beds +* to be pretty firm and have been sleeping horribly here. (That, and +* the thermostat has been set to 80 F for four days and the room is +* still cold. The thermostat is making something blow, but it ain't +* heat. It's not AC either. Seems to be just air.) ---- -We need to get more volunters involved. There were a handful of people working the registration desk and hosting sessions. +We need to get more volunters involved. There were a handful of +people working the registration desk and hosting sessions. -Serving food in the hallway made tigs quite crowded. Is there a way to solve that? +Serving food in the hallway made tigs quite crowded. Is there a way +to solve that? -It would be nice to have more tee shirts available. Perhaps we could allow people to order extra when they register? Also, we need to have a way to match up the size they ordered at registration so that we do not run out of specific sizes. This could be as easy as having a list of the registrants avail able to check off as they register. +It would be nice to have more tee shirts available. Perhaps we could +allow people to order extra when they register? Also, we need to have +a way to match up the size they ordered at registration so that we do +not run out of specific sizes. This could be as easy as having a list +of the registrants avail able to check off as they register. -Perhaps more organized evening activities? Professional sports or a shuttle running to the Galaria. +Perhaps more organized evening activities? Professional sports or a +shuttle running to the Galaria. Pycon is a great time and I would like to help more for Pycon 2007. Please make your needs known earlier. I was on the volunteer mailing list but felt that there must have been another form of communication because often we would just see what had been done; not very often was a task thown out for someone to pick up. + ---- More tutorials, better wireless, some new social networking gimic ----- -My only real complaint is about the cleanliness of the ballroom. I think the lack of convienient -trash cans (particularly at the beginning of the conference) contributed to the problem. And with -as many soda can's that are emptied during the conference, the trash recepticals should be -paired with clearly marked recycle containers too. I'm not normally a neat freak, but it kind of -bothered me this week. ---- -Please provide coffee during registration not just at first break. the hallways were a bit crowded during the lunch breaks. I'm not sure how that could be made better though. It worked though. The lunch choices were excellent. some of the afternoon snacks were kind of odd like the trail mix. ----- +My only real complaint is about the cleanliness of the ballroom. I +think the lack of convienient trash cans (particularly at the +beginning of the conference) contributed to the problem. And with as +many soda can's that are emptied during the conference, the trash +recepticals should be paired with clearly marked recycle containers +too. I'm not normally a neat freak, but it kind of bothered me this +week. -More of everything! Free student places? Competitions, prizes. How about an "installfest"? ---- -Better network access - when the network was up, it was fast enough but wireless APs got knocked out by the door motors in the ballroom, and signal strenghts fluctuated a lot. +Please provide coffee during registration not just at first break. the +hallways were a bit crowded during the lunch breaks. I'm not sure how +that could be made better though. It worked though. The lunch choices +were excellent. some of the afternoon snacks were kind of odd like the +trail mix. +---- + +More of everything! Free student places? Competitions, prizes. How +about an "installfest"? ---- -Not as many "intro" talks. Maybe intro + usage/example code would be better? I already knew a lot about the topics before so I'd rather get into the heart of things. +Better network access - when the network was up, it was fast enough +but wireless APs got knocked out by the door motors in the ballroom, +and signal strenghts fluctuated a lot. -Would be nice to have coffee available before the keynotes! ---- -I expanded my thoughts in general in my blog, http://pyjesse.blogspot.com/2006/02/pycon-my-critique.html - and I come off as overly critical, but I would like to take some time and take a more proactive role in improving the conference as much as I can. +Not as many "intro" talks. Maybe intro + usage/example code would be +better? I already knew a lot about the topics before so I'd rather get +into the heart of things. -I believe that as a language conference, we can not concentrate on the "hype du-jour" of the day - while that does help recent adoption, I think we need to cover our "core" bases as well. I think we need to go back to systems/program design, and showcasing the core feature of the language. +Would be nice to have coffee available before the keynotes! + +---- -We can not simply show those successful applications written with the language - we have to show people how to make those successful applications and tools. +I expanded my thoughts in general in my blog, +http://pyjesse.blogspot.com/2006/02/pycon-my-critique.html - and I +come off as overly critical, but I would like to take some time and +take a more proactive role in improving the conference as much as I +can. + +I believe that as a language conference, we can not concentrate on the +"hype du-jour" of the day - while that does help recent adoption, I +think we need to cover our "core" bases as well. I think we need to go +back to systems/program design, and showcasing the core feature of the +language. + +We can not simply show those successful applications written with the +language - we have to show people how to make those successful +applications and tools. + +For instance, TurboGears is really cool - and a lot of the web +frameworks get a lot of soundbites, but how do I, as someone knowing +the core language build something like that? -For instance, TurboGears is really cool - and a lot of the web frameworks get a lot of soundbites, but how do I, as someone knowing the core language build something like that? ---- - * Have breakfast before the keynotes so people can be encouraged to mingle in the mornings too. + * Have breakfast before the keynotes so people can be encouraged to + * mingle in the mornings too. + * Make sure the mics are working for people to ask questions + * seamless wifi access Otherwise I had a great time and will be back next year for sure!!! Good job to all involved. @@ -934,28 +1183,41 @@ Since it will be at the same venue... -MAKE SURE THAT THE HOTEL UNDERSTANDS THAT THEIR NETWORK SERVICES WERE A DISASTER!! +MAKE SURE THAT THE HOTEL UNDERSTANDS THAT THEIR NETWORK SERVICES WERE +A DISASTER!! They should be completely embarrassed. If we paid for all of the food/drinks that were set out... then IMO they were far to quick to take things away. Some of us were busy and didn't get to the lines until stuff was being taken away. -For next year, at the end if the serving time, consolidate items to the one side (between the -registration desk and the kitchen and leave it up until it is clear that all are done). +For next year, at the end if the serving time, consolidate items to +the one side (between the registration desk and the kitchen and leave +it up until it is clear that all are done). + ---- More Talks on WxPython + ---- -I had 4 coworkers who expressed a desire to go to the conference (and had management approval) but ended up not going due to spanning over the weekend (family events interfered). I'm sure for everyone of those types of situations, you'd be hurting someone who didn't have management approval and wouldn't be able to attend if it meant taking off of work though. +I had 4 coworkers who expressed a desire to go to the conference (and +had management approval) but ended up not going due to spanning over +the weekend (family events interfered). I'm sure for everyone of those +types of situations, you'd be hurting someone who didn't have +management approval and wouldn't be able to attend if it meant taking +off of work though. + ---- -Work out network issues. Maybe stretch out conference to allow longer talks + more time between talks. +Work out network issues. Maybe stretch out conference to allow longer +talks + more time between talks. + ---- Publish speaker slides and notes before conference if possible. Shuttle to and from airport. + ---- email receipt need to list the tutorials you signed up for. @@ -965,72 +1227,129 @@ I think the time for individual talks were way too short. Every one of them ended up having to be cut short. Consider adding 5 minutes to each talk. BTW, the tutorials were great! David Goodger was great! + ---- -Less talks but longer higher quality sessions. 30 minute sessions are too short. Be more critical on who you take for talks. You should have a good idea of who the good speakers are. Dump talks that are very abstract like "Vertical Fractal Analysis". +Less talks but longer higher quality sessions. 30 minute sessions are +too short. Be more critical on who you take for talks. You should have +a good idea of who the good speakers are. Dump talks that are very +abstract like "Vertical Fractal Analysis". + +Perhaps you can have two levels of talks. Better speakers with more +popular topics can get 45 to 60 minutes. Lump others into open space +talks of 15 - 30 minutes. -Perhaps you can have two levels of talks. Better speakers with more popular topics can get 45 to 60 minutes. Lump others into open space talks of 15 - 30 minutes. ---- -A comment on that last question - I was one of those who originally objected to the weekend format. I've now changed my mind. In a couple different ways, the weekend structure worked out a lot better for me personally. +A comment on that last question - I was one of those who originally +objected to the weekend format. I've now changed my mind. In a couple +different ways, the weekend structure worked out a lot better for me +personally. + ---- -Coffee and/or breakfast in the early AM would be hugely helpful. I'd gladly pay more for this addition if cost is an issue. +Coffee and/or breakfast in the early AM would be hugely helpful. I'd +gladly pay more for this addition if cost is an issue. + ---- -Tell people to prepare more engaging presentations and tell them to rehearse to co-workers several times in advance. +Tell people to prepare more engaging presentations and tell them to +rehearse to co-workers several times in advance. + ---- See "Other comments" above. In summary: -fix the wireless ASAP -coffee first thing -have a schedule of talks whose audio/video will be available post-Con + ---- -I felt that the keynotes were weak, especially the interview. I felt that the entire conference was a little thin on technical details, and that it would be much better to have half as many talks that were twice as long, or at least one track of talks that were focused on providing more detail. +I felt that the keynotes were weak, especially the interview. I felt +that the entire conference was a little thin on technical details, and +that it would be much better to have half as many talks that were +twice as long, or at least one track of talks that were focused on +providing more detail. + +A lot of times, I went to a presentation to only come out of it with +an idea of what something does, not how to do it. I can get this +information from the project's website. In my mind, some more +detailed technical howto sessions and best-practices sessions would be +great. -A lot of times, I went to a presentation to only come out of it with an idea of what something does, not how to do it. I can get this information from the project's website. In my mind, some more detailed technical howto sessions and best-practices sessions would be great. +I would also like to see this extended into having a "track" of talks +in multiple parts, to replace the concept of tutorials. So, maybe +three sessions on TurboGears, in ascending order of detail (general +overview, intermediate level implementation, advanced stuff). -I would also like to see this extended into having a "track" of talks in multiple parts, to replace the concept of tutorials. So, maybe three sessions on TurboGears, in ascending order of detail (general overview, intermediate level implementation, advanced stuff). +Far and away the biggest advantage of being at PyCon was meeting +people, and sharing ideas. There should be more facilitating of this. -Far and away the biggest advantage of being at PyCon was meeting people, and sharing ideas. There should be more facilitating of this. ---- -More code and demos, fewer slide/informational talks. I also found that I began to look for good speakers, and the topic almost doesn't matter. It's harder to deal with that when deciding which talks to allow of course. +More code and demos, fewer slide/informational talks. I also found +that I began to look for good speakers, and the topic almost doesn't +matter. It's harder to deal with that when deciding which talks to +allow of course. -More smaller spaces for folks to sprint during the conference might be nice too. This was my first pycon, and the number of people I met really surprised me. The Python community is very friendly, and the more we can do to promote the social aspect (as geeks and people) I think the better the conference would be. +More smaller spaces for folks to sprint during the conference might be +nice too. This was my first pycon, and the number of people I met +really surprised me. The Python community is very friendly, and the +more we can do to promote the social aspect (as geeks and people) I +think the better the conference would be. -I'd hate to see a sign-up for a talk form, but something like the party interest form for talks so we don't have what happened with the Python Eggs talk (which really turned out not to be about eggs). +I'd hate to see a sign-up for a talk form, but something like the +party interest form for talks so we don't have what happened with the +Python Eggs talk (which really turned out not to be about eggs). -You already know about the wireless, but if you could have someway of folding in-room internet into the special room rate for pycon it might be at least a good option for next year. ----- +You already know about the wireless, but if you could have someway of +folding in-room internet into the special room rate for pycon it might +be at least a good option for next year. -These are more just general comments rather than specific improvement suggestions. +---- -Wireless coverage was horrible. We could have probably done a better job ourselves by buying 10 WAPs and sprinkling them liberally around. +These are more just general comments rather than specific improvement +suggestions. -I only attended Guido's keynote, the other topics didn't really interest me. +Wireless coverage was horrible. We could have probably done a better +job ourselves by buying 10 WAPs and sprinkling them liberally around. -If a speaker is going to code, make sure the text is readable on screen or provide handouts or have a follow along website. (not specific to pycon but to a speaker) +I only attended Guido's keynote, the other topics didn't really +interest me. +If a speaker is going to code, make sure the text is readable on +screen or provide handouts or have a follow along website. (not +specific to pycon but to a speaker) ---- -Promote it more heavily and starting earlier. The more attendees there are, the more valuable the conference is, since we learn so much from each other. +Promote it more heavily and starting earlier. The more attendees there +are, the more valuable the conference is, since we learn so much from +each other. + ---- 1. Have more social activities - may be a visit to a Dave and Busters or similar, if logistically possible. 2. This time, the trail mix supplied on the first day of the conference (snack time) was stale. + ---- -I was disappointed at the quality of the talks. I think the bar for doing a talk should be raised, even if that means there are less talks. +I was disappointed at the quality of the talks. I think the bar for +doing a talk should be raised, even if that means there are less +talks. -In addition, perhaps people should be encouraged to organize workshops or other interactive activities. +In addition, perhaps people should be encouraged to organize workshops +or other interactive activities. ---- -The keynote speakers should not be 'selling' a product, telling us it's a great way to get a consulting gig. That's not about Python. The keynotes should be about Python. I would like to see some kind of filter for the talks. Several of the talks were of such low quality that I felt dumber for having attended! +The keynote speakers should not be 'selling' a product, telling us +it's a great way to get a consulting gig. That's not about Python. The +keynotes should be about Python. I would like to see some kind of +filter for the talks. Several of the talks were of such low quality +that I felt dumber for having attended! + ---- Everything was pretty much ok. @@ -1038,6 +1357,7 @@ Presenter access to internet during presentations really helped in live demos. Encourage presenters to do at least a little live demo at the Python prompt. + ---- - add country/state to name tags @@ -1047,77 +1367,158 @@ ---- -Include more general talks. The talks this year seemed to be intensely focused on particular niches of Python, but there wasn't much for general Python coding practices. ----- +Include more general talks. The talks this year seemed to be intensely +focused on particular niches of Python, but there wasn't much for +general Python coding practices. -Somehow getting Internet access in the rooms enabled as part of the group-rate would be excellent. +---- -It would be nice if there was a feature on the website to allow people to publish some info about themselves, a picture, maybe a paragraph listing some interests, and most importantly a URL to an RSS feed (hopefully Python-related). Then have the website do some feed-aggregation, to have a sort of Planet-Pycon, so that in the months leading up to the conference (and even afterwards) you could get to know the people you'll be crossing paths with. +Somehow getting Internet access in the rooms enabled as part of the +group-rate would be excellent. + +It would be nice if there was a feature on the website to allow people +to publish some info about themselves, a picture, maybe a paragraph +listing some interests, and most importantly a URL to an RSS feed +(hopefully Python-related). Then have the website do some +feed-aggregation, to have a sort of Planet-Pycon, so that in the +months leading up to the conference (and even afterwards) you could +get to know the people you'll be crossing paths with. Thanks for the conference + ---- -BOTTLED WATER!!! The water was undrinkable, so I drank pop. -More healthy snacks (pronounced lower-carb ;-). -I gained 10 pounds in a week! :-(( +BOTTLED WATER!!! The water was undrinkable, so I drank pop. More +healthy snacks (pronounced lower-carb ;-). I gained 10 pounds in a +week! :-(( + +Maybe something like a Linux install fest. Where people can try to +get things running on their laptops. Things like setting up buildbot +or selenium or implementing a simple CherryPy/Django server. The +tutorials and talks were mostly lecture, it might be useful to have +labs. I realize that labs can take a lot of time and effort but it +might be useful. Maybe Saturday evening could be labs. -Maybe something like a Linux install fest. Where people can try to get things running on their laptops. Things like setting up buildbot or selenium or implementing a simple CherryPy/Django server. The tutorials and talks were mostly lecture, it might be useful to have labs. I realize that labs can take a lot of time and effort but it might be useful. Maybe Saturday evening could be labs. ---- -i think one good idea would be to add IRC nicks to the conf badge. there are a lot of people i talk to on IRC and don't neccesarily know their real name. an option to add this upon registration would be a neat idea. +i think one good idea would be to add IRC nicks to the conf badge. +there are a lot of people i talk to on IRC and don't neccesarily know +their real name. an option to add this upon registration would be a +neat idea. better network. i'm sure you are going to get a lot of that ;) -session management was a little flaky. i was in a couple talks that ran over and i missed the start of the next talk. i noticed steve holden did a nice job of this. he was very adamant that the talks ended when they were supposed to. ----- - -Have three Lightning Talk sessions, one per day. We had two sessions with 20 speakers, but there were easily 30 speakers available, if not more. Every PyCon has had more speakers than time, and the audience does not get bored. Let's find the saturation point. Only the first needs to be plenary; the second fit into a regular (largish) session room. +session management was a little flaky. i was in a couple talks that +ran over and i missed the start of the next talk. i noticed steve +holden did a nice job of this. he was very adamant that the talks +ended when they were supposed to. -Bring back the bulletin board for Open Space. The computer-based scheduling allowed only one topic per timeslot and described them all as "talks". Open Space became an overflow for session talks. That's important but it misses something that made the DC Open Spaces such a success: several simultaneous roundtable discussions.I wanted to do a Cheetah roundtable but all the timeslots were filled with "talks". I could have pushed but it didn't seem worth the bother. - -The Marriott's additional space and layout was definitely an improvement over last year, and the hotel rooms were quite a bargain. The only thing I missed space-wise was a full-size ballroom with round tables for the Open Space. +---- -We should make sure the schedule is clearer when unexpected things happen. The first day, the lunch talk started late and ended late. People were confused all afternoon whether all the sessions were moved back or the after-lunch session squashed. Some people thought one, some the other. So you'd go to a talk and the previous one was still going on, and small talks (Open Space) didn't know when to begin. When something like this happens, we need to adjust the times on all the posted schedule sheets and make an announcement. +Have three Lightning Talk sessions, one per day. We had two sessions +with 20 speakers, but there were easily 30 speakers available, if not +more. Every PyCon has had more speakers than time, and the audience +does not get bored. Let's find the saturation point. Only the first +needs to be plenary; the second fit into a regular (largish) session +room. + +Bring back the bulletin board for Open Space. The computer-based +scheduling allowed only one topic per timeslot and described them all +as "talks". Open Space became an overflow for session talks. That's +important but it misses something that made the DC Open Spaces such a +success: several simultaneous roundtable discussions.I wanted to do a +Cheetah roundtable but all the timeslots were filled with "talks". I +could have pushed but it didn't seem worth the bother. + +The Marriott's additional space and layout was definitely an +improvement over last year, and the hotel rooms were quite a bargain. +The only thing I missed space-wise was a full-size ballroom with round +tables for the Open Space. + +We should make sure the schedule is clearer when unexpected things +happen. The first day, the lunch talk started late and ended late. +People were confused all afternoon whether all the sessions were moved +back or the after-lunch session squashed. Some people thought one, +some the other. So you'd go to a talk and the previous one was still +going on, and small talks (Open Space) didn't know when to begin. +When something like this happens, we need to adjust the times on all +the posted schedule sheets and make an announcement. + +The evening party at Nerdbooks was great. I was impressed with the +amount and variety of food they contributed, and it gave people a +chance to browse/buy technical references. Better than just selling a +few titles at the conference. -The evening party at Nerdbooks was great. I was impressed with the amount and variety of food they contributed, and it gave people a chance to browse/buy technical references. Better than just selling a few titles at the conference. +I felt a bit isolated from Dallas. Maybe we can have an excursion +downtown the day before or after, or something. -I felt a bit isolated from Dallas. Maybe we can have an excursion downtown the day before or after, or something. ---- [This is one feedback submitted as two entries, because the software submitted it while I was in the middle of typing.] + ---- Improve the quality of the talks.. breadth and depth. ----- -The technical aspects of the talks seemed to be different this year, perhaps with a target audience of beginner to intermediate skill level. +---- -It would be really nice to have more advanced talks next year, perhaps with "Advaned Topic" prepended to the talk title, to give beginners a heads-up. +The technical aspects of the talks seemed to be different this year, +perhaps with a target audience of beginner to intermediate skill +level. + +It would be really nice to have more advanced talks next year, perhaps +with "Advaned Topic" prepended to the talk title, to give beginners a +heads-up. Have Sean Reifschneider/tummy.com do the networking ;-) + ---- WIRELESS: -very spotty this year--up and down all the time, lots of dropped packets. I don't mind if it's a little slow, as long as it is up consistently. +very spotty this year--up and down all the time, lots of dropped +packets. I don't mind if it's a little slow, as long as it is up +consistently. FOOD: -Please provide continental breakfast a la PyCon 2005. I thought that was a great way to get people there early and is very convenient for attendees. Food was better at PyCon 05 than 06. This year the snacks were not up to par. Preferred 05 where there was fresh fruit and baked goods at snacks. This year we got bagels once or twice, but the oatmeal bars and a nuts-only snack don't cut it. Lunches were OK. +Please provide continental breakfast a la PyCon 2005. I thought that +was a great way to get people there early and is very convenient for +attendees. Food was better at PyCon 05 than 06. This year the snacks +were not up to par. Preferred 05 where there was fresh fruit and baked +goods at snacks. This year we got bagels once or twice, but the +oatmeal bars and a nuts-only snack don't cut it. Lunches were OK. ---- better wireless, it's great otherwise. + ---- -Offer transportation for evening meals each night. There were several evenings where a group would get together and go out for dinner, which is fine, but many people did not have rental cars or transportation which limited dining options. It would be nice to have some type of shuttle or car pool available each night to a central location with dining options for those who have no transportation and do not want to eat at the hotel every night. +Offer transportation for evening meals each night. There were several +evenings where a group would get together and go out for dinner, which +is fine, but many people did not have rental cars or transportation +which limited dining options. It would be nice to have some type of +shuttle or car pool available each night to a central location with +dining options for those who have no transportation and do not want to +eat at the hotel every night. + +The internet connectivity was very lacking as well. Granted, the +hotel is probably not used to having 400 geeks hammering their network +all weekend long, but perhaps next year they can offer a better +service for the conference. There were many issues with limited +connectivity to the wireless network and very slow speeds. The +in-room connections which were not free also had connectivity and +speed issues. If the hotel wants to keep the conference they really +should address this issue next year. -The internet connectivity was very lacking as well. Granted, the hotel is probably not used to having 400 geeks hammering their network all weekend long, but perhaps next year they can offer a better service for the conference. There were many issues with limited connectivity to the wireless network and very slow speeds. The in-room connections which were not free also had connectivity and speed issues. If the hotel wants to keep the conference they really should address this issue next year. ---- Better and more snacks. ---- -Plone keynote was awful. After the talk I had no idea what it was, what it did, what it looked like, how it works, what its relation to Zope is, etc. +Plone keynote was awful. After the talk I had no idea what it was, +what it did, what it looked like, how it works, what its relation to +Zope is, etc. Microphones that don't work are unacceptable. @@ -1127,13 +1528,15 @@ Somewhere that's more of a walking city would be better (even San Antonio). -There seem to be more people developing the Python language than working on applications. +There seem to be more people developing the Python language than +working on applications. ---- Don't let the Plone guys keynote ever again. -Longer time slots for presentations so it doesn't feel so rushed and there is time for questions. +Longer time slots for presentations so it doesn't feel so rushed and +there is time for questions. More emphasis on working code demonstrations. @@ -1142,11 +1545,15 @@ ---- Improve the sound capabilities. + ---- -Dallas is boring. I'll wait until 2008 when we hopefully find a better host city. +Dallas is boring. I'll wait until 2008 when we hopefully find a +better host city. -Have an organized Friday evening party or social activity. OSCON has lots of events with free beer, which really help the shy to connect with others. +Have an organized Friday evening party or social activity. OSCON has +lots of events with free beer, which really help the shy to connect +with others. ---- @@ -1154,5 +1561,6 @@ Put on the web site "computer recommended". -The conference was more of a technology fair and not what I expected. More of an overview of products available. +The conference was more of a technology fair and not what I expected. +More of an overview of products available. From guido at python.org Mon Mar 13 16:14:50 2006 From: guido at python.org (Guido van Rossum) Date: Mon, 13 Mar 2006 07:14:50 -0800 Subject: [Python-checkins] r42998 - in python/trunk: Lib/test/test_compile.py Python/compile.c In-Reply-To: <20060313123201.936091E4007@bag.python.org> References: <20060313123201.936091E4007@bag.python.org> Message-ID: I don't know what Travis expected/wanted, but this changes behavior with respect to 2.4, and I don't like the change. (Or possibly the code generated was already incompatible with 2.4 ever since the AST branch was merged in.) Previously, the SLICE opcodes would only be generated for slices with a single colon. That is, a[x:y] would generate a SLICE opcode, but a[x:y:] would generate an extended slice operation. This was intentional! The new code seems to ignore the second colon if it is present but no value follows. I'd like this to be changed back to generating code equivalent to a[slice(x,y,None)]. if the second colon is present. Why? (1) For backwards compatibility; it's always been done this way. It'll probably break at least some unit tests. It's unlikely but not impossible that some type interprets these things differently. (2) Old-fashioned types that support __getslice__ but not calling __getitem__ with a slice() object should not support indexing with extended slice syntax at all, even if the step is empty. --Guido On 3/13/06, nick.coghlan wrote: > Author: nick.coghlan > Date: Mon Mar 13 13:31:58 2006 > New Revision: 42998 > > Modified: > python/trunk/Lib/test/test_compile.py > python/trunk/Python/compile.c > Log: > Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly > > Modified: python/trunk/Lib/test/test_compile.py > ============================================================================== > --- python/trunk/Lib/test/test_compile.py (original) > +++ python/trunk/Lib/test/test_compile.py Mon Mar 13 13:31:58 2006 > @@ -284,6 +284,78 @@ > f1, f2 = f() > self.assertNotEqual(id(f1.func_code), id(f2.func_code)) > > + def test_subscripts(self): > + # SF bug 1448804 > + # Class to make testing subscript results easy > + class str_map(object): > + def __init__(self): > + self.data = {} > + def __getitem__(self, key): > + return self.data[str(key)] > + def __setitem__(self, key, value): > + self.data[str(key)] = value > + def __delitem__(self, key): > + del self.data[str(key)] > + def __contains__(self, key): > + return str(key) in self.data > + d = str_map() > + # Index > + d[1] = 1 > + self.assertEqual(d[1], 1) > + d[1] += 1 > + self.assertEqual(d[1], 2) > + del d[1] > + self.assertEqual(1 in d, False) > + # Tuple of indices > + d[1, 1] = 1 > + self.assertEqual(d[1, 1], 1) > + d[1, 1] += 1 > + self.assertEqual(d[1, 1], 2) > + del d[1, 1] > + self.assertEqual((1, 1) in d, False) > + # Simple slice > + d[1:2] = 1 > + self.assertEqual(d[1:2], 1) > + d[1:2] += 1 > + self.assertEqual(d[1:2], 2) > + del d[1:2] > + self.assertEqual(slice(1, 2) in d, False) > + # Tuple of simple slices > + d[1:2, 1:2] = 1 > + self.assertEqual(d[1:2, 1:2], 1) > + d[1:2, 1:2] += 1 > + self.assertEqual(d[1:2, 1:2], 2) > + del d[1:2, 1:2] > + self.assertEqual((slice(1, 2), slice(1, 2)) in d, False) > + # Extended slice > + d[1:2:3] = 1 > + self.assertEqual(d[1:2:3], 1) > + d[1:2:3] += 1 > + self.assertEqual(d[1:2:3], 2) > + del d[1:2:3] > + self.assertEqual(slice(1, 2, 3) in d, False) > + # Tuple of extended slices > + d[1:2:3, 1:2:3] = 1 > + self.assertEqual(d[1:2:3, 1:2:3], 1) > + d[1:2:3, 1:2:3] += 1 > + self.assertEqual(d[1:2:3, 1:2:3], 2) > + del d[1:2:3, 1:2:3] > + self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False) > + # Ellipsis > + d[...] = 1 > + self.assertEqual(d[...], 1) > + d[...] += 1 > + self.assertEqual(d[...], 2) > + del d[...] > + self.assertEqual(Ellipsis in d, False) > + # Tuple of Ellipses > + d[..., ...] = 1 > + self.assertEqual(d[..., ...], 1) > + d[..., ...] += 1 > + self.assertEqual(d[..., ...], 2) > + del d[..., ...] > + self.assertEqual((Ellipsis, Ellipsis) in d, False) > + > def test_main(): > test_support.run_unittest(TestSpecifics) > > > Modified: python/trunk/Python/compile.c > ============================================================================== > --- python/trunk/Python/compile.c (original) > +++ python/trunk/Python/compile.c Mon Mar 13 13:31:58 2006 > @@ -3853,42 +3853,47 @@ > static int > compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) > { > + char * kindname = NULL; > switch (s->kind) { > + case Index_kind: > + kindname = "index"; > + if (ctx != AugStore) { > + VISIT(c, expr, s->v.Index.value); > + } > + break; > case Ellipsis_kind: > - ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); > + kindname = "ellipsis"; > + if (ctx != AugStore) { > + ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); > + } > break; > case Slice_kind: > + kindname = "slice"; > if (!s->v.Slice.step) > return compiler_simple_slice(c, s, ctx); > - if (!compiler_slice(c, s, ctx)) > - return 0; > - if (ctx == AugLoad) { > - ADDOP_I(c, DUP_TOPX, 2); > - } > - else if (ctx == AugStore) { > - ADDOP(c, ROT_THREE); > - } > - return compiler_handle_subscr(c, "slice", ctx); > - case ExtSlice_kind: { > - int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); > - for (i = 0; i < n; i++) { > - slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); > - if (!compiler_visit_nested_slice(c, sub, ctx)) > + if (ctx != AugStore) { > + if (!compiler_slice(c, s, ctx)) > return 0; > } > - ADDOP_I(c, BUILD_TUPLE, n); > - return compiler_handle_subscr(c, "extended slice", ctx); > - } > - case Index_kind: > - if (ctx != AugStore) > - VISIT(c, expr, s->v.Index.value); > - return compiler_handle_subscr(c, "index", ctx); > + break; > + case ExtSlice_kind: > + kindname = "extended slice"; > + if (ctx != AugStore) { > + int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); > + for (i = 0; i < n; i++) { > + slice_ty sub = asdl_seq_GET(s->v.ExtSlice.dims, i); > + if (!compiler_visit_nested_slice(c, sub, ctx)) > + return 0; > + } > + ADDOP_I(c, BUILD_TUPLE, n); > + } > + break; > default: > PyErr_Format(PyExc_SystemError, > - "invalid slice %d", s->kind); > + "invalid subscript kind %d", s->kind); > return 0; > } > - return 1; > + return compiler_handle_subscr(c, kindname, ctx); > } > > /* do depth-first search of basic block graph, starting with block. > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Mon Mar 13 16:26:13 2006 From: python-checkins at python.org (georg.brandl) Date: Mon, 13 Mar 2006 16:26:13 +0100 (CET) Subject: [Python-checkins] r43007 - peps/trunk/pep-0356.txt Message-ID: <20060313152613.A449B1E4007@bag.python.org> Author: georg.brandl Date: Mon Mar 13 16:26:13 2006 New Revision: 43007 Modified: peps/trunk/pep-0356.txt Log: contextlib is still undocumented Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Mon Mar 13 16:26:13 2006 @@ -51,7 +51,7 @@ PEP 341: Unified try-except/try-finally to try-except-finally PEP 342: Coroutines via Enhanced Generators PEP 343: The "with" Statement - (still need Doc/ref updates) + (still need updates in Doc/ref and for the contextlib module) PEP 352: Required Superclass for Exceptions PEP 353: Using ssize_t as the index type PEP 357: Allowing Any Object to be Used for Slicing From python-checkins at python.org Mon Mar 13 16:33:21 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 16:33:21 +0100 (CET) Subject: [Python-checkins] r43008 - external/db-4.4.20/build_win32/db_static.vcproj Message-ID: <20060313153321.7B2051E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 16:33:19 2006 New Revision: 43008 Modified: external/db-4.4.20/build_win32/db_static.vcproj Log: Fix Release IA64 and Release AMD64 configurations. Modified: external/db-4.4.20/build_win32/db_static.vcproj ============================================================================== --- external/db-4.4.20/build_win32/db_static.vcproj (original) +++ external/db-4.4.20/build_win32/db_static.vcproj Mon Mar 13 16:33:19 2006 @@ -12,13 +12,21 @@ + OutputDirectory=".\Release_IA64" + IntermediateDirectory=".\Release_IA64/db_static" + ConfigurationType="4" + CharacterSet="1"> + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".,.." + PreprocessorDefinitions="UNICODE;WIN32;NDEBUG;_WINDOWS" + StringPooling="TRUE" + RuntimeLibrary="2"/> + Name="VCLibrarianTool" + OutputFile="Release_IA64/libdb44s.lib"/> - + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4"> + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".,.." + PreprocessorDefinitions="DIAGNOSTIC;UNICODE;WIN32;_DEBUG;_WINDOWS"/> + Name="VCLibrarianTool"/> - @@ -122,13 +130,21 @@ + OutputDirectory=".\Release_AMD64" + IntermediateDirectory=".\Release_AMD64/db_static" + ConfigurationType="4" + CharacterSet="1"> + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".,.." + PreprocessorDefinitions="UNICODE;WIN32;NDEBUG;_WINDOWS" + StringPooling="TRUE" + RuntimeLibrary="2"/> + Name="VCLibrarianTool" + OutputFile="Release_AMD64/libdb44s.lib"/> - @@ -250,13 +264,17 @@ + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="4"> + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=".,.." + PreprocessorDefinitions="DIAGNOSTIC;UNICODE;WIN32;_DEBUG;_WINDOWS"/> + Name="VCLibrarianTool"/> - From python-checkins at python.org Mon Mar 13 16:37:41 2006 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 13 Mar 2006 16:37:41 +0100 (CET) Subject: [Python-checkins] r43009 - python/trunk/PCbuild/_bsddb.vcproj python/trunk/PCbuild/readme.txt Message-ID: <20060313153741.27DC91E4007@bag.python.org> Author: martin.v.loewis Date: Mon Mar 13 16:37:40 2006 New Revision: 43009 Modified: python/trunk/PCbuild/_bsddb.vcproj python/trunk/PCbuild/readme.txt Log: Fix build process of bsddb for IA64 and AMD64. Remove remarks on size_t problems. Modified: python/trunk/PCbuild/_bsddb.vcproj ============================================================================== --- python/trunk/PCbuild/_bsddb.vcproj (original) +++ python/trunk/PCbuild/_bsddb.vcproj Mon Mar 13 16:37:40 2006 @@ -151,7 +151,7 @@ (Guido van Rossum's message of "Mon, 13 Mar 2006 07:14:50 -0800") References: <20060313123201.936091E4007@bag.python.org> Message-ID: <2mfylm5m4k.fsf@starship.python.net> "Guido van Rossum" writes: > I don't know what Travis expected/wanted, but this changes behavior > with respect to 2.4, and I don't like the change. (Or possibly the > code generated was already incompatible with 2.4 ever since the AST > branch was merged in.) Your parenthetical comment is correct. I've already got a bug open about what you're complaining about in this mail: #1441408. There's even a patch that claims to fix it (#1446847) which I haven't looked at yet. > (1) For backwards compatibility; it's always been done this way. It'll > probably break at least some unit tests. It's unlikely but not > impossible that some type interprets these things differently. It broke PyPy's unit tests! That's how I found the problem. Cheers, mwh -- I never realized it before, but having looked that over I'm certain I'd rather have my eyes burned out by zombies with flaming dung sticks than work on a conscientious Unicode regex engine. -- Tim Peters, 3 Dec 1998 From mal at egenix.com Mon Mar 13 20:28:18 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Mon, 13 Mar 2006 20:28:18 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <4411DEFF.8050804@v.loewis.de> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> Message-ID: <4415C7D2.9030703@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >> ich habe f?r diesen UCDB 4.1 Patch gar keinen SF-Eintrag gesehen. > > Nein, ich hatte auch keinen gemacht. > >> Ich verstehe zwar, weswegen Du UCBD 3.2 kompatibel bleiben willst, >> allerdings denke ich, da? der eingeschlagene Weg der falsche ist: >> es w?re wesentlich einfacher gewesen, das bisherige Modul unicodedata >> (zusammen mit den zugeh?rigen .c und .h Dateien) umzubenennen in >> z.B. unicodedata32 und dann unicodedata auf 4.1 umzustellen. > > Einfacher vielleicht: warum aber falsch? Es sind so deutlich weniger > Daten. Falsch, weil der Patch wesentlich komplexer ist, als zur L?sung des Problems n?tig gewesen w?re und man nun auch in Zukunft stets mehrere Versionen der Datenbank bereithalten mu?, anstatt einfach mehrere Module daf?r bereitzuhalten, die je nach Bedarf hinzugeladen werden k?nnen. Es wird auch nicht m?glich sein, die alten Versionen ohne Problem abzutrennen, so da? bei einer Erweiterung der Datenbank um weitere Felder oder Informationen, Probleme mit der Synchronisierung der Datenbank entstehen werden. >> Mit Deinem Patch m?ssen jetzt Anwender von unicodedata >> stets zwei Versionen der kompletten Datenbank laden. > > Das ist ja genau der Trick: sie m?ssen das nicht. Die Unterst?tzung > von Unicode 3.2 kostet nur 18kB. Das ist in der Tat wenig. >> Ein neues Objekt f?r den Lookup w?re mit dem einfacheren >> Ansatz auch nicht notwendig gewesen, genausowenig wie >> die API-?nderung im C Objekt f?r ucnhash. > > Richtig - das war allerdings insgesamt nicht so viel Aufwand. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 13 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Mon Mar 13 20:35:54 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 20:35:54 +0100 (CET) Subject: [Python-checkins] r43010 - python/trunk/PCbuild/readme.txt Message-ID: <20060313193554.957721E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 20:35:53 2006 New Revision: 43010 Modified: python/trunk/PCbuild/readme.txt Log: Trimmed trailing whitespace. Modified: python/trunk/PCbuild/readme.txt ============================================================================== --- python/trunk/PCbuild/readme.txt (original) +++ python/trunk/PCbuild/readme.txt Mon Mar 13 20:35:53 2006 @@ -160,7 +160,7 @@ devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Release /project db_static - Alternatively, if you want to start with the original sources, + Alternatively, if you want to start with the original sources, go to Sleepycat's download page: http://www.sleepycat.com/downloads/releasehistorybdb.html @@ -219,7 +219,7 @@ - build BerkeleyDB with the solution configuration matching the target ("Release IA64" for Itanium, "Release AMD64" for AMD64), e.g. devenv db-4.4.20\build_win32\Berkeley_DB.sln /build "Release AMD64" /project db_static /useenv - + _ssl Python wrapper for the secure sockets library. From python-checkins at python.org Mon Mar 13 20:43:35 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 20:43:35 +0100 (CET) Subject: [Python-checkins] r43011 - python/trunk/PCbuild/readme.txt Message-ID: <20060313194335.AB4901E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 20:43:34 2006 New Revision: 43011 Modified: python/trunk/PCbuild/readme.txt Log: Minor changes. Modified: python/trunk/PCbuild/readme.txt ============================================================================== --- python/trunk/PCbuild/readme.txt (original) +++ python/trunk/PCbuild/readme.txt Mon Mar 13 20:43:34 2006 @@ -22,7 +22,8 @@ 3) the other subprojects, as desired or needed (note: you probably don't want to build most of the other subprojects, unless you're building an entire Python distribution from scratch, or specifically making changes - to the subsystems they implement; see SUBPROJECTS below) + to the subsystems they implement, or are running a Python core buildbot + test slave; see SUBPROJECTS below) When using the Debug setting, the output files have a _d added to their name: python25_d.dll, python_d.exe, parser_d.pyd, and so on. @@ -133,7 +134,7 @@ svn export http://svn.python.org/projects/external/bzip2-1.0.3 A custom pre-link step in the bz2 project settings should manage to - build bzip2-1.0.2\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is + build bzip2-1.0.3\libbz2.lib by magic before bz2.pyd (or bz2_d.pyd) is linked in PCbuild\. However, the bz2 project is not smart enough to remove anything under bzip2-1.0.3\ when you do a clean, so if you want to rebuild bzip2.lib @@ -142,15 +143,13 @@ The build step shouldn't yield any warnings or errors, and should end by displaying 6 blocks each terminated with FC: no differences encountered - If FC finds differences, see the warning abou WinZip above (when I - first tried it, sample3.ref failed due to CRLF conversion). All of this managed to build bzip2-1.0.3\libbz2.lib, which the Python project links in. _bsddb - To use the version of bsddb that Python is built with by default is, invoke + To use the version of bsddb that Python is built with by default, invoke (in the dist directory) svn export http://svn.python.org/projects/external/db-4.4.20 From python-checkins at python.org Mon Mar 13 21:09:34 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 13 Mar 2006 21:09:34 +0100 (CET) Subject: [Python-checkins] r43012 - python/trunk/PCbuild/readme.txt Message-ID: <20060313200934.F2D5C1E4007@bag.python.org> Author: tim.peters Date: Mon Mar 13 21:09:32 2006 New Revision: 43012 Modified: python/trunk/PCbuild/readme.txt Log: It's necessary to do a Debug build of the bsddb project too. Modified: python/trunk/PCbuild/readme.txt ============================================================================== --- python/trunk/PCbuild/readme.txt (original) +++ python/trunk/PCbuild/readme.txt Mon Mar 13 21:09:32 2006 @@ -155,9 +155,13 @@ svn export http://svn.python.org/projects/external/db-4.4.20 - Then open a VS.NET 2003 shell, and invoke + Then open a VS.NET 2003 shell, and invoke: - devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Release /project db_static + devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Release /project db_static + + and do that a second time for a Debug build too: + + devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Debug /project db_static Alternatively, if you want to start with the original sources, go to Sleepycat's download page: From thomas at python.org Mon Mar 13 22:43:56 2006 From: thomas at python.org (Thomas Wouters) Date: Mon, 13 Mar 2006 22:43:56 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <4415C7D2.9030703@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> Message-ID: <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> On 3/13/06, M.-A. Lemburg wrote: > > Martin v. L?wis wrote: > > M.-A. Lemburg wrote: > >> [German] > > [German] [German] Not that I have objections to unicode-related discussions taking place in German (I can follow it quite nicely myself, anyway, and I don't know who else would be interested) I wonder if you both realize that this email conversation is going to python-checkins, and not to just you two? :) -- Thomas Wouters Hi! I'm a .signature virus! copy me into your .signature file to help me spread! -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.python.org/pipermail/python-checkins/attachments/20060313/60d8efa1/attachment.htm From neal at metaslash.com Mon Mar 13 22:55:25 2006 From: neal at metaslash.com (Neal Norwitz) Date: Mon, 13 Mar 2006 16:55:25 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060313215525.GA4007@python.psfb.org> test_cmd_line leaked [-15, 15, 0] references test_compiler leaked [107, 148, 53] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_threadedtempfile leaked [-1, 5, 0] references test_threading_local leaked [34, 34, 35] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [64, 65, 63] references From python-checkins at python.org Mon Mar 13 23:05:29 2006 From: python-checkins at python.org (vinay.sajip) Date: Mon, 13 Mar 2006 23:05:29 +0100 (CET) Subject: [Python-checkins] r43013 - python/trunk/Lib/logging/__init__.py Message-ID: <20060313220529.2D18F1E4007@bag.python.org> Author: vinay.sajip Date: Mon Mar 13 23:05:28 2006 New Revision: 43013 Modified: python/trunk/Lib/logging/__init__.py Log: Added logThreads and logProcesses to allow conditional omission of logging this information Modified: python/trunk/Lib/logging/__init__.py ============================================================================== --- python/trunk/Lib/logging/__init__.py (original) +++ python/trunk/Lib/logging/__init__.py Mon Mar 13 23:05:28 2006 @@ -89,6 +89,16 @@ # raiseExceptions = 1 +# +# If you don't want threading information in the log, set this to zero +# +logThreads = 1 + +# +# If you don't want process information in the log, set this to zero +# +logProcesses = 1 + #--------------------------------------------------------------------------- # Level related stuff #--------------------------------------------------------------------------- @@ -243,13 +253,13 @@ self.created = ct self.msecs = (ct - long(ct)) * 1000 self.relativeCreated = (self.created - _startTime) * 1000 - if thread: + if logThreads and thread: self.thread = thread.get_ident() self.threadName = threading.currentThread().getName() else: self.thread = None self.threadName = None - if hasattr(os, 'getpid'): + if logProcesses and hasattr(os, 'getpid'): self.process = os.getpid() else: self.process = None From neal at metaslash.com Mon Mar 13 23:07:19 2006 From: neal at metaslash.com (Neal Norwitz) Date: Mon, 13 Mar 2006 17:07:19 -0500 Subject: [Python-checkins] Python Regression Test Failures all (1) Message-ID: <20060313220719.GA5669@python.psfb.org> test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test test_compiler failed -- Traceback (most recent call last): File "/home/neal/python/trunk/Lib/test/test_compiler.py", line 36, in testCompileLibrary compiler.compile(buf, basename, "exec") File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 64, in compile gen.compile() File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 112, in compile gen = ModuleCodeGenerator(tree) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 1288, in __init__ walk(tree, self) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 350, in visitModule self.visit(node.node) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 401, in visitClass walk(node.code, gen) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 362, in visitFunction self._visitFuncOrLambda(node, isLambda=0) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 380, in _visitFuncOrLambda walk(node.code, gen) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 995, in visitAugAssign self.visit(aug_node, "load") File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 1049, in visitAugSubscript raise SyntaxError, "augmented assignment to tuple is not possible" SyntaxError: augmented assignment to tuple is not possible test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9258 refs] [9258 refs] [9258 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9453 refs] [9453 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socketserver test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9253 refs] [9255 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9254 refs] [9254 refs] [9253 refs] [9254 refs] [9253 refs] [9470 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] this bit of output is from a test of stdout in a different process ... [9254 refs] [9253 refs] [9470 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9253 refs] [9253 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9255 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllibnet test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 284 tests OK. 1 test failed: test_compiler 21 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_cd test_cl test_gl test_hashlib_speed test_imgfile test_ioctl test_macfs test_macostools test_nis test_pep277 test_plistlib test_scriptpackages test_sunaudiodev test_tcl test_unicode_file test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [387892 refs] From python-checkins at python.org Mon Mar 13 23:22:12 2006 From: python-checkins at python.org (georg.brandl) Date: Mon, 13 Mar 2006 23:22:12 +0100 (CET) Subject: [Python-checkins] r43014 - python/trunk/Objects/object.c Message-ID: <20060313222212.5C49D1E4007@bag.python.org> Author: georg.brandl Date: Mon Mar 13 23:22:11 2006 New Revision: 43014 Modified: python/trunk/Objects/object.c Log: Fix bug found by Coverity: don't allow NULL argument to PyUnicode_CheckExact Modified: python/trunk/Objects/object.c ============================================================================== --- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Mon Mar 13 23:22:11 2006 @@ -402,9 +402,9 @@ PyObject *func; static PyObject *unicodestr; - if (v == NULL) + if (v == NULL) { res = PyString_FromString(""); - if (PyUnicode_CheckExact(v)) { + } else if (PyUnicode_CheckExact(v)) { Py_INCREF(v); return v; } From python-checkins at python.org Mon Mar 13 23:22:15 2006 From: python-checkins at python.org (georg.brandl) Date: Mon, 13 Mar 2006 23:22:15 +0100 (CET) Subject: [Python-checkins] r43015 - python/branches/release24-maint/Objects/object.c Message-ID: <20060313222215.D129C1E4007@bag.python.org> Author: georg.brandl Date: Mon Mar 13 23:22:15 2006 New Revision: 43015 Modified: python/branches/release24-maint/Objects/object.c Log: Fix bug found by Coverity: don't allow NULL argument to PyUnicode_CheckExact (backport from rev. 43014) Modified: python/branches/release24-maint/Objects/object.c ============================================================================== --- python/branches/release24-maint/Objects/object.c (original) +++ python/branches/release24-maint/Objects/object.c Mon Mar 13 23:22:15 2006 @@ -374,9 +374,9 @@ { PyObject *res; - if (v == NULL) + if (v == NULL) { res = PyString_FromString(""); - if (PyUnicode_CheckExact(v)) { + } else if (PyUnicode_CheckExact(v)) { Py_INCREF(v); return v; } From martin at v.loewis.de Mon Mar 13 23:45:49 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Mon, 13 Mar 2006 23:45:49 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <4415C7D2.9030703@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> Message-ID: <4415F61D.1070907@v.loewis.de> [as Thomas points out, this is on python-checkins, so continuing in English] > Falsch, weil der Patch wesentlich komplexer ist, als zur > L?sung des Problems n?tig gewesen w?re und man nun auch in Zukunft > stets mehrere Versionen der Datenbank bereithalten mu?, anstatt > einfach mehrere Module daf?r bereitzuhalten, die je nach Bedarf > hinzugeladen werden k?nnen. Well, "the problem" to be solved was not merely to provide two versions of the database, but also in a space-efficient way. All this effort in trying to squeeze the size of the data would be wasted when it then gets double just because two versions of the database must be provided. > Es wird auch nicht m?glich sein, die alten Versionen ohne Problem > abzutrennen, so da? bei einer Erweiterung der Datenbank um weitere > Felder oder Informationen, Probleme mit der Synchronisierung der > Datenbank entstehen werden. There is no need to strip the old version. Parts of the library rely on the old version specifically, and these parts are not going to go away for a foreseeable future, nor does the need go away that these libraries need the version 3.2 of the Unicode database. IDNA is simply not going to change in that respect, for several years to come. *If* there is a need to strip off 3.2 at some point, this is very easily done through a slight modification to makeunicodedata.py. >>Das ist ja genau der Trick: sie m?ssen das nicht. Die Unterst?tzung >>von Unicode 3.2 kostet nur 18kB. > > > Das ist in der Tat wenig. That's because only the changed records are collected, plus a list of characters that were unassigned in 3.2 but are defined in 4.1. In principle, there should not be a single changed record. In practive, a few records have changed - mostly changes to the character category. As a matter of principle, the names of a character never change in Unicode (this is a promise the consortium and ISO make), and, as a similar principle, the normalization never changes except for clear errors. There are only five characters for which normalization changed between between 3.2 and 4.1; I generate a C function for these. Interestingly enough, these changes are one of the primary reasons why some people in IETF despise the notion of updating IDNA: This would be a change in wire protocol, with potential security implications (i.e. it might allow for phishing). In these cases, the potential for phishing is really minimal - but it exists, which means proposals to update IDNA will meet strong resistance. It might be possible to reduce the table of changes even further, using a three-level trie, if desired. Regards, Martin From python-checkins at python.org Mon Mar 13 23:57:55 2006 From: python-checkins at python.org (andrew.kuchling) Date: Mon, 13 Mar 2006 23:57:55 +0100 (CET) Subject: [Python-checkins] r43016 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060313225755.62B291E4042@bag.python.org> Author: andrew.kuchling Date: Mon Mar 13 23:57:54 2006 New Revision: 43016 Modified: sandbox/trunk/pycon/feedback.txt Log: Condense/summarize the '3 topics for next year' Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Mon Mar 13 23:57:54 2006 @@ -65,125 +65,87 @@ Question: What 3 topics should have been covered at PyCon? -distutils (count: 1 ) -Nevow (count: 1 ) -Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (count: 1 ) -Twisted (count: 4 ) -PyObjC (count: 1 ) -more django/turbogears/other web frameworks (count: 1 ) -more testing (count: 1 ) -introducing python into your job (count: 1 ) -Programming Bluetooth products (count: 1 ) -wxPython (as a more in depth tutorial) (count: 1 ) -A session about Python 2.5 changes (count: 1 ) -some real usage of another new feature 2.5 (count: 1 ) -overview of gui toolkits available to developers (count: 1 ) -State of Python on Macintosh (count: 1 ) -Matplotlib (count: 1 ) -seriously advanced twisted (count: 1 ) -Twisted (I understand that several Divmod members couldn't make it) (count: 1 ) -Python Language perspective from non-Guido PEP members (count: 1 ) -more on portable computing (count: 1 ) -Some theory of compilers and how to implement a toy compiler in Python (count: 1 ) -Decimal for Experts (count: 1 ) + +Applications using various frameworks (count: 1 ) +Audio (count: 1 ) Component-based application development (count: 1 ) -Python in Scientific Computing (count: 1 ) -Zope/Plone (count: 1 ) -Python on the Maemo SDK (Nokia) (count: 1 ) -Creating Python Server Pages (Spyce or mod_python/GGI) (count: 1 ) -Standard library gems/ unsung modules (count: 1 ) -Setuptools, eggs, and paste *technical* presentation (count: 1 ) -trac (count: 1 ) -Wiki (Moin) Hacking (count: 1 ) -the rest of the coverage was great (count: 1 ) -pyFLTK (now that it's at version >= 1.0) (count: 1 ) -how to talk to non-technical decision makers about the benefits of python (count: 1 ) -Anything on Twisted/Nevow (count: 1 ) +Cross-platform data synchronization (count: 1 ) +Database interfaces and ORMs (count: 5 ) +Distutils (count: 1 ) Extending Editors with Python (count: 1 ) -NumPy (count: 1 ) -Mod Python (count: 1 ) -various python based revision control systems (count: 1 ) -strategies for integrating C and Python (count: 2 ) -Anything Alex Martelli wants to talk about. (count: 1 ) -Some innovative project with more exposure to the "under-the-hood" aspects. (count: 1 ) -getting started hacking python source (count: 1 ) -Cool features of core Python (e.g. generators and decorators) (count: 1 ) -Design patterns in python (count: 1 ) -Python Best Practices (count: 1 ) -Using Python in team development (locally and remotely) (count: 1 ) -Database interfaces (count: 1 ) -SpreadModule (count: 1 ) -More on Python internals (count: 1 ) -Object Relational Mapping (count: 1 ) -using python in embedded/small devices (count: 1 ) +Grid computing with Python (count: 1 ) How to share your software, packaging for the CheeseShop (count: 1 ) -matplotlib (count: 1 ) -Porting Python to PDAs (count: 1 ) -Not Sure Yet (count: 1 ) -MoinMoin (count: 1 ) -numarray or the like (count: 1 ) -Python on the Mac including PyObjC (count: 1 ) -Network Programming (count: 1 ) -Advanced Python: metaclasses, descriptors, decorators (count: 1 ) -more praticle libraries/patterns/etc (count: 1 ) +How to talk to non-technical decision makers about the benefits of python (count: 2 ) +Jython (count: 1 ) +Libraries (count: 2 ) +Libraries/modules interfacing to services like maps.google.com etc (count: 1 ) More about money (count: 1 ) -more on scientific computing with python (count: 1 ) -itertools (count: 1 ) -overview of web frameworks (yes, again) (count: 1 ) -Like to see Alex Martelli present some selected recipes from the Cookbook (count: 1 ) -Grid computing with Python (count: 1 ) -metaclasses and descriptors (count: 1 ) -Pyrex/SWIG/Pyste/SIP, etc. (count: 1 ) -Iterators and Generators (count: 1 ) -Zope 3 Concepts (adapters, interfaces, view, events) (count: 1 ) -I would have been interested in more database revolutionary stuff. (count: 1 ) -mod_python (count: 1 ) -Panel discussion with web framework developers explaining why theirs is the best (count: 1 ) -twisted (count: 1 ) -'Good Taste' in Python code (count: 1 ) -Web framework comparisons (count: 1 ) -Security Issues (Secure Access/Encryption) (count: 1 ) -sqlalchemy (count: 1 ) -REST APIs (count: 1 ) -metaclass programming (count: 1 ) -More user-developed apps and end-user items (count: 1 ) More on eggs, especially for beginners (count: 1 ) -WebOff II (count: 1 ) -Cherry Py (count: 1 ) -Better Development Practices with Python (count: 1 ) -Python and education (count: 1 ) -Zope 3 (count: 1 ) -New/Interesting Language Features, showcase new functionality (count: 1 ) -Libraries/modules interfacing to services like maps.google.com etc (count: 1 ) -Cross-platform data synchronization (count: 1 ) -Applications using various frameworks (count: 1 ) -WSGI (count: 1 ) -Libraries (not all talks have to be about large programs) (count: 1 ) -some real usage of a new feature in 2.5 (count: 1 ) -being more productive with Python (count: 1 ) -Utilizing Python 2.4/2.5 (count: 1 ) -scientific applications (numarray, matplotlib) (count: 1 ) -Jython (count: 1 ) -New Style Classes (count: 1 ) -Design Patterns in Python (count: 1 ) -Common cookbook solutions (like Alex Martelli's presentations last year) (count: 1 ) -Core language Features, Usage (advanced usage) (count: 1 ) -problems with python (count: 2 ) -Python in handhelds -- familiar, OEM+embedded, etc. (count: 1 ) +More on scientific computing with python (count: 7 ) +More user-developed apps and end-user items (count: 1 ) +Network Programming (count: 1 ) +NumPy (count: 1 ) +Overview of gui toolkits available to developers (count: 1 ) +Programming Bluetooth products (count: 1 ) Promoting Python (count: 1 ) +PyFLTK (now that it's at version >= 1.0) (count: 1 ) +Pyrex/SWIG/Pyste/SIP, etc. (count: 1 ) +Python and education (count: 1 ) +Python and high performance computing (count: 1 ) +Python on the Mac including PyObjC (count: 3 ) Review/comparision of IDEs (count: 1 ) -More about the core language. (count: 1 ) -Intermediate/Advanced Coding Techniques (count: 1 ) -PySci (count: 1 ) -Program Structure, Application/Library design (count: 1 ) -Ways to improve performance of Python code (count: 1 ) +Security Issues (Secure Access/Encryption) (count: 1 ) +Setuptools, eggs, and paste *technical* presentation (count: 1 ) +Some innovative project with more exposure to the "under-the-hood" aspects. (count: 1 ) +Some theory of compilers and how to implement a toy compiler in Python (count: 1 ) +SpreadModule (count: 1 ) +Testing (count: 1 ) +Twisted (count: 8 ) +Using Python in team development (locally and remotely) (count: 1 ) +Using python in embedded/small devices (count: 5 ) +Various python based revision control systems (count: 1 ) +wxPython (count: 3 ) + +Web stuff +--------- +Cherry Py (count: 1 ) +Creating Python Server Pages (Spyce or mod_python/GGI) (count: 1 ) Mashups (count: 1 ) -Database talks, esp. pysqlite (SQLite's small footprint seems esp. pythonic) (count: 1 ) -python and high performance computing (count: 1 ) -wxPython (count: 2 ) +Mod Python (count: 1 ) +More django/turbogears/other web frameworks (count: 1 ) +Nevow (count: 1 ) +Overview of web frameworks (yes, again) (count: 1 ) +Panel discussion with web framework developers explaining why theirs is the best (count: 1 ) +REST APIs (count: 1 ) +Trac (count: 1 ) +WSGI (count: 1 ) +WebOff II (count: 2 ) +Wiki (Moin) Hacking (count: 2 ) +Zope 3 (count: 1 ) +Zope 3 Concepts (adapters, interfaces, view, events) (count: 1 ) +Zope/Plone (count: 1 ) +mod_python (count: 1 ) + +Core Python +----------- +Advanced Python: metaclasses, descriptors, decorators (count: 3 ) +Anything Alex Martelli wants to talk about. (count: 3 ) +Being more productive with Python (count: 1 ) +Better Development Practices with Python (count: 1 ) +Decimal for Experts (count: 1 ) +Design Patterns in Python (count: 3 ) +Getting started hacking python source (count: 1 ) +Iterators and Generators (count: 2 ) +Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (count: 1 ) +More on Python internals (count: 1 ) +Problems with python (count: 2 ) Py3K (count: 1 ) -audio (count: 1 ) -use of advanced python features (count: 2 ) +Python Best Practices (count: 3 ) +Python Language perspective from non-Guido PEP members (count: 1 ) +Standard library gems/ unsung modules (count: 1 ) +Strategies for integrating C and Python (count: 2 ) +Usage of new/advanced python features (count: 12) +Ways to improve performance of Python code (count: 1 ) Question: What 3 topics would you like to see repeated next year? From python-checkins at python.org Tue Mar 14 00:06:50 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 14 Mar 2006 00:06:50 +0100 (CET) Subject: [Python-checkins] r43017 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060313230650.102661E4007@bag.python.org> Author: andrew.kuchling Date: Tue Mar 14 00:06:48 2006 New Revision: 43017 Modified: sandbox/trunk/pycon/feedback.txt Log: Some condensing of the '3 topics repeated question Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Tue Mar 14 00:06:48 2006 @@ -149,128 +149,97 @@ Question: What 3 topics would you like to see repeated next year? -Python Internals (count: 1 ) -Web (count: 1 ) -Any web development talks (count: 1 ) -TurboGears (count: 3 ) -WebOff III (count: 1 ) -Twisted (count: 1 ) -Eggs/Setuptools information/howto (count: 1 ) -Testing Methodologies (count: 1 ) -unicode (count: 1 ) -buildbot (count: 1 ) -web topics (count: 1 ) -an actual eggs presentation (count: 1 ) -web dev platforms (count: 1 ) -Lightning talks. (count: 1 ) -Lightning Talks (count: 2 ) -success stories from enterprise and high performance/demanding applications (count: 1 ) -state of python (guido) (count: 1 ) -MIT Robotics project update (count: 1 ) -NerdBooks Party! :-) (count: 1 ) -Agile development and testing (count: 1 ) -Django (count: 4 ) + +A Game-Free Introduction to PyGame (count: 1 ) AJAX (count: 1 ) -IronPython (count: 3 ) -Testing/QA sessions (count: 1 ) -pypy (count: 1 ) -Zope-related talks (count: 1 ) -Teaching Python (count: 1 ) -More wxPython stuff (count: 1 ) -testing and agile development (count: 1 ) -overview talks on the history and future of python (count: 1 ) -Testing (count: 1 ) -bazaar-ng (count: 1 ) -Doctutils (count: 1 ) -Zope development (count: 1 ) -Origins of Python for newcomers (count: 1 ) -Lightning talks (count: 2 ) -Testing Frameworks (count: 1 ) -turbogears (count: 1 ) -testing (count: 2 ) -Turbo Gears (count: 1 ) -Any lightning talk sessions (count: 1 ) -Agile testing (count: 1 ) -Web and application testing (count: 1 ) -Scripting .NET with IronPython (count: 1 ) -Anything TurboGears (count: 1 ) +AST (count: 1 ) +Agile Testing (count: 3 ) +An actual eggs presentation (count: 1 ) +Basic talk on good python programming practices (count: 1 ) +Bazaar-ng (count: 1 ) +Breadth and Depth of python (eg. Pysense) (count: 1 ) +Buildbot (count: 1 ) Chandler-related talks (count: 1 ) -More on IronPython, esp. integrating with Win/Office env, DLLs, plug-ins, etc. (count: 1 ) -Lightning Talks in Main Ballroom (count: 1 ) -more testing talks (count: 1 ) -IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (count: 1 ) -Web development (Django) (count: 1 ) -web frameworks howtos--more detail (count: 1 ) -state of python and/or python 3000 (count: 1 ) -Python Language from Guido's perspective (count: 1 ) -Real-world examples: how Python is used in the workplace (count: 1 ) -PyPy (except by someone more guruish) (count: 1 ) +Dabo (count: 3 ) +Doctutils (count: 1 ) +Docutils development tutorial (count: 1 ) +Eggs (count: 1 ) +Eggs/Setuptools information/howto (count: 1 ) Frameworks (count: 1 ) -ajax (count: 1 ) -Not Sure Yet (count: 1 ) +Funding for projects (count: 1 ) +Further application development talks (count: 1 ) +Getting Started with wxPython (count: 1 ) +I would do a pyparsing follow-up if there is interest (count: 1 ) +Implementation of the Python Bytecode Compiler (count: 1 ) Interpreter/Language changes, new implementations (count: 1 ) -PyParsing (count: 1 ) -pygame intro (count: 1 ) +IronPython (count: 5 ) +IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (count: 1 ) +Large scale systems (count: 1 ) +Lightning Talks (count: 7 ) +MIT Robotics project update (count: 1 ) More Series 60 (count: 1 ) -Python in the Enterprise (anything showing Python rocking!) (count: 1 ) +More testing talks (count: 1 ) +More wxPython stuff (count: 1 ) +NerdBooks Party! :-) (count: 1 ) +New applications of python (count: 1 ) +Origins of Python for newcomers (count: 1 ) +Overview talks on the history and future of python (count: 1 ) PyGTk (count: 1 ) -Unicode (count: 1 ) -State of Dabo (count: 1 ) -python games (count: 1 ) -tools available for developers (count: 1 ) -Funding for projects (count: 1 ) -Eggs (count: 1 ) -Web frameworks (count: 1 ) -state of pypy (count: 2 ) -zope 3 (count: 1 ) -pysense (count: 1 ) -Python GUI Frameworks (count: 1 ) -Frameworks - Django, Turbogears (count: 1 ) -PyPy (count: 3 ) -Getting Started with the Twisted Framework (count: 1 ) -AST (count: 1 ) -Further application development talks (count: 1 ) -twisted (count: 1 ) +PyGame intro (count: 1 ) +PyParsing (count: 1 ) +PyPy (count: 8 ) PySense (count: 1 ) -Guido on whatever (count: 1 ) -python implementation talks (count: 1 ) -Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (count: 1 ) +Python GUI Frameworks (count: 1 ) +Python Internals (count: 1 ) +Python Language from Guido's perspective (count: 10 ) +Python for Series 60 (count: 1 ) +Python in the Enterprise (anything showing Python rocking!) (count: 1 ) +Python on Mobile devices (count: 1 ) +Python on embedded systems like the Nokia S60 (count: 1 ) +Real-world examples: how Python is used in the workplace (count: 1 ) SFWMI Hydrology project update (count: 1 ) -# - -A Game-Free Introduction to PyGame (count: 1 ) -Lunchtime with Guido with up-coming python features (count: 1 ) -I would do a pyparsing follow-up if there is interest (count: 1 ) -Docutils development tutorial (count: 1 ) -More Django (count: 1 ) -Breadth and Depth of python (eg. Pysense) (count: 1 ) -Iron Python (count: 1 ) -State of Zope (count: 1 ) -Agile Testing (count: 1 ) -basic talk on good python programming practices (count: 1 ) -Web app frameworks (count: 1 ) -web stuff (count: 1 ) -Web frameworks update (Django/TurboGears/Zope) (count: 1 ) -Anything PyPy (hopefully it will be done by then) (count: 1 ) +Scripting .NET with IronPython (count: 1 ) +State of Dabo (count: 1 ) +State of the Python Universe (count: 1 ) +Teaching Python (count: 1 ) +Testing (count: 4 ) +Testing and agile development (count: 4 ) +Twisted (count: 3 ) +Unicode (count: 1 ) +Unicode (count: 1 ) py.* talks (count: 1 ) py2exe (count: 1 ) -Python on embedded systems like the Nokia S60 (count: 1 ) -Python on Mobile devices (count: 1 ) -Web applications (Django/Turbo gear/Webware) (count: 1 ) -large scale systems (count: 1 ) -Dabo (count: 3 ) -testing at all levels and automating the testing (count: 1 ) -State of the Python Universe (count: 1 ) -Getting Started with wxPython (count: 1 ) -Guido talking through lunch (really enjoyed this) (count: 1 ) -state of python (count: 3 ) -Implementation of the Python Bytecode Compiler (count: 1 ) -wxPython (count: 3 ) -new applications of python (count: 1 ) -Python for Series 60 (count: 1 ) +pysense (count: 1 ) pysense: Humanoid Robots, a Wearable System, and Python (count: 1 ) -Using Django to supercharge Web development (count: 1 ) +python games (count: 1 ) +python implementation talks (count: 1 ) +success stories from enterprise and high performance/demanding applications (count: 1 ) +tools available for developers (count: 1 ) +wxPython (count: 3 ) + +Web stuff +--------- +Ajax (count: 1 ) +Any web development talks (count: 1 ) +Anything TurboGears (count: 1 ) +Django (count: 5 ) +Frameworks - Django, Turbogears (count: 1 ) +General web topics (count: 4 ) Plone (count: 1 ) +State of Zope (count: 1 ) +Turbogears (count: 5 ) +Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (count: 1 ) +Using Django to supercharge Web development (count: 1 ) +Web and application testing (count: 1 ) +Web app frameworks (count: 2 ) +Web applications (Django/Turbo gear/Webware) (count: 1 ) +Web development (Django) (count: 1 ) +Web frameworks (count: 1 ) +Web frameworks update (Django/TurboGears/Zope) (count: 1 ) +WebOff III (count: 1 ) +Zope 3 (count: 1 ) +Zope development (count: 1 ) +Zope-related talks (count: 1 ) Question: Where did you stay? From brett at python.org Tue Mar 14 00:22:23 2006 From: brett at python.org (Brett Cannon) Date: Mon, 13 Mar 2006 15:22:23 -0800 Subject: [Python-checkins] Python Regression Test Failures refleak (1) In-Reply-To: <20060313215525.GA4007@python.psfb.org> References: <20060313215525.GA4007@python.psfb.org> Message-ID: On 3/13/06, Neal Norwitz wrote: > test_generators leaked [255, 255, 255] references I have narrowed down which test group in test_generators is causing the leaks: fun_tests is causing 254 of the leaks while coroutine_tests is causing 1 leak. The fun_tests leaks might be stemming from the itertools.tee leak since it uses tee in several places. So this is me poking Raymond with a stick to fix the tee leak (if I remember correctly that he said he was going to fix this =). -Brett From thomas at python.org Tue Mar 14 00:33:06 2006 From: thomas at python.org (Thomas Wouters) Date: Tue, 14 Mar 2006 00:33:06 +0100 Subject: [Python-checkins] Python Regression Test Failures refleak (1) In-Reply-To: References: <20060313215525.GA4007@python.psfb.org> Message-ID: <9e804ac0603131533n6156f6e3gc85728c5235435c1@mail.gmail.com> On 3/14/06, Brett Cannon wrote: > > On 3/13/06, Neal Norwitz wrote: > > test_generators leaked [255, 255, 255] references > > I have narrowed down which test group in test_generators is causing > the leaks: fun_tests is causing 254 of the leaks while coroutine_tests > is causing 1 leak. I did the same narrowing-down last week, and submitted a patch to add cycle-GC support to itertools.tee. It really needs it. Come to think of it, now that I remember how to properly do GC, I think the patch cuts some corners, but it solved the problem. Raymond is on it, anyway: http://python.org/sf/1444398 -- Thomas Wouters Hi! I'm a .signature virus! copy me into your .signature file to help me spread! -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.python.org/pipermail/python-checkins/attachments/20060314/d8bb4aaf/attachment.htm From python-checkins at python.org Tue Mar 14 01:45:53 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 14 Mar 2006 01:45:53 +0100 (CET) Subject: [Python-checkins] r43018 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060314004553.4DEF11E4007@bag.python.org> Author: andrew.kuchling Date: Tue Mar 14 01:45:52 2006 New Revision: 43018 Modified: sandbox/trunk/pycon/feedback.txt Log: Sum up the location votes Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Tue Mar 14 01:45:52 2006 @@ -269,120 +269,59 @@ Question: If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? -Anywhere on the east coast, shorter flight for me from Ireland :) (count: 1 ) -New Orleans, it can handle a conference this size and needs the traffic (count: 1 ) -Northern VA (count: 1 ) -San-Francisco/Bay area (count: 1 ) -Orlando, FL (the 2nd asshole of the unvierse, but nearby) (count: 1 ) -NYC (count: 3 ) -West coast (count: 1 ) -Texas (count: 1 ) -San Antonio TX (count: 2 ) -denver (count: 1 ) -Washington, DC (count: 4 ) -RTP, NC (count: 1 ) -Atlanta, GA (count: 1 ) -Atlanta (count: 1 ) -midwest (count: 1 ) -San Diego CA (count: 1 ) -Kansas City, MO (count: 2 ) -East Coast (Boston, DC, not NYC) (count: 1 ) -SoCal (count: 1 ) -Somewhere in the east coast (count: 1 ) -Tampa, FL (ibid) (count: 1 ) -Washington (count: 2 ) -Minneapolis (count: 1 ) -west coast (count: 1 ) -Seattle (count: 4 ) -Houston, TX (count: 1 ) -Minneapolis (In the early or late summer though ;) (count: 1 ) -Boston MA (count: 2 ) -San Antonio, TX (count: 3 ) -Denver (count: 2 ) -San Francisco area (count: 1 ) -San Francisco (count: 7 ) -anywhere in oregon (count: 1 ) -no preference (count: 1 ) -San Francisco Bay Area (count: 1 ) -Bay Area (count: 1 ) -New York City (count: 1 ) -Los Angeles (count: 1 ) -San Antonio (count: 1 ) -sf would be great (could stay home) (count: 1 ) -Boston / Washington / Florida (count: 1 ) -Boston, MA (count: 1 ) -San Jose (count: 1 ) -Florida (count: 1 ) -Fort Worth TX (count: 1 ) +Atlanta, GA (count: 3 ) Atlantic City, NJ (count: 1 ) -Boston (count: 8 ) -new england (count: 1 ) -florida (count: 1 ) -North Carolina (count: 2 ) -East Coast (count: 1 ) -Las Vegas (count: 3 ) -West Coast (count: 1 ) -New Orleans, LA (count: 1 ) -was hoping to spend time in dc, would of taken vacation time there. (count: 1 ) -New Mexico (count: 1 ) -san francisco (count: 1 ) -Midwest (count: 1 ) -Portland OR (count: 3 ) -Europe (count: 1 ) -West Coast (LA, SF) (count: 1 ) -San Diego, CA (count: 2 ) -new orleans (count: 1 ) +Austin, TX (count: 5 ) +Baltimore, MD (count: 2 ) +Bay Area (count: 7 ) +Boston (count: 14 ) California (count: 2 ) -Chicago (Also in the early summer or early fall) (count: 1 ) -Midwest (Chicago, St Louis) (count: 1 ) -Washington D.C. (count: 3 ) -Portlan, OR (count: 1 ) -Bay area (count: 2 ) -San Francisco, CA (count: 4 ) -Austin TX (count: 1 ) -Little Rock (count: 1 ) -Toronto, ONT (count: 1 ) -Austin (count: 2 ) -Columbus, OH (count: 1 ) +Chicago (count: 21 ) Colorado (count: 1 ) -Portland, OR (count: 4 ) -New York (count: 5 ) -san fransisco (count: 1 ) -Chicago IL (count: 1 ) -Boston/Cambridge MA (count: 1 ) -Chicago (count: 9 ) -boston (count: 1 ) -Seattle WA (count: 2 ) -Mars (count: 1 ) -center of the country works well to limit flight time (count: 1 ) -DC (count: 3 ) +Columbus, OH (count: 1 ) +Denver, CO (count: 5 ) +East Coast (count: 4 ) +Europe (count: 1 ) +Florida (count: 3 ) +Fort Worth TX (count: 1 ) +Houston, TX (count: 1 ) Irvine, CA (count: 1 ) -New York, NY (count: 3 ) +Kansas City, MO (count: 3 ) +Las Vegas, NV (count: 6 ) +Little Rock (count: 1 ) +Los Angeles (count: 2 ) +Mars (count: 1 ) +Midwest (count: 4 ) +Minneapolis (count: 2 ) +New England (count: 1) +New Mexico (count: 1 ) +New Orleans, LA (count: 4 ) +New York City (count: 13 ) +North Carolina (count: 2 ) +Northern VA (count: 1 ) +Orlando, FL (count: 2 ) +Phoenix (count: 2 ) +Portland, OR (count: 9 ) +RTP, NC (count: 1 ) Rockwall, TX (count: 1 ) -Washington DC (count: 6 ) -seattle (count: 1 ) -Baltimore, MD (count: 2 ) -San Jose CA (count: 1 ) -Phoenix (count: 1 ) -LA (count: 1 ) -san diego (count: 1 ) +San Antonio, TX (count: 6 ) +San Diego, CA (count: 4 ) +San Francisco (count: 15 ) +San Jose CA (count: 2 ) +San-Francisco (count: 1 ) +Seattle WA (count: 7 ) +SoCal (count: 1 ) +Tampa, FL (ibid) (count: 1 ) +Texas (count: 1 ) +Toronto, ON (count: 1 ) Virginia (count: 1 ) -Las Vegas, NV (count: 3 ) -New Orleans LA (count: 1 ) -vancouver (count: 1 ) -Austin, TX (count: 4 ) -anywhere on the west coast (count: 1 ) -phoenix (count: 1 ) -Kansas City (count: 1 ) -Atlanta. (count: 1 ) -New-York City (count: 1 ) -sf bay area (count: 1 ) -Denver, CO (count: 2 ) -Chicago, IL (count: 6 ) -Washington, DC, particularly GWU. (count: 1 ) -chicago (count: 3 ) -Portland (count: 1 ) -Orlando, FL (count: 1 ) +Washington DC (count: 21 ) +West Coast (count: 5 ) +Anywhere in Oregon (count: 1 ) +Vancouver (count: 1 ) + +no preference (count: 1 ) + Question: Would you be interested in attending half-day (3-hour) tutorials next year? From python-checkins at python.org Tue Mar 14 02:08:28 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 14 Mar 2006 02:08:28 +0100 (CET) Subject: [Python-checkins] r43019 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060314010828.4F2EA1E4007@bag.python.org> Author: andrew.kuchling Date: Tue Mar 14 02:08:27 2006 New Revision: 43019 Modified: sandbox/trunk/pycon/feedback.txt Log: Simplify vote display; sort by descending order of votes Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Tue Mar 14 02:08:27 2006 @@ -1,427 +1,420 @@ -The questions are presented in the attachment followed by every answer -grouped where possible. If the format needs to be improved, let me know -what you would rather see and I'll get on it. - -Cheers // Martin - - - Question: What were your 3 favorite talks? -TurboGears How-to (count: 5 ) -Effective AJAX with TurboGears (count: 9 ) -Django supercharge web (count: 13 ) -Django How-To (count: 6 ) -Python Eggs (count: 2 ) -IronPython implementation (count: 17 ) -Scripting .NET with IronPython (count: 3 ) -Unicode (count: 3 ) -Creating Presentations With Docutils and S5 (count: 6 ) -Lightning talks (count: 17) -Python in Your Pocket: Python for Series 60 (count: 14 ) -Agile Documentation (count: 1 ) -Agile Testing open space talk (count: 3 ) -An Interactive Adventure Game Engine Built Using Pyparsing (count: 3 ) -Bazaar-ng Distributed Version Control (count: 3 ) -Bram Cohen interview (count: 5 ) -Chandler BoF (count: 2 ) -Internationalization (Chandler) (count: 2 ) -Cuaima (count: 1 ) -Decimal for Beginners (count: 5 ) -Desktop Application Programming With PyGTK and Glade (count: 2 ) -Guido's Keynote (count: 17 ) -Guido's history of python (count: 9 ) -Implementation of the Python Bytecode Compiler (count: 1 ) -Intro to PyParsing (count: 5 ) -Making Apples from Applesauce: The Evolution of cvs2svn (count: 4 ) -New Tools for Testing Web Applications with Python (count: 4 ) -Packaging Programs with py2exe (count: 5 ) -Plone KeyNote (count: 1 ) -Py-mycms (count: 1 ) -PyPy (count: 10 ) -Python Can Survive In The Enterprise (count: 10 ) -Stackless Python in EVE Online (count: 5 ) -State of Zope (count: 3 ) -State-of-the-art Python IDEs (count: 2 ) -Teaching Python - Anecdotes from the Field (count: 3 ) -The EWT BoF (betting $100M with Python) (count: 1 ) -The Rest Of The Web Stack (count: 4 ) -The State of Dabo (count: 11 ) -Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (count: 1 ) -Virtual Collaboratory (count: 1 ) -What is Nabu (count: 1 ) -Osh shell (count: 2 ) -PySense: Humanoid Robots, a Wearable System, and Python (count: 4 ) -python tools for hydrologic modeling (count: 1 ) - -python AST--BOF (count: 1 ) -wxPython BoF (count: 6 ) - -tutorial: Agile Development (count: 1 ) -wxPython Tutorial (count: 1 ) - -The tutorials rocked. (count: 1 ) -The web topics i liked because it's a pain-point for me, no talk in particular. (count: 1 ) +Lightning talks (17) +IronPython implementation (17) +Guido's Keynote (17) +Python in Your Pocket: Python for Series 60 (14) +Django supercharge web (13) +The State of Dabo (11) +Python Can Survive In The Enterprise (10) +PyPy (10) +Guido's history of python (9) +Effective AJAX with TurboGears (9) +Django How-To (6) +Creating Presentations With Docutils and S5 (6) +TurboGears How-to (5) +Stackless Python in EVE Online (5) +Packaging Programs with py2exe (5) +Intro to PyParsing (5) +Decimal for Beginners (5) +Bram Cohen interview (5) +The Rest Of The Web Stack (4) +PySense: Humanoid Robots, a Wearable System, and Python (4) +New Tools for Testing Web Applications with Python (4) +Making Apples from Applesauce: The Evolution of cvs2svn (4) +Unicode (3) +Teaching Python - Anecdotes from the Field (3) +State of Zope (3) +Scripting .NET with IronPython (3) +Bazaar-ng Distributed Version Control (3) +An Interactive Adventure Game Engine Built Using Pyparsing (3) +Agile Testing open space talk (3) +State-of-the-art Python IDEs (2) +Python Eggs (2) +Osh shell (2) +Internationalization (Chandler) (2) +Desktop Application Programming With PyGTK and Glade (2) +Chandler BoF (2) +python tools for hydrologic modeling (1) +What is Nabu (1) +Virtual Collaboratory (1) +Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (1) +The EWT BoF (betting $100M with Python) (1) +Py-mycms (1) +Plone KeyNote (1) +Implementation of the Python Bytecode Compiler (1) +Cuaima (1) +Agile Documentation (1) + +python AST--BOF (1) +wxPython BoF (6) + +tutorial: Agile Development (1) +wxPython Tutorial (1) + +The tutorials rocked. (1) +The web topics i liked because it's a pain-point for me, no talk in +particular. (1) Question: What 3 topics should have been covered at PyCon? -Applications using various frameworks (count: 1 ) -Audio (count: 1 ) -Component-based application development (count: 1 ) -Cross-platform data synchronization (count: 1 ) -Database interfaces and ORMs (count: 5 ) -Distutils (count: 1 ) -Extending Editors with Python (count: 1 ) -Grid computing with Python (count: 1 ) -How to share your software, packaging for the CheeseShop (count: 1 ) -How to talk to non-technical decision makers about the benefits of python (count: 2 ) -Jython (count: 1 ) -Libraries (count: 2 ) -Libraries/modules interfacing to services like maps.google.com etc (count: 1 ) -More about money (count: 1 ) -More on eggs, especially for beginners (count: 1 ) -More on scientific computing with python (count: 7 ) -More user-developed apps and end-user items (count: 1 ) -Network Programming (count: 1 ) -NumPy (count: 1 ) -Overview of gui toolkits available to developers (count: 1 ) -Programming Bluetooth products (count: 1 ) -Promoting Python (count: 1 ) -PyFLTK (now that it's at version >= 1.0) (count: 1 ) -Pyrex/SWIG/Pyste/SIP, etc. (count: 1 ) -Python and education (count: 1 ) -Python and high performance computing (count: 1 ) -Python on the Mac including PyObjC (count: 3 ) -Review/comparision of IDEs (count: 1 ) -Security Issues (Secure Access/Encryption) (count: 1 ) -Setuptools, eggs, and paste *technical* presentation (count: 1 ) -Some innovative project with more exposure to the "under-the-hood" aspects. (count: 1 ) -Some theory of compilers and how to implement a toy compiler in Python (count: 1 ) -SpreadModule (count: 1 ) -Testing (count: 1 ) -Twisted (count: 8 ) -Using Python in team development (locally and remotely) (count: 1 ) -Using python in embedded/small devices (count: 5 ) -Various python based revision control systems (count: 1 ) -wxPython (count: 3 ) +Twisted (8) +More on scientific computing with python (7) +Using python in embedded/small devices (5) +Database interfaces and ORMs (5) +wxPython (3) +Python on the Mac including PyObjC (3) +Libraries (2) +How to talk to non-technical decision makers about the benefits of python (2) +Various python based revision control systems (1) +Using Python in team development (locally and remotely) (1) +Testing (1) +SpreadModule (1) +Some theory of compilers and how to implement a toy compiler in Python (1) +Some innovative project with more exposure to the "under-the-hood" aspects. (1) +Setuptools, eggs, and paste *technical* presentation (1) +Security Issues (Secure Access/Encryption) (1) +Review/comparision of IDEs (1) +Python and high performance computing (1) +Python and education (1) +Pyrex/SWIG/Pyste/SIP, etc. (1) +PyFLTK (now that it's at version >= 1.0) (1) +Promoting Python (1) +Programming Bluetooth products (1) +Overview of gui toolkits available to developers (1) +NumPy (1) +Network Programming (1) +More user-developed apps and end-user items (1) +More on eggs, especially for beginners (1) +More about money (1) +Libraries/modules interfacing to services like maps.google.com etc (1) +Jython (1) +How to share your software, packaging for the CheeseShop (1) +Grid computing with Python (1) +Extending Editors with Python (1) +Distutils (1) +Cross-platform data synchronization (1) +Component-based application development (1) +Audio (1) +Applications using various frameworks (1) Web stuff --------- -Cherry Py (count: 1 ) -Creating Python Server Pages (Spyce or mod_python/GGI) (count: 1 ) -Mashups (count: 1 ) -Mod Python (count: 1 ) -More django/turbogears/other web frameworks (count: 1 ) -Nevow (count: 1 ) -Overview of web frameworks (yes, again) (count: 1 ) -Panel discussion with web framework developers explaining why theirs is the best (count: 1 ) -REST APIs (count: 1 ) -Trac (count: 1 ) -WSGI (count: 1 ) -WebOff II (count: 2 ) -Wiki (Moin) Hacking (count: 2 ) -Zope 3 (count: 1 ) -Zope 3 Concepts (adapters, interfaces, view, events) (count: 1 ) -Zope/Plone (count: 1 ) -mod_python (count: 1 ) +Wiki (Moin) Hacking (2) +WebOff II (2) +mod_python (1) +Zope/Plone (1) +Zope 3 Concepts (adapters, interfaces, view, events) (1) +Zope 3 (1) +WSGI (1) +Trac (1) +REST APIs (1) +Panel discussion with web framework developers explaining why theirs is the best (1) +Overview of web frameworks (yes, again) (1) +Nevow (1) +More django/turbogears/other web frameworks (1) +Mod Python (1) +Mashups (1) +Creating Python Server Pages (Spyce or mod_python/GGI) (1) +Cherry Py (1) Core Python ----------- -Advanced Python: metaclasses, descriptors, decorators (count: 3 ) -Anything Alex Martelli wants to talk about. (count: 3 ) -Being more productive with Python (count: 1 ) -Better Development Practices with Python (count: 1 ) -Decimal for Experts (count: 1 ) -Design Patterns in Python (count: 3 ) -Getting started hacking python source (count: 1 ) -Iterators and Generators (count: 2 ) -Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (count: 1 ) -More on Python internals (count: 1 ) -Problems with python (count: 2 ) -Py3K (count: 1 ) -Python Best Practices (count: 3 ) -Python Language perspective from non-Guido PEP members (count: 1 ) -Standard library gems/ unsung modules (count: 1 ) -Strategies for integrating C and Python (count: 2 ) -Usage of new/advanced python features (count: 12) -Ways to improve performance of Python code (count: 1 ) +Usage of new/advanced python features (12) +Python Best Practices (3) +Design Patterns in Python (3) +Anything Alex Martelli wants to talk about. (3) +Advanced Python: metaclasses, descriptors, decorators (3) +Strategies for integrating C and Python (2) +Problems with python (2) +Iterators and Generators (2) +Ways to improve performance of Python code (1) +Standard library gems/ unsung modules (1) +Python Language perspective from non-Guido PEP members (1) +Py3K (1) +More on Python internals (1) +Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (1) +Getting started hacking python source (1) +Decimal for Experts (1) +Better Development Practices with Python (1) +Being more productive with Python (1) Question: What 3 topics would you like to see repeated next year? -A Game-Free Introduction to PyGame (count: 1 ) -AJAX (count: 1 ) -AST (count: 1 ) -Agile Testing (count: 3 ) -An actual eggs presentation (count: 1 ) -Basic talk on good python programming practices (count: 1 ) -Bazaar-ng (count: 1 ) -Breadth and Depth of python (eg. Pysense) (count: 1 ) -Buildbot (count: 1 ) -Chandler-related talks (count: 1 ) -Dabo (count: 3 ) -Doctutils (count: 1 ) -Docutils development tutorial (count: 1 ) -Eggs (count: 1 ) -Eggs/Setuptools information/howto (count: 1 ) -Frameworks (count: 1 ) -Funding for projects (count: 1 ) -Further application development talks (count: 1 ) -Getting Started with wxPython (count: 1 ) -I would do a pyparsing follow-up if there is interest (count: 1 ) -Implementation of the Python Bytecode Compiler (count: 1 ) -Interpreter/Language changes, new implementations (count: 1 ) -IronPython (count: 5 ) -IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (count: 1 ) -Large scale systems (count: 1 ) -Lightning Talks (count: 7 ) -MIT Robotics project update (count: 1 ) -More Series 60 (count: 1 ) -More testing talks (count: 1 ) -More wxPython stuff (count: 1 ) -NerdBooks Party! :-) (count: 1 ) -New applications of python (count: 1 ) -Origins of Python for newcomers (count: 1 ) -Overview talks on the history and future of python (count: 1 ) -PyGTk (count: 1 ) -PyGame intro (count: 1 ) -PyParsing (count: 1 ) -PyPy (count: 8 ) -PySense (count: 1 ) -Python GUI Frameworks (count: 1 ) -Python Internals (count: 1 ) -Python Language from Guido's perspective (count: 10 ) -Python for Series 60 (count: 1 ) -Python in the Enterprise (anything showing Python rocking!) (count: 1 ) -Python on Mobile devices (count: 1 ) -Python on embedded systems like the Nokia S60 (count: 1 ) -Real-world examples: how Python is used in the workplace (count: 1 ) -SFWMI Hydrology project update (count: 1 ) -Scripting .NET with IronPython (count: 1 ) -State of Dabo (count: 1 ) -State of the Python Universe (count: 1 ) -Teaching Python (count: 1 ) -Testing (count: 4 ) -Testing and agile development (count: 4 ) -Twisted (count: 3 ) -Unicode (count: 1 ) -Unicode (count: 1 ) -py.* talks (count: 1 ) -py2exe (count: 1 ) -pysense (count: 1 ) -pysense: Humanoid Robots, a Wearable System, and Python (count: 1 ) -python games (count: 1 ) -python implementation talks (count: 1 ) -success stories from enterprise and high performance/demanding applications (count: 1 ) -tools available for developers (count: 1 ) -wxPython (count: 3 ) +A Game-Free Introduction to PyGame (1) +AJAX (1) +AST (1) +Agile Testing (3) +An actual eggs presentation (1) +Basic talk on good python programming practices (1) +Bazaar-ng (1) +Breadth and Depth of python (eg. Pysense) (1) +Buildbot (1) +Chandler-related talks (1) +Dabo (3) +Doctutils (1) +Docutils development tutorial (1) +Eggs (1) +Eggs/Setuptools information/howto (1) +Frameworks (1) +Funding for projects (1) +Further application development talks (1) +Getting Started with wxPython (1) +I would do a pyparsing follow-up if there is interest (1) +Implementation of the Python Bytecode Compiler (1) +Interpreter/Language changes, new implementations (1) +IronPython (5) +IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (1) +Large scale systems (1) +Lightning Talks (7) +MIT Robotics project update (1) +More Series 60 (1) +More testing talks (1) +More wxPython stuff (1) +NerdBooks Party! :-) (1) +New applications of python (1) +Origins of Python for newcomers (1) +Overview talks on the history and future of python (1) +PyGTk (1) +PyGame intro (1) +PyParsing (1) +PyPy (8) +PySense (1) +Python GUI Frameworks (1) +Python Internals (1) +Python Language from Guido's perspective (10) +Python for Series 60 (1) +Python in the Enterprise (anything showing Python rocking!) (1) +Python on Mobile devices (1) +Python on embedded systems like the Nokia S60 (1) +Real-world examples: how Python is used in the workplace (1) +SFWMI Hydrology project update (1) +Scripting .NET with IronPython (1) +State of Dabo (1) +State of the Python Universe (1) +Teaching Python (1) +Testing (4) +Testing and agile development (4) +Twisted (3) +Unicode (1) +Unicode (1) +py.* talks (1) +py2exe (1) +pysense (1) +pysense: Humanoid Robots, a Wearable System, and Python (1) +python games (1) +python implementation talks (1) +success stories from enterprise and high performance/demanding applications (1) +tools available for developers (1) +wxPython (3) Web stuff --------- -Ajax (count: 1 ) -Any web development talks (count: 1 ) -Anything TurboGears (count: 1 ) -Django (count: 5 ) -Frameworks - Django, Turbogears (count: 1 ) -General web topics (count: 4 ) -Plone (count: 1 ) -State of Zope (count: 1 ) -Turbogears (count: 5 ) -Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (count: 1 ) -Using Django to supercharge Web development (count: 1 ) -Web and application testing (count: 1 ) -Web app frameworks (count: 2 ) -Web applications (Django/Turbo gear/Webware) (count: 1 ) -Web development (Django) (count: 1 ) -Web frameworks (count: 1 ) -Web frameworks update (Django/TurboGears/Zope) (count: 1 ) -WebOff III (count: 1 ) -Zope 3 (count: 1 ) -Zope development (count: 1 ) -Zope-related talks (count: 1 ) +Ajax (1) +Any web development talks (1) +Anything TurboGears (1) +Django (5) +Frameworks - Django, Turbogears (1) +General web topics (4) +Plone (1) +State of Zope (1) +Turbogears (5) +Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (1) +Using Django to supercharge Web development (1) +Web and application testing (1) +Web app frameworks (2) +Web applications (Django/Turbo gear/Webware) (1) +Web development (Django) (1) +Web frameworks (1) +Web frameworks update (Django/TurboGears/Zope) (1) +WebOff III (1) +Zope 3 (1) +Zope development (1) +Zope-related talks (1) Question: Where did you stay? -91% Hotel (count: 72 ) - 4% Am local resident (count: 3 ) - 1% Hostel (count: 1 ) - 4% With friends (count: 3 ) +91% Hotel (72) + 4% Am local resident (3) + 1% Hostel (1) + 4% With friends (3) Question: If you stayed at a hotel other than the conference hotel, what was its name? -Crowne Plaza (count: 1 ) -Comfort Inn (count: 1 ) -Super 8 (count: 1 ) +Crowne Plaza (1) +Comfort Inn (1) +Super 8 (1) Question: Would you recommend the hotel to other attendees? -True (count: 60 ) +True (60) Question: What is your maximum per-person nightly room budget for accommodations? -21% $75 or less (count: 15 ) -36% $100 (count: 25 ) -21% $125 (count: 15 ) -14% $150 (count: 10 ) - 6% $200 (count: 4 ) - 1% More than $200 (count: 1 ) +21% $75 or less (15) +36% $100 (25) +21% $125 (15) +14% $150 (10) + 6% $200 (4) + 1% More than $200 (1) Question: If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? -Atlanta, GA (count: 3 ) -Atlantic City, NJ (count: 1 ) -Austin, TX (count: 5 ) -Baltimore, MD (count: 2 ) -Bay Area (count: 7 ) -Boston (count: 14 ) -California (count: 2 ) -Chicago (count: 21 ) -Colorado (count: 1 ) -Columbus, OH (count: 1 ) -Denver, CO (count: 5 ) -East Coast (count: 4 ) -Europe (count: 1 ) -Florida (count: 3 ) -Fort Worth TX (count: 1 ) -Houston, TX (count: 1 ) -Irvine, CA (count: 1 ) -Kansas City, MO (count: 3 ) -Las Vegas, NV (count: 6 ) -Little Rock (count: 1 ) -Los Angeles (count: 2 ) -Mars (count: 1 ) -Midwest (count: 4 ) -Minneapolis (count: 2 ) -New England (count: 1) -New Mexico (count: 1 ) -New Orleans, LA (count: 4 ) -New York City (count: 13 ) -North Carolina (count: 2 ) -Northern VA (count: 1 ) -Orlando, FL (count: 2 ) -Phoenix (count: 2 ) -Portland, OR (count: 9 ) -RTP, NC (count: 1 ) -Rockwall, TX (count: 1 ) -San Antonio, TX (count: 6 ) -San Diego, CA (count: 4 ) -San Francisco (count: 15 ) -San Jose CA (count: 2 ) -San-Francisco (count: 1 ) -Seattle WA (count: 7 ) -SoCal (count: 1 ) -Tampa, FL (ibid) (count: 1 ) -Texas (count: 1 ) -Toronto, ON (count: 1 ) -Virginia (count: 1 ) -Washington DC (count: 21 ) -West Coast (count: 5 ) -Anywhere in Oregon (count: 1 ) -Vancouver (count: 1 ) +Washington DC (21) +Chicago (21) +San Francisco (15) +Boston (14) +New York City (13) +Portland, OR (9) +Seattle WA (7) +Bay Area (7) +San Antonio, TX (6) +Las Vegas, NV (6) +West Coast (5) +Denver, CO (5) +Austin, TX (5) +San Diego, CA (4) +New Orleans, LA (4) +Midwest (4) +East Coast (4) +Kansas City, MO (3) +Florida (3) +Atlanta, GA (3) +San Jose CA (2) +Phoenix (2) +Orlando, FL (2) +North Carolina (2) +Minneapolis (2) +Los Angeles (2) +California (2) +Baltimore, MD (2) +Virginia (1) +Vancouver (1) +Toronto, ON (1) +Texas (1) +Tampa, FL (ibid) (1) +SoCal (1) +San-Francisco (1) +Rockwall, TX (1) +RTP, NC (1) +Northern VA (1) +New Mexico (1) +New England (1) +Mars (1) +Little Rock (1) +Irvine, CA (1) +Houston, TX (1) +Fort Worth TX (1) +Europe (1) +Columbus, OH (1) +Colorado (1) +Atlantic City, NJ (1) +Anywhere in Oregon (1) -no preference (count: 1 ) +no preference (1) Question: Would you be interested in attending half-day (3-hour) tutorials next year? -32% False (count: 24 ) -52% True (count: 52 ) +32% False (24) +52% True (52) Question: How much would you be willing to pay for a half-day (3 hour) tutorial? -11% Nothing (count: 7 ) -13% $25 (count: 8 ) -34% $50 (count: 21 ) -33% $100 (count: 20 ) - 8% $150 (count: 5 ) +11% Nothing (7) +13% $25 (8) +34% $50 (21) +33% $100 (20) + 8% $150 (5) Question: If yes, please list 3 tutorial subjects you would like to attend: -Mod Python (count: 1 ) -text processing/introductory stuff (count: 1 ) -matplotlib and more data parsing (count: 1 ) -Web Applications (count: 1 ) -Advanced Python: Metaclasses, descriptors, decorators (count: 1 ) -Python 103 -special topics (i.e. iterators and generators) (count: 1 ) -Python & XML (count: 1 ) -extending & integrating trac (count: 1 ) -web testing and automating (count: 1 ) -testing (count: 1 ) -Twisted (count: 4 ) -Network programming (count: 1 ) -Advanced Zope3 (count: 1 ) -Zope dev setup (count: 1 ) -Advanced python topics, generators, extension writing, metaclasses... (count: 1 ) -Python for mobile devices (count: 1 ) -PyObjC (count: 1 ) -Really, really advanced techniques (count: 1 ) -Zope (count: 2 ) -Agile testing (count: 2 ) -Web development (count: 1 ) -Web application development, with case study/mock application. (count: 1 ) -AJAX with Python (count: 1 ) -Large scale systems (count: 1 ) -Advanced Language Features (count: 1 ) -Using Python to serve web pages (count: 1 ) -GUI development (count: 1 ) -Django or Turbo Gears (count: 1 ) -Python 301: An unscripted Q&A (should have pre-con questions/topics) (count: 1 ) -advanced zope (count: 1 ) -Constraint Based Local Searching (count: 1 ) -Tk and wxPy GUI building (count: 1 ) -matplotlib (count: 1 ) -Intermediate Python (count: 1 ) -wxPython (count: 4 ) -Beginning Graphics a la GTK (not tkinter or wxPython) (count: 1 ) -Implementing pluggable architectures (count: 1 ) -Metaclasses (count: 1 ) -One of the popular web frameworks (count: 1 ) -Advanced wxPython (count: 4 ) -Classes usage, Design (count: 1 ) -Object Oriented Design Patterns (count: 1 ) -Web Development (count: 1 ) -Python and Databases (count: 1 ) -Metaclasses, decorators, generators, slots, ast, other "advanced" topics (count: 1 ) -Advanced Twisted (count: 1 ) -python on embedded devices (count: 1 ) -Managing Projects with Python (count: 1 ) -Dabo (count: 1 ) -GUI Development (count: 1 ) -Intro to Audio Synthesis? (or something like that) (count: 1 ) -metaclass programming (count: 1 ) -Agile development and testing (count: 1 ) -Making effective use of WSGI (count: 1 ) -Django (count: 5 ) -python gaming (count: 1 ) -SQLAlchemy and ORM tools (count: 1 ) -Text/Data Processing (count: 1 ) -twisted (count: 1 ) -Text Parsing (count: 1 ) -IronPython (count: 2 ) -Python on handhelds (count: 1 ) -numarray or the like (count: 1 ) -Network programming, with case study/mock application. (count: 1 ) -MetaProgramming (count: 1 ) -advanced twisted (count: 1 ) -Turbogears or Django (count: 1 ) -dabo (count: 1 ) -django, turbogears, (count: 1 ) -Latest Dev Practices (count: 1 ) -database (count: 1 ) -Introduction to Object Oriented Programming (count: 1 ) -SQL Alchemy (count: 1 ) -Testing (count: 3 ) -Zope 3 Component Development Practices (count: 1 ) -gui toolkits --an overview (count: 1 ) -Library Design/Structure (count: 1 ) -Embedding python as a scripting language, with case study/mock application. (count: 1 ) -Creating Cocoa apps in PyObjC (count: 1 ) -Scientific computing (count: 1 ) -New features of Python for 2.5 (and a review of new features for 2.4) (count: 1 ) -NumPy (count: 1 ) -Plone (count: 2 ) -Building SWIG/ctypes Interfaces to other people's code (count: 1 ) +Mod Python (1) +text processing/introductory stuff (1) +matplotlib and more data parsing (1) +Web Applications (1) +Advanced Python: Metaclasses, descriptors, decorators (1) +Python 103 -special topics (i.e. iterators and generators) (1) +Python & XML (1) +extending & integrating trac (1) +web testing and automating (1) +testing (1) +Twisted (4) +Network programming (1) +Advanced Zope3 (1) +Zope dev setup (1) +Advanced python topics, generators, extension writing, metaclasses... (1) +Python for mobile devices (1) +PyObjC (1) +Really, really advanced techniques (1) +Zope (2) +Agile testing (2) +Web development (1) +Web application development, with case study/mock application. (1) +AJAX with Python (1) +Large scale systems (1) +Advanced Language Features (1) +Using Python to serve web pages (1) +GUI development (1) +Django or Turbo Gears (1) +Python 301: An unscripted Q&A (should have pre-con questions/topics) (1) +advanced zope (1) +Constraint Based Local Searching (1) +Tk and wxPy GUI building (1) +matplotlib (1) +Intermediate Python (1) +wxPython (4) +Beginning Graphics a la GTK (not tkinter or wxPython) (1) +Implementing pluggable architectures (1) +Metaclasses (1) +One of the popular web frameworks (1) +Advanced wxPython (4) +Classes usage, Design (1) +Object Oriented Design Patterns (1) +Web Development (1) +Python and Databases (1) +Metaclasses, decorators, generators, slots, ast, other "advanced" topics (1) +Advanced Twisted (1) +python on embedded devices (1) +Managing Projects with Python (1) +Dabo (1) +GUI Development (1) +Intro to Audio Synthesis? (or something like that) (1) +metaclass programming (1) +Agile development and testing (1) +Making effective use of WSGI (1) +Django (5) +python gaming (1) +SQLAlchemy and ORM tools (1) +Text/Data Processing (1) +twisted (1) +Text Parsing (1) +IronPython (2) +Python on handhelds (1) +numarray or the like (1) +Network programming, with case study/mock application. (1) +MetaProgramming (1) +advanced twisted (1) +Turbogears or Django (1) +dabo (1) +django, turbogears, (1) +Latest Dev Practices (1) +database (1) +Introduction to Object Oriented Programming (1) +SQL Alchemy (1) +Testing (3) +Zope 3 Component Development Practices (1) +gui toolkits --an overview (1) +Library Design/Structure (1) +Embedding python as a scripting language, with case study/mock application. (1) +Creating Cocoa apps in PyObjC (1) +Scientific computing (1) +New features of Python for 2.5 (and a review of new features for 2.4) (1) +NumPy (1) +Plone (2) +Building SWIG/ctypes Interfaces to other people's code (1) Question: Other comments: @@ -546,7 +539,7 @@ Other topics for next year (why do you limit us to only 3?): "How to manage a 100,000+ line python application" -"Python for Security Practitioners" (I'll be submitting a talk proposal on this :-) ) +"Python for Security Practitioners" (I'll be submitting a talk proposal on this :-)) "State of Python Operating Systems" (e.g. unununium.org and cleese.sf.net) "Guerilla's Guide to Getting Python into your Company" PyGame (or python media/graphics in general) @@ -740,60 +733,60 @@ Question: What days did you attend PyCon? -Sunday (count: 74 ) -Friday (count: 78 ) -Saturday (count: 77 ) +Sunday (74) +Friday (78) +Saturday (77) Question: Please rate your overall satisfaction with PyCon 2006. -34% very high (count: 27 ) -60% high (count: 48 ) - 6% low (count: 5 ) +34% very high (27) +60% high (48) + 6% low (5) Question: Please rate your overall satisfaction with the keynotes. -25% very high (count: 20 ) -54% high (count: 43 ) -20% low (count: 16 ) +25% very high (20) +54% high (43) +20% low (16) Question: Please rate your overall satisfaction with the talks. -14% very high (count: 11 ) -70% high (count: 55 ) -16% low (count: 13 ) +14% very high (11) +70% high (55) +16% low (13) Question: Please rate your overall satisfaction with the network. - 3% very high (count: 2 ) -15% high (count: 11 ) -38% low (count: 27 ) -44% very low (count: 31 ) + 3% very high (2) +15% high (11) +38% low (27) +44% very low (31) Question: Please rate your overall satisfaction with the food. -19% very high (count: 19 ) -62% high (count: 48 ) - 9% low (count: 9 ) - 1% very low (count: 1 ) +19% very high (19) +62% high (48) + 9% low (9) + 1% very low (1) Question: Please rate your likelihood of attending next year. -45% very high (count: 35 ) -38% high (count: 30 ) -15% low (count: 12 ) - 1% very low (count: 1 ) +45% very high (35) +38% high (30) +15% low (12) + 1% very low (1) Question: Would you prefer a conference that took place: -just as it was (count: 1 ) -better to end on a weekend, this years way worked (count: 1 ) -This was a good schedule (count: 1 ) -not important (count: 1 ) - -22% Includes one weekend day (starts on Sunday or ends on Saturday) (count: 15 ) -23% Only on weekdays (count: 16 ) -55% Includes two weekend days (count: 38 ) +just as it was (1) +better to end on a weekend, this years way worked (1) +This was a good schedule (1) +not important (1) + +22% Includes one weekend day (starts on Sunday or ends on Saturday) (15) +23% Only on weekdays (16) +55% Includes two weekend days (38) Question: How can we improve PyCon next year? @@ -1433,4 +1426,3 @@ The conference was more of a technology fair and not what I expected. More of an overview of products available. - From python-checkins at python.org Tue Mar 14 02:15:01 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 14 Mar 2006 02:15:01 +0100 (CET) Subject: [Python-checkins] r43020 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060314011501.196FB1E4007@bag.python.org> Author: andrew.kuchling Date: Tue Mar 14 02:14:56 2006 New Revision: 43020 Modified: sandbox/trunk/pycon/feedback.txt Log: Condense and sort tutorial votes Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Tue Mar 14 02:14:56 2006 @@ -331,90 +331,57 @@ Question: If yes, please list 3 tutorial subjects you would like to attend: -Mod Python (1) -text processing/introductory stuff (1) -matplotlib and more data parsing (1) -Web Applications (1) -Advanced Python: Metaclasses, descriptors, decorators (1) +Django (8) +Web development (7) +Agile development and testing (7) +Advanced Language Features (7) +wxPython (5) +Twisted (5) +TurboGears (4) +Text/Data Processing (4) +Scientific computing (4) +Advanced wxPython (4) +Python on embedded devices (3) +GUI Development (3) +Zope (2) +SQLAlchemy and ORM tools (2) +Python and Databases (2) +Plone (2) +Network programming, with case study/mock application. (2) +IronPython (2) +Introduction to Object Oriented Programming (2) +Dabo (2) +Advanced Zope3 (2) +Advanced Twisted (2) +Zope dev setup (1) +Zope 3 Component Development Practices (1) +Tk GUI building (1) +Python gaming (1) +Python 301: An unscripted Q&A (should have pre-con questions/topics) (1) Python 103 -special topics (i.e. iterators and generators) (1) Python & XML (1) -extending & integrating trac (1) -web testing and automating (1) -testing (1) -Twisted (4) -Network programming (1) -Advanced Zope3 (1) -Zope dev setup (1) -Advanced python topics, generators, extension writing, metaclasses... (1) -Python for mobile devices (1) PyObjC (1) -Really, really advanced techniques (1) -Zope (2) -Agile testing (2) -Web development (1) -Web application development, with case study/mock application. (1) -AJAX with Python (1) -Large scale systems (1) -Advanced Language Features (1) -Using Python to serve web pages (1) -GUI development (1) -Django or Turbo Gears (1) -Python 301: An unscripted Q&A (should have pre-con questions/topics) (1) -advanced zope (1) -Constraint Based Local Searching (1) -Tk and wxPy GUI building (1) -matplotlib (1) -Intermediate Python (1) -wxPython (4) -Beginning Graphics a la GTK (not tkinter or wxPython) (1) -Implementing pluggable architectures (1) -Metaclasses (1) One of the popular web frameworks (1) -Advanced wxPython (4) -Classes usage, Design (1) Object Oriented Design Patterns (1) -Web Development (1) -Python and Databases (1) -Metaclasses, decorators, generators, slots, ast, other "advanced" topics (1) -Advanced Twisted (1) -python on embedded devices (1) +NumPy (1) +New features of Python for 2.5 (and a review of new features for 2.4) (1) +Mod Python (1) +MetaProgramming (1) Managing Projects with Python (1) -Dabo (1) -GUI Development (1) -Intro to Audio Synthesis? (or something like that) (1) -metaclass programming (1) -Agile development and testing (1) Making effective use of WSGI (1) -Django (5) -python gaming (1) -SQLAlchemy and ORM tools (1) -Text/Data Processing (1) -twisted (1) -Text Parsing (1) -IronPython (2) -Python on handhelds (1) -numarray or the like (1) -Network programming, with case study/mock application. (1) -MetaProgramming (1) -advanced twisted (1) -Turbogears or Django (1) -dabo (1) -django, turbogears, (1) -Latest Dev Practices (1) -database (1) -Introduction to Object Oriented Programming (1) -SQL Alchemy (1) -Testing (3) -Zope 3 Component Development Practices (1) -gui toolkits --an overview (1) Library Design/Structure (1) +Latest Dev Practices (1) +Large scale systems (1) +Intro to Audio Synthesis? (or something like that) (1) +Intermediate Python (1) +Implementing pluggable architectures (1) +Extending & integrating trac (1) Embedding python as a scripting language, with case study/mock application. (1) Creating Cocoa apps in PyObjC (1) -Scientific computing (1) -New features of Python for 2.5 (and a review of new features for 2.4) (1) -NumPy (1) -Plone (2) +Constraint Based Local Searching (1) Building SWIG/ctypes Interfaces to other people's code (1) +Beginning Graphics a la GTK (1) +AJAX with Python (1) Question: Other comments: From python-checkins at python.org Tue Mar 14 03:21:31 2006 From: python-checkins at python.org (andrew.kuchling) Date: Tue, 14 Mar 2006 03:21:31 +0100 (CET) Subject: [Python-checkins] r43021 - sandbox/trunk/pycon/feedback.txt Message-ID: <20060314022131.BE45B1E4007@bag.python.org> Author: andrew.kuchling Date: Tue Mar 14 03:21:30 2006 New Revision: 43021 Modified: sandbox/trunk/pycon/feedback.txt Log: RSTify Modified: sandbox/trunk/pycon/feedback.txt ============================================================================== --- sandbox/trunk/pycon/feedback.txt (original) +++ sandbox/trunk/pycon/feedback.txt Tue Mar 14 03:21:30 2006 @@ -1,392 +1,444 @@ -Question: What were your 3 favorite talks? +Topic questions +================== -Lightning talks (17) -IronPython implementation (17) -Guido's Keynote (17) -Python in Your Pocket: Python for Series 60 (14) -Django supercharge web (13) -The State of Dabo (11) -Python Can Survive In The Enterprise (10) -PyPy (10) -Guido's history of python (9) -Effective AJAX with TurboGears (9) -Django How-To (6) -Creating Presentations With Docutils and S5 (6) -TurboGears How-to (5) -Stackless Python in EVE Online (5) -Packaging Programs with py2exe (5) -Intro to PyParsing (5) -Decimal for Beginners (5) -Bram Cohen interview (5) -The Rest Of The Web Stack (4) -PySense: Humanoid Robots, a Wearable System, and Python (4) -New Tools for Testing Web Applications with Python (4) -Making Apples from Applesauce: The Evolution of cvs2svn (4) -Unicode (3) -Teaching Python - Anecdotes from the Field (3) -State of Zope (3) -Scripting .NET with IronPython (3) -Bazaar-ng Distributed Version Control (3) -An Interactive Adventure Game Engine Built Using Pyparsing (3) -Agile Testing open space talk (3) -State-of-the-art Python IDEs (2) -Python Eggs (2) -Osh shell (2) -Internationalization (Chandler) (2) -Desktop Application Programming With PyGTK and Glade (2) -Chandler BoF (2) -python tools for hydrologic modeling (1) -What is Nabu (1) -Virtual Collaboratory (1) -Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (1) -The EWT BoF (betting $100M with Python) (1) -Py-mycms (1) -Plone KeyNote (1) -Implementation of the Python Bytecode Compiler (1) -Cuaima (1) -Agile Documentation (1) - -python AST--BOF (1) -wxPython BoF (6) - -tutorial: Agile Development (1) -wxPython Tutorial (1) - -The tutorials rocked. (1) -The web topics i liked because it's a pain-point for me, no talk in -particular. (1) - - -Question: What 3 topics should have been covered at PyCon? - -Twisted (8) -More on scientific computing with python (7) -Using python in embedded/small devices (5) -Database interfaces and ORMs (5) -wxPython (3) -Python on the Mac including PyObjC (3) -Libraries (2) -How to talk to non-technical decision makers about the benefits of python (2) -Various python based revision control systems (1) -Using Python in team development (locally and remotely) (1) -Testing (1) -SpreadModule (1) -Some theory of compilers and how to implement a toy compiler in Python (1) -Some innovative project with more exposure to the "under-the-hood" aspects. (1) -Setuptools, eggs, and paste *technical* presentation (1) -Security Issues (Secure Access/Encryption) (1) -Review/comparision of IDEs (1) -Python and high performance computing (1) -Python and education (1) -Pyrex/SWIG/Pyste/SIP, etc. (1) -PyFLTK (now that it's at version >= 1.0) (1) -Promoting Python (1) -Programming Bluetooth products (1) -Overview of gui toolkits available to developers (1) -NumPy (1) -Network Programming (1) -More user-developed apps and end-user items (1) -More on eggs, especially for beginners (1) -More about money (1) -Libraries/modules interfacing to services like maps.google.com etc (1) -Jython (1) -How to share your software, packaging for the CheeseShop (1) -Grid computing with Python (1) -Extending Editors with Python (1) -Distutils (1) -Cross-platform data synchronization (1) -Component-based application development (1) -Audio (1) -Applications using various frameworks (1) +What were your 3 favorite talks? +''''''''''''''''''''''''''''''''''''''' + +:: + + Lightning talks (17) + IronPython implementation (17) + Guido's Keynote (17) + Python in Your Pocket: Python for Series 60 (14) + Django supercharge web (13) + The State of Dabo (11) + Python Can Survive In The Enterprise (10) + PyPy (10) + Guido's history of python (9) + Effective AJAX with TurboGears (9) + Django How-To (6) + Creating Presentations With Docutils and S5 (6) + TurboGears How-to (5) + Stackless Python in EVE Online (5) + Packaging Programs with py2exe (5) + Intro to PyParsing (5) + Decimal for Beginners (5) + Bram Cohen interview (5) + The Rest Of The Web Stack (4) + PySense: Humanoid Robots, a Wearable System, and Python (4) + New Tools for Testing Web Applications with Python (4) + Making Apples from Applesauce: The Evolution of cvs2svn (4) + Unicode (3) + Teaching Python - Anecdotes from the Field (3) + State of Zope (3) + Scripting .NET with IronPython (3) + Bazaar-ng Distributed Version Control (3) + An Interactive Adventure Game Engine Built Using Pyparsing (3) + Agile Testing open space talk (3) + State-of-the-art Python IDEs (2) + Python Eggs (2) + Osh shell (2) + Internationalization (Chandler) (2) + Desktop Application Programming With PyGTK and Glade (2) + Chandler BoF (2) + python tools for hydrologic modeling (1) + What is Nabu (1) + Virtual Collaboratory (1) + Un-reinventing the Wheel: Some Lessons from Zope, Backported to Unix (1) + The EWT BoF (betting $100M with Python) (1) + Py-mycms (1) + Plone KeyNote (1) + Implementation of the Python Bytecode Compiler (1) + Cuaima (1) + Agile Documentation (1) + + python AST--BOF (1) + wxPython BoF (6) + + tutorial: Agile Development (1) + wxPython Tutorial (1) + + The tutorials rocked. (1) + The web topics i liked because it's a pain-point for me, no talk in + particular. (1) + + +What 3 topics should have been covered at PyCon? +''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + Twisted (8) + More on scientific computing with python (7) + Using python in embedded/small devices (5) + Database interfaces and ORMs (5) + wxPython (3) + Python on the Mac including PyObjC (3) + Libraries (2) + How to talk to non-technical decision makers about the benefits of python (2) + Various python based revision control systems (1) + Using Python in team development (locally and remotely) (1) + Testing (1) + SpreadModule (1) + Some theory of compilers and how to implement a toy compiler in Python (1) + Some innovative project with more exposure to the "under-the-hood" aspects. (1) + Setuptools, eggs, and paste *technical* presentation (1) + Security Issues (Secure Access/Encryption) (1) + Review/comparision of IDEs (1) + Python and high performance computing (1) + Python and education (1) + Pyrex/SWIG/Pyste/SIP, etc. (1) + PyFLTK (now that it's at version >= 1.0) (1) + Promoting Python (1) + Programming Bluetooth products (1) + Overview of gui toolkits available to developers (1) + NumPy (1) + Network Programming (1) + More user-developed apps and end-user items (1) + More on eggs, especially for beginners (1) + More about money (1) + Libraries/modules interfacing to services like maps.google.com etc (1) + Jython (1) + How to share your software, packaging for the CheeseShop (1) + Grid computing with Python (1) + Extending Editors with Python (1) + Distutils (1) + Cross-platform data synchronization (1) + Component-based application development (1) + Audio (1) + Applications using various frameworks (1) Web stuff --------- -Wiki (Moin) Hacking (2) -WebOff II (2) -mod_python (1) -Zope/Plone (1) -Zope 3 Concepts (adapters, interfaces, view, events) (1) -Zope 3 (1) -WSGI (1) -Trac (1) -REST APIs (1) -Panel discussion with web framework developers explaining why theirs is the best (1) -Overview of web frameworks (yes, again) (1) -Nevow (1) -More django/turbogears/other web frameworks (1) -Mod Python (1) -Mashups (1) -Creating Python Server Pages (Spyce or mod_python/GGI) (1) -Cherry Py (1) + +:: + + Wiki (Moin) Hacking (2) + WebOff II (2) + mod_python (1) + Zope/Plone (1) + Zope 3 Concepts (adapters, interfaces, view, events) (1) + Zope 3 (1) + WSGI (1) + Trac (1) + REST APIs (1) + Panel discussion with web framework developers explaining why theirs is the best (1) + Overview of web frameworks (yes, again) (1) + Nevow (1) + More django/turbogears/other web frameworks (1) + Mod Python (1) + Mashups (1) + Creating Python Server Pages (Spyce or mod_python/GGI) (1) + Cherry Py (1) Core Python ----------- -Usage of new/advanced python features (12) -Python Best Practices (3) -Design Patterns in Python (3) -Anything Alex Martelli wants to talk about. (3) -Advanced Python: metaclasses, descriptors, decorators (3) -Strategies for integrating C and Python (2) -Problems with python (2) -Iterators and Generators (2) -Ways to improve performance of Python code (1) -Standard library gems/ unsung modules (1) -Python Language perspective from non-Guido PEP members (1) -Py3K (1) -More on Python internals (1) -Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (1) -Getting started hacking python source (1) -Decimal for Experts (1) -Better Development Practices with Python (1) -Being more productive with Python (1) - - -Question: What 3 topics would you like to see repeated next year? - -A Game-Free Introduction to PyGame (1) -AJAX (1) -AST (1) -Agile Testing (3) -An actual eggs presentation (1) -Basic talk on good python programming practices (1) -Bazaar-ng (1) -Breadth and Depth of python (eg. Pysense) (1) -Buildbot (1) -Chandler-related talks (1) -Dabo (3) -Doctutils (1) -Docutils development tutorial (1) -Eggs (1) -Eggs/Setuptools information/howto (1) -Frameworks (1) -Funding for projects (1) -Further application development talks (1) -Getting Started with wxPython (1) -I would do a pyparsing follow-up if there is interest (1) -Implementation of the Python Bytecode Compiler (1) -Interpreter/Language changes, new implementations (1) -IronPython (5) -IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (1) -Large scale systems (1) -Lightning Talks (7) -MIT Robotics project update (1) -More Series 60 (1) -More testing talks (1) -More wxPython stuff (1) -NerdBooks Party! :-) (1) -New applications of python (1) -Origins of Python for newcomers (1) -Overview talks on the history and future of python (1) -PyGTk (1) -PyGame intro (1) -PyParsing (1) -PyPy (8) -PySense (1) -Python GUI Frameworks (1) -Python Internals (1) -Python Language from Guido's perspective (10) -Python for Series 60 (1) -Python in the Enterprise (anything showing Python rocking!) (1) -Python on Mobile devices (1) -Python on embedded systems like the Nokia S60 (1) -Real-world examples: how Python is used in the workplace (1) -SFWMI Hydrology project update (1) -Scripting .NET with IronPython (1) -State of Dabo (1) -State of the Python Universe (1) -Teaching Python (1) -Testing (4) -Testing and agile development (4) -Twisted (3) -Unicode (1) -Unicode (1) -py.* talks (1) -py2exe (1) -pysense (1) -pysense: Humanoid Robots, a Wearable System, and Python (1) -python games (1) -python implementation talks (1) -success stories from enterprise and high performance/demanding applications (1) -tools available for developers (1) -wxPython (3) + +:: + + Usage of new/advanced python features (12) + Python Best Practices (3) + Design Patterns in Python (3) + Anything Alex Martelli wants to talk about. (3) + Advanced Python: metaclasses, descriptors, decorators (3) + Strategies for integrating C and Python (2) + Problems with python (2) + Iterators and Generators (2) + Ways to improve performance of Python code (1) + Standard library gems/ unsung modules (1) + Python Language perspective from non-Guido PEP members (1) + Py3K (1) + More on Python internals (1) + Language howtos (I really enjoyed Alex Martelli's talk last year on itertools) (1) + Getting started hacking python source (1) + Decimal for Experts (1) + Better Development Practices with Python (1) + Being more productive with Python (1) + + +What 3 topics would you like to see repeated next year? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + A Game-Free Introduction to PyGame (1) + AJAX (1) + AST (1) + Agile Testing (3) + An actual eggs presentation (1) + Basic talk on good python programming practices (1) + Bazaar-ng (1) + Breadth and Depth of python (eg. Pysense) (1) + Buildbot (1) + Chandler-related talks (1) + Dabo (3) + Doctutils (1) + Docutils development tutorial (1) + Eggs (1) + Eggs/Setuptools information/howto (1) + Frameworks (1) + Funding for projects (1) + Further application development talks (1) + Getting Started with wxPython (1) + I would do a pyparsing follow-up if there is interest (1) + Implementation of the Python Bytecode Compiler (1) + Interpreter/Language changes, new implementations (1) + IronPython (5) + IronPython (more at basic level (e.g. forms, doing simple com scripting, etc) (1) + Large scale systems (1) + Lightning Talks (7) + MIT Robotics project update (1) + More Series 60 (1) + More testing talks (1) + More wxPython stuff (1) + NerdBooks Party! :-) (1) + New applications of python (1) + Origins of Python for newcomers (1) + Overview talks on the history and future of python (1) + PyGTk (1) + PyGame intro (1) + PyParsing (1) + PyPy (8) + PySense (1) + Python GUI Frameworks (1) + Python Internals (1) + Python Language from Guido's perspective (10) + Python for Series 60 (1) + Python in the Enterprise (anything showing Python rocking!) (1) + Python on Mobile devices (1) + Python on embedded systems like the Nokia S60 (1) + Real-world examples: how Python is used in the workplace (1) + SFWMI Hydrology project update (1) + Scripting .NET with IronPython (1) + State of Dabo (1) + State of the Python Universe (1) + Teaching Python (1) + Testing (4) + Testing and agile development (4) + Twisted (3) + Unicode (1) + Unicode (1) + py.* talks (1) + py2exe (1) + pysense (1) + pysense: Humanoid Robots, a Wearable System, and Python (1) + python games (1) + python implementation talks (1) + success stories from enterprise and high performance/demanding applications (1) + tools available for developers (1) + wxPython (3) Web stuff --------- -Ajax (1) -Any web development talks (1) -Anything TurboGears (1) -Django (5) -Frameworks - Django, Turbogears (1) -General web topics (4) -Plone (1) -State of Zope (1) -Turbogears (5) -Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (1) -Using Django to supercharge Web development (1) -Web and application testing (1) -Web app frameworks (2) -Web applications (Django/Turbo gear/Webware) (1) -Web development (Django) (1) -Web frameworks (1) -Web frameworks update (Django/TurboGears/Zope) (1) -WebOff III (1) -Zope 3 (1) -Zope development (1) -Zope-related talks (1) - - -Question: Where did you stay? -91% Hotel (72) - 4% Am local resident (3) - 1% Hostel (1) - 4% With friends (3) - - -Question: If you stayed at a hotel other than the conference hotel, what was its name? -Crowne Plaza (1) -Comfort Inn (1) -Super 8 (1) - - -Question: Would you recommend the hotel to other attendees? -True (60) - - -Question: What is your maximum per-person nightly room budget for accommodations? -21% $75 or less (15) -36% $100 (25) -21% $125 (15) -14% $150 (10) - 6% $200 (4) - 1% More than $200 (1) - - -Question: If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? -Washington DC (21) -Chicago (21) -San Francisco (15) -Boston (14) -New York City (13) -Portland, OR (9) -Seattle WA (7) -Bay Area (7) -San Antonio, TX (6) -Las Vegas, NV (6) -West Coast (5) -Denver, CO (5) -Austin, TX (5) -San Diego, CA (4) -New Orleans, LA (4) -Midwest (4) -East Coast (4) -Kansas City, MO (3) -Florida (3) -Atlanta, GA (3) -San Jose CA (2) -Phoenix (2) -Orlando, FL (2) -North Carolina (2) -Minneapolis (2) -Los Angeles (2) -California (2) -Baltimore, MD (2) -Virginia (1) -Vancouver (1) -Toronto, ON (1) -Texas (1) -Tampa, FL (ibid) (1) -SoCal (1) -San-Francisco (1) -Rockwall, TX (1) -RTP, NC (1) -Northern VA (1) -New Mexico (1) -New England (1) -Mars (1) -Little Rock (1) -Irvine, CA (1) -Houston, TX (1) -Fort Worth TX (1) -Europe (1) -Columbus, OH (1) -Colorado (1) -Atlantic City, NJ (1) -Anywhere in Oregon (1) - -no preference (1) - - - -Question: Would you be interested in attending half-day (3-hour) tutorials next year? -32% False (24) -52% True (52) - - -Question: How much would you be willing to pay for a half-day (3 hour) tutorial? -11% Nothing (7) -13% $25 (8) -34% $50 (21) -33% $100 (20) - 8% $150 (5) - - -Question: If yes, please list 3 tutorial subjects you would like to attend: -Django (8) -Web development (7) -Agile development and testing (7) -Advanced Language Features (7) -wxPython (5) -Twisted (5) -TurboGears (4) -Text/Data Processing (4) -Scientific computing (4) -Advanced wxPython (4) -Python on embedded devices (3) -GUI Development (3) -Zope (2) -SQLAlchemy and ORM tools (2) -Python and Databases (2) -Plone (2) -Network programming, with case study/mock application. (2) -IronPython (2) -Introduction to Object Oriented Programming (2) -Dabo (2) -Advanced Zope3 (2) -Advanced Twisted (2) -Zope dev setup (1) -Zope 3 Component Development Practices (1) -Tk GUI building (1) -Python gaming (1) -Python 301: An unscripted Q&A (should have pre-con questions/topics) (1) -Python 103 -special topics (i.e. iterators and generators) (1) -Python & XML (1) -PyObjC (1) -One of the popular web frameworks (1) -Object Oriented Design Patterns (1) -NumPy (1) -New features of Python for 2.5 (and a review of new features for 2.4) (1) -Mod Python (1) -MetaProgramming (1) -Managing Projects with Python (1) -Making effective use of WSGI (1) -Library Design/Structure (1) -Latest Dev Practices (1) -Large scale systems (1) -Intro to Audio Synthesis? (or something like that) (1) -Intermediate Python (1) -Implementing pluggable architectures (1) -Extending & integrating trac (1) -Embedding python as a scripting language, with case study/mock application. (1) -Creating Cocoa apps in PyObjC (1) -Constraint Based Local Searching (1) -Building SWIG/ctypes Interfaces to other people's code (1) -Beginning Graphics a la GTK (1) -AJAX with Python (1) +:: -Question: Other comments: + Ajax (1) + Any web development talks (1) + Anything TurboGears (1) + Django (5) + Frameworks - Django, Turbogears (1) + General web topics (4) + Plone (1) + State of Zope (1) + Turbogears (5) + Updated presos on state of Django/TurboGears/WSGI/Rails/web.py/etc (1) + Using Django to supercharge Web development (1) + Web and application testing (1) + Web app frameworks (2) + Web applications (Django/Turbo gear/Webware) (1) + Web development (Django) (1) + Web frameworks (1) + Web frameworks update (Django/TurboGears/Zope) (1) + WebOff III (1) + Zope 3 (1) + Zope development (1) + Zope-related talks (1) + + +Where did you stay? +'''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 91% Hotel (72) + 4% Am local resident (3) + 1% Hostel (1) + 4% With friends (3) + + +If you stayed at a hotel other than the conference hotel, what was its name? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + Crowne Plaza (1) + Comfort Inn (1) + Super 8 (1) + + +Would you recommend the hotel to other attendees? +'''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + True (60) + + +What is your maximum per-person nightly room budget for accommodations? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 21% $75 or less (15) + 36% $100 (25) + 21% $125 (15) + 14% $150 (10) + 6% $200 (4) + 1% More than $200 (1) + + +If PyCon were not to be in Dallas TX, what 3 cities/regions would you prefer? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + Washington DC (21) + Chicago (21) + San Francisco (15) + Boston (14) + New York City (13) + Portland, OR (9) + Seattle WA (7) + Bay Area (7) + San Antonio, TX (6) + Las Vegas, NV (6) + West Coast (5) + Denver, CO (5) + Austin, TX (5) + San Diego, CA (4) + New Orleans, LA (4) + Midwest (4) + East Coast (4) + Kansas City, MO (3) + Florida (3) + Atlanta, GA (3) + San Jose CA (2) + Phoenix (2) + Orlando, FL (2) + North Carolina (2) + Minneapolis (2) + Los Angeles (2) + California (2) + Baltimore, MD (2) + Virginia (1) + Vancouver (1) + Toronto, ON (1) + Texas (1) + Tampa, FL (ibid) (1) + SoCal (1) + San-Francisco (1) + Rockwall, TX (1) + RTP, NC (1) + Northern VA (1) + New Mexico (1) + New England (1) + Mars (1) + Little Rock (1) + Irvine, CA (1) + Houston, TX (1) + Fort Worth TX (1) + Europe (1) + Columbus, OH (1) + Colorado (1) + Atlantic City, NJ (1) + Anywhere in Oregon (1) + + no preference (1) + + + +Would you be interested in attending half-day (3-hour) tutorials next year? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 32% False (24) + 52% True (52) + + +How much would you be willing to pay for a half-day (3 hour) tutorial? +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 11% Nothing (7) + 13% $25 (8) + 34% $50 (21) + 33% $100 (20) + 8% $150 (5) + + +If yes, please list 3 tutorial subjects you would like to attend: +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + Django (8) + Web development (7) + Agile development and testing (7) + Advanced Language Features (7) + wxPython (5) + Twisted (5) + TurboGears (4) + Text/Data Processing (4) + Scientific computing (4) + Advanced wxPython (4) + Python on embedded devices (3) + GUI Development (3) + Zope (2) + SQLAlchemy and ORM tools (2) + Python and Databases (2) + Plone (2) + Network programming, with case study/mock application. (2) + IronPython (2) + Introduction to Object Oriented Programming (2) + Dabo (2) + Advanced Zope3 (2) + Advanced Twisted (2) + Zope dev setup (1) + Zope 3 Component Development Practices (1) + Tk GUI building (1) + Python gaming (1) + Python 301: An unscripted Q&A (should have pre-con questions/topics) (1) + Python 103 -special topics (i.e. iterators and generators) (1) + Python & XML (1) + PyObjC (1) + One of the popular web frameworks (1) + Object Oriented Design Patterns (1) + NumPy (1) + New features of Python for 2.5 (and a review of new features for 2.4) (1) + Mod Python (1) + MetaProgramming (1) + Managing Projects with Python (1) + Making effective use of WSGI (1) + Library Design/Structure (1) + Latest Dev Practices (1) + Large scale systems (1) + Intro to Audio Synthesis? (or something like that) (1) + Intermediate Python (1) + Implementing pluggable architectures (1) + Extending & integrating trac (1) + Embedding python as a scripting language, with case study/mock application. (1) + Creating Cocoa apps in PyObjC (1) + Constraint Based Local Searching (1) + Building SWIG/ctypes Interfaces to other people's code (1) + Beginning Graphics a la GTK (1) + AJAX with Python (1) ----- + +Other comments +'''''''''''''''''' The wxPython tutorial was great! I want a sequel. @@ -699,65 +751,94 @@ I'd like to learn to use a specific part of Python for applications on Linux, not just overviews of apps written in Python. -Question: What days did you attend PyCon? +What days did you attend PyCon? +'''''''''''''''''''''''''''''''''''''''''''''''''' + Sunday (74) Friday (78) Saturday (77) -Question: Please rate your overall satisfaction with PyCon 2006. -34% very high (27) -60% high (48) - 6% low (5) +Please rate your overall satisfaction with PyCon 2006 +''''''''''''''''''''''''''''''''''''''''''''''''''''''' +:: -Question: Please rate your overall satisfaction with the keynotes. -25% very high (20) -54% high (43) -20% low (16) + 34% very high (27) + 60% high (48) + 6% low (5) -Question: Please rate your overall satisfaction with the talks. -14% very high (11) -70% high (55) -16% low (13) +Please rate your overall satisfaction with the keynotes +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +:: -Question: Please rate your overall satisfaction with the network. - 3% very high (2) -15% high (11) -38% low (27) -44% very low (31) + 25% very high (20) + 54% high (43) + 20% low (16) -Question: Please rate your overall satisfaction with the food. -19% very high (19) -62% high (48) - 9% low (9) - 1% very low (1) +Please rate your overall satisfaction with the talks. +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +:: -Question: Please rate your likelihood of attending next year. -45% very high (35) -38% high (30) -15% low (12) - 1% very low (1) + 14% very high (11) + 70% high (55) + 16% low (13) -Question: Would you prefer a conference that took place: +Please rate your overall satisfaction with the network. +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -just as it was (1) -better to end on a weekend, this years way worked (1) -This was a good schedule (1) -not important (1) +:: -22% Includes one weekend day (starts on Sunday or ends on Saturday) (15) -23% Only on weekdays (16) -55% Includes two weekend days (38) + 3% very high (2) + 15% high (11) + 38% low (27) + 44% very low (31) -Question: How can we improve PyCon next year? ----- +Please rate your overall satisfaction with the food. +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 19% very high (19) + 62% high (48) + 9% low (9) + 1% very low (1) + + +Please rate your likelihood of attending next year. +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + 45% very high (35) + 38% high (30) + 15% low (12) + 1% very low (1) + + +Would you prefer a conference that took place: +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +:: + + just as it was (1) + better to end on a weekend, this years way worked (1) + This was a good schedule (1) + not important (1) + + 22% Includes one weekend day (starts on Sunday or ends on Saturday) (15) + 23% Only on weekdays (16) + 55% Includes two weekend days (38) + + +How can we improve PyCon next year? +''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' The current location felt fairly isolated from the outside world -- I would prefer a more urban location, however the hotel environment @@ -1009,6 +1090,7 @@ * seamless wifi access Otherwise I had a great time and will be back next year for sure!!! Good job to all involved. + ---- Since it will be at the same venue... From python-checkins at python.org Tue Mar 14 07:02:19 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 14 Mar 2006 07:02:19 +0100 (CET) Subject: [Python-checkins] r43022 - in python/trunk: Modules/xxmodule.c Objects/object.c Message-ID: <20060314060219.856311E4007@bag.python.org> Author: neal.norwitz Date: Tue Mar 14 07:02:16 2006 New Revision: 43022 Modified: python/trunk/Modules/xxmodule.c python/trunk/Objects/object.c Log: Fix and test (manually w/xx module) passing NULLs to PyObject_Str() and PyObject_Unicode(). This problem was originally reported from Coverity and addresses mail on python-dev "checkin r43015". This inlines the conversion of the string to unicode and cleans up/simplifies some code at the end of the PyObject_Unicode(). We really need a complete C API test module for all public APIs and passing good and bad parameter values. Will backport. Modified: python/trunk/Modules/xxmodule.c ============================================================================== --- python/trunk/Modules/xxmodule.c (original) +++ python/trunk/Modules/xxmodule.c Tue Mar 14 07:02:16 2006 @@ -197,6 +197,18 @@ return Py_None; } +/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ + +static PyObject * +xx_null(PyObject *self, PyObject *noargs) +{ + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); + PyObject *tuple = PyTuple_Pack(2, o1, o2); + Py_XDECREF(o1); + Py_XDECREF(o2); + return tuple; +} + /* Test bad format character */ static PyObject * @@ -331,6 +343,8 @@ PyDoc_STR("new() -> new Xx object")}, {"bug", xx_bug, METH_VARARGS, PyDoc_STR("bug(o) -> None")}, + {"null", xx_null, METH_NOARGS, + PyDoc_STR("null(o) -> ('NULL', u'NULL')")}, {NULL, NULL} /* sentinel */ }; Modified: python/trunk/Objects/object.c ============================================================================== --- python/trunk/Objects/object.c (original) +++ python/trunk/Objects/object.c Tue Mar 14 07:02:16 2006 @@ -400,10 +400,16 @@ { PyObject *res; PyObject *func; + PyObject *str; static PyObject *unicodestr; if (v == NULL) { res = PyString_FromString(""); + if (res == NULL) + return NULL; + str = PyUnicode_FromEncodedObject(res, NULL, "strict"); + Py_DECREF(res); + return str; } else if (PyUnicode_CheckExact(v)) { Py_INCREF(v); return v; @@ -443,13 +449,9 @@ if (res == NULL) return NULL; if (!PyUnicode_Check(res)) { - PyObject *str; str = PyUnicode_FromEncodedObject(res, NULL, "strict"); Py_DECREF(res); - if (str) - res = str; - else - return NULL; + res = str; } return res; } From python-checkins at python.org Tue Mar 14 07:10:23 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 14 Mar 2006 07:10:23 +0100 (CET) Subject: [Python-checkins] r43023 - in python/branches/release24-maint: Modules/xxmodule.c Objects/object.c Message-ID: <20060314061023.058B31E4007@bag.python.org> Author: neal.norwitz Date: Tue Mar 14 07:10:22 2006 New Revision: 43023 Modified: python/branches/release24-maint/Modules/xxmodule.c python/branches/release24-maint/Objects/object.c Log: Backport 43022: Fix and test (manually w/xx module) passing NULLs to PyObject_Str() and PyObject_Unicode(). This problem was originally reported from Coverity and addresses mail on python-dev "checkin r43015". This inlines the conversion of the string to unicode and cleans up/simplifies some code at the end of the PyObject_Unicode(). We really need a complete C API test module for all public APIs and passing good and bad parameter values. Modified: python/branches/release24-maint/Modules/xxmodule.c ============================================================================== --- python/branches/release24-maint/Modules/xxmodule.c (original) +++ python/branches/release24-maint/Modules/xxmodule.c Tue Mar 14 07:10:22 2006 @@ -197,6 +197,18 @@ return Py_None; } +/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ + +static PyObject * +xx_null(PyObject *self, PyObject *noargs) +{ + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); + PyObject *tuple = PyTuple_Pack(2, o1, o2); + Py_XDECREF(o1); + Py_XDECREF(o2); + return tuple; +} + /* Test bad format character */ static PyObject * @@ -331,6 +343,8 @@ PyDoc_STR("new() -> new Xx object")}, {"bug", xx_bug, METH_VARARGS, PyDoc_STR("bug(o) -> None")}, + {"null", xx_null, METH_NOARGS, + PyDoc_STR("null(o) -> ('NULL', u'NULL')")}, {NULL, NULL} /* sentinel */ }; Modified: python/branches/release24-maint/Objects/object.c ============================================================================== --- python/branches/release24-maint/Objects/object.c (original) +++ python/branches/release24-maint/Objects/object.c Tue Mar 14 07:10:22 2006 @@ -373,9 +373,15 @@ PyObject_Unicode(PyObject *v) { PyObject *res; + PyObject *str; if (v == NULL) { res = PyString_FromString(""); + if (res == NULL) + return NULL; + str = PyUnicode_FromEncodedObject(res, NULL, "strict"); + Py_DECREF(res); + return str; } else if (PyUnicode_CheckExact(v)) { Py_INCREF(v); return v; @@ -418,13 +424,9 @@ if (res == NULL) return NULL; if (!PyUnicode_Check(res)) { - PyObject *str; str = PyUnicode_FromEncodedObject(res, NULL, "strict"); Py_DECREF(res); - if (str) - res = str; - else - return NULL; + res = str; } return res; } From python-checkins at python.org Tue Mar 14 07:47:07 2006 From: python-checkins at python.org (neal.norwitz) Date: Tue, 14 Mar 2006 07:47:07 +0100 (CET) Subject: [Python-checkins] r43024 - in python/branches/release24-maint: Lib/test/test_cmd_line.py Modules/main.c Message-ID: <20060314064707.BF29B1E4002@bag.python.org> Author: neal.norwitz Date: Tue Mar 14 07:47:07 2006 New Revision: 43024 Modified: python/branches/release24-maint/Lib/test/test_cmd_line.py python/branches/release24-maint/Modules/main.c Log: Backport 42932: Try to be a bit more consistent on all platforms: python . python < . both print a message, return non-zero and do not core dump. This hopefully fixes the failure on Solaris. Modified: python/branches/release24-maint/Lib/test/test_cmd_line.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_cmd_line.py (original) +++ python/branches/release24-maint/Lib/test/test_cmd_line.py Tue Mar 14 07:47:07 2006 @@ -16,14 +16,8 @@ return subprocess.call([sys.executable, cmd_line], stderr=subprocess.PIPE) def test_directories(self): - if sys.platform == 'win32': - # Exit code for "python .", Error 13: permission denied = 2 - expected_exit_code = 2 - else: - # Linux has no problem with "python .", Exit code = 0 - expected_exit_code = 0 - self.assertEqual(self.exit_code('.'), expected_exit_code) - self.assertTrue(self.exit_code('< .') != 0) + self.assertNotEqual(self.exit_code('.'), 0) + self.assertNotEqual(self.exit_code('< .'), 0) def verify_valid_flag(self, cmd_line): data = self.start_python(cmd_line) Modified: python/branches/release24-maint/Modules/main.c ============================================================================== --- python/branches/release24-maint/Modules/main.c (original) +++ python/branches/release24-maint/Modules/main.c Tue Mar 14 07:47:07 2006 @@ -364,7 +364,8 @@ struct stat sb; if (fstat(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) { - fprintf(stderr, "%s: warning '%s' is a directory\n", argv[0], filename); + fprintf(stderr, "%s: '%s' is a directory, cannot continue\n", argv[0], filename); + return 1; } } } From mal at egenix.com Tue Mar 14 10:13:48 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Tue, 14 Mar 2006 10:13:48 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> Message-ID: <4416894C.7090304@egenix.com> Thomas Wouters wrote: > On 3/13/06, M.-A. Lemburg wrote: >> Martin v. L?wis wrote: >>> M.-A. Lemburg wrote: >>>> [German] >>> [German] > > [German] > > > Not that I have objections to unicode-related discussions taking place in > German (I can follow it quite nicely myself, anyway, and I don't know who > else would be interested) I wonder if you both realize that this email > conversation is going to python-checkins, and not to just you two? :) Actually, I wasn't aware of that... the CC says: "martin.v.loewis ". Sorry for that. In summary, I was asking Martin why he made things more complicated by introducing a new lookup object and keeping the diffs between Unicode 3.2 and 4.1 in the same module instead of simply creating a separate module for the old 3.2 support and then have the standard unicodedata module use the 4.1 version. Now we have two versions of the database in a single module and if we want to upgrade to a new version in the future the path taken by Martin now would have to be repeated, adding more complexity. Deprecation of an old version would not be user friendly, since you can't warn on import, only on use of the lookup object. Adding support for new features in the Unicode database would also be unnecessarily complicated, since the old versions won't provide the needed input data. Having two separate modules solves all these issues and also allows phasing out 3.2 support in the future (and letting users who still need it, keep it around by simply compiling the module for themselves). Currently, the only reason to keep 3.2 support around seems to be the IDNA encoding (RFC 3490) which relies on stringprep (RFC 3454) which is only defined for Unicode 3.2.0. It is however likely that the stringprep RFC will get updated to later versions: "This document is for Unicode version 3.2, and should not be considered to automatically apply to later Unicode versions. The IETF, through an explicit standards action, may update this document as appropriate to handle later Unicode versions." -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 14 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From mal at egenix.com Tue Mar 14 10:39:14 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Tue, 14 Mar 2006 10:39:14 +0100 Subject: [Python-checkins] r43022 - in python/trunk: Modules/xxmodule.c Objects/object.c In-Reply-To: <20060314060219.856311E4007@bag.python.org> References: <20060314060219.856311E4007@bag.python.org> Message-ID: <44168F42.6040102@egenix.com> neal.norwitz wrote: > Author: neal.norwitz > Date: Tue Mar 14 07:02:16 2006 > New Revision: 43022 > > Modified: > python/trunk/Modules/xxmodule.c > python/trunk/Objects/object.c > Log: > Fix and test (manually w/xx module) passing NULLs to PyObject_Str() and > PyObject_Unicode(). This problem was originally reported from Coverity > and addresses mail on python-dev "checkin r43015". > > This inlines the conversion of the string to unicode and cleans > up/simplifies some code at the end of the PyObject_Unicode(). > > We really need a complete C API test module for all public APIs > and passing good and bad parameter values. Why do you add these things to the xx module and not the _testcapi module where these things should live ? AFAIK, the xx module is intended to serve as example to users who want to write a Python extension. > Will backport. > > > Modified: python/trunk/Modules/xxmodule.c > ============================================================================== > --- python/trunk/Modules/xxmodule.c (original) > +++ python/trunk/Modules/xxmodule.c Tue Mar 14 07:02:16 2006 > @@ -197,6 +197,18 @@ > return Py_None; > } > > +/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ > + > +static PyObject * > +xx_null(PyObject *self, PyObject *noargs) > +{ > + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); > + PyObject *tuple = PyTuple_Pack(2, o1, o2); > + Py_XDECREF(o1); > + Py_XDECREF(o2); > + return tuple; > +} > + > /* Test bad format character */ > > static PyObject * > @@ -331,6 +343,8 @@ > PyDoc_STR("new() -> new Xx object")}, > {"bug", xx_bug, METH_VARARGS, > PyDoc_STR("bug(o) -> None")}, > + {"null", xx_null, METH_NOARGS, > + PyDoc_STR("null(o) -> ('NULL', u'NULL')")}, > {NULL, NULL} /* sentinel */ > }; > > > Modified: python/trunk/Objects/object.c > ============================================================================== > --- python/trunk/Objects/object.c (original) > +++ python/trunk/Objects/object.c Tue Mar 14 07:02:16 2006 > @@ -400,10 +400,16 @@ > { > PyObject *res; > PyObject *func; > + PyObject *str; > static PyObject *unicodestr; > > if (v == NULL) { > res = PyString_FromString(""); > + if (res == NULL) > + return NULL; > + str = PyUnicode_FromEncodedObject(res, NULL, "strict"); > + Py_DECREF(res); > + return str; > } else if (PyUnicode_CheckExact(v)) { > Py_INCREF(v); > return v; > @@ -443,13 +449,9 @@ > if (res == NULL) > return NULL; > if (!PyUnicode_Check(res)) { > - PyObject *str; > str = PyUnicode_FromEncodedObject(res, NULL, "strict"); > Py_DECREF(res); > - if (str) > - res = str; > - else > - return NULL; > + res = str; > } > return res; > } > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 14 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From neal at metaslash.com Tue Mar 14 10:55:18 2006 From: neal at metaslash.com (Neal Norwitz) Date: Tue, 14 Mar 2006 04:55:18 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060314095518.GA28188@python.psfb.org> test_compiler leaked [18, 279, 22] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_threadedtempfile leaked [1, 1, 1] references test_threading leaked [1, 1, 0] references test_threading_local leaked [27, 27, 33] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [65, 64, 65] references From neal at metaslash.com Tue Mar 14 11:07:56 2006 From: neal at metaslash.com (Neal Norwitz) Date: Tue, 14 Mar 2006 05:07:56 -0500 Subject: [Python-checkins] Python Regression Test Failures all (1) Message-ID: <20060314100756.GA29825@python.psfb.org> test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 Exception in thread reader 4: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') Exception in thread reader 0: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') Exception in thread reader 3: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') Exception in thread reader 1: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') Exception in thread writer 0: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 254, in writerThread self.assertEqual(data, self.makeData(key)) File "/home/neal/python/trunk/Lib/unittest.py", line 334, in failUnlessEqual (msg or '%r != %r' % (first, second)) AssertionError: None != '0004-0004-0004-0004-0004' Exception in thread writer 1: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 254, in writerThread self.assertEqual(data, self.makeData(key)) File "/home/neal/python/trunk/Lib/unittest.py", line 334, in failUnlessEqual (msg or '%r != %r' % (first, second)) AssertionError: None != '1007-1007-1007-1007-1007' test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test test_compiler failed -- Traceback (most recent call last): File "/home/neal/python/trunk/Lib/test/test_compiler.py", line 36, in testCompileLibrary compiler.compile(buf, basename, "exec") File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 64, in compile gen.compile() File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 112, in compile gen = ModuleCodeGenerator(tree) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 1288, in __init__ walk(tree, self) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 350, in visitModule self.visit(node.node) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 401, in visitClass walk(node.code, gen) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 362, in visitFunction self._visitFuncOrLambda(node, isLambda=0) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 380, in _visitFuncOrLambda walk(node.code, gen) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 106, in walk walker.preorder(tree, visitor) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 63, in preorder self.dispatch(tree, *args) # XXX *args make sense? File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 40, in default self.dispatch(child, *args) File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 995, in visitAugAssign self.visit(aug_node, "load") File "/home/neal/python/trunk/Lib/compiler/visitor.py", line 57, in dispatch return meth(node, *args) File "/home/neal/python/trunk/Lib/compiler/pycodegen.py", line 1049, in visitAugSubscript raise SyntaxError, "augmented assignment to tuple is not possible" SyntaxError: augmented assignment to tuple is not possible test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_hashlib_speed test_hashlib_speed skipped -- not a unit test (stand alone benchmark) test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9258 refs] [9258 refs] [9258 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [9453 refs] [9453 refs] test_random test_re test_regex test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socketserver test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9253 refs] [9255 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9253 refs] [9254 refs] [9254 refs] [9253 refs] [9254 refs] [9253 refs] [9470 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] [9254 refs] this bit of output is from a test of stdout in a different process ... [9254 refs] [9253 refs] [9470 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9253 refs] [9253 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9255 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllibnet test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 284 tests OK. 1 test failed: test_compiler 21 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_cd test_cl test_gl test_hashlib_speed test_imgfile test_ioctl test_macfs test_macostools test_nis test_pep277 test_plistlib test_scriptpackages test_sunaudiodev test_tcl test_unicode_file test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [387900 refs] From python-checkins at python.org Tue Mar 14 14:21:14 2006 From: python-checkins at python.org (nick.coghlan) Date: Tue, 14 Mar 2006 14:21:14 +0100 (CET) Subject: [Python-checkins] r43025 - python/trunk/Lib/compiler/pycodegen.py Message-ID: <20060314132114.D6EC51E4008@bag.python.org> Author: nick.coghlan Date: Tue Mar 14 14:21:14 2006 New Revision: 43025 Modified: python/trunk/Lib/compiler/pycodegen.py Log: Teach the compiler module about augmented assignment to tuple subscripts Modified: python/trunk/Lib/compiler/pycodegen.py ============================================================================== --- python/trunk/Lib/compiler/pycodegen.py (original) +++ python/trunk/Lib/compiler/pycodegen.py Tue Mar 14 14:21:14 2006 @@ -1045,8 +1045,6 @@ self.emit('STORE_SLICE+%d' % slice) def visitAugSubscript(self, node, mode): - if len(node.subs) > 1: - raise SyntaxError, "augmented assignment to tuple is not possible" if mode == "load": self.visitSubscript(node, 1) elif mode == "store": @@ -1151,10 +1149,10 @@ self.visit(node.expr) for sub in node.subs: self.visit(sub) - if aug_flag: - self.emit('DUP_TOPX', 2) if len(node.subs) > 1: self.emit('BUILD_TUPLE', len(node.subs)) + if aug_flag: + self.emit('DUP_TOPX', 2) if node.flags == 'OP_APPLY': self.emit('BINARY_SUBSCR') elif node.flags == 'OP_ASSIGN': From python-checkins at python.org Tue Mar 14 20:53:10 2006 From: python-checkins at python.org (thomas.heller) Date: Tue, 14 Mar 2006 20:53:10 +0100 (CET) Subject: [Python-checkins] r43026 - python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callproc.c python/trunk/Modules/_ctypes/ctypes.h Message-ID: <20060314195310.35E0F1E4008@bag.python.org> Author: thomas.heller Date: Tue Mar 14 20:53:09 2006 New Revision: 43026 Modified: python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callproc.c python/trunk/Modules/_ctypes/ctypes.h Log: Integrate patch from Neal Norwitz. He writes: """ The attached patch fixes all the ctypes tests so they pass on amd64. It also fixes several warnings. I'm not sure what else to do with the patch. Let me know how you want to handle these in the future. I'm not sure the patch is 100% correct. You will need to decide what can be 64 bits and what can't. I believe sq_{item,slice,ass_item,ass_slice} all need to use Py_ssize_t. The types in ctypes.h may not require all the changes I made. I don't know how you want to support older version, so I unconditionally changed the types to Py_ssize_t. """ The patch is also in the ctypes SVN repository now, after small changes to add compatibility with older Python versions. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Tue Mar 14 20:53:09 2006 @@ -335,7 +335,7 @@ }; static PyObject * -CDataType_repeat(PyObject *self, int length) +CDataType_repeat(PyObject *self, Py_ssize_t length) { return CreateArrayType(self, length); } @@ -695,7 +695,7 @@ CharArray_set_raw(CDataObject *self, PyObject *value) { char *ptr; - int size; + Py_ssize_t size; if (PyBuffer_Check(value)) { size = value->ob_type->tp_as_buffer->bf_getreadbuffer(value, 0, (void *)&ptr); if (size < 0) @@ -1789,13 +1789,11 @@ { char string[256]; /* XXX is that enough? */ char *cp = string; - int len; *cp++ = index + '0'; while (target->b_base) { *cp++ = target->b_index + '0'; target = target->b_base; } - len = cp - string; return PyString_FromStringAndSize(string, cp-string); } /* Keep a reference to 'keep' in the 'target', at index 'index' */ @@ -1806,7 +1804,7 @@ * key int the root object's _objects dict. */ static int -KeepRef(CDataObject *target, int index, PyObject *keep) +KeepRef(CDataObject *target, Py_ssize_t index, PyObject *keep) { int result; CDataObject *ob; @@ -1875,7 +1873,7 @@ { NULL }, }; -static int CData_GetBuffer(CDataObject *self, int seg, void **pptr) +static Py_ssize_t CData_GetBuffer(CDataObject *self, Py_ssize_t seg, void **pptr) { if (seg != 0) { /* Hm. Must this set an exception? */ @@ -1885,7 +1883,7 @@ return self->b_size; } -static int CData_GetSegcount(CDataObject *self, int *lenp) +static Py_ssize_t CData_GetSegcount(CDataObject *self, Py_ssize_t *lenp) { if (lenp) *lenp = 1; @@ -1893,10 +1891,10 @@ } static PyBufferProcs CData_as_buffer = { - (getreadbufferproc)CData_GetBuffer, - (getwritebufferproc)CData_GetBuffer, - (getsegcountproc)CData_GetSegcount, - (getcharbufferproc)NULL, + (readbufferproc)CData_GetBuffer, + (writebufferproc)CData_GetBuffer, + (segcountproc)CData_GetSegcount, + (charbufferproc)NULL, }; /* @@ -1985,7 +1983,7 @@ } PyObject * -CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr) +CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr) { CDataObject *cmem; StgDictObject *dict; @@ -2064,7 +2062,7 @@ PyObject * CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, - int index, int size, char *adr) + Py_ssize_t index, Py_ssize_t size, char *adr) { StgDictObject *dict; if (getfunc) @@ -2081,7 +2079,7 @@ */ static PyObject * _CData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, - int size, char *ptr) + Py_ssize_t size, char *ptr) { CDataObject *src; @@ -2177,7 +2175,7 @@ */ int CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, - int index, int size, char *ptr) + Py_ssize_t index, Py_ssize_t size, char *ptr) { CDataObject *mem = (CDataObject *)dst; PyObject *result; @@ -3318,7 +3316,7 @@ if (kwds) { PyObject *key, *value; - int pos = 0; + Py_ssize_t pos = 0; while(PyDict_Next(kwds, &pos, &key, &value)) { if (-1 == PyObject_SetAttr(self, key, value)) return -1; @@ -3471,12 +3469,12 @@ } static PyObject * -Array_slice(CDataObject *self, int ilow, int ihigh) +Array_slice(CDataObject *self, Py_ssize_t ilow, Py_ssize_t ihigh) { StgDictObject *stgdict, *itemdict; PyObject *proto; PyListObject *np; - int i, len; + Py_ssize_t i, len; if (ilow < 0) ilow = 0; @@ -3587,13 +3585,13 @@ } static PySequenceMethods Array_as_sequence = { - (inquiry)Array_length, /* sq_length; */ + (lenfunc)Array_length, /* sq_length; */ 0, /* sq_concat; */ 0, /* sq_repeat; */ - (intargfunc)Array_item, /* sq_item; */ - (intintargfunc)Array_slice, /* sq_slice; */ - (intobjargproc)Array_ass_item, /* sq_ass_item; */ - (intintobjargproc)Array_ass_slice, /* sq_ass_slice; */ + (ssizeargfunc)Array_item, /* sq_item; */ + (ssizessizeargfunc)Array_slice, /* sq_slice; */ + (ssizeobjargproc)Array_ass_item, /* sq_ass_item; */ + (ssizessizeobjargproc)Array_ass_slice, /* sq_ass_slice; */ 0, /* sq_contains; */ 0, /* sq_inplace_concat; */ @@ -3664,7 +3662,7 @@ }; PyObject * -CreateArrayType(PyObject *itemtype, int length) +CreateArrayType(PyObject *itemtype, Py_ssize_t length) { static PyObject *cache; PyObject *key; @@ -3676,7 +3674,7 @@ if (cache == NULL) return NULL; } - key = Py_BuildValue("(Oi)", itemtype, length); + key = Py_BuildValue("(On)", itemtype, length); if (!key) return NULL; result = PyDict_GetItem(cache, key); @@ -3691,11 +3689,16 @@ "Expected a type object"); return NULL; } - sprintf(name, "%.200s_Array_%d", +#ifdef MS_WIN64 + sprintf(name, "%.200s_Array_%Id", ((PyTypeObject *)itemtype)->tp_name, length); +#else + sprintf(name, "%.200s_Array_%ld", + ((PyTypeObject *)itemtype)->tp_name, (long)length); +#endif result = PyObject_CallFunction((PyObject *)&ArrayType_Type, - "s(O){s:i,s:O}", + "s(O){s:n,s:O}", name, &Array_Type, "_length_", @@ -3869,7 +3872,7 @@ name = PyString_FromString(self->ob_type->tp_name); if (name == NULL) { - Py_DECREF(name); + Py_DECREF(val); return NULL; } @@ -4101,12 +4104,12 @@ } static PyObject * -Pointer_slice(CDataObject *self, int ilow, int ihigh) +Pointer_slice(CDataObject *self, Py_ssize_t ilow, Py_ssize_t ihigh) { PyListObject *np; StgDictObject *stgdict, *itemdict; PyObject *proto; - int i, len; + Py_ssize_t i, len; if (ilow < 0) ilow = 0; @@ -4142,9 +4145,9 @@ 0, /* inquiry sq_length; */ 0, /* binaryfunc sq_concat; */ 0, /* intargfunc sq_repeat; */ - (intargfunc)Pointer_item, /* intargfunc sq_item; */ - (intintargfunc)Pointer_slice, /* intintargfunc sq_slice; */ - (intobjargproc)Pointer_ass_item, /* intobjargproc sq_ass_item; */ + (ssizeargfunc)Pointer_item, /* intargfunc sq_item; */ + (ssizessizeargfunc)Pointer_slice, /* intintargfunc sq_slice; */ + (ssizeobjargproc)Pointer_ass_item, /* intobjargproc sq_ass_item; */ 0, /* intintobjargproc sq_ass_slice; */ 0, /* objobjproc sq_contains; */ /* Added in release 2.0 */ @@ -4318,7 +4321,7 @@ #endif static PyObject * -string_at(const char *ptr, int size) +string_at(const char *ptr, Py_ssize_t size) { if (size == 0) return PyString_FromString(ptr); @@ -4336,7 +4339,7 @@ } #endif -DL_EXPORT(void) +PyMODINIT_FUNC init_ctypes(void) { PyObject *m; Modified: python/trunk/Modules/_ctypes/callproc.c ============================================================================== --- python/trunk/Modules/_ctypes/callproc.c (original) +++ python/trunk/Modules/_ctypes/callproc.c Tue Mar 14 20:53:09 2006 @@ -721,8 +721,9 @@ O_get), we have to call Py_DECREF because O_get has already called Py_INCREF. */ - if (dict->getfunc == getentry("O")->getfunc) + if (dict->getfunc == getentry("O")->getfunc) { Py_DECREF(retval); + } } else retval = CData_FromBaseObj(restype, NULL, 0, result); Modified: python/trunk/Modules/_ctypes/ctypes.h ============================================================================== --- python/trunk/Modules/_ctypes/ctypes.h (original) +++ python/trunk/Modules/_ctypes/ctypes.h Tue Mar 14 20:53:09 2006 @@ -50,9 +50,9 @@ char *b_ptr; /* pointer to memory block */ int b_needsfree; /* need _we_ free the memory? */ CDataObject *b_base; /* pointer to base object or NULL */ - int b_size; /* size of memory block in bytes */ - int b_length; /* number of references we need */ - int b_index; /* index of this object into base's + Py_ssize_t b_size; /* size of memory block in bytes */ + Py_ssize_t b_length; /* number of references we need */ + Py_ssize_t b_index; /* index of this object into base's b_object list */ PyObject *b_objects; /* list of references we need to keep */ union value b_value; @@ -64,9 +64,9 @@ char *b_ptr; /* pointer to memory block */ int b_needsfree; /* need _we_ free the memory? */ CDataObject *b_base; /* pointer to base object or NULL */ - int b_size; /* size of memory block in bytes */ - int b_length; /* number of references we need */ - int b_index; /* index of this object into base's + Py_ssize_t b_size; /* size of memory block in bytes */ + Py_ssize_t b_length; /* number of references we need */ + Py_ssize_t b_index; /* index of this object into base's b_object list */ PyObject *b_objects; /* list of references we need to keep */ union value b_value; @@ -94,8 +94,8 @@ #define StgDict_Check(v) PyObject_TypeCheck(v, &StgDict_Type) extern int StructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct); -extern int PyType_stginfo(PyTypeObject *self, int *psize, int *palign, int *plength); -extern int PyObject_stginfo(PyObject *self, int *psize, int *palign, int *plength); +extern int PyType_stginfo(PyTypeObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength); +extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength); @@ -118,7 +118,7 @@ int pack, int is_big_endian); extern PyObject *CData_AtAddress(PyObject *type, void *buf); -extern PyObject *CData_FromBytes(PyObject *type, char *data, int length); +extern PyObject *CData_FromBytes(PyObject *type, char *data, Py_ssize_t length); extern PyTypeObject ArrayType_Type; extern PyTypeObject Array_Type; @@ -137,7 +137,7 @@ #define StructTypeObject_Check(v) PyObject_TypeCheck(v, &StructType_Type) extern PyObject * -CreateArrayType(PyObject *itemtype, int length); +CreateArrayType(PyObject *itemtype, Py_ssize_t length); extern void init_callbacks_in_module(PyObject *m); @@ -164,9 +164,9 @@ typedef struct { PyObject_HEAD - int offset; - int size; - int index; /* Index into CDataObject's + Py_ssize_t offset; + Py_ssize_t size; + Py_ssize_t index; /* Index into CDataObject's object array */ PyObject *proto; /* a type or NULL */ GETFUNC getfunc; /* getter function if proto is NULL */ @@ -185,9 +185,9 @@ too much risk to change that now, and there are other fields which doen't belong into this structure anyway. Maybe in ctypes 2.0... (ctypes 2000?) */ - int size; /* number of bytes */ - int align; /* alignment requirements */ - int length; /* number of fields */ + Py_ssize_t size; /* number of bytes */ + Py_ssize_t align; /* alignment requirements */ + Py_ssize_t length; /* number of fields */ ffi_type ffi_type; PyObject *proto; /* Only for Pointer/ArrayObject */ SETFUNC setfunc; /* Only for simple objects */ @@ -298,17 +298,17 @@ extern PyObject * CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, - int index, int size, char *ptr); + Py_ssize_t index, Py_ssize_t size, char *ptr); extern int CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, - int index, int size, char *ptr); + Py_ssize_t index, Py_ssize_t size, char *ptr); extern void Extend_Error_Info(PyObject *exc_class, char *fmt, ...); struct basespec { CDataObject *base; - int index; + Py_ssize_t index; char *adr; }; @@ -374,7 +374,7 @@ extern void _AddTraceback(char *, char *, int); -extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr); +extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr); /* XXX better name needed! */ extern int IsSimpleSubType(PyObject *obj); From python-checkins at python.org Tue Mar 14 21:22:48 2006 From: python-checkins at python.org (thomas.heller) Date: Tue, 14 Mar 2006 21:22:48 +0100 (CET) Subject: [Python-checkins] r43027 - python/trunk/PCbuild/_ctypes.vcproj Message-ID: <20060314202248.B18C71E4008@bag.python.org> Author: thomas.heller Date: Tue Mar 14 21:22:47 2006 New Revision: 43027 Modified: python/trunk/PCbuild/_ctypes.vcproj Log: For x86 Release and Debug builds, remove the /Wp64 compiler flag, it is responsible for most (all?) of the warnings we get. Modified: python/trunk/PCbuild/_ctypes.vcproj ============================================================================== --- python/trunk/PCbuild/_ctypes.vcproj (original) +++ python/trunk/PCbuild/_ctypes.vcproj Tue Mar 14 21:22:47 2006 @@ -26,7 +26,7 @@ RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="3" - Detect64BitPortabilityProblems="TRUE" + Detect64BitPortabilityProblems="FALSE" DebugInformationFormat="3" CompileAs="0"/> Author: thomas.heller Date: Tue Mar 14 21:39:27 2006 New Revision: 43028 Modified: python/trunk/Modules/_ctypes/cfield.c Log: Cast an Py_ssize_t to int, to avoid a compiler warning. Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Tue Mar 14 21:39:27 2006 @@ -251,10 +251,10 @@ if (bits) result = PyString_FromFormat("", - name, self->offset, size, bits); + name, (int)self->offset, size, bits); else result = PyString_FromFormat("", - name, self->offset, size); + name, (int)self->offset, size); return result; } From python-checkins at python.org Tue Mar 14 21:52:25 2006 From: python-checkins at python.org (thomas.heller) Date: Tue, 14 Mar 2006 21:52:25 +0100 (CET) Subject: [Python-checkins] r43029 - python/trunk/Modules/_ctypes/libffi/include/ffi.h.in Message-ID: <20060314205225.8AC211E4009@bag.python.org> Author: thomas.heller Date: Tue Mar 14 21:52:24 2006 New Revision: 43029 Modified: python/trunk/Modules/_ctypes/libffi/include/ffi.h.in Log: Try to avoid many of the compiler warnings when compiling libffi by using a proper function prototype. Modified: python/trunk/Modules/_ctypes/libffi/include/ffi.h.in ============================================================================== --- python/trunk/Modules/_ctypes/libffi/include/ffi.h.in (original) +++ python/trunk/Modules/_ctypes/libffi/include/ffi.h.in Tue Mar 14 21:52:24 2006 @@ -188,7 +188,7 @@ } ffi_raw; void ffi_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), + void (*fn)(void), /*@out@*/ void *rvalue, /*@dependent@*/ ffi_raw *avalue); @@ -201,7 +201,7 @@ /* longs and doubles are followed by an empty 64-bit word. */ void ffi_java_raw_call (/*@dependent@*/ ffi_cif *cif, - void (*fn)(), + void (*fn)(void), /*@out@*/ void *rvalue, /*@dependent@*/ ffi_raw *avalue); @@ -270,7 +270,7 @@ /*@dependent@*/ ffi_type **atypes); void ffi_call(/*@dependent@*/ ffi_cif *cif, - void (*fn)(), + void (*fn)(void), /*@out@*/ void *rvalue, /*@dependent@*/ void **avalue); From martin at v.loewis.de Tue Mar 14 21:58:03 2006 From: martin at v.loewis.de (=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?=) Date: Tue, 14 Mar 2006 21:58:03 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <4416894C.7090304@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> <4416894C.7090304@egenix.com> Message-ID: <44172E5B.7070309@v.loewis.de> M.-A. Lemburg wrote: > Now we have two versions of the database in a single module > and if we want to upgrade to a new version in the future the > path taken by Martin now would have to be repeated, adding more > complexity. What do you mean by "repeated"? That the next update should incorporate three versions? Not necessarily: old versions can certainly be dropped if there is no need to keep them. We did not make a promise to provide access to all versions of the database that the Unicode consortium ever had released. > Deprecation of an old version would not be user friendly, > since you can't warn on import, only on use of the lookup > object. If you think a new module should be added in addition: that could certainly be done. > Adding support for new features in the Unicode database > would also be unnecessarily complicated, since the old > versions won't provide the needed input data. This I don't understand: what new features could these be? All features of the Unicode database range back to the earliest versions, including data which we currently don't expose. > Currently, the only reason to keep 3.2 support around seems to > be the IDNA encoding (RFC 3490) which relies on stringprep > (RFC 3454) which is only defined for Unicode 3.2.0. It is however > likely that the stringprep RFC will get updated to later versions: > > "This document is for Unicode version 3.2, and should not be considered > to automatically apply to later Unicode versions. The IETF, through an > explicit standards action, may update this document as appropriate to > handle later Unicode versions." That doesn't say an update is likely. Indeed, it is not likely. This says the update is possible. Regards, Martin From neal at metaslash.com Tue Mar 14 23:02:04 2006 From: neal at metaslash.com (Neal Norwitz) Date: Tue, 14 Mar 2006 17:02:04 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060314220204.GA13323@python.psfb.org> test_cfgparser leaked [2, 0, 0] references test_charmapcodec leaked [0, -54, 0] references test_cmd_line leaked [0, -15, 15] references test_compiler leaked [127, 21, 188] references test_generators leaked [255, 255, 255] references test_threadedtempfile leaked [2, 3, 0] references test_threading_local leaked [27, 27, 35] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [63, 63, 64] references From python-checkins at python.org Tue Mar 14 23:22:16 2006 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 14 Mar 2006 23:22:16 +0100 (CET) Subject: [Python-checkins] r43030 - python/branches/p3yk Message-ID: <20060314222216.9CACB1E4008@bag.python.org> Author: guido.van.rossum Date: Tue Mar 14 23:22:15 2006 New Revision: 43030 Added: python/branches/p3yk/ - copied from r43029, python/trunk/ Log: Create a Python 3000 branch. From python-checkins at python.org Tue Mar 14 23:48:58 2006 From: python-checkins at python.org (tim.peters) Date: Tue, 14 Mar 2006 23:48:58 +0100 (CET) Subject: [Python-checkins] r43031 - python/trunk/Lib/test/regrtest.py python/trunk/Lib/test/test_hashlib_speed.py python/trunk/Lib/test/time_hashlib.py Message-ID: <20060314224858.38A461E4008@bag.python.org> Author: tim.peters Date: Tue Mar 14 23:48:56 2006 New Revision: 43031 Added: python/trunk/Lib/test/time_hashlib.py - copied, changed from r43030, python/trunk/Lib/test/test_hashlib_speed.py Removed: python/trunk/Lib/test/test_hashlib_speed.py Modified: python/trunk/Lib/test/regrtest.py Log: Renamed test_hashlib_speed.py to time_hashlib.py. Since it's never intended that this script be run by regrtest.py, it shouldn't have been named with a "test_" prefix to begin with. A consequence is that we shouldn't see useless: test_hashlib_speed skipped -- not a unit test (stand alone benchmark) lines in regrtest output anymore. Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Tue Mar 14 23:48:56 2006 @@ -1136,9 +1136,6 @@ s = _expectations[sys.platform] self.expected = set(s.split()) - # this isn't a regularly run unit test, it is always skipped - self.expected.add('test_hashlib_speed') - if not os.path.supports_unicode_filenames: self.expected.add('test_pep277') Deleted: /python/trunk/Lib/test/test_hashlib_speed.py ============================================================================== --- /python/trunk/Lib/test/test_hashlib_speed.py Tue Mar 14 23:48:56 2006 +++ (empty file) @@ -1,92 +0,0 @@ - -import sys, time -import hashlib -from test import test_support - - -def creatorFunc(): - raise RuntimeError, "eek, creatorFunc not overridden" - - -def test_scaled_msg(scale, name): - - iterations = 106201/scale * 20 - longStr = 'Z'*scale - - localCF = creatorFunc - start = time.time() - for f in xrange(iterations): - x = localCF(longStr).digest() - end = time.time() - - print ('%2.2f' % (end-start)), "seconds", iterations, "x", len(longStr), "bytes", name - -def test_create(): - start = time.time() - for f in xrange(20000): - d = creatorFunc() - end = time.time() - - print ('%2.2f' % (end-start)), "seconds", '[20000 creations]' - -def test_zero(): - start = time.time() - for f in xrange(20000): - x = creatorFunc().digest() - end = time.time() - - print ('%2.2f' % (end-start)), "seconds", '[20000 "" digests]' - - - -### this 'test' is not normally run. skip it if the test runner finds it -if __name__ != '__main__': - raise test_support.TestSkipped, "not a unit test (stand alone benchmark)" - -hName = sys.argv[1] - -# -# setup our creatorFunc to test the requested hash -# -if hName in ('_md5', '_sha'): - exec 'import '+hName - exec 'creatorFunc = '+hName+'.new' - print "testing speed of old", hName, "legacy interface" -elif hName == '_hashlib' and len(sys.argv) > 3: - import _hashlib - exec 'creatorFunc = _hashlib.%s' % sys.argv[2] - print "testing speed of _hashlib.%s" % sys.argv[2], getattr(_hashlib, sys.argv[2]) -elif hName == '_hashlib' and len(sys.argv) == 3: - import _hashlib - exec 'creatorFunc = lambda x=_hashlib.new : x(%r)' % sys.argv[2] - print "testing speed of _hashlib.new(%r)" % sys.argv[2] -elif hasattr(hashlib, hName) and callable(getattr(hashlib, hName)): - creatorFunc = getattr(hashlib, hName) - print "testing speed of hashlib."+hName, getattr(hashlib, hName) -else: - exec "creatorFunc = lambda x=hashlib.new : x(%r)" % hName - print "testing speed of hashlib.new(%r)" % hName - -try: - test_create() -except ValueError: - print - print "pass argument(s) naming the hash to run a speed test on:" - print " '_md5' and '_sha' test the legacy builtin md5 and sha" - print " '_hashlib' 'openssl_hName' 'fast' tests the builtin _hashlib" - print " '_hashlib' 'hName' tests builtin _hashlib.new(shaFOO)" - print " 'hName' tests the hashlib.hName() implementation if it exists" - print " otherwise it uses hashlib.new(hName)." - print - raise - -test_zero() -test_scaled_msg(scale=106201, name='[huge data]') -test_scaled_msg(scale=10620, name='[large data]') -test_scaled_msg(scale=1062, name='[medium data]') -test_scaled_msg(scale=424, name='[4*small data]') -test_scaled_msg(scale=336, name='[3*small data]') -test_scaled_msg(scale=212, name='[2*small data]') -test_scaled_msg(scale=106, name='[small data]') -test_scaled_msg(scale=creatorFunc().digest_size, name='[digest_size data]') -test_scaled_msg(scale=10, name='[tiny data]') Copied: python/trunk/Lib/test/time_hashlib.py (from r43030, python/trunk/Lib/test/test_hashlib_speed.py) ============================================================================== --- python/trunk/Lib/test/test_hashlib_speed.py (original) +++ python/trunk/Lib/test/time_hashlib.py Tue Mar 14 23:48:56 2006 @@ -1,15 +1,14 @@ +# It's intended that this script be run by hand. It runs speed tests on +# hashlib functions; it does not test for correctness. import sys, time import hashlib -from test import test_support def creatorFunc(): raise RuntimeError, "eek, creatorFunc not overridden" - def test_scaled_msg(scale, name): - iterations = 106201/scale * 20 longStr = 'Z'*scale @@ -39,10 +38,6 @@ -### this 'test' is not normally run. skip it if the test runner finds it -if __name__ != '__main__': - raise test_support.TestSkipped, "not a unit test (stand alone benchmark)" - hName = sys.argv[1] # From amk at amk.ca Wed Mar 15 03:12:02 2006 From: amk at amk.ca (A.M. Kuchling) Date: Tue, 14 Mar 2006 21:12:02 -0500 Subject: [Python-checkins] r43030 - python/branches/p3yk In-Reply-To: <20060314222216.9CACB1E4008@bag.python.org> References: <20060314222216.9CACB1E4008@bag.python.org> Message-ID: <20060315021202.GA4643@rogue.amk.ca> On Tue, Mar 14, 2006 at 11:22:16PM +0100, guido.van.rossum wrote: > python/branches/p3yk/ Should that have been 'py3k'? --amk From python-checkins at python.org Wed Mar 15 05:17:34 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 05:17:34 +0100 (CET) Subject: [Python-checkins] r43032 - peps/trunk/pep-0000.txt peps/trunk/pep-0338.txt Message-ID: <20060315041734.6634A1E4009@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 05:17:29 2006 New Revision: 43032 Modified: peps/trunk/pep-0000.txt peps/trunk/pep-0338.txt Log: Accept PEP 338. Maybe there are some tweaks necessary to the code, but I want to make it clear that this feature is accepted for 2.5. Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Wed Mar 15 05:17:29 2006 @@ -66,7 +66,7 @@ Accepted PEPs (accepted; may not be implemented yet) SA 328 Imports: Multi-Line and Absolute/Relative Aahz - SA 343 The "with" Statement GvR, Coghlan + SA 338 Executing modules inside packages with '-m' Coghlan Open PEPs (under consideration) @@ -97,7 +97,6 @@ S 334 Simple Coroutines via SuspendIteration Evans S 335 Overloadable Boolean Operators Ewing S 337 Logging Usage in the Standard Library Dubner - S 338 Executing modules inside packages with '-m' Coghlan S 344 Exception Chaining and Embedded Tracebacks Yee S 345 Metadata for Python Software Packages 1.2 Jones I 350 Codetags Elliott @@ -164,6 +163,7 @@ SF 327 Decimal Data Type Batista SF 341 Unifying try-except and try-finally Brandl SF 342 Coroutines via Enhanced Generators GvR, Eby + SF 343 The "with" Statement GvR, Coghlan SF 352 Required Superclass for Exceptions GvR, Cannon SF 353 Using ssize_t as the index type von Loewis SF 357 Allowing Any Object to be Used for Slicing Oliphant @@ -391,12 +391,12 @@ S 335 Overloadable Boolean Operators Ewing SR 336 Make None Callable McClelland S 337 Logging Usage in the Standard Library Dubner - S 338 Executing modules inside packages with '-m' Coghlan + SA 338 Executing modules inside packages with '-m' Coghlan I 339 Design of the CPython Compiler Cannon SR 340 Anonymous Block Statements GvR SF 341 Unifying try-except and try-finally Brandl SF 342 Coroutines via Enhanced Generators GvR, Eby - SA 343 Anonymous Block Redux and Generator Enhancements GvR + SF 343 Anonymous Block Redux and Generator Enhancements GvR S 344 Exception Chaining and Embedded Tracebacks Yee S 345 Metadata for Python Software Packages 1.2 Jones SR 346 User Defined ("with") Statements Coghlan Modified: peps/trunk/pep-0338.txt ============================================================================== --- peps/trunk/pep-0338.txt (original) +++ peps/trunk/pep-0338.txt Wed Mar 15 05:17:29 2006 @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Draft +Status: Accepted Type: Standards Track Content-Type: text/x-rst Created: 16-Oct-2004 From python-checkins at python.org Wed Mar 15 05:33:55 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 05:33:55 +0100 (CET) Subject: [Python-checkins] r43033 - in python/trunk/Lib: distutils/sysconfig.py encodings/__init__.py Message-ID: <20060315043355.C82D71E4009@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 05:33:54 2006 New Revision: 43033 Modified: python/trunk/Lib/distutils/sysconfig.py python/trunk/Lib/encodings/__init__.py Log: Use relative imports in a few places where I noticed the need. (Ideally, all packages in Python 2.5 will use the relative import syntax for all their relative import needs.) Modified: python/trunk/Lib/distutils/sysconfig.py ============================================================================== --- python/trunk/Lib/distutils/sysconfig.py (original) +++ python/trunk/Lib/distutils/sysconfig.py Wed Mar 15 05:33:54 2006 @@ -16,7 +16,7 @@ import string import sys -from errors import DistutilsPlatformError +from .errors import DistutilsPlatformError # These are needed in a couple of spots, so just compute them once. PREFIX = os.path.normpath(sys.prefix) Modified: python/trunk/Lib/encodings/__init__.py ============================================================================== --- python/trunk/Lib/encodings/__init__.py (original) +++ python/trunk/Lib/encodings/__init__.py Wed Mar 15 05:33:54 2006 @@ -27,7 +27,8 @@ """#" -import codecs, types, aliases +import codecs, types +from . import aliases _cache = {} _unknown = '--unknown--' From python-checkins at python.org Wed Mar 15 05:41:44 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 05:41:44 +0100 (CET) Subject: [Python-checkins] r43034 - peps/trunk/pep-3000.txt Message-ID: <20060315044144.D67301E4041@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 05:41:44 2006 New Revision: 43034 Modified: peps/trunk/pep-3000.txt Log: Add note about int as abstract base class. Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 15 05:41:44 2006 @@ -109,6 +109,7 @@ ============ * Remove distinction between int and long types [1]_ + (int may become an abstract base type, with short and long subtypes.) * Make all strings be Unicode, and have a separate bytes() type [1]_ * Return iterators instead of lists where appropriate for atomic type methods (e.g. ``dict.keys()``, ``dict.values()``, ``dict.items()``, etc.); iter* From python-checkins at python.org Wed Mar 15 05:58:53 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 05:58:53 +0100 (CET) Subject: [Python-checkins] r43035 - in python/branches/p3yk: Grammar/Grammar Include/code.h Include/parsetok.h Include/patchlevel.h Include/pyerrors.h Include/pythonrun.h Lib/copy_reg.py Lib/distutils/sysconfig.py Lib/encodings/__init__.py Lib/test/test_opcodes.py Misc/NEWS Modules/main.c Objects/abstract.c Parser/parser.c Parser/parsetok.c Python/ceval.c Python/compile.c Python/errors.c Python/future.c Python/getargs.c Python/graminit.c Python/import.c Python/pythonrun.c README Message-ID: <20060315045853.28D491E4009@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 05:58:47 2006 New Revision: 43035 Modified: python/branches/p3yk/Grammar/Grammar python/branches/p3yk/Include/code.h python/branches/p3yk/Include/parsetok.h python/branches/p3yk/Include/patchlevel.h python/branches/p3yk/Include/pyerrors.h python/branches/p3yk/Include/pythonrun.h python/branches/p3yk/Lib/copy_reg.py python/branches/p3yk/Lib/distutils/sysconfig.py python/branches/p3yk/Lib/encodings/__init__.py python/branches/p3yk/Lib/test/test_opcodes.py python/branches/p3yk/Misc/NEWS python/branches/p3yk/Modules/main.c python/branches/p3yk/Objects/abstract.c python/branches/p3yk/Parser/parser.c python/branches/p3yk/Parser/parsetok.c python/branches/p3yk/Python/ceval.c python/branches/p3yk/Python/compile.c python/branches/p3yk/Python/errors.c python/branches/p3yk/Python/future.c python/branches/p3yk/Python/getargs.c python/branches/p3yk/Python/graminit.c python/branches/p3yk/Python/import.c python/branches/p3yk/Python/pythonrun.c python/branches/p3yk/README Log: Checkpoint. 218 tests are okay; 53 are failing. Done so far: - all classes are new-style (but ripping out classobject.[ch] isn't done) - int/int -> float - all exceptions must derive from BaseException - absolute import - 'as' and 'with' are keywords Modified: python/branches/p3yk/Grammar/Grammar ============================================================================== --- python/branches/p3yk/Grammar/Grammar (original) +++ python/branches/p3yk/Grammar/Grammar Wed Mar 15 05:58:47 2006 @@ -7,18 +7,6 @@ # with someone who can; ask around on python-dev for help. Fred # Drake will probably be listening there. -# Commands for Kees Blom's railroad program -#diagram:token NAME -#diagram:token NUMBER -#diagram:token STRING -#diagram:token NEWLINE -#diagram:token ENDMARKER -#diagram:token INDENT -#diagram:output\input python.bla -#diagram:token DEDENT -#diagram:output\textwidth 20.04cm\oddsidemargin 0.0cm\evensidemargin 0.0cm -#diagram:rules - # Start symbols for the grammar: # single_input is a single interactive statement; # file_input is a module or sequence of commands read from an input file; @@ -61,8 +49,8 @@ import_name: 'import' dotted_as_names import_from: ('from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_as_name: NAME [('as' | NAME) NAME] -dotted_as_name: dotted_name [('as' | NAME) NAME] +import_as_name: NAME ['as' NAME] +dotted_as_name: dotted_name ['as' NAME] import_as_names: import_as_name (',' import_as_name)* [','] dotted_as_names: dotted_as_name (',' dotted_as_name)* dotted_name: NAME ('.' NAME)* @@ -80,7 +68,7 @@ ['finally' ':' suite] | 'finally' ':' suite)) with_stmt: 'with' test [ with_var ] ':' suite -with_var: ('as' | NAME) expr +with_var: 'as' expr # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test [',' test]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT Modified: python/branches/p3yk/Include/code.h ============================================================================== --- python/branches/p3yk/Include/code.h (original) +++ python/branches/p3yk/Include/code.h Wed Mar 15 05:58:47 2006 @@ -41,17 +41,17 @@ #define CO_NOFREE 0x0040 #if 0 -/* This is no longer used. Stopped defining in 2.5, do not re-use. */ +/* These are no longer used. */ #define CO_GENERATOR_ALLOWED 0x1000 -#endif #define CO_FUTURE_DIVISION 0x2000 #define CO_FUTURE_ABSIMPORT 0x4000 /* absolute import by default */ #define CO_FUTURE_WITH_STATEMENT 0x8000 +#endif /* This should be defined if a future statement modifies the syntax. For example, when a keyword is added. */ -#define PY_PARSER_REQUIRES_FUTURE_KEYWORD +/* #define PY_PARSER_REQUIRES_FUTURE_KEYWORD */ #define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ Modified: python/branches/p3yk/Include/parsetok.h ============================================================================== --- python/branches/p3yk/Include/parsetok.h (original) +++ python/branches/p3yk/Include/parsetok.h Wed Mar 15 05:58:47 2006 @@ -23,7 +23,9 @@ #define PyPARSE_DONT_IMPLY_DEDENT 0x0002 +#if 0 #define PyPARSE_WITH_IS_KEYWORD 0x0003 +#endif PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, perrdetail *); Modified: python/branches/p3yk/Include/patchlevel.h ============================================================================== --- python/branches/p3yk/Include/patchlevel.h (original) +++ python/branches/p3yk/Include/patchlevel.h Wed Mar 15 05:58:47 2006 @@ -1,9 +1,5 @@ -/* Newfangled version identification scheme. - - This scheme was added in Python 1.5.2b2; before that time, only PATCHLEVEL - was available. To test for presence of the scheme, test for - defined(PY_MAJOR_VERSION). +/* Python version identification scheme. When the major or minor version changes, the VERSION variable in configure.in must also be changed. @@ -19,14 +15,14 @@ /* Higher for patch releases */ /* Version parsed out into numeric values */ -#define PY_MAJOR_VERSION 2 -#define PY_MINOR_VERSION 5 +#define PY_MAJOR_VERSION 0 +#define PY_MINOR_VERSION 0 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "2.5a0" +#define PY_VERSION "3.0x" /* Subversion Revision number of this file (not of the repository) */ #define PY_PATCHLEVEL_REVISION "$Revision$" Modified: python/branches/p3yk/Include/pyerrors.h ============================================================================== --- python/branches/p3yk/Include/pyerrors.h (original) +++ python/branches/p3yk/Include/pyerrors.h Wed Mar 15 05:58:47 2006 @@ -28,25 +28,18 @@ /* */ -#define PyExceptionClass_Check(x) \ - (PyClass_Check((x)) \ - || (PyType_Check((x)) && PyType_IsSubtype( \ - (PyTypeObject*)(x), (PyTypeObject*)PyExc_BaseException))) - - -#define PyExceptionInstance_Check(x) \ - (PyInstance_Check((x)) || \ - (PyType_IsSubtype((x)->ob_type, (PyTypeObject*)PyExc_BaseException))) - -#define PyExceptionClass_Name(x) \ - (PyClass_Check((x)) \ - ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ - : (char *)(((PyTypeObject*)(x))->tp_name)) - -#define PyExceptionInstance_Class(x) \ - ((PyInstance_Check((x)) \ - ? (PyObject*)((PyInstanceObject*)(x))->in_class \ - : (PyObject*)((x)->ob_type))) +#define PyExceptionClass_Check(x) \ + (PyType_Check((x)) && PyType_IsSubtype( \ + (PyTypeObject*)(x), (PyTypeObject*)PyExc_BaseException)) + + +#define PyExceptionInstance_Check(x) \ + (PyType_IsSubtype((x)->ob_type, (PyTypeObject*)PyExc_BaseException)) + +#define PyExceptionClass_Name(x) \ + ((char *)(((PyTypeObject*)(x))->tp_name)) + +#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) /* Predefined exceptions */ Modified: python/branches/p3yk/Include/pythonrun.h ============================================================================== --- python/branches/p3yk/Include/pythonrun.h (original) +++ python/branches/p3yk/Include/pythonrun.h Wed Mar 15 05:58:47 2006 @@ -7,9 +7,8 @@ extern "C" { #endif -#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSIMPORT | \ - CO_FUTURE_WITH_STATEMENT) -#define PyCF_MASK_OBSOLETE (CO_NESTED) +#define PyCF_MASK 0 +#define PyCF_MASK_OBSOLETE 0 #define PyCF_SOURCE_IS_UTF8 0x0100 #define PyCF_DONT_IMPLY_DEDENT 0x0200 #define PyCF_ONLY_AST 0x0400 Modified: python/branches/p3yk/Lib/copy_reg.py ============================================================================== --- python/branches/p3yk/Lib/copy_reg.py (original) +++ python/branches/p3yk/Lib/copy_reg.py Wed Mar 15 05:58:47 2006 @@ -4,17 +4,12 @@ C, not for instances of user-defined classes. """ -from types import ClassType as _ClassType - __all__ = ["pickle", "constructor", "add_extension", "remove_extension", "clear_extension_cache"] dispatch_table = {} def pickle(ob_type, pickle_function, constructor_ob=None): - if type(ob_type) is _ClassType: - raise TypeError("copy_reg is not intended for use with classes") - if not callable(pickle_function): raise TypeError("reduction functions must be callable") dispatch_table[ob_type] = pickle_function Modified: python/branches/p3yk/Lib/distutils/sysconfig.py ============================================================================== --- python/branches/p3yk/Lib/distutils/sysconfig.py (original) +++ python/branches/p3yk/Lib/distutils/sysconfig.py Wed Mar 15 05:58:47 2006 @@ -16,7 +16,7 @@ import string import sys -from errors import DistutilsPlatformError +from .errors import DistutilsPlatformError # These are needed in a couple of spots, so just compute them once. PREFIX = os.path.normpath(sys.prefix) Modified: python/branches/p3yk/Lib/encodings/__init__.py ============================================================================== --- python/branches/p3yk/Lib/encodings/__init__.py (original) +++ python/branches/p3yk/Lib/encodings/__init__.py Wed Mar 15 05:58:47 2006 @@ -27,7 +27,8 @@ """#" -import codecs, types, aliases +import codecs, types +from . import aliases _cache = {} _unknown = '--unknown--' Modified: python/branches/p3yk/Lib/test/test_opcodes.py ============================================================================== --- python/branches/p3yk/Lib/test/test_opcodes.py (original) +++ python/branches/p3yk/Lib/test/test_opcodes.py Wed Mar 15 05:58:47 2006 @@ -25,9 +25,9 @@ print '2.2 raise class exceptions' -class AClass: pass +class AClass(Exception): pass class BClass(AClass): pass -class CClass: pass +class CClass(Exception): pass class DClass(AClass): def __init__(self, ignore): pass @@ -58,8 +58,8 @@ if v != b: raise TestFailed, "v!=b AClass" # not enough arguments -try: raise BClass, a -except TypeError: pass +##try: raise BClass, a +##except TypeError: pass try: raise DClass, a except DClass, v: Modified: python/branches/p3yk/Misc/NEWS ============================================================================== --- python/branches/p3yk/Misc/NEWS (original) +++ python/branches/p3yk/Misc/NEWS Wed Mar 15 05:58:47 2006 @@ -4,6245 +4,58 @@ (editors: check NEWS.help for information about editing NEWS using ReST.) -What's New in Python 2.5 alpha 1? -================================= +What's New in Python 3000? +========================== -*Release date: XX-XXX-2006* +*Release date: XX-XXX-200X* -Core and builtins ------------------ - -- Patch #1434038: property() now uses the getter's docstring if there is - no "doc" argument given. This makes it possible to legitimately use - property() as a decorator to produce a read-only property. - -- PEP 357, patch 1436368: add an __index__ method to int/long and a matching - nb_index slot to the PyNumberMethods struct. The slot is consulted instead - of requiring an int or long in slicing and a few other contexts, enabling - other objects (e.g. Numeric Python's integers) to be used as slice indices. - -- Fixed various bugs reported by Coverity's Prevent tool. - -- PEP 352, patch #1104669: Make exceptions new-style objects. Introduced the - new exception base class, BaseException, which has a new message attribute. - KeyboardInterrupt and SystemExit to directly inherit from BaseException now. - Raising a string exception now raises a DeprecationWarning. - -- Patch #1438387, PEP 328: relative and absolute imports. Imports can now be - explicitly relative, using 'from .module import name' to mean 'from the same - package as this module is in. Imports without dots still default to the - old relative-then-absolute, unless 'from __future__ import - absolute_import' is used. - -- Properly check if 'warnings' raises an exception (usually when a filter set - to "error" is triggered) when raising a warning for raising string - exceptions. - -- CO_GENERATOR_ALLOWED is no longer defined, this behavior is the default. - The name was removed from Include/code.h. - -- PEP 308: conditional expressions were added (x if cond else y). - -- Patch 1433928: - - The copy module now "copies" function objects (as atomic objects). - - dict.__getitem__ now looks for a __missing__ hook before raising - KeyError. - -- PEP 343: with statement implemented. Needs ``from __future__ import - with_statement``. Use of 'with' as a variable will generate a warning. - Use of 'as' as a variable will also generate a warning (unless it's - part of an import statement). - The following objects have __context__ methods: - - The built-in file type. - - The thread.LockType type. - - The following types defined by the threading module: - Lock, RLock, Condition, Semaphore, BoundedSemaphore. - - The decimal.Context class. - -- Fix the encodings package codec search function to only search - inside its own package. Fixes problem reported in patch #1433198. - - Note: Codec packages should implement and register their own - codec search function. PEP 100 has the details. - -- PEP 353: Using ssize_t as the index type. - -- Patch #1400181, fix unicode string formatting to not use the locale. - This is how string objects work. u'%f' could use , instead of . - for the decimal point. Now both strings and unicode always use periods. - -- Bug #1244610, #1392915, fix build problem on OpenBSD 3.7 and 3.8. - configure would break checking curses.h. - -- Bug #959576: The pwd module is now builtin. This allows Python to be - built on UNIX platforms without $HOME set. - -- Bug #1072182, fix some potential problems if characters are signed. - -- Bug #889500, fix line number on SyntaxWarning for global declarations. - -- Bug #1378022, UTF-8 files with a leading BOM crashed the interpreter. - -- Support for converting hex strings to floats no longer works. - This was not portable. float('0x3') now raises a ValueError. - -- Patch #1382163: Expose Subversion revision number to Python. New C API - function Py_GetBuildNumber(). New attribute sys.subversion. Build number - is now displayed in interactive prompt banner. - -- Implementation of PEP 341 - Unification of try/except and try/finally. - "except" clauses can now be written together with a "finally" clause in - one try statement instead of two nested ones. Patch #1355913. - -- Bug #1379994: Builtin unicode_escape and raw_unicode_escape codec - now encodes backslash correctly. - -- Patch #1350409: Work around signal handling bug in Visual Studio 2005. - -- Bug #1281408: Py_BuildValue now works correct even with unsigned longs - and long longs. - -- SF Bug #1350188, "setdlopenflags" leads to crash upon "import" - It was possible dlerror() returns a NULL pointer, use a default error - message in this case. - -- Replaced most Unicode charmap codecs with new ones using the - new Unicode translate string feature in the builtin charmap - codec; the codecs were created from the mapping tables available - at ftp.unicode.org and contain a few updates (e.g. the Mac OS - encodings now include a mapping for the Apple logo) - -- Added a few more codecs for Mac OS encodings - -- Speed up some Unicode operations. - -- A new AST parser implementation was completed. The abstract - syntax tree is available for read-only (non-compile) access - to Python code; an _ast module was added. - -- SF bug #1167751: fix incorrect code being for generator expressions. - The following code now raises a SyntaxError: foo(a = i for i in range(10)) - -- SF Bug #976608: fix SystemError when mtime of an imported file is -1. - -- SF Bug #887946: fix segfault when redirecting stdin from a directory. - Provide a warning when a directory is passed on the command line. - -- Fix segfault with invalid coding. - -- SF bug #772896: unknown encoding results in MemoryError. - -- All iterators now have a Boolean value of true. Formerly, some iterators - supported a __len__() method which evaluated to False when the iterator - was empty. - -- On 64-bit platforms, when __len__() returns a value that cannot be - represented as a C int, raise OverflowError. - -- test__locale is skipped on OS X < 10.4 (only partial locale support is - present). - -- SF bug #893549: parsing keyword arguments was broken with a few format - codes. - -- Changes donated by Elemental Security to make it work on AIX 5.3 - with IBM's 64-bit compiler (SF patch #1284289). This also closes SF - bug #105470: test_pwd fails on 64bit system (Opteron). - -- Changes donated by Elemental Security to make it work on HP-UX 11 on - Itanium2 with HP's 64-bit compiler (SF patch #1225212). - -- Disallow keyword arguments for type constructors that don't use them - (fixes bug #1119418). - -- Forward UnicodeDecodeError into SyntaxError for source encoding errors. - -- SF bug #900092: When tracing (e.g. for hotshot), restore 'return' events for - exceptions that cause a function to exit. - -- The implementation of set() and frozenset() was revised to use its - own internal data structure. Memory consumption is reduced by 1/3 - and there are modest speed-ups as well. The API is unchanged. - -- SF bug #1238681: freed pointer is used in longobject.c:long_pow(). - -- SF bug #1229429: PyObject_CallMethod failed to decrement some - reference counts in some error exit cases. - -- SF bug #1185883: Python's small-object memory allocator took over - a block managed by the platform C library whenever a realloc specified - a small new size. However, there's no portable way to know then how - much of the address space following the pointer is valid, so no - portable way to copy data from the C-managed block into Python's - small-object space without risking a memory fault. Python's small-object - realloc now leaves such blocks under the control of the platform C - realloc. - -- SF bug #1232517: An overflow error was not detected properly when - attempting to convert a large float to an int in os.utime(). - -- SF bug #1224347: hex longs now print with lowercase letters just - like their int counterparts. - -- SF bug #1163563: the original fix for bug #1010677 ("thread Module - Breaks PyGILState_Ensure()") broke badly in the case of multiple - interpreter states; back out that fix and do a better job (see - http://mail.python.org/pipermail/python-dev/2005-June/054258.html - for a longer write-up of the problem). - -- SF patch #1180995: marshal now uses a binary format by default when - serializing floats. - -- SF patch #1181301: on platforms that appear to use IEEE 754 floats, - the routines that promise to produce IEEE 754 binary representations - of floats now simply copy bytes around. - -- bug #967182: disallow opening files with 'wU' or 'aU' as specified by PEP - 278. - -- patch #1109424: int, long, float, complex, and unicode now check for the - proper magic slot for type conversions when subclassed. Previously the - magic slot was ignored during conversion. Semantics now match the way - subclasses of str always behaved. int/long/float, conversion of an instance - to the base class has been moved to the proper nb_* magic slot and out of - PyNumber_*(). - Thanks Walter Dörwald. - -- Descriptors defined in C with a PyGetSetDef structure, where the setter is - NULL, now raise an AttributeError when attempting to set or delete the - attribute. Previously a TypeError was raised, but this was inconsistent - with the equivalent pure-Python implementation. - -- It is now safe to call PyGILState_Release() before - PyEval_InitThreads() (note that if there is reason to believe there - are multiple threads around you still must call PyEval_InitThreads() - before using the Python API; this fix is for extension modules that - have no way of knowing if Python is multi-threaded yet). - -- Typing Ctrl-C whilst raw_input() was waiting in a build with threads - disabled caused a crash. - -- Bug #1165306: instancemethod_new allowed the creation of a method - with im_class == im_self == NULL, which caused a crash when called. - -- Move exception finalisation later in the shutdown process - this - fixes the crash seen in bug #1165761 - -- Added two new builtins, any() and all(). - -- Defining a class with empty parentheses is now allowed - (e.g., ``class C(): pass`` is no longer a syntax error). - Patch #1176012 added support to the 'parser' module and 'compiler' package - (thanks to logistix for that added support). - -- Patch #1115086: Support PY_LONGLONG in structmember. - -- Bug #1155938: new style classes did not check that __init__() was - returning None. - -- Patch #802188: Report characters after line continuation character - ('\') with a specific error message. - -- Bug #723201: Raise a TypeError for passing bad objects to 'L' format. - -- Bug #1124295: the __name__ attribute of file objects was - inadvertently made inaccessible in restricted mode. - -- Bug #1074011: closing sys.std{out,err} now causes a flush() and - an ferror() call. - -- min() and max() now support key= arguments with the same meaning as in - list.sort(). - -- The peephole optimizer now performs simple constant folding in expressions: - (2+3) --> (5). - -- set and frozenset objects can now be marshalled. SF #1098985. - -- Bug #1077106: Poor argument checking could cause memory corruption - in calls to os.read(). - -- The parser did not complain about future statements in illegal - positions. It once again reports a syntax error if a future - statement occurs after anything other than a doc string. - -- Change the %s format specifier for str objects so that it returns a - unicode instance if the argument is not an instance of basestring and - calling __str__ on the argument returns a unicode instance. - -- Patch #1413181: changed ``PyThreadState_Delete()`` to forget about the - current thread state when the auto-GIL-state machinery knows about - it (since the thread state is being deleted, continuing to remember it - can't help, but can hurt if another thread happens to get created with - the same thread id). - -Extension Modules ------------------ - -- Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle - SS2 (single-shift 2) escape sequences correctly. - -- The unicodedata module was updated to the 4.1 version of the Unicode - database. The 3.2 version is still available as unicodedata.db_3_2_0 - for applications that require this specific version (such as IDNA). - -- The timing module is no longer built by default. It was deprecated - in PEP 4 in Python 2.0 or earlier. - -- Patch 1433928: Added a new type, defaultdict, to the collections module. - This uses the new __missing__ hook behavior added to dict (see above). - -- Bug #854823: socketmodule now builds on Sun platforms even when - INET_ADDRSTRLEN is not defined. - -- Patch #1393157: os.startfile() now has an optional argument to specify - a "command verb" to invoke on the file. - -- Bug #876637, prevent stack corruption when socket descriptor - is larger than FD_SETSIZE. - -- Patch #1407135, bug #1424041: harmonize mmap behavior of anonymous memory. - mmap.mmap(-1, size) now returns anonymous memory in both Unix and Windows. - mmap.mmap(0, size) should not be used on Windows for anonymous memory. - -- Patch #1422385: The nis module now supports access to domains other - than the system default domain. - -- Use Win32 API to implement os.stat/fstat. As a result, subsecond timestamps - are reported, the limit on path name lengths is removed, and stat reports - WindowsError now (instead of OSError). - -- Add bsddb.db.DBEnv.set_tx_timestamp allowing time based database recovery. - -- Bug #1413192, fix seg fault in bsddb if a transaction was deleted - before the env. - -- Patch #1103116: Basic AF_NETLINK support. - -- Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...) - -- Bug #1400822, _curses over{lay,write} doesn't work when passing 6 ints. - Also fix ungetmouse() which did not accept arguments properly. - The code now conforms to the documented signature. - -- Bug #1400115, Fix segfault when calling curses.panel.userptr() - without prior setting of the userptr. - -- Fix 64-bit problems in bsddb. - -- Patch #1365916: fix some unsafe 64-bit mmap methods. - -- Bug #1290333: Added a workaround for cjkcodecs' _codecs_cn build - problem on AIX. - -- Bug #869197: os.setgroups rejects long integer arguments - -- Bug #1346533, select.poll() doesn't raise an error if timeout > sys.maxint - -- Bug #1344508, Fix UNIX mmap leaking file descriptors - -- Patch #1338314, Bug #1336623: fix tarfile so it can extract - REGTYPE directories from tarfiles written by old programs. - -- Patch #1407992, fixes broken bsddb module db associate when using - BerkeleyDB 3.3, 4.0 or 4.1. - -- Get bsddb module to build with BerkeleyDB version 4.4 - -- Get bsddb module to build with BerkeleyDB version 3.2 - -- Patch #1309009, Fix segfault in pyexpat when the XML document is in latin_1, - but Python incorrectly assumes it is in UTF-8 format - -- Fix parse errors in the readline module when compiling without threads. - -- Patch #1288833: Removed thread lock from socket.getaddrinfo on - FreeBSD 5.3 and later versions which got thread-safe getaddrinfo(3). - -- Patches #1298449 and #1298499: Add some missing checks for error - returns in cStringIO.c. - -- Patch #1297028: fix segfault if call type on MultibyteCodec, - MultibyteStreamReader, or MultibyteStreamWriter - -- Fix memory leak in posix.access(). - -- Patch #1213831: Fix typo in unicodedata._getcode. - -- Bug #1007046: os.startfile() did not accept unicode strings encoded in - the file system encoding. - -- Patch #756021: Special-case socket.inet_aton('255.255.255.255') for - platforms that don't have inet_aton(). - -- Bug #1215928: Fix bz2.BZ2File.seek() for 64-bit file offsets. - -- Bug #1191043: Fix bz2.BZ2File.(x)readlines for files containing one - line without newlines. - -- Bug #728515: mmap.resize() now resizes the file on Unix as it did - on Windows. - -- Patch #1180695: Add nanosecond stat resolution, and st_gen, - st_birthtime for FreeBSD. - -- Patch #1231069: The fcntl.ioctl function now uses the 'I' code for - the request code argument, which results in more C-like behaviour - for large or negative values. - -- Bug #1234979: For the argument of thread.Lock.acquire, the Windows - implementation treated all integer values except 1 as false. - -- Bug #1194181: bz2.BZ2File didn't handle mode 'U' correctly. - -- Patch #1212117: os.stat().st_flags is now accessible as a attribute - if available on the platform. - -- Patch #1103951: Expose O_SHLOCK and O_EXLOCK in the posix module if - available on the platform. - -- Bug #1166660: The readline module could segfault if hook functions - were set in a different thread than that which called readline. - -- collections.deque objects now support a remove() method. - -- operator.itemgetter() and operator.attrgetter() now support retrieving - multiple fields. This provides direct support for sorting on multiple - keys (primary, secondary, etc). - -- os.access now supports Unicode path names on non-Win32 systems. - -- Patches #925152, #1118602: Avoid reading after the end of the buffer - in pyexpat.GetInputContext. - -- Patches #749830, #1144555: allow UNIX mmap size to default to current - file size. - -- Added functional.partial(). See PEP309. - -- Patch #1093585: raise a ValueError for negative history items in readline. - {remove_history,replace_history} - -- The spwd module has been added, allowing access to the shadow password - database. - -- stat_float_times is now True. - -- array.array objects are now picklable. - -- the cPickle module no longer accepts the deprecated None option in the - args tuple returned by __reduce__(). - -- itertools.islice() now accepts None for the start and step arguments. - This allows islice() to work more readily with slices: - islice(s.start, s.stop, s.step) - -- datetime.datetime() now has a strptime class method which can be used to - create datetime object using a string and format. - -Library -------- - -- A regrtest option -w was added to re-run failed tests in verbose mode. - -- Patch #1446372: quit and exit can now be called from the interactive - interpreter to exit. - -- The function get_count() has been added to the gc module, and gc.collect() - grew an optional 'generation' argument. - -- A library msilib to generate Windows Installer files, and a distutils - command bdist_msi have been added. - -- PEP 343: new module contextlib.py defines decorator @contextmanager - and helpful context managers nested() and closing(). - -- The compiler package now supports future imports after the module docstring. - -- Bug #1413790: zipfile now sanitizes absolute archive names that are - not allowed by the specs. - -- Patch #1215184: FileInput now can be given an opening hook which can - be used to control how files are opened. - -- Patch #1212287: fileinput.input() now has a mode parameter for - specifying the file mode input files should be opened with. - -- Patch #1215184: fileinput now has a fileno() function for getting the - current file number. - -- Patch #1349274: gettext.install() now optionally installs additional - translation functions other than _() in the builtin namespace. - -- Patch #1337756: fileinput now accepts Unicode filenames. - -- Patch #1373643: The chunk module can now read chunks larger than - two gigabytes. - -- Patch #1417555: SimpleHTTPServer now returns Last-Modified headers. - -- Bug #1430298: It is now possible to send a mail with an empty - return address using smtplib. - -- Bug #1432260: The names of lambda functions are now properly displayed - in pydoc. - -- Patch #1412872: zipfile now sets the creator system to 3 (Unix) - unless the system is Win32. - -- Patch #1349118: urllib now supports user:pass@ style proxy - specifications, raises IOErrors when proxies for unsupported protocols - are defined, and uses the https proxy on https redirections. - -- Bug #902075: urllib2 now supports 'host:port' style proxy specifications. - -- Bug #1407902: Add support for sftp:// URIs to urlparse. - -- Bug #1371247: Update Windows locale identifiers in locale.py. - -- Bug #1394565: SimpleHTTPServer now doesn't choke on query parameters - any more. - -- Bug #1403410: The warnings module now doesn't get confused - when it can't find out the module name it generates a warning for. - -- Patch #1177307: Added a new codec utf_8_sig for UTF-8 with a BOM signature. - -- Patch #1157027: cookielib mishandles RFC 2109 cookies in Netscape mode - -- Patch #1117398: cookielib.LWPCookieJar and .MozillaCookieJar now raise - LoadError as documented, instead of IOError. For compatibility, - LoadError subclasses IOError. - -- Added the hashlib module. It provides secure hash functions for MD5 and - SHA1, 224, 256, 384, and 512. Note that recent developments make the - historic MD5 and SHA1 unsuitable for cryptographic-strength applications. - In - Ronald L. Rivest offered this advice for Python: - - "The consensus of researchers in this area (at least as - expressed at the NIST Hash Function Workshop 10/31/05), - is that SHA-256 is a good choice for the time being, but - that research should continue, and other alternatives may - arise from this research. The larger SHA's also seem OK." - -- Added a subset of Fredrik Lundh's ElementTree package. Available - modules are xml.etree.ElementTree, xml.etree.ElementPath, and - xml.etree.ElementInclude, from ElementTree 1.2.6. - -- Patch #1162825: Support non-ASCII characters in IDLE window titles. - -- Bug #1365984: urllib now opens "data:" URLs again. - -- Patch #1314396: prevent deadlock for threading.Thread.join() when an exception - is raised within the method itself on a previous call (e.g., passing in an - illegal argument) - -- Bug #1340337: change time.strptime() to always return ValueError when there - is an error in the format string. - -- Patch #754022: Greatly enhanced webbrowser.py (by Oleg Broytmann). - -- Bug #729103: pydoc.py: Fix docother() method to accept additional - "parent" argument. - -- Patch #1300515: xdrlib.py: Fix pack_fstring() to really use null bytes - for padding. - -- Bug #1296004: httplib.py: Limit maximal amount of data read from the - socket to avoid a MemoryError on Windows. - -- Patch #1166948: locale.py: Prefer LC_ALL, LC_CTYPE and LANG over LANGUAGE - to get the correct encoding. - -- Patch #1166938: locale.py: Parse LANGUAGE as a colon separated list of - languages. - -- Patch #1268314: Cache lines in StreamReader.readlines for performance. - -- Bug #1290505: Fix clearing the regex cache for time.strptime(). - -- Bug #1167128: Fix size of a symlink in a tarfile to be 0. - -- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook - functionality. - -- Bug #1163178: Make IDNA return an empty string when the input is empty. - -- Patch #848017: Make Cookie more RFC-compliant. Use CRLF as default output - separator and do not output trailing semicola. - -- Patch #1062060: urllib.urlretrieve() now raises a new exception, named - ContentTooShortException, when the actually downloaded size does not - match the Content-Length header. - -- Bug #1121494: distutils.dir_utils.mkpath now accepts Unicode strings. - -- Bug #1178484: Return complete lines from codec stream readers - even if there is an exception in later lines, resulting in - correct line numbers for decoding errors in source code. - -- Bug #1192315: Disallow negative arguments to clear() in pdb. - -- Patch #827386: Support absolute source paths in msvccompiler.py. - -- Patch #1105730: Apply the new implementation of commonprefix in posixpath - to ntpath, macpath, os2emxpath and riscospath. - -- Fix a problem in Tkinter introduced by SF patch #869468: delete bogus - __hasattr__ and __delattr__ methods on class Tk that were breaking - Tkdnd. - -- Bug #1015140: disambiguated the term "article id" in nntplib docs and - docstrings to either "article number" or "message id". - -- Bug #1238170: threading.Thread.__init__ no longer has "kwargs={}" as a - parameter, but uses the usual "kwargs=None". - -- textwrap now processes text chunks at O(n) speed instead of O(n**2). - Patch #1209527 (Contributed by Connelly). - -- urllib2 has now an attribute 'httpresponses' mapping from HTTP status code - to W3C name (404 -> 'Not Found'). RFE #1216944. - -- Bug #1177468: Don't cache the /dev/urandom file descriptor for os.urandom, - as this can cause problems with apps closing all file descriptors. - -- Bug #839151: Fix an attempt to access sys.argv in the warnings module - it can be missing in embedded interpreters - -- Bug #1155638: Fix a bug which affected HTTP 0.9 responses in httplib. - -- Bug #1100201: Cross-site scripting was possible on BaseHTTPServer via - error messages. - -- Bug #1108948: Cookie.py produced invalid JavaScript code. - -- The tokenize module now detects and reports indentation errors. - Bug #1224621. - -- The tokenize module has a new untokenize() function to support a full - roundtrip from lexed tokens back to Python sourcecode. In addition, - the generate_tokens() function now accepts a callable argument that - terminates by raising StopIteration. - -- Bug #1196315: fix weakref.WeakValueDictionary constructor. - -- Bug #1213894: os.path.realpath didn't resolve symlinks that were the first - component of the path. - -- Patch #1120353: The xmlrpclib module provides better, more transparent, - support for datetime.{datetime,date,time} objects. With use_datetime set - to True, applications shouldn't have to fiddle with the DateTime wrapper - class at all. - -- distutils.commands.upload was added to support uploading distribution - files to PyPI. - -- distutils.commands.register now encodes the data as UTF-8 before posting - them to PyPI. - -- decimal operator and comparison methods now return NotImplemented - instead of raising a TypeError when interacting with other types. This - allows other classes to implement __radd__ style methods and have them - work as expected. - -- Bug #1163325: Decimal infinities failed to hash. Attempting to - hash a NaN raised an InvalidOperation instead of a TypeError. - -- Patch #918101: Add tarfile open mode r|* for auto-detection of the - stream compression; add, for symmetry reasons, r:* as a synonym of r. - -- Patch #1043890: Add extractall method to tarfile. - -- Patch #1075887: Don't require MSVC in distutils if there is nothing - to build. - -- Patch #1103407: Properly deal with tarfile iterators when untarring - symbolic links on Windows. - -- Patch #645894: Use getrusage for computing the time consumption in - profile.py if available. - -- Patch #1046831: Use get_python_version where appropriate in sysconfig.py. - -- Patch #1117454: Remove code to special-case cookies without values - in LWPCookieJar. - -- Patch #1117339: Add cookielib special name tests. - -- Patch #1112812: Make bsddb/__init__.py more friendly for modulefinder. - -- Patch #1110248: SYNC_FLUSH the zlib buffer for GZipFile.flush. - -- Patch #1107973: Allow to iterate over the lines of a tarfile.ExFileObject. - -- Patch #1104111: Alter setup.py --help and --help-commands. - -- Patch #1121234: Properly cleanup _exit and tkerror commands. - -- Patch #1049151: xdrlib now unpacks booleans as True or False. - -- Fixed bug in a NameError bug in cookielib. Patch #1116583. - -- Applied a security fix to SimpleXMLRPCserver (PSF-2005-001). This - disables recursive traversal through instance attributes, which can - be exploited in various ways. - -- Bug #1222790: in SimpleXMLRPCServer, set the reuse-address and close-on-exec - flags on the HTTP listening socket. - -- Bug #792570: SimpleXMLRPCServer had problems if the request grew too large. - Fixed by reading the HTTP body in chunks instead of one big socket.read(). - -- Patches #893642, #1039083: add allow_none, encoding arguments to constructors of - SimpleXMLRPCServer and CGIXMLRPCRequestHandler. - -- Bug #1110478: Revert os.environ.update to do putenv again. - -- Bug #1103844: fix distutils.install.dump_dirs() with negated options. - -- os.{SEEK_SET, SEEK_CUR, SEEK_END} have been added for convenience. - -- Enhancements to the csv module: - - + Dialects are now validated by the underlying C code, better - reflecting its capabilities, and improving its compliance with - PEP 305. - + Dialect parameter parsing has been re-implemented to improve error - reporting. - + quotechar=None and quoting=QUOTE_NONE now work the way PEP 305 - dictates. - + the parser now removes the escapechar prefix from escaped characters. - + when quoting=QUOTE_NONNUMERIC, the writer now tests for numeric - types, rather than any object than can be represented as a numeric. - + when quoting=QUOTE_NONNUMERIC, the reader now casts unquoted fields - to floats. - + reader now allows \r characters to be quoted (previously it only allowed - \n to be quoted). - + writer doublequote handling improved. - + Dialect classes passed to the module are no longer instantiated by - the module before being parsed (the former validation scheme required - this, but the mechanism was unreliable). - + The dialect registry now contains instances of the internal - C-coded dialect type, rather than references to python objects. - + the internal c-coded dialect type is now immutable. - + register_dialect now accepts the same keyword dialect specifications - as the reader and writer, allowing the user to register dialects - without first creating a dialect class. - + a configurable limit to the size of parsed fields has been added - - previously, an unmatched quote character could result in the entire - file being read into the field buffer before an error was reported. - + A new module method csv.field_size_limit() has been added that sets - the parser field size limit (returning the former limit). The initial - limit is 128kB. - + A line_num attribute has been added to the reader object, which tracks - the number of lines read from the source iterator. This is not - the same as the number of records returned, as records can span - multiple lines. - + reader and writer objects were not being registered with the cyclic-GC. - This has been fixed. - -- _DummyThread objects in the threading module now delete self.__block that is - inherited from _Thread since it uses up a lock allocated by 'thread'. The - lock primitives tend to be limited in number and thus should not be wasted on - a _DummyThread object. Fixes bug #1089632. - -- The imghdr module now detects Exif files. - -- StringIO.truncate() now correctly adjusts the size attribute. - (Bug #951915). - -- locale.py now uses an updated locale alias table (built using - Tools/i18n/makelocalealias.py, a tool to parse the X11 locale - alias file); the encoding lookup was enhanced to use Python's - encoding alias table. - -- moved deprecated modules to Lib/lib-old: whrandom, tzparse, statcache. - -- the pickle module no longer accepts the deprecated None option in the - args tuple returned by __reduce__(). - -- optparse now optionally imports gettext. This allows its use in setup.py. - -- the pickle module no longer uses the deprecated bin parameter. - -- the shelve module no longer uses the deprecated binary parameter. - -- the pstats module no longer uses the deprecated ignore() method. - -- the filecmp module no longer uses the deprecated use_statcache argument. - -- unittest.TestCase.run() and unittest.TestSuite.run() can now be successfully - extended or overridden by subclasses. Formerly, the subclassed method would - be ignored by the rest of the module. (Bug #1078905). - -- heapq.nsmallest() and heapq.nlargest() now support key= arguments with - the same meaning as in list.sort(). - -- Bug #1076985: ``codecs.StreamReader.readline()`` now calls ``read()`` only - once when a size argument is given. This prevents a buffer overflow in the - tokenizer with very long source lines. - -- Bug #1083110: ``zlib.decompress.flush()`` would segfault if called - immediately after creating the object, without any intervening - ``.decompress()`` calls. - -- The reconvert.quote function can now emit triple-quoted strings. The - reconvert module now has some simple documentation. - -- ``UserString.MutableString`` now supports negative indices in - ``__setitem__`` and ``__delitem__`` - -- Bug #1149508: ``textwrap`` now handles hyphenated numbers (eg. "2004-03-05") - correctly. - -- Partial fixes for SF bugs #1163244 and #1175396: If a chunk read by - ``codecs.StreamReader.readline()`` has a trailing "\r", read one more - character even if the user has passed a size parameter to get a proper - line ending. Remove the special handling of a "\r\n" that has been split - between two lines. - -- Bug #1251300: On UCS-4 builds the "unicode-internal" codec will now complain - about illegal code points. The codec now supports PEP 293 style error - handlers. - -- Bug #1235646: ``codecs.StreamRecoder.next()`` now reencodes the data it reads - from the input stream, so that the output is a byte string in the correct - encoding instead of a unicode string. - -- Bug #1202493: Fixing SRE parser to handle '{}' as perl does, rather than - considering it exactly like a '*'. - -- Bug #1245379: Add "unicode-1-1-utf-7" as an alias for "utf-7" to - ``encodings.aliases``. - -- ` uu.encode()`` and ``uu.decode()`` now support unicode filenames. - -- Patch #1413711: Certain patterns of differences were making difflib - touch the recursion limit. - -Build ------ - -- Patch #1432345: Make python compile on DragonFly. - -- Build support for Win64-AMD64 was added. - -- Patch #1428494: Prefer linking against ncursesw over ncurses library. - -- Patch #881820: look for openpty and forkpty also in libbsd. - -- The sources of zlib are now part of the Python distribution (zlib 1.2.3). - The zlib module is now builtin on Windows. - -- Use -xcode=pic32 for CCSHARED on Solaris with SunPro. - -- Bug #1189330: configure did not correctly determine the necessary - value of LINKCC if python was built with GCC 4.0. - -- Upgrade Windows build to zlib 1.2.3 which eliminates a potential security - vulnerability in zlib 1.2.1 and 1.2.2. - -- EXTRA_CFLAGS has been introduced as an environment variable to hold compiler - flags that change binary compatibility. Changes were also made to - distutils.sysconfig to also use the environment variable when used during - compilation of the interpreter and of C extensions through distutils. - -- SF patch 1171735: Darwin 8's headers are anal about POSIX compliance, - and linking has changed (prebinding is now deprecated, and libcc_dynamic - no longer exists). This configure patch makes things right. - -- Bug #1158607: Build with --disable-unicode again. - -- spwdmodule.c is built only if either HAVE_GETSPNAM or HAVE_HAVE_GETSPENT is - defined. Discovered as a result of not being able to build on OS X. - -- setup.py now uses the directories specified in LDFLAGS using the -L option - and in CPPFLAGS using the -I option for adding library and include - directories, respectively, for compiling extension modules against. This has - led to the core being compiled using the values in CPPFLAGS. It also removes - the need for the special-casing of both DarwinPorts and Fink for darwin since - the proper directories can be specified in LDFLAGS (``-L/sw/lib`` for Fink, - ``-L/opt/local/lib`` for DarwinPorts) and CPPFLAGS (``-I/sw/include`` for - Fink, ``-I/opt/local/include`` for DarwinPorts). - -- Test in configure.in that checks for tzset no longer dependent on tm->tm_zone - to exist in the struct (not required by either ISO C nor the UNIX 2 spec). - Tests for sanity in tzname when HAVE_TZNAME defined were also defined. - Closes bug #1096244. Thanks Gregory Bond. - -C API ------ - -- Added a C API for set and frozenset objects. - -- Removed PyRange_New(). - -- Patch #1313939: PyUnicode_DecodeCharmap() accepts a unicode string as the - mapping argument now. This string is used as a mapping table. Byte values - greater than the length of the string and 0xFFFE are treated as undefined - mappings. - - -Tests ------ - -- In test_os, st_?time is now truncated before comparing it with ST_?TIME. - -- Patch #1276356: New resource "urlfetch" is implemented. This enables - even impatient people to run tests that require remote files. - - -Documentation -------------- - -- Bug #1402224: Add warning to dl docs about crashes. - -- Bug #1396471: Document that Windows' ftell() can return invalid - values for text files with UNIX-style line endings. - -- Bug #1274828: Document os.path.splitunc(). - -- Bug #1190204: Clarify which directories are searched by site.py. - -- Bug #1193849: Clarify os.path.expanduser() documentation. - -- Bug #1243192: re.UNICODE and re.LOCALE affect \d, \D, \s and \S. - -- Bug #755617: Document the effects of os.chown() on Windows. - -- Patch #1180012: The documentation for modulefinder is now in the library reference. - -- Patch #1213031: Document that os.chown() accepts argument values of -1. - -- Bug #1190563: Document os.waitpid() return value with WNOHANG flag. - -- Bug #1175022: Correct the example code for property(). - -- Document the IterableUserDict class in the UserDict module. - Closes bug #1166582. - -- Remove all latent references for "Macintosh" that referred to semantics for - Mac OS 9 and change to reflect the state for OS X. - Closes patch #1095802. Thanks Jack Jansen. - -Mac ---- - - -New platforms -------------- - -- FreeBSD 7 support is added. - - -Tools/Demos ------------ - -- Created Misc/Vim/vim_syntax.py to auto-generate a python.vim file in that - directory for syntax highlighting in Vim. Vim directory was added and placed - vimrc to it (was previous up a level). - -- Added two new files to Tools/scripts: pysource.py, which recursively - finds Python source files, and findnocoding.py, which finds Python - source files that need an encoding declaration. - Patch #784089, credits to Oleg Broytmann. - -- Bug #1072853: pindent.py used an uninitialized variable. - -- Patch #1177597: Correct Complex.__init__. - -- Fixed a display glitch in Pynche, which could cause the right arrow to - wiggle over by a pixel. - -What's New in Python 2.4 final? -=============================== - -*Release date: 30-NOV-2004* - -Core and builtins ------------------ - -- Bug 875692: Improve signal handling, especially when using threads, by - forcing an early re-execution of PyEval_EvalFrame() "periodic" code when - things_to_do is not cleared by Py_MakePendingCalls(). - - -What's New in Python 2.4 (release candidate 1) -============================================== - -*Release date: 18-NOV-2004* - -Core and builtins ------------------ - -- Bug 1061968: Fixes in 2.4a3 to address thread bug 1010677 reintroduced - the years-old thread shutdown race bug 225673. Numeric history lesson - aside, all bugs in all three reports are fixed now. - - -Library -------- - -- Bug 1052242: If exceptions are raised by an atexit handler function an - attempt is made to execute the remaining handlers. The last exception - raised is re-raised. - -- ``doctest``'s new support for adding ``pdb.set_trace()`` calls to - doctests was broken in a dramatic but shallow way. Fixed. - -- Bug 1065388: ``calendar``'s ``day_name``, ``day_abbr``, ``month_name``, - and ``month_abbr`` attributes emulate sequences of locale-correct - spellings of month and day names. Because the locale can change at - any time, the correct spelling is recomputed whenever one of these is - indexed. In the worst case, the index may be a slice object, so these - recomputed every day or month name each time they were indexed. This is - much slower than necessary in the usual case, when the index is just an - integer. In that case, only the single spelling needed is recomputed - now; and, when the index is a slice object, only the spellings needed - by the slice are recomputed now. - -- Patch 1061679: Added ``__all__`` to pickletools.py. - -Build ------ - -- Bug 1034277 / Patch 1035255: Remove compilation of core against CoreServices - and CoreFoundation on OS X. Involved removing PyMac_GetAppletScriptFile() - which has no known users. Thanks Bob Ippolito. - -C API ------ - -- The PyRange_New() function is deprecated. - - -What's New in Python 2.4 beta 2? -================================ - -*Release date: 03-NOV-2004* - -License -------- - -The Python Software Foundation changed the license under which Python -is released, to remove Python version numbers. There were no other -changes to the license. So, for example, wherever the license for -Python 2.3 said "Python 2.3", the new license says "Python". The -intent is to make it possible to refer to the PSF license in a more -durable way. For example, some people say they're confused by that -the Open Source Initiative's entry for the Python Software Foundation -License:: - - http://www.opensource.org/licenses/PythonSoftFoundation.php - -says "Python 2.1.1" all over it, wondering whether it applies only -to Python 2.1.1. - -The official name of the new license is the Python Software Foundation -License Version 2. - -Core and builtins ------------------ - -- Bug #1055820 Cyclic garbage collection was not protecting against that - calling a live weakref to a piece of cyclic trash could resurrect an - insane mutation of the trash if any Python code ran during gc (via - running a dead object's __del__ method, running another callback on a - weakref to a dead object, or via any Python code run in any other thread - that managed to obtain the GIL while a __del__ or callback was running - in the thread doing gc). The most likely symptom was "impossible" - ``AttributeError`` exceptions, appearing seemingly at random, on weakly - referenced objects. The cure was to clear all weakrefs to unreachable - objects before allowing any callbacks to run. - -- Bug #1054139 _PyString_Resize() now invalidates its cached hash value. - -Extension Modules ------------------ - -- Bug #1048870: the compiler now generates distinct code objects for - functions with identical bodies. This was producing confusing - traceback messages which pointed to the function where the code - object was first defined rather than the function being executed. - -Library -------- - -- Patch #1056967 changes the semantics of Template.safe_substitute() so that - no ValueError is raised on an 'invalid' match group. Now the delimiter is - returned. - -- Bug #1052503 pdb.runcall() was not passing along keyword arguments. - -- Bug #902037: XML.sax.saxutils.prepare_input_source() now combines relative - paths with a base path before checking os.path.isfile(). - -- The whichdb module can now be run from the command line. - -- Bug #1045381: time.strptime() can now infer the date using %U or %W (week of - the year) when the day of the week and year are also specified. - -- Bug #1048816: fix bug in Ctrl-K at start of line in curses.textpad.Textbox - -- Bug #1017553: fix bug in tarfile.filemode() - -- Patch #737473: fix bug that old source code is shown in tracebacks even if - the source code is updated and reloaded. - -Build ------ - -- Patch #1044395: --enable-shared is allowed in FreeBSD also. - -What's New in Python 2.4 beta 1? -================================ - -*Release date: 15-OCT-2004* - -Core and builtins ------------------ - -- Patch #975056: Restartable signals were not correctly disabled on - BSD systems. Consistently use PyOS_setsig() instead of signal(). - -- The internal portable implementation of thread-local storage (TLS), used - by the ``PyGILState_Ensure()``/``PyGILState_Release()`` API, was not - thread-correct. This could lead to a variety of problems, up to and - including segfaults. See bug 1041645 for an example. - -- Added a command line option, -m module, which searches sys.path for the - module and then runs it. (Contributed by Nick Coghlan.) - -- The bytecode optimizer now folds tuples of constants into a single - constant. - -- SF bug #513866: Float/long comparison anomaly. Prior to 2.4b1, when - an integer was compared to a float, the integer was coerced to a float. - That could yield spurious overflow errors (if the integer was very - large), and to anomalies such as - ``long(1e200)+1 == 1e200 == long(1e200)-1``. Coercion to float is no - longer performed, and cases like ``long(1e200)-1 < 1e200``, - ``long(1e200)+1 > 1e200`` and ``(1 << 20000) > 1e200`` are computed - correctly now. - -Extension modules ------------------ - -- ``collections.deque`` objects didn't play quite right with garbage - collection, which could lead to a segfault in a release build, or - an assert failure in a debug build. Also, added overflow checks, - better detection of mutation during iteration, and shielded deque - comparisons from unusual subclass overrides of the __iter__() method. - -Library -------- - -- Patch 1046644: distutils build_ext grew two new options - --swig for - specifying the swig executable to use, and --swig-opts to specify - options to pass to swig. --swig-opts="-c++" is the new way to spell - --swig-cpp. - -- Patch 983206: distutils now obeys environment variable LDSHARED, if - it is set. - -- Added Peter Astrand's subprocess.py module. See PEP 324 for details. - -- time.strptime() now properly escapes timezones and all other locale-specific - strings for regex-specific symbols. Was breaking under Japanese Windows when - the timezone was specified as "Tokyo (standard time)". - Closes bug #1039270. - -- Updates for the email package: - - + email.Utils.formatdate() grew a 'usegmt' argument for HTTP support. - + All deprecated APIs that in email 2.x issued warnings have been removed: - _encoder argument to the MIMEText constructor, Message.add_payload(), - Utils.dump_address_pair(), Utils.decode(), Utils.encode() - + New deprecations: Generator.__call__(), Message.get_type(), - Message.get_main_type(), Message.get_subtype(), the 'strict' argument to - the Parser constructor. These will be removed in email 3.1. - + Support for Python earlier than 2.3 has been removed (see PEP 291). - + All defect classes have been renamed to end in 'Defect'. - + Some FeedParser fixes; also a MultipartInvariantViolationDefect will be - added to messages that claim to be multipart but really aren't. - + Updates to documentation. - -- re's findall() and finditer() functions now take an optional flags argument - just like the compile(), search(), and match() functions. Also, documented - the previously existing start and stop parameters for the findall() and - finditer() methods of regular expression objects. - -- rfc822 Messages now support iterating over the headers. - -- The (undocumented) tarfile.Tarfile.membernames has been removed; - applications should use the getmember function. - -- httplib now offers symbolic constants for the HTTP status codes. - -- SF bug #1028306: Trying to compare a ``datetime.date`` to a - ``datetime.datetime`` mistakenly compared only the year, month and day. - Now it acts like a mixed-type comparison: ``False`` for ``==``, - ``True`` for ``!=``, and raises ``TypeError`` for other comparison - operators. Because datetime is a subclass of date, comparing only the - base class (date) members can still be done, if that's desired, by - forcing using of the approprate date method; e.g., - ``a_date.__eq__(a_datetime)`` is true if and only if the year, month - and day members of ``a_date`` and ``a_datetime`` are equal. - -- bdist_rpm now supports command line options --force-arch, - {pre,post}-install, {pre,post}-uninstall, and - {prep,build,install,clean,verify}-script. - -- SF patch #998993: The UTF-8 and the UTF-16 stateful decoders now support - decoding incomplete input (when the input stream is temporarily exhausted). - ``codecs.StreamReader`` now implements buffering, which enables proper - readline support for the UTF-16 decoders. ``codecs.StreamReader.read()`` - has a new argument ``chars`` which specifies the number of characters to - return. ``codecs.StreamReader.readline()`` and - ``codecs.StreamReader.readlines()`` have a new argument ``keepends``. - Trailing "\n"s will be stripped from the lines if ``keepends`` is false. - -- The documentation for doctest is greatly expanded, and now covers all - the new public features (of which there are many). - -- ``doctest.master`` was put back in, and ``doctest.testmod()`` once again - updates it. This isn't good, because every ``testmod()`` call - contributes to bloating the "hidden" state of ``doctest.master``, but - some old code apparently relies on it. For now, all we can do is - encourage people to stitch doctests together via doctest's unittest - integration features instead. - -- httplib now handles ipv6 address/port pairs. - -- SF bug #1017864: ConfigParser now correctly handles default keys, - processing them with ``ConfigParser.optionxform`` when supplied, - consistent with the handling of config file entries and runtime-set - options. - -- SF bug #997050: Document, test, & check for non-string values in - ConfigParser. Moved the new string-only restriction added in - rev. 1.65 to the SafeConfigParser class, leaving existing - ConfigParser & RawConfigParser behavior alone, and documented the - conditions under which non-string values work. - -Build ------ - -- Building on darwin now includes /opt/local/include and /opt/local/lib for - building extension modules. This is so as to include software installed as - a DarwinPorts port - -- pyport.h now defines a Py_IS_NAN macro. It works as-is when the - platform C computes true for ``x != x`` if and only if X is a NaN. - Other platforms can override the default definition with a platform- - specific spelling in that platform's pyconfig.h. You can also override - pyport.h's default Py_IS_INFINITY definition now. - -C API ------ - -- SF patch 1044089: New function ``PyEval_ThreadsInitialized()`` returns - non-zero if PyEval_InitThreads() has been called. - -- The undocumented and unused extern int ``_PyThread_Started`` was removed. - -- The C API calls ``PyInterpreterState_New()`` and ``PyThreadState_New()`` - are two of the very few advertised as being safe to call without holding - the GIL. However, this wasn't true in a debug build, as bug 1041645 - demonstrated. In a debug build, Python redirects the ``PyMem`` family - of calls to Python's small-object allocator, to get the benefit of - its extra debugging capabilities. But Python's small-object allocator - isn't threadsafe, relying on the GIL to avoid the expense of doing its - own locking. ``PyInterpreterState_New()`` and ``PyThreadState_New()`` - call the platform ``malloc()`` directly now, regardless of build type. - -- PyLong_AsUnsignedLong[Mask] now support int objects as well. - -- SF patch #998993: ``PyUnicode_DecodeUTF8Stateful`` and - ``PyUnicode_DecodeUTF16Stateful`` have been added, which implement stateful - decoding. - -Tests ------ - -- test__locale ported to unittest - -Mac ---- - -- ``plistlib`` now supports non-dict root objects. There is also a new - interface for reading and writing plist files: ``readPlist(pathOrFile)`` - and ``writePlist(rootObject, pathOrFile)`` - -Tools/Demos ------------ - -- The text file comparison scripts ``ndiff.py`` and ``diff.py`` now - read the input files in universal-newline mode. This spares them - from consuming a great deal of time to deduce the useless result that, - e.g., a file with Windows line ends and a file with Linux line ends - have no lines in common. - - -What's New in Python 2.4 alpha 3? -================================= - -*Release date: 02-SEP-2004* - -Core and builtins ------------------ - -- SF patch #1007189: ``from ... import ...`` statements now allow the name - list to be surrounded by parentheses. - -- Some speedups for long arithmetic, thanks to Trevor Perrin. Gradeschool - multiplication was sped a little by optimizing the C code. Gradeschool - squaring was sped by about a factor of 2, by exploiting that about half - the digit products are duplicates in a square. Because exponentiation - uses squaring often, this also speeds long power. For example, the time - to compute 17**1000000 dropped from about 14 seconds to 9 on my box due - to this much. The cutoff for Karatsuba multiplication was raised, - since gradeschool multiplication got quicker, and the cutoff was - aggressively small regardless. The exponentiation algorithm was switched - from right-to-left to left-to-right, which is more efficient for small - bases. In addition, if the exponent is large, the algorithm now does - 5 bits (instead of 1 bit) at a time. That cut the time to compute - 17**1000000 on my box in half again, down to about 4.5 seconds. - -- OverflowWarning is no longer generated. PEP 237 scheduled this to - occur in Python 2.3, but since OverflowWarning was disabled by default, - nobody realized it was still being generated. On the chance that user - code is still using them, the Python builtin OverflowWarning, and - corresponding C API PyExc_OverflowWarning, will exist until Python 2.5. - -- Py_InitializeEx has been added. - -- Fix the order of application of decorators. The proper order is bottom-up; - the first decorator listed is the last one called. - -- SF patch #1005778. Fix a seg fault if the list size changed while - calling list.index(). This could happen if a rich comparison function - modified the list. - -- The ``func_name`` (a.k.a. ``__name__``) attribute of user-defined - functions is now writable. - -- code_new (a.k.a new.code()) now checks its arguments sufficiently - carefully that passing them on to PyCode_New() won't trigger calls - to Py_FatalError() or PyErr_BadInternalCall(). It is still the case - that the returned code object might be entirely insane. - -- Subclasses of string can no longer be interned. The semantics of - interning were not clear here -- a subclass could be mutable, for - example -- and had bugs. Explicitly interning a subclass of string - via intern() will raise a TypeError. Internal operations that attempt - to intern a string subclass will have no effect. - -- Bug 1003935: xrange() could report bogus OverflowErrors. Documented - what xrange() intends, and repaired tests accordingly. - -Extension modules ------------------ - -- difflib now supports HTML side-by-side diff. - -- os.urandom has been added for systems that support sources of random - data. - -- Patch 1012740: truncate() on a writeable cStringIO now resets the - position to the end of the stream. This is consistent with the original - StringIO module and avoids inadvertently resurrecting data that was - supposed to have been truncated away. - -- Added socket.socketpair(). - -- Added CurrentByteIndex, CurrentColumnNumber, CurrentLineNumber - members to xml.parsers.expat.XMLParser object. - -- The mpz, rotor, and xreadlines modules, all deprecated in earlier - versions of Python, have now been removed. - -Library -------- - -- Patch #934356: if a module defines __all__, believe that rather than using - heuristics for filtering out imported names. - -- Patch #941486: added os.path.lexists(), which returns True for broken - symlinks, unlike os.path.exists(). - -- the random module now uses os.urandom() for seeding if it is available. - Added a new generator based on os.urandom(). - -- difflib and diff.py can now generate HTML. - -- bdist_rpm now includes version and release in the BuildRoot, and - replaces - by ``_`` in version and release. - -- distutils build/build_scripts now has an -e option to specify the - path to the Python interpreter for installed scripts. - -- PEP 292 classes Template and SafeTemplate are added to the string module. - -- tarfile now generates GNU tar files by default. - -- HTTPResponse has now a getheaders method. - -- Patch #1006219: let inspect.getsource handle '@' decorators. Thanks Simon - Percivall. - -- logging.handlers.SMTPHandler.date_time has been removed; - the class now uses email.Utils.formatdate to generate the time stamp. - -- A new function tkFont.nametofont was added to return an existing - font. The Font class constructor now has an additional exists argument - which, if True, requests to return/configure an existing font, rather - than creating a new one. - -- Updated the decimal package's min() and max() methods to match the - latest revision of the General Decimal Arithmetic Specification. - Quiet NaNs are ignored and equal values are sorted based on sign - and exponent. - -- The decimal package's Context.copy() method now returns deep copies. - -- Deprecated sys.exitfunc in favor of the atexit module. The sys.exitfunc - attribute will be kept around for backwards compatibility and atexit - will just become the one preferred way to do it. - -- patch #675551: Add get_history_item and replace_history_item functions - to the readline module. - -- bug #989672: pdb.doc and the help messages for the help_d and help_u methods - of the pdb.Pdb class gives have been corrected. d(own) goes to a newer - frame, u(p) to an older frame, not the other way around. - -- bug #990669: os.path.realpath() will resolve symlinks before normalizing the - path, as normalizing the path may alter the meaning of the path if it - contains symlinks. - -- bug #851123: shutil.copyfile will raise an exception when trying to copy a - file onto a link to itself. Thanks Gregory Ball. - -- bug #570300: Fix inspect to resolve file locations using os.path.realpath() - so as to properly list all functions in a module when the module itself is - reached through a symlink. Thanks Johannes Gijsbers. - -- doctest refactoring continued. See the docs for details. As part of - this effort, some old and little- (never?) used features are now - deprecated: the Tester class, the module is_private() function, and the - isprivate argument to testmod(). The Tester class supplied a feeble - "by hand" way to combine multiple doctests, if you knew exactly what - you were doing. The newer doctest features for unittest integration - already did a better job of that, are stronger now than ever, and the - new DocTestRunner class is a saner foundation if you want to do it by - hand. The "private name" filtering gimmick was a mistake from the - start, and testmod() changed long ago to ignore it by default. If - you want to filter out tests, the new DocTestFinder class can be used - to return a list of all doctests, and you can filter that list by - any computable criteria before passing it to a DocTestRunner instance. - -- Bug #891637, patch #1005466: fix inspect.getargs() crash on def foo((bar)). - -Tools/Demos ------------ - -- IDLE's shortcut keys for windows are now case insensitive so that - Control-V works the same as Control-v. - -- pygettext.py: Generate POT-Creation-Date header in ISO format. - -Build ------ - -- Backward incompatibility: longintrepr.h now triggers a compile-time - error if SHIFT (the number of bits in a Python long "digit") isn't - divisible by 5. This new requirement allows simple code for the new - 5-bits-at-a-time long_pow() implementation. If necessary, the - restriction could be removed (by complicating long_pow(), or by - falling back to the 1-bit-at-a-time algorithm), but there are no - plans to do so. - -- bug #991962: When building with --disable-toolbox-glue on Darwin no - attempt to build Mac-specific modules occurs. - -- The --with-tsc flag to configure to enable VM profiling with the - processor's timestamp counter now works on PPC platforms. - -- patch #1006629: Define _XOPEN_SOURCE to 500 on Solaris 8/9 to match - GCC's definition and avoid redefinition warnings. - -- Detect pthreads support (provided by gnu pth pthread emulation) on - GNU/k*BSD systems. - -- bug #1005737, #1007249: Fixed several build problems and warnings - found on old/legacy C compilers of HP-UX, IRIX and Tru64. - -C API ------ - -.. - -Documentation -------------- - -- patch #1005936, bug #1009373: fix index entries which contain - an underscore when viewed with Acrobat. - -- bug #990669: os.path.normpath may alter the meaning of a path if - it contains symbolic links. This has been documented in a comment - since 1992, but is now in the library reference as well. - -New platforms -------------- - -- FreeBSD 6 is now supported. - -Tests ------ - -.. - -Windows -------- - -- Boosted the stack reservation for python.exe and pythonw.exe from - the default 1MB to 2MB. Stack frames under VC 7.1 for 2.4 are enough - bigger than under VC 6.0 for 2.3.4 that deeply recursive progams - within the default sys.getrecursionlimit() default value of 1000 were - able to suffer undetected C stack overflows. The standard test program - test_compiler was one such program. If a Python process on Windows - "just vanishes" without a trace, and without an error message of any - kind, but with an exit code of 128, undetected stack overflow may be - the problem. - -Mac ---- - -.. - - -What's New in Python 2.4 alpha 2? -================================= - -*Release date: 05-AUG-2004* - -Core and builtins ------------------ - -- Patch #980695: Implements efficient string concatenation for statements - of the form s=s+t and s+=t. This will vary across implementations. - Accordingly, the str.join() method is strongly preferred for performance - sensitive code. - -- PEP-0318, Function Decorators have been added to the language. These are - implemented using the Java-style @decorator syntax, like so:: - - @staticmethod - def foo(bar): - - (The PEP needs to be updated to reflect the current state) - -- When importing a module M raises an exception, Python no longer leaves M - in sys.modules. Before 2.4a2 it did, and a subsequent import of M would - succeed, picking up a module object from sys.modules reflecting as much - of the initialization of M as completed before the exception was raised. - Subsequent imports got no indication that M was in a partially- - initialized state, and the importers could get into arbitrarily bad - trouble as a result (the M they got was in an unintended state, - arbitrarily far removed from M's author's intent). Now subsequent - imports of M will continue raising exceptions (but if, for example, the - source code for M is edited between import attempts, then perhaps later - attempts will succeed, or raise a different exception). - - This can break existing code, but in such cases the code was probably - working before by accident. In the Python source, the only case of - breakage discovered was in a test accidentally relying on a damaged - module remaining in sys.modules. Cases are also known where tests - deliberately provoking import errors remove damaged modules from - sys.modules themselves, and such tests will break now if they do an - unconditional del sys.modules[M]. - -- u'%s' % obj will now try obj.__unicode__() first and fallback to - obj.__str__() if no __unicode__ method can be found. - -- Patch #550732: Add PyArg_VaParseTupleAndKeywords(). Analogous to - PyArg_VaParse(). Both are now documented. Thanks Greg Chapman. - -- Allow string and unicode return types from .encode()/.decode() - methods on string and unicode objects. Added unicode.decode() - which was missing for no apparent reason. - -- An attempt to fix the mess that is Python's behaviour with - signal handlers and threads, complicated by readline's behaviour. - It's quite possible that there are still bugs here. - -- Added C macros Py_CLEAR and Py_VISIT to ease the implementation of - types that support garbage collection. - -- Compiler now treats None as a constant. - -- The type of values returned by __int__, __float__, __long__, - __oct__, and __hex__ are now checked. Returning an invalid type - will cause a TypeError to be raised. This matches the behavior of - Jython. - -- Implemented bind_textdomain_codeset() in locale module. - -- Added a workaround for proper string operations in BSDs. str.split - and str.is* methods can now work correctly with UTF-8 locales. - -- Bug #989185: unicode.iswide() and unicode.width() is dropped and - the East Asian Width support is moved to unicodedata extension - module. - -- Patch #941229: The source code encoding in interactive mode - now refers sys.stdin.encoding not just ISO-8859-1 anymore. This - allows for non-latin-1 users to write unicode strings directly. - -Extension modules ------------------ - -- cpickle now supports the same keyword arguments as pickle. - -Library -------- - -- Added new codecs and aliases for ISO_8859-11, ISO_8859-16 and - TIS-620 - -- Thanks to Edward Loper, doctest has been massively refactored, and - many new features were added. Full docs will appear later. For now - the doctest module comments and new test cases give good coverage. - The refactoring provides many hook points for customizing behavior - (such as how to report errors, and how to compare expected to actual - output). New features include a marker for expected - output containing blank lines, options to produce unified or context - diffs when actual output doesn't match expectations, an option to - normalize whitespace before comparing, and an option to use an - ellipsis to signify "don't care" regions of output. - -- Tkinter now supports the wish -sync and -use options. - -- The following methods in time support passing of None: ctime(), gmtime(), - and localtime(). If None is provided, the current time is used (the - same as when the argument is omitted). - [SF bug 658254, patch 663482] - -- nntplib does now allow to ignore a .netrc file. - -- urllib2 now recognizes Basic authentication even if other authentication - schemes are offered. - -- Bug #1001053. wave.open() now accepts unicode filenames. - -- gzip.GzipFile has a new fileno() method, to retrieve the handle of the - underlying file object (provided it has a fileno() method). This is - needed if you want to use os.fsync() on a GzipFile. - -- imaplib has two new methods: deleteacl and myrights. - -- nntplib has two new methods: description and descriptions. They - use a more RFC-compliant way of getting a newsgroup description. - -- Bug #993394. Fix a possible red herring of KeyError in 'threading' being - raised during interpreter shutdown from a registered function with atexit - when dummy_threading is being used. - -- Bug #857297/Patch #916874. Fix an error when extracting a hard link - from a tarfile. - -- Patch #846659. Fix an error in tarfile.py when using - GNU longname/longlink creation. - -- The obsolete FCNTL.py has been deleted. The builtin fcntl module - has been available (on platforms that support fcntl) since Python - 1.5a3, and all FCNTL.py did is export fcntl's names, after generating - a deprecation warning telling you to use fcntl directly. - -- Several new unicode codecs are added: big5hkscs, euc_jis_2004, - iso2022_jp_2004, shift_jis_2004. - -- Bug #788520. Queue.{get, get_nowait, put, put_nowait} have new - implementations, exploiting Conditions (which didn't exist at the time - Queue was introduced). A minor semantic change is that the Full and - Empty exceptions raised by non-blocking calls now occur only if the - queue truly was full or empty at the instant the queue was checked (of - course the Queue may no longer be full or empty by the time a calling - thread sees those exceptions, though). Before, the exceptions could - also be raised if it was "merely inconvenient" for the implementation - to determine the true state of the Queue (because the Queue was locked - by some other method in progress). - -- Bugs #979794 and #980117: difflib.get_grouped_opcodes() now handles the - case of comparing two empty lists. This affected both context_diff() and - unified_diff(), - -- Bug #980938: smtplib now prints debug output to sys.stderr. - -- Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by - returning the last point in the path that was not part of any loop. Thanks - AM Kuchling. - -- Bug #980327: ntpath not handles compressing erroneous slashes between the - drive letter and the rest of the path. Also clearly handles UNC addresses now - as well. Thanks Paul Moore. - -- bug #679953: zipfile.py should now work for files over 2 GB. The packed data - for file sizes (compressed and uncompressed) was being stored as signed - instead of unsigned. - -- decimal.py now only uses signals in the IBM spec. The other conditions are - no longer part of the public API. - -- codecs module now has two new generic APIs: encode() and decode() - which don't restrict the return types (unlike the unicode and - string methods of the same name). - -- Non-blocking SSL sockets work again; they were broken in Python 2.3. - SF patch 945642. - -- doctest unittest integration improvements: - - o Improved the unitest test output for doctest-based unit tests - - o Can now pass setUp and tearDown functions when creating - DocTestSuites. - -- The threading module has a new class, local, for creating objects - that provide thread-local data. - -- Bug #990307: when keep_empty_values is True, cgi.parse_qsl() - no longer returns spurious empty fields. - -- Implemented bind_textdomain_codeset() in gettext module. - -- Introduced in gettext module the l*gettext() family of functions, - which return translation strings encoded in the preferred encoding, - as informed by locale module's getpreferredencoding(). - -- optparse module (and tests) upgraded to Optik 1.5a1. Changes: - - - Add expansion of default values in help text: the string - "%default" in an option's help string is expanded to str() of - that option's default value, or "none" if no default value. - - - Bug #955889: option default values that happen to be strings are - now processed in the same way as values from the command line; this - allows generation of nicer help when using custom types. Can - be disabled with parser.set_process_default_values(False). - - - Bug #960515: don't crash when generating help for callback - options that specify 'type', but not 'dest' or 'metavar'. - - - Feature #815264: change the default help format for short options - that take an argument from e.g. "-oARG" to "-o ARG"; add - set_short_opt_delimiter() and set_long_opt_delimiter() methods to - HelpFormatter to allow (slight) customization of the formatting. - - - Patch #736940: internationalize Optik: all built-in user- - targeted literal strings are passed through gettext.gettext(). (If - you want translations (.po files), they're not included with Python - -- you'll find them in the Optik source distribution from - http://optik.sourceforge.net/ .) - - - Bug #878453: respect $COLUMNS environment variable for - wrapping help output. - - - Feature #988122: expand "%prog" in the 'description' passed - to OptionParser, just like in the 'usage' and 'version' strings. - (This is *not* done in the 'description' passed to OptionGroup.) - -C API ------ - -- PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx(): if an - error occurs while loading the module, these now delete the module's - entry from sys.modules. All ways of loading modules eventually call - one of these, so this is an error-case change in semantics for all - ways of loading modules. In rare cases, a module loader may wish - to keep a module object in sys.modules despite that the module's - code cannot be executed. In such cases, the module loader must - arrange to reinsert the name and module object in sys.modules. - PyImport_ReloadModule() has been changed to reinsert the original - module object into sys.modules if the module reload fails, so that - its visible semantics have not changed. - -- A large pile of datetime field-extraction macros is now documented, - thanks to Anthony Tuininga (patch #986010). - -Documentation -------------- - -- Improved the tutorial on creating types in C. - - - point out the importance of reassigning data members before - assigning their values - - - correct my misconception about return values from visitprocs. Sigh. - - - mention the labor saving Py_VISIT and Py_CLEAR macros. - -- Major rewrite of the math module docs, to address common confusions. - -Tests ------ - -- The test data files for the decimal test suite are now installed on - platforms that use the Makefile. - -- SF patch 995225: The test file testtar.tar accidentally contained - CVS keywords (like $Id$), which could cause spurious failures in - test_tarfile.py depending on how the test file was checked out. - - -What's New in Python 2.4 alpha 1? -================================= - -*Release date: 08-JUL-2004* - -Core and builtins ------------------ - -- weakref.ref is now the type object also known as - weakref.ReferenceType; it can be subclassed like any other new-style - class. There's less per-entry overhead in WeakValueDictionary - objects now (one object instead of three). - -- Bug #951851: Python crashed when reading import table of certain - Windows DLLs. - -- Bug #215126. The locals argument to eval(), execfile(), and exec now - accept any mapping type. - -- marshal now shares interned strings. This change introduces - a new .pyc magic. - -- Bug #966623. classes created with type() in an exec(, {}) don't - have a __module__, but code in typeobject assumed it would always - be there. - -- Python no longer relies on the LC_NUMERIC locale setting to be - the "C" locale; as a result, it no longer tries to prevent changing - the LC_NUMERIC category. - -- Bug #952807: Unpickling pickled instances of subclasses of - datetime.date, datetime.datetime and datetime.time could yield insane - objects. Thanks to Jiwon Seo for a fix. - -- Bug #845802: Python crashes when __init__.py is a directory. - -- Unicode objects received two new methods: iswide() and width(). - These query East Asian width information, as specified in Unicode - TR11. - -- Improved the tuple hashing algorithm to give fewer collisions in - common cases. Fixes bug #942952. - -- Implemented generator expressions (PEP 289). Coded by Jiwon Seo. - -- Enabled the profiling of C extension functions (and builtins) - check - new documentation and modified profile and bdb modules for more details - -- Set file.name to the object passed to open (instead of a new string) - -- Moved tracebackobject into traceback.h and renamed to PyTracebackObject - -- Optimized the byte coding for multiple assignments like "a,b=b,a" and - "a,b,c=1,2,3". Improves their speed by 25% to 30%. - -- Limit the nested depth of a tuple for the second argument to isinstance() - and issubclass() to the recursion limit of the interpreter. - Fixes bug #858016 . - -- Optimized dict iterators, creating separate types for each - and having them reveal their length. Also optimized the - methods: keys(), values(), and items(). - -- Implemented a newcode opcode, LIST_APPEND, that simplifies - the generated bytecode for list comprehensions and further - improves their performance (about 35%). - -- Implemented rich comparisons for floats, which seems to make - comparisons involving NaNs somewhat less surprising when the - underlying C compiler actually implements C99 semantics. - -- Optimized list.extend() to save memory and no longer create - intermediate sequences. Also, extend() now pre-allocates the - needed memory whenever the length of the iterable is known in - advance -- this halves the time to extend the list. - -- Optimized list resize operations to make fewer calls to the system - realloc(). Significantly speeds up list appends, list pops, - list comprehensions, and the list constructor (when the input iterable - length is not known). - -- Changed the internal list over-allocation scheme. For larger lists, - overallocation ranged between 3% and 25%. Now, it is a constant 12%. - For smaller lists (n<8), overallocation was upto eight elements. Now, - the overallocation is no more than three elements -- this improves space - utilization for applications that have large numbers of small lists. - -- Most list bodies now get re-used rather than freed. Speeds up list - instantiation and deletion by saving calls to malloc() and free(). - -- The dict.update() method now accepts all the same argument forms - as the dict() constructor. This now includes item lists and/or - keyword arguments. - -- Support for arbitrary objects supporting the read-only buffer - interface as the co_code field of code objects (something that was - only possible to create from C code) has been removed. - -- Made omitted callback and None equivalent for weakref.ref() and - weakref.proxy(); the None case wasn't handled correctly in all - cases. - -- Fixed problem where PyWeakref_NewRef() and PyWeakref_NewProxy() - assumed that initial existing entries in an object's weakref list - would not be removed while allocating a new weakref object. Since - GC could be invoked at that time, however, that assumption was - invalid. In a truly obscure case of GC being triggered during - creation for a new weakref object for an referent which already - has a weakref without a callback which is only referenced from - cyclic trash, a memory error can occur. This consistently created a - segfault in a debug build, but provided less predictable behavior in - a release build. - -- input() builtin function now respects compiler flags such as - __future__ statements. SF patch 876178. - -- Removed PendingDeprecationWarning from apply(). apply() remains - deprecated, but the nuisance warning will not be issued. - -- At Python shutdown time (Py_Finalize()), 2.3 called cyclic garbage - collection twice, both before and after tearing down modules. The - call after tearing down modules has been disabled, because too much - of Python has been torn down then for __del__ methods and weakref - callbacks to execute sanely. The most common symptom was a sequence - of uninformative messages on stderr when Python shut down, produced - by threads trying to raise exceptions, but unable to report the nature - of their problems because too much of the sys module had already been - destroyed. - -- Removed FutureWarnings related to hex/oct literals and conversions - and left shifts. (Thanks to Kalle Svensson for SF patch 849227.) - This addresses most of the remaining semantic changes promised by - PEP 237, except for repr() of a long, which still shows the trailing - 'L'. The PEP appears to promise warnings for operations that - changed semantics compared to Python 2.3, but this is not - implemented; we've suffered through enough warnings related to - hex/oct literals and I think it's best to be silent now. - -- For str and unicode objects, the ljust(), center(), and rjust() - methods now accept an optional argument specifying a fill - character other than a space. - -- When method objects have an attribute that can be satisfied either - by the function object or by the method object, the function - object's attribute usually wins. Christian Tismer pointed out that - that this is really a mistake, because this only happens for special - methods (like __reduce__) where the method object's version is - really more appropriate than the function's attribute. So from now - on, all method attributes will have precedence over function - attributes with the same name. - -- Critical bugfix, for SF bug 839548: if a weakref with a callback, - its callback, and its weakly referenced object, all became part of - cyclic garbage during a single run of garbage collection, the order - in which they were torn down was unpredictable. It was possible for - the callback to see partially-torn-down objects, leading to immediate - segfaults, or, if the callback resurrected garbage objects, to - resurrect insane objects that caused segfaults (or other surprises) - later. In one sense this wasn't surprising, because Python's cyclic gc - had no knowledge of Python's weakref objects. It does now. When - weakrefs with callbacks become part of cyclic garbage now, those - weakrefs are cleared first. The callbacks don't trigger then, - preventing the problems. If you need callbacks to trigger, then just - as when cyclic gc is not involved, you need to write your code so - that weakref objects outlive the objects they weakly reference. - -- Critical bugfix, for SF bug 840829: if cyclic garbage collection - happened to occur during a weakref callback for a new-style class - instance, subtle memory corruption was the result (in a release build; - in a debug build, a segfault occurred reliably very soon after). - This has been repaired. - -- Compiler flags set in PYTHONSTARTUP are now active in __main__. - -- Added two builtin types, set() and frozenset(). - -- Added a reversed() builtin function that returns a reverse iterator - over a sequence. - -- Added a sorted() builtin function that returns a new sorted list - from any iterable. - -- CObjects are now mutable (on the C level) through PyCObject_SetVoidPtr. - -- list.sort() now supports three keyword arguments: cmp, key, and reverse. - The key argument can be a function of one argument that extracts a - comparison key from the original record: mylist.sort(key=str.lower). - The reverse argument is a boolean value and if True will change the - sort order as if the comparison arguments were reversed. In addition, - the documentation has been amended to provide a guarantee that all sorts - starting with Py2.3 are guaranteed to be stable (the relative order of - records with equal keys is unchanged). - -- Added test whether wchar_t is signed or not. A signed wchar_t is not - usable as internal unicode type base for Py_UNICODE since the - unicode implementation assumes an unsigned type. - -- Fixed a bug in the cache of length-one Unicode strings that could - lead to a seg fault. The specific problem occurred when an earlier, - non-fatal error left an uninitialized Unicode object in the - freelist. - -- The % formatting operator now supports '%F' which is equivalent to - '%f'. This has always been documented but never implemented. - -- complex(obj) could leak a little memory if obj wasn't a string or - number. - -- zip() with no arguments now returns an empty list instead of raising - a TypeError exception. - -- obj.__contains__() now returns True/False instead of 1/0. SF patch - 820195. - -- Python no longer tries to be smart about recursive comparisons. - When comparing containers with cyclic references to themselves it - will now just hit the recursion limit. See SF patch 825639. - -- str and unicode builtin types now have an rsplit() method that is - same as split() except that it scans the string from the end - working towards the beginning. See SF feature request 801847. - -- Fixed a bug in object.__reduce_ex__ when using protocol 2. Failure - to clear the error when attempts to get the __getstate__ attribute - fail caused intermittent errors and odd behavior. - -- buffer objects based on other objects no longer cache a pointer to - the data and the data length. Instead, the appropriate tp_as_buffer - method is called as necessary. - -- fixed: if a file is opened with an explicit buffer size >= 1, repeated - close() calls would attempt to free() the buffer already free()ed on - the first call. - - -Extension modules ------------------ - -- Added socket.getservbyport(), and make the second argument in - getservbyname() and getservbyport() optional. - -- time module code that deals with input POSIX timestamps will now raise - ValueError if more than a second is lost in precision when the - timestamp is cast to the platform C time_t type. There's no chance - that the platform will do anything sensible with the result in such - cases. This includes ctime(), localtime() and gmtime(). Assorted - fromtimestamp() and utcfromtimestamp() methods in the datetime module - were also protected. Closes bugs #919012 and 975996. - -- fcntl.ioctl now warns if the mutate flag is not specified. - -- nt now properly allows to refer to UNC roots, e.g. in nt.stat(). - -- the weakref module now supports additional objects: array.array, - sre.pattern_objects, file objects, and sockets. - -- operator.isMappingType() and operator.isSequenceType() now give - fewer false positives. - -- socket.sslerror is now a subclass of socket.error . Also added - socket.error to the socket module's C API. - -- Bug #920575: A problem where the _locale module segfaults on - nl_langinfo(ERA) caused by GNU libc's illegal NULL return is fixed. - -- array objects now support the copy module. Also, their resizing - scheme has been updated to match that used for list objects. This improves - the performance (speed and memory usage) of append() operations. - Also, array.array() and array.extend() now accept any iterable argument - for repeated appends without needing to create another temporary array. - -- cStringIO.writelines() now accepts any iterable argument and writes - the lines one at a time rather than joining them and writing once. - Made a parallel change to StringIO.writelines(). Saves memory and - makes suitable for use with generator expressions. - -- time.strftime() now checks that the values in its time tuple argument - are within the proper boundaries to prevent possible crashes from the - platform's C library implementation of strftime(). Can possibly - break code that uses values outside the range that didn't cause - problems previously (such as sitting day of year to 0). Fixes bug - #897625. - -- The socket module now supports Bluetooth sockets, if the - system has - -- Added a collections module containing a new datatype, deque(), - offering high-performance, thread-safe, memory friendly appends - and pops on either side of the deque. - -- Several modules now take advantage of collections.deque() for - improved performance: Queue, mutex, shlex, threading, and pydoc. - -- The operator module has two new functions, attrgetter() and - itemgetter() which are useful for creating fast data extractor - functions for map(), list.sort(), itertools.groupby(), and - other functions that expect a function argument. - -- socket.SHUT_{RD,WR,RDWR} was added. - -- os.getsid was added. - -- The pwd module incorrectly advertised its struct type as - struct_pwent; this has been renamed to struct_passwd. (The old name - is still supported for backwards compatibility.) - -- The xml.parsers.expat module now provides Expat 1.95.7. - -- socket.IPPROTO_IPV6 was added. - -- readline.clear_history was added. - -- select.select() now accepts sequences for its first three arguments. - -- cStringIO now supports the f.closed attribute. - -- The signal module now exposes SIGRTMIN and SIGRTMAX (if available). - -- curses module now supports use_default_colors(). [patch #739124] - -- Bug #811028: ncurses.h breakage on FreeBSD/MacOS X - -- Bug #814613: INET_ADDRSTRLEN fix needed for all compilers on SGI - -- Implemented non-recursive SRE matching scheme (#757624). - -- Implemented (?(id/name)yes|no) support in SRE (#572936). - -- random.seed() with no arguments or None uses time.time() as a default - seed. Modified to match Py2.2 behavior and use fractional seconds so - that successive runs are more likely to produce different sequences. - -- random.Random has a new method, getrandbits(k), which returns an int - with k random bits. This method is now an optional part of the API - for user defined generators. Any generator that defines genrandbits() - can now use randrange() for ranges with a length >= 2**53. Formerly, - randrange would return only even numbers for ranges that large (see - SF bug #812202). Generators that do not define genrandbits() now - issue a warning when randrange() is called with a range that large. - -- itertools has a new function, groupby() for aggregating iterables - into groups sharing the same key (as determined by a key function). - It offers some of functionality of SQL's groupby keyword and of - the Unix uniq filter. - -- itertools now has a new tee() function which produces two independent - iterators from a single iterable. - -- itertools.izip() with no arguments now returns an empty iterator instead - of raising a TypeError exception. - -- Fixed #853061: allow BZ2Compressor.compress() to receive an empty string - as parameter. - -Library -------- - -- Added a new module: cProfile, a C profiler with the same interface as the - profile module. cProfile avoids some of the drawbacks of the hotshot - profiler and provides a bit more information than the other two profilers. - Based on "lsprof" (patch #1212837). - -- Bug #1266283: The new function "lexists" is now in os.path.__all__. - -- Bug #981530: Fix UnboundLocalError in shutil.rmtree(). This affects - the documented behavior: the function passed to the onerror() - handler can now also be os.listdir. - -- Bug #754449: threading.Thread objects no longer mask exceptions raised during - interpreter shutdown with another exception from attempting to handle the - original exception. - -- Added decimal.py per PEP 327. - -- Bug #981299: rsync is now a recognized protocol in urlparse that uses a - "netloc" portion of a URL. - -- Bug #919012: shutil.move() will not try to move a directory into itself. - Thanks Johannes Gijsbers. - -- Bug #934282: pydoc.stripid() is now case-insensitive. Thanks Robin Becker. - -- Bug #823209: cmath.log() now takes an optional base argument so that its - API matches math.log(). - -- Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions - that generate a -debuginfo.rpm - -- os.path.devnull has been added for all supported platforms. - -- Fixed #877165: distutils now picks the right C++ compiler command - on cygwin and mingw32. - -- urllib.urlopen().readline() now handles HTTP/0.9 correctly. - -- refactored site.py into functions. Also wrote regression tests for the - module. - -- The distutils install command now supports the --home option and - installation scheme for all platforms. - -- asyncore.loop now has a repeat count parameter that defaults to - looping forever. - -- The distutils sdist command now ignores all .svn directories, in - addition to CVS and RCS directories. .svn directories hold - administrative files for the Subversion source control system. - -- Added a new module: cookielib. Automatic cookie handling for HTTP - clients. Also, support for cookielib has been added to urllib2, so - urllib2.urlopen() can transparently handle cookies. - -- stringprep.py now uses built-in set() instead of sets.Set(). - -- Bug #876278: Unbounded recursion in modulefinder - -- Bug #780300: Swap public and system ID in LexicalHandler.startDTD. - Applications relying on the wrong order need to be corrected. - -- Bug #926075: Fixed a bug that returns a wrong pattern object - for a string or unicode object in sre.compile() when a different - type pattern with the same value exists. - -- Added countcallers arg to trace.Trace class (--trackcalls command line arg - when run from the command prompt). - -- Fixed a caching bug in platform.platform() where the argument of 'terse' was - not taken into consideration when caching value. - -- Added two new command-line arguments for profile (output file and - default sort). - -- Added global runctx function to profile module - -- Add hlist missing entryconfigure and entrycget methods. - -- The ptcp154 codec was added for Kazakh character set support. - -- Support non-anonymous ftp URLs in urllib2. - -- The encodings package will now apply codec name aliases - first before starting to try the import of the codec module. - This simplifies overriding built-in codecs with external - packages, e.g. the included CJK codecs with the JapaneseCodecs - package, by adjusting the aliases dictionary in encodings.aliases - accordingly. - -- base64 now supports RFC 3548 Base16, Base32, and Base64 encoding and - decoding standards. - -- urllib2 now supports processors. A processor is a handler that - implements an xxx_request or xxx_response method. These methods are - called for all requests. - -- distutils compilers now compile source files in the same order as - they are passed to the compiler. - -- pprint.pprint() and pprint.pformat() now have additional parameters - indent, width and depth. - -- Patch #750542: pprint now will pretty print subclasses of list, tuple - and dict too, as long as they don't overwrite __repr__(). - -- Bug #848614: distutils' msvccompiler fails to find the MSVC6 - compiler because of incomplete registry entries. - -- httplib.HTTP.putrequest now offers to omit the implicit Accept-Encoding. - -- Patch #841977: modulefinder didn't find extension modules in packages - -- imaplib.IMAP4.thread was added. - -- Plugged a minor hole in tempfile.mktemp() due to the use of - os.path.exists(), switched to using os.lstat() directly if possible. - -- bisect.py and heapq.py now have underlying C implementations - for better performance. - -- heapq.py has two new functions, nsmallest() and nlargest(). - -- traceback.format_exc has been added (similar to print_exc but it returns - a string). - -- xmlrpclib.MultiCall has been added. - -- poplib.POP3_SSL has been added. - -- tmpfile.mkstemp now returns an absolute path even if dir is relative. - -- urlparse is RFC 2396 compliant. - -- The fieldnames argument to the csv module's DictReader constructor is now - optional. If omitted, the first row of the file will be used as the - list of fieldnames. - -- encodings.bz2_codec was added for access to bz2 compression - using "a long string".encode('bz2') - -- Various improvements to unittest.py, realigned with PyUnit CVS. - -- dircache now passes exceptions to the caller, instead of returning - empty lists. - -- The bsddb module and dbhash module now support the iterator and - mapping protocols which make them more substitutable for dictionaries - and shelves. - -- The csv module's DictReader and DictWriter classes now accept keyword - arguments. This was an omission in the initial implementation. - -- The email package handles some RFC 2231 parameters with missing - CHARSET fields better. It also includes a patch to parameter - parsing when semicolons appear inside quotes. - -- sets.py now runs under Py2.2. In addition, the argument restrictions - for most set methods (but not the operators) have been relaxed to - allow any iterable. - -- _strptime.py now has a behind-the-scenes caching mechanism for the most - recent TimeRE instance used along with the last five unique directive - patterns. The overall module was also made more thread-safe. - -- random.cunifvariate() and random.stdgamma() were deprecated in Py2.3 - and removed in Py2.4. - -- Bug #823328: urllib2.py's HTTP Digest Auth support works again. - -- Patch #873597: CJK codecs are imported into rank of default codecs. - -Tools/Demos ------------ - -- A hotshotmain script was added to the Tools/scripts directory that - makes it easy to run a script under control of the hotshot profiler. - -- The db2pickle and pickle2db scripts can now dump/load gdbm files. - -- The file order on the command line of the pickle2db script was reversed. - It is now [ picklefile ] dbfile. This provides better symmetry with - db2pickle. The file arguments to both scripts are now source followed by - destination in situations where both files are given. - -- The pydoc script will display a link to the module documentation for - modules determined to be part of the core distribution. The documentation - base directory defaults to http://www.python.org/doc/current/lib/ but can - be changed by setting the PYTHONDOCS environment variable. - -- texcheck.py now detects double word errors. - -- md5sum.py mistakenly opened input files in text mode by default, a - silent and dangerous change from previous releases. It once again - opens input files in binary mode by default. The -t and -b flags - remain for compatibility with the 2.3 release, but -b is the default - now. - -- py-electric-colon now works when pending-delete/delete-selection mode is - in effect - -- py-help-at-point is no longer bound to the F1 key - it's still bound to - C-c C-h - -- Pynche was fixed to not crash when there is no ~/.pynche file and no - -d option was given. - -Build ------ - -- Bug #978645: Modules/getpath.c now builds properly in --disable-framework - build under OS X. - -- Profiling using gprof is now available if Python is configured with - --enable-profiling. - -- Profiling the VM using the Pentium TSC is now possible if Python - is configured --with-tsc. - -- In order to find libraries, setup.py now also looks in /lib64, for use - on AMD64. - -- Bug #934635: Fixed a bug where the configure script couldn't detect - getaddrinfo() properly if the KAME stack had SCTP support. - -- Support for missing ANSI C header files (limits.h, stddef.h, etc) was - removed. - -- Systems requiring the D4, D6 or D7 variants of pthreads are no longer - supported (see PEP 11). - -- Universal newline support can no longer be disabled (see PEP 11). - -- Support for DGUX, SunOS 4, IRIX 4 and Minix was removed (see PEP 11). - -- Support for systems requiring --with-dl-dld or --with-sgi-dl was removed - (see PEP 11). - -- Tests for sizeof(char) were removed since ANSI C mandates that - sizeof(char) must be 1. - -C API ------ - -- Thanks to Anthony Tuininga, the datetime module now supplies a C API - containing type-check macros and constructors. See new docs in the - Python/C API Reference Manual for details. - -- Private function _PyTime_DoubleToTimet added, to convert a Python - timestamp (C double) to platform time_t with some out-of-bounds - checking. Declared in new header file timefuncs.h. It would be - good to expose some other internal timemodule.c functions there. - -- New public functions PyEval_EvaluateFrame and PyGen_New to expose - generator objects. - -- New public functions Py_IncRef() and Py_DecRef(), exposing the - functionality of the Py_XINCREF() and Py_XDECREF macros. Useful for - runtime dynamic embedding of Python. See patch #938302, by Bob - Ippolito. - -- Added a new macro, PySequence_Fast_ITEMS, which retrieves a fast sequence's - underlying array of PyObject pointers. Useful for high speed looping. - -- Created a new method flag, METH_COEXIST, which causes a method to be loaded - even if already defined by a slot wrapper. This allows a __contains__ - method, for example, to co-exist with a defined sq_contains slot. This - is helpful because the PyCFunction can take advantage of optimized calls - whenever METH_O or METH_NOARGS flags are defined. - -- Added a new function, PyDict_Contains(d, k) which is like - PySequence_Contains() but is specific to dictionaries and executes - about 10% faster. - -- Added three new macros: Py_RETURN_NONE, Py_RETURN_TRUE, and Py_RETURN_FALSE. - Each return the singleton they mention after Py_INCREF()ing them. - -- Added a new function, PyTuple_Pack(n, ...) for constructing tuples from a - variable length argument list of Python objects without having to invoke - the more complex machinery of Py_BuildValue(). PyTuple_Pack(3, a, b, c) - is equivalent to Py_BuildValue("(OOO)", a, b, c). - -Windows -------- - -- The _winreg module could segfault when reading very large registry - values, due to unchecked alloca() calls (SF bug 851056). The fix is - uses either PyMem_Malloc(n) or PyString_FromStringAndSize(NULL, n), - as appropriate, followed by a size check. - -- file.truncate() could misbehave if the file was open for update - (modes r+, rb+, w+, wb+), and the most recent file operation before - the truncate() call was an input operation. SF bug 801631. - - -What's New in Python 2.3 final? -=============================== - -*Release date: 29-Jul-2003* - -IDLE ----- - -- Bug 778400: IDLE hangs when selecting "Edit with IDLE" from explorer. - This was unique to Windows, and was fixed by adding an -n switch to - the command the Windows installer creates to execute "Edit with IDLE" - context-menu actions. - -- IDLE displays a new message upon startup: some "personal firewall" - kinds of programs (for example, ZoneAlarm) open a dialog of their - own when any program opens a socket. IDLE does use sockets, talking - on the computer's internal loopback interface. This connection is not - visible on any external interface and no data is sent to or received - from the Internet. So, if you get such a dialog when opening IDLE, - asking whether to let pythonw.exe talk to address 127.0.0.1, say yes, - and rest assured no communication external to your machine is taking - place. If you don't allow it, IDLE won't be able to start. - - -What's New in Python 2.3 release candidate 2? -============================================= - -*Release date: 24-Jul-2003* - -Core and builtins ------------------ - -- It is now possible to import from zipfiles containing additional - data bytes before the zip compatible archive. Zipfiles containing a - comment at the end are still unsupported. - -Extension modules ------------------ - -- A longstanding bug in the parser module's initialization could cause - fatal internal refcount confusion when the module got initialized more - than once. This has been fixed. - -- Fixed memory leak in pyexpat; using the parser's ParseFile() method - with open files that aren't instances of the standard file type - caused an instance of the bound .read() method to be leaked on every - call. - -- Fixed some leaks in the locale module. - -Library -------- - -- Lib/encodings/rot_13.py when used as a script, now more properly - uses the first Python interpreter on your path. - -- Removed caching of TimeRE (and thus LocaleTime) in _strptime.py to - fix a locale related bug in the test suite. Although another patch - was needed to actually fix the problem, the cache code was not - restored. - -IDLE ----- - -- Calltips patches. - -Build ------ - -- For MacOSX, added -mno-fused-madd to BASECFLAGS to fix test_coercion - on Panther (OSX 10.3). - -C API ------ - -Windows -------- - -- The tempfile module could do insane imports on Windows if PYTHONCASEOK - was set, making temp file creation impossible. Repaired. - -- Add a patch to workaround pthread_sigmask() bugs in Cygwin. - -Mac ---- - -- Various fixes to pimp. - -- Scripts runs with pythonw no longer had full window manager access. - -- Don't force boot-disk-only install, for reasons unknown it causes - more problems than it solves. - - -What's New in Python 2.3 release candidate 1? -============================================= - -*Release date: 18-Jul-2003* - -Core and builtins ------------------ - -- The new function sys.getcheckinterval() returns the last value set - by sys.setcheckinterval(). - -- Several bugs in the symbol table phase of the compiler have been - fixed. Errors could be lost and compilation could fail without - reporting an error. SF patch 763201. - -- The interpreter is now more robust about importing the warnings - module. In an executable generated by freeze or similar programs, - earlier versions of 2.3 would fail if the warnings module could - not be found on the file system. Fixes SF bug 771097. - -- A warning about assignments to module attributes that shadow - builtins, present in earlier releases of 2.3, has been removed. - -- It is not possible to create subclasses of builtin types like str - and tuple that define an itemsize. Earlier releases of Python 2.3 - allowed this by mistake, leading to crashes and other problems. - -- The thread_id is now initialized to 0 in a non-thread build. SF bug - 770247. - -- SF bug 762891: "del p[key]" on proxy object no longer raises SystemError. - -Extension modules ------------------ - -- weakref.proxy() can now handle "del obj[i]" for proxy objects - defining __delitem__. Formerly, it generated a SystemError. - -- SSL no longer crashes the interpreter when the remote side disconnects. - -- On Unix the mmap module can again be used to map device files. - -- time.strptime now exclusively uses the Python implementation - contained within the _strptime module. - -- The print slot of weakref proxy objects was removed, because it was - not consistent with the object's repr slot. - -- The mmap module only checks file size for regular files, not - character or block devices. SF patch 708374. - -- The cPickle Pickler garbage collection support was fixed to traverse - the find_class attribute, if present. - -- There are several fixes for the bsddb3 wrapper module. - - bsddb3 no longer crashes if an environment is closed before a cursor - (SF bug 763298). - - The DB and DBEnv set_get_returns_none function was extended to take - a level instead of a boolean flag. The new level 2 means that in - addition, cursor.set()/.get() methods return None instead of raising - an exception. - - A typo was fixed in DBCursor.join_item(), preventing a crash. - -Library -------- - -- distutils now supports MSVC 7.1 - -- doctest now examines all docstrings by default. Previously, it would - skip over functions with private names (as indicated by the underscore - naming convention). The old default created too much of a risk that - user tests were being skipped inadvertently. Note, this change could - break code in the unlikely case that someone had intentionally put - failing tests in the docstrings of private functions. The breakage - is easily fixable by specifying the old behavior when calling testmod() - or Tester(). - -- There were several fixes to the way dumbdbms are closed. It's vital - that a dumbdbm database be closed properly, else the on-disk data - and directory files can be left in mutually inconsistent states. - dumbdbm.py's _Database.__del__() method attempted to close the - database properly, but a shutdown race in _Database._commit() could - prevent this from working, so that a program trusting __del__() to - get the on-disk files in synch could be badly surprised. The race - has been repaired. A sync() method was also added so that shelve - can guarantee data is written to disk. - - The close() method can now be called more than once without complaint. - -- The classes in threading.py are now new-style classes. That they - weren't before was an oversight. - -- The urllib2 digest authentication handlers now define the correct - auth_header. The earlier versions would fail at runtime. - -- SF bug 763023: fix uncaught ZeroDivisionError in difflib ratio methods - when there are no lines. - -- SF bug 763637: fix exception in Tkinter with after_cancel - which could occur with Tk 8.4 - -- SF bug 770601: CGIHTTPServer.py now passes the entire environment - to child processes. - -- SF bug 765238: add filter to fnmatch's __all__. - -- SF bug 748201: make time.strptime() error messages more helpful. - -- SF patch 764470: Do not dump the args attribute of a Fault object in - xmlrpclib. - -- SF patch 549151: urllib and urllib2 now redirect POSTs on 301 - responses. - -- SF patch 766650: The whichdb module was fixed to recognize dbm files - generated by gdbm on OS/2 EMX. - -- SF bugs 763047 and 763052: fixes bug of timezone value being left as - -1 when ``time.tzname[0] == time.tzname[1] and not time.daylight`` - is true when it should only when time.daylight is true. - -- SF bug 764548: re now allows subclasses of str and unicode to be - used as patterns. - -- SF bug 763637: In Tkinter, change after_cancel() to handle tuples - of varying sizes. Tk 8.4 returns a different number of values - than Tk 8.3. - -- SF bug 763023: difflib.ratio() did not catch zero division. - -- The Queue module now has an __all__ attribute. - -Tools/Demos ------------ - -- See Lib/idlelib/NEWS.txt for IDLE news. - -- SF bug 753592: webchecker/wsgui now handles user supplied directories. - -- The trace.py script has been removed. It is now in the standard library. - -Build ------ - -- Python now compiles with -fno-strict-aliasing if possible (SF bug 766696). - -- The socket module compiles on IRIX 6.5.10. - -- An irix64 system is treated the same way as an irix6 system (SF - patch 764560). - -- Several definitions were missing on FreeBSD 5.x unless the - __BSD_VISIBLE symbol was defined. configure now defines it as - needed. - -C API ------ - -- Unicode objects now support mbcs as a built-in encoding, so the C - API can use it without deferring to the encodings package. - -Windows -------- - -- The Windows implementation of PyThread_start_new_thread() never - checked error returns from Windows functions correctly. As a result, - it could claim to start a new thread even when the Microsoft - _beginthread() function failed (due to "too many threads" -- this is - on the order of thousands when it happens). In these cases, the - Python exception :: - - thread.error: can't start new thread - - is raised now. - -- SF bug 766669: Prevent a GPF on interpreter exit when sockets are in - use. The interpreter now calls WSACleanup() from Py_Finalize() - instead of from DLL teardown. - -Mac ---- - -- Bundlebuilder now inherits default values in the right way. It was - previously possible for app bundles to get a type of "BNDL" instead - of "APPL." Other improvements include, a --build-id option to - specify the CFBundleIdentifier and using the --python option to set - the executable in the bundle. - -- Fixed two bugs in MacOSX framework handling. - -- pythonw did not allow user interaction in 2.3rc1, this has been fixed. - -- Python is now compiled with -mno-fused-madd, making all tests pass - on Panther. - -What's New in Python 2.3 beta 2? -================================ - -*Release date: 29-Jun-2003* - -Core and builtins ------------------ - -- A program can now set the environment variable PYTHONINSPECT to some - string value in Python, and cause the interpreter to enter the - interactive prompt at program exit, as if Python had been invoked - with the -i option. - -- list.index() now accepts optional start and stop arguments. Similar - changes were made to UserList.index(). SF feature request 754014. - -- SF patch 751998 fixes an unwanted side effect of the previous fix - for SF bug 742860 (the next item). - -- SF bug 742860: "WeakKeyDictionary __delitem__ uses iterkeys". This - wasn't threadsafe, was very inefficient (expected time O(len(dict)) - instead of O(1)), and could raise a spurious RuntimeError if another - thread mutated the dict during __delitem__, or if a comparison function - mutated it. It also neglected to raise KeyError when the key wasn't - present; didn't raise TypeError when the key wasn't of a weakly - referencable type; and broke various more-or-less obscure dict - invariants by using a sequence of equality comparisons over the whole - set of dict keys instead of computing the key's hash code to narrow - the search to those keys with the same hash code. All of these are - considered to be bugs. A new implementation of __delitem__ repairs all - that, but note that fixing these bugs may change visible behavior in - code relying (whether intentionally or accidentally) on old behavior. - -- SF bug 734869: Fixed a compiler bug that caused a fatal error when - compiling a list comprehension that contained another list comprehension - embedded in a lambda expression. - -- SF bug 705231: builtin pow() no longer lets the platform C pow() - raise -1.0 to integer powers, because (at least) glibc gets it wrong - in some cases. The result should be -1.0 if the power is odd and 1.0 - if the power is even, and any float with a sufficiently large exponent - is (mathematically) an exact even integer. - -- SF bug 759227: A new-style class that implements __nonzero__() must - return a bool or int (but not an int subclass) from that method. This - matches the restriction on classic classes. - -- The encoding attribute has been added for file objects, and set to - the terminal encoding on Unix and Windows. - -- The softspace attribute of file objects became read-only by oversight. - It's writable again. - -- Reverted a 2.3 beta 1 change to iterators for subclasses of list and - tuple. By default, the iterators now access data elements directly - instead of going through __getitem__. If __getitem__ access is - preferred, then __iter__ can be overridden. - -- SF bug 735247: The staticmethod and super types participate in - garbage collection. Before this change, it was possible for leaks to - occur in functions with non-global free variables that used these types. - -Extension modules ------------------ - -- the socket module has a new exception, socket.timeout, to allow - timeouts to be handled separately from other socket errors. - -- SF bug 751276: cPickle has fixed to propagate exceptions raised in - user code. In earlier versions, cPickle caught and ignored any - exception when it performed operations that it expected to raise - specific exceptions like AttributeError. - -- cPickle Pickler and Unpickler objects now participate in garbage - collection. - -- mimetools.choose_boundary() could return duplicate strings at times, - especially likely on Windows. The strings returned are now guaranteed - unique within a single program run. - -- thread.interrupt_main() raises KeyboardInterrupt in the main thread. - dummy_thread has also been modified to try to simulate the behavior. - -- array.array.insert() now treats negative indices as being relative - to the end of the array, just like list.insert() does. (SF bug #739313) - -- The datetime module classes datetime, time, and timedelta are now - properly subclassable. - -- _tkinter.{get|set}busywaitinterval was added. - -- itertools.islice() now accepts stop=None as documented. - Fixes SF bug #730685. - -- the bsddb185 module is built in one restricted instance - - /usr/include/db.h exists and defines HASHVERSION to be 2. This is true - for many BSD-derived systems. - - -Library -------- - -- Some happy doctest extensions from Jim Fulton have been added to - doctest.py. These are already being used in Zope3. The two - primary ones: - - doctest.debug(module, name) extracts the doctests from the named object - in the given module, puts them in a temp file, and starts pdb running - on that file. This is great when a doctest fails. - - doctest.DocTestSuite(module=None) returns a synthesized unittest - TestSuite instance, to be run by the unittest framework, which - runs all the doctests in the module. This allows writing tests in - doctest style (which can be clearer and shorter than writing tests - in unittest style), without losing unittest's powerful testing - framework features (which doctest lacks). - -- For compatibility with doctests created before 2.3, if an expected - output block consists solely of "1" and the actual output block - consists solely of "True", it's accepted as a match; similarly - for "0" and "False". This is quite un-doctest-like, but is practical. - The behavior can be disabled by passing the new doctest module - constant DONT_ACCEPT_TRUE_FOR_1 to the new optionflags optional - argument. - -- ZipFile.testzip() now only traps BadZipfile exceptions. Previously, - a bare except caught to much and reported all errors as a problem - in the archive. - -- The logging module now has a new function, makeLogRecord() making - LogHandler easier to interact with DatagramHandler and SocketHandler. - -- The cgitb module has been extended to support plain text display (SF patch - 569574). - -- A brand new version of IDLE (from the IDLEfork project at - SourceForge) is now included as Lib/idlelib. The old Tools/idle is - no more. - -- Added a new module: trace (documentation missing). This module used - to be distributed in Tools/scripts. It uses sys.settrace() to trace - code execution -- either function calls or individual lines. It can - generate tracing output during execution or a post-mortem report of - code coverage. - -- The threading module has new functions settrace() and setprofile() - that cooperate with the functions of the same name in the sys - module. A function registered with the threading module will - be used for all threads it creates. The new trace module uses this - to provide tracing for code running in threads. - -- copy.py: applied SF patch 707900, fixing bug 702858, by Steven - Taschuk. Copying a new-style class that had a reference to itself - didn't work. (The same thing worked fine for old-style classes.) - Builtin functions are now treated as atomic, fixing bug #746304. - -- difflib.py has two new functions: context_diff() and unified_diff(). - -- More fixes to urllib (SF 549151): (a) When redirecting, always use - GET. This is common practice and more-or-less sanctioned by the - HTTP standard. (b) Add a handler for 307 redirection, which becomes - an error for POST, but a regular redirect for GET and HEAD - -- Added optional 'onerror' argument to os.walk(), to control error - handling. - -- inspect.is{method|data}descriptor was added, to allow pydoc display - __doc__ of data descriptors. - -- Fixed socket speed loss caused by use of the _socketobject wrapper class - in socket.py. - -- timeit.py now checks the current directory for imports. - -- urllib2.py now knows how to order proxy classes, so the user doesn't - have to insert it in front of other classes, nor do dirty tricks like - inserting a "dummy" HTTPHandler after a ProxyHandler when building an - opener with proxy support. - -- Iterators have been added for dbm keys. - -- random.Random objects can now be pickled. - -Tools/Demos ------------ - -- pydoc now offers help on keywords and topics. - -- Tools/idle is gone; long live Lib/idlelib. - -- diff.py prints file diffs in context, unified, or ndiff formats, - providing a command line interface to difflib.py. - -- texcheck.py is a new script for making a rough validation of Python LaTeX - files. - -Build ------ - -- Setting DESTDIR during 'make install' now allows specifying a - different root directory. - -C API ------ - -- PyType_Ready(): If a type declares that it participates in gc - (Py_TPFLAGS_HAVE_GC), and its base class does not, and its base class's - tp_free slot is the default _PyObject_Del, and type does not define - a tp_free slot itself, _PyObject_GC_Del is assigned to type->tp_free. - Previously _PyObject_Del was inherited, which could at best lead to a - segfault. In addition, if even after this magic the type's tp_free - slot is _PyObject_Del or NULL, and the type is a base type - (Py_TPFLAGS_BASETYPE), TypeError is raised: since the type is a base - type, its dealloc function must call type->tp_free, and since the type - is gc'able, tp_free must not be NULL or _PyObject_Del. - -- PyThreadState_SetAsyncExc(): A new API (deliberately accessible only - from C) to interrupt a thread by sending it an exception. It is - intentional that you have to write your own C extension to call it - from Python. - - -New platforms -------------- - -None this time. - -Tests ------ - -- test_imp rewritten so that it doesn't raise RuntimeError if run as a - side effect of being imported ("import test.autotest"). - -Windows -------- - -- The Windows installer ships with Tcl/Tk 8.4.3 (upgraded from 8.4.1). - -- The installer always suggested that Python be installed on the C: - drive, due to a hardcoded "C:" generated by the Wise installation - wizard. People with machines where C: is not the system drive - usually want Python installed on whichever drive is their system drive - instead. We removed the hardcoded "C:", and two testers on machines - where C: is not the system drive report that the installer now - suggests their system drive. Note that you can always select the - directory you want in the "Select Destination Directory" dialog -- - that's what it's for. - -Mac ---- - -- There's a new module called "autoGIL", which offers a mechanism to - automatically release the Global Interpreter Lock when an event loop - goes to sleep, allowing other threads to run. It's currently only - supported on OSX, in the Mach-O version. -- The OSA modules now allow direct access to properties of the - toplevel application class (in AppleScript terminology). -- The Package Manager can now update itself. - -SourceForge Bugs and Patches Applied ------------------------------------- - -430160, 471893, 501716, 542562, 549151, 569574, 595837, 596434, -598163, 604210, 604716, 610332, 612627, 614770, 620190, 621891, -622042, 639139, 640236, 644345, 649742, 649742, 658233, 660022, -661318, 661676, 662807, 662923, 666219, 672855, 678325, 682347, -683486, 684981, 685773, 686254, 692776, 692959, 693094, 696777, -697989, 700827, 703666, 708495, 708604, 708901, 710733, 711902, -713722, 715782, 718286, 719359, 719367, 723136, 723831, 723962, -724588, 724767, 724767, 725942, 726150, 726446, 726869, 727051, -727719, 727719, 727805, 728277, 728563, 728656, 729096, 729103, -729293, 729297, 729300, 729317, 729395, 729622, 729817, 730170, -730296, 730594, 730685, 730826, 730963, 731209, 731403, 731504, -731514, 731626, 731635, 731643, 731644, 731644, 731689, 732124, -732143, 732234, 732284, 732284, 732479, 732761, 732783, 732951, -733667, 733781, 734118, 734231, 734869, 735051, 735293, 735527, -735613, 735694, 736962, 736962, 737970, 738066, 739313, 740055, -740234, 740301, 741806, 742126, 742741, 742860, 742860, 742911, -744041, 744104, 744238, 744687, 744877, 745055, 745478, 745525, -745620, 746012, 746304, 746366, 746801, 746953, 747348, 747667, -747954, 748846, 748849, 748973, 748975, 749191, 749210, 749759, -749831, 749911, 750008, 750092, 750542, 750595, 751038, 751107, -751276, 751451, 751916, 751941, 751956, 751998, 752671, 753451, -753602, 753617, 753845, 753925, 754014, 754340, 754447, 755031, -755087, 755147, 755245, 755683, 755987, 756032, 756996, 757058, -757229, 757818, 757821, 757822, 758112, 758910, 759227, 759889, -760257, 760703, 760792, 761104, 761337, 761519, 761830, 762455 - - -What's New in Python 2.3 beta 1? -================================ - -*Release date: 25-Apr-2003* - -Core and builtins ------------------ - -- New format codes B, H, I, k and K have been implemented for - PyArg_ParseTuple and PyBuild_Value. - -- New builtin function sum(seq, start=0) returns the sum of all the - items in iterable object seq, plus start (items are normally numbers, - and cannot be strings). - -- bool() called without arguments now returns False rather than - raising an exception. This is consistent with calling the - constructors for the other builtin types -- called without argument - they all return the false value of that type. (SF patch #724135) - -- In support of PEP 269 (making the pgen parser generator accessible - from Python), some changes to the pgen code structure were made; a - few files that used to be linked only with pgen are now linked with - Python itself. - -- The repr() of a weakref object now shows the __name__ attribute of - the referenced object, if it has one. - -- super() no longer ignores data descriptors, except __class__. See - the thread started at - http://mail.python.org/pipermail/python-dev/2003-April/034338.html - -- list.insert(i, x) now interprets negative i as it would be - interpreted by slicing, so negative values count from the end of the - list. This was the only place where such an interpretation was not - placed on a list index. - -- range() now works even if the arguments are longs with magnitude - larger than sys.maxint, as long as the total length of the sequence - fits. E.g., range(2**100, 2**101, 2**100) is the following list: - [1267650600228229401496703205376L]. (SF patch #707427.) - -- Some horridly obscure problems were fixed involving interaction - between garbage collection and old-style classes with "ambitious" - getattr hooks. If an old-style instance didn't have a __del__ method, - but did have a __getattr__ hook, and the instance became reachable - only from an unreachable cycle, and the hook resurrected or deleted - unreachable objects when asked to resolve "__del__", anything up to - a segfault could happen. That's been repaired. - -- dict.pop now takes an optional argument specifying a default - value to return if the key is not in the dict. If a default is not - given and the key is not found, a KeyError will still be raised. - Parallel changes were made to UserDict.UserDict and UserDict.DictMixin. - [SF patch #693753] (contributed by Michael Stone.) - -- sys.getfilesystemencoding() was added to expose - Py_FileSystemDefaultEncoding. - -- New function sys.exc_clear() clears the current exception. This is - rarely needed, but can sometimes be useful to release objects - referenced by the traceback held in sys.exc_info()[2]. (SF patch - #693195.) - -- On 64-bit systems, a dictionary could contain duplicate long/int keys - if the key value was larger than 2**32. See SF bug #689659. - -- Fixed SF bug #663074. The codec system was using global static - variables to store internal data. As a result, any attempts to use the - unicode system with multiple active interpreters, or successive - interpreter executions, would fail. - -- "%c" % u"a" now returns a unicode string instead of raising a - TypeError. u"%c" % 0xffffffff now raises a OverflowError instead - of a ValueError to be consistent with "%c" % 256. See SF patch #710127. - -Extension modules ------------------ - -- The socket module now provides the functions inet_pton and inet_ntop - for converting between string and packed representation of IP - addresses. There is also a new module variable, has_ipv6, which is - True iff the current Python has IPv6 support. See SF patch #658327. - -- Tkinter wrappers around Tcl variables now pass objects directly - to Tcl, instead of first converting them to strings. - -- The .*? pattern in the re module is now special-cased to avoid the - recursion limit. (SF patch #720991 -- many thanks to Gary Herron - and Greg Chapman.) - -- New function sys.call_tracing() allows pdb to debug code - recursively. - -- New function gc.get_referents(obj) returns a list of objects - directly referenced by obj. In effect, it exposes what the object's - tp_traverse slot does, and can be helpful when debugging memory - leaks. - -- The iconv module has been removed from this release. - -- The platform-independent routines for packing floats in IEEE formats - (struct.pack's f, d codes; pickle and cPickle's protocol 1 - pickling of floats) ignored that rounding can cause a carry to - propagate. The worst consequence was that, in rare cases, f - could produce strings that, when unpacked again, were a factor of 2 - away from the original float. This has been fixed. See SF bug - #705836. - -- New function time.tzset() provides access to the C library tzset() - function, if supported. (SF patch #675422.) - -- Using createfilehandler, deletefilehandler, createtimerhandler functions - on Tkinter.tkinter (_tkinter module) no longer crashes the interpreter. - See SF bug #692416. - -- Modified the fcntl.ioctl() function to allow modification of a passed - mutable buffer (for details see the reference documentation). - -- Made user requested changes to the itertools module. - Subsumed the times() function into repeat(). - Added chain() and cycle(). - -- The rotor module is now deprecated; the encryption algorithm it uses - is not believed to be secure, and including crypto code with Python - has implications for exporting and importing it in various countries. - -- The socket module now always uses the _socketobject wrapper class, even on - platforms which have dup(2). The makefile() method is built directly - on top of the socket without duplicating the file descriptor, allowing - timeouts to work properly. - -Library -------- - -- New generator function os.walk() is an easy-to-use alternative to - os.path.walk(). See os module docs for details. os.path.walk() - isn't deprecated at this time, but may become deprecated in a - future release. - -- Added new module "platform" which provides a wide range of tools - for querying platform dependent features. - -- netrc now allows ASCII punctuation characters in passwords. - -- shelve now supports the optional writeback argument, and exposes - pickle protocol versions. - -- Several methods of nntplib.NNTP have grown an optional file argument - which specifies a file where to divert the command's output - (already supported by the body() method). (SF patch #720468) - -- The self-documenting XML server library DocXMLRPCServer was added. - -- Support for internationalized domain names has been added through - the 'idna' and 'punycode' encodings, the 'stringprep' module, the - 'mkstringprep' tool, and enhancements to the socket and httplib - modules. - -- htmlentitydefs has two new dictionaries: name2codepoint maps - HTML entity names to Unicode codepoints (as integers). - codepoint2name is the reverse mapping. See SF patch #722017. - -- pdb has a new command, "debug", which lets you step through - arbitrary code from the debugger's (pdb) prompt. - -- unittest.failUnlessEqual and its equivalent unittest.assertEqual now - return 'not a == b' rather than 'a != b'. This gives the desired - result for classes that define __eq__ without defining __ne__. - -- sgmllib now supports SGML marked sections, in particular the - MS Office extensions. - -- The urllib module now offers support for the iterator protocol. - SF patch 698520 contributed by Brett Cannon. - -- New module timeit provides a simple framework for timing the - execution speed of expressions and statements. - -- sets.Set objects now support mixed-type __eq__ and __ne__, instead - of raising TypeError. If x is a Set object and y is a non-Set object, - x == y is False, and x != y is True. This is akin to the change made - for mixed-type comparisons of datetime objects in 2.3a2; more info - about the rationale is in the NEWS entry for that. See also SF bug - report . - -- On Unix platforms, if os.listdir() is called with a Unicode argument, - it now returns Unicode strings. (This behavior was added earlier - to the Windows NT/2k/XP version of os.listdir().) - -- Distutils: both 'py_modules' and 'packages' keywords can now be specified - in core.setup(). Previously you could supply one or the other, but - not both of them. (SF patch #695090 from Bernhard Herzog) - -- New csv package makes it easy to read/write CSV files. - -- Module shlex has been extended to allow posix-like shell parsings, - including a split() function for easy spliting of quoted strings and - commands. An iterator interface was also implemented. - -Tools/Demos ------------ - -- New script combinerefs.py helps analyze new PYTHONDUMPREFS output. - See the module docstring for details. - -Build ------ - -- Fix problem building on OSF1 because the compiler only accepted - preprocessor directives that start in column 1. (SF bug #691793.) - -C API ------ - -- Added PyGC_Collect(), equivalent to calling gc.collect(). - -- PyThreadState_GetDict() was changed not to raise an exception or - issue a fatal error when no current thread state is available. This - makes it possible to print dictionaries when no thread is active. - -- LONG_LONG was renamed to PY_LONG_LONG. Extensions that use this and - need compatibility with previous versions can use this: - - #ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG - #endif - -- Added PyObject_SelfIter() to fill the tp_iter slot for the - typical case where the method returns its self argument. - -- The extended type structure used for heap types (new-style - classes defined by Python code using a class statement) is now - exported from object.h as PyHeapTypeObject. (SF patch #696193.) - -New platforms -------------- - -None this time. - -Tests ------ - -- test_timeout now requires -u network to be passed to regrtest to run. - See SF bug #692988. - -Windows -------- - -- os.fsync() now exists on Windows, and calls the Microsoft _commit() - function. - -- New function winsound.MessageBeep() wraps the Win32 API - MessageBeep(). - -Mac ---- - -- os.listdir() now returns Unicode strings on MacOS X when called with - a Unicode argument. See the general news item under "Library". - -- A new method MacOS.WMAvailable() returns true if it is safe to access - the window manager, false otherwise. - -- EasyDialogs dialogs are now movable-modal, and if the application is - currently in the background they will ask to be moved to the foreground - before displaying. - -- OSA Scripting support has improved a lot, and gensuitemodule.py can now - be used by mere mortals. The documentation is now also more or less - complete. - -- The IDE (in a framework build) now includes introductory documentation - in Apple Help Viewer format. - - -What's New in Python 2.3 alpha 2? -================================= - -*Release date: 19-Feb-2003* - -Core and builtins ------------------ - -- Negative positions returned from PEP 293 error callbacks are now - treated as being relative to the end of the input string. Positions - that are out of bounds raise an IndexError. - -- sys.path[0] (the directory from which the script is loaded) is now - turned into an absolute pathname, unless it is the empty string. - (SF patch #664376.) - -- Finally fixed the bug in compile() and exec where a string ending - with an indented code block but no newline would raise SyntaxError. - This would have been a four-line change in parsetok.c... Except - codeop.py depends on this behavior, so a compilation flag had to be - invented that causes the tokenizer to revert to the old behavior; - this required extra changes to 2 .h files, 2 .c files, and 2 .py - files. (Fixes SF bug #501622.) - -- If a new-style class defines neither __new__ nor __init__, its - constructor would ignore all arguments. This is changed now: the - constructor refuses arguments in this case. This might break code - that worked under Python 2.2. The simplest fix is to add a no-op - __init__: ``def __init__(self, *args, **kw): pass``. - -- Through a bytecode optimizer bug (and I bet you didn't even know - Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants - with a leading minus sign would come out with the wrong sign. - ("Unsigned" hex/oct constants are those with a face value in the - range sys.maxint+1 through sys.maxint*2+1, inclusive; these have - always been interpreted as negative numbers through sign folding.) - E.g. 0xffffffff is -1, and -(0xffffffff) is 1, but -0xffffffff would - come out as -4294967295. This was the case in Python 2.2 through - 2.2.2 and 2.3a1, and in Python 2.4 it will once again have that - value, but according to PEP 237 it really needs to be 1 now. This - will be backported to Python 2.2.3 a well. (SF #660455) - -- int(s, base) sometimes sign-folds hex and oct constants; it only - does this when base is 0 and s.strip() starts with a '0'. When the - sign is actually folded, as in int("0xffffffff", 0) on a 32-bit - machine, which returns -1, a FutureWarning is now issued; in Python - 2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and - int("0xffffffff", 16) right now. (PEP 347) - -- super(X, x): x may now be a proxy for an X instance, i.e. - issubclass(x.__class__, X) but not issubclass(type(x), X). - -- isinstance(x, X): if X is a new-style class, this is now equivalent - to issubclass(type(x), X) or issubclass(x.__class__, X). Previously - only type(x) was tested. (For classic classes this was already the - case.) - -- compile(), eval() and the exec statement now fully support source code - passed as unicode strings. - -- int subclasses can be initialized with longs if the value fits in an int. - See SF bug #683467. - -- long(string, base) takes time linear in len(string) when base is a power - of 2 now. It used to take time quadratic in len(string). - -- filter returns now Unicode results for Unicode arguments. - -- raw_input can now return Unicode objects. - -- List objects' sort() method now accepts None as the comparison function. - Passing None is semantically identical to calling sort() with no - arguments. - -- Fixed crash when printing a subclass of str and __str__ returned self. - See SF bug #667147. - -- Fixed an invalid RuntimeWarning and an undetected error when trying - to convert a long integer into a float which couldn't fit. - See SF bug #676155. - -- Function objects now have a __module__ attribute that is bound to - the name of the module in which the function was defined. This - applies for C functions and methods as well as functions and methods - defined in Python. This attribute is used by pickle.whichmodule(), - which changes the behavior of whichmodule slightly. In Python 2.2 - whichmodule() returns "__main__" for functions that are not defined - at the top-level of a module (examples: methods, nested functions). - Now whichmodule() will return the proper module name. - -Extension modules ------------------ - -- operator.isNumberType() now checks that the object has a nb_int or - nb_float slot, rather than simply checking whether it has a non-NULL - tp_as_number pointer. - -- The imp module now has ways to acquire and release the "import - lock": imp.acquire_lock() and imp.release_lock(). Note: this is a - reentrant lock, so releasing the lock only truly releases it when - this is the last release_lock() call. You can check with - imp.lock_held(). (SF bug #580952 and patch #683257.) - -- Change to cPickle to match pickle.py (see below and PEP 307). - -- Fix some bugs in the parser module. SF bug #678518. - -- Thanks to Scott David Daniels, a subtle bug in how the zlib - extension implemented flush() was fixed. Scott also rewrote the - zlib test suite using the unittest module. (SF bug #640230 and - patch #678531.) - -- Added an itertools module containing high speed, memory efficient - looping constructs inspired by tools from Haskell and SML. - -- The SSL module now handles sockets with a timeout set correctly (SF - patch #675750, fixing SF bug #675552). - -- os/posixmodule has grown the sysexits.h constants (EX_OK and friends). - -- Fixed broken threadstate swap in readline that could cause fatal - errors when a readline hook was being invoked while a background - thread was active. (SF bugs #660476 and #513033.) - -- fcntl now exposes the strops.h I_* constants. - -- Fix a crash on Solaris that occurred when calling close() on - an mmap'ed file which was already closed. (SF patch #665913) - -- Fixed several serious bugs in the zipimport implementation. - -- datetime changes: - - The date class is now properly subclassable. (SF bug #720908) - - The datetime and datetimetz classes have been collapsed into a single - datetime class, and likewise the time and timetz classes into a single - time class. Previously, a datetimetz object with tzinfo=None acted - exactly like a datetime object, and similarly for timetz. This wasn't - enough of a difference to justify distinct classes, and life is simpler - now. - - today() and now() now round system timestamps to the closest - microsecond . This repairs an - irritation most likely seen on Windows systems. - - In dt.astimezone(tz), if tz.utcoffset(dt) returns a duration, - ValueError is raised if tz.dst(dt) returns None (2.3a1 treated it - as 0 instead, but a tzinfo subclass wishing to participate in - time zone conversion has to take a stand on whether it supports - DST; if you don't care about DST, then code dst() to return 0 minutes, - meaning that DST is never in effect). - - The tzinfo methods utcoffset() and dst() must return a timedelta object - (or None) now. In 2.3a1 they could also return an int or long, but that - was an unhelpfully redundant leftover from an earlier version wherein - they couldn't return a timedelta. TOOWTDI. - - The example tzinfo class for local time had a bug. It was replaced - by a later example coded by Guido. - - datetime.astimezone(tz) no longer raises an exception when the - input datetime has no UTC equivalent in tz. For typical "hybrid" time - zones (a single tzinfo subclass modeling both standard and daylight - time), this case can arise one hour per year, at the hour daylight time - ends. See new docs for details. In short, the new behavior mimics - the local wall clock's behavior of repeating an hour in local time. - - dt.astimezone() can no longer be used to convert between naive and aware - datetime objects. If you merely want to attach, or remove, a tzinfo - object, without any conversion of date and time members, use - dt.replace(tzinfo=whatever) instead, where "whatever" is None or a - tzinfo subclass instance. - - A new method tzinfo.fromutc(dt) can be overridden in tzinfo subclasses - to give complete control over how a UTC time is to be converted to - a local time. The default astimezone() implementation calls fromutc() - as its last step, so a tzinfo subclass can affect that too by overriding - fromutc(). It's expected that the default fromutc() implementation will - be suitable as-is for "almost all" time zone subclasses, but the - creativity of political time zone fiddling appears unbounded -- fromutc() - allows the highly motivated to emulate any scheme expressible in Python. - - datetime.now(): The optional tzinfo argument was undocumented (that's - repaired), and its name was changed to tz ("tzinfo" is overloaded enough - already). With a tz argument, now(tz) used to return the local date - and time, and attach tz to it, without any conversion of date and time - members. This was less than useful. Now now(tz) returns the current - date and time as local time in tz's time zone, akin to :: - - tz.fromutc(datetime.utcnow().replace(tzinfo=utc)) - - where "utc" is an instance of a tzinfo subclass modeling UTC. Without - a tz argument, now() continues to return the current local date and time, - as a naive datetime object. - - datetime.fromtimestamp(): Like datetime.now() above, this had less than - useful behavior when the optional tinzo argument was specified. See - also SF bug report . - - date and datetime comparison: In order to prevent comparison from - falling back to the default compare-object-addresses strategy, these - raised TypeError whenever they didn't understand the other object type. - They still do, except when the other object has a "timetuple" attribute, - in which case they return NotImplemented now. This gives other - datetime objects (e.g., mxDateTime) a chance to intercept the - comparison. - - date, time, datetime and timedelta comparison: When the exception - for mixed-type comparisons in the last paragraph doesn't apply, if - the comparison is == then False is returned, and if the comparison is - != then True is returned. Because dict lookup and the "in" operator - only invoke __eq__, this allows, for example, :: - - if some_datetime in some_sequence: - - and :: - - some_dict[some_timedelta] = whatever - - to work as expected, without raising TypeError just because the - sequence is heterogeneous, or the dict has mixed-type keys. [This - seems like a good idea to implement for all mixed-type comparisons - that don't want to allow falling back to address comparison.] - - The constructors building a datetime from a timestamp could raise - ValueError if the platform C localtime()/gmtime() inserted "leap - seconds". Leap seconds are ignored now. On such platforms, it's - possible to have timestamps that differ by a second, yet where - datetimes constructed from them are equal. - - The pickle format of date, time and datetime objects has changed - completely. The undocumented pickler and unpickler functions no - longer exist. The undocumented __setstate__() and __getstate__() - methods no longer exist either. - -Library -------- - -- The logging module was updated slightly; the WARN level was renamed - to WARNING, and the matching function/method warn() to warning(). - -- The pickle and cPickle modules were updated with a new pickling - protocol (documented by pickletools.py, see below) and several - extensions to the pickle customization API (__reduce__, __setstate__ - etc.). The copy module now uses more of the pickle customization - API to copy objects that don't implement __copy__ or __deepcopy__. - See PEP 307 for details. - -- The distutils "register" command now uses http://www.python.org/pypi - as the default repository. (See PEP 301.) - -- the platform dependent path related variables sep, altsep, extsep, - pathsep, curdir, pardir and defpath are now defined in the platform - dependent path modules (e.g. ntpath.py) rather than os.py, so these - variables are now available via os.path. They continue to be - available from the os module. - (see ). - -- array.array was added to the types repr.py knows about (see - ). - -- The new pickletools.py contains lots of documentation about pickle - internals, and supplies some helpers for working with pickles, such as - a symbolic pickle disassembler. - -- Xmlrpclib.py now supports the builtin boolean type. - -- py_compile has a new 'doraise' flag and a new PyCompileError - exception. - -- SimpleXMLRPCServer now supports CGI through the CGIXMLRPCRequestHandler - class. - -- The sets module now raises TypeError in __cmp__, to clarify that - sets are not intended to be three-way-compared; the comparison - operators are overloaded as subset/superset tests. - -- Bastion.py and rexec.py are disabled. These modules are not safe in - Python 2.2. or 2.3. - -- realpath is now exported when doing ``from poxixpath import *``. - It is also exported for ntpath, macpath, and os2emxpath. - See SF bug #659228. - -- New module tarfile from Lars Gustäbel provides a comprehensive interface - to tar archive files with transparent gzip and bzip2 compression. - See SF patch #651082. - -- urlparse can now parse imap:// URLs. See SF feature request #618024. - -- Tkinter.Canvas.scan_dragto() provides an optional parameter to support - the gain value which is passed to Tk. SF bug# 602259. - -- Fix logging.handlers.SysLogHandler protocol when using UNIX domain sockets. - See SF patch #642974. - -- The dospath module was deleted. Use the ntpath module when manipulating - DOS paths from other platforms. - -Tools/Demos ------------ - -- Two new scripts (db2pickle.py and pickle2db.py) were added to the - Tools/scripts directory to facilitate conversion from the old bsddb module - to the new one. While the user-visible API of the new module is - compatible with the old one, it's likely that the version of the - underlying database library has changed. To convert from the old library, - run the db2pickle.py script using the old version of Python to convert it - to a pickle file. After upgrading Python, run the pickle2db.py script - using the new version of Python to reconstitute your database. For - example: - - % python2.2 db2pickle.py -h some.db > some.pickle - % python2.3 pickle2db.py -h some.db.new < some.pickle - - Run the scripts without any args to get a usage message. - - -Build ------ - -- The audio driver tests (test_ossaudiodev.py and - test_linuxaudiodev.py) are no longer run by default. This is - because they don't always work, depending on your hardware and - software. To run these tests, you must use an invocation like :: - - ./python Lib/test/regrtest.py -u audio test_ossaudiodev - -- On systems which build using the configure script, compiler flags which - used to be lumped together using the OPT flag have been split into two - groups, OPT and BASECFLAGS. OPT is meant to carry just optimization- and - debug-related flags like "-g" and "-O3". BASECFLAGS is meant to carry - compiler flags that are required to get a clean compile. On some - platforms (many Linux flavors in particular) BASECFLAGS will be empty by - default. On others, such as Mac OS X and SCO, it will contain required - flags. This change allows people building Python to override OPT without - fear of clobbering compiler flags which are required to get a clean build. - -- On Darwin/Mac OS X platforms, /sw/lib and /sw/include are added to the - relevant search lists in setup.py. This allows users building Python to - take advantage of the many packages available from the fink project - . - -- A new Makefile target, scriptsinstall, installs a number of useful scripts - from the Tools/scripts directory. - -C API ------ - -- PyEval_GetFrame() is now declared to return a ``PyFrameObject *`` - instead of a plain ``PyObject *``. (SF patch #686601.) - -- PyNumber_Check() now checks that the object has a nb_int or nb_float - slot, rather than simply checking whether it has a non-NULL - tp_as_number pointer. - -- A C type that inherits from a base type that defines tp_as_buffer - will now inherit the tp_as_buffer pointer if it doesn't define one. - (SF #681367) - -- The PyArg_Parse functions now issue a DeprecationWarning if a float - argument is provided when an integer is specified (this affects the 'b', - 'B', 'h', 'H', 'i', and 'l' codes). Future versions of Python will - raise a TypeError. - -Tests ------ - -- Several tests weren't being run from regrtest.py (test_timeout.py, - test_tarfile.py, test_netrc.py, test_multifile.py, - test_importhooks.py and test_imp.py). Now they are. (Note to - developers: please read Lib/test/README when creating a new test, to - make sure to do it right! All tests need to use either unittest or - pydoc.) - -- Added test_posix.py, a test suite for the posix module. - -- Added test_hexoct.py, a test suite for hex/oct constant folding. - -Windows -------- - -- The timeout code for socket connect() didn't work right; this has - now been fixed. test_timeout.py should pass (at least most of the - time). - -- distutils' msvccompiler class now passes the preprocessor options to - the resource compiler. See SF patch #669198. - -- The bsddb module now ships with Sleepycat's 4.1.25.NC, the latest - release without strong cryptography. - -- sys.path[0], if it contains a directory name, is now always an - absolute pathname. (SF patch #664376.) - -- The new logging package is now installed by the Windows installer. It - wasn't in 2.3a1 due to oversight. - -Mac ---- - -- There are new dialogs EasyDialogs.AskFileForOpen, AskFileForSave - and AskFolder. The old macfs.StandardGetFile and friends are deprecated. - -- Most of the standard library now uses pathnames or FSRefs in preference - of FSSpecs, and use the underlying Carbon.File and Carbon.Folder modules - in stead of macfs. macfs will probably be deprecated in the future. - -- Type Carbon.File.FSCatalogInfo and supporting methods have been implemented. - This also makes macfs.FSSpec.SetDates() work again. - -- There is a new module pimp, the package install manager for Python, and - accompanying applet PackageManager. These allow you to easily download - and install pretested extension packages either in source or binary - form. Only in MacPython-OSX. - -- Applets are now built with bundlebuilder in MacPython-OSX, which should make - them more robust and also provides a path towards BuildApplication. The - downside of this change is that applets can no longer be run from the - Terminal window, this will hopefully be fixed in the 2.3b1. - - -What's New in Python 2.3 alpha 1? -================================= - -*Release date: 31-Dec-2002* - -Type/class unification and new-style classes --------------------------------------------- - -- One can now assign to __bases__ and __name__ of new-style classes. - -- dict() now accepts keyword arguments so that dict(one=1, two=2) - is the equivalent of {"one": 1, "two": 2}. Accordingly, - the existing (but undocumented) 'items' keyword argument has - been eliminated. This means that dict(items=someMapping) now has - a different meaning than before. - -- int() now returns a long object if the argument is outside the - integer range, so int("4" * 1000), int(1e200) and int(1L<<1000) will - all return long objects instead of raising an OverflowError. - -- Assignment to __class__ is disallowed if either the old or the new - class is a statically allocated type object (such as defined by an - extension module). This prevents anomalies like 2.__class__ = bool. - -- New-style object creation and deallocation have been sped up - significantly; they are now faster than classic instance creation - and deallocation. - -- The __slots__ variable can now mention "private" names, and the - right thing will happen (e.g. __slots__ = ["__foo"]). - -- The built-ins slice() and buffer() are now callable types. The - types classobj (formerly class), code, function, instance, and - instancemethod (formerly instance-method), which have no built-in - names but are accessible through the types module, are now also - callable. The type dict-proxy is renamed to dictproxy. - -- Cycles going through the __class__ link of a new-style instance are - now detected by the garbage collector. - -- Classes using __slots__ are now properly garbage collected. - [SF bug 519621] - -- Tightened the __slots__ rules: a slot name must be a valid Python - identifier. - -- The constructor for the module type now requires a name argument and - takes an optional docstring argument. Previously, this constructor - ignored its arguments. As a consequence, deriving a class from a - module (not from the module type) is now illegal; previously this - created an unnamed module, just like invoking the module type did. - [SF bug 563060] - -- A new type object, 'basestring', is added. This is a common base type - for 'str' and 'unicode', and can be used instead of - types.StringTypes, e.g. to test whether something is "a string": - isinstance(x, basestring) is True for Unicode and 8-bit strings. This - is an abstract base class and cannot be instantiated directly. - -- Changed new-style class instantiation so that when C's __new__ - method returns something that's not a C instance, its __init__ is - not called. [SF bug #537450] - -- Fixed super() to work correctly with class methods. [SF bug #535444] - -- If you try to pickle an instance of a class that has __slots__ but - doesn't define or override __getstate__, a TypeError is now raised. - This is done by adding a bozo __getstate__ to the class that always - raises TypeError. (Before, this would appear to be pickled, but the - state of the slots would be lost.) - -Core and builtins ------------------ - -- Import from zipfiles is now supported. The name of a zipfile placed - on sys.path causes the import statement to look for importable Python - modules (with .py, pyc and .pyo extensions) and packages inside the - zipfile. The zipfile import follows the specification (though not - the sample implementation) of PEP 273. The semantics of __path__ are - compatible with those that have been implemented in Jython since - Jython 2.1. - -- PEP 302 has been accepted. Although it was initially developed to - support zipimport, it offers a new, general import hook mechanism. - Several new variables have been added to the sys module: - sys.meta_path, sys.path_hooks, and sys.path_importer_cache; these - make extending the import statement much more convenient than - overriding the __import__ built-in function. For a description of - these, see PEP 302. - -- A frame object's f_lineno attribute can now be written to from a - trace function to change which line will execute next. A command to - exploit this from pdb has been added. [SF patch #643835] - -- The _codecs support module for codecs.py was turned into a builtin - module to assure that at least the builtin codecs are available - to the Python parser for source code decoding according to PEP 263. - -- issubclass now supports a tuple as the second argument, just like - isinstance does. ``issubclass(X, (A, B))`` is equivalent to - ``issubclass(X, A) or issubclass(X, B)``. - -- Thanks to Armin Rigo, the last known way to provoke a system crash - by cleverly arranging for a comparison function to mutate a list - during a list.sort() operation has been fixed. The effect of - attempting to mutate a list, or even to inspect its contents or - length, while a sort is in progress, is not defined by the language. - The C implementation of Python 2.3 attempts to detect mutations, - and raise ValueError if one occurs, but there's no guarantee that - all mutations will be caught, or that any will be caught across - releases or implementations. - -- Unicode file name processing for Windows (PEP 277) is implemented. - All platforms now have an os.path.supports_unicode_filenames attribute, - which is set to True on Windows NT/2000/XP, and False elsewhere. - -- Codec error handling callbacks (PEP 293) are implemented. - Error handling in unicode.encode or str.decode can now be customized. - -- A subtle change to the semantics of the built-in function intern(): - interned strings are no longer immortal. You must keep a reference - to the return value intern() around to get the benefit. - -- Use of 'None' as a variable, argument or attribute name now - issues a SyntaxWarning. In the future, None may become a keyword. - -- SET_LINENO is gone. co_lnotab is now consulted to determine when to - call the trace function. C code that accessed f_lineno should call - PyCode_Addr2Line instead (f_lineno is still there, but only kept up - to date when there is a trace function set). - -- There's a new warning category, FutureWarning. This is used to warn - about a number of situations where the value or sign of an integer - result will change in Python 2.4 as a result of PEP 237 (integer - unification). The warnings implement stage B0 mentioned in that - PEP. The warnings are about the following situations: - - - Octal and hex literals without 'L' prefix in the inclusive range - [0x80000000..0xffffffff]; these are currently negative ints, but - in Python 2.4 they will be positive longs with the same bit - pattern. - - - Left shifts on integer values that cause the outcome to lose - bits or have a different sign than the left operand. To be - precise: x< -*-" in the first - or second line of a Python source file indicates the encoding. - -- list.sort() has a new implementation. While cross-platform results - may vary, and in data-dependent ways, this is much faster on many - kinds of partially ordered lists than the previous implementation, - and reported to be just as fast on randomly ordered lists on - several major platforms. This sort is also stable (if A==B and A - precedes B in the list at the start, A precedes B after the sort too), - although the language definition does not guarantee stability. A - potential drawback is that list.sort() may require temp space of - len(list)*2 bytes (``*4`` on a 64-bit machine). It's therefore possible - for list.sort() to raise MemoryError now, even if a comparison function - does not. See for full details. - -- All standard iterators now ensure that, once StopIteration has been - raised, all future calls to next() on the same iterator will also - raise StopIteration. There used to be various counterexamples to - this behavior, which could caused confusion or subtle program - breakage, without any benefits. (Note that this is still an - iterator's responsibility; the iterator framework does not enforce - this.) - -- Ctrl+C handling on Windows has been made more consistent with - other platforms. KeyboardInterrupt can now reliably be caught, - and Ctrl+C at an interactive prompt no longer terminates the - process under NT/2k/XP (it never did under Win9x). Ctrl+C will - interrupt time.sleep() in the main thread, and any child processes - created via the popen family (on win2k; we can't make win9x work - reliably) are also interrupted (as generally happens on for Linux/Unix.) - [SF bugs 231273, 439992 and 581232] - -- sys.getwindowsversion() has been added on Windows. This - returns a tuple with information about the version of Windows - currently running. - -- Slices and repetitions of buffer objects now consistently return - a string. Formerly, strings would be returned most of the time, - but a buffer object would be returned when the repetition count - was one or when the slice range was all inclusive. - -- Unicode objects in sys.path are no longer ignored but treated - as directory names. - -- Fixed string.startswith and string.endswith builtin methods - so they accept negative indices. [SF bug 493951] - -- Fixed a bug with a continue inside a try block and a yield in the - finally clause. [SF bug 567538] - -- Most builtin sequences now support "extended slices", i.e. slices - with a third "stride" parameter. For example, "hello world"[::-1] - gives "dlrow olleh". - -- A new warning PendingDeprecationWarning was added to provide - direction on features which are in the process of being deprecated. - The warning will not be printed by default. To see the pending - deprecations, use -Walways::PendingDeprecationWarning:: - as a command line option or warnings.filterwarnings() in code. - -- Deprecated features of xrange objects have been removed as - promised. The start, stop, and step attributes and the tolist() - method no longer exist. xrange repetition and slicing have been - removed. - -- New builtin function enumerate(x), from PEP 279. Example: - enumerate("abc") is an iterator returning (0,"a"), (1,"b"), (2,"c"). - The argument can be an arbitrary iterable object. - -- The assert statement no longer tests __debug__ at runtime. This means - that assert statements cannot be disabled by assigning a false value - to __debug__. - -- A method zfill() was added to str and unicode, that fills a numeric - string to the left with zeros. For example, - "+123".zfill(6) -> "+00123". - -- Complex numbers supported divmod() and the // and % operators, but - these make no sense. Since this was documented, they're being - deprecated now. - -- String and unicode methods lstrip(), rstrip() and strip() now take - an optional argument that specifies the characters to strip. For - example, "Foo!!!?!?!?".rstrip("?!") -> "Foo". - -- There's a new dictionary constructor (a class method of the dict - class), dict.fromkeys(iterable, value=None). It constructs a - dictionary with keys taken from the iterable and all values set to a - single value. It can be used for building sets and for removing - duplicates from sequences. - -- Added a new dict method pop(key). This removes and returns the - value corresponding to key. [SF patch #539949] - -- A new built-in type, bool, has been added, as well as built-in - names for its two values, True and False. Comparisons and sundry - other operations that return a truth value have been changed to - return a bool instead. Read PEP 285 for an explanation of why this - is backward compatible. - -- Fixed two bugs reported as SF #535905: under certain conditions, - deallocating a deeply nested structure could cause a segfault in the - garbage collector, due to interaction with the "trashcan" code; - access to the current frame during destruction of a local variable - could access a pointer to freed memory. - -- The optional object allocator ("pymalloc") has been enabled by - default. The recommended practice for memory allocation and - deallocation has been streamlined. A header file is included, - Misc/pymemcompat.h, which can be bundled with 3rd party extensions - and lets them use the same API with Python versions from 1.5.2 - onwards. - -- PyErr_Display will provide file and line information for all exceptions - that have an attribute print_file_and_line, not just SyntaxErrors. - -- The UTF-8 codec will now encode and decode Unicode surrogates - correctly and without raising exceptions for unpaired ones. - -- Universal newlines (PEP 278) is implemented. Briefly, using 'U' - instead of 'r' when opening a text file for reading changes the line - ending convention so that any of '\r', '\r\n', and '\n' is - recognized (even mixed in one file); all three are converted to - '\n', the standard Python line end character. - -- file.xreadlines() now raises a ValueError if the file is closed: - Previously, an xreadlines object was returned which would raise - a ValueError when the xreadlines.next() method was called. - -- sys.exit() inadvertently allowed more than one argument. - An exception will now be raised if more than one argument is used. - -- Changed evaluation order of dictionary literals to conform to the - general left to right evaluation order rule. Now {f1(): f2()} will - evaluate f1 first. - -- Fixed bug #521782: when a file was in non-blocking mode, file.read() - could silently lose data or wrongly throw an unknown error. - -- The sq_repeat, sq_inplace_repeat, sq_concat and sq_inplace_concat - slots are now always tried after trying the corresponding nb_* slots. - This fixes a number of minor bugs (see bug #624807). - -- Fix problem with dynamic loading on 64-bit AIX (see bug #639945). - -Extension modules ------------------ - -- Added three operators to the operator module: - operator.pow(a,b) which is equivalent to: a**b. - operator.is_(a,b) which is equivalent to: a is b. - operator.is_not(a,b) which is equivalent to: a is not b. - -- posix.openpty now works on all systems that have /dev/ptmx. - -- A module zipimport exists to support importing code from zip - archives. - -- The new datetime module supplies classes for manipulating dates and - times. The basic design came from the Zope "fishbowl process", and - favors practical commercial applications over calendar esoterica. See - - http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage - -- _tkinter now returns Tcl objects, instead of strings. Objects which - have Python equivalents are converted to Python objects, other objects - are wrapped. This can be configured through the wantobjects method, - or Tkinter.wantobjects. - -- The PyBSDDB wrapper around the Sleepycat Berkeley DB library has - been added as the package bsddb. The traditional bsddb module is - still available in source code, but not built automatically anymore, - and is now named bsddb185. This supports Berkeley DB versions from - 3.0 to 4.1. For help converting your databases from the old module (which - probably used an obsolete version of Berkeley DB) to the new module, see - the db2pickle.py and pickle2db.py scripts described in the Tools/Demos - section above. - -- unicodedata was updated to Unicode 3.2. It supports normalization - and names for Hangul syllables and CJK unified ideographs. - -- resource.getrlimit() now returns longs instead of ints. - -- readline now dynamically adjusts its input/output stream if - sys.stdin/stdout changes. - -- The _tkinter module (and hence Tkinter) has dropped support for - Tcl/Tk 8.0 and 8.1. Only Tcl/Tk versions 8.2, 8.3 and 8.4 are - supported. - -- cPickle.BadPickleGet is now a class. - -- The time stamps in os.stat_result are floating point numbers - after stat_float_times has been called. - -- If the size passed to mmap.mmap() is larger than the length of the - file on non-Windows platforms, a ValueError is raised. [SF bug 585792] - -- The xreadlines module is slated for obsolescence. - -- The strptime function in the time module is now always available (a - Python implementation is used when the C library doesn't define it). - -- The 'new' module is no longer an extension, but a Python module that - only exists for backwards compatibility. Its contents are no longer - functions but callable type objects. - -- The bsddb.*open functions can now take 'None' as a filename. - This will create a temporary in-memory bsddb that won't be - written to disk. - -- posix.getloadavg, posix.lchown, posix.killpg, posix.mknod, and - posix.getpgid have been added where available. - -- The locale module now exposes the C library's gettext interface. It - also has a new function getpreferredencoding. - -- A security hole ("double free") was found in zlib-1.1.3, a popular - third party compression library used by some Python modules. The - hole was quickly plugged in zlib-1.1.4, and the Windows build of - Python now ships with zlib-1.1.4. - -- pwd, grp, and resource return enhanced tuples now, with symbolic - field names. - -- array.array is now a type object. A new format character - 'u' indicates Py_UNICODE arrays. For those, .tounicode and - .fromunicode methods are available. Arrays now support __iadd__ - and __imul__. - -- dl now builds on every system that has dlfcn.h. Failure in case - of sizeof(int)!=sizeof(long)!=sizeof(void*) is delayed until dl.open - is called. - -- The sys module acquired a new attribute, api_version, which evaluates - to the value of the PYTHON_API_VERSION macro with which the - interpreter was compiled. - -- Fixed bug #470582: sre module would return a tuple (None, 'a', 'ab') - when applying the regular expression '^((a)c)?(ab)$' on 'ab'. It now - returns (None, None, 'ab'), as expected. Also fixed handling of - lastindex/lastgroup match attributes in similar cases. For example, - when running the expression r'(a)(b)?b' over 'ab', lastindex must be - 1, not 2. - -- Fixed bug #581080: sre scanner was not checking the buffer limit - before increasing the current pointer. This was creating an infinite - loop in the search function, once the pointer exceeded the buffer - limit. - -- The os.fdopen function now enforces a file mode starting with the - letter 'r', 'w' or 'a', otherwise a ValueError is raised. This fixes - bug #623464. - -- The linuxaudiodev module is now deprecated; it is being replaced by - ossaudiodev. The interface has been extended to cover a lot more of - OSS (see www.opensound.com), including most DSP ioctls and the - OSS mixer API. Documentation forthcoming in 2.3a2. - -Library -------- - -- imaplib.py now supports SSL (Tino Lange and Piers Lauder). - -- Freeze's modulefinder.py has been moved to the standard library; - slightly improved so it will issue less false missing submodule - reports (see sf path #643711 for details). Documentation will follow - with Python 2.3a2. - -- os.path exposes getctime. - -- unittest.py now has two additional methods called assertAlmostEqual() - and failIfAlmostEqual(). They implement an approximate comparison - by rounding the difference between the two arguments and comparing - the result to zero. Approximate comparison is essential for - unit tests of floating point results. - -- calendar.py now depends on the new datetime module rather than - the time module. As a result, the range of allowable dates - has been increased. - -- pdb has a new 'j(ump)' command to select the next line to be - executed. - -- The distutils created windows installers now can run a - postinstallation script. - -- doctest.testmod can now be called without argument, which means to - test the current module. - -- When canceling a server that implemented threading with a keyboard - interrupt, the server would shut down but not terminate (waiting on - client threads). A new member variable, daemon_threads, was added to - the ThreadingMixIn class in SocketServer.py to make it explicit that - this behavior needs to be controlled. - -- A new module, optparse, provides a fancy alternative to getopt for - command line parsing. It is a slightly modified version of Greg - Ward's Optik package. - -- UserDict.py now defines a DictMixin class which defines all dictionary - methods for classes that already have a minimum mapping interface. - This greatly simplifies writing classes that need to be substitutable - for dictionaries (such as the shelve module). - -- shelve.py now subclasses from UserDict.DictMixin. Now shelve supports - all dictionary methods. This eases the transition to persistent - storage for scripts originally written with dictionaries in mind. - -- shelve.open and the various classes in shelve.py now accept an optional - binary flag, which defaults to False. If True, the values stored in the - shelf are binary pickles. - -- A new package, logging, implements the logging API defined by PEP - 282. The code is written by Vinay Sajip. - -- StreamReader, StreamReaderWriter and StreamRecoder in the codecs - modules are iterators now. - -- gzip.py now handles files exceeding 2GB. Files over 4GB also work - now (provided the OS supports it, and Python is configured with large - file support), but in that case the underlying gzip file format can - record only the least-significant 32 bits of the file size, so that - some tools working with gzipped files may report an incorrect file - size. - -- xml.sax.saxutils.unescape has been added, to replace entity references - with their entity value. - -- Queue.Queue.{put,get} now support an optional timeout argument. - -- Various features of Tk 8.4 are exposed in Tkinter.py. The multiple - option of tkFileDialog is exposed as function askopenfile{,name}s. - -- Various configure methods of Tkinter have been stream-lined, so that - tag_configure, image_configure, window_configure now return a - dictionary when invoked with no argument. - -- Importing the readline module now no longer has the side effect of - calling setlocale(LC_CTYPE, ""). The initial "C" locale, or - whatever locale is explicitly set by the user, is preserved. If you - want repr() of 8-bit strings in your preferred encoding to preserve - all printable characters of that encoding, you have to add the - following code to your $PYTHONSTARTUP file or to your application's - main(): - - import locale - locale.setlocale(locale.LC_CTYPE, "") - -- shutil.move was added. shutil.copytree now reports errors as an - exception at the end, instead of printing error messages. - -- Encoding name normalization was generalized to not only - replace hyphens with underscores, but also all other non-alphanumeric - characters (with the exception of the dot which is used for Python - package names during lookup). The aliases.py mapping was updated - to the new standard. - -- mimetypes has two new functions: guess_all_extensions() which - returns a list of all known extensions for a mime type, and - add_type() which adds one mapping between a mime type and - an extension to the database. - -- New module: sets, defines the class Set that implements a mutable - set type using the keys of a dict to represent the set. There's - also a class ImmutableSet which is useful when you need sets of sets - or when you need to use sets as dict keys, and a class BaseSet which - is the base class of the two. - -- Added random.sample(population,k) for random sampling without replacement. - Returns a k length list of unique elements chosen from the population. - -- random.randrange(-sys.maxint-1, sys.maxint) no longer raises - OverflowError. That is, it now accepts any combination of 'start' - and 'stop' arguments so long as each is in the range of Python's - bounded integers. - -- Thanks to Raymond Hettinger, random.random() now uses a new core - generator. The Mersenne Twister algorithm is implemented in C, - threadsafe, faster than the previous generator, has an astronomically - large period (2**19937-1), creates random floats to full 53-bit - precision, and may be the most widely tested random number generator - in existence. - - The random.jumpahead(n) method has different semantics for the new - generator. Instead of jumping n steps ahead, it uses n and the - existing state to create a new state. This means that jumpahead() - continues to support multi-threaded code needing generators of - non-overlapping sequences. However, it will break code which relies - on jumpahead moving a specific number of steps forward. - - The attributes random.whseed and random.__whseed have no meaning for - the new generator. Code using these attributes should switch to a - new class, random.WichmannHill which is provided for backward - compatibility and to make an alternate generator available. - -- New "algorithms" module: heapq, implements a heap queue. Thanks to - Kevin O'Connor for the code and François Pinard for an entertaining - write-up explaining the theory and practical uses of heaps. - -- New encoding for the Palm OS character set: palmos. - -- binascii.crc32() and the zipfile module had problems on some 64-bit - platforms. These have been fixed. On a platform with 8-byte C longs, - crc32() now returns a signed-extended 4-byte result, so that its value - as a Python int is equal to the value computed a 32-bit platform. - -- xml.dom.minidom.toxml and toprettyxml now take an optional encoding - argument. - -- Some fixes in the copy module: when an object is copied through its - __reduce__ method, there was no check for a __setstate__ method on - the result [SF patch 565085]; deepcopy should treat instances of - custom metaclasses the same way it treats instances of type 'type' - [SF patch 560794]. - -- Sockets now support timeout mode. After s.settimeout(T), where T is - a float expressing seconds, subsequent operations raise an exception - if they cannot be completed within T seconds. To disable timeout - mode, use s.settimeout(None). There's also a module function, - socket.setdefaulttimeout(T), which sets the default for all sockets - created henceforth. - -- getopt.gnu_getopt was added. This supports GNU-style option - processing, where options can be mixed with non-option arguments. - -- Stop using strings for exceptions. String objects used for - exceptions are now classes deriving from Exception. The objects - changed were: Tkinter.TclError, bdb.BdbQuit, macpath.norm_error, - tabnanny.NannyNag, and xdrlib.Error. - -- Constants BOM_UTF8, BOM_UTF16, BOM_UTF16_LE, BOM_UTF16_BE, - BOM_UTF32, BOM_UTF32_LE and BOM_UTF32_BE that represent the Byte - Order Mark in UTF-8, UTF-16 and UTF-32 encodings for little and - big endian systems were added to the codecs module. The old names - BOM32_* and BOM64_* were off by a factor of 2. - -- Added conversion functions math.degrees() and math.radians(). - -- math.log() now takes an optional argument: math.log(x[, base]). - -- ftplib.retrlines() now tests for callback is None rather than testing - for False. Was causing an error when given a callback object which - was callable but also returned len() as zero. The change may - create new breakage if the caller relied on the undocumented behavior - and called with callback set to [] or some other False value not - identical to None. - -- random.gauss() uses a piece of hidden state used by nothing else, - and the .seed() and .whseed() methods failed to reset it. In other - words, setting the seed didn't completely determine the sequence of - results produced by random.gauss(). It does now. Programs repeatedly - mixing calls to a seed method with calls to gauss() may see different - results now. - -- The pickle.Pickler class grew a clear_memo() method to mimic that - provided by cPickle.Pickler. - -- difflib's SequenceMatcher class now does a dynamic analysis of - which elements are so frequent as to constitute noise. For - comparing files as sequences of lines, this generally works better - than the IS_LINE_JUNK function, and function ndiff's linejunk - argument defaults to None now as a result. A happy benefit is - that SequenceMatcher may run much faster now when applied - to large files with many duplicate lines (for example, C program - text with lots of repeated "}" and "return NULL;" lines). - -- New Text.dump() method in Tkinter module. - -- New distutils commands for building packagers were added to - support pkgtool on Solaris and swinstall on HP-UX. - -- distutils now has a new abstract binary packager base class - command/bdist_packager, which simplifies writing packagers. - This will hopefully provide the missing bits to encourage - people to submit more packagers, e.g. for Debian, FreeBSD - and other systems. - -- The UTF-16, -LE and -BE stream readers now raise a - NotImplementedError for all calls to .readline(). Previously, they - used to just produce garbage or fail with an encoding error -- - UTF-16 is a 2-byte encoding and the C lib's line reading APIs don't - work well with these. - -- compileall now supports quiet operation. - -- The BaseHTTPServer now implements optional HTTP/1.1 persistent - connections. - -- socket module: the SSL support was broken out of the main - _socket module C helper and placed into a new _ssl helper - which now gets imported by socket.py if available and working. - -- encodings package: added aliases for all supported IANA character - sets - -- ftplib: to safeguard the user's privacy, anonymous login will use - "anonymous@" as default password, rather than the real user and host - name. - -- webbrowser: tightened up the command passed to os.system() so that - arbitrary shell code can't be executed because a bogus URL was - passed in. - -- gettext.translation has an optional fallback argument, and - gettext.find an optional all argument. Translations will now fallback - on a per-message basis. The module supports plural forms, by means - of gettext.[d]ngettext and Translation.[u]ngettext. - -- distutils bdist commands now offer a --skip-build option. - -- warnings.warn now accepts a Warning instance as first argument. - -- The xml.sax.expatreader.ExpatParser class will no longer create - circular references by using itself as the locator that gets passed - to the content handler implementation. [SF bug #535474] - -- The email.Parser.Parser class now properly parses strings regardless - of their line endings, which can be any of \r, \n, or \r\n (CR, LF, - or CRLF). Also, the Header class's constructor default arguments - has changed slightly so that an explicit maxlinelen value is always - honored, and so unicode conversion error handling can be specified. - -- distutils' build_ext command now links C++ extensions with the C++ - compiler available in the Makefile or CXX environment variable, if - running under \*nix. - -- New module bz2: provides a comprehensive interface for the bz2 compression - library. It implements a complete file interface, one-shot (de)compression - functions, and types for sequential (de)compression. - -- New pdb command 'pp' which is like 'p' except that it pretty-prints - the value of its expression argument. - -- Now bdist_rpm distutils command understands a verify_script option in - the config file, including the contents of the referred filename in - the "%verifyscript" section of the rpm spec file. - -- Fixed bug #495695: webbrowser module would run graphic browsers in a - unix environment even if DISPLAY was not set. Also, support for - skipstone browser was included. - -- Fixed bug #636769: rexec would run unallowed code if subclasses of - strings were used as parameters for certain functions. - -Tools/Demos ------------ - -- pygettext.py now supports globbing on Windows, and accepts module - names in addition to accepting file names. - -- The SGI demos (Demo/sgi) have been removed. Nobody thought they - were interesting any more. (The SGI library modules and extensions - are still there; it is believed that at least some of these are - still used and useful.) - -- IDLE supports the new encoding declarations (PEP 263); it can also - deal with legacy 8-bit files if they use the locale's encoding. It - allows non-ASCII strings in the interactive shell and executes them - in the locale's encoding. - -- freeze.py now produces binaries which can import shared modules, - unlike before when this failed due to missing symbol exports in - the generated binary. - -Build ------ - -- On Unix, IDLE is now installed automatically. - -- The fpectl module is not built by default; it's dangerous or useless - except in the hands of experts. - -- The public Python C API will generally be declared using PyAPI_FUNC - and PyAPI_DATA macros, while Python extension module init functions - will be declared with PyMODINIT_FUNC. DL_EXPORT/DL_IMPORT macros - are deprecated. - -- A bug was fixed that could cause COUNT_ALLOCS builds to segfault, or - get into infinite loops, when a new-style class got garbage-collected. - Unfortunately, to avoid this, the way COUNT_ALLOCS works requires - that new-style classes be immortal in COUNT_ALLOCS builds. Note that - COUNT_ALLOCS is not enabled by default, in either release or debug - builds, and that new-style classes are immortal only in COUNT_ALLOCS - builds. - -- Compiling out the cyclic garbage collector is no longer an option. - The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges - that it's always defined (for the benefit of any extension modules - that may be conditionalizing on it). A bonus is that any extension - type participating in cyclic gc can choose to participate in the - Py_TRASHCAN mechanism now too; in the absence of cyclic gc, this used - to require editing the core to teach the trashcan mechanism about the - new type. - -- According to Annex F of the current C standard, - - The Standard C macro HUGE_VAL and its float and long double analogs, - HUGE_VALF and HUGE_VALL, expand to expressions whose values are - positive infinities. - - Python only uses the double HUGE_VAL, and only to #define its own symbol - Py_HUGE_VAL. Some platforms have incorrect definitions for HUGE_VAL. - pyport.h used to try to worm around that, but the workarounds triggered - other bugs on other platforms, so we gave up. If your platform defines - HUGE_VAL incorrectly, you'll need to #define Py_HUGE_VAL to something - that works on your platform. The only instance of this I'm sure about - is on an unknown subset of Cray systems, described here: - - http://www.cray.com/swpubs/manuals/SN-2194_2.0/html-SN-2194_2.0/x3138.htm - - Presumably 2.3a1 breaks such systems. If anyone uses such a system, help! - -- The configure option --without-doc-strings can be used to remove the - doc strings from the builtin functions and modules; this reduces the - size of the executable. - -- The universal newlines option (PEP 278) is on by default. On Unix - it can be disabled by passing --without-universal-newlines to the - configure script. On other platforms, remove - WITH_UNIVERSAL_NEWLINES from pyconfig.h. - -- On Unix, a shared libpython2.3.so can be created with --enable-shared. - -- All uses of the CACHE_HASH, INTERN_STRINGS, and DONT_SHARE_SHORT_STRINGS - preprocessor symbols were eliminated. The internal decisions they - controlled stopped being experimental long ago. - -- The tools used to build the documentation now work under Cygwin as - well as Unix. - -- The bsddb and dbm module builds have been changed to try and avoid version - skew problems and disable linkage with Berkeley DB 1.85 unless the - installer knows what s/he's doing. See the section on building these - modules in the README file for details. - -C API ------ - -- PyNumber_Check() now returns true for string and unicode objects. - This is a result of these types having a partially defined - tp_as_number slot. (This is not a feature, but an indication that - PyNumber_Check() is not very useful to determine numeric behavior. - It may be deprecated.) - -- The string object's layout has changed: the pointer member - ob_sinterned has been replaced by an int member ob_sstate. On some - platforms (e.g. most 64-bit systems) this may change the offset of - the ob_sval member, so as a precaution the API_VERSION has been - incremented. The apparently unused feature of "indirect interned - strings", supported by the ob_sinterned member, is gone. Interned - strings are now usually mortal; there is a new API, - PyString_InternImmortal() that creates immortal interned strings. - (The ob_sstate member can only take three values; however, while - making it a char saves a few bytes per string object on average, in - it also slowed things down a bit because ob_sval was no longer - aligned.) - -- The Py_InitModule*() functions now accept NULL for the 'methods' - argument. Modules without global functions are becoming more common - now that factories can be types rather than functions. - -- New C API PyUnicode_FromOrdinal() which exposes unichr() at C - level. - -- New functions PyErr_SetExcFromWindowsErr() and - PyErr_SetExcFromWindowsErrWithFilename(). Similar to - PyErr_SetFromWindowsErrWithFilename() and - PyErr_SetFromWindowsErr(), but they allow to specify - the exception type to raise. Available on Windows. - -- Py_FatalError() is now declared as taking a const char* argument. It - was previously declared without const. This should not affect working - code. - -- Added new macro PySequence_ITEM(o, i) that directly calls - sq_item without rechecking that o is a sequence and without - adjusting for negative indices. - -- PyRange_New() now raises ValueError if the fourth argument is not 1. - This is part of the removal of deprecated features of the xrange - object. - -- PyNumber_Coerce() and PyNumber_CoerceEx() now also invoke the type's - coercion if both arguments have the same type but this type has the - CHECKTYPES flag set. This is to better support proxies. - -- The type of tp_free has been changed from "``void (*)(PyObject *)``" to - "``void (*)(void *)``". - -- PyObject_Del, PyObject_GC_Del are now functions instead of macros. - -- A type can now inherit its metatype from its base type. Previously, - when PyType_Ready() was called, if ob_type was found to be NULL, it - was always set to &PyType_Type; now it is set to base->ob_type, - where base is tp_base, defaulting to &PyObject_Type. - -- PyType_Ready() accidentally did not inherit tp_is_gc; now it does. - -- The PyCore_* family of APIs have been removed. - -- The "u#" parser marker will now pass through Unicode objects as-is - without going through the buffer API. - -- The enumerators of cmp_op have been renamed to use the prefix ``PyCmp_``. - -- An old #define of ANY as void has been removed from pyport.h. This - hasn't been used since Python's pre-ANSI days, and the #define has - been marked as obsolete since then. SF bug 495548 says it created - conflicts with other packages, so keeping it around wasn't harmless. - -- Because Python's magic number scheme broke on January 1st, we decided - to stop Python development. Thanks for all the fish! - -- Some of us don't like fish, so we changed Python's magic number - scheme to a new one. See Python/import.c for details. - -New platforms -------------- - -- OpenVMS is now supported. - -- AtheOS is now supported. - -- the EMX runtime environment on OS/2 is now supported. - -- GNU/Hurd is now supported. - -Tests ------ - -- The regrtest.py script's -u option now provides a way to say "allow - all resources except this one." For example, to allow everything - except bsddb, give the option '-uall,-bsddb'. - -Windows -------- - -- The Windows distribution now ships with version 4.0.14 of the - Sleepycat Berkeley database library. This should be a huge - improvement over the previous Berkeley DB 1.85, which had many - bugs. - XXX What are the licensing issues here? - XXX If a user has a database created with a previous version of - XXX Python, what must they do to convert it? - XXX I'm still not sure how to link this thing (see PCbuild/readme.txt). - XXX The version # is likely to change before 2.3a1. - -- The Windows distribution now ships with a Secure Sockets Library (SLL) - module (_ssl.pyd) - -- The Windows distribution now ships with Tcl/Tk version 8.4.1 (it - previously shipped with Tcl/Tk 8.3.2). - -- When Python is built under a Microsoft compiler, sys.version now - includes the compiler version number (_MSC_VER). For example, under - MSVC 6, sys.version contains the substring "MSC v.1200 ". 1200 is - the value of _MSC_VER under MSVC 6. - -- Sometimes the uninstall executable (UNWISE.EXE) vanishes. One cause - of that has been fixed in the installer (disabled Wise's "delete in- - use files" uninstall option). - -- Fixed a bug in urllib's proxy handling in Windows. [SF bug #503031] - -- The installer now installs Start menu shortcuts under (the local - equivalent of) "All Users" when doing an Admin install. - -- file.truncate([newsize]) now works on Windows for all newsize values. - It used to fail if newsize didn't fit in 32 bits, reflecting a - limitation of MS _chsize (which is no longer used). - -- os.waitpid() is now implemented for Windows, and can be used to block - until a specified process exits. This is similar to, but not exactly - the same as, os.waitpid() on POSIX systems. If you're waiting for - a specific process whose pid was obtained from one of the spawn() - functions, the same Python os.waitpid() code works across platforms. - See the docs for details. The docs were changed to clarify that - spawn functions return, and waitpid requires, a process handle on - Windows (not the same thing as a Windows process id). - -- New tempfile.TemporaryFile implementation for Windows: this doesn't - need a TemporaryFileWrapper wrapper anymore, and should be immune - to a nasty problem: before 2.3, if you got a temp file on Windows, it - got wrapped in an object whose close() method first closed the - underlying file, then deleted the file. This usually worked fine. - However, the spawn family of functions on Windows create (at a low C - level) the same set of open files in the spawned process Q as were - open in the spawning process P. If a temp file f was among them, then - doing f.close() in P first closed P's C-level file handle on f, but Q's - C-level file handle on f remained open, so the attempt in P to delete f - blew up with a "Permission denied" error (Windows doesn't allow - deleting open files). This was surprising, subtle, and difficult to - work around. - -- The os module now exports all the symbolic constants usable with the - low-level os.open() on Windows: the new constants in 2.3 are - O_NOINHERIT, O_SHORT_LIVED, O_TEMPORARY, O_RANDOM and O_SEQUENTIAL. - The others were also available in 2.2: O_APPEND, O_BINARY, O_CREAT, - O_EXCL, O_RDONLY, O_RDWR, O_TEXT, O_TRUNC and O_WRONLY. Contrary - to Microsoft docs, O_SHORT_LIVED does not seem to imply O_TEMPORARY - (so specify both if you want both; note that neither is useful unless - specified with O_CREAT too). - -Mac ----- - -- Mac/Relnotes is gone, the release notes are now here. - -- Python (the OSX-only, unix-based version, not the OS9-compatible CFM - version) now fully supports unicode strings as arguments to various file - system calls, eg. open(), file(), os.stat() and os.listdir(). - -- The current naming convention for Python on the Macintosh is that MacPython - refers to the unix-based OSX-only version, and MacPython-OS9 refers to the - CFM-based version that runs on both OS9 and OSX. - -- All MacPython-OS9 functionality is now available in an OSX unix build, - including the Carbon modules, the IDE, OSA support, etc. A lot of this - will only work correctly in a framework build, though, because you cannot - talk to the window manager unless your application is run from a .app - bundle. There is a command line tool "pythonw" that runs your script - with an interpreter living in such a .app bundle, this interpreter should - be used to run any Python script using the window manager (including - Tkinter or wxPython scripts). - -- Most of Mac/Lib has moved to Lib/plat-mac, which is again used both in - MacPython-OSX and MacPython-OS9. The only modules remaining in Mac/Lib - are specifically for MacPython-OS9 (CFM support, preference resources, etc). - -- A new utility PythonLauncher will start a Python interpreter when a .py or - .pyw script is double-clicked in the Finder. By default .py scripts are - run with a normal Python interpreter in a Terminal window and .pyw - files are run with a window-aware pythonw interpreter without a Terminal - window, but all this can be customized. - -- MacPython-OS9 is now Carbon-only, so it runs on Mac OS 9 or Mac OS X and - possibly on Mac OS 8.6 with the right CarbonLib installed, but not on earlier - releases. - -- Many tools such as BuildApplet.py and gensuitemodule.py now support a command - line interface too. - -- All the Carbon classes are now PEP253 compliant, meaning that you can - subclass them from Python. Most of the attributes have gone, you should - now use the accessor function call API, which is also what Apple's - documentation uses. Some attributes such as grafport.visRgn are still - available for convenience. - -- New Carbon modules File (implementing the APIs in Files.h and Aliases.h) - and Folder (APIs from Folders.h). The old macfs builtin module is - gone, and replaced by a Python wrapper around the new modules. - -- Pathname handling should now be fully consistent: MacPython-OSX always uses - unix pathnames and MacPython-OS9 always uses colon-separated Mac pathnames - (also when running on Mac OS X). - -- New Carbon modules Help and AH give access to the Carbon Help Manager. - There are hooks in the IDE to allow accessing the Python documentation - (and Apple's Carbon and Cocoa documentation) through the Help Viewer. - See Mac/OSX/README for converting the Python documentation to a - Help Viewer compatible form and installing it. - -- OSA support has been redesigned and the generated Python classes now - mirror the inheritance defined by the underlying OSA classes. - -- MacPython no longer maps both \r and \n to \n on input for any text file. - This feature has been replaced by universal newline support (PEP278). - -- The default encoding for Python sourcefiles in MacPython-OS9 is no longer - mac-roman (or whatever your local Mac encoding was) but "ascii", like on - other platforms. If you really need sourcefiles with Mac characters in them - you can change this in site.py. - - -What's New in Python 2.2 final? -=============================== - -*Release date: 21-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pickle.py, cPickle: allow pickling instances of new-style classes - with a custom metaclass. - -Core and builtins ------------------ - -- weakref proxy object: when comparing, unwrap both arguments if both - are proxies. - -Extension modules ------------------ - -- binascii.b2a_base64(): fix a potential buffer overrun when encoding - very short strings. - -- cPickle: the obscure "fast" mode was suspected of causing stack - overflows on the Mac. Hopefully fixed this by setting the recursion - limit much smaller. If the limit is too low (it only affects - performance), you can change it by defining PY_CPICKLE_FAST_LIMIT - when compiling cPickle.c (or in pyconfig.h). - -Library -------- - -- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at - close or delete time). - -- rfc822.py: fixed a bug where the address '<>' was converted to None - instead of an empty string (also fixes the email.Utils module). - -- xmlrpclib.py: version 1.0.0; uses precision for doubles. - -- test suite: the pickle and cPickle tests were not executing any code - when run from the standard regression test. - -Tools/Demos ------------ - -Build ------ - -C API ------ - -New platforms -------------- - -Tests ------ - -Windows -------- - -- distutils package: fixed broken Windows installers (bdist_wininst). - -- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper - instances are deleted at process exit time. - -- socket.py: prevent mysterious warnings when socket instances are - deleted at process exit time. - -- posixmodule.c: fix a Windows crash with stat() of a filename ending - in backslash. - -Mac ----- - -- The Carbon toolbox modules have been upgraded to Universal Headers - 3.4, and experimental CoreGraphics and CarbonEvents modules have - been added. All only for framework-enabled MacOSX. - - -What's New in Python 2.2c1? -=========================== - -*Release date: 14-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Guido's tutorial introduction to the new type/class features has - been extensively updated. See - - http://www.python.org/2.2/descrintro.html - - That remains the primary documentation in this area. - -- Fixed a leak: instance variables declared with __slots__ were never - deleted! - -- The "delete attribute" method of descriptor objects is called - __delete__, not __del__. In previous releases, it was mistakenly - called __del__, which created an unfortunate overloading condition - with finalizers. (The "get attribute" and "set attribute" methods - are still called __get__ and __set__, respectively.) - -- Some subtle issues with the super built-in were fixed: - - (a) When super itself is subclassed, its __get__ method would still - return an instance of the base class (i.e., of super). - - (b) super(C, C()).__class__ would return C rather than super. This - is confusing. To fix this, I decided to change the semantics of - super so that it only applies to code attributes, not to data - attributes. After all, overriding data attributes is not - supported anyway. - - (c) The __get__ method didn't check whether the argument was an - instance of the type used in creation of the super instance. - -- Previously, hash() of an instance of a subclass of a mutable type - (list or dictionary) would return some value, rather than raising - TypeError. This has been fixed. Also, directly calling - dict.__hash__ and list.__hash__ now raises the same TypeError - (previously, these were the same as object.__hash__). - -- New-style objects now support deleting their __dict__. This is for - all intents and purposes equivalent to assigning a brand new empty - dictionary, but saves space if the object is not used further. - -Core and builtins ------------------ - -- -Qnew now works as documented in PEP 238: when -Qnew is passed on - the command line, all occurrences of "/" use true division instead - of classic division. See the PEP for details. Note that "all" - means all instances in library and 3rd-party modules, as well as in - your own code. As the PEP says, -Qnew is intended for use only in - educational environments with control over the libraries in use. - Note that test_coercion.py in the standard Python test suite fails - under -Qnew; this is expected, and won't be repaired until true - division becomes the default (in the meantime, test_coercion is - testing the current rules). - -- complex() now only allows the first argument to be a string - argument, and raises TypeError if either the second arg is a string - or if the second arg is specified when the first is a string. - -Extension modules ------------------ - -- gc.get_referents was renamed to gc.get_referrers. - -Library -------- - -- Functions in the os.spawn() family now release the global interpreter - lock around calling the platform spawn. They should always have done - this, but did not before 2.2c1. Multithreaded programs calling - an os.spawn function with P_WAIT will no longer block all Python threads - until the spawned program completes. It's possible that some programs - relies on blocking, although more likely by accident than by design. - -- webbrowser defaults to netscape.exe on OS/2 now. - -- Tix.ResizeHandle exposes detach_widget, hide, and show. - -- The charset alias windows_1252 has been added. - -- types.StringTypes is a tuple containing the defined string types; - usually this will be (str, unicode), but if Python was compiled - without Unicode support it will be just (str,). - -- The pulldom and minidom modules were synchronized to PyXML. - -Tools/Demos ------------ - -- A new script called Tools/scripts/google.py was added, which fires - off a search on Google. - -Build ------ - -- Note that release builds of Python should arrange to define the - preprocessor symbol NDEBUG on the command line (or equivalent). - In the 2.2 pre-release series we tried to define this by magic in - Python.h instead, but it proved to cause problems for extension - authors. The Unix, Windows and Mac builds now all define NDEBUG in - release builds via cmdline (or equivalent) instead. Ports to - other platforms should do likewise. - -- It is no longer necessary to use --with-suffix when building on a - case-insensitive file system (such as Mac OS X HFS+). In the build - directory an extension is used, but not in the installed python. - -C API ------ - -- New function PyDict_MergeFromSeq2() exposes the builtin dict - constructor's logic for updating a dictionary from an iterable object - producing key-value pairs. - -- PyArg_ParseTupleAndKeywords() requires that the number of entries in - the keyword list equal the number of argument specifiers. This - wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even - dump core in some bad cases. This has been repaired. As a result, - PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that - previously went unchallenged. - -New platforms -------------- - -Tests ------ - -Windows -------- - -Mac ----- - -- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin", - without any trailing digits. - -- Changed logic for finding python home in Mac OS X framework Pythons. - Now sys.executable points to the executable again, in stead of to - the shared library. The latter is used only for locating the python - home. - - -What's New in Python 2.2b2? -=========================== - -*Release date: 16-Nov-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Multiple inheritance mixing new-style and classic classes in the - list of base classes is now allowed, so this works now: - - class Classic: pass - class Mixed(Classic, object): pass - - The MRO (method resolution order) for each base class is respected - according to its kind, but the MRO for the derived class is computed - using new-style MRO rules if any base class is a new-style class. - This needs to be documented. - -- The new builtin dictionary() constructor, and dictionary type, have - been renamed to dict. This reflects a decade of common usage. - -- dict() now accepts an iterable object producing 2-sequences. For - example, dict(d.items()) == d for any dictionary d. The argument, - and the elements of the argument, can be any iterable objects. - -- New-style classes can now have a __del__ method, which is called - when the instance is deleted (just like for classic classes). - -- Assignment to object.__dict__ is now possible, for objects that are - instances of new-style classes that have a __dict__ (unless the base - class forbids it). - -- Methods of built-in types now properly check for keyword arguments - (formerly these were silently ignored). The only built-in methods - that take keyword arguments are __call__, __init__ and __new__. - -- The socket function has been converted to a type; see below. - -Core and builtins ------------------ - -- Assignment to __debug__ raises SyntaxError at compile-time. This - was promised when 2.1c1 was released as "What's New in Python 2.1c1" - (see below) says. - -- Clarified the error messages for unsupported operands to an operator - (like 1 + ''). - -Extension modules ------------------ - -- mmap has a new keyword argument, "access", allowing a uniform way for - both Windows and Unix users to create read-only, write-through and - copy-on-write memory mappings. This was previously possible only on - Unix. A new keyword argument was required to support this in a - uniform way because the mmap() signatures had diverged across - platforms. Thanks to Jay T Miller for repairing this! - -- By default, the gc.garbage list now contains only those instances in - unreachable cycles that have __del__ methods; in 2.1 it contained all - instances in unreachable cycles. "Instances" here has been generalized - to include instances of both new-style and old-style classes. - -- The socket module defines a new method for socket objects, - sendall(). This is like send() but may make multiple calls to - send() until all data has been sent. Also, the socket function has - been converted to a subclassable type, like list and tuple (etc.) - before it; socket and SocketType are now the same thing. - -- Various bugfixes to the curses module. There is now a test suite - for the curses module (you have to run it manually). - -- binascii.b2a_base64 no longer places an arbitrary restriction of 57 - bytes on its input. - -Library -------- - -- tkFileDialog exposes a Directory class and askdirectory - convenience function. - -- Symbolic group names in regular expressions must be unique. For - example, the regexp r'(?P)(?P)' is not allowed, because a - single name can't mean both "group 1" and "group 2" simultaneously. - Python 2.2 detects this error at regexp compilation time; - previously, the error went undetected, and results were - unpredictable. Also in sre, the pattern.split(), pattern.sub(), and - pattern.subn() methods have been rewritten in C. Also, an - experimental function/method finditer() has been added, which works - like findall() but returns an iterator. - -- Tix exposes more commands through the classes DirSelectBox, - DirSelectDialog, ListNoteBook, Meter, CheckList, and the - methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, - tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. - -- Traceback objects are now scanned by cyclic garbage collection, so - cycles created by casual use of sys.exc_info() no longer cause - permanent memory leaks (provided garbage collection is enabled). - -- os.extsep -- a new variable needed by the RISCOS support. It is the - separator used by extensions, and is '.' on all platforms except - RISCOS, where it is '/'. There is no need to use this variable - unless you have a masochistic desire to port your code to RISCOS. - -- mimetypes.py has optional support for non-standard, but commonly - found types. guess_type() and guess_extension() now accept an - optional 'strict' flag, defaulting to true, which controls whether - recognize non-standard types or not. A few non-standard types we - know about have been added. Also, when run as a script, there are - new -l and -e options. - -- statcache is now deprecated. - -- email.Utils.formatdate() now produces the preferred RFC 2822 style - dates with numeric timezones (it used to produce obsolete dates - hard coded to "GMT" timezone). An optional 'localtime' flag is - added to produce dates in the local timezone, with daylight savings - time properly taken into account. - -- In pickle and cPickle, instead of masking errors in load() by - transforming them into SystemError, we let the original exception - propagate out. Also, implement support for __safe_for_unpickling__ - in pickle, as it already was supported in cPickle. - -Tools/Demos ------------ - -Build ------ - -- The dbm module is built using libdb1 if available. The bsddb module - is built with libdb3 if available. - -- Misc/Makefile.pre.in has been removed by BDFL pronouncement. - -C API ------ - -- New function PySequence_Fast_GET_SIZE() returns the size of a non- - NULL result from PySequence_Fast(), more quickly than calling - PySequence_Size(). - -- New argument unpacking function PyArg_UnpackTuple() added. - -- New functions PyObject_CallFunctionObjArgs() and - PyObject_CallMethodObjArgs() have been added to make it more - convenient and efficient to call functions and methods from C. - -- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's - possible that this will propagate errors it didn't before. - -- New function PyObject_CheckReadBuffer(), which returns true if its - argument supports the single-segment readable buffer interface. - -New platforms -------------- - -- We've finally confirmed that this release builds on HP-UX 11.00, - *with* threads, and passes the test suite. - -- Thanks to a series of patches from Michael Muller, Python may build - again under OS/2 Visual Age C++. - -- Updated RISCOS port by Dietmar Schwertberger. - -Tests ------ - -- Added a test script for the curses module. It isn't run automatically; - regrtest.py must be run with '-u curses' to enable it. - -Windows -------- - -Mac ----- - -- PythonScript has been moved to unsupported and is slated to be - removed completely in the next release. - -- It should now be possible to build applets that work on both OS9 and - OSX. - -- The core is now linked with CoreServices not Carbon; as a side - result, default 8bit encoding on OSX is now ASCII. - -- Python should now build on OSX 10.1.1 - - -What's New in Python 2.2b1? -=========================== - -*Release date: 19-Oct-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- New-style classes are now always dynamic (except for built-in and - extension types). There is no longer a performance penalty, and I - no longer see another reason to keep this baggage around. One relic - remains: the __dict__ of a new-style class is a read-only proxy; you - must set the class's attribute to modify it. As a consequence, the - __defined__ attribute of new-style types no longer exists, for lack - of need: there is once again only one __dict__ (although in the - future a __cache__ may be resurrected with a similar function, if I - can prove that it actually speeds things up). - -- C.__doc__ now works as expected for new-style classes (in 2.2a4 it - always returned None, even when there was a class docstring). - -- doctest now finds and runs docstrings attached to new-style classes, - class methods, static methods, and properties. - -Core and builtins ------------------ - -- A very subtle syntactical pitfall in list comprehensions was fixed. - For example: [a+b for a in 'abc', for b in 'def']. The comma in - this example is a mistake. Previously, this would silently let 'a' - iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce', - 'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be', - 'bf', 'cd', 'ce', 'cf']. Now, this is flagged as a syntax error. - Note that [a for a in ] is a convoluted way to say - [] anyway, so it's not like any expressiveness is lost. - -- getattr(obj, name, default) now only catches AttributeError, as - documented, rather than returning the default value for all - exceptions (which could mask bugs in a __getattr__ hook, for - example). - -- Weak reference objects are now part of the core and offer a C API. - A bug which could allow a core dump when binary operations involved - proxy reference has been fixed. weakref.ReferenceError is now a - built-in exception. - -- unicode(obj) now behaves more like str(obj), accepting arbitrary - objects, and calling a __unicode__ method if it exists. - unicode(obj, encoding) and unicode(obj, encoding, errors) still - require an 8-bit string or character buffer argument. - -- isinstance() now allows any object as the first argument and a - class, a type or something with a __bases__ tuple attribute for the - second argument. The second argument may also be a tuple of a - class, type, or something with __bases__, in which case isinstance() - will return true if the first argument is an instance of any of the - things contained in the second argument tuple. E.g. - - isinstance(x, (A, B)) - - returns true if x is an instance of A or B. - -Extension modules ------------------ - -- thread.start_new_thread() now returns the thread ID (previously None). - -- binascii has now two quopri support functions, a2b_qp and b2a_qp. - -- readline now supports setting the startup_hook and the - pre_event_hook, and adds the add_history() function. - -- os and posix supports chroot(), setgroups() and unsetenv() where - available. The stat(), fstat(), statvfs() and fstatvfs() functions - now return "pseudo-sequences" -- the various fields can now be - accessed as attributes (e.g. os.stat("/").st_mtime) but for - backwards compatibility they also behave as a fixed-length sequence. - Some platform-specific fields (e.g. st_rdev) are only accessible as - attributes. - -- time: localtime(), gmtime() and strptime() now return a - pseudo-sequence similar to the os.stat() return value, with - attributes like tm_year etc. - -- Decompression objects in the zlib module now accept an optional - second parameter to decompress() that specifies the maximum amount - of memory to use for the uncompressed data. - -- optional SSL support in the socket module now exports OpenSSL - functions RAND_add(), RAND_egd(), and RAND_status(). These calls - are useful on platforms like Solaris where OpenSSL does not - automatically seed its PRNG. Also, the keyfile and certfile - arguments to socket.ssl() are now optional. - -- posixmodule (and by extension, the os module on POSIX platforms) now - exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW. - -Library -------- - -- doctest now excludes functions and classes not defined by the module - being tested, thanks to Tim Hochberg. - -- HotShot, a new profiler implemented using a C-based callback, has - been added. This substantially reduces the overhead of profiling, - but it is still quite preliminary. Support modules and - documentation will be added in upcoming releases (before 2.2 final). - -- profile now produces correct output in situations where an exception - raised in Python is cleared by C code (e.g. hasattr()). This used - to cause wrong output, including spurious claims of recursive - functions and attribution of time spent to the wrong function. - - The code and documentation for the derived OldProfile and HotProfile - profiling classes was removed. The code hasn't worked for years (if - you tried to use them, they raised exceptions). OldProfile - intended to reproduce the behavior of the profiler Python used more - than 7 years ago, and isn't interesting anymore. HotProfile intended - to provide a faster profiler (but producing less information), and - that's a worthy goal we intend to meet via a different approach (but - without losing information). - -- Profile.calibrate() has a new implementation that should deliver - a much better system-specific calibration constant. The constant can - now be specified in an instance constructor, or as a Profile class or - instance variable, instead of by editing profile.py's source code. - Calibration must still be done manually (see the docs for the profile - module). - - Note that Profile.calibrate() must be overridden by subclasses. - Improving the accuracy required exploiting detailed knowledge of - profiler internals; the earlier method abstracted away the details - and measured a simplified model instead, but consequently computed - a constant too small by a factor of 2 on some modern machines. - -- quopri's encode and decode methods take an optional header parameter, - which indicates whether output is intended for the header 'Q' - encoding. - -- The SocketServer.ThreadingMixIn class now closes the request after - finish_request() returns. (Not when it errors out though.) - -- The nntplib module's NNTP.body() method has grown a 'file' argument - to allow saving the message body to a file. - -- The email package has added a class email.Parser.HeaderParser which - only parses headers and does not recurse into the message's body. - Also, the module/class MIMEAudio has been added for representing - audio data (contributed by Anthony Baxter). - -- ftplib should be able to handle files > 2GB. - -- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO, - ON, and OFF. - -- xml.dom.minidom NodeList objects now support the length attribute - and item() method as required by the DOM specifications. - -Tools/Demos ------------ - -- Demo/dns was removed. It no longer serves any purpose; a package - derived from it is now maintained by Anthony Baxter, see - http://PyDNS.SourceForge.net. - -- The freeze tool has been made more robust, and two new options have - been added: -X and -E. - -Build ------ - -- configure will use CXX in LINKCC if CXX is used to build main() and - the system requires to link a C++ main using the C++ compiler. - -C API ------ - -- The documentation for the tp_compare slot is updated to require that - the return value must be -1, 0, 1; an arbitrary number <0 or >0 is - not correct. This is not yet enforced but will be enforced in - Python 2.3; even later, we may use -2 to indicate errors and +2 for - "NotImplemented". Right now, -1 should be used for an error return. - -- PyLong_AsLongLong() now accepts int (as well as long) arguments. - Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well - as long) arguments. - -- PyThread_start_new_thread() now returns a long int giving the thread - ID, if one can be calculated; it returns -1 for error, 0 if no - thread ID is calculated (this is an incompatible change, but only - the thread module used this API). This code has only really been - tested on Linux and Windows; other platforms please beware (and - report any bugs or strange behavior). - -- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as - input. - -New platforms -------------- - -Tests +TO DO ----- -Windows -------- - -- Installer: If you install IDLE, and don't disable file-extension - registration, a new "Edit with IDLE" context (right-click) menu entry - is created for .py and .pyw files. - -- The signal module now supports SIGBREAK on Windows, thanks to Steven - Scott. Note that SIGBREAK is unique to Windows. The default SIGBREAK - action remains to call Win32 ExitProcess(). This can be changed via - signal.signal(). For example:: - - # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C - # (SIGINT) behavior. - import signal - signal.signal(signal.SIGBREAK, signal.default_int_handler) +- Make strings all Unicode. (First have to introduce the bytes type.) - try: - while 1: - pass - except KeyboardInterrupt: - # We get here on Ctrl+C or Ctrl+Break now; if we had not changed - # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the - # program without the possibility for any Python-level cleanup). - print "Clean exit" +- Get rid of classic class implementation. +- Get rid of various compatibility-related flags (e.g. division flags). -What's New in Python 2.2a4? -=========================== - -*Release date: 28-Sep-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pydoc and inspect are now aware of new-style classes; - e.g. help(list) at the interactive prompt now shows proper - documentation for all operations on list objects. - -- Applications using Jim Fulton's ExtensionClass module can now safely - be used with Python 2.2. In particular, Zope 2.4.1 now works with - Python 2.2 (as well as with Python 2.1.1). The Demo/metaclass - examples also work again. It is hoped that Gtk and Boost also work - with 2.2a4 and beyond. (If you can confirm this, please write - webmaster at python.org; if there are still problems, please open a bug - report on SourceForge.) - -- property() now takes 4 keyword arguments: fget, fset, fdel and doc. - These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__' - in the constructed property object. fget, fset and fdel weren't - discoverable from Python in 2.2a3. __doc__ is new, and allows to - associate a docstring with a property. - -- Comparison overloading is now more completely implemented. For - example, a str subclass instance can properly be compared to a str - instance, and it can properly overload comparison. Ditto for most - other built-in object types. - -- The repr() of new-style classes has changed; instead of a new-style class is now rendered as , - *except* for built-in types, which are still rendered as (to avoid upsetting existing code that might parse or - otherwise rely on repr() of certain type objects). - -- The repr() of new-style objects is now always ; - previously, it was sometimes . - -- For new-style classes, what was previously called __getattr__ is now - called __getattribute__. This method, if defined, is called for - *every* attribute access. A new __getattr__ hook more similar to the - one in classic classes is defined which is called only if regular - attribute access raises AttributeError; to catch *all* attribute - access, you can use __getattribute__ (for new-style classes). If - both are defined, __getattribute__ is called first, and if it raises - AttributeError, __getattr__ is called. - -- The __class__ attribute of new-style objects can be assigned to. - The new class must have the same C-level object layout as the old - class. - -- The builtin file type can be subclassed now. In the usual pattern, - "file" is the name of the builtin type, and file() is a new builtin - constructor, with the same signature as the builtin open() function. - file() is now the preferred way to open a file. - -- Previously, __new__ would only see sequential arguments passed to - the type in a constructor call; __init__ would see both sequential - and keyword arguments. This made no sense whatsoever any more, so - now both __new__ and __init__ see all arguments. - -- Previously, hash() applied to an instance of a subclass of str or - unicode always returned 0. This has been repaired. - -- Previously, an operation on an instance of a subclass of an - immutable type (int, long, float, complex, tuple, str, unicode), - where the subtype didn't override the operation (and so the - operation was handled by the builtin type), could return that - instance instead a value of the base type. For example, if s was of - a str subclass type, s[:] returned s as-is. Now it returns a str - with the same value as s. +Core and Builtins +----------------- -- Provisional support for pickling new-style objects has been added. +- Classic classes are a thing of the past. All classes are new style. -Core ----- +- Exceptions *must* derive from BaseException. -- file.writelines() now accepts any iterable object producing strings. +- Integer division always returns a float. The -Q option is no more. -- PyUnicode_FromEncodedObject() now works very much like - PyObject_Str(obj) in that it tries to use __str__/tp_str - on the object if the object is not a string or buffer. This - makes unicode() behave like str() when applied to non-string/buffer - objects. +- 'as' and 'with' are keywords. -- PyFile_WriteObject now passes Unicode objects to the file's write - method. As a result, all file-like objects which may be the target - of a print statement must support Unicode objects, i.e. they must - at least convert them into ASCII strings. +- Absolute import is the default behavior for 'import foo' etc. -- Thread scheduling on Solaris should be improved; it is no longer - necessary to insert a small sleep at the start of a thread in order - to let other runnable threads be scheduled. +Extension Modules +----------------- Library ------- -- StringIO.StringIO instances and cStringIO.StringIO instances support - read character buffer compatible objects for their .write() methods. - These objects are converted to strings and then handled as such - by the instances. - -- The "email" package has been added. This is basically a port of the - mimelib package with API changes - and some implementations updated to use iterators and generators. - -- difflib.ndiff() and difflib.Differ.compare() are generators now. This - restores the ability of Tools/scripts/ndiff.py to start producing output - before the entire comparison is complete. - -- StringIO.StringIO instances and cStringIO.StringIO instances support - iteration just like file objects (i.e. their .readline() method is - called for each iteration until it returns an empty string). - -- The codecs module has grown four new helper APIs to access - builtin codecs: getencoder(), getdecoder(), getreader(), - getwriter(). - -- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer) - simplifies writing XML RPC servers. - -- os.path.realpath(): a new function that returns the absolute pathname - after interpretation of symbolic links. On non-Unix systems, this - is an alias for os.path.abspath(). - -- operator.indexOf() (PySequence_Index() in the C API) now works with any - iterable object. - -- smtplib now supports various authentication and security features of - the SMTP protocol through the new login() and starttls() methods. - -- hmac: a new module implementing keyed hashing for message - authentication. - -- mimetypes now recognizes more extensions and file types. At the - same time, some mappings not sanctioned by IANA were removed. - -- The "compiler" package has been brought up to date to the state of - Python 2.2 bytecode generation. It has also been promoted from a - Tool to a standard library package. (Tools/compiler still exists as - a sample driver.) - Build ----- -- Large file support (LFS) is now automatic when the platform supports - it; no more manual configuration tweaks are needed. On Linux, at - least, it's possible to have a system whose C library supports large - files but whose kernel doesn't; in this case, large file support is - still enabled but doesn't do you any good unless you upgrade your - kernel or share your Python executable with another system whose - kernel has large file support. - -- The configure script now supplies plausible defaults in a - cross-compilation environment. This doesn't mean that the supplied - values are always correct, or that cross-compilation now works - flawlessly -- but it's a first step (and it shuts up most of - autoconf's warnings about AC_TRY_RUN). - -- The Unix build is now a bit less chatty, courtesy of the parser - generator. The build is completely silent (except for errors) when - using "make -s", thanks to a -q option to setup.py. - C API ----- -- The "structmember" API now supports some new flag bits to deny read - and/or write access to attributes in restricted execution mode. - -New platforms -------------- - -- Compaq's iPAQ handheld, running the "familiar" Linux distribution - (http://familiar.handhelds.org). - Tests ----- -- The "classic" standard tests, which work by comparing stdout to - an expected-output file under Lib/test/output/, no longer stop at - the first mismatch. Instead the test is run to completion, and a - variant of ndiff-style comparison is used to report all differences. - This is much easier to understand than the previous style of reporting. - -- The unittest-based standard tests now use regrtest's test_main() - convention, instead of running as a side-effect of merely being - imported. This allows these tests to be run in more natural and - flexible ways as unittests, outside the regrtest framework. - -- regrtest.py is much better integrated with unittest and doctest now, - especially in regard to reporting errors. - -Windows -------- - -- Large file support now also works for files > 4GB, on filesystems - that support it (NTFS under Windows 2000). See "What's New in - Python 2.2a3" for more detail. - - -What's New in Python 2.2a3? -=========================== - -*Release Date: 07-Sep-2001* - -Core ----- - -- Conversion of long to float now raises OverflowError if the long is too - big to represent as a C double. - -- The 3-argument builtin pow() no longer allows a third non-None argument - if either of the first two arguments is a float, or if both are of - integer types and the second argument is negative (in which latter case - the arguments are converted to float, so this is really the same - restriction). - -- The builtin dir() now returns more information, and sometimes much - more, generally naming all attributes of an object, and all attributes - reachable from the object via its class, and from its class's base - classes, and so on from them too. Example: in 2.2a2, dir([]) returned - an empty list. In 2.2a3, - - >>> dir([]) - ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', - '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__', - '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__', - '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__', - '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', - 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', - 'reverse', 'sort'] - - dir(module) continues to return only the module's attributes, though. - -- Overflowing operations on plain ints now return a long int rather - than raising OverflowError. This is a partial implementation of PEP - 237. You can use -Wdefault::OverflowWarning to enable a warning for - this situation, and -Werror::OverflowWarning to revert to the old - OverflowError exception. - -- A new command line option, -Q, is added to control run-time - warnings for the use of classic division. (See PEP 238.) Possible - values are -Qold, -Qwarn, -Qwarnall, and -Qnew. The default is - -Qold, meaning the / operator has its classic meaning and no - warnings are issued. Using -Qwarn issues a run-time warning about - all uses of classic division for int and long arguments; -Qwarnall - also warns about classic division for float and complex arguments - (for use with fixdiv.py). - [Note: the remainder of this item (preserved below) became - obsolete in 2.2c1 -- -Qnew has global effect in 2.2] :: - - Using -Qnew is questionable; it turns on new division by default, but - only in the __main__ module. You can usefully combine -Qwarn or - -Qwarnall and -Qnew: this gives the __main__ module new division, and - warns about classic division everywhere else. - -- Many built-in types can now be subclassed. This applies to int, - long, float, str, unicode, and tuple. (The types complex, list and - dictionary can also be subclassed; this was introduced earlier.) - Note that restrictions apply when subclassing immutable built-in - types: you can only affect the value of the instance by overloading - __new__. You can add mutable attributes, and the subclass instances - will have a __dict__ attribute, but you cannot change the "value" - (as implemented by the base class) of an immutable subclass instance - once it is created. - -- The dictionary constructor now takes an optional argument, a - mapping-like object, and initializes the dictionary from its - (key, value) pairs. - -- A new built-in type, super, has been added. This facilitates making - "cooperative super calls" in a multiple inheritance setting. For an - explanation, see http://www.python.org/2.2/descrintro.html#cooperation - -- A new built-in type, property, has been added. This enables the - creation of "properties". These are attributes implemented by - getter and setter functions (or only one of these for read-only or - write-only attributes), without the need to override __getattr__. - See http://www.python.org/2.2/descrintro.html#property - -- The syntax of floating-point and imaginary literals has been - liberalized, to allow leading zeroes. Examples of literals now - legal that were SyntaxErrors before: - - 00.0 0e3 0100j 07.5 00000000000000000008. - -- An old tokenizer bug allowed floating point literals with an incomplete - exponent, such as 1e and 3.1e-. Such literals now raise SyntaxError. - -Library -------- - -- telnetlib includes symbolic names for the options, and support for - setting an option negotiation callback. It also supports processing - of suboptions. - -- The new C standard no longer requires that math libraries set errno to - ERANGE on overflow. For platform libraries that exploit this new - freedom, Python's overflow-checking was wholly broken. A new overflow- - checking scheme attempts to repair that, but may not be reliable on all - platforms (C doesn't seem to provide anything both useful and portable - in this area anymore). - -- Asynchronous timeout actions are available through the new class - threading.Timer. - -- math.log and math.log10 now return sensible results for even huge - long arguments. For example, math.log10(10 ** 10000) ~= 10000.0. - -- A new function, imp.lock_held(), returns 1 when the import lock is - currently held. See the docs for the imp module. - -- pickle, cPickle and marshal on 32-bit platforms can now correctly read - dumps containing ints written on platforms where Python ints are 8 bytes. - When read on a box where Python ints are 4 bytes, such values are - converted to Python longs. - -- In restricted execution mode (using the rexec module), unmarshalling - code objects is no longer allowed. This plugs a security hole. - -- unittest.TestResult instances no longer store references to tracebacks - generated by test failures. This prevents unexpected dangling references - to objects that should be garbage collected between tests. - -Tools ------ - -- Tools/scripts/fixdiv.py has been added which can be used to fix - division operators as per PEP 238. - -Build ------ - -- If you are an adventurous person using Mac OS X you may want to look at - Mac/OSX. There is a Makefile there that will build Python as a real Mac - application, which can be used for experimenting with Carbon or Cocoa. - Discussion of this on pythonmac-sig, please. - -C API ------ - -- New function PyObject_Dir(obj), like Python __builtin__.dir(obj). - -- Note that PyLong_AsDouble can fail! This has always been true, but no - callers checked for it. It's more likely to fail now, because overflow - errors are properly detected now. The proper way to check:: - - double x = PyLong_AsDouble(some_long_object); - if (x == -1.0 && PyErr_Occurred()) { - /* The conversion failed. */ - } - -- The GC API has been changed. Extensions that use the old API will still - compile but will not participate in GC. To upgrade an extension - module: - - - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC - - - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and - PyObject_GC_Del to deallocate them - - - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini - to PyObject_GC_UnTrack - - - remove PyGC_HEAD_SIZE from object size calculations - - - remove calls to PyObject_AS_GC and PyObject_FROM_GC - -- Two new functions: PyString_FromFormat() and PyString_FromFormatV(). - These can be used safely to construct string objects from a - sprintf-style format string (similar to the format string supported - by PyErr_Format()). - -New platforms +Documentation ------------- -- Stephen Hansen contributed patches sufficient to get a clean compile - under Borland C (Windows), but he reports problems running it and ran - out of time to complete the port. Volunteers? Expect a MemoryError - when importing the types module; this is probably shallow, and - causing later failures too. - -Tests ------ - -Windows -------- - -- Large file support is now enabled on Win32 platforms as well as on - Win64. This means that, for example, you can use f.tell() and f.seek() - to manipulate files larger than 2 gigabytes (provided you have enough - disk space, and are using a Windows filesystem that supports large - partitions). Windows filesystem limits: FAT has a 2GB (gigabyte) - filesize limit, and large file support makes no difference there. - FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now. - NTFS has no practical limit on file size, and files of any size can be - used from Python now. - -- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC - points to command.com (patch from Brian Quinlan). - - -What's New in Python 2.2a2? -=========================== - -*Release Date: 22-Aug-2001* - -Build ------ - -- Tim Peters developed a brand new Windows installer using Wise 8.1, - generously donated to us by Wise Solutions. - -- configure supports a new option --enable-unicode, with the values - ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode - type and supporting code is completely removed from the interpreter. - -- A new configure option --enable-framework builds a Mac OS X framework, - which "make frameworkinstall" will install. This provides a starting - point for more mac-like functionality, join pythonmac-sig at python.org - if you are interested in helping. - -- The NeXT platform is no longer supported. - -- The 'new' module is now statically linked. - -Tools ------ - -- The new Tools/scripts/cleanfuture.py can be used to automatically - edit out obsolete future statements from Python source code. See - the module docstring for details. - -Tests ------ - -- regrtest.py now knows which tests are expected to be skipped on some - platforms, allowing to give clearer test result output. regrtest - also has optional --use/-u switch to run normally disabled tests - which require network access or consume significant disk resources. - -- Several new tests in the standard test suite, with special thanks to - Nick Mathewson. - -Core ----- - -- The floor division operator // has been added as outlined in PEP - 238. The / operator still provides classic division (and will until - Python 3.0) unless "from __future__ import division" is included, in - which case the / operator will provide true division. The operator - module provides truediv() and floordiv() functions. Augmented - assignment variants are included, as are the equivalent overloadable - methods and C API methods. See the PEP for a full discussion: - - -- Future statements are now effective in simulated interactive shells - (like IDLE). This should "just work" by magic, but read Michael - Hudson's "Future statements in simulated shells" PEP 264 for full - details: . - -- The type/class unification (PEP 252-253) was integrated into the - trunk and is not so tentative any more (the exact specification of - some features is still tentative). A lot of work has done on fixing - bugs and adding robustness and features (performance still has to - come a long way). - -- Warnings about a mismatch in the Python API during extension import - now use the Python warning framework (which makes it possible to - write filters for these warnings). - -- A function's __dict__ (aka func_dict) will now always be a - dictionary. It used to be possible to delete it or set it to None, - but now both actions raise TypeErrors. It is still legal to set it - to a dictionary object. Getting func.__dict__ before any attributes - have been assigned now returns an empty dictionary instead of None. - -- A new command line option, -E, was added which disables the use of - all environment variables, or at least those that are specifically - significant to Python. Usually those have a name starting with - "PYTHON". This was used to fix a problem where the tests fail if - the user happens to have PYTHONHOME or PYTHONPATH pointing to an - older distribution. - -Library -------- - -- New class Differ and new functions ndiff() and restore() in difflib.py. - These package the algorithms used by the popular Tools/scripts/ndiff.py, - for programmatic reuse. - -- New function xml.sax.saxutils.quoteattr(): Quote an XML attribute - value using the minimal quoting required for the value; more - reliable than using xml.sax.saxutils.escape() for attribute values. - -- Readline completion support for cmd.Cmd was added. - -- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings. - -- Added function threading.BoundedSemaphore() - -- Added Ka-Ping Yee's cgitb.py module. - -- The 'new' module now exposes the CO_xxx flags. - -- The gc module offers the get_referents function. +Mac +--- New platforms ------------- -C API ------ - -- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added - which provide a cross-platform implementations for the - relatively new snprintf()/vsnprintf() C lib APIs. In contrast to - the standard sprintf() and vsprintf() C lib APIs, these versions - apply bounds checking on the used buffer which enhances protection - against buffer overruns. - -- Unicode APIs now use name mangling to assure that mixing interpreters - and extensions using different Unicode widths is rendered next to - impossible. Trying to import an incompatible Unicode-aware extension - will result in an ImportError. Unicode extensions writers must make - sure to check the Unicode width compatibility in their extensions by - using at least one of the mangled Unicode APIs in the extension. - -- Two new flags METH_NOARGS and METH_O are available in method definition - tables to simplify implementation of methods with no arguments and a - single untyped argument. Calling such methods is more efficient than - calling corresponding METH_VARARGS methods. METH_OLDARGS is now - deprecated. - -Windows -------- - -- "import module" now compiles module.pyw if it exists and nothing else - relevant is found. - - -What's New in Python 2.2a1? -=========================== - -*Release date: 18-Jul-2001* - -Core ----- - -- TENTATIVELY, a large amount of code implementing much of what's - described in PEP 252 (Making Types Look More Like Classes) and PEP - 253 (Subtyping Built-in Types) was added. This will be released - with Python 2.2a1. Documentation will be provided separately - through http://www.python.org/2.2/. The purpose of releasing this - with Python 2.2a1 is to test backwards compatibility. It is - possible, though not likely, that a decision is made not to release - this code as part of 2.2 final, if any serious backwards - incompatibilities are found during alpha testing that cannot be - repaired. - -- Generators were added; this is a new way to create an iterator (see - below) using what looks like a simple function containing one or - more 'yield' statements. See PEP 255. Since this adds a new - keyword to the language, this feature must be enabled by including a - future statement: "from __future__ import generators" (see PEP 236). - Generators will become a standard feature in a future release - (probably 2.3). Without this future statement, 'yield' remains an - ordinary identifier, but a warning is issued each time it is used. - (These warnings currently don't conform to the warnings framework of - PEP 230; we intend to fix this in 2.2a2.) - -- The UTF-16 codec was modified to be more RFC compliant. It will now - only remove BOM characters at the start of the string and then - only if running in native mode (UTF-16-LE and -BE won't remove a - leading BMO character). - -- Strings now have a new method .decode() to complement the already - existing .encode() method. These two methods provide direct access - to the corresponding decoders and encoders of the registered codecs. - - To enhance the usability of the .encode() method, the special - casing of Unicode object return values was dropped (Unicode objects - were auto-magically converted to string using the default encoding). - - Both methods will now return whatever the codec in charge of the - requested encoding returns as object, e.g. Unicode codecs will - return Unicode objects when decoding is requested ("äöü".decode("latin-1") - will return u"äöü"). This enables codec writer to create codecs - for various simple to use conversions. - - New codecs were added to demonstrate these new features (the .encode() - and .decode() columns indicate the type of the returned objects): - - +---------+-----------+-----------+-----------------------------+ - |Name | .encode() | .decode() | Description | - +=========+===========+===========+=============================+ - |uu | string | string | UU codec (e.g. for email) | - +---------+-----------+-----------+-----------------------------+ - |base64 | string | string | base64 codec | - +---------+-----------+-----------+-----------------------------+ - |quopri | string | string | quoted-printable codec | - +---------+-----------+-----------+-----------------------------+ - |zlib | string | string | zlib compression | - +---------+-----------+-----------+-----------------------------+ - |hex | string | string | 2-byte hex codec | - +---------+-----------+-----------+-----------------------------+ - |rot-13 | string | Unicode | ROT-13 Unicode charmap codec| - +---------+-----------+-----------+-----------------------------+ - -- Some operating systems now support the concept of a default Unicode - encoding for file system operations. Notably, Windows supports 'mbcs' - as the default. The Macintosh will also adopt this concept in the medium - term, although the default encoding for that platform will be other than - 'mbcs'. - - On operating system that support non-ASCII filenames, it is common for - functions that return filenames (such as os.listdir()) to return Python - string objects pre-encoded using the default file system encoding for - the platform. As this encoding is likely to be different from Python's - default encoding, converting this name to a Unicode object before passing - it back to the Operating System would result in a Unicode error, as Python - would attempt to use its default encoding (generally ASCII) rather than - the default encoding for the file system. - - In general, this change simply removes surprises when working with - Unicode and the file system, making these operations work as you expect, - increasing the transparency of Unicode objects in this context. - See [????] for more details, including examples. - -- Float (and complex) literals in source code were evaluated to full - precision only when running from a .py file; the same code loaded from a - .pyc (or .pyo) file could suffer numeric differences starting at about the - 12th significant decimal digit. For example, on a machine with IEEE-754 - floating arithmetic, - - x = 9007199254740992.0 - print long(x) - - printed 9007199254740992 if run directly from .py, but 9007199254740000 - if from a compiled (.pyc or .pyo) file. This was due to marshal using - str(float) instead of repr(float) when building code objects. marshal - now uses repr(float) instead, which should reproduce floats to full - machine precision (assuming the platform C float<->string I/O conversion - functions are of good quality). - - This may cause floating-point results to change in some cases, and - usually for the better, but may also cause numerically unstable - algorithms to break. - -- The implementation of dicts suffers fewer collisions, which has speed - benefits. However, the order in which dict entries appear in dict.keys(), - dict.values() and dict.items() may differ from previous releases for a - given dict. Nothing is defined about this order, so no program should - rely on it. Nevertheless, it's easy to write test cases that rely on the - order by accident, typically because of printing the str() or repr() of a - dict to an "expected results" file. See Lib/test/test_support.py's new - sortdict(dict) function for a simple way to display a dict in sorted - order. - -- Many other small changes to dicts were made, resulting in faster - operation along the most common code paths. - -- Dictionary objects now support the "in" operator: "x in dict" means - the same as dict.has_key(x). - -- The update() method of dictionaries now accepts generic mapping - objects. Specifically the argument object must support the .keys() - and __getitem__() methods. This allows you to say, for example, - {}.update(UserDict()) - -- Iterators were added; this is a generalized way of providing values - to a for loop. See PEP 234. There's a new built-in function iter() - to return an iterator. There's a new protocol to get the next value - from an iterator using the next() method (in Python) or the - tp_iternext slot (in C). There's a new protocol to get iterators - using the __iter__() method (in Python) or the tp_iter slot (in C). - Iterating (i.e. a for loop) over a dictionary generates its keys. - Iterating over a file generates its lines. - -- The following functions were generalized to work nicely with iterator - arguments:: - - map(), filter(), reduce(), zip() - list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API) - max(), min() - join() method of strings - extend() method of lists - 'x in y' and 'x not in y' (PySequence_Contains() in C API) - operator.countOf() (PySequence_Count() in C API) - right-hand side of assignment statements with multiple targets, such as :: - x, y, z = some_iterable_object_returning_exactly_3_values - -- Accessing module attributes is significantly faster (for example, - random.random or os.path or yourPythonModule.yourAttribute). - -- Comparing dictionary objects via == and != is faster, and now works even - if the keys and values don't support comparisons other than ==. - -- Comparing dictionaries in ways other than == and != is slower: there were - insecurities in the dict comparison implementation that could cause Python - to crash if the element comparison routines for the dict keys and/or - values mutated the dicts. Making the code bulletproof slowed it down. - -- Collisions in dicts are resolved via a new approach, which can help - dramatically in bad cases. For example, looking up every key in a dict - d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x - faster now. Thanks to Christian Tismer for pointing out the cause and - the nature of an effective cure (last December! better late than never). - -- repr() is much faster for large containers (dict, list, tuple). - - -Library -------- - -- The constants ascii_letters, ascii_lowercase. and ascii_uppercase - were added to the string module. These a locale-independent - constants, unlike letters, lowercase, and uppercase. These are now - use in appropriate locations in the standard library. - -- The flags used in dlopen calls can now be configured using - sys.setdlopenflags and queried using sys.getdlopenflags. - -- Fredrik Lundh's xmlrpclib is now a standard library module. This - provides full client-side XML-RPC support. In addition, - Demo/xmlrpc/ contains two server frameworks (one SocketServer-based, - one asyncore-based). Thanks to Eric Raymond for the documentation. - -- The xrange() object is simplified: it no longer supports slicing, - repetition, comparisons, efficient 'in' checking, the tolist() - method, or the start, stop and step attributes. See PEP 260. - -- A new function fnmatch.filter to filter lists of file names was added. - -- calendar.py uses month and day names based on the current locale. - -- strop is now *really* obsolete (this was announced before with 1.6), - and issues DeprecationWarning when used (except for the four items - that are still imported into string.py). - -- Cookie.py now sorts key+value pairs by key in output strings. - -- pprint.isrecursive(object) didn't correctly identify recursive objects. - Now it does. - -- pprint functions now much faster for large containers (tuple, list, dict). - -- New 'q' and 'Q' format codes in the struct module, corresponding to C - types "long long" and "unsigned long long" (on Windows, __int64). In - native mode, these can be used only when the platform C compiler supports - these types (when HAVE_LONG_LONG is #define'd by the Python config - process), and then they inherit the sizes and alignments of the C types. - In standard mode, 'q' and 'Q' are supported on all platforms, and are - 8-byte integral types. - -- The site module installs a new built-in function 'help' that invokes - pydoc.help. It must be invoked as 'help()'; when invoked as 'help', - it displays a message reminding the user to use 'help()' or - 'help(object)'. - -Tests ------ - -- New test_mutants.py runs dict comparisons where the key and value - comparison operators mutate the dicts randomly during comparison. This - rapidly causes Python to crash under earlier releases (not for the faint - of heart: it can also cause Win9x to freeze or reboot!). - -- New test_pprint.py verifies that pprint.isrecursive() and - pprint.isreadable() return sensible results. Also verifies that simple - cases produce correct output. - -C API ------ - -- Removed the unused last_is_sticky argument from the internal - _PyTuple_Resize(). If this affects you, you were cheating. - ----- +Tools/Demos +----------- **(For information about older versions, consult the HISTORY file.)** Modified: python/branches/p3yk/Modules/main.c ============================================================================== --- python/branches/p3yk/Modules/main.c (original) +++ python/branches/p3yk/Modules/main.c Wed Mar 15 05:58:47 2006 @@ -2,7 +2,6 @@ #include "Python.h" #include "osdefs.h" -#include "code.h" /* For CO_FUTURE_DIVISION */ #include "import.h" #ifdef __VMS @@ -34,7 +33,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS "c:dEhim:OQ:StuUvVW:xX" +#define BASE_OPTS "c:dEhim:OStuvVW:xX" #ifndef RISCOS #define PROGRAM_OPTS BASE_OPTS @@ -64,7 +63,6 @@ -m mod : run library module as a script (terminates option list)\n\ -O : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\ -OO : remove doc-strings in addition to the -O optimizations\n\ --Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\ -S : don't imply 'import site' on initialization\n\ -t : issue warnings about inconsistent tab usage (-tt: issue errors)\n\ -u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\ @@ -220,33 +218,6 @@ Py_DebugFlag++; 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': inspect++; saw_inspect_flag = 1; @@ -288,12 +259,10 @@ skipfirstline = 1; break; - case 'U': - Py_UnicodeFlag++; - break; case 'h': help++; break; + case 'V': version++; break; Modified: python/branches/p3yk/Objects/abstract.c ============================================================================== --- python/branches/p3yk/Objects/abstract.c (original) +++ python/branches/p3yk/Objects/abstract.c Wed Mar 15 05:58:47 2006 @@ -2106,12 +2106,7 @@ return -1; } - if (PyClass_Check(cls) && PyInstance_Check(inst)) { - PyObject *inclass = - (PyObject*)((PyInstanceObject*)inst)->in_class; - retval = PyClass_IsSubclass(inclass, cls); - } - else if (PyType_Check(cls)) { + if (PyType_Check(cls)) { retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); if (retval == 0) { PyObject *c = PyObject_GetAttr(inst, __class__); @@ -2177,7 +2172,7 @@ { int retval; - if (!PyClass_Check(derived) || !PyClass_Check(cls)) { + { if (!check_class(derived, "issubclass() arg 1 must be a class")) return -1; @@ -2212,11 +2207,6 @@ retval = abstract_issubclass(derived, cls); } - else { - /* shortcut */ - if (!(retval = (derived == cls))) - retval = PyClass_IsSubclass(derived, cls); - } return retval; } Modified: python/branches/p3yk/Parser/parser.c ============================================================================== --- python/branches/p3yk/Parser/parser.c (original) +++ python/branches/p3yk/Parser/parser.c Wed Mar 15 05:58:47 2006 @@ -149,6 +149,7 @@ strcmp(l->lb_str, s) != 0) continue; #ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD + /* Leaving this in as an example */ if (!(ps->p_flags & CO_FUTURE_WITH_STATEMENT)) { if (s[0] == 'w' && strcmp(s, "with") == 0) break; /* not a keyword yet */ @@ -177,6 +178,7 @@ } #ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD +/* Leaving this in as an example */ static void future_hack(parser_state *ps) { Modified: python/branches/p3yk/Parser/parsetok.c ============================================================================== --- python/branches/p3yk/Parser/parsetok.c (original) +++ python/branches/p3yk/Parser/parsetok.c Wed Mar 15 05:58:47 2006 @@ -192,7 +192,8 @@ col_offset = -1; if ((err_ret->error = - PyParser_AddToken(ps, (int)type, str, tok->lineno, col_offset, + PyParser_AddToken(ps, (int)type, str, + tok->lineno, col_offset, &(err_ret->expected))) != E_OK) { if (err_ret->error != E_DONE) PyObject_FREE(str); Modified: python/branches/p3yk/Python/ceval.c ============================================================================== --- python/branches/p3yk/Python/ceval.c (original) +++ python/branches/p3yk/Python/ceval.c Wed Mar 15 05:58:47 2006 @@ -3025,15 +3025,7 @@ Py_DECREF(tmp); } - if (PyString_CheckExact(type)) { - /* Raising builtin string is deprecated but still allowed -- - * do nothing. Raising an instance of a new-style str - * subclass is right out. */ - if (PyErr_Warn(PyExc_DeprecationWarning, - "raising a string exception is deprecated")) - goto raise_error; - } - else if (PyExceptionClass_Check(type)) + if (PyExceptionClass_Check(type)) PyErr_NormalizeException(&type, &value, &tb); else if (PyExceptionInstance_Check(type)) { @@ -3054,10 +3046,8 @@ else { /* Not something you can raise. You get an exception anyway, just not what you specified :-) */ - PyErr_Format(PyExc_TypeError, - "exceptions must be classes, instances, or " - "strings (deprecated), not %s", - type->ob_type->tp_name); + PyErr_SetString(PyExc_TypeError, + "exceptions must derive from BaseException"); goto raise_error; } PyErr_Restore(type, value, tb); @@ -4148,7 +4138,7 @@ if (g != NULL && PyDict_Check(g)) metaclass = PyDict_GetItemString(g, "__metaclass__"); if (metaclass == NULL) - metaclass = (PyObject *) &PyClass_Type; + metaclass = (PyObject *) &PyType_Type; Py_INCREF(metaclass); } result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods); Modified: python/branches/p3yk/Python/compile.c ============================================================================== --- python/branches/p3yk/Python/compile.c (original) +++ python/branches/p3yk/Python/compile.c Wed Mar 15 05:58:47 2006 @@ -2464,11 +2464,7 @@ int r; PyObject *level; - if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT)) - level = PyInt_FromLong(0); - else - level = PyInt_FromLong(-1); - + level = PyInt_FromLong(0); if (level == NULL) return 0; @@ -2511,12 +2507,7 @@ if (!names) return 0; - if (s->v.ImportFrom.level == 0 && c->c_flags && - !(c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT)) - level = PyInt_FromLong(-1); - else - level = PyInt_FromLong(s->v.ImportFrom.level); - + level = PyInt_FromLong(s->v.ImportFrom.level); if (!level) { Py_DECREF(names); return 0; @@ -2746,10 +2737,7 @@ case Mult: return BINARY_MULTIPLY; case Div: - if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION) - return BINARY_TRUE_DIVIDE; - else - return BINARY_DIVIDE; + return BINARY_TRUE_DIVIDE; case Mod: return BINARY_MODULO; case Pow: @@ -2809,10 +2797,7 @@ case Mult: return INPLACE_MULTIPLY; case Div: - if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION) - return INPLACE_TRUE_DIVIDE; - else - return INPLACE_DIVIDE; + return INPLACE_TRUE_DIVIDE; case Mod: return INPLACE_MODULO; case Pow: Modified: python/branches/p3yk/Python/errors.c ============================================================================== --- python/branches/p3yk/Python/errors.c (original) +++ python/branches/p3yk/Python/errors.c Wed Mar 15 05:58:47 2006 @@ -557,7 +557,8 @@ bases = PyTuple_Pack(1, base); if (bases == NULL) goto failure; - result = PyClass_New(bases, dict, classname); + result = PyObject_CallFunction((PyObject *) (base->ob_type), + "OOO", classname, bases, dict); failure: Py_XDECREF(bases); Py_XDECREF(mydict); Modified: python/branches/p3yk/Python/future.c ============================================================================== --- python/branches/p3yk/Python/future.c (original) +++ python/branches/p3yk/Python/future.c Wed Mar 15 05:58:47 2006 @@ -28,11 +28,11 @@ } else if (strcmp(feature, FUTURE_GENERATORS) == 0) { continue; } else if (strcmp(feature, FUTURE_DIVISION) == 0) { - ff->ff_features |= CO_FUTURE_DIVISION; + continue; } else if (strcmp(feature, FUTURE_ABSIMPORT) == 0) { - ff->ff_features |= CO_FUTURE_ABSIMPORT; + continue; } else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) { - ff->ff_features |= CO_FUTURE_WITH_STATEMENT; + continue; } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); Modified: python/branches/p3yk/Python/getargs.c ============================================================================== --- python/branches/p3yk/Python/getargs.c (original) +++ python/branches/p3yk/Python/getargs.c Wed Mar 15 05:58:47 2006 @@ -486,15 +486,16 @@ #define CONV_UNICODE "(unicode conversion error)" -/* explicitly check for float arguments when integers are expected. For now - * signal a warning. Returns true if an exception was raised. */ +/* Explicitly check for float arguments when integers are expected. + Return 1 for error, 0 if ok. */ static int float_argument_error(PyObject *arg) { - if (PyFloat_Check(arg) && - PyErr_Warn(PyExc_DeprecationWarning, - "integer argument expected, got float" )) + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); return 1; + } else return 0; } Modified: python/branches/p3yk/Python/graminit.c ============================================================================== --- python/branches/p3yk/Python/graminit.c (original) +++ python/branches/p3yk/Python/graminit.c Wed Mar 15 05:58:47 2006 @@ -556,9 +556,8 @@ static arc arcs_27_0[1] = { {19, 1}, }; -static arc arcs_27_1[3] = { +static arc arcs_27_1[2] = { {78, 2}, - {19, 2}, {0, 1}, }; static arc arcs_27_2[1] = { @@ -569,16 +568,15 @@ }; static state states_27[4] = { {1, arcs_27_0}, - {3, arcs_27_1}, + {2, arcs_27_1}, {1, arcs_27_2}, {1, arcs_27_3}, }; static arc arcs_28_0[1] = { {12, 1}, }; -static arc arcs_28_1[3] = { +static arc arcs_28_1[2] = { {78, 2}, - {19, 2}, {0, 1}, }; static arc arcs_28_2[1] = { @@ -589,7 +587,7 @@ }; static state states_28[4] = { {1, arcs_28_0}, - {3, arcs_28_1}, + {2, arcs_28_1}, {1, arcs_28_2}, {1, arcs_28_3}, }; @@ -917,9 +915,8 @@ {1, arcs_40_4}, {1, arcs_40_5}, }; -static arc arcs_41_0[2] = { +static arc arcs_41_0[1] = { {78, 1}, - {19, 1}, }; static arc arcs_41_1[1] = { {82, 2}, @@ -928,7 +925,7 @@ {0, 2}, }; static state states_41[3] = { - {2, arcs_41_0}, + {1, arcs_41_0}, {1, arcs_41_1}, {1, arcs_41_2}, }; @@ -1870,7 +1867,7 @@ {296, "with_stmt", 0, 6, states_40, "\000\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000"}, {297, "with_var", 0, 3, states_41, - "\000\000\010\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"}, {298, "except_clause", 0, 5, states_42, "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, {299, "suite", 0, 5, states_43, Modified: python/branches/p3yk/Python/import.c ============================================================================== --- python/branches/p3yk/Python/import.c (original) +++ python/branches/p3yk/Python/import.c Wed Mar 15 05:58:47 2006 @@ -28,7 +28,7 @@ a .pyc file in text mode the magic number will be wrong; also, the Apple MPW compiler swaps their values, botching string constants. - The magic numbers must be spaced apart atleast 2 values, as the + The magic numbers must be spaced apart at least 2 values, as the -U interpeter flag will cause MAGIC+1 being used. They have been odd numbers for some time now. @@ -56,9 +56,10 @@ Python 2.5a0: 62081 (ast-branch) Python 2.5a0: 62091 (with) Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) + Python 3000: 3000 . */ -#define MAGIC (62092 | ((long)'\r'<<16) | ((long)'\n'<<24)) +#define MAGIC (3000 | ((long)'\r'<<16) | ((long)'\n'<<24)) /* Magic word as global; note that _PyImport_Init() can change the value of this global to accommodate for alterations of how the Modified: python/branches/p3yk/Python/pythonrun.c ============================================================================== --- python/branches/p3yk/Python/pythonrun.c (original) +++ python/branches/p3yk/Python/pythonrun.c Wed Mar 15 05:58:47 2006 @@ -696,9 +696,7 @@ /* compute parser flags based on compiler flags */ #define PARSER_FLAGS(flags) \ ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ - PyPARSE_DONT_IMPLY_DEDENT : 0) \ - | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \ - PyPARSE_WITH_IS_KEYWORD : 0)) : 0) + PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0) int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) Modified: python/branches/p3yk/README ============================================================================== --- python/branches/p3yk/README (original) +++ python/branches/p3yk/README Wed Mar 15 05:58:47 2006 @@ -1,5 +1,5 @@ -This is Python version 2.5 alpha 0 -================================== +This is Python 3000 -- unversioned (branched off 2.5 pre alpha 1) +================================================================= Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation. All rights reserved. From python-checkins at python.org Wed Mar 15 06:25:42 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 06:25:42 +0100 (CET) Subject: [Python-checkins] r43036 - peps/trunk/pep-3000.txt Message-ID: <20060315052542.9809B1E4009@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 06:25:39 2006 New Revision: 43036 Modified: peps/trunk/pep-3000.txt Log: Add a line about __builtin[s]__. Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 15 06:25:39 2006 @@ -86,6 +86,9 @@ * Builtin module init function names (PyMODINIT_FUNC) will be prefixed with _Py (or Py). Currently they aren't namespace safe since the names start with init. +* __builtins__ should get a different name *or* completely unified + with __builtin__. Keeping both with confusingly similar spellings + and semantics is evil. To be removed: From python-checkins at python.org Wed Mar 15 06:43:11 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 15 Mar 2006 06:43:11 +0100 (CET) Subject: [Python-checkins] r43037 - python/trunk/Modules/_testcapimodule.c python/trunk/Modules/xxmodule.c Message-ID: <20060315054311.7BF7B1E4003@bag.python.org> Author: neal.norwitz Date: Wed Mar 15 06:43:10 2006 New Revision: 43037 Modified: python/trunk/Modules/_testcapimodule.c python/trunk/Modules/xxmodule.c Log: Move test code out of xxmodule and into _testcapimodule.c where it belongs. Will backport. Modified: python/trunk/Modules/_testcapimodule.c ============================================================================== --- python/trunk/Modules/_testcapimodule.c (original) +++ python/trunk/Modules/_testcapimodule.c Wed Mar 15 06:43:10 2006 @@ -522,6 +522,18 @@ return Py_None; } +/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ + +static PyObject * +test_null_strings(PyObject *self) +{ + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); + PyObject *tuple = PyTuple_Pack(2, o1, o2); + Py_XDECREF(o1); + Py_XDECREF(o2); + return tuple; +} + static PyObject * raise_exception(PyObject *self, PyObject *args) { @@ -597,6 +609,7 @@ {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS}, {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS}, {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS}, + {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS}, {"getargs_b", (PyCFunction)getargs_b, METH_VARARGS}, {"getargs_B", (PyCFunction)getargs_B, METH_VARARGS}, Modified: python/trunk/Modules/xxmodule.c ============================================================================== --- python/trunk/Modules/xxmodule.c (original) +++ python/trunk/Modules/xxmodule.c Wed Mar 15 06:43:10 2006 @@ -197,18 +197,6 @@ return Py_None; } -/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ - -static PyObject * -xx_null(PyObject *self, PyObject *noargs) -{ - PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); - PyObject *tuple = PyTuple_Pack(2, o1, o2); - Py_XDECREF(o1); - Py_XDECREF(o2); - return tuple; -} - /* Test bad format character */ static PyObject * @@ -343,8 +331,6 @@ PyDoc_STR("new() -> new Xx object")}, {"bug", xx_bug, METH_VARARGS, PyDoc_STR("bug(o) -> None")}, - {"null", xx_null, METH_NOARGS, - PyDoc_STR("null(o) -> ('NULL', u'NULL')")}, {NULL, NULL} /* sentinel */ }; From python-checkins at python.org Wed Mar 15 06:44:36 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 15 Mar 2006 06:44:36 +0100 (CET) Subject: [Python-checkins] r43038 - python/branches/release24-maint/Modules/_testcapimodule.c python/branches/release24-maint/Modules/xxmodule.c Message-ID: <20060315054436.159CA1E4003@bag.python.org> Author: neal.norwitz Date: Wed Mar 15 06:44:35 2006 New Revision: 43038 Modified: python/branches/release24-maint/Modules/_testcapimodule.c python/branches/release24-maint/Modules/xxmodule.c Log: Backport 43037: Move test code out of xxmodule and into _testcapimodule.c where it belongs. Modified: python/branches/release24-maint/Modules/_testcapimodule.c ============================================================================== --- python/branches/release24-maint/Modules/_testcapimodule.c (original) +++ python/branches/release24-maint/Modules/_testcapimodule.c Wed Mar 15 06:44:35 2006 @@ -521,6 +521,18 @@ return Py_None; } +/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ + +static PyObject * +test_null_strings(PyObject *self) +{ + PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); + PyObject *tuple = PyTuple_Pack(2, o1, o2); + Py_XDECREF(o1); + Py_XDECREF(o2); + return tuple; +} + static PyObject * raise_exception(PyObject *self, PyObject *args) { @@ -759,6 +771,7 @@ {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS}, {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS}, {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS}, + {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS}, {"getargs_b", (PyCFunction)getargs_b, METH_VARARGS}, {"getargs_B", (PyCFunction)getargs_B, METH_VARARGS}, Modified: python/branches/release24-maint/Modules/xxmodule.c ============================================================================== --- python/branches/release24-maint/Modules/xxmodule.c (original) +++ python/branches/release24-maint/Modules/xxmodule.c Wed Mar 15 06:44:35 2006 @@ -197,18 +197,6 @@ return Py_None; } -/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */ - -static PyObject * -xx_null(PyObject *self, PyObject *noargs) -{ - PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL); - PyObject *tuple = PyTuple_Pack(2, o1, o2); - Py_XDECREF(o1); - Py_XDECREF(o2); - return tuple; -} - /* Test bad format character */ static PyObject * @@ -343,8 +331,6 @@ PyDoc_STR("new() -> new Xx object")}, {"bug", xx_bug, METH_VARARGS, PyDoc_STR("bug(o) -> None")}, - {"null", xx_null, METH_NOARGS, - PyDoc_STR("null(o) -> ('NULL', u'NULL')")}, {NULL, NULL} /* sentinel */ }; From nnorwitz at gmail.com Wed Mar 15 06:45:40 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Tue, 14 Mar 2006 21:45:40 -0800 Subject: [Python-checkins] r43022 - in python/trunk: Modules/xxmodule.c Objects/object.c In-Reply-To: <44168F42.6040102@egenix.com> References: <20060314060219.856311E4007@bag.python.org> <44168F42.6040102@egenix.com> Message-ID: On 3/14/06, M.-A. Lemburg wrote: > > Why do you add these things to the xx module and not the > _testcapi module where these things should live ? Because I'm an idiot? Thanks for pointing it out, I moved the code. n From nnorwitz at gmail.com Wed Mar 15 09:16:01 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 15 Mar 2006 00:16:01 -0800 Subject: [Python-checkins] r43028 - python/trunk/Modules/_ctypes/cfield.c In-Reply-To: <20060314203927.EA3181E4008@bag.python.org> References: <20060314203927.EA3181E4008@bag.python.org> Message-ID: This isn't exactly correct. On a 64-bit system, the value will be cast into a 32-bit integer. This is true for both Win64 and Unix. If you change the cast to a long and use %ld (lowercase ell), that will work correctly on Unix, but not Win64. To always display the correct value on all platforms, you need an #ifdef MS_WIN64. For Windows, you use %Id (that's a capital letter eye) and reference the value without a cast. For Unix, you use %ld (lowercase ell), and cast the value to a (long) to avoid a warning. n -- On 3/14/06, thomas.heller wrote: > Author: thomas.heller > Date: Tue Mar 14 21:39:27 2006 > New Revision: 43028 > > Modified: > python/trunk/Modules/_ctypes/cfield.c > Log: > Cast an Py_ssize_t to int, to avoid a compiler warning. > > Modified: python/trunk/Modules/_ctypes/cfield.c > ============================================================================== > --- python/trunk/Modules/_ctypes/cfield.c (original) > +++ python/trunk/Modules/_ctypes/cfield.c Tue Mar 14 21:39:27 2006 > @@ -251,10 +251,10 @@ > > if (bits) > result = PyString_FromFormat("", > - name, self->offset, size, bits); > + name, (int)self->offset, size, bits); > else > result = PyString_FromFormat("", > - name, self->offset, size); > + name, (int)self->offset, size); > return result; > } From python-checkins at python.org Wed Mar 15 09:23:56 2006 From: python-checkins at python.org (walter.doerwald) Date: Wed, 15 Mar 2006 09:23:56 +0100 (CET) Subject: [Python-checkins] r43039 - in python/trunk/Lib: StringIO.py test/test_StringIO.py Message-ID: <20060315082356.584641E4009@bag.python.org> Author: walter.doerwald Date: Wed Mar 15 09:23:53 2006 New Revision: 43039 Modified: python/trunk/Lib/StringIO.py python/trunk/Lib/test/test_StringIO.py Log: SF patch #1359365: file and cStringIO raise a ValueError when next() is called after calling close(). Change StringIO, so that it behaves the same way. Modified: python/trunk/Lib/StringIO.py ============================================================================== --- python/trunk/Lib/StringIO.py (original) +++ python/trunk/Lib/StringIO.py Wed Mar 15 09:23:53 2006 @@ -72,8 +72,7 @@ method is called repeatedly. This method returns the next input line, or raises StopIteration when EOF is hit. """ - if self.closed: - raise StopIteration + _complain_ifclosed(self.closed) r = self.readline() if not r: raise StopIteration Modified: python/trunk/Lib/test/test_StringIO.py ============================================================================== --- python/trunk/Lib/test/test_StringIO.py (original) +++ python/trunk/Lib/test/test_StringIO.py Wed Mar 15 09:23:53 2006 @@ -87,6 +87,8 @@ eq(line, self._line + '\n') i += 1 eq(i, 5) + self._fp.close() + self.assertRaises(ValueError, self._fp.next) class TestStringIO(TestGenericStringIO): MODULE = StringIO From python-checkins at python.org Wed Mar 15 09:34:40 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 15 Mar 2006 09:34:40 +0100 (CET) Subject: [Python-checkins] r43040 - python/trunk/Makefile.pre.in Message-ID: <20060315083440.532D61E4009@bag.python.org> Author: thomas.heller Date: Wed Mar 15 09:34:38 2006 New Revision: 43040 Modified: python/trunk/Makefile.pre.in Log: In 'make clean', delete some files that are generated by the _ctypes/libffi configure step. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Wed Mar 15 09:34:38 2006 @@ -974,6 +974,8 @@ find . -name '*.o' -exec rm -f {} ';' find . -name '*.s[ol]' -exec rm -f {} ';' find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' + find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' + find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' clobber: clean -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ From python-checkins at python.org Wed Mar 15 09:41:15 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 15 Mar 2006 09:41:15 +0100 (CET) Subject: [Python-checkins] r43041 - python/trunk/Modules/_ctypes/cfield.c Message-ID: <20060315084115.90E641E4078@bag.python.org> Author: tim.peters Date: Wed Mar 15 09:41:15 2006 New Revision: 43041 Modified: python/trunk/Modules/_ctypes/cfield.c Log: CField_repr(): PyString_FromFormat() understands the C99 "z" qualifier on all platforms. Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Wed Mar 15 09:41:15 2006 @@ -250,11 +250,11 @@ name = ((PyTypeObject *)self->proto)->tp_name; if (bits) - result = PyString_FromFormat("", - name, (int)self->offset, size, bits); + result = PyString_FromFormat("", + name, self->offset, size, bits); else - result = PyString_FromFormat("", - name, (int)self->offset, size); + result = PyString_FromFormat("", + name, self->offset, size); return result; } From martin at v.loewis.de Wed Mar 15 09:54:44 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Wed, 15 Mar 2006 09:54:44 +0100 Subject: [Python-checkins] r43041 - python/trunk/Modules/_ctypes/cfield.c In-Reply-To: <20060315084115.90E641E4078@bag.python.org> References: <20060315084115.90E641E4078@bag.python.org> Message-ID: <4417D654.3030600@v.loewis.de> tim.peters wrote: > CField_repr(): PyString_FromFormat() understands the > C99 "z" qualifier on all platforms. Unfortunately, only so in Python 2.5. If the code is also meant to be used for earlier versions, it won't work there at all. Regards, Martin From python-checkins at python.org Wed Mar 15 10:17:20 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 15 Mar 2006 10:17:20 +0100 (CET) Subject: [Python-checkins] r43042 - python/trunk/Modules/_ctypes/cfield.c Message-ID: <20060315091720.DEB411E4009@bag.python.org> Author: tim.peters Date: Wed Mar 15 10:17:20 2006 New Revision: 43042 Modified: python/trunk/Modules/_ctypes/cfield.c Log: Revert rev 43041, which introduced the "z" format qualifier unique to Python 2.5. Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Wed Mar 15 10:17:20 2006 @@ -250,11 +250,11 @@ name = ((PyTypeObject *)self->proto)->tp_name; if (bits) - result = PyString_FromFormat("", - name, self->offset, size, bits); + result = PyString_FromFormat("", + name, (int)self->offset, size, bits); else - result = PyString_FromFormat("", - name, self->offset, size); + result = PyString_FromFormat("", + name, (int)self->offset, size); return result; } From mal at egenix.com Wed Mar 15 10:22:50 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Wed, 15 Mar 2006 10:22:50 +0100 Subject: [Python-checkins] Using relative imports in std lib packages ( r43033 - in python/trunk/Lib: distutils/sysconfig.py encodings/__init__.py) In-Reply-To: <20060315043355.C82D71E4009@bag.python.org> References: <20060315043355.C82D71E4009@bag.python.org> Message-ID: <4417DCEA.1090707@egenix.com> guido.van.rossum wrote: > Author: guido.van.rossum > Date: Wed Mar 15 05:33:54 2006 > New Revision: 43033 > > Modified: > python/trunk/Lib/distutils/sysconfig.py > python/trunk/Lib/encodings/__init__.py > Log: > Use relative imports in a few places where I noticed the need. > (Ideally, all packages in Python 2.5 will use the relative import > syntax for all their relative import needs.) Instead of adding relative imports to packages in the standard lib, I'd suggest to use absolute imports instead. These are much easier to manage, maintain and read. There's also no "need" for relative imports in std lib packages since these won't be subject to possible relocation. > Modified: python/trunk/Lib/distutils/sysconfig.py > ============================================================================== > --- python/trunk/Lib/distutils/sysconfig.py (original) > +++ python/trunk/Lib/distutils/sysconfig.py Wed Mar 15 05:33:54 2006 > @@ -16,7 +16,7 @@ > import string > import sys > > -from errors import DistutilsPlatformError > +from .errors import DistutilsPlatformError > > # These are needed in a couple of spots, so just compute them once. > PREFIX = os.path.normpath(sys.prefix) > > Modified: python/trunk/Lib/encodings/__init__.py > ============================================================================== > --- python/trunk/Lib/encodings/__init__.py (original) > +++ python/trunk/Lib/encodings/__init__.py Wed Mar 15 05:33:54 2006 > @@ -27,7 +27,8 @@ > > """#" > > -import codecs, types, aliases > +import codecs, types > +from . import aliases > > _cache = {} > _unknown = '--unknown--' > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 15 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From mal at egenix.com Wed Mar 15 10:26:10 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Wed, 15 Mar 2006 10:26:10 +0100 Subject: [Python-checkins] r43022 - in python/trunk: Modules/xxmodule.c Objects/object.c In-Reply-To: References: <20060314060219.856311E4007@bag.python.org> <44168F42.6040102@egenix.com> Message-ID: <4417DDB2.6060909@egenix.com> Neal Norwitz wrote: > On 3/14/06, M.-A. Lemburg wrote: >> Why do you add these things to the xx module and not the >> _testcapi module where these things should live ? > > Because I'm an idiot? Not really ;-) The fact that we do have a _testcapi module seems to be little known among Python developers. > Thanks for pointing it out, I moved the code. Thanks, -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 15 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From theller at python.net Wed Mar 15 10:35:07 2006 From: theller at python.net (Thomas Heller) Date: Wed, 15 Mar 2006 10:35:07 +0100 Subject: [Python-checkins] r43040 - python/trunk/Makefile.pre.in In-Reply-To: <20060315083440.532D61E4009@bag.python.org> References: <20060315083440.532D61E4009@bag.python.org> Message-ID: thomas.heller wrote: > Author: thomas.heller > Date: Wed Mar 15 09:34:38 2006 > New Revision: 43040 > > Modified: > python/trunk/Makefile.pre.in > Log: > In 'make clean', delete some files that are generated by the _ctypes/libffi > configure step. > > > Modified: python/trunk/Makefile.pre.in > ============================================================================== > --- python/trunk/Makefile.pre.in (original) > +++ python/trunk/Makefile.pre.in Wed Mar 15 09:34:38 2006 > @@ -974,6 +974,8 @@ > find . -name '*.o' -exec rm -f {} ';' > find . -name '*.s[ol]' -exec rm -f {} ';' > find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' > + find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' > + find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' > > clobber: clean > -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ Although I committed this, I'm not sure this is the right approach. Better IMO would be to let 'make clean' run '$(srcdir)/python setup.py clean' or '$(srcdir)/python setup.py clean -a', and let the setup script take care of the cleanup. The problem is that the makefile doesn't know what the build directory for extensions is, since its name is determined by distutils. Maybe it should be spelled '-$(srcdir)/python setup.py clean -a', it's a long time since I used makefiles. Thomas From hyeshik at gmail.com Wed Mar 15 11:06:13 2006 From: hyeshik at gmail.com (Hye-Shik Chang) Date: Wed, 15 Mar 2006 19:06:13 +0900 Subject: [Python-checkins] r43040 - python/trunk/Makefile.pre.in In-Reply-To: References: <20060315083440.532D61E4009@bag.python.org> Message-ID: <4f0b69dc0603150206y68f56fa8lebc0d8407134a43b@mail.gmail.com> On 3/15/06, Thomas Heller wrote: > thomas.heller wrote: > > Author: thomas.heller > > Date: Wed Mar 15 09:34:38 2006 > > New Revision: 43040 > > > > Modified: > > python/trunk/Makefile.pre.in > > Log: > > In 'make clean', delete some files that are generated by the _ctypes/libffi > > configure step. > > > > > > Modified: python/trunk/Makefile.pre.in > > ============================================================================== > > --- python/trunk/Makefile.pre.in (original) > > +++ python/trunk/Makefile.pre.in Wed Mar 15 09:34:38 2006 > > @@ -974,6 +974,8 @@ > > find . -name '*.o' -exec rm -f {} ';' > > find . -name '*.s[ol]' -exec rm -f {} ';' > > find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' > > + find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' > > + find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' > > > > clobber: clean > > -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ > > Although I committed this, I'm not sure this is the right approach. > Better IMO would be to let 'make clean' run '$(srcdir)/python setup.py clean' > or '$(srcdir)/python setup.py clean -a', and let the setup script take care > of the cleanup. The problem is that the makefile doesn't know what the build > directory for extensions is, since its name is determined by distutils. fficonfig.* looks much like pyconfig.h which is not cleaned by the `clean' target. I think `clobber' or `distclean' makes more fit for fficonfig.*. Hye-Shik From neal at metaslash.com Wed Mar 15 11:15:00 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 15 Mar 2006 05:15:00 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060315101500.GA2522@python.psfb.org> test_capi leaked [0, 0, 143] references test_cfgparser leaked [2, 0, 0] references test_compiler leaked [147, 182, 118] references test_filecmp leaked [0, 13, 0] references test_generators leaked [255, 255, 255] references test_threadedtempfile leaked [3, 2, 1] references test_threading_local leaked [25, 35, 27] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [63, 63, 63] references From mwh at python.net Wed Mar 15 11:26:10 2006 From: mwh at python.net (Michael Hudson) Date: Wed, 15 Mar 2006 10:26:10 +0000 Subject: [Python-checkins] r43033 - in python/trunk/Lib: distutils/sysconfig.py encodings/__init__.py In-Reply-To: <20060315043355.C82D71E4009@bag.python.org> (guido van rossum's message of "Wed, 15 Mar 2006 05:33:55 +0100 (CET)") References: <20060315043355.C82D71E4009@bag.python.org> Message-ID: <2mveug3sxp.fsf@starship.python.net> "guido.van.rossum" writes: > Author: guido.van.rossum > Date: Wed Mar 15 05:33:54 2006 > New Revision: 43033 > > Modified: > python/trunk/Lib/distutils/sysconfig.py > python/trunk/Lib/encodings/__init__.py > Log: > Use relative imports in a few places where I noticed the need. > (Ideally, all packages in Python 2.5 will use the relative import > syntax for all their relative import needs.) Abusing something I wrote recently to analyse the Twisted source found these local imports: xmlcore.etree.ElementInclude local import ElementTree ctypes.macholib.dyld local import framework ctypes.macholib.dyld local import dylib xmlcore.sax.saxutils local import handler xmlcore.sax.saxutils local import xmlreader xmlcore.etree.ElementTree local import ElementPath xmlcore.dom.__init__ local import domreg xmlcore.sax.__init__ local import xmlreader xmlcore.sax.__init__ local import handler xmlcore.sax.__init__ local import _exceptions xmlcore.sax.xmlreader local import handler xmlcore.sax.xmlreader local import _exceptions xmlcore.sax.xmlreader.IncrementalParser.parse local import saxutils It could have missed a few, it uses Python 2.4's compiler package which doesn't know how to parse e.g. PEP 308 conditional expressions (or indeed new-style relative imports...). Cheers, mwh -- * vegai wears his reading bra. umm, I mean glasses -- from Twisted.Quotes From python-checkins at python.org Wed Mar 15 12:00:27 2006 From: python-checkins at python.org (nick.coghlan) Date: Wed, 15 Mar 2006 12:00:27 +0100 (CET) Subject: [Python-checkins] r43043 - in python/trunk: Lib/runpy.py Lib/test/test_runpy.py Modules/main.c Message-ID: <20060315110027.A24291E405A@bag.python.org> Author: nick.coghlan Date: Wed Mar 15 12:00:26 2006 New Revision: 43043 Added: python/trunk/Lib/runpy.py (contents, props changed) python/trunk/Lib/test/test_runpy.py (contents, props changed) Modified: python/trunk/Modules/main.c Log: Implement PEP 338 which has been marked as accepted by GvR Added: python/trunk/Lib/runpy.py ============================================================================== --- (empty file) +++ python/trunk/Lib/runpy.py Wed Mar 15 12:00:26 2006 @@ -0,0 +1,431 @@ +"""runpy.py - locating and running Python code using the module namespace + +Provides support for locating and running Python scripts using the Python +module namespace instead of the native filesystem. + +This allows Python code to play nicely with non-filesystem based PEP 302 +importers when locating support scripts as well as when importing modules. +""" +# Written by Nick Coghlan +# to implement PEP 338 (Executing Modules as Scripts) + +import sys +import imp + +__all__ = [ + "run_module", +] + +try: + _get_loader = imp.get_loader +except AttributeError: + # get_loader() is not provided by the imp module, so emulate it + # as best we can using the PEP 302 import machinery exposed since + # Python 2.3. The emulation isn't perfect, but the differences + # in the way names are shadowed shouldn't matter in practice. + import os.path + import marshal # Handle compiled Python files + + # This helper is needed in order for the PEP 302 emulation to + # correctly handle compiled files + def _read_compiled_file(compiled_file): + magic = compiled_file.read(4) + if magic != imp.get_magic(): + return None + try: + compiled_file.read(4) # Skip timestamp + return marshal.load(compiled_file) + except Exception: + return None + + class _AbsoluteImporter(object): + """PEP 302 importer wrapper for top level import machinery""" + def find_module(self, mod_name, path=None): + if path is not None: + return None + try: + file, filename, mod_info = imp.find_module(mod_name) + except ImportError: + return None + suffix, mode, mod_type = mod_info + if mod_type == imp.PY_SOURCE: + loader = _SourceFileLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.PY_COMPILED: + loader = _CompiledFileLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.PKG_DIRECTORY: + loader = _PackageDirLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.C_EXTENSION: + loader = _FileSystemLoader(mod_name, file, + filename, mod_info) + else: + loader = _BasicLoader(mod_name, file, + filename, mod_info) + return loader + + + class _FileSystemImporter(object): + """PEP 302 importer wrapper for filesystem based imports""" + def __init__(self, path_item=None): + if path_item is not None: + if path_item != '' and not os.path.isdir(path_item): + raise ImportError("%s is not a directory" % path_item) + self.path_dir = path_item + else: + raise ImportError("Filesystem importer requires " + "a directory name") + + def find_module(self, mod_name, path=None): + if path is not None: + return None + path_dir = self.path_dir + if path_dir == '': + path_dir = os.getcwd() + sub_name = mod_name.rsplit(".", 1)[-1] + try: + file, filename, mod_info = imp.find_module(sub_name, + [path_dir]) + except ImportError: + return None + if not filename.startswith(path_dir): + return None + suffix, mode, mod_type = mod_info + if mod_type == imp.PY_SOURCE: + loader = _SourceFileLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.PY_COMPILED: + loader = _CompiledFileLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.PKG_DIRECTORY: + loader = _PackageDirLoader(mod_name, file, + filename, mod_info) + elif mod_type == imp.C_EXTENSION: + loader = _FileSystemLoader(mod_name, file, + filename, mod_info) + else: + loader = _BasicLoader(mod_name, file, + filename, mod_info) + return loader + + + class _BasicLoader(object): + """PEP 302 loader wrapper for top level import machinery""" + def __init__(self, mod_name, file, filename, mod_info): + self.mod_name = mod_name + self.file = file + self.filename = filename + self.mod_info = mod_info + + def _fix_name(self, mod_name): + if mod_name is None: + mod_name = self.mod_name + elif mod_name != self.mod_name: + raise ImportError("Loader for module %s cannot handle " + "module %s" % (self.mod_name, mod_name)) + return mod_name + + def load_module(self, mod_name=None): + mod_name = self._fix_name(mod_name) + mod = imp.load_module(mod_name, self.file, + self.filename, self.mod_info) + mod.__loader__ = self # for introspection + return mod + + def get_code(self, mod_name=None): + return None + + def get_source(self, mod_name=None): + return None + + def is_package(self, mod_name=None): + return False + + def close(self): + if self.file: + self.file.close() + + def __del__(self): + self.close() + + + class _FileSystemLoader(_BasicLoader): + """PEP 302 loader wrapper for filesystem based imports""" + def get_code(self, mod_name=None): + mod_name = self._fix_name(mod_name) + return self._get_code(mod_name) + + def get_data(self, pathname): + return open(pathname, "rb").read() + + def get_filename(self, mod_name=None): + mod_name = self._fix_name(mod_name) + return self._get_filename(mod_name) + + def get_source(self, mod_name=None): + mod_name = self._fix_name(mod_name) + return self._get_source(mod_name) + + def is_package(self, mod_name=None): + mod_name = self._fix_name(mod_name) + return self._is_package(mod_name) + + def _get_code(self, mod_name): + return None + + def _get_filename(self, mod_name): + return self.filename + + def _get_source(self, mod_name): + return None + + def _is_package(self, mod_name): + return False + + class _PackageDirLoader(_FileSystemLoader): + """PEP 302 loader wrapper for PKG_DIRECTORY directories""" + def _is_package(self, mod_name): + return True + + + class _SourceFileLoader(_FileSystemLoader): + """PEP 302 loader wrapper for PY_SOURCE modules""" + def _get_code(self, mod_name): + return compile(self._get_source(mod_name), + self.filename, 'exec') + + def _get_source(self, mod_name): + f = self.file + f.seek(0) + return f.read() + + + class _CompiledFileLoader(_FileSystemLoader): + """PEP 302 loader wrapper for PY_COMPILED modules""" + def _get_code(self, mod_name): + f = self.file + f.seek(0) + return _read_compiled_file(f) + + + def _get_importer(path_item): + """Retrieve a PEP 302 importer for the given path item + + The returned importer is cached in sys.path_importer_cache + if it was newly created by a path hook. + + If there is no importer, a wrapper around the basic import + machinery is returned. This wrapper is never inserted into + the importer cache (None is inserted instead). + + The cache (or part of it) can be cleared manually if a + rescan of sys.path_hooks is necessary. + """ + try: + importer = sys.path_importer_cache[path_item] + except KeyError: + for path_hook in sys.path_hooks: + try: + importer = path_hook(path_item) + break + except ImportError: + pass + else: + importer = None + sys.path_importer_cache[path_item] = importer + if importer is None: + try: + importer = _FileSystemImporter(path_item) + except ImportError: + pass + return importer + + + def _get_path_loader(mod_name, path=None): + """Retrieve a PEP 302 loader using a path importer""" + if path is None: + path = sys.path + absolute_loader = _AbsoluteImporter().find_module(mod_name) + if isinstance(absolute_loader, _FileSystemLoader): + # Found in filesystem, so scan path hooks + # before accepting this one as the right one + loader = None + else: + # Not found in filesystem, so use top-level loader + loader = absolute_loader + else: + loader = absolute_loader = None + if loader is None: + for path_item in path: + importer = _get_importer(path_item) + if importer is not None: + loader = importer.find_module(mod_name) + if loader is not None: + # Found a loader for our module + break + else: + # No path hook found, so accept the top level loader + loader = absolute_loader + return loader + + def _get_package(pkg_name): + """Retrieve a named package""" + pkg = __import__(pkg_name) + sub_pkg_names = pkg_name.split(".") + for sub_pkg in sub_pkg_names[1:]: + pkg = getattr(pkg, sub_pkg) + return pkg + + def _get_loader(mod_name, path=None): + """Retrieve a PEP 302 loader for the given module or package + + If the module or package is accessible via the normal import + mechanism, a wrapper around the relevant part of that machinery + is returned. + + Non PEP 302 mechanisms (e.g. the Windows registry) used by the + standard import machinery to find files in alternative locations + are partially supported, but are searched AFTER sys.path. Normally, + these locations are searched BEFORE sys.path, preventing sys.path + entries from shadowing them. + For this to cause a visible difference in behaviour, there must + be a module or package name that is accessible via both sys.path + and one of the non PEP 302 file system mechanisms. In this case, + the emulation will find the former version, while the builtin + import mechanism will find the latter. + Items of the following types can be affected by this discrepancy: + imp.C_EXTENSION + imp.PY_SOURCE + imp.PY_COMPILED + imp.PKG_DIRECTORY + """ + try: + loader = sys.modules[mod_name].__loader__ + except (KeyError, AttributeError): + loader = None + if loader is None: + imp.acquire_lock() + try: + # Module not in sys.modules, or uses an unhooked loader + parts = mod_name.rsplit(".", 1) + if len(parts) == 2: + # Sub package, so use parent package's path + pkg_name, sub_name = parts + if pkg_name and pkg_name[0] != '.': + if path is not None: + raise ImportError("Path argument must be None " + "for a dotted module name") + pkg = _get_package(pkg_name) + try: + path = pkg.__path__ + except AttributeError: + raise ImportError(pkg_name + + " is not a package") + else: + raise ImportError("Relative import syntax is not " + "supported by _get_loader()") + else: + # Top level module, so stick with default path + sub_name = mod_name + + for importer in sys.meta_path: + loader = importer.find_module(mod_name, path) + if loader is not None: + # Found a metahook to handle the module + break + else: + # Handling via the standard path mechanism + loader = _get_path_loader(mod_name, path) + finally: + imp.release_lock() + return loader + + +# This helper is needed due to a missing component in the PEP 302 +# loader protocol (specifically, "get_filename" is non-standard) +def _get_filename(loader, mod_name): + try: + get_filename = loader.get_filename + except AttributeError: + return None + else: + return get_filename(mod_name) + +# ------------------------------------------------------------ +# Done with the import machinery emulation, on with the code! + +def _run_code(code, run_globals, init_globals, + mod_name, mod_fname, mod_loader): + """Helper for _run_module_code""" + if init_globals is not None: + run_globals.update(init_globals) + run_globals.update(__name__ = mod_name, + __file__ = mod_fname, + __loader__ = mod_loader) + exec code in run_globals + return run_globals + +def _run_module_code(code, init_globals=None, + mod_name=None, mod_fname=None, + mod_loader=None, alter_sys=False): + """Helper for run_module""" + # Set up the top level namespace dictionary + if alter_sys: + # Modify sys.argv[0] and sys.module[mod_name] + temp_module = imp.new_module(mod_name) + mod_globals = temp_module.__dict__ + saved_argv0 = sys.argv[0] + restore_module = mod_name in sys.modules + if restore_module: + saved_module = sys.modules[mod_name] + imp.acquire_lock() + try: + sys.argv[0] = mod_fname + sys.modules[mod_name] = temp_module + try: + _run_code(code, mod_globals, init_globals, + mod_name, mod_fname, mod_loader) + finally: + sys.argv[0] = saved_argv0 + if restore_module: + sys.modules[mod_name] = saved_module + else: + del sys.modules[mod_name] + finally: + imp.release_lock() + # Copy the globals of the temporary module, as they + # may be cleared when the temporary module goes away + return mod_globals.copy() + else: + # Leave the sys module alone + return _run_code(code, {}, init_globals, + mod_name, mod_fname, mod_loader) + + +def run_module(mod_name, init_globals=None, + run_name=None, alter_sys=False): + """Execute a module's code without importing it + + Returns the resulting top level namespace dictionary + """ + loader = _get_loader(mod_name) + if loader is None: + raise ImportError("No module named " + mod_name) + code = loader.get_code(mod_name) + if code is None: + raise ImportError("No code object available for " + mod_name) + filename = _get_filename(loader, mod_name) + if run_name is None: + run_name = mod_name + return _run_module_code(code, init_globals, run_name, + filename, loader, alter_sys) + + +if __name__ == "__main__": + # Run the module specified as the next command line argument + if len(sys.argv) < 2: + print >> sys.stderr, "No module specified for execution" + else: + del sys.argv[0] # Make the requested module sys.argv[0] + run_module(sys.argv[0], run_name="__main__", alter_sys=True) Added: python/trunk/Lib/test/test_runpy.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_runpy.py Wed Mar 15 12:00:26 2006 @@ -0,0 +1,157 @@ +# Test the runpy module +import unittest +import os +import os.path +import sys +import tempfile +from test.test_support import verbose, run_unittest +from runpy import _run_module_code, run_module + +# Set up the test code and expected results + +class RunModuleCodeTest(unittest.TestCase): + + expected_result = ["Top level assignment", "Lower level reference"] + test_source = ( + "# Check basic code execution\n" + "result = ['Top level assignment']\n" + "def f():\n" + " result.append('Lower level reference')\n" + "f()\n" + "# Check the sys module\n" + "import sys\n" + "run_argv0 = sys.argv[0]\n" + "if __name__ in sys.modules:\n" + " run_name = sys.modules[__name__].__name__\n" + "# Check nested operation\n" + "import runpy\n" + "nested = runpy._run_module_code('x=1\\n', mod_name='',\n" + " alter_sys=True)\n" + ) + + + def test_run_module_code(self): + initial = object() + name = "" + file = "Some other nonsense" + loader = "Now you're just being silly" + d1 = dict(initial=initial) + saved_argv0 = sys.argv[0] + d2 = _run_module_code(self.test_source, + d1, + name, + file, + loader, + True) + self.failUnless("result" not in d1) + self.failUnless(d2["initial"] is initial) + self.failUnless(d2["result"] == self.expected_result) + self.failUnless(d2["nested"]["x"] == 1) + self.failUnless(d2["__name__"] is name) + self.failUnless(d2["run_name"] is name) + self.failUnless(d2["__file__"] is file) + self.failUnless(d2["run_argv0"] is file) + self.failUnless(d2["__loader__"] is loader) + self.failUnless(sys.argv[0] is saved_argv0) + self.failUnless(name not in sys.modules) + + def test_run_module_code_defaults(self): + saved_argv0 = sys.argv[0] + d = _run_module_code(self.test_source) + self.failUnless(d["result"] == self.expected_result) + self.failUnless(d["__name__"] is None) + self.failUnless(d["__file__"] is None) + self.failUnless(d["__loader__"] is None) + self.failUnless(d["run_argv0"] is saved_argv0) + self.failUnless("run_name" not in d) + self.failUnless(sys.argv[0] is saved_argv0) + +class RunModuleTest(unittest.TestCase): + + def expect_import_error(self, mod_name): + try: + run_module(mod_name) + except ImportError: + pass + else: + self.fail("Expected import error for " + mod_name) + + def test_invalid_names(self): + self.expect_import_error("sys") + self.expect_import_error("sys.imp.eric") + self.expect_import_error("os.path.half") + self.expect_import_error("a.bee") + self.expect_import_error(".howard") + self.expect_import_error("..eaten") + + def test_library_module(self): + run_module("runpy") + + def _make_pkg(self, source, depth): + pkg_name = "__runpy_pkg__" + init_fname = "__init__"+os.extsep+"py" + test_fname = "runpy_test"+os.extsep+"py" + pkg_dir = sub_dir = tempfile.mkdtemp() + if verbose: print " Package tree in:", sub_dir + sys.path.insert(0, pkg_dir) + if verbose: print " Updated sys.path:", sys.path[0] + for i in range(depth): + sub_dir = os.path.join(sub_dir, pkg_name) + os.mkdir(sub_dir) + if verbose: print " Next level in:", sub_dir + pkg_fname = os.path.join(sub_dir, init_fname) + pkg_file = open(pkg_fname, "w") + pkg_file.write("__path__ = ['%s']\n" % sub_dir) + pkg_file.close() + if verbose: print " Created:", pkg_fname + mod_fname = os.path.join(sub_dir, test_fname) + mod_file = open(mod_fname, "w") + mod_file.write(source) + mod_file.close() + if verbose: print " Created:", mod_fname + mod_name = (pkg_name+".")*depth + "runpy_test" + return pkg_dir, mod_fname, mod_name + + def _del_pkg(self, top, depth, mod_name): + for root, dirs, files in os.walk(top, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(top) + if verbose: print " Removed package tree" + for i in range(depth+1): # Don't forget the module itself + parts = mod_name.rsplit(".", i) + entry = parts[0] + del sys.modules[entry] + if verbose: print " Removed sys.modules entries" + del sys.path[0] + if verbose: print " Removed sys.path entry" + + def _check_module(self, depth): + pkg_dir, mod_fname, mod_name = ( + self._make_pkg("x=1\n", depth)) + try: + if verbose: print "Running from source:", mod_name + d1 = run_module(mod_name) # Read from source + __import__(mod_name) + os.remove(mod_fname) + if verbose: print "Running from compiled:", mod_name + d2 = run_module(mod_name) # Read from bytecode + finally: + self._del_pkg(pkg_dir, depth, mod_name) + self.failUnless(d1["x"] == d2["x"] == 1) + if verbose: print "Module executed successfully" + + def test_run_module(self): + for depth in range(4): + if verbose: print "Testing package depth:", depth + self._check_module(depth) + + +def test_main(): + run_unittest(RunModuleCodeTest) + run_unittest(RunModuleTest) + +if __name__ == "__main__": + test_main() \ No newline at end of file Modified: python/trunk/Modules/main.c ============================================================================== --- python/trunk/Modules/main.c (original) +++ python/trunk/Modules/main.c Wed Mar 15 12:00:26 2006 @@ -132,27 +132,42 @@ } } -/* Get the path to a top-level module */ -static struct filedescr * FindModule(const char *module, - FILE **fp, char **filename) -{ - struct filedescr *fdescr = NULL; - *fp = NULL; - *filename = malloc(MAXPATHLEN); - - if (*filename == NULL) - return NULL; - - /* Find the actual module source code */ - fdescr = _PyImport_FindModule(module, NULL, - *filename, MAXPATHLEN, fp, NULL); - if (fdescr == NULL) { - free(*filename); - *filename = NULL; +static int RunModule(char *module) +{ + PyObject *runpy, *runmodule, *runargs, *result; + runpy = PyImport_ImportModule("runpy"); + if (runpy == NULL) { + fprintf(stderr, "Could not import runpy module\n"); + return -1; + } + runmodule = PyObject_GetAttrString(runpy, "run_module"); + if (runmodule == NULL) { + fprintf(stderr, "Could not access runpy.run_module\n"); + Py_DECREF(runpy); + return -1; + } + runargs = Py_BuildValue("sOsO", module, + Py_None, "__main__", Py_True); + if (runargs == NULL) { + fprintf(stderr, + "Could not create arguments for runpy.run_module\n"); + Py_DECREF(runpy); + Py_DECREF(runmodule); + return -1; + } + result = PyObject_Call(runmodule, runargs, NULL); + if (result == NULL) { + PyErr_Print(); + } + Py_DECREF(runpy); + Py_DECREF(runmodule); + Py_DECREF(runargs); + if (result == NULL) { + return -1; } - - return fdescr; + Py_DECREF(result); + return 0; } /* Main program */ @@ -441,28 +456,9 @@ } if (module != NULL) { - /* Backup _PyOS_optind and find the real file */ - struct filedescr *fdescr = NULL; + /* Backup _PyOS_optind and force sys.arv[0] = module */ _PyOS_optind--; - if ((fdescr = FindModule(module, &fp, &filename))) { - argv[_PyOS_optind] = filename; - } else { - fprintf(stderr, "%s: module %s not found\n", - argv[0], module); - return 2; - } - if (!fp) { - fprintf(stderr, - "%s: module %s has no associated file\n", - argv[0], module); - return 2; - } - if (!_PyImport_IsScript(fdescr)) { - fprintf(stderr, - "%s: module %s not usable as script\n (%s)\n", - argv[0], module, filename); - return 2; - } + argv[_PyOS_optind] = module; } PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); @@ -481,9 +477,8 @@ sts = PyRun_SimpleStringFlags(command, &cf) != 0; free(command); } else if (module) { - sts = PyRun_AnyFileExFlags(fp, filename, 1, &cf) != 0; + sts = RunModule(module); free(module); - free(filename); } else { if (filename == NULL && stdin_is_interactive) { From python-checkins at python.org Wed Mar 15 12:12:01 2006 From: python-checkins at python.org (nick.coghlan) Date: Wed, 15 Mar 2006 12:12:01 +0100 (CET) Subject: [Python-checkins] r43044 - peps/trunk/pep-0000.txt peps/trunk/pep-0338.txt peps/trunk/pep-0356.txt Message-ID: <20060315111201.B53821E4009@bag.python.org> Author: nick.coghlan Date: Wed Mar 15 12:12:01 2006 New Revision: 43044 Modified: peps/trunk/pep-0000.txt peps/trunk/pep-0338.txt peps/trunk/pep-0356.txt Log: Mark PEP 338 as Final for 2.5 Modified: peps/trunk/pep-0000.txt ============================================================================== --- peps/trunk/pep-0000.txt (original) +++ peps/trunk/pep-0000.txt Wed Mar 15 12:12:01 2006 @@ -66,7 +66,6 @@ Accepted PEPs (accepted; may not be implemented yet) SA 328 Imports: Multi-Line and Absolute/Relative Aahz - SA 338 Executing modules inside packages with '-m' Coghlan Open PEPs (under consideration) @@ -161,6 +160,7 @@ SF 322 Reverse Iteration Hettinger SF 324 subprocess - New process module Astrand SF 327 Decimal Data Type Batista + SF 338 Executing Modules as Scripts Coghlan SF 341 Unifying try-except and try-finally Brandl SF 342 Coroutines via Enhanced Generators GvR, Eby SF 343 The "with" Statement GvR, Coghlan @@ -391,7 +391,7 @@ S 335 Overloadable Boolean Operators Ewing SR 336 Make None Callable McClelland S 337 Logging Usage in the Standard Library Dubner - SA 338 Executing modules inside packages with '-m' Coghlan + SF 338 Executing Modules as Scripts Coghlan I 339 Design of the CPython Compiler Cannon SR 340 Anonymous Block Statements GvR SF 341 Unifying try-except and try-finally Brandl Modified: peps/trunk/pep-0338.txt ============================================================================== --- peps/trunk/pep-0338.txt (original) +++ peps/trunk/pep-0338.txt Wed Mar 15 12:12:01 2006 @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Accepted +Status: Final Type: Standards Track Content-Type: text/x-rst Created: 16-Oct-2004 Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Wed Mar 15 12:12:01 2006 @@ -48,6 +48,7 @@ PEP 314: Metadata for Python Software Packages v1.1 (should PEP 314 be marked final?) PEP 328: Absolute/Relative Imports + PEP 338: Executing Modules as Scripts PEP 341: Unified try-except/try-finally to try-except-finally PEP 342: Coroutines via Enhanced Generators PEP 343: The "with" Statement @@ -87,8 +88,6 @@ Each feature below should implemented prior to alpha2 or will require BDFL approval for inclusion in 2.5. - - PEP 338 (still needs to be accepted and patch checked in) - - SyntaxWarnings for the following proposed keywords: - 'do'? (PEP 315) From python-checkins at python.org Wed Mar 15 12:35:22 2006 From: python-checkins at python.org (walter.doerwald) Date: Wed, 15 Mar 2006 12:35:22 +0100 (CET) Subject: [Python-checkins] r43045 - in python/trunk: Doc/lib/libcodecs.tex Include/codecs.h Lib/codecs.py Lib/encodings/__init__.py Lib/encodings/ascii.py Lib/encodings/base64_codec.py Lib/encodings/bz2_codec.py Lib/encodings/charmap.py Lib/encodings/cp037.py Lib/encodings/cp1006.py Lib/encodings/cp1026.py Lib/encodings/cp1140.py Lib/encodings/cp1250.py Lib/encodings/cp1251.py Lib/encodings/cp1252.py Lib/encodings/cp1253.py Lib/encodings/cp1254.py Lib/encodings/cp1255.py Lib/encodings/cp1256.py Lib/encodings/cp1257.py Lib/encodings/cp1258.py Lib/encodings/cp424.py Lib/encodings/cp437.py Lib/encodings/cp500.py Lib/encodings/cp737.py Lib/encodings/cp775.py Lib/encodings/cp850.py Lib/encodings/cp852.py Lib/encodings/cp855.py Lib/encodings/cp856.py Lib/encodings/cp857.py Lib/encodings/cp860.py Lib/encodings/cp861.py Lib/encodings/cp862.py Lib/encodings/cp863.py Lib/encodings/cp864.py Lib/encodings/cp865.py Lib/encodings/cp866.py Lib/encodings/cp869.py Lib/encodings/cp874.py Lib/encodings/cp875.py Lib/encodings/hex_codec.py Lib/encodings/hp_roman8.py Lib/encodings/idna.py Lib/encodings/iso8859_1.py Lib/encodings/iso8859_10.py Lib/encodings/iso8859_11.py Lib/encodings/iso8859_13.py Lib/encodings/iso8859_14.py Lib/encodings/iso8859_15.py Lib/encodings/iso8859_16.py Lib/encodings/iso8859_2.py Lib/encodings/iso8859_3.py Lib/encodings/iso8859_4.py Lib/encodings/iso8859_5.py Lib/encodings/iso8859_6.py Lib/encodings/iso8859_7.py Lib/encodings/iso8859_8.py Lib/encodings/iso8859_9.py Lib/encodings/koi8_r.py Lib/encodings/koi8_u.py Lib/encodings/latin_1.py Lib/encodings/mac_arabic.py Lib/encodings/mac_centeuro.py Lib/encodings/mac_croatian.py Lib/encodings/mac_cyrillic.py Lib/encodings/mac_farsi.py Lib/encodings/mac_greek.py Lib/encodings/mac_iceland.py Lib/encodings/mac_latin2.py Lib/encodings/mac_roman.py Lib/encodings/mac_romanian.py Lib/encodings/mac_turkish.py Lib/encodings/mbcs.py Lib/encodings/palmos.py Lib/encodings/ptcp154.py Lib/encodings/punycode.py Lib/encodings/quopri_codec.py Lib/encodings/raw_unicode_escape.py Lib/encodings/rot_13.py Lib/encodings/string_escape.py Lib/encodings/tis_620.py Lib/encodings/undefined.py Lib/encodings/unicode_escape.py Lib/encodings/unicode_internal.py Lib/encodings/utf_16.py Lib/encodings/utf_16_be.py Lib/encodings/utf_16_le.py Lib/encodings/utf_7.py Lib/encodings/utf_8.py Lib/encodings/utf_8_sig.py Lib/encodings/uu_codec.py Lib/encodings/zlib_codec.py Lib/test/test_codecs.py Misc/NEWS Python/codecs.c Tools/unicode/Makefile Tools/unicode/gencodec.py Message-ID: <20060315113522.1FF371E4009@bag.python.org> Author: walter.doerwald Date: Wed Mar 15 12:35:15 2006 New Revision: 43045 Modified: python/trunk/Doc/lib/libcodecs.tex python/trunk/Include/codecs.h python/trunk/Lib/codecs.py python/trunk/Lib/encodings/__init__.py python/trunk/Lib/encodings/ascii.py python/trunk/Lib/encodings/base64_codec.py python/trunk/Lib/encodings/bz2_codec.py python/trunk/Lib/encodings/charmap.py python/trunk/Lib/encodings/cp037.py python/trunk/Lib/encodings/cp1006.py python/trunk/Lib/encodings/cp1026.py python/trunk/Lib/encodings/cp1140.py python/trunk/Lib/encodings/cp1250.py python/trunk/Lib/encodings/cp1251.py python/trunk/Lib/encodings/cp1252.py python/trunk/Lib/encodings/cp1253.py python/trunk/Lib/encodings/cp1254.py python/trunk/Lib/encodings/cp1255.py python/trunk/Lib/encodings/cp1256.py python/trunk/Lib/encodings/cp1257.py python/trunk/Lib/encodings/cp1258.py python/trunk/Lib/encodings/cp424.py python/trunk/Lib/encodings/cp437.py python/trunk/Lib/encodings/cp500.py python/trunk/Lib/encodings/cp737.py python/trunk/Lib/encodings/cp775.py python/trunk/Lib/encodings/cp850.py python/trunk/Lib/encodings/cp852.py python/trunk/Lib/encodings/cp855.py python/trunk/Lib/encodings/cp856.py python/trunk/Lib/encodings/cp857.py python/trunk/Lib/encodings/cp860.py python/trunk/Lib/encodings/cp861.py python/trunk/Lib/encodings/cp862.py python/trunk/Lib/encodings/cp863.py python/trunk/Lib/encodings/cp864.py python/trunk/Lib/encodings/cp865.py python/trunk/Lib/encodings/cp866.py python/trunk/Lib/encodings/cp869.py python/trunk/Lib/encodings/cp874.py python/trunk/Lib/encodings/cp875.py python/trunk/Lib/encodings/hex_codec.py python/trunk/Lib/encodings/hp_roman8.py python/trunk/Lib/encodings/idna.py python/trunk/Lib/encodings/iso8859_1.py python/trunk/Lib/encodings/iso8859_10.py python/trunk/Lib/encodings/iso8859_11.py python/trunk/Lib/encodings/iso8859_13.py python/trunk/Lib/encodings/iso8859_14.py python/trunk/Lib/encodings/iso8859_15.py python/trunk/Lib/encodings/iso8859_16.py python/trunk/Lib/encodings/iso8859_2.py python/trunk/Lib/encodings/iso8859_3.py python/trunk/Lib/encodings/iso8859_4.py python/trunk/Lib/encodings/iso8859_5.py python/trunk/Lib/encodings/iso8859_6.py python/trunk/Lib/encodings/iso8859_7.py python/trunk/Lib/encodings/iso8859_8.py python/trunk/Lib/encodings/iso8859_9.py python/trunk/Lib/encodings/koi8_r.py python/trunk/Lib/encodings/koi8_u.py python/trunk/Lib/encodings/latin_1.py python/trunk/Lib/encodings/mac_arabic.py python/trunk/Lib/encodings/mac_centeuro.py python/trunk/Lib/encodings/mac_croatian.py python/trunk/Lib/encodings/mac_cyrillic.py python/trunk/Lib/encodings/mac_farsi.py python/trunk/Lib/encodings/mac_greek.py python/trunk/Lib/encodings/mac_iceland.py python/trunk/Lib/encodings/mac_latin2.py python/trunk/Lib/encodings/mac_roman.py python/trunk/Lib/encodings/mac_romanian.py python/trunk/Lib/encodings/mac_turkish.py python/trunk/Lib/encodings/mbcs.py python/trunk/Lib/encodings/palmos.py python/trunk/Lib/encodings/ptcp154.py python/trunk/Lib/encodings/punycode.py python/trunk/Lib/encodings/quopri_codec.py python/trunk/Lib/encodings/raw_unicode_escape.py python/trunk/Lib/encodings/rot_13.py python/trunk/Lib/encodings/string_escape.py python/trunk/Lib/encodings/tis_620.py python/trunk/Lib/encodings/undefined.py python/trunk/Lib/encodings/unicode_escape.py python/trunk/Lib/encodings/unicode_internal.py python/trunk/Lib/encodings/utf_16.py python/trunk/Lib/encodings/utf_16_be.py python/trunk/Lib/encodings/utf_16_le.py python/trunk/Lib/encodings/utf_7.py python/trunk/Lib/encodings/utf_8.py python/trunk/Lib/encodings/utf_8_sig.py python/trunk/Lib/encodings/uu_codec.py python/trunk/Lib/encodings/zlib_codec.py python/trunk/Lib/test/test_codecs.py python/trunk/Misc/NEWS python/trunk/Python/codecs.c python/trunk/Tools/unicode/Makefile python/trunk/Tools/unicode/gencodec.py Log: Patch #1436130: codecs.lookup() now returns a CodecInfo object (a subclass of tuple) that provides incremental decoders and encoders (a way to use stateful codecs without the stream API). Functions codecs.getincrementaldecoder() and codecs.getincrementalencoder() have been added. Modified: python/trunk/Doc/lib/libcodecs.tex ============================================================================== --- python/trunk/Doc/lib/libcodecs.tex (original) +++ python/trunk/Doc/lib/libcodecs.tex Wed Mar 15 12:35:15 2006 @@ -24,8 +24,19 @@ \begin{funcdesc}{register}{search_function} Register a codec search function. Search functions are expected to take one argument, the encoding name in all lower case letters, and -return a tuple of functions \code{(\var{encoder}, \var{decoder}, \var{stream_reader}, -\var{stream_writer})} taking the following arguments: +return a \class{CodecInfo} object having the following attributes: + +\begin{itemize} + \item \code{name} The name of the encoding; + \item \code{encoder} The stateless encoding function; + \item \code{decoder} The stateless decoding function; + \item \code{incrementalencoder} An incremental encoder class or factory function; + \item \code{incrementaldecoder} An incremental decoder class or factory function; + \item \code{streamwriter} A stream writer class or factory function; + \item \code{streamreader} A stream reader class or factory function. +\end{itemize} + +The various functions or classes take the following arguments: \var{encoder} and \var{decoder}: These must be functions or methods which have the same interface as the @@ -33,7 +44,17 @@ Codec Interface). The functions/methods are expected to work in a stateless mode. - \var{stream_reader} and \var{stream_writer}: These have to be + \var{incrementalencoder} and \var{incrementalencoder}: These have to be + factory functions providing the following interface: + + \code{factory(\var{errors}='strict')} + + The factory functions must return objects providing the interfaces + defined by the base classes \class{IncrementalEncoder} and + \class{IncrementalEncoder}, respectively. Incremental codecs can maintain + state. + + \var{streamreader} and \var{streamwriter}: These have to be factory functions providing the following interface: \code{factory(\var{stream}, \var{errors}='strict')} @@ -58,13 +79,13 @@ \end{funcdesc} \begin{funcdesc}{lookup}{encoding} -Looks up a codec tuple in the Python codec registry and returns the -function tuple as defined above. +Looks up the codec info in the Python codec registry and returns a +\class{CodecInfo} object as defined above. Encodings are first looked up in the registry's cache. If not found, -the list of registered search functions is scanned. If no codecs tuple -is found, a \exception{LookupError} is raised. Otherwise, the codecs -tuple is stored in the cache and returned to the caller. +the list of registered search functions is scanned. If no \class{CodecInfo} +object is found, a \exception{LookupError} is raised. Otherwise, the +\class{CodecInfo} object is stored in the cache and returned to the caller. \end{funcdesc} To simplify access to the various codecs, the module provides these @@ -85,6 +106,22 @@ Raises a \exception{LookupError} in case the encoding cannot be found. \end{funcdesc} +\begin{funcdesc}{getincrementalencoder}{encoding} +Lookup up the codec for the given encoding and return its incremental encoder +class or factory function. + +Raises a \exception{LookupError} in case the encoding cannot be found or the +codec doesn't support an incremental encoder. +\end{funcdesc} + +\begin{funcdesc}{getincrementaldecoder}{encoding} +Lookup up the codec for the given encoding and return its incremental decoder +class or factory function. + +Raises a \exception{LookupError} in case the encoding cannot be found or the +codec doesn't support an incremental decoder. +\end{funcdesc} + \begin{funcdesc}{getreader}{encoding} Lookup up the codec for the given encoding and return its StreamReader class or factory function. @@ -188,6 +225,18 @@ an encoding error occurs. \end{funcdesc} +\begin{funcdesc}{iterencode}{iterable, encoding\optional{, errors}} +Uses an incremental encoder to iteratively encode the input provided by +\var{iterable}. This function is a generator. \var{errors} (as well as +any other keyword argument) is passed through to the incremental encoder. +\end{funcdesc} + +\begin{funcdesc}{iterdecode}{iterable, encoding\optional{, errors}} +Uses an incremental decoder to iteratively decode the input provided by +\var{iterable}. This function is a generator. \var{errors} (as well as +any other keyword argument) is passed through to the incremental encoder. +\end{funcdesc} + The module also provides the following constants which are useful for reading and writing to platform dependent files: @@ -292,6 +341,109 @@ empty object of the output object type in this situation. \end{methoddesc} +The \class{IncrementalEncoder} and \class{IncrementalDecoder} classes provide +the basic interface for incremental encoding and decoding. Encoding/decoding the +input isn't done with one call to the stateless encoder/decoder function, +but with multiple calls to the \method{encode}/\method{decode} method of the +incremental encoder/decoder. The incremental encoder/decoder keeps track of +the encoding/decoding process during method calls. + +The joined output of calls to the \method{encode}/\method{decode} method is the +same as if the all single inputs where joined into one, and this input was +encoded/decoded with the stateless encoder/decoder. + + +\subsubsection{IncrementalEncoder Objects \label{incremental-encoder-objects}} + +The \class{IncrementalEncoder} class is used for encoding an input in multiple +steps. It defines the following methods which every incremental encoder must +define in order to be compatible to the Python codec registry. + +\begin{classdesc}{IncrementalEncoder}{\optional{errors}} + Constructor for a \class{IncrementalEncoder} instance. + + All incremental encoders must provide this constructor interface. They are + free to add additional keyword arguments, but only the ones defined + here are used by the Python codec registry. + + The \class{IncrementalEncoder} may implement different error handling + schemes by providing the \var{errors} keyword argument. These + parameters are predefined: + + \begin{itemize} + \item \code{'strict'} Raise \exception{ValueError} (or a subclass); + this is the default. + \item \code{'ignore'} Ignore the character and continue with the next. + \item \code{'replace'} Replace with a suitable replacement character + \item \code{'xmlcharrefreplace'} Replace with the appropriate XML + character reference + \item \code{'backslashreplace'} Replace with backslashed escape sequences. + \end{itemize} + + The \var{errors} argument will be assigned to an attribute of the + same name. Assigning to this attribute makes it possible to switch + between different error handling strategies during the lifetime + of the \class{IncrementalEncoder} object. + + The set of allowed values for the \var{errors} argument can + be extended with \function{register_error()}. +\end{classdesc} + +\begin{methoddesc}{encode}{object\optional{, final}} + Encodes \var{object} (taking the current state of the encoder into account) + and returns the resulting encoded object. If this is the last call to + \method{encode} \var{final} must be true (the default is false). +\end{methoddesc} + +\begin{methoddesc}{reset}{} + Reset the encoder to the initial state. +\end{methoddesc} + + +\subsubsection{IncrementalDecoder Objects \label{incremental-decoder-objects}} + +The \class{IncrementalDecoder} class is used for decoding an input in multiple +steps. It defines the following methods which every incremental decoder must +define in order to be compatible to the Python codec registry. + +\begin{classdesc}{IncrementalDecoder}{\optional{errors}} + Constructor for a \class{IncrementalDecoder} instance. + + All incremental decoders must provide this constructor interface. They are + free to add additional keyword arguments, but only the ones defined + here are used by the Python codec registry. + + The \class{IncrementalDecoder} may implement different error handling + schemes by providing the \var{errors} keyword argument. These + parameters are predefined: + + \begin{itemize} + \item \code{'strict'} Raise \exception{ValueError} (or a subclass); + this is the default. + \item \code{'ignore'} Ignore the character and continue with the next. + \item \code{'replace'} Replace with a suitable replacement character. + \end{itemize} + + The \var{errors} argument will be assigned to an attribute of the + same name. Assigning to this attribute makes it possible to switch + between different error handling strategies during the lifetime + of the \class{IncrementalEncoder} object. + + The set of allowed values for the \var{errors} argument can + be extended with \function{register_error()}. +\end{classdesc} + +\begin{methoddesc}{decode}{object\optional{, final}} + Decodes \var{object} (taking the current state of the decoder into account) + and returns the resulting decoded object. If this is the last call to + \method{decode} \var{final} must be true (the default is false). +\end{methoddesc} + +\begin{methoddesc}{reset}{} + Reset the decoder to the initial state. +\end{methoddesc} + + The \class{StreamWriter} and \class{StreamReader} classes provide generic working interfaces which can be used to implement new encodings submodules very easily. See \module{encodings.utf_8} for an Modified: python/trunk/Include/codecs.h ============================================================================== --- python/trunk/Include/codecs.h (original) +++ python/trunk/Include/codecs.h Wed Mar 15 12:35:15 2006 @@ -29,15 +29,15 @@ /* Codec register lookup API. - Looks up the given encoding and returns a tuple (encoder, decoder, - stream reader, stream writer) of functions which implement the - different aspects of processing the encoding. + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. The encoding string is looked up converted to all lower-case characters. This makes encodings looked up through this mechanism effectively case-insensitive. - If no codec is found, a KeyError is set and NULL returned. + If no codec is found, a KeyError is set and NULL returned. As side effect, this tries to load the encodings package, if not yet done. This is part of the lazy load strategy for the encodings @@ -101,6 +101,20 @@ const char *encoding ); +/* Get a IncrementalEncoder object for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( + const char *encoding, + const char *errors + ); + +/* Get a IncrementalDecoder object function for the given encoding. */ + +PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( + const char *encoding, + const char *errors + ); + /* Get a StreamReader factory function for the given encoding. */ PyAPI_FUNC(PyObject *) PyCodec_StreamReader( Modified: python/trunk/Lib/codecs.py ============================================================================== --- python/trunk/Lib/codecs.py (original) +++ python/trunk/Lib/codecs.py Wed Mar 15 12:35:15 2006 @@ -73,6 +73,23 @@ ### Codec base classes (defining the API) +class CodecInfo(tuple): + + def __new__(cls, encode, decode, streamreader=None, streamwriter=None, + incrementalencoder=None, incrementaldecoder=None, name=None): + self = tuple.__new__(cls, (encode, decode, streamreader, streamwriter)) + self.name = name + self.encode = encode + self.decode = decode + self.incrementalencoder = incrementalencoder + self.incrementaldecoder = incrementaldecoder + self.streamwriter = streamwriter + self.streamreader = streamreader + return self + + def __repr__(self): + return "<%s.%s object for encoding %s at 0x%x>" % (self.__class__.__module__, self.__class__.__name__, self.name, id(self)) + class Codec: """ Defines the interface for stateless encoders/decoders. @@ -137,6 +154,88 @@ """ raise NotImplementedError +class IncrementalEncoder(object): + """ + A IncrementalEncoder encodes an input in multiple steps. The input can be + passed piece by piece to the encode() method. The IncrementalEncoder remembers + the state of the Encoding process between calls to encode(). + """ + def __init__(self, errors='strict'): + """ + Creates a IncrementalEncoder instance. + + The IncrementalEncoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + self.buffer = "" + + def encode(self, input, final=False): + """ + Encodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the encoder to the initial state. + """ + +class IncrementalDecoder(object): + """ + An IncrementalDecoder decodes an input in multiple steps. The input can be + passed piece by piece to the decode() method. The IncrementalDecoder + remembers the state of the decoding process between calls to decode(). + """ + def __init__(self, errors='strict'): + """ + Creates a IncrementalDecoder instance. + + The IncrementalDecoder may use different error handling schemes by + providing the errors keyword argument. See the module docstring + for a list of possible values. + """ + self.errors = errors + + def decode(self, input, final=False): + """ + Decodes input and returns the resulting object. + """ + raise NotImplementedError + + def reset(self): + """ + Resets the decoder to the initial state. + """ + +class BufferedIncrementalDecoder(IncrementalDecoder): + """ + This subclass of IncrementalDecoder can be used as the baseclass for an + incremental decoder if the decoder must be able to handle incomplete byte + sequences. + """ + def __init__(self, errors='strict'): + IncrementalDecoder.__init__(self, errors) + self.buffer = "" # undecoded input that is kept between calls to decode() + + def _buffer_decode(self, input, errors, final): + # Overwrite this method in subclasses: It must decode input + # and return an (output, length consumed) tuple + raise NotImplementedError + + def decode(self, input, final=False): + # decode input (taking the buffer into account) + data = self.buffer + input + (result, consumed) = self._buffer_decode(data, self.errors, final) + # keep undecoded input until the next call + self.buffer = data[consumed:] + return result + + def reset(self): + IncrementalDecoder.reset(self) + self.bytebuffer = "" + # # The StreamWriter and StreamReader class provide generic working # interfaces which can be used to implement new encoding submodules @@ -666,8 +765,8 @@ file = __builtin__.open(filename, mode, buffering) if encoding is None: return file - (e, d, sr, sw) = lookup(encoding) - srw = StreamReaderWriter(file, sr, sw, errors) + info = lookup(encoding) + srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors) # Add attributes to simplify introspection srw.encoding = encoding return srw @@ -699,11 +798,9 @@ """ if file_encoding is None: file_encoding = data_encoding - encode, decode = lookup(data_encoding)[:2] - Reader, Writer = lookup(file_encoding)[2:] - sr = StreamRecoder(file, - encode, decode, Reader, Writer, - errors) + info = lookup(data_encoding) + sr = StreamRecoder(file, info.encode, info.decode, + info.streamreader, info.streamwriter, errors) # Add attributes to simplify introspection sr.data_encoding = data_encoding sr.file_encoding = file_encoding @@ -719,7 +816,7 @@ Raises a LookupError in case the encoding cannot be found. """ - return lookup(encoding)[0] + return lookup(encoding).encode def getdecoder(encoding): @@ -729,7 +826,35 @@ Raises a LookupError in case the encoding cannot be found. """ - return lookup(encoding)[1] + return lookup(encoding).decode + +def getincrementalencoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalEncoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental encoder. + + """ + encoder = lookup(encoding).incrementalencoder + if encoder is None: + raise LookupError(encoding) + return encoder + +def getincrementaldecoder(encoding): + + """ Lookup up the codec for the given encoding and return + its IncrementalDecoder class or factory function. + + Raises a LookupError in case the encoding cannot be found + or the codecs doesn't provide an incremental decoder. + + """ + decoder = lookup(encoding).incrementaldecoder + if decoder is None: + raise LookupError(encoding) + return decoder def getreader(encoding): @@ -739,7 +864,7 @@ Raises a LookupError in case the encoding cannot be found. """ - return lookup(encoding)[2] + return lookup(encoding).streamreader def getwriter(encoding): @@ -749,7 +874,43 @@ Raises a LookupError in case the encoding cannot be found. """ - return lookup(encoding)[3] + return lookup(encoding).streamwriter + +def iterencode(iterator, encoding, errors='strict', **kwargs): + """ + Encoding iterator. + + Encodes the input strings from the iterator using a IncrementalEncoder. + + errors and kwargs are passed through to the IncrementalEncoder + constructor. + """ + encoder = getincrementalencoder(encoding)(errors, **kwargs) + for input in iterator: + output = encoder.encode(input) + if output: + yield output + output = encoder.encode("", True) + if output: + yield output + +def iterdecode(iterator, encoding, errors='strict', **kwargs): + """ + Decoding iterator. + + Decodes the input strings from the iterator using a IncrementalDecoder. + + errors and kwargs are passed through to the IncrementalDecoder + constructor. + """ + decoder = getincrementaldecoder(encoding)(errors, **kwargs) + for input in iterator: + output = decoder.decode(input) + if output: + yield output + output = decoder.decode("", True) + if output: + yield output ### Helpers for charmap-based codecs Modified: python/trunk/Lib/encodings/__init__.py ============================================================================== --- python/trunk/Lib/encodings/__init__.py (original) +++ python/trunk/Lib/encodings/__init__.py Wed Mar 15 12:35:15 2006 @@ -9,9 +9,10 @@ Each codec module must export the following interface: - * getregentry() -> (encoder, decoder, stream_reader, stream_writer) - The getregentry() API must return callable objects which adhere to - the Python Codec Interface Standard. + * getregentry() -> codecs.CodecInfo object + The getregentry() API must a CodecInfo object with encoder, decoder, + incrementalencoder, incrementaldecoder, streamwriter and streamreader + atttributes which adhere to the Python Codec Interface Standard. In addition, a module may optionally also define the following APIs which are then used by the package's codec search function: @@ -113,16 +114,24 @@ return None # Now ask the module for the registry entry - entry = tuple(getregentry()) - if len(entry) != 4: - raise CodecRegistryError,\ - 'module "%s" (%s) failed to register' % \ - (mod.__name__, mod.__file__) - for obj in entry: - if not callable(obj): + entry = getregentry() + if not isinstance(entry, codecs.CodecInfo): + if not 4 <= len(entry) <= 7: + raise CodecRegistryError,\ + 'module "%s" (%s) failed to register' % \ + (mod.__name__, mod.__file__) + if not callable(entry[0]) or \ + not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): raise CodecRegistryError,\ - 'incompatible codecs in module "%s" (%s)' % \ - (mod.__name__, mod.__file__) + 'incompatible codecs in module "%s" (%s)' % \ + (mod.__name__, mod.__file__) + if len(entry)<7 or entry[6] is None: + entry += (None,)*(6-len(entry)) + (mod.__name__.split(".", 1)[1],) + entry = codecs.CodecInfo(*entry) # Cache the codec registry entry _cache[encoding] = entry Modified: python/trunk/Lib/encodings/ascii.py ============================================================================== --- python/trunk/Lib/encodings/ascii.py (original) +++ python/trunk/Lib/encodings/ascii.py Wed Mar 15 12:35:15 2006 @@ -17,6 +17,14 @@ encode = codecs.ascii_encode decode = codecs.ascii_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.ascii_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.ascii_decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -31,5 +39,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='ascii', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/base64_codec.py ============================================================================== --- python/trunk/Lib/encodings/base64_codec.py (original) +++ python/trunk/Lib/encodings/base64_codec.py Wed Mar 15 12:35:15 2006 @@ -49,6 +49,16 @@ def decode(self, input,errors='strict'): return base64_decode(input,errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return base64.encodestring(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return base64.decodestring(input) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -58,5 +68,12 @@ ### encodings module API def getregentry(): - - return (base64_encode,base64_decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='base64', + encode=base64_encode, + decode=base64_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/bz2_codec.py ============================================================================== --- python/trunk/Lib/encodings/bz2_codec.py (original) +++ python/trunk/Lib/encodings/bz2_codec.py Wed Mar 15 12:35:15 2006 @@ -51,6 +51,16 @@ def decode(self, input, errors='strict'): return bz2_decode(input, errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return bz2.compress(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return bz2.decompress(input) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -60,5 +70,12 @@ ### encodings module API def getregentry(): - - return (bz2_encode,bz2_decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name="bz2", + encode=bz2_encode, + decode=bz2_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/charmap.py ============================================================================== --- python/trunk/Lib/encodings/charmap.py (original) +++ python/trunk/Lib/encodings/charmap.py Wed Mar 15 12:35:15 2006 @@ -21,30 +21,49 @@ encode = codecs.charmap_encode decode = codecs.charmap_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalEncoder.__init__(self, errors) + self.mapping = mapping + + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, self.mapping)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def __init__(self, errors='strict', mapping=None): + codecs.IncrementalDecoder.__init__(self, errors) + self.mapping = mapping + + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, self.mapping)[0] + class StreamWriter(Codec,codecs.StreamWriter): def __init__(self,stream,errors='strict',mapping=None): - codecs.StreamWriter.__init__(self,stream,errors) self.mapping = mapping def encode(self,input,errors='strict'): - return Codec.encode(input,errors,self.mapping) class StreamReader(Codec,codecs.StreamReader): def __init__(self,stream,errors='strict',mapping=None): - codecs.StreamReader.__init__(self,stream,errors) self.mapping = mapping def decode(self,input,errors='strict'): - return Codec.decode(input,errors,self.mapping) ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='charmap', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/cp037.py ============================================================================== --- python/trunk/Lib/encodings/cp037.py (original) +++ python/trunk/Lib/encodings/cp037.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py. +""" Python Character Mapping Codec cp037 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP037.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp037', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } + Modified: python/trunk/Lib/encodings/cp1006.py ============================================================================== --- python/trunk/Lib/encodings/cp1006.py (original) +++ python/trunk/Lib/encodings/cp1006.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1006 generated from 'MAPPINGS/VENDORS/MISC/CP1006.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1006', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -549,3 +562,4 @@ 0xFEF2: 0xFA, # ARABIC LETTER YEH FINAL FORM 0xFEF3: 0xFB, # ARABIC LETTER YEH INITIAL FORM } + Modified: python/trunk/Lib/encodings/cp1026.py ============================================================================== --- python/trunk/Lib/encodings/cp1026.py (original) +++ python/trunk/Lib/encodings/cp1026.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1026 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP1026.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1026', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x015E: 0x7C, # LATIN CAPITAL LETTER S WITH CEDILLA 0x015F: 0x6A, # LATIN SMALL LETTER S WITH CEDILLA } + Modified: python/trunk/Lib/encodings/cp1140.py ============================================================================== --- python/trunk/Lib/encodings/cp1140.py (original) +++ python/trunk/Lib/encodings/cp1140.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'python-mappings/CP1140.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1140 generated from 'python-mappings/CP1140.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1140', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS 0x20AC: 0x9F, # EURO SIGN } + Modified: python/trunk/Lib/encodings/cp1250.py ============================================================================== --- python/trunk/Lib/encodings/cp1250.py (original) +++ python/trunk/Lib/encodings/cp1250.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1250 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1250', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -545,3 +558,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1251.py ============================================================================== --- python/trunk/Lib/encodings/cp1251.py (original) +++ python/trunk/Lib/encodings/cp1251.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1251 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1251', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -549,3 +562,4 @@ 0x2116: 0xB9, # NUMERO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1252.py ============================================================================== --- python/trunk/Lib/encodings/cp1252.py (original) +++ python/trunk/Lib/encodings/cp1252.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1252', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -545,3 +558,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1253.py ============================================================================== --- python/trunk/Lib/encodings/cp1253.py (original) +++ python/trunk/Lib/encodings/cp1253.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1253 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1253', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -533,3 +546,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1254.py ============================================================================== --- python/trunk/Lib/encodings/cp1254.py (original) +++ python/trunk/Lib/encodings/cp1254.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1254 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1254', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -543,3 +556,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1255.py ============================================================================== --- python/trunk/Lib/encodings/cp1255.py (original) +++ python/trunk/Lib/encodings/cp1255.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1255 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1255', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -527,3 +540,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1256.py ============================================================================== --- python/trunk/Lib/encodings/cp1256.py (original) +++ python/trunk/Lib/encodings/cp1256.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1256 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1256', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1257.py ============================================================================== --- python/trunk/Lib/encodings/cp1257.py (original) +++ python/trunk/Lib/encodings/cp1257.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1257 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1257', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -538,3 +551,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp1258.py ============================================================================== --- python/trunk/Lib/encodings/cp1258.py (original) +++ python/trunk/Lib/encodings/cp1258.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT' with gencodec.py. +""" Python Character Mapping Codec cp1258 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp1258', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -541,3 +554,4 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } + Modified: python/trunk/Lib/encodings/cp424.py ============================================================================== --- python/trunk/Lib/encodings/cp424.py (original) +++ python/trunk/Lib/encodings/cp424.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MISC/CP424.TXT' with gencodec.py. +""" Python Character Mapping Codec cp424 generated from 'MAPPINGS/VENDORS/MISC/CP424.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp424', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -512,3 +525,4 @@ 0x05EA: 0x71, # HEBREW LETTER TAV 0x2017: 0x78, # DOUBLE LOW LINE } + Modified: python/trunk/Lib/encodings/cp437.py ============================================================================== --- python/trunk/Lib/encodings/cp437.py (original) +++ python/trunk/Lib/encodings/cp437.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP437.TXT' with gencodec.py. +""" Python Character Mapping Codec cp437 generated from 'VENDORS/MICSFT/PC/CP437.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp437', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp500.py ============================================================================== --- python/trunk/Lib/encodings/cp500.py (original) +++ python/trunk/Lib/encodings/cp500.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP500.TXT' with gencodec.py. +""" Python Character Mapping Codec cp500 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP500.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp500', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } + Modified: python/trunk/Lib/encodings/cp737.py ============================================================================== --- python/trunk/Lib/encodings/cp737.py (original) +++ python/trunk/Lib/encodings/cp737.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP737.TXT' with gencodec.py. +""" Python Character Mapping Codec cp737 generated from 'VENDORS/MICSFT/PC/CP737.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp737', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp775.py ============================================================================== --- python/trunk/Lib/encodings/cp775.py (original) +++ python/trunk/Lib/encodings/cp775.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'VENDORS/MICSFT/PC/CP775.TXT' with gencodec.py. +""" Python Character Mapping Codec cp775 generated from 'VENDORS/MICSFT/PC/CP775.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,9 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) - + return codecs.CodecInfo( + name='cp775', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map decoding_map = codecs.make_identity_dict(range(256)) Modified: python/trunk/Lib/encodings/cp850.py ============================================================================== --- python/trunk/Lib/encodings/cp850.py (original) +++ python/trunk/Lib/encodings/cp850.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp850', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp852.py ============================================================================== --- python/trunk/Lib/encodings/cp852.py (original) +++ python/trunk/Lib/encodings/cp852.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp852', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp855.py ============================================================================== --- python/trunk/Lib/encodings/cp855.py (original) +++ python/trunk/Lib/encodings/cp855.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp855', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp856.py ============================================================================== --- python/trunk/Lib/encodings/cp856.py (original) +++ python/trunk/Lib/encodings/cp856.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MISC/CP856.TXT' with gencodec.py. +""" Python Character Mapping Codec cp856 generated from 'MAPPINGS/VENDORS/MISC/CP856.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp856', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -509,3 +522,4 @@ 0x2593: 0xB2, # DARK SHADE 0x25A0: 0xFE, # BLACK SQUARE } + Modified: python/trunk/Lib/encodings/cp857.py ============================================================================== --- python/trunk/Lib/encodings/cp857.py (original) +++ python/trunk/Lib/encodings/cp857.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp857', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp860.py ============================================================================== --- python/trunk/Lib/encodings/cp860.py (original) +++ python/trunk/Lib/encodings/cp860.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp860', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp861.py ============================================================================== --- python/trunk/Lib/encodings/cp861.py (original) +++ python/trunk/Lib/encodings/cp861.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp861', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp862.py ============================================================================== --- python/trunk/Lib/encodings/cp862.py (original) +++ python/trunk/Lib/encodings/cp862.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp862', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp863.py ============================================================================== --- python/trunk/Lib/encodings/cp863.py (original) +++ python/trunk/Lib/encodings/cp863.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp863', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp864.py ============================================================================== --- python/trunk/Lib/encodings/cp864.py (original) +++ python/trunk/Lib/encodings/cp864.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp864', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp865.py ============================================================================== --- python/trunk/Lib/encodings/cp865.py (original) +++ python/trunk/Lib/encodings/cp865.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp865', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp866.py ============================================================================== --- python/trunk/Lib/encodings/cp866.py (original) +++ python/trunk/Lib/encodings/cp866.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp866', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp869.py ============================================================================== --- python/trunk/Lib/encodings/cp869.py (original) +++ python/trunk/Lib/encodings/cp869.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp869', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/cp874.py ============================================================================== --- python/trunk/Lib/encodings/cp874.py (original) +++ python/trunk/Lib/encodings/cp874.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT' with gencodec.py. +""" Python Character Mapping Codec cp874 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp874', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -519,3 +532,4 @@ 0x2026: 0x85, # HORIZONTAL ELLIPSIS 0x20AC: 0x80, # EURO SIGN } + Modified: python/trunk/Lib/encodings/cp875.py ============================================================================== --- python/trunk/Lib/encodings/cp875.py (original) +++ python/trunk/Lib/encodings/cp875.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP875.TXT' with gencodec.py. +""" Python Character Mapping Codec cp875 generated from 'MAPPINGS/VENDORS/MICSFT/EBCDIC/CP875.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='cp875', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -544,3 +557,4 @@ 0x2018: 0xCE, # LEFT SINGLE QUOTATION MARK 0x2019: 0xDE, # RIGHT SINGLE QUOTATION MARK } + Modified: python/trunk/Lib/encodings/hex_codec.py ============================================================================== --- python/trunk/Lib/encodings/hex_codec.py (original) +++ python/trunk/Lib/encodings/hex_codec.py Wed Mar 15 12:35:15 2006 @@ -49,6 +49,16 @@ def decode(self, input,errors='strict'): return hex_decode(input,errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return binascii.b2a_hex(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return binascii.a2b_hex(input) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -58,5 +68,12 @@ ### encodings module API def getregentry(): - - return (hex_encode,hex_decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='hex', + encode=hex_encode, + decode=hex_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/hp_roman8.py ============================================================================== --- python/trunk/Lib/encodings/hp_roman8.py (original) +++ python/trunk/Lib/encodings/hp_roman8.py Wed Mar 15 12:35:15 2006 @@ -14,13 +14,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -30,8 +36,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='hp-roman8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/idna.py ============================================================================== --- python/trunk/Lib/encodings/idna.py (original) +++ python/trunk/Lib/encodings/idna.py Wed Mar 15 12:35:15 2006 @@ -194,6 +194,14 @@ return u".".join(result)+trailing_dot, len(input) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return Codec().encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return Codec().decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -203,5 +211,12 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/iso8859_1.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_1.py (original) +++ python/trunk/Lib/encodings/iso8859_1.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-1.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_1 generated from 'MAPPINGS/ISO8859/8859-1.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS } + Modified: python/trunk/Lib/encodings/iso8859_10.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_10.py (original) +++ python/trunk/Lib/encodings/iso8859_10.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-10.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_10 generated from 'MAPPINGS/ISO8859/8859-10.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-10', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x017E: 0xBC, # LATIN SMALL LETTER Z WITH CARON 0x2015: 0xBD, # HORIZONTAL BAR } + Modified: python/trunk/Lib/encodings/iso8859_11.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_11.py (original) +++ python/trunk/Lib/encodings/iso8859_11.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-11.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_11 generated from 'MAPPINGS/ISO8859/8859-11.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-11', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -542,3 +555,4 @@ 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } + Modified: python/trunk/Lib/encodings/iso8859_13.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_13.py (original) +++ python/trunk/Lib/encodings/iso8859_13.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-13.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_13 generated from 'MAPPINGS/ISO8859/8859-13.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x201D: 0xA1, # RIGHT DOUBLE QUOTATION MARK 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK } + Modified: python/trunk/Lib/encodings/iso8859_14.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_14.py (original) +++ python/trunk/Lib/encodings/iso8859_14.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-14.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_14 generated from 'MAPPINGS/ISO8859/8859-14.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-14', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x1EF2: 0xAC, # LATIN CAPITAL LETTER Y WITH GRAVE 0x1EF3: 0xBC, # LATIN SMALL LETTER Y WITH GRAVE } + Modified: python/trunk/Lib/encodings/iso8859_15.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_15.py (original) +++ python/trunk/Lib/encodings/iso8859_15.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-15.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_15 generated from 'MAPPINGS/ISO8859/8859-15.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-15', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON 0x20AC: 0xA4, # EURO SIGN } + Modified: python/trunk/Lib/encodings/iso8859_16.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_16.py (original) +++ python/trunk/Lib/encodings/iso8859_16.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-16.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_16 generated from 'MAPPINGS/ISO8859/8859-16.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-16', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK 0x20AC: 0xA4, # EURO SIGN } + Modified: python/trunk/Lib/encodings/iso8859_2.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_2.py (original) +++ python/trunk/Lib/encodings/iso8859_2.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-2.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_2 generated from 'MAPPINGS/ISO8859/8859-2.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x02DB: 0xB2, # OGONEK 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT } + Modified: python/trunk/Lib/encodings/iso8859_3.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_3.py (original) +++ python/trunk/Lib/encodings/iso8859_3.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-3.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_3 generated from 'MAPPINGS/ISO8859/8859-3.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-3', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -543,3 +556,4 @@ 0x02D8: 0xA2, # BREVE 0x02D9: 0xFF, # DOT ABOVE } + Modified: python/trunk/Lib/encodings/iso8859_4.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_4.py (original) +++ python/trunk/Lib/encodings/iso8859_4.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-4.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_4 generated from 'MAPPINGS/ISO8859/8859-4.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-4', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x02D9: 0xFF, # DOT ABOVE 0x02DB: 0xB2, # OGONEK } + Modified: python/trunk/Lib/encodings/iso8859_5.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_5.py (original) +++ python/trunk/Lib/encodings/iso8859_5.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-5.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_5 generated from 'MAPPINGS/ISO8859/8859-5.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-5', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x045F: 0xFF, # CYRILLIC SMALL LETTER DZHE 0x2116: 0xF0, # NUMERO SIGN } + Modified: python/trunk/Lib/encodings/iso8859_6.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_6.py (original) +++ python/trunk/Lib/encodings/iso8859_6.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-6.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_6 generated from 'MAPPINGS/ISO8859/8859-6.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-6', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -505,3 +518,4 @@ 0x0651: 0xF1, # ARABIC SHADDA 0x0652: 0xF2, # ARABIC SUKUN } + Modified: python/trunk/Lib/encodings/iso8859_7.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_7.py (original) +++ python/trunk/Lib/encodings/iso8859_7.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-7.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_7 generated from 'MAPPINGS/ISO8859/8859-7.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-7', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -547,3 +560,4 @@ 0x20AC: 0xA4, # EURO SIGN 0x20AF: 0xA5, # DRACHMA SIGN } + Modified: python/trunk/Lib/encodings/iso8859_8.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_8.py (original) +++ python/trunk/Lib/encodings/iso8859_8.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-8.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_8 generated from 'MAPPINGS/ISO8859/8859-8.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-8', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -514,3 +527,4 @@ 0x200F: 0xFE, # RIGHT-TO-LEFT MARK 0x2017: 0xDF, # DOUBLE LOW LINE } + Modified: python/trunk/Lib/encodings/iso8859_9.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_9.py (original) +++ python/trunk/Lib/encodings/iso8859_9.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/ISO8859/8859-9.TXT' with gencodec.py. +""" Python Character Mapping Codec iso8859_9 generated from 'MAPPINGS/ISO8859/8859-9.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='iso8859-9', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA } + Modified: python/trunk/Lib/encodings/koi8_r.py ============================================================================== --- python/trunk/Lib/encodings/koi8_r.py (original) +++ python/trunk/Lib/encodings/koi8_r.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.TXT' with gencodec.py. +""" Python Character Mapping Codec koi8_r generated from 'MAPPINGS/VENDORS/MISC/KOI8-R.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='koi8-r', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2593: 0x92, # DARK SHADE 0x25A0: 0x94, # BLACK SQUARE } + Modified: python/trunk/Lib/encodings/koi8_u.py ============================================================================== --- python/trunk/Lib/encodings/koi8_u.py (original) +++ python/trunk/Lib/encodings/koi8_u.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. +""" Python Character Mapping Codec koi8_u generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='koi8-u', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2593: 0x92, # DARK SHADE 0x25A0: 0x94, # BLACK SQUARE } + Modified: python/trunk/Lib/encodings/latin_1.py ============================================================================== --- python/trunk/Lib/encodings/latin_1.py (original) +++ python/trunk/Lib/encodings/latin_1.py Wed Mar 15 12:35:15 2006 @@ -17,6 +17,14 @@ encode = codecs.latin_1_encode decode = codecs.latin_1_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.latin_1_encode(input,self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.latin_1_decode(input,self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -31,5 +39,13 @@ ### encodings module API def getregentry(): + return codecs.CodecInfo( + name='iso8859-1', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) Modified: python/trunk/Lib/encodings/mac_arabic.py ============================================================================== --- python/trunk/Lib/encodings/mac_arabic.py (original) +++ python/trunk/Lib/encodings/mac_arabic.py Wed Mar 15 12:35:15 2006 @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-arabic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/mac_centeuro.py ============================================================================== --- python/trunk/Lib/encodings/mac_centeuro.py (original) +++ python/trunk/Lib/encodings/mac_centeuro.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-centeuro', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO 0x25CA: 0xD7, # LOZENGE } + Modified: python/trunk/Lib/encodings/mac_croatian.py ============================================================================== --- python/trunk/Lib/encodings/mac_croatian.py (original) +++ python/trunk/Lib/encodings/mac_croatian.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_croatian generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-croatian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xD8, # Apple logo } + Modified: python/trunk/Lib/encodings/mac_cyrillic.py ============================================================================== --- python/trunk/Lib/encodings/mac_cyrillic.py (original) +++ python/trunk/Lib/encodings/mac_cyrillic.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_cyrillic generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-cyrillic', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2264: 0xB2, # LESS-THAN OR EQUAL TO 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } + Modified: python/trunk/Lib/encodings/mac_farsi.py ============================================================================== --- python/trunk/Lib/encodings/mac_farsi.py (original) +++ python/trunk/Lib/encodings/mac_farsi.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_farsi generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-farsi', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2026: 0x93, # HORIZONTAL ELLIPSIS, right-left 0x274A: 0xC0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left } + Modified: python/trunk/Lib/encodings/mac_greek.py ============================================================================== --- python/trunk/Lib/encodings/mac_greek.py (original) +++ python/trunk/Lib/encodings/mac_greek.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/GREEK.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_greek generated from 'MAPPINGS/VENDORS/APPLE/GREEK.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-greek', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x2264: 0xB2, # LESS-THAN OR EQUAL TO 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } + Modified: python/trunk/Lib/encodings/mac_iceland.py ============================================================================== --- python/trunk/Lib/encodings/mac_iceland.py (original) +++ python/trunk/Lib/encodings/mac_iceland.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_iceland generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-iceland', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xF0, # Apple logo } + Modified: python/trunk/Lib/encodings/mac_latin2.py ============================================================================== --- python/trunk/Lib/encodings/mac_latin2.py (original) +++ python/trunk/Lib/encodings/mac_latin2.py Wed Mar 15 12:35:15 2006 @@ -14,13 +14,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -30,8 +36,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-latin2', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/mac_roman.py ============================================================================== --- python/trunk/Lib/encodings/mac_roman.py (original) +++ python/trunk/Lib/encodings/mac_roman.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/ROMAN.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_roman generated from 'MAPPINGS/VENDORS/APPLE/ROMAN.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-roman', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0xFB01: 0xDE, # LATIN SMALL LIGATURE FI 0xFB02: 0xDF, # LATIN SMALL LIGATURE FL } + Modified: python/trunk/Lib/encodings/mac_romanian.py ============================================================================== --- python/trunk/Lib/encodings/mac_romanian.py (original) +++ python/trunk/Lib/encodings/mac_romanian.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_romanian generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-romanian', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xF0, # Apple logo } + Modified: python/trunk/Lib/encodings/mac_turkish.py ============================================================================== --- python/trunk/Lib/encodings/mac_turkish.py (original) +++ python/trunk/Lib/encodings/mac_turkish.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'MAPPINGS/VENDORS/APPLE/TURKISH.TXT' with gencodec.py. +""" Python Character Mapping Codec mac_turkish generated from 'MAPPINGS/VENDORS/APPLE/TURKISH.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mac-turkish', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -550,3 +563,4 @@ 0xF8A0: 0xF5, # undefined1 0xF8FF: 0xF0, # Apple logo } + Modified: python/trunk/Lib/encodings/mbcs.py ============================================================================== --- python/trunk/Lib/encodings/mbcs.py (original) +++ python/trunk/Lib/encodings/mbcs.py Wed Mar 15 12:35:15 2006 @@ -18,6 +18,13 @@ encode = codecs.mbcs_encode decode = codecs.mbcs_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.mbs_encode(input,self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.mbs_decode(input,self.errors)[0] class StreamWriter(Codec,codecs.StreamWriter): pass @@ -32,5 +39,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='mbcs', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/palmos.py ============================================================================== --- python/trunk/Lib/encodings/palmos.py (original) +++ python/trunk/Lib/encodings/palmos.py Wed Mar 15 12:35:15 2006 @@ -15,6 +15,14 @@ def decode(self,input,errors='strict'): return codecs.charmap_decode(input,errors,decoding_map) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -24,7 +32,15 @@ ### encodings module API def getregentry(): - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='palmos', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/ptcp154.py ============================================================================== --- python/trunk/Lib/encodings/ptcp154.py (original) +++ python/trunk/Lib/encodings/ptcp154.py Wed Mar 15 12:35:15 2006 @@ -14,13 +14,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -30,8 +36,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='ptcp154', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/punycode.py ============================================================================== --- python/trunk/Lib/encodings/punycode.py (original) +++ python/trunk/Lib/encodings/punycode.py Wed Mar 15 12:35:15 2006 @@ -197,18 +197,27 @@ ### Codec APIs class Codec(codecs.Codec): - def encode(self,input,errors='strict'): + def encode(self,input,errors='strict'): res = punycode_encode(input) return res, len(input) def decode(self,input,errors='strict'): - if errors not in ('strict', 'replace', 'ignore'): raise UnicodeError, "Unsupported error handling "+errors res = punycode_decode(input, errors) return res, len(input) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return punycode_encode(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + if errors not in ('strict', 'replace', 'ignore'): + raise UnicodeError, "Unsupported error handling "+errors + return punycode_decode(input, errors) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -218,5 +227,12 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='punycode', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/quopri_codec.py ============================================================================== --- python/trunk/Lib/encodings/quopri_codec.py (original) +++ python/trunk/Lib/encodings/quopri_codec.py Wed Mar 15 12:35:15 2006 @@ -46,6 +46,14 @@ def decode(self, input,errors='strict'): return quopri_decode(input,errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return quopri_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return quopri_decode(input, self.errors)[0] + class StreamWriter(Codec, codecs.StreamWriter): pass @@ -55,4 +63,12 @@ # encodings module API def getregentry(): - return (quopri_encode, quopri_decode, StreamReader, StreamWriter) + return codecs.CodecInfo( + name='quopri', + encode=quopri_encode, + decode=quopri_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/raw_unicode_escape.py ============================================================================== --- python/trunk/Lib/encodings/raw_unicode_escape.py (original) +++ python/trunk/Lib/encodings/raw_unicode_escape.py Wed Mar 15 12:35:15 2006 @@ -17,6 +17,14 @@ encode = codecs.raw_unicode_escape_encode decode = codecs.raw_unicode_escape_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.raw_unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.raw_unicode_escape_decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -26,5 +34,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='raw-unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/rot_13.py ============================================================================== --- python/trunk/Lib/encodings/rot_13.py (original) +++ python/trunk/Lib/encodings/rot_13.py Wed Mar 15 12:35:15 2006 @@ -14,13 +14,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_map)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -30,8 +36,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='rot-13', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) ### Decoding Map Modified: python/trunk/Lib/encodings/string_escape.py ============================================================================== --- python/trunk/Lib/encodings/string_escape.py (original) +++ python/trunk/Lib/encodings/string_escape.py Wed Mar 15 12:35:15 2006 @@ -12,6 +12,14 @@ encode = codecs.escape_encode decode = codecs.escape_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.escape_decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -19,5 +27,12 @@ pass def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='string-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/tis_620.py ============================================================================== --- python/trunk/Lib/encodings/tis_620.py (original) +++ python/trunk/Lib/encodings/tis_620.py Wed Mar 15 12:35:15 2006 @@ -1,4 +1,4 @@ -""" Python Character Mapping Codec generated from 'python-mappings/TIS-620.TXT' with gencodec.py. +""" Python Character Mapping Codec tis_620 generated from 'python-mappings/TIS-620.TXT' with gencodec.py. """#" @@ -9,13 +9,19 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input,self.errors,decoding_table)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -25,8 +31,15 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='tis-620', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) ### Decoding Table @@ -541,3 +554,4 @@ 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } + Modified: python/trunk/Lib/encodings/undefined.py ============================================================================== --- python/trunk/Lib/encodings/undefined.py (original) +++ python/trunk/Lib/encodings/undefined.py Wed Mar 15 12:35:15 2006 @@ -16,10 +16,18 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - raise UnicodeError, "undefined encoding" + raise UnicodeError("undefined encoding") def decode(self,input,errors='strict'): - raise UnicodeError, "undefined encoding" + raise UnicodeError("undefined encoding") + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + raise UnicodeError("undefined encoding") + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + raise UnicodeError("undefined encoding") class StreamWriter(Codec,codecs.StreamWriter): pass @@ -30,5 +38,12 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='undefined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/unicode_escape.py ============================================================================== --- python/trunk/Lib/encodings/unicode_escape.py (original) +++ python/trunk/Lib/encodings/unicode_escape.py Wed Mar 15 12:35:15 2006 @@ -17,6 +17,14 @@ encode = codecs.unicode_escape_encode decode = codecs.unicode_escape_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_escape_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_escape_decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -26,5 +34,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='unicode-escape', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/unicode_internal.py ============================================================================== --- python/trunk/Lib/encodings/unicode_internal.py (original) +++ python/trunk/Lib/encodings/unicode_internal.py Wed Mar 15 12:35:15 2006 @@ -17,6 +17,14 @@ encode = codecs.unicode_internal_encode decode = codecs.unicode_internal_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.unicode_internal_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.unicode_internal_decode(input, self.errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -26,5 +34,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='unicode-internal', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) Modified: python/trunk/Lib/encodings/utf_16.py ============================================================================== --- python/trunk/Lib/encodings/utf_16.py (original) +++ python/trunk/Lib/encodings/utf_16.py Wed Mar 15 12:35:15 2006 @@ -15,6 +15,47 @@ def decode(input, errors='strict'): return codecs.utf_16_decode(input, errors, True) +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.encoder = None + + def encode(self, input, final=False): + if self.encoder is None: + result = codecs.utf_16_encode(input, self.errors)[0] + if sys.byteorder == 'little': + self.encoder = codecs.utf_16_le_encode + else: + self.encoder = codecs.utf_16_be_encode + return result + return self.encoder(input, self.errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.encoder = None + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.decoder = None + + def _buffer_decode(self, input, errors, final): + if self.decoder is None: + (output, consumed, byteorder) = \ + codecs.utf_16_ex_decode(input, errors, 0, final) + if byteorder == -1: + self.decoder = codecs.utf_16_le_decode + elif byteorder == 1: + self.decoder = codecs.utf_16_be_decode + elif consumed >= 2: + raise UnicodeError("UTF-16 stream does not start with BOM") + return (output, consumed) + return self.decoder(input, self.errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.decoder = None + class StreamWriter(codecs.StreamWriter): def __init__(self, stream, errors='strict'): self.bom_written = False @@ -52,5 +93,12 @@ ### encodings module API def getregentry(): - - return (encode,decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-16', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/utf_16_be.py ============================================================================== --- python/trunk/Lib/encodings/utf_16_be.py (original) +++ python/trunk/Lib/encodings/utf_16_be.py Wed Mar 15 12:35:15 2006 @@ -15,6 +15,13 @@ def decode(input, errors='strict'): return codecs.utf_16_be_decode(input, errors, True) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_be_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_be_decode + class StreamWriter(codecs.StreamWriter): encode = codecs.utf_16_be_encode @@ -24,5 +31,12 @@ ### encodings module API def getregentry(): - - return (encode,decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-16-be', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/utf_16_le.py ============================================================================== --- python/trunk/Lib/encodings/utf_16_le.py (original) +++ python/trunk/Lib/encodings/utf_16_le.py Wed Mar 15 12:35:15 2006 @@ -15,15 +15,28 @@ def decode(input, errors='strict'): return codecs.utf_16_le_decode(input, errors, True) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_16_le_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_16_le_decode + class StreamWriter(codecs.StreamWriter): encode = codecs.utf_16_le_encode class StreamReader(codecs.StreamReader): decode = codecs.utf_16_le_decode - ### encodings module API def getregentry(): - - return (encode,decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-16-le', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/utf_7.py ============================================================================== --- python/trunk/Lib/encodings/utf_7.py (original) +++ python/trunk/Lib/encodings/utf_7.py Wed Mar 15 12:35:15 2006 @@ -13,6 +13,14 @@ encode = codecs.utf_7_encode decode = codecs.utf_7_decode +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_7_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, input, errors, final): + return codecs.utf_7_decode(input, self.errors) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -22,5 +30,12 @@ ### encodings module API def getregentry(): - - return (Codec.encode,Codec.decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-7', + encode=Codec.encode, + decode=Codec.decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) \ No newline at end of file Modified: python/trunk/Lib/encodings/utf_8.py ============================================================================== --- python/trunk/Lib/encodings/utf_8.py (original) +++ python/trunk/Lib/encodings/utf_8.py Wed Mar 15 12:35:15 2006 @@ -15,6 +15,13 @@ def decode(input, errors='strict'): return codecs.utf_8_decode(input, errors, True) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.utf_8_encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = codecs.utf_8_decode + class StreamWriter(codecs.StreamWriter): encode = codecs.utf_8_encode @@ -24,5 +31,12 @@ ### encodings module API def getregentry(): - - return (encode,decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-8', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/utf_8_sig.py ============================================================================== --- python/trunk/Lib/encodings/utf_8_sig.py (original) +++ python/trunk/Lib/encodings/utf_8_sig.py Wed Mar 15 12:35:15 2006 @@ -22,6 +22,42 @@ (output, consumed) = codecs.utf_8_decode(input, errors, True) return (output, consumed+prefix) +class IncrementalEncoder(codecs.IncrementalEncoder): + def __init__(self, errors='strict'): + codecs.IncrementalEncoder.__init__(self, errors) + self.first = True + + def encode(self, input, final=False): + if self.first: + self.first = False + return codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0] + else: + return codecs.utf_8_encode(input, errors)[0] + + def reset(self): + codecs.IncrementalEncoder.reset(self) + self.first = True + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def __init__(self, errors='strict'): + codecs.BufferedIncrementalDecoder.__init__(self, errors) + self.first = True + + def _buffer_decode(self, input, errors, final): + if self.first and codecs.BOM_UTF8.startswith(input): # might be a BOM + if len(input) < 3: + # not enough data to decide if this really is a BOM + # => try again on the next call + return (u"", 0) + (output, consumed) = codecs.utf_8_decode(input[3:], errors, final) + self.first = False + return (output, consumed+3) + return codecs.utf_8_decode(input, errors, final) + + def reset(self): + codecs.BufferedIncrementalDecoder.reset(self) + self.first = True + class StreamWriter(codecs.StreamWriter): def reset(self): codecs.StreamWriter.reset(self) @@ -53,5 +89,12 @@ ### encodings module API def getregentry(): - - return (encode,decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='utf-8-sig', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/uu_codec.py ============================================================================== --- python/trunk/Lib/encodings/uu_codec.py (original) +++ python/trunk/Lib/encodings/uu_codec.py Wed Mar 15 12:35:15 2006 @@ -96,9 +96,18 @@ def encode(self,input,errors='strict'): return uu_encode(input,errors) + def decode(self,input,errors='strict'): return uu_decode(input,errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return uu_encode(input, errors)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return uu_decode(input, errors)[0] + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -108,5 +117,12 @@ ### encodings module API def getregentry(): - - return (uu_encode,uu_decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='uu', + encode=uu_encode, + decode=uu_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/encodings/zlib_codec.py ============================================================================== --- python/trunk/Lib/encodings/zlib_codec.py (original) +++ python/trunk/Lib/encodings/zlib_codec.py Wed Mar 15 12:35:15 2006 @@ -50,6 +50,16 @@ def decode(self, input, errors='strict'): return zlib_decode(input, errors) +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + assert self.errors == 'strict' + return zlib.compress(input) + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + assert self.errors == 'strict' + return zlib.decompress(input) + class StreamWriter(Codec,codecs.StreamWriter): pass @@ -59,5 +69,12 @@ ### encodings module API def getregentry(): - - return (zlib_encode,zlib_decode,StreamReader,StreamWriter) + return codecs.CodecInfo( + name='zlib', + encode=zlib_encode, + decode=zlib_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) Modified: python/trunk/Lib/test/test_codecs.py ============================================================================== --- python/trunk/Lib/test/test_codecs.py (original) +++ python/trunk/Lib/test/test_codecs.py Wed Mar 15 12:35:15 2006 @@ -41,6 +41,33 @@ self.assertEqual(r.bytebuffer, "") self.assertEqual(r.charbuffer, u"") + # do the check again, this time using a incremental decoder + d = codecs.getincrementaldecoder(self.encoding)() + result = u"" + for (c, partialresult) in zip(input.encode(self.encoding), partialresults): + result += d.decode(c) + self.assertEqual(result, partialresult) + # check that there's nothing left in the buffers + self.assertEqual(d.decode("", True), u"") + self.assertEqual(d.buffer, "") + + # Check whether the rest method works properly + d.reset() + result = u"" + for (c, partialresult) in zip(input.encode(self.encoding), partialresults): + result += d.decode(c) + self.assertEqual(result, partialresult) + # check that there's nothing left in the buffers + self.assertEqual(d.decode("", True), u"") + self.assertEqual(d.buffer, "") + + # check iterdecode() + encoded = input.encode(self.encoding) + self.assertEqual( + input, + u"".join(codecs.iterdecode(encoded, self.encoding)) + ) + def test_readline(self): def getreader(input): stream = StringIO.StringIO(input.encode(self.encoding)) @@ -977,6 +1004,12 @@ def test_basics(self): s = u"abc123" # all codecs should be able to encode these for encoding in all_unicode_encodings: + name = codecs.lookup(encoding).name + if encoding.endswith("_codec"): + name += "_codec" + elif encoding == "latin_1": + name = "latin_1" + self.assertEqual(encoding.replace("_", "-"), name.replace("_", "-")) (bytes, size) = codecs.getencoder(encoding)(s) if encoding != "unicode_internal": self.assertEqual(size, len(s), "%r != %r (encoding=%r)" % (size, len(s), encoding)) @@ -999,6 +1032,30 @@ decodedresult += reader.read() self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding)) + # check incremental decoder/encoder and iterencode()/iterdecode() + try: + encoder = codecs.getincrementalencoder(encoding)() + except LookupError: # no IncrementalEncoder + pass + else: + # check incremental decoder/encoder + encodedresult = "" + for c in s: + encodedresult += encoder.encode(c) + decoder = codecs.getincrementaldecoder(encoding)() + decodedresult = u"" + for c in encodedresult: + decodedresult += decoder.decode(c) + self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding)) + + # check iterencode()/iterdecode() + result = u"".join(codecs.iterdecode(codecs.iterencode(s, encoding), encoding)) + self.assertEqual(result, s, "%r != %r (encoding=%r)" % (result, s, encoding)) + + # check iterencode()/iterdecode() with empty string + result = u"".join(codecs.iterdecode(codecs.iterencode(u"", encoding), encoding)) + self.assertEqual(result, u"") + def test_seek(self): # all codecs should be able to encode these s = u"%s\n%s\n" % (100*u"abc123", 100*u"def456") Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 15 12:35:15 2006 @@ -443,6 +443,12 @@ Library ------- +- Patch #1436130: codecs.lookup() now returns a CodecInfo object (a subclass + of tuple) that provides incremental decoders and encoders (a way to use + stateful codecs without the stream API). Functions + codecs.getincrementaldecoder() and codecs.getincrementalencoder() have + been added. + - A regrtest option -w was added to re-run failed tests in verbose mode. - Patch #1446372: quit and exit can now be called from the interactive Modified: python/trunk/Python/codecs.c ============================================================================== --- python/trunk/Python/codecs.c (original) +++ python/trunk/Python/codecs.c Wed Mar 15 12:35:15 2006 @@ -260,6 +260,56 @@ return NULL; } +PyObject *PyCodec_IncrementalEncoder(const char *encoding, + const char *errors) +{ + PyObject *codecs, *ret, *encoder; + + codecs = _PyCodec_Lookup(encoding); + if (codecs == NULL) + goto onError; + encoder = PyObject_GetAttrString(codecs, "incrementalencoder"); + if (encoder == NULL) { + Py_DECREF(codecs); + return NULL; + } + if (errors) + ret = PyObject_CallFunction(encoder, "O", errors); + else + ret = PyObject_CallFunction(encoder, NULL); + Py_DECREF(encoder); + Py_DECREF(codecs); + return ret; + + onError: + return NULL; +} + +PyObject *PyCodec_IncrementalDecoder(const char *encoding, + const char *errors) +{ + PyObject *codecs, *ret, *decoder; + + codecs = _PyCodec_Lookup(encoding); + if (codecs == NULL) + goto onError; + decoder = PyObject_GetAttrString(codecs, "incrementaldecoder"); + if (decoder == NULL) { + Py_DECREF(codecs); + return NULL; + } + if (errors) + ret = PyObject_CallFunction(decoder, "O", errors); + else + ret = PyObject_CallFunction(decoder, NULL); + Py_DECREF(decoder); + Py_DECREF(codecs); + return ret; + + onError: + return NULL; +} + PyObject *PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors) Modified: python/trunk/Tools/unicode/Makefile ============================================================================== --- python/trunk/Tools/unicode/Makefile (original) +++ python/trunk/Tools/unicode/Makefile Wed Mar 15 12:35:15 2006 @@ -44,11 +44,11 @@ $(RM) -f build/readme.* iso: build/ - $(PYTHON) gencodec.py MAPPINGS/ISO8859/ build/iso + $(PYTHON) gencodec.py MAPPINGS/ISO8859/ build/ iso $(RM) -f build/isoreadme.* apple: build/ - $(PYTHON) gencodec.py MAPPINGS/VENDORS/APPLE/ build/mac_ + $(PYTHON) gencodec.py MAPPINGS/VENDORS/APPLE/ build/ mac_ $(RM) build/mac_dingbats.* $(RM) build/mac_japanese.* $(RM) build/mac_chin* Modified: python/trunk/Tools/unicode/gencodec.py ============================================================================== --- python/trunk/Tools/unicode/gencodec.py (original) +++ python/trunk/Tools/unicode/gencodec.py Wed Mar 15 12:35:15 2006 @@ -248,7 +248,7 @@ append(')') return l -def codegen(name, map, comments=1): +def codegen(name, map, encodingname, comments=1): """ Returns Python source for the given map. @@ -272,7 +272,7 @@ l = [ '''\ -""" Python Character Mapping Codec generated from '%s' with gencodec.py. +""" Python Character Mapping Codec %s generated from '%s' with gencodec.py. """#" @@ -283,11 +283,9 @@ class Codec(codecs.Codec): def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) - def decode(self,input,errors='strict'): -''' % name + def decode(self,input,errors='strict'):''' % (encodingname, name) ] if decoding_table_code: l.append('''\ @@ -297,6 +295,20 @@ return codecs.charmap_decode(input,errors,decoding_map)''') l.append(''' +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input,self.errors,encoding_map)[0] + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False):''') + if decoding_table_code: + l.append('''\ + return codecs.charmap_decode(input,self.errors,decoding_table)[0]''') + else: + l.append('''\ + return codecs.charmap_decode(input,self.errors,decoding_map)[0]''') + + l.append(''' class StreamWriter(Codec,codecs.StreamWriter): pass @@ -306,9 +318,16 @@ ### encodings module API def getregentry(): - - return (Codec().encode,Codec().decode,StreamReader,StreamWriter) -''') + return codecs.CodecInfo(( + name=%r, + Codec().encode, + Codec().decode, + streamwriter=StreamWriter, + streamreader=StreamReader, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + )) +''' % encodingname.replace('_', '-')) # Add decoding table or map (with preference to the table) if not decoding_table_code: @@ -331,11 +350,11 @@ # Final new-line l.append('\n') - return '\n'.join(l) + return '\n'.join(l).expandtabs() -def pymap(name,map,pyfile,comments=1): +def pymap(name,map,pyfile,encodingname,comments=1): - code = codegen(name,map,comments) + code = codegen(name,map,encodingname,comments) f = open(pyfile,'w') f.write(code) f.close() @@ -349,7 +368,7 @@ marshal.dump(d,f) f.close() -def convertdir(dir,prefix='',comments=1): +def convertdir(dir, dirprefix='', nameprefix='', comments=1): mapnames = os.listdir(dir) for mapname in mapnames: @@ -360,38 +379,40 @@ name = name.replace('-','_') name = name.split('.')[0] name = name.lower() + name = nameprefix + name codefile = name + '.py' marshalfile = name + '.mapping' print 'converting %s to %s and %s' % (mapname, - prefix + codefile, - prefix + marshalfile) + dirprefix + codefile, + dirprefix + marshalfile) try: map = readmap(os.path.join(dir,mapname)) if not map: print '* map is empty; skipping' else: - pymap(mappathname, map, prefix + codefile,comments) - marshalmap(mappathname, map, prefix + marshalfile) + pymap(mappathname, map, dirprefix + codefile,name,comments) + marshalmap(mappathname, map, dirprefix + marshalfile) except ValueError, why: print '* conversion failed: %s' % why raise -def rewritepythondir(dir,prefix='',comments=1): +def rewritepythondir(dir, dirprefix='', comments=1): mapnames = os.listdir(dir) for mapname in mapnames: if not mapname.endswith('.mapping'): continue - codefile = mapname[:-len('.mapping')] + '.py' + name = mapname[:-len('.mapping')] + codefile = name + '.py' print 'converting %s to %s' % (mapname, - prefix + codefile) + dirprefix + codefile) try: map = marshal.load(open(os.path.join(dir,mapname), 'rb')) if not map: print '* map is empty; skipping' else: - pymap(mapname, map, prefix + codefile,comments) + pymap(mapname, map, dirprefix + codefile,name,comments) except ValueError, why: print '* conversion failed: %s' % why From python-checkins at python.org Wed Mar 15 12:53:09 2006 From: python-checkins at python.org (andrew.kuchling) Date: Wed, 15 Mar 2006 12:53:09 +0100 (CET) Subject: [Python-checkins] r43046 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060315115309.682251E4009@bag.python.org> Author: andrew.kuchling Date: Wed Mar 15 12:53:09 2006 New Revision: 43046 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Add section Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Wed Mar 15 12:53:09 2006 @@ -210,6 +210,12 @@ %====================================================================== +\section{PEP 338: Executing Modules as Scripts} + +% XXX write this + + +%====================================================================== \section{PEP 341: Unified try/except/finally} % XXX write this From python-checkins at python.org Wed Mar 15 13:40:39 2006 From: python-checkins at python.org (nick.coghlan) Date: Wed, 15 Mar 2006 13:40:39 +0100 (CET) Subject: [Python-checkins] r43047 - python/trunk/Lib/test/test_runpy.py Message-ID: <20060315124039.307161E4009@bag.python.org> Author: nick.coghlan Date: Wed Mar 15 13:40:38 2006 New Revision: 43047 Modified: python/trunk/Lib/test/test_runpy.py Log: Make test_runpy close all references to test modules before trying to delete the underlying files Modified: python/trunk/Lib/test/test_runpy.py ============================================================================== --- python/trunk/Lib/test/test_runpy.py (original) +++ python/trunk/Lib/test/test_runpy.py Wed Mar 15 13:40:38 2006 @@ -113,13 +113,6 @@ return pkg_dir, mod_fname, mod_name def _del_pkg(self, top, depth, mod_name): - for root, dirs, files in os.walk(top, topdown=False): - for name in files: - os.remove(os.path.join(root, name)) - for name in dirs: - os.rmdir(os.path.join(root, name)) - os.rmdir(top) - if verbose: print " Removed package tree" for i in range(depth+1): # Don't forget the module itself parts = mod_name.rsplit(".", i) entry = parts[0] @@ -127,6 +120,13 @@ if verbose: print " Removed sys.modules entries" del sys.path[0] if verbose: print " Removed sys.path entry" + for root, dirs, files in os.walk(top, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(top) + if verbose: print " Removed package tree" def _check_module(self, depth): pkg_dir, mod_fname, mod_name = ( @@ -134,13 +134,16 @@ try: if verbose: print "Running from source:", mod_name d1 = run_module(mod_name) # Read from source + self.failUnless(d1["x"] == 1) + del d1 # Ensure __loader__ entry doesn't keep file open __import__(mod_name) os.remove(mod_fname) if verbose: print "Running from compiled:", mod_name d2 = run_module(mod_name) # Read from bytecode + self.failUnless(d2["x"] == 1) + del d2 # Ensure __loader__ entry doesn't keep file open finally: self._del_pkg(pkg_dir, depth, mod_name) - self.failUnless(d1["x"] == d2["x"] == 1) if verbose: print "Module executed successfully" def test_run_module(self): From python-checkins at python.org Wed Mar 15 13:45:08 2006 From: python-checkins at python.org (vinay.sajip) Date: Wed, 15 Mar 2006 13:45:08 +0100 (CET) Subject: [Python-checkins] r43048 - python/trunk/Lib/logging/__init__.py Message-ID: <20060315124508.DA0ED1E401A@bag.python.org> Author: vinay.sajip Date: Wed Mar 15 13:45:07 2006 New Revision: 43048 Modified: python/trunk/Lib/logging/__init__.py Log: Catch situations where currentframe() returns None. See SF patch #1447410, this is a different implementation. Modified: python/trunk/Lib/logging/__init__.py ============================================================================== --- python/trunk/Lib/logging/__init__.py (original) +++ python/trunk/Lib/logging/__init__.py Wed Mar 15 13:45:07 2006 @@ -1058,13 +1058,16 @@ file name, line number and function name. """ f = currentframe().f_back - while 1: + rv = "(unknown file)", 0, "(unknown function)" + while hasattr(f, "f_code"): co = f.f_code filename = os.path.normcase(co.co_filename) if filename == _srcfile: f = f.f_back continue - return filename, f.f_lineno, co.co_name + rv = (filename, f.f_lineno, co.co_name) + break + return rv def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None): """ From python-checkins at python.org Wed Mar 15 14:11:54 2006 From: python-checkins at python.org (nick.coghlan) Date: Wed, 15 Mar 2006 14:11:54 +0100 (CET) Subject: [Python-checkins] r43049 - python/trunk/Lib/test/test_runpy.py Message-ID: <20060315131154.DC31F1E400A@bag.python.org> Author: nick.coghlan Date: Wed Mar 15 14:11:54 2006 New Revision: 43049 Modified: python/trunk/Lib/test/test_runpy.py Log: Don't let cleanup errors mask real errors in the runpy tests Modified: python/trunk/Lib/test/test_runpy.py ============================================================================== --- python/trunk/Lib/test/test_runpy.py (original) +++ python/trunk/Lib/test/test_runpy.py Wed Mar 15 14:11:54 2006 @@ -116,17 +116,30 @@ for i in range(depth+1): # Don't forget the module itself parts = mod_name.rsplit(".", i) entry = parts[0] - del sys.modules[entry] + try: + del sys.modules[entry] + except KeyError, ex: + if verbose: print ex # Persist with cleaning up if verbose: print " Removed sys.modules entries" del sys.path[0] if verbose: print " Removed sys.path entry" for root, dirs, files in os.walk(top, topdown=False): for name in files: - os.remove(os.path.join(root, name)) + try: + os.remove(os.path.join(root, name)) + except OSError, ex: + if verbose: print ex # Persist with cleaning up for name in dirs: - os.rmdir(os.path.join(root, name)) - os.rmdir(top) - if verbose: print " Removed package tree" + fullname = os.path.join(root, name) + try: + os.rmdir(fullname) + except OSError, ex: + if verbose: print ex # Persist with cleaning up + try: + os.rmdir(top) + if verbose: print " Removed package tree" + except OSError, ex: + if verbose: print ex # Persist with cleaning up def _check_module(self, depth): pkg_dir, mod_fname, mod_name = ( From python-checkins at python.org Wed Mar 15 14:29:20 2006 From: python-checkins at python.org (nick.coghlan) Date: Wed, 15 Mar 2006 14:29:20 +0100 (CET) Subject: [Python-checkins] r43050 - python/trunk/Lib/test/test_runpy.py Message-ID: <20060315132920.431061E4009@bag.python.org> Author: nick.coghlan Date: Wed Mar 15 14:29:19 2006 New Revision: 43050 Modified: python/trunk/Lib/test/test_runpy.py Log: Don't try to explicitly set path in runpy package tests (tests were broken on Windows) Modified: python/trunk/Lib/test/test_runpy.py ============================================================================== --- python/trunk/Lib/test/test_runpy.py (original) +++ python/trunk/Lib/test/test_runpy.py Wed Mar 15 14:29:19 2006 @@ -101,7 +101,6 @@ if verbose: print " Next level in:", sub_dir pkg_fname = os.path.join(sub_dir, init_fname) pkg_file = open(pkg_fname, "w") - pkg_file.write("__path__ = ['%s']\n" % sub_dir) pkg_file.close() if verbose: print " Created:", pkg_fname mod_fname = os.path.join(sub_dir, test_fname) From python-checkins at python.org Wed Mar 15 14:36:51 2006 From: python-checkins at python.org (walter.doerwald) Date: Wed, 15 Mar 2006 14:36:51 +0100 (CET) Subject: [Python-checkins] r43051 - python/trunk/Lib/encodings/mbcs.py Message-ID: <20060315133651.C84841E4009@bag.python.org> Author: walter.doerwald Date: Wed Mar 15 14:36:50 2006 New Revision: 43051 Modified: python/trunk/Lib/encodings/mbcs.py Log: Fix typo. Modified: python/trunk/Lib/encodings/mbcs.py ============================================================================== --- python/trunk/Lib/encodings/mbcs.py (original) +++ python/trunk/Lib/encodings/mbcs.py Wed Mar 15 14:36:50 2006 @@ -20,11 +20,11 @@ class IncrementalEncoder(codecs.IncrementalEncoder): def encode(self, input, final=False): - return codecs.mbs_encode(input,self.errors)[0] + return codecs.mbcs_encode(input,self.errors)[0] class IncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): - return codecs.mbs_decode(input,self.errors)[0] + return codecs.mbcs_decode(input,self.errors)[0] class StreamWriter(Codec,codecs.StreamWriter): pass From theller at python.net Wed Mar 15 16:03:45 2006 From: theller at python.net (Thomas Heller) Date: Wed, 15 Mar 2006 16:03:45 +0100 Subject: [Python-checkins] r43040 - python/trunk/Makefile.pre.in In-Reply-To: <4f0b69dc0603150206y68f56fa8lebc0d8407134a43b@mail.gmail.com> References: <20060315083440.532D61E4009@bag.python.org> <4f0b69dc0603150206y68f56fa8lebc0d8407134a43b@mail.gmail.com> Message-ID: <44182CD1.1020207@python.net> Hye-Shik Chang wrote: > On 3/15/06, Thomas Heller wrote: >> thomas.heller wrote: >>> Author: thomas.heller >>> Date: Wed Mar 15 09:34:38 2006 >>> New Revision: 43040 >>> >>> Modified: >>> python/trunk/Makefile.pre.in >>> Log: >>> In 'make clean', delete some files that are generated by the _ctypes/libffi >>> configure step. >>> >>> >>> Modified: python/trunk/Makefile.pre.in >>> ============================================================================== >>> --- python/trunk/Makefile.pre.in (original) >>> +++ python/trunk/Makefile.pre.in Wed Mar 15 09:34:38 2006 >>> @@ -974,6 +974,8 @@ >>> find . -name '*.o' -exec rm -f {} ';' >>> find . -name '*.s[ol]' -exec rm -f {} ';' >>> find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' >>> + find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' >>> + find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' >>> >>> clobber: clean >>> -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ >> Although I committed this, I'm not sure this is the right approach. >> Better IMO would be to let 'make clean' run '$(srcdir)/python setup.py clean' >> or '$(srcdir)/python setup.py clean -a', and let the setup script take care >> of the cleanup. The problem is that the makefile doesn't know what the build >> directory for extensions is, since its name is determined by distutils. > > fficonfig.* looks much like pyconfig.h which is not cleaned by the `clean' > target. I think `clobber' or `distclean' makes more fit for fficonfig.*. Let's stay with this approach for a moment. The above code is bad because it also removes the non-generated source files in Modules/_ctypes/libffi_msvc/ and Modules/_ctypes/libffi_arm_wince/. To repair it I'd suggest: >>> + find $(srcdir)/build -name 'fficonfig.h' -exec rm -f {} ';' || true >>> + find $(srcdir)/build -name 'fficonfig.py' -exec rm -f {} ';' || true This removes only files in the build subdirectory, and ignores the 'find' error when the build directory is not there. Thomas From theller at python.net Wed Mar 15 16:03:45 2006 From: theller at python.net (Thomas Heller) Date: Wed, 15 Mar 2006 16:03:45 +0100 Subject: [Python-checkins] r43040 - python/trunk/Makefile.pre.in In-Reply-To: <4f0b69dc0603150206y68f56fa8lebc0d8407134a43b@mail.gmail.com> References: <20060315083440.532D61E4009@bag.python.org> <4f0b69dc0603150206y68f56fa8lebc0d8407134a43b@mail.gmail.com> Message-ID: <44182CD1.1020207@python.net> Hye-Shik Chang wrote: > On 3/15/06, Thomas Heller wrote: >> thomas.heller wrote: >>> Author: thomas.heller >>> Date: Wed Mar 15 09:34:38 2006 >>> New Revision: 43040 >>> >>> Modified: >>> python/trunk/Makefile.pre.in >>> Log: >>> In 'make clean', delete some files that are generated by the _ctypes/libffi >>> configure step. >>> >>> >>> Modified: python/trunk/Makefile.pre.in >>> ============================================================================== >>> --- python/trunk/Makefile.pre.in (original) >>> +++ python/trunk/Makefile.pre.in Wed Mar 15 09:34:38 2006 >>> @@ -974,6 +974,8 @@ >>> find . -name '*.o' -exec rm -f {} ';' >>> find . -name '*.s[ol]' -exec rm -f {} ';' >>> find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' >>> + find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' >>> + find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' >>> >>> clobber: clean >>> -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ >> Although I committed this, I'm not sure this is the right approach. >> Better IMO would be to let 'make clean' run '$(srcdir)/python setup.py clean' >> or '$(srcdir)/python setup.py clean -a', and let the setup script take care >> of the cleanup. The problem is that the makefile doesn't know what the build >> directory for extensions is, since its name is determined by distutils. > > fficonfig.* looks much like pyconfig.h which is not cleaned by the `clean' > target. I think `clobber' or `distclean' makes more fit for fficonfig.*. Let's stay with this approach for a moment. The above code is bad because it also removes the non-generated source files in Modules/_ctypes/libffi_msvc/ and Modules/_ctypes/libffi_arm_wince/. To repair it I'd suggest: >>> + find $(srcdir)/build -name 'fficonfig.h' -exec rm -f {} ';' || true >>> + find $(srcdir)/build -name 'fficonfig.py' -exec rm -f {} ';' || true This removes only files in the build subdirectory, and ignores the 'find' error when the build directory is not there. Thomas From mwh at python.net Wed Mar 15 18:17:14 2006 From: mwh at python.net (Michael Hudson) Date: Wed, 15 Mar 2006 17:17:14 +0000 Subject: [Python-checkins] r43033 - in python/trunk/Lib: distutils/sysconfig.py encodings/__init__.py In-Reply-To: <2mveug3sxp.fsf@starship.python.net> (Michael Hudson's message of "Wed, 15 Mar 2006 10:26:10 +0000") References: <20060315043355.C82D71E4009@bag.python.org> <2mveug3sxp.fsf@starship.python.net> Message-ID: <2mlkvb4oh1.fsf@starship.python.net> Michael Hudson writes: > "guido.van.rossum" writes: > >> Author: guido.van.rossum >> Date: Wed Mar 15 05:33:54 2006 >> New Revision: 43033 >> >> Modified: >> python/trunk/Lib/distutils/sysconfig.py >> python/trunk/Lib/encodings/__init__.py >> Log: >> Use relative imports in a few places where I noticed the need. >> (Ideally, all packages in Python 2.5 will use the relative import >> syntax for all their relative import needs.) > > Abusing something I wrote recently to analyse the Twisted source found > these local imports: That list was way incomplete, here's a better one: xmlcore.etree.ElementInclude local import ElementTree curses.textpad local import ascii idlelib.IOBinding local import configHandler curses.__init__ local import has_key idlelib.ScriptBinding local import PyShell idlelib.ScriptBinding local import configHandler idlelib.TreeWidget local import ZoomHeight idlelib.TreeWidget local import configHandler idlelib.TreeWidget.test local import PyShell ctypes.macholib.dyld local import framework ctypes.macholib.dyld local import dylib idlelib.PathBrowser local import TreeWidget idlelib.PathBrowser local import ClassBrowser idlelib.PathBrowser.main local import PyShell idlelib.Percolator local import WidgetRedirector idlelib.Percolator local import Delegator idlelib.RemoteObjectBrowser local import rpc idlelib.Debugger local import WindowList idlelib.Debugger local import ScrolledList idlelib.StackViewer local import TreeWidget idlelib.StackViewer local import ObjectBrowser idlelib.StackViewer._test local import testcode idlelib.HyperParser local import PyParse compiler.__init__ local import transformer compiler.__init__ local import visitor compiler.__init__ local import pycodegen bsddb.dbshelve local import db idlelib.run local import CallTips idlelib.run local import AutoComplete idlelib.run local import RemoteDebugger idlelib.run local import RemoteObjectBrowser idlelib.run local import StackViewer idlelib.run local import rpc idlelib.run.MyHandler.handle local import IOBinding bsddb.dbutils local import db idlelib.UndoDelegator local import Delegator idlelib.UndoDelegator.main local import Percolator idlelib.ParenMatch local import HyperParser idlelib.ParenMatch local import configHandler idlelib.configDialog local import configHandler idlelib.configDialog local import dynOptionMenuWidget idlelib.configDialog local import tabpage idlelib.configDialog local import keybindingDialog idlelib.configDialog local import configSectionNameDialog idlelib.configDialog local import configHelpSourceEdit idlelib.SearchDialog local import SearchEngine idlelib.SearchDialog local import SearchDialogBase idlelib.FormatParagraph local import configHandler idlelib.ColorDelegator local import Delegator idlelib.ColorDelegator local import configHandler idlelib.ColorDelegator.main local import Percolator xmlcore.sax.saxutils local import handler xmlcore.sax.saxutils local import xmlreader idlelib.CallTips local import CallTipWindow idlelib.CallTips local import HyperParser idlelib.ObjectBrowser local import TreeWidget xmlcore.etree.ElementTree local import ElementPath xmlcore.dom.__init__ local import domreg idlelib.Bindings local import configHandler compiler.ast local import consts compiler.transformer local import consts compiler.transformer local import consts xmlcore.sax.__init__ local import xmlreader xmlcore.sax.__init__ local import handler xmlcore.sax.__init__ local import _exceptions idlelib.OutputWindow local import EditorWindow idlelib.OutputWindow local import IOBinding idlelib.aboutDialog local import textView idlelib.aboutDialog local import idlever idlelib.aboutDialog.run local import aboutDialog idlelib.EditorWindow local import MultiCall idlelib.EditorWindow local import idlever idlelib.EditorWindow local import WindowList idlelib.EditorWindow local import SearchDialog idlelib.EditorWindow local import GrepDialog idlelib.EditorWindow local import ReplaceDialog idlelib.EditorWindow local import PyParse idlelib.EditorWindow local import configHandler idlelib.EditorWindow local import aboutDialog idlelib.EditorWindow local import textView idlelib.EditorWindow local import configDialog idlelib.EditorWindow.EditorWindow local import Percolator idlelib.EditorWindow.EditorWindow local import ColorDelegator idlelib.EditorWindow.EditorWindow local import UndoDelegator idlelib.EditorWindow.EditorWindow local import IOBinding idlelib.EditorWindow.EditorWindow local import Bindings idlelib.EditorWindow.EditorWindow local import MultiStatusBar idlelib.EditorWindow.EditorWindow.open_class_browser local import ClassBrowser idlelib.EditorWindow.EditorWindow.open_path_browser local import PathBrowser idlelib.idle local import PyShell xmlcore.sax.xmlreader local import handler xmlcore.sax.xmlreader local import _exceptions xmlcore.sax.xmlreader.IncrementalParser.parse local import saxutils idlelib.ReplaceDialog local import SearchEngine idlelib.ReplaceDialog local import SearchDialogBase idlelib.IdleHistory local import configHandler idlelib.RemoteDebugger local import rpc idlelib.RemoteDebugger local import Debugger idlelib.GrepDialog local import SearchEngine idlelib.GrepDialog local import SearchDialogBase idlelib.GrepDialog.GrepDialog.default_command local import OutputWindow idlelib.AutoComplete local import configHandler idlelib.AutoComplete local import AutoCompleteWindow idlelib.AutoComplete local import HyperParser idlelib.AutoCompleteWindow local import MultiCall idlelib.AutoCompleteWindow local import AutoComplete idlelib.FileList.FileList local import EditorWindow idlelib.FileList._test local import EditorWindow idlelib.PyShell local import EditorWindow idlelib.PyShell local import FileList idlelib.PyShell local import ColorDelegator idlelib.PyShell local import UndoDelegator idlelib.PyShell local import OutputWindow idlelib.PyShell local import configHandler idlelib.PyShell local import idlever idlelib.PyShell local import rpc idlelib.PyShell local import Debugger idlelib.PyShell local import RemoteDebugger idlelib.PyShell.PyShell local import IdleHistory idlelib.PyShell.ModifiedInterpreter.remote_stack_viewer local import RemoteObjectBrowser idlelib.PyShell.ModifiedInterpreter.remote_stack_viewer local import TreeWidget idlelib.PyShell.ModifiedInterpreter.runsource local import IOBinding idlelib.PyShell.PyShell.__init__ local import IOBinding idlelib.PyShell.PyShell.readline local import IOBinding idlelib.PyShell.PyShell.open_stack_viewer local import StackViewer idlelib.ClassBrowser local import PyShell idlelib.ClassBrowser local import WindowList idlelib.ClassBrowser local import TreeWidget idlelib.ClassBrowser local import configHandler bsddb.dbobj local import db idlelib.CodeContext local import configHandler Cheers, mwh -- Hmmm... its Sunday afternoon: I could do my work, or I could do a Fourier analysis of my computer's fan noise. -- Amit Muthu, ucam.chat (from Owen Dunn's summary of the year) From python-checkins at python.org Wed Mar 15 19:08:40 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 15 Mar 2006 19:08:40 +0100 (CET) Subject: [Python-checkins] r43052 - in python/trunk/Lib: encodings/__init__.py encodings/cp037.py encodings/cp1006.py encodings/cp1026.py encodings/cp1140.py encodings/cp1250.py encodings/cp1251.py encodings/cp1252.py encodings/cp1253.py encodings/cp1254.py encodings/cp1255.py encodings/cp1256.py encodings/cp1257.py encodings/cp1258.py encodings/cp424.py encodings/cp500.py encodings/cp856.py encodings/cp874.py encodings/cp875.py encodings/iso8859_1.py encodings/iso8859_10.py encodings/iso8859_11.py encodings/iso8859_13.py encodings/iso8859_14.py encodings/iso8859_15.py encodings/iso8859_16.py encodings/iso8859_2.py encodings/iso8859_3.py encodings/iso8859_4.py encodings/iso8859_5.py encodings/iso8859_6.py encodings/iso8859_7.py encodings/iso8859_8.py encodings/iso8859_9.py encodings/koi8_r.py encodings/koi8_u.py encodings/latin_1.py encodings/mac_centeuro.py encodings/mac_croatian.py encodings/mac_cyrillic.py encodings/mac_farsi.py encodings/mac_greek.py encodings/mac_iceland.py encodings/mac_roman.py encodings/mac_romanian.py encodings/mac_turkish.py encodings/tis_620.py encodings/utf_7.py runpy.py test/test_runpy.py Message-ID: <20060315180840.DE6771E401E@bag.python.org> Author: tim.peters Date: Wed Mar 15 19:08:37 2006 New Revision: 43052 Modified: python/trunk/Lib/encodings/__init__.py python/trunk/Lib/encodings/cp037.py python/trunk/Lib/encodings/cp1006.py python/trunk/Lib/encodings/cp1026.py python/trunk/Lib/encodings/cp1140.py python/trunk/Lib/encodings/cp1250.py python/trunk/Lib/encodings/cp1251.py python/trunk/Lib/encodings/cp1252.py python/trunk/Lib/encodings/cp1253.py python/trunk/Lib/encodings/cp1254.py python/trunk/Lib/encodings/cp1255.py python/trunk/Lib/encodings/cp1256.py python/trunk/Lib/encodings/cp1257.py python/trunk/Lib/encodings/cp1258.py python/trunk/Lib/encodings/cp424.py python/trunk/Lib/encodings/cp500.py python/trunk/Lib/encodings/cp856.py python/trunk/Lib/encodings/cp874.py python/trunk/Lib/encodings/cp875.py python/trunk/Lib/encodings/iso8859_1.py python/trunk/Lib/encodings/iso8859_10.py python/trunk/Lib/encodings/iso8859_11.py python/trunk/Lib/encodings/iso8859_13.py python/trunk/Lib/encodings/iso8859_14.py python/trunk/Lib/encodings/iso8859_15.py python/trunk/Lib/encodings/iso8859_16.py python/trunk/Lib/encodings/iso8859_2.py python/trunk/Lib/encodings/iso8859_3.py python/trunk/Lib/encodings/iso8859_4.py python/trunk/Lib/encodings/iso8859_5.py python/trunk/Lib/encodings/iso8859_6.py python/trunk/Lib/encodings/iso8859_7.py python/trunk/Lib/encodings/iso8859_8.py python/trunk/Lib/encodings/iso8859_9.py python/trunk/Lib/encodings/koi8_r.py python/trunk/Lib/encodings/koi8_u.py python/trunk/Lib/encodings/latin_1.py python/trunk/Lib/encodings/mac_centeuro.py python/trunk/Lib/encodings/mac_croatian.py python/trunk/Lib/encodings/mac_cyrillic.py python/trunk/Lib/encodings/mac_farsi.py python/trunk/Lib/encodings/mac_greek.py python/trunk/Lib/encodings/mac_iceland.py python/trunk/Lib/encodings/mac_roman.py python/trunk/Lib/encodings/mac_romanian.py python/trunk/Lib/encodings/mac_turkish.py python/trunk/Lib/encodings/tis_620.py python/trunk/Lib/encodings/utf_7.py python/trunk/Lib/runpy.py python/trunk/Lib/test/test_runpy.py Log: Whitespace normalization. Modified: python/trunk/Lib/encodings/__init__.py ============================================================================== --- python/trunk/Lib/encodings/__init__.py (original) +++ python/trunk/Lib/encodings/__init__.py Wed Mar 15 19:08:37 2006 @@ -117,9 +117,9 @@ entry = getregentry() if not isinstance(entry, codecs.CodecInfo): if not 4 <= len(entry) <= 7: - raise CodecRegistryError,\ - 'module "%s" (%s) failed to register' % \ - (mod.__name__, mod.__file__) + raise CodecRegistryError,\ + 'module "%s" (%s) failed to register' % \ + (mod.__name__, mod.__file__) if not callable(entry[0]) or \ not callable(entry[1]) or \ (entry[2] is not None and not callable(entry[2])) or \ Modified: python/trunk/Lib/encodings/cp037.py ============================================================================== --- python/trunk/Lib/encodings/cp037.py (original) +++ python/trunk/Lib/encodings/cp037.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/cp1006.py ============================================================================== --- python/trunk/Lib/encodings/cp1006.py (original) +++ python/trunk/Lib/encodings/cp1006.py Wed Mar 15 19:08:37 2006 @@ -562,4 +562,3 @@ 0xFEF2: 0xFA, # ARABIC LETTER YEH FINAL FORM 0xFEF3: 0xFB, # ARABIC LETTER YEH INITIAL FORM } - Modified: python/trunk/Lib/encodings/cp1026.py ============================================================================== --- python/trunk/Lib/encodings/cp1026.py (original) +++ python/trunk/Lib/encodings/cp1026.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x015E: 0x7C, # LATIN CAPITAL LETTER S WITH CEDILLA 0x015F: 0x6A, # LATIN SMALL LETTER S WITH CEDILLA } - Modified: python/trunk/Lib/encodings/cp1140.py ============================================================================== --- python/trunk/Lib/encodings/cp1140.py (original) +++ python/trunk/Lib/encodings/cp1140.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS 0x20AC: 0x9F, # EURO SIGN } - Modified: python/trunk/Lib/encodings/cp1250.py ============================================================================== --- python/trunk/Lib/encodings/cp1250.py (original) +++ python/trunk/Lib/encodings/cp1250.py Wed Mar 15 19:08:37 2006 @@ -558,4 +558,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1251.py ============================================================================== --- python/trunk/Lib/encodings/cp1251.py (original) +++ python/trunk/Lib/encodings/cp1251.py Wed Mar 15 19:08:37 2006 @@ -562,4 +562,3 @@ 0x2116: 0xB9, # NUMERO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1252.py ============================================================================== --- python/trunk/Lib/encodings/cp1252.py (original) +++ python/trunk/Lib/encodings/cp1252.py Wed Mar 15 19:08:37 2006 @@ -558,4 +558,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1253.py ============================================================================== --- python/trunk/Lib/encodings/cp1253.py (original) +++ python/trunk/Lib/encodings/cp1253.py Wed Mar 15 19:08:37 2006 @@ -546,4 +546,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1254.py ============================================================================== --- python/trunk/Lib/encodings/cp1254.py (original) +++ python/trunk/Lib/encodings/cp1254.py Wed Mar 15 19:08:37 2006 @@ -556,4 +556,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1255.py ============================================================================== --- python/trunk/Lib/encodings/cp1255.py (original) +++ python/trunk/Lib/encodings/cp1255.py Wed Mar 15 19:08:37 2006 @@ -540,4 +540,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1256.py ============================================================================== --- python/trunk/Lib/encodings/cp1256.py (original) +++ python/trunk/Lib/encodings/cp1256.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1257.py ============================================================================== --- python/trunk/Lib/encodings/cp1257.py (original) +++ python/trunk/Lib/encodings/cp1257.py Wed Mar 15 19:08:37 2006 @@ -551,4 +551,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp1258.py ============================================================================== --- python/trunk/Lib/encodings/cp1258.py (original) +++ python/trunk/Lib/encodings/cp1258.py Wed Mar 15 19:08:37 2006 @@ -554,4 +554,3 @@ 0x20AC: 0x80, # EURO SIGN 0x2122: 0x99, # TRADE MARK SIGN } - Modified: python/trunk/Lib/encodings/cp424.py ============================================================================== --- python/trunk/Lib/encodings/cp424.py (original) +++ python/trunk/Lib/encodings/cp424.py Wed Mar 15 19:08:37 2006 @@ -525,4 +525,3 @@ 0x05EA: 0x71, # HEBREW LETTER TAV 0x2017: 0x78, # DOUBLE LOW LINE } - Modified: python/trunk/Lib/encodings/cp500.py ============================================================================== --- python/trunk/Lib/encodings/cp500.py (original) +++ python/trunk/Lib/encodings/cp500.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x00FE: 0x8E, # LATIN SMALL LETTER THORN (ICELANDIC) 0x00FF: 0xDF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/cp856.py ============================================================================== --- python/trunk/Lib/encodings/cp856.py (original) +++ python/trunk/Lib/encodings/cp856.py Wed Mar 15 19:08:37 2006 @@ -522,4 +522,3 @@ 0x2593: 0xB2, # DARK SHADE 0x25A0: 0xFE, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/cp874.py ============================================================================== --- python/trunk/Lib/encodings/cp874.py (original) +++ python/trunk/Lib/encodings/cp874.py Wed Mar 15 19:08:37 2006 @@ -532,4 +532,3 @@ 0x2026: 0x85, # HORIZONTAL ELLIPSIS 0x20AC: 0x80, # EURO SIGN } - Modified: python/trunk/Lib/encodings/cp875.py ============================================================================== --- python/trunk/Lib/encodings/cp875.py (original) +++ python/trunk/Lib/encodings/cp875.py Wed Mar 15 19:08:37 2006 @@ -557,4 +557,3 @@ 0x2018: 0xCE, # LEFT SINGLE QUOTATION MARK 0x2019: 0xDE, # RIGHT SINGLE QUOTATION MARK } - Modified: python/trunk/Lib/encodings/iso8859_1.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_1.py (original) +++ python/trunk/Lib/encodings/iso8859_1.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x00FE: 0xFE, # LATIN SMALL LETTER THORN (Icelandic) 0x00FF: 0xFF, # LATIN SMALL LETTER Y WITH DIAERESIS } - Modified: python/trunk/Lib/encodings/iso8859_10.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_10.py (original) +++ python/trunk/Lib/encodings/iso8859_10.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x017E: 0xBC, # LATIN SMALL LETTER Z WITH CARON 0x2015: 0xBD, # HORIZONTAL BAR } - Modified: python/trunk/Lib/encodings/iso8859_11.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_11.py (original) +++ python/trunk/Lib/encodings/iso8859_11.py Wed Mar 15 19:08:37 2006 @@ -555,4 +555,3 @@ 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } - Modified: python/trunk/Lib/encodings/iso8859_13.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_13.py (original) +++ python/trunk/Lib/encodings/iso8859_13.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x201D: 0xA1, # RIGHT DOUBLE QUOTATION MARK 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK } - Modified: python/trunk/Lib/encodings/iso8859_14.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_14.py (original) +++ python/trunk/Lib/encodings/iso8859_14.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x1EF2: 0xAC, # LATIN CAPITAL LETTER Y WITH GRAVE 0x1EF3: 0xBC, # LATIN SMALL LETTER Y WITH GRAVE } - Modified: python/trunk/Lib/encodings/iso8859_15.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_15.py (original) +++ python/trunk/Lib/encodings/iso8859_15.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x017E: 0xB8, # LATIN SMALL LETTER Z WITH CARON 0x20AC: 0xA4, # EURO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_16.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_16.py (original) +++ python/trunk/Lib/encodings/iso8859_16.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x201E: 0xA5, # DOUBLE LOW-9 QUOTATION MARK 0x20AC: 0xA4, # EURO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_2.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_2.py (original) +++ python/trunk/Lib/encodings/iso8859_2.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x02DB: 0xB2, # OGONEK 0x02DD: 0xBD, # DOUBLE ACUTE ACCENT } - Modified: python/trunk/Lib/encodings/iso8859_3.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_3.py (original) +++ python/trunk/Lib/encodings/iso8859_3.py Wed Mar 15 19:08:37 2006 @@ -556,4 +556,3 @@ 0x02D8: 0xA2, # BREVE 0x02D9: 0xFF, # DOT ABOVE } - Modified: python/trunk/Lib/encodings/iso8859_4.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_4.py (original) +++ python/trunk/Lib/encodings/iso8859_4.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x02D9: 0xFF, # DOT ABOVE 0x02DB: 0xB2, # OGONEK } - Modified: python/trunk/Lib/encodings/iso8859_5.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_5.py (original) +++ python/trunk/Lib/encodings/iso8859_5.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x045F: 0xFF, # CYRILLIC SMALL LETTER DZHE 0x2116: 0xF0, # NUMERO SIGN } - Modified: python/trunk/Lib/encodings/iso8859_6.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_6.py (original) +++ python/trunk/Lib/encodings/iso8859_6.py Wed Mar 15 19:08:37 2006 @@ -518,4 +518,3 @@ 0x0651: 0xF1, # ARABIC SHADDA 0x0652: 0xF2, # ARABIC SUKUN } - Modified: python/trunk/Lib/encodings/iso8859_7.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_7.py (original) +++ python/trunk/Lib/encodings/iso8859_7.py Wed Mar 15 19:08:37 2006 @@ -560,4 +560,3 @@ 0x20AC: 0xA4, # EURO SIGN 0x20AF: 0xA5, # DRACHMA SIGN } - Modified: python/trunk/Lib/encodings/iso8859_8.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_8.py (original) +++ python/trunk/Lib/encodings/iso8859_8.py Wed Mar 15 19:08:37 2006 @@ -527,4 +527,3 @@ 0x200F: 0xFE, # RIGHT-TO-LEFT MARK 0x2017: 0xDF, # DOUBLE LOW LINE } - Modified: python/trunk/Lib/encodings/iso8859_9.py ============================================================================== --- python/trunk/Lib/encodings/iso8859_9.py (original) +++ python/trunk/Lib/encodings/iso8859_9.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x015E: 0xDE, # LATIN CAPITAL LETTER S WITH CEDILLA 0x015F: 0xFE, # LATIN SMALL LETTER S WITH CEDILLA } - Modified: python/trunk/Lib/encodings/koi8_r.py ============================================================================== --- python/trunk/Lib/encodings/koi8_r.py (original) +++ python/trunk/Lib/encodings/koi8_r.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2593: 0x92, # DARK SHADE 0x25A0: 0x94, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/koi8_u.py ============================================================================== --- python/trunk/Lib/encodings/koi8_u.py (original) +++ python/trunk/Lib/encodings/koi8_u.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2593: 0x92, # DARK SHADE 0x25A0: 0x94, # BLACK SQUARE } - Modified: python/trunk/Lib/encodings/latin_1.py ============================================================================== --- python/trunk/Lib/encodings/latin_1.py (original) +++ python/trunk/Lib/encodings/latin_1.py Wed Mar 15 19:08:37 2006 @@ -48,4 +48,3 @@ streamreader=StreamReader, streamwriter=StreamWriter, ) - Modified: python/trunk/Lib/encodings/mac_centeuro.py ============================================================================== --- python/trunk/Lib/encodings/mac_centeuro.py (original) +++ python/trunk/Lib/encodings/mac_centeuro.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO 0x25CA: 0xD7, # LOZENGE } - Modified: python/trunk/Lib/encodings/mac_croatian.py ============================================================================== --- python/trunk/Lib/encodings/mac_croatian.py (original) +++ python/trunk/Lib/encodings/mac_croatian.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xD8, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_cyrillic.py ============================================================================== --- python/trunk/Lib/encodings/mac_cyrillic.py (original) +++ python/trunk/Lib/encodings/mac_cyrillic.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2264: 0xB2, # LESS-THAN OR EQUAL TO 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } - Modified: python/trunk/Lib/encodings/mac_farsi.py ============================================================================== --- python/trunk/Lib/encodings/mac_farsi.py (original) +++ python/trunk/Lib/encodings/mac_farsi.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2026: 0x93, # HORIZONTAL ELLIPSIS, right-left 0x274A: 0xC0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left } - Modified: python/trunk/Lib/encodings/mac_greek.py ============================================================================== --- python/trunk/Lib/encodings/mac_greek.py (original) +++ python/trunk/Lib/encodings/mac_greek.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x2264: 0xB2, # LESS-THAN OR EQUAL TO 0x2265: 0xB3, # GREATER-THAN OR EQUAL TO } - Modified: python/trunk/Lib/encodings/mac_iceland.py ============================================================================== --- python/trunk/Lib/encodings/mac_iceland.py (original) +++ python/trunk/Lib/encodings/mac_iceland.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_roman.py ============================================================================== --- python/trunk/Lib/encodings/mac_roman.py (original) +++ python/trunk/Lib/encodings/mac_roman.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0xFB01: 0xDE, # LATIN SMALL LIGATURE FI 0xFB02: 0xDF, # LATIN SMALL LIGATURE FL } - Modified: python/trunk/Lib/encodings/mac_romanian.py ============================================================================== --- python/trunk/Lib/encodings/mac_romanian.py (original) +++ python/trunk/Lib/encodings/mac_romanian.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0x25CA: 0xD7, # LOZENGE 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/mac_turkish.py ============================================================================== --- python/trunk/Lib/encodings/mac_turkish.py (original) +++ python/trunk/Lib/encodings/mac_turkish.py Wed Mar 15 19:08:37 2006 @@ -563,4 +563,3 @@ 0xF8A0: 0xF5, # undefined1 0xF8FF: 0xF0, # Apple logo } - Modified: python/trunk/Lib/encodings/tis_620.py ============================================================================== --- python/trunk/Lib/encodings/tis_620.py (original) +++ python/trunk/Lib/encodings/tis_620.py Wed Mar 15 19:08:37 2006 @@ -554,4 +554,3 @@ 0x0E5A: 0xFA, # THAI CHARACTER ANGKHANKHU 0x0E5B: 0xFB, # THAI CHARACTER KHOMUT } - Modified: python/trunk/Lib/encodings/utf_7.py ============================================================================== --- python/trunk/Lib/encodings/utf_7.py (original) +++ python/trunk/Lib/encodings/utf_7.py Wed Mar 15 19:08:37 2006 @@ -38,4 +38,4 @@ incrementaldecoder=IncrementalDecoder, streamreader=StreamReader, streamwriter=StreamWriter, - ) \ No newline at end of file + ) Modified: python/trunk/Lib/runpy.py ============================================================================== --- python/trunk/Lib/runpy.py (original) +++ python/trunk/Lib/runpy.py Wed Mar 15 19:08:37 2006 @@ -239,7 +239,7 @@ importer = _FileSystemImporter(path_item) except ImportError: pass - return importer + return importer def _get_path_loader(mod_name, path=None): @@ -283,7 +283,7 @@ If the module or package is accessible via the normal import mechanism, a wrapper around the relevant part of that machinery is returned. - + Non PEP 302 mechanisms (e.g. the Windows registry) used by the standard import machinery to find files in alternative locations are partially supported, but are searched AFTER sys.path. Normally, @@ -328,7 +328,7 @@ else: # Top level module, so stick with default path sub_name = mod_name - + for importer in sys.meta_path: loader = importer.find_module(mod_name, path) if loader is not None: @@ -406,7 +406,7 @@ def run_module(mod_name, init_globals=None, run_name=None, alter_sys=False): """Execute a module's code without importing it - + Returns the resulting top level namespace dictionary """ loader = _get_loader(mod_name) @@ -418,7 +418,7 @@ filename = _get_filename(loader, mod_name) if run_name is None: run_name = mod_name - return _run_module_code(code, init_globals, run_name, + return _run_module_code(code, init_globals, run_name, filename, loader, alter_sys) Modified: python/trunk/Lib/test/test_runpy.py ============================================================================== --- python/trunk/Lib/test/test_runpy.py (original) +++ python/trunk/Lib/test/test_runpy.py Wed Mar 15 19:08:37 2006 @@ -165,8 +165,8 @@ def test_main(): - run_unittest(RunModuleCodeTest) - run_unittest(RunModuleTest) + run_unittest(RunModuleCodeTest) + run_unittest(RunModuleTest) if __name__ == "__main__": - test_main() \ No newline at end of file + test_main() From python-checkins at python.org Wed Mar 15 22:49:56 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 15 Mar 2006 22:49:56 +0100 (CET) Subject: [Python-checkins] r43053 - python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/cfield.c python/trunk/Modules/_ctypes/ctypes.h Message-ID: <20060315214956.595511E400A@bag.python.org> Author: thomas.heller Date: Wed Mar 15 22:49:52 2006 New Revision: 43053 Modified: python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/cfield.c python/trunk/Modules/_ctypes/ctypes.h Log: Backport from upstream version: compatibility with older Python versions. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Wed Mar 15 22:49:52 2006 @@ -3674,7 +3674,11 @@ if (cache == NULL) return NULL; } +#if (PY_VERSION_HEX < 0x02050000) + key = Py_BuildValue("(Oi)", itemtype, length); +#else key = Py_BuildValue("(On)", itemtype, length); +#endif if (!key) return NULL; result = PyDict_GetItem(cache, key); @@ -3698,7 +3702,11 @@ #endif result = PyObject_CallFunction((PyObject *)&ArrayType_Type, +#if (PY_VERSION_HEX < 0x02050000) + "s(O){s:i,s:O}", +#else "s(O){s:n,s:O}", +#endif name, &Array_Type, "_length_", Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Wed Mar 15 22:49:52 2006 @@ -250,11 +250,21 @@ name = ((PyTypeObject *)self->proto)->tp_name; if (bits) - result = PyString_FromFormat("", - name, (int)self->offset, size, bits); + result = PyString_FromFormat( +#if (PY_VERSION_HEX < 0x02050000) + "", +#else + "", +#endif + name, self->offset, size, bits); else - result = PyString_FromFormat("", - name, (int)self->offset, size); + result = PyString_FromFormat( +#if (PY_VERSION_HEX < 0x02050000) + "", +#else + "", +#endif + name, self->offset, size); return result; } Modified: python/trunk/Modules/_ctypes/ctypes.h ============================================================================== --- python/trunk/Modules/_ctypes/ctypes.h (original) +++ python/trunk/Modules/_ctypes/ctypes.h Wed Mar 15 22:49:52 2006 @@ -1,5 +1,18 @@ /******************************************************************/ +#if (PY_VERSION_HEX < 0x02050000) +typedef int Py_ssize_t; +#define lenfunc inquiry +#define readbufferproc getreadbufferproc +#define writebufferproc getwritebufferproc +#define segcountproc getsegcountproc +#define charbufferproc getcharbufferproc +#define ssizeargfunc intargfunc +#define ssizessizeargfunc intintargfunc +#define ssizeobjargproc intobjargproc +#define ssizessizeobjargproc intintobjargproc +#endif + #ifndef MS_WIN32 #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) From neal at metaslash.com Wed Mar 15 22:56:51 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 15 Mar 2006 16:56:51 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060315215651.GA9117@python.psfb.org> test_cfgparser leaked [2, 0, 0] references test_charmapcodec leaked [-54, 0, 0] references test_cmd_line leaked [15, 0, 0] references test_compiler leaked [66, 94, 117] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_socket leaked [0, 197, -197] references test_threadedtempfile leaked [4, 5, 2] references test_threading leaked [0, 1, 0] references test_threading_local leaked [42, 34, 42] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [65, 65, 68] references From python-checkins at python.org Wed Mar 15 23:13:14 2006 From: python-checkins at python.org (walter.doerwald) Date: Wed, 15 Mar 2006 23:13:14 +0100 (CET) Subject: [Python-checkins] r43054 - in python/trunk: Lib/test/test_StringIO.py Misc/NEWS Modules/cStringIO.c Message-ID: <20060315221314.C78091E400A@bag.python.org> Author: walter.doerwald Date: Wed Mar 15 23:13:13 2006 New Revision: 43054 Modified: python/trunk/Lib/test/test_StringIO.py python/trunk/Misc/NEWS python/trunk/Modules/cStringIO.c Log: SF patch #1359365: cStringIO.StringIO.isatty() will raise a ValueError now if close() has been called before (like file and StringIO.StringIO do) Modified: python/trunk/Lib/test/test_StringIO.py ============================================================================== --- python/trunk/Lib/test/test_StringIO.py (original) +++ python/trunk/Lib/test/test_StringIO.py Wed Mar 15 23:13:13 2006 @@ -75,6 +75,13 @@ f.close() self.assertEqual(f.closed, True) + def test_isatty(self): + f = self.MODULE.StringIO() + self.assertRaises(TypeError, f.isatty, None) + self.assertEqual(f.isatty(), False) + f.close() + self.assertRaises(ValueError, f.isatty) + def test_iterator(self): eq = self.assertEqual unless = self.failUnless Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 15 23:13:13 2006 @@ -449,6 +449,9 @@ codecs.getincrementaldecoder() and codecs.getincrementalencoder() have been added. +- SF patch #1359365: cStringIO.StringIO.isatty() will raise a ValueError + now if close() has been called before (like file and StringIO.StringIO do) + - A regrtest option -w was added to re-run failed tests in verbose mode. - Patch #1446372: quit and exit can now be called from the interactive Modified: python/trunk/Modules/cStringIO.c ============================================================================== --- python/trunk/Modules/cStringIO.c (original) +++ python/trunk/Modules/cStringIO.c Wed Mar 15 23:13:13 2006 @@ -144,7 +144,8 @@ static PyObject * IO_isatty(IOobject *self, PyObject *unused) { - Py_INCREF(Py_False); + if (!IO__opencheck(self)) return NULL; + Py_INCREF(Py_False); return Py_False; } From python-checkins at python.org Wed Mar 15 23:17:29 2006 From: python-checkins at python.org (walter.doerwald) Date: Wed, 15 Mar 2006 23:17:29 +0100 (CET) Subject: [Python-checkins] r43055 - python/trunk/Misc/NEWS Message-ID: <20060315221729.027961E400C@bag.python.org> Author: walter.doerwald Date: Wed Mar 15 23:17:27 2006 New Revision: 43055 Modified: python/trunk/Misc/NEWS Log: Document the other change from patch #1359365. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 15 23:17:27 2006 @@ -449,8 +449,10 @@ codecs.getincrementaldecoder() and codecs.getincrementalencoder() have been added. -- SF patch #1359365: cStringIO.StringIO.isatty() will raise a ValueError - now if close() has been called before (like file and StringIO.StringIO do) +- Patch #1359365: Calling next() on a closed StringIO.String object raises + a ValueError instead of a StopIteration now (like file and cString.String do). + cStringIO.StringIO.isatty() will raise a ValueError now if close() has been + called before (like file and StringIO.StringIO do). - A regrtest option -w was added to re-run failed tests in verbose mode. From python-checkins at python.org Wed Mar 15 23:47:11 2006 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 15 Mar 2006 23:47:11 +0100 (CET) Subject: [Python-checkins] r43056 - peps/trunk/pep-0008.txt Message-ID: <20060315224711.6E0101E400C@bag.python.org> Author: guido.van.rossum Date: Wed Mar 15 23:47:10 2006 New Revision: 43056 Modified: peps/trunk/pep-0008.txt Log: Discourage relative imports. Modified: peps/trunk/pep-0008.txt ============================================================================== --- peps/trunk/pep-0008.txt (original) +++ peps/trunk/pep-0008.txt Wed Mar 15 23:47:10 2006 @@ -156,8 +156,9 @@ - Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. - (However, once PEP 328 [7] is fully implemented, its style of - explicit relative imports will be recommended.) + Even now that PEP 328 [7] is fully implemented in Python 2.5, + its style of explicit relative imports is actively discouraged; + absolute imports are more portable and usually more readable. - When importing a class from a class-containing module, it's usually okay to spell this From python-checkins at python.org Thu Mar 16 00:08:14 2006 From: python-checkins at python.org (guido.van.rossum) Date: Thu, 16 Mar 2006 00:08:14 +0100 (CET) Subject: [Python-checkins] r43057 - in python/trunk/Lib: distutils/sysconfig.py encodings/__init__.py Message-ID: <20060315230814.0FD1F1E400D@bag.python.org> Author: guido.van.rossum Date: Thu Mar 16 00:08:13 2006 New Revision: 43057 Modified: python/trunk/Lib/distutils/sysconfig.py python/trunk/Lib/encodings/__init__.py Log: Instead of relative imports, use (implicitly) absolute ones. Modified: python/trunk/Lib/distutils/sysconfig.py ============================================================================== --- python/trunk/Lib/distutils/sysconfig.py (original) +++ python/trunk/Lib/distutils/sysconfig.py Thu Mar 16 00:08:13 2006 @@ -16,7 +16,7 @@ import string import sys -from .errors import DistutilsPlatformError +from distutils.errors import DistutilsPlatformError # These are needed in a couple of spots, so just compute them once. PREFIX = os.path.normpath(sys.prefix) Modified: python/trunk/Lib/encodings/__init__.py ============================================================================== --- python/trunk/Lib/encodings/__init__.py (original) +++ python/trunk/Lib/encodings/__init__.py Thu Mar 16 00:08:13 2006 @@ -29,7 +29,7 @@ """#" import codecs, types -from . import aliases +from encodings import aliases _cache = {} _unknown = '--unknown--' From python-checkins at python.org Thu Mar 16 02:14:48 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 02:14:48 +0100 (CET) Subject: [Python-checkins] r43059 - in python/trunk: Misc/NEWS Objects/obmalloc.c Message-ID: <20060316011448.587FF1E400D@bag.python.org> Author: tim.peters Date: Thu Mar 16 02:14:46 2006 New Revision: 43059 Modified: python/trunk/Misc/NEWS python/trunk/Objects/obmalloc.c Log: Merge the tim-obmalloc branch to the trunk. This is a heavily altered derivative of SF patch 1123430, Evan Jones's heroic effort to make obmalloc return unused arenas to the system free(), with some heuristic strategies to make it more likley that arenas eventually _can_ be freed. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Mar 16 02:14:46 2006 @@ -12,6 +12,18 @@ Core and builtins ----------------- +- Patch #1123430: Python's small-object allocator now returns an arena to + the system ``free()`` when all memory within an arena becomes unused + again. Prior to Python 2.5, arenas (256KB chunks of memory) were never + freed. Some applications will see a drop in virtual memory size now, + especially long-running applications that, from time to time, temporarily + use a large number of small objects. Note that when Python returns an + arena to the platform C's ``free()``, there's no guarantee that the + platform C will in turn return that memory to the operating system. The + effect of the patch is to stop making that impossible, and in tests it + appears to be effective at least on Microsoft C and gcc-based systems. + Thanks to Evan Jones for hard work and patience. + - Patch #1434038: property() now uses the getter's docstring if there is no "doc" argument given. This makes it possible to legitimately use property() as a decorator to produce a read-only property. Modified: python/trunk/Objects/obmalloc.c ============================================================================== --- python/trunk/Objects/obmalloc.c (original) +++ python/trunk/Objects/obmalloc.c Thu Mar 16 02:14:46 2006 @@ -217,16 +217,16 @@ * I don't care if these are defined in or elsewhere. Axiom. */ #undef uchar -#define uchar unsigned char /* assuming == 8 bits */ +#define uchar unsigned char /* assuming == 8 bits */ #undef uint -#define uint unsigned int /* assuming >= 16 bits */ +#define uint unsigned int /* assuming >= 16 bits */ #undef ulong -#define ulong unsigned long /* assuming >= 32 bits */ +#define ulong unsigned long /* assuming >= 32 bits */ #undef uptr -#define uptr Py_uintptr_t +#define uptr Py_uintptr_t /* When you say memory, my mind reasons in terms of (pointers to) blocks */ typedef uchar block; @@ -246,6 +246,47 @@ typedef struct pool_header *poolp; +/* Record keeping for arenas. */ +struct arena_object { + /* The address of the arena, as returned by malloc. Note that 0 + * will never be returned by a successful malloc, and is used + * here to mark an arena_object that doesn't correspond to an + * allocated arena. + */ + uptr address; + + /* Pool-aligned pointer to the next pool to be carved off. */ + block* pool_address; + + /* The number of available pools in the arena: free pools + never- + * allocated pools. + */ + uint nfreepools; + + /* The total number of pools in the arena, whether or not available. */ + uint ntotalpools; + + /* Singly-linked list of available pools. */ + struct pool_header* freepools; + + /* Whenever this arena_object is not associated with an allocated + * arena, the nextarena member is used to link all unassociated + * arena_objects in the singly-linked `unused_arena_objects` list. + * The prevarena member is unused in this case. + * + * When this arena_object is associated with an allocated arena + * with at least one available pool, both members are used in the + * doubly-linked `usable_arenas` list, which is maintained in + * increasing order of `nfreepools` values. + * + * Else this arena_object is associated with an allocated arena + * all of whose pools are in use. `nextarena` and `prevarena` + * are both meaningless in this case. + */ + struct arena_object* nextarena; + struct arena_object* prevarena; +}; + #undef ROUNDUP #define ROUNDUP(x) (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK) #define POOL_OVERHEAD ROUNDUP(sizeof(struct pool_header)) @@ -277,8 +318,9 @@ usedpools[0] corresponds to blocks of size 8, usedpools[2] to blocks of size 16, and so on: index 2*i <-> blocks of size (i+1)< 8 */ }; -/* - * Free (cached) pools +/*========================================================================== +Arena management. + +`arenas` is a vector of arena_objects. It contains maxarenas entries, some of +which may not be currently used (== they're arena_objects that aren't +currently associated with an allocated arena). Note that arenas proper are +separately malloc'ed. + +Prior to Python 2.5, arenas were never free()'ed. Starting with Python 2.5, +we do try to free() arenas, and use some mild heuristic strategies to increase +the likelihood that arenas eventually can be freed. + +unused_arena_objects + + This is a singly-linked list of the arena_objects that are currently not + being used (no arena is associated with them). Objects are taken off the + head of the list in new_arena(), and are pushed on the head of the list in + PyObject_Free() when the arena is empty. Key invariant: an arena_object + is on this list if and only if its .address member is 0. + +usable_arenas + + This is a doubly-linked list of the arena_objects associated with arenas + that have pools available. These pools are either waiting to be reused, + or have not been used before. The list is sorted to have the most- + allocated arenas first (ascending order based on the nfreepools member). + This means that the next allocation will come from a heavily used arena, + which gives the nearly empty arenas a chance to be returned to the system. + In my unscientific tests this dramatically improved the number of arenas + that could be freed. + +Note that an arena_object associated with an arena all of whose pools are +currently in use isn't on either list. +*/ + +/* Array of objects used to track chunks of memory (arenas). */ +static struct arena_object* arenas = NULL; +/* Number of slots currently allocated in the `arenas` vector. */ +static uint maxarenas = 0; + +/* The head of the singly-linked, NULL-terminated list of available + * arena_objects. */ -static poolp freepools = NULL; /* free list for cached pools */ +static struct arena_object* unused_arena_objects = NULL; -/*==========================================================================*/ -/* Arena management. */ +/* The head of the doubly-linked, NULL-terminated at each end, list of + * arena_objects associated with arenas that have pools available. + */ +static struct arena_object* usable_arenas = NULL; -/* arenas is a vector of arena base addresses, in order of allocation time. - * arenas currently contains narenas entries, and has space allocated - * for at most maxarenas entries. - * - * CAUTION: See the long comment block about thread safety in new_arena(): - * the code currently relies in deep ways on that this vector only grows, - * and only grows by appending at the end. For now we never return an arena - * to the OS. +/* How many arena_objects do we initially allocate? + * 16 = can allocate 16 arenas = 16 * ARENA_SIZE = 4MB before growing the + * `arenas` vector. */ -static uptr *volatile arenas = NULL; /* the pointer itself is volatile */ -static volatile uint narenas = 0; -static uint maxarenas = 0; +#define INITIAL_ARENA_OBJECTS 16 -/* Number of pools still available to be allocated in the current arena. */ -static uint nfreepools = 0; +/* Number of arenas allocated that haven't been free()'d. */ +static ulong narenas_currently_allocated = 0; -/* Free space start address in current arena. This is pool-aligned. */ -static block *arenabase = NULL; +#ifdef PYMALLOC_DEBUG +/* Total number of times malloc() called to allocate an arena. */ +static ulong ntimes_arena_allocated = 0; +/* High water mark (max value ever seen) for narenas_currently_allocated. */ +static ulong narenas_highwater = 0; +#endif -/* Allocate a new arena and return its base address. If we run out of - * memory, return NULL. +/* Allocate a new arena. If we run out of memory, return NULL. Else + * allocate a new arena, and return the address of an arena_object + * describing the new arena. It's expected that the caller will set + * `usable_arenas` to the return value. */ -static block * +static struct arena_object* new_arena(void) { + struct arena_object* arenaobj; uint excess; /* number of bytes above pool alignment */ - block *bp = (block *)malloc(ARENA_SIZE); - if (bp == NULL) - return NULL; #ifdef PYMALLOC_DEBUG if (Py_GETENV("PYTHONMALLOCSTATS")) _PyObject_DebugMallocStats(); #endif + if (unused_arena_objects == NULL) { + uint i; + uint numarenas; + size_t nbytes; - /* arenabase <- first pool-aligned address in the arena - nfreepools <- number of whole pools that fit after alignment */ - arenabase = bp; - nfreepools = ARENA_SIZE / POOL_SIZE; - assert(POOL_SIZE * nfreepools == ARENA_SIZE); - excess = (uint) ((Py_uintptr_t)bp & POOL_SIZE_MASK); - if (excess != 0) { - --nfreepools; - arenabase += POOL_SIZE - excess; - } + /* Double the number of arena objects on each allocation. + * Note that it's possible for `numarenas` to overflow. + */ + numarenas = maxarenas ? maxarenas << 1 : INITIAL_ARENA_OBJECTS; + if (numarenas <= maxarenas) + return NULL; /* overflow */ + nbytes = numarenas * sizeof(*arenas); + if (nbytes / sizeof(*arenas) != numarenas) + return NULL; /* overflow */ + arenaobj = realloc(arenas, nbytes); + if (arenaobj == NULL) + return NULL; + arenas = arenaobj; + + /* We might need to fix pointers that were copied. However, + * new_arena only gets called when all the pages in the + * previous arenas are full. Thus, there are *no* pointers + * into the old array. Thus, we don't have to worry about + * invalid pointers. Just to be sure, some asserts: + */ + assert(usable_arenas == NULL); + assert(unused_arena_objects == NULL); - /* Make room for a new entry in the arenas vector. */ - if (arenas == NULL) { - assert(narenas == 0 && maxarenas == 0); - arenas = (uptr *)malloc(16 * sizeof(*arenas)); - if (arenas == NULL) - goto error; - maxarenas = 16; + /* Put the new arenas on the unused_arena_objects list. */ + for (i = maxarenas; i < numarenas; ++i) { + arenas[i].address = 0; /* mark as unassociated */ + arenas[i].nextarena = i < numarenas - 1 ? + &arenas[i+1] : NULL; + } + + /* Update globals. */ + unused_arena_objects = &arenas[maxarenas]; + maxarenas = numarenas; } - else if (narenas == maxarenas) { - /* Grow arenas. - * - * Exceedingly subtle: Someone may be calling the pymalloc - * free via PyMem_{DEL, Del, FREE, Free} without holding the - *.GIL. Someone else may simultaneously be calling the - * pymalloc malloc while holding the GIL via, e.g., - * PyObject_New. Now the pymalloc free may index into arenas - * for an address check, while the pymalloc malloc calls - * new_arena and we end up here to grow a new arena *and* - * grow the arenas vector. If the value for arenas pymalloc - * free picks up "vanishes" during this resize, anything may - * happen, and it would be an incredibly rare bug. Therefore - * the code here takes great pains to make sure that, at every - * moment, arenas always points to an intact vector of - * addresses. It doesn't matter whether arenas points to a - * wholly up-to-date vector when pymalloc free checks it in - * this case, because the only legal (and that even this is - * legal is debatable) way to call PyMem_{Del, etc} while not - * holding the GIL is if the memory being released is not - * object memory, i.e. if the address check in pymalloc free - * is supposed to fail. Having an incomplete vector can't - * make a supposed-to-fail case succeed by mistake (it could - * only make a supposed-to-succeed case fail by mistake). - * - * In addition, without a lock we can't know for sure when - * an old vector is no longer referenced, so we simply let - * old vectors leak. - * - * And on top of that, since narenas and arenas can't be - * changed as-a-pair atomically without a lock, we're also - * careful to declare them volatile and ensure that we change - * arenas first. This prevents another thread from picking - * up an narenas value too large for the arenas value it - * reads up (arenas never shrinks). - * - * Read the above 50 times before changing anything in this - * block. + + /* Take the next available arena object off the head of the list. */ + assert(unused_arena_objects != NULL); + arenaobj = unused_arena_objects; + unused_arena_objects = arenaobj->nextarena; + assert(arenaobj->address == 0); + arenaobj->address = (uptr)malloc(ARENA_SIZE); + if (arenaobj->address == 0) { + /* The allocation failed: return NULL after putting the + * arenaobj back. */ - uptr *p; - uint newmax = maxarenas << 1; - if (newmax <= maxarenas) /* overflow */ - goto error; - p = (uptr *)malloc(newmax * sizeof(*arenas)); - if (p == NULL) - goto error; - memcpy(p, arenas, narenas * sizeof(*arenas)); - arenas = p; /* old arenas deliberately leaked */ - maxarenas = newmax; + arenaobj->nextarena = unused_arena_objects; + unused_arena_objects = arenaobj; + return NULL; } - /* Append the new arena address to arenas. */ - assert(narenas < maxarenas); - arenas[narenas] = (uptr)bp; - ++narenas; /* can't overflow, since narenas < maxarenas before */ - return bp; + ++narenas_currently_allocated; +#ifdef PYMALLOC_DEBUG + ++ntimes_arena_allocated; + if (narenas_currently_allocated > narenas_highwater) + narenas_highwater = narenas_currently_allocated; +#endif + arenaobj->freepools = NULL; + /* pool_address <- first pool-aligned address in the arena + nfreepools <- number of whole pools that fit after alignment */ + arenaobj->pool_address = (block*)arenaobj->address; + arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE; + assert(POOL_SIZE * arenaobj->nfreepools == ARENA_SIZE); + excess = (uint)(arenaobj->address & POOL_SIZE_MASK); + if (excess != 0) { + --arenaobj->nfreepools; + arenaobj->pool_address += POOL_SIZE - excess; + } + arenaobj->ntotalpools = arenaobj->nfreepools; -error: - free(bp); - nfreepools = 0; - return NULL; + return arenaobj; } -/* Return true if and only if P is an address that was allocated by - * pymalloc. I must be the index into arenas that the address claims - * to come from. - * - * Tricky: Letting B be the arena base address in arenas[I], P belongs to the - * arena if and only if - * B <= P < B + ARENA_SIZE - * Subtracting B throughout, this is true iff - * 0 <= P-B < ARENA_SIZE - * By using unsigned arithmetic, the "0 <=" half of the test can be skipped. - * - * Obscure: A PyMem "free memory" function can call the pymalloc free or - * realloc before the first arena has been allocated. arenas is still - * NULL in that case. We're relying on that narenas is also 0 in that case, - * so the (I) < narenas must be false, saving us from trying to index into - * a NULL arenas. - */ -#define Py_ADDRESS_IN_RANGE(P, POOL) \ - ((POOL)->arenaindex < narenas && \ - (uptr)(P) - arenas[(POOL)->arenaindex] < (uptr)ARENA_SIZE) +/* +Py_ADDRESS_IN_RANGE(P, POOL) + +Return true if and only if P is an address that was allocated by pymalloc. +POOL must be the pool address associated with P, i.e., POOL = POOL_ADDR(P) +(the caller is asked to compute this because the macro expands POOL more than +once, and for efficiency it's best for the caller to assign POOL_ADDR(P) to a +variable and pass the latter to the macro; because Py_ADDRESS_IN_RANGE is +called on every alloc/realloc/free, micro-efficiency is important here). + +Tricky: Let B be the arena base address associated with the pool, B = +arenas[(POOL)->arenaindex].address. Then P belongs to the arena if and only if + + B <= P < B + ARENA_SIZE + +Subtracting B throughout, this is true iff + + 0 <= P-B < ARENA_SIZE + +By using unsigned arithmetic, the "0 <=" half of the test can be skipped. + +Obscure: A PyMem "free memory" function can call the pymalloc free or realloc +before the first arena has been allocated. `arenas` is still NULL in that +case. We're relying on that maxarenas is also 0 in that case, so that +(POOL)->arenaindex < maxarenas must be false, saving us from trying to index +into a NULL arenas. + +Details: given P and POOL, the arena_object corresponding to P is AO = +arenas[(POOL)->arenaindex]. Suppose obmalloc controls P. Then (barring wild +stores, etc), POOL is the correct address of P's pool, AO.address is the +correct base address of the pool's arena, and P must be within ARENA_SIZE of +AO.address. In addition, AO.address is not 0 (no arena can start at address 0 +(NULL)). Therefore Py_ADDRESS_IN_RANGE correctly reports that obmalloc +controls P. + +Now suppose obmalloc does not control P (e.g., P was obtained via a direct +call to the system malloc() or realloc()). (POOL)->arenaindex may be anything +in this case -- it may even be uninitialized trash. If the trash arenaindex +is >= maxarenas, the macro correctly concludes at once that obmalloc doesn't +control P. + +Else arenaindex is < maxarena, and AO is read up. If AO corresponds to an +allocated arena, obmalloc controls all the memory in slice AO.address : +AO.address+ARENA_SIZE. By case assumption, P is not controlled by obmalloc, +so P doesn't lie in that slice, so the macro correctly reports that P is not +controlled by obmalloc. + +Finally, if P is not controlled by obmalloc and AO corresponds to an unused +arena_object (one not currently associated with an allocated arena), +AO.address is 0, and the second test in the macro reduces to: + + P < ARENA_SIZE + +If P >= ARENA_SIZE (extremely likely), the macro again correctly concludes +that P is not controlled by obmalloc. However, if P < ARENA_SIZE, this part +of the test still passes, and the third clause (AO.address != 0) is necessary +to get the correct result: AO.address is 0 in this case, so the macro +correctly reports that P is not controlled by obmalloc (despite that P lies in +slice AO.address : AO.address + ARENA_SIZE). + +Note: The third (AO.address != 0) clause was added in Python 2.5. Before +2.5, arenas were never free()'ed, and an arenaindex < maxarena always +corresponded to a currently-allocated arena, so the "P is not controlled by +obmalloc, AO corresponds to an unused arena_object, and P < ARENA_SIZE" case +was impossible. + +Note that the logic is excruciating, and reading up possibly uninitialized +memory when P is not controlled by obmalloc (to get at (POOL)->arenaindex) +creates problems for some memory debuggers. The overwhelming advantage is +that this test determines whether an arbitrary address is controlled by +obmalloc in a small constant time, independent of the number of arenas +obmalloc controls. Since this test is needed at every entry point, it's +extremely desirable that it be this fast. +*/ +#define Py_ADDRESS_IN_RANGE(P, POOL) \ + ((POOL)->arenaindex < maxarenas && \ + (uptr)(P) - arenas[(POOL)->arenaindex].address < (uptr)ARENA_SIZE && \ + arenas[(POOL)->arenaindex].address != 0) + /* This is only useful when running memory debuggers such as * Purify or Valgrind. Uncomment to use. @@ -599,7 +733,7 @@ /* * Most frequent paths first */ - size = (uint )(nbytes - 1) >> ALIGNMENT_SHIFT; + size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; pool = usedpools[size + size]; if (pool != pool->nextpool) { /* @@ -614,22 +748,18 @@ return (void *)bp; } /* - * Reached the end of the free list, try to extend it + * Reached the end of the free list, try to extend it. */ if (pool->nextoffset <= pool->maxnextoffset) { - /* - * There is room for another block - */ - pool->freeblock = (block *)pool + + /* There is room for another block. */ + pool->freeblock = (block*)pool + pool->nextoffset; pool->nextoffset += INDEX2SIZE(size); *(block **)(pool->freeblock) = NULL; UNLOCK(); return (void *)bp; } - /* - * Pool is full, unlink from used pools - */ + /* Pool is full, unlink from used pools. */ next = pool->nextpool; pool = pool->prevpool; next->prevpool = pool; @@ -637,19 +767,68 @@ UNLOCK(); return (void *)bp; } - /* - * Try to get a cached free pool + + /* There isn't a pool of the right size class immediately + * available: use a free pool. */ - pool = freepools; + if (usable_arenas == NULL) { + /* No arena has a free pool: allocate a new arena. */ +#ifdef WITH_MEMORY_LIMITS + if (narenas_currently_allocated >= MAX_ARENAS) { + UNLOCK(); + goto redirect; + } +#endif + usable_arenas = new_arena(); + if (usable_arenas == NULL) { + UNLOCK(); + goto redirect; + } + usable_arenas->nextarena = + usable_arenas->prevarena = NULL; + } + assert(usable_arenas->address != 0); + + /* Try to get a cached free pool. */ + pool = usable_arenas->freepools; if (pool != NULL) { - /* - * Unlink from cached pools + /* Unlink from cached pools. */ + usable_arenas->freepools = pool->nextpool; + + /* This arena already had the smallest nfreepools + * value, so decreasing nfreepools doesn't change + * that, and we don't need to rearrange the + * usable_arenas list. However, if the arena has + * become wholly allocated, we need to remove its + * arena_object from usable_arenas. */ - freepools = pool->nextpool; + --usable_arenas->nfreepools; + if (usable_arenas->nfreepools == 0) { + /* Wholly allocated: remove. */ + assert(usable_arenas->freepools == NULL); + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); + + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) { + usable_arenas->prevarena = NULL; + assert(usable_arenas->address != 0); + } + } + else { + /* nfreepools > 0: it must be that freepools + * isn't NULL, or that we haven't yet carved + * off all the arena's pools for the first + * time. + */ + assert(usable_arenas->freepools != NULL || + usable_arenas->pool_address <= + (block*)usable_arenas->address + + ARENA_SIZE - POOL_SIZE); + } init_pool: - /* - * Frontlink to used pools - */ + /* Frontlink to used pools. */ next = usedpools[size + size]; /* == prev */ pool->nextpool = next; pool->prevpool = next; @@ -657,8 +836,7 @@ next->prevpool = pool; pool->ref.count = 1; if (pool->szidx == size) { - /* - * Luckily, this pool last contained blocks + /* Luckily, this pool last contained blocks * of the same size class, so its header * and free list are already initialized. */ @@ -682,39 +860,38 @@ UNLOCK(); return (void *)bp; } - /* - * Allocate new pool - */ - if (nfreepools) { - commit_pool: - --nfreepools; - pool = (poolp)arenabase; - arenabase += POOL_SIZE; - pool->arenaindex = narenas - 1; - pool->szidx = DUMMY_SIZE_IDX; - goto init_pool; - } - /* - * Allocate new arena - */ -#ifdef WITH_MEMORY_LIMITS - if (!(narenas < MAX_ARENAS)) { - UNLOCK(); - goto redirect; + + /* Carve off a new pool. */ + assert(usable_arenas->nfreepools > 0); + assert(usable_arenas->freepools == NULL); + pool = (poolp)usable_arenas->pool_address; + assert((block*)pool <= (block*)usable_arenas->address + + ARENA_SIZE - POOL_SIZE); + pool->arenaindex = usable_arenas - arenas; + assert(&arenas[pool->arenaindex] == usable_arenas); + pool->szidx = DUMMY_SIZE_IDX; + usable_arenas->pool_address += POOL_SIZE; + --usable_arenas->nfreepools; + + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); + /* Unlink the arena: it is completely allocated. */ + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) { + usable_arenas->prevarena = NULL; + assert(usable_arenas->address != 0); + } } -#endif - bp = new_arena(); - if (bp != NULL) - goto commit_pool; - UNLOCK(); - goto redirect; + + goto init_pool; } /* The small block allocator ends here. */ redirect: - /* - * Redirect the original request to the underlying (libc) allocator. + /* Redirect the original request to the underlying (libc) allocator. * We jump here on bigger requests, on error in the code above (as a * last chance to serve the request) or when the max memory limit * has been reached. @@ -742,8 +919,7 @@ if (Py_ADDRESS_IN_RANGE(p, pool)) { /* We allocated this address. */ LOCK(); - /* - * Link p to the start of the pool's freeblock list. Since + /* Link p to the start of the pool's freeblock list. Since * the pool had at least the p block outstanding, the pool * wasn't empty (so it's already in a usedpools[] list, or * was full and is in no list -- it's not in the freeblocks @@ -753,8 +929,10 @@ *(block **)p = lastfree = pool->freeblock; pool->freeblock = (block *)p; if (lastfree) { - /* - * freeblock wasn't NULL, so the pool wasn't full, + struct arena_object* ao; + uint nf; /* ao->nfreepools */ + + /* freeblock wasn't NULL, so the pool wasn't full, * and the pool is in a usedpools[] list. */ if (--pool->ref.count != 0) { @@ -762,8 +940,7 @@ UNLOCK(); return; } - /* - * Pool is now empty: unlink from usedpools, and + /* Pool is now empty: unlink from usedpools, and * link to the front of freepools. This ensures that * previously freed pools will be allocated later * (being not referenced, they are perhaps paged out). @@ -772,16 +949,147 @@ prev = pool->prevpool; next->prevpool = prev; prev->nextpool = next; - /* Link to freepools. This is a singly-linked list, - * and pool->prevpool isn't used there. + + /* Link the pool to freepools. This is a singly-linked + * list, and pool->prevpool isn't used there. */ - pool->nextpool = freepools; - freepools = pool; + ao = &arenas[pool->arenaindex]; + pool->nextpool = ao->freepools; + ao->freepools = pool; + nf = ++ao->nfreepools; + + /* All the rest is arena management. We just freed + * a pool, and there are 4 cases for arena mgmt: + * 1. If all the pools are free, return the arena to + * the system free(). + * 2. If this is the only free pool in the arena, + * add the arena back to the `usable_arenas` list. + * 3. If the "next" arena has a smaller count of free + * pools, we have to "slide this arena right" to + * restore that usable_arenas is sorted in order of + * nfreepools. + * 4. Else there's nothing more to do. + */ + if (nf == ao->ntotalpools) { + /* Case 1. First unlink ao from usable_arenas. + */ + assert(ao->prevarena == NULL || + ao->prevarena->address != 0); + assert(ao ->nextarena == NULL || + ao->nextarena->address != 0); + + /* Fix the pointer in the prevarena, or the + * usable_arenas pointer. + */ + if (ao->prevarena == NULL) { + usable_arenas = ao->nextarena; + assert(usable_arenas == NULL || + usable_arenas->address != 0); + } + else { + assert(ao->prevarena->nextarena == ao); + ao->prevarena->nextarena = + ao->nextarena; + } + /* Fix the pointer in the nextarena. */ + if (ao->nextarena != NULL) { + assert(ao->nextarena->prevarena == ao); + ao->nextarena->prevarena = + ao->prevarena; + } + /* Record that this arena_object slot is + * available to be reused. + */ + ao->nextarena = unused_arena_objects; + unused_arena_objects = ao; + + /* Free the entire arena. */ + free((void *)ao->address); + ao->address = 0; /* mark unassociated */ + --narenas_currently_allocated; + + UNLOCK(); + return; + } + if (nf == 1) { + /* Case 2. Put ao at the head of + * usable_arenas. Note that because + * ao->nfreepools was 0 before, ao isn't + * currently on the usable_arenas list. + */ + ao->nextarena = usable_arenas; + ao->prevarena = NULL; + if (usable_arenas) + usable_arenas->prevarena = ao; + usable_arenas = ao; + assert(usable_arenas->address != 0); + + UNLOCK(); + return; + } + /* If this arena is now out of order, we need to keep + * the list sorted. The list is kept sorted so that + * the "most full" arenas are used first, which allows + * the nearly empty arenas to be completely freed. In + * a few un-scientific tests, it seems like this + * approach allowed a lot more memory to be freed. + */ + if (ao->nextarena == NULL || + nf <= ao->nextarena->nfreepools) { + /* Case 4. Nothing to do. */ + UNLOCK(); + return; + } + /* Case 3: We have to move the arena towards the end + * of the list, because it has more free pools than + * the arena to its right. + * First unlink ao from usable_arenas. + */ + if (ao->prevarena != NULL) { + /* ao isn't at the head of the list */ + assert(ao->prevarena->nextarena == ao); + ao->prevarena->nextarena = ao->nextarena; + } + else { + /* ao is at the head of the list */ + assert(usable_arenas == ao); + usable_arenas = ao->nextarena; + } + ao->nextarena->prevarena = ao->prevarena; + + /* Locate the new insertion point by iterating over + * the list, using our nextarena pointer. + */ + while (ao->nextarena != NULL && + nf > ao->nextarena->nfreepools) { + ao->prevarena = ao->nextarena; + ao->nextarena = ao->nextarena->nextarena; + } + + /* Insert ao at this point. */ + assert(ao->nextarena == NULL || + ao->prevarena == ao->nextarena->prevarena); + assert(ao->prevarena->nextarena == ao->nextarena); + + ao->prevarena->nextarena = ao; + if (ao->nextarena != NULL) + ao->nextarena->prevarena = ao; + + /* Verify that the swaps worked. */ + assert(ao->nextarena == NULL || + nf <= ao->nextarena->nfreepools); + assert(ao->prevarena == NULL || + nf > ao->prevarena->nfreepools); + assert(ao->nextarena == NULL || + ao->nextarena->prevarena == ao); + assert((usable_arenas == ao && + ao->prevarena == NULL) || + ao->prevarena->nextarena == ao); + UNLOCK(); return; } - /* - * Pool was full, so doesn't currently live in any list: + /* Pool was full, so doesn't currently live in any list: * link it to the front of the appropriate usedpools[] list. * This mimics LRU pool usage for new allocations and * targets optimal filling when several pools contain @@ -1302,6 +1610,8 @@ * full pools. */ ulong quantization = 0; + /* # of arenas actually allocated. */ + ulong narenas = 0; /* running total -- should equal narenas * ARENA_SIZE */ ulong total; char buf[128]; @@ -1316,36 +1626,38 @@ * to march over all the arenas. If we're lucky, most of the memory * will be living in full pools -- would be a shame to miss them. */ - for (i = 0; i < narenas; ++i) { + for (i = 0; i < maxarenas; ++i) { uint poolsinarena; uint j; - uptr base = arenas[i]; + uptr base = arenas[i].address; + + /* Skip arenas which are not allocated. */ + if (arenas[i].address == (uptr)NULL) + continue; + narenas += 1; + + poolsinarena = arenas[i].ntotalpools; + numfreepools += arenas[i].nfreepools; /* round up to pool alignment */ - poolsinarena = ARENA_SIZE / POOL_SIZE; if (base & (uptr)POOL_SIZE_MASK) { - --poolsinarena; arena_alignment += POOL_SIZE; base &= ~(uptr)POOL_SIZE_MASK; base += POOL_SIZE; } - if (i == narenas - 1) { - /* current arena may have raw memory at the end */ - numfreepools += nfreepools; - poolsinarena -= nfreepools; - } - /* visit every pool in the arena */ - for (j = 0; j < poolsinarena; ++j, base += POOL_SIZE) { + assert(base <= (uptr) arenas[i].pool_address); + for (j = 0; + base < (uptr) arenas[i].pool_address; + ++j, base += POOL_SIZE) { poolp p = (poolp)base; const uint sz = p->szidx; uint freeblocks; if (p->ref.count == 0) { /* currently unused */ - ++numfreepools; - assert(pool_is_in_list(p, freepools)); + assert(pool_is_in_list(p, arenas[i].freepools)); continue; } ++numpools[sz]; @@ -1358,6 +1670,7 @@ #endif } } + assert(narenas == narenas_currently_allocated); fputc('\n', stderr); fputs("class size num pools blocks in use avail blocks\n" @@ -1383,9 +1696,14 @@ fputc('\n', stderr); (void)printone("# times object malloc called", serialno); + (void)printone("# arenas allocated total", ntimes_arena_allocated); + (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas); + (void)printone("# arenas highwater mark", narenas_highwater); + (void)printone("# arenas allocated current", narenas); + PyOS_snprintf(buf, sizeof(buf), - "%u arenas * %d bytes/arena", narenas, ARENA_SIZE); - (void)printone(buf, (ulong)narenas * ARENA_SIZE); + "%lu arenas * %d bytes/arena", narenas, ARENA_SIZE); + (void)printone(buf, narenas * ARENA_SIZE); fputc('\n', stderr); @@ -1405,12 +1723,14 @@ #endif /* PYMALLOC_DEBUG */ #ifdef Py_USING_MEMORY_DEBUGGER -/* Make this function last so gcc won't inline it - since the definition is after the reference. */ +/* Make this function last so gcc won't inline it since the definition is + * after the reference. + */ int Py_ADDRESS_IN_RANGE(void *P, poolp pool) { - return ((pool->arenaindex) < narenas && - (uptr)(P) - arenas[pool->arenaindex] < (uptr)ARENA_SIZE); + return pool->arenaindex < maxarenas && + (uptr)P - arenas[pool->arenaindex].address < (uptr)ARENA_SIZE && + arenas[pool->arenaindex].address != 0; } #endif From python-checkins at python.org Thu Mar 16 02:16:09 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 02:16:09 +0100 (CET) Subject: [Python-checkins] r43060 - python/branches/tim-obmalloc Message-ID: <20060316011609.CE0E51E400D@bag.python.org> Author: tim.peters Date: Thu Mar 16 02:16:09 2006 New Revision: 43060 Removed: python/branches/tim-obmalloc/ Log: This branch has been merged to the trunk. From python-checkins at python.org Thu Mar 16 02:54:16 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 02:54:16 +0100 (CET) Subject: [Python-checkins] r43061 - python/trunk/Tools/buildbot/clean.bat Message-ID: <20060316015416.76BE91E400D@bag.python.org> Author: tim.peters Date: Thu Mar 16 02:54:16 2006 New Revision: 43061 Modified: python/trunk/Tools/buildbot/clean.bat Log: Change the Windows buildbot "clean" step to remove stale .pyc files. Modified: python/trunk/Tools/buildbot/clean.bat ============================================================================== --- python/trunk/Tools/buildbot/clean.bat (original) +++ python/trunk/Tools/buildbot/clean.bat Thu Mar 16 02:54:16 2006 @@ -1,3 +1,6 @@ @rem Used by the buildbot "clean" step. call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /clean Debug PCbuild\pcbuild.sln +cd PCbuild +devenv.com /clean Debug pcbuild.sln + at echo Deleting .pyc/.pyo files ... +python_d.exe rmpyc.py From python-checkins at python.org Thu Mar 16 02:56:34 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 02:56:34 +0100 (CET) Subject: [Python-checkins] r43062 - python/branches/release24-maint/Tools/buildbot/clean.bat Message-ID: <20060316015634.DBFA91E4010@bag.python.org> Author: tim.peters Date: Thu Mar 16 02:56:34 2006 New Revision: 43062 Modified: python/branches/release24-maint/Tools/buildbot/clean.bat Log: Merge rev 43061 from the trunk. Change the Windows buildbot "clean" step to remove stale .pyc files. Modified: python/branches/release24-maint/Tools/buildbot/clean.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/clean.bat (original) +++ python/branches/release24-maint/Tools/buildbot/clean.bat Thu Mar 16 02:56:34 2006 @@ -1,3 +1,6 @@ @rem Used by the buildbot "clean" step. call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /clean Debug PCbuild\pcbuild.sln +cd PCbuild +devenv.com /clean Debug pcbuild.sln + at echo Deleting .pyc/.pyo files ... +python_d.exe rmpyc.py From python-checkins at python.org Thu Mar 16 03:31:37 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 03:31:37 +0100 (CET) Subject: [Python-checkins] r43063 - python/trunk/Tools/buildbot/clean.bat Message-ID: <20060316023137.2DB2C1E400D@bag.python.org> Author: tim.peters Date: Thu Mar 16 03:31:36 2006 New Revision: 43063 Modified: python/trunk/Tools/buildbot/clean.bat Log: Oops! Use python_d.exe _before_ it's destroyed :-) Modified: python/trunk/Tools/buildbot/clean.bat ============================================================================== --- python/trunk/Tools/buildbot/clean.bat (original) +++ python/trunk/Tools/buildbot/clean.bat Thu Mar 16 03:31:36 2006 @@ -1,6 +1,6 @@ @rem Used by the buildbot "clean" step. call "%VS71COMNTOOLS%vsvars32.bat" cd PCbuild -devenv.com /clean Debug pcbuild.sln @echo Deleting .pyc/.pyo files ... python_d.exe rmpyc.py +devenv.com /clean Debug pcbuild.sln From python-checkins at python.org Thu Mar 16 03:33:58 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 03:33:58 +0100 (CET) Subject: [Python-checkins] r43064 - python/branches/release24-maint/Tools/buildbot/clean.bat Message-ID: <20060316023358.C65D01E400D@bag.python.org> Author: tim.peters Date: Thu Mar 16 03:33:55 2006 New Revision: 43064 Modified: python/branches/release24-maint/Tools/buildbot/clean.bat Log: Merge rev 43063 from trunk. Oops! Use python_d.exe _before_ it's destroyed :-) Modified: python/branches/release24-maint/Tools/buildbot/clean.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/clean.bat (original) +++ python/branches/release24-maint/Tools/buildbot/clean.bat Thu Mar 16 03:33:55 2006 @@ -1,6 +1,6 @@ @rem Used by the buildbot "clean" step. call "%VS71COMNTOOLS%vsvars32.bat" cd PCbuild -devenv.com /clean Debug pcbuild.sln @echo Deleting .pyc/.pyo files ... python_d.exe rmpyc.py +devenv.com /clean Debug pcbuild.sln From python-checkins at python.org Thu Mar 16 07:01:26 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:01:26 +0100 (CET) Subject: [Python-checkins] r43065 - python/branches/p3yk/Parser/parsetok.c Message-ID: <20060316060126.285231E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:01:25 2006 New Revision: 43065 Modified: python/branches/p3yk/Parser/parsetok.c Log: Get rid of compiler warning about with_msg and as_msg being unused Modified: python/branches/p3yk/Parser/parsetok.c ============================================================================== --- python/branches/p3yk/Parser/parsetok.c (original) +++ python/branches/p3yk/Parser/parsetok.c Thu Mar 16 07:01:25 2006 @@ -92,11 +92,13 @@ /* Parse input coming from the given tokenizer structure. Return error code. */ +#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD static char with_msg[] = "%s:%d: Warning: 'with' will become a reserved keyword in Python 2.6\n"; static char as_msg[] = "%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; +#endif static void warn(const char *msg, const char *filename, int lineno) From python-checkins at python.org Thu Mar 16 07:02:13 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:02:13 +0100 (CET) Subject: [Python-checkins] r43066 - in python/branches/p3yk: Doc/lib/libdis.tex Include/opcode.h Lib/compiler/pycodegen.py Lib/opcode.py Python/ceval.c Python/compile.c Message-ID: <20060316060213.592C91E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:02:10 2006 New Revision: 43066 Modified: python/branches/p3yk/Doc/lib/libdis.tex python/branches/p3yk/Include/opcode.h python/branches/p3yk/Lib/compiler/pycodegen.py python/branches/p3yk/Lib/opcode.py python/branches/p3yk/Python/ceval.c python/branches/p3yk/Python/compile.c Log: Get rid of last vestiges of BINARY_DIVIDE. Modified: python/branches/p3yk/Doc/lib/libdis.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libdis.tex (original) +++ python/branches/p3yk/Doc/lib/libdis.tex Thu Mar 16 07:02:10 2006 @@ -189,11 +189,6 @@ Implements \code{TOS = TOS1 * TOS}. \end{opcodedesc} -\begin{opcodedesc}{BINARY_DIVIDE}{} -Implements \code{TOS = TOS1 / TOS} when -\code{from __future__ import division} is not in effect. -\end{opcodedesc} - \begin{opcodedesc}{BINARY_FLOOR_DIVIDE}{} Implements \code{TOS = TOS1 // TOS}. \end{opcodedesc} Modified: python/branches/p3yk/Include/opcode.h ============================================================================== --- python/branches/p3yk/Include/opcode.h (original) +++ python/branches/p3yk/Include/opcode.h Thu Mar 16 07:02:10 2006 @@ -26,7 +26,7 @@ #define BINARY_POWER 19 #define BINARY_MULTIPLY 20 -#define BINARY_DIVIDE 21 + #define BINARY_MODULO 22 #define BINARY_ADD 23 #define BINARY_SUBTRACT 24 Modified: python/branches/p3yk/Lib/compiler/pycodegen.py ============================================================================== --- python/branches/p3yk/Lib/compiler/pycodegen.py (original) +++ python/branches/p3yk/Lib/compiler/pycodegen.py Thu Mar 16 07:02:10 2006 @@ -206,14 +206,12 @@ self.setups = misc.Stack() self.last_lineno = None self._setupGraphDelegation() - self._div_op = "BINARY_DIVIDE" # XXX set flags based on future features futures = self.get_module().futures for feature in futures: if feature == "division": self.graph.setFlag(CO_FUTURE_DIVISION) - self._div_op = "BINARY_TRUE_DIVIDE" elif feature == "absolute_import": self.graph.setFlag(CO_FUTURE_ABSIMPORT) elif feature == "with_statement": @@ -1177,7 +1175,7 @@ return self.binaryOp(node, 'BINARY_MULTIPLY') def visitDiv(self, node): - return self.binaryOp(node, self._div_op) + return self.binaryOp(node, 'BINARY_TRUE_DIVIDE') def visitFloorDiv(self, node): return self.binaryOp(node, 'BINARY_FLOOR_DIVIDE') Modified: python/branches/p3yk/Lib/opcode.py ============================================================================== --- python/branches/p3yk/Lib/opcode.py (original) +++ python/branches/p3yk/Lib/opcode.py Thu Mar 16 07:02:10 2006 @@ -61,7 +61,7 @@ def_op('LIST_APPEND', 18) def_op('BINARY_POWER', 19) def_op('BINARY_MULTIPLY', 20) -def_op('BINARY_DIVIDE', 21) + def_op('BINARY_MODULO', 22) def_op('BINARY_ADD', 23) def_op('BINARY_SUBTRACT', 24) Modified: python/branches/p3yk/Python/ceval.c ============================================================================== --- python/branches/p3yk/Python/ceval.c (original) +++ python/branches/p3yk/Python/ceval.c Thu Mar 16 07:02:10 2006 @@ -1073,19 +1073,6 @@ if (x != NULL) continue; break; - case BINARY_DIVIDE: - if (!_Py_QnewFlag) { - w = POP(); - v = TOP(); - x = PyNumber_Divide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) continue; - break; - } - /* -Qnew is in effect: fall through to - BINARY_TRUE_DIVIDE */ case BINARY_TRUE_DIVIDE: w = POP(); v = TOP(); Modified: python/branches/p3yk/Python/compile.c ============================================================================== --- python/branches/p3yk/Python/compile.c (original) +++ python/branches/p3yk/Python/compile.c Thu Mar 16 07:02:10 2006 @@ -479,11 +479,6 @@ case BINARY_MULTIPLY: newconst = PyNumber_Multiply(v, w); break; - case BINARY_DIVIDE: - /* Cannot fold this operation statically since - the result can depend on the run-time presence - of the -Qnew flag */ - return 0; case BINARY_TRUE_DIVIDE: newconst = PyNumber_TrueDivide(v, w); break; @@ -1302,7 +1297,6 @@ case BINARY_POWER: case BINARY_MULTIPLY: - case BINARY_DIVIDE: case BINARY_MODULO: case BINARY_ADD: case BINARY_SUBTRACT: From python-checkins at python.org Thu Mar 16 07:21:20 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:21:20 +0100 (CET) Subject: [Python-checkins] r43067 - python/trunk/Lib/test/test___all__.py Message-ID: <20060316062120.74D5E1E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:21:19 2006 New Revision: 43067 Modified: python/trunk/Lib/test/test___all__.py Log: The pre module has been gone for a while. Need to go through and find other modules that no longer exists, since errors are silently ignored. Modified: python/trunk/Lib/test/test___all__.py ============================================================================== --- python/trunk/Lib/test/test___all__.py (original) +++ python/trunk/Lib/test/test___all__.py Thu Mar 16 07:21:19 2006 @@ -5,8 +5,6 @@ import sys import warnings -warnings.filterwarnings("ignore", ".* 'pre' .*", DeprecationWarning, - r'pre$') warnings.filterwarnings("ignore", ".* regsub .*", DeprecationWarning, r'^regsub$') warnings.filterwarnings("ignore", @@ -122,7 +120,6 @@ self.check_all("poplib") self.check_all("posixpath") self.check_all("pprint") - self.check_all("pre") # deprecated self.check_all("profile") self.check_all("pstats") self.check_all("pty") From python-checkins at python.org Thu Mar 16 07:27:38 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:27:38 +0100 (CET) Subject: [Python-checkins] r43068 - python/trunk/Lib/re.py Message-ID: <20060316062738.D321E1E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:27:37 2006 New Revision: 43068 Removed: python/trunk/Lib/re.py Log: Remove re.py, in order to rename sre.py -> re.py (svn seems to require 2 steps). Deleted: /python/trunk/Lib/re.py ============================================================================== --- /python/trunk/Lib/re.py Thu Mar 16 07:27:37 2006 +++ (empty file) @@ -1,6 +0,0 @@ -"""Minimal "re" compatibility wrapper. See "sre" for documentation.""" - -engine = "sre" # Some apps might use this undocumented variable - -from sre import * -from sre import __all__ From python-checkins at python.org Thu Mar 16 07:30:05 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:30:05 +0100 (CET) Subject: [Python-checkins] r43069 - in python/trunk: Lib/re.py Lib/sre.py Lib/test/regrtest.py Lib/test/test___all__.py Lib/test/test_re.py Modules/_sre.c Message-ID: <20060316063005.40BBE1E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:30:02 2006 New Revision: 43069 Added: python/trunk/Lib/re.py - copied unchanged from r43067, python/trunk/Lib/sre.py Removed: python/trunk/Lib/sre.py Modified: python/trunk/Lib/test/regrtest.py python/trunk/Lib/test/test___all__.py python/trunk/Lib/test/test_re.py python/trunk/Modules/_sre.c Log: Rename sre.py -> re.py Deleted: /python/trunk/Lib/sre.py ============================================================================== --- /python/trunk/Lib/sre.py Thu Mar 16 07:30:02 2006 +++ (empty file) @@ -1,315 +0,0 @@ -# -# Secret Labs' Regular Expression Engine -# -# re-compatible interface for the sre matching engine -# -# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. -# -# This version of the SRE library can be redistributed under CNRI's -# Python 1.6 license. For any other use, please contact Secret Labs -# AB (info at pythonware.com). -# -# Portions of this engine have been developed in cooperation with -# CNRI. Hewlett-Packard provided funding for 1.6 integration and -# other compatibility work. -# - -r"""Support for regular expressions (RE). - -This module provides regular expression matching operations similar to -those found in Perl. It supports both 8-bit and Unicode strings; both -the pattern and the strings being processed can contain null bytes and -characters outside the US ASCII range. - -Regular expressions can contain both special and ordinary characters. -Most ordinary characters, like "A", "a", or "0", are the simplest -regular expressions; they simply match themselves. You can -concatenate ordinary characters, so last matches the string 'last'. - -The special characters are: - "." Matches any character except a newline. - "^" Matches the start of the string. - "$" Matches the end of the string. - "*" Matches 0 or more (greedy) repetitions of the preceding RE. - Greedy means that it will match as many repetitions as possible. - "+" Matches 1 or more (greedy) repetitions of the preceding RE. - "?" Matches 0 or 1 (greedy) of the preceding RE. - *?,+?,?? Non-greedy versions of the previous three special characters. - {m,n} Matches from m to n repetitions of the preceding RE. - {m,n}? Non-greedy version of the above. - "\\" Either escapes special characters or signals a special sequence. - [] Indicates a set of characters. - A "^" as the first character indicates a complementing set. - "|" A|B, creates an RE that will match either A or B. - (...) Matches the RE inside the parentheses. - The contents can be retrieved or matched later in the string. - (?iLmsux) Set the I, L, M, S, U, or X flag for the RE (see below). - (?:...) Non-grouping version of regular parentheses. - (?P...) The substring matched by the group is accessible by name. - (?P=name) Matches the text matched earlier by the group named name. - (?#...) A comment; ignored. - (?=...) Matches if ... matches next, but doesn't consume the string. - (?!...) Matches if ... doesn't match next. - -The special sequences consist of "\\" and a character from the list -below. If the ordinary character is not on the list, then the -resulting RE will match the second character. - \number Matches the contents of the group of the same number. - \A Matches only at the start of the string. - \Z Matches only at the end of the string. - \b Matches the empty string, but only at the start or end of a word. - \B Matches the empty string, but not at the start or end of a word. - \d Matches any decimal digit; equivalent to the set [0-9]. - \D Matches any non-digit character; equivalent to the set [^0-9]. - \s Matches any whitespace character; equivalent to [ \t\n\r\f\v]. - \S Matches any non-whitespace character; equiv. to [^ \t\n\r\f\v]. - \w Matches any alphanumeric character; equivalent to [a-zA-Z0-9_]. - With LOCALE, it will match the set [0-9_] plus characters defined - as letters for the current locale. - \W Matches the complement of \w. - \\ Matches a literal backslash. - -This module exports the following functions: - match Match a regular expression pattern to the beginning of a string. - search Search a string for the presence of a pattern. - sub Substitute occurrences of a pattern found in a string. - subn Same as sub, but also return the number of substitutions made. - split Split a string by the occurrences of a pattern. - findall Find all occurrences of a pattern in a string. - compile Compile a pattern into a RegexObject. - purge Clear the regular expression cache. - escape Backslash all non-alphanumerics in a string. - -Some of the functions in this module takes flags as optional parameters: - I IGNORECASE Perform case-insensitive matching. - L LOCALE Make \w, \W, \b, \B, dependent on the current locale. - M MULTILINE "^" matches the beginning of lines as well as the string. - "$" matches the end of lines as well as the string. - S DOTALL "." matches any character at all, including the newline. - X VERBOSE Ignore whitespace and comments for nicer looking RE's. - U UNICODE Make \w, \W, \b, \B, dependent on the Unicode locale. - -This module also defines an exception 'error'. - -""" - -import sys -import sre_compile -import sre_parse - -# public symbols -__all__ = [ "match", "search", "sub", "subn", "split", "findall", - "compile", "purge", "template", "escape", "I", "L", "M", "S", "X", - "U", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", - "UNICODE", "error" ] - -__version__ = "2.2.1" - -# flags -I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case -L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale -U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale -M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline -S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline -X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments - -# sre extensions (experimental, don't rely on these) -T = TEMPLATE = sre_compile.SRE_FLAG_TEMPLATE # disable backtracking -DEBUG = sre_compile.SRE_FLAG_DEBUG # dump pattern after compilation - -# sre exception -error = sre_compile.error - -# -------------------------------------------------------------------- -# public interface - -def match(pattern, string, flags=0): - """Try to apply the pattern at the start of the string, returning - a match object, or None if no match was found.""" - return _compile(pattern, flags).match(string) - -def search(pattern, string, flags=0): - """Scan through string looking for a match to the pattern, returning - a match object, or None if no match was found.""" - return _compile(pattern, flags).search(string) - -def sub(pattern, repl, string, count=0): - """Return the string obtained by replacing the leftmost - non-overlapping occurrences of the pattern in string by the - replacement repl. repl can be either a string or a callable; - if a callable, it's passed the match object and must return - a replacement string to be used.""" - return _compile(pattern, 0).sub(repl, string, count) - -def subn(pattern, repl, string, count=0): - """Return a 2-tuple containing (new_string, number). - new_string is the string obtained by replacing the leftmost - non-overlapping occurrences of the pattern in the source - string by the replacement repl. number is the number of - substitutions that were made. repl can be either a string or a - callable; if a callable, it's passed the match object and must - return a replacement string to be used.""" - return _compile(pattern, 0).subn(repl, string, count) - -def split(pattern, string, maxsplit=0): - """Split the source string by the occurrences of the pattern, - returning a list containing the resulting substrings.""" - return _compile(pattern, 0).split(string, maxsplit) - -def findall(pattern, string, flags=0): - """Return a list of all non-overlapping matches in the string. - - If one or more groups are present in the pattern, return a - list of groups; this will be a list of tuples if the pattern - has more than one group. - - Empty matches are included in the result.""" - return _compile(pattern, flags).findall(string) - -if sys.hexversion >= 0x02020000: - __all__.append("finditer") - def finditer(pattern, string, flags=0): - """Return an iterator over all non-overlapping matches in the - string. For each match, the iterator returns a match object. - - Empty matches are included in the result.""" - return _compile(pattern, flags).finditer(string) - -def compile(pattern, flags=0): - "Compile a regular expression pattern, returning a pattern object." - return _compile(pattern, flags) - -def purge(): - "Clear the regular expression cache" - _cache.clear() - _cache_repl.clear() - -def template(pattern, flags=0): - "Compile a template pattern, returning a pattern object" - return _compile(pattern, flags|T) - -_alphanum = {} -for c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890': - _alphanum[c] = 1 -del c - -def escape(pattern): - "Escape all non-alphanumeric characters in pattern." - s = list(pattern) - alphanum = _alphanum - for i in range(len(pattern)): - c = pattern[i] - if c not in alphanum: - if c == "\000": - s[i] = "\\000" - else: - s[i] = "\\" + c - return pattern[:0].join(s) - -# -------------------------------------------------------------------- -# internals - -_cache = {} -_cache_repl = {} - -_pattern_type = type(sre_compile.compile("", 0)) - -_MAXCACHE = 100 - -def _compile(*key): - # internal: compile pattern - cachekey = (type(key[0]),) + key - p = _cache.get(cachekey) - if p is not None: - return p - pattern, flags = key - if isinstance(pattern, _pattern_type): - return pattern - if not sre_compile.isstring(pattern): - raise TypeError, "first argument must be string or compiled pattern" - try: - p = sre_compile.compile(pattern, flags) - except error, v: - raise error, v # invalid expression - if len(_cache) >= _MAXCACHE: - _cache.clear() - _cache[cachekey] = p - return p - -def _compile_repl(*key): - # internal: compile replacement pattern - p = _cache_repl.get(key) - if p is not None: - return p - repl, pattern = key - try: - p = sre_parse.parse_template(repl, pattern) - except error, v: - raise error, v # invalid expression - if len(_cache_repl) >= _MAXCACHE: - _cache_repl.clear() - _cache_repl[key] = p - return p - -def _expand(pattern, match, template): - # internal: match.expand implementation hook - template = sre_parse.parse_template(template, pattern) - return sre_parse.expand_template(template, match) - -def _subx(pattern, template): - # internal: pattern.sub/subn implementation helper - template = _compile_repl(template, pattern) - if not template[0] and len(template[1]) == 1: - # literal replacement - return template[1][0] - def filter(match, template=template): - return sre_parse.expand_template(template, match) - return filter - -# register myself for pickling - -import copy_reg - -def _pickle(p): - return _compile, (p.pattern, p.flags) - -copy_reg.pickle(_pattern_type, _pickle, _compile) - -# -------------------------------------------------------------------- -# experimental stuff (see python-dev discussions for details) - -class Scanner: - def __init__(self, lexicon, flags=0): - from sre_constants import BRANCH, SUBPATTERN - self.lexicon = lexicon - # combine phrases into a compound pattern - p = [] - s = sre_parse.Pattern() - s.flags = flags - for phrase, action in lexicon: - p.append(sre_parse.SubPattern(s, [ - (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))), - ])) - p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) - s.groups = len(p) - self.scanner = sre_compile.compile(p) - def scan(self, string): - result = [] - append = result.append - match = self.scanner.scanner(string).match - i = 0 - while 1: - m = match() - if not m: - break - j = m.end() - if i == j: - break - action = self.lexicon[m.lastindex-1][1] - if callable(action): - self.match = m - action = action(self, m.group()) - if action is not None: - append(action) - i = j - return result, string[i:] Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Thu Mar 16 07:30:02 2006 @@ -110,7 +110,7 @@ import getopt import random import warnings -import sre +import re import cStringIO import traceback @@ -525,7 +525,7 @@ _path_created.clear() warnings.filters[:] = fs gc.collect() - sre.purge() + re.purge() _strptime._regex_cache.clear() urlparse.clear_cache() urllib.urlcleanup() Modified: python/trunk/Lib/test/test___all__.py ============================================================================== --- python/trunk/Lib/test/test___all__.py (original) +++ python/trunk/Lib/test/test___all__.py Thu Mar 16 07:30:02 2006 @@ -145,7 +145,6 @@ self.check_all("smtplib") self.check_all("sndhdr") self.check_all("socket") - self.check_all("sre") self.check_all("_strptime") self.check_all("symtable") self.check_all("tabnanny") Modified: python/trunk/Lib/test/test_re.py ============================================================================== --- python/trunk/Lib/test/test_re.py (original) +++ python/trunk/Lib/test/test_re.py Thu Mar 16 07:30:02 2006 @@ -3,7 +3,7 @@ from test.test_support import verbose, run_unittest import re -from sre import Scanner +from re import Scanner import sys, os, traceback from weakref import proxy Modified: python/trunk/Modules/_sre.c ============================================================================== --- python/trunk/Modules/_sre.c (original) +++ python/trunk/Modules/_sre.c Thu Mar 16 07:30:02 2006 @@ -51,6 +51,8 @@ #define SRE_MODULE "sre" #endif +#define SRE_PY_MODULE "re" + /* defining this one enables tracing */ #undef VERBOSE @@ -2455,7 +2457,7 @@ } else { /* not a literal; hand it over to the template compiler */ filter = call( - SRE_MODULE, "_subx", + SRE_PY_MODULE, "_subx", PyTuple_Pack(2, self, template) ); if (!filter) @@ -2872,7 +2874,7 @@ /* delegate to Python code */ return call( - SRE_MODULE, "_expand", + SRE_PY_MODULE, "_expand", PyTuple_Pack(3, self->pattern, self, template) ); } From python-checkins at python.org Thu Mar 16 07:31:03 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:31:03 +0100 (CET) Subject: [Python-checkins] r43070 - python/trunk/Lib/sre.py Message-ID: <20060316063103.42A231E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:31:02 2006 New Revision: 43070 Added: python/trunk/Lib/sre.py (contents, props changed) Log: Add back an sre.py that should be backwards compatible except for the warning. Added: python/trunk/Lib/sre.py ============================================================================== --- (empty file) +++ python/trunk/Lib/sre.py Thu Mar 16 07:31:02 2006 @@ -0,0 +1,10 @@ +"""This file is only retained for backwards compatability. +It will be removed in the future. sre was moved to re in version 2.5. +""" + +import warnings +warnings.warn("The sre module is deprecated, please import re.", + DeprecationWarning, 2) + +from re import * +from re import __all__ From python-checkins at python.org Thu Mar 16 07:33:22 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:33:22 +0100 (CET) Subject: [Python-checkins] r43071 - python/trunk/Lib/sre.py Message-ID: <20060316063322.AB0951E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:33:21 2006 New Revision: 43071 Modified: python/trunk/Lib/sre.py Log: Spel compatibility write. Modified: python/trunk/Lib/sre.py ============================================================================== --- python/trunk/Lib/sre.py (original) +++ python/trunk/Lib/sre.py Thu Mar 16 07:33:21 2006 @@ -1,4 +1,4 @@ -"""This file is only retained for backwards compatability. +"""This file is only retained for backwards compatibility. It will be removed in the future. sre was moved to re in version 2.5. """ From python-checkins at python.org Thu Mar 16 07:40:40 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:40:40 +0100 (CET) Subject: [Python-checkins] r43072 - python/trunk/Misc/NEWS Message-ID: <20060316064040.95FFA1E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:40:39 2006 New Revision: 43072 Modified: python/trunk/Misc/NEWS Log: Add a news entry about the sre/re swap. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Mar 16 07:40:39 2006 @@ -291,6 +291,9 @@ Extension Modules ----------------- +- Swapped re and sre, so help(re) provides full help. importing sre + is deprecated. The undocumented re.engine variable no longer exists. + - Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle SS2 (single-shift 2) escape sequences correctly. From python-checkins at python.org Thu Mar 16 07:50:19 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:50:19 +0100 (CET) Subject: [Python-checkins] r43073 - in python/trunk: Demo/pdist/makechangelog.py Demo/pdist/rcsbump Demo/pdist/rcslib.py Demo/scripts/eqfix.py Demo/scripts/ftpstats.py Demo/scripts/mboxconvert.py Demo/scripts/update.py Demo/sockets/mcast.py Demo/tkinter/guido/ManPage.py Demo/tkinter/guido/mbox.py Demo/tkinter/guido/tkman.py Doc/howto/regex.tex Doc/lib/lib.tex Doc/lib/libre.tex Doc/lib/libreconvert.tex Doc/lib/libregex.tex Doc/lib/libregsub.tex Doc/lib/libundoc.tex Lib/lib-old/Para.py Lib/lib-old/addpack.py Lib/lib-old/cmp.py Lib/lib-old/cmpcache.py Lib/lib-old/codehack.py Lib/lib-old/dircmp.py Lib/lib-old/dump.py Lib/lib-old/find.py Lib/lib-old/fmt.py Lib/lib-old/grep.py Lib/lib-old/lockfile.py Lib/lib-old/newdir.py Lib/lib-old/ni.py Lib/lib-old/packmail.py Lib/lib-old/poly.py Lib/lib-old/rand.py Lib/lib-old/statcache.py Lib/lib-old/tb.py Lib/lib-old/tzparse.py Lib/lib-old/util.py Lib/lib-old/whatsound.py Lib/lib-old/whrandom.py Lib/lib-old/zmod.py Lib/reconvert.py Lib/regex_syntax.py Lib/regsub.py Lib/rexec.py Lib/test/test___all__.py Lib/test/test_regex.py Lib/test/test_sundry.py Misc/BeOS-setup.py Misc/NEWS Misc/cheatsheet Modules/regexmodule.c Modules/regexpr.c Modules/regexpr.h PC/VC6/pythoncore.dsp PC/os2emx/Makefile PC/os2vacpp/makefile PC/os2vacpp/makefile.omk PC/testpy.py PCbuild/pythoncore.vcproj RISCOS/Makefile Tools/scripts/classfix.py Tools/scripts/fixcid.py Tools/scripts/ifdef.py Tools/scripts/methfix.py Tools/scripts/objgraph.py Tools/scripts/pathfix.py Tools/scripts/pdeps.py setup.py Message-ID: <20060316065019.356031E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:50:13 2006 New Revision: 43073 Removed: python/trunk/Doc/lib/libreconvert.tex python/trunk/Doc/lib/libregex.tex python/trunk/Doc/lib/libregsub.tex python/trunk/Lib/lib-old/Para.py python/trunk/Lib/lib-old/addpack.py python/trunk/Lib/lib-old/cmp.py python/trunk/Lib/lib-old/cmpcache.py python/trunk/Lib/lib-old/codehack.py python/trunk/Lib/lib-old/dircmp.py python/trunk/Lib/lib-old/dump.py python/trunk/Lib/lib-old/find.py python/trunk/Lib/lib-old/fmt.py python/trunk/Lib/lib-old/grep.py python/trunk/Lib/lib-old/lockfile.py python/trunk/Lib/lib-old/newdir.py python/trunk/Lib/lib-old/ni.py python/trunk/Lib/lib-old/packmail.py python/trunk/Lib/lib-old/poly.py python/trunk/Lib/lib-old/rand.py python/trunk/Lib/lib-old/statcache.py python/trunk/Lib/lib-old/tb.py python/trunk/Lib/lib-old/tzparse.py python/trunk/Lib/lib-old/util.py python/trunk/Lib/lib-old/whatsound.py python/trunk/Lib/lib-old/whrandom.py python/trunk/Lib/lib-old/zmod.py python/trunk/Lib/reconvert.py python/trunk/Lib/regex_syntax.py python/trunk/Lib/regsub.py python/trunk/Lib/test/test_regex.py python/trunk/Modules/regexmodule.c python/trunk/Modules/regexpr.c python/trunk/Modules/regexpr.h Modified: python/trunk/Demo/pdist/makechangelog.py python/trunk/Demo/pdist/rcsbump python/trunk/Demo/pdist/rcslib.py python/trunk/Demo/scripts/eqfix.py python/trunk/Demo/scripts/ftpstats.py python/trunk/Demo/scripts/mboxconvert.py python/trunk/Demo/scripts/update.py python/trunk/Demo/sockets/mcast.py python/trunk/Demo/tkinter/guido/ManPage.py python/trunk/Demo/tkinter/guido/mbox.py python/trunk/Demo/tkinter/guido/tkman.py python/trunk/Doc/howto/regex.tex python/trunk/Doc/lib/lib.tex python/trunk/Doc/lib/libre.tex python/trunk/Doc/lib/libundoc.tex python/trunk/Lib/rexec.py python/trunk/Lib/test/test___all__.py python/trunk/Lib/test/test_sundry.py python/trunk/Misc/BeOS-setup.py python/trunk/Misc/NEWS python/trunk/Misc/cheatsheet python/trunk/PC/VC6/pythoncore.dsp python/trunk/PC/os2emx/Makefile python/trunk/PC/os2vacpp/makefile python/trunk/PC/os2vacpp/makefile.omk python/trunk/PC/testpy.py python/trunk/PCbuild/pythoncore.vcproj python/trunk/RISCOS/Makefile python/trunk/Tools/scripts/classfix.py python/trunk/Tools/scripts/fixcid.py python/trunk/Tools/scripts/ifdef.py python/trunk/Tools/scripts/methfix.py python/trunk/Tools/scripts/objgraph.py python/trunk/Tools/scripts/pathfix.py python/trunk/Tools/scripts/pdeps.py python/trunk/setup.py Log: Remove regsub, reconvert, regex, regex_syntax and everything under lib-old. Modified: python/trunk/Demo/pdist/makechangelog.py ============================================================================== --- python/trunk/Demo/pdist/makechangelog.py (original) +++ python/trunk/Demo/pdist/makechangelog.py Thu Mar 16 07:50:13 2006 @@ -6,7 +6,7 @@ import sys import string -import regex +import re import getopt import time @@ -35,9 +35,9 @@ for rev in allrevs: formatrev(rev, prefix) -parsedateprog = regex.compile( - '^date: \([0-9]+\)/\([0-9]+\)/\([0-9]+\) ' + - '\([0-9]+\):\([0-9]+\):\([0-9]+\); author: \([^ ;]+\)') +parsedateprog = re.compile( + '^date: ([0-9]+)/([0-9]+)/([0-9]+) ' + + '([0-9]+):([0-9]+):([0-9]+); author: ([^ ;]+)') authormap = { 'guido': 'Guido van Rossum ', @@ -70,7 +70,7 @@ print print -startprog = regex.compile("^Working file: \(.*\)$") +startprog = re.compile("^Working file: (.*)$") def getnextfile(f): while 1: Modified: python/trunk/Demo/pdist/rcsbump ============================================================================== --- python/trunk/Demo/pdist/rcsbump (original) +++ python/trunk/Demo/pdist/rcsbump Thu Mar 16 07:50:13 2006 @@ -6,12 +6,12 @@ # Python script for bumping up an RCS major revision number. import sys -import regex +import re import rcslib import string WITHLOCK = 1 -majorrev_re = regex.compile('^[0-9]+') +majorrev_re = re.compile('^[0-9]+') dir = rcslib.RCS() Modified: python/trunk/Demo/pdist/rcslib.py ============================================================================== --- python/trunk/Demo/pdist/rcslib.py (original) +++ python/trunk/Demo/pdist/rcslib.py Thu Mar 16 07:50:13 2006 @@ -8,7 +8,7 @@ import fnmatch import os -import regsub +import re import string import tempfile @@ -150,7 +150,7 @@ cmd = 'ci %s%s -t%s %s %s' % \ (lockflag, rev, f.name, otherflags, name) else: - message = regsub.gsub('\([\\"$`]\)', '\\\\\\1', message) + message = re.sub(r'([\"$`])', r'\\\1', message) cmd = 'ci %s%s -m"%s" %s %s' % \ (lockflag, rev, message, otherflags, name) return self._system(cmd) Modified: python/trunk/Demo/scripts/eqfix.py ============================================================================== --- python/trunk/Demo/scripts/eqfix.py (original) +++ python/trunk/Demo/scripts/eqfix.py Thu Mar 16 07:50:13 2006 @@ -29,7 +29,7 @@ # into a program for a different change to Python programs... import sys -import regex +import re import os from stat import * import string @@ -53,7 +53,7 @@ if fix(arg): bad = 1 sys.exit(bad) -ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$') +ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$') def ispython(name): return ispythonprog.match(name) >= 0 @@ -104,7 +104,7 @@ if lineno == 1 and g is None and line[:2] == '#!': # Check for non-Python scripts words = string.split(line[2:]) - if words and regex.search('[pP]ython', words[0]) < 0: + if words and re.search('[pP]ython', words[0]) < 0: msg = filename + ': ' + words[0] msg = msg + ' script; not fixed\n' err(msg) Modified: python/trunk/Demo/scripts/ftpstats.py ============================================================================== --- python/trunk/Demo/scripts/ftpstats.py (original) +++ python/trunk/Demo/scripts/ftpstats.py Thu Mar 16 07:50:13 2006 @@ -13,12 +13,12 @@ import os import sys -import regex +import re import string import getopt -pat = '^\([a-zA-Z0-9 :]*\)!\(.*\)!\(.*\)!\([<>].*\)!\([0-9]+\)!\([0-9]+\)$' -prog = regex.compile(pat) +pat = '^([a-zA-Z0-9 :]*)!(.*)!(.*)!([<>].*)!([0-9]+)!([0-9]+)$' +prog = re.compile(pat) def main(): maxitems = 25 Modified: python/trunk/Demo/scripts/mboxconvert.py ============================================================================== --- python/trunk/Demo/scripts/mboxconvert.py (original) +++ python/trunk/Demo/scripts/mboxconvert.py Thu Mar 16 07:50:13 2006 @@ -10,7 +10,7 @@ import os import stat import getopt -import regex +import re def main(): dofile = mmdf @@ -45,7 +45,7 @@ if sts: sys.exit(sts) -numeric = regex.compile('[1-9][0-9]*') +numeric = re.compile('[1-9][0-9]*') def mh(dir): sts = 0 Modified: python/trunk/Demo/scripts/update.py ============================================================================== --- python/trunk/Demo/scripts/update.py (original) +++ python/trunk/Demo/scripts/update.py Thu Mar 16 07:50:13 2006 @@ -8,10 +8,10 @@ import os import sys -import regex +import re -pat = '^\([^: \t\n]+\):\([1-9][0-9]*\):' -prog = regex.compile(pat) +pat = '^([^: \t\n]+):([1-9][0-9]*):' +prog = re.compile(pat) class FileObj: def __init__(self, filename): Modified: python/trunk/Demo/sockets/mcast.py ============================================================================== --- python/trunk/Demo/sockets/mcast.py (original) +++ python/trunk/Demo/sockets/mcast.py Thu Mar 16 07:50:13 2006 @@ -13,7 +13,6 @@ import sys import time import struct -import regsub from socket import * Modified: python/trunk/Demo/tkinter/guido/ManPage.py ============================================================================== --- python/trunk/Demo/tkinter/guido/ManPage.py (original) +++ python/trunk/Demo/tkinter/guido/ManPage.py Thu Mar 16 07:50:13 2006 @@ -1,6 +1,6 @@ # Widget to display a man page -import regex +import re from Tkinter import * from Tkinter import _tkinter from ScrolledText import ScrolledText @@ -11,10 +11,10 @@ # XXX Recognizing footers is system dependent # (This one works for IRIX 5.2 and Solaris 2.2) -footerprog = regex.compile( +footerprog = re.compile( '^ Page [1-9][0-9]*[ \t]+\|^.*Last change:.*[1-9][0-9]*\n') -emptyprog = regex.compile('^[ \t]*\n') -ulprog = regex.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n') +emptyprog = re.compile('^[ \t]*\n') +ulprog = re.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n') # Basic Man Page class -- does not disable editing class EditableManPage(ScrolledText): Modified: python/trunk/Demo/tkinter/guido/mbox.py ============================================================================== --- python/trunk/Demo/tkinter/guido/mbox.py (original) +++ python/trunk/Demo/tkinter/guido/mbox.py Thu Mar 16 07:50:13 2006 @@ -4,7 +4,7 @@ import os import sys -import regex +import re import getopt import string import mhlib @@ -157,7 +157,7 @@ scanmenu.unpost() scanmenu.invoke('active') -scanparser = regex.compile('^ *\([0-9]+\)') +scanparser = re.compile('^ *([0-9]+)') def open_folder(e=None): global folder, mhf Modified: python/trunk/Demo/tkinter/guido/tkman.py ============================================================================== --- python/trunk/Demo/tkinter/guido/tkman.py (original) +++ python/trunk/Demo/tkinter/guido/tkman.py Thu Mar 16 07:50:13 2006 @@ -5,7 +5,7 @@ import sys import os import string -import regex +import re from Tkinter import * from ManPage import ManPage @@ -208,15 +208,15 @@ print 'Empty search string' return if not self.casevar.get(): - map = regex.casefold + map = re.IGNORECASE else: map = None try: if map: - prog = regex.compile(search, map) + prog = re.compile(search, map) else: - prog = regex.compile(search) - except regex.error, msg: + prog = re.compile(search) + except re.error, msg: self.frame.bell() print 'Regex error:', msg return Modified: python/trunk/Doc/howto/regex.tex ============================================================================== --- python/trunk/Doc/howto/regex.tex (original) +++ python/trunk/Doc/howto/regex.tex Thu Mar 16 07:50:13 2006 @@ -33,11 +33,8 @@ The \module{re} module was added in Python 1.5, and provides Perl-style regular expression patterns. Earlier versions of Python -came with the \module{regex} module, which provides Emacs-style -patterns. Emacs-style patterns are slightly less readable and -don't provide as many features, so there's not much reason to use -the \module{regex} module when writing new code, though you might -encounter old code that uses it. +came with the \module{regex} module, which provided Emacs-style +patterns. \module{regex} module was removed in Python 2.5. Regular expressions (or REs) are essentially a tiny, highly specialized programming language embedded inside Python and made @@ -1458,7 +1455,7 @@ by O'Reilly. Unfortunately, it exclusively concentrates on Perl and Java's flavours of regular expressions, and doesn't contain any Python material at all, so it won't be useful as a reference for programming -in Python. (The first edition covered Python's now-obsolete +in Python. (The first edition covered Python's now-removed \module{regex} module, which won't help you much.) Consider checking it out from your library. Modified: python/trunk/Doc/lib/lib.tex ============================================================================== --- python/trunk/Doc/lib/lib.tex (original) +++ python/trunk/Doc/lib/lib.tex Thu Mar 16 07:50:13 2006 @@ -87,7 +87,6 @@ \input{libstrings} % String Services \input{libstring} \input{libre} -\input{libreconvert} \input{libstruct} % XXX also/better in File Formats? \input{libdifflib} \input{libstringio} @@ -454,8 +453,6 @@ %\input{libcmpcache} %\input{libcmp} %\input{libni} -%\input{libregex} -%\input{libregsub} \chapter{Reporting Bugs} \input{reportingbugs} Modified: python/trunk/Doc/lib/libre.tex ============================================================================== --- python/trunk/Doc/lib/libre.tex (original) +++ python/trunk/Doc/lib/libre.tex Thu Mar 16 07:50:13 2006 @@ -566,9 +566,6 @@ >>> re.split('\W+', 'Words, words, words.', 1) ['Words', 'words, words.'] \end{verbatim} - - This function combines and extends the functionality of - the old \function{regsub.split()} and \function{regsub.splitx()}. \end{funcdesc} \begin{funcdesc}{findall}{pattern, string\optional{, flags}} @@ -943,7 +940,7 @@ >>> re.match('Begin (\w| )*? end', s).end() Traceback (most recent call last): File "", line 1, in ? - File "/usr/local/lib/python2.3/sre.py", line 132, in match + File "/usr/local/lib/python2.5/re.py", line 132, in match return _compile(pattern, flags).match(string) RuntimeError: maximum recursion limit exceeded \end{verbatim} Deleted: /python/trunk/Doc/lib/libreconvert.tex ============================================================================== --- /python/trunk/Doc/lib/libreconvert.tex Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,80 +0,0 @@ -\section{\module{reconvert} --- - Convert regular expressions from regex to re form} -\declaremodule{standard}{reconvert} -\moduleauthor{Andrew M. Kuchling}{amk at amk.ca} -\sectionauthor{Skip Montanaro}{skip at pobox.com} - - -\modulesynopsis{Convert regex-, emacs- or sed-style regular expressions -to re-style syntax.} - - -This module provides a facility to convert regular expressions from the -syntax used by the deprecated \module{regex} module to those used by the -newer \module{re} module. Because of similarity between the regular -expression syntax of \code{sed(1)} and \code{emacs(1)} and the -\module{regex} module, it is also helpful to convert patterns written for -those tools to \module{re} patterns. - -When used as a script, a Python string literal (or any other expression -evaluating to a string) is read from stdin, and the translated expression is -written to stdout as a string literal. Unless stdout is a tty, no trailing -newline is written to stdout. This is done so that it can be used with -Emacs \code{C-U M-|} (shell-command-on-region) which filters the region -through the shell command. - -\begin{seealso} - \seetitle{Mastering Regular Expressions}{Book on regular expressions - by Jeffrey Friedl, published by O'Reilly. The second - edition of the book no longer covers Python at all, - but the first edition covered writing good regular expression - patterns in great detail.} -\end{seealso} - -\subsection{Module Contents} -\nodename{Contents of Module reconvert} - -The module defines two functions and a handful of constants. - -\begin{funcdesc}{convert}{pattern\optional{, syntax=None}} - Convert a \var{pattern} representing a \module{regex}-stype regular - expression into a \module{re}-style regular expression. The optional - \var{syntax} parameter is a bitwise-or'd set of flags that control what - constructs are converted. See below for a description of the various - constants. -\end{funcdesc} - -\begin{funcdesc}{quote}{s\optional{, quote=None}} - Convert a string object to a quoted string literal. - - This is similar to \function{repr} but will return a "raw" string (r'...' - or r"...") when the string contains backslashes, instead of doubling all - backslashes. The resulting string does not always evaluate to the same - string as the original; however it will do just the right thing when passed - into re.compile(). - - The optional second argument forces the string quote; it must be a single - character which is a valid Python string quote. Note that prior to Python - 2.5 this would not accept triple-quoted string delimiters. -\end{funcdesc} - -\begin{datadesc}{RE_NO_BK_PARENS} - Suppress paren conversion. This should be omitted when converting - \code{sed}-style or \code{emacs}-style regular expressions. -\end{datadesc} - -\begin{datadesc}{RE_NO_BK_VBAR} - Suppress vertical bar conversion. This should be omitted when converting - \code{sed}-style or \code{emacs}-style regular expressions. -\end{datadesc} - -\begin{datadesc}{RE_BK_PLUS_QM} - Enable conversion of \code{+} and \code{?} characters. This should be - added to the \var{syntax} arg of \function{convert} when converting - \code{sed}-style regular expressions and omitted when converting - \code{emacs}-style regular expressions. -\end{datadesc} - -\begin{datadesc}{RE_NEWLINE_OR} - When set, newline characters are replaced by \code{|}. -\end{datadesc} Deleted: /python/trunk/Doc/lib/libregex.tex ============================================================================== --- /python/trunk/Doc/lib/libregex.tex Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,370 +0,0 @@ -\section{\module{regex} --- - Regular expression operations} -\declaremodule{builtin}{regex} - -\modulesynopsis{Regular expression search and match operations. - \strong{Obsolete!}} - - -This module provides regular expression matching operations similar to -those found in Emacs. - -\strong{Obsolescence note:} -This module is obsolete as of Python version 1.5; it is still being -maintained because much existing code still uses it. All new code in -need of regular expressions should use the new -\code{re}\refstmodindex{re} module, which supports the more powerful -and regular Perl-style regular expressions. Existing code should be -converted. The standard library module -\code{reconvert}\refstmodindex{reconvert} helps in converting -\code{regex} style regular expressions to \code{re}\refstmodindex{re} -style regular expressions. (For more conversion help, see Andrew -Kuchling's\index{Kuchling, Andrew} ``\module{regex-to-re} HOWTO'' at -\url{http://www.python.org/doc/howto/regex-to-re/}.) - -By default the patterns are Emacs-style regular expressions -(with one exception). There is -a way to change the syntax to match that of several well-known -\UNIX{} utilities. The exception is that Emacs' \samp{\e s} -pattern is not supported, since the original implementation references -the Emacs syntax tables. - -This module is 8-bit clean: both patterns and strings may contain null -bytes and characters whose high bit is set. - -\strong{Please note:} There is a little-known fact about Python string -literals which means that you don't usually have to worry about -doubling backslashes, even though they are used to escape special -characters in string literals as well as in regular expressions. This -is because Python doesn't remove backslashes from string literals if -they are followed by an unrecognized escape character. -\emph{However}, if you want to include a literal \dfn{backslash} in a -regular expression represented as a string literal, you have to -\emph{quadruple} it or enclose it in a singleton character class. -E.g.\ to extract \LaTeX\ \samp{\e section\{\textrm{\ldots}\}} headers -from a document, you can use this pattern: -\code{'[\e ]section\{\e (.*\e )\}'}. \emph{Another exception:} -the escape sequence \samp{\e b} is significant in string literals -(where it means the ASCII bell character) as well as in Emacs regular -expressions (where it stands for a word boundary), so in order to -search for a word boundary, you should use the pattern \code{'\e \e b'}. -Similarly, a backslash followed by a digit 0-7 should be doubled to -avoid interpretation as an octal escape. - -\subsection{Regular Expressions} - -A regular expression (or RE) specifies a set of strings that matches -it; the functions in this module let you check if a particular string -matches a given regular expression (or if a given regular expression -matches a particular string, which comes down to the same thing). - -Regular expressions can be concatenated to form new regular -expressions; if \emph{A} and \emph{B} are both regular expressions, -then \emph{AB} is also an regular expression. If a string \emph{p} -matches A and another string \emph{q} matches B, the string \emph{pq} -will match AB. Thus, complex expressions can easily be constructed -from simpler ones like the primitives described here. For details of -the theory and implementation of regular expressions, consult almost -any textbook about compiler construction. - -% XXX The reference could be made more specific, say to -% "Compilers: Principles, Techniques and Tools", by Alfred V. Aho, -% Ravi Sethi, and Jeffrey D. Ullman, or some FA text. - -A brief explanation of the format of regular expressions follows. - -Regular expressions can contain both special and ordinary characters. -Ordinary characters, like '\code{A}', '\code{a}', or '\code{0}', are -the simplest regular expressions; they simply match themselves. You -can concatenate ordinary characters, so '\code{last}' matches the -characters 'last'. (In the rest of this section, we'll write RE's in -\code{this special font}, usually without quotes, and strings to be -matched 'in single quotes'.) - -Special characters either stand for classes of ordinary characters, or -affect how the regular expressions around them are interpreted. - -The special characters are: -\begin{itemize} -\item[\code{.}] (Dot.) Matches any character except a newline. -\item[\code{\^}] (Caret.) Matches the start of the string. -\item[\code{\$}] Matches the end of the string. -\code{foo} matches both 'foo' and 'foobar', while the regular -expression '\code{foo\$}' matches only 'foo'. -\item[\code{*}] Causes the resulting RE to -match 0 or more repetitions of the preceding RE. \code{ab*} will -match 'a', 'ab', or 'a' followed by any number of 'b's. -\item[\code{+}] Causes the -resulting RE to match 1 or more repetitions of the preceding RE. -\code{ab+} will match 'a' followed by any non-zero number of 'b's; it -will not match just 'a'. -\item[\code{?}] Causes the resulting RE to -match 0 or 1 repetitions of the preceding RE. \code{ab?} will -match either 'a' or 'ab'. - -\item[\code{\e}] Either escapes special characters (permitting you to match -characters like '*?+\&\$'), or signals a special sequence; special -sequences are discussed below. Remember that Python also uses the -backslash as an escape sequence in string literals; if the escape -sequence isn't recognized by Python's parser, the backslash and -subsequent character are included in the resulting string. However, -if Python would recognize the resulting sequence, the backslash should -be repeated twice. - -\item[\code{[]}] Used to indicate a set of characters. Characters can -be listed individually, or a range is indicated by giving two -characters and separating them by a '-'. Special characters are -not active inside sets. For example, \code{[akm\$]} -will match any of the characters 'a', 'k', 'm', or '\$'; \code{[a-z]} will -match any lowercase letter. - -If you want to include a \code{]} inside a -set, it must be the first character of the set; to include a \code{-}, -place it as the first or last character. - -Characters \emph{not} within a range can be matched by including a -\code{\^} as the first character of the set; \code{\^} elsewhere will -simply match the '\code{\^}' character. -\end{itemize} - -The special sequences consist of '\code{\e}' and a character -from the list below. If the ordinary character is not on the list, -then the resulting RE will match the second character. For example, -\code{\e\$} matches the character '\$'. Ones where the backslash -should be doubled in string literals are indicated. - -\begin{itemize} -\item[\code{\e|}]\code{A\e|B}, where A and B can be arbitrary REs, -creates a regular expression that will match either A or B. This can -be used inside groups (see below) as well. -% -\item[\code{\e( \e)}] Indicates the start and end of a group; the -contents of a group can be matched later in the string with the -\code{\e [1-9]} special sequence, described next. -\end{itemize} - -\begin{fulllineitems} -\item[\code{\e \e 1, ... \e \e 7, \e 8, \e 9}] -Matches the contents of the group of the same -number. For example, \code{\e (.+\e ) \e \e 1} matches 'the the' or -'55 55', but not 'the end' (note the space after the group). This -special sequence can only be used to match one of the first 9 groups; -groups with higher numbers can be matched using the \code{\e v} -sequence. (\code{\e 8} and \code{\e 9} don't need a double backslash -because they are not octal digits.) -\end{fulllineitems} - -\begin{itemize} -\item[\code{\e \e b}] Matches the empty string, but only at the -beginning or end of a word. A word is defined as a sequence of -alphanumeric characters, so the end of a word is indicated by -whitespace or a non-alphanumeric character. -% -\item[\code{\e B}] Matches the empty string, but when it is \emph{not} at the -beginning or end of a word. -% -\item[\code{\e v}] Must be followed by a two digit decimal number, and -matches the contents of the group of the same number. The group -number must be between 1 and 99, inclusive. -% -\item[\code{\e w}]Matches any alphanumeric character; this is -equivalent to the set \code{[a-zA-Z0-9]}. -% -\item[\code{\e W}] Matches any non-alphanumeric character; this is -equivalent to the set \code{[\^a-zA-Z0-9]}. -\item[\code{\e <}] Matches the empty string, but only at the beginning of a -word. A word is defined as a sequence of alphanumeric characters, so -the end of a word is indicated by whitespace or a non-alphanumeric -character. -\item[\code{\e >}] Matches the empty string, but only at the end of a -word. - -\item[\code{\e \e \e \e}] Matches a literal backslash. - -% In Emacs, the following two are start of buffer/end of buffer. In -% Python they seem to be synonyms for ^$. -\item[\code{\e `}] Like \code{\^}, this only matches at the start of the -string. -\item[\code{\e \e '}] Like \code{\$}, this only matches at the end of -the string. -% end of buffer -\end{itemize} - -\subsection{Module Contents} -\nodename{Contents of Module regex} - -The module defines these functions, and an exception: - - -\begin{funcdesc}{match}{pattern, string} - Return how many characters at the beginning of \var{string} match - the regular expression \var{pattern}. Return \code{-1} if the - string does not match the pattern (this is different from a - zero-length match!). -\end{funcdesc} - -\begin{funcdesc}{search}{pattern, string} - Return the first position in \var{string} that matches the regular - expression \var{pattern}. Return \code{-1} if no position in the string - matches the pattern (this is different from a zero-length match - anywhere!). -\end{funcdesc} - -\begin{funcdesc}{compile}{pattern\optional{, translate}} - Compile a regular expression pattern into a regular expression - object, which can be used for matching using its \code{match()} and - \code{search()} methods, described below. The optional argument - \var{translate}, if present, must be a 256-character string - indicating how characters (both of the pattern and of the strings to - be matched) are translated before comparing them; the \var{i}-th - element of the string gives the translation for the character with - \ASCII{} code \var{i}. This can be used to implement - case-insensitive matching; see the \code{casefold} data item below. - - The sequence - -\begin{verbatim} -prog = regex.compile(pat) -result = prog.match(str) -\end{verbatim} -% -is equivalent to - -\begin{verbatim} -result = regex.match(pat, str) -\end{verbatim} - -but the version using \code{compile()} is more efficient when multiple -regular expressions are used concurrently in a single program. (The -compiled version of the last pattern passed to \code{regex.match()} or -\code{regex.search()} is cached, so programs that use only a single -regular expression at a time needn't worry about compiling regular -expressions.) -\end{funcdesc} - -\begin{funcdesc}{set_syntax}{flags} - Set the syntax to be used by future calls to \code{compile()}, - \code{match()} and \code{search()}. (Already compiled expression - objects are not affected.) The argument is an integer which is the - OR of several flag bits. The return value is the previous value of - the syntax flags. Names for the flags are defined in the standard - module \code{regex_syntax}\refstmodindex{regex_syntax}; read the - file \file{regex_syntax.py} for more information. -\end{funcdesc} - -\begin{funcdesc}{get_syntax}{} - Returns the current value of the syntax flags as an integer. -\end{funcdesc} - -\begin{funcdesc}{symcomp}{pattern\optional{, translate}} -This is like \code{compile()}, but supports symbolic group names: if a -parenthesis-enclosed group begins with a group name in angular -brackets, e.g. \code{'\e([a-z][a-z0-9]*\e)'}, the group can -be referenced by its name in arguments to the \code{group()} method of -the resulting compiled regular expression object, like this: -\code{p.group('id')}. Group names may contain alphanumeric characters -and \code{'_'} only. -\end{funcdesc} - -\begin{excdesc}{error} - Exception raised when a string passed to one of the functions here - is not a valid regular expression (e.g., unmatched parentheses) or - when some other error occurs during compilation or matching. (It is - never an error if a string contains no match for a pattern.) -\end{excdesc} - -\begin{datadesc}{casefold} -A string suitable to pass as the \var{translate} argument to -\code{compile()} to map all upper case characters to their lowercase -equivalents. -\end{datadesc} - -\noindent -Compiled regular expression objects support these methods: - -\setindexsubitem{(regex method)} -\begin{funcdesc}{match}{string\optional{, pos}} - Return how many characters at the beginning of \var{string} match - the compiled regular expression. Return \code{-1} if the string - does not match the pattern (this is different from a zero-length - match!). - - The optional second parameter, \var{pos}, gives an index in the string - where the search is to start; it defaults to \code{0}. This is not - completely equivalent to slicing the string; the \code{'\^'} pattern - character matches at the real beginning of the string and at positions - just after a newline, not necessarily at the index where the search - is to start. -\end{funcdesc} - -\begin{funcdesc}{search}{string\optional{, pos}} - Return the first position in \var{string} that matches the regular - expression \code{pattern}. Return \code{-1} if no position in the - string matches the pattern (this is different from a zero-length - match anywhere!). - - The optional second parameter has the same meaning as for the - \code{match()} method. -\end{funcdesc} - -\begin{funcdesc}{group}{index, index, ...} -This method is only valid when the last call to the \code{match()} -or \code{search()} method found a match. It returns one or more -groups of the match. If there is a single \var{index} argument, -the result is a single string; if there are multiple arguments, the -result is a tuple with one item per argument. If the \var{index} is -zero, the corresponding return value is the entire matching string; if -it is in the inclusive range [1..99], it is the string matching the -corresponding parenthesized group (using the default syntax, -groups are parenthesized using \code{{\e}(} and \code{{\e})}). If no -such group exists, the corresponding result is \code{None}. - -If the regular expression was compiled by \code{symcomp()} instead of -\code{compile()}, the \var{index} arguments may also be strings -identifying groups by their group name. -\end{funcdesc} - -\noindent -Compiled regular expressions support these data attributes: - -\setindexsubitem{(regex attribute)} - -\begin{datadesc}{regs} -When the last call to the \code{match()} or \code{search()} method found a -match, this is a tuple of pairs of indexes corresponding to the -beginning and end of all parenthesized groups in the pattern. Indices -are relative to the string argument passed to \code{match()} or -\code{search()}. The 0-th tuple gives the beginning and end or the -whole pattern. When the last match or search failed, this is -\code{None}. -\end{datadesc} - -\begin{datadesc}{last} -When the last call to the \code{match()} or \code{search()} method found a -match, this is the string argument passed to that method. When the -last match or search failed, this is \code{None}. -\end{datadesc} - -\begin{datadesc}{translate} -This is the value of the \var{translate} argument to -\code{regex.compile()} that created this regular expression object. If -the \var{translate} argument was omitted in the \code{regex.compile()} -call, this is \code{None}. -\end{datadesc} - -\begin{datadesc}{givenpat} -The regular expression pattern as passed to \code{compile()} or -\code{symcomp()}. -\end{datadesc} - -\begin{datadesc}{realpat} -The regular expression after stripping the group names for regular -expressions compiled with \code{symcomp()}. Same as \code{givenpat} -otherwise. -\end{datadesc} - -\begin{datadesc}{groupindex} -A dictionary giving the mapping from symbolic group names to numerical -group indexes for regular expressions compiled with \code{symcomp()}. -\code{None} otherwise. -\end{datadesc} Deleted: /python/trunk/Doc/lib/libregsub.tex ============================================================================== --- /python/trunk/Doc/lib/libregsub.tex Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,74 +0,0 @@ -\section{\module{regsub} --- - String operations using regular expressions} - -\declaremodule{standard}{regsub} -\modulesynopsis{Substitution and splitting operations that use - regular expressions. \strong{Obsolete!}} - - -This module defines a number of functions useful for working with -regular expressions (see built-in module \refmodule{regex}). - -Warning: these functions are not thread-safe. - -\strong{Obsolescence note:} -This module is obsolete as of Python version 1.5; it is still being -maintained because much existing code still uses it. All new code in -need of regular expressions should use the new \refmodule{re} module, which -supports the more powerful and regular Perl-style regular expressions. -Existing code should be converted. The standard library module -\module{reconvert} helps in converting \refmodule{regex} style regular -expressions to \refmodule{re} style regular expressions. (For more -conversion help, see Andrew Kuchling's\index{Kuchling, Andrew} -``regex-to-re HOWTO'' at -\url{http://www.python.org/doc/howto/regex-to-re/}.) - - -\begin{funcdesc}{sub}{pat, repl, str} -Replace the first occurrence of pattern \var{pat} in string -\var{str} by replacement \var{repl}. If the pattern isn't found, -the string is returned unchanged. The pattern may be a string or an -already compiled pattern. The replacement may contain references -\samp{\e \var{digit}} to subpatterns and escaped backslashes. -\end{funcdesc} - -\begin{funcdesc}{gsub}{pat, repl, str} -Replace all (non-overlapping) occurrences of pattern \var{pat} in -string \var{str} by replacement \var{repl}. The same rules as for -\code{sub()} apply. Empty matches for the pattern are replaced only -when not adjacent to a previous match, so e.g. -\code{gsub('', '-', 'abc')} returns \code{'-a-b-c-'}. -\end{funcdesc} - -\begin{funcdesc}{split}{str, pat\optional{, maxsplit}} -Split the string \var{str} in fields separated by delimiters matching -the pattern \var{pat}, and return a list containing the fields. Only -non-empty matches for the pattern are considered, so e.g. -\code{split('a:b', ':*')} returns \code{['a', 'b']} and -\code{split('abc', '')} returns \code{['abc']}. The \var{maxsplit} -defaults to 0. If it is nonzero, only \var{maxsplit} number of splits -occur, and the remainder of the string is returned as the final -element of the list. -\end{funcdesc} - -\begin{funcdesc}{splitx}{str, pat\optional{, maxsplit}} -Split the string \var{str} in fields separated by delimiters matching -the pattern \var{pat}, and return a list containing the fields as well -as the separators. For example, \code{splitx('a:::b', ':*')} returns -\code{['a', ':::', 'b']}. Otherwise, this function behaves the same -as \code{split}. -\end{funcdesc} - -\begin{funcdesc}{capwords}{s\optional{, pat}} -Capitalize words separated by optional pattern \var{pat}. The default -pattern uses any characters except letters, digits and underscores as -word delimiters. Capitalization is done by changing the first -character of each word to upper case. -\end{funcdesc} - -\begin{funcdesc}{clear_cache}{} -The regsub module maintains a cache of compiled regular expressions, -keyed on the regular expression string and the syntax of the regex -module at the time the expression was compiled. This function clears -that cache. -\end{funcdesc} Modified: python/trunk/Doc/lib/libundoc.tex ============================================================================== --- python/trunk/Doc/lib/libundoc.tex (original) +++ python/trunk/Doc/lib/libundoc.tex Thu Mar 16 07:50:13 2006 @@ -137,18 +137,6 @@ \item[\module{rand}] --- Old interface to the random number generator. -\item[\module{regex}] ---- Emacs-style regular expression support; may still be used in some -old code (extension module). Refer to the -\citetitle[http://www.python.org/doc/1.6/lib/module-regex.html]{Python -1.6 Documentation} for documentation. - -\item[\module{regsub}] ---- Regular expression based string replacement utilities, for use -with \module{regex} (extension module). Refer to the -\citetitle[http://www.python.org/doc/1.6/lib/module-regsub.html]{Python -1.6 Documentation} for documentation. - \item[\module{statcache}] --- Caches the results of os.stat(). Using the cache can be fragile and error-prone, just use \code{os.stat()} directly. Deleted: /python/trunk/Lib/lib-old/Para.py ============================================================================== --- /python/trunk/Lib/lib-old/Para.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,343 +0,0 @@ -# Text formatting abstractions -# Note -- this module is obsolete, it's too slow anyway - - -# Oft-used type object -Int = type(0) - - -# Represent a paragraph. This is a list of words with associated -# font and size information, plus indents and justification for the -# entire paragraph. -# Once the words have been added to a paragraph, it can be laid out -# for different line widths. Once laid out, it can be rendered at -# different screen locations. Once rendered, it can be queried -# for mouse hits, and parts of the text can be highlighted -class Para: - # - def __init__(self): - self.words = [] # The words - self.just = 'l' # Justification: 'l', 'r', 'lr' or 'c' - self.indent_left = self.indent_right = self.indent_hang = 0 - # Final lay-out parameters, may change - self.left = self.top = self.right = self.bottom = \ - self.width = self.height = self.lines = None - # - # Add a word, computing size information for it. - # Words may also be added manually by appending to self.words - # Each word should be a 7-tuple: - # (font, text, width, space, stretch, ascent, descent) - def addword(self, d, font, text, space, stretch): - if font is not None: - d.setfont(font) - width = d.textwidth(text) - ascent = d.baseline() - descent = d.lineheight() - ascent - spw = d.textwidth(' ') - space = space * spw - stretch = stretch * spw - tuple = (font, text, width, space, stretch, ascent, descent) - self.words.append(tuple) - # - # Hooks to begin and end anchors -- insert numbers in the word list! - def bgn_anchor(self, id): - self.words.append(id) - # - def end_anchor(self, id): - self.words.append(0) - # - # Return the total length (width) of the text added so far, in pixels - def getlength(self): - total = 0 - for word in self.words: - if type(word) is not Int: - total = total + word[2] + word[3] - return total - # - # Tab to a given position (relative to the current left indent): - # remove all stretch, add fixed space up to the new indent. - # If the current position is already at the tab stop, - # don't add any new space (but still remove the stretch) - def tabto(self, tab): - total = 0 - as, de = 1, 0 - for i in range(len(self.words)): - word = self.words[i] - if type(word) is Int: continue - (fo, te, wi, sp, st, as, de) = word - self.words[i] = (fo, te, wi, sp, 0, as, de) - total = total + wi + sp - if total < tab: - self.words.append((None, '', 0, tab-total, 0, as, de)) - # - # Make a hanging tag: tab to hang, increment indent_left by hang, - # and reset indent_hang to -hang - def makehangingtag(self, hang): - self.tabto(hang) - self.indent_left = self.indent_left + hang - self.indent_hang = -hang - # - # Decide where the line breaks will be given some screen width - def layout(self, linewidth): - self.width = linewidth - height = 0 - self.lines = lines = [] - avail1 = self.width - self.indent_left - self.indent_right - avail = avail1 - self.indent_hang - words = self.words - i = 0 - n = len(words) - lastfont = None - while i < n: - firstfont = lastfont - charcount = 0 - width = 0 - stretch = 0 - ascent = 0 - descent = 0 - lsp = 0 - j = i - while i < n: - word = words[i] - if type(word) is Int: - if word > 0 and width >= avail: - break - i = i+1 - continue - fo, te, wi, sp, st, as, de = word - if width + wi > avail and width > 0 and wi > 0: - break - if fo is not None: - lastfont = fo - if width == 0: - firstfont = fo - charcount = charcount + len(te) + (sp > 0) - width = width + wi + sp - lsp = sp - stretch = stretch + st - lst = st - ascent = max(ascent, as) - descent = max(descent, de) - i = i+1 - while i > j and type(words[i-1]) is Int and \ - words[i-1] > 0: i = i-1 - width = width - lsp - if i < n: - stretch = stretch - lst - else: - stretch = 0 - tuple = i-j, firstfont, charcount, width, stretch, \ - ascent, descent - lines.append(tuple) - height = height + ascent + descent - avail = avail1 - self.height = height - # - # Call a function for all words in a line - def visit(self, wordfunc, anchorfunc): - avail1 = self.width - self.indent_left - self.indent_right - avail = avail1 - self.indent_hang - v = self.top - i = 0 - for tuple in self.lines: - wordcount, firstfont, charcount, width, stretch, \ - ascent, descent = tuple - h = self.left + self.indent_left - if i == 0: h = h + self.indent_hang - extra = 0 - if self.just == 'r': h = h + avail - width - elif self.just == 'c': h = h + (avail - width) / 2 - elif self.just == 'lr' and stretch > 0: - extra = avail - width - v2 = v + ascent + descent - for j in range(i, i+wordcount): - word = self.words[j] - if type(word) is Int: - ok = anchorfunc(self, tuple, word, \ - h, v) - if ok is not None: return ok - continue - fo, te, wi, sp, st, as, de = word - if extra > 0 and stretch > 0: - ex = extra * st / stretch - extra = extra - ex - stretch = stretch - st - else: - ex = 0 - h2 = h + wi + sp + ex - ok = wordfunc(self, tuple, word, h, v, \ - h2, v2, (j==i), (j==i+wordcount-1)) - if ok is not None: return ok - h = h2 - v = v2 - i = i + wordcount - avail = avail1 - # - # Render a paragraph in "drawing object" d, using the rectangle - # given by (left, top, right) with an unspecified bottom. - # Return the computed bottom of the text. - def render(self, d, left, top, right): - if self.width != right-left: - self.layout(right-left) - self.left = left - self.top = top - self.right = right - self.bottom = self.top + self.height - self.anchorid = 0 - try: - self.d = d - self.visit(self.__class__._renderword, \ - self.__class__._renderanchor) - finally: - self.d = None - return self.bottom - # - def _renderword(self, tuple, word, h, v, h2, v2, isfirst, islast): - if word[0] is not None: self.d.setfont(word[0]) - baseline = v + tuple[5] - self.d.text((h, baseline - word[5]), word[1]) - if self.anchorid > 0: - self.d.line((h, baseline+2), (h2, baseline+2)) - # - def _renderanchor(self, tuple, word, h, v): - self.anchorid = word - # - # Return which anchor(s) was hit by the mouse - def hitcheck(self, mouseh, mousev): - self.mouseh = mouseh - self.mousev = mousev - self.anchorid = 0 - self.hits = [] - self.visit(self.__class__._hitcheckword, \ - self.__class__._hitcheckanchor) - return self.hits - # - def _hitcheckword(self, tuple, word, h, v, h2, v2, isfirst, islast): - if self.anchorid > 0 and h <= self.mouseh <= h2 and \ - v <= self.mousev <= v2: - self.hits.append(self.anchorid) - # - def _hitcheckanchor(self, tuple, word, h, v): - self.anchorid = word - # - # Return whether the given anchor id is present - def hasanchor(self, id): - return id in self.words or -id in self.words - # - # Extract the raw text from the word list, substituting one space - # for non-empty inter-word space, and terminating with '\n' - def extract(self): - text = '' - for w in self.words: - if type(w) is not Int: - word = w[1] - if w[3]: word = word + ' ' - text = text + word - return text + '\n' - # - # Return which character position was hit by the mouse, as - # an offset in the entire text as returned by extract(). - # Return None if the mouse was not in this paragraph - def whereis(self, d, mouseh, mousev): - if mousev < self.top or mousev > self.bottom: - return None - self.mouseh = mouseh - self.mousev = mousev - self.lastfont = None - self.charcount = 0 - try: - self.d = d - return self.visit(self.__class__._whereisword, \ - self.__class__._whereisanchor) - finally: - self.d = None - # - def _whereisword(self, tuple, word, h1, v1, h2, v2, isfirst, islast): - fo, te, wi, sp, st, as, de = word - if fo is not None: self.lastfont = fo - h = h1 - if isfirst: h1 = 0 - if islast: h2 = 999999 - if not (v1 <= self.mousev <= v2 and h1 <= self.mouseh <= h2): - self.charcount = self.charcount + len(te) + (sp > 0) - return - if self.lastfont is not None: - self.d.setfont(self.lastfont) - cc = 0 - for c in te: - cw = self.d.textwidth(c) - if self.mouseh <= h + cw/2: - return self.charcount + cc - cc = cc+1 - h = h+cw - self.charcount = self.charcount + cc - if self.mouseh <= (h+h2) / 2: - return self.charcount - else: - return self.charcount + 1 - # - def _whereisanchor(self, tuple, word, h, v): - pass - # - # Return screen position corresponding to position in paragraph. - # Return tuple (h, vtop, vbaseline, vbottom). - # This is more or less the inverse of whereis() - def screenpos(self, d, pos): - if pos < 0: - ascent, descent = self.lines[0][5:7] - return self.left, self.top, self.top + ascent, \ - self.top + ascent + descent - self.pos = pos - self.lastfont = None - try: - self.d = d - ok = self.visit(self.__class__._screenposword, \ - self.__class__._screenposanchor) - finally: - self.d = None - if ok is None: - ascent, descent = self.lines[-1][5:7] - ok = self.right, self.bottom - ascent - descent, \ - self.bottom - descent, self.bottom - return ok - # - def _screenposword(self, tuple, word, h1, v1, h2, v2, isfirst, islast): - fo, te, wi, sp, st, as, de = word - if fo is not None: self.lastfont = fo - cc = len(te) + (sp > 0) - if self.pos > cc: - self.pos = self.pos - cc - return - if self.pos < cc: - self.d.setfont(self.lastfont) - h = h1 + self.d.textwidth(te[:self.pos]) - else: - h = h2 - ascent, descent = tuple[5:7] - return h, v1, v1+ascent, v2 - # - def _screenposanchor(self, tuple, word, h, v): - pass - # - # Invert the stretch of text between pos1 and pos2. - # If pos1 is None, the beginning is implied; - # if pos2 is None, the end is implied. - # Undoes its own effect when called again with the same arguments - def invert(self, d, pos1, pos2): - if pos1 is None: - pos1 = self.left, self.top, self.top, self.top - else: - pos1 = self.screenpos(d, pos1) - if pos2 is None: - pos2 = self.right, self.bottom,self.bottom,self.bottom - else: - pos2 = self.screenpos(d, pos2) - h1, top1, baseline1, bottom1 = pos1 - h2, top2, baseline2, bottom2 = pos2 - if bottom1 <= top2: - d.invert((h1, top1), (self.right, bottom1)) - h1 = self.left - if bottom1 < top2: - d.invert((h1, bottom1), (self.right, top2)) - top1, bottom1 = top2, bottom2 - d.invert((h1, top1), (h2, bottom2)) Deleted: /python/trunk/Lib/lib-old/addpack.py ============================================================================== --- /python/trunk/Lib/lib-old/addpack.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,67 +0,0 @@ -# This module provides standard support for "packages". -# -# The idea is that large groups of related modules can be placed in -# their own subdirectory, which can be added to the Python search path -# in a relatively easy way. -# -# The current version takes a package name and searches the Python -# search path for a directory by that name, and if found adds it to -# the module search path (sys.path). It maintains a list of packages -# that have already been added so adding the same package many times -# is OK. -# -# It is intended to be used in a fairly stylized manner: each module -# that wants to use a particular package, say 'Foo', is supposed to -# contain the following code: -# -# from addpack import addpack -# addpack('Foo') -# -# -# Additional arguments, when present, provide additional places where -# to look for the package before trying sys.path (these may be either -# strings or lists/tuples of strings). Also, if the package name is a -# full pathname, first the last component is tried in the usual way, -# then the full pathname is tried last. If the package name is a -# *relative* pathname (UNIX: contains a slash but doesn't start with -# one), then nothing special is done. The packages "/foo/bar/bletch" -# and "bletch" are considered the same, but unrelated to "bar/bletch". -# -# If the algorithm finds more than one suitable subdirectory, all are -# added to the search path -- this makes it possible to override part -# of a package. The same path will not be added more than once. -# -# If no directory is found, ImportError is raised. - -_packs = {} # {pack: [pathname, ...], ...} - -def addpack(pack, *locations): - import os - if os.path.isabs(pack): - base = os.path.basename(pack) - else: - base = pack - if _packs.has_key(base): - return - import sys - path = [] - for loc in _flatten(locations) + sys.path: - fn = os.path.join(loc, base) - if fn not in path and os.path.isdir(fn): - path.append(fn) - if pack != base and pack not in path and os.path.isdir(pack): - path.append(pack) - if not path: raise ImportError, 'package ' + pack + ' not found' - _packs[base] = path - for fn in path: - if fn not in sys.path: - sys.path.append(fn) - -def _flatten(locations): - locs = [] - for loc in locations: - if type(loc) == type(''): - locs.append(loc) - else: - locs = locs + _flatten(loc) - return locs Deleted: /python/trunk/Lib/lib-old/cmp.py ============================================================================== --- /python/trunk/Lib/lib-old/cmp.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,63 +0,0 @@ -"""Efficiently compare files, boolean outcome only (equal / not equal). - -Tricks (used in this order): - - Files with identical type, size & mtime are assumed to be clones - - Files with different type or size cannot be identical - - We keep a cache of outcomes of earlier comparisons - - We don't fork a process to run 'cmp' but read the files ourselves -""" - -import os - -cache = {} - -def cmp(f1, f2, shallow=1): - """Compare two files, use the cache if possible. - Return 1 for identical files, 0 for different. - Raise exceptions if either file could not be statted, read, etc.""" - s1, s2 = sig(os.stat(f1)), sig(os.stat(f2)) - if s1[0] != 8 or s2[0] != 8: - # Either is a not a plain file -- always report as different - return 0 - if shallow and s1 == s2: - # type, size & mtime match -- report same - return 1 - if s1[:2] != s2[:2]: # Types or sizes differ, don't bother - # types or sizes differ -- report different - return 0 - # same type and size -- look in the cache - key = (f1, f2) - try: - cs1, cs2, outcome = cache[key] - # cache hit - if s1 == cs1 and s2 == cs2: - # cached signatures match - return outcome - # stale cached signature(s) - except KeyError: - # cache miss - pass - # really compare - outcome = do_cmp(f1, f2) - cache[key] = s1, s2, outcome - return outcome - -def sig(st): - """Return signature (i.e., type, size, mtime) from raw stat data - 0-5: st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid - 6-9: st_size, st_atime, st_mtime, st_ctime""" - type = st[0] / 4096 - size = st[6] - mtime = st[8] - return type, size, mtime - -def do_cmp(f1, f2): - """Compare two files, really.""" - bufsize = 8*1024 # Could be tuned - fp1 = open(f1, 'rb') - fp2 = open(f2, 'rb') - while 1: - b1 = fp1.read(bufsize) - b2 = fp2.read(bufsize) - if b1 != b2: return 0 - if not b1: return 1 Deleted: /python/trunk/Lib/lib-old/cmpcache.py ============================================================================== --- /python/trunk/Lib/lib-old/cmpcache.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,64 +0,0 @@ -"""Efficiently compare files, boolean outcome only (equal / not equal). - -Tricks (used in this order): - - Use the statcache module to avoid statting files more than once - - Files with identical type, size & mtime are assumed to be clones - - Files with different type or size cannot be identical - - We keep a cache of outcomes of earlier comparisons - - We don't fork a process to run 'cmp' but read the files ourselves -""" - -import os -from stat import * -import statcache - - -# The cache. -# -cache = {} - - -def cmp(f1, f2, shallow=1): - """Compare two files, use the cache if possible. - May raise os.error if a stat or open of either fails. - Return 1 for identical files, 0 for different. - Raise exceptions if either file could not be statted, read, etc.""" - s1, s2 = sig(statcache.stat(f1)), sig(statcache.stat(f2)) - if not S_ISREG(s1[0]) or not S_ISREG(s2[0]): - # Either is a not a plain file -- always report as different - return 0 - if shallow and s1 == s2: - # type, size & mtime match -- report same - return 1 - if s1[:2] != s2[:2]: # Types or sizes differ, don't bother - # types or sizes differ -- report different - return 0 - # same type and size -- look in the cache - key = f1 + ' ' + f2 - if cache.has_key(key): - cs1, cs2, outcome = cache[key] - # cache hit - if s1 == cs1 and s2 == cs2: - # cached signatures match - return outcome - # stale cached signature(s) - # really compare - outcome = do_cmp(f1, f2) - cache[key] = s1, s2, outcome - return outcome - -def sig(st): - """Return signature (i.e., type, size, mtime) from raw stat data.""" - return S_IFMT(st[ST_MODE]), st[ST_SIZE], st[ST_MTIME] - -def do_cmp(f1, f2): - """Compare two files, really.""" - #print ' cmp', f1, f2 # XXX remove when debugged - bufsize = 8*1024 # Could be tuned - fp1 = open(f1, 'rb') - fp2 = open(f2, 'rb') - while 1: - b1 = fp1.read(bufsize) - b2 = fp2.read(bufsize) - if b1 != b2: return 0 - if not b1: return 1 Deleted: /python/trunk/Lib/lib-old/codehack.py ============================================================================== --- /python/trunk/Lib/lib-old/codehack.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,81 +0,0 @@ -# A subroutine for extracting a function name from a code object -# (with cache) - -import sys -from stat import * -import string -import os -import linecache - -# XXX The functions getcodename() and getfuncname() are now obsolete -# XXX as code and function objects now have a name attribute -- -# XXX co.co_name and f.func_name. -# XXX getlineno() is now also obsolete because of the new attribute -# XXX of code objects, co.co_firstlineno. - -# Extract the function or class name from a code object. -# This is a bit of a hack, since a code object doesn't contain -# the name directly. So what do we do: -# - get the filename (which *is* in the code object) -# - look in the code string to find the first SET_LINENO instruction -# (this must be the first instruction) -# - get the line from the file -# - if the line starts with 'class' or 'def' (after possible whitespace), -# extract the following identifier -# -# This breaks apart when the function was read from -# or constructed by exec(), when the file is not accessible, -# and also when the file has been modified or when a line is -# continued with a backslash before the function or class name. -# -# Because this is a pretty expensive hack, a cache is kept. - -SET_LINENO = 127 # The opcode (see "opcode.h" in the Python source) -identchars = string.ascii_letters + string.digits + '_' # Identifier characters - -_namecache = {} # The cache - -def getcodename(co): - try: - return co.co_name - except AttributeError: - pass - key = `co` # arbitrary but uniquely identifying string - if _namecache.has_key(key): return _namecache[key] - filename = co.co_filename - code = co.co_code - name = '' - if ord(code[0]) == SET_LINENO: - lineno = ord(code[1]) | ord(code[2]) << 8 - line = linecache.getline(filename, lineno) - words = line.split() - if len(words) >= 2 and words[0] in ('def', 'class'): - name = words[1] - for i in range(len(name)): - if name[i] not in identchars: - name = name[:i] - break - _namecache[key] = name - return name - -# Use the above routine to find a function's name. - -def getfuncname(func): - try: - return func.func_name - except AttributeError: - pass - return getcodename(func.func_code) - -# A part of the above code to extract just the line number from a code object. - -def getlineno(co): - try: - return co.co_firstlineno - except AttributeError: - pass - code = co.co_code - if ord(code[0]) == SET_LINENO: - return ord(code[1]) | ord(code[2]) << 8 - else: - return -1 Deleted: /python/trunk/Lib/lib-old/dircmp.py ============================================================================== --- /python/trunk/Lib/lib-old/dircmp.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,202 +0,0 @@ -"""A class to build directory diff tools on.""" - -import os - -import dircache -import cmpcache -import statcache -from stat import * - -class dircmp: - """Directory comparison class.""" - - def new(self, a, b): - """Initialize.""" - self.a = a - self.b = b - # Properties that caller may change before calling self.run(): - self.hide = [os.curdir, os.pardir] # Names never to be shown - self.ignore = ['RCS', 'tags'] # Names ignored in comparison - - return self - - def run(self): - """Compare everything except common subdirectories.""" - self.a_list = filter(dircache.listdir(self.a), self.hide) - self.b_list = filter(dircache.listdir(self.b), self.hide) - self.a_list.sort() - self.b_list.sort() - self.phase1() - self.phase2() - self.phase3() - - def phase1(self): - """Compute common names.""" - self.a_only = [] - self.common = [] - for x in self.a_list: - if x in self.b_list: - self.common.append(x) - else: - self.a_only.append(x) - - self.b_only = [] - for x in self.b_list: - if x not in self.common: - self.b_only.append(x) - - def phase2(self): - """Distinguish files, directories, funnies.""" - self.common_dirs = [] - self.common_files = [] - self.common_funny = [] - - for x in self.common: - a_path = os.path.join(self.a, x) - b_path = os.path.join(self.b, x) - - ok = 1 - try: - a_stat = statcache.stat(a_path) - except os.error, why: - # print 'Can\'t stat', a_path, ':', why[1] - ok = 0 - try: - b_stat = statcache.stat(b_path) - except os.error, why: - # print 'Can\'t stat', b_path, ':', why[1] - ok = 0 - - if ok: - a_type = S_IFMT(a_stat[ST_MODE]) - b_type = S_IFMT(b_stat[ST_MODE]) - if a_type != b_type: - self.common_funny.append(x) - elif S_ISDIR(a_type): - self.common_dirs.append(x) - elif S_ISREG(a_type): - self.common_files.append(x) - else: - self.common_funny.append(x) - else: - self.common_funny.append(x) - - def phase3(self): - """Find out differences between common files.""" - xx = cmpfiles(self.a, self.b, self.common_files) - self.same_files, self.diff_files, self.funny_files = xx - - def phase4(self): - """Find out differences between common subdirectories. - A new dircmp object is created for each common subdirectory, - these are stored in a dictionary indexed by filename. - The hide and ignore properties are inherited from the parent.""" - self.subdirs = {} - for x in self.common_dirs: - a_x = os.path.join(self.a, x) - b_x = os.path.join(self.b, x) - self.subdirs[x] = newdd = dircmp().new(a_x, b_x) - newdd.hide = self.hide - newdd.ignore = self.ignore - newdd.run() - - def phase4_closure(self): - """Recursively call phase4() on subdirectories.""" - self.phase4() - for x in self.subdirs.keys(): - self.subdirs[x].phase4_closure() - - def report(self): - """Print a report on the differences between a and b.""" - # Assume that phases 1 to 3 have been executed - # Output format is purposely lousy - print 'diff', self.a, self.b - if self.a_only: - print 'Only in', self.a, ':', self.a_only - if self.b_only: - print 'Only in', self.b, ':', self.b_only - if self.same_files: - print 'Identical files :', self.same_files - if self.diff_files: - print 'Differing files :', self.diff_files - if self.funny_files: - print 'Trouble with common files :', self.funny_files - if self.common_dirs: - print 'Common subdirectories :', self.common_dirs - if self.common_funny: - print 'Common funny cases :', self.common_funny - - def report_closure(self): - """Print reports on self and on subdirs. - If phase 4 hasn't been done, no subdir reports are printed.""" - self.report() - try: - x = self.subdirs - except AttributeError: - return # No subdirectories computed - for x in self.subdirs.keys(): - print - self.subdirs[x].report_closure() - - def report_phase4_closure(self): - """Report and do phase 4 recursively.""" - self.report() - self.phase4() - for x in self.subdirs.keys(): - print - self.subdirs[x].report_phase4_closure() - - -def cmpfiles(a, b, common): - """Compare common files in two directories. - Return: - - files that compare equal - - files that compare different - - funny cases (can't stat etc.)""" - - res = ([], [], []) - for x in common: - res[cmp(os.path.join(a, x), os.path.join(b, x))].append(x) - return res - - -def cmp(a, b): - """Compare two files. - Return: - 0 for equal - 1 for different - 2 for funny cases (can't stat, etc.)""" - - try: - if cmpcache.cmp(a, b): return 0 - return 1 - except os.error: - return 2 - - -def filter(list, skip): - """Return a copy with items that occur in skip removed.""" - - result = [] - for item in list: - if item not in skip: result.append(item) - return result - - -def demo(): - """Demonstration and testing.""" - - import sys - import getopt - options, args = getopt.getopt(sys.argv[1:], 'r') - if len(args) != 2: - raise getopt.error, 'need exactly two args' - dd = dircmp().new(args[0], args[1]) - dd.run() - if ('-r', '') in options: - dd.report_phase4_closure() - else: - dd.report() - -if __name__ == "__main__": - demo() Deleted: /python/trunk/Lib/lib-old/dump.py ============================================================================== --- /python/trunk/Lib/lib-old/dump.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,63 +0,0 @@ -# Module 'dump' -# -# Print python code that reconstructs a variable. -# This only works in certain cases. -# -# It works fine for: -# - ints and floats (except NaNs and other weird things) -# - strings -# - compounds and lists, provided it works for all their elements -# - imported modules, provided their name is the module name -# -# It works for top-level dictionaries but not for dictionaries -# contained in other objects (could be made to work with some hassle -# though). -# -# It does not work for functions (all sorts), classes, class objects, -# windows, files etc. -# -# Finally, objects referenced by more than one name or contained in more -# than one other object lose their sharing property (this is bad for -# strings used as exception identifiers, for instance). - -# Dump a whole symbol table -# -def dumpsymtab(dict): - for key in dict.keys(): - dumpvar(key, dict[key]) - -# Dump a single variable -# -def dumpvar(name, x): - import sys - t = type(x) - if t == type({}): - print name, '= {}' - for key in x.keys(): - item = x[key] - if not printable(item): - print '#', - print name, '[', `key`, '] =', `item` - elif t in (type(''), type(0), type(0.0), type([]), type(())): - if not printable(x): - print '#', - print name, '=', `x` - elif t == type(sys): - print 'import', name, '#', x - else: - print '#', name, '=', x - -# check if a value is printable in a way that can be read back with input() -# -def printable(x): - t = type(x) - if t in (type(''), type(0), type(0.0)): - return 1 - if t in (type([]), type(())): - for item in x: - if not printable(item): - return 0 - return 1 - if x == {}: - return 1 - return 0 Deleted: /python/trunk/Lib/lib-old/find.py ============================================================================== --- /python/trunk/Lib/lib-old/find.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,26 +0,0 @@ -import fnmatch -import os - -_debug = 0 - -_prune = ['(*)'] - -def find(pattern, dir = os.curdir): - list = [] - names = os.listdir(dir) - names.sort() - for name in names: - if name in (os.curdir, os.pardir): - continue - fullname = os.path.join(dir, name) - if fnmatch.fnmatch(name, pattern): - list.append(fullname) - if os.path.isdir(fullname) and not os.path.islink(fullname): - for p in _prune: - if fnmatch.fnmatch(name, p): - if _debug: print "skip", `fullname` - break - else: - if _debug: print "descend into", `fullname` - list = list + find(pattern, fullname) - return list Deleted: /python/trunk/Lib/lib-old/fmt.py ============================================================================== --- /python/trunk/Lib/lib-old/fmt.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,623 +0,0 @@ -# Text formatting abstractions -# Note -- this module is obsolete, it's too slow anyway - - -import string -import Para - - -# A formatter back-end object has one method that is called by the formatter: -# addpara(p), where p is a paragraph object. For example: - - -# Formatter back-end to do nothing at all with the paragraphs -class NullBackEnd: - # - def __init__(self): - pass - # - def addpara(self, p): - pass - # - def bgn_anchor(self, id): - pass - # - def end_anchor(self, id): - pass - - -# Formatter back-end to collect the paragraphs in a list -class SavingBackEnd(NullBackEnd): - # - def __init__(self): - self.paralist = [] - # - def addpara(self, p): - self.paralist.append(p) - # - def hitcheck(self, h, v): - hits = [] - for p in self.paralist: - if p.top <= v <= p.bottom: - for id in p.hitcheck(h, v): - if id not in hits: - hits.append(id) - return hits - # - def extract(self): - text = '' - for p in self.paralist: - text = text + (p.extract()) - return text - # - def extractpart(self, long1, long2): - if long1 > long2: long1, long2 = long2, long1 - para1, pos1 = long1 - para2, pos2 = long2 - text = '' - while para1 < para2: - ptext = self.paralist[para1].extract() - text = text + ptext[pos1:] - pos1 = 0 - para1 = para1 + 1 - ptext = self.paralist[para2].extract() - return text + ptext[pos1:pos2] - # - def whereis(self, d, h, v): - total = 0 - for i in range(len(self.paralist)): - p = self.paralist[i] - result = p.whereis(d, h, v) - if result is not None: - return i, result - return None - # - def roundtowords(self, long1, long2): - i, offset = long1 - text = self.paralist[i].extract() - while offset > 0 and text[offset-1] != ' ': offset = offset-1 - long1 = i, offset - # - i, offset = long2 - text = self.paralist[i].extract() - n = len(text) - while offset < n-1 and text[offset] != ' ': offset = offset+1 - long2 = i, offset - # - return long1, long2 - # - def roundtoparagraphs(self, long1, long2): - long1 = long1[0], 0 - long2 = long2[0], len(self.paralist[long2[0]].extract()) - return long1, long2 - - -# Formatter back-end to send the text directly to the drawing object -class WritingBackEnd(NullBackEnd): - # - def __init__(self, d, width): - self.d = d - self.width = width - self.lineno = 0 - # - def addpara(self, p): - self.lineno = p.render(self.d, 0, self.lineno, self.width) - - -# A formatter receives a stream of formatting instructions and assembles -# these into a stream of paragraphs on to a back-end. The assembly is -# parametrized by a text measurement object, which must match the output -# operations of the back-end. The back-end is responsible for splitting -# paragraphs up in lines of a given maximum width. (This is done because -# in a windowing environment, when the window size changes, there is no -# need to redo the assembly into paragraphs, but the splitting into lines -# must be done taking the new window size into account.) - - -# Formatter base class. Initialize it with a text measurement object, -# which is used for text measurements, and a back-end object, -# which receives the completed paragraphs. The formatting methods are: -# setfont(font) -# setleftindent(nspaces) -# setjust(type) where type is 'l', 'c', 'r', or 'lr' -# flush() -# vspace(nlines) -# needvspace(nlines) -# addword(word, nspaces) -class BaseFormatter: - # - def __init__(self, d, b): - # Drawing object used for text measurements - self.d = d - # - # BackEnd object receiving completed paragraphs - self.b = b - # - # Parameters of the formatting model - self.leftindent = 0 - self.just = 'l' - self.font = None - self.blanklines = 0 - # - # Parameters derived from the current font - self.space = d.textwidth(' ') - self.line = d.lineheight() - self.ascent = d.baseline() - self.descent = self.line - self.ascent - # - # Parameter derived from the default font - self.n_space = self.space - # - # Current paragraph being built - self.para = None - self.nospace = 1 - # - # Font to set on the next word - self.nextfont = None - # - def newpara(self): - return Para.Para() - # - def setfont(self, font): - if font is None: return - self.font = self.nextfont = font - d = self.d - d.setfont(font) - self.space = d.textwidth(' ') - self.line = d.lineheight() - self.ascent = d.baseline() - self.descent = self.line - self.ascent - # - def setleftindent(self, nspaces): - self.leftindent = int(self.n_space * nspaces) - if self.para: - hang = self.leftindent - self.para.indent_left - if hang > 0 and self.para.getlength() <= hang: - self.para.makehangingtag(hang) - self.nospace = 1 - else: - self.flush() - # - def setrightindent(self, nspaces): - self.rightindent = int(self.n_space * nspaces) - if self.para: - self.para.indent_right = self.rightindent - self.flush() - # - def setjust(self, just): - self.just = just - if self.para: - self.para.just = self.just - # - def flush(self): - if self.para: - self.b.addpara(self.para) - self.para = None - if self.font is not None: - self.d.setfont(self.font) - self.nospace = 1 - # - def vspace(self, nlines): - self.flush() - if nlines > 0: - self.para = self.newpara() - tuple = None, '', 0, 0, 0, int(nlines*self.line), 0 - self.para.words.append(tuple) - self.flush() - self.blanklines = self.blanklines + nlines - # - def needvspace(self, nlines): - self.flush() # Just to be sure - if nlines > self.blanklines: - self.vspace(nlines - self.blanklines) - # - def addword(self, text, space): - if self.nospace and not text: - return - self.nospace = 0 - self.blanklines = 0 - if not self.para: - self.para = self.newpara() - self.para.indent_left = self.leftindent - self.para.just = self.just - self.nextfont = self.font - space = int(space * self.space) - self.para.words.append((self.nextfont, text, - self.d.textwidth(text), space, space, - self.ascent, self.descent)) - self.nextfont = None - # - def bgn_anchor(self, id): - if not self.para: - self.nospace = 0 - self.addword('', 0) - self.para.bgn_anchor(id) - # - def end_anchor(self, id): - if not self.para: - self.nospace = 0 - self.addword('', 0) - self.para.end_anchor(id) - - -# Measuring object for measuring text as viewed on a tty -class NullMeasurer: - # - def __init__(self): - pass - # - def setfont(self, font): - pass - # - def textwidth(self, text): - return len(text) - # - def lineheight(self): - return 1 - # - def baseline(self): - return 0 - - -# Drawing object for writing plain ASCII text to a file -class FileWriter: - # - def __init__(self, fp): - self.fp = fp - self.lineno, self.colno = 0, 0 - # - def setfont(self, font): - pass - # - def text(self, (h, v), str): - if not str: return - if '\n' in str: - raise ValueError, 'can\'t write \\n' - while self.lineno < v: - self.fp.write('\n') - self.colno, self.lineno = 0, self.lineno + 1 - while self.lineno > v: - # XXX This should never happen... - self.fp.write('\033[A') # ANSI up arrow - self.lineno = self.lineno - 1 - if self.colno < h: - self.fp.write(' ' * (h - self.colno)) - elif self.colno > h: - self.fp.write('\b' * (self.colno - h)) - self.colno = h - self.fp.write(str) - self.colno = h + len(str) - - -# Formatting class to do nothing at all with the data -class NullFormatter(BaseFormatter): - # - def __init__(self): - d = NullMeasurer() - b = NullBackEnd() - BaseFormatter.__init__(self, d, b) - - -# Formatting class to write directly to a file -class WritingFormatter(BaseFormatter): - # - def __init__(self, fp, width): - dm = NullMeasurer() - dw = FileWriter(fp) - b = WritingBackEnd(dw, width) - BaseFormatter.__init__(self, dm, b) - self.blanklines = 1 - # - # Suppress multiple blank lines - def needvspace(self, nlines): - BaseFormatter.needvspace(self, min(1, nlines)) - - -# A "FunnyFormatter" writes ASCII text with a twist: *bold words*, -# _italic text_ and _underlined words_, and `quoted text'. -# It assumes that the fonts are 'r', 'i', 'b', 'u', 'q': (roman, -# italic, bold, underline, quote). -# Moreover, if the font is in upper case, the text is converted to -# UPPER CASE. -class FunnyFormatter(WritingFormatter): - # - def flush(self): - if self.para: finalize(self.para) - WritingFormatter.flush(self) - - -# Surrounds *bold words* and _italic text_ in a paragraph with -# appropriate markers, fixing the size (assuming these characters' -# width is 1). -openchar = \ - {'b':'*', 'i':'_', 'u':'_', 'q':'`', 'B':'*', 'I':'_', 'U':'_', 'Q':'`'} -closechar = \ - {'b':'*', 'i':'_', 'u':'_', 'q':'\'', 'B':'*', 'I':'_', 'U':'_', 'Q':'\''} -def finalize(para): - oldfont = curfont = 'r' - para.words.append(('r', '', 0, 0, 0, 0)) # temporary, deleted at end - for i in range(len(para.words)): - fo, te, wi = para.words[i][:3] - if fo is not None: curfont = fo - if curfont != oldfont: - if closechar.has_key(oldfont): - c = closechar[oldfont] - j = i-1 - while j > 0 and para.words[j][1] == '': j = j-1 - fo1, te1, wi1 = para.words[j][:3] - te1 = te1 + c - wi1 = wi1 + len(c) - para.words[j] = (fo1, te1, wi1) + \ - para.words[j][3:] - if openchar.has_key(curfont) and te: - c = openchar[curfont] - te = c + te - wi = len(c) + wi - para.words[i] = (fo, te, wi) + \ - para.words[i][3:] - if te: oldfont = curfont - else: oldfont = 'r' - if curfont in string.uppercase: - te = string.upper(te) - para.words[i] = (fo, te, wi) + para.words[i][3:] - del para.words[-1] - - -# Formatter back-end to draw the text in a window. -# This has an option to draw while the paragraphs are being added, -# to minimize the delay before the user sees anything. -# This manages the entire "document" of the window. -class StdwinBackEnd(SavingBackEnd): - # - def __init__(self, window, drawnow): - self.window = window - self.drawnow = drawnow - self.width = window.getwinsize()[0] - self.selection = None - self.height = 0 - window.setorigin(0, 0) - window.setdocsize(0, 0) - self.d = window.begindrawing() - SavingBackEnd.__init__(self) - # - def finish(self): - self.d.close() - self.d = None - self.window.setdocsize(0, self.height) - # - def addpara(self, p): - self.paralist.append(p) - if self.drawnow: - self.height = \ - p.render(self.d, 0, self.height, self.width) - else: - p.layout(self.width) - p.left = 0 - p.top = self.height - p.right = self.width - p.bottom = self.height + p.height - self.height = p.bottom - # - def resize(self): - self.window.change((0, 0), (self.width, self.height)) - self.width = self.window.getwinsize()[0] - self.height = 0 - for p in self.paralist: - p.layout(self.width) - p.left = 0 - p.top = self.height - p.right = self.width - p.bottom = self.height + p.height - self.height = p.bottom - self.window.change((0, 0), (self.width, self.height)) - self.window.setdocsize(0, self.height) - # - def redraw(self, area): - d = self.window.begindrawing() - (left, top), (right, bottom) = area - d.erase(area) - d.cliprect(area) - for p in self.paralist: - if top < p.bottom and p.top < bottom: - v = p.render(d, p.left, p.top, p.right) - if self.selection: - self.invert(d, self.selection) - d.close() - # - def setselection(self, new): - if new: - long1, long2 = new - pos1 = long1[:3] - pos2 = long2[:3] - new = pos1, pos2 - if new != self.selection: - d = self.window.begindrawing() - if self.selection: - self.invert(d, self.selection) - if new: - self.invert(d, new) - d.close() - self.selection = new - # - def getselection(self): - return self.selection - # - def extractselection(self): - if self.selection: - a, b = self.selection - return self.extractpart(a, b) - else: - return None - # - def invert(self, d, region): - long1, long2 = region - if long1 > long2: long1, long2 = long2, long1 - para1, pos1 = long1 - para2, pos2 = long2 - while para1 < para2: - self.paralist[para1].invert(d, pos1, None) - pos1 = None - para1 = para1 + 1 - self.paralist[para2].invert(d, pos1, pos2) - # - def search(self, prog): - import re, string - if type(prog) is type(''): - prog = re.compile(string.lower(prog)) - if self.selection: - iold = self.selection[0][0] - else: - iold = -1 - hit = None - for i in range(len(self.paralist)): - if i == iold or i < iold and hit: - continue - p = self.paralist[i] - text = string.lower(p.extract()) - match = prog.search(text) - if match: - a, b = match.group(0) - long1 = i, a - long2 = i, b - hit = long1, long2 - if i > iold: - break - if hit: - self.setselection(hit) - i = hit[0][0] - p = self.paralist[i] - self.window.show((p.left, p.top), (p.right, p.bottom)) - return 1 - else: - return 0 - # - def showanchor(self, id): - for i in range(len(self.paralist)): - p = self.paralist[i] - if p.hasanchor(id): - long1 = i, 0 - long2 = i, len(p.extract()) - hit = long1, long2 - self.setselection(hit) - self.window.show( - (p.left, p.top), (p.right, p.bottom)) - break - - -# GL extensions - -class GLFontCache: - # - def __init__(self): - self.reset() - self.setfont('') - # - def reset(self): - self.fontkey = None - self.fonthandle = None - self.fontinfo = None - self.fontcache = {} - # - def close(self): - self.reset() - # - def setfont(self, fontkey): - if fontkey == '': - fontkey = 'Times-Roman 12' - elif ' ' not in fontkey: - fontkey = fontkey + ' 12' - if fontkey == self.fontkey: - return - if self.fontcache.has_key(fontkey): - handle = self.fontcache[fontkey] - else: - import string - i = string.index(fontkey, ' ') - name, sizestr = fontkey[:i], fontkey[i:] - size = eval(sizestr) - key1 = name + ' 1' - key = name + ' ' + `size` - # NB key may differ from fontkey! - if self.fontcache.has_key(key): - handle = self.fontcache[key] - else: - if self.fontcache.has_key(key1): - handle = self.fontcache[key1] - else: - import fm - handle = fm.findfont(name) - self.fontcache[key1] = handle - handle = handle.scalefont(size) - self.fontcache[fontkey] = \ - self.fontcache[key] = handle - self.fontkey = fontkey - if self.fonthandle != handle: - self.fonthandle = handle - self.fontinfo = handle.getfontinfo() - handle.setfont() - - -class GLMeasurer(GLFontCache): - # - def textwidth(self, text): - return self.fonthandle.getstrwidth(text) - # - def baseline(self): - return self.fontinfo[6] - self.fontinfo[3] - # - def lineheight(self): - return self.fontinfo[6] - - -class GLWriter(GLFontCache): - # - # NOTES: - # (1) Use gl.ortho2 to use X pixel coordinates! - # - def text(self, (h, v), text): - import gl, fm - gl.cmov2i(h, v + self.fontinfo[6] - self.fontinfo[3]) - fm.prstr(text) - # - def setfont(self, fontkey): - oldhandle = self.fonthandle - GLFontCache.setfont(fontkey) - if self.fonthandle != oldhandle: - handle.setfont() - - -class GLMeasurerWriter(GLMeasurer, GLWriter): - pass - - -class GLBackEnd(SavingBackEnd): - # - def __init__(self, wid): - import gl - gl.winset(wid) - self.wid = wid - self.width = gl.getsize()[1] - self.height = 0 - self.d = GLMeasurerWriter() - SavingBackEnd.__init__(self) - # - def finish(self): - pass - # - def addpara(self, p): - self.paralist.append(p) - self.height = p.render(self.d, 0, self.height, self.width) - # - def redraw(self): - import gl - gl.winset(self.wid) - width = gl.getsize()[1] - if width != self.width: - setdocsize = 1 - self.width = width - for p in self.paralist: - p.top = p.bottom = None - d = self.d - v = 0 - for p in self.paralist: - v = p.render(d, 0, v, width) Deleted: /python/trunk/Lib/lib-old/grep.py ============================================================================== --- /python/trunk/Lib/lib-old/grep.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,79 +0,0 @@ -# 'grep' - -import regex -from regex_syntax import * - -opt_show_where = 0 -opt_show_filename = 0 -opt_show_lineno = 1 - -def grep(pat, *files): - return ggrep(RE_SYNTAX_GREP, pat, files) - -def egrep(pat, *files): - return ggrep(RE_SYNTAX_EGREP, pat, files) - -def emgrep(pat, *files): - return ggrep(RE_SYNTAX_EMACS, pat, files) - -def ggrep(syntax, pat, files): - if len(files) == 1 and type(files[0]) == type([]): - files = files[0] - global opt_show_filename - opt_show_filename = (len(files) != 1) - syntax = regex.set_syntax(syntax) - try: - prog = regex.compile(pat) - finally: - syntax = regex.set_syntax(syntax) - for filename in files: - fp = open(filename, 'r') - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - if prog.search(line) >= 0: - showline(filename, lineno, line, prog) - fp.close() - -def pgrep(pat, *files): - if len(files) == 1 and type(files[0]) == type([]): - files = files[0] - global opt_show_filename - opt_show_filename = (len(files) != 1) - import re - prog = re.compile(pat) - for filename in files: - fp = open(filename, 'r') - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - if prog.search(line): - showline(filename, lineno, line, prog) - fp.close() - -def showline(filename, lineno, line, prog): - if line[-1:] == '\n': line = line[:-1] - if opt_show_lineno: - prefix = `lineno`.rjust(3) + ': ' - else: - prefix = '' - if opt_show_filename: - prefix = filename + ': ' + prefix - print prefix + line - if opt_show_where: - start, end = prog.regs()[0] - line = line[:start] - if '\t' not in line: - prefix = ' ' * (len(prefix) + start) - else: - prefix = ' ' * len(prefix) - for c in line: - if c != '\t': c = ' ' - prefix = prefix + c - if start == end: prefix = prefix + '\\' - else: prefix = prefix + '^'*(end-start) - print prefix Deleted: /python/trunk/Lib/lib-old/lockfile.py ============================================================================== --- /python/trunk/Lib/lib-old/lockfile.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,15 +0,0 @@ -import struct, fcntl - -def writelock(f): - _lock(f, fcntl.F_WRLCK) - -def readlock(f): - _lock(f, fcntl.F_RDLCK) - -def unlock(f): - _lock(f, fcntl.F_UNLCK) - -def _lock(f, op): - dummy = fcntl.fcntl(f.fileno(), fcntl.F_SETLKW, - struct.pack('2h8l', op, - 0, 0, 0, 0, 0, 0, 0, 0, 0)) Deleted: /python/trunk/Lib/lib-old/newdir.py ============================================================================== --- /python/trunk/Lib/lib-old/newdir.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,73 +0,0 @@ -# New dir() function - - -# This should be the new dir(), except that it should still list -# the current local name space by default - -def listattrs(x): - try: - dictkeys = x.__dict__.keys() - except (AttributeError, TypeError): - dictkeys = [] - # - try: - methods = x.__methods__ - except (AttributeError, TypeError): - methods = [] - # - try: - members = x.__members__ - except (AttributeError, TypeError): - members = [] - # - try: - the_class = x.__class__ - except (AttributeError, TypeError): - the_class = None - # - try: - bases = x.__bases__ - except (AttributeError, TypeError): - bases = () - # - total = dictkeys + methods + members - if the_class: - # It's a class instace; add the class's attributes - # that are functions (methods)... - class_attrs = listattrs(the_class) - class_methods = [] - for name in class_attrs: - if is_function(getattr(the_class, name)): - class_methods.append(name) - total = total + class_methods - elif bases: - # It's a derived class; add the base class attributes - for base in bases: - base_attrs = listattrs(base) - total = total + base_attrs - total.sort() - return total - i = 0 - while i+1 < len(total): - if total[i] == total[i+1]: - del total[i+1] - else: - i = i+1 - return total - - -# Helper to recognize functions - -def is_function(x): - return type(x) == type(is_function) - - -# Approximation of builtin dir(); but note that this lists the user's -# variables by default, not the current local name space. - -def dir(x = None): - if x is not None: - return listattrs(x) - else: - import __main__ - return listattrs(__main__) Deleted: /python/trunk/Lib/lib-old/ni.py ============================================================================== --- /python/trunk/Lib/lib-old/ni.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,433 +0,0 @@ -"""New import scheme with package support. - -Quick Reference ---------------- - -- To enable package support, execute "import ni" before importing any - packages. Importing this module automatically installs the relevant - import hooks. - -- To create a package named spam containing sub-modules ham, bacon and - eggs, create a directory spam somewhere on Python's module search - path (i.e. spam's parent directory must be one of the directories in - sys.path or $PYTHONPATH); then create files ham.py, bacon.py and - eggs.py inside spam. - -- To import module ham from package spam and use function hamneggs() - from that module, you can either do - - import spam.ham # *not* "import spam" !!! - spam.ham.hamneggs() - - or - - from spam import ham - ham.hamneggs() - - or - - from spam.ham import hamneggs - hamneggs() - -- Importing just "spam" does not do what you expect: it creates an - empty package named spam if one does not already exist, but it does - not import spam's submodules. The only submodule that is guaranteed - to be imported is spam.__init__, if it exists. Note that - spam.__init__ is a submodule of package spam. It can reference to - spam's namespace via the '__.' prefix, for instance - - __.spam_inited = 1 # Set a package-level variable - - - -Theory of Operation -------------------- - -A Package is a module that can contain other modules. Packages can be -nested. Package introduce dotted names for modules, like P.Q.M, which -could correspond to a file P/Q/M.py found somewhere on sys.path. It -is possible to import a package itself, though this makes little sense -unless the package contains a module called __init__. - -A package has two variables that control the namespace used for -packages and modules, both initialized to sensible defaults the first -time the package is referenced. - -(1) A package's *module search path*, contained in the per-package -variable __path__, defines a list of *directories* where submodules or -subpackages of the package are searched. It is initialized to the -directory containing the package. Setting this variable to None makes -the module search path default to sys.path (this is not quite the same -as setting it to sys.path, since the latter won't track later -assignments to sys.path). - -(2) A package's *import domain*, contained in the per-package variable -__domain__, defines a list of *packages* that are searched (using -their respective module search paths) to satisfy imports. It is -initialized to the list consisting of the package itself, its parent -package, its parent's parent, and so on, ending with the root package -(the nameless package containing all top-level packages and modules, -whose module search path is None, implying sys.path). - -The default domain implements a search algorithm called "expanding -search". An alternative search algorithm called "explicit search" -fixes the import search path to contain only the root package, -requiring the modules in the package to name all imported modules by -their full name. The convention of using '__' to refer to the current -package (both as a per-module variable and in module names) can be -used by packages using explicit search to refer to modules in the same -package; this combination is known as "explicit-relative search". - -The PackageImporter and PackageLoader classes together implement the -following policies: - -- There is a root package, whose name is ''. It cannot be imported - directly but may be referenced, e.g. by using '__' from a top-level - module. - -- In each module or package, the variable '__' contains a reference to - the parent package; in the root package, '__' points to itself. - -- In the name for imported modules (e.g. M in "import M" or "from M - import ..."), a leading '__' refers to the current package (i.e. - the package containing the current module); leading '__.__' and so - on refer to the current package's parent, and so on. The use of - '__' elsewhere in the module name is not supported. - -- Modules are searched using the "expanding search" algorithm by - virtue of the default value for __domain__. - -- If A.B.C is imported, A is searched using __domain__; then - subpackage B is searched in A using its __path__, and so on. - -- Built-in modules have priority: even if a file sys.py exists in a - package, "import sys" imports the built-in sys module. - -- The same holds for frozen modules, for better or for worse. - -- Submodules and subpackages are not automatically loaded when their - parent packages is loaded. - -- The construct "from package import *" is illegal. (It can still be - used to import names from a module.) - -- When "from package import module1, module2, ..." is used, those - modules are explicitly loaded. - -- When a package is loaded, if it has a submodule __init__, that - module is loaded. This is the place where required submodules can - be loaded, the __path__ variable extended, etc. The __init__ module - is loaded even if the package was loaded only in order to create a - stub for a sub-package: if "import P.Q.R" is the first reference to - P, and P has a submodule __init__, P.__init__ is loaded before P.Q - is even searched. - -Caveats: - -- It is possible to import a package that has no __init__ submodule; - this is not particularly useful but there may be useful applications - for it (e.g. to manipulate its search paths from the outside!). - -- There are no special provisions for os.chdir(). If you plan to use - os.chdir() before you have imported all your modules, it is better - not to have relative pathnames in sys.path. (This could actually be - fixed by changing the implementation of path_join() in the hook to - absolutize paths.) - -- Packages and modules are introduced in sys.modules as soon as their - loading is started. When the loading is terminated by an exception, - the sys.modules entries remain around. - -- There are no special measures to support mutually recursive modules, - but it will work under the same conditions where it works in the - flat module space system. - -- Sometimes dummy entries (whose value is None) are entered in - sys.modules, to indicate that a particular module does not exist -- - this is done to speed up the expanding search algorithm when a - module residing at a higher level is repeatedly imported (Python - promises that importing a previously imported module is cheap!) - -- Although dynamically loaded extensions are allowed inside packages, - the current implementation (hardcoded in the interpreter) of their - initialization may cause problems if an extension invokes the - interpreter during its initialization. - -- reload() may find another version of the module only if it occurs on - the package search path. Thus, it keeps the connection to the - package to which the module belongs, but may find a different file. - -XXX Need to have an explicit name for '', e.g. '__root__'. - -""" - - -import imp -import sys -import __builtin__ - -import ihooks -from ihooks import ModuleLoader, ModuleImporter - - -class PackageLoader(ModuleLoader): - - """A subclass of ModuleLoader with package support. - - find_module_in_dir() will succeed if there's a subdirectory with - the given name; load_module() will create a stub for a package and - load its __init__ module if it exists. - - """ - - def find_module_in_dir(self, name, dir): - if dir is not None: - dirname = self.hooks.path_join(dir, name) - if self.hooks.path_isdir(dirname): - return None, dirname, ('', '', 'PACKAGE') - return ModuleLoader.find_module_in_dir(self, name, dir) - - def load_module(self, name, stuff): - file, filename, info = stuff - suff, mode, type = info - if type == 'PACKAGE': - return self.load_package(name, stuff) - if sys.modules.has_key(name): - m = sys.modules[name] - else: - sys.modules[name] = m = imp.new_module(name) - self.set_parent(m) - if type == imp.C_EXTENSION and '.' in name: - return self.load_dynamic(name, stuff) - else: - return ModuleLoader.load_module(self, name, stuff) - - def load_dynamic(self, name, stuff): - file, filename, (suff, mode, type) = stuff - # Hack around restriction in imp.load_dynamic() - i = name.rfind('.') - tail = name[i+1:] - if sys.modules.has_key(tail): - save = sys.modules[tail] - else: - save = None - sys.modules[tail] = imp.new_module(name) - try: - m = imp.load_dynamic(tail, filename, file) - finally: - if save: - sys.modules[tail] = save - else: - del sys.modules[tail] - sys.modules[name] = m - return m - - def load_package(self, name, stuff): - file, filename, info = stuff - if sys.modules.has_key(name): - package = sys.modules[name] - else: - sys.modules[name] = package = imp.new_module(name) - package.__path__ = [filename] - self.init_package(package) - return package - - def init_package(self, package): - self.set_parent(package) - self.set_domain(package) - self.call_init_module(package) - - def set_parent(self, m): - name = m.__name__ - if '.' in name: - name = name[:name.rfind('.')] - else: - name = '' - m.__ = sys.modules[name] - - def set_domain(self, package): - name = package.__name__ - package.__domain__ = domain = [name] - while '.' in name: - name = name[:name.rfind('.')] - domain.append(name) - if name: - domain.append('') - - def call_init_module(self, package): - stuff = self.find_module('__init__', package.__path__) - if stuff: - m = self.load_module(package.__name__ + '.__init__', stuff) - package.__init__ = m - - -class PackageImporter(ModuleImporter): - - """Importer that understands packages and '__'.""" - - def __init__(self, loader = None, verbose = 0): - ModuleImporter.__init__(self, - loader or PackageLoader(None, verbose), verbose) - - def import_module(self, name, globals={}, locals={}, fromlist=[]): - if globals.has_key('__'): - package = globals['__'] - else: - # No calling context, assume in root package - package = sys.modules[''] - if name[:3] in ('__.', '__'): - p = package - name = name[3:] - while name[:3] in ('__.', '__'): - p = p.__ - name = name[3:] - if not name: - return self.finish(package, p, '', fromlist) - if '.' in name: - i = name.find('.') - name, tail = name[:i], name[i:] - else: - tail = '' - mname = p.__name__ and p.__name__+'.'+name or name - m = self.get1(mname) - return self.finish(package, m, tail, fromlist) - if '.' in name: - i = name.find('.') - name, tail = name[:i], name[i:] - else: - tail = '' - for pname in package.__domain__: - mname = pname and pname+'.'+name or name - m = self.get0(mname) - if m: break - else: - raise ImportError, "No such module %s" % name - return self.finish(m, m, tail, fromlist) - - def finish(self, module, m, tail, fromlist): - # Got ....A; now get ....A.B.C.D - yname = m.__name__ - if tail and sys.modules.has_key(yname + tail): # Fast path - yname, tail = yname + tail, '' - m = self.get1(yname) - while tail: - i = tail.find('.', 1) - if i > 0: - head, tail = tail[:i], tail[i:] - else: - head, tail = tail, '' - yname = yname + head - m = self.get1(yname) - - # Got ....A.B.C.D; now finalize things depending on fromlist - if not fromlist: - return module - if '__' in fromlist: - raise ImportError, "Can't import __ from anywhere" - if not hasattr(m, '__path__'): return m - if '*' in fromlist: - raise ImportError, "Can't import * from a package" - for f in fromlist: - if hasattr(m, f): continue - fname = yname + '.' + f - self.get1(fname) - return m - - def get1(self, name): - m = self.get(name) - if not m: - raise ImportError, "No module named %s" % name - return m - - def get0(self, name): - m = self.get(name) - if not m: - sys.modules[name] = None - return m - - def get(self, name): - # Internal routine to get or load a module when its parent exists - if sys.modules.has_key(name): - return sys.modules[name] - if '.' in name: - i = name.rfind('.') - head, tail = name[:i], name[i+1:] - else: - head, tail = '', name - path = sys.modules[head].__path__ - stuff = self.loader.find_module(tail, path) - if not stuff: - return None - sys.modules[name] = m = self.loader.load_module(name, stuff) - if head: - setattr(sys.modules[head], tail, m) - return m - - def reload(self, module): - name = module.__name__ - if '.' in name: - i = name.rfind('.') - head, tail = name[:i], name[i+1:] - path = sys.modules[head].__path__ - else: - tail = name - path = sys.modules[''].__path__ - stuff = self.loader.find_module(tail, path) - if not stuff: - raise ImportError, "No module named %s" % name - return self.loader.load_module(name, stuff) - - def unload(self, module): - if hasattr(module, '__path__'): - raise ImportError, "don't know how to unload packages yet" - PackageImporter.unload(self, module) - - def install(self): - if not sys.modules.has_key(''): - sys.modules[''] = package = imp.new_module('') - package.__path__ = None - self.loader.init_package(package) - for m in sys.modules.values(): - if not m: continue - if not hasattr(m, '__'): - self.loader.set_parent(m) - ModuleImporter.install(self) - - -def install(v = 0): - ihooks.install(PackageImporter(None, v)) - -def uninstall(): - ihooks.uninstall() - -def ni(v = 0): - install(v) - -def no(): - uninstall() - -def test(): - import pdb - try: - testproper() - except: - sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info() - print - print sys.last_type, ':', sys.last_value - print - pdb.pm() - -def testproper(): - install(1) - try: - import mactest - print dir(mactest) - raw_input('OK?') - finally: - uninstall() - - -if __name__ == '__main__': - test() -else: - install() Deleted: /python/trunk/Lib/lib-old/packmail.py ============================================================================== --- /python/trunk/Lib/lib-old/packmail.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,111 +0,0 @@ -# Module 'packmail' -- create a self-unpacking shell archive. - -# This module works on UNIX and on the Mac; the archives can unpack -# themselves only on UNIX. - -import os -from stat import ST_MTIME - -# Print help -def help(): - print 'All fns have a file open for writing as first parameter' - print 'pack(f, fullname, name): pack fullname as name' - print 'packsome(f, directory, namelist): selected files from directory' - print 'packall(f, directory): pack all files from directory' - print 'packnotolder(f, directory, name): pack all files from directory' - print ' that are not older than a file there' - print 'packtree(f, directory): pack entire directory tree' - -# Pack one file -def pack(outfp, file, name): - fp = open(file, 'r') - outfp.write('echo ' + name + '\n') - outfp.write('sed "s/^X//" >"' + name + '" <<"!"\n') - while 1: - line = fp.readline() - if not line: break - if line[-1:] != '\n': - line = line + '\n' - outfp.write('X' + line) - outfp.write('!\n') - fp.close() - -# Pack some files from a directory -def packsome(outfp, dirname, names): - for name in names: - print name - file = os.path.join(dirname, name) - pack(outfp, file, name) - -# Pack all files from a directory -def packall(outfp, dirname): - names = os.listdir(dirname) - try: - names.remove('.') - except: - pass - try: - names.remove('..') - except: - pass - names.sort() - packsome(outfp, dirname, names) - -# Pack all files from a directory that are not older than a give one -def packnotolder(outfp, dirname, oldest): - names = os.listdir(dirname) - try: - names.remove('.') - except: - pass - try: - names.remove('..') - except: - pass - oldest = os.path.join(dirname, oldest) - st = os.stat(oldest) - mtime = st[ST_MTIME] - todo = [] - for name in names: - print name, '...', - st = os.stat(os.path.join(dirname, name)) - if st[ST_MTIME] >= mtime: - print 'Yes.' - todo.append(name) - else: - print 'No.' - todo.sort() - packsome(outfp, dirname, todo) - -# Pack a whole tree (no exceptions) -def packtree(outfp, dirname): - print 'packtree', dirname - outfp.write('mkdir ' + unixfix(dirname) + '\n') - names = os.listdir(dirname) - try: - names.remove('.') - except: - pass - try: - names.remove('..') - except: - pass - subdirs = [] - for name in names: - fullname = os.path.join(dirname, name) - if os.path.isdir(fullname): - subdirs.append(fullname) - else: - print 'pack', fullname - pack(outfp, fullname, unixfix(fullname)) - for subdirname in subdirs: - packtree(outfp, subdirname) - -def unixfix(name): - comps = name.split(os.sep) - res = '' - for comp in comps: - if comp: - if res: res = res + '/' - res = res + comp - return res Deleted: /python/trunk/Lib/lib-old/poly.py ============================================================================== --- /python/trunk/Lib/lib-old/poly.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,52 +0,0 @@ -# module 'poly' -- Polynomials - -# A polynomial is represented by a list of coefficients, e.g., -# [1, 10, 5] represents 1*x**0 + 10*x**1 + 5*x**2 (or 1 + 10x + 5x**2). -# There is no way to suppress internal zeros; trailing zeros are -# taken out by normalize(). - -def normalize(p): # Strip unnecessary zero coefficients - n = len(p) - while n: - if p[n-1]: return p[:n] - n = n-1 - return [] - -def plus(a, b): - if len(a) < len(b): a, b = b, a # make sure a is the longest - res = a[:] # make a copy - for i in range(len(b)): - res[i] = res[i] + b[i] - return normalize(res) - -def minus(a, b): - neg_b = map(lambda x: -x, b[:]) - return plus(a, neg_b) - -def one(power, coeff): # Representation of coeff * x**power - res = [] - for i in range(power): res.append(0) - return res + [coeff] - -def times(a, b): - res = [] - for i in range(len(a)): - for j in range(len(b)): - res = plus(res, one(i+j, a[i]*b[j])) - return res - -def power(a, n): # Raise polynomial a to the positive integral power n - if n == 0: return [1] - if n == 1: return a - if n/2*2 == n: - b = power(a, n/2) - return times(b, b) - return times(power(a, n-1), a) - -def der(a): # First derivative - res = a[1:] - for i in range(len(res)): - res[i] = res[i] * (i+1) - return res - -# Computing a primitive function would require rational arithmetic... Deleted: /python/trunk/Lib/lib-old/rand.py ============================================================================== --- /python/trunk/Lib/lib-old/rand.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,13 +0,0 @@ -# Module 'rand' -# Don't use unless you want compatibility with C's rand()! - -import whrandom - -def srand(seed): - whrandom.seed(seed%256, seed/256%256, seed/65536%256) - -def rand(): - return int(whrandom.random() * 32768.0) % 32768 - -def choice(seq): - return seq[rand() % len(seq)] Deleted: /python/trunk/Lib/lib-old/statcache.py ============================================================================== --- /python/trunk/Lib/lib-old/statcache.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,82 +0,0 @@ -"""Maintain a cache of stat() information on files. - -There are functions to reset the cache or to selectively remove items. -""" - -import warnings -warnings.warn("The statcache module is obsolete. Use os.stat() instead.", - DeprecationWarning) -del warnings - -import os as _os -from stat import * - -__all__ = ["stat","reset","forget","forget_prefix","forget_dir", - "forget_except_prefix","isdir"] - -# The cache. Keys are pathnames, values are os.stat outcomes. -# Remember that multiple threads may be calling this! So, e.g., that -# path in cache returns 1 doesn't mean the cache will still contain -# path on the next line. Code defensively. - -cache = {} - -def stat(path): - """Stat a file, possibly out of the cache.""" - ret = cache.get(path, None) - if ret is None: - cache[path] = ret = _os.stat(path) - return ret - -def reset(): - """Clear the cache.""" - cache.clear() - -# For thread saftey, always use forget() internally too. -def forget(path): - """Remove a given item from the cache, if it exists.""" - try: - del cache[path] - except KeyError: - pass - -def forget_prefix(prefix): - """Remove all pathnames with a given prefix.""" - for path in cache.keys(): - if path.startswith(prefix): - forget(path) - -def forget_dir(prefix): - """Forget a directory and all entries except for entries in subdirs.""" - - # Remove trailing separator, if any. This is tricky to do in a - # x-platform way. For example, Windows accepts both / and \ as - # separators, and if there's nothing *but* a separator we want to - # preserve that this is the root. Only os.path has the platform - # knowledge we need. - from os.path import split, join - prefix = split(join(prefix, "xxx"))[0] - forget(prefix) - for path in cache.keys(): - # First check that the path at least starts with the prefix, so - # that when it doesn't we can avoid paying for split(). - if path.startswith(prefix) and split(path)[0] == prefix: - forget(path) - -def forget_except_prefix(prefix): - """Remove all pathnames except with a given prefix. - - Normally used with prefix = '/' after a chdir(). - """ - - for path in cache.keys(): - if not path.startswith(prefix): - forget(path) - -def isdir(path): - """Return True if directory, else False.""" - try: - st = stat(path) - except _os.error: - return False - return S_ISDIR(st.st_mode) Deleted: /python/trunk/Lib/lib-old/tb.py ============================================================================== --- /python/trunk/Lib/lib-old/tb.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,177 +0,0 @@ -# Print tracebacks, with a dump of local variables. -# Also an interactive stack trace browser. -# Note -- this module is obsolete -- use pdb.pm() instead. - -import sys -import os -from stat import * -import linecache - -def br(): browser(sys.last_traceback) - -def tb(): printtb(sys.last_traceback) - -def browser(tb): - if not tb: - print 'No traceback.' - return - tblist = [] - while tb: - tblist.append(tb) - tb = tb.tb_next - ptr = len(tblist)-1 - tb = tblist[ptr] - while 1: - if tb != tblist[ptr]: - tb = tblist[ptr] - print `ptr` + ':', - printtbheader(tb) - try: - line = raw_input('TB: ') - except KeyboardInterrupt: - print '\n[Interrupted]' - break - except EOFError: - print '\n[EOF]' - break - cmd = line.strip() - if cmd: - if cmd == 'quit': - break - elif cmd == 'list': - browserlist(tb) - elif cmd == 'up': - if ptr-1 >= 0: ptr = ptr-1 - else: print 'Bottom of stack.' - elif cmd == 'down': - if ptr+1 < len(tblist): ptr = ptr+1 - else: print 'Top of stack.' - elif cmd == 'locals': - printsymbols(tb.tb_frame.f_locals) - elif cmd == 'globals': - printsymbols(tb.tb_frame.f_globals) - elif cmd in ('?', 'help'): - browserhelp() - else: - browserexec(tb, cmd) - -def browserlist(tb): - filename = tb.tb_frame.f_code.co_filename - lineno = tb.tb_lineno - last = lineno - first = max(1, last-10) - for i in range(first, last+1): - if i == lineno: prefix = '***' + `i`.rjust(4) + ':' - else: prefix = `i`.rjust(7) + ':' - line = linecache.getline(filename, i) - if line[-1:] == '\n': line = line[:-1] - print prefix + line - -def browserexec(tb, cmd): - locals = tb.tb_frame.f_locals - globals = tb.tb_frame.f_globals - try: - exec cmd+'\n' in globals, locals - except: - t, v = sys.exc_info()[:2] - print '*** Exception:', - if type(t) is type(''): - print t, - else: - print t.__name__, - if v is not None: - print ':', v, - print - print 'Type help to get help.' - -def browserhelp(): - print - print ' This is the traceback browser. Commands are:' - print ' up : move one level up in the call stack' - print ' down : move one level down in the call stack' - print ' locals : print all local variables at this level' - print ' globals : print all global variables at this level' - print ' list : list source code around the failure' - print ' help : print help (what you are reading now)' - print ' quit : back to command interpreter' - print ' Typing any other 1-line statement will execute it' - print ' using the current level\'s symbol tables' - print - -def printtb(tb): - while tb: - print1tb(tb) - tb = tb.tb_next - -def print1tb(tb): - printtbheader(tb) - if tb.tb_frame.f_locals is not tb.tb_frame.f_globals: - printsymbols(tb.tb_frame.f_locals) - -def printtbheader(tb): - filename = tb.tb_frame.f_code.co_filename - lineno = tb.tb_lineno - info = '"' + filename + '"(' + `lineno` + ')' - line = linecache.getline(filename, lineno) - if line: - info = info + ': ' + line.strip() - print info - -def printsymbols(d): - keys = d.keys() - keys.sort() - for name in keys: - print ' ' + name.ljust(12) + ':', - printobject(d[name], 4) - print - -def printobject(v, maxlevel): - if v is None: - print 'None', - elif type(v) in (type(0), type(0.0)): - print v, - elif type(v) is type(''): - if len(v) > 20: - print `v[:17] + '...'`, - else: - print `v`, - elif type(v) is type(()): - print '(', - printlist(v, maxlevel) - print ')', - elif type(v) is type([]): - print '[', - printlist(v, maxlevel) - print ']', - elif type(v) is type({}): - print '{', - printdict(v, maxlevel) - print '}', - else: - print v, - -def printlist(v, maxlevel): - n = len(v) - if n == 0: return - if maxlevel <= 0: - print '...', - return - for i in range(min(6, n)): - printobject(v[i], maxlevel-1) - if i+1 < n: print ',', - if n > 6: print '...', - -def printdict(v, maxlevel): - keys = v.keys() - n = len(keys) - if n == 0: return - if maxlevel <= 0: - print '...', - return - keys.sort() - for i in range(min(6, n)): - key = keys[i] - print `key` + ':', - printobject(v[key], maxlevel-1) - if i+1 < n: print ',', - if n > 6: print '...', Deleted: /python/trunk/Lib/lib-old/tzparse.py ============================================================================== --- /python/trunk/Lib/lib-old/tzparse.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,98 +0,0 @@ -"""Parse a timezone specification.""" - -# XXX Unfinished. -# XXX Only the typical form "XXXhhYYY;ddd/hh,ddd/hh" is currently supported. - -import warnings -warnings.warn( - "The tzparse module is obsolete and will disappear in the future", - DeprecationWarning) - -tzpat = ('^([A-Z][A-Z][A-Z])([-+]?[0-9]+)([A-Z][A-Z][A-Z]);' - '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$') - -tzprog = None - -def tzparse(tzstr): - """Given a timezone spec, return a tuple of information - (tzname, delta, dstname, daystart, hourstart, dayend, hourend), - where 'tzname' is the name of the timezone, 'delta' is the offset - in hours from GMT, 'dstname' is the name of the daylight-saving - timezone, and 'daystart'/'hourstart' and 'dayend'/'hourend' - specify the starting and ending points for daylight saving time.""" - global tzprog - if tzprog is None: - import re - tzprog = re.compile(tzpat) - match = tzprog.match(tzstr) - if not match: - raise ValueError, 'not the TZ syntax I understand' - subs = [] - for i in range(1, 8): - subs.append(match.group(i)) - for i in (1, 3, 4, 5, 6): - subs[i] = eval(subs[i]) - [tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs - return (tzname, delta, dstname, daystart, hourstart, dayend, hourend) - -def tzlocaltime(secs, params): - """Given a Unix time in seconds and a tuple of information about - a timezone as returned by tzparse(), return the local time in the - form (year, month, day, hour, min, sec, yday, wday, tzname).""" - import time - (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params - year, month, days, hours, mins, secs, yday, wday, isdst = \ - time.gmtime(secs - delta*3600) - if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend): - tzname = dstname - hours = hours + 1 - return year, month, days, hours, mins, secs, yday, wday, tzname - -def tzset(): - """Determine the current timezone from the "TZ" environment variable.""" - global tzparams, timezone, altzone, daylight, tzname - import os - tzstr = os.environ['TZ'] - tzparams = tzparse(tzstr) - timezone = tzparams[1] * 3600 - altzone = timezone - 3600 - daylight = 1 - tzname = tzparams[0], tzparams[2] - -def isdst(secs): - """Return true if daylight-saving time is in effect for the given - Unix time in the current timezone.""" - import time - (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \ - tzparams - year, month, days, hours, mins, secs, yday, wday, isdst = \ - time.gmtime(secs - delta*3600) - return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend) - -tzset() - -def localtime(secs): - """Get the local time in the current timezone.""" - return tzlocaltime(secs, tzparams) - -def test(): - from time import asctime, gmtime - import time, sys - now = time.time() - x = localtime(now) - tm = x[:-1] + (0,) - print 'now =', now, '=', asctime(tm), x[-1] - now = now - now % (24*3600) - if sys.argv[1:]: now = now + eval(sys.argv[1]) - x = gmtime(now) - tm = x[:-1] + (0,) - print 'gmtime =', now, '=', asctime(tm), 'yday =', x[-2] - jan1 = now - x[-2]*24*3600 - x = localtime(jan1) - tm = x[:-1] + (0,) - print 'jan1 =', jan1, '=', asctime(tm), x[-1] - for d in range(85, 95) + range(265, 275): - t = jan1 + d*24*3600 - x = localtime(t) - tm = x[:-1] + (0,) - print 'd =', d, 't =', t, '=', asctime(tm), x[-1] Deleted: /python/trunk/Lib/lib-old/util.py ============================================================================== --- /python/trunk/Lib/lib-old/util.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,25 +0,0 @@ -# Module 'util' -- some useful functions that don't fit elsewhere - -# NB: These are now built-in functions, but this module is provided -# for compatibility. Don't use in new programs unless you need backward -# compatibility (i.e. need to run with old interpreters). - - -# Remove an item from a list. -# No complaints if it isn't in the list at all. -# If it occurs more than once, remove the first occurrence. -# -def remove(item, list): - if item in list: list.remove(item) - - -# Return a string containing a file's contents. -# -def readfile(fn): - return readopenfile(open(fn, 'r')) - - -# Read an open file until EOF. -# -def readopenfile(fp): - return fp.read() Deleted: /python/trunk/Lib/lib-old/whatsound.py ============================================================================== --- /python/trunk/Lib/lib-old/whatsound.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1 +0,0 @@ -from sndhdr import * Deleted: /python/trunk/Lib/lib-old/whrandom.py ============================================================================== --- /python/trunk/Lib/lib-old/whrandom.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,144 +0,0 @@ -"""Wichman-Hill random number generator. - -Wichmann, B. A. & Hill, I. D. (1982) -Algorithm AS 183: -An efficient and portable pseudo-random number generator -Applied Statistics 31 (1982) 188-190 - -see also: - Correction to Algorithm AS 183 - Applied Statistics 33 (1984) 123 - - McLeod, A. I. (1985) - A remark on Algorithm AS 183 - Applied Statistics 34 (1985),198-200 - - -USE: -whrandom.random() yields double precision random numbers - uniformly distributed between 0 and 1. - -whrandom.seed(x, y, z) must be called before whrandom.random() - to seed the generator - -There is also an interface to create multiple independent -random generators, and to choose from other ranges. - - - -Multi-threading note: the random number generator used here is not -thread-safe; it is possible that nearly simultaneous calls in -different theads return the same random value. To avoid this, you -have to use a lock around all calls. (I didn't want to slow this -down in the serial case by using a lock here.) -""" - -import warnings -warnings.warn("the whrandom module is deprecated; please use the random module", - DeprecationWarning) - -# Translated by Guido van Rossum from C source provided by -# Adrian Baddeley. - - -class whrandom: - def __init__(self, x = 0, y = 0, z = 0): - """Initialize an instance. - Without arguments, initialize from current time. - With arguments (x, y, z), initialize from them.""" - self.seed(x, y, z) - - def seed(self, x = 0, y = 0, z = 0): - """Set the seed from (x, y, z). - These must be integers in the range [0, 256).""" - if not type(x) == type(y) == type(z) == type(0): - raise TypeError, 'seeds must be integers' - if not (0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256): - raise ValueError, 'seeds must be in range(0, 256)' - if 0 == x == y == z: - # Initialize from current time - import time - t = long(time.time() * 256) - t = int((t&0xffffff) ^ (t>>24)) - t, x = divmod(t, 256) - t, y = divmod(t, 256) - t, z = divmod(t, 256) - # Zero is a poor seed, so substitute 1 - self._seed = (x or 1, y or 1, z or 1) - - def random(self): - """Get the next random number in the range [0.0, 1.0).""" - # This part is thread-unsafe: - # BEGIN CRITICAL SECTION - x, y, z = self._seed - # - x = (171 * x) % 30269 - y = (172 * y) % 30307 - z = (170 * z) % 30323 - # - self._seed = x, y, z - # END CRITICAL SECTION - # - return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 - - def uniform(self, a, b): - """Get a random number in the range [a, b).""" - return a + (b-a) * self.random() - - def randint(self, a, b): - """Get a random integer in the range [a, b] including - both end points. - - (Deprecated; use randrange below.)""" - return self.randrange(a, b+1) - - def choice(self, seq): - """Choose a random element from a non-empty sequence.""" - return seq[int(self.random() * len(seq))] - - def randrange(self, start, stop=None, step=1, int=int, default=None): - """Choose a random item from range(start, stop[, step]). - - This fixes the problem with randint() which includes the - endpoint; in Python this is usually not what you want. - Do not supply the 'int' and 'default' arguments.""" - # This code is a bit messy to make it fast for the - # common case while still doing adequate error checking - istart = int(start) - if istart != start: - raise ValueError, "non-integer arg 1 for randrange()" - if stop is default: - if istart > 0: - return int(self.random() * istart) - raise ValueError, "empty range for randrange()" - istop = int(stop) - if istop != stop: - raise ValueError, "non-integer stop for randrange()" - if step == 1: - if istart < istop: - return istart + int(self.random() * - (istop - istart)) - raise ValueError, "empty range for randrange()" - istep = int(step) - if istep != step: - raise ValueError, "non-integer step for randrange()" - if istep > 0: - n = (istop - istart + istep - 1) / istep - elif istep < 0: - n = (istop - istart + istep + 1) / istep - else: - raise ValueError, "zero step for randrange()" - - if n <= 0: - raise ValueError, "empty range for randrange()" - return istart + istep*int(self.random() * n) - - -# Initialize from the current time -_inst = whrandom() -seed = _inst.seed -random = _inst.random -uniform = _inst.uniform -randint = _inst.randint -choice = _inst.choice -randrange = _inst.randrange Deleted: /python/trunk/Lib/lib-old/zmod.py ============================================================================== --- /python/trunk/Lib/lib-old/zmod.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,94 +0,0 @@ -# module 'zmod' - -# Compute properties of mathematical "fields" formed by taking -# Z/n (the whole numbers modulo some whole number n) and an -# irreducible polynomial (i.e., a polynomial with only complex zeros), -# e.g., Z/5 and X**2 + 2. -# -# The field is formed by taking all possible linear combinations of -# a set of d base vectors (where d is the degree of the polynomial). -# -# Note that this procedure doesn't yield a field for all combinations -# of n and p: it may well be that some numbers have more than one -# inverse and others have none. This is what we check. -# -# Remember that a field is a ring where each element has an inverse. -# A ring has commutative addition and multiplication, a zero and a one: -# 0*x = x*0 = 0, 0+x = x+0 = x, 1*x = x*1 = x. Also, the distributive -# property holds: a*(b+c) = a*b + b*c. -# (XXX I forget if this is an axiom or follows from the rules.) - -import poly - - -# Example N and polynomial - -N = 5 -P = poly.plus(poly.one(0, 2), poly.one(2, 1)) # 2 + x**2 - - -# Return x modulo y. Returns >= 0 even if x < 0. - -def mod(x, y): - return divmod(x, y)[1] - - -# Normalize a polynomial modulo n and modulo p. - -def norm(a, n, p): - a = poly.modulo(a, p) - a = a[:] - for i in range(len(a)): a[i] = mod(a[i], n) - a = poly.normalize(a) - return a - - -# Make a list of all n^d elements of the proposed field. - -def make_all(mat): - all = [] - for row in mat: - for a in row: - all.append(a) - return all - -def make_elements(n, d): - if d == 0: return [poly.one(0, 0)] - sub = make_elements(n, d-1) - all = [] - for a in sub: - for i in range(n): - all.append(poly.plus(a, poly.one(d-1, i))) - return all - -def make_inv(all, n, p): - x = poly.one(1, 1) - inv = [] - for a in all: - inv.append(norm(poly.times(a, x), n, p)) - return inv - -def checkfield(n, p): - all = make_elements(n, len(p)-1) - inv = make_inv(all, n, p) - all1 = all[:] - inv1 = inv[:] - all1.sort() - inv1.sort() - if all1 == inv1: print 'BINGO!' - else: - print 'Sorry:', n, p - print all - print inv - -def rj(s, width): - if type(s) is not type(''): s = `s` - n = len(s) - if n >= width: return s - return ' '*(width - n) + s - -def lj(s, width): - if type(s) is not type(''): s = `s` - n = len(s) - if n >= width: return s - return s + ' '*(width - n) Deleted: /python/trunk/Lib/reconvert.py ============================================================================== --- /python/trunk/Lib/reconvert.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,192 +0,0 @@ -#! /usr/bin/env python - -r"""Convert old ("regex") regular expressions to new syntax ("re"). - -When imported as a module, there are two functions, with their own -strings: - - convert(s, syntax=None) -- convert a regex regular expression to re syntax - - quote(s) -- return a quoted string literal - -When used as a script, read a Python string literal (or any other -expression evaluating to a string) from stdin, and write the -translated expression to stdout as a string literal. Unless stdout is -a tty, no trailing \n is written to stdout. This is done so that it -can be used with Emacs C-U M-| (shell-command-on-region with argument -which filters the region through the shell command). - -No attempt has been made at coding for performance. - -Translation table... - - \( ( (unless RE_NO_BK_PARENS set) - \) ) (unless RE_NO_BK_PARENS set) - \| | (unless RE_NO_BK_VBAR set) - \< \b (not quite the same, but alla...) - \> \b (not quite the same, but alla...) - \` \A - \' \Z - -Not translated... - - . - ^ - $ - * - + (unless RE_BK_PLUS_QM set, then to \+) - ? (unless RE_BK_PLUS_QM set, then to \?) - \ - \b - \B - \w - \W - \1 ... \9 - -Special cases... - - Non-printable characters are always replaced by their 3-digit - escape code (except \t, \n, \r, which use mnemonic escapes) - - Newline is turned into | when RE_NEWLINE_OR is set - -XXX To be done... - - [...] (different treatment of backslashed items?) - [^...] (different treatment of backslashed items?) - ^ $ * + ? (in some error contexts these are probably treated differently) - \vDD \DD (in the regex docs but only works when RE_ANSI_HEX set) - -""" - - -import warnings -warnings.filterwarnings("ignore", ".* regex .*", DeprecationWarning, __name__, - append=1) - -import regex -from regex_syntax import * # RE_* - -__all__ = ["convert","quote"] - -# Default translation table -mastertable = { - r'\<': r'\b', - r'\>': r'\b', - r'\`': r'\A', - r'\'': r'\Z', - r'\(': '(', - r'\)': ')', - r'\|': '|', - '(': r'\(', - ')': r'\)', - '|': r'\|', - '\t': r'\t', - '\n': r'\n', - '\r': r'\r', -} - - -def convert(s, syntax=None): - """Convert a regex regular expression to re syntax. - - The first argument is the regular expression, as a string object, - just like it would be passed to regex.compile(). (I.e., pass the - actual string object -- string quotes must already have been - removed and the standard escape processing has already been done, - e.g. by eval().) - - The optional second argument is the regex syntax variant to be - used. This is an integer mask as passed to regex.set_syntax(); - the flag bits are defined in regex_syntax. When not specified, or - when None is given, the current regex syntax mask (as retrieved by - regex.get_syntax()) is used -- which is 0 by default. - - The return value is a regular expression, as a string object that - could be passed to re.compile(). (I.e., no string quotes have - been added -- use quote() below, or repr().) - - The conversion is not always guaranteed to be correct. More - syntactical analysis should be performed to detect borderline - cases and decide what to do with them. For example, 'x*?' is not - translated correctly. - - """ - table = mastertable.copy() - if syntax is None: - syntax = regex.get_syntax() - if syntax & RE_NO_BK_PARENS: - del table[r'\('], table[r'\)'] - del table['('], table[')'] - if syntax & RE_NO_BK_VBAR: - del table[r'\|'] - del table['|'] - if syntax & RE_BK_PLUS_QM: - table['+'] = r'\+' - table['?'] = r'\?' - table[r'\+'] = '+' - table[r'\?'] = '?' - if syntax & RE_NEWLINE_OR: - table['\n'] = '|' - res = "" - - i = 0 - end = len(s) - while i < end: - c = s[i] - i = i+1 - if c == '\\': - c = s[i] - i = i+1 - key = '\\' + c - key = table.get(key, key) - res = res + key - else: - c = table.get(c, c) - res = res + c - return res - - -def quote(s, quote=None): - """Convert a string object to a quoted string literal. - - This is similar to repr() but will return a "raw" string (r'...' - or r"...") when the string contains backslashes, instead of - doubling all backslashes. The resulting string does *not* always - evaluate to the same string as the original; however it will do - just the right thing when passed into re.compile(). - - The optional second argument forces the string quote; it must be - a single character which is a valid Python string quote. - - """ - if quote is None: - q = "'" - altq = "'" - if q in s and altq not in s: - q = altq - else: - assert quote in ('"', "'", '"""', "'''") - q = quote - res = q - for c in s: - if c == q: c = '\\' + c - elif c < ' ' or c > '~': c = "\\%03o" % ord(c) - res = res + c - res = res + q - if '\\' in res: - res = 'r' + res - return res - - -def main(): - """Main program -- called when run as a script.""" - import sys - s = eval(sys.stdin.read()) - sys.stdout.write(quote(convert(s))) - if sys.stdout.isatty(): - sys.stdout.write("\n") - - -if __name__ == '__main__': - main() Deleted: /python/trunk/Lib/regex_syntax.py ============================================================================== --- /python/trunk/Lib/regex_syntax.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,53 +0,0 @@ -"""Constants for selecting regexp syntaxes for the obsolete regex module. - -This module is only for backward compatibility. "regex" has now -been replaced by the new regular expression module, "re". - -These bits are passed to regex.set_syntax() to choose among -alternative regexp syntaxes. -""" - -# 1 means plain parentheses serve as grouping, and backslash -# parentheses are needed for literal searching. -# 0 means backslash-parentheses are grouping, and plain parentheses -# are for literal searching. -RE_NO_BK_PARENS = 1 - -# 1 means plain | serves as the "or"-operator, and \| is a literal. -# 0 means \| serves as the "or"-operator, and | is a literal. -RE_NO_BK_VBAR = 2 - -# 0 means plain + or ? serves as an operator, and \+, \? are literals. -# 1 means \+, \? are operators and plain +, ? are literals. -RE_BK_PLUS_QM = 4 - -# 1 means | binds tighter than ^ or $. -# 0 means the contrary. -RE_TIGHT_VBAR = 8 - -# 1 means treat \n as an _OR operator -# 0 means treat it as a normal character -RE_NEWLINE_OR = 16 - -# 0 means that a special characters (such as *, ^, and $) always have -# their special meaning regardless of the surrounding context. -# 1 means that special characters may act as normal characters in some -# contexts. Specifically, this applies to: -# ^ - only special at the beginning, or after ( or | -# $ - only special at the end, or before ) or | -# *, +, ? - only special when not after the beginning, (, or | -RE_CONTEXT_INDEP_OPS = 32 - -# ANSI sequences (\n etc) and \xhh -RE_ANSI_HEX = 64 - -# No GNU extensions -RE_NO_GNU_EXTENSIONS = 128 - -# Now define combinations of bits for the standard possibilities. -RE_SYNTAX_AWK = (RE_NO_BK_PARENS | RE_NO_BK_VBAR | RE_CONTEXT_INDEP_OPS) -RE_SYNTAX_EGREP = (RE_SYNTAX_AWK | RE_NEWLINE_OR) -RE_SYNTAX_GREP = (RE_BK_PLUS_QM | RE_NEWLINE_OR) -RE_SYNTAX_EMACS = 0 - -# (Python's obsolete "regexp" module used a syntax similar to awk.) Deleted: /python/trunk/Lib/regsub.py ============================================================================== --- /python/trunk/Lib/regsub.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,198 +0,0 @@ -"""Regexp-based split and replace using the obsolete regex module. - -This module is only for backward compatibility. These operations -are now provided by the new regular expression module, "re". - -sub(pat, repl, str): replace first occurrence of pattern in string -gsub(pat, repl, str): replace all occurrences of pattern in string -split(str, pat, maxsplit): split string using pattern as delimiter -splitx(str, pat, maxsplit): split string using pattern as delimiter plus - return delimiters -""" - -import warnings -warnings.warn("the regsub module is deprecated; please use re.sub()", - DeprecationWarning) - -# Ignore further deprecation warnings about this module -warnings.filterwarnings("ignore", "", DeprecationWarning, __name__) - -import regex - -__all__ = ["sub","gsub","split","splitx","capwords"] - -# Replace first occurrence of pattern pat in string str by replacement -# repl. If the pattern isn't found, the string is returned unchanged. -# The replacement may contain references \digit to subpatterns and -# escaped backslashes. The pattern may be a string or an already -# compiled pattern. - -def sub(pat, repl, str): - prog = compile(pat) - if prog.search(str) >= 0: - regs = prog.regs - a, b = regs[0] - str = str[:a] + expand(repl, regs, str) + str[b:] - return str - - -# Replace all (non-overlapping) occurrences of pattern pat in string -# str by replacement repl. The same rules as for sub() apply. -# Empty matches for the pattern are replaced only when not adjacent to -# a previous match, so e.g. gsub('', '-', 'abc') returns '-a-b-c-'. - -def gsub(pat, repl, str): - prog = compile(pat) - new = '' - start = 0 - first = 1 - while prog.search(str, start) >= 0: - regs = prog.regs - a, b = regs[0] - if a == b == start and not first: - if start >= len(str) or prog.search(str, start+1) < 0: - break - regs = prog.regs - a, b = regs[0] - new = new + str[start:a] + expand(repl, regs, str) - start = b - first = 0 - new = new + str[start:] - return new - - -# Split string str in fields separated by delimiters matching pattern -# pat. Only non-empty matches for the pattern are considered, so e.g. -# split('abc', '') returns ['abc']. -# The optional 3rd argument sets the number of splits that are performed. - -def split(str, pat, maxsplit = 0): - return intsplit(str, pat, maxsplit, 0) - -# Split string str in fields separated by delimiters matching pattern -# pat. Only non-empty matches for the pattern are considered, so e.g. -# split('abc', '') returns ['abc']. The delimiters are also included -# in the list. -# The optional 3rd argument sets the number of splits that are performed. - - -def splitx(str, pat, maxsplit = 0): - return intsplit(str, pat, maxsplit, 1) - -# Internal function used to implement split() and splitx(). - -def intsplit(str, pat, maxsplit, retain): - prog = compile(pat) - res = [] - start = next = 0 - splitcount = 0 - while prog.search(str, next) >= 0: - regs = prog.regs - a, b = regs[0] - if a == b: - next = next + 1 - if next >= len(str): - break - else: - res.append(str[start:a]) - if retain: - res.append(str[a:b]) - start = next = b - splitcount = splitcount + 1 - if (maxsplit and (splitcount >= maxsplit)): - break - res.append(str[start:]) - return res - - -# Capitalize words split using a pattern - -def capwords(str, pat='[^a-zA-Z0-9_]+'): - words = splitx(str, pat) - for i in range(0, len(words), 2): - words[i] = words[i].capitalize() - return "".join(words) - - -# Internal subroutines: -# compile(pat): compile a pattern, caching already compiled patterns -# expand(repl, regs, str): expand \digit escapes in replacement string - - -# Manage a cache of compiled regular expressions. -# -# If the pattern is a string a compiled version of it is returned. If -# the pattern has been used before we return an already compiled -# version from the cache; otherwise we compile it now and save the -# compiled version in the cache, along with the syntax it was compiled -# with. Instead of a string, a compiled regular expression can also -# be passed. - -cache = {} - -def compile(pat): - if type(pat) != type(''): - return pat # Assume it is a compiled regex - key = (pat, regex.get_syntax()) - if key in cache: - prog = cache[key] # Get it from the cache - else: - prog = cache[key] = regex.compile(pat) - return prog - - -def clear_cache(): - global cache - cache = {} - - -# Expand \digit in the replacement. -# Each occurrence of \digit is replaced by the substring of str -# indicated by regs[digit]. To include a literal \ in the -# replacement, double it; other \ escapes are left unchanged (i.e. -# the \ and the following character are both copied). - -def expand(repl, regs, str): - if '\\' not in repl: - return repl - new = '' - i = 0 - ord0 = ord('0') - while i < len(repl): - c = repl[i]; i = i+1 - if c != '\\' or i >= len(repl): - new = new + c - else: - c = repl[i]; i = i+1 - if '0' <= c <= '9': - a, b = regs[ord(c)-ord0] - new = new + str[a:b] - elif c == '\\': - new = new + c - else: - new = new + '\\' + c - return new - - -# Test program, reads sequences "pat repl str" from stdin. -# Optional argument specifies pattern used to split lines. - -def test(): - import sys - if sys.argv[1:]: - delpat = sys.argv[1] - else: - delpat = '[ \t\n]+' - while 1: - if sys.stdin.isatty(): sys.stderr.write('--> ') - line = sys.stdin.readline() - if not line: break - if line[-1] == '\n': line = line[:-1] - fields = split(line, delpat) - if len(fields) != 3: - print 'Sorry, not three fields' - print 'split:', repr(fields) - continue - [pat, repl, str] = split(line, delpat) - print 'sub :', repr(sub(pat, repl, str)) - print 'gsub:', repr(gsub(pat, repl, str)) Modified: python/trunk/Lib/rexec.py ============================================================================== --- python/trunk/Lib/rexec.py (original) +++ python/trunk/Lib/rexec.py Thu Mar 16 07:50:13 2006 @@ -136,7 +136,7 @@ ok_builtin_modules = ('audioop', 'array', 'binascii', 'cmath', 'errno', 'imageop', 'marshal', 'math', 'md5', 'operator', - 'parser', 'regex', 'select', + 'parser', 'select', 'sha', '_sre', 'strop', 'struct', 'time', '_weakref') Modified: python/trunk/Lib/test/test___all__.py ============================================================================== --- python/trunk/Lib/test/test___all__.py (original) +++ python/trunk/Lib/test/test___all__.py Thu Mar 16 07:50:13 2006 @@ -128,8 +128,6 @@ self.check_all("quopri") self.check_all("random") self.check_all("re") - self.check_all("reconvert") - self.check_all("regsub") self.check_all("repr") self.check_all("rexec") self.check_all("rfc822") Deleted: /python/trunk/Lib/test/test_regex.py ============================================================================== --- /python/trunk/Lib/test/test_regex.py Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,113 +0,0 @@ -from test.test_support import verbose, sortdict -import warnings -warnings.filterwarnings("ignore", "the regex module is deprecated", - DeprecationWarning, __name__) -import regex -from regex_syntax import * - -re = 'a+b+c+' -print 'no match:', regex.match(re, 'hello aaaabcccc world') -print 'successful search:', regex.search(re, 'hello aaaabcccc world') -try: - cre = regex.compile('\(' + re) -except regex.error: - print 'caught expected exception' -else: - print 'expected regex.error not raised' - -print 'failed awk syntax:', regex.search('(a+)|(b+)', 'cdb') -prev = regex.set_syntax(RE_SYNTAX_AWK) -print 'successful awk syntax:', regex.search('(a+)|(b+)', 'cdb') -regex.set_syntax(prev) -print 'failed awk syntax:', regex.search('(a+)|(b+)', 'cdb') - -re = '\([0-9]+\) *\([0-9]+\)' -print 'matching with group names and compile()' -cre = regex.compile(re) -print cre.match('801 999') -try: - print cre.group('one') -except regex.error: - print 'caught expected exception' -else: - print 'expected regex.error not raised' - -print 'matching with group names and symcomp()' -cre = regex.symcomp(re) -print cre.match('801 999') -print cre.group(0) -print cre.group('one') -print cre.group(1, 2) -print cre.group('one', 'two') -print 'realpat:', cre.realpat -print 'groupindex:', sortdict(cre.groupindex) - -re = 'world' -cre = regex.compile(re) -print 'not case folded search:', cre.search('HELLO WORLD') -cre = regex.compile(re, regex.casefold) -print 'case folded search:', cre.search('HELLO WORLD') - -print '__members__:', cre.__members__ -print 'regs:', cre.regs -print 'last:', cre.last -print 'translate:', len(cre.translate) -print 'givenpat:', cre.givenpat - -print 'match with pos:', cre.match('hello world', 7) -print 'search with pos:', cre.search('hello world there world', 7) -print 'bogus group:', cre.group(0, 1, 3) -try: - print 'no name:', cre.group('one') -except regex.error: - print 'caught expected exception' -else: - print 'expected regex.error not raised' - -from regex_tests import * -if verbose: print 'Running regex_tests test suite' - -for t in tests: - pattern=s=outcome=repl=expected=None - if len(t)==5: - pattern, s, outcome, repl, expected = t - elif len(t)==3: - pattern, s, outcome = t - else: - raise ValueError, ('Test tuples should have 3 or 5 fields',t) - - try: - obj=regex.compile(pattern) - except regex.error: - if outcome==SYNTAX_ERROR: pass # Expected a syntax error - else: - # Regex syntax errors aren't yet reported, so for - # the official test suite they'll be quietly ignored. - pass - #print '=== Syntax error:', t - else: - try: - result=obj.search(s) - except regex.error, msg: - print '=== Unexpected exception', t, repr(msg) - if outcome==SYNTAX_ERROR: - # This should have been a syntax error; forget it. - pass - elif outcome==FAIL: - if result==-1: pass # No match, as expected - else: print '=== Succeeded incorrectly', t - elif outcome==SUCCEED: - if result!=-1: - # Matched, as expected, so now we compute the - # result string and compare it to our expected result. - start, end = obj.regs[0] - found=s[start:end] - groups=obj.group(1,2,3,4,5,6,7,8,9,10) - vardict=vars() - for i in range(len(groups)): - vardict['g'+str(i+1)]=str(groups[i]) - repl=eval(repl) - if repl!=expected: - print '=== grouping error', t, repr(repl)+' should be '+repr(expected) - else: - print '=== Failed incorrectly', t Modified: python/trunk/Lib/test/test_sundry.py ============================================================================== --- python/trunk/Lib/test/test_sundry.py (original) +++ python/trunk/Lib/test/test_sundry.py Thu Mar 16 07:50:13 2006 @@ -68,7 +68,6 @@ import profile import pstats import py_compile -#import reconvert import repr try: import rlcompleter # not available on Windows Modified: python/trunk/Misc/BeOS-setup.py ============================================================================== --- python/trunk/Misc/BeOS-setup.py (original) +++ python/trunk/Misc/BeOS-setup.py Thu Mar 16 07:50:13 2006 @@ -176,8 +176,6 @@ # # Some modules that are normally always on: - exts.append( Extension('regex', ['regexmodule.c', 'regexpr.c']) ) - exts.append( Extension('_weakref', ['_weakref.c']) ) exts.append( Extension('_symtable', ['symtablemodule.c']) ) Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Mar 16 07:50:13 2006 @@ -291,7 +291,14 @@ Extension Modules ----------------- -- Swapped re and sre, so help(re) provides full help. importing sre +- Everything under lib-old was removed. This includes the following modules: + Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, + lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, + util, whatsound, whrandom, zmod + +- The following modules were removed: regsub, reconvert, regex, regex_syntax. + +- re and sre were swapped, so help(re) provides full help. importing sre is deprecated. The undocumented re.engine variable no longer exists. - Bug #1448490: Fixed a bug that ISO-2022 codecs could not handle Modified: python/trunk/Misc/cheatsheet ============================================================================== --- python/trunk/Misc/cheatsheet (original) +++ python/trunk/Misc/cheatsheet Thu Mar 16 07:50:13 2006 @@ -1956,8 +1956,6 @@ rand Don't use unless you want compatibility with C's rand(). random Random variable generators re Regular Expressions. -reconvert Convert old ("regex") regular expressions to new syntax - ("re"). repr Redo repr() but with limits on most sizes. rexec Restricted execution facilities ("safe" exec, eval, etc). rfc822 RFC-822 message manipulation class. @@ -2035,7 +2033,6 @@ array Obj efficiently representing arrays of basic values math Math functions of C standard time Time-related functions (also the newer datetime module) - regex Regular expression matching operations marshal Read and write some python values in binary format struct Convert between python values and C structs Deleted: /python/trunk/Modules/regexmodule.c ============================================================================== --- /python/trunk/Modules/regexmodule.c Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,690 +0,0 @@ -/* -XXX support range parameter on search -XXX support mstop parameter on search -*/ - - -/* Regular expression objects */ -/* This uses Tatu Ylonen's copyleft-free reimplementation of - GNU regular expressions */ - -#include "Python.h" - -#include - -#include "regexpr.h" - -static PyObject *RegexError; /* Exception */ - -typedef struct { - PyObject_HEAD - struct re_pattern_buffer re_patbuf; /* The compiled expression */ - struct re_registers re_regs; /* The registers from the last match */ - char re_fastmap[256]; /* Storage for fastmap */ - PyObject *re_translate; /* String object for translate table */ - PyObject *re_lastok; /* String object last matched/searched */ - PyObject *re_groupindex; /* Group name to index dictionary */ - PyObject *re_givenpat; /* Pattern with symbolic groups */ - PyObject *re_realpat; /* Pattern without symbolic groups */ -} regexobject; - -/* Regex object methods */ - -static void -reg_dealloc(regexobject *re) -{ - if (re->re_patbuf.buffer) - free(re->re_patbuf.buffer); - Py_XDECREF(re->re_translate); - Py_XDECREF(re->re_lastok); - Py_XDECREF(re->re_groupindex); - Py_XDECREF(re->re_givenpat); - Py_XDECREF(re->re_realpat); - PyObject_Del(re); -} - -static PyObject * -makeresult(struct re_registers *regs) -{ - PyObject *v; - int i; - static PyObject *filler = NULL; - - if (filler == NULL) { - filler = Py_BuildValue("(ii)", -1, -1); - if (filler == NULL) - return NULL; - } - v = PyTuple_New(RE_NREGS); - if (v == NULL) - return NULL; - - for (i = 0; i < RE_NREGS; i++) { - int lo = regs->start[i]; - int hi = regs->end[i]; - PyObject *w; - if (lo == -1 && hi == -1) { - w = filler; - Py_INCREF(w); - } - else - w = Py_BuildValue("(ii)", lo, hi); - if (w == NULL || PyTuple_SetItem(v, i, w) < 0) { - Py_DECREF(v); - return NULL; - } - } - return v; -} - -static PyObject * -regobj_match(regexobject *re, PyObject *args) -{ - PyObject *argstring; - char *buffer; - int size; - int offset = 0; - int result; - - if (!PyArg_ParseTuple(args, "O|i:match", &argstring, &offset)) - return NULL; - if (!PyArg_Parse(argstring, "t#", &buffer, &size)) - return NULL; - - if (offset < 0 || offset > size) { - PyErr_SetString(RegexError, "match offset out of range"); - return NULL; - } - Py_XDECREF(re->re_lastok); - re->re_lastok = NULL; - result = _Py_re_match(&re->re_patbuf, (unsigned char *)buffer, size, offset, - &re->re_regs); - if (result < -1) { - /* Serious failure of some sort; if re_match didn't - set an exception, raise a generic error */ - if (!PyErr_Occurred()) - PyErr_SetString(RegexError, "match failure"); - return NULL; - } - if (result >= 0) { - Py_INCREF(argstring); - re->re_lastok = argstring; - } - return PyInt_FromLong((long)result); /* Length of the match or -1 */ -} - -static PyObject * -regobj_search(regexobject *re, PyObject *args) -{ - PyObject *argstring; - char *buffer; - int size; - int offset = 0; - int range; - int result; - - if (!PyArg_ParseTuple(args, "O|i:search", &argstring, &offset)) - return NULL; - if (!PyArg_Parse(argstring, "t#:search", &buffer, &size)) - return NULL; - - if (offset < 0 || offset > size) { - PyErr_SetString(RegexError, "search offset out of range"); - return NULL; - } - /* NB: In Emacs 18.57, the documentation for re_search[_2] and - the implementation don't match: the documentation states that - |range| positions are tried, while the code tries |range|+1 - positions. It seems more productive to believe the code! */ - range = size - offset; - Py_XDECREF(re->re_lastok); - re->re_lastok = NULL; - result = _Py_re_search(&re->re_patbuf, (unsigned char *)buffer, size, offset, range, - &re->re_regs); - if (result < -1) { - /* Serious failure of some sort; if re_match didn't - set an exception, raise a generic error */ - if (!PyErr_Occurred()) - PyErr_SetString(RegexError, "match failure"); - return NULL; - } - if (result >= 0) { - Py_INCREF(argstring); - re->re_lastok = argstring; - } - return PyInt_FromLong((long)result); /* Position of the match or -1 */ -} - -/* get the group from the regex where index can be a string (group name) or - an integer index [0 .. 99] - */ -static PyObject* -group_from_index(regexobject *re, PyObject *index) -{ - int i, a, b; - char *v; - - if (PyString_Check(index)) - if (re->re_groupindex == NULL || - !(index = PyDict_GetItem(re->re_groupindex, index))) - { - PyErr_SetString(RegexError, - "group() group name doesn't exist"); - return NULL; - } - - i = PyInt_AsLong(index); - if (i == -1 && PyErr_Occurred()) - return NULL; - - if (i < 0 || i >= RE_NREGS) { - PyErr_SetString(RegexError, "group() index out of range"); - return NULL; - } - if (re->re_lastok == NULL) { - PyErr_SetString(RegexError, - "group() only valid after successful match/search"); - return NULL; - } - a = re->re_regs.start[i]; - b = re->re_regs.end[i]; - if (a < 0 || b < 0) { - Py_INCREF(Py_None); - return Py_None; - } - - if (!(v = PyString_AsString(re->re_lastok))) - return NULL; - - return PyString_FromStringAndSize(v+a, b-a); -} - - -static PyObject * -regobj_group(regexobject *re, PyObject *args) -{ - int n = PyTuple_Size(args); - int i; - PyObject *res = NULL; - - if (n < 0) - return NULL; - if (n == 0) { - PyErr_SetString(PyExc_TypeError, "not enough arguments"); - return NULL; - } - if (n == 1) { - /* return value is a single string */ - PyObject *index = PyTuple_GetItem(args, 0); - if (!index) - return NULL; - - return group_from_index(re, index); - } - - /* return value is a tuple */ - if (!(res = PyTuple_New(n))) - return NULL; - - for (i = 0; i < n; i++) { - PyObject *index = PyTuple_GetItem(args, i); - PyObject *group = NULL; - - if (!index) - goto finally; - if (!(group = group_from_index(re, index))) - goto finally; - if (PyTuple_SetItem(res, i, group) < 0) - goto finally; - } - return res; - - finally: - Py_DECREF(res); - return NULL; -} - - -static struct PyMethodDef reg_methods[] = { - {"match", (PyCFunction)regobj_match, METH_VARARGS}, - {"search", (PyCFunction)regobj_search, METH_VARARGS}, - {"group", (PyCFunction)regobj_group, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - - - -static char* members[] = { - "last", "regs", "translate", - "groupindex", "realpat", "givenpat", - NULL -}; - - -static PyObject * -regobj_getattr(regexobject *re, char *name) -{ - if (strcmp(name, "regs") == 0) { - if (re->re_lastok == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - return makeresult(&re->re_regs); - } - if (strcmp(name, "last") == 0) { - if (re->re_lastok == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - Py_INCREF(re->re_lastok); - return re->re_lastok; - } - if (strcmp(name, "translate") == 0) { - if (re->re_translate == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - Py_INCREF(re->re_translate); - return re->re_translate; - } - if (strcmp(name, "groupindex") == 0) { - if (re->re_groupindex == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - Py_INCREF(re->re_groupindex); - return re->re_groupindex; - } - if (strcmp(name, "realpat") == 0) { - if (re->re_realpat == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - Py_INCREF(re->re_realpat); - return re->re_realpat; - } - if (strcmp(name, "givenpat") == 0) { - if (re->re_givenpat == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - Py_INCREF(re->re_givenpat); - return re->re_givenpat; - } - if (strcmp(name, "__members__") == 0) { - int i = 0; - PyObject *list = NULL; - - /* okay, so it's unlikely this list will change that often. - still, it's easier to change it in just one place. - */ - while (members[i]) - i++; - if (!(list = PyList_New(i))) - return NULL; - - i = 0; - while (members[i]) { - PyObject* v = PyString_FromString(members[i]); - if (!v || PyList_SetItem(list, i, v) < 0) { - Py_DECREF(list); - return NULL; - } - i++; - } - return list; - } - return Py_FindMethod(reg_methods, (PyObject *)re, name); -} - -static PyTypeObject Regextype = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "regex.regex", /*tp_name*/ - sizeof(regexobject), /*tp_size*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)reg_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)regobj_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ -}; - -/* reference counting invariants: - pattern: borrowed - translate: borrowed - givenpat: borrowed - groupindex: transferred -*/ -static PyObject * -newregexobject(PyObject *pattern, PyObject *translate, PyObject *givenpat, PyObject *groupindex) -{ - regexobject *re; - char *pat; - int size; - - if (!PyArg_Parse(pattern, "t#", &pat, &size)) - return NULL; - - if (translate != NULL && PyString_Size(translate) != 256) { - PyErr_SetString(RegexError, - "translation table must be 256 bytes"); - return NULL; - } - re = PyObject_New(regexobject, &Regextype); - if (re != NULL) { - char *error; - re->re_patbuf.buffer = NULL; - re->re_patbuf.allocated = 0; - re->re_patbuf.fastmap = (unsigned char *)re->re_fastmap; - if (translate) { - re->re_patbuf.translate = (unsigned char *)PyString_AsString(translate); - if (!re->re_patbuf.translate) - goto finally; - Py_INCREF(translate); - } - else - re->re_patbuf.translate = NULL; - re->re_translate = translate; - re->re_lastok = NULL; - re->re_groupindex = groupindex; - Py_INCREF(pattern); - re->re_realpat = pattern; - Py_INCREF(givenpat); - re->re_givenpat = givenpat; - error = _Py_re_compile_pattern((unsigned char *)pat, size, &re->re_patbuf); - if (error != NULL) { - PyErr_SetString(RegexError, error); - goto finally; - } - } - return (PyObject *)re; - finally: - Py_DECREF(re); - return NULL; -} - -static PyObject * -regex_compile(PyObject *self, PyObject *args) -{ - PyObject *pat = NULL; - PyObject *tran = NULL; - - if (!PyArg_ParseTuple(args, "S|S:compile", &pat, &tran)) - return NULL; - return newregexobject(pat, tran, pat, NULL); -} - -static PyObject * -symcomp(PyObject *pattern, PyObject *gdict) -{ - char *opat, *oend, *o, *n, *g, *v; - int group_count = 0; - int sz; - int escaped = 0; - char name_buf[128]; - PyObject *npattern; - int require_escape = re_syntax & RE_NO_BK_PARENS ? 0 : 1; - - if (!(opat = PyString_AsString(pattern))) - return NULL; - - if ((sz = PyString_Size(pattern)) < 0) - return NULL; - - oend = opat + sz; - o = opat; - - if (oend == opat) { - Py_INCREF(pattern); - return pattern; - } - - if (!(npattern = PyString_FromStringAndSize((char*)NULL, sz)) || - !(n = PyString_AsString(npattern))) - return NULL; - - while (o < oend) { - if (*o == '(' && escaped == require_escape) { - char *backtrack; - escaped = 0; - ++group_count; - *n++ = *o; - if (++o >= oend || *o != '<') - continue; - /* *o == '<' */ - if (o+1 < oend && *(o+1) == '>') - continue; - backtrack = o; - g = name_buf; - for (++o; o < oend;) { - if (*o == '>') { - PyObject *group_name = NULL; - PyObject *group_index = NULL; - *g++ = '\0'; - group_name = PyString_FromString(name_buf); - group_index = PyInt_FromLong(group_count); - if (group_name == NULL || - group_index == NULL || - PyDict_SetItem(gdict, group_name, - group_index) != 0) - { - Py_XDECREF(group_name); - Py_XDECREF(group_index); - Py_XDECREF(npattern); - return NULL; - } - Py_DECREF(group_name); - Py_DECREF(group_index); - ++o; /* eat the '>' */ - break; - } - if (!isalnum(Py_CHARMASK(*o)) && *o != '_') { - o = backtrack; - break; - } - *g++ = *o++; - } - } - else if (*o == '[' && !escaped) { - *n++ = *o; - ++o; /* eat the char following '[' */ - *n++ = *o; - while (o < oend && *o != ']') { - ++o; - *n++ = *o; - } - if (o < oend) - ++o; - } - else if (*o == '\\') { - escaped = 1; - *n++ = *o; - ++o; - } - else { - escaped = 0; - *n++ = *o; - ++o; - } - } - - if (!(v = PyString_AsString(npattern))) { - Py_DECREF(npattern); - return NULL; - } - /* _PyString_Resize() decrements npattern on failure */ - _PyString_Resize(&npattern, n - v); - return npattern; - -} - -static PyObject * -regex_symcomp(PyObject *self, PyObject *args) -{ - PyObject *pattern; - PyObject *tran = NULL; - PyObject *gdict = NULL; - PyObject *npattern; - PyObject *retval = NULL; - - if (!PyArg_ParseTuple(args, "S|S:symcomp", &pattern, &tran)) - return NULL; - - gdict = PyDict_New(); - if (gdict == NULL || (npattern = symcomp(pattern, gdict)) == NULL) { - Py_XDECREF(gdict); - return NULL; - } - retval = newregexobject(npattern, tran, pattern, gdict); - Py_DECREF(npattern); - return retval; -} - - -static PyObject *cache_pat; -static PyObject *cache_prog; - -static int -update_cache(PyObject *pat) -{ - PyObject *tuple = PyTuple_Pack(1, pat); - int status = 0; - - if (!tuple) - return -1; - - if (pat != cache_pat) { - Py_XDECREF(cache_pat); - cache_pat = NULL; - Py_XDECREF(cache_prog); - cache_prog = regex_compile((PyObject *)NULL, tuple); - if (cache_prog == NULL) { - status = -1; - goto finally; - } - cache_pat = pat; - Py_INCREF(cache_pat); - } - finally: - Py_DECREF(tuple); - return status; -} - -static PyObject * -regex_match(PyObject *self, PyObject *args) -{ - PyObject *pat, *string; - PyObject *tuple, *v; - - if (!PyArg_ParseTuple(args, "SS:match", &pat, &string)) - return NULL; - if (update_cache(pat) < 0) - return NULL; - - if (!(tuple = Py_BuildValue("(S)", string))) - return NULL; - v = regobj_match((regexobject *)cache_prog, tuple); - Py_DECREF(tuple); - return v; -} - -static PyObject * -regex_search(PyObject *self, PyObject *args) -{ - PyObject *pat, *string; - PyObject *tuple, *v; - - if (!PyArg_ParseTuple(args, "SS:search", &pat, &string)) - return NULL; - if (update_cache(pat) < 0) - return NULL; - - if (!(tuple = Py_BuildValue("(S)", string))) - return NULL; - v = regobj_search((regexobject *)cache_prog, tuple); - Py_DECREF(tuple); - return v; -} - -static PyObject * -regex_set_syntax(PyObject *self, PyObject *args) -{ - int syntax; - if (!PyArg_ParseTuple(args, "i:set_syntax", &syntax)) - return NULL; - syntax = re_set_syntax(syntax); - /* wipe the global pattern cache */ - Py_XDECREF(cache_pat); - cache_pat = NULL; - Py_XDECREF(cache_prog); - cache_prog = NULL; - return PyInt_FromLong((long)syntax); -} - -static PyObject * -regex_get_syntax(PyObject *self) -{ - return PyInt_FromLong((long)re_syntax); -} - - -static struct PyMethodDef regex_global_methods[] = { - {"compile", regex_compile, METH_VARARGS}, - {"symcomp", regex_symcomp, METH_VARARGS}, - {"match", regex_match, METH_VARARGS}, - {"search", regex_search, METH_VARARGS}, - {"set_syntax", regex_set_syntax, METH_VARARGS}, - {"get_syntax", (PyCFunction)regex_get_syntax, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -PyMODINIT_FUNC -initregex(void) -{ - PyObject *m, *d, *v; - int i; - char *s; - - /* Initialize object type */ - Regextype.ob_type = &PyType_Type; - - m = Py_InitModule("regex", regex_global_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - - if (PyErr_Warn(PyExc_DeprecationWarning, - "the regex module is deprecated; " - "please use the re module") < 0) - return; - - /* Initialize regex.error exception */ - v = RegexError = PyErr_NewException("regex.error", NULL, NULL); - if (v == NULL || PyDict_SetItemString(d, "error", v) != 0) - goto finally; - - /* Initialize regex.casefold constant */ - if (!(v = PyString_FromStringAndSize((char *)NULL, 256))) - goto finally; - - if (!(s = PyString_AsString(v))) - goto finally; - - for (i = 0; i < 256; i++) { - if (isupper(i)) - s[i] = tolower(i); - else - s[i] = i; - } - if (PyDict_SetItemString(d, "casefold", v) < 0) - goto finally; - Py_DECREF(v); - - if (!PyErr_Occurred()) - return; - finally: - /* Nothing */ ; -} Deleted: /python/trunk/Modules/regexpr.c ============================================================================== --- /python/trunk/Modules/regexpr.c Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,2094 +0,0 @@ -/* regexpr.c - * - * Author: Tatu Ylonen - * - * Copyright (c) 1991 Tatu Ylonen, Espoo, Finland - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies. - * This software is provided "as is" without express or implied - * warranty. - * - * Created: Thu Sep 26 17:14:05 1991 ylo - * Last modified: Mon Nov 4 17:06:48 1991 ylo - * Ported to Think C: 19 Jan 1992 guido at cwi.nl - * - * This code draws many ideas from the regular expression packages by - * Henry Spencer of the University of Toronto and Richard Stallman of - * the Free Software Foundation. - * - * Emacs-specific code and syntax table code is almost directly borrowed - * from GNU regexp. - * - * Bugs fixed and lots of reorganization by Jeffrey C. Ollie, April - * 1997 Thanks for bug reports and ideas from Andrew Kuchling, Tim - * Peters, Guido van Rossum, Ka-Ping Yee, Sjoerd Mullender, and - * probably one or two others that I'm forgetting. - * - * $Id$ */ - -#include "Python.h" -#include "regexpr.h" - -/* The original code blithely assumed that sizeof(short) == 2. Not - * always true. Original instances of "(short)x" were replaced by - * SHORT(x), where SHORT is #defined below. */ - -#define SHORT(x) ((x) & 0x8000 ? (x) - 0x10000 : (x)) - -/* The stack implementation is taken from an idea by Andrew Kuchling. - * It's a doubly linked list of arrays. The advantages of this over a - * simple linked list are that the number of mallocs required are - * reduced. It also makes it possible to statically allocate enough - * space so that small patterns don't ever need to call malloc. - * - * The advantages over a single array is that is periodically - * realloced when more space is needed is that we avoid ever copying - * the stack. */ - -/* item_t is the basic stack element. Defined as a union of - * structures so that both registers, failure points, and counters can - * be pushed/popped from the stack. There's nothing built into the - * item to keep track of whether a certain stack item is a register, a - * failure point, or a counter. */ - -typedef union item_t -{ - struct - { - int num; - int level; - unsigned char *start; - unsigned char *end; - } reg; - struct - { - int count; - int level; - int phantom; - unsigned char *code; - unsigned char *text; - } fail; - struct - { - int num; - int level; - int count; - } cntr; -} item_t; - -#define STACK_PAGE_SIZE 256 -#define NUM_REGISTERS 256 - -/* A 'page' of stack items. */ - -typedef struct item_page_t -{ - item_t items[STACK_PAGE_SIZE]; - struct item_page_t *prev; - struct item_page_t *next; -} item_page_t; - - -typedef struct match_state -{ - /* The number of registers that have been pushed onto the stack - * since the last failure point. */ - - int count; - - /* Used to control when registers need to be pushed onto the - * stack. */ - - int level; - - /* The number of failure points on the stack. */ - - int point; - - /* Storage for the registers. Each register consists of two - * pointers to characters. So register N is represented as - * start[N] and end[N]. The pointers must be converted to - * offsets from the beginning of the string before returning the - * registers to the calling program. */ - - unsigned char *start[NUM_REGISTERS]; - unsigned char *end[NUM_REGISTERS]; - - /* Keeps track of whether a register has changed recently. */ - - int changed[NUM_REGISTERS]; - - /* Structure to encapsulate the stack. */ - struct - { - /* index into the current page. If index == 0 and you need - * to pop an item, move to the previous page and set index - * = STACK_PAGE_SIZE - 1. Otherwise decrement index to - * push a page. If index == STACK_PAGE_SIZE and you need - * to push a page move to the next page and set index = - * 0. If there is no new next page, allocate a new page - * and link it in. Otherwise, increment index to push a - * page. */ - - int index; - item_page_t *current; /* Pointer to the current page. */ - item_page_t first; /* First page is statically allocated. */ - } stack; -} match_state; - -/* Initialize a state object */ - -/* #define NEW_STATE(state) \ */ -/* memset(&state, 0, (void *)(&state.stack) - (void *)(&state)); \ */ -/* state.stack.current = &state.stack.first; \ */ -/* state.stack.first.prev = NULL; \ */ -/* state.stack.first.next = NULL; \ */ -/* state.stack.index = 0; \ */ -/* state.level = 1 */ - -#define NEW_STATE(state, nregs) \ -{ \ - int i; \ - for (i = 0; i < nregs; i++) \ - { \ - state.start[i] = NULL; \ - state.end[i] = NULL; \ - state.changed[i] = 0; \ - } \ - state.stack.current = &state.stack.first; \ - state.stack.first.prev = NULL; \ - state.stack.first.next = NULL; \ - state.stack.index = 0; \ - state.level = 1; \ - state.count = 0; \ - state.level = 0; \ - state.point = 0; \ -} - -/* Free any memory that might have been malloc'd */ - -#define FREE_STATE(state) \ -while(state.stack.first.next != NULL) \ -{ \ - state.stack.current = state.stack.first.next; \ - state.stack.first.next = state.stack.current->next; \ - free(state.stack.current); \ -} - -/* Discard the top 'count' stack items. */ - -#define STACK_DISCARD(stack, count, on_error) \ -stack.index -= count; \ -while (stack.index < 0) \ -{ \ - if (stack.current->prev == NULL) \ - on_error; \ - stack.current = stack.current->prev; \ - stack.index += STACK_PAGE_SIZE; \ -} - -/* Store a pointer to the previous item on the stack. Used to pop an - * item off of the stack. */ - -#define STACK_PREV(stack, top, on_error) \ -if (stack.index == 0) \ -{ \ - if (stack.current->prev == NULL) \ - on_error; \ - stack.current = stack.current->prev; \ - stack.index = STACK_PAGE_SIZE - 1; \ -} \ -else \ -{ \ - stack.index--; \ -} \ -top = &(stack.current->items[stack.index]) - -/* Store a pointer to the next item on the stack. Used to push an item - * on to the stack. */ - -#define STACK_NEXT(stack, top, on_error) \ -if (stack.index == STACK_PAGE_SIZE) \ -{ \ - if (stack.current->next == NULL) \ - { \ - stack.current->next = (item_page_t *)malloc(sizeof(item_page_t)); \ - if (stack.current->next == NULL) \ - on_error; \ - stack.current->next->prev = stack.current; \ - stack.current->next->next = NULL; \ - } \ - stack.current = stack.current->next; \ - stack.index = 0; \ -} \ -top = &(stack.current->items[stack.index++]) - -/* Store a pointer to the item that is 'count' items back in the - * stack. STACK_BACK(stack, top, 1, on_error) is equivalent to - * STACK_TOP(stack, top, on_error). */ - -#define STACK_BACK(stack, top, count, on_error) \ -{ \ - int index; \ - item_page_t *current; \ - current = stack.current; \ - index = stack.index - (count); \ - while (index < 0) \ - { \ - if (current->prev == NULL) \ - on_error; \ - current = current->prev; \ - index += STACK_PAGE_SIZE; \ - } \ - top = &(current->items[index]); \ -} - -/* Store a pointer to the top item on the stack. Execute the - * 'on_error' code if there are no items on the stack. */ - -#define STACK_TOP(stack, top, on_error) \ -if (stack.index == 0) \ -{ \ - if (stack.current->prev == NULL) \ - on_error; \ - top = &(stack.current->prev->items[STACK_PAGE_SIZE - 1]); \ -} \ -else \ -{ \ - top = &(stack.current->items[stack.index - 1]); \ -} - -/* Test to see if the stack is empty */ - -#define STACK_EMPTY(stack) ((stack.index == 0) && \ - (stack.current->prev == NULL)) - -/* Return the start of register 'reg' */ - -#define GET_REG_START(state, reg) (state.start[reg]) - -/* Return the end of register 'reg' */ - -#define GET_REG_END(state, reg) (state.end[reg]) - -/* Set the start of register 'reg'. If the state of the register needs - * saving, push it on the stack. */ - -#define SET_REG_START(state, reg, text, on_error) \ -if(state.changed[reg] < state.level) \ -{ \ - item_t *item; \ - STACK_NEXT(state.stack, item, on_error); \ - item->reg.num = reg; \ - item->reg.start = state.start[reg]; \ - item->reg.end = state.end[reg]; \ - item->reg.level = state.changed[reg]; \ - state.changed[reg] = state.level; \ - state.count++; \ -} \ -state.start[reg] = text - -/* Set the end of register 'reg'. If the state of the register needs - * saving, push it on the stack. */ - -#define SET_REG_END(state, reg, text, on_error) \ -if(state.changed[reg] < state.level) \ -{ \ - item_t *item; \ - STACK_NEXT(state.stack, item, on_error); \ - item->reg.num = reg; \ - item->reg.start = state.start[reg]; \ - item->reg.end = state.end[reg]; \ - item->reg.level = state.changed[reg]; \ - state.changed[reg] = state.level; \ - state.count++; \ -} \ -state.end[reg] = text - -#define PUSH_FAILURE(state, xcode, xtext, on_error) \ -{ \ - item_t *item; \ - STACK_NEXT(state.stack, item, on_error); \ - item->fail.code = xcode; \ - item->fail.text = xtext; \ - item->fail.count = state.count; \ - item->fail.level = state.level; \ - item->fail.phantom = 0; \ - state.count = 0; \ - state.level++; \ - state.point++; \ -} - -/* Update the last failure point with a new position in the text. */ - -#define UPDATE_FAILURE(state, xtext, on_error) \ -{ \ - item_t *item; \ - STACK_BACK(state.stack, item, state.count + 1, on_error); \ - if (!item->fail.phantom) \ - { \ - item_t *item2; \ - STACK_NEXT(state.stack, item2, on_error); \ - item2->fail.code = item->fail.code; \ - item2->fail.text = xtext; \ - item2->fail.count = state.count; \ - item2->fail.level = state.level; \ - item2->fail.phantom = 1; \ - state.count = 0; \ - state.level++; \ - state.point++; \ - } \ - else \ - { \ - STACK_DISCARD(state.stack, state.count, on_error); \ - STACK_TOP(state.stack, item, on_error); \ - item->fail.text = xtext; \ - state.count = 0; \ - state.level++; \ - } \ -} - -#define POP_FAILURE(state, xcode, xtext, on_empty, on_error) \ -{ \ - item_t *item; \ - do \ - { \ - while(state.count > 0) \ - { \ - STACK_PREV(state.stack, item, on_error); \ - state.start[item->reg.num] = item->reg.start; \ - state.end[item->reg.num] = item->reg.end; \ - state.changed[item->reg.num] = item->reg.level; \ - state.count--; \ - } \ - STACK_PREV(state.stack, item, on_empty); \ - xcode = item->fail.code; \ - xtext = item->fail.text; \ - state.count = item->fail.count; \ - state.level = item->fail.level; \ - state.point--; \ - } \ - while (item->fail.text == NULL); \ -} - -enum regexp_compiled_ops /* opcodes for compiled regexp */ -{ - Cend, /* end of pattern reached */ - Cbol, /* beginning of line */ - Ceol, /* end of line */ - Cset, /* character set. Followed by 32 bytes of set. */ - Cexact, /* followed by a byte to match */ - Canychar, /* matches any character except newline */ - Cstart_memory, /* set register start addr (followed by reg number) */ - Cend_memory, /* set register end addr (followed by reg number) */ - Cmatch_memory, /* match a duplicate of reg contents (regnum follows)*/ - Cjump, /* followed by two bytes (lsb,msb) of displacement. */ - Cstar_jump, /* will change to jump/update_failure_jump at runtime */ - Cfailure_jump, /* jump to addr on failure */ - Cupdate_failure_jump, /* update topmost failure point and jump */ - Cdummy_failure_jump, /* push a dummy failure point and jump */ - Cbegbuf, /* match at beginning of buffer */ - Cendbuf, /* match at end of buffer */ - Cwordbeg, /* match at beginning of word */ - Cwordend, /* match at end of word */ - Cwordbound, /* match if at word boundary */ - Cnotwordbound, /* match if not at word boundary */ - Csyntaxspec, /* matches syntax code (1 byte follows) */ - Cnotsyntaxspec, /* matches if syntax code does not match (1 byte follows) */ - Crepeat1 -}; - -enum regexp_syntax_op /* syntax codes for plain and quoted characters */ -{ - Rend, /* special code for end of regexp */ - Rnormal, /* normal character */ - Ranychar, /* any character except newline */ - Rquote, /* the quote character */ - Rbol, /* match beginning of line */ - Reol, /* match end of line */ - Roptional, /* match preceding expression optionally */ - Rstar, /* match preceding expr zero or more times */ - Rplus, /* match preceding expr one or more times */ - Ror, /* match either of alternatives */ - Ropenpar, /* opening parenthesis */ - Rclosepar, /* closing parenthesis */ - Rmemory, /* match memory register */ - Rextended_memory, /* \vnn to match registers 10-99 */ - Ropenset, /* open set. Internal syntax hard-coded below. */ - /* the following are gnu extensions to "normal" regexp syntax */ - Rbegbuf, /* beginning of buffer */ - Rendbuf, /* end of buffer */ - Rwordchar, /* word character */ - Rnotwordchar, /* not word character */ - Rwordbeg, /* beginning of word */ - Rwordend, /* end of word */ - Rwordbound, /* word bound */ - Rnotwordbound, /* not word bound */ - Rnum_ops -}; - -static int re_compile_initialized = 0; -static int regexp_syntax = 0; -int re_syntax = 0; /* Exported copy of regexp_syntax */ -static unsigned char regexp_plain_ops[256]; -static unsigned char regexp_quoted_ops[256]; -static unsigned char regexp_precedences[Rnum_ops]; -static int regexp_context_indep_ops; -static int regexp_ansi_sequences; - -#define NUM_LEVELS 5 /* number of precedence levels in use */ -#define MAX_NESTING 100 /* max nesting level of operators */ - -#define SYNTAX(ch) re_syntax_table[(unsigned char)(ch)] - -unsigned char re_syntax_table[256]; - -void re_compile_initialize(void) -{ - int a; - - static int syntax_table_inited = 0; - - if (!syntax_table_inited) - { - syntax_table_inited = 1; - memset(re_syntax_table, 0, 256); - for (a = 'a'; a <= 'z'; a++) - re_syntax_table[a] = Sword; - for (a = 'A'; a <= 'Z'; a++) - re_syntax_table[a] = Sword; - for (a = '0'; a <= '9'; a++) - re_syntax_table[a] = Sword | Sdigit | Shexdigit; - for (a = '0'; a <= '7'; a++) - re_syntax_table[a] |= Soctaldigit; - for (a = 'A'; a <= 'F'; a++) - re_syntax_table[a] |= Shexdigit; - for (a = 'a'; a <= 'f'; a++) - re_syntax_table[a] |= Shexdigit; - re_syntax_table['_'] = Sword; - for (a = 9; a <= 13; a++) - re_syntax_table[a] = Swhitespace; - re_syntax_table[' '] = Swhitespace; - } - re_compile_initialized = 1; - for (a = 0; a < 256; a++) - { - regexp_plain_ops[a] = Rnormal; - regexp_quoted_ops[a] = Rnormal; - } - for (a = '0'; a <= '9'; a++) - regexp_quoted_ops[a] = Rmemory; - regexp_plain_ops['\134'] = Rquote; - if (regexp_syntax & RE_NO_BK_PARENS) - { - regexp_plain_ops['('] = Ropenpar; - regexp_plain_ops[')'] = Rclosepar; - } - else - { - regexp_quoted_ops['('] = Ropenpar; - regexp_quoted_ops[')'] = Rclosepar; - } - if (regexp_syntax & RE_NO_BK_VBAR) - regexp_plain_ops['\174'] = Ror; - else - regexp_quoted_ops['\174'] = Ror; - regexp_plain_ops['*'] = Rstar; - if (regexp_syntax & RE_BK_PLUS_QM) - { - regexp_quoted_ops['+'] = Rplus; - regexp_quoted_ops['?'] = Roptional; - } - else - { - regexp_plain_ops['+'] = Rplus; - regexp_plain_ops['?'] = Roptional; - } - if (regexp_syntax & RE_NEWLINE_OR) - regexp_plain_ops['\n'] = Ror; - regexp_plain_ops['\133'] = Ropenset; - regexp_plain_ops['\136'] = Rbol; - regexp_plain_ops['$'] = Reol; - regexp_plain_ops['.'] = Ranychar; - if (!(regexp_syntax & RE_NO_GNU_EXTENSIONS)) - { - regexp_quoted_ops['w'] = Rwordchar; - regexp_quoted_ops['W'] = Rnotwordchar; - regexp_quoted_ops['<'] = Rwordbeg; - regexp_quoted_ops['>'] = Rwordend; - regexp_quoted_ops['b'] = Rwordbound; - regexp_quoted_ops['B'] = Rnotwordbound; - regexp_quoted_ops['`'] = Rbegbuf; - regexp_quoted_ops['\''] = Rendbuf; - } - if (regexp_syntax & RE_ANSI_HEX) - regexp_quoted_ops['v'] = Rextended_memory; - for (a = 0; a < Rnum_ops; a++) - regexp_precedences[a] = 4; - if (regexp_syntax & RE_TIGHT_VBAR) - { - regexp_precedences[Ror] = 3; - regexp_precedences[Rbol] = 2; - regexp_precedences[Reol] = 2; - } - else - { - regexp_precedences[Ror] = 2; - regexp_precedences[Rbol] = 3; - regexp_precedences[Reol] = 3; - } - regexp_precedences[Rclosepar] = 1; - regexp_precedences[Rend] = 0; - regexp_context_indep_ops = (regexp_syntax & RE_CONTEXT_INDEP_OPS) != 0; - regexp_ansi_sequences = (regexp_syntax & RE_ANSI_HEX) != 0; -} - -int re_set_syntax(int syntax) -{ - int ret; - - ret = regexp_syntax; - regexp_syntax = syntax; - re_syntax = syntax; /* Exported copy */ - re_compile_initialize(); - return ret; -} - -static int hex_char_to_decimal(int ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - if (ch >= 'a' && ch <= 'f') - return ch - 'a' + 10; - if (ch >= 'A' && ch <= 'F') - return ch - 'A' + 10; - return 16; -} - -static void re_compile_fastmap_aux(unsigned char *code, int pos, - unsigned char *visited, - unsigned char *can_be_null, - unsigned char *fastmap) -{ - int a; - int b; - int syntaxcode; - - if (visited[pos]) - return; /* we have already been here */ - visited[pos] = 1; - for (;;) - switch (code[pos++]) { - case Cend: - { - *can_be_null = 1; - return; - } - case Cbol: - case Cbegbuf: - case Cendbuf: - case Cwordbeg: - case Cwordend: - case Cwordbound: - case Cnotwordbound: - { - for (a = 0; a < 256; a++) - fastmap[a] = 1; - break; - } - case Csyntaxspec: - { - syntaxcode = code[pos++]; - for (a = 0; a < 256; a++) - if (SYNTAX(a) & syntaxcode) - fastmap[a] = 1; - return; - } - case Cnotsyntaxspec: - { - syntaxcode = code[pos++]; - for (a = 0; a < 256; a++) - if (!(SYNTAX(a) & syntaxcode) ) - fastmap[a] = 1; - return; - } - case Ceol: - { - fastmap['\n'] = 1; - if (*can_be_null == 0) - *can_be_null = 2; /* can match null, but only at end of buffer*/ - return; - } - case Cset: - { - for (a = 0; a < 256/8; a++) - if (code[pos + a] != 0) - for (b = 0; b < 8; b++) - if (code[pos + a] & (1 << b)) - fastmap[(a << 3) + b] = 1; - pos += 256/8; - return; - } - case Cexact: - { - fastmap[(unsigned char)code[pos]] = 1; - return; - } - case Canychar: - { - for (a = 0; a < 256; a++) - if (a != '\n') - fastmap[a] = 1; - return; - } - case Cstart_memory: - case Cend_memory: - { - pos++; - break; - } - case Cmatch_memory: - { - for (a = 0; a < 256; a++) - fastmap[a] = 1; - *can_be_null = 1; - return; - } - case Cjump: - case Cdummy_failure_jump: - case Cupdate_failure_jump: - case Cstar_jump: - { - a = (unsigned char)code[pos++]; - a |= (unsigned char)code[pos++] << 8; - pos += (int)SHORT(a); - if (visited[pos]) - { - /* argh... the regexp contains empty loops. This is not - good, as this may cause a failure stack overflow when - matching. Oh well. */ - /* this path leads nowhere; pursue other paths. */ - return; - } - visited[pos] = 1; - break; - } - case Cfailure_jump: - { - a = (unsigned char)code[pos++]; - a |= (unsigned char)code[pos++] << 8; - a = pos + (int)SHORT(a); - re_compile_fastmap_aux(code, a, visited, can_be_null, fastmap); - break; - } - case Crepeat1: - { - pos += 2; - break; - } - default: - { - PyErr_SetString(PyExc_SystemError, "Unknown regex opcode: memory corrupted?"); - return; - /*NOTREACHED*/ - } - } -} - -static int re_do_compile_fastmap(unsigned char *buffer, int used, int pos, - unsigned char *can_be_null, - unsigned char *fastmap) -{ - unsigned char small_visited[512], *visited; - - if (used <= sizeof(small_visited)) - visited = small_visited; - else - { - visited = malloc(used); - if (!visited) - return 0; - } - *can_be_null = 0; - memset(fastmap, 0, 256); - memset(visited, 0, used); - re_compile_fastmap_aux(buffer, pos, visited, can_be_null, fastmap); - if (visited != small_visited) - free(visited); - return 1; -} - -void re_compile_fastmap(regexp_t bufp) -{ - if (!bufp->fastmap || bufp->fastmap_accurate) - return; - assert(bufp->used > 0); - if (!re_do_compile_fastmap(bufp->buffer, - bufp->used, - 0, - &bufp->can_be_null, - bufp->fastmap)) - return; - if (PyErr_Occurred()) return; - if (bufp->buffer[0] == Cbol) - bufp->anchor = 1; /* begline */ - else - if (bufp->buffer[0] == Cbegbuf) - bufp->anchor = 2; /* begbuf */ - else - bufp->anchor = 0; /* none */ - bufp->fastmap_accurate = 1; -} - -/* - * star is coded as: - * 1: failure_jump 2 - * ... code for operand of star - * star_jump 1 - * 2: ... code after star - * - * We change the star_jump to update_failure_jump if we can determine - * that it is safe to do so; otherwise we change it to an ordinary - * jump. - * - * plus is coded as - * - * jump 2 - * 1: failure_jump 3 - * 2: ... code for operand of plus - * star_jump 1 - * 3: ... code after plus - * - * For star_jump considerations this is processed identically to star. - * - */ - -static int re_optimize_star_jump(regexp_t bufp, unsigned char *code) -{ - unsigned char map[256]; - unsigned char can_be_null; - unsigned char *p1; - unsigned char *p2; - unsigned char ch; - int a; - int b; - int num_instructions = 0; - - a = (unsigned char)*code++; - a |= (unsigned char)*code++ << 8; - a = (int)SHORT(a); - - p1 = code + a + 3; /* skip the failure_jump */ - /* Check that the jump is within the pattern */ - if (p1buffer || bufp->buffer+bufp->usedbuffer, bufp->used, - (int)(p2 - bufp->buffer), - &can_be_null, map)) - goto make_normal_jump; - - /* If we might introduce a new update point inside the - * loop, we can't optimize because then update_jump would - * update a wrong failure point. Thus we have to be - * quite careful here. - */ - - /* loop until we find something that consumes a character */ - loop_p1: - num_instructions++; - switch (*p1++) - { - case Cbol: - case Ceol: - case Cbegbuf: - case Cendbuf: - case Cwordbeg: - case Cwordend: - case Cwordbound: - case Cnotwordbound: - { - goto loop_p1; - } - case Cstart_memory: - case Cend_memory: - { - p1++; - goto loop_p1; - } - case Cexact: - { - ch = (unsigned char)*p1++; - if (map[(int)ch]) - goto make_normal_jump; - break; - } - case Canychar: - { - for (b = 0; b < 256; b++) - if (b != '\n' && map[b]) - goto make_normal_jump; - break; - } - case Cset: - { - for (b = 0; b < 256; b++) - if ((p1[b >> 3] & (1 << (b & 7))) && map[b]) - goto make_normal_jump; - p1 += 256/8; - break; - } - default: - { - goto make_normal_jump; - } - } - /* now we know that we can't backtrack. */ - while (p1 != p2 - 3) - { - num_instructions++; - switch (*p1++) - { - case Cend: - { - return 0; - } - case Cbol: - case Ceol: - case Canychar: - case Cbegbuf: - case Cendbuf: - case Cwordbeg: - case Cwordend: - case Cwordbound: - case Cnotwordbound: - { - break; - } - case Cset: - { - p1 += 256/8; - break; - } - case Cexact: - case Cstart_memory: - case Cend_memory: - case Cmatch_memory: - case Csyntaxspec: - case Cnotsyntaxspec: - { - p1++; - break; - } - case Cjump: - case Cstar_jump: - case Cfailure_jump: - case Cupdate_failure_jump: - case Cdummy_failure_jump: - { - goto make_normal_jump; - } - default: - { - return 0; - } - } - } - - /* make_update_jump: */ - code -= 3; - a += 3; /* jump to after the Cfailure_jump */ - code[0] = Cupdate_failure_jump; - code[1] = a & 0xff; - code[2] = a >> 8; - if (num_instructions > 1) - return 1; - assert(num_instructions == 1); - /* if the only instruction matches a single character, we can do - * better */ - p1 = code + 3 + a; /* start of sole instruction */ - if (*p1 == Cset || *p1 == Cexact || *p1 == Canychar || - *p1 == Csyntaxspec || *p1 == Cnotsyntaxspec) - code[0] = Crepeat1; - return 1; - - make_normal_jump: - code -= 3; - *code = Cjump; - return 1; -} - -static int re_optimize(regexp_t bufp) -{ - unsigned char *code; - - code = bufp->buffer; - - while(1) - { - switch (*code++) - { - case Cend: - { - return 1; - } - case Canychar: - case Cbol: - case Ceol: - case Cbegbuf: - case Cendbuf: - case Cwordbeg: - case Cwordend: - case Cwordbound: - case Cnotwordbound: - { - break; - } - case Cset: - { - code += 256/8; - break; - } - case Cexact: - case Cstart_memory: - case Cend_memory: - case Cmatch_memory: - case Csyntaxspec: - case Cnotsyntaxspec: - { - code++; - break; - } - case Cstar_jump: - { - if (!re_optimize_star_jump(bufp, code)) - { - return 0; - } - /* fall through */ - } - case Cupdate_failure_jump: - case Cjump: - case Cdummy_failure_jump: - case Cfailure_jump: - case Crepeat1: - { - code += 2; - break; - } - default: - { - return 0; - } - } - } -} - -#define NEXTCHAR(var) \ -{ \ - if (pos >= size) \ - goto ends_prematurely; \ - (var) = regex[pos]; \ - pos++; \ -} - -#define ALLOC(amount) \ -{ \ - if (pattern_offset+(amount) > alloc) \ - { \ - alloc += 256 + (amount); \ - pattern = realloc(pattern, alloc); \ - if (!pattern) \ - goto out_of_memory; \ - } \ -} - -#define STORE(ch) pattern[pattern_offset++] = (ch) - -#define CURRENT_LEVEL_START (starts[starts_base + current_level]) - -#define SET_LEVEL_START starts[starts_base + current_level] = pattern_offset - -#define PUSH_LEVEL_STARTS \ -if (starts_base < (MAX_NESTING-1)*NUM_LEVELS) \ - starts_base += NUM_LEVELS; \ -else \ - goto too_complex \ - -#define POP_LEVEL_STARTS starts_base -= NUM_LEVELS - -#define PUT_ADDR(offset,addr) \ -{ \ - int disp = (addr) - (offset) - 2; \ - pattern[(offset)] = disp & 0xff; \ - pattern[(offset)+1] = (disp>>8) & 0xff; \ -} - -#define INSERT_JUMP(pos,type,addr) \ -{ \ - int a, p = (pos), t = (type), ad = (addr); \ - for (a = pattern_offset - 1; a >= p; a--) \ - pattern[a + 3] = pattern[a]; \ - pattern[p] = t; \ - PUT_ADDR(p+1,ad); \ - pattern_offset += 3; \ -} - -#define SETBIT(buf,offset,bit) (buf)[(offset)+(bit)/8] |= (1<<((bit) & 7)) - -#define SET_FIELDS \ -{ \ - bufp->allocated = alloc; \ - bufp->buffer = pattern; \ - bufp->used = pattern_offset; \ -} - -#define GETHEX(var) \ -{ \ - unsigned char gethex_ch, gethex_value; \ - NEXTCHAR(gethex_ch); \ - gethex_value = hex_char_to_decimal(gethex_ch); \ - if (gethex_value == 16) \ - goto hex_error; \ - NEXTCHAR(gethex_ch); \ - gethex_ch = hex_char_to_decimal(gethex_ch); \ - if (gethex_ch == 16) \ - goto hex_error; \ - (var) = gethex_value * 16 + gethex_ch; \ -} - -#define ANSI_TRANSLATE(ch) \ -{ \ - switch (ch) \ - { \ - case 'a': \ - case 'A': \ - { \ - ch = 7; /* audible bell */ \ - break; \ - } \ - case 'b': \ - case 'B': \ - { \ - ch = 8; /* backspace */ \ - break; \ - } \ - case 'f': \ - case 'F': \ - { \ - ch = 12; /* form feed */ \ - break; \ - } \ - case 'n': \ - case 'N': \ - { \ - ch = 10; /* line feed */ \ - break; \ - } \ - case 'r': \ - case 'R': \ - { \ - ch = 13; /* carriage return */ \ - break; \ - } \ - case 't': \ - case 'T': \ - { \ - ch = 9; /* tab */ \ - break; \ - } \ - case 'v': \ - case 'V': \ - { \ - ch = 11; /* vertical tab */ \ - break; \ - } \ - case 'x': /* hex code */ \ - case 'X': \ - { \ - GETHEX(ch); \ - break; \ - } \ - default: \ - { \ - /* other characters passed through */ \ - if (translate) \ - ch = translate[(unsigned char)ch]; \ - break; \ - } \ - } \ -} - -char *re_compile_pattern(unsigned char *regex, int size, regexp_t bufp) -{ - int a; - int pos; - int op; - int current_level; - int level; - int opcode; - int pattern_offset = 0, alloc; - int starts[NUM_LEVELS * MAX_NESTING]; - int starts_base; - int future_jumps[MAX_NESTING]; - int num_jumps; - unsigned char ch = '\0'; - unsigned char *pattern; - unsigned char *translate; - int next_register; - int paren_depth; - int num_open_registers; - int open_registers[RE_NREGS]; - int beginning_context; - - if (!re_compile_initialized) - re_compile_initialize(); - bufp->used = 0; - bufp->fastmap_accurate = 0; - bufp->uses_registers = 1; - bufp->num_registers = 1; - translate = bufp->translate; - pattern = bufp->buffer; - alloc = bufp->allocated; - if (alloc == 0 || pattern == NULL) - { - alloc = 256; - pattern = malloc(alloc); - if (!pattern) - goto out_of_memory; - } - pattern_offset = 0; - starts_base = 0; - num_jumps = 0; - current_level = 0; - SET_LEVEL_START; - num_open_registers = 0; - next_register = 1; - paren_depth = 0; - beginning_context = 1; - op = -1; - /* we use Rend dummy to ensure that pending jumps are updated - (due to low priority of Rend) before exiting the loop. */ - pos = 0; - while (op != Rend) - { - if (pos >= size) - op = Rend; - else - { - NEXTCHAR(ch); - if (translate) - ch = translate[(unsigned char)ch]; - op = regexp_plain_ops[(unsigned char)ch]; - if (op == Rquote) - { - NEXTCHAR(ch); - op = regexp_quoted_ops[(unsigned char)ch]; - if (op == Rnormal && regexp_ansi_sequences) - ANSI_TRANSLATE(ch); - } - } - level = regexp_precedences[op]; - /* printf("ch='%c' op=%d level=%d current_level=%d - curlevstart=%d\n", ch, op, level, current_level, - CURRENT_LEVEL_START); */ - if (level > current_level) - { - for (current_level++; current_level < level; current_level++) - SET_LEVEL_START; - SET_LEVEL_START; - } - else - if (level < current_level) - { - current_level = level; - for (;num_jumps > 0 && - future_jumps[num_jumps-1] >= CURRENT_LEVEL_START; - num_jumps--) - PUT_ADDR(future_jumps[num_jumps-1], pattern_offset); - } - switch (op) - { - case Rend: - { - break; - } - case Rnormal: - { - normal_char: - opcode = Cexact; - store_opcode_and_arg: /* opcode & ch must be set */ - SET_LEVEL_START; - ALLOC(2); - STORE(opcode); - STORE(ch); - break; - } - case Ranychar: - { - opcode = Canychar; - store_opcode: - SET_LEVEL_START; - ALLOC(1); - STORE(opcode); - break; - } - case Rquote: - { - Py_FatalError("Rquote"); - /*NOTREACHED*/ - } - case Rbol: - { - if (!beginning_context) { - if (regexp_context_indep_ops) - goto op_error; - else - goto normal_char; - } - opcode = Cbol; - goto store_opcode; - } - case Reol: - { - if (!((pos >= size) || - ((regexp_syntax & RE_NO_BK_VBAR) ? - (regex[pos] == '\174') : - (pos+1 < size && regex[pos] == '\134' && - regex[pos+1] == '\174')) || - ((regexp_syntax & RE_NO_BK_PARENS)? - (regex[pos] == ')'): - (pos+1 < size && regex[pos] == '\134' && - regex[pos+1] == ')')))) { - if (regexp_context_indep_ops) - goto op_error; - else - goto normal_char; - } - opcode = Ceol; - goto store_opcode; - /* NOTREACHED */ - break; - } - case Roptional: - { - if (beginning_context) { - if (regexp_context_indep_ops) - goto op_error; - else - goto normal_char; - } - if (CURRENT_LEVEL_START == pattern_offset) - break; /* ignore empty patterns for ? */ - ALLOC(3); - INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, - pattern_offset + 3); - break; - } - case Rstar: - case Rplus: - { - if (beginning_context) { - if (regexp_context_indep_ops) - goto op_error; - else - goto normal_char; - } - if (CURRENT_LEVEL_START == pattern_offset) - break; /* ignore empty patterns for + and * */ - ALLOC(9); - INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, - pattern_offset + 6); - INSERT_JUMP(pattern_offset, Cstar_jump, CURRENT_LEVEL_START); - if (op == Rplus) /* jump over initial failure_jump */ - INSERT_JUMP(CURRENT_LEVEL_START, Cdummy_failure_jump, - CURRENT_LEVEL_START + 6); - break; - } - case Ror: - { - ALLOC(6); - INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump, - pattern_offset + 6); - if (num_jumps >= MAX_NESTING) - goto too_complex; - STORE(Cjump); - future_jumps[num_jumps++] = pattern_offset; - STORE(0); - STORE(0); - SET_LEVEL_START; - break; - } - case Ropenpar: - { - SET_LEVEL_START; - if (next_register < RE_NREGS) - { - bufp->uses_registers = 1; - ALLOC(2); - STORE(Cstart_memory); - STORE(next_register); - open_registers[num_open_registers++] = next_register; - bufp->num_registers++; - next_register++; - } - paren_depth++; - PUSH_LEVEL_STARTS; - current_level = 0; - SET_LEVEL_START; - break; - } - case Rclosepar: - { - if (paren_depth <= 0) - goto parenthesis_error; - POP_LEVEL_STARTS; - current_level = regexp_precedences[Ropenpar]; - paren_depth--; - if (paren_depth < num_open_registers) - { - bufp->uses_registers = 1; - ALLOC(2); - STORE(Cend_memory); - num_open_registers--; - STORE(open_registers[num_open_registers]); - } - break; - } - case Rmemory: - { - if (ch == '0') - goto bad_match_register; - assert(ch >= '0' && ch <= '9'); - bufp->uses_registers = 1; - opcode = Cmatch_memory; - ch -= '0'; - goto store_opcode_and_arg; - } - case Rextended_memory: - { - NEXTCHAR(ch); - if (ch < '0' || ch > '9') - goto bad_match_register; - NEXTCHAR(a); - if (a < '0' || a > '9') - goto bad_match_register; - ch = 10 * (a - '0') + ch - '0'; - if (ch == 0 || ch >= RE_NREGS) - goto bad_match_register; - bufp->uses_registers = 1; - opcode = Cmatch_memory; - goto store_opcode_and_arg; - } - case Ropenset: - { - int complement; - int prev; - int offset; - int range; - int firstchar; - - SET_LEVEL_START; - ALLOC(1+256/8); - STORE(Cset); - offset = pattern_offset; - for (a = 0; a < 256/8; a++) - STORE(0); - NEXTCHAR(ch); - if (translate) - ch = translate[(unsigned char)ch]; - if (ch == '\136') - { - complement = 1; - NEXTCHAR(ch); - if (translate) - ch = translate[(unsigned char)ch]; - } - else - complement = 0; - prev = -1; - range = 0; - firstchar = 1; - while (ch != '\135' || firstchar) - { - firstchar = 0; - if (regexp_ansi_sequences && ch == '\134') - { - NEXTCHAR(ch); - ANSI_TRANSLATE(ch); - } - if (range) - { - for (a = prev; a <= (int)ch; a++) - SETBIT(pattern, offset, a); - prev = -1; - range = 0; - } - else - if (prev != -1 && ch == '-') - range = 1; - else - { - SETBIT(pattern, offset, ch); - prev = ch; - } - NEXTCHAR(ch); - if (translate) - ch = translate[(unsigned char)ch]; - } - if (range) - SETBIT(pattern, offset, '-'); - if (complement) - { - for (a = 0; a < 256/8; a++) - pattern[offset+a] ^= 0xff; - } - break; - } - case Rbegbuf: - { - opcode = Cbegbuf; - goto store_opcode; - } - case Rendbuf: - { - opcode = Cendbuf; - goto store_opcode; - } - case Rwordchar: - { - opcode = Csyntaxspec; - ch = Sword; - goto store_opcode_and_arg; - } - case Rnotwordchar: - { - opcode = Cnotsyntaxspec; - ch = Sword; - goto store_opcode_and_arg; - } - case Rwordbeg: - { - opcode = Cwordbeg; - goto store_opcode; - } - case Rwordend: - { - opcode = Cwordend; - goto store_opcode; - } - case Rwordbound: - { - opcode = Cwordbound; - goto store_opcode; - } - case Rnotwordbound: - { - opcode = Cnotwordbound; - goto store_opcode; - } - default: - { - abort(); - } - } - beginning_context = (op == Ropenpar || op == Ror); - } - if (starts_base != 0) - goto parenthesis_error; - assert(num_jumps == 0); - ALLOC(1); - STORE(Cend); - SET_FIELDS; - if(!re_optimize(bufp)) - return "Optimization error"; - return NULL; - - op_error: - SET_FIELDS; - return "Badly placed special character"; - - bad_match_register: - SET_FIELDS; - return "Bad match register number"; - - hex_error: - SET_FIELDS; - return "Bad hexadecimal number"; - - parenthesis_error: - SET_FIELDS; - return "Badly placed parenthesis"; - - out_of_memory: - SET_FIELDS; - return "Out of memory"; - - ends_prematurely: - SET_FIELDS; - return "Regular expression ends prematurely"; - - too_complex: - SET_FIELDS; - return "Regular expression too complex"; -} - -#undef CHARAT -#undef NEXTCHAR -#undef GETHEX -#undef ALLOC -#undef STORE -#undef CURRENT_LEVEL_START -#undef SET_LEVEL_START -#undef PUSH_LEVEL_STARTS -#undef POP_LEVEL_STARTS -#undef PUT_ADDR -#undef INSERT_JUMP -#undef SETBIT -#undef SET_FIELDS - -#define PREFETCH if (text == textend) goto fail - -#define NEXTCHAR(var) \ -PREFETCH; \ -var = (unsigned char)*text++; \ -if (translate) \ - var = translate[var] - -int re_match(regexp_t bufp, unsigned char *string, int size, int pos, - regexp_registers_t old_regs) -{ - unsigned char *code; - unsigned char *translate; - unsigned char *text; - unsigned char *textstart; - unsigned char *textend; - int a; - int b; - int ch; - int reg; - int match_end; - unsigned char *regstart; - unsigned char *regend; - int regsize; - match_state state; - - assert(pos >= 0 && size >= 0); - assert(pos <= size); - - text = string + pos; - textstart = string; - textend = string + size; - - code = bufp->buffer; - - translate = bufp->translate; - - NEW_STATE(state, bufp->num_registers); - - continue_matching: - switch (*code++) - { - case Cend: - { - match_end = text - textstart; - if (old_regs) - { - old_regs->start[0] = pos; - old_regs->end[0] = match_end; - if (!bufp->uses_registers) - { - for (a = 1; a < RE_NREGS; a++) - { - old_regs->start[a] = -1; - old_regs->end[a] = -1; - } - } - else - { - for (a = 1; a < bufp->num_registers; a++) - { - if ((GET_REG_START(state, a) == NULL) || - (GET_REG_END(state, a) == NULL)) - { - old_regs->start[a] = -1; - old_regs->end[a] = -1; - continue; - } - old_regs->start[a] = GET_REG_START(state, a) - textstart; - old_regs->end[a] = GET_REG_END(state, a) - textstart; - } - for (; a < RE_NREGS; a++) - { - old_regs->start[a] = -1; - old_regs->end[a] = -1; - } - } - } - FREE_STATE(state); - return match_end - pos; - } - case Cbol: - { - if (text == textstart || text[-1] == '\n') - goto continue_matching; - goto fail; - } - case Ceol: - { - if (text == textend || *text == '\n') - goto continue_matching; - goto fail; - } - case Cset: - { - NEXTCHAR(ch); - if (code[ch/8] & (1<<(ch & 7))) - { - code += 256/8; - goto continue_matching; - } - goto fail; - } - case Cexact: - { - NEXTCHAR(ch); - if (ch != (unsigned char)*code++) - goto fail; - goto continue_matching; - } - case Canychar: - { - NEXTCHAR(ch); - if (ch == '\n') - goto fail; - goto continue_matching; - } - case Cstart_memory: - { - reg = *code++; - SET_REG_START(state, reg, text, goto error); - goto continue_matching; - } - case Cend_memory: - { - reg = *code++; - SET_REG_END(state, reg, text, goto error); - goto continue_matching; - } - case Cmatch_memory: - { - reg = *code++; - regstart = GET_REG_START(state, reg); - regend = GET_REG_END(state, reg); - if ((regstart == NULL) || (regend == NULL)) - goto fail; /* or should we just match nothing? */ - regsize = regend - regstart; - - if (regsize > (textend - text)) - goto fail; - if(translate) - { - for (; regstart < regend; regstart++, text++) - if (translate[*regstart] != translate[*text]) - goto fail; - } - else - for (; regstart < regend; regstart++, text++) - if (*regstart != *text) - goto fail; - goto continue_matching; - } - case Cupdate_failure_jump: - { - UPDATE_FAILURE(state, text, goto error); - /* fall to next case */ - } - /* treat Cstar_jump just like Cjump if it hasn't been optimized */ - case Cstar_jump: - case Cjump: - { - a = (unsigned char)*code++; - a |= (unsigned char)*code++ << 8; - code += (int)SHORT(a); - if (codebuffer || bufp->buffer+bufp->usedbuffer || bufp->buffer+bufp->used < failuredest) { - PyErr_SetString(PyExc_SystemError, "Regex VM jump out of bounds (Cdummy_failure_jump failuredest)"); - FREE_STATE(state); - return -2; - } - PUSH_FAILURE(state, failuredest, NULL, goto error); - code += a; - if (codebuffer || bufp->buffer+bufp->used < code) { - PyErr_SetString(PyExc_SystemError, "Regex VM jump out of bounds (Cdummy_failure_jump code)"); - FREE_STATE(state); - return -2; - } - goto continue_matching; - } - case Cfailure_jump: - { - a = (unsigned char)*code++; - a |= (unsigned char)*code++ << 8; - a = (int)SHORT(a); - if (code+abuffer || bufp->buffer+bufp->used < code+a) { - PyErr_SetString(PyExc_SystemError, "Regex VM jump out of bounds (Cfailure_jump)"); - FREE_STATE(state); - return -2; - } - PUSH_FAILURE(state, code + a, text, goto error); - goto continue_matching; - } - case Crepeat1: - { - unsigned char *pinst; - a = (unsigned char)*code++; - a |= (unsigned char)*code++ << 8; - a = (int)SHORT(a); - pinst = code + a; - if (pinstbuffer || bufp->buffer+bufp->used */ - } - case Cbegbuf: - { - if (text == textstart) - goto continue_matching; - goto fail; - } - case Cendbuf: - { - if (text == textend) - goto continue_matching; - goto fail; - } - case Cwordbeg: - { - if (text == textend) - goto fail; - if (!(SYNTAX(*text) & Sword)) - goto fail; - if (text == textstart) - goto continue_matching; - if (!(SYNTAX(text[-1]) & Sword)) - goto continue_matching; - goto fail; - } - case Cwordend: - { - if (text == textstart) - goto fail; - if (!(SYNTAX(text[-1]) & Sword)) - goto fail; - if (text == textend) - goto continue_matching; - if (!(SYNTAX(*text) & Sword)) - goto continue_matching; - goto fail; - } - case Cwordbound: - { - /* Note: as in gnu regexp, this also matches at the - * beginning and end of buffer. */ - - if (text == textstart || text == textend) - goto continue_matching; - if ((SYNTAX(text[-1]) & Sword) ^ (SYNTAX(*text) & Sword)) - goto continue_matching; - goto fail; - } - case Cnotwordbound: - { - /* Note: as in gnu regexp, this never matches at the - * beginning and end of buffer. */ - if (text == textstart || text == textend) - goto fail; - if (!((SYNTAX(text[-1]) & Sword) ^ (SYNTAX(*text) & Sword))) - goto continue_matching; - goto fail; - } - case Csyntaxspec: - { - NEXTCHAR(ch); - if (!(SYNTAX(ch) & (unsigned char)*code++)) - goto fail; - goto continue_matching; - } - case Cnotsyntaxspec: - { - NEXTCHAR(ch); - if (SYNTAX(ch) & (unsigned char)*code++) - goto fail; - goto continue_matching; - } - default: - { - FREE_STATE(state); - PyErr_SetString(PyExc_SystemError, "Unknown regex opcode: memory corrupted?"); - return -2; - /*NOTREACHED*/ - } - } - - - -#if 0 /* This line is never reached --Guido */ - abort(); -#endif - /* - *NOTREACHED - */ - - /* Using "break;" in the above switch statement is equivalent to "goto fail;" */ - fail: - POP_FAILURE(state, code, text, goto done_matching, goto error); - goto continue_matching; - - done_matching: -/* if(translated != NULL) */ -/* free(translated); */ - FREE_STATE(state); - return -1; - - error: -/* if (translated != NULL) */ -/* free(translated); */ - FREE_STATE(state); - return -2; -} - - -#undef PREFETCH -#undef NEXTCHAR - -int re_search(regexp_t bufp, unsigned char *string, int size, int pos, - int range, regexp_registers_t regs) -{ - unsigned char *fastmap; - unsigned char *translate; - unsigned char *text; - unsigned char *partstart; - unsigned char *partend; - int dir; - int ret; - unsigned char anchor; - - assert(size >= 0 && pos >= 0); - assert(pos + range >= 0 && pos + range <= size); /* Bugfix by ylo */ - - fastmap = bufp->fastmap; - translate = bufp->translate; - if (fastmap && !bufp->fastmap_accurate) { - re_compile_fastmap(bufp); - if (PyErr_Occurred()) return -2; - } - - anchor = bufp->anchor; - if (bufp->can_be_null == 1) /* can_be_null == 2: can match null at eob */ - fastmap = NULL; - - if (range < 0) - { - dir = -1; - range = -range; - } - else - dir = 1; - - if (anchor == 2) { - if (pos != 0) - return -1; - else - range = 0; - } - - for (; range >= 0; range--, pos += dir) - { - if (fastmap) - { - if (dir == 1) - { /* searching forwards */ - - text = string + pos; - partend = string + size; - partstart = text; - if (translate) - while (text != partend && - !fastmap[(unsigned char) translate[(unsigned char)*text]]) - text++; - else - while (text != partend && !fastmap[(unsigned char)*text]) - text++; - pos += text - partstart; - range -= text - partstart; - if (pos == size && bufp->can_be_null == 0) - return -1; - } - else - { /* searching backwards */ - text = string + pos; - partstart = string + pos - range; - partend = text; - if (translate) - while (text != partstart && - !fastmap[(unsigned char) - translate[(unsigned char)*text]]) - text--; - else - while (text != partstart && - !fastmap[(unsigned char)*text]) - text--; - pos -= partend - text; - range -= partend - text; - } - } - if (anchor == 1) - { /* anchored to begline */ - if (pos > 0 && (string[pos - 1] != '\n')) - continue; - } - assert(pos >= 0 && pos <= size); - ret = re_match(bufp, string, size, pos, regs); - if (ret >= 0) - return pos; - if (ret == -2) - return -2; - } - return -1; -} - -/* -** Local Variables: -** mode: c -** c-file-style: "python" -** End: -*/ Deleted: /python/trunk/Modules/regexpr.h ============================================================================== --- /python/trunk/Modules/regexpr.h Thu Mar 16 07:50:13 2006 +++ (empty file) @@ -1,155 +0,0 @@ -/* - * -*- mode: c-mode; c-file-style: python -*- - */ - -#ifndef Py_REGEXPR_H -#define Py_REGEXPR_H -#ifdef __cplusplus -extern "C" { -#endif - -/* - * regexpr.h - * - * Author: Tatu Ylonen - * - * Copyright (c) 1991 Tatu Ylonen, Espoo, Finland - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies. This - * software is provided "as is" without express or implied warranty. - * - * Created: Thu Sep 26 17:15:36 1991 ylo - * Last modified: Mon Nov 4 15:49:46 1991 ylo - */ - -/* $Id$ */ - -#ifndef REGEXPR_H -#define REGEXPR_H - -#define RE_NREGS 100 /* number of registers available */ - -typedef struct re_pattern_buffer -{ - unsigned char *buffer; /* compiled pattern */ - int allocated; /* allocated size of compiled pattern */ - int used; /* actual length of compiled pattern */ - unsigned char *fastmap; /* fastmap[ch] is true if ch can start pattern */ - unsigned char *translate; /* translation to apply during compilation/matching */ - unsigned char fastmap_accurate; /* true if fastmap is valid */ - unsigned char can_be_null; /* true if can match empty string */ - unsigned char uses_registers; /* registers are used and need to be initialized */ - int num_registers; /* number of registers used */ - unsigned char anchor; /* anchor: 0=none 1=begline 2=begbuf */ -} *regexp_t; - -typedef struct re_registers -{ - int start[RE_NREGS]; /* start offset of region */ - int end[RE_NREGS]; /* end offset of region */ -} *regexp_registers_t; - -/* bit definitions for syntax */ -#define RE_NO_BK_PARENS 1 /* no quoting for parentheses */ -#define RE_NO_BK_VBAR 2 /* no quoting for vertical bar */ -#define RE_BK_PLUS_QM 4 /* quoting needed for + and ? */ -#define RE_TIGHT_VBAR 8 /* | binds tighter than ^ and $ */ -#define RE_NEWLINE_OR 16 /* treat newline as or */ -#define RE_CONTEXT_INDEP_OPS 32 /* ^$?*+ are special in all contexts */ -#define RE_ANSI_HEX 64 /* ansi sequences (\n etc) and \xhh */ -#define RE_NO_GNU_EXTENSIONS 128 /* no gnu extensions */ - -/* definitions for some common regexp styles */ -#define RE_SYNTAX_AWK (RE_NO_BK_PARENS|RE_NO_BK_VBAR|RE_CONTEXT_INDEP_OPS) -#define RE_SYNTAX_EGREP (RE_SYNTAX_AWK|RE_NEWLINE_OR) -#define RE_SYNTAX_GREP (RE_BK_PLUS_QM|RE_NEWLINE_OR) -#define RE_SYNTAX_EMACS 0 - -#define Sword 1 -#define Swhitespace 2 -#define Sdigit 4 -#define Soctaldigit 8 -#define Shexdigit 16 - -/* Rename all exported symbols to avoid conflicts with similarly named - symbols in some systems' standard C libraries... */ - -#define re_syntax _Py_re_syntax -#define re_syntax_table _Py_re_syntax_table -#define re_compile_initialize _Py_re_compile_initialize -#define re_set_syntax _Py_re_set_syntax -#define re_compile_pattern _Py_re_compile_pattern -#define re_match _Py_re_match -#define re_search _Py_re_search -#define re_compile_fastmap _Py_re_compile_fastmap -#define re_comp _Py_re_comp -#define re_exec _Py_re_exec - -#ifdef HAVE_PROTOTYPES - -extern int re_syntax; -/* This is the actual syntax mask. It was added so that Python could do - * syntax-dependent munging of patterns before compilation. */ - -extern unsigned char re_syntax_table[256]; - -void re_compile_initialize(void); - -int re_set_syntax(int syntax); -/* This sets the syntax to use and returns the previous syntax. The - * syntax is specified by a bit mask of the above defined bits. */ - -char *re_compile_pattern(unsigned char *regex, int regex_size, regexp_t compiled); -/* This compiles the regexp (given in regex and length in regex_size). - * This returns NULL if the regexp compiled successfully, and an error - * message if an error was encountered. The buffer field must be - * initialized to a memory area allocated by malloc (or to NULL) before - * use, and the allocated field must be set to its length (or 0 if - * buffer is NULL). Also, the translate field must be set to point to a - * valid translation table, or NULL if it is not used. */ - -int re_match(regexp_t compiled, unsigned char *string, int size, int pos, - regexp_registers_t old_regs); -/* This tries to match the regexp against the string. This returns the - * length of the matched portion, or -1 if the pattern could not be - * matched and -2 if an error (such as failure stack overflow) is - * encountered. */ - -int re_search(regexp_t compiled, unsigned char *string, int size, int startpos, - int range, regexp_registers_t regs); -/* This searches for a substring matching the regexp. This returns the - * first index at which a match is found. range specifies at how many - * positions to try matching; positive values indicate searching - * forwards, and negative values indicate searching backwards. mstop - * specifies the offset beyond which a match must not go. This returns - * -1 if no match is found, and -2 if an error (such as failure stack - * overflow) is encountered. */ - -void re_compile_fastmap(regexp_t compiled); -/* This computes the fastmap for the regexp. For this to have any effect, - * the calling program must have initialized the fastmap field to point - * to an array of 256 characters. */ - -#else /* HAVE_PROTOTYPES */ - -extern int re_syntax; -extern unsigned char re_syntax_table[256]; -void re_compile_initialize(); -int re_set_syntax(); -char *re_compile_pattern(); -int re_match(); -int re_search(); -void re_compile_fastmap(); - -#endif /* HAVE_PROTOTYPES */ - -#endif /* REGEXPR_H */ - - - -#ifdef __cplusplus -} -#endif -#endif /* !Py_REGEXPR_H */ Modified: python/trunk/PC/VC6/pythoncore.dsp ============================================================================== Binary files. No diff available. Modified: python/trunk/PC/os2emx/Makefile ============================================================================== --- python/trunk/PC/os2emx/Makefile (original) +++ python/trunk/PC/os2emx/Makefile Thu Mar 16 07:50:13 2006 @@ -304,8 +304,6 @@ Modules/md5module.c \ Modules/operator.c \ Modules/_randommodule.c \ - Modules/regexmodule.c \ - Modules/regexpr.c \ Modules/rgbimgmodule.c \ Modules/shamodule.c \ Modules/_sre.c \ Modified: python/trunk/PC/os2vacpp/makefile ============================================================================== --- python/trunk/PC/os2vacpp/makefile (original) +++ python/trunk/PC/os2vacpp/makefile Thu Mar 16 07:50:13 2006 @@ -948,34 +948,6 @@ $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \ $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h -regexmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \ - $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \ - pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \ - $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \ - $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \ - $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \ - $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \ - $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \ - $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \ - $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \ - $(PY_INCLUDE)\rangeobject.h $(PY_MODULES)\regexpr.h $(PY_INCLUDE)\sliceobject.h \ - $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \ - $(PY_INCLUDE)\tupleobject.h - -regexpr.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h \ - $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \ - pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \ - $(PY_INCLUDE)\floatobject.h $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h \ - $(PY_INCLUDE)\intobject.h $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h \ - $(PY_INCLUDE)\longobject.h $(PY_INCLUDE)\methodobject.h \ - $(PY_INCLUDE)\modsupport.h $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h \ - $(PY_INCLUDE)\myproto.h $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h \ - $(PY_INCLUDE)\pydebug.h $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h \ - $(PY_INCLUDE)\pystate.h $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h \ - $(PY_INCLUDE)\rangeobject.h $(PY_MODULES)\regexpr.h $(PY_INCLUDE)\sliceobject.h \ - $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \ - $(PY_INCLUDE)\tupleobject.h - resource.obj: $(PY_INCLUDE)\abstract.h $(OS2TCPIP)\Include\sys\time.h $(PY_INCLUDE)\ceval.h \ $(PY_INCLUDE)\classobject.h $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h \ pyconfig.h $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h \ Modified: python/trunk/PC/os2vacpp/makefile.omk ============================================================================== --- python/trunk/PC/os2vacpp/makefile.omk (original) +++ python/trunk/PC/os2vacpp/makefile.omk Thu Mar 16 07:50:13 2006 @@ -699,30 +699,6 @@ pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \ traceback.h tupleobject.h -regexmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \ - pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \ - import.h intobject.h intrcheck.h listobject.h longobject.h \ - methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \ - object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \ - pythonrun.h rangeobject.h regexpr.h sliceobject.h stringobject.h \ - sysmodule.h traceback.h tupleobject.h - -regexpr.obj: abstract.h ceval.h classobject.h cobject.h \ - complexobject.h pyconfig.h dictobject.h fileobject.h floatobject.h \ - funcobject.h import.h intobject.h intrcheck.h listobject.h \ - longobject.h methodobject.h modsupport.h moduleobject.h mymalloc.h \ - myproto.h object.h objimpl.h pydebug.h pyerrors.h pyfpe.h \ - pystate.h python.h pythonrun.h rangeobject.h regexpr.h \ - sliceobject.h stringobject.h sysmodule.h traceback.h tupleobject.h - -reopmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \ - pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \ - import.h intobject.h intrcheck.h listobject.h longobject.h \ - methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \ - object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \ - pythonrun.h rangeobject.h regexpr.h sliceobject.h stringobject.h \ - sysmodule.h traceback.h tupleobject.h - resource.obj: abstract.h c:\mptn\include\sys\time.h ceval.h classobject.h \ cobject.h complexobject.h pyconfig.h dictobject.h fileobject.h \ floatobject.h funcobject.h import.h intobject.h intrcheck.h \ Modified: python/trunk/PC/testpy.py ============================================================================== --- python/trunk/PC/testpy.py (original) +++ python/trunk/PC/testpy.py Thu Mar 16 07:50:13 2006 @@ -5,23 +5,23 @@ # change this module too. try: - import string + import os except: - print """Could not import the standard "string" module. + print """Could not import the standard "os" module. Please check your PYTHONPATH environment variable.""" sys.exit(1) try: - import regex_syntax + import symbol except: - print """Could not import the standard "regex_syntax" module. If this is + print """Could not import the standard "symbol" module. If this is a PC, you should add the dos_8x3 directory to your PYTHONPATH.""" sys.exit(1) import os for dir in sys.path: - file = os.path.join(dir, "string.py") + file = os.path.join(dir, "os.py") if os.path.isfile(file): test = os.path.join(dir, "test") if os.path.isdir(test): Modified: python/trunk/PCbuild/pythoncore.vcproj ============================================================================== --- python/trunk/PCbuild/pythoncore.vcproj (original) +++ python/trunk/PCbuild/pythoncore.vcproj Thu Mar 16 07:50:13 2006 @@ -707,12 +707,6 @@ RelativePath="..\Objects\rangeobject.c"> - - - - = 0 @@ -148,12 +148,12 @@ # This expression doesn't catch *all* class definition headers, # but it's pretty darn close. -classexpr = '^\([ \t]*class +[a-zA-Z0-9_]+\) *( *) *\(\(=.*\)?\):' -classprog = regex.compile(classexpr) +classexpr = '^([ \t]*class +[a-zA-Z0-9_]+) *( *) *((=.*)?):' +classprog = re.compile(classexpr) # Expressions for finding base class expressions. -baseexpr = '^ *\(.*\) *( *) *$' -baseprog = regex.compile(baseexpr) +baseexpr = '^ *(.*) *( *) *$' +baseprog = re.compile(baseexpr) def fixline(line): if classprog.match(line) < 0: # No 'class' keyword -- no change Modified: python/trunk/Tools/scripts/fixcid.py ============================================================================== --- python/trunk/Tools/scripts/fixcid.py (original) +++ python/trunk/Tools/scripts/fixcid.py Thu Mar 16 07:50:13 2006 @@ -35,7 +35,7 @@ # files. import sys -import regex +import re import os from stat import * import getopt @@ -90,7 +90,7 @@ # Change this regular expression to select a different set of files Wanted = '^[a-zA-Z0-9_]+\.[ch]$' def wanted(name): - return regex.match(Wanted, name) >= 0 + return re.match(Wanted, name) >= 0 def recursedown(dirname): dbg('recursedown(%r)\n' % (dirname,)) @@ -212,12 +212,12 @@ # Anything else is an operator -- don't list this explicitly because of '/*' OutsideComment = (Identifier, Number, String, Char, CommentStart) -OutsideCommentPattern = '\(' + '\|'.join(OutsideComment) + '\)' -OutsideCommentProgram = regex.compile(OutsideCommentPattern) +OutsideCommentPattern = '(' + '|'.join(OutsideComment) + ')' +OutsideCommentProgram = re.compile(OutsideCommentPattern) InsideComment = (Identifier, Number, CommentEnd) -InsideCommentPattern = '\(' + '\|'.join(InsideComment) + '\)' -InsideCommentProgram = regex.compile(InsideCommentPattern) +InsideCommentPattern = '(' + '|'.join(InsideComment) + ')' +InsideCommentProgram = re.compile(InsideCommentPattern) def initfixline(): global Program Modified: python/trunk/Tools/scripts/ifdef.py ============================================================================== --- python/trunk/Tools/scripts/ifdef.py (original) +++ python/trunk/Tools/scripts/ifdef.py Thu Mar 16 07:50:13 2006 @@ -27,7 +27,6 @@ # preprocessor commands. import sys -import regex import getopt defs = [] Modified: python/trunk/Tools/scripts/methfix.py ============================================================================== --- python/trunk/Tools/scripts/methfix.py (original) +++ python/trunk/Tools/scripts/methfix.py Thu Mar 16 07:50:13 2006 @@ -27,7 +27,7 @@ # into a program for a different change to Python programs... import sys -import regex +import re import os from stat import * @@ -50,7 +50,7 @@ if fix(arg): bad = 1 sys.exit(bad) -ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$') +ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$') def ispython(name): return ispythonprog.match(name) >= 0 @@ -101,7 +101,7 @@ if lineno == 1 and g is None and line[:2] == '#!': # Check for non-Python scripts words = line[2:].split() - if words and regex.search('[pP]ython', words[0]) < 0: + if words and re.search('[pP]ython', words[0]) < 0: msg = filename + ': ' + words[0] msg = msg + ' script; not fixed\n' err(msg) @@ -158,8 +158,8 @@ return 0 -fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *\(( *\(.*\) *)\) *) *:' -fixprog = regex.compile(fixpat) +fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *(( *(.*) *)) *) *:' +fixprog = re.compile(fixpat) def fixline(line): if fixprog.match(line) >= 0: Modified: python/trunk/Tools/scripts/objgraph.py ============================================================================== --- python/trunk/Tools/scripts/objgraph.py (original) +++ python/trunk/Tools/scripts/objgraph.py Thu Mar 16 07:50:13 2006 @@ -22,7 +22,7 @@ import sys import os import getopt -import regex +import re # Types of symbols. # @@ -32,7 +32,7 @@ # Regular expression to parse "nm -o" output. # -matcher = regex.compile('\(.*\):\t?........ \(.\) \(.*\)$') +matcher = re.compile('(.*):\t?........ (.) (.*)$') # Store "item" in "dict" under "key". # The dictionary maps keys to lists of items. Modified: python/trunk/Tools/scripts/pathfix.py ============================================================================== --- python/trunk/Tools/scripts/pathfix.py (original) +++ python/trunk/Tools/scripts/pathfix.py Thu Mar 16 07:50:13 2006 @@ -20,7 +20,7 @@ # into a program for a different change to Python programs... import sys -import regex +import re import os from stat import * import getopt @@ -59,7 +59,7 @@ if fix(arg): bad = 1 sys.exit(bad) -ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$') +ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$') def ispython(name): return ispythonprog.match(name) >= 0 Modified: python/trunk/Tools/scripts/pdeps.py ============================================================================== --- python/trunk/Tools/scripts/pdeps.py (original) +++ python/trunk/Tools/scripts/pdeps.py Thu Mar 16 07:50:13 2006 @@ -21,7 +21,7 @@ import sys -import regex +import re import os @@ -57,8 +57,8 @@ # Compiled regular expressions to search for import statements # -m_import = regex.compile('^[ \t]*from[ \t]+\([^ \t]+\)[ \t]+') -m_from = regex.compile('^[ \t]*import[ \t]+\([^#]+\)') +m_import = re.compile('^[ \t]*from[ \t]+([^ \t]+)[ \t]+') +m_from = re.compile('^[ \t]*import[ \t]+([^#]+)') # Collect data from one file Modified: python/trunk/setup.py ============================================================================== --- python/trunk/setup.py (original) +++ python/trunk/setup.py Thu Mar 16 07:50:13 2006 @@ -326,8 +326,6 @@ # # Some modules that are normally always on: - exts.append( Extension('regex', ['regexmodule.c', 'regexpr.c']) ) - exts.append( Extension('_weakref', ['_weakref.c']) ) # array objects From python-checkins at python.org Thu Mar 16 07:58:41 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 07:58:41 +0100 (CET) Subject: [Python-checkins] r43074 - peps/trunk/pep-0004.txt Message-ID: <20060316065841.531341E400F@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 07:58:39 2006 New Revision: 43074 Modified: peps/trunk/pep-0004.txt Log: Document the obsolete modules removed in 2.5 Modified: peps/trunk/pep-0004.txt ============================================================================== --- peps/trunk/pep-0004.txt (original) +++ peps/trunk/pep-0004.txt Thu Mar 16 07:58:39 2006 @@ -65,13 +65,18 @@ A number of modules are already listed as obsolete in the library documentation. These are listed here for completeness. - addpack, cmp, cmpcache, codehack, dircmp, dump, fmt, lockfile, - newdir, Para, poly, regex, regsub, tb, timing, util, whatsound, - tzmod, find, grep, packmail, ni, rand, soundex, cl, sv + cl, sv, timing All these modules have been declared as obsolete in Python 2.0, some even earlier. + The following obsolte modules were removed in Python 2.5: + + addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, + grep, lockfile, newdir, ni, packmail, Para, poly, + rand, reconvert, regex, regsub, statcache, tb, tzparse, + util, whatsound, whrandom, zmod + Deprecated modules From python-checkins at python.org Thu Mar 16 08:06:05 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 08:06:05 +0100 (CET) Subject: [Python-checkins] r43075 - in python/trunk/PC: config.c os2emx/config.c os2emx/python24.def os2vacpp/config.c os2vacpp/python.def Message-ID: <20060316070605.1057C1E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 08:05:59 2006 New Revision: 43075 Modified: python/trunk/PC/config.c python/trunk/PC/os2emx/config.c python/trunk/PC/os2emx/python24.def python/trunk/PC/os2vacpp/config.c python/trunk/PC/os2vacpp/python.def Log: Remove some more references to regex that I missed. Modified: python/trunk/PC/config.c ============================================================================== --- python/trunk/PC/config.c (original) +++ python/trunk/PC/config.c Thu Mar 16 08:05:59 2006 @@ -20,7 +20,6 @@ extern void init_md5(void); extern void initnt(void); extern void initoperator(void); -extern void initregex(void); #ifndef MS_WIN64 extern void initrgbimg(void); #endif @@ -95,7 +94,6 @@ {"_md5", init_md5}, {"nt", initnt}, /* Use the NT os functions, not posix */ {"operator", initoperator}, - {"regex", initregex}, #ifndef MS_WIN64 {"rgbimg", initrgbimg}, #endif Modified: python/trunk/PC/os2emx/config.c ============================================================================== --- python/trunk/PC/os2emx/config.c (original) +++ python/trunk/PC/os2emx/config.c Thu Mar 16 08:05:59 2006 @@ -64,7 +64,6 @@ extern void initmath(); extern void initmd5(); extern void initoperator(); -extern void initregex(); extern void initrgbimg(); extern void initsha(); extern void initstrop(); @@ -128,7 +127,6 @@ {"math", initmath}, {"md5", initmd5}, {"operator", initoperator}, - {"regex", initregex}, {"rgbimg", initrgbimg}, {"sha", initsha}, {"strop", initstrop}, Modified: python/trunk/PC/os2emx/python24.def ============================================================================== --- python/trunk/PC/os2emx/python24.def (original) +++ python/trunk/PC/os2emx/python24.def Thu Mar 16 08:05:59 2006 @@ -1134,19 +1134,6 @@ ; From python24_s.lib(_randommodule) ; "init_random" -; From python24_s.lib(regexmodule) -; "initregex" - -; From python24_s.lib(regexpr) -; "_Py_re_syntax_table" -; "_Py_re_compile_initialize" -; "_Py_re_compile_pattern" -; "_Py_re_match" -; "_Py_re_search" -; "_Py_re_set_syntax" -; "_Py_re_compile_fastmap" -; "_Py_re_syntax" - ; From python24_s.lib(rgbimgmodule) ; "initrgbimg" Modified: python/trunk/PC/os2vacpp/config.c ============================================================================== --- python/trunk/PC/os2vacpp/config.c (original) +++ python/trunk/PC/os2vacpp/config.c Thu Mar 16 08:05:59 2006 @@ -27,7 +27,6 @@ extern void initos2(void); extern void initoperator(void); extern void initposix(void); -extern void initregex(void); extern void initrgbimg(void); extern void initsignal(void); extern void initselect(void); @@ -70,7 +69,6 @@ #endif #endif {"operator", initoperator}, - {"regex", initregex}, // {"rgbimg", initrgbimg}, {"signal", initsignal}, #ifdef USE_SOCKET Modified: python/trunk/PC/os2vacpp/python.def ============================================================================== --- python/trunk/PC/os2vacpp/python.def (original) +++ python/trunk/PC/os2vacpp/python.def Thu Mar 16 08:05:59 2006 @@ -464,12 +464,6 @@ ; _Py_mergebitset ; _Py_meta_grammar ; _Py_newbitset - _Py_re_compile_fastmap - _Py_re_compile_initialize - _Py_re_compile_pattern - _Py_re_match - _Py_re_search - _Py_re_set_syntax ; _Py_samebitset PyBuffer_Type PyBuffer_FromObject From python-checkins at python.org Thu Mar 16 08:33:50 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 08:33:50 +0100 (CET) Subject: [Python-checkins] r43076 - python/trunk/Makefile.pre.in Message-ID: <20060316073350.894571E400D@bag.python.org> Author: thomas.heller Date: Thu Mar 16 08:33:49 2006 New Revision: 43076 Modified: python/trunk/Makefile.pre.in Log: Don't delete non-autogenerated source files when cleaning up. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Thu Mar 16 08:33:49 2006 @@ -974,8 +974,8 @@ find . -name '*.o' -exec rm -f {} ';' find . -name '*.s[ol]' -exec rm -f {} ';' find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' - find $(srcdir) -name 'fficonfig.h' -exec rm -f {} ';' - find $(srcdir) -name 'fficonfig.py' -exec rm -f {} ';' + find $(srcdir)/build -name 'fficonfig.h' -exec rm -f {} ';' || true + find $(srcdir)/build -name 'fficonfig.py' -exec rm -f {} ';' || true clobber: clean -rm -f $(BUILDPYTHON) $(PGEN) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ From nnorwitz at gmail.com Thu Mar 16 08:39:35 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 15 Mar 2006 23:39:35 -0800 Subject: [Python-checkins] r43045 - in python/trunk: Doc/lib/libcodecs.tex Include/codecs.h Lib/codecs.py Lib/encodings/__init__.py Lib/encodings/ascii.py Lib/encodings/base64_codec.py Lib/encodings/bz2_codec.py Lib/encodings/charmap.py Lib/encodings/cp03 Message-ID: On 3/15/06, walter.doerwald wrote: > Author: walter.doerwald > Date: Wed Mar 15 12:35:15 2006 > New Revision: 43045 > > Modified: > python/trunk/Lib/test/test_codecs.py > python/trunk/Python/codecs.c > > Log: > Patch #1436130: codecs.lookup() now returns a CodecInfo object (a subclass > of tuple) that provides incremental decoders and encoders (a way to use > stateful codecs without the stream API). Functions > codecs.getincrementaldecoder() and codecs.getincrementalencoder() have > been added. Walter, In Python/codecs.c, I have a couple of questions. The code is at the bottom of the message. 1) PyObject_CallFunction(encoder, "O", errors); doesn't look correct. errors is a const char *, not a PyObject*. Shouldn't the "O" be "s"? If it should, that probably means there are no tests with errors set, can you add tests for this condition? 2) It looks like this code is duplicated except for the string passed to PyObject_GetAttrString(). Can you write a helper function and pass in the string? That would cut the code in half. 3) Is the onError label necessary? It looks like it's only used in one place and the code might be easier to follow if you changed the goto to a return NULL; n -- +PyObject *PyCodec_IncrementalEncoder(const char *encoding, + const char *errors) +{ + PyObject *codecs, *ret, *encoder; + + codecs = _PyCodec_Lookup(encoding); + if (codecs == NULL) + goto onError; + encoder = PyObject_GetAttrString(codecs, "incrementalencoder"); + if (encoder == NULL) { + Py_DECREF(codecs); + return NULL; + } + if (errors) + ret = PyObject_CallFunction(encoder, "O", errors); + else + ret = PyObject_CallFunction(encoder, NULL); + Py_DECREF(encoder); + Py_DECREF(codecs); + return ret; + + onError: + return NULL; +} + +PyObject *PyCodec_IncrementalDecoder(const char *encoding, + const char *errors) +{ + PyObject *codecs, *ret, *decoder; + + codecs = _PyCodec_Lookup(encoding); + if (codecs == NULL) + goto onError; + decoder = PyObject_GetAttrString(codecs, "incrementaldecoder"); + if (decoder == NULL) { + Py_DECREF(codecs); + return NULL; + } + if (errors) + ret = PyObject_CallFunction(decoder, "O", errors); + else + ret = PyObject_CallFunction(decoder, NULL); + Py_DECREF(decoder); + Py_DECREF(codecs); + return ret; + + onError: + return NULL; +} From python-checkins at python.org Thu Mar 16 08:49:20 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 08:49:20 +0100 (CET) Subject: [Python-checkins] r43077 - in python/trunk: Doc/lib/libcodecs.tex Lib/codecs.py Message-ID: <20060316074920.5CE881E400D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 08:49:19 2006 New Revision: 43077 Modified: python/trunk/Doc/lib/libcodecs.tex python/trunk/Lib/codecs.py Log: Add some versionadded info to new incremental codec docs and fix doco nits. Modified: python/trunk/Doc/lib/libcodecs.tex ============================================================================== --- python/trunk/Doc/lib/libcodecs.tex (original) +++ python/trunk/Doc/lib/libcodecs.tex Thu Mar 16 08:49:19 2006 @@ -112,6 +112,7 @@ Raises a \exception{LookupError} in case the encoding cannot be found or the codec doesn't support an incremental encoder. +\versionadded{2.5} \end{funcdesc} \begin{funcdesc}{getincrementaldecoder}{encoding} @@ -120,6 +121,7 @@ Raises a \exception{LookupError} in case the encoding cannot be found or the codec doesn't support an incremental decoder. +\versionadded{2.5} \end{funcdesc} \begin{funcdesc}{getreader}{encoding} @@ -229,12 +231,14 @@ Uses an incremental encoder to iteratively encode the input provided by \var{iterable}. This function is a generator. \var{errors} (as well as any other keyword argument) is passed through to the incremental encoder. +\versionadded{2.5} \end{funcdesc} \begin{funcdesc}{iterdecode}{iterable, encoding\optional{, errors}} Uses an incremental decoder to iteratively decode the input provided by \var{iterable}. This function is a generator. \var{errors} (as well as any other keyword argument) is passed through to the incremental encoder. +\versionadded{2.5} \end{funcdesc} The module also provides the following constants which are useful @@ -355,6 +359,8 @@ \subsubsection{IncrementalEncoder Objects \label{incremental-encoder-objects}} +\versionadded{2.5} + The \class{IncrementalEncoder} class is used for encoding an input in multiple steps. It defines the following methods which every incremental encoder must define in order to be compatible to the Python codec registry. Modified: python/trunk/Lib/codecs.py ============================================================================== --- python/trunk/Lib/codecs.py (original) +++ python/trunk/Lib/codecs.py Thu Mar 16 08:49:19 2006 @@ -156,13 +156,13 @@ class IncrementalEncoder(object): """ - A IncrementalEncoder encodes an input in multiple steps. The input can be + An IncrementalEncoder encodes an input in multiple steps. The input can be passed piece by piece to the encode() method. The IncrementalEncoder remembers the state of the Encoding process between calls to encode(). """ def __init__(self, errors='strict'): """ - Creates a IncrementalEncoder instance. + Creates an IncrementalEncoder instance. The IncrementalEncoder may use different error handling schemes by providing the errors keyword argument. See the module docstring From python-checkins at python.org Thu Mar 16 09:20:24 2006 From: python-checkins at python.org (neal.norwitz) Date: Thu, 16 Mar 2006 09:20:24 +0100 (CET) Subject: [Python-checkins] r43078 - python/trunk/Python/modsupport.c Message-ID: <20060316082024.1F7721E403D@bag.python.org> Author: neal.norwitz Date: Thu Mar 16 09:20:19 2006 New Revision: 43078 Modified: python/trunk/Python/modsupport.c Log: Make mktuple consistent with mklist to get rid of Coverity warnings. Also use macro version of SetItem since we know everything is setup. Modified: python/trunk/Python/modsupport.c ============================================================================== --- python/trunk/Python/modsupport.c (original) +++ python/trunk/Python/modsupport.c Thu Mar 16 09:20:19 2006 @@ -218,7 +218,7 @@ Py_INCREF(Py_None); w = Py_None; } - PyList_SetItem(v, i, w); + PyList_SET_ITEM(v, i, w); } if (itemfailed) { @@ -232,7 +232,6 @@ "Unmatched paren in format"); return NULL; } - if (endchar) ++*p_format; return v; @@ -268,20 +267,21 @@ Py_INCREF(Py_None); w = Py_None; } - PyTuple_SetItem(v, i, w); + PyTuple_SET_ITEM(v, i, w); + } + if (itemfailed) { + /* do_mkvalue() should have already set an error */ + Py_DECREF(v); + return NULL; } - if (v != NULL && **p_format != endchar) { + if (**p_format != endchar) { Py_DECREF(v); - v = NULL; PyErr_SetString(PyExc_SystemError, "Unmatched paren in format"); + return NULL; } - else if (endchar) + if (endchar) ++*p_format; - if (itemfailed) { - Py_DECREF(v); - v = NULL; - } return v; } From neal at metaslash.com Thu Mar 16 10:55:59 2006 From: neal at metaslash.com (Neal Norwitz) Date: Thu, 16 Mar 2006 04:55:59 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060316095559.GA18532@python.psfb.org> test_compiler leaked [31, 336, 193] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_socket leaked [-206, 0, 0] references test_threadedtempfile leaked [2, 2, 1] references test_threading_local leaked [35, 35, 33] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [64, 64, 64] references From mal at egenix.com Thu Mar 16 11:06:20 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Thu, 16 Mar 2006 11:06:20 +0100 Subject: [Python-checkins] r43073 - in python/trunk: Demo/pdist/makechangelog.py Demo/pdist/rcsbump Demo/pdist/rcslib.py Demo/scripts/eqfix.py Demo/scripts/ftpstats.py Demo/scripts/mboxconvert.py Demo/scripts/update.py Demo/sockets/mcast.py Demo/tkinter/guido/ManPage.py Demo/tkinter/guido/mbox.py Demo/tkinter/guido/tkman.py Doc/howto/regex.tex Doc/lib/lib.tex Doc/lib/libre.tex Doc/lib/libreconvert.tex Doc/lib/libregex.tex Doc/lib/libregsub.tex Doc/lib/libundoc.tex Lib/lib-old/Para.py Lib/lib-old/addpack.py Lib/lib-old/cmp.py Lib/lib-old/cmpcache.py Lib/lib-old/codehack.py Lib/lib-old/dircmp.py Lib/lib-old/dump.py Lib/lib-old/find.py Lib/lib-old/fmt.py Lib/lib-old/grep.py Lib/lib-old/lockfile.py Lib/lib-old/newdir.py Lib/lib-old/ni.py Lib/lib-old/packmail.py Lib/lib-old/poly.py Lib/lib-old/rand.py Lib/lib-old/statcache.py Lib/lib-old/tb.py Lib/lib-old/tzparse.py Lib/lib-old/util.py Lib/lib-old/whatsound.py Lib/lib-old/whrandom.py Lib/lib-old/zmod.py Lib/reconvert.py Lib/regex_syntax.py Lib/regsub.py Lib/rexec.py Lib/test/test___all__.py Lib/test/test_regex.py Lib/test/test_sundry.py Misc/BeOS-setup.py Misc/NEWS Misc/cheatsheet Modules/regexmodule.c Modules/regexpr.c Modules/regexpr.h PC/VC6/pythoncore.dsp PC/os2emx/Makefile PC/os2vacpp/makefile PC/os2vacpp/makefile.omk PC/testpy.py PCbuild/pythoncore.vcproj RISCOS/Makefile Tools/scripts/classfix.py Tools/scripts/fixcid.py Tools/scripts/ifdef.py Tools/scripts/methfix.py Tools/scripts/objgraph.py Tools/scripts/pathfix.py Tools/scripts/pdeps.py setup.py In-Reply-To: <20060316065019.356031E400D@bag.python.org> References: <20060316065019.356031E400D@bag.python.org> Message-ID: <4419389C.8080702@egenix.com> I think you should add a NEWS item for this (or maybe I missed that). neal.norwitz wrote: > Author: neal.norwitz > Date: Thu Mar 16 07:50:13 2006 > New Revision: 43073 > > Removed: > python/trunk/Doc/lib/libreconvert.tex > python/trunk/Doc/lib/libregex.tex > python/trunk/Doc/lib/libregsub.tex > python/trunk/Lib/lib-old/Para.py > python/trunk/Lib/lib-old/addpack.py > python/trunk/Lib/lib-old/cmp.py > python/trunk/Lib/lib-old/cmpcache.py > python/trunk/Lib/lib-old/codehack.py > python/trunk/Lib/lib-old/dircmp.py > python/trunk/Lib/lib-old/dump.py > python/trunk/Lib/lib-old/find.py > python/trunk/Lib/lib-old/fmt.py > python/trunk/Lib/lib-old/grep.py > python/trunk/Lib/lib-old/lockfile.py > python/trunk/Lib/lib-old/newdir.py > python/trunk/Lib/lib-old/ni.py > python/trunk/Lib/lib-old/packmail.py > python/trunk/Lib/lib-old/poly.py > python/trunk/Lib/lib-old/rand.py > python/trunk/Lib/lib-old/statcache.py > python/trunk/Lib/lib-old/tb.py > python/trunk/Lib/lib-old/tzparse.py > python/trunk/Lib/lib-old/util.py > python/trunk/Lib/lib-old/whatsound.py > python/trunk/Lib/lib-old/whrandom.py > python/trunk/Lib/lib-old/zmod.py > python/trunk/Lib/reconvert.py > python/trunk/Lib/regex_syntax.py > python/trunk/Lib/regsub.py > python/trunk/Lib/test/test_regex.py > python/trunk/Modules/regexmodule.c > python/trunk/Modules/regexpr.c > python/trunk/Modules/regexpr.h -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 16 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From walter at livinglogic.de Thu Mar 16 10:27:25 2006 From: walter at livinglogic.de (=?ISO-8859-1?Q?Walter_D=F6rwald?=) Date: Thu, 16 Mar 2006 10:27:25 +0100 Subject: [Python-checkins] r43045 - in python/trunk: Doc/lib/libcodecs.tex Include/codecs.h Lib/codecs.py Lib/encodings/__init__.py Lib/encodings/ascii.py Lib/encodings/base64_codec.py Lib/encodings/bz2_codec.py Lib/encodings/charmap.py Lib/encodings/cp03 In-Reply-To: References: Message-ID: <44192F7D.5000201@livinglogic.de> Neal Norwitz wrote: > [...] > In Python/codecs.c, I have a couple of questions. The code is at the > bottom of the message. > > 1) PyObject_CallFunction(encoder, "O", errors); doesn't look correct. > errors is a const char *, not a PyObject*. Shouldn't the "O" be "s"? You're right! > If it should, that probably means there are no tests with errors set, > can you add tests for this condition? Until a few days ago, I didn't know that it's possible to test functionality that is only available from C! I'll add tests to _testcapi.c > 2) It looks like this code is duplicated except for the string passed > to PyObject_GetAttrString(). Can you write a helper function and pass > in the string? That would cut the code in half. OK. The same can be done with PyCodec_Encoder()/PyCodec_Decoder() and PyCodec_StreamWriter()/PyCodec_StreamReader(). > 3) Is the onError label necessary? It looks like it's only used in > one place and the code might be easier to follow if you changed the > goto to a return NULL; Will do! Bye, Walter D?rwald From python-checkins at python.org Thu Mar 16 18:34:42 2006 From: python-checkins at python.org (trent.mick) Date: Thu, 16 Mar 2006 18:34:42 +0100 (CET) Subject: [Python-checkins] r43079 - python/trunk/Lib/test/check_soundcard.vbs python/trunk/Lib/test/test_winsound.py Message-ID: <20060316173442.B8AE01E4033@bag.python.org> Author: trent.mick Date: Thu Mar 16 18:34:41 2006 New Revision: 43079 Added: python/trunk/Lib/test/check_soundcard.vbs Modified: python/trunk/Lib/test/test_winsound.py Log: Update test_winsound to check for a configured sound card (using a VBScript helper written by Roger Upole and Mark Hammond) and adjust the expected PlaySoundTest case results accordingly. Added: python/trunk/Lib/test/check_soundcard.vbs ============================================================================== --- (empty file) +++ python/trunk/Lib/test/check_soundcard.vbs Thu Mar 16 18:34:41 2006 @@ -0,0 +1,13 @@ +rem Check for a working sound-card - exit with 0 if OK, 1 otherwise. +set wmi = GetObject("winmgmts:") +set scs = wmi.InstancesOf("win32_sounddevice") +for each sc in scs + set status = sc.Properties_("Status") + wscript.Echo(sc.Properties_("Name") + "/" + status) + if status = "OK" then + wscript.Quit 0 rem normal exit + end if +next +rem No sound card found - exit with status code of 1 +wscript.Quit 1 + Modified: python/trunk/Lib/test/test_winsound.py ============================================================================== --- python/trunk/Lib/test/test_winsound.py (original) +++ python/trunk/Lib/test/test_winsound.py Thu Mar 16 18:34:41 2006 @@ -3,6 +3,9 @@ import unittest from test import test_support import winsound, time +import os +import subprocess + class BeepTest(unittest.TestCase): @@ -44,6 +47,7 @@ def test_question(self): winsound.MessageBeep(winsound.MB_ICONQUESTION) + class PlaySoundTest(unittest.TestCase): def test_errors(self): @@ -56,19 +60,54 @@ ) def test_alias_asterisk(self): - winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemAsterisk', winsound.SND_ALIAS + ) def test_alias_exclamation(self): - winsound.PlaySound('SystemExclamation', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemExclamation', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemExclamation', winsound.SND_ALIAS + ) def test_alias_exit(self): - winsound.PlaySound('SystemExit', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemExit', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemExit', winsound.SND_ALIAS + ) def test_alias_hand(self): - winsound.PlaySound('SystemHand', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemHand', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemHand', winsound.SND_ALIAS + ) def test_alias_question(self): - winsound.PlaySound('SystemQuestion', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemQuestion', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemQuestion', winsound.SND_ALIAS + ) def test_alias_fallback(self): # This test can't be expected to work on all systems. The MS @@ -85,41 +124,83 @@ return def test_alias_nofallback(self): - # Note that this is not the same as asserting RuntimeError - # will get raised: you cannot convert this to - # self.assertRaises(...) form. The attempt may or may not - # raise RuntimeError, but it shouldn't raise anything other - # than RuntimeError, and that's all we're trying to test here. - # The MS docs aren't clear about whether the SDK PlaySound() - # with SND_ALIAS and SND_NODEFAULT will return True or False when - # the alias is unknown. On Tim's WinXP box today, it returns - # True (no exception is raised). What we'd really like to test - # is that no sound is played, but that requires first wiring an - # eardrum class into unittest . - try: - winsound.PlaySound( - '!"$%&/(#+*', - winsound.SND_ALIAS | winsound.SND_NODEFAULT + if _have_soundcard(): + # Note that this is not the same as asserting RuntimeError + # will get raised: you cannot convert this to + # self.assertRaises(...) form. The attempt may or may not + # raise RuntimeError, but it shouldn't raise anything other + # than RuntimeError, and that's all we're trying to test + # here. The MS docs aren't clear about whether the SDK + # PlaySound() with SND_ALIAS and SND_NODEFAULT will return + # True or False when the alias is unknown. On Tim's WinXP + # box today, it returns True (no exception is raised). What + # we'd really like to test is that no sound is played, but + # that requires first wiring an eardrum class into unittest + # . + try: + winsound.PlaySound( + '!"$%&/(#+*', + winsound.SND_ALIAS | winsound.SND_NODEFAULT + ) + except RuntimeError: + pass + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + '!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT ) - except RuntimeError: - pass def test_stopasync(self): - winsound.PlaySound( - 'SystemQuestion', - winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP - ) - time.sleep(0.5) - try: + if _have_soundcard(): winsound.PlaySound( 'SystemQuestion', - winsound.SND_ALIAS | winsound.SND_NOSTOP + winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP + ) + time.sleep(0.5) + try: + winsound.PlaySound( + 'SystemQuestion', + winsound.SND_ALIAS | winsound.SND_NOSTOP + ) + except RuntimeError: + pass + else: # the first sound might already be finished + pass + winsound.PlaySound(None, winsound.SND_PURGE) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + None, winsound.SND_PURGE ) - except RuntimeError: - pass - else: # the first sound might already be finished - pass - winsound.PlaySound(None, winsound.SND_PURGE) + + +def _get_cscript_path(): + """Return the full path to cscript.exe or None.""" + for dir in os.environ.get("PATH", "").split(os.pathsep): + cscript_path = os.path.join(dir, "cscript.exe") + if os.path.exists(cscript_path): + return cscript_path + +__have_soundcard_cache = None +def _have_soundcard(): + """Return True iff this computer has a soundcard.""" + global __have_soundcard_cache + if __have_soundcard_cache is None: + cscript_path = _get_cscript_path() + if cscript_path is None: + # Could not find cscript.exe to run our VBScript helper. Default + # to True: most computers these days *do* have a soundcard. + return True + + check_script = os.path.join(os.path.dirname(__file__), + "check_soundcard.vbs") + p = subprocess.Popen([cscript_path, check_script], + stdout=subprocess.PIPE) + __have_soundcard_cache = not p.wait() + return __have_soundcard_cache + def test_main(): test_support.run_unittest(BeepTest, MessageBeepTest, PlaySoundTest) From python-checkins at python.org Thu Mar 16 19:52:20 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 19:52:20 +0100 (CET) Subject: [Python-checkins] r43080 - python/branches/release24-maint/Lib/test/check_soundcard.vbs python/branches/release24-maint/Lib/test/test_winsound.py Message-ID: <20060316185220.2D3CD1E4004@bag.python.org> Author: tim.peters Date: Thu Mar 16 19:52:17 2006 New Revision: 43080 Added: python/branches/release24-maint/Lib/test/check_soundcard.vbs - copied unchanged from r43079, python/trunk/Lib/test/check_soundcard.vbs Modified: python/branches/release24-maint/Lib/test/test_winsound.py Log: Merge rev 43079 from the trunk. This should allow test_winsound to pass on a box without a sound card. Update test_winsound to check for a configured sound card (using a VBScript helper written by Roger Upole and Mark Hammond) and adjust the expected PlaySoundTest case results accordingly. Modified: python/branches/release24-maint/Lib/test/test_winsound.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_winsound.py (original) +++ python/branches/release24-maint/Lib/test/test_winsound.py Thu Mar 16 19:52:17 2006 @@ -3,6 +3,9 @@ import unittest from test import test_support import winsound, time +import os +import subprocess + class BeepTest(unittest.TestCase): @@ -44,6 +47,7 @@ def test_question(self): winsound.MessageBeep(winsound.MB_ICONQUESTION) + class PlaySoundTest(unittest.TestCase): def test_errors(self): @@ -56,19 +60,54 @@ ) def test_alias_asterisk(self): - winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemAsterisk', winsound.SND_ALIAS + ) def test_alias_exclamation(self): - winsound.PlaySound('SystemExclamation', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemExclamation', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemExclamation', winsound.SND_ALIAS + ) def test_alias_exit(self): - winsound.PlaySound('SystemExit', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemExit', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemExit', winsound.SND_ALIAS + ) def test_alias_hand(self): - winsound.PlaySound('SystemHand', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemHand', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemHand', winsound.SND_ALIAS + ) def test_alias_question(self): - winsound.PlaySound('SystemQuestion', winsound.SND_ALIAS) + if _have_soundcard(): + winsound.PlaySound('SystemQuestion', winsound.SND_ALIAS) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + 'SystemQuestion', winsound.SND_ALIAS + ) def test_alias_fallback(self): # This test can't be expected to work on all systems. The MS @@ -85,41 +124,83 @@ return def test_alias_nofallback(self): - # Note that this is not the same as asserting RuntimeError - # will get raised: you cannot convert this to - # self.assertRaises(...) form. The attempt may or may not - # raise RuntimeError, but it shouldn't raise anything other - # than RuntimeError, and that's all we're trying to test here. - # The MS docs aren't clear about whether the SDK PlaySound() - # with SND_ALIAS and SND_NODEFAULT will return True or False when - # the alias is unknown. On Tim's WinXP box today, it returns - # True (no exception is raised). What we'd really like to test - # is that no sound is played, but that requires first wiring an - # eardrum class into unittest . - try: - winsound.PlaySound( - '!"$%&/(#+*', - winsound.SND_ALIAS | winsound.SND_NODEFAULT + if _have_soundcard(): + # Note that this is not the same as asserting RuntimeError + # will get raised: you cannot convert this to + # self.assertRaises(...) form. The attempt may or may not + # raise RuntimeError, but it shouldn't raise anything other + # than RuntimeError, and that's all we're trying to test + # here. The MS docs aren't clear about whether the SDK + # PlaySound() with SND_ALIAS and SND_NODEFAULT will return + # True or False when the alias is unknown. On Tim's WinXP + # box today, it returns True (no exception is raised). What + # we'd really like to test is that no sound is played, but + # that requires first wiring an eardrum class into unittest + # . + try: + winsound.PlaySound( + '!"$%&/(#+*', + winsound.SND_ALIAS | winsound.SND_NODEFAULT + ) + except RuntimeError: + pass + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + '!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT ) - except RuntimeError: - pass def test_stopasync(self): - winsound.PlaySound( - 'SystemQuestion', - winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP - ) - time.sleep(0.5) - try: + if _have_soundcard(): winsound.PlaySound( 'SystemQuestion', - winsound.SND_ALIAS | winsound.SND_NOSTOP + winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP + ) + time.sleep(0.5) + try: + winsound.PlaySound( + 'SystemQuestion', + winsound.SND_ALIAS | winsound.SND_NOSTOP + ) + except RuntimeError: + pass + else: # the first sound might already be finished + pass + winsound.PlaySound(None, winsound.SND_PURGE) + else: + self.assertRaises( + RuntimeError, + winsound.PlaySound, + None, winsound.SND_PURGE ) - except RuntimeError: - pass - else: # the first sound might already be finished - pass - winsound.PlaySound(None, winsound.SND_PURGE) + + +def _get_cscript_path(): + """Return the full path to cscript.exe or None.""" + for dir in os.environ.get("PATH", "").split(os.pathsep): + cscript_path = os.path.join(dir, "cscript.exe") + if os.path.exists(cscript_path): + return cscript_path + +__have_soundcard_cache = None +def _have_soundcard(): + """Return True iff this computer has a soundcard.""" + global __have_soundcard_cache + if __have_soundcard_cache is None: + cscript_path = _get_cscript_path() + if cscript_path is None: + # Could not find cscript.exe to run our VBScript helper. Default + # to True: most computers these days *do* have a soundcard. + return True + + check_script = os.path.join(os.path.dirname(__file__), + "check_soundcard.vbs") + p = subprocess.Popen([cscript_path, check_script], + stdout=subprocess.PIPE) + __have_soundcard_cache = not p.wait() + return __have_soundcard_cache + def test_main(): test_support.run_unittest(BeepTest, MessageBeepTest, PlaySoundTest) From python-checkins at python.org Thu Mar 16 19:55:21 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 19:55:21 +0100 (CET) Subject: [Python-checkins] r43081 - python/trunk/Lib/test/check_soundcard.vbs Message-ID: <20060316185521.A1D4E1E4004@bag.python.org> Author: tim.peters Date: Thu Mar 16 19:55:20 2006 New Revision: 43081 Modified: python/trunk/Lib/test/check_soundcard.vbs (contents, props changed) Log: Set eol-style to native. Modified: python/trunk/Lib/test/check_soundcard.vbs ============================================================================== --- python/trunk/Lib/test/check_soundcard.vbs (original) +++ python/trunk/Lib/test/check_soundcard.vbs Thu Mar 16 19:55:20 2006 @@ -1,13 +1,13 @@ -rem Check for a working sound-card - exit with 0 if OK, 1 otherwise. -set wmi = GetObject("winmgmts:") -set scs = wmi.InstancesOf("win32_sounddevice") -for each sc in scs - set status = sc.Properties_("Status") - wscript.Echo(sc.Properties_("Name") + "/" + status) - if status = "OK" then - wscript.Quit 0 rem normal exit - end if -next -rem No sound card found - exit with status code of 1 -wscript.Quit 1 - +rem Check for a working sound-card - exit with 0 if OK, 1 otherwise. +set wmi = GetObject("winmgmts:") +set scs = wmi.InstancesOf("win32_sounddevice") +for each sc in scs + set status = sc.Properties_("Status") + wscript.Echo(sc.Properties_("Name") + "/" + status) + if status = "OK" then + wscript.Quit 0 rem normal exit + end if +next +rem No sound card found - exit with status code of 1 +wscript.Quit 1 + From python-checkins at python.org Thu Mar 16 19:56:36 2006 From: python-checkins at python.org (tim.peters) Date: Thu, 16 Mar 2006 19:56:36 +0100 (CET) Subject: [Python-checkins] r43082 - python/branches/release24-maint/Lib/test/check_soundcard.vbs Message-ID: <20060316185636.20E581E4004@bag.python.org> Author: tim.peters Date: Thu Mar 16 19:56:35 2006 New Revision: 43082 Modified: python/branches/release24-maint/Lib/test/check_soundcard.vbs (contents, props changed) Log: Merge rev 43081 from trunk. Set eol-style to native. Modified: python/branches/release24-maint/Lib/test/check_soundcard.vbs ============================================================================== --- python/branches/release24-maint/Lib/test/check_soundcard.vbs (original) +++ python/branches/release24-maint/Lib/test/check_soundcard.vbs Thu Mar 16 19:56:35 2006 @@ -1,13 +1,13 @@ -rem Check for a working sound-card - exit with 0 if OK, 1 otherwise. -set wmi = GetObject("winmgmts:") -set scs = wmi.InstancesOf("win32_sounddevice") -for each sc in scs - set status = sc.Properties_("Status") - wscript.Echo(sc.Properties_("Name") + "/" + status) - if status = "OK" then - wscript.Quit 0 rem normal exit - end if -next -rem No sound card found - exit with status code of 1 -wscript.Quit 1 - +rem Check for a working sound-card - exit with 0 if OK, 1 otherwise. +set wmi = GetObject("winmgmts:") +set scs = wmi.InstancesOf("win32_sounddevice") +for each sc in scs + set status = sc.Properties_("Status") + wscript.Echo(sc.Properties_("Name") + "/" + status) + if status = "OK" then + wscript.Quit 0 rem normal exit + end if +next +rem No sound card found - exit with status code of 1 +wscript.Quit 1 + From python-checkins at python.org Thu Mar 16 20:24:31 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 20:24:31 +0100 (CET) Subject: [Python-checkins] r43083 - python/trunk/Modules/_ctypes/callbacks.c Message-ID: <20060316192431.F03291E4004@bag.python.org> Author: thomas.heller Date: Thu Mar 16 20:24:27 2006 New Revision: 43083 Modified: python/trunk/Modules/_ctypes/callbacks.c Log: Rewrite the AllocFunctionCallback function for better error handling. Hope that fixes one or two Coverty warnings. Modified: python/trunk/Modules/_ctypes/callbacks.c ============================================================================== --- python/trunk/Modules/_ctypes/callbacks.c (original) +++ python/trunk/Modules/_ctypes/callbacks.c Thu Mar 16 20:24:27 2006 @@ -307,19 +307,18 @@ nArgs = PySequence_Size(converters); p = (ffi_info *)PyMem_Malloc(sizeof(ffi_info) + sizeof(ffi_type) * (nArgs + 1)); - if (p == NULL) { - PyErr_NoMemory(); - return NULL; - } + if (p == NULL) + return (THUNK)PyErr_NoMemory(); p->pcl = MallocClosure(); if (p->pcl == NULL) { - PyMem_Free(p); PyErr_NoMemory(); - return NULL; + goto error; } for (i = 0; i < nArgs; ++i) { PyObject *cnv = PySequence_GetItem(converters, i); + if (cnv == NULL) + goto error; p->atypes[i] = GetType(cnv); Py_DECREF(cnv); } @@ -330,10 +329,8 @@ p->restype = &ffi_type_void; } else { StgDictObject *dict = PyType_stgdict(restype); - if (dict == NULL) { - PyMem_Free(p); - return NULL; - } + if (dict == NULL) + goto error; p->setfunc = dict->setfunc; p->restype = &dict->ffi_type; } @@ -349,21 +346,25 @@ if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, "ffi_prep_cif failed with %d", result); - PyMem_Free(p); - return NULL; + goto error; } result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p); if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, "ffi_prep_closure failed with %d", result); - PyMem_Free(p); - return NULL; + goto error; } p->converters = converters; p->callable = callable; - return (THUNK)p; + + error: + if (p) { + FreeCallback((THUNK)p); + PyMem_Free(p); + } + return NULL; } /**************************************************************************** From python-checkins at python.org Thu Mar 16 20:26:23 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 20:26:23 +0100 (CET) Subject: [Python-checkins] r43084 - python/trunk/Modules/_ctypes/_ctypes.c Message-ID: <20060316192623.243041E4004@bag.python.org> Author: thomas.heller Date: Thu Mar 16 20:26:21 2006 New Revision: 43084 Modified: python/trunk/Modules/_ctypes/_ctypes.c Log: Fixes from Neal Norwitz, plus other small fixes. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Thu Mar 16 20:26:21 2006 @@ -285,6 +285,7 @@ if (PyCArg_CheckExact(value)) { PyCArgObject *p = (PyCArgObject *)value; PyObject *ob = p->obj; + const char *ob_name; StgDictObject *dict; dict = PyType_stgdict(type); @@ -296,10 +297,10 @@ Py_INCREF(value); return value; } + ob_name = (ob) ? ob->ob_type->tp_name : "???"; PyErr_Format(PyExc_TypeError, "expected %s instance instead of pointer to %s", - ((PyTypeObject *)type)->tp_name, - ob->ob_type->tp_name); + ((PyTypeObject *)type)->tp_name, ob_name); return NULL; } #if 1 @@ -506,12 +507,12 @@ static int PointerType_SetProto(StgDictObject *stgdict, PyObject *proto) { - if (proto && !PyType_Check(proto)) { + if (!proto || !PyType_Check(proto)) { PyErr_SetString(PyExc_TypeError, "_type_ must be a type"); return -1; } - if (proto && !PyType_stgdict(proto)) { + if (!PyType_stgdict(proto)) { PyErr_SetString(PyExc_TypeError, "_type_ must have storage info"); return -1; @@ -1264,10 +1265,14 @@ PyTypeObject *result; StgDictObject *stgdict; PyObject *name = PyTuple_GET_ITEM(args, 0); - PyObject *swapped_args = PyTuple_New(PyTuple_GET_SIZE(args)); + PyObject *swapped_args; static PyObject *suffix; int i; + swapped_args = PyTuple_New(PyTuple_GET_SIZE(args)); + if (!swapped_args) + return NULL; + if (suffix == NULL) #ifdef WORDS_BIGENDIAN suffix = PyString_FromString("_le"); @@ -2781,7 +2786,7 @@ static PyObject * _build_callargs(CFuncPtrObject *self, PyObject *argtypes, PyObject *inargs, PyObject *kwds, - int *poutmask, int *pinoutmask, int *pnumretvals) + int *poutmask, int *pinoutmask, unsigned int *pnumretvals) { PyObject *paramflags = self->paramflags; PyObject *callargs; @@ -2836,6 +2841,7 @@ switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) { case PARAMFLAG_FIN | PARAMFLAG_FLCID: /* ['in', 'lcid'] parameter. Always taken from defval */ + assert(defval); Py_INCREF(defval); PyTuple_SET_ITEM(callargs, i, defval); break; @@ -2939,9 +2945,10 @@ */ static PyObject * _build_result(PyObject *result, PyObject *callargs, - int outmask, int inoutmask, int numretvals) + int outmask, int inoutmask, unsigned int numretvals) { - int i, index, bit; + unsigned int i, index; + int bit; PyObject *tup = NULL; if (callargs == NULL) @@ -2952,6 +2959,7 @@ } Py_DECREF(result); + /* tup will not be allocated if numretvals == 1 */ /* allocate tuple to hold the result */ if (numretvals > 1) { tup = PyTuple_New(numretvals); @@ -3275,6 +3283,8 @@ if (!fields) { PyErr_Clear(); fields = PyTuple_New(0); + if (!fields) + return -1; } if (PyTuple_GET_SIZE(args) > PySequence_Length(fields)) { From python-checkins at python.org Thu Mar 16 20:34:58 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 20:34:58 +0100 (CET) Subject: [Python-checkins] r43085 - python/trunk/Modules/_ctypes/_ctypes.c Message-ID: <20060316193458.BB9FE1E4005@bag.python.org> Author: thomas.heller Date: Thu Mar 16 20:34:56 2006 New Revision: 43085 Modified: python/trunk/Modules/_ctypes/_ctypes.c Log: Fix compiler warning. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Thu Mar 16 20:34:56 2006 @@ -3017,7 +3017,7 @@ int inoutmask; int outmask; - int numretvals; + unsigned int numretvals; assert(dict); /* if not, it's a bug */ restype = self->restype ? self->restype : dict->restype; From python-checkins at python.org Thu Mar 16 20:56:25 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 20:56:25 +0100 (CET) Subject: [Python-checkins] r43086 - python/trunk/Modules/_ctypes/_ctypes.c Message-ID: <20060316195625.410681E4004@bag.python.org> Author: thomas.heller Date: Thu Mar 16 20:56:24 2006 New Revision: 43086 Modified: python/trunk/Modules/_ctypes/_ctypes.c Log: Use int 0 as default defval for LCID if nothing has been supplied. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Thu Mar 16 20:56:24 2006 @@ -2840,9 +2840,14 @@ switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) { case PARAMFLAG_FIN | PARAMFLAG_FLCID: - /* ['in', 'lcid'] parameter. Always taken from defval */ - assert(defval); - Py_INCREF(defval); + /* ['in', 'lcid'] parameter. Always taken from defval, + if given, else the integer 0. */ + if (defval == NULL) { + defval = PyInt_FromLong(0); + if (defval == NULL) + goto error; + } else + Py_INCREF(defval); PyTuple_SET_ITEM(callargs, i, defval); break; case (PARAMFLAG_FIN | PARAMFLAG_FOUT): From python-checkins at python.org Thu Mar 16 21:02:39 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 21:02:39 +0100 (CET) Subject: [Python-checkins] r43087 - python/trunk/Modules/_ctypes/cfield.c Message-ID: <20060316200239.659F61E4004@bag.python.org> Author: thomas.heller Date: Thu Mar 16 21:02:36 2006 New Revision: 43087 Modified: python/trunk/Modules/_ctypes/cfield.c Log: Fix a leak that would happen under error conditions (found by Coverty). Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Thu Mar 16 21:02:36 2006 @@ -1317,6 +1317,7 @@ if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)value, buffer, PyUnicode_GET_SIZE(value))) { Py_DECREF(value); + Py_DECREF(keep); return NULL; } Py_DECREF(value); From python-checkins at python.org Thu Mar 16 21:09:23 2006 From: python-checkins at python.org (thomas.heller) Date: Thu, 16 Mar 2006 21:09:23 +0100 (CET) Subject: [Python-checkins] r43088 - python/trunk/Lib/ctypes/test/test_posix.py Message-ID: <20060316200923.5C6641E4004@bag.python.org> Author: thomas.heller Date: Thu Mar 16 21:09:22 2006 New Revision: 43088 Modified: python/trunk/Lib/ctypes/test/test_posix.py Log: Fix a test that fails when libGL.so and libGLU.so are not installed (on posix systems). Modified: python/trunk/Lib/ctypes/test/test_posix.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_posix.py (original) +++ python/trunk/Lib/ctypes/test/test_posix.py Thu Mar 16 21:09:22 2006 @@ -8,8 +8,10 @@ class TestRTLD_GLOBAL(unittest.TestCase): def test_GL(self): - cdll.load('libGL.so', mode=RTLD_GLOBAL) - cdll.load('libGLU.so') + if os.path.exists('/usr/lib/libGL.so'): + cdll.load('libGL.so', mode=RTLD_GLOBAL) + if os.path.exists('/usr/lib/libGLU.so'): + cdll.load('libGLU.so') ##if os.name == "posix" and sys.platform != "darwin": From nnorwitz at gmail.com Thu Mar 16 22:33:11 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Thu, 16 Mar 2006 13:33:11 -0800 Subject: [Python-checkins] r43073 - in python/trunk: Demo/pdist/makechangelog.py Demo/pdist/rcsbump Demo/pdist/rcslib.py Demo/scripts/eqfix.py Demo/scripts/ftpstats.py Demo/scripts/mboxconvert.py Demo/scripts/update.py Demo/sockets/mcast.py Demo/tkinter/g Message-ID: On 3/16/06, M.-A. Lemburg wrote: > I think you should add a NEWS item for this (or maybe I missed that). I added one, but in a separate checkin. n From python-checkins at python.org Thu Mar 16 22:46:42 2006 From: python-checkins at python.org (walter.doerwald) Date: Thu, 16 Mar 2006 22:46:42 +0100 (CET) Subject: [Python-checkins] r43089 - python/trunk/Python/codecs.c Message-ID: <20060316214642.6D9641E4004@bag.python.org> Author: walter.doerwald Date: Thu Mar 16 22:46:40 2006 New Revision: 43089 Modified: python/trunk/Python/codecs.c Log: Fix wrong argument format in PyCodec_IncrementalEncoder() and PyCodec_IncrementalDecoder(). Factor out common code from PyCodec_Encoder()/PyCodec_Decoder(), PyCodec_IncrementalEncoder()/PyCodec_IncrementalDecoder() and PyCodec_StreamReader()/PyCodec_StreamWriter(). Modified: python/trunk/Python/codecs.c ============================================================================== --- python/trunk/Python/codecs.c (original) +++ python/trunk/Python/codecs.c Thu Mar 16 22:46:40 2006 @@ -200,148 +200,109 @@ return args; } -/* Build a codec by calling factory(stream[,errors]) or just - factory(errors) depending on whether the given parameters are - non-NULL. */ +/* Helper function to get a codec item */ static -PyObject *build_stream_codec(PyObject *factory, - PyObject *stream, - const char *errors) -{ - PyObject *args, *codec; - - args = args_tuple(stream, errors); - if (args == NULL) - return NULL; - - codec = PyEval_CallObject(factory, args); - Py_DECREF(args); - return codec; -} - -/* Convenience APIs to query the Codec registry. - - All APIs return a codec object with incremented refcount. - - */ - -PyObject *PyCodec_Encoder(const char *encoding) +PyObject *codec_getitem(const char *encoding, int index) { PyObject *codecs; PyObject *v; codecs = _PyCodec_Lookup(encoding); if (codecs == NULL) - goto onError; - v = PyTuple_GET_ITEM(codecs,0); + return NULL; + v = PyTuple_GET_ITEM(codecs, index); Py_DECREF(codecs); Py_INCREF(v); return v; - - onError: - return NULL; } -PyObject *PyCodec_Decoder(const char *encoding) -{ - PyObject *codecs; - PyObject *v; - - codecs = _PyCodec_Lookup(encoding); - if (codecs == NULL) - goto onError; - v = PyTuple_GET_ITEM(codecs,1); - Py_DECREF(codecs); - Py_INCREF(v); - return v; +/* Helper function to create an incremental codec. */ - onError: - return NULL; -} - -PyObject *PyCodec_IncrementalEncoder(const char *encoding, - const char *errors) +static +PyObject *codec_getincrementalcodec(const char *encoding, + const char *errors, + const char *attrname) { - PyObject *codecs, *ret, *encoder; + PyObject *codecs, *ret, *inccodec; codecs = _PyCodec_Lookup(encoding); if (codecs == NULL) - goto onError; - encoder = PyObject_GetAttrString(codecs, "incrementalencoder"); - if (encoder == NULL) { + return NULL; + inccodec = PyObject_GetAttrString(codecs, attrname); + if (inccodec == NULL) { Py_DECREF(codecs); return NULL; } if (errors) - ret = PyObject_CallFunction(encoder, "O", errors); + ret = PyObject_CallFunction(inccodec, "s", errors); else - ret = PyObject_CallFunction(encoder, NULL); - Py_DECREF(encoder); + ret = PyObject_CallFunction(inccodec, NULL); + Py_DECREF(inccodec); Py_DECREF(codecs); return ret; - - onError: - return NULL; } -PyObject *PyCodec_IncrementalDecoder(const char *encoding, - const char *errors) +/* Helper function to create a stream codec. */ + +static +PyObject *codec_getstreamcodec(const char *encoding, + PyObject *stream, + const char *errors, + const int index) { - PyObject *codecs, *ret, *decoder; + PyObject *codecs, *streamcodec; codecs = _PyCodec_Lookup(encoding); if (codecs == NULL) - goto onError; - decoder = PyObject_GetAttrString(codecs, "incrementaldecoder"); - if (decoder == NULL) { - Py_DECREF(codecs); return NULL; - } - if (errors) - ret = PyObject_CallFunction(decoder, "O", errors); - else - ret = PyObject_CallFunction(decoder, NULL); - Py_DECREF(decoder); + + streamcodec = PyEval_CallFunction( + PyTuple_GET_ITEM(codecs, index), "Os", stream, errors); Py_DECREF(codecs); - return ret; + return streamcodec; +} - onError: - return NULL; +/* Convenience APIs to query the Codec registry. + + All APIs return a codec object with incremented refcount. + + */ + +PyObject *PyCodec_Encoder(const char *encoding) +{ + return codec_getitem(encoding, 0); +} + +PyObject *PyCodec_Decoder(const char *encoding) +{ + return codec_getitem(encoding, 1); +} + +PyObject *PyCodec_IncrementalEncoder(const char *encoding, + const char *errors) +{ + return codec_getincrementalcodec(encoding, errors, "incrementalencoder"); +} + +PyObject *PyCodec_IncrementalDecoder(const char *encoding, + const char *errors) +{ + return codec_getincrementalcodec(encoding, errors, "incrementaldecoder"); } PyObject *PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors) { - PyObject *codecs, *ret; - - codecs = _PyCodec_Lookup(encoding); - if (codecs == NULL) - goto onError; - ret = build_stream_codec(PyTuple_GET_ITEM(codecs,2),stream,errors); - Py_DECREF(codecs); - return ret; - - onError: - return NULL; + return codec_getstreamcodec(encoding, stream, errors, 2); } PyObject *PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors) { - PyObject *codecs, *ret; - - codecs = _PyCodec_Lookup(encoding); - if (codecs == NULL) - goto onError; - ret = build_stream_codec(PyTuple_GET_ITEM(codecs,3),stream,errors); - Py_DECREF(codecs); - return ret; - - onError: - return NULL; + return codec_getstreamcodec(encoding, stream, errors, 3); } /* Encode an object (e.g. an Unicode object) using the given encoding From neal at metaslash.com Thu Mar 16 22:57:39 2006 From: neal at metaslash.com (Neal Norwitz) Date: Thu, 16 Mar 2006 16:57:39 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060316215739.GA30159@python.psfb.org> test_cmd_line leaked [-15, 15, 0] references test_compiler leaked [160, 277, 67] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_socket leaked [-206, 0, 0] references test_threadedtempfile leaked [-66, 6, 2] references test_threading_local leaked [24, 52, 42] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [63, 65, 66] references From python-checkins at python.org Fri Mar 17 04:29:35 2006 From: python-checkins at python.org (tim.peters) Date: Fri, 17 Mar 2006 04:29:35 +0100 (CET) Subject: [Python-checkins] r43090 - in python/trunk: Include/pyport.h Objects/stringobject.c Message-ID: <20060317032935.E18081E4006@bag.python.org> Author: tim.peters Date: Fri Mar 17 04:29:34 2006 New Revision: 43090 Modified: python/trunk/Include/pyport.h python/trunk/Objects/stringobject.c Log: Introduced symbol PY_FORMAT_SIZE_T. See the new comments in pyport.h. Changed PyString_FromFormatV() to use it instead of inlining its own maze of #if'ery. Modified: python/trunk/Include/pyport.h ============================================================================== --- python/trunk/Include/pyport.h (original) +++ python/trunk/Include/pyport.h Fri Mar 17 04:29:34 2006 @@ -85,6 +85,10 @@ # error "Python needs a typedef for Py_uintptr_t in pyport.h." #endif /* HAVE_UINTPTR_T */ +/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == + * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an + * unsigned integral type). See PEP 353 for details. + */ #ifdef HAVE_SSIZE_T typedef ssize_t Py_ssize_t; #elif SIZEOF_VOID_P == SIZEOF_SIZE_T @@ -92,8 +96,43 @@ #else # error "Python needs a typedef for Py_ssize_t in pyport.h." #endif + +/* Largest positive value of type Py_ssize_t. */ #define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) +/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf + * format to convert an argument with the width of a size_t or Py_ssize_t. + * C99 introduced "z" for this purpose, but not all platforms support that; + * e.g., MS compilers use "I" instead. + * + * These "high level" Python format functions interpret "z" correctly on + * all platforms (Python interprets the format string itself, and does whatever + * the platform C requires to convert a size_t/Py_ssize_t argument): + * + * PyString_FromFormat + * PyErr_Format + * PyString_FromFormatV + * + * Lower-level uses require that you interpolate the correct format modifier + * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for + * example, + * + * Py_ssize_t index; + * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); + * + * That will expand to %ld, or %Id, or to something else correct for a + * Py_ssize_t on the platform. + */ +#ifndef PY_FORMAT_SIZE_T +# if SIZEOF_SIZE_T == SIZEOF_LONG +# define PY_FORMAT_SIZE_T "l" +# elif defined(MS_WINDOWS) +# define PY_FORMAT_SIZE_T "I" +# else +# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" +# endif +#endif + #include #include /* Moved here from the math section, before extern "C" */ Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Fri Mar 17 04:29:34 2006 @@ -16,7 +16,7 @@ When the interned string reaches a refcnt of 0 the string deallocation function will delete the reference from this dictionary. - Another way to look at this is that to say that the actual reference + Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->ob_sstate?2:0) */ static PyObject *interned; @@ -183,7 +183,7 @@ ++f; /* likewise for %zd */ if (*f == 'z' && *(f+1) == 'd') - ++f; + ++f; switch (*f) { case 'c': @@ -273,18 +273,9 @@ case 'd': if (longflag) sprintf(s, "%ld", va_arg(vargs, long)); - else if (size_tflag) { - /* Instead of checking whether the C - library supports %zd, handle the - common cases. */ - #if SIZEOF_SIZE_T == SIZEOF_LONG - sprintf(s, "%ld", va_arg(vargs, long)); - #elif defined(MS_WINDOWS) - sprintf(s, "%Id", va_arg(vargs, size_t)); - #else - #error Cannot print size_t values - #endif - } + else if (size_tflag) + sprintf(s, "%" PY_FORMAT_SIZE_T "d", + va_arg(vargs, size_t)); else sprintf(s, "%d", va_arg(vargs, int)); s += strlen(s); @@ -622,7 +613,7 @@ *p++ = c; break; case 'x': - if (isxdigit(Py_CHARMASK(s[0])) + if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) { unsigned int x = 0; c = Py_CHARMASK(*s); @@ -646,7 +637,7 @@ break; } if (!errors || strcmp(errors, "strict") == 0) { - PyErr_SetString(PyExc_ValueError, + PyErr_SetString(PyExc_ValueError, "invalid \\x escape"); goto failed; } @@ -838,7 +829,7 @@ /* figure out which quote to use; single is preferred */ quote = '\''; - if (smartquotes && + if (smartquotes && memchr(op->ob_sval, '\'', op->ob_size) && !memchr(op->ob_sval, '"', op->ob_size)) quote = '"'; @@ -1003,7 +994,7 @@ /* String slice a[i:j] consists of characters a[i] ... a[j-1] */ static PyObject * -string_slice(register PyStringObject *a, register Py_ssize_t i, +string_slice(register PyStringObject *a, register Py_ssize_t i, register Py_ssize_t j) /* j -- may be negative! */ { @@ -1047,7 +1038,7 @@ if (len_sub == 0) return 1; - /* last points to one char beyond the start of the rightmost + /* last points to one char beyond the start of the rightmost substring. When s Author: neal.norwitz Date: Fri Mar 17 05:37:34 2006 New Revision: 43091 Modified: python/trunk/Lib/test/test_timeout.py Log: Try to find a host that responds slower from python.org so this test does not fail on macteagle (G4 OSX.4 in buildbot) Modified: python/trunk/Lib/test/test_timeout.py ============================================================================== --- python/trunk/Lib/test/test_timeout.py (original) +++ python/trunk/Lib/test/test_timeout.py Fri Mar 17 05:37:34 2006 @@ -114,7 +114,7 @@ # If we are too close to www.python.org, this test will fail. # Pick a host that should be farther away. if socket.getfqdn().split('.')[-2:] == ['python', 'org']: - self.addr_remote = ('python.net', 80) + self.addr_remote = ('tut.fi', 80) _t1 = time.time() self.failUnlessRaises(socket.error, self.sock.connect, From python-checkins at python.org Fri Mar 17 05:45:39 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 05:45:39 +0100 (CET) Subject: [Python-checkins] r43092 - in python/trunk: Lib/test/leakers/test_ctypes.py Misc/build.sh Message-ID: <20060317044539.A46561E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 05:45:38 2006 New Revision: 43092 Added: python/trunk/Lib/test/leakers/test_ctypes.py (contents, props changed) Modified: python/trunk/Misc/build.sh Log: Ignore ctypes leaks, but add a test case so we do not forget. Added: python/trunk/Lib/test/leakers/test_ctypes.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/leakers/test_ctypes.py Fri Mar 17 05:45:38 2006 @@ -0,0 +1,11 @@ + +# Taken from Lib/ctypes/test/test_keeprefs.py +# When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS. + +from ctypes import Structure, c_int + +def leak(): + class POINT(Structure): + _fields_ = [("x", c_int)] + class RECT(Structure): + _fields_ = [("ul", POINT)] Modified: python/trunk/Misc/build.sh ============================================================================== --- python/trunk/Misc/build.sh (original) +++ python/trunk/Misc/build.sh Fri Mar 17 05:45:38 2006 @@ -59,7 +59,7 @@ # test_generators really leaks. Since test_generators probably won't # be fixed real soon, disable warning about it for now. # The entire leak report will be mailed if any test not in this list leaks. -LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" +LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|ctypes|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" # Change this flag to "yes" for old releases to just update/build the docs. BUILD_DISABLED="no" From python-checkins at python.org Fri Mar 17 05:52:40 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 05:52:40 +0100 (CET) Subject: [Python-checkins] r43093 - in python/trunk: Lib/test/leakers/test_tee.py Misc/build.sh Message-ID: <20060317045240.621041E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 05:52:38 2006 New Revision: 43093 Modified: python/trunk/Lib/test/leakers/test_tee.py python/trunk/Misc/build.sh Log: Update/expand on comments about leaking tests. Modified: python/trunk/Lib/test/leakers/test_tee.py ============================================================================== --- python/trunk/Lib/test/leakers/test_tee.py (original) +++ python/trunk/Lib/test/leakers/test_tee.py Fri Mar 17 05:52:38 2006 @@ -1,6 +1,7 @@ # Test case taken from test_itertools # See http://mail.python.org/pipermail/python-dev/2005-November/058339.html +# When this is fixed remember to remove from LEAKY_TESTS in Misc/build.sh. from itertools import tee Modified: python/trunk/Misc/build.sh ============================================================================== --- python/trunk/Misc/build.sh (original) +++ python/trunk/Misc/build.sh Fri Mar 17 05:52:38 2006 @@ -55,13 +55,14 @@ RSYNC_OPTS="-aC -e ssh" REFLOG="build/reflog.txt.out" -# These tests are not stable and sometimes report leaks; however, -# test_generators really leaks. Since test_generators probably won't -# be fixed real soon, disable warning about it for now. +# These tests are not stable and often falsely report leaks. # The entire leak report will be mailed if any test not in this list leaks. +# Note: test_ctypes and test_generators really leak, but are disabled +# so we don't send spam. Any test which really leaks should only +# be listed here if there are also test cases under Lib/test/leakers. LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|ctypes|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" -# Change this flag to "yes" for old releases to just update/build the docs. +# Change this flag to "yes" for old releases to only update/build the docs. BUILD_DISABLED="no" ## utility functions From python-checkins at python.org Fri Mar 17 06:44:47 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 06:44:47 +0100 (CET) Subject: [Python-checkins] r43094 - python/branches/p3yk/Parser/parsetok.c Message-ID: <20060317054447.2E0C11E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 06:44:46 2006 New Revision: 43094 Modified: python/branches/p3yk/Parser/parsetok.c Log: Get rid of compiler warning Modified: python/branches/p3yk/Parser/parsetok.c ============================================================================== --- python/branches/p3yk/Parser/parsetok.c (original) +++ python/branches/p3yk/Parser/parsetok.c Fri Mar 17 06:44:46 2006 @@ -98,7 +98,6 @@ static char as_msg[] = "%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; -#endif static void warn(const char *msg, const char *filename, int lineno) @@ -107,6 +106,7 @@ filename = ""; PySys_WriteStderr(msg, filename, lineno); } +#endif static node * parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, From python-checkins at python.org Fri Mar 17 06:49:36 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 06:49:36 +0100 (CET) Subject: [Python-checkins] r43095 - in python/branches/p3yk: Demo/classes/Complex.py Demo/pdist/server.py Demo/sockets/gopher.py Doc/api/exceptions.tex Doc/api/intro.tex Doc/ext/extending.tex Doc/lib/libtraceback.tex Doc/ref/ref7.tex Lib/SimpleXMLRPCServer.py Lib/idlelib/WindowList.py Lib/lib-tk/Tkinter.py Lib/traceback.py Mac/Tools/IDE/PyDebugger.py Mac/Tools/IDE/PyEdit.py Python/sysmodule.c Tools/faqwiz/faqw.py Message-ID: <20060317054936.E4C271E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 06:49:33 2006 New Revision: 43095 Modified: python/branches/p3yk/Demo/classes/Complex.py python/branches/p3yk/Demo/pdist/server.py python/branches/p3yk/Demo/sockets/gopher.py python/branches/p3yk/Doc/api/exceptions.tex python/branches/p3yk/Doc/api/intro.tex python/branches/p3yk/Doc/ext/extending.tex python/branches/p3yk/Doc/lib/libtraceback.tex python/branches/p3yk/Doc/ref/ref7.tex python/branches/p3yk/Lib/SimpleXMLRPCServer.py python/branches/p3yk/Lib/idlelib/WindowList.py python/branches/p3yk/Lib/lib-tk/Tkinter.py python/branches/p3yk/Lib/traceback.py python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py python/branches/p3yk/Mac/Tools/IDE/PyEdit.py python/branches/p3yk/Python/sysmodule.c python/branches/p3yk/Tools/faqwiz/faqw.py Log: Remove sys.exc_type, sys.exc_value, sys.exc_traceback Modified: python/branches/p3yk/Demo/classes/Complex.py ============================================================================== --- python/branches/p3yk/Demo/classes/Complex.py (original) +++ python/branches/p3yk/Demo/classes/Complex.py Fri Mar 17 06:49:33 2006 @@ -233,7 +233,7 @@ try: result = eval(expr) except: - result = sys.exc_type + result = sys.exc_info()[0] print '->', result if isinstance(result, str) or isinstance(value, str): ok = (result == value) Modified: python/branches/p3yk/Demo/pdist/server.py ============================================================================== --- python/branches/p3yk/Demo/pdist/server.py (original) +++ python/branches/p3yk/Demo/pdist/server.py Fri Mar 17 06:49:33 2006 @@ -83,7 +83,7 @@ method = getattr(self, methodname) reply = (None, apply(method, args), id) except: - reply = (sys.exc_type, sys.exc_value, id) + reply = (sys.exc_info()[:2], id) if id < 0 and reply[:2] == (None, None): if self._verbose > 1: print "Suppress reply" return 1 Modified: python/branches/p3yk/Demo/sockets/gopher.py ============================================================================== --- python/branches/p3yk/Demo/sockets/gopher.py (original) +++ python/branches/p3yk/Demo/sockets/gopher.py Fri Mar 17 06:49:33 2006 @@ -191,7 +191,8 @@ try: browserfunc(i_selector, i_host, i_port) except (IOError, socket.error): - print '***', sys.exc_type, ':', sys.exc_value + t, v, tb = sys.exc_info() + print '***', t, ':', v else: print 'Unsupported object type' Modified: python/branches/p3yk/Doc/api/exceptions.tex ============================================================================== --- python/branches/p3yk/Doc/api/exceptions.tex (original) +++ python/branches/p3yk/Doc/api/exceptions.tex Fri Mar 17 06:49:33 2006 @@ -23,12 +23,9 @@ behave as intended and may fail in mysterious ways. The error indicator consists of three Python objects corresponding to -\withsubitem{(in module sys)}{ - \ttindex{exc_type}\ttindex{exc_value}\ttindex{exc_traceback}} -the Python variables \code{sys.exc_type}, \code{sys.exc_value} and -\code{sys.exc_traceback}. API functions exist to interact with the -error indicator in various ways. There is a separate error indicator -for each thread. +the result of \code{sys.exc_info()}. API functions exist to interact +with the error indicator in various ways. There is a separate +error indicator for each thread. % XXX Order of these should be more thoughtful. % Either alphabetical or some kind of structure. Modified: python/branches/p3yk/Doc/api/intro.tex ============================================================================== --- python/branches/p3yk/Doc/api/intro.tex (original) +++ python/branches/p3yk/Doc/api/intro.tex Fri Mar 17 06:49:33 2006 @@ -400,15 +400,12 @@ The full exception state consists of three objects (all of which can be \NULL): the exception type, the corresponding exception value, and the traceback. These have the same meanings as the Python -\withsubitem{(in module sys)}{ - \ttindex{exc_type}\ttindex{exc_value}\ttindex{exc_traceback}} -objects \code{sys.exc_type}, \code{sys.exc_value}, and -\code{sys.exc_traceback}; however, they are not the same: the Python +result of \code{sys.exc_info()}; however, they are not the same: the Python objects represent the last exception being handled by a Python \keyword{try} \ldots\ \keyword{except} statement, while the C level exception state only exists while an exception is being passed on between C functions until it reaches the Python bytecode interpreter's -main loop, which takes care of transferring it to \code{sys.exc_type} +main loop, which takes care of transferring it to \code{sys.exc_info()} and friends. Note that starting with Python 1.5, the preferred, thread-safe way to Modified: python/branches/p3yk/Doc/ext/extending.tex ============================================================================== --- python/branches/p3yk/Doc/ext/extending.tex (original) +++ python/branches/p3yk/Doc/ext/extending.tex Fri Mar 17 06:49:33 2006 @@ -120,9 +120,8 @@ variable stores the ``associated value'' of the exception (the second argument to \keyword{raise}). A third variable contains the stack traceback in case the error originated in Python code. These three -variables are the C equivalents of the Python variables -\code{sys.exc_type}, \code{sys.exc_value} and \code{sys.exc_traceback} (see -the section on module \module{sys} in the +variables are the C equivalents of the result in Python of +\method{sys.exc_info()} (see the section on module \module{sys} in the \citetitle[../lib/lib.html]{Python Library Reference}). It is important to know about them to understand how errors are passed around. Modified: python/branches/p3yk/Doc/lib/libtraceback.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libtraceback.tex (original) +++ python/branches/p3yk/Doc/lib/libtraceback.tex Fri Mar 17 06:49:33 2006 @@ -12,9 +12,8 @@ ``wrapper'' around the interpreter. The module uses traceback objects --- this is the object type that is -stored in the variables \code{sys.exc_traceback} (deprecated) and -\code{sys.last_traceback} and returned as the third item from -\function{sys.exc_info()}. +stored in the \code{sys.last_traceback} variable and returned +as the third item from \function{sys.exc_info()}. \obindex{traceback} The module defines the following functions: @@ -41,11 +40,7 @@ \end{funcdesc} \begin{funcdesc}{print_exc}{\optional{limit\optional{, file}}} -This is a shorthand for \code{print_exception(sys.exc_type, -sys.exc_value, sys.exc_traceback, \var{limit}, \var{file})}. (In -fact, it uses \function{sys.exc_info()} to retrieve the same -information in a thread-safe way instead of using the deprecated -variables.) +This is a shorthand for \code{print_exception(*\function{sys.exc_info()}}. \end{funcdesc} \begin{funcdesc}{format_exc}{\optional{limit}} Modified: python/branches/p3yk/Doc/ref/ref7.tex ============================================================================== --- python/branches/p3yk/Doc/ref/ref7.tex (original) +++ python/branches/p3yk/Doc/ref/ref7.tex Fri Mar 17 06:49:33 2006 @@ -250,21 +250,15 @@ not handle the exception.) Before an except clause's suite is executed, details about the -exception are assigned to three variables in the -\module{sys}\refbimodindex{sys} module: \code{sys.exc_type} receives -the object identifying the exception; \code{sys.exc_value} receives -the exception's parameter; \code{sys.exc_traceback} receives a +exception are stored in the \module{sys}\refbimodindex{sys} module +and can be access via \function{sys.exc_info()}. \function{sys.exc_info()} +returns a 3-tuple consisting of: \code{exc_type} receives +the object identifying the exception; \code{exc_value} receives +the exception's parameter; \code{exc_traceback} receives a traceback object\obindex{traceback} (see section~\ref{traceback}) identifying the point in the program where the exception occurred. -These details are also available through the \function{sys.exc_info()} -function, which returns a tuple \code{(\var{exc_type}, \var{exc_value}, -\var{exc_traceback})}. Use of the corresponding variables is -deprecated in favor of this function, since their use is unsafe in a -threaded program. As of Python 1.5, the variables are restored to -their previous values (before the call) when returning from a function -that handled an exception. -\withsubitem{(in module sys)}{\ttindex{exc_type} - \ttindex{exc_value}\ttindex{exc_traceback}} +\function{sys.exc_info()} values are restored to their previous values +(before the call) when returning from a function that handled an exception. The optional \keyword{else} clause is executed if and when control flows off the end of the \keyword{try} clause.\footnote{ Modified: python/branches/p3yk/Lib/SimpleXMLRPCServer.py ============================================================================== --- python/branches/p3yk/Lib/SimpleXMLRPCServer.py (original) +++ python/branches/p3yk/Lib/SimpleXMLRPCServer.py Fri Mar 17 06:49:33 2006 @@ -261,7 +261,7 @@ except: # report exception back to server response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)), + xmlrpclib.Fault(1, "%s:%s" % sys.exc_info()[:2]), encoding=self.encoding, allow_none=self.allow_none, ) @@ -362,7 +362,7 @@ except: results.append( {'faultCode' : 1, - 'faultString' : "%s:%s" % (sys.exc_type, sys.exc_value)} + 'faultString' : "%s:%s" % sys.exc_info()[:2]} ) return results Modified: python/branches/p3yk/Lib/idlelib/WindowList.py ============================================================================== --- python/branches/p3yk/Lib/idlelib/WindowList.py (original) +++ python/branches/p3yk/Lib/idlelib/WindowList.py Fri Mar 17 06:49:33 2006 @@ -45,8 +45,8 @@ try: callback() except: - print "warning: callback failed in WindowList", \ - sys.exc_type, ":", sys.exc_value + t, v, tb = sys.exc_info() + print "warning: callback failed in WindowList", t, ":", v registry = WindowList() Modified: python/branches/p3yk/Lib/lib-tk/Tkinter.py ============================================================================== --- python/branches/p3yk/Lib/lib-tk/Tkinter.py (original) +++ python/branches/p3yk/Lib/lib-tk/Tkinter.py Fri Mar 17 06:49:33 2006 @@ -1108,7 +1108,7 @@ def _report_exception(self): """Internal function.""" import sys - exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback + exc, val, tb = sys.exc_info() root = self._root() root.report_callback_exception(exc, val, tb) def _configure(self, cmd, cnf, kw): Modified: python/branches/p3yk/Lib/traceback.py ============================================================================== --- python/branches/p3yk/Lib/traceback.py (original) +++ python/branches/p3yk/Lib/traceback.py Fri Mar 17 06:49:33 2006 @@ -203,9 +203,7 @@ def print_exc(limit=None, file=None): - """Shorthand for 'print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)'. - (In fact, it uses sys.exc_info() to retrieve the same information - in a thread-safe way.)""" + """Shorthand for 'print_exception(*sys.exc_info(), limit, file)'.""" if file is None: file = sys.stderr try: Modified: python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py Fri Mar 17 06:49:33 2006 @@ -105,7 +105,8 @@ raise 'spam' except: pass - frame = sys.exc_traceback.tb_frame + tb = sys.exc_info()[2] + frame = tb.tb_frame while frame is not None: del frame.f_trace frame = frame.f_back @@ -527,7 +528,7 @@ raise bdb.BdbQuit except: print 'XXX Exception during debugger interaction.', \ - self.formatexception(sys.exc_type, sys.exc_value) + self.formatexception(sys.exc_info[:2]) import traceback traceback.print_exc() return self.trace_dispatch @@ -855,7 +856,8 @@ try: raise 'spam' except: - frame = sys.exc_traceback.tb_frame.f_back + tb = sys.exc_info()[2] + frame = tb.tb_frame.f_back d.start(frame) def startfrombottom(): @@ -876,7 +878,8 @@ raise 'spam' except: pass - frame = sys.exc_traceback.tb_frame + tb = sys.exc_info()[2] + frame = tb.tb_frame while 1: if frame.f_code.co_name == 'mainloop' or frame.f_back is None: break Modified: python/branches/p3yk/Mac/Tools/IDE/PyEdit.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/PyEdit.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/PyEdit.py Fri Mar 17 06:49:33 2006 @@ -1212,7 +1212,7 @@ except: if debugging: sys.settrace(None) - PyDebugger.postmortem(sys.exc_type, sys.exc_value, sys.exc_traceback) + PyDebugger.postmortem(*sys.exc_info()) return else: tracebackwindow.traceback(1, filename) @@ -1289,7 +1289,6 @@ settings = FontSettings.FontDialog(self.fontsettings, self.tabsettings) if settings: self.fontsettings, self.tabsettings = settings - sys.exc_traceback = None self.w.fonttext.set(self.template % (self.fontsettings[0], self.fontsettings[2])) def close(self): @@ -1327,7 +1326,6 @@ fontsettings = prefs.pyedit.fontsettings = ("Geneva", 0, 10, (0, 0, 0)) tabsettings = prefs.pyedit.tabsettings = (8, 1) windowsize = prefs.pyedit.windowsize = (500, 250) - sys.exc_traceback = None return fontsettings, tabsettings, windowsize def seteditorprefs(fontsettings, tabsettings, windowsize): Modified: python/branches/p3yk/Python/sysmodule.c ============================================================================== --- python/branches/p3yk/Python/sysmodule.c (original) +++ python/branches/p3yk/Python/sysmodule.c Fri Mar 17 06:49:33 2006 @@ -179,10 +179,6 @@ Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); - /* For b/w compatibility */ - PySys_SetObject("exc_type", Py_None); - PySys_SetObject("exc_value", Py_None); - PySys_SetObject("exc_traceback", Py_None); Py_INCREF(Py_None); return Py_None; } Modified: python/branches/p3yk/Tools/faqwiz/faqw.py ============================================================================== --- python/branches/p3yk/Tools/faqwiz/faqw.py (original) +++ python/branches/p3yk/Tools/faqwiz/faqw.py Fri Mar 17 06:49:33 2006 @@ -27,7 +27,7 @@ except SystemExit, n: sys.exit(n) except: - t, v, tb = sys.exc_type, sys.exc_value, sys.exc_traceback + t, v, tb = sys.exc_info() print import cgi cgi.print_exception(t, v, tb) From python-checkins at python.org Fri Mar 17 06:59:20 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 06:59:20 +0100 (CET) Subject: [Python-checkins] r43096 - in python/branches/p3yk: Lib/test/test_builtin.py Python/bltinmodule.c Message-ID: <20060317055920.6319E1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 06:59:16 2006 New Revision: 43096 Modified: python/branches/p3yk/Lib/test/test_builtin.py python/branches/p3yk/Python/bltinmodule.c Log: raw_input() -> input(). old input behavior is history (and test_builtin passes again). It was failing due to future division. Modified: python/branches/p3yk/Lib/test/test_builtin.py ============================================================================== --- python/branches/p3yk/Lib/test/test_builtin.py (original) +++ python/branches/p3yk/Lib/test/test_builtin.py Fri Mar 17 06:59:16 2006 @@ -658,8 +658,6 @@ id([0,1,2,3]) id({'spam': 1, 'eggs': 2, 'ham': 3}) - # Test input() later, together with raw_input - def test_int(self): self.assertEqual(int(314), 314) self.assertEqual(int(3.14), 3) @@ -1108,7 +1106,7 @@ self.assertRaises(TypeError, oct, ()) def write_testfile(self): - # NB the first 4 lines are also used to test input and raw_input, below + # NB the first 4 lines are also used to test input, below fp = open(TESTFN, 'w') try: fp.write('1+1\n') @@ -1267,7 +1265,7 @@ self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint) self.assertRaises(OverflowError, range, 0, 2*sys.maxint) - def test_input_and_raw_input(self): + def test_input(self): self.write_testfile() fp = open(TESTFN, 'r') savestdin = sys.stdin @@ -1275,29 +1273,18 @@ try: sys.stdin = fp sys.stdout = BitBucket() - self.assertEqual(input(), 2) - self.assertEqual(input('testing\n'), 2) - self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.') - self.assertEqual(raw_input('testing\n'), 'Dear John') + self.assertEqual(input(), '1+1') + self.assertEqual(input('testing\n'), '1+1') + self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.') + self.assertEqual(input('testing\n'), 'Dear John') sys.stdin = cStringIO.StringIO("NULL\0") self.assertRaises(TypeError, input, 42, 42) - sys.stdin = cStringIO.StringIO(" 'whitespace'") - self.assertEqual(input(), 'whitespace') + whitespace = " 'whitespace'" + sys.stdin = cStringIO.StringIO(whitespace) + self.assertEqual(input(), whitespace) sys.stdin = cStringIO.StringIO() self.assertRaises(EOFError, input) - # SF 876178: make sure input() respect future options. - sys.stdin = cStringIO.StringIO('1/2') - sys.stdout = cStringIO.StringIO() - exec compile('print input()', 'test_builtin_tmp', 'exec') - sys.stdin.seek(0, 0) - exec compile('from __future__ import division;print input()', - 'test_builtin_tmp', 'exec') - sys.stdin.seek(0, 0) - exec compile('print input()', 'test_builtin_tmp', 'exec') - self.assertEqual(sys.stdout.getvalue().splitlines(), - ['0', '0.5', '0']) - del sys.stdout self.assertRaises(RuntimeError, input, 'prompt') del sys.stdin Modified: python/branches/p3yk/Python/bltinmodule.c ============================================================================== --- python/branches/p3yk/Python/bltinmodule.c (original) +++ python/branches/p3yk/Python/bltinmodule.c Fri Mar 17 06:59:16 2006 @@ -1073,42 +1073,89 @@ Return the hexadecimal representation of an integer or long integer."); -static PyObject *builtin_raw_input(PyObject *, PyObject *); - static PyObject * builtin_input(PyObject *self, PyObject *args) { - PyObject *line; - char *str; - PyObject *res; - PyObject *globals, *locals; - PyCompilerFlags cf; + PyObject *v = NULL; + PyObject *fin = PySys_GetObject("stdin"); + PyObject *fout = PySys_GetObject("stdout"); - line = builtin_raw_input(self, args); - if (line == NULL) - return line; - if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str)) - return NULL; - while (*str == ' ' || *str == '\t') - str++; - globals = PyEval_GetGlobals(); - locals = PyEval_GetLocals(); - if (PyDict_GetItemString(globals, "__builtins__") == NULL) { - if (PyDict_SetItemString(globals, "__builtins__", - PyEval_GetBuiltins()) != 0) + if (!PyArg_UnpackTuple(args, "input", 0, 1, &v)) + return NULL; + + if (fin == NULL) { + PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdin"); + return NULL; + } + if (fout == NULL) { + PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdout"); + return NULL; + } + if (PyFile_SoftSpace(fout, 0)) { + if (PyFile_WriteString(" ", fout) != 0) return NULL; } - cf.cf_flags = 0; - PyEval_MergeCompilerFlags(&cf); - res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); - Py_DECREF(line); - return res; + if (PyFile_Check(fin) && PyFile_Check(fout) + && isatty(fileno(PyFile_AsFile(fin))) + && isatty(fileno(PyFile_AsFile(fout)))) { + PyObject *po; + char *prompt; + char *s; + PyObject *result; + if (v != NULL) { + po = PyObject_Str(v); + if (po == NULL) + return NULL; + prompt = PyString_AsString(po); + if (prompt == NULL) + return NULL; + } + else { + po = NULL; + prompt = ""; + } + s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), + prompt); + Py_XDECREF(po); + if (s == NULL) { + if (!PyErr_Occurred()) + PyErr_SetNone(PyExc_KeyboardInterrupt); + return NULL; + } + if (*s == '\0') { + PyErr_SetNone(PyExc_EOFError); + result = NULL; + } + else { /* strip trailing '\n' */ + size_t len = strlen(s); + if (len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "[raw_]input: input too long"); + result = NULL; + } + else { + result = PyString_FromStringAndSize(s, + (int)(len-1)); + } + } + PyMem_FREE(s); + return result; + } + if (v != NULL) { + if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) + return NULL; + } + return PyFile_GetLine(fin, -1); } PyDoc_STRVAR(input_doc, -"input([prompt]) -> value\n\ +"input([prompt]) -> string\n\ \n\ -Equivalent to eval(raw_input(prompt))."); +Read a string from standard input. The trailing newline is stripped.\n\ +If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ +On Unix, GNU readline is used if enabled. The prompt string, if given,\n\ +is printed without a trailing newline before reading."); + static PyObject * @@ -1687,90 +1734,6 @@ static PyObject * -builtin_raw_input(PyObject *self, PyObject *args) -{ - PyObject *v = NULL; - PyObject *fin = PySys_GetObject("stdin"); - PyObject *fout = PySys_GetObject("stdout"); - - if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v)) - return NULL; - - if (fin == NULL) { - PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdin"); - return NULL; - } - if (fout == NULL) { - PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdout"); - return NULL; - } - if (PyFile_SoftSpace(fout, 0)) { - if (PyFile_WriteString(" ", fout) != 0) - return NULL; - } - if (PyFile_Check(fin) && PyFile_Check(fout) - && isatty(fileno(PyFile_AsFile(fin))) - && isatty(fileno(PyFile_AsFile(fout)))) { - PyObject *po; - char *prompt; - char *s; - PyObject *result; - if (v != NULL) { - po = PyObject_Str(v); - if (po == NULL) - return NULL; - prompt = PyString_AsString(po); - if (prompt == NULL) - return NULL; - } - else { - po = NULL; - prompt = ""; - } - s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), - prompt); - Py_XDECREF(po); - if (s == NULL) { - if (!PyErr_Occurred()) - PyErr_SetNone(PyExc_KeyboardInterrupt); - return NULL; - } - if (*s == '\0') { - PyErr_SetNone(PyExc_EOFError); - result = NULL; - } - else { /* strip trailing '\n' */ - size_t len = strlen(s); - if (len > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "[raw_]input: input too long"); - result = NULL; - } - else { - result = PyString_FromStringAndSize(s, - (int)(len-1)); - } - } - PyMem_FREE(s); - return result; - } - if (v != NULL) { - if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) - return NULL; - } - return PyFile_GetLine(fin, -1); -} - -PyDoc_STRVAR(raw_input_doc, -"raw_input([prompt]) -> string\n\ -\n\ -Read a string from standard input. The trailing newline is stripped.\n\ -If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ -On Unix, GNU readline is used if enabled. The prompt string, if given,\n\ -is printed without a trailing newline before reading."); - - -static PyObject * builtin_reduce(PyObject *self, PyObject *args) { PyObject *seq, *func, *result = NULL, *it; @@ -2244,7 +2207,6 @@ {"ord", builtin_ord, METH_O, ord_doc}, {"pow", builtin_pow, METH_VARARGS, pow_doc}, {"range", builtin_range, METH_VARARGS, range_doc}, - {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc}, {"reduce", builtin_reduce, METH_VARARGS, reduce_doc}, {"reload", builtin_reload, METH_O, reload_doc}, {"repr", builtin_repr, METH_O, repr_doc}, From python-checkins at python.org Fri Mar 17 07:04:36 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 07:04:36 +0100 (CET) Subject: [Python-checkins] r43097 - in python/branches/p3yk: Lib/test/test_builtin.py Python/bltinmodule.c Message-ID: <20060317060436.6EF821E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 07:04:34 2006 New Revision: 43097 Modified: python/branches/p3yk/Lib/test/test_builtin.py python/branches/p3yk/Python/bltinmodule.c Log: Whoops, input *and* raw_input are slated for removal, and now both are gone. Modified: python/branches/p3yk/Lib/test/test_builtin.py ============================================================================== --- python/branches/p3yk/Lib/test/test_builtin.py (original) +++ python/branches/p3yk/Lib/test/test_builtin.py Fri Mar 17 07:04:34 2006 @@ -1106,7 +1106,6 @@ self.assertRaises(TypeError, oct, ()) def write_testfile(self): - # NB the first 4 lines are also used to test input, below fp = open(TESTFN, 'w') try: fp.write('1+1\n') @@ -1265,36 +1264,6 @@ self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint) self.assertRaises(OverflowError, range, 0, 2*sys.maxint) - def test_input(self): - self.write_testfile() - fp = open(TESTFN, 'r') - savestdin = sys.stdin - savestdout = sys.stdout # Eats the echo - try: - sys.stdin = fp - sys.stdout = BitBucket() - self.assertEqual(input(), '1+1') - self.assertEqual(input('testing\n'), '1+1') - self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.') - self.assertEqual(input('testing\n'), 'Dear John') - sys.stdin = cStringIO.StringIO("NULL\0") - self.assertRaises(TypeError, input, 42, 42) - whitespace = " 'whitespace'" - sys.stdin = cStringIO.StringIO(whitespace) - self.assertEqual(input(), whitespace) - sys.stdin = cStringIO.StringIO() - self.assertRaises(EOFError, input) - - del sys.stdout - self.assertRaises(RuntimeError, input, 'prompt') - del sys.stdin - self.assertRaises(RuntimeError, input, 'prompt') - finally: - sys.stdin = savestdin - sys.stdout = savestdout - fp.close() - unlink(TESTFN) - def test_reduce(self): self.assertEqual(reduce(lambda x, y: x+y, ['a', 'b', 'c'], ''), 'abc') self.assertEqual( Modified: python/branches/p3yk/Python/bltinmodule.c ============================================================================== --- python/branches/p3yk/Python/bltinmodule.c (original) +++ python/branches/p3yk/Python/bltinmodule.c Fri Mar 17 07:04:34 2006 @@ -1074,91 +1074,6 @@ static PyObject * -builtin_input(PyObject *self, PyObject *args) -{ - PyObject *v = NULL; - PyObject *fin = PySys_GetObject("stdin"); - PyObject *fout = PySys_GetObject("stdout"); - - if (!PyArg_UnpackTuple(args, "input", 0, 1, &v)) - return NULL; - - if (fin == NULL) { - PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdin"); - return NULL; - } - if (fout == NULL) { - PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdout"); - return NULL; - } - if (PyFile_SoftSpace(fout, 0)) { - if (PyFile_WriteString(" ", fout) != 0) - return NULL; - } - if (PyFile_Check(fin) && PyFile_Check(fout) - && isatty(fileno(PyFile_AsFile(fin))) - && isatty(fileno(PyFile_AsFile(fout)))) { - PyObject *po; - char *prompt; - char *s; - PyObject *result; - if (v != NULL) { - po = PyObject_Str(v); - if (po == NULL) - return NULL; - prompt = PyString_AsString(po); - if (prompt == NULL) - return NULL; - } - else { - po = NULL; - prompt = ""; - } - s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), - prompt); - Py_XDECREF(po); - if (s == NULL) { - if (!PyErr_Occurred()) - PyErr_SetNone(PyExc_KeyboardInterrupt); - return NULL; - } - if (*s == '\0') { - PyErr_SetNone(PyExc_EOFError); - result = NULL; - } - else { /* strip trailing '\n' */ - size_t len = strlen(s); - if (len > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "[raw_]input: input too long"); - result = NULL; - } - else { - result = PyString_FromStringAndSize(s, - (int)(len-1)); - } - } - PyMem_FREE(s); - return result; - } - if (v != NULL) { - if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) - return NULL; - } - return PyFile_GetLine(fin, -1); -} - -PyDoc_STRVAR(input_doc, -"input([prompt]) -> string\n\ -\n\ -Read a string from standard input. The trailing newline is stripped.\n\ -If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ -On Unix, GNU readline is used if enabled. The prompt string, if given,\n\ -is printed without a trailing newline before reading."); - - - -static PyObject * builtin_intern(PyObject *self, PyObject *args) { PyObject *s; @@ -2193,7 +2108,6 @@ {"hash", builtin_hash, METH_O, hash_doc}, {"hex", builtin_hex, METH_O, hex_doc}, {"id", builtin_id, METH_O, id_doc}, - {"input", builtin_input, METH_VARARGS, input_doc}, {"intern", builtin_intern, METH_VARARGS, intern_doc}, {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc}, {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc}, From python-checkins at python.org Fri Mar 17 07:50:06 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 07:50:06 +0100 (CET) Subject: [Python-checkins] r43098 - in python/branches/p3yk: Demo/pdist/cmptree.py Demo/pdist/mac.py Demo/pdist/rcvs.py Demo/pdist/sumtree.py Demo/scripts/unbirthday.py Demo/sockets/ftp.py Demo/sockets/gopher.py Demo/tkinter/guido/wish.py Doc/lib/libcmd.tex Doc/lib/libcode.tex Doc/lib/libcrypt.tex Doc/lib/libexcs.tex Doc/lib/libfuncs.tex Doc/lib/libsmtplib.tex Doc/lib/libsys.tex Doc/lib/libtelnetlib.tex Doc/lib/libtermios.tex Doc/ref/ref8.tex Doc/tools/keywords.py Doc/tut/tut.tex Lib/cmd.py Lib/code.py Lib/distutils/command/register.py Lib/getpass.py Lib/idlelib/PyShell.py Lib/pdb.py Lib/plat-mac/aetools.py Lib/pydoc.py Lib/rlcompleter.py Lib/site.py Lib/test/test_exceptions.py Lib/urllib.py Mac/Demo/resources/copyres.py Mac/Demo/sound/morselib.py Misc/Vim/python.vim Misc/cheatsheet Misc/python-mode.el Tools/compiler/regrtest.py Tools/scripts/ftpmirror.py Tools/scripts/treesync.py Tools/scripts/xxci.py Tools/webchecker/wcmac.py Message-ID: <20060317065006.983761E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 07:49:51 2006 New Revision: 43098 Modified: python/branches/p3yk/Demo/pdist/cmptree.py python/branches/p3yk/Demo/pdist/mac.py python/branches/p3yk/Demo/pdist/rcvs.py python/branches/p3yk/Demo/pdist/sumtree.py python/branches/p3yk/Demo/scripts/unbirthday.py python/branches/p3yk/Demo/sockets/ftp.py python/branches/p3yk/Demo/sockets/gopher.py python/branches/p3yk/Demo/tkinter/guido/wish.py python/branches/p3yk/Doc/lib/libcmd.tex python/branches/p3yk/Doc/lib/libcode.tex python/branches/p3yk/Doc/lib/libcrypt.tex python/branches/p3yk/Doc/lib/libexcs.tex python/branches/p3yk/Doc/lib/libfuncs.tex python/branches/p3yk/Doc/lib/libsmtplib.tex python/branches/p3yk/Doc/lib/libsys.tex python/branches/p3yk/Doc/lib/libtelnetlib.tex python/branches/p3yk/Doc/lib/libtermios.tex python/branches/p3yk/Doc/ref/ref8.tex python/branches/p3yk/Doc/tools/keywords.py python/branches/p3yk/Doc/tut/tut.tex python/branches/p3yk/Lib/cmd.py python/branches/p3yk/Lib/code.py python/branches/p3yk/Lib/distutils/command/register.py python/branches/p3yk/Lib/getpass.py python/branches/p3yk/Lib/idlelib/PyShell.py python/branches/p3yk/Lib/pdb.py python/branches/p3yk/Lib/plat-mac/aetools.py python/branches/p3yk/Lib/pydoc.py python/branches/p3yk/Lib/rlcompleter.py python/branches/p3yk/Lib/site.py python/branches/p3yk/Lib/test/test_exceptions.py python/branches/p3yk/Lib/urllib.py python/branches/p3yk/Mac/Demo/resources/copyres.py python/branches/p3yk/Mac/Demo/sound/morselib.py python/branches/p3yk/Misc/Vim/python.vim python/branches/p3yk/Misc/cheatsheet python/branches/p3yk/Misc/python-mode.el python/branches/p3yk/Tools/compiler/regrtest.py python/branches/p3yk/Tools/scripts/ftpmirror.py python/branches/p3yk/Tools/scripts/treesync.py python/branches/p3yk/Tools/scripts/xxci.py python/branches/p3yk/Tools/webchecker/wcmac.py Log: Get rid of a bunch more raw_input references Modified: python/branches/p3yk/Demo/pdist/cmptree.py ============================================================================== --- python/branches/p3yk/Demo/pdist/cmptree.py (original) +++ python/branches/p3yk/Demo/pdist/cmptree.py Fri Mar 17 07:49:51 2006 @@ -6,6 +6,11 @@ import time import os +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def main(): pwd = os.getcwd() s = raw_input("chdir [%s] " % pwd) Modified: python/branches/p3yk/Demo/pdist/mac.py ============================================================================== --- python/branches/p3yk/Demo/pdist/mac.py (original) +++ python/branches/p3yk/Demo/pdist/mac.py Fri Mar 17 07:49:51 2006 @@ -1,14 +1,18 @@ import sys -import string import rcvs +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def main(): while 1: try: line = raw_input('$ ') except EOFError: break - words = string.split(line) + words = line.split() if not words: continue if words[0] != 'rcvs': @@ -16,4 +20,5 @@ sys.argv = words rcvs.main() -main() +if __name__ == '__main__': + main() Modified: python/branches/p3yk/Demo/pdist/rcvs.py ============================================================================== --- python/branches/p3yk/Demo/pdist/rcvs.py (original) +++ python/branches/p3yk/Demo/pdist/rcvs.py Fri Mar 17 07:49:51 2006 @@ -35,7 +35,6 @@ from cvslib import CVS, File import md5 import os -import string import sys from cmdfw import CommandFrameWork @@ -269,13 +268,13 @@ def mailinfo(self, files, message = ""): towhom = "sjoerd at cwi.nl, jack at cwi.nl" # XXX - mailtext = MAILFORM % (towhom, string.join(files), - string.join(files), message) + mailtext = MAILFORM % (towhom, ' '.join(files), + ' '.join(files), message) print '-'*70 print mailtext print '-'*70 ok = raw_input("OK to mail to %s? " % towhom) - if string.lower(string.strip(ok)) in ('y', 'ye', 'yes'): + if ok.lower().strip() in ('y', 'ye', 'yes'): p = os.popen(SENDMAIL, "w") p.write(mailtext) sts = p.close() Modified: python/branches/p3yk/Demo/pdist/sumtree.py ============================================================================== --- python/branches/p3yk/Demo/pdist/sumtree.py (original) +++ python/branches/p3yk/Demo/pdist/sumtree.py Fri Mar 17 07:49:51 2006 @@ -1,4 +1,5 @@ import time +import sys import FSProxy def main(): @@ -9,7 +10,9 @@ proxy._close() t2 = time.time() print t2-t1, "seconds" - raw_input("[Return to exit] ") + sys.stdout.write("[Return to exit] ") + sys.stdout.flush() + sys.stdin.readline() def sumtree(proxy): print "PWD =", proxy.pwd() Modified: python/branches/p3yk/Demo/scripts/unbirthday.py ============================================================================== --- python/branches/p3yk/Demo/scripts/unbirthday.py (original) +++ python/branches/p3yk/Demo/scripts/unbirthday.py Fri Mar 17 07:49:51 2006 @@ -9,6 +9,11 @@ import time import calendar +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def main(): # Note that the range checks below also check for bad types, # e.g. 3.14 or (). However syntactically invalid replies Modified: python/branches/p3yk/Demo/sockets/ftp.py ============================================================================== --- python/branches/p3yk/Demo/sockets/ftp.py (original) +++ python/branches/p3yk/Demo/sockets/ftp.py Fri Mar 17 07:49:51 2006 @@ -130,6 +130,11 @@ sys.stdout.write(data) print '(end of data connection)' +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + # Get a command from the user. # def getcommand(): @@ -143,4 +148,5 @@ # Call the main program. # -main() +if __name__ == '__main__': + main() Modified: python/branches/p3yk/Demo/sockets/gopher.py ============================================================================== --- python/branches/p3yk/Demo/sockets/gopher.py (original) +++ python/branches/p3yk/Demo/sockets/gopher.py Fri Mar 17 07:49:51 2006 @@ -4,7 +4,6 @@ # # Usage: gopher [ [selector] host [port] ] -import string import sys import os import socket @@ -42,7 +41,7 @@ if not port: port = DEF_PORT elif type(port) == type(''): - port = string.atoi(port) + port = int(port) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) return s @@ -73,7 +72,7 @@ print '(Empty line from server)' continue typechar = line[0] - parts = string.splitfields(line[1:], TAB) + parts = line[1:].split(TAB) if len(parts) < 4: print '(Bad line from server: %r)' % (line,) continue @@ -160,7 +159,7 @@ for i in range(len(list)): item = list[i] typechar, description = item[0], item[1] - print string.rjust(repr(i+1), 3) + ':', description, + print repr(i+1).rjust(3) + ':', description, if typename.has_key(typechar): print typename[typechar] else: @@ -175,8 +174,8 @@ if not str: return try: - choice = string.atoi(str) - except string.atoi_error: + choice = int(str) + except ValueError: print 'Choice must be a number; try again:' continue if not 0 < choice <= len(list): @@ -218,6 +217,11 @@ print 'IOError:', msg x.close() +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + # Browse a search index def browse_search(selector, host, port): while 1: @@ -230,7 +234,7 @@ except EOFError: print break - query = string.strip(query) + query = query.strip() if not query: break if '\t' in query: @@ -300,11 +304,11 @@ except EOFError: print return None - savefile = string.strip(savefile) + savefile = savefile.strip() if not savefile: return None if savefile[0] == '|': - cmd = string.strip(savefile[1:]) + cmd = savefile[1:].strip() try: p = os.popen(cmd, 'w') except IOError, msg: @@ -331,10 +335,10 @@ browser(sys.argv[1], sys.argv[2], sys.argv[3]) elif sys.argv[2:]: try: - port = string.atoi(sys.argv[2]) + port = int(sys.argv[2]) selector = '' host = sys.argv[1] - except string.atoi_error: + except ValueError: selector = sys.argv[1] host = sys.argv[2] port = '' Modified: python/branches/p3yk/Demo/tkinter/guido/wish.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/wish.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/wish.py Fri Mar 17 07:49:51 2006 @@ -2,6 +2,7 @@ import _tkinter import os +import sys tk = _tkinter.create(os.environ['DISPLAY'], 'wish', 'Tk', 1) tk.call('update') @@ -12,7 +13,9 @@ if cmd: prompt = '' else: prompt = '% ' try: - line = raw_input(prompt) + sys.stdout.write(prompt) + sys.stdout.flush() + line = sys.stdin.readline() except EOFError: break cmd = cmd + (line + '\n') Modified: python/branches/p3yk/Doc/lib/libcmd.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libcmd.tex (original) +++ python/branches/p3yk/Doc/lib/libcmd.tex Fri Mar 17 07:49:51 2006 @@ -186,13 +186,3 @@ headers. If empty, no ruler line is drawn. It defaults to \character{=}. \end{memberdesc} - -\begin{memberdesc}{use_rawinput} -A flag, defaulting to true. If true, \method{cmdloop()} uses -\function{raw_input()} to display a prompt and read the next command; -if false, \method{sys.stdout.write()} and -\method{sys.stdin.readline()} are used. (This means that by -importing \refmodule{readline}, on systems that support it, the -interpreter will automatically support \program{Emacs}-like line editing -and command-history keystrokes.) -\end{memberdesc} Modified: python/branches/p3yk/Doc/lib/libcode.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libcode.tex (original) +++ python/branches/p3yk/Doc/lib/libcode.tex Fri Mar 17 07:49:51 2006 @@ -167,7 +167,7 @@ \begin{methoddesc}{raw_input}{\optional{prompt}} Write a prompt and read a line. The returned line does not include the trailing newline. When the user enters the \EOF{} key sequence, -\exception{EOFError} is raised. The base implementation uses the -built-in function \function{raw_input()}; a subclass may replace this +\exception{EOFError} is raised. The base implementation reads from +\code{sys.stdin}; a subclass may replace this with a different implementation. \end{methoddesc} Modified: python/branches/p3yk/Doc/lib/libcrypt.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libcrypt.tex (original) +++ python/branches/p3yk/Doc/lib/libcrypt.tex Fri Mar 17 07:49:51 2006 @@ -41,6 +41,12 @@ \begin{verbatim} import crypt, getpass, pwd +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def login(): username = raw_input('Python login:') cryptedpasswd = pwd.getpwnam(username)[1] Modified: python/branches/p3yk/Doc/lib/libexcs.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libexcs.tex (original) +++ python/branches/p3yk/Doc/lib/libexcs.tex Fri Mar 17 07:49:51 2006 @@ -153,9 +153,7 @@ \begin{excdesc}{EOFError} % XXXJH xrefs here - Raised when one of the built-in functions (\function{input()} or - \function{raw_input()}) hits an end-of-file condition (\EOF) without - reading any data. + Raised when attempting to read beyond the end of a file. % XXXJH xrefs here (N.B.: the \method{read()} and \method{readline()} methods of file objects return an empty string when they hit \EOF.) @@ -213,9 +211,6 @@ \kbd{Control-C} or \kbd{Delete}). During execution, a check for interrupts is made regularly. % XXX(hylton) xrefs here - Interrupts typed when a built-in function \function{input()} or - \function{raw_input()} is waiting for input also raise this - exception. The exception inherits from \exception{BaseException} so as to not be accidentally caught by code that catches \exception{Exception} and thus prevent the interpreter from exiting. Modified: python/branches/p3yk/Doc/lib/libfuncs.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libfuncs.tex (original) +++ python/branches/p3yk/Doc/lib/libfuncs.tex Fri Mar 17 07:49:51 2006 @@ -551,23 +551,6 @@ note: this is the address of the object.) \end{funcdesc} -\begin{funcdesc}{input}{\optional{prompt}} - Equivalent to \code{eval(raw_input(\var{prompt}))}. - \warning{This function is not safe from user errors! It - expects a valid Python expression as input; if the input is not - syntactically valid, a \exception{SyntaxError} will be raised. - Other exceptions may be raised if there is an error during - evaluation. (On the other hand, sometimes this is exactly what you - need when writing a quick script for expert use.)} - - If the \refmodule{readline} module was loaded, then - \function{input()} will use it to provide elaborate line editing and - history features. - - Consider using the \function{raw_input()} function for general input - from users. -\end{funcdesc} - \begin{funcdesc}{int}{\optional{x\optional{, radix}}} Convert a string or number to a plain integer. If the argument is a string, it must contain a possibly signed decimal number @@ -811,24 +794,6 @@ \end{verbatim} \end{funcdesc} -\begin{funcdesc}{raw_input}{\optional{prompt}} - If the \var{prompt} argument is present, it is written to standard output - without a trailing newline. The function then reads a line from input, - converts it to a string (stripping a trailing newline), and returns that. - When \EOF{} is read, \exception{EOFError} is raised. Example: - -\begin{verbatim} ->>> s = raw_input('--> ') ---> Monty Python's Flying Circus ->>> s -"Monty Python's Flying Circus" -\end{verbatim} - - If the \refmodule{readline} module was loaded, then - \function{raw_input()} will use it to provide elaborate - line editing and history features. -\end{funcdesc} - \begin{funcdesc}{reduce}{function, sequence\optional{, initializer}} Apply \var{function} of two arguments cumulatively to the items of \var{sequence}, from left to right, so as to reduce the sequence to Modified: python/branches/p3yk/Doc/lib/libsmtplib.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libsmtplib.tex (original) +++ python/branches/p3yk/Doc/lib/libsmtplib.tex Fri Mar 17 07:49:51 2006 @@ -267,6 +267,12 @@ \begin{verbatim} import smtplib +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def prompt(prompt): return raw_input(prompt).strip() Modified: python/branches/p3yk/Doc/lib/libsys.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libsys.tex (original) +++ python/branches/p3yk/Doc/lib/libsys.tex Fri Mar 17 07:49:51 2006 @@ -511,11 +511,8 @@ \dataline{stderr} File objects corresponding to the interpreter's standard input, output and error streams. \code{stdin} is used for all interpreter - input except for scripts but including calls to - \function{input()}\bifuncindex{input} and - \function{raw_input()}\bifuncindex{raw_input}. \code{stdout} is - used for the output of \keyword{print} and expression statements and - for the prompts of \function{input()} and \function{raw_input()}. + input except for scripts. \code{stdout} is + used for the output of \keyword{print} and expression statements. The interpreter's own prompts and (almost all of) its error messages go to \code{stderr}. \code{stdout} and \code{stderr} needn't be built-in file objects: any object is acceptable as long as it has a Modified: python/branches/p3yk/Doc/lib/libtelnetlib.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libtelnetlib.tex (original) +++ python/branches/p3yk/Doc/lib/libtelnetlib.tex Fri Mar 17 07:49:51 2006 @@ -196,6 +196,11 @@ import sys import telnetlib +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + HOST = "localhost" user = raw_input("Enter your remote account: ") password = getpass.getpass() Modified: python/branches/p3yk/Doc/lib/libtermios.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libtermios.tex (original) +++ python/branches/p3yk/Doc/lib/libtermios.tex Fri Mar 17 07:49:51 2006 @@ -91,6 +91,12 @@ old tty attributes are restored exactly no matter what happens: \begin{verbatim} +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def getpass(prompt = "Password: "): import termios, sys fd = sys.stdin.fileno() Modified: python/branches/p3yk/Doc/ref/ref8.tex ============================================================================== --- python/branches/p3yk/Doc/ref/ref8.tex (original) +++ python/branches/p3yk/Doc/ref/ref8.tex Fri Mar 17 07:49:51 2006 @@ -103,10 +103,7 @@ \end{productionlist} Note: to read `raw' input line without interpretation, you can use the -built-in function \function{raw_input()} or the \method{readline()} method -of file objects. +the \method{readline()} method of file objects, including \code{sys.stdin}. \obindex{file} \index{input!raw} -\index{raw input} -\bifuncindex{raw_input} \withsubitem{(file method)}{\ttindex{readline()}} Modified: python/branches/p3yk/Doc/tools/keywords.py ============================================================================== --- python/branches/p3yk/Doc/tools/keywords.py (original) +++ python/branches/p3yk/Doc/tools/keywords.py Fri Mar 17 07:49:51 2006 @@ -2,6 +2,12 @@ # This Python program sorts and reformats the table of keywords in ref2.tex +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + l = [] try: while 1: Modified: python/branches/p3yk/Doc/tut/tut.tex ============================================================================== --- python/branches/p3yk/Doc/tut/tut.tex (original) +++ python/branches/p3yk/Doc/tut/tut.tex Fri Mar 17 07:49:51 2006 @@ -231,7 +231,7 @@ Note that there is a difference between \samp{python file} and \samp{python >> def raw_input(prompt): +... import sys +... sys.stdout.write(prompt) +... sys.stdout.flush() +... return sys.stdin.readline() +... >>> x = int(raw_input("Please enter an integer: ")) >>> if x < 0: ... x = 0 @@ -1453,6 +1459,12 @@ arguments than it is defined to allow. For example: \begin{verbatim} +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) @@ -2711,15 +2723,15 @@ 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', - '__name__', 'abs', 'apply', 'basestring', 'bool', 'buffer', + '__name__', 'abs', 'basestring', 'bool', 'buffer', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', - 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', + 'id', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range', - 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', + 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip'] \end{verbatim} @@ -3412,6 +3424,12 @@ raising the \exception{KeyboardInterrupt} exception. \begin{verbatim} +>>> def raw_input(prompt): +... import sys +... sys.stdout.write(prompt) +... sys.stdout.flush() +... return sys.stdin.readline() +... >>> while True: ... try: ... x = int(raw_input("Please enter a number: ")) @@ -4983,7 +5001,12 @@ placeholders such as the current date, image sequence number, or file format: \begin{verbatim} ->>> import time, os.path +>>> import time, os.path, sys +>>> def raw_input(prompt): +... sys.stdout.write(prompt) +... sys.stdout.flush() +... return sys.stdin.readline() +... >>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg'] >>> class BatchRename(Template): ... delimiter = '%' Modified: python/branches/p3yk/Lib/cmd.py ============================================================================== --- python/branches/p3yk/Lib/cmd.py (original) +++ python/branches/p3yk/Lib/cmd.py Fri Mar 17 07:49:51 2006 @@ -40,18 +40,20 @@ `self.undoc_header' set the headers used for the help function's listings of documented functions, miscellaneous topics, and undocumented functions respectively. - -These interpreters use raw_input; thus, if the readline module is loaded, -they automatically support Emacs-like command history and editing features. """ -import string +import string, sys __all__ = ["Cmd"] PROMPT = '(Cmd) ' IDENTCHARS = string.ascii_letters + string.digits + '_' +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + class Cmd: """A simple framework for writing line-oriented command interpreters. Modified: python/branches/p3yk/Lib/code.py ============================================================================== --- python/branches/p3yk/Lib/code.py (original) +++ python/branches/p3yk/Lib/code.py Fri Mar 17 07:49:51 2006 @@ -269,12 +269,14 @@ The returned line does not include the trailing newline. When the user enters the EOF key sequence, EOFError is raised. - The base implementation uses the built-in function - raw_input(); a subclass may replace this with a different - implementation. + The base implementation uses sys.stdin.readline(); a subclass + may replace this with a different implementation. """ - return raw_input(prompt) + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def interact(banner=None, readfunc=None, local=None): Modified: python/branches/p3yk/Lib/distutils/command/register.py ============================================================================== --- python/branches/p3yk/Lib/distutils/command/register.py (original) +++ python/branches/p3yk/Lib/distutils/command/register.py Fri Mar 17 07:49:51 2006 @@ -13,6 +13,11 @@ from distutils.core import Command from distutils.errors import * +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + class register(Command): description = ("register the distribution with the Python package index") Modified: python/branches/p3yk/Lib/getpass.py ============================================================================== --- python/branches/p3yk/Lib/getpass.py (original) +++ python/branches/p3yk/Lib/getpass.py Fri Mar 17 07:49:51 2006 @@ -69,8 +69,7 @@ def _raw_input(prompt=""): - # A raw_input() replacement that doesn't save the string in the - # GNU readline history. + # This doesn't save the string in the GNU readline history. prompt = str(prompt) if prompt: sys.stdout.write(prompt) Modified: python/branches/p3yk/Lib/idlelib/PyShell.py ============================================================================== --- python/branches/p3yk/Lib/idlelib/PyShell.py (original) +++ python/branches/p3yk/Lib/idlelib/PyShell.py Fri Mar 17 07:49:51 2006 @@ -1122,7 +1122,7 @@ self.text.tag_add("stdin", "iomark", "end-1c") self.text.update_idletasks() if self.reading: - self.top.quit() # Break out of recursive mainloop() in raw_input() + self.top.quit() # Break out of recursive mainloop() else: self.runit() return "break" Modified: python/branches/p3yk/Lib/pdb.py ============================================================================== --- python/branches/p3yk/Lib/pdb.py (original) +++ python/branches/p3yk/Lib/pdb.py Fri Mar 17 07:49:51 2006 @@ -22,6 +22,11 @@ __all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace", "post_mortem", "help"] +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def find_function(funcname, filename): cre = re.compile(r'def\s+%s\s*[(]' % funcname) try: Modified: python/branches/p3yk/Lib/plat-mac/aetools.py ============================================================================== --- python/branches/p3yk/Lib/plat-mac/aetools.py (original) +++ python/branches/p3yk/Lib/plat-mac/aetools.py Fri Mar 17 07:49:51 2006 @@ -342,6 +342,11 @@ # XXXX Should test more, really... def test(): + def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + target = AE.AECreateDesc('sign', 'quil') ae = AE.AECreateAppleEvent('aevt', 'oapp', target, -1, 0) print unpackevent(ae) Modified: python/branches/p3yk/Lib/pydoc.py ============================================================================== --- python/branches/p3yk/Lib/pydoc.py (original) +++ python/branches/p3yk/Lib/pydoc.py Fri Mar 17 07:49:51 2006 @@ -1505,6 +1505,11 @@ done[modname] = 1 writedoc(modname) +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + class Helper: keywords = { 'and': 'BOOLEAN', Modified: python/branches/p3yk/Lib/rlcompleter.py ============================================================================== --- python/branches/p3yk/Lib/rlcompleter.py (original) +++ python/branches/p3yk/Lib/rlcompleter.py Fri Mar 17 07:49:51 2006 @@ -28,12 +28,6 @@ acceptable risk. More complicated expressions (e.g. function calls or indexing operations) are *not* evaluated. -- GNU readline is also used by the built-in functions input() and -raw_input(), and thus these also benefit/suffer from the completer -features. Clearly an interactive application can benefit by -specifying its own completer function and using raw_input() for all -its input. - - When the original stdin is not a tty device, GNU readline is never used, and this module (and the readline module) are silently inactive. Modified: python/branches/p3yk/Lib/site.py ============================================================================== --- python/branches/p3yk/Lib/site.py (original) +++ python/branches/p3yk/Lib/site.py Fri Mar 17 07:49:51 2006 @@ -299,7 +299,9 @@ lineno += self.MAXLINES key = None while key is None: - key = raw_input(prompt) + sys.stdout.write(prompt) + sys.stdout.flush() + key = sys.stdin.readline() if key not in ('', 'q'): key = None if key == 'q': Modified: python/branches/p3yk/Lib/test/test_exceptions.py ============================================================================== --- python/branches/p3yk/Lib/test/test_exceptions.py (original) +++ python/branches/p3yk/Lib/test/test_exceptions.py Fri Mar 17 07:49:51 2006 @@ -44,8 +44,8 @@ savestdin = sys.stdin try: try: - sys.stdin = fp - x = raw_input() + import marshal + marshal.loads('') except EOFError: pass finally: Modified: python/branches/p3yk/Lib/urllib.py ============================================================================== --- python/branches/p3yk/Lib/urllib.py (original) +++ python/branches/p3yk/Lib/urllib.py Fri Mar 17 07:49:51 2006 @@ -768,10 +768,11 @@ def prompt_user_passwd(self, host, realm): """Override this in a GUI environment!""" - import getpass + import getpass, sys try: - user = raw_input("Enter username for %s at %s: " % (realm, - host)) + sys.stdout.write("Enter username for %s at %s: " % (realm, host)) + sys.stdout.flush() + user = sys.stdin.readline() passwd = getpass.getpass("Enter password for %s in %s at %s: " % (user, realm, host)) return user, passwd Modified: python/branches/p3yk/Mac/Demo/resources/copyres.py ============================================================================== --- python/branches/p3yk/Mac/Demo/resources/copyres.py (original) +++ python/branches/p3yk/Mac/Demo/resources/copyres.py Fri Mar 17 07:49:51 2006 @@ -6,6 +6,12 @@ WRITE = 2 smAllScripts = -3 +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def copyres(src, dst): """Copy resource from src file to dst file.""" Modified: python/branches/p3yk/Mac/Demo/sound/morselib.py ============================================================================== --- python/branches/p3yk/Mac/Demo/sound/morselib.py (original) +++ python/branches/p3yk/Mac/Demo/sound/morselib.py Fri Mar 17 07:49:51 2006 @@ -61,11 +61,10 @@ } def morsecode(s): - from string import lower m = '' for c in s: - c = lower(c) - if morsetab.has_key(c): + c = c.lower() + if c in morsetab: c = morsetab[c] + ' ' else: c = '? ' @@ -107,9 +106,12 @@ def sendmorse(self, s): for c in s: - if c == '.': self.dot() - elif c == '-': self.dah() - else: self.pdah() + if c == '.': + self.dot() + elif c == '-': + self.dah() + else: + self.pdah() self.pdot() def sendascii(self, s): @@ -122,8 +124,9 @@ import Audio_mac class MyAudio(Audio_mac.Play_Audio_mac): def _callback(self, *args): - if hasattr(self, 'usercallback'): self.usercallback() - apply(Audio_mac.Play_Audio_mac._callback, (self,) + args) + if hasattr(self, 'usercallback'): + self.usercallback() + Audio_mac.Play_Audio_mac._callback(self, args) class MacMorse(BaseMorse): @@ -169,12 +172,21 @@ def usercallback(self): if self.morsequeue: c, self.morsequeue = self.morsequeue[0], self.morsequeue[1:] - if c == '.': self.dot() - elif c == '-': self.dah() - else: self.pdah() + if c == '.': + self.dot() + elif c == '-': + self.dah() + else: + self.pdah() self.pdot() +def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def test(): m = MacMorse() while 1: @@ -183,6 +195,8 @@ except (EOFError, KeyboardInterrupt): break m.send(line) - while m.morsequeue: pass + while m.morsequeue: + pass -test() +if __name__ == '__main__': + test() Modified: python/branches/p3yk/Misc/Vim/python.vim ============================================================================== --- python/branches/p3yk/Misc/Vim/python.vim (original) +++ python/branches/p3yk/Misc/Vim/python.vim Fri Mar 17 07:49:51 2006 @@ -63,16 +63,16 @@ if exists("python_highlight_builtins") syn keyword pythonBuiltin unichr all set abs vars int __import__ unicode - syn keyword pythonBuiltin enumerate reduce coerce intern exit issubclass - syn keyword pythonBuiltin divmod file Ellipsis apply isinstance open any + syn keyword pythonBuiltin enumerate reduce exit issubclass + syn keyword pythonBuiltin divmod file Ellipsis isinstance open any syn keyword pythonBuiltin locals help filter basestring slice copyright min - syn keyword pythonBuiltin super sum tuple hex execfile long id xrange chr + syn keyword pythonBuiltin super sum tuple hex execfile long id chr syn keyword pythonBuiltin complex bool zip pow dict True oct NotImplemented syn keyword pythonBuiltin map None float hash getattr buffer max reversed syn keyword pythonBuiltin object quit len repr callable credits setattr syn keyword pythonBuiltin eval frozenset sorted ord __debug__ hasattr - syn keyword pythonBuiltin delattr False input license classmethod type - syn keyword pythonBuiltin raw_input list iter compile reload range globals + syn keyword pythonBuiltin delattr False license classmethod type + syn keyword pythonBuiltin list iter reload range globals syn keyword pythonBuiltin staticmethod str property round dir cmp endif Modified: python/branches/p3yk/Misc/cheatsheet ============================================================================== --- python/branches/p3yk/Misc/cheatsheet (original) +++ python/branches/p3yk/Misc/cheatsheet Fri Mar 17 07:49:51 2006 @@ -925,8 +925,6 @@ globals[, locals[, more details) fromlist]]]) abs(x) Return the absolute value of number x. -apply(f, args[, Calls func/method f with arguments args and optional -keywords]) keywords. bool(x) Returns True when the argument x is true and False otherwise. buffer(obj) Creates a buffer reference to an object. callable(x) Returns True if x callable, else False. @@ -934,10 +932,6 @@ classmethod(f) Converts a function f, into a method with the class as the first argument. Useful for creating alternative constructors. cmp(x,y) Returns negative, 0, positive if x <, ==, > to y -coerce(x,y) Returns a tuple of the two numeric arguments converted to a - common type. - Compiles string into a code object.filename is used in - error message, can be any string. It isusually the file compile(string, from which the code was read, or eg. ''if not read filename, kind) from file.kind can be 'eval' if string is a single stmt, or 'single' which prints the output of expression statements @@ -971,8 +965,6 @@ help(f) Display documentation on object f. hex(x) Converts a number x to a hexadecimal string. id(object) Returns a unique 'identity' integer for an object. -input([prompt]) Prints prompt if given. Reads input and evaluates it. - Converts a number or a string to a plain integer. Optional int(x[, base]) base paramenter specifies base from which to convert string values. intern(aString) Enters aString in the table of "interned strings" @@ -1013,8 +1005,6 @@ range(start [,end Returns list of ints from >= start and < end.With 1 arg, [, step]]) list from 0..arg-1With 2 args, list from start..end-1With 3 args, list from start up to end by step -raw_input([prompt]) Prints prompt if given, then reads string from stdinput (no - trailing \n). See also input(). reduce(f, list [, Applies the binary function f to the items oflist so as to init]) reduce the list to a single value.If init given, it is "prepended" to list. Modified: python/branches/p3yk/Misc/python-mode.el ============================================================================== --- python/branches/p3yk/Misc/python-mode.el (original) +++ python/branches/p3yk/Misc/python-mode.el Fri Mar 17 07:49:51 2006 @@ -378,18 +378,18 @@ "ZeroDivisionError" "__debug__" "__import__" "__name__" "abs" "apply" "basestring" "bool" "buffer" "callable" "chr" "classmethod" - "cmp" "coerce" "compile" "complex" "copyright" + "cmp" "compile" "complex" "copyright" "delattr" "dict" "dir" "divmod" "enumerate" "eval" "execfile" "exit" "file" "filter" "float" "getattr" "globals" "hasattr" - "hash" "hex" "id" "input" "int" "intern" + "hash" "hex" "id" "int" "intern" "isinstance" "issubclass" "iter" "len" "license" "list" "locals" "long" "map" "max" "min" "object" "oct" "open" "ord" "pow" "property" "range" - "raw_input" "reduce" "reload" "repr" "round" + "reduce" "reload" "repr" "round" "setattr" "slice" "staticmethod" "str" "sum" "super" "tuple" "type" "unichr" "unicode" "vars" - "xrange" "zip") + "zip") "\\|")) ) (list Modified: python/branches/p3yk/Tools/compiler/regrtest.py ============================================================================== --- python/branches/p3yk/Tools/compiler/regrtest.py (original) +++ python/branches/p3yk/Tools/compiler/regrtest.py Fri Mar 17 07:49:51 2006 @@ -67,6 +67,11 @@ def cleanup(dir): os.system("rm -rf %s" % dir) +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def main(): lib_dir = copy_library() compile_files(lib_dir) Modified: python/branches/p3yk/Tools/scripts/ftpmirror.py ============================================================================== --- python/branches/p3yk/Tools/scripts/ftpmirror.py (original) +++ python/branches/p3yk/Tools/scripts/ftpmirror.py Fri Mar 17 07:49:51 2006 @@ -352,6 +352,11 @@ def close(self): self.outfp.write('\n') +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + # Ask permission to download a file. def askabout(filetype, filename, pwd): prompt = 'Retrieve %s %s from %s ? [ny] ' % (filetype, filename, pwd) Modified: python/branches/p3yk/Tools/scripts/treesync.py ============================================================================== --- python/branches/p3yk/Tools/scripts/treesync.py (original) +++ python/branches/p3yk/Tools/scripts/treesync.py Fri Mar 17 07:49:51 2006 @@ -187,6 +187,11 @@ f.close() g.close() +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def okay(prompt, answer='ask'): answer = answer.strip().lower() if not answer or answer[0] not in 'ny': Modified: python/branches/p3yk/Tools/scripts/xxci.py ============================================================================== --- python/branches/p3yk/Tools/scripts/xxci.py (original) +++ python/branches/p3yk/Tools/scripts/xxci.py Fri Mar 17 07:49:51 2006 @@ -105,6 +105,11 @@ cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}' sts = os.system(cmd) +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + def askyesno(prompt): s = raw_input(prompt) return s in ['y', 'yes'] Modified: python/branches/p3yk/Tools/webchecker/wcmac.py ============================================================================== --- python/branches/p3yk/Tools/webchecker/wcmac.py (original) +++ python/branches/p3yk/Tools/webchecker/wcmac.py Fri Mar 17 07:49:51 2006 @@ -4,4 +4,6 @@ webchecker.verbose = 2 sys.argv.append('-x') webchecker.main() -raw_input("\nCR to exit: ") +sys.stdout.write("\nCR to exit: ") +sys.stdout.flush() +sys.stdin.readline() From python-checkins at python.org Fri Mar 17 07:58:52 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 07:58:52 +0100 (CET) Subject: [Python-checkins] r43099 - python/branches/p3yk/Include/abstract.h Message-ID: <20060317065852.57FA61E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 07:58:45 2006 New Revision: 43099 Modified: python/branches/p3yk/Include/abstract.h Log: Whitespace changes. Also remove apply from a few comments Modified: python/branches/p3yk/Include/abstract.h ============================================================================== --- python/branches/p3yk/Include/abstract.h (original) +++ python/branches/p3yk/Include/abstract.h Fri Mar 17 07:58:45 2006 @@ -290,35 +290,30 @@ object is callable and 0 otherwise. This function always succeeds. - */ - - PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable_object, - PyObject *args, PyObject *kw); + PyObject *args, PyObject *kw); /* Call a callable Python object, callable_object, with arguments and keywords arguments. The 'args' argument can not be NULL, but the 'kw' argument can be NULL. - */ PyAPI_FUNC(PyObject *) PyObject_CallObject(PyObject *callable_object, - PyObject *args); + PyObject *args); /* Call a callable Python object, callable_object, with arguments given by the tuple, args. If no arguments are needed, then args may be NULL. Returns the result of the call on success, or NULL on failure. This is the equivalent - of the Python expression: apply(o,args). - + of the Python expression: o(*args). */ PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable_object, - char *format, ...); + char *format, ...); /* Call a callable Python object, callable_object, with a @@ -326,13 +321,12 @@ using a mkvalue-style format string. The format may be NULL, indicating that no arguments are provided. Returns the result of the call on success, or NULL on failure. This is - the equivalent of the Python expression: apply(o,args). - + the equivalent of the Python expression: o(*args). */ - PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *m, - char *format, ...); + PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *o, char *method, + char *format, ...); /* Call the method named m of object o with a variable number of @@ -345,19 +339,19 @@ PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, - ...); + ...); /* Call a callable Python object, callable_object, with a variable number of C arguments. The C arguments are provided as PyObject * values, terminated by a NULL. Returns the result of the call on success, or NULL on failure. This is - the equivalent of the Python expression: apply(o,args). + the equivalent of the Python expression: o(*args). */ PyAPI_FUNC(PyObject *) PyObject_CallMethodObjArgs(PyObject *o, - PyObject *m, ...); + PyObject *method, ...); /* Call the method named m of object o with a variable number of @@ -375,7 +369,6 @@ Compute and return the hash, hash_value, of an object, o. On failure, return -1. This is the equivalent of the Python expression: hash(o). - */ @@ -386,7 +379,6 @@ Returns 1 if the object, o, is considered to be true, 0 if o is considered to be false and -1 on failure. This is equivalent to the Python expression: not not o - */ /* Implemented elsewhere: @@ -396,7 +388,6 @@ Returns 0 if the object, o, is considered to be true, 1 if o is considered to be false and -1 on failure. This is equivalent to the Python expression: not o - */ PyAPI_FUNC(PyObject *) PyObject_Type(PyObject *o); @@ -414,7 +405,6 @@ both sequence and mapping protocols, the sequence size is returned. On error, -1 is returned. This is the equivalent to the Python expression: len(o). - */ /* For DLL compatibility */ @@ -449,7 +439,6 @@ Return element of o corresponding to the object, key, or NULL on failure. This is the equivalent of the Python expression: o[key]. - */ PyAPI_FUNC(int) PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v); @@ -476,8 +465,8 @@ */ PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, - const char **buffer, - Py_ssize_t *buffer_len); + const char **buffer, + Py_ssize_t *buffer_len); /* Takes an arbitrary object which must support the (character, @@ -488,7 +477,6 @@ 0 is returned on success. buffer and buffer_len are only set in case no error occurs. Otherwise, -1 is returned and an exception set. - */ PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); @@ -497,12 +485,11 @@ Checks whether an arbitrary object supports the (character, single segment) buffer interface. Returns 1 on success, 0 on failure. - */ PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, - const void **buffer, - Py_ssize_t *buffer_len); + const void **buffer, + Py_ssize_t *buffer_len); /* Same as PyObject_AsCharBuffer() except that this API expects @@ -513,12 +500,11 @@ 0 is returned on success. buffer and buffer_len are only set in case no error occurrs. Otherwise, -1 is returned and an exception set. - */ PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, - void **buffer, - Py_ssize_t *buffer_len); + void **buffer, + Py_ssize_t *buffer_len); /* Takes an arbitrary object which must support the (writeable, @@ -528,7 +514,6 @@ 0 is returned on success. buffer and buffer_len are only set in case no error occurrs. Otherwise, -1 is returned and an exception set. - */ /* Iterators */ @@ -557,7 +542,6 @@ false otherwise. This function always succeeds. - */ PyAPI_FUNC(PyObject *) PyNumber_Add(PyObject *o1, PyObject *o2); @@ -565,8 +549,6 @@ /* Returns the result of adding o1 and o2, or null on failure. This is the equivalent of the Python expression: o1+o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Subtract(PyObject *o1, PyObject *o2); @@ -575,7 +557,6 @@ Returns the result of subtracting o2 from o1, or null on failure. This is the equivalent of the Python expression: o1-o2. - */ PyAPI_FUNC(PyObject *) PyNumber_Multiply(PyObject *o1, PyObject *o2); @@ -584,8 +565,6 @@ Returns the result of multiplying o1 and o2, or null on failure. This is the equivalent of the Python expression: o1*o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Divide(PyObject *o1, PyObject *o2); @@ -593,8 +572,6 @@ /* Returns the result of dividing o1 by o2, or null on failure. This is the equivalent of the Python expression: o1/o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); @@ -603,8 +580,6 @@ Returns the result of dividing o1 by o2 giving an integral result, or null on failure. This is the equivalent of the Python expression: o1//o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); @@ -613,8 +588,6 @@ Returns the result of dividing o1 by o2 giving a float result, or null on failure. This is the equivalent of the Python expression: o1/o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); @@ -623,8 +596,6 @@ Returns the remainder of dividing o1 by o2, or null on failure. This is the equivalent of the Python expression: o1%o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Divmod(PyObject *o1, PyObject *o2); @@ -633,18 +604,15 @@ See the built-in function divmod. Returns NULL on failure. This is the equivalent of the Python expression: divmod(o1,o2). - - */ PyAPI_FUNC(PyObject *) PyNumber_Power(PyObject *o1, PyObject *o2, - PyObject *o3); + PyObject *o3); /* See the built-in function pow. Returns NULL on failure. This is the equivalent of the Python expression: pow(o1,o2,o3), where o3 is optional. - */ PyAPI_FUNC(PyObject *) PyNumber_Negative(PyObject *o); @@ -652,7 +620,6 @@ /* Returns the negation of o on success, or null on failure. This is the equivalent of the Python expression: -o. - */ PyAPI_FUNC(PyObject *) PyNumber_Positive(PyObject *o); @@ -660,7 +627,6 @@ /* Returns the (what?) of o on success, or NULL on failure. This is the equivalent of the Python expression: +o. - */ PyAPI_FUNC(PyObject *) PyNumber_Absolute(PyObject *o); @@ -668,7 +634,6 @@ /* Returns the absolute value of o, or null on failure. This is the equivalent of the Python expression: abs(o). - */ PyAPI_FUNC(PyObject *) PyNumber_Invert(PyObject *o); @@ -677,8 +642,6 @@ Returns the bitwise negation of o on success, or NULL on failure. This is the equivalent of the Python expression: ~o. - - */ PyAPI_FUNC(PyObject *) PyNumber_Lshift(PyObject *o1, PyObject *o2); @@ -687,8 +650,6 @@ Returns the result of left shifting o1 by o2 on success, or NULL on failure. This is the equivalent of the Python expression: o1 << o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Rshift(PyObject *o1, PyObject *o2); @@ -697,7 +658,6 @@ Returns the result of right shifting o1 by o2 on success, or NULL on failure. This is the equivalent of the Python expression: o1 >> o2. - */ PyAPI_FUNC(PyObject *) PyNumber_And(PyObject *o1, PyObject *o2); @@ -707,7 +667,6 @@ NULL on failure. This is the equivalent of the Python expression: o1&o2. - */ PyAPI_FUNC(PyObject *) PyNumber_Xor(PyObject *o1, PyObject *o2); @@ -716,8 +675,6 @@ Returns the bitwise exclusive or of o1 by o2 on success, or NULL on failure. This is the equivalent of the Python expression: o1^o2. - - */ PyAPI_FUNC(PyObject *) PyNumber_Or(PyObject *o1, PyObject *o2); @@ -726,7 +683,6 @@ Returns the result of bitwise or on o1 and o2 on success, or NULL on failure. This is the equivalent of the Python expression: o1|o2. - */ /* Implemented elsewhere: @@ -745,7 +701,6 @@ return -1 (failure) and don't increment the reference counts. The call PyNumber_Coerce(&o1, &o2) is equivalent to the Python statement o1, o2 = coerce(o1, o2). - */ PyAPI_FUNC(Py_ssize_t) PyNumber_Index(PyObject *); @@ -762,7 +717,6 @@ Returns the o converted to an integer object on success, or NULL on failure. This is the equivalent of the Python expression: int(o). - */ PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o); @@ -771,7 +725,6 @@ Returns the o converted to a long integer object on success, or NULL on failure. This is the equivalent of the Python expression: long(o). - */ PyAPI_FUNC(PyObject *) PyNumber_Float(PyObject *o); @@ -790,7 +743,6 @@ Returns the result of adding o2 to o1, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 += o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2); @@ -799,7 +751,6 @@ Returns the result of subtracting o2 from o1, possibly in-place or null on failure. This is the equivalent of the Python expression: o1 -= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2); @@ -808,7 +759,6 @@ Returns the result of multiplying o1 by o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 *= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceDivide(PyObject *o1, PyObject *o2); @@ -817,29 +767,26 @@ Returns the result of dividing o1 by o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 /= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, - PyObject *o2); + PyObject *o2); /* Returns the result of dividing o1 by o2 giving an integral result, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 /= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, - PyObject *o2); + PyObject *o2); /* Returns the result of dividing o1 by o2 giving a float result, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 /= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); @@ -848,17 +795,15 @@ Returns the remainder of dividing o1 by o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 %= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2, - PyObject *o3); + PyObject *o3); /* Returns the result of raising o1 to the power of o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2); @@ -867,7 +812,6 @@ Returns the result of left shifting o1 by o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 <<= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2); @@ -876,7 +820,6 @@ Returns the result of right shifting o1 by o2, possibly in-place or null on failure. This is the equivalent of the Python expression: o1 >>= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2); @@ -885,7 +828,6 @@ Returns the result of bitwise and of o1 and o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 &= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2); @@ -894,7 +836,6 @@ Returns the bitwise exclusive or of o1 by o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 ^= o2. - */ PyAPI_FUNC(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2); @@ -903,7 +844,6 @@ Returns the result of bitwise or of o1 and o2, possibly in-place, or null on failure. This is the equivalent of the Python expression: o1 |= o2. - */ @@ -916,14 +856,12 @@ otherwise. This function always succeeds. - */ PyAPI_FUNC(Py_ssize_t) PySequence_Size(PyObject *o); /* Return the size of sequence object o, or -1 on failure. - */ /* For DLL compatibility */ @@ -938,7 +876,6 @@ Return the concatenation of o1 and o2 on success, and NULL on failure. This is the equivalent of the Python expression: o1+o2. - */ PyAPI_FUNC(PyObject *) PySequence_Repeat(PyObject *o, Py_ssize_t count); @@ -947,7 +884,6 @@ Return the result of repeating sequence object o count times, or NULL on failure. This is the equivalent of the Python expression: o1*count. - */ PyAPI_FUNC(PyObject *) PySequence_GetItem(PyObject *o, Py_ssize_t i); @@ -963,7 +899,6 @@ Return the slice of sequence object o between i1 and i2, or NULL on failure. This is the equivalent of the Python expression: o[i1:i2]. - */ PyAPI_FUNC(int) PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v); @@ -972,7 +907,6 @@ Assign object v to the ith element of o. Returns -1 on failure. This is the equivalent of the Python statement: o[i]=v. - */ PyAPI_FUNC(int) PySequence_DelItem(PyObject *o, Py_ssize_t i); @@ -984,7 +918,7 @@ */ PyAPI_FUNC(int) PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, - PyObject *v); + PyObject *v); /* Assign the sequence object, v, to the slice in sequence From theller at python.net Fri Mar 17 08:01:04 2006 From: theller at python.net (Thomas Heller) Date: Fri, 17 Mar 2006 08:01:04 +0100 Subject: [Python-checkins] r43092 - in python/trunk: Lib/test/leakers/test_ctypes.py Misc/build.sh In-Reply-To: <20060317044539.A46561E4006@bag.python.org> References: <20060317044539.A46561E4006@bag.python.org> Message-ID: neal.norwitz wrote: > Author: neal.norwitz > Date: Fri Mar 17 05:45:38 2006 > New Revision: 43092 > > Added: > python/trunk/Lib/test/leakers/test_ctypes.py (contents, props changed) > Modified: > python/trunk/Misc/build.sh > Log: > Ignore ctypes leaks, but add a test case so we do not forget. > > Added: python/trunk/Lib/test/leakers/test_ctypes.py > ============================================================================== > --- (empty file) > +++ python/trunk/Lib/test/leakers/test_ctypes.py Fri Mar 17 05:45:38 2006 > @@ -0,0 +1,11 @@ > + > +# Taken from Lib/ctypes/test/test_keeprefs.py > +# When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS. > + > +from ctypes import Structure, c_int > + > +def leak(): > + class POINT(Structure): > + _fields_ = [("x", c_int)] > + class RECT(Structure): > + _fields_ = [("ul", POINT)] > I'm still wondering: Is this a bug, and where is it? Creating (new-style) classes in a loop leaks references, this does not look ctypes-specific. Thomas From python-checkins at python.org Fri Mar 17 08:16:01 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 08:16:01 +0100 (CET) Subject: [Python-checkins] r43100 - python/trunk/Lib/test/leakers/test_ctypes.py Message-ID: <20060317071601.9469E1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 08:15:59 2006 New Revision: 43100 Modified: python/trunk/Lib/test/leakers/test_ctypes.py Log: Oops, copied the wrong code from keeprefs. Get the right code this time and call gc.collect(), since there is some garbage. The original code didn't really leak (if gc.collect() was called). Modified: python/trunk/Lib/test/leakers/test_ctypes.py ============================================================================== --- python/trunk/Lib/test/leakers/test_ctypes.py (original) +++ python/trunk/Lib/test/leakers/test_ctypes.py Fri Mar 17 08:15:59 2006 @@ -1,11 +1,16 @@ -# Taken from Lib/ctypes/test/test_keeprefs.py +# Taken from Lib/ctypes/test/test_keeprefs.py, PointerToStructure.test(). # When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS. -from ctypes import Structure, c_int +from ctypes import Structure, c_int, POINTER +import gc -def leak(): +def leak_inner(): class POINT(Structure): _fields_ = [("x", c_int)] class RECT(Structure): - _fields_ = [("ul", POINT)] + _fields_ = [("a", POINTER(POINT))] + +def leak(): + leak_inner() + gc.collect() From nnorwitz at gmail.com Fri Mar 17 08:18:11 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Thu, 16 Mar 2006 23:18:11 -0800 Subject: [Python-checkins] r43092 - in python/trunk: Lib/test/leakers/test_ctypes.py Misc/build.sh In-Reply-To: References: <20060317044539.A46561E4006@bag.python.org> Message-ID: On 3/16/06, Thomas Heller wrote: > > +def leak(): > > + class POINT(Structure): > > + _fields_ = [("x", c_int)] > > + class RECT(Structure): > > + _fields_ = [("ul", POINT)] > > > > I'm still wondering: Is this a bug, and where is it? Creating (new-style) classes in a loop > leaks references, this does not look ctypes-specific. Hmmm, you're right this doesn't leak (after calling gc.collect()). I thought I had a condition where it really did leak. Ok, I copied the wrong code. I updated the file with code that really does leak. I also call gc.collect() since the code above (and the new code) generates some cycles. n From python-checkins at python.org Fri Mar 17 09:00:38 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:00:38 +0100 (CET) Subject: [Python-checkins] r43101 - in python/branches/p3yk: Demo/classes/bitvec.py Demo/metaclasses/Eiffel.py Demo/metaclasses/Meta.py Demo/metaclasses/Simple.py Demo/metaclasses/Synch.py Demo/metaclasses/Trace.py Demo/pdist/RCSProxy.py Demo/pdist/client.py Demo/pdist/server.py Demo/threads/Coroutine.py Demo/threads/Generator.py Demo/threads/find.py Demo/tix/tixwidgets.py Demo/tkinter/guido/AttrDialog.py Demo/tkinter/guido/ManPage.py Demo/tkinter/guido/ShellWindow.py Demo/tkinter/guido/kill.py Demo/tkinter/guido/optionmenu.py Demo/tkinter/guido/sortvisu.py Demo/tkinter/guido/svkill.py Demo/tkinter/matt/window-creation-w-location.py Doc/api/abstract.tex Doc/lib/libfuncs.tex Lib/bsddb/dbobj.py Lib/bsddb/dbshelve.py Lib/bsddb/test/test_basics.py Lib/bsddb/test/test_dbobj.py Lib/bsddb/test/test_join.py Lib/compiler/transformer.py Lib/distutils/archive_util.py Lib/distutils/command/build_ext.py Lib/distutils/command/build_py.py Lib/distutils/dir_util.py Lib/distutils/filelist.py Lib/distutils/util.py Lib/idlelib/MultiCall.py Lib/logging/__init__.py Lib/logging/config.py Lib/plat-mac/gensuitemodule.py Lib/subprocess.py Lib/test/crashers/infinite_rec_4.py Lib/test/test_builtin.py Mac/Demo/sound/morse.py Mac/Tools/IDE/ProfileBrowser.py Mac/Tools/IDE/PyConsole.py Mac/Tools/IDE/PyDebugger.py Mac/Tools/IDE/Wapplication.py Mac/Tools/IDE/Wbase.py Mac/Tools/macfreeze/macgen_bin.py Mac/scripts/buildpkg.py PCbuild/readme.txt Python/bltinmodule.c Tools/freeze/freeze.py Tools/pynche/pyColorChooser.py Tools/unicode/gencodec.py Tools/webchecker/webchecker.py Message-ID: <20060317080038.830291E4010@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:00:19 2006 New Revision: 43101 Removed: python/branches/p3yk/Lib/test/crashers/infinite_rec_4.py Modified: python/branches/p3yk/Demo/classes/bitvec.py python/branches/p3yk/Demo/metaclasses/Eiffel.py python/branches/p3yk/Demo/metaclasses/Meta.py python/branches/p3yk/Demo/metaclasses/Simple.py python/branches/p3yk/Demo/metaclasses/Synch.py python/branches/p3yk/Demo/metaclasses/Trace.py python/branches/p3yk/Demo/pdist/RCSProxy.py python/branches/p3yk/Demo/pdist/client.py python/branches/p3yk/Demo/pdist/server.py python/branches/p3yk/Demo/threads/Coroutine.py python/branches/p3yk/Demo/threads/Generator.py python/branches/p3yk/Demo/threads/find.py python/branches/p3yk/Demo/tix/tixwidgets.py python/branches/p3yk/Demo/tkinter/guido/AttrDialog.py python/branches/p3yk/Demo/tkinter/guido/ManPage.py python/branches/p3yk/Demo/tkinter/guido/ShellWindow.py python/branches/p3yk/Demo/tkinter/guido/kill.py python/branches/p3yk/Demo/tkinter/guido/optionmenu.py python/branches/p3yk/Demo/tkinter/guido/sortvisu.py python/branches/p3yk/Demo/tkinter/guido/svkill.py python/branches/p3yk/Demo/tkinter/matt/window-creation-w-location.py python/branches/p3yk/Doc/api/abstract.tex python/branches/p3yk/Doc/lib/libfuncs.tex python/branches/p3yk/Lib/bsddb/dbobj.py python/branches/p3yk/Lib/bsddb/dbshelve.py python/branches/p3yk/Lib/bsddb/test/test_basics.py python/branches/p3yk/Lib/bsddb/test/test_dbobj.py python/branches/p3yk/Lib/bsddb/test/test_join.py python/branches/p3yk/Lib/compiler/transformer.py python/branches/p3yk/Lib/distutils/archive_util.py python/branches/p3yk/Lib/distutils/command/build_ext.py python/branches/p3yk/Lib/distutils/command/build_py.py python/branches/p3yk/Lib/distutils/dir_util.py python/branches/p3yk/Lib/distutils/filelist.py python/branches/p3yk/Lib/distutils/util.py python/branches/p3yk/Lib/idlelib/MultiCall.py python/branches/p3yk/Lib/logging/__init__.py python/branches/p3yk/Lib/logging/config.py python/branches/p3yk/Lib/plat-mac/gensuitemodule.py python/branches/p3yk/Lib/subprocess.py python/branches/p3yk/Lib/test/test_builtin.py python/branches/p3yk/Mac/Demo/sound/morse.py python/branches/p3yk/Mac/Tools/IDE/ProfileBrowser.py python/branches/p3yk/Mac/Tools/IDE/PyConsole.py python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py python/branches/p3yk/Mac/Tools/IDE/Wapplication.py python/branches/p3yk/Mac/Tools/IDE/Wbase.py python/branches/p3yk/Mac/Tools/macfreeze/macgen_bin.py python/branches/p3yk/Mac/scripts/buildpkg.py python/branches/p3yk/PCbuild/readme.txt python/branches/p3yk/Python/bltinmodule.c python/branches/p3yk/Tools/freeze/freeze.py python/branches/p3yk/Tools/pynche/pyColorChooser.py python/branches/p3yk/Tools/unicode/gencodec.py python/branches/p3yk/Tools/webchecker/webchecker.py Log: Remove apply() Modified: python/branches/p3yk/Demo/classes/bitvec.py ============================================================================== --- python/branches/p3yk/Demo/classes/bitvec.py (original) +++ python/branches/p3yk/Demo/classes/bitvec.py Fri Mar 17 09:00:19 2006 @@ -172,7 +172,7 @@ def __cmp__(self, other, *rest): #rprt('%r.__cmp__%r\n' % (self, (other,) + rest)) if type(other) != type(self): - other = apply(bitvec, (other, ) + rest) + other = bitvec(other, *rest) #expensive solution... recursive binary, with slicing length = self._len if length == 0 or other._len == 0: @@ -237,7 +237,7 @@ #rprt('%s.__setslice__%r\n' % (self, (i, j, sequence) + rest)) i, j = _check_slice(self._len, i, j) if type(sequence) != type(self): - sequence = apply(bitvec, (sequence, ) + rest) + sequence = bitvec(sequence, *rest) #sequence is now of our own type ls_part = self[:i] ms_part = self[j:] @@ -283,7 +283,7 @@ def __and__(self, otherseq, *rest): #rprt('%r.__and__%r\n' % (self, (otherseq,) + rest)) if type(otherseq) != type(self): - otherseq = apply(bitvec, (otherseq, ) + rest) + otherseq = bitvec(otherseq, *rest) #sequence is now of our own type return BitVec(self._data & otherseq._data, \ min(self._len, otherseq._len)) @@ -292,7 +292,7 @@ def __xor__(self, otherseq, *rest): #rprt('%r.__xor__%r\n' % (self, (otherseq,) + rest)) if type(otherseq) != type(self): - otherseq = apply(bitvec, (otherseq, ) + rest) + otherseq = bitvec(otherseq, *rest) #sequence is now of our own type return BitVec(self._data ^ otherseq._data, \ max(self._len, otherseq._len)) @@ -301,7 +301,7 @@ def __or__(self, otherseq, *rest): #rprt('%r.__or__%r\n' % (self, (otherseq,) + rest)) if type(otherseq) != type(self): - otherseq = apply(bitvec, (otherseq, ) + rest) + otherseq = bitvec(otherseq, *rest) #sequence is now of our own type return BitVec(self._data | otherseq._data, \ max(self._len, otherseq._len)) @@ -316,7 +316,7 @@ #needed for *some* of the arithmetic operations #rprt('%r.__coerce__%r\n' % (self, (otherseq,) + rest)) if type(otherseq) != type(self): - otherseq = apply(bitvec, (otherseq, ) + rest) + otherseq = bitvec(otherseq, *rest) return self, otherseq def __int__(self): Modified: python/branches/p3yk/Demo/metaclasses/Eiffel.py ============================================================================== --- python/branches/p3yk/Demo/metaclasses/Eiffel.py (original) +++ python/branches/p3yk/Demo/metaclasses/Eiffel.py Fri Mar 17 09:00:19 2006 @@ -82,10 +82,10 @@ def __call__(self, *args, **kw): if self.pre: - apply(self.pre, args, kw) - Result = apply(self.func, (self.inst,) + args, kw) + self.pre(*args, **kw) + Result = self.func(self.inst, *args, **kw) if self.post: - apply(self.post, (Result,) + args, kw) + self.post(Result, *args, **kw) return Result class EiffelHelper(MetaHelper): Modified: python/branches/p3yk/Demo/metaclasses/Meta.py ============================================================================== --- python/branches/p3yk/Demo/metaclasses/Meta.py (original) +++ python/branches/p3yk/Demo/metaclasses/Meta.py Fri Mar 17 09:00:19 2006 @@ -14,7 +14,7 @@ self.__name__ = self.func.__name__ def __call__(self, *args, **kw): - return apply(self.func, (self.inst,) + args, kw) + return self.func(self.inst, *args, **kw) class MetaHelper: @@ -86,7 +86,7 @@ init = inst.__getattr__('__init__') except AttributeError: init = lambda: None - apply(init, args, kw) + init(*args, **kw) return inst Modified: python/branches/p3yk/Demo/metaclasses/Simple.py ============================================================================== --- python/branches/p3yk/Demo/metaclasses/Simple.py (original) +++ python/branches/p3yk/Demo/metaclasses/Simple.py Fri Mar 17 09:00:19 2006 @@ -28,7 +28,7 @@ self.instance = instance def __call__(self, *args): print "calling", self.function, "for", self.instance, "with", args - return apply(self.function, (self.instance,) + args) + return self.function(self.instance, *args) Trace = Tracing('Trace', (), {}) Modified: python/branches/p3yk/Demo/metaclasses/Synch.py ============================================================================== --- python/branches/p3yk/Demo/metaclasses/Synch.py (original) +++ python/branches/p3yk/Demo/metaclasses/Synch.py Fri Mar 17 09:00:19 2006 @@ -148,10 +148,10 @@ class LockingMethodWrapper(MetaMethodWrapper): def __call__(self, *args, **kw): if self.__name__[:1] == '_' and self.__name__[1:] != '_': - return apply(self.func, (self.inst,) + args, kw) + return self.func(self.inst, *args, **kw) self.inst.__lock__.acquire() try: - return apply(self.func, (self.inst,) + args, kw) + return self.func(self.inst, *args, **kw) finally: self.inst.__lock__.release() Modified: python/branches/p3yk/Demo/metaclasses/Trace.py ============================================================================== --- python/branches/p3yk/Demo/metaclasses/Trace.py (original) +++ python/branches/p3yk/Demo/metaclasses/Trace.py Fri Mar 17 09:00:19 2006 @@ -50,7 +50,7 @@ init = inst.__getattr__('__init__') except AttributeError: init = lambda: None - apply(init, args, kw) + init(*args, **kw) return inst __trace_output__ = None @@ -85,7 +85,7 @@ self.func = func self.inst = inst def __call__(self, *args, **kw): - return apply(self.func, (self.inst,) + args, kw) + return self.func(self.inst, *args, **kw) class TracingWrapper(NotTracingWrapper): def __call__(self, *args, **kw): @@ -93,7 +93,7 @@ "calling %s, inst=%s, args=%s, kw=%s", self.__name__, self.inst, args, kw) try: - rv = apply(self.func, (self.inst,) + args, kw) + rv = self.func(self.inst, *args, **kw) except: t, v, tb = sys.exc_info() self.inst.__trace_call__(self.inst.__trace_output__, Modified: python/branches/p3yk/Demo/pdist/RCSProxy.py ============================================================================== --- python/branches/p3yk/Demo/pdist/RCSProxy.py (original) +++ python/branches/p3yk/Demo/pdist/RCSProxy.py Fri Mar 17 09:00:19 2006 @@ -186,7 +186,7 @@ if hasattr(proxy, what): attr = getattr(proxy, what) if callable(attr): - print apply(attr, tuple(sys.argv[2:])) + print attr(*sys.argv[2:]) else: print repr(attr) else: Modified: python/branches/p3yk/Demo/pdist/client.py ============================================================================== --- python/branches/p3yk/Demo/pdist/client.py (original) +++ python/branches/p3yk/Demo/pdist/client.py Fri Mar 17 09:00:19 2006 @@ -132,12 +132,11 @@ class SecureClient(Client, Security): def __init__(self, *args): - import string - apply(self._pre_init, args) + self._pre_init(*args) Security.__init__(self) self._wf.flush() line = self._rf.readline() - challenge = string.atoi(string.strip(line)) + challenge = int(line.strip()) response = self._encode_challenge(challenge) line = repr(long(response)) if line[-1] in 'Ll': line = line[:-1] Modified: python/branches/p3yk/Demo/pdist/server.py ============================================================================== --- python/branches/p3yk/Demo/pdist/server.py (original) +++ python/branches/p3yk/Demo/pdist/server.py Fri Mar 17 09:00:19 2006 @@ -81,7 +81,7 @@ raise NameError, "illegal method name %s" % repr(methodname) else: method = getattr(self, methodname) - reply = (None, apply(method, args), id) + reply = (None, method(*args), id) except: reply = (sys.exc_info()[:2], id) if id < 0 and reply[:2] == (None, None): @@ -117,7 +117,7 @@ class SecureServer(Server, Security): def __init__(self, *args): - apply(Server.__init__, (self,) + args) + Server.__init__(self, *args) Security.__init__(self) def _verify(self, conn, address): Modified: python/branches/p3yk/Demo/threads/Coroutine.py ============================================================================== --- python/branches/p3yk/Demo/threads/Coroutine.py (original) +++ python/branches/p3yk/Demo/threads/Coroutine.py Fri Mar 17 09:00:19 2006 @@ -115,7 +115,7 @@ if not self.killed: try: try: - apply(me.f, args) + me.f(*args) except Killed: pass finally: Modified: python/branches/p3yk/Demo/threads/Generator.py ============================================================================== --- python/branches/p3yk/Demo/threads/Generator.py (original) +++ python/branches/p3yk/Demo/threads/Generator.py Fri Mar 17 09:00:19 2006 @@ -22,7 +22,7 @@ self.putlock.acquire() if not self.killed: try: - apply(self.func, (self,) + self.args) + self.func(self, *self.args) except Killed: pass finally: Modified: python/branches/p3yk/Demo/threads/find.py ============================================================================== --- python/branches/p3yk/Demo/threads/find.py (original) +++ python/branches/p3yk/Demo/threads/find.py Fri Mar 17 09:00:19 2006 @@ -17,7 +17,6 @@ import sys import getopt -import string import time import os from stat import * @@ -85,7 +84,7 @@ if not job: break func, args = job - apply(func, args) + func(*args) self._donework() def run(self, nworkers): @@ -104,7 +103,7 @@ opts, args = getopt.getopt(sys.argv[1:], '-w:') for opt, arg in opts: if opt == '-w': - nworkers = string.atoi(arg) + nworkers = int(arg) if not args: args = [os.curdir] Modified: python/branches/p3yk/Demo/tix/tixwidgets.py ============================================================================== --- python/branches/p3yk/Demo/tix/tixwidgets.py (original) +++ python/branches/p3yk/Demo/tix/tixwidgets.py Fri Mar 17 09:00:19 2006 @@ -71,8 +71,7 @@ hm.add_checkbutton(label='BalloonHelp', underline=0, command=ToggleHelp, variable=self.useBalloons) # The trace variable option doesn't seem to work, instead I use 'command' - #apply(w.tk.call, ('trace', 'variable', self.useBalloons, 'w', - # ToggleHelp)) + #w.tk.call('trace', 'variable', self.useBalloons, 'w', ToggleHelp)) return w Modified: python/branches/p3yk/Demo/tkinter/guido/AttrDialog.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/AttrDialog.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/AttrDialog.py Fri Mar 17 09:00:19 2006 @@ -155,8 +155,7 @@ def set(self, e=None): self.current = self.var.get() try: - apply(self.dialog.widget.pack, (), - {self.option: self.current}) + self.dialog.widget.pack(**{self.option: self.current}) except TclError, msg: print msg self.refresh() Modified: python/branches/p3yk/Demo/tkinter/guido/ManPage.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/ManPage.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/ManPage.py Fri Mar 17 09:00:19 2006 @@ -22,7 +22,7 @@ # Initialize instance def __init__(self, master=None, **cnf): # Initialize base class - apply(ScrolledText.__init__, (self, master), cnf) + ScrolledText.__init__(self, master, **cnf) # Define tags for formatting styles self.tag_config('X', underline=1) @@ -178,7 +178,7 @@ # Initialize instance def __init__(self, master=None, **cnf): cnf['state'] = DISABLED - apply(EditableManPage.__init__, (self, master), cnf) + EditableManPage.__init__(self, master, **cnf) # Alias ManPage = ReadonlyManPage Modified: python/branches/p3yk/Demo/tkinter/guido/ShellWindow.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/ShellWindow.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/ShellWindow.py Fri Mar 17 09:00:19 2006 @@ -20,7 +20,7 @@ args = string.split(shell) shell = args[0] - apply(ScrolledText.__init__, (self, master), cnf) + ScrolledText.__init__(self, master, **cnf) self.pos = '1.0' self.bind('', self.inputhandler) self.bind('', self.sigint) Modified: python/branches/p3yk/Demo/tkinter/guido/kill.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/kill.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/kill.py Fri Mar 17 09:00:19 2006 @@ -9,7 +9,7 @@ class BarButton(Menubutton): def __init__(self, master=None, **cnf): - apply(Menubutton.__init__, (self, master), cnf) + Menubutton.__init__(self, master, **cnf) self.pack(side=LEFT) self.menu = Menu(self, name='menu') self['menu'] = self.menu Modified: python/branches/p3yk/Demo/tkinter/guido/optionmenu.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/optionmenu.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/optionmenu.py Fri Mar 17 09:00:19 2006 @@ -21,7 +21,7 @@ var2 = StringVar() var2.set(CHOICES[0]) -menu2 = apply(OptionMenu, (root, var2) + tuple(CHOICES)) +menu2 = OptionMenu(root, var2, *CHOICES) menu2.pack() root.mainloop() Modified: python/branches/p3yk/Demo/tkinter/guido/sortvisu.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/sortvisu.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/sortvisu.py Fri Mar 17 09:00:19 2006 @@ -523,8 +523,7 @@ if self.size not in sizes: sizes.append(self.size) sizes.sort() - self.m_size = apply(OptionMenu, - (self.botleftframe, self.v_size) + tuple(sizes)) + self.m_size = OptionMenu(self.botleftframe, self.v_size, *sizes) self.m_size.pack(fill=X) self.v_speed = StringVar(self.master) Modified: python/branches/p3yk/Demo/tkinter/guido/svkill.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/guido/svkill.py (original) +++ python/branches/p3yk/Demo/tkinter/guido/svkill.py Fri Mar 17 09:00:19 2006 @@ -16,7 +16,7 @@ class BarButton(Menubutton): def __init__(self, master=None, **cnf): - apply(Menubutton.__init__, (self, master), cnf) + Menubutton.__init__(self, master, **cnf) self.pack(side=LEFT) self.menu = Menu(self, name='menu') self['menu'] = self.menu @@ -61,7 +61,7 @@ def do_1(self, e): self.kill(e.widget.get(e.widget.nearest(e.y))) def __init__(self, master=None, **cnf): - apply(Frame.__init__, (self, master), cnf) + Frame.__init__(self, master, **cnf) self.pack(expand=1, fill=BOTH) self.bar = Frame(self, name='bar', relief=RAISED, borderwidth=2) Modified: python/branches/p3yk/Demo/tkinter/matt/window-creation-w-location.py ============================================================================== --- python/branches/p3yk/Demo/tkinter/matt/window-creation-w-location.py (original) +++ python/branches/p3yk/Demo/tkinter/matt/window-creation-w-location.py Fri Mar 17 09:00:19 2006 @@ -13,7 +13,7 @@ kwargs["text"] = "QUIT" if not kwargs.has_key("command"): kwargs["command"] = master.quit - apply(Button.__init__, (self, master) + args, kwargs) + Button.__init__(self, master, *args, **kwargs) class Test(Frame): def makeWindow(self, *args): Modified: python/branches/p3yk/Doc/api/abstract.tex ============================================================================== --- python/branches/p3yk/Doc/api/abstract.tex (original) +++ python/branches/p3yk/Doc/api/abstract.tex Fri Mar 17 09:00:19 2006 @@ -235,7 +235,6 @@ or \NULL{} on failure. This is the equivalent of the Python expression \samp{apply(\var{callable_object}, \var{args}, \var{kw})} or \samp{\var{callable_object}(*\var{args}, **\var{kw})}. - \bifuncindex{apply} \versionadded{2.2} \end{cfuncdesc} @@ -248,7 +247,6 @@ success, or \NULL{} on failure. This is the equivalent of the Python expression \samp{apply(\var{callable_object}, \var{args})} or \samp{\var{callable_object}(*\var{args})}. - \bifuncindex{apply} \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyObject_CallFunction}{PyObject *callable, @@ -260,7 +258,6 @@ result of the call on success, or \NULL{} on failure. This is the equivalent of the Python expression \samp{apply(\var{callable}, \var{args})} or \samp{\var{callable}(*\var{args})}. - \bifuncindex{apply} \end{cfuncdesc} Modified: python/branches/p3yk/Doc/lib/libfuncs.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libfuncs.tex (original) +++ python/branches/p3yk/Doc/lib/libfuncs.tex Fri Mar 17 09:00:19 2006 @@ -1169,26 +1169,6 @@ \setindexsubitem{(non-essential built-in functions)} -\begin{funcdesc}{apply}{function, args\optional{, keywords}} - The \var{function} argument must be a callable object (a - user-defined or built-in function or method, or a class object) and - the \var{args} argument must be a sequence. The \var{function} is - called with \var{args} as the argument list; the number of arguments - is the length of the tuple. - If the optional \var{keywords} argument is present, it must be a - dictionary whose keys are strings. It specifies keyword arguments - to be added to the end of the argument list. - Calling \function{apply()} is different from just calling - \code{\var{function}(\var{args})}, since in that case there is always - exactly one argument. The use of \function{apply()} is equivalent - to \code{\var{function}(*\var{args}, **\var{keywords})}. - Use of \function{apply()} is not necessary since the ``extended call - syntax,'' as used in the last example, is completely equivalent. - - \deprecated{2.3}{Use the extended call syntax instead, as described - above.} -\end{funcdesc} - \begin{funcdesc}{buffer}{object\optional{, offset\optional{, size}}} The \var{object} argument must be an object that supports the buffer call interface (such as strings, arrays, and buffers). A new buffer Modified: python/branches/p3yk/Lib/bsddb/dbobj.py ============================================================================== --- python/branches/p3yk/Lib/bsddb/dbobj.py (original) +++ python/branches/p3yk/Lib/bsddb/dbobj.py Fri Mar 17 09:00:19 2006 @@ -31,82 +31,82 @@ class DBEnv: def __init__(self, *args, **kwargs): - self._cobj = apply(db.DBEnv, args, kwargs) + self._cobj = db.DBEnv(*args, **kwargs) def close(self, *args, **kwargs): - return apply(self._cobj.close, args, kwargs) + return self._cobj.close(*args, **kwargs) def open(self, *args, **kwargs): - return apply(self._cobj.open, args, kwargs) + return self._cobj.open(*args, **kwargs) def remove(self, *args, **kwargs): - return apply(self._cobj.remove, args, kwargs) + return self._cobj.remove(*args, **kwargs) def set_shm_key(self, *args, **kwargs): - return apply(self._cobj.set_shm_key, args, kwargs) + return self._cobj.set_shm_key(*args, **kwargs) def set_cachesize(self, *args, **kwargs): - return apply(self._cobj.set_cachesize, args, kwargs) + return self._cobj.set_cachesize(*args, **kwargs) def set_data_dir(self, *args, **kwargs): - return apply(self._cobj.set_data_dir, args, kwargs) + return self._cobj.set_data_dir(*args, **kwargs) def set_flags(self, *args, **kwargs): - return apply(self._cobj.set_flags, args, kwargs) + return self._cobj.set_flags(*args, **kwargs) def set_lg_bsize(self, *args, **kwargs): - return apply(self._cobj.set_lg_bsize, args, kwargs) + return self._cobj.set_lg_bsize(*args, **kwargs) def set_lg_dir(self, *args, **kwargs): - return apply(self._cobj.set_lg_dir, args, kwargs) + return self._cobj.set_lg_dir(*args, **kwargs) def set_lg_max(self, *args, **kwargs): - return apply(self._cobj.set_lg_max, args, kwargs) + return self._cobj.set_lg_max(*args, **kwargs) def set_lk_detect(self, *args, **kwargs): - return apply(self._cobj.set_lk_detect, args, kwargs) + return self._cobj.set_lk_detect(*args, **kwargs) def set_lk_max(self, *args, **kwargs): - return apply(self._cobj.set_lk_max, args, kwargs) + return self._cobj.set_lk_max(*args, **kwargs) def set_lk_max_locks(self, *args, **kwargs): - return apply(self._cobj.set_lk_max_locks, args, kwargs) + return self._cobj.set_lk_max_locks(*args, **kwargs) def set_lk_max_lockers(self, *args, **kwargs): - return apply(self._cobj.set_lk_max_lockers, args, kwargs) + return self._cobj.set_lk_max_lockers(*args, **kwargs) def set_lk_max_objects(self, *args, **kwargs): - return apply(self._cobj.set_lk_max_objects, args, kwargs) + return self._cobj.set_lk_max_objects(*args, **kwargs) def set_mp_mmapsize(self, *args, **kwargs): - return apply(self._cobj.set_mp_mmapsize, args, kwargs) + return self._cobj.set_mp_mmapsize(*args, **kwargs) def set_timeout(self, *args, **kwargs): - return apply(self._cobj.set_timeout, args, kwargs) + return self._cobj.set_timeout(*args, **kwargs) def set_tmp_dir(self, *args, **kwargs): - return apply(self._cobj.set_tmp_dir, args, kwargs) + return self._cobj.set_tmp_dir(*args, **kwargs) def txn_begin(self, *args, **kwargs): - return apply(self._cobj.txn_begin, args, kwargs) + return self._cobj.txn_begin(*args, **kwargs) def txn_checkpoint(self, *args, **kwargs): - return apply(self._cobj.txn_checkpoint, args, kwargs) + return self._cobj.txn_checkpoint(*args, **kwargs) def txn_stat(self, *args, **kwargs): - return apply(self._cobj.txn_stat, args, kwargs) + return self._cobj.txn_stat(*args, **kwargs) def set_tx_max(self, *args, **kwargs): - return apply(self._cobj.set_tx_max, args, kwargs) + return self._cobj.set_tx_max(*args, **kwargs) def set_tx_timestamp(self, *args, **kwargs): - return apply(self._cobj.set_tx_timestamp, args, kwargs) + return self._cobj.set_tx_timestamp(*args, **kwargs) def lock_detect(self, *args, **kwargs): - return apply(self._cobj.lock_detect, args, kwargs) + return self._cobj.lock_detect(*args, **kwargs) def lock_get(self, *args, **kwargs): - return apply(self._cobj.lock_get, args, kwargs) + return self._cobj.lock_get(*args, **kwargs) def lock_id(self, *args, **kwargs): - return apply(self._cobj.lock_id, args, kwargs) + return self._cobj.lock_id(*args, **kwargs) def lock_put(self, *args, **kwargs): - return apply(self._cobj.lock_put, args, kwargs) + return self._cobj.lock_put(*args, **kwargs) def lock_stat(self, *args, **kwargs): - return apply(self._cobj.lock_stat, args, kwargs) + return self._cobj.lock_stat(*args, **kwargs) def log_archive(self, *args, **kwargs): - return apply(self._cobj.log_archive, args, kwargs) + return self._cobj.log_archive(*args, **kwargs) def set_get_returns_none(self, *args, **kwargs): - return apply(self._cobj.set_get_returns_none, args, kwargs) + return self._cobj.set_get_returns_none(*args, **kwargs) if db.version() >= (4,1): def dbremove(self, *args, **kwargs): - return apply(self._cobj.dbremove, args, kwargs) + return self._cobj.dbremove(*args, **kwargs) def dbrename(self, *args, **kwargs): - return apply(self._cobj.dbrename, args, kwargs) + return self._cobj.dbrename(*args, **kwargs) def set_encrypt(self, *args, **kwargs): - return apply(self._cobj.set_encrypt, args, kwargs) + return self._cobj.set_encrypt(*args, **kwargs) class DB(DictMixin): def __init__(self, dbenv, *args, **kwargs): # give it the proper DBEnv C object that its expecting - self._cobj = apply(db.DB, (dbenv._cobj,) + args, kwargs) + self._cobj = db.DB(dbenv._cobj, *args, **kwargs) # TODO are there other dict methods that need to be overridden? def __len__(self): @@ -119,92 +119,92 @@ del self._cobj[arg] def append(self, *args, **kwargs): - return apply(self._cobj.append, args, kwargs) + return self._cobj.append(*args, **kwargs) def associate(self, *args, **kwargs): - return apply(self._cobj.associate, args, kwargs) + return self._cobj.associate(*args, **kwargs) def close(self, *args, **kwargs): - return apply(self._cobj.close, args, kwargs) + return self._cobj.close(*args, **kwargs) def consume(self, *args, **kwargs): - return apply(self._cobj.consume, args, kwargs) + return self._cobj.consume(*args, **kwargs) def consume_wait(self, *args, **kwargs): - return apply(self._cobj.consume_wait, args, kwargs) + return self._cobj.consume_wait(*args, **kwargs) def cursor(self, *args, **kwargs): - return apply(self._cobj.cursor, args, kwargs) + return self._cobj.cursor(*args, **kwargs) def delete(self, *args, **kwargs): - return apply(self._cobj.delete, args, kwargs) + return self._cobj.delete(*args, **kwargs) def fd(self, *args, **kwargs): - return apply(self._cobj.fd, args, kwargs) + return self._cobj.fd(*args, **kwargs) def get(self, *args, **kwargs): - return apply(self._cobj.get, args, kwargs) + return self._cobj.get(*args, **kwargs) def pget(self, *args, **kwargs): - return apply(self._cobj.pget, args, kwargs) + return self._cobj.pget(*args, **kwargs) def get_both(self, *args, **kwargs): - return apply(self._cobj.get_both, args, kwargs) + return self._cobj.get_both(*args, **kwargs) def get_byteswapped(self, *args, **kwargs): - return apply(self._cobj.get_byteswapped, args, kwargs) + return self._cobj.get_byteswapped(*args, **kwargs) def get_size(self, *args, **kwargs): - return apply(self._cobj.get_size, args, kwargs) + return self._cobj.get_size(*args, **kwargs) def get_type(self, *args, **kwargs): - return apply(self._cobj.get_type, args, kwargs) + return self._cobj.get_type(*args, **kwargs) def join(self, *args, **kwargs): - return apply(self._cobj.join, args, kwargs) + return self._cobj.join(*args, **kwargs) def key_range(self, *args, **kwargs): - return apply(self._cobj.key_range, args, kwargs) + return self._cobj.key_range(*args, **kwargs) def has_key(self, *args, **kwargs): - return apply(self._cobj.has_key, args, kwargs) + return self._cobj.has_key(*args, **kwargs) def items(self, *args, **kwargs): - return apply(self._cobj.items, args, kwargs) + return self._cobj.items(*args, **kwargs) def keys(self, *args, **kwargs): - return apply(self._cobj.keys, args, kwargs) + return self._cobj.keys(*args, **kwargs) def open(self, *args, **kwargs): - return apply(self._cobj.open, args, kwargs) + return self._cobj.open(*args, **kwargs) def put(self, *args, **kwargs): - return apply(self._cobj.put, args, kwargs) + return self._cobj.put(*args, **kwargs) def remove(self, *args, **kwargs): - return apply(self._cobj.remove, args, kwargs) + return self._cobj.remove(*args, **kwargs) def rename(self, *args, **kwargs): - return apply(self._cobj.rename, args, kwargs) + return self._cobj.rename(*args, **kwargs) def set_bt_minkey(self, *args, **kwargs): - return apply(self._cobj.set_bt_minkey, args, kwargs) + return self._cobj.set_bt_minkey(*args, **kwargs) def set_bt_compare(self, *args, **kwargs): - return apply(self._cobj.set_bt_compare, args, kwargs) + return self._cobj.set_bt_compare(*args, **kwargs) def set_cachesize(self, *args, **kwargs): - return apply(self._cobj.set_cachesize, args, kwargs) + return self._cobj.set_cachesize(*args, **kwargs) def set_flags(self, *args, **kwargs): - return apply(self._cobj.set_flags, args, kwargs) + return self._cobj.set_flags(*args, **kwargs) def set_h_ffactor(self, *args, **kwargs): - return apply(self._cobj.set_h_ffactor, args, kwargs) + return self._cobj.set_h_ffactor(*args, **kwargs) def set_h_nelem(self, *args, **kwargs): - return apply(self._cobj.set_h_nelem, args, kwargs) + return self._cobj.set_h_nelem(*args, **kwargs) def set_lorder(self, *args, **kwargs): - return apply(self._cobj.set_lorder, args, kwargs) + return self._cobj.set_lorder(*args, **kwargs) def set_pagesize(self, *args, **kwargs): - return apply(self._cobj.set_pagesize, args, kwargs) + return self._cobj.set_pagesize(*args, **kwargs) def set_re_delim(self, *args, **kwargs): - return apply(self._cobj.set_re_delim, args, kwargs) + return self._cobj.set_re_delim(*args, **kwargs) def set_re_len(self, *args, **kwargs): - return apply(self._cobj.set_re_len, args, kwargs) + return self._cobj.set_re_len(*args, **kwargs) def set_re_pad(self, *args, **kwargs): - return apply(self._cobj.set_re_pad, args, kwargs) + return self._cobj.set_re_pad(*args, **kwargs) def set_re_source(self, *args, **kwargs): - return apply(self._cobj.set_re_source, args, kwargs) + return self._cobj.set_re_source(*args, **kwargs) def set_q_extentsize(self, *args, **kwargs): - return apply(self._cobj.set_q_extentsize, args, kwargs) + return self._cobj.set_q_extentsize(*args, **kwargs) def stat(self, *args, **kwargs): - return apply(self._cobj.stat, args, kwargs) + return self._cobj.stat(*args, **kwargs) def sync(self, *args, **kwargs): - return apply(self._cobj.sync, args, kwargs) + return self._cobj.sync(*args, **kwargs) def type(self, *args, **kwargs): - return apply(self._cobj.type, args, kwargs) + return self._cobj.type(*args, **kwargs) def upgrade(self, *args, **kwargs): - return apply(self._cobj.upgrade, args, kwargs) + return self._cobj.upgrade(*args, **kwargs) def values(self, *args, **kwargs): - return apply(self._cobj.values, args, kwargs) + return self._cobj.values(*args, **kwargs) def verify(self, *args, **kwargs): - return apply(self._cobj.verify, args, kwargs) + return self._cobj.verify(*args, **kwargs) def set_get_returns_none(self, *args, **kwargs): - return apply(self._cobj.set_get_returns_none, args, kwargs) + return self._cobj.set_get_returns_none(*args, **kwargs) if db.version() >= (4,1): def set_encrypt(self, *args, **kwargs): - return apply(self._cobj.set_encrypt, args, kwargs) + return self._cobj.set_encrypt(*args, **kwargs) Modified: python/branches/p3yk/Lib/bsddb/dbshelve.py ============================================================================== --- python/branches/p3yk/Lib/bsddb/dbshelve.py (original) +++ python/branches/p3yk/Lib/bsddb/dbshelve.py Fri Mar 17 09:00:19 2006 @@ -169,7 +169,7 @@ # given nothing is passed to the extension module. That way # an exception can be raised if set_get_returns_none is turned # off. - data = apply(self.db.get, args, kw) + data = self.db.get(*args, **kw) try: return cPickle.loads(data) except (TypeError, cPickle.UnpicklingError): @@ -236,7 +236,7 @@ def get(self, *args): count = len(args) # a method overloading hack method = getattr(self, 'get_%d' % count) - apply(method, args) + method(*args) def get_1(self, flags): rec = self.dbc.get(flags) Modified: python/branches/p3yk/Lib/bsddb/test/test_basics.py ============================================================================== --- python/branches/p3yk/Lib/bsddb/test/test_basics.py (original) +++ python/branches/p3yk/Lib/bsddb/test/test_basics.py Fri Mar 17 09:00:19 2006 @@ -444,7 +444,7 @@ print "attempting to use a closed cursor's %s method" % \ method # a bug may cause a NULL pointer dereference... - apply(getattr(c, method), args) + getattr(c, method)(*args) except db.DBError, val: assert val[0] == 0 if verbose: print val Modified: python/branches/p3yk/Lib/bsddb/test/test_dbobj.py ============================================================================== --- python/branches/p3yk/Lib/bsddb/test/test_dbobj.py (original) +++ python/branches/p3yk/Lib/bsddb/test/test_dbobj.py Fri Mar 17 09:00:19 2006 @@ -39,7 +39,7 @@ def put(self, key, *args, **kwargs): key = string.upper(key) # call our parent classes put method with an upper case key - return apply(dbobj.DB.put, (self, key) + args, kwargs) + return dbobj.DB.put(self, key, *args, **kwargs) self.env = TestDBEnv() self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL) self.db = TestDB(self.env) Modified: python/branches/p3yk/Lib/bsddb/test/test_join.py ============================================================================== --- python/branches/p3yk/Lib/bsddb/test/test_join.py (original) +++ python/branches/p3yk/Lib/bsddb/test/test_join.py Fri Mar 17 09:00:19 2006 @@ -72,13 +72,13 @@ # create and populate primary index priDB = db.DB(self.env) priDB.open(self.filename, "primary", db.DB_BTREE, db.DB_CREATE) - map(lambda t, priDB=priDB: apply(priDB.put, t), ProductIndex) + map(lambda t, priDB=priDB: priDB.put(*t), ProductIndex) # create and populate secondary index secDB = db.DB(self.env) secDB.set_flags(db.DB_DUP | db.DB_DUPSORT) secDB.open(self.filename, "secondary", db.DB_BTREE, db.DB_CREATE) - map(lambda t, secDB=secDB: apply(secDB.put, t), ColorIndex) + map(lambda t, secDB=secDB: secDB.put(*t), ColorIndex) sCursor = None jCursor = None Modified: python/branches/p3yk/Lib/compiler/transformer.py ============================================================================== --- python/branches/p3yk/Lib/compiler/transformer.py (original) +++ python/branches/p3yk/Lib/compiler/transformer.py Fri Mar 17 09:00:19 2006 @@ -90,7 +90,7 @@ raise else: raise WalkerError, "Can't find appropriate Node type: %s" % str(args) - #return apply(ast.Node, args) + #return ast.Node(*args) class Transformer: """Utility object for transforming Python parse trees. Modified: python/branches/p3yk/Lib/distutils/archive_util.py ============================================================================== --- python/branches/p3yk/Lib/distutils/archive_util.py (original) +++ python/branches/p3yk/Lib/distutils/archive_util.py Fri Mar 17 09:00:19 2006 @@ -162,7 +162,7 @@ func = format_info[0] for (arg,val) in format_info[1]: kwargs[arg] = val - filename = apply(func, (base_name, base_dir), kwargs) + filename = func(base_name, base_dir, **kwargs) if root_dir is not None: log.debug("changing back to '%s'", save_cwd) Modified: python/branches/p3yk/Lib/distutils/command/build_ext.py ============================================================================== --- python/branches/p3yk/Lib/distutils/command/build_ext.py (original) +++ python/branches/p3yk/Lib/distutils/command/build_ext.py Fri Mar 17 09:00:19 2006 @@ -613,8 +613,8 @@ # extensions in debug_mode are named 'module_d.pyd' under windows so_ext = get_config_var('SO') if os.name == 'nt' and self.debug: - return apply(os.path.join, ext_path) + '_d' + so_ext - return apply(os.path.join, ext_path) + so_ext + return os.path.join(*ext_path) + '_d' + so_ext + return os.path.join(*ext_path) + so_ext def get_export_symbols (self, ext): """Return the list of symbols that a shared extension has to Modified: python/branches/p3yk/Lib/distutils/command/build_py.py ============================================================================== --- python/branches/p3yk/Lib/distutils/command/build_py.py (original) +++ python/branches/p3yk/Lib/distutils/command/build_py.py Fri Mar 17 09:00:19 2006 @@ -154,7 +154,7 @@ if not self.package_dir: if path: - return apply(os.path.join, path) + return os.path.join(*path) else: return '' else: @@ -167,7 +167,7 @@ del path[-1] else: tail.insert(0, pdir) - return apply(os.path.join, tail) + return os.path.join(*tail) else: # Oops, got all the way through 'path' without finding a # match in package_dir. If package_dir defines a directory @@ -181,7 +181,7 @@ tail.insert(0, pdir) if tail: - return apply(os.path.join, tail) + return os.path.join(*tail) else: return '' @@ -335,7 +335,7 @@ def get_module_outfile (self, build_dir, package, module): outfile_path = [build_dir] + list(package) + [module + ".py"] - return apply(os.path.join, outfile_path) + return os.path.join(*outfile_path) def get_outputs (self, include_bytecode=1): Modified: python/branches/p3yk/Lib/distutils/dir_util.py ============================================================================== --- python/branches/p3yk/Lib/distutils/dir_util.py (original) +++ python/branches/p3yk/Lib/distutils/dir_util.py Fri Mar 17 09:00:19 2006 @@ -204,7 +204,7 @@ _build_cmdtuple(directory, cmdtuples) for cmd in cmdtuples: try: - apply(cmd[0], (cmd[1],)) + cmd[0](cmd[1]) # remove dir from cache if it's already there abspath = os.path.abspath(cmd[1]) if _path_created.has_key(abspath): Modified: python/branches/p3yk/Lib/distutils/filelist.py ============================================================================== --- python/branches/p3yk/Lib/distutils/filelist.py (original) +++ python/branches/p3yk/Lib/distutils/filelist.py Fri Mar 17 09:00:19 2006 @@ -69,7 +69,7 @@ sortable_files.sort() self.files = [] for sort_tuple in sortable_files: - self.files.append(apply(os.path.join, sort_tuple)) + self.files.append(os.path.join(*sort_tuple)) # -- Other miscellaneous utility methods --------------------------- Modified: python/branches/p3yk/Lib/distutils/util.py ============================================================================== --- python/branches/p3yk/Lib/distutils/util.py (original) +++ python/branches/p3yk/Lib/distutils/util.py Fri Mar 17 09:00:19 2006 @@ -95,7 +95,7 @@ paths.remove('.') if not paths: return os.curdir - return apply(os.path.join, paths) + return os.path.join(*paths) # convert_path () @@ -295,7 +295,7 @@ log.info(msg) if not dry_run: - apply(func, args) + func(*args) def strtobool (val): Modified: python/branches/p3yk/Lib/idlelib/MultiCall.py ============================================================================== --- python/branches/p3yk/Lib/idlelib/MultiCall.py (original) +++ python/branches/p3yk/Lib/idlelib/MultiCall.py Fri Mar 17 09:00:19 2006 @@ -296,7 +296,7 @@ assert issubclass(widget, Tkinter.Misc) def __init__(self, *args, **kwargs): - apply(widget.__init__, (self,)+args, kwargs) + widget.__init__(self, *args, **kwargs) # a dictionary which maps a virtual event to a tuple with: # 0. the function binded # 1. a list of triplets - the sequences it is binded to Modified: python/branches/p3yk/Lib/logging/__init__.py ============================================================================== --- python/branches/p3yk/Lib/logging/__init__.py (original) +++ python/branches/p3yk/Lib/logging/__init__.py Fri Mar 17 09:00:19 2006 @@ -965,7 +965,7 @@ if self.manager.disable >= DEBUG: return if DEBUG >= self.getEffectiveLevel(): - apply(self._log, (DEBUG, msg, args), kwargs) + self._log(DEBUG, msg, args, **kwargs) def info(self, msg, *args, **kwargs): """ @@ -979,7 +979,7 @@ if self.manager.disable >= INFO: return if INFO >= self.getEffectiveLevel(): - apply(self._log, (INFO, msg, args), kwargs) + self._log(INFO, msg, args, **kwargs) def warning(self, msg, *args, **kwargs): """ @@ -993,7 +993,7 @@ if self.manager.disable >= WARNING: return if self.isEnabledFor(WARNING): - apply(self._log, (WARNING, msg, args), kwargs) + self._log(WARNING, msg, args, **kwargs) warn = warning @@ -1009,13 +1009,13 @@ if self.manager.disable >= ERROR: return if self.isEnabledFor(ERROR): - apply(self._log, (ERROR, msg, args), kwargs) + self._log(ERROR, msg, args, **kwargs) def exception(self, msg, *args): """ Convenience method for logging an ERROR with exception information. """ - apply(self.error, (msg,) + args, {'exc_info': 1}) + self.error(msg, *args, exc_info=1) def critical(self, msg, *args, **kwargs): """ @@ -1029,7 +1029,7 @@ if self.manager.disable >= CRITICAL: return if CRITICAL >= self.getEffectiveLevel(): - apply(self._log, (CRITICAL, msg, args), kwargs) + self._log(CRITICAL, msg, args, **kwargs) fatal = critical @@ -1050,7 +1050,7 @@ if self.manager.disable >= level: return if self.isEnabledFor(level): - apply(self._log, (level, msg, args), kwargs) + self._log(level, msg, args, **kwargs) def findCaller(self): """ @@ -1275,7 +1275,7 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.critical, (msg,)+args, kwargs) + root.critical(msg, *args, **kwargs) fatal = critical @@ -1285,14 +1285,14 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.error, (msg,)+args, kwargs) + root.error(msg, *args, **kwargs) def exception(msg, *args): """ Log a message with severity 'ERROR' on the root logger, with exception information. """ - apply(error, (msg,)+args, {'exc_info': 1}) + error(msg, *args, exc_info=1) def warning(msg, *args, **kwargs): """ @@ -1300,7 +1300,7 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.warning, (msg,)+args, kwargs) + root.warning(msg, *args, **kwargs) warn = warning @@ -1310,7 +1310,7 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.info, (msg,)+args, kwargs) + root.info(msg, *args, **kwargs) def debug(msg, *args, **kwargs): """ @@ -1318,7 +1318,7 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.debug, (msg,)+args, kwargs) + root.debug(msg, *args, **kwargs) def log(level, msg, *args, **kwargs): """ @@ -1326,7 +1326,7 @@ """ if len(root.handlers) == 0: basicConfig() - apply(root.log, (level, msg)+args, kwargs) + root.log(level, msg, *args, **kwargs) def disable(level): """ Modified: python/branches/p3yk/Lib/logging/config.py ============================================================================== --- python/branches/p3yk/Lib/logging/config.py (original) +++ python/branches/p3yk/Lib/logging/config.py Fri Mar 17 09:00:19 2006 @@ -148,7 +148,7 @@ klass = eval(klass, vars(logging)) args = cp.get(sectname, "args") args = eval(args, vars(logging)) - h = apply(klass, args) + h = klass(*args) if "level" in opts: level = cp.get(sectname, "level") h.setLevel(logging._levelNames[level]) Modified: python/branches/p3yk/Lib/plat-mac/gensuitemodule.py ============================================================================== --- python/branches/p3yk/Lib/plat-mac/gensuitemodule.py (original) +++ python/branches/p3yk/Lib/plat-mac/gensuitemodule.py Fri Mar 17 09:00:19 2006 @@ -351,11 +351,11 @@ def generic(what, f, *args): if type(what) == types.FunctionType: - return apply(what, (f,) + args) + return what(f, *args) if type(what) == types.ListType: record = [] for thing in what: - item = apply(generic, thing[:1] + (f,) + thing[1:]) + item = generic(thing[:1], f, *thing[1:]) record.append((thing[1], item)) return record return "BAD GENERIC ARGS: %r" % (what,) Modified: python/branches/p3yk/Lib/subprocess.py ============================================================================== --- python/branches/p3yk/Lib/subprocess.py (original) +++ python/branches/p3yk/Lib/subprocess.py Fri Mar 17 09:00:19 2006 @@ -995,7 +995,7 @@ os.chdir(cwd) if preexec_fn: - apply(preexec_fn) + preexec_fn() if env is None: os.execvp(executable, args) Deleted: /python/branches/p3yk/Lib/test/crashers/infinite_rec_4.py ============================================================================== --- /python/branches/p3yk/Lib/test/crashers/infinite_rec_4.py Fri Mar 17 09:00:19 2006 +++ (empty file) @@ -1,7 +0,0 @@ - -# http://python.org/sf/1202533 - -if __name__ == '__main__': - lst = [apply] - lst.append(lst) - apply(*lst) # segfault: infinite recursion in C Modified: python/branches/p3yk/Lib/test/test_builtin.py ============================================================================== --- python/branches/p3yk/Lib/test/test_builtin.py (original) +++ python/branches/p3yk/Lib/test/test_builtin.py Fri Mar 17 09:00:19 2006 @@ -153,32 +153,6 @@ S = [10, 20, 30] self.assertEqual(any(x > 42 for x in S), False) - def test_apply(self): - def f0(*args): - self.assertEqual(args, ()) - def f1(a1): - self.assertEqual(a1, 1) - def f2(a1, a2): - self.assertEqual(a1, 1) - self.assertEqual(a2, 2) - def f3(a1, a2, a3): - self.assertEqual(a1, 1) - self.assertEqual(a2, 2) - self.assertEqual(a3, 3) - apply(f0, ()) - apply(f1, (1,)) - apply(f2, (1, 2)) - apply(f3, (1, 2, 3)) - - # A PyCFunction that takes only positional parameters should allow an - # empty keyword dictionary to pass without a complaint, but raise a - # TypeError if the dictionary is non-empty. - apply(id, (1,), {}) - self.assertRaises(TypeError, apply, id, (1,), {"foo": 1}) - self.assertRaises(TypeError, apply) - self.assertRaises(TypeError, apply, id, 42) - self.assertRaises(TypeError, apply, id, (42,), 42) - def test_callable(self): self.assert_(callable(len)) def f(): pass Modified: python/branches/p3yk/Mac/Demo/sound/morse.py ============================================================================== --- python/branches/p3yk/Mac/Demo/sound/morse.py (original) +++ python/branches/p3yk/Mac/Demo/sound/morse.py Fri Mar 17 09:00:19 2006 @@ -78,7 +78,7 @@ class BufferedAudioDev: def __init__(self, *args): import audiodev - self._base = apply(audiodev.AudioDev, args) + self._base = audiodev.AudioDev(*args) self._buffer = [] self._filled = 0 self._addmethods(self._base, self._base.__class__) Modified: python/branches/p3yk/Mac/Tools/IDE/ProfileBrowser.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/ProfileBrowser.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/ProfileBrowser.py Fri Mar 17 09:00:19 2006 @@ -65,7 +65,7 @@ def displaystats(self): W.SetCursor('watch') - apply(self.stats.sort_stats, self.sortkeys) + self.stats.sort_stats(*self.sortkeys) saveout = sys.stdout try: s = sys.stdout = StringIO.StringIO() Modified: python/branches/p3yk/Mac/Tools/IDE/PyConsole.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/PyConsole.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/PyConsole.py Fri Mar 17 09:00:19 2006 @@ -26,7 +26,7 @@ class ConsoleTextWidget(W.EditText): def __init__(self, *args, **kwargs): - apply(W.EditText.__init__, (self,) + args, kwargs) + W.EditText.__init__(self, *args, **kwargs) self._inputstart = 0 self._buf = '' self.pyinteractive = PyInteractive.PyInteractive() Modified: python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/PyDebugger.py Fri Mar 17 09:00:19 2006 @@ -652,7 +652,7 @@ class SourceViewer(W.PyEditor): def __init__(self, *args, **kwargs): - apply(W.PyEditor.__init__, (self,) + args, kwargs) + W.PyEditor.__init__(self, *args, **kwargs) self.bind('', self.clickintercept) def clickintercept(self, point, modifiers): @@ -815,7 +815,7 @@ class TracingMonitor(W.Widget): def __init__(self, *args, **kwargs): - apply(W.Widget.__init__, (self,) + args, kwargs) + W.Widget.__init__(self, *args, **kwargs) self.state = 0 def toggle(self): Modified: python/branches/p3yk/Mac/Tools/IDE/Wapplication.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/Wapplication.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/Wapplication.py Fri Mar 17 09:00:19 2006 @@ -129,7 +129,7 @@ window = self._windows[wid] if hasattr(window, attr): handler = getattr(window, attr) - apply(handler, args) + handler(*args) return 1 def getfrontwindow(self): Modified: python/branches/p3yk/Mac/Tools/IDE/Wbase.py ============================================================================== --- python/branches/p3yk/Mac/Tools/IDE/Wbase.py (original) +++ python/branches/p3yk/Mac/Tools/IDE/Wbase.py Fri Mar 17 09:00:19 2006 @@ -78,7 +78,7 @@ if type(args[0]) == FunctionType or type(args[0]) == MethodType: self._possize = args[0] else: - apply(self.resize, args[0]) + self.resize(*args[0]) elif len(args) == 2: self._possize = (0, 0) + args elif len(args) == 4: @@ -175,37 +175,37 @@ def forall(self, methodname, *args): for w in self._widgets: - rv = apply(w.forall, (methodname,) + args) + rv = w.forall(methodname, *args) if rv: return rv if self._bindings.has_key("<" + methodname + ">"): callback = self._bindings["<" + methodname + ">"] - rv = apply(callback, args) + rv = callback(*args) if rv: return rv if hasattr(self, methodname): method = getattr(self, methodname) - return apply(method, args) + return method(*args) def forall_butself(self, methodname, *args): for w in self._widgets: - rv = apply(w.forall, (methodname,) + args) + rv = w.forall(methodname, *args) if rv: return rv def forall_frombottom(self, methodname, *args): if self._bindings.has_key("<" + methodname + ">"): callback = self._bindings["<" + methodname + ">"] - rv = apply(callback, args) + rv = callback(*args) if rv: return rv if hasattr(self, methodname): method = getattr(self, methodname) - rv = apply(method, args) + rv = method(*args) if rv: return rv for w in self._widgets: - rv = apply(w.forall_frombottom, (methodname,) + args) + rv = w.forall_frombottom(methodname, *args) if rv: return rv @@ -670,7 +670,7 @@ maxargs = func.func_code.co_argcount - 1 else: if callable(callback): - return apply(callback, args) + return callback(*args) else: raise TypeError, "uncallable callback object" @@ -679,7 +679,7 @@ else: minargs = maxargs if minargs <= len(args) <= maxargs: - return apply(callback, args) + return callback(*args) elif not mustfit and minargs == 0: return callback() else: Modified: python/branches/p3yk/Mac/Tools/macfreeze/macgen_bin.py ============================================================================== --- python/branches/p3yk/Mac/Tools/macfreeze/macgen_bin.py (original) +++ python/branches/p3yk/Mac/Tools/macfreeze/macgen_bin.py Fri Mar 17 09:00:19 2006 @@ -180,7 +180,7 @@ output = Res.FSpOpenResFile(output, 3) openedout = 1 try: - apply(buildtools.copyres, (input, output) + args, kwargs) + buildtools.copyres(input, output, *args, **kwargs) finally: if openedin: Res.CloseResFile(input) Modified: python/branches/p3yk/Mac/scripts/buildpkg.py ============================================================================== --- python/branches/p3yk/Mac/scripts/buildpkg.py (original) +++ python/branches/p3yk/Mac/scripts/buildpkg.py Fri Mar 17 09:00:19 2006 @@ -374,7 +374,7 @@ o = options title, version, desc = o["Title"], o["Version"], o["Description"] pm = PackageMaker(title, version, desc) - apply(pm.build, list(args), options) + pm.build(*args, **options) ###################################################################### @@ -468,7 +468,7 @@ "Description" in ok): print "Missing mandatory option!" else: - apply(buildPackage, args, optsDict) + buildPackage(*args, **optsDict) return printUsage() Modified: python/branches/p3yk/PCbuild/readme.txt ============================================================================== --- python/branches/p3yk/PCbuild/readme.txt (original) +++ python/branches/p3yk/PCbuild/readme.txt Fri Mar 17 09:00:19 2006 @@ -204,7 +204,7 @@ XXX File "C:\Code\python\lib\threading.py", line 411, in __bootstrap XXX self.run() XXX File "C:\Code\python\lib\threading.py", line 399, in run - XXX apply(self.__target, self.__args, self.__kwargs) + XXX self.__target(*self.__args, **self.__kwargs) XXX File "C:\Code\python\lib\bsddb\test\test_thread.py", line 268, in XXX readerThread XXX rec = c.next() Modified: python/branches/p3yk/Python/bltinmodule.c ============================================================================== --- python/branches/p3yk/Python/bltinmodule.c (original) +++ python/branches/p3yk/Python/bltinmodule.c Fri Mar 17 09:00:19 2006 @@ -133,50 +133,6 @@ \n\ Return True if bool(x) is True for any x in the iterable."); -static PyObject * -builtin_apply(PyObject *self, PyObject *args) -{ - PyObject *func, *alist = NULL, *kwdict = NULL; - PyObject *t = NULL, *retval = NULL; - - if (!PyArg_UnpackTuple(args, "apply", 1, 3, &func, &alist, &kwdict)) - return NULL; - if (alist != NULL) { - if (!PyTuple_Check(alist)) { - if (!PySequence_Check(alist)) { - PyErr_Format(PyExc_TypeError, - "apply() arg 2 expected sequence, found %s", - alist->ob_type->tp_name); - return NULL; - } - t = PySequence_Tuple(alist); - if (t == NULL) - return NULL; - alist = t; - } - } - if (kwdict != NULL && !PyDict_Check(kwdict)) { - PyErr_Format(PyExc_TypeError, - "apply() arg 3 expected dictionary, found %s", - kwdict->ob_type->tp_name); - goto finally; - } - retval = PyEval_CallObjectWithKeywords(func, alist, kwdict); - finally: - Py_XDECREF(t); - return retval; -} - -PyDoc_STRVAR(apply_doc, -"apply(object[, args[, kwargs]]) -> value\n\ -\n\ -Call a callable object with positional arguments taken from the tuple args,\n\ -and keyword arguments taken from the optional dictionary kwargs.\n\ -Note that classes are callable, as are instances with a __call__() method.\n\ -\n\ -Deprecated since release 2.3. Instead, use the extended call syntax:\n\ - function(*args, **keywords)."); - static PyObject * builtin_callable(PyObject *self, PyObject *v) @@ -2090,7 +2046,6 @@ {"abs", builtin_abs, METH_O, abs_doc}, {"all", builtin_all, METH_O, all_doc}, {"any", builtin_any, METH_O, any_doc}, - {"apply", builtin_apply, METH_VARARGS, apply_doc}, {"callable", builtin_callable, METH_O, callable_doc}, {"chr", builtin_chr, METH_VARARGS, chr_doc}, {"cmp", builtin_cmp, METH_VARARGS, cmp_doc}, Modified: python/branches/p3yk/Tools/freeze/freeze.py ============================================================================== --- python/branches/p3yk/Tools/freeze/freeze.py (original) +++ python/branches/p3yk/Tools/freeze/freeze.py Fri Mar 17 09:00:19 2006 @@ -194,7 +194,7 @@ if o == '-l': addn_link.append(a) if o == '-a': - apply(modulefinder.AddPackagePath, tuple(a.split("=", 2))) + modulefinder.AddPackagePath(*a.split("=", 2)) if o == '-r': f,r = a.split("=", 2) replace_paths.append( (f,r) ) Modified: python/branches/p3yk/Tools/pynche/pyColorChooser.py ============================================================================== --- python/branches/p3yk/Tools/pynche/pyColorChooser.py (original) +++ python/branches/p3yk/Tools/pynche/pyColorChooser.py Fri Mar 17 09:00:19 2006 @@ -81,7 +81,7 @@ """Ask for a color""" global _chooser if not _chooser: - _chooser = apply(Chooser, (), options) + _chooser = Chooser(**options) return _chooser.show(color, options) def save(): Modified: python/branches/p3yk/Tools/unicode/gencodec.py ============================================================================== --- python/branches/p3yk/Tools/unicode/gencodec.py (original) +++ python/branches/p3yk/Tools/unicode/gencodec.py Fri Mar 17 09:00:19 2006 @@ -399,6 +399,6 @@ import sys if 1: - apply(convertdir,tuple(sys.argv[1:])) + convertdir(*sys.argv[1:]) else: - apply(rewritepythondir,tuple(sys.argv[1:])) + rewritepythondir(*sys.argv[1:]) Modified: python/branches/p3yk/Tools/webchecker/webchecker.py ============================================================================== --- python/branches/p3yk/Tools/webchecker/webchecker.py (original) +++ python/branches/p3yk/Tools/webchecker/webchecker.py Fri Mar 17 09:00:19 2006 @@ -684,7 +684,7 @@ def note(self, level, msg, *args): if self.checker: - apply(self.checker.note, (level, msg) + args) + self.checker.note(level, msg, *args) else: if self.verbose >= level: if args: @@ -741,7 +741,7 @@ def __init__(*args): self = args[0] - apply(urllib.FancyURLopener.__init__, args) + urllib.FancyURLopener.__init__(*args) self.addheaders = [ ('User-agent', 'Python-webchecker/%s' % __version__), ] From python-checkins at python.org Fri Mar 17 09:05:02 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:05:02 +0100 (CET) Subject: [Python-checkins] r43102 - python/branches/p3yk/Doc/api/abstract.tex Message-ID: <20060317080502.5E1F21E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:04:59 2006 New Revision: 43102 Modified: python/branches/p3yk/Doc/api/abstract.tex Log: Remove apply() Modified: python/branches/p3yk/Doc/api/abstract.tex ============================================================================== --- python/branches/p3yk/Doc/api/abstract.tex (original) +++ python/branches/p3yk/Doc/api/abstract.tex Fri Mar 17 09:04:59 2006 @@ -233,8 +233,7 @@ be \NULL{}. \var{args} must not be \NULL{}, use an empty tuple if no arguments are needed. Returns the result of the call on success, or \NULL{} on failure. This is the equivalent of the Python - expression \samp{apply(\var{callable_object}, \var{args}, \var{kw})} - or \samp{\var{callable_object}(*\var{args}, **\var{kw})}. + expression \samp{\var{callable_object}(*\var{args}, **\var{kw})}. \versionadded{2.2} \end{cfuncdesc} @@ -245,8 +244,7 @@ given by the tuple \var{args}. If no arguments are needed, then \var{args} may be \NULL. Returns the result of the call on success, or \NULL{} on failure. This is the equivalent of the - Python expression \samp{apply(\var{callable_object}, \var{args})} or - \samp{\var{callable_object}(*\var{args})}. + Python expression \samp{\var{callable_object}(*\var{args})}. \end{cfuncdesc} \begin{cfuncdesc}{PyObject*}{PyObject_CallFunction}{PyObject *callable, @@ -256,8 +254,7 @@ \cfunction{Py_BuildValue()} style format string. The format may be \NULL, indicating that no arguments are provided. Returns the result of the call on success, or \NULL{} on failure. This is the - equivalent of the Python expression \samp{apply(\var{callable}, - \var{args})} or \samp{\var{callable}(*\var{args})}. + equivalent of the Python expression \samp{\var{callable}(*\var{args})}. \end{cfuncdesc} From python-checkins at python.org Fri Mar 17 09:09:39 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:09:39 +0100 (CET) Subject: [Python-checkins] r43103 - python/branches/p3yk/Include/object.h Message-ID: <20060317080939.E12F51E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:09:39 2006 New Revision: 43103 Modified: python/branches/p3yk/Include/object.h Log: Remove some old types for int based functions (Py_ssize_t is da thing now.) Modified: python/branches/p3yk/Include/object.h ============================================================================== --- python/branches/p3yk/Include/object.h (original) +++ python/branches/p3yk/Include/object.h Fri Mar 17 09:09:39 2006 @@ -130,21 +130,12 @@ typedef int (*inquiry)(PyObject *); typedef Py_ssize_t (*lenfunc)(PyObject *); typedef int (*coercion)(PyObject **, PyObject **); -typedef PyObject *(*intargfunc)(PyObject *, int) Py_DEPRECATED(2.5); -typedef PyObject *(*intintargfunc)(PyObject *, int, int) Py_DEPRECATED(2.5); typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t); typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t); -typedef int(*intobjargproc)(PyObject *, int, PyObject *); -typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *); typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *); typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); typedef int(*objobjargproc)(PyObject *, PyObject *, PyObject *); -/* int-based buffer interface */ -typedef int (*getreadbufferproc)(PyObject *, int, void **); -typedef int (*getwritebufferproc)(PyObject *, int, void **); -typedef int (*getsegcountproc)(PyObject *, int *); -typedef int (*getcharbufferproc)(PyObject *, int, char **); /* ssize_t-based buffer interface */ typedef Py_ssize_t (*readbufferproc)(PyObject *, Py_ssize_t, void **); typedef Py_ssize_t (*writebufferproc)(PyObject *, Py_ssize_t, void **); From python-checkins at python.org Fri Mar 17 09:27:51 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:27:51 +0100 (CET) Subject: [Python-checkins] r43104 - python/branches/p3yk/Include/patchlevel.h Message-ID: <20060317082751.2383B1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:27:50 2006 New Revision: 43104 Modified: python/branches/p3yk/Include/patchlevel.h Log: This gets at least test_cmd_line working again and a few more modules built. Modified: python/branches/p3yk/Include/patchlevel.h ============================================================================== --- python/branches/p3yk/Include/patchlevel.h (original) +++ python/branches/p3yk/Include/patchlevel.h Fri Mar 17 09:27:50 2006 @@ -15,7 +15,7 @@ /* Higher for patch releases */ /* Version parsed out into numeric values */ -#define PY_MAJOR_VERSION 0 +#define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 0 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA From python-checkins at python.org Fri Mar 17 09:28:25 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:28:25 +0100 (CET) Subject: [Python-checkins] r43105 - in python/branches/p3yk/Lib: logging/__init__.py stringold.py Message-ID: <20060317082825.5739B1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:28:24 2006 New Revision: 43105 Modified: python/branches/p3yk/Lib/logging/__init__.py python/branches/p3yk/Lib/stringold.py Log: More apply() cleanup Modified: python/branches/p3yk/Lib/logging/__init__.py ============================================================================== --- python/branches/p3yk/Lib/logging/__init__.py (original) +++ python/branches/p3yk/Lib/logging/__init__.py Fri Mar 17 09:28:24 2006 @@ -1015,7 +1015,7 @@ """ Convenience method for logging an ERROR with exception information. """ - self.error(msg, *args, exc_info=1) + self.error(msg, exc_info=1, *args) def critical(self, msg, *args, **kwargs): """ @@ -1292,7 +1292,7 @@ Log a message with severity 'ERROR' on the root logger, with exception information. """ - error(msg, *args, exc_info=1) + error(msg, exc_info=1, *args) def warning(msg, *args, **kwargs): """ Modified: python/branches/p3yk/Lib/stringold.py ============================================================================== --- python/branches/p3yk/Lib/stringold.py (original) +++ python/branches/p3yk/Lib/stringold.py Fri Mar 17 09:28:24 2006 @@ -126,9 +126,6 @@ return sep.join(words) joinfields = join -# for a little bit of speed -_apply = apply - # Find substring, raise exception if not found def index(s, *args): """index(s, sub [,start [,end]]) -> int @@ -136,7 +133,7 @@ Like find but raises ValueError when the substring is not found. """ - return _apply(s.index, args) + return s.index(*args) # Find last substring, raise exception if not found def rindex(s, *args): @@ -145,7 +142,7 @@ Like rfind but raises ValueError when the substring is not found. """ - return _apply(s.rindex, args) + return s.rindex(*args) # Count non-overlapping occurrences of substring def count(s, *args): @@ -156,7 +153,7 @@ interpreted as in slice notation. """ - return _apply(s.count, args) + return s.count(*args) # Find substring, return -1 if not found def find(s, *args): @@ -169,7 +166,7 @@ Return -1 on failure. """ - return _apply(s.find, args) + return s.find(*args) # Find last substring, return -1 if not found def rfind(s, *args): @@ -182,7 +179,7 @@ Return -1 on failure. """ - return _apply(s.rfind, args) + return s.rfind(*args) # for a bit of speed _float = float @@ -224,7 +221,7 @@ # error message isn't compatible but the error type is, and this function # is complicated enough already. if type(s) == _StringType: - return _apply(_int, args) + return _int(*args) else: raise TypeError('argument 1: expected string, %s found' % type(s).__name__) @@ -252,7 +249,7 @@ # error message isn't compatible but the error type is, and this function # is complicated enough already. if type(s) == _StringType: - return _apply(_long, args) + return _long(*args) else: raise TypeError('argument 1: expected string, %s found' % type(s).__name__) From python-checkins at python.org Fri Mar 17 09:29:50 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:29:50 +0100 (CET) Subject: [Python-checkins] r43106 - in python/branches/p3yk: Doc/lib/libbz2.tex Doc/lib/libstdtypes.tex Doc/tools/undoc_symbols.py Lib/rexec.py Lib/test/test_bz2.py Lib/test/test_decimal.py Lib/test/test_file.py Misc/python.man Modules/bz2module.c Objects/fileobject.c README Message-ID: <20060317082950.022701E4049@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:29:44 2006 New Revision: 43106 Modified: python/branches/p3yk/Doc/lib/libbz2.tex python/branches/p3yk/Doc/lib/libstdtypes.tex python/branches/p3yk/Doc/tools/undoc_symbols.py python/branches/p3yk/Lib/rexec.py python/branches/p3yk/Lib/test/test_bz2.py python/branches/p3yk/Lib/test/test_decimal.py python/branches/p3yk/Lib/test/test_file.py python/branches/p3yk/Misc/python.man python/branches/p3yk/Modules/bz2module.c python/branches/p3yk/Objects/fileobject.c python/branches/p3yk/README Log: Get rid of xreadlines() (methods). Modified: python/branches/p3yk/Doc/lib/libbz2.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libbz2.tex (original) +++ python/branches/p3yk/Doc/lib/libbz2.tex Fri Mar 17 09:29:44 2006 @@ -79,15 +79,6 @@ is an approximate bound on the total number of bytes in the lines returned. \end{methoddesc} -\begin{methoddesc}[BZ2File]{xreadlines}{} -For backward compatibility. \class{BZ2File} objects now include the -performance optimizations previously implemented in the -\module{xreadlines} module. -\deprecated{2.3}{This exists only for compatibility with the method by - this name on \class{file} objects, which is - deprecated. Use \code{for line in file} instead.} -\end{methoddesc} - \begin{methoddesc}[BZ2File]{seek}{offset\optional{, whence}} Move to new file position. Argument \var{offset} is a byte count. Optional argument \var{whence} defaults to \code{0} (offset from start of file, Modified: python/branches/p3yk/Doc/lib/libstdtypes.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libstdtypes.tex (original) +++ python/branches/p3yk/Doc/lib/libstdtypes.tex Fri Mar 17 09:29:44 2006 @@ -1583,12 +1583,6 @@ implemented, or cannot be implemented efficiently. \end{methoddesc} -\begin{methoddesc}[file]{xreadlines}{} - This method returns the same thing as \code{iter(f)}. - \versionadded{2.1} - \deprecated{2.3}{Use \samp{for \var{line} in \var{file}} instead.} -\end{methoddesc} - \begin{methoddesc}[file]{seek}{offset\optional{, whence}} Set the file's current position, like \code{stdio}'s \cfunction{fseek()}. The \var{whence} argument is optional and defaults to \code{0} Modified: python/branches/p3yk/Doc/tools/undoc_symbols.py ============================================================================== --- python/branches/p3yk/Doc/tools/undoc_symbols.py (original) +++ python/branches/p3yk/Doc/tools/undoc_symbols.py Fri Mar 17 09:29:44 2006 @@ -50,7 +50,7 @@ def findnames(file, prefixes=()): names = {} - for line in file.xreadlines(): + for line in file: if line[0] == '!': continue fields = line.split() Modified: python/branches/p3yk/Lib/rexec.py ============================================================================== --- python/branches/p3yk/Lib/rexec.py (original) +++ python/branches/p3yk/Lib/rexec.py Fri Mar 17 09:29:44 2006 @@ -29,7 +29,7 @@ class FileBase: ok_file_methods = ('fileno', 'flush', 'isatty', 'read', 'readline', - 'readlines', 'seek', 'tell', 'write', 'writelines', 'xreadlines', + 'readlines', 'seek', 'tell', 'write', 'writelines', '__iter__') Modified: python/branches/p3yk/Lib/test/test_bz2.py ============================================================================== --- python/branches/p3yk/Lib/test/test_bz2.py (original) +++ python/branches/p3yk/Lib/test/test_bz2.py Fri Mar 17 09:29:44 2006 @@ -110,14 +110,6 @@ self.assertEqual(list(iter(bz2f)), sio.readlines()) bz2f.close() - def testXReadLines(self): - # "Test BZ2File.xreadlines()" - self.createTempFile() - bz2f = BZ2File(self.filename) - sio = StringIO(self.TEXT) - self.assertEqual(list(bz2f.xreadlines()), sio.readlines()) - bz2f.close() - def testUniversalNewlinesLF(self): # "Test BZ2File.read() with universal newlines (\\n)" self.createTempFile() @@ -256,7 +248,7 @@ bz2f.close() self.assertEqual(lines, ['Test']) bz2f = BZ2File(self.filename) - xlines = list(bz2f.xreadlines()) + xlines = list(bz2f.readlines()) bz2f.close() self.assertEqual(lines, ['Test']) Modified: python/branches/p3yk/Lib/test/test_decimal.py ============================================================================== --- python/branches/p3yk/Lib/test/test_decimal.py (original) +++ python/branches/p3yk/Lib/test/test_decimal.py Fri Mar 17 09:29:44 2006 @@ -132,7 +132,7 @@ if skip_expected: raise TestSkipped return - for line in open(file).xreadlines(): + for line in open(file): line = line.replace('\r\n', '').replace('\n', '') #print line try: Modified: python/branches/p3yk/Lib/test/test_file.py ============================================================================== --- python/branches/p3yk/Lib/test/test_file.py (original) +++ python/branches/p3yk/Lib/test/test_file.py Fri Mar 17 09:29:44 2006 @@ -179,7 +179,7 @@ methods = ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'tell', 'truncate', 'write', - 'xreadlines', '__iter__'] + '__iter__'] if sys.platform.startswith('atheos'): methods.remove('truncate') Modified: python/branches/p3yk/Misc/python.man ============================================================================== --- python/branches/p3yk/Misc/python.man (original) +++ python/branches/p3yk/Misc/python.man Fri Mar 17 09:29:44 2006 @@ -152,7 +152,7 @@ .B \-u Force stdin, stdout and stderr to be totally unbuffered. On systems where it matters, also put stdin, stdout and stderr in binary mode. -Note that there is internal buffering in xreadlines(), readlines() and +Note that there is internal buffering in readlines() and file-object iterators ("for line in sys.stdin") which is not influenced by this option. To work around this, you will want to use "sys.stdin.readline()" inside a "while 1:" loop. Modified: python/branches/p3yk/Modules/bz2module.c ============================================================================== --- python/branches/p3yk/Modules/bz2module.c (original) +++ python/branches/p3yk/Modules/bz2module.c Fri Mar 17 09:29:44 2006 @@ -778,13 +778,6 @@ 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\ @@ -1183,7 +1176,6 @@ {"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__}, Modified: python/branches/p3yk/Objects/fileobject.c ============================================================================== --- python/branches/p3yk/Objects/fileobject.c (original) +++ python/branches/p3yk/Objects/fileobject.c Fri Mar 17 09:29:44 2006 @@ -1675,12 +1675,6 @@ "The optional size argument, if given, is an approximate bound on the\n" "total number of bytes in the lines returned."); -PyDoc_STRVAR(xreadlines_doc, -"xreadlines() -> returns self.\n" -"\n" -"For backward compatibility. File objects now include the performance\n" -"optimizations previously implemented in the xreadlines module."); - PyDoc_STRVAR(writelines_doc, "writelines(sequence_of_strings) -> None. Write the strings to the file.\n" "\n" @@ -1719,7 +1713,6 @@ {"tell", (PyCFunction)file_tell, METH_NOARGS, tell_doc}, {"readinto", (PyCFunction)file_readinto, METH_VARARGS, readinto_doc}, {"readlines", (PyCFunction)file_readlines,METH_VARARGS, readlines_doc}, - {"xreadlines",(PyCFunction)file_self, METH_NOARGS, xreadlines_doc}, {"writelines",(PyCFunction)file_writelines, METH_O, writelines_doc}, {"flush", (PyCFunction)file_flush, METH_NOARGS, flush_doc}, {"close", (PyCFunction)file_close, METH_NOARGS, close_doc}, Modified: python/branches/p3yk/README ============================================================================== --- python/branches/p3yk/README (original) +++ python/branches/p3yk/README Fri Mar 17 09:29:44 2006 @@ -504,9 +504,9 @@ _codecs, _locale, _socket, _symtable, _testcapi, _weakref array, binascii, cmath, cPickle, crypt, cStringIO, dbm - errno, fcntl, grp, math, md5, operator, parser, pcre, pwd - regex, rotor, select, struct, strop, syslog, termios - time, timing, xreadlines + errno, fcntl, grp, math, md5, operator, parser, pwd + rotor, select, struct, strop, syslog, termios, + time, timing 4) Once the python executable and library have been built, make will execute setup.py, which will attempt to build remaining From python-checkins at python.org Fri Mar 17 09:54:17 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:54:17 +0100 (CET) Subject: [Python-checkins] r43107 - python/branches/p3yk/Lib/test/test_array.py Message-ID: <20060317085417.553101E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:54:15 2006 New Revision: 43107 Modified: python/branches/p3yk/Lib/test/test_array.py Log: as is a keyword now :-) Modified: python/branches/p3yk/Lib/test/test_array.py ============================================================================== --- python/branches/p3yk/Lib/test/test_array.py (original) +++ python/branches/p3yk/Lib/test/test_array.py Fri Mar 17 09:54:15 2006 @@ -205,7 +205,7 @@ self.assert_((a > a) is False) self.assert_((a >= a) is True) - as = array.array(self.typecode, self.smallerexample) + al = array.array(self.typecode, self.smallerexample) ab = array.array(self.typecode, self.biggerexample) self.assert_((a == 2*a) is False) @@ -215,12 +215,12 @@ self.assert_((a > 2*a) is False) self.assert_((a >= 2*a) is False) - self.assert_((a == as) is False) - self.assert_((a != as) is True) - self.assert_((a < as) is False) - self.assert_((a <= as) is False) - self.assert_((a > as) is True) - self.assert_((a >= as) is True) + self.assert_((a == al) is False) + self.assert_((a != al) is True) + self.assert_((a < al) is False) + self.assert_((a <= al) is False) + self.assert_((a > al) is True) + self.assert_((a >= al) is True) self.assert_((a == ab) is False) self.assert_((a != ab) is True) From python-checkins at python.org Fri Mar 17 09:55:47 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:55:47 +0100 (CET) Subject: [Python-checkins] r43108 - python/trunk/Lib/test/test_array.py Message-ID: <20060317085547.3D55B1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:55:46 2006 New Revision: 43108 Modified: python/trunk/Lib/test/test_array.py Log: as is on the road to keyword-hood, use a different var name. Modified: python/trunk/Lib/test/test_array.py ============================================================================== --- python/trunk/Lib/test/test_array.py (original) +++ python/trunk/Lib/test/test_array.py Fri Mar 17 09:55:46 2006 @@ -205,7 +205,7 @@ self.assert_((a > a) is False) self.assert_((a >= a) is True) - as = array.array(self.typecode, self.smallerexample) + al = array.array(self.typecode, self.smallerexample) ab = array.array(self.typecode, self.biggerexample) self.assert_((a == 2*a) is False) @@ -215,12 +215,12 @@ self.assert_((a > 2*a) is False) self.assert_((a >= 2*a) is False) - self.assert_((a == as) is False) - self.assert_((a != as) is True) - self.assert_((a < as) is False) - self.assert_((a <= as) is False) - self.assert_((a > as) is True) - self.assert_((a >= as) is True) + self.assert_((a == al) is False) + self.assert_((a != al) is True) + self.assert_((a < al) is False) + self.assert_((a <= al) is False) + self.assert_((a > al) is True) + self.assert_((a >= al) is True) self.assert_((a == ab) is False) self.assert_((a != ab) is True) From python-checkins at python.org Fri Mar 17 09:57:47 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:57:47 +0100 (CET) Subject: [Python-checkins] r43109 - in python/branches/p3yk: Include/pydebug.h Python/ceval.c Python/pythonrun.c Message-ID: <20060317085747.6DC5E1E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:57:43 2006 New Revision: 43109 Modified: python/branches/p3yk/Include/pydebug.h python/branches/p3yk/Python/ceval.c python/branches/p3yk/Python/pythonrun.c Log: _Py_QnewFlag and INPLACE_DIVIDE are not necessary any longer Modified: python/branches/p3yk/Include/pydebug.h ============================================================================== --- python/branches/p3yk/Include/pydebug.h (original) +++ python/branches/p3yk/Include/pydebug.h Fri Mar 17 09:57:43 2006 @@ -16,10 +16,6 @@ PyAPI_DATA(int) Py_UnicodeFlag; PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; PyAPI_DATA(int) Py_DivisionWarningFlag; -/* _XXX Py_QnewFlag should go away in 3.0. It's true iff -Qnew is passed, - on the command line, and is used in 2.2 by ceval.c to make all "/" divisions - true divisions (which they will be in 3.0). */ -PyAPI_DATA(int) _Py_QnewFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like Modified: python/branches/p3yk/Python/ceval.c ============================================================================== --- python/branches/p3yk/Python/ceval.c (original) +++ python/branches/p3yk/Python/ceval.c Fri Mar 17 09:57:43 2006 @@ -1262,19 +1262,6 @@ if (x != NULL) continue; break; - case INPLACE_DIVIDE: - if (!_Py_QnewFlag) { - w = POP(); - v = TOP(); - x = PyNumber_InPlaceDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) continue; - break; - } - /* -Qnew is in effect: fall through to - INPLACE_TRUE_DIVIDE */ case INPLACE_TRUE_DIVIDE: w = POP(); v = TOP(); Modified: python/branches/p3yk/Python/pythonrun.c ============================================================================== --- python/branches/p3yk/Python/pythonrun.c (original) +++ python/branches/p3yk/Python/pythonrun.c Fri Mar 17 09:57:43 2006 @@ -71,10 +71,6 @@ int Py_FrozenFlag; /* Needed by getpath.c */ int Py_UnicodeFlag = 0; /* Needed by compile.c */ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ -/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed, - on the command line, and is used in 2.2 by ceval.c to make all "/" divisions - true divisions (which they will be in 2.3). */ -int _Py_QnewFlag = 0; /* Reference to 'warnings' module, to avoid importing it on the fly when the import lock may be held. See 683658/771097 From python-checkins at python.org Fri Mar 17 09:59:11 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 09:59:11 +0100 (CET) Subject: [Python-checkins] r43110 - in python/branches/p3yk: Doc/lib/libdis.tex Include/opcode.h Lib/compiler/pycodegen.py Lib/opcode.py Python/compile.c Message-ID: <20060317085911.02B191E4006@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 09:59:09 2006 New Revision: 43110 Modified: python/branches/p3yk/Doc/lib/libdis.tex python/branches/p3yk/Include/opcode.h python/branches/p3yk/Lib/compiler/pycodegen.py python/branches/p3yk/Lib/opcode.py python/branches/p3yk/Python/compile.c Log: INPLACE_DIVIDE is no longer necessary (INPLACE_TRUE_DIVIDE is used). Modified: python/branches/p3yk/Doc/lib/libdis.tex ============================================================================== --- python/branches/p3yk/Doc/lib/libdis.tex (original) +++ python/branches/p3yk/Doc/lib/libdis.tex Fri Mar 17 09:59:09 2006 @@ -247,11 +247,6 @@ Implements in-place \code{TOS = TOS1 * TOS}. \end{opcodedesc} -\begin{opcodedesc}{INPLACE_DIVIDE}{} -Implements in-place \code{TOS = TOS1 / TOS} when -\code{from __future__ import division} is not in effect. -\end{opcodedesc} - \begin{opcodedesc}{INPLACE_FLOOR_DIVIDE}{} Implements in-place \code{TOS = TOS1 // TOS}. \end{opcodedesc} Modified: python/branches/p3yk/Include/opcode.h ============================================================================== --- python/branches/p3yk/Include/opcode.h (original) +++ python/branches/p3yk/Include/opcode.h Fri Mar 17 09:59:09 2006 @@ -48,7 +48,7 @@ #define INPLACE_ADD 55 #define INPLACE_SUBTRACT 56 #define INPLACE_MULTIPLY 57 -#define INPLACE_DIVIDE 58 + #define INPLACE_MODULO 59 #define STORE_SUBSCR 60 #define DELETE_SUBSCR 61 Modified: python/branches/p3yk/Lib/compiler/pycodegen.py ============================================================================== --- python/branches/p3yk/Lib/compiler/pycodegen.py (original) +++ python/branches/p3yk/Lib/compiler/pycodegen.py Fri Mar 17 09:59:09 2006 @@ -999,7 +999,7 @@ '+=' : 'INPLACE_ADD', '-=' : 'INPLACE_SUBTRACT', '*=' : 'INPLACE_MULTIPLY', - '/=' : 'INPLACE_DIVIDE', + '/=' : 'INPLACE_TRUE_DIVIDE', '//=': 'INPLACE_FLOOR_DIVIDE', '%=' : 'INPLACE_MODULO', '**=': 'INPLACE_POWER', Modified: python/branches/p3yk/Lib/opcode.py ============================================================================== --- python/branches/p3yk/Lib/opcode.py (original) +++ python/branches/p3yk/Lib/opcode.py Fri Mar 17 09:59:09 2006 @@ -88,7 +88,7 @@ def_op('INPLACE_ADD', 55) def_op('INPLACE_SUBTRACT', 56) def_op('INPLACE_MULTIPLY', 57) -def_op('INPLACE_DIVIDE', 58) + def_op('INPLACE_MODULO', 59) def_op('STORE_SUBSCR', 60) def_op('DELETE_SUBSCR', 61) Modified: python/branches/p3yk/Python/compile.c ============================================================================== --- python/branches/p3yk/Python/compile.c (original) +++ python/branches/p3yk/Python/compile.c Fri Mar 17 09:59:09 2006 @@ -1338,7 +1338,6 @@ case INPLACE_ADD: case INPLACE_SUBTRACT: case INPLACE_MULTIPLY: - case INPLACE_DIVIDE: case INPLACE_MODULO: return -1; case STORE_SUBSCR: From python-checkins at python.org Fri Mar 17 10:00:01 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 17 Mar 2006 10:00:01 +0100 (CET) Subject: [Python-checkins] r43111 - in python/branches/p3yk: Include/Python.h Modules/cstubs RISCOS/Modules/riscosmodule.c Message-ID: <20060317090001.C42D11E400F@bag.python.org> Author: neal.norwitz Date: Fri Mar 17 10:00:00 2006 New Revision: 43111 Modified: python/branches/p3yk/Include/Python.h python/branches/p3yk/Modules/cstubs python/branches/p3yk/RISCOS/Modules/riscosmodule.c Log: Remove PyArg_NoArgs() and PyArg_GetInt() Modified: python/branches/p3yk/Include/Python.h ============================================================================== --- python/branches/p3yk/Include/Python.h (original) +++ python/branches/p3yk/Include/Python.h Fri Mar 17 10:00:00 2006 @@ -131,13 +131,6 @@ /* _Py_Mangle is defined in compile.c */ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); -/* PyArg_GetInt is deprecated and should not be used, use PyArg_Parse(). */ -#define PyArg_GetInt(v, a) PyArg_Parse((v), "i", (a)) - -/* PyArg_NoArgs should not be necessary. - Set ml_flags in the PyMethodDef to METH_NOARGS. */ -#define PyArg_NoArgs(v) PyArg_Parse(v, "") - /* Convert a possibly signed character to a nonnegative int */ /* XXX This assumes characters are 8 bits wide */ #ifdef __CHAR_UNSIGNED__ Modified: python/branches/p3yk/Modules/cstubs ============================================================================== --- python/branches/p3yk/Modules/cstubs (original) +++ python/branches/p3yk/Modules/cstubs Fri Mar 17 10:00:00 2006 @@ -472,8 +472,6 @@ { 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"); Modified: python/branches/p3yk/RISCOS/Modules/riscosmodule.c ============================================================================== --- python/branches/p3yk/RISCOS/Modules/riscosmodule.c (original) +++ python/branches/p3yk/RISCOS/Modules/riscosmodule.c Fri Mar 17 10:00:00 2006 @@ -79,7 +79,7 @@ } static PyObject *riscos_getcwd(PyObject *self,PyObject *args) -{ if(!PyArg_NoArgs(args)) return NULL; +{ return canon("@"); } @@ -354,7 +354,7 @@ {"system", riscos_system}, {"rmdir", riscos_remove}, {"chdir", riscos_chdir}, - {"getcwd", riscos_getcwd}, + {"getcwd", riscos_getcwd, METH_NOARGS}, {"expand", riscos_expand}, {"mkdir", riscos_mkdir,1}, {"listdir", riscos_listdir}, From neal at metaslash.com Fri Mar 17 11:01:59 2006 From: neal at metaslash.com (Neal Norwitz) Date: Fri, 17 Mar 2006 05:01:59 -0500 Subject: [Python-checkins] Python Regression Test Failures refleak (1) Message-ID: <20060317100159.GA20244@python.psfb.org> test_capi leaked [-46, 0, 0] references test_compiler leaked [52, 58, 217] references test_generators leaked [255, 255, 255] references test_quopri leaked [17, 0, 0] references test_socket leaked [-206, 0, 0] references test_threadedtempfile leaked [1, 0, 2] references test_threading_local leaked [26, 34, 26] references test_urllib2 leaked [80, -130, 70] references test_ctypes leaked [65, 66, 63] references From mal at egenix.com Fri Mar 17 11:09:04 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Fri, 17 Mar 2006 11:09:04 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <4415F61D.1070907@v.loewis.de> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <4415F61D.1070907@v.loewis.de> Message-ID: <441A8AC0.1070202@egenix.com> Martin v. L?wis wrote: > [as Thomas points out, this is on python-checkins, so continuing in > English] > >> Falsch, weil der Patch wesentlich komplexer ist, als zur >> L?sung des Problems n?tig gewesen w?re und man nun auch in Zukunft >> stets mehrere Versionen der Datenbank bereithalten mu?, anstatt >> einfach mehrere Module daf?r bereitzuhalten, die je nach Bedarf >> hinzugeladen werden k?nnen. > > Well, "the problem" to be solved was not merely to provide two versions > of the database, but also in a space-efficient way. All this effort > in trying to squeeze the size of the data would be wasted when it > then gets double just because two versions of the database must > be provided. Since the big tables of the database are static C data, only the portions needed would ever get swapped into memory, so this argument is rather weak. Also, most users won't ever use the IDNA codec, so they'd benefit from not having the extra complexity around. >> Es wird auch nicht m?glich sein, die alten Versionen ohne Problem >> abzutrennen, so da? bei einer Erweiterung der Datenbank um weitere >> Felder oder Informationen, Probleme mit der Synchronisierung der >> Datenbank entstehen werden. > > There is no need to strip the old version. Parts of the library > rely on the old version specifically, and these parts are not going > to go away for a foreseeable future, nor does the need go away that > these libraries need the version 3.2 of the Unicode database. > IDNA is simply not going to change in that respect, for several > years to come. > > *If* there is a need to strip off 3.2 at some point, this is > very easily done through a slight modification to > makeunicodedata.py. You're missing the point: With the old version available in a separate module, users who still need the old version could continue to compile it for themselves. If you change makeunicodedata.py, then there's no way back for these users. Given that the stringprep RFC has started out by pointing to a specific Unicode version, it is likely that these strong binding to specific versions are going to happen again in the future. This makes it nearly impossible to remove the old database version support, since there's always be some users that will have to rely on the availability of the old database versions. >>> Das ist ja genau der Trick: sie m?ssen das nicht. Die Unterst?tzung >>> von Unicode 3.2 kostet nur 18kB. >> >> Das ist in der Tat wenig. > > That's because only the changed records are collected, plus a list > of characters that were unassigned in 3.2 but are defined in 4.1. > > In principle, there should not be a single changed record. In practive, > a few records have changed - mostly changes to the character category. > As a matter of principle, the names of a character never change in > Unicode (this is a promise the consortium and ISO make), and, as a > similar principle, the normalization never changes except for clear > errors. > > There are only five characters for which normalization changed > between between 3.2 and 4.1; I generate a C function for these. > Interestingly enough, these changes are one of the primary reasons > why some people in IETF despise the notion of updating IDNA: > This would be a change in wire protocol, with potential > security implications (i.e. it might allow for phishing). In > these cases, the potential for phishing is really minimal - > but it exists, which means proposals to update IDNA will meet > strong resistance. > > It might be possible to reduce the table of changes even further, > using a three-level trie, if desired. As you've pointed out, the size is really irrelevant. What about access speed ? -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 17 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From mal at egenix.com Fri Mar 17 11:19:59 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Fri, 17 Mar 2006 11:19:59 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <44172E5B.7070309@v.loewis.de> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> <4416894C.7090304@egenix.com> <44172E5B.7070309@v.loewis.de> Message-ID: <441A8D4F.1030906@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >> Now we have two versions of the database in a single module >> and if we want to upgrade to a new version in the future the >> path taken by Martin now would have to be repeated, adding more >> complexity. > > What do you mean by "repeated"? That the next update should > incorporate three versions? If someone comes up with an RFC pointing to version 4.1, then yes, we'd have to keep it as well. > Not necessarily: old versions can > certainly be dropped if there is no need to keep them. We did > not make a promise to provide access to all versions of the > database that the Unicode consortium ever had released. True. >> Deprecation of an old version would not be user friendly, >> since you can't warn on import, only on use of the lookup >> object. > > If you think a new module should be added in addition: that > could certainly be done. Sounds like a plan :-) >> Adding support for new features in the Unicode database >> would also be unnecessarily complicated, since the old >> versions won't provide the needed input data. > > This I don't understand: what new features could these > be? All features of the Unicode database range back to > the earliest versions, including data which we currently > don't expose. I meant new features as in: new fields in the database or new values for categories. If we expose new features that are only available in 4.1 and not in 3.2, then you have a compatibility problem since the 3.2 version won't supply the needed data. We'd either have to make up some defaults or raise an error for these. >> Currently, the only reason to keep 3.2 support around seems to >> be the IDNA encoding (RFC 3490) which relies on stringprep >> (RFC 3454) which is only defined for Unicode 3.2.0. It is however >> likely that the stringprep RFC will get updated to later versions: >> >> "This document is for Unicode version 3.2, and should not be considered >> to automatically apply to later Unicode versions. The IETF, through an >> explicit standards action, may update this document as appropriate to >> handle later Unicode versions." > > That doesn't say an update is likely. Indeed, it is not likely. > This says the update is possible. The reason stringprep is tied to Unicode 3.2 stems from the need to provide explicit tables for the string pre-processing. I don't see why the IETF should not update the RFC with a new set of tables against the Unicode 4.1 (or a later) database version. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 17 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From amk at amk.ca Fri Mar 17 14:18:18 2006 From: amk at amk.ca (A.M. Kuchling) Date: Fri, 17 Mar 2006 08:18:18 -0500 Subject: [Python-checkins] r43101 - in python/branches/p3yk: Demo/classes/bitvec.py Demo/metaclasses/Eiffel.py Demo/metaclasses/Meta.py Demo/metaclasses/Simple.py Demo/metaclasses/Synch.py Demo/metaclasses/Trace.py Demo/pdist/RCSProxy.py Demo/pdist/client.py Demo/pdist/server.py Demo/threads/Coroutine.py Demo/threads/Generator.py Demo/threads/find.py Demo/tix/tixwidgets.py Demo/tkinter/guido/AttrDialog.py Demo/tkinter/guido/ManPage.py Demo/tkinter/guido/ShellWindow.py Demo/tkinter/guido/kill.py Demo/tkinter/guido/optionmenu.py Demo/tkinter/guido/sortvisu.py Demo/tkinter/guido/svkill.py Demo/tkinter/matt/window-creation-w-location.py Doc/api/abstract.tex Doc/lib/libfuncs.tex Lib/bsddb/dbobj.py Lib/bsddb/dbshelve.py Lib/bsddb/test/test_basics.py Lib/bsddb/test/test_dbobj.py Lib/bsddb/test/test_join.py Lib/compiler/transformer.py Lib/distutils/archive_util.py Lib/distutils/command/build_ext.py Lib/distutils/command/build_py.py Lib/distutils/dir_util.py Lib/distutils/filelist.py Lib/distutils/util.py Lib/idlelib/MultiCall.py Lib/logging/__init__.py Lib/logging/config.py Lib/plat-mac/gensuitemodule.py Lib/subprocess.py Lib/test/crashers/infinite_rec_4.py Lib/test/test_builtin.py Mac/Demo/sound/morse.py Mac/Tools/IDE/ProfileBrowser.py Mac/Tools/IDE/PyConsole.py Mac/Tools/IDE/PyDebugger.py Mac/Tools/IDE/Wapplication.py Mac/Tools/IDE/Wbase.py Mac/Tools/macfreeze/macgen_bin.py Mac/scripts/buildpkg.py PCbuild/readme.txt Python/bltinmodule.c Tools/freeze/freeze.py Tools/pynche/pyColorChooser.py Tools/unicode/gencodec.py Tools/webchecker/webchecker.py In-Reply-To: <20060317080038.830291E4010@bag.python.org> References: <20060317080038.830291E4010@bag.python.org> Message-ID: <20060317131818.GA7065@rogue.amk.ca> On Fri, Mar 17, 2006 at 09:00:38AM +0100, neal.norwitz wrote: > Remove apply() > > Modified: python/branches/p3yk/Demo/classes/bitvec.py Should these changes be applied to the Demo/ and Lib/ directories to the trunk? Admittedly this sort of search-and-replace change is discouraged, but if the work is already done... --amk From python-checkins at python.org Fri Mar 17 16:38:41 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 16:38:41 +0100 (CET) Subject: [Python-checkins] r43112 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060317153841.858201E4006@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 16:38:39 2006 New Revision: 43112 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Add some items Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 17 16:38:39 2006 @@ -597,6 +597,15 @@ The \member{st_flags} member is also available, if the platform supports it. % XXX patch 1180695, 1212117 +\item The old \module{regex} and \module{regsub} modules, which have been +deprecated ever since Python 2.0, have finally been deleted. + +\item The \file{lib-old} directory, +which includes ancient modules such as \module{dircmp} and +\module{ni}, was also deleted. \file{lib-old} wasn't on the default +\code{sys.path}, so unless your programs explicitly added the directory to +\code{sys.path}, this removal shouldn't affect your code. + \item The \module{socket} module now supports \constant{AF_NETLINK} sockets on Linux, thanks to a patch from Philippe Biondi. Netlink sockets are a Linux-specific mechanism for communications @@ -715,7 +724,14 @@ \begin{itemize} -\item Details go here. +\item Evan Jones's patch to obmalloc, first described in a talk +at PyCon DC 2005, was applied. Python 2.4 allocated small objects in +256K-sized arenas, but never freed arenas. With this patch, Python +will free arenas when they're empty. The net effect is that on some +platforms, when you allocate many objects, Python's memory usage may +actually drop when you delete them, and the memory may be returned to +the operating system. (Implemented by Evan Jones, and reworked by Tim +Peters.) \end{itemize} From python-checkins at python.org Fri Mar 17 16:39:53 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 16:39:53 +0100 (CET) Subject: [Python-checkins] r43113 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060317153953.E6EE91E4006@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 16:39:52 2006 New Revision: 43113 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Remove mention of lib-old, and list more deleted modules Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 17 16:39:52 2006 @@ -599,6 +599,8 @@ \item The old \module{regex} and \module{regsub} modules, which have been deprecated ever since Python 2.0, have finally been deleted. +Other deleted modules: \module{statcache}, \module{tzparse}, +\module{whrandom}. \item The \file{lib-old} directory, which includes ancient modules such as \module{dircmp} and @@ -744,23 +746,6 @@ \begin{itemize} -\item Some old deprecated modules (\module{statcache}, \module{tzparse}, - \module{whrandom}) have been moved to \file{Lib/lib-old}. -You can get access to these modules again by adding the directory -to your \code{sys.path}: - -\begin{verbatim} -import os -from distutils import sysconfig - -lib_dir = sysconfig.get_python_lib(standard_lib=True) -old_dir = os.path.join(lib_dir, 'lib-old') -sys.path.append(old_dir) -\end{verbatim} - -Doing so is discouraged, however; it's better to update any code that -still uses these modules. - % the pickle module no longer uses the deprecated bin parameter. \end{itemize} From python-checkins at python.org Fri Mar 17 16:52:07 2006 From: python-checkins at python.org (phillip.eby) Date: Fri, 17 Mar 2006 16:52:07 +0100 (CET) Subject: [Python-checkins] r43114 - sandbox/trunk/setuptools/setuptools/archive_util.py Message-ID: <20060317155207.42AC91E4006@bag.python.org> Author: phillip.eby Date: Fri Mar 17 16:52:05 2006 New Revision: 43114 Modified: sandbox/trunk/setuptools/setuptools/archive_util.py Log: Preserve timestamps and permissions when "unpacking" (copying) a directory tree. Modified: sandbox/trunk/setuptools/setuptools/archive_util.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/archive_util.py (original) +++ sandbox/trunk/setuptools/setuptools/archive_util.py Fri Mar 17 16:52:05 2006 @@ -100,9 +100,9 @@ if not target: continue # skip non-files ensure_directory(target) - shutil.copyfile(os.path.join(base,f), target) - - + f = os.path.join(base,f) + shutil.copyfile(f, target) + shutil.copystat(f, target) From python-checkins at python.org Fri Mar 17 16:53:00 2006 From: python-checkins at python.org (thomas.heller) Date: Fri, 17 Mar 2006 16:53:00 +0100 (CET) Subject: [Python-checkins] r43115 - in python/trunk: Lib/ctypes/__init__.py Lib/ctypes/test/test_byteswap.py Lib/ctypes/test/test_cfuncs.py Lib/ctypes/test/test_loading.py Lib/ctypes/test/test_sizes.py Modules/_ctypes/_ctypes.c Modules/_ctypes/callproc.c Message-ID: <20060317155300.A315E1E400B@bag.python.org> Author: thomas.heller Date: Fri Mar 17 16:52:58 2006 New Revision: 43115 Modified: python/trunk/Lib/ctypes/__init__.py python/trunk/Lib/ctypes/test/test_byteswap.py python/trunk/Lib/ctypes/test/test_cfuncs.py python/trunk/Lib/ctypes/test/test_loading.py python/trunk/Lib/ctypes/test/test_sizes.py python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callproc.c Log: Merge changes from the upstream version: - cast is implemented as a foreign function now - On Windows, it is now possible to access functions exported by ordinal only Modified: python/trunk/Lib/ctypes/__init__.py ============================================================================== --- python/trunk/Lib/ctypes/__init__.py (original) +++ python/trunk/Lib/ctypes/__init__.py Fri Mar 17 16:52:58 2006 @@ -304,10 +304,11 @@ raise AttributeError, name return self.__getitem__(name) - def __getitem__(self, name): - func = self._FuncPtr(name, self) - func.__name__ = name - setattr(self, name, func) + def __getitem__(self, name_or_ordinal): + func = self._FuncPtr((name_or_ordinal, self)) + if not isinstance(name_or_ordinal, (int, long)): + func.__name__ = name_or_ordinal + setattr(self, name_or_ordinal, func) return func class PyDLL(CDLL): @@ -384,21 +385,29 @@ _pointer_type_cache[None] = c_void_p -# functions - -from _ctypes import _memmove_addr, _memset_addr, _string_at_addr, cast - if sizeof(c_uint) == sizeof(c_void_p): c_size_t = c_uint elif sizeof(c_ulong) == sizeof(c_void_p): c_size_t = c_ulong +# functions + +from _ctypes import _memmove_addr, _memset_addr, _string_at_addr, _cast_addr + ## void *memmove(void *, const void *, size_t); memmove = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_size_t)(_memmove_addr) ## void *memset(void *, int, size_t) memset = CFUNCTYPE(c_void_p, c_void_p, c_int, c_size_t)(_memset_addr) +def PYFUNCTYPE(restype, *argtypes): + class CFunctionType(_CFuncPtr): + _argtypes_ = argtypes + _restype_ = restype + _flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI + return CFunctionType +cast = PYFUNCTYPE(py_object, c_void_p, py_object)(_cast_addr) + _string_at = CFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr) def string_at(ptr, size=0): """string_at(addr[, size]) -> string Modified: python/trunk/Lib/ctypes/test/test_byteswap.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_byteswap.py (original) +++ python/trunk/Lib/ctypes/test/test_byteswap.py Fri Mar 17 16:52:58 2006 @@ -2,6 +2,7 @@ from binascii import hexlify from ctypes import * +from ctypes.test import is_resource_enabled def bin(s): return hexlify(buffer(s)).upper() @@ -149,7 +150,7 @@ self.failUnless(c_char.__ctype_le__ is c_char) self.failUnless(c_char.__ctype_be__ is c_char) - def test_struct_fields(self): + def test_struct_fields_1(self): if sys.byteorder == "little": base = BigEndianStructure else: @@ -198,17 +199,20 @@ pass self.assertRaises(TypeError, setattr, S, "_fields_", [("s", T)]) - # crashes on solaris with a core dump. - def X_test_struct_fields(self): + def test_struct_fields_2(self): + # standard packing in struct uses no alignment. + # So, we have to align using pad bytes. + # + # Unaligned accesses will crash Python (on those platforms that + # don't allow it, like sparc solaris). if sys.byteorder == "little": base = BigEndianStructure - fmt = ">bhid" + fmt = ">bxhid" else: base = LittleEndianStructure - fmt = "' uses standard alignment. _fields_ = [("b", c_byte), ("h", c_short), ("i", c_int), @@ -218,5 +222,54 @@ s2 = struct.pack(fmt, 0x12, 0x1234, 0x12345678, 3.14) self.failUnlessEqual(bin(s1), bin(s2)) + if is_resource_enabled("unaligned_access"): + + def test_unaligned_nonnative_struct_fields(self): + if sys.byteorder == "little": + base = BigEndianStructure + fmt = ">b h xi xd" + else: + base = LittleEndianStructure + fmt = "flags & FUNCFLAG_CDECL) return address; @@ -2493,6 +2498,28 @@ return 1; } +static int +_get_name(PyObject *obj, char **pname) +{ +#ifdef MS_WIN32 + if (PyInt_Check(obj) || PyLong_Check(obj)) { + /* We have to use MAKEINTRESOURCEA for Windows CE. + Works on Windows as well, of course. + */ + *pname = MAKEINTRESOURCEA(PyInt_AsUnsignedLongMask(obj) & 0xFFFF); + return 1; + } +#endif + if (PyString_Check(obj) || PyUnicode_Check(obj)) { + *pname = PyString_AsString(obj); + return pname ? 1 : 0; + } + PyErr_SetString(PyExc_TypeError, + "function name must be string or integer"); + return 0; +} + + static PyObject * CFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -2504,7 +2531,7 @@ void *handle; PyObject *paramflags = NULL; - if (!PyArg_ParseTuple(args, "sO|O", &name, &dll, ¶mflags)) + if (!PyArg_ParseTuple(args, "(O&O)|O", _get_name, &name, &dll, ¶mflags)) return NULL; if (paramflags == Py_None) paramflags = NULL; @@ -2529,9 +2556,14 @@ #ifdef MS_WIN32 address = FindAddress(handle, name, (PyObject *)type); if (!address) { - PyErr_Format(PyExc_AttributeError, - "function '%s' not found", - name); + if ((size_t)name & ~0xFFFF) + PyErr_Format(PyExc_AttributeError, + "function '%s' not found", + name); + else + PyErr_Format(PyExc_AttributeError, + "function ordinal %d not found", + name); return NULL; } #else @@ -2608,8 +2640,9 @@ "O" - must be a callable, creates a C callable function two or more argument forms (the third argument is a paramflags tuple) - "sO|O" - function name, dll object (with an integer handle) - "is|O" - vtable index, method name, creates callable calling COM vtbl + "(sO)|..." - (function name, dll object (with an integer handle)), paramflags + "(iO)|..." - (function ordinal, dll object (with an integer handle)), paramflags + "is|..." - vtable index, method name, creates callable calling COM vtbl */ static PyObject * CFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @@ -2622,14 +2655,13 @@ if (PyTuple_GET_SIZE(args) == 0) return GenericCData_new(type, args, kwds); - /* Shouldn't the following better be done in __init__? */ - if (2 <= PyTuple_GET_SIZE(args)) { + if (1 <= PyTuple_GET_SIZE(args) && PyTuple_Check(PyTuple_GET_ITEM(args, 0))) + return CFuncPtr_FromDll(type, args, kwds); + #ifdef MS_WIN32 - if (PyInt_Check(PyTuple_GET_ITEM(args, 0))) - return CFuncPtr_FromVtblIndex(type, args, kwds); + if (2 <= PyTuple_GET_SIZE(args) && PyInt_Check(PyTuple_GET_ITEM(args, 0))) + return CFuncPtr_FromVtblIndex(type, args, kwds); #endif - return CFuncPtr_FromDll(type, args, kwds); - } if (1 == PyTuple_GET_SIZE(args) && (PyInt_Check(PyTuple_GET_ITEM(args, 0)) @@ -4351,6 +4383,42 @@ return PyString_FromStringAndSize(ptr, size); } +static int +cast_check_pointertype(PyObject *arg) +{ + StgDictObject *dict; + + if (PointerTypeObject_Check(arg)) + return 1; + dict = PyType_stgdict(arg); + if (dict) { + if (PyString_Check(dict->proto) + && (strchr("sPzUZXO", PyString_AS_STRING(dict->proto)[0]))) { + /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ + return 1; + } + } + PyErr_Format(PyExc_TypeError, + "cast() argument 2 must be a pointer type, not %s", + PyType_Check(arg) + ? ((PyTypeObject *)arg)->tp_name + : arg->ob_type->tp_name); + return 0; +} + +static PyObject * +cast(void *ptr, PyObject *ctype) +{ + CDataObject *result; + if (0 == cast_check_pointertype(ctype)) + return NULL; + result = (CDataObject *)PyObject_CallFunctionObjArgs(ctype, NULL); + if (result == NULL) + return NULL; + /* Should we assert that result is a pointer type? */ + memcpy(result->b_ptr, &ptr, sizeof(void *)); + return (PyObject *)result; +} #ifdef CTYPES_UNICODE static PyObject * @@ -4486,6 +4554,7 @@ PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); PyModule_AddObject(m, "_memset_addr", PyLong_FromVoidPtr(memset)); PyModule_AddObject(m, "_string_at_addr", PyLong_FromVoidPtr(string_at)); + PyModule_AddObject(m, "_cast_addr", PyLong_FromVoidPtr(cast)); #ifdef CTYPES_UNICODE PyModule_AddObject(m, "_wstring_at_addr", PyLong_FromVoidPtr(wstring_at)); #endif Modified: python/trunk/Modules/_ctypes/callproc.c ============================================================================== --- python/trunk/Modules/_ctypes/callproc.c (original) +++ python/trunk/Modules/_ctypes/callproc.c Fri Mar 17 16:52:58 2006 @@ -1423,71 +1423,7 @@ } #endif -static char cast_doc[] = -"cast(cobject, ctype) -> ctype-instance\n\ -\n\ -Create an instance of ctype, and copy the internal memory buffer\n\ -of cobject to the new instance. Should be used to cast one type\n\ -of pointer to another type of pointer.\n\ -Doesn't work correctly with ctypes integers.\n"; - -static int cast_check_pointertype(PyObject *arg, PyObject **pobj) -{ - StgDictObject *dict; - - if (PointerTypeObject_Check(arg)) { - *pobj = arg; - return 1; - } - dict = PyType_stgdict(arg); - if (dict) { - if (PyString_Check(dict->proto) - && (strchr("sPzUZXO", PyString_AS_STRING(dict->proto)[0]))) { - /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ - *pobj = arg; - return 1; - } - } - if (PyType_Check(arg)) { - PyErr_Format(PyExc_TypeError, - "cast() argument 2 must be a pointer type, not %s", - ((PyTypeObject *)arg)->tp_name); - } else { - PyErr_Format(PyExc_TypeError, - "cast() argument 2 must be a pointer type, not a %s", - arg->ob_type->tp_name); - } - return 0; -} - -static PyObject *cast(PyObject *self, PyObject *args) -{ - PyObject *obj, *ctype; - struct argument a; - CDataObject *result; - - /* We could and should allow array types for the second argument - also, but we cannot use the simple memcpy below for them. */ - if (!PyArg_ParseTuple(args, "OO&:cast", &obj, &cast_check_pointertype, &ctype)) - return NULL; - if (-1 == ConvParam(obj, 1, &a)) - return NULL; - result = (CDataObject *)PyObject_CallFunctionObjArgs(ctype, NULL); - if (result == NULL) { - Py_XDECREF(a.keep); - return NULL; - } - // result->b_size - // a.ffi_type->size - memcpy(result->b_ptr, &a.value, - min(result->b_size, (int)a.ffi_type->size)); - Py_XDECREF(a.keep); - return (PyObject *)result; -} - - PyMethodDef module_methods[] = { - {"cast", cast, METH_VARARGS, cast_doc}, #ifdef CTYPES_UNICODE {"set_conversion_mode", set_conversion_mode, METH_VARARGS, set_conversion_mode_doc}, #endif From python-checkins at python.org Fri Mar 17 16:56:15 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 16:56:15 +0100 (CET) Subject: [Python-checkins] r43116 - python/trunk/Doc/lib/libgc.tex Message-ID: <20060317155615.AF6141E4006@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 16:56:13 2006 New Revision: 43116 Modified: python/trunk/Doc/lib/libgc.tex Log: Markup fix Modified: python/trunk/Doc/lib/libgc.tex ============================================================================== --- python/trunk/Doc/lib/libgc.tex (original) +++ python/trunk/Doc/lib/libgc.tex Fri Mar 17 16:56:13 2006 @@ -35,7 +35,8 @@ \begin{funcdesc}{collect}{\optional{generation}} With no arguments, run a full collection. The optional argument \var{generation} may be an integer specifying which generation to collect -(from 0 to 2). A ValueError is raised if the generation number is invalid. +(from 0 to 2). A \exception{ValueError} is raised if the generation number +is invalid. The number of unreachable objects found is returned. \versionchanged[The optional \var{generation} argument was added]{2.5} From python-checkins at python.org Fri Mar 17 16:56:41 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 16:56:41 +0100 (CET) Subject: [Python-checkins] r43117 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060317155641.8F9F11E4006@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 16:56:41 2006 New Revision: 43117 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Add two items Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 17 16:56:41 2006 @@ -489,6 +489,24 @@ %====================================================================== +\subsection{Interactive Interpreter Changes} + +In the interactive interpreter, \code{quit} and \code{exit} +have long been strings so that new users get a somewhat helpful message +when they try to quit: + +\begin{verbatim} +>>> quit +'Use Ctrl-D (i.e. EOF) to exit.' +\end{verbatim} + +In Python 2.5, \code{quit} and \code{exit} are now objects that still +produce string representations of themselves, but are also callable. +Newbies who try \code{quit()} or \code{exit()} will now exit the +interpreter as they expect. (Implemented by Georg Brandl.) + + +%====================================================================== \subsection{Optimizations} \begin{itemize} @@ -530,6 +548,14 @@ % datetime.datetime() now has a strptime class method which can be used to % create datetime object using a string and format. +\item In the \module{gc} module, the new \function{get_count()} function +returns a 3-tuple containing the current collection counts for the +three GC generations. This is accounting information for the garbage +collector; when these counts reach a specified threshold, a garbage +collection sweep will be made. The existing \function{gc.collect()} +function now takes an optional \var{generation} argument of 0, 1, or 2 +to specify which generation to collect. + \item A new \module{hashlib} module has been added to replace the \module{md5} and \module{sha} modules. \module{hashlib} adds support for additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). From python-checkins at python.org Fri Mar 17 17:26:40 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 17:26:40 +0100 (CET) Subject: [Python-checkins] r43118 - python/trunk/Doc/lib/compiler.tex python/trunk/Doc/lib/libarray.tex python/trunk/Doc/lib/libcgi.tex python/trunk/Doc/lib/libcodecs.tex python/trunk/Doc/lib/libcookielib.tex python/trunk/Doc/lib/libitertools.tex python/trunk/Doc/lib/libnntplib.tex python/trunk/Doc/lib/liboptparse.tex python/trunk/Doc/lib/libossaudiodev.tex python/trunk/Doc/lib/libpycompile.tex python/trunk/Doc/lib/libre.tex python/trunk/Doc/lib/libsets.tex python/trunk/Doc/lib/libshutil.tex python/trunk/Doc/lib/libstdtypes.tex python/trunk/Doc/lib/libsubprocess.tex python/trunk/Doc/lib/liburllib2.tex python/trunk/Doc/lib/libzipimport.tex python/trunk/Doc/lib/xmldomminidom.tex Message-ID: <20060317162640.E93CC1E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 17:26:31 2006 New Revision: 43118 Modified: python/trunk/Doc/lib/compiler.tex python/trunk/Doc/lib/libarray.tex python/trunk/Doc/lib/libcgi.tex python/trunk/Doc/lib/libcodecs.tex python/trunk/Doc/lib/libcookielib.tex python/trunk/Doc/lib/libitertools.tex python/trunk/Doc/lib/libnntplib.tex python/trunk/Doc/lib/liboptparse.tex python/trunk/Doc/lib/libossaudiodev.tex python/trunk/Doc/lib/libpycompile.tex python/trunk/Doc/lib/libre.tex python/trunk/Doc/lib/libsets.tex python/trunk/Doc/lib/libshutil.tex python/trunk/Doc/lib/libstdtypes.tex python/trunk/Doc/lib/libsubprocess.tex python/trunk/Doc/lib/liburllib2.tex python/trunk/Doc/lib/libzipimport.tex python/trunk/Doc/lib/xmldomminidom.tex Log: More \exception fixes. Modified: python/trunk/Doc/lib/compiler.tex ============================================================================== --- python/trunk/Doc/lib/compiler.tex (original) +++ python/trunk/Doc/lib/compiler.tex Fri Mar 17 17:26:31 2006 @@ -40,9 +40,9 @@ \begin{funcdesc}{parse}{buf} Returns an abstract syntax tree for the Python source code in \var{buf}. -The function raises SyntaxError if there is an error in the source -code. The return value is a \class{compiler.ast.Module} instance that -contains the tree. +The function raises \exception{SyntaxError} if there is an error in the +source code. The return value is a \class{compiler.ast.Module} instance +that contains the tree. \end{funcdesc} \begin{funcdesc}{parseFile}{path} Modified: python/trunk/Doc/lib/libarray.tex ============================================================================== --- python/trunk/Doc/lib/libarray.tex (original) +++ python/trunk/Doc/lib/libarray.tex Fri Mar 17 17:26:31 2006 @@ -139,8 +139,8 @@ \end{methoddesc} \begin{methoddesc}[array]{fromunicode}{s} -Extends this array with data from the given unicode string. -The array must be a type 'u' array; otherwise a ValueError +Extends this array with data from the given unicode string. The array +must be a type \code{'u'} array; otherwise a \exception{ValueError} is raised. Use \samp{array.fromstring(ustr.decode(enc))} to append Unicode data to an array of some other type. \end{methoddesc} @@ -197,8 +197,8 @@ \begin{methoddesc}[array]{tounicode}{} Convert the array to a unicode string. The array must be -a type 'u' array; otherwise a ValueError is raised. Use -array.tostring().decode(enc) to obtain a unicode string +a type \code{'u'} array; otherwise a \exception{ValueError} is raised. +Use \samp{array.tostring().decode(enc)} to obtain a unicode string from an array of some other type. \end{methoddesc} Modified: python/trunk/Doc/lib/libcgi.tex ============================================================================== --- python/trunk/Doc/lib/libcgi.tex (original) +++ python/trunk/Doc/lib/libcgi.tex Fri Mar 17 17:26:31 2006 @@ -323,7 +323,7 @@ The optional argument \var{strict_parsing} is a flag indicating what to do with parsing errors. If false (the default), errors -are silently ignored. If true, errors raise a ValueError +are silently ignored. If true, errors raise a \exception{ValueError} exception. Use the \function{\refmodule{urllib}.urlencode()} function to convert @@ -347,7 +347,7 @@ The optional argument \var{strict_parsing} is a flag indicating what to do with parsing errors. If false (the default), errors -are silently ignored. If true, errors raise a ValueError +are silently ignored. If true, errors raise a \exception{ValueError} exception. Use the \function{\refmodule{urllib}.urlencode()} function to convert Modified: python/trunk/Doc/lib/libcodecs.tex ============================================================================== --- python/trunk/Doc/lib/libcodecs.tex (original) +++ python/trunk/Doc/lib/libcodecs.tex Fri Mar 17 17:26:31 2006 @@ -152,7 +152,7 @@ continue. The encoder will encode the replacement and continue encoding the original input at the specified position. Negative position values will be treated as being relative to the end of the input string. If the -resulting position is out of bound an IndexError will be raised. +resulting position is out of bound an \exception{IndexError} will be raised. Decoding and translating works similar, except \exception{UnicodeDecodeError} or \exception{UnicodeTranslateError} will be passed to the handler and @@ -696,10 +696,10 @@ The simplest method is to map the codepoints 0-255 to the bytes \code{0x0}-\code{0xff}. This means that a unicode object that contains codepoints above \code{U+00FF} can't be encoded with this method (which -is called \code{'latin-1'} or \code{'iso-8859-1'}). unicode.encode() will -raise a UnicodeEncodeError that looks like this: \samp{UnicodeEncodeError: -'latin-1' codec can't encode character u'\e u1234' in position 3: ordinal -not in range(256)}. +is called \code{'latin-1'} or \code{'iso-8859-1'}). +\function{unicode.encode()} will raise a \exception{UnicodeEncodeError} +that looks like this: \samp{UnicodeEncodeError: 'latin-1' codec can't +encode character u'\e u1234' in position 3: ordinal not in range(256)}. There's another group of encodings (the so called charmap encodings) that choose a different subset of all unicode code points and how Modified: python/trunk/Doc/lib/libcookielib.tex ============================================================================== --- python/trunk/Doc/lib/libcookielib.tex (original) +++ python/trunk/Doc/lib/libcookielib.tex Fri Mar 17 17:26:31 2006 @@ -249,7 +249,7 @@ ignore_discard=\constant{False}, ignore_expires=\constant{False}} Save cookies to a file. -This base class raises \class{NotImplementedError}. Subclasses may +This base class raises \exception{NotImplementedError}. Subclasses may leave this method unimplemented. \var{filename} is the name of file in which to save cookies. If Modified: python/trunk/Doc/lib/libitertools.tex ============================================================================== --- python/trunk/Doc/lib/libitertools.tex (original) +++ python/trunk/Doc/lib/libitertools.tex Fri Mar 17 17:26:31 2006 @@ -281,7 +281,8 @@ \end{verbatim} \versionchanged[When no iterables are specified, returns a zero length - iterator instead of raising a TypeError exception]{2.4} + iterator instead of raising a \exception{TypeError} + exception]{2.4} \end{funcdesc} \begin{funcdesc}{repeat}{object\optional{, times}} Modified: python/trunk/Doc/lib/libnntplib.tex ============================================================================== --- python/trunk/Doc/lib/libnntplib.tex (original) +++ python/trunk/Doc/lib/libnntplib.tex Fri Mar 17 17:26:31 2006 @@ -68,48 +68,48 @@ sent before authentication is performed. Reader mode is sometimes necessary if you are connecting to an NNTP server on the local machine and intend to call reader-specific commands, such as \samp{group}. If -you get unexpected \code{NNTPPermanentError}s, you might need to set +you get unexpected \exception{NNTPPermanentError}s, you might need to set \var{readermode}. \var{readermode} defaults to \code{None}. \var{usenetrc} defaults to \code{True}. \versionchanged[\var{usenetrc} argument added]{2.4} \end{classdesc} -\begin{classdesc}{NNTPError}{} -Derived from the standard exception \code{Exception}, this is the base -class for all exceptions raised by the \code{nntplib} module. -\end{classdesc} +\begin{excdesc}{NNTPError} +Derived from the standard exception \exception{Exception}, this is the +base class for all exceptions raised by the \module{nntplib} module. +\end{excdesc} -\begin{classdesc}{NNTPReplyError}{} +\begin{excdesc}{NNTPReplyError} Exception raised when an unexpected reply is received from the server. For backwards compatibility, the exception \code{error_reply} is equivalent to this class. -\end{classdesc} +\end{excdesc} -\begin{classdesc}{NNTPTemporaryError}{} +\begin{excdesc}{NNTPTemporaryError} Exception raised when an error code in the range 400--499 is received. For backwards compatibility, the exception \code{error_temp} is equivalent to this class. -\end{classdesc} +\end{excdesc} -\begin{classdesc}{NNTPPermanentError}{} +\begin{excdesc}{NNTPPermanentError} Exception raised when an error code in the range 500--599 is received. For backwards compatibility, the exception \code{error_perm} is equivalent to this class. -\end{classdesc} +\end{excdesc} -\begin{classdesc}{NNTPProtocolError}{} +\begin{excdesc}{NNTPProtocolError} Exception raised when a reply is received from the server that does not begin with a digit in the range 1--5. For backwards compatibility, the exception \code{error_proto} is equivalent to this class. -\end{classdesc} +\end{excdesc} -\begin{classdesc}{NNTPDataError}{} +\begin{excdesc}{NNTPDataError} Exception raised when there is some error in the response data. For backwards compatibility, the exception \code{error_data} is equivalent to this class. -\end{classdesc} +\end{excdesc} \subsection{NNTP Objects \label{nntp-objects}} Modified: python/trunk/Doc/lib/liboptparse.tex ============================================================================== --- python/trunk/Doc/lib/liboptparse.tex (original) +++ python/trunk/Doc/lib/liboptparse.tex Fri Mar 17 17:26:31 2006 @@ -100,8 +100,8 @@ single letter, e.g. \code{"-x"} or \code{"-F"}. Also, traditional \UNIX{} syntax allows multiple options to be merged into a single argument, e.g. \code{"-x -F"} is equivalent to \code{"-xF"}. The GNU project -introduced \code{"-{}-"} followed by a series of hyphen-separated words, -e.g. \code{"-{}-file"} or \code{"-{}-dry-run"}. These are the only two option +introduced \code{"{--}"} followed by a series of hyphen-separated words, +e.g. \code{"{--}file"} or \code{"{--}dry-run"}. These are the only two option syntaxes provided by \module{optparse}. Some other option syntaxes that the world has seen include: @@ -170,7 +170,7 @@ prog -v --report /tmp/report.txt foo bar \end{verbatim} -\code{"-v"} and \code{"-{}-report"} are both options. Assuming that +\code{"-v"} and \code{"{--}report"} are both options. Assuming that \longprogramopt{report} takes one argument, \code{"/tmp/report.txt"} is an option argument. \code{"foo"} and \code{"bar"} are positional arguments. @@ -587,7 +587,7 @@ erroneous calls to \code{parse.add{\_}option()}, e.g. invalid option strings, unknown option attributes, missing option attributes, etc. These are dealt with in the usual way: raise an exception (either -\code{optparse.OptionError} or \code{TypeError}) and let the program crash. +\exception{optparse.OptionError} or \exception{TypeError}) and let the program crash. Handling user errors is much more important, since they are guaranteed to happen no matter how stable your code is. \module{optparse} can automatically @@ -1019,9 +1019,9 @@ Integer arguments are passed to \code{int()} to convert them to Python integers. If \code{int()} fails, so will \module{optparse}, although with a more -useful error message. (Internally, \module{optparse} raises OptionValueError; -OptionParser catches this exception higher up and terminates your -program with a useful error message.) +useful error message. (Internally, \module{optparse} raises +\exception{OptionValueError}; OptionParser catches this exception higher +up and terminates your program with a useful error message.) Likewise, \code{float} arguments are passed to \code{float()} for conversion, \code{long} arguments to \code{long()}, and \code{complex} arguments to @@ -1032,7 +1032,7 @@ option attribute (a sequence of strings) defines the set of allowed option arguments. \code{optparse.option.check{\_}choice()} compares user-supplied option arguments against this master list and raises -OptionValueError if an invalid string is given. +\exception{OptionValueError} if an invalid string is given. \subsubsection{Querying and manipulating your option parser\label{optparse-querying-manipulating-option-parser}} @@ -1052,7 +1052,7 @@ option strings, all of those option strings become invalid. If \code{opt{\_}str} does not occur in any option belonging to this -OptionParser, raises ValueError. +OptionParser, raises \exception{ValueError}. \end{description} @@ -1087,7 +1087,7 @@ \begin{description} \item[\code{error} (default)] assume option conflicts are a programming error and raise -OptionConflictError +\exception{OptionConflictError} \item[\code{resolve}] resolve option conflicts intelligently (see below) \end{description} @@ -1260,7 +1260,7 @@ \subsubsection{Raising errors in a callback\label{optparse-raising-errors-in-callback}} -The callback function should raise OptionValueError if there are any +The callback function should raise \exception{OptionValueError} if there are any problems with the option or its argument(s). \module{optparse} catches this and terminates the program, printing the error message you supply to stderr. Your message should be clear, concise, accurate, and mention Modified: python/trunk/Doc/lib/libossaudiodev.tex ============================================================================== --- python/trunk/Doc/lib/libossaudiodev.tex (original) +++ python/trunk/Doc/lib/libossaudiodev.tex Fri Mar 17 17:26:31 2006 @@ -311,7 +311,7 @@ \begin{methoddesc}[mixer device]{close}{} This method closes the open mixer device file. Any further attempts to -use the mixer after this file is closed will raise an IOError. +use the mixer after this file is closed will raise an \exception{IOError}. \end{methoddesc} \begin{methoddesc}[mixer device]{fileno}{} Modified: python/trunk/Doc/lib/libpycompile.tex ============================================================================== --- python/trunk/Doc/lib/libpycompile.tex (original) +++ python/trunk/Doc/lib/libpycompile.tex Fri Mar 17 17:26:31 2006 @@ -30,9 +30,10 @@ \code{+} \code{'c'} (\code{'o'} if optimization is enabled in the current interpreter). If \var{dfile} is specified, it is used as the name of the source file in error messages instead of \var{file}. - If \var{doraise} = True, a PyCompileError is raised when an error is - encountered while compiling \var{file}. If \var{doraise} = False (the default), - an error string is written to sys.stderr, but no exception is raised. + If \var{doraise} is true, a \exception{PyCompileError} is raised when + an error is encountered while compiling \var{file}. If \var{doraise} + is false (the default), an error string is written to \code{sys.stderr}, + but no exception is raised. \end{funcdesc} \begin{funcdesc}{main}{\optional{args}} Modified: python/trunk/Doc/lib/libre.tex ============================================================================== --- python/trunk/Doc/lib/libre.tex (original) +++ python/trunk/Doc/lib/libre.tex Fri Mar 17 17:26:31 2006 @@ -931,7 +931,7 @@ \leftline{\strong{Avoiding recursion}} If you create regular expressions that require the engine to perform a -lot of recursion, you may encounter a RuntimeError exception with +lot of recursion, you may encounter a \exception{RuntimeError} exception with the message \code{maximum recursion limit} exceeded. For example, \begin{verbatim} Modified: python/trunk/Doc/lib/libsets.tex ============================================================================== --- python/trunk/Doc/lib/libsets.tex (original) +++ python/trunk/Doc/lib/libsets.tex Fri Mar 17 17:26:31 2006 @@ -151,12 +151,13 @@ \lineiii{\var{s}.add(\var{x})}{} {add element \var{x} to set \var{s}} \lineiii{\var{s}.remove(\var{x})}{} - {remove \var{x} from set \var{s}; raises KeyError if not present} + {remove \var{x} from set \var{s}; raises \exception{KeyError} + if not present} \lineiii{\var{s}.discard(\var{x})}{} {removes \var{x} from set \var{s} if present} \lineiii{\var{s}.pop()}{} {remove and return an arbitrary element from \var{s}; raises - KeyError if empty} + \exception{KeyError} if empty} \lineiii{\var{s}.clear()}{} {remove all elements from set \var{s}} \end{tableiii} Modified: python/trunk/Doc/lib/libshutil.tex ============================================================================== --- python/trunk/Doc/lib/libshutil.tex (original) +++ python/trunk/Doc/lib/libshutil.tex Fri Mar 17 17:26:31 2006 @@ -73,18 +73,18 @@ If \var{symlinks} is true, symbolic links in the source tree are represented as symbolic links in the new tree; if false or omitted, the contents of the linked files are copied to - the new tree. If exception(s) occur, an Error is raised + the new tree. If exception(s) occur, an \exception{Error} is raised with a list of reasons. The source code for this should be considered an example rather than a tool. - \versionchanged[Error is raised if any exceptions occur during copying, - rather than printing a message]{2.3} + \versionchanged[\exception{Error} is raised if any exceptions occur during + copying, rather than printing a message]{2.3} \versionchanged[Create intermediate directories needed to create \var{dst}, - rather than raising an error. Copy permissions and times of directories using - \function{copystat()}]{2.5} + rather than raising an error. Copy permissions and times of + directories using \function{copystat()}]{2.5} \end{funcdesc} Modified: python/trunk/Doc/lib/libstdtypes.tex ============================================================================== --- python/trunk/Doc/lib/libstdtypes.tex (original) +++ python/trunk/Doc/lib/libstdtypes.tex Fri Mar 17 17:26:31 2006 @@ -1278,7 +1278,8 @@ \lineiii{\var{s}.add(\var{x})}{} {add element \var{x} to set \var{s}} \lineiii{\var{s}.remove(\var{x})}{} - {remove \var{x} from set \var{s}; raises KeyError if not present} + {remove \var{x} from set \var{s}; raises \exception{KeyError} + if not present} \lineiii{\var{s}.discard(\var{x})}{} {removes \var{x} from set \var{s} if present} \lineiii{\var{s}.pop()}{} @@ -1789,14 +1790,14 @@ attribute will be \code{None} and if called, an explicit \code{self} object must be passed as the first argument. In this case, \code{self} must be an instance of the unbound method's class (or a -subclass of that class), otherwise a \code{TypeError} is raised. +subclass of that class), otherwise a \exception{TypeError} is raised. Like function objects, methods objects support getting arbitrary attributes. However, since method attributes are actually stored on the underlying function object (\code{meth.im_func}), setting method attributes on either bound or unbound methods is disallowed. Attempting to set a method attribute results in a -\code{TypeError} being raised. In order to set a method attribute, +\exception{TypeError} being raised. In order to set a method attribute, you need to explicitly set it on the underlying function object: \begin{verbatim} Modified: python/trunk/Doc/lib/libsubprocess.tex ============================================================================== --- python/trunk/Doc/lib/libsubprocess.tex (original) +++ python/trunk/Doc/lib/libsubprocess.tex Fri Mar 17 17:26:31 2006 @@ -135,8 +135,8 @@ \begin{funcdesc}{check_call}{*popenargs, **kwargs} Run command with arguments. Wait for command to complete. If the exit -code was zero then return, otherwise raise CalledProcessError. The -CalledProcessError object will have the return code in the +code was zero then return, otherwise raise \exception{CalledProcessError.} +The \exception{CalledProcessError} object will have the return code in the \member{errno} attribute. The arguments are the same as for the Popen constructor. Example: Modified: python/trunk/Doc/lib/liburllib2.tex ============================================================================== --- python/trunk/Doc/lib/liburllib2.tex (original) +++ python/trunk/Doc/lib/liburllib2.tex Fri Mar 17 17:26:31 2006 @@ -384,7 +384,7 @@ \method{\var{protocol}_open()} are called to handle the request. This stage ends when a handler either returns a non-\constant{None} value (ie. a response), or raises an exception - (usually URLError). Exceptions are allowed to propagate. + (usually \exception{URLError}). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named \method{default_open}. If all such methods return Modified: python/trunk/Doc/lib/libzipimport.tex ============================================================================== --- python/trunk/Doc/lib/libzipimport.tex (original) +++ python/trunk/Doc/lib/libzipimport.tex Fri Mar 17 17:26:31 2006 @@ -69,8 +69,8 @@ \begin{classdesc}{zipimporter}{archivepath} Create a new zipimporter instance. \var{archivepath} must be a path to - a zipfile. \class{ZipImportError} is raised if \var{archivepath} doesn't - point to a valid ZIP archive. + a zipfile. \exception{ZipImportError} is raised if \var{archivepath} + doesn't point to a valid ZIP archive. \end{classdesc} \begin{methoddesc}{find_module}{fullname\optional{, path}} @@ -83,7 +83,7 @@ \begin{methoddesc}{get_code}{fullname} Return the code object for the specified module. Raise - \class{ZipImportError} if the module couldn't be found. + \exception{ZipImportError} if the module couldn't be found. \end{methoddesc} \begin{methoddesc}{get_data}{pathname} @@ -93,20 +93,20 @@ \begin{methoddesc}{get_source}{fullname} Return the source code for the specified module. Raise - \class{ZipImportError} if the module couldn't be found, return + \exception{ZipImportError} if the module couldn't be found, return \constant{None} if the archive does contain the module, but has no source for it. \end{methoddesc} \begin{methoddesc}{is_package}{fullname} Return True if the module specified by \var{fullname} is a package. - Raise \class{ZipImportError} if the module couldn't be found. + Raise \exception{ZipImportError} if the module couldn't be found. \end{methoddesc} \begin{methoddesc}{load_module}{fullname} Load the module specified by \var{fullname}. \var{fullname} must be the fully qualified (dotted) module name. It returns the imported - module, or raises \class{ZipImportError} if it wasn't found. + module, or raises \exception{ZipImportError} if it wasn't found. \end{methoddesc} \subsection{Examples} Modified: python/trunk/Doc/lib/xmldomminidom.tex ============================================================================== --- python/trunk/Doc/lib/xmldomminidom.tex (original) +++ python/trunk/Doc/lib/xmldomminidom.tex Fri Mar 17 17:26:31 2006 @@ -165,7 +165,7 @@ With an explicit \var{encoding} argument, the result is a byte string in the specified encoding. It is recommended that this argument is -always specified. To avoid UnicodeError exceptions in case of +always specified. To avoid \exception{UnicodeError} exceptions in case of unrepresentable text data, the encoding argument should be specified as "utf-8". From python-checkins at python.org Fri Mar 17 17:57:30 2006 From: python-checkins at python.org (phillip.eby) Date: Fri, 17 Mar 2006 17:57:30 +0100 (CET) Subject: [Python-checkins] r43119 - in sandbox/trunk/setuptools: setuptools.txt setuptools/command/easy_install.py setuptools/command/install_egg_info.py setuptools/command/install_lib.py Message-ID: <20060317165730.972741E4006@bag.python.org> Author: phillip.eby Date: Fri Mar 17 17:57:23 2006 New Revision: 43119 Modified: sandbox/trunk/setuptools/setuptools.txt sandbox/trunk/setuptools/setuptools/command/easy_install.py sandbox/trunk/setuptools/setuptools/command/install_egg_info.py sandbox/trunk/setuptools/setuptools/command/install_lib.py Log: Support namespace packages in conjunction with system packagers, by omitting the installation of any ``__init__.py`` files for namespace packages, and adding a special ``.pth`` file to create a working package in ``sys.modules``. Modified: sandbox/trunk/setuptools/setuptools.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.txt (original) +++ sandbox/trunk/setuptools/setuptools.txt Fri Mar 17 17:57:23 2006 @@ -1225,21 +1225,18 @@ This code ensures that the namespace package machinery is operating and that the current package is registered as a namespace package. -You can include other code and data in a namespace package's ``__init__.py``, -but it's generally not a great idea because the loading order of each -project's namespace packages is not guaranteed, and thus the actual contents -of the parent package at runtime may vary from one machine to another. While -it's true that you won't have such conflicts if only one project defines the -contents of a particular namespace package's ``__init__.py``, it's less error- -prone to just leave ``__init__.py`` empty except for the declaration line. - -(Note that this non-deterministic ordering also means that you must include -the declaration line in the ``__init__.py`` of *every* project that has -contents for the namespace package in question, in order to ensure that the -namespace will be declared regardless of which project's copy of -``__init__.py`` is loaded first. If the first loaded ``__init__.py`` doesn't -declare it, it will never *be* declared, because no other copies will ever be -loaded!) +You must NOT include any other code and data in a namespace package's +``__init__.py``. Even though it may appear to work during development, or when +projects are installed as ``.egg`` files, it will not work when the projects +are installed using "system" packaging tools -- in such cases the +``__init__.py`` files will not be installed, let alone executed. + +You must include the ``declare_namespace()`` line in the ``__init__.py`` of +*every* project that has contents for the namespace package in question, in +order to ensure that the namespace will be declared regardless of which +project's copy of ``__init__.py`` is loaded first. If the first loaded +``__init__.py`` doesn't declare it, it will never *be* declared, because no +other copies will ever be loaded!) TRANSITIONAL NOTE @@ -2352,6 +2349,11 @@ ---------------------------- 0.6a11 + * Support namespace packages in conjunction with system packagers, by omitting + the installation of any ``__init__.py`` files for namespace packages, and + adding a special ``.pth`` file to create a working package in + ``sys.modules``. + * Made ``--single-version-externally-managed`` automatic when ``--root`` is used, so that most system packagers won't require special support for setuptools. Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Fri Mar 17 17:57:23 2006 @@ -1288,6 +1288,8 @@ break if len(parts)<>2 or not name.endswith('.pth'): continue + if name.endswith('-nspkg.pth'): + continue if parts[0] in ('PURELIB','PLATLIB'): pth = z.read(name).strip() prefixes[0] = ('PURELIB/%s/' % pth), '' @@ -1308,8 +1310,6 @@ ) - - class PthDistributions(Environment): """A .pth file with Distribution paths in it""" Modified: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Fri Mar 17 17:57:23 2006 @@ -37,7 +37,7 @@ self.execute(self.copytree, (), "Copying %s to %s" % (self.source, self.target) ) - + self.install_namespaces() def get_outputs(self): return self.outputs @@ -58,25 +58,25 @@ unpack_archive(self.source, self.target, skimmer) - - - - - - - - - - - - - - - - - - - - - + def install_namespaces(self): + nsp = (self.distribution.namespace_packages or [])[:] + if not nsp: return + nsp.sort() # set up shorter names first + filename,ext = os.path.splitext(self.target) + filename += '-nspkg.pth'; self.outputs.append(filename) + log.info("Installing %s",filename) + if not self.dry_run: + f = open(filename,'wb') + for pkg in nsp: + pth = tuple(pkg.split('.')) + f.write( + "import sys,new; " + "m = sys.modules.setdefault(%(pkg)r,new.module(%(pkg)r)); " + "p = os.path.join(sys._getframe(1).f_locals['sitedir'], " + "*%(pth)r); " + "mp = m.__path__ = getattr(m,'__path__',[]); " + "(p not in mp) and mp.append(p)\n" + % locals() + ) + f.close() Modified: sandbox/trunk/setuptools/setuptools/command/install_lib.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_lib.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_lib.py Fri Mar 17 17:57:23 2006 @@ -1,4 +1,5 @@ from distutils.command.install_lib import install_lib as _install_lib +import os class install_lib(_install_lib): """Don't add compiled flags to filenames of non-Python files""" @@ -15,11 +16,67 @@ return bytecode_files - def run(self): self.build() outfiles = self.install() if outfiles is not None: # always compile, in case we have any extension stubs to deal with - self.byte_compile(outfiles) + self.byte_compile(outfiles) + + def get_exclusions(self): + exclude = {} + nsp = self.distribution.namespace_packages + + if (nsp and self.get_finalized_command('install') + .single_version_externally_managed + ): + for pkg in nsp: + parts = pkg.split('.') + while parts: + pkgdir = os.path.join(self.install_dir, *parts) + for f in '__init__.py', '__init__.pyc', '__init__.pyo': + exclude[os.path.join(pkgdir,f)] = 1 + parts.pop() + return exclude + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return _install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)",dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = _install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs + + + + + From python-checkins at python.org Fri Mar 17 18:16:24 2006 From: python-checkins at python.org (phillip.eby) Date: Fri, 17 Mar 2006 18:16:24 +0100 (CET) Subject: [Python-checkins] r43120 - sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Message-ID: <20060317171624.2AEED1E4006@bag.python.org> Author: phillip.eby Date: Fri Mar 17 18:16:19 2006 New Revision: 43120 Modified: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Log: Tweak the nspkg.pth hack to avoid creating a module if there *is* an __init__.py installed. It may be that this should check for .pyc/.pyo, but system packagers don't normally remove them. Modified: sandbox/trunk/setuptools/setuptools/command/install_egg_info.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/install_egg_info.py (original) +++ sandbox/trunk/setuptools/setuptools/command/install_egg_info.py Fri Mar 17 18:16:19 2006 @@ -43,8 +43,7 @@ return self.outputs def copytree(self): - # Copy the .egg-info tree to site-packages - + # Copy the .egg-info tree to site-packages def skimmer(src,dst): # filter out source-control directories; note that 'src' is always # a '/'-separated path, regardless of platform. 'dst' is a @@ -55,7 +54,6 @@ self.outputs.append(dst) log.debug("Copying %s to %s", src, dst) return dst - unpack_archive(self.source, self.target, skimmer) def install_namespaces(self): @@ -70,11 +68,13 @@ for pkg in nsp: pth = tuple(pkg.split('.')) f.write( - "import sys,new; " - "m = sys.modules.setdefault(%(pkg)r,new.module(%(pkg)r)); " + "import sys,new,os; " "p = os.path.join(sys._getframe(1).f_locals['sitedir'], " - "*%(pth)r); " - "mp = m.__path__ = getattr(m,'__path__',[]); " + "*%(pth)r); " + "ie = os.path.exists(os.path.join(p,'__init__.py')); " + "m = not ie and " + "sys.modules.setdefault(%(pkg)r,new.module(%(pkg)r)); " + "mp = (m or []) and m.__dict__.setdefault('__path__',[]); " "(p not in mp) and mp.append(p)\n" % locals() ) From jimjjewett at gmail.com Fri Mar 17 18:34:33 2006 From: jimjjewett at gmail.com (Jim Jewett) Date: Fri, 17 Mar 2006 12:34:33 -0500 Subject: [Python-checkins] r43092 - in python/trunk: Lib/test/leakers/test_ctypes.py Misc/build.sh In-Reply-To: <20060317044539.A46561E4006@bag.python.org> References: <20060317044539.A46561E4006@bag.python.org> Message-ID: Should some of the leaky excludes be removed from this list? Looking at recent leak results, there were no leaks for capi cfgparser charmapcodec filecmp threadedimport threading I assume that the threading tests really are sporadic, but it would be good to know if changes to capi add a new leak. -jJ On 3/16/06, neal.norwitz wrote: > Author: neal.norwitz > Date: Fri Mar 17 05:45:38 2006 > New Revision: 43092 > > Added: > python/trunk/Lib/test/leakers/test_ctypes.py (contents, props changed) > Modified: > python/trunk/Misc/build.sh > Log: > Ignore ctypes leaks, but add a test case so we do not forget. > > Added: python/trunk/Lib/test/leakers/test_ctypes.py > ============================================================================== > --- (empty file) > +++ python/trunk/Lib/test/leakers/test_ctypes.py Fri Mar 17 05:45:38 2006 > @@ -0,0 +1,11 @@ > + > +# Taken from Lib/ctypes/test/test_keeprefs.py > +# When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS. > + > +from ctypes import Structure, c_int > + > +def leak(): > + class POINT(Structure): > + _fields_ = [("x", c_int)] > + class RECT(Structure): > + _fields_ = [("ul", POINT)] > > Modified: python/trunk/Misc/build.sh > ============================================================================== > --- python/trunk/Misc/build.sh (original) > +++ python/trunk/Misc/build.sh Fri Mar 17 05:45:38 2006 > @@ -59,7 +59,7 @@ > # test_generators really leaks. Since test_generators probably won't > # be fixed real soon, disable warning about it for now. > # The entire leak report will be mailed if any test not in this list leaks. > -LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" > +LEAKY_TESTS="test_(capi|cfgparser|charmapcodec|cmd_line|compiler|ctypes|filecmp|generators|quopri|socket|threaded_import|threadedtempfile|threading|threading_local|urllib2)" > > # Change this flag to "yes" for old releases to just update/build the docs. > BUILD_DISABLED="no" > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From python-checkins at python.org Fri Mar 17 18:59:16 2006 From: python-checkins at python.org (nick.coghlan) Date: Fri, 17 Mar 2006 18:59:16 +0100 (CET) Subject: [Python-checkins] r43121 - python/trunk/Python/ast.c Message-ID: <20060317175916.F201C1E4006@bag.python.org> Author: nick.coghlan Date: Fri Mar 17 18:59:10 2006 New Revision: 43121 Modified: python/trunk/Python/ast.c Log: Fix bug 1441408 where a double colon didn't trigger extended slice semantics (applies patch 1452332) Modified: python/trunk/Python/ast.c ============================================================================== --- python/trunk/Python/ast.c (original) +++ python/trunk/Python/ast.c Fri Mar 17 18:59:10 2006 @@ -1317,16 +1317,20 @@ ch = CHILD(n, NCH(n) - 1); if (TYPE(ch) == sliceop) { - if (NCH(ch) == 1) - /* XXX: If only 1 child, then should just be a colon. Should we - just skip assigning and just get to the return? */ - ch = CHILD(ch, 0); - else - ch = CHILD(ch, 1); - if (TYPE(ch) == test) { - step = ast_for_expr(c, ch); + if (NCH(ch) == 1) { + /* No expression, so step is None */ + ch = CHILD(ch, 0); + step = Name(new_identifier("None", c->c_arena), Load, + LINENO(ch), ch->n_col_offset, c->c_arena); if (!step) return NULL; + } else { + ch = CHILD(ch, 1); + if (TYPE(ch) == test) { + step = ast_for_expr(c, ch); + if (!step) + return NULL; + } } } From python-checkins at python.org Fri Mar 17 19:05:56 2006 From: python-checkins at python.org (phillip.eby) Date: Fri, 17 Mar 2006 19:05:56 +0100 (CET) Subject: [Python-checkins] r43122 - sandbox/trunk/setuptools/setuptools/package_index.py Message-ID: <20060317180556.37B371E400E@bag.python.org> Author: phillip.eby Date: Fri Mar 17 19:05:54 2006 New Revision: 43122 Modified: sandbox/trunk/setuptools/setuptools/package_index.py Log: Fix a problem with fetch() method backward compatibility. Modified: sandbox/trunk/setuptools/setuptools/package_index.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/package_index.py (original) +++ sandbox/trunk/setuptools/setuptools/package_index.py Fri Mar 17 19:05:54 2006 @@ -437,7 +437,7 @@ ``location`` of the downloaded distribution instead of a distribution object. """ - dist = self.fetch_dist(requirement,tmpdir,force_scan,source) + dist = self.fetch_distribution(requirement,tmpdir,force_scan,source) if dist is not None: return dist.location return None From martin at v.loewis.de Fri Mar 17 19:31:57 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Fri, 17 Mar 2006 19:31:57 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <441A8AC0.1070202@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <4415F61D.1070907@v.loewis.de> <441A8AC0.1070202@egenix.com> Message-ID: <441B009D.9000808@v.loewis.de> M.-A. Lemburg wrote: >>Well, "the problem" to be solved was not merely to provide two versions >>of the database, but also in a space-efficient way. All this effort >>in trying to squeeze the size of the data would be wasted when it >>then gets double just because two versions of the database must >>be provided. > > > Since the big tables of the database are static C data, > only the portions needed would ever get swapped into > memory, so this argument is rather weak. It's on-disk space that I worry about, not in-memory space. What is your worry? > Also, most users won't ever use the IDNA codec, so they'd > benefit from not having the extra complexity around. But they don't suffer from it, either. It just doesn't affect them. > With the old version available in a separate module, users who > still need the old version could continue to compile it for > themselves. That's true. However, this is no advantage: in the current implementation, they don't have to do anything - the old version is always available. > If you change makeunicodedata.py, then there's no way back > for these users. Sure. They could fetch the old version from some old Python distribution, rename the entry point, and compile the module under a different name. > Given that the stringprep RFC has started out by pointing > to a specific Unicode version, it is likely that these > strong binding to specific versions are going to happen > again in the future. "the future" meaning 2015, right? > This makes it nearly impossible to remove the old database > version support, since there's always be some users that > will have to rely on the availability of the old database > versions. Well, it is possible to remove support for old features - we are doing that all the time. > As you've pointed out, the size is really irrelevant. > > What about access speed ? No change there, either. Regards, Martin From martin at v.loewis.de Fri Mar 17 19:37:49 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Fri, 17 Mar 2006 19:37:49 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <441A8D4F.1030906@egenix.com> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> <4416894C.7090304@egenix.com> <44172E5B.7070309@v.loewis.de> <441A8D4F.1030906@egenix.com> Message-ID: <441B01FD.3070006@v.loewis.de> M.-A. Lemburg wrote: >>This I don't understand: what new features could these >>be? All features of the Unicode database range back to >>the earliest versions, including data which we currently >>don't expose. > > > I meant new features as in: new fields in the database or > new values for categories. I very much doubt that the Unicode consortium adds new fields in the database or new values for categories. If they ever do, we can worry about it then. If you want to worry now: Adding a new category is completely backwards compatible. The category value just won't appear in the old version of the database, which doesn't cause any problems whatsoever. For new fields in the database, we should assume that in older versions, the assigned characters have the same values of the properties as in the most recent version, unless the Unicode consortium specifies otherwise. > If we expose new features that are only available in 4.1 > and not in 3.2, then you have a compatibility problem > since the 3.2 version won't supply the needed data. So you use the 4.1 data instead, and apply them to all characters that were assigned in 3.2. However, there *are* no features that are available in 4.1 and not in 3.2. > The reason stringprep is tied to Unicode 3.2 stems from the > need to provide explicit tables for the string pre-processing. > > I don't see why the IETF should not update the RFC with a new > set of tables against the Unicode 4.1 (or a later) database > version. That shows that you haven't been following the IDNA discussions. Some of the IDNA authors are very concerned about changes to the normalization, and will strongly oppose proposals to move to a new version of the database. Regards, Martin From python-checkins at python.org Fri Mar 17 19:47:17 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 19:47:17 +0100 (CET) Subject: [Python-checkins] r43123 - python/trunk/Doc/lib/libundoc.tex Message-ID: <20060317184717.302891E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 19:47:14 2006 New Revision: 43123 Modified: python/trunk/Doc/lib/libundoc.tex Log: Remove the lib-old modules from Doc/lib/libundoc.tex. Now only Modules/timingmodule.c is left. Should that be removed, too? (dito for clmodule and svmodule) Modified: python/trunk/Doc/lib/libundoc.tex ============================================================================== --- python/trunk/Doc/lib/libundoc.tex (original) +++ python/trunk/Doc/lib/libundoc.tex Fri Mar 17 19:47:14 2006 @@ -42,15 +42,15 @@ \begin{description} \item[\module{ntpath}] --- Implementation of \module{os.path} on Win32, Win64, WinCE, and -OS/2 platforms. + OS/2 platforms. \item[\module{posixpath}] --- Implementation of \module{os.path} on \POSIX. \item[\module{bsddb185}] --- Backwards compatibility module for systems which still use the Berkeley -DB 1.85 module. It is normally only available on certain BSD Unix-based -systems. It should never be used directly. + DB 1.85 module. It is normally only available on certain BSD Unix-based + systems. It should never be used directly. \end{description} @@ -62,14 +62,14 @@ \item[\module{linuxaudiodev}] --- Play audio data on the Linux audio device. Replaced in Python 2.3 -by the \module{ossaudiodev} module. + by the \module{ossaudiodev} module. \item[\module{sunaudio}] --- Interpret Sun audio headers (may become obsolete or a tool/demo). \item[\module{toaiff}] --- Convert "arbitrary" sound files to AIFF files; should probably -become a tool or demo. Requires the external program \program{sox}. + become a tool or demo. Requires the external program \program{sox}. \end{description} @@ -78,12 +78,13 @@ These modules are not normally available for import; additional work must be done to make them available. -Those which are written in Python will be installed into the directory -\file{lib-old/} installed as part of the standard library. To use -these, the directory must be added to \code{sys.path}, possibly using -\envvar{PYTHONPATH}. +%%% lib-old is empty as of Python 2.5 +% Those which are written in Python will be installed into the directory +% \file{lib-old/} installed as part of the standard library. To use +% these, the directory must be added to \code{sys.path}, possibly using +% \envvar{PYTHONPATH}. -Obsolete extension modules written in C are not built by default. +These extension modules written in C are not built by default. Under \UNIX, these must be enabled by uncommenting the appropriate lines in \file{Modules/Setup} in the build tree and either rebuilding Python if the modules are statically linked, or building and @@ -92,110 +93,11 @@ % XXX need Windows instructions! \begin{description} -\item[\module{addpack}] ---- Alternate approach to packages. Use the built-in package support -instead. - -\item[\module{cmp}] ---- File comparison function. Use the newer \refmodule{filecmp} instead. - -\item[\module{cmpcache}] ---- Caching version of the obsolete \module{cmp} module. Use the -newer \refmodule{filecmp} instead. - -\item[\module{codehack}] ---- Extract function name or line number from a function -code object (these are now accessible as attributes: -\member{co.co_name}, \member{func.func_name}, -\member{co.co_firstlineno}). - -\item[\module{dircmp}] ---- Class to build directory diff tools on (may become a demo or tool). -\deprecated{2.0}{The \refmodule{filecmp} module replaces -\module{dircmp}.} - -\item[\module{dump}] ---- Print python code that reconstructs a variable. - -\item[\module{fmt}] ---- Text formatting abstractions (too slow). - -\item[\module{lockfile}] ---- Wrapper around FCNTL file locking (use -\function{fcntl.lockf()}/\function{flock()} instead; see \refmodule{fcntl}). - -\item[\module{newdir}] ---- New \function{dir()} function (the standard \function{dir()} is -now just as good). - -\item[\module{Para}] ---- Helper for \module{fmt}. - -\item[\module{poly}] ---- Polynomials. - -\item[\module{rand}] ---- Old interface to the random number generator. - -\item[\module{statcache}] ---- Caches the results of os.stat(). Using the cache can be fragile -and error-prone, just use \code{os.stat()} directly. - -\item[\module{tb}] ---- Print tracebacks, with a dump of local variables (use -\function{pdb.pm()} or \refmodule{traceback} instead). - \item[\module{timing}] ---- Measure time intervals to high resolution (use -\function{time.clock()} instead). (This is an extension module.) - -\item[\module{tzparse}] ---- Parse a timezone specification (unfinished; may disappear in the -future, and does not work when the \envvar{TZ} environment variable is -not set). - -\item[\module{util}] ---- Useful functions that don't fit elsewhere. - -\item[\module{whatsound}] ---- Recognize sound files; use \refmodule{sndhdr} instead. - -\item[\module{whrandom}] ---- Old random number generator. Use \module{random} instead. - -\item[\module{zmod}] ---- Compute properties of mathematical ``fields.'' +--- Measure time intervals to high resolution (use \function{time.clock()} + instead). \end{description} - -The following modules are obsolete, but are likely to re-surface as -tools or scripts: - -\begin{description} -\item[\module{find}] ---- Find files matching pattern in directory tree. - -\item[\module{grep}] ---- \program{grep} implementation in Python. - -\item[\module{packmail}] ---- Create a self-unpacking \UNIX{} shell archive. -\end{description} - - -The following modules were documented in previous versions of this -manual, but are now considered obsolete. The source for the -documentation is still available as part of the documentation source -archive. - -\begin{description} -\item[\module{ni}] ---- Import modules in ``packages.'' Basic package support is now -built in. The built-in support is very similar to what is provided in -this module. -\end{description} - - \section{SGI-specific Extension modules} The following are SGI specific, and may be out of touch with the @@ -207,5 +109,5 @@ \item[\module{sv}] --- Interface to the ``simple video'' board on SGI Indigo -(obsolete hardware). + (obsolete hardware). \end{description} From python-checkins at python.org Fri Mar 17 20:03:43 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 20:03:43 +0100 (CET) Subject: [Python-checkins] r43124 - in python/trunk: Modules/almodule.c Modules/gcmodule.c Modules/ossaudiodev.c Modules/pyexpat.c Objects/tupleobject.c Objects/typeobject.c Python/compile.c Message-ID: <20060317190343.051791E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 20:03:25 2006 New Revision: 43124 Modified: python/trunk/Modules/almodule.c python/trunk/Modules/gcmodule.c python/trunk/Modules/ossaudiodev.c python/trunk/Modules/pyexpat.c python/trunk/Objects/tupleobject.c python/trunk/Objects/typeobject.c python/trunk/Python/compile.c Log: Fix some missing checks after PyTuple_New, PyList_New, PyDict_New Modified: python/trunk/Modules/almodule.c ============================================================================== --- python/trunk/Modules/almodule.c (original) +++ python/trunk/Modules/almodule.c Fri Mar 17 20:03:25 2006 @@ -1482,7 +1482,8 @@ } if (alGetParams(resource, pvs, npvs) < 0) goto error; - v = PyList_New(npvs); + if (!(v = PyList_New(npvs))) + goto error; for (i = 0; i < npvs; i++) { if (pvs[i].sizeOut < 0) { char buf[32]; @@ -1692,6 +1693,7 @@ 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); Modified: python/trunk/Modules/gcmodule.c ============================================================================== --- python/trunk/Modules/gcmodule.c (original) +++ python/trunk/Modules/gcmodule.c Fri Mar 17 20:03:25 2006 @@ -1085,6 +1085,8 @@ { int i; PyObject *result = PyList_New(0); + if (!result) return NULL; + for (i = 0; i < NUM_GENERATIONS; i++) { if (!(gc_referrers_for(args, GEN_HEAD(i), result))) { Py_DECREF(result); Modified: python/trunk/Modules/ossaudiodev.c ============================================================================== --- python/trunk/Modules/ossaudiodev.c (original) +++ python/trunk/Modules/ossaudiodev.c Fri Mar 17 20:03:25 2006 @@ -935,24 +935,32 @@ labels = PyList_New(num_controls); names = PyList_New(num_controls); + if (labels == NULL || names == NULL) + goto error2; for (i = 0; i < num_controls; i++) { s = PyString_FromString(control_labels[i]); if (s == NULL) - return -1; + goto error2; PyList_SET_ITEM(labels, i, s); s = PyString_FromString(control_names[i]); if (s == NULL) - return -1; + goto error2; PyList_SET_ITEM(names, i, s); } if (PyModule_AddObject(module, "control_labels", labels) == -1) - return -1; + goto error2; if (PyModule_AddObject(module, "control_names", names) == -1) - return -1; + goto error1; return 0; + +error2: + Py_XDECREF(labels); +error1: + Py_XDECREF(names); + return -1; } Modified: python/trunk/Modules/pyexpat.c ============================================================================== --- python/trunk/Modules/pyexpat.c (original) +++ python/trunk/Modules/pyexpat.c Fri Mar 17 20:03:25 2006 @@ -1519,6 +1519,8 @@ 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) Modified: python/trunk/Objects/tupleobject.c ============================================================================== --- python/trunk/Objects/tupleobject.c (original) +++ python/trunk/Objects/tupleobject.c Fri Mar 17 20:03:25 2006 @@ -615,6 +615,7 @@ } else { result = PyTuple_New(slicelength); + if (!result) return NULL; src = self->ob_item; dest = ((PyTupleObject *)result)->ob_item; Modified: python/trunk/Objects/typeobject.c ============================================================================== --- python/trunk/Objects/typeobject.c (original) +++ python/trunk/Objects/typeobject.c Fri Mar 17 20:03:25 2006 @@ -1106,14 +1106,17 @@ char buf[1000]; PyObject *k, *v; PyObject *set = PyDict_New(); + if (!set) return; to_merge_size = PyList_GET_SIZE(to_merge); for (i = 0; i < to_merge_size; i++) { PyObject *L = PyList_GET_ITEM(to_merge, i); if (remain[i] < PyList_GET_SIZE(L)) { PyObject *c = PyList_GET_ITEM(L, remain[i]); - if (PyDict_SetItem(set, c, Py_None) < 0) + if (PyDict_SetItem(set, c, Py_None) < 0) { + Py_DECREF(set); return; + } } } n = PyDict_Size(set); Modified: python/trunk/Python/compile.c ============================================================================== --- python/trunk/Python/compile.c (original) +++ python/trunk/Python/compile.c Fri Mar 17 20:03:25 2006 @@ -319,7 +319,9 @@ list2dict(PyObject *list) { Py_ssize_t i, n; - PyObject *v, *k, *dict = PyDict_New(); + PyObject *v, *k; + PyObject *dict = PyDict_New(); + if (!dict) return NULL; n = PyList_Size(list); for (i = 0; i < n; i++) { From python-checkins at python.org Fri Mar 17 20:04:29 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 20:04:29 +0100 (CET) Subject: [Python-checkins] r43125 - in python/branches/release24-maint: Modules/almodule.c Modules/gcmodule.c Modules/ossaudiodev.c Modules/pyexpat.c Objects/tupleobject.c Objects/typeobject.c Message-ID: <20060317190429.46EF71E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 20:04:15 2006 New Revision: 43125 Modified: python/branches/release24-maint/Modules/almodule.c python/branches/release24-maint/Modules/gcmodule.c python/branches/release24-maint/Modules/ossaudiodev.c python/branches/release24-maint/Modules/pyexpat.c python/branches/release24-maint/Objects/tupleobject.c python/branches/release24-maint/Objects/typeobject.c Log: Backport: Fix missing NULL checks after PyTuple_New, PyList_New, PyDict_New Modified: python/branches/release24-maint/Modules/almodule.c ============================================================================== --- python/branches/release24-maint/Modules/almodule.c (original) +++ python/branches/release24-maint/Modules/almodule.c Fri Mar 17 20:04:15 2006 @@ -1482,7 +1482,8 @@ } if (alGetParams(resource, pvs, npvs) < 0) goto error; - v = PyList_New(npvs); + if (!(v = PyList_New(npvs))) + goto error; for (i = 0; i < npvs; i++) { if (pvs[i].sizeOut < 0) { char buf[32]; @@ -1692,6 +1693,7 @@ 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); Modified: python/branches/release24-maint/Modules/gcmodule.c ============================================================================== --- python/branches/release24-maint/Modules/gcmodule.c (original) +++ python/branches/release24-maint/Modules/gcmodule.c Fri Mar 17 20:04:15 2006 @@ -1047,6 +1047,7 @@ { int i; PyObject *result = PyList_New(0); + if (!result) return NULL; for (i = 0; i < NUM_GENERATIONS; i++) { if (!(gc_referrers_for(args, GEN_HEAD(i), result))) { Py_DECREF(result); Modified: python/branches/release24-maint/Modules/ossaudiodev.c ============================================================================== --- python/branches/release24-maint/Modules/ossaudiodev.c (original) +++ python/branches/release24-maint/Modules/ossaudiodev.c Fri Mar 17 20:04:15 2006 @@ -908,24 +908,32 @@ labels = PyList_New(num_controls); names = PyList_New(num_controls); + if (labels == NULL || names == NULL) + goto error2; for (i = 0; i < num_controls; i++) { s = PyString_FromString(control_labels[i]); if (s == NULL) - return -1; + goto error2; PyList_SET_ITEM(labels, i, s); s = PyString_FromString(control_names[i]); if (s == NULL) - return -1; + goto error2; PyList_SET_ITEM(names, i, s); } if (PyModule_AddObject(module, "control_labels", labels) == -1) - return -1; + goto error2; if (PyModule_AddObject(module, "control_names", names) == -1) - return -1; + goto error1; return 0; + +error2: + Py_XDECREF(labels); +error1: + Py_XDECREF(names); + return -1; } Modified: python/branches/release24-maint/Modules/pyexpat.c ============================================================================== --- python/branches/release24-maint/Modules/pyexpat.c (original) +++ python/branches/release24-maint/Modules/pyexpat.c Fri Mar 17 20:04:15 2006 @@ -1506,7 +1506,7 @@ return self->intern; } } - + #define APPEND(list, str) \ do { \ PyObject *o = PyString_FromString(str); \ @@ -1518,6 +1518,8 @@ 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) Modified: python/branches/release24-maint/Objects/tupleobject.c ============================================================================== --- python/branches/release24-maint/Objects/tupleobject.c (original) +++ python/branches/release24-maint/Objects/tupleobject.c Fri Mar 17 20:04:15 2006 @@ -615,6 +615,7 @@ } else { result = PyTuple_New(slicelength); + if (!result) return NULL; src = self->ob_item; dest = ((PyTupleObject *)result)->ob_item; Modified: python/branches/release24-maint/Objects/typeobject.c ============================================================================== --- python/branches/release24-maint/Objects/typeobject.c (original) +++ python/branches/release24-maint/Objects/typeobject.c Fri Mar 17 20:04:15 2006 @@ -1105,14 +1105,17 @@ char buf[1000]; PyObject *k, *v; PyObject *set = PyDict_New(); + if (!set) return; to_merge_size = PyList_GET_SIZE(to_merge); for (i = 0; i < to_merge_size; i++) { PyObject *L = PyList_GET_ITEM(to_merge, i); if (remain[i] < PyList_GET_SIZE(L)) { PyObject *c = PyList_GET_ITEM(L, remain[i]); - if (PyDict_SetItem(set, c, Py_None) < 0) + if (PyDict_SetItem(set, c, Py_None) < 0) { + Py_DECREF(set); return; + } } } n = PyDict_Size(set); From python-checkins at python.org Fri Mar 17 20:17:36 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 20:17:36 +0100 (CET) Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c Message-ID: <20060317191736.A13151E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 20:17:34 2006 New Revision: 43126 Modified: python/trunk/Doc/lib/libsocket.tex python/trunk/Lib/socket.py python/trunk/Lib/test/test_socket.py python/trunk/Misc/NEWS python/trunk/Modules/socketmodule.c Log: RFE #567972: Socket objects' family, type and proto properties are now exposed via new get...() methods. Modified: python/trunk/Doc/lib/libsocket.tex ============================================================================== --- python/trunk/Doc/lib/libsocket.tex (original) +++ python/trunk/Doc/lib/libsocket.tex Fri Mar 17 20:17:34 2006 @@ -626,7 +626,7 @@ \end{methoddesc} \begin{methoddesc}[socket]{gettimeout}{} -Returns the timeout in floating seconds associated with socket +Return the timeout in floating seconds associated with socket operations, or \code{None} if no timeout is set. This reflects the last call to \method{setblocking()} or \method{settimeout()}. \versionadded{2.3} @@ -654,6 +654,21 @@ setting, and in general it is recommended to call \method{settimeout()} before calling \method{connect()}. +\begin{methoddesc}[socket]{getfamily}{} +Return the socket family, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + +\begin{methoddesc}[socket]{gettype}{} +Return the socket type, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + +\begin{methoddesc}[socket]{getproto}{} +Return the socket protocol, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + \begin{methoddesc}[socket]{setsockopt}{level, optname, value} Set the value of the given socket option (see the \UNIX{} manual page \manpage{setsockopt}{2}). The needed symbolic constants are defined in Modified: python/trunk/Lib/socket.py ============================================================================== --- python/trunk/Lib/socket.py (original) +++ python/trunk/Lib/socket.py Fri Mar 17 20:17:34 2006 @@ -183,6 +183,24 @@ and bufsize arguments are as for the built-in open() function.""" return _fileobject(self._sock, mode, bufsize) + def getfamily(self): + """getfamily() -> socket family + + Return the socket family.""" + return self._sock.family + + def gettype(self): + """gettype() -> socket type + + Return the socket type.""" + return self._sock.type + + def getproto(self): + """getproto() -> socket protocol + + Return the socket protocol.""" + return self._sock.proto + _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" "%s.__doc__ = _realsocket.%s.__doc__\n") for _m in _socketmethods: Modified: python/trunk/Lib/test/test_socket.py ============================================================================== --- python/trunk/Lib/test/test_socket.py (original) +++ python/trunk/Lib/test/test_socket.py Fri Mar 17 20:17:34 2006 @@ -469,6 +469,14 @@ sock.close() self.assertRaises(socket.error, sock.send, "spam") + def testNewGetMethods(self): + # testing getfamily(), gettype() and getprotocol() + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.assertEqual(sock.getfamily(), socket.AF_INET) + self.assertEqual(sock.gettype(), socket.SOCK_STREAM) + self.assertEqual(sock.getproto(), 0) + sock.close() + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 17 20:17:34 2006 @@ -291,6 +291,9 @@ Extension Modules ----------------- +- RFE #567972: Socket objects' family, type and proto properties are + now exposed via new get...() methods. + - Everything under lib-old was removed. This includes the following modules: Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, Modified: python/trunk/Modules/socketmodule.c ============================================================================== --- python/trunk/Modules/socketmodule.c (original) +++ python/trunk/Modules/socketmodule.c Fri Mar 17 20:17:34 2006 @@ -62,6 +62,7 @@ */ #include "Python.h" +#include "structmember.h" #undef MAX #define MAX(x, y) ((x) < (y) ? (y) : (x)) @@ -2502,6 +2503,14 @@ {NULL, NULL} /* sentinel */ }; +/* SockObject members */ +static PyMemberDef sock_memberlist[] = { + {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"}, + {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"}, + {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"}, + {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"}, + {0}, +}; /* Deallocate a socket object in response to the last Py_DECREF(). First close the file description. */ @@ -2625,7 +2634,7 @@ 0, /* tp_iter */ 0, /* tp_iternext */ sock_methods, /* tp_methods */ - 0, /* tp_members */ + sock_memberlist, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ From python-checkins at python.org Fri Mar 17 20:48:40 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 17 Mar 2006 20:48:40 +0100 (CET) Subject: [Python-checkins] r43127 - peps/trunk/pep-0356.txt Message-ID: <20060317194840.2CF171E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 17 20:48:38 2006 New Revision: 43127 Modified: peps/trunk/pep-0356.txt Log: Add note about the @decorator discussion. Add note about the fpectl module (Bug #872175) Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Fri Mar 17 20:48:38 2006 @@ -98,6 +98,10 @@ - Add builtin @deprecated decorator? + - Add @decorator decorator to functional, rename to functools? + + - Remove the fpectl module? + - Modules under consideration for inclusion: - bdist_deb in distutils package From mal at egenix.com Fri Mar 17 22:01:59 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Fri, 17 Mar 2006 22:01:59 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.tex Include/ucnhash.h Lib/encodings/idna.py Lib/stringprep.py Modules/unicodedata.c In-Reply-To: <441B01FD.3070006@v.loewis.de> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <9e804ac0603131343y16d809d1s23479390490ce513@mail.gmail.com> <4416894C.7090304@egenix.com> <44172E5B.7070309@v.loewis.de> <441A8D4F.1030906@egenix.com> <441B01FD.3070006@v.loewis.de> Message-ID: <441B23C7.700@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >>> This I don't understand: what new features could these >>> be? All features of the Unicode database range back to >>> the earliest versions, including data which we currently >>> don't expose. >> >> I meant new features as in: new fields in the database or >> new values for categories. > > I very much doubt that the Unicode consortium adds new > fields in the database or new values for categories. If > they ever do, we can worry about it then. > > If you want to worry now: Adding a new category is completely backwards > compatible. The category value just won't appear in the old version of > the database, which doesn't cause any problems whatsoever. > > For new fields in the database, we should assume that > in older versions, the assigned characters have the same > values of the properties as in the most recent version, > unless the Unicode consortium specifies otherwise. > >> If we expose new features that are only available in 4.1 >> and not in 3.2, then you have a compatibility problem >> since the 3.2 version won't supply the needed data. > > So you use the 4.1 data instead, and apply them to > all characters that were assigned in 3.2. > > However, there *are* no features that are available in > 4.1 and not in 3.2. True. I'm challenging your design decision and the fact that you decided this on your own without getting feedback via the SF tracker first. >> The reason stringprep is tied to Unicode 3.2 stems from the >> need to provide explicit tables for the string pre-processing. >> >> I don't see why the IETF should not update the RFC with a new >> set of tables against the Unicode 4.1 (or a later) database >> version. > > That shows that you haven't been following the IDNA discussions. > Some of the IDNA authors are very concerned about changes to > the normalization, and will strongly oppose proposals to move > to a new version of the database. No, I haven't followed that discussion. Just applying common sense. Note that I'm not arguing against having multiple versions of the database around. On the contrary: I want to make this a user choice and as easy for them to decide as possible. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 17 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From mal at egenix.com Fri Mar 17 22:10:08 2006 From: mal at egenix.com (M.-A. Lemburg) Date: Fri, 17 Mar 2006 22:10:08 +0100 Subject: [Python-checkins] r42954 - in python/trunk: Doc/lib/libunicodedata.texModules/unicodedata.c In-Reply-To: <441B009D.9000808@v.loewis.de> References: <20060310112009.D8E041E402D@bag.python.org> <44116B39.60103@egenix.com> <4411DEFF.8050804@v.loewis.de> <4415C7D2.9030703@egenix.com> <4415F61D.1070907@v.loewis.de> <441A8AC0.1070202@egenix.com> <441B009D.9000808@v.loewis.de> Message-ID: <441B25B0.30902@egenix.com> Martin v. L?wis wrote: > M.-A. Lemburg wrote: >>> Well, "the problem" to be solved was not merely to provide two versions >>> of the database, but also in a space-efficient way. All this effort >>> in trying to squeeze the size of the data would be wasted when it >>> then gets double just because two versions of the database must >>> be provided. >> >> Since the big tables of the database are static C data, >> only the portions needed would ever get swapped into >> memory, so this argument is rather weak. > > It's on-disk space that I worry about, not in-memory space. > What is your worry? Code complexity. On-disk space is not an argument anymore nowadays. Even less so since we're only talking 100kBs and not even MBs. >> Also, most users won't ever use the IDNA codec, so they'd >> benefit from not having the extra complexity around. > > But they don't suffer from it, either. It just doesn't affect them. The users don't. The developers do. I'm one of them, remember ? >> With the old version available in a separate module, users who >> still need the old version could continue to compile it for >> themselves. > > That's true. However, this is no advantage: in the current > implementation, they don't have to do anything - the old > version is always available. > >> If you change makeunicodedata.py, then there's no way back >> for these users. > > Sure. They could fetch the old version from some old Python > distribution, rename the entry point, and compile the module > under a different name. > >> Given that the stringprep RFC has started out by pointing >> to a specific Unicode version, it is likely that these >> strong binding to specific versions are going to happen >> again in the future. > > "the future" meaning 2015, right? Who knows. It happened in 2003. Could happen again in 2006. >> This makes it nearly impossible to remove the old database >> version support, since there's always be some users that >> will have to rely on the availability of the old database >> versions. > > Well, it is possible to remove support for old features - > we are doing that all the time. Right, but there's usually a way to maintain old code outside Python, e.g. keep deprecated modules around in your own lib or continue to use regex because some old application relies on it. -- Marc-Andre Lemburg eGenix.com Professional Python Services directly from the Source (#1, Mar 17 2006) >>> Python/Zope Consulting and Support ... http://www.egenix.com/ >>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/ >>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/ ________________________________________________________________________ ::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! :::: From python-checkins at python.org Fri Mar 17 22:48:51 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 22:48:51 +0100 (CET) Subject: [Python-checkins] r43128 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060317214851.6672B1E400B@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 22:48:46 2006 New Revision: 43128 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: Write section Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 17 22:48:46 2006 @@ -212,7 +212,25 @@ %====================================================================== \section{PEP 338: Executing Modules as Scripts} -% XXX write this +The \programopt{-m} switch added in Python 2.4 to execute a module as +a script gained a few more abilities. Instead of being implemented in +C code inside the Python interpreter, the switch now uses an +implementation in a new module, \module{runpy}. + +The \module{runpy} module implements a more sophisticated import +mechanism so that it's now possible to run modules in a package such +as \module{pychecker.checker}. The module also supports alternative +import mechanisms such as the \module{zipimport} module. (This means +you can add a .zip archive's path to \code{sys.path} and then use the +\programopt{-m} switch to execute code from the archive. + + +\begin{seealso} + +\seepep{338}{Executing modules as scripts}{PEP written and +implemented by Nick Coghlan.} + +\end{seealso} %====================================================================== From neal at metaslash.com Fri Mar 17 23:15:50 2006 From: neal at metaslash.com (Neal Norwitz) Date: Fri, 17 Mar 2006 17:15:50 -0500 Subject: [Python-checkins] Python Regression Test Failures all (1) Message-ID: <20060317221550.GA30369@python.psfb.org> test_grammar test_opcodes test_operations test_builtin test_exceptions test_types test_MimeWriter test_StringIO test___all__ test___future__ test__locale test_aepack test_aepack skipped -- No module named aepack test_al test_al skipped -- No module named al test_anydbm test_applesingle test_applesingle skipped -- No module named macostools test_array test_ast test_asynchat test_atexit test_audioop test_augassign test_base64 test_bastion test_binascii test_binhex test_binop test_bisect test_bool test_bsddb test_bsddb185 test_bsddb185 skipped -- No module named bsddb185 test_bsddb3 Exception in thread reader 1: Traceback (most recent call last): File "/home/neal/python/trunk/Lib/threading.py", line 467, in __bootstrap self.run() File "/home/neal/python/trunk/Lib/threading.py", line 447, in run self.__target(*self.__args, **self.__kwargs) File "/home/neal/python/trunk/Lib/bsddb/test/test_thread.py", line 275, in readerThread rec = dbutils.DeadlockWrap(c.next, max_retries=10) File "/home/neal/python/trunk/Lib/bsddb/dbutils.py", line 62, in DeadlockWrap return function(*_args, **_kwargs) DBLockDeadlockError: (-30996, 'DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock') test_bufio test_bz2 test_cProfile test_calendar test_call test_capi test_cd test_cd skipped -- No module named cd test_cfgparser test_cgi test_charmapcodec test_cl test_cl skipped -- No module named cl test_class test_cmath test_cmd_line test_code test_codeccallbacks test_codecencodings_cn test_codecencodings_hk test_codecencodings_jp test_codecencodings_kr test_codecencodings_tw test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_codecs test_codeop test_coding test_coercion test_colorsys test_commands test_compare test_compile test_compiler test_complex test_contains test_contextlib test_cookie test_cookielib test_copy test_copy_reg test_cpickle test_crypt test_csv test_ctypes test_datetime test_dbm test_decimal test_decorators test_defaultdict test_deque test_descr test test_descr failed -- 1 == -1 test_descrtut test_dict test_difflib test_dircache test_dis test_distutils test_dl test_doctest test_doctest2 test_dumbdbm test_dummy_thread test_dummy_threading test_email test_email_codecs test_enumerate test_eof test_errno test_exception_variations test_extcall test_fcntl test_file test_filecmp test_fileinput test_float test_fnmatch test_fork1 test_format test_fpformat test_frozen test_funcattrs test_functional test_future test_gc test_gdbm test_generators test_genexps test_getargs test_getargs2 test_getopt test_gettext test_gl test_gl skipped -- No module named gl test_glob test_global test_grp test_gzip test_hash test_hashlib test_heapq test_hexoct test_hmac test_hotshot test_htmllib test_htmlparser test_httplib test_imageop test_imaplib test_imgfile test_imgfile skipped -- No module named imgfile test_imp test_import test_importhooks test_index test_inspect test_ioctl test_ioctl skipped -- Unable to open /dev/tty test_isinstance test_iter test_iterlen test_itertools test_largefile test_list test_locale test_logging test_long test_long_future test_longexp test_macfs test_macfs skipped -- No module named macfs test_macostools test_macostools skipped -- No module named macostools test_macpath test_mailbox test_marshal test_math test_md5 test_mhlib test_mimetools test_mimetypes test_minidom test_mmap test_module test_multibytecodec test_multibytecodec_support test_multifile test_mutants test_netrc test_new test_nis test_nis skipped -- Local domain name not set test_normalization test_ntpath test_openpty test_operator test_optparse test_os test_parser test_peepholer test_pep247 test_pep263 test_pep277 test_pep277 skipped -- test works only on NT+ test_pep292 test_pep352 test_pickle test_pickletools test_pkg test_pkgimport test_platform test_plistlib test_plistlib skipped -- No module named plistlib test_poll test_popen [9894 refs] [9894 refs] [9894 refs] test_popen2 test_posix test_posixpath test_pow test_pprint test_profile test_profilehooks test_pty test_pwd test_pyclbr test_pyexpat test_queue test_quopri [10980 refs] [10980 refs] test_random test_re test_repr test_resource test_rfc822 test_rgbimg test_richcmp test_robotparser test_runpy test_sax test_scope test_scriptpackages test_scriptpackages skipped -- No module named aetools test_select test_set test_sets test_sgmllib test_sha test_shelve test_shlex test_shutil test_signal test_site test_slice test_socket test_socket_ssl test_socketserver test_softspace test_sort test_str test_strftime test_string test_stringprep test_strop test_strptime test_struct test_structseq test_subprocess [9889 refs] [9891 refs] [9889 refs] [9889 refs] [9889 refs] [9889 refs] [9889 refs] [9890 refs] [9890 refs] [9889 refs] [9890 refs] [9889 refs] [10106 refs] [9890 refs] [9890 refs] [9890 refs] [9890 refs] [9890 refs] [9890 refs] [9890 refs] this bit of output is from a test of stdout in a different process ... [9890 refs] [9889 refs] [10106 refs] test_sunaudiodev test_sunaudiodev skipped -- No module named sunaudiodev test_sundry test_symtable test_syntax test_sys [9889 refs] [9889 refs] test_tarfile test_tcl test_tcl skipped -- No module named _tkinter test_tempfile [9891 refs] test_textwrap test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_time test_timeout test_tokenize test_trace test_traceback test_transformer test_tuple test_ucn test_unary test_unicode test_unicode_file test_unicode_file skipped -- No Unicode filesystem semantics on this platform. test_unicodedata test_unittest test_univnewlines test_unpack test_urllib test_urllib2 test_urllib2net test_urllibnet test_urlparse test_userdict test_userlist test_userstring test_uu test_warnings test_wave test_weakref test_whichdb test_winreg test_winreg skipped -- No module named _winreg test_winsound test_winsound skipped -- No module named winsound test_with test_xdrlib test_xml_etree test_xml_etree_c test_xmllib test_xmlrpc test_xpickle test_xrange test_zipfile test_zipimport test_zlib 284 tests OK. 1 test failed: test_descr 20 tests skipped: test_aepack test_al test_applesingle test_bsddb185 test_cd test_cl test_gl test_imgfile test_ioctl test_macfs test_macostools test_nis test_pep277 test_plistlib test_scriptpackages test_sunaudiodev test_tcl test_unicode_file test_winreg test_winsound 1 skip unexpected on linux2: test_ioctl [398873 refs] From neal at metaslash.com Fri Mar 17 23:17:20 2006 From: neal at metaslash.com (Neal Norwitz) Date: Fri, 17 Mar 2006 17:17:20 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) Message-ID: <20060317221720.GA30733@python.psfb.org> TEXINPUTS=/home/neal/python/trunk/Doc/commontex: python /home/neal/python/trunk/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/lib lib/lib.tex +++ TEXINPUTS=/home/neal/python/trunk/Doc/lib:/home/neal/python/trunk/Doc/commontex:/home/neal/python/trunk/Doc/paper-letter:/home/neal/python/trunk/Doc/texinputs: +++ latex lib +++ latex2html -init_file lib.l2h -dir /home/neal/python/trunk/Doc/html/lib /home/neal/python/trunk/Doc/lib/lib.tex +++ perl /home/neal/python/trunk/Doc/tools/node2label.pl *.html TEXINPUTS=/home/neal/python/trunk/Doc/commontex: python /home/neal/python/trunk/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/whatsnew --split 4 whatsnew/whatsnew25.tex *** Session transcript and error messages are in /home/neal/python/trunk/Doc/html/whatsnew/whatsnew25.how. *** Exited with status 1. The relevant lines from the transcript are: ------------------------------------------------------------------------ +++ latex whatsnew25 This is TeX, Version 3.14159 (Web2C 7.4.5) (/home/neal/python/trunk/Doc/whatsnew/whatsnew25.tex LaTeX2e <2001/06/01> Babel and hyphenation patterns for american, french, german, ngerman, n ohyphenation, loaded. (/home/neal/python/trunk/Doc/texinputs/howto.cls Document Class: howto 1998/02/25 Document class (Python HOWTO) (/home/neal/python/trunk/Doc/texinputs/pypaper.sty (/usr/share/texmf/tex/latex/psnfss/times.sty) Using Times instead of Computer Modern. ) (/usr/share/texmf/tex/latex/misc/fancybox.sty Style option: `fancybox' v1.3 <2000/09/19> (tvz) ) (/usr/share/texmf/tex/latex/base/article.cls Document Class: article 2001/04/21 v1.4e Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) (/home/neal/python/trunk/Doc/texinputs/fancyhdr.sty) Using fancier footers than usual. (/home/neal/python/trunk/Doc/texinputs/python.sty (/usr/share/texmf/tex/latex/tools/longtable.sty) (/home/neal/python/trunk/Doc/texinputs/underscore.sty) (/usr/share/texmf/tex/latex/tools/verbatim.sty) (/usr/share/texmf/tex/latex/base/alltt.sty))) (/home/neal/python/trunk/Doc/texinputs/distutils.sty) No file whatsnew25.aux. (/usr/share/texmf/tex/latex/psnfss/ot1ptm.fd) (/usr/share/texmf/tex/latex/psnfss/ot1phv.fd) No file whatsnew25.toc. (/usr/share/texmf/tex/latex/psnfss/ot1pcr.fd) [1] Underfull \hbox (badness 10000) in paragraph at lines 135--140 []\OT1/ptm/m/n/10 The con-struc-tor for \OT1/pcr/m/n/10 partial \OT1/ptm/m/n/10 takes the ar-gu-ments \OT1/pcr/m/n/10 (\OT1/ptm/m/it/10 function\OT1/pcr/m/n/1 0 , \OT1/ptm/m/it/10 arg1\OT1/pcr/m/n/10 , \OT1/ptm/m/it/10 arg2\OT1/pcr/m/n/10 , ... \OT1/ptm/m/it/10 kwarg1\OT1/pcr/m/n/10 =\OT1/ptm/m/it/10 value1\OT1/pcr/ m/n/10 , [2] [3] [4] (/usr/share/texmf/tex/latex/psnfss/omsptm.fd) [5] [6] [7] [8] [9] ! LaTeX Error: Something's wrong--perhaps a missing \item. See the LaTeX manual or LaTeX Companion for explanation. Type H for immediate help. ... l.777 \end{itemize} ? ! Emergency stop. ... l.777 \end{itemize} Output written on whatsnew25.dvi (9 pages, 30196 bytes). Transcript written on whatsnew25.log. *** Session transcript and error messages are in /home/neal/python/trunk/Doc/html/whatsnew/whatsnew25.how. *** Exited with status 1. +++ TEXINPUTS=/home/neal/python/trunk/Doc/whatsnew:/home/neal/python/trunk/Doc/commontex:/home/neal/python/trunk/Doc/paper-letter:/home/neal/python/trunk/Doc/texinputs: +++ latex whatsnew25 make: *** [html/whatsnew/whatsnew25.html] Error 1 From python-checkins at python.org Fri Mar 17 23:25:20 2006 From: python-checkins at python.org (andrew.kuchling) Date: Fri, 17 Mar 2006 23:25:20 +0100 (CET) Subject: [Python-checkins] r43129 - python/trunk/Doc/whatsnew/whatsnew25.tex Message-ID: <20060317222520.10D2E1E4013@bag.python.org> Author: andrew.kuchling Date: Fri Mar 17 23:25:15 2006 New Revision: 43129 Modified: python/trunk/Doc/whatsnew/whatsnew25.tex Log: You need at least one \item Modified: python/trunk/Doc/whatsnew/whatsnew25.tex ============================================================================== --- python/trunk/Doc/whatsnew/whatsnew25.tex (original) +++ python/trunk/Doc/whatsnew/whatsnew25.tex Fri Mar 17 23:25:15 2006 @@ -790,7 +790,7 @@ \begin{itemize} -% the pickle module no longer uses the deprecated bin parameter. +\item XXX the pickle module no longer uses the deprecated bin parameter. \end{itemize} From python-checkins at python.org Sat Mar 18 03:47:39 2006 From: python-checkins at python.org (tim.peters) Date: Sat, 18 Mar 2006 03:47:39 +0100 (CET) Subject: [Python-checkins] r43130 - python/branches/release24-maint/Lib/test/test_timeout.py Message-ID: <20060318024739.727E71E4006@bag.python.org> Author: tim.peters Date: Sat Mar 18 03:47:38 2006 New Revision: 43130 Modified: python/branches/release24-maint/Lib/test/test_timeout.py Log: Merge rev 43091 from the trunk. """ Try to find a host that responds slower from python.org so this test does not fail on macteagle (G4 OSX.4 in buildbot) """ Since testConnectTimeout() frequently fails in the same way in 2.4 branch, and this patch seems to have fixed it on the trunk, it should fix it on the 2.4 branch too. Modified: python/branches/release24-maint/Lib/test/test_timeout.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_timeout.py (original) +++ python/branches/release24-maint/Lib/test/test_timeout.py Sat Mar 18 03:47:38 2006 @@ -114,7 +114,7 @@ # If we are too close to www.python.org, this test will fail. # Pick a host that should be farther away. if socket.getfqdn().split('.')[-2:] == ['python', 'org']: - self.addr_remote = ('python.net', 80) + self.addr_remote = ('tut.fi', 80) _t1 = time.time() self.failUnlessRaises(socket.error, self.sock.connect, From nnorwitz at gmail.com Sat Mar 18 04:12:13 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Fri, 17 Mar 2006 19:12:13 -0800 Subject: [Python-checkins] r43115 - in python/trunk: Lib/ctypes/__init__.py Lib/ctypes/test/test_byteswap.py Lib/ctypes/test/test_cfuncs.py Lib/ctypes/test/test_loading.py Lib/ctypes/test/test_sizes.py Modules/_ctypes/_ctypes.c Modules/_ctypes/callproc.c In-Reply-To: <20060317155300.A315E1E400B@bag.python.org> References: <20060317155300.A315E1E400B@bag.python.org> Message-ID: On 3/17/06, thomas.heller wrote: > Author: thomas.heller > Date: Fri Mar 17 16:52:58 2006 > New Revision: 43115 > > @@ -198,17 +199,20 @@ > pass > self.assertRaises(TypeError, setattr, S, "_fields_", [("s", T)]) > > - # crashes on solaris with a core dump. > - def X_test_struct_fields(self): > + def test_struct_fields_2(self): > + # standard packing in struct uses no alignment. > + # So, we have to align using pad bytes. > + # > + # Unaligned accesses will crash Python (on those platforms that > + # don't allow it, like sparc solaris). Note: this is really a bug in Python that should be fixed. > Modified: python/trunk/Modules/_ctypes/_ctypes.c > ============================================================================== > --- python/trunk/Modules/_ctypes/_ctypes.c (original) > +++ python/trunk/Modules/_ctypes/_ctypes.c Fri Mar 17 16:52:58 2006 > @@ -2529,9 +2556,14 @@ > #ifdef MS_WIN32 > address = FindAddress(handle, name, (PyObject *)type); > if (!address) { > - PyErr_Format(PyExc_AttributeError, > - "function '%s' not found", > - name); > + if ((size_t)name & ~0xFFFF) > + PyErr_Format(PyExc_AttributeError, > + "function '%s' not found", > + name); > + else > + PyErr_Format(PyExc_AttributeError, > + "function ordinal %d not found", > + name); name can't be both a string and an integer. That last error message looks wrong. n From python-checkins at python.org Sat Mar 18 09:00:01 2006 From: python-checkins at python.org (georg.brandl) Date: Sat, 18 Mar 2006 09:00:01 +0100 (CET) Subject: [Python-checkins] r43131 - in python/trunk: Misc/NEWS Objects/cellobject.c Message-ID: <20060318080001.2603B1E4026@bag.python.org> Author: georg.brandl Date: Sat Mar 18 08:59:59 2006 New Revision: 43131 Modified: python/trunk/Misc/NEWS python/trunk/Objects/cellobject.c Log: Previously, Python code had no easy way to access the contents of a cell object. Now, a ``cell_contents`` attribute has been added (closes patch #1170323). Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Mar 18 08:59:59 2006 @@ -12,6 +12,10 @@ Core and builtins ----------------- +- Previously, Python code had no easy way to access the contents of a + cell object. Now, a ``cell_contents`` attribute has been added + (closes patch #1170323). + - Patch #1123430: Python's small-object allocator now returns an arena to the system ``free()`` when all memory within an arena becomes unused again. Prior to Python 2.5, arenas (256KB chunks of memory) were never Modified: python/trunk/Objects/cellobject.c ============================================================================== --- python/trunk/Objects/cellobject.c (original) +++ python/trunk/Objects/cellobject.c Sat Mar 18 08:59:59 2006 @@ -86,6 +86,18 @@ return 0; } +static PyObject * +cell_get_contents(PyCellObject *op, void *closure) +{ + Py_XINCREF(op->ob_ref); + return op->ob_ref; +} + +static PyGetSetDef cell_getsetlist[] = { + {"cell_contents", (getter)cell_get_contents, NULL}, + {NULL} /* sentinel */ +}; + PyTypeObject PyCell_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, @@ -111,4 +123,11 @@ 0, /* tp_doc */ (traverseproc)cell_traverse, /* tp_traverse */ (inquiry)cell_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + cell_getsetlist, /* tp_getset */ }; From python-checkins at python.org Sat Mar 18 12:35:19 2006 From: python-checkins at python.org (georg.brandl) Date: Sat, 18 Mar 2006 12:35:19 +0100 (CET) Subject: [Python-checkins] r43132 - python/trunk/Lib/urllib2.py Message-ID: <20060318113519.C620D1E400B@bag.python.org> Author: georg.brandl Date: Sat Mar 18 12:35:18 2006 New Revision: 43132 Modified: python/trunk/Lib/urllib2.py Log: Bug #1353433: be conciliant with spaces in redirect URLs Modified: python/trunk/Lib/urllib2.py ============================================================================== --- python/trunk/Lib/urllib2.py (original) +++ python/trunk/Lib/urllib2.py Sat Mar 18 12:35:18 2006 @@ -112,7 +112,7 @@ from StringIO import StringIO # not sure how many of these need to be gotten rid of -from urllib import (unwrap, unquote, splittype, splithost, +from urllib import (unwrap, unquote, splittype, splithost, quote, addinfourl, splitport, splitgophertype, splitquery, splitattr, ftpwrapper, noheaders, splituser, splitpasswd, splitvalue) @@ -507,6 +507,8 @@ # from the user (of urllib2, in this case). In practice, # essentially all clients do redirect in this case, so we # do the same. + # be conciliant with URIs containing a space + newurl = newurl.replace(' ', '%20') return Request(newurl, headers=req.headers, origin_req_host=req.get_origin_req_host(), From python-checkins at python.org Sat Mar 18 13:52:55 2006 From: python-checkins at python.org (thomas.heller) Date: Sat, 18 Mar 2006 13:52:55 +0100 (CET) Subject: [Python-checkins] r43133 - python/trunk/Modules/_ctypes/_ctypes_test.c Message-ID: <20060318125255.7256F1E400D@bag.python.org> Author: thomas.heller Date: Sat Mar 18 13:52:54 2006 New Revision: 43133 Modified: python/trunk/Modules/_ctypes/_ctypes_test.c Log: Fix compiler warning. Modified: python/trunk/Modules/_ctypes/_ctypes_test.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes_test.c (original) +++ python/trunk/Modules/_ctypes/_ctypes_test.c Sat Mar 18 13:52:54 2006 @@ -99,7 +99,7 @@ #ifdef HAVE_WCHAR_H EXPORT(wchar_t *) my_wcsdup(wchar_t *src) { - int len = wcslen(src); + size_t len = wcslen(src); wchar_t *ptr = malloc((len + 1) * sizeof(wchar_t)); if (ptr == NULL) return NULL; From python-checkins at python.org Sat Mar 18 15:05:44 2006 From: python-checkins at python.org (walter.doerwald) Date: Sat, 18 Mar 2006 15:05:44 +0100 (CET) Subject: [Python-checkins] r43134 - python/trunk/Python/codecs.c Message-ID: <20060318140544.2D2821E400D@bag.python.org> Author: walter.doerwald Date: Sat Mar 18 15:05:43 2006 New Revision: 43134 Modified: python/trunk/Python/codecs.c Log: Release codecs variable earlier. Modified: python/trunk/Python/codecs.c ============================================================================== --- python/trunk/Python/codecs.c (original) +++ python/trunk/Python/codecs.c Sat Mar 18 15:05:43 2006 @@ -230,16 +230,14 @@ if (codecs == NULL) return NULL; inccodec = PyObject_GetAttrString(codecs, attrname); - if (inccodec == NULL) { - Py_DECREF(codecs); + Py_DECREF(codecs); + if (inccodec == NULL) return NULL; - } if (errors) ret = PyObject_CallFunction(inccodec, "s", errors); else ret = PyObject_CallFunction(inccodec, NULL); Py_DECREF(inccodec); - Py_DECREF(codecs); return ret; } From python-checkins at python.org Sat Mar 18 15:22:26 2006 From: python-checkins at python.org (walter.doerwald) Date: Sat, 18 Mar 2006 15:22:26 +0100 (CET) Subject: [Python-checkins] r43135 - in python/trunk: Lib/test/test_codecs.py Modules/_testcapimodule.c Message-ID: <20060318142226.EF9E01E4011@bag.python.org> Author: walter.doerwald Date: Sat Mar 18 15:22:26 2006 New Revision: 43135 Modified: python/trunk/Lib/test/test_codecs.py python/trunk/Modules/_testcapimodule.c Log: Add tests for the C APIs PyCodec_IncrementalEncoder() and PyCodec_IncrementalDecoder(). Modified: python/trunk/Lib/test/test_codecs.py ============================================================================== --- python/trunk/Lib/test/test_codecs.py (original) +++ python/trunk/Lib/test/test_codecs.py Sat Mar 18 15:22:26 2006 @@ -1,7 +1,7 @@ from test import test_support import unittest import codecs -import sys, StringIO +import sys, StringIO, _testcapi class Queue(object): """ @@ -1032,9 +1032,11 @@ decodedresult += reader.read() self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding)) - # check incremental decoder/encoder and iterencode()/iterdecode() + # check incremental decoder/encoder (fetched via the Python + # and C API) and iterencode()/iterdecode() try: encoder = codecs.getincrementalencoder(encoding)() + cencoder = _testcapi.codec_incrementalencoder(encoding) except LookupError: # no IncrementalEncoder pass else: @@ -1048,6 +1050,16 @@ decodedresult += decoder.decode(c) self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding)) + # check C API + encodedresult = "" + for c in s: + encodedresult += cencoder.encode(c) + cdecoder = _testcapi.codec_incrementaldecoder(encoding) + decodedresult = u"" + for c in encodedresult: + decodedresult += cdecoder.decode(c) + self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding)) + # check iterencode()/iterdecode() result = u"".join(codecs.iterdecode(codecs.iterencode(s, encoding), encoding)) self.assertEqual(result, s, "%r != %r (encoding=%r)" % (result, s, encoding)) Modified: python/trunk/Modules/_testcapimodule.c ============================================================================== --- python/trunk/Modules/_testcapimodule.c (original) +++ python/trunk/Modules/_testcapimodule.c Sat Mar 18 15:22:26 2006 @@ -478,6 +478,26 @@ return Py_None; } +static +PyObject *codec_incrementalencoder(PyObject *self, PyObject *args) +{ + const char *encoding, *errors = NULL; + if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder", + &encoding, &errors)) + return NULL; + return PyCodec_IncrementalEncoder(encoding, errors); +} + +static +PyObject *codec_incrementaldecoder(PyObject *self, PyObject *args) +{ + const char *encoding, *errors = NULL; + if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder", + &encoding, &errors)) + return NULL; + return PyCodec_IncrementalDecoder(encoding, errors); +} + #endif /* Simple test of _PyLong_NumBits and _PyLong_Sign. */ @@ -623,6 +643,10 @@ {"getargs_K", (PyCFunction)getargs_K, METH_VARARGS}, {"test_longlong_api", (PyCFunction)test_longlong_api, METH_NOARGS}, {"test_L_code", (PyCFunction)test_L_code, METH_NOARGS}, + {"codec_incrementalencoder", + (PyCFunction)codec_incrementalencoder, METH_VARARGS}, + {"codec_incrementaldecoder", + (PyCFunction)codec_incrementaldecoder, METH_VARARGS}, #endif #ifdef Py_USING_UNICODE {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS}, From python-checkins at python.org Sat Mar 18 16:41:57 2006 From: python-checkins at python.org (barry.warsaw) Date: Sat, 18 Mar 2006 16:41:57 +0100 (CET) Subject: [Python-checkins] r43136 - in python/trunk: Doc/lib/email-dir.py Doc/lib/email-mime.py Doc/lib/email-simple.py Doc/lib/email-unpack.py Doc/lib/email.tex Doc/lib/emailcharsets.tex Doc/lib/emailencoders.tex Doc/lib/emailexc.tex Doc/lib/emailgenerator.tex Doc/lib/emailheaders.tex Doc/lib/emailiter.tex Doc/lib/emailmessage.tex Doc/lib/emailmimebase.tex Doc/lib/emailparser.tex Doc/lib/emailutil.tex Doc/lib/mimelib.tex Lib/email/Charset.py Lib/email/Encoders.py Lib/email/Errors.py Lib/email/FeedParser.py Lib/email/Generator.py Lib/email/Header.py Lib/email/Iterators.py Lib/email/MIMEAudio.py Lib/email/MIMEBase.py Lib/email/MIMEImage.py Lib/email/MIMEMessage.py Lib/email/MIMEMultipart.py Lib/email/MIMENonMultipart.py Lib/email/MIMEText.py Lib/email/Message.py Lib/email/Parser.py Lib/email/Utils.py Lib/email/__init__.py Lib/email/_parseaddr.py Lib/email/base64MIME.py Lib/email/base64mime.py Lib/email/charset.py Lib/email/encoders.py Lib/email/errors.py Lib/email/feedparser.py Lib/email/generator.py Lib/email/header.py Lib/email/iterators.py Lib/email/message.py Lib/email/mime Lib/email/parser.py Lib/email/quopriMIME.py Lib/email/quoprimime.py Lib/email/test/data/msg_26.txt Lib/email/test/data/msg_44.txt Lib/email/test/test_email.py Lib/email/test/test_email_codecs.py Lib/email/test/test_email_codecs_renamed.py Lib/email/test/test_email_renamed.py Lib/email/utils.py Lib/test/test_pyclbr.py Message-ID: <20060318154157.251AF1E400D@bag.python.org> Author: barry.warsaw Date: Sat Mar 18 16:41:53 2006 New Revision: 43136 Added: python/trunk/Lib/email/base64mime.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/base64mime.py python/trunk/Lib/email/charset.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/charset.py python/trunk/Lib/email/encoders.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/encoders.py python/trunk/Lib/email/errors.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/errors.py python/trunk/Lib/email/feedparser.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/feedparser.py python/trunk/Lib/email/generator.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/generator.py python/trunk/Lib/email/header.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/header.py python/trunk/Lib/email/iterators.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/iterators.py python/trunk/Lib/email/message.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/message.py python/trunk/Lib/email/mime/ - copied from r43093, sandbox/trunk/emailpkg/4_0/email/mime/ python/trunk/Lib/email/parser.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/parser.py python/trunk/Lib/email/quoprimime.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/quoprimime.py python/trunk/Lib/email/test/test_email_codecs_renamed.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/test/test_email_codecs_renamed.py python/trunk/Lib/email/test/test_email_renamed.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/test/test_email_renamed.py python/trunk/Lib/email/utils.py - copied unchanged from r43093, sandbox/trunk/emailpkg/4_0/email/utils.py Removed: python/trunk/Lib/email/Charset.py python/trunk/Lib/email/Encoders.py python/trunk/Lib/email/Errors.py python/trunk/Lib/email/FeedParser.py python/trunk/Lib/email/Generator.py python/trunk/Lib/email/Header.py python/trunk/Lib/email/Iterators.py python/trunk/Lib/email/MIMEAudio.py python/trunk/Lib/email/MIMEBase.py python/trunk/Lib/email/MIMEImage.py python/trunk/Lib/email/MIMEMessage.py python/trunk/Lib/email/MIMEMultipart.py python/trunk/Lib/email/MIMENonMultipart.py python/trunk/Lib/email/MIMEText.py python/trunk/Lib/email/Message.py python/trunk/Lib/email/Parser.py python/trunk/Lib/email/Utils.py python/trunk/Lib/email/base64MIME.py python/trunk/Lib/email/quopriMIME.py Modified: python/trunk/Doc/lib/email-dir.py python/trunk/Doc/lib/email-mime.py python/trunk/Doc/lib/email-simple.py python/trunk/Doc/lib/email-unpack.py python/trunk/Doc/lib/email.tex python/trunk/Doc/lib/emailcharsets.tex python/trunk/Doc/lib/emailencoders.tex python/trunk/Doc/lib/emailexc.tex python/trunk/Doc/lib/emailgenerator.tex python/trunk/Doc/lib/emailheaders.tex python/trunk/Doc/lib/emailiter.tex python/trunk/Doc/lib/emailmessage.tex python/trunk/Doc/lib/emailmimebase.tex python/trunk/Doc/lib/emailparser.tex python/trunk/Doc/lib/emailutil.tex python/trunk/Doc/lib/mimelib.tex python/trunk/Lib/email/__init__.py python/trunk/Lib/email/_parseaddr.py python/trunk/Lib/email/test/data/msg_26.txt (props changed) python/trunk/Lib/email/test/data/msg_44.txt (props changed) python/trunk/Lib/email/test/test_email.py python/trunk/Lib/email/test/test_email_codecs.py python/trunk/Lib/test/test_pyclbr.py Log: Merge email package 4.0 from the sandbox, including documentation, test cases, and NEWS updates. Modified: python/trunk/Doc/lib/email-dir.py ============================================================================== --- python/trunk/Doc/lib/email-dir.py (original) +++ python/trunk/Doc/lib/email-dir.py Sat Mar 18 16:41:53 2006 @@ -1,83 +1,69 @@ #!/usr/bin/env python -"""Send the contents of a directory as a MIME message. +"""Send the contents of a directory as a MIME message.""" -Usage: dirmail [options] from to [to ...]* - -Options: - -h / --help - Print this message and exit. - - -d directory - --directory=directory - Mail the contents of the specified directory, otherwise use the - current directory. Only the regular files in the directory are sent, - and we don't recurse to subdirectories. - -`from' is the email address of the sender of the message. - -`to' is the email address of the recipient of the message, and multiple -recipients may be given. - -The email is sent by forwarding to your local SMTP server, which then does the -normal delivery process. Your local machine must be running an SMTP server. -""" - -import sys import os -import getopt +import sys import smtplib # For guessing MIME type based on file name extension import mimetypes -from email import Encoders -from email.Message import Message -from email.MIMEAudio import MIMEAudio -from email.MIMEBase import MIMEBase -from email.MIMEMultipart import MIMEMultipart -from email.MIMEImage import MIMEImage -from email.MIMEText import MIMEText - -COMMASPACE = ', ' +from optparse import OptionParser +from email import encoders +from email.message import Message +from email.mime.audio import MIMEAudio +from email.mime.base import MIMEBase +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText -def usage(code, msg=''): - print >> sys.stderr, __doc__ - if msg: - print >> sys.stderr, msg - sys.exit(code) +COMMASPACE = ', ' def main(): - try: - opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) - except getopt.error, msg: - usage(1, msg) - - dir = os.curdir - for opt, arg in opts: - if opt in ('-h', '--help'): - usage(0) - elif opt in ('-d', '--directory'): - dir = arg - - if len(args) < 2: - usage(1) + parser = OptionParser(usage="""\ +Send the contents of a directory as a MIME message. - sender = args[0] - recips = args[1:] +Usage: %prog [options] +Unless the -o option is given, the email is sent by forwarding to your local +SMTP server, which then does the normal delivery process. Your local machine +must be running an SMTP server. +""") + parser.add_option('-d', '--directory', + type='string', action='store', + help="""Mail the contents of the specified directory, + otherwise use the current directory. Only the regular + files in the directory are sent, and we don't recurse to + subdirectories.""") + parser.add_option('-o', '--output', + type='string', action='store', metavar='FILE', + help="""Print the composed message to FILE instead of + sending the message to the SMTP server.""") + parser.add_option('-s', '--sender', + type='string', action='store', metavar='SENDER', + help='The value of the From: header (required)') + parser.add_option('-r', '--recipient', + type='string', action='append', metavar='RECIPIENT', + default=[], dest='recipients', + help='A To: header value (at least one required)') + opts, args = parser.parse_args() + if not opts.sender or not opts.recipients: + parser.print_help() + sys.exit(1) + directory = opts.directory + if not directory: + directory = '.' # Create the enclosing (outer) message outer = MIMEMultipart() - outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir) - outer['To'] = COMMASPACE.join(recips) - outer['From'] = sender + outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory) + outer['To'] = COMMASPACE.join(opts.recipients) + outer['From'] = opts.sender outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' - # To guarantee the message ends with a newline - outer.epilogue = '' - for filename in os.listdir(dir): - path = os.path.join(dir, filename) + for filename in os.listdir(directory): + path = os.path.join(directory, filename) if not os.path.isfile(path): continue # Guess the content type based on the file's extension. Encoding @@ -108,16 +94,21 @@ msg.set_payload(fp.read()) fp.close() # Encode the payload using Base64 - Encoders.encode_base64(msg) + encoders.encode_base64(msg) # Set the filename parameter msg.add_header('Content-Disposition', 'attachment', filename=filename) outer.attach(msg) - - # Now send the message - s = smtplib.SMTP() - s.connect() - s.sendmail(sender, recips, outer.as_string()) - s.close() + # Now send or store the message + composed = outer.as_string() + if opts.output: + fp = open(opts.output, 'w') + fp.write(composed) + fp.close() + else: + s = smtplib.SMTP() + s.connect() + s.sendmail(opts.sender, opts.recipients, composed) + s.close() if __name__ == '__main__': Modified: python/trunk/Doc/lib/email-mime.py ============================================================================== --- python/trunk/Doc/lib/email-mime.py (original) +++ python/trunk/Doc/lib/email-mime.py Sat Mar 18 16:41:53 2006 @@ -2,8 +2,8 @@ import smtplib # Here are the email package modules we'll need -from email.MIMEImage import MIMEImage -from email.MIMEMultipart import MIMEMultipart +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart COMMASPACE = ', ' @@ -15,8 +15,6 @@ msg['From'] = me msg['To'] = COMMASPACE.join(family) msg.preamble = 'Our family reunion' -# Guarantees the message ends in a newline -msg.epilogue = '' # Assume we know that the image files are all in PNG format for file in pngfiles: Modified: python/trunk/Doc/lib/email-simple.py ============================================================================== --- python/trunk/Doc/lib/email-simple.py (original) +++ python/trunk/Doc/lib/email-simple.py Sat Mar 18 16:41:53 2006 @@ -2,7 +2,7 @@ import smtplib # Import the email modules we'll need -from email.MIMEText import MIMEText +from email.mime.text import MIMEText # Open a plain text file for reading. For this example, assume that # the text file contains only ASCII characters. Modified: python/trunk/Doc/lib/email-unpack.py ============================================================================== --- python/trunk/Doc/lib/email-unpack.py (original) +++ python/trunk/Doc/lib/email-unpack.py Sat Mar 18 16:41:53 2006 @@ -1,59 +1,44 @@ #!/usr/bin/env python -"""Unpack a MIME message into a directory of files. +"""Unpack a MIME message into a directory of files.""" -Usage: unpackmail [options] msgfile - -Options: - -h / --help - Print this message and exit. - - -d directory - --directory=directory - Unpack the MIME message into the named directory, which will be - created if it doesn't already exist. - -msgfile is the path to the file containing the MIME message. -""" - -import sys import os -import getopt +import sys +import email import errno import mimetypes -import email - -def usage(code, msg=''): - print >> sys.stderr, __doc__ - if msg: - print >> sys.stderr, msg - sys.exit(code) +from optparse import OptionParser def main(): - try: - opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'directory=']) - except getopt.error, msg: - usage(1, msg) - - dir = os.curdir - for opt, arg in opts: - if opt in ('-h', '--help'): - usage(0) - elif opt in ('-d', '--directory'): - dir = arg + parser = OptionParser(usage="""\ +Unpack a MIME message into a directory of files. + +Usage: %prog [options] msgfile +""") + parser.add_option('-d', '--directory', + type='string', action='store', + help="""Unpack the MIME message into the named + directory, which will be created if it doesn't already + exist.""") + opts, args = parser.parse_args() + if not opts.directory: + parser.print_help() + sys.exit(1) try: msgfile = args[0] except IndexError: - usage(1) + parser.print_help() + sys.exit(1) try: - os.mkdir(dir) + os.mkdir(opts.directory) except OSError, e: # Ignore directory exists error - if e.errno <> errno.EEXIST: raise + if e.errno <> errno.EEXIST: + raise fp = open(msgfile) msg = email.message_from_file(fp) @@ -74,8 +59,8 @@ ext = '.bin' filename = 'part-%03d%s' % (counter, ext) counter += 1 - fp = open(os.path.join(dir, filename), 'wb') - fp.write(part.get_payload(decode=1)) + fp = open(os.path.join(opts.directory, filename), 'wb') + fp.write(part.get_payload(decode=True)) fp.close() Modified: python/trunk/Doc/lib/email.tex ============================================================================== --- python/trunk/Doc/lib/email.tex (original) +++ python/trunk/Doc/lib/email.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2004 Python Software Foundation +% Copyright (C) 2001-2006 Python Software Foundation % Author: barry at python.org (Barry Warsaw) \section{\module{email} --- @@ -18,10 +18,10 @@ such as \refmodule{rfc822}, \refmodule{mimetools}, \refmodule{multifile}, and other non-standard packages such as \module{mimecntl}. It is specifically \emph{not} designed to do any -sending of email messages to SMTP (\rfc{2821}) servers; that is the -function of the \refmodule{smtplib} module. The \module{email} -package attempts to be as RFC-compliant as possible, supporting in -addition to \rfc{2822}, such MIME-related RFCs as +sending of email messages to SMTP (\rfc{2821}), NNTP, or other servers; those +are functions of modules such as \refmodule{smtplib} and \refmodule{nntplib}. +The \module{email} package attempts to be as RFC-compliant as possible, +supporting in addition to \rfc{2822}, such MIME-related RFCs as \rfc{2045}, \rfc{2046}, \rfc{2047}, and \rfc{2231}. The primary distinguishing feature of the \module{email} package is @@ -41,7 +41,7 @@ should be common in applications: an email message is read as flat text from a file or other source, the text is parsed to produce the object structure of the email message, this structure is manipulated, -and finally rendered back into flat text. +and finally, the object tree is rendered back into flat text. It is perfectly feasible to create the object structure out of whole cloth --- i.e. completely from scratch. From there, a similar @@ -56,6 +56,7 @@ \begin{seealso} \seemodule{smtplib}{SMTP protocol client} + \seemodule{nntplib}{NNTP protocol client} \end{seealso} \subsection{Representing an email message} @@ -88,22 +89,51 @@ \subsection{Iterators} \input{emailiter} -\subsection{Package History} +\subsection{Package History\label{email-pkg-history}} -Version 1 of the \module{email} package was bundled with Python -releases up to Python 2.2.1. Version 2 was developed for the Python -2.3 release, and backported to Python 2.2.2. It was also available as -a separate distutils-based package, and is compatible back to Python 2.1. +This table describes the release history of the email package, corresponding +to the version of Python that the package was released with. For purposes of +this document, when you see a note about change or added versions, these refer +to the Python version the change was made it, \emph{not} the email package +version. This table also describes the Python compatibility of each version +of the package. + +\begin{tableiii}{l|l|l}{constant}{email version}{distributed with}{compatible with} +\lineiii{1.x}{Python 2.2.0 to Python 2.2.1}{\emph{no longer supported}} +\lineiii{2.5}{Python 2.2.2+ and Python 2.3}{Python 2.1 to 2.5} +\lineiii{3.0}{Python 2.4}{Python 2.3 to 2.5} +\lineiii{4.0}{Python 2.5}{Python 2.3 to 2.5} +\end{tableiii} -\module{email} version 3.0 was released with Python 2.4 and as a separate -distutils-based package. It is compatible back to Python 2.3. +Here are the major differences between \module{email} verson 4 and version 3: -Here are the differences between \module{email} version 3 and version 2: +\begin{itemize} +\item All modules have been renamed according to \pep{8} standards. For + example, the version 3 module \module{email.Message} was renamed to + \module{email.message} in version 4. + +\item A new subpackage \module{email.mime} was added and all the version 3 + \module{email.MIME*} modules were renamed and situated into the + \module{email.mime} subpackage. For example, the version 3 module + \module{email.MIMEText} was renamed to \module{email.mime.text}. + + \emph{Note that the version 3 names will continue to work until Python + 2.6}. + +\item The \module{email.mime.application} module was added, which contains the + \class{MIMEApplication} class. + +\item Methods that were deprecated in version 3 have been removed. These + include \method{Generator.__call__()}, \method{Message.get_type()}, + \method{Message.get_main_type()}, \method{Message.get_subtype()}. +\end{itemize} + +Here are the major differences between \module{email} version 3 and version 2: \begin{itemize} \item The \class{FeedParser} class was introduced, and the \class{Parser} class was implemented in terms of the \class{FeedParser}. All parsing - there for is non-strict, and parsing will make a best effort never to + therefore is non-strict, and parsing will make a best effort never to raise an exception. Problems found while parsing messages are stored in the message's \var{defect} attribute. @@ -117,7 +147,7 @@ \method{Generator.__call__()}, \method{Message.get_type()}, \method{Message.get_main_type()}, \method{Message.get_subtype()}, and the \var{strict} argument to the \class{Parser} class. These are - expected to be removed in email 3.1. + expected to be removed in future versions. \item Support for Pythons earlier than 2.3 has been removed. \end{itemize} @@ -278,12 +308,12 @@ \item The method \method{getpayloadastext()} was removed. Similar functionality is supported by the \class{DecodedGenerator} class in the - \refmodule{email.Generator} module. + \refmodule{email.generator} module. \item The method \method{getbodyastext()} was removed. You can get similar functionality by creating an iterator with \function{typed_subpart_iterator()} in the - \refmodule{email.Iterators} module. + \refmodule{email.iterators} module. \end{itemize} The \class{Parser} class has no differences in its public interface. @@ -295,7 +325,7 @@ in \rfc{1894}.}. The \class{Generator} class has no differences in its public -interface. There is a new class in the \refmodule{email.Generator} +interface. There is a new class in the \refmodule{email.generator} module though, called \class{DecodedGenerator} which provides most of the functionality previously available in the \method{Message.getpayloadastext()} method. @@ -329,11 +359,11 @@ \module{mimelib} provided some utility functions in its \module{address} and \module{date} modules. All of these functions -have been moved to the \refmodule{email.Utils} module. +have been moved to the \refmodule{email.utils} module. The \code{MsgReader} class/module has been removed. Its functionality is most closely supported in the \function{body_line_iterator()} -function in the \refmodule{email.Iterators} module. +function in the \refmodule{email.iterators} module. \subsection{Examples} Modified: python/trunk/Doc/lib/emailcharsets.tex ============================================================================== --- python/trunk/Doc/lib/emailcharsets.tex (original) +++ python/trunk/Doc/lib/emailcharsets.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -\declaremodule{standard}{email.Charset} +\declaremodule{standard}{email.charset} \modulesynopsis{Character Sets} This module provides a class \class{Charset} for representing @@ -7,6 +7,8 @@ manipulating this registry. Instances of \class{Charset} are used in several other modules within the \module{email} package. +Import this class from the \module{email.charset} module. + \versionadded{2.2.2} \begin{classdesc}{Charset}{\optional{input_charset}} @@ -153,7 +155,7 @@ for multibyte character sets, which have line length issues (multibyte characters must be split on a character, not a byte boundary); use the higher-level \class{Header} class to deal with these issues (see -\refmodule{email.Header}). \var{convert} defaults to \code{False}. +\refmodule{email.header}). \var{convert} defaults to \code{False}. The type of encoding (base64 or quoted-printable) will be based on the \var{header_encoding} attribute. @@ -188,7 +190,7 @@ This method allows you to compare two \class{Charset} instances for inequality. \end{methoddesc} -The \module{email.Charset} module also provides the following +The \module{email.charset} module also provides the following functions for adding new entries to the global character set, alias, and codec registries: Modified: python/trunk/Doc/lib/emailencoders.tex ============================================================================== --- python/trunk/Doc/lib/emailencoders.tex (original) +++ python/trunk/Doc/lib/emailencoders.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -\declaremodule{standard}{email.Encoders} +\declaremodule{standard}{email.encoders} \modulesynopsis{Encoders for email message payloads.} When creating \class{Message} objects from scratch, you often need to @@ -7,7 +7,7 @@ type messages containing binary data. The \module{email} package provides some convenient encodings in its -\module{Encoders} module. These encoders are actually used by the +\module{encoders} module. These encoders are actually used by the \class{MIMEAudio} and \class{MIMEImage} class constructors to provide default encodings. All encoder functions take exactly one argument, the message object to encode. They usually extract the payload, encode it, and reset the Modified: python/trunk/Doc/lib/emailexc.tex ============================================================================== --- python/trunk/Doc/lib/emailexc.tex (original) +++ python/trunk/Doc/lib/emailexc.tex Sat Mar 18 16:41:53 2006 @@ -1,8 +1,8 @@ -\declaremodule{standard}{email.Errors} +\declaremodule{standard}{email.errors} \modulesynopsis{The exception classes used by the email package.} The following exception classes are defined in the -\module{email.Errors} module: +\module{email.errors} module: \begin{excclassdesc}{MessageError}{} This is the base class for all exceptions that the \module{email} @@ -59,7 +59,7 @@ \mimetype{multipart/alternative} had a malformed header, that nested message object would have a defect, but the containing messages would not. -All defect classes are subclassed from \class{email.Errors.MessageDefect}, but +All defect classes are subclassed from \class{email.errors.MessageDefect}, but this class is \emph{not} an exception! \versionadded[All the defect classes were added]{2.4} Modified: python/trunk/Doc/lib/emailgenerator.tex ============================================================================== --- python/trunk/Doc/lib/emailgenerator.tex (original) +++ python/trunk/Doc/lib/emailgenerator.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -\declaremodule{standard}{email.Generator} +\declaremodule{standard}{email.generator} \modulesynopsis{Generate flat text email messages from a message structure.} One of the most common tasks is to generate the flat text of the email @@ -8,7 +8,7 @@ console. Taking a message object structure and producing a flat text document is the job of the \class{Generator} class. -Again, as with the \refmodule{email.Parser} module, you aren't limited +Again, as with the \refmodule{email.parser} module, you aren't limited to the functionality of the bundled generator; you could write one from scratch yourself. However the bundled generator knows how to generate most email in a standards-compliant way, should handle MIME @@ -17,7 +17,8 @@ \class{Parser} class, and back to flat text, is idempotent (the input is identical to the output). -Here are the public methods of the \class{Generator} class: +Here are the public methods of the \class{Generator} class, imported from the +\module{email.generator} module: \begin{classdesc}{Generator}{outfp\optional{, mangle_from_\optional{, maxheaderlen}}} @@ -40,7 +41,7 @@ Optional \var{maxheaderlen} specifies the longest length for a non-continued header. When a header line is longer than \var{maxheaderlen} (in characters, with tabs expanded to 8 spaces), -the header will be split as defined in the \module{email.Header} +the header will be split as defined in the \module{email.header.Header} class. Set to zero to disable header wrapping. The default is 78, as recommended (but not required) by \rfc{2822}. \end{classdesc} @@ -81,9 +82,9 @@ As a convenience, see the methods \method{Message.as_string()} and \code{str(aMessage)}, a.k.a. \method{Message.__str__()}, which simplify the generation of a formatted string representation of a -message object. For more detail, see \refmodule{email.Message}. +message object. For more detail, see \refmodule{email.message}. -The \module{email.Generator} module also provides a derived class, +The \module{email.generator} module also provides a derived class, called \class{DecodedGenerator} which is like the \class{Generator} base class, except that non-\mimetype{text} parts are substituted with a format string representing the part. @@ -128,13 +129,5 @@ \versionadded{2.2.2} \end{classdesc} -\subsubsection{Deprecated methods} - -The following methods are deprecated in \module{email} version 2. -They are documented here for completeness. - -\begin{methoddesc}[Generator]{__call__}{msg\optional{, unixfrom}} -This method is identical to the \method{flatten()} method. - -\deprecated{2.2.2}{Use the \method{flatten()} method instead.} -\end{methoddesc} +\versionchanged[The previously deprecated method \method{__call__()} was +removed]{2.5} Modified: python/trunk/Doc/lib/emailheaders.tex ============================================================================== --- python/trunk/Doc/lib/emailheaders.tex (original) +++ python/trunk/Doc/lib/emailheaders.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -\declaremodule{standard}{email.Header} +\declaremodule{standard}{email.header} \modulesynopsis{Representing non-ASCII headers} \rfc{2822} is the base standard that describes the format of email @@ -15,17 +15,18 @@ containing non-\ASCII{} characters into \rfc{2822}-compliant format. These RFCs include \rfc{2045}, \rfc{2046}, \rfc{2047}, and \rfc{2231}. The \module{email} package supports these standards in its -\module{email.Header} and \module{email.Charset} modules. +\module{email.header} and \module{email.charset} modules. If you want to include non-\ASCII{} characters in your email headers, say in the \mailheader{Subject} or \mailheader{To} fields, you should use the \class{Header} class and assign the field in the \class{Message} object to an instance of \class{Header} instead of -using a string for the header value. For example: +using a string for the header value. Import the \class{Header} class from the +\module{email.header} module. For example: \begin{verbatim} ->>> from email.Message import Message ->>> from email.Header import Header +>>> from email.message import Message +>>> from email.header import Header >>> msg = Message() >>> h = Header('p\xf6stal', 'iso-8859-1') >>> msg['Subject'] = h @@ -87,7 +88,7 @@ Append the string \var{s} to the MIME header. Optional \var{charset}, if given, should be a \class{Charset} instance -(see \refmodule{email.Charset}) or the name of a character set, which +(see \refmodule{email.charset}) or the name of a character set, which will be converted to a \class{Charset} instance. A value of \code{None} (the default) means that the \var{charset} given in the constructor is used. @@ -139,7 +140,7 @@ This method allows you to compare two \class{Header} instances for inequality. \end{methoddesc} -The \module{email.Header} module also provides the following +The \module{email.header} module also provides the following convenient functions. \begin{funcdesc}{decode_header}{header} @@ -155,7 +156,7 @@ Here's an example: \begin{verbatim} ->>> from email.Header import decode_header +>>> from email.header import decode_header >>> decode_header('=?iso-8859-1?q?p=F6stal?=') [('p\xf6stal', 'iso-8859-1')] \end{verbatim} Modified: python/trunk/Doc/lib/emailiter.tex ============================================================================== --- python/trunk/Doc/lib/emailiter.tex (original) +++ python/trunk/Doc/lib/emailiter.tex Sat Mar 18 16:41:53 2006 @@ -1,8 +1,8 @@ -\declaremodule{standard}{email.Iterators} +\declaremodule{standard}{email.iterators} \modulesynopsis{Iterate over a message object tree.} Iterating over a message object tree is fairly easy with the -\method{Message.walk()} method. The \module{email.Iterators} module +\method{Message.walk()} method. The \module{email.iterators} module provides some useful higher level iterations over message object trees. Modified: python/trunk/Doc/lib/emailmessage.tex ============================================================================== --- python/trunk/Doc/lib/emailmessage.tex (original) +++ python/trunk/Doc/lib/emailmessage.tex Sat Mar 18 16:41:53 2006 @@ -1,10 +1,11 @@ -\declaremodule{standard}{email.Message} +\declaremodule{standard}{email.message} \modulesynopsis{The base class representing email messages.} The central class in the \module{email} package is the -\class{Message} class; it is the base class for the \module{email} -object model. \class{Message} provides the core functionality for -setting and querying header fields, and for accessing message bodies. +\class{Message} class, imported from the \module{email.message} module. It is +the base class for the \module{email} object model. \class{Message} provides +the core functionality for setting and querying header fields, and for +accessing message bodies. Conceptually, a \class{Message} object consists of \emph{headers} and \emph{payloads}. Headers are \rfc{2822} style field names and @@ -45,7 +46,7 @@ \begin{verbatim} from cStringIO import StringIO -from email.Generator import Generator +from email.generator import Generator fp = StringIO() g = Generator(fp, mangle_from_=False, maxheaderlen=60) g.flatten(msg) @@ -119,7 +120,7 @@ \begin{methoddesc}[Message]{set_charset}{charset} Set the character set of the payload to \var{charset}, which can -either be a \class{Charset} instance (see \refmodule{email.Charset}), a +either be a \class{Charset} instance (see \refmodule{email.charset}), a string naming a character set, or \code{None}. If it is a string, it will be converted to a \class{Charset} instance. If \var{charset} is \code{None}, the @@ -128,8 +129,8 @@ \exception{TypeError}. The message will be assumed to be of type \mimetype{text/*} encoded with -\code{charset.input_charset}. It will be converted to -\code{charset.output_charset} +\var{charset.input_charset}. It will be converted to +\var{charset.output_charset} and encoded properly, if needed, when generating the plain text representation of the message. MIME headers (\mailheader{MIME-Version}, \mailheader{Content-Type}, @@ -513,6 +514,9 @@ \end{verbatim} \end{methoddesc} +\versionchanged[The previously deprecated methods \method{get_type()}, +\method{get_main_type()}, and \method{get_subtype()} were removed]{2.5} + \class{Message} objects can also optionally contain two instance attributes, which can be used when generating the plain text of a MIME message. @@ -532,7 +536,7 @@ is writing out the plain text representation of a MIME message, and it finds the message has a \var{preamble} attribute, it will write this text in the area between the headers and the first boundary. See -\refmodule{email.Parser} and \refmodule{email.Generator} for details. +\refmodule{email.parser} and \refmodule{email.generator} for details. Note that if the message object has no preamble, the \var{preamble} attribute will be \code{None}. @@ -543,58 +547,15 @@ attribute, except that it contains text that appears between the last boundary and the end of the message. -One note: when generating the flat text for a \mimetype{multipart} -message that has no \var{epilogue} (using the standard -\class{Generator} class), no newline is added after the closing -boundary line. If the message object has an \var{epilogue} and its -value does not start with a newline, a newline is printed after the -closing boundary. This seems a little clumsy, but it makes the most -practical sense. The upshot is that if you want to ensure that a -newline get printed after your closing \mimetype{multipart} boundary, -set the \var{epilogue} to the empty string. +\versionchanged[You do not need to set the epilogue to the empty string in +order for the \class{Generator} to print a newline at the end of the +file]{2.5} \end{datadesc} \begin{datadesc}{defects} The \var{defects} attribute contains a list of all the problems found when -parsing this message. See \refmodule{email.Errors} for a detailed description +parsing this message. See \refmodule{email.errors} for a detailed description of the possible parsing defects. \versionadded{2.4} \end{datadesc} - -\subsubsection{Deprecated methods} - -\versionchanged[The \method{add_payload()} method was removed; use the -\method{attach()} method instead]{2.4} - -The following methods are deprecated. They are documented here for -completeness. - -\begin{methoddesc}[Message]{get_type}{\optional{failobj}} -Return the message's content type, as a string of the form -\mimetype{maintype/subtype} as taken from the -\mailheader{Content-Type} header. -The returned string is coerced to lowercase. - -If there is no \mailheader{Content-Type} header in the message, -\var{failobj} is returned (defaults to \code{None}). - -\deprecated{2.2.2}{Use the \method{get_content_type()} method instead.} -\end{methoddesc} - -\begin{methoddesc}[Message]{get_main_type}{\optional{failobj}} -Return the message's \emph{main} content type. This essentially returns the -\var{maintype} part of the string returned by \method{get_type()}, with the -same semantics for \var{failobj}. - -\deprecated{2.2.2}{Use the \method{get_content_maintype()} method instead.} -\end{methoddesc} - -\begin{methoddesc}[Message]{get_subtype}{\optional{failobj}} -Return the message's sub-content type. This essentially returns the -\var{subtype} part of the string returned by \method{get_type()}, with the -same semantics for \var{failobj}. - -\deprecated{2.2.2}{Use the \method{get_content_subtype()} method instead.} -\end{methoddesc} - Modified: python/trunk/Doc/lib/emailmimebase.tex ============================================================================== --- python/trunk/Doc/lib/emailmimebase.tex (original) +++ python/trunk/Doc/lib/emailmimebase.tex Sat Mar 18 16:41:53 2006 @@ -1,3 +1,11 @@ +\declaremodule{standard}{email.mime} +\declaremodule{standard}{email.mime.base} +\declaremodule{standard}{email.mime.nonmultipart} +\declaremodule{standard}{email.mime.multipart} +\declaremodule{standard}{email.mime.audio} +\declaremodule{standard}{email.mime.image} +\declaremodule{standard}{email.mime.message} +\declaremodule{standard}{email.mime.text} Ordinarily, you get a message object structure by passing a file or some text to a parser, which parses the text and returns the root message object. However you can also build a complete message @@ -6,26 +14,16 @@ \class{Message} objects, move them around, etc. This makes a very convenient interface for slicing-and-dicing MIME messages. -You can create a new object structure by creating \class{Message} -instances, adding attachments and all the appropriate headers manually. -For MIME messages though, the \module{email} package provides some -convenient subclasses to make things easier. Each of these classes -should be imported from a module with the same name as the class, from -within the \module{email} package. E.g.: - -\begin{verbatim} -import email.MIMEImage.MIMEImage -\end{verbatim} - -or - -\begin{verbatim} -from email.MIMEText import MIMEText -\end{verbatim} +You can create a new object structure by creating \class{Message} instances, +adding attachments and all the appropriate headers manually. For MIME +messages though, the \module{email} package provides some convenient +subclasses to make things easier. Here are the classes: \begin{classdesc}{MIMEBase}{_maintype, _subtype, **_params} +Module: \module{email.mime.base} + This is the base class for all the MIME-specific subclasses of \class{Message}. Ordinarily you won't create instances specifically of \class{MIMEBase}, although you could. \class{MIMEBase} is provided @@ -45,6 +43,8 @@ \end{classdesc} \begin{classdesc}{MIMENonMultipart}{} +Module: \module{email.mime.nonmultipart} + A subclass of \class{MIMEBase}, this is an intermediate base class for MIME messages that are not \mimetype{multipart}. The primary purpose of this class is to prevent the use of the \method{attach()} method, @@ -57,6 +57,7 @@ \begin{classdesc}{MIMEMultipart}{\optional{subtype\optional{, boundary\optional{, _subparts\optional{, _params}}}}} +Module: \module{email.mime.multipart} A subclass of \class{MIMEBase}, this is an intermediate base class for MIME messages that are \mimetype{multipart}. Optional \var{_subtype} @@ -80,8 +81,31 @@ \versionadded{2.2.2} \end{classdesc} +\begin{classdesc}{MIMEApplication}{_data\optional{, _subtype\optional{, + _encoder\optional{, **_params}}}} +Module: \module{email.mime.application} + +A subclass of \class{MIMENonMultipart}, the \class{MIMEApplication} class is +used to represent MIME message objects of major type \mimetype{application}. +\var{_data} is a string containing the raw byte data. Optional \var{_subtype} +specifies the MIME subtype and defaults to \mimetype{octet-stream}. + +Optional \var{_encoder} is a callable (i.e. function) which will +perform the actual encoding of the data for transport. This +callable takes one argument, which is the \class{MIMEApplication} instance. +It should use \method{get_payload()} and \method{set_payload()} to +change the payload to encoded form. It should also add any +\mailheader{Content-Transfer-Encoding} or other headers to the message +object as necessary. The default encoding is base64. See the +\refmodule{email.encoders} module for a list of the built-in encoders. + +\var{_params} are passed straight through to the base class constructor. +\versionadded{2.5} +\end{classdesc} + \begin{classdesc}{MIMEAudio}{_audiodata\optional{, _subtype\optional{, _encoder\optional{, **_params}}}} +Module: \module{email.mime.audio} A subclass of \class{MIMENonMultipart}, the \class{MIMEAudio} class is used to create MIME message objects of major type \mimetype{audio}. @@ -100,13 +124,14 @@ change the payload to encoded form. It should also add any \mailheader{Content-Transfer-Encoding} or other headers to the message object as necessary. The default encoding is base64. See the -\refmodule{email.Encoders} module for a list of the built-in encoders. +\refmodule{email.encoders} module for a list of the built-in encoders. \var{_params} are passed straight through to the base class constructor. \end{classdesc} \begin{classdesc}{MIMEImage}{_imagedata\optional{, _subtype\optional{, _encoder\optional{, **_params}}}} +Module: \module{email.mime.image} A subclass of \class{MIMENonMultipart}, the \class{MIMEImage} class is used to create MIME message objects of major type \mimetype{image}. @@ -125,13 +150,15 @@ change the payload to encoded form. It should also add any \mailheader{Content-Transfer-Encoding} or other headers to the message object as necessary. The default encoding is base64. See the -\refmodule{email.Encoders} module for a list of the built-in encoders. +\refmodule{email.encoders} module for a list of the built-in encoders. \var{_params} are passed straight through to the \class{MIMEBase} constructor. \end{classdesc} \begin{classdesc}{MIMEMessage}{_msg\optional{, _subtype}} +Module: \module{email.mime.message} + A subclass of \class{MIMENonMultipart}, the \class{MIMEMessage} class is used to create MIME objects of main type \mimetype{message}. \var{_msg} is used as the payload, and must be an instance of class @@ -143,6 +170,8 @@ \end{classdesc} \begin{classdesc}{MIMEText}{_text\optional{, _subtype\optional{, _charset}}} +Module: \module{email.mime.text} + A subclass of \class{MIMENonMultipart}, the \class{MIMEText} class is used to create MIME objects of major type \mimetype{text}. \var{_text} is the string for the payload. \var{_subtype} is the Modified: python/trunk/Doc/lib/emailparser.tex ============================================================================== --- python/trunk/Doc/lib/emailparser.tex (original) +++ python/trunk/Doc/lib/emailparser.tex Sat Mar 18 16:41:53 2006 @@ -1,4 +1,4 @@ -\declaremodule{standard}{email.Parser} +\declaremodule{standard}{email.parser} \modulesynopsis{Parse flat text email messages to produce a message object structure.} @@ -41,9 +41,10 @@ \versionadded{2.4} -The \class{FeedParser} provides an API that is conducive to incremental -parsing of email messages, such as would be necessary when reading the text of -an email message from a source that can block (e.g. a socket). The +The \class{FeedParser}, imported from the \module{email.feedparser} module, +provides an API that is conducive to incremental parsing of email messages, +such as would be necessary when reading the text of an email message from a +source that can block (e.g. a socket). The \class{FeedParser} can of course be used to parse an email message fully contained in a string or a file, but the classic \class{Parser} API may be more convenient for such use cases. The semantics and results of the two @@ -56,14 +57,14 @@ job of parsing non-compliant messages, providing information about how a message was deemed broken. It will populate a message object's \var{defects} attribute with a list of any problems it found in a message. See the -\refmodule{email.Errors} module for the list of defects that it can find. +\refmodule{email.errors} module for the list of defects that it can find. Here is the API for the \class{FeedParser}: \begin{classdesc}{FeedParser}{\optional{_factory}} Create a \class{FeedParser} instance. Optional \var{_factory} is a no-argument callable that will be called whenever a new message object is -needed. It defaults to the \class{email.Message.Message} class. +needed. It defaults to the \class{email.message.Message} class. \end{classdesc} \begin{methoddesc}[FeedParser]{feed}{data} @@ -82,21 +83,22 @@ \subsubsection{Parser class API} -The \class{Parser} provides an API that can be used to parse a message when -the complete contents of the message are available in a string or file. The -\module{email.Parser} module also provides a second class, called +The \class{Parser} class, imported from the \module{email.parser} module, +provides an API that can be used to parse a message when the complete contents +of the message are available in a string or file. The +\module{email.parser} module also provides a second class, called \class{HeaderParser} which can be used if you're only interested in the headers of the message. \class{HeaderParser} can be much faster in these situations, since it does not attempt to parse the message body, instead setting the payload to the raw body as a string. \class{HeaderParser} has the same API as the \class{Parser} class. -\begin{classdesc}{Parser}{\optional{_class\optional{, strict}}} +\begin{classdesc}{Parser}{\optional{_class}} The constructor for the \class{Parser} class takes an optional argument \var{_class}. This must be a callable factory (such as a function or a class), and it is used whenever a sub-message object needs to be created. It defaults to \class{Message} (see -\refmodule{email.Message}). The factory will be called without +\refmodule{email.message}). The factory will be called without arguments. The optional \var{strict} flag is ignored. \deprecated{2.4}{Because the @@ -201,6 +203,6 @@ \method{is_multipart()} method may return \code{False}. If such messages were parsed with the \class{FeedParser}, they will have an instance of the \class{MultipartInvariantViolationDefect} class in their - \var{defects} attribute list. See \refmodule{email.Errors} for + \var{defects} attribute list. See \refmodule{email.errors} for details. \end{itemize} Modified: python/trunk/Doc/lib/emailutil.tex ============================================================================== --- python/trunk/Doc/lib/emailutil.tex (original) +++ python/trunk/Doc/lib/emailutil.tex Sat Mar 18 16:41:53 2006 @@ -1,7 +1,7 @@ -\declaremodule{standard}{email.Utils} +\declaremodule{standard}{email.utils} \modulesynopsis{Miscellaneous email package utilities.} -There are several useful utilities provided in the \module{email.Utils} +There are several useful utilities provided in the \module{email.utils} module: \begin{funcdesc}{quote}{str} @@ -38,7 +38,7 @@ simple example that gets all the recipients of a message: \begin{verbatim} -from email.Utils import getaddresses +from email.utils import getaddresses tos = msg.get_all('to', []) ccs = msg.get_all('cc', []) Modified: python/trunk/Doc/lib/mimelib.tex ============================================================================== --- python/trunk/Doc/lib/mimelib.tex (original) +++ python/trunk/Doc/lib/mimelib.tex Sat Mar 18 16:41:53 2006 @@ -12,9 +12,9 @@ \authoraddress{\email{barry at python.org}} \date{\today} -\release{3.0} % software release, not documentation +\release{4.0} % software release, not documentation \setreleaseinfo{} % empty for final release -\setshortversion{3.0} % major.minor only for software +\setshortversion{4.0} % major.minor only for software \begin{document} @@ -38,11 +38,11 @@ parse, generate, and modify email messages, conforming to all the relevant email and MIME related RFCs. -This document describes version 3.0 of the \module{email} package, which is -distributed with Python 2.4 and is available as a standalone distutils-based -package for use with Python 2.3. \module{email} 3.0 is not compatible with -Python versions earlier than 2.3. For more information about the -\module{email} package, including download links and mailing lists, see +This document describes version 4.0 of the \module{email} package, which is +distributed with Python 2.5 and is available as a standalone distutils-based +package for use with earlier Python versions. \module{email} 4.0 is not +compatible with Python versions earlier than 2.3. For more information about +the \module{email} package, including download links and mailing lists, see \ulink{Python's email SIG}{http://www.python.org/sigs/email-sig}. The documentation that follows was written for the Python project, so @@ -51,7 +51,8 @@ \begin{itemize} \item Deprecation and ``version added'' notes are relative to the - Python version a feature was added or deprecated. + Python version a feature was added or deprecated. See + the package history in section \ref{email-pkg-history} for details. \item If you're reading this documentation as part of the standalone \module{email} package, some of the internal links to Deleted: /python/trunk/Lib/email/Charset.py ============================================================================== --- /python/trunk/Lib/email/Charset.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,370 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Ben Gertzfield, Barry Warsaw -# Contact: email-sig at python.org - -import email.base64MIME -import email.quopriMIME -from email.Encoders import encode_7or8bit - - - -# Flags for types of header encodings -QP = 1 # Quoted-Printable -BASE64 = 2 # Base64 -SHORTEST = 3 # the shorter of QP and base64, but only for headers - -# In "=?charset?q?hello_world?=", the =?, ?q?, and ?= add up to 7 -MISC_LEN = 7 - -DEFAULT_CHARSET = 'us-ascii' - - - -# Defaults -CHARSETS = { - # input header enc body enc output conv - 'iso-8859-1': (QP, QP, None), - 'iso-8859-2': (QP, QP, None), - 'iso-8859-3': (QP, QP, None), - 'iso-8859-4': (QP, QP, None), - # iso-8859-5 is Cyrillic, and not especially used - # iso-8859-6 is Arabic, also not particularly used - # iso-8859-7 is Greek, QP will not make it readable - # iso-8859-8 is Hebrew, QP will not make it readable - 'iso-8859-9': (QP, QP, None), - 'iso-8859-10': (QP, QP, None), - # iso-8859-11 is Thai, QP will not make it readable - 'iso-8859-13': (QP, QP, None), - 'iso-8859-14': (QP, QP, None), - 'iso-8859-15': (QP, QP, None), - 'windows-1252':(QP, QP, None), - 'viscii': (QP, QP, None), - 'us-ascii': (None, None, None), - 'big5': (BASE64, BASE64, None), - 'gb2312': (BASE64, BASE64, None), - 'euc-jp': (BASE64, None, 'iso-2022-jp'), - 'shift_jis': (BASE64, None, 'iso-2022-jp'), - 'iso-2022-jp': (BASE64, None, None), - 'koi8-r': (BASE64, BASE64, None), - 'utf-8': (SHORTEST, BASE64, 'utf-8'), - # We're making this one up to represent raw unencoded 8-bit - '8bit': (None, BASE64, 'utf-8'), - } - -# Aliases for other commonly-used names for character sets. Map -# them to the real ones used in email. -ALIASES = { - 'latin_1': 'iso-8859-1', - 'latin-1': 'iso-8859-1', - 'latin_2': 'iso-8859-2', - 'latin-2': 'iso-8859-2', - 'latin_3': 'iso-8859-3', - 'latin-3': 'iso-8859-3', - 'latin_4': 'iso-8859-4', - 'latin-4': 'iso-8859-4', - 'latin_5': 'iso-8859-9', - 'latin-5': 'iso-8859-9', - 'latin_6': 'iso-8859-10', - 'latin-6': 'iso-8859-10', - 'latin_7': 'iso-8859-13', - 'latin-7': 'iso-8859-13', - 'latin_8': 'iso-8859-14', - 'latin-8': 'iso-8859-14', - 'latin_9': 'iso-8859-15', - 'latin-9': 'iso-8859-15', - 'cp949': 'ks_c_5601-1987', - 'euc_jp': 'euc-jp', - 'euc_kr': 'euc-kr', - 'ascii': 'us-ascii', - } - - -# Map charsets to their Unicode codec strings. -CODEC_MAP = { - 'gb2312': 'eucgb2312_cn', - 'big5': 'big5_tw', - # Hack: We don't want *any* conversion for stuff marked us-ascii, as all - # sorts of garbage might be sent to us in the guise of 7-bit us-ascii. - # Let that stuff pass through without conversion to/from Unicode. - 'us-ascii': None, - } - - - -# Convenience functions for extending the above mappings -def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): - """Add character set properties to the global registry. - - charset is the input character set, and must be the canonical name of a - character set. - - Optional header_enc and body_enc is either Charset.QP for - quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for - the shortest of qp or base64 encoding, or None for no encoding. SHORTEST - is only valid for header_enc. It describes how message headers and - message bodies in the input charset are to be encoded. Default is no - encoding. - - Optional output_charset is the character set that the output should be - in. Conversions will proceed from input charset, to Unicode, to the - output charset when the method Charset.convert() is called. The default - is to output in the same character set as the input. - - Both input_charset and output_charset must have Unicode codec entries in - the module's charset-to-codec mapping; use add_codec(charset, codecname) - to add codecs the module does not know about. See the codecs module's - documentation for more information. - """ - if body_enc == SHORTEST: - raise ValueError('SHORTEST not allowed for body_enc') - CHARSETS[charset] = (header_enc, body_enc, output_charset) - - -def add_alias(alias, canonical): - """Add a character set alias. - - alias is the alias name, e.g. latin-1 - canonical is the character set's canonical name, e.g. iso-8859-1 - """ - ALIASES[alias] = canonical - - -def add_codec(charset, codecname): - """Add a codec that map characters in the given charset to/from Unicode. - - charset is the canonical name of a character set. codecname is the name - of a Python codec, as appropriate for the second argument to the unicode() - built-in, or to the encode() method of a Unicode string. - """ - CODEC_MAP[charset] = codecname - - - -class Charset: - """Map character sets to their email properties. - - This class provides information about the requirements imposed on email - for a specific character set. It also provides convenience routines for - converting between character sets, given the availability of the - applicable codecs. Given a character set, it will do its best to provide - information on how to use that character set in an email in an - RFC-compliant way. - - Certain character sets must be encoded with quoted-printable or base64 - when used in email headers or bodies. Certain character sets must be - converted outright, and are not allowed in email. Instances of this - module expose the following information about a character set: - - input_charset: The initial character set specified. Common aliases - are converted to their `official' email names (e.g. latin_1 - is converted to iso-8859-1). Defaults to 7-bit us-ascii. - - header_encoding: If the character set must be encoded before it can be - used in an email header, this attribute will be set to - Charset.QP (for quoted-printable), Charset.BASE64 (for - base64 encoding), or Charset.SHORTEST for the shortest of - QP or BASE64 encoding. Otherwise, it will be None. - - body_encoding: Same as header_encoding, but describes the encoding for the - mail message's body, which indeed may be different than the - header encoding. Charset.SHORTEST is not allowed for - body_encoding. - - output_charset: Some character sets must be converted before the can be - used in email headers or bodies. If the input_charset is - one of them, this attribute will contain the name of the - charset output will be converted to. Otherwise, it will - be None. - - input_codec: The name of the Python codec used to convert the - input_charset to Unicode. If no conversion codec is - necessary, this attribute will be None. - - output_codec: The name of the Python codec used to convert Unicode - to the output_charset. If no conversion codec is necessary, - this attribute will have the same value as the input_codec. - """ - def __init__(self, input_charset=DEFAULT_CHARSET): - # RFC 2046, $4.1.2 says charsets are not case sensitive. We coerce to - # unicode because its .lower() is locale insensitive. - input_charset = unicode(input_charset, 'ascii').lower() - # Set the input charset after filtering through the aliases - self.input_charset = ALIASES.get(input_charset, input_charset) - # We can try to guess which encoding and conversion to use by the - # charset_map dictionary. Try that first, but let the user override - # it. - henc, benc, conv = CHARSETS.get(self.input_charset, - (SHORTEST, BASE64, None)) - if not conv: - conv = self.input_charset - # Set the attributes, allowing the arguments to override the default. - self.header_encoding = henc - self.body_encoding = benc - self.output_charset = ALIASES.get(conv, conv) - # Now set the codecs. If one isn't defined for input_charset, - # guess and try a Unicode codec with the same name as input_codec. - self.input_codec = CODEC_MAP.get(self.input_charset, - self.input_charset) - self.output_codec = CODEC_MAP.get(self.output_charset, - self.output_charset) - - def __str__(self): - return self.input_charset.lower() - - __repr__ = __str__ - - def __eq__(self, other): - return str(self) == str(other).lower() - - def __ne__(self, other): - return not self.__eq__(other) - - def get_body_encoding(self): - """Return the content-transfer-encoding used for body encoding. - - This is either the string `quoted-printable' or `base64' depending on - the encoding used, or it is a function in which case you should call - the function with a single argument, the Message object being - encoded. The function should then set the Content-Transfer-Encoding - header itself to whatever is appropriate. - - Returns "quoted-printable" if self.body_encoding is QP. - Returns "base64" if self.body_encoding is BASE64. - Returns "7bit" otherwise. - """ - assert self.body_encoding <> SHORTEST - if self.body_encoding == QP: - return 'quoted-printable' - elif self.body_encoding == BASE64: - return 'base64' - else: - return encode_7or8bit - - def convert(self, s): - """Convert a string from the input_codec to the output_codec.""" - if self.input_codec <> self.output_codec: - return unicode(s, self.input_codec).encode(self.output_codec) - else: - return s - - def to_splittable(self, s): - """Convert a possibly multibyte string to a safely splittable format. - - Uses the input_codec to try and convert the string to Unicode, so it - can be safely split on character boundaries (even for multibyte - characters). - - Returns the string as-is if it isn't known how to convert it to - Unicode with the input_charset. - - Characters that could not be converted to Unicode will be replaced - with the Unicode replacement character U+FFFD. - """ - if isinstance(s, unicode) or self.input_codec is None: - return s - try: - return unicode(s, self.input_codec, 'replace') - except LookupError: - # Input codec not installed on system, so return the original - # string unchanged. - return s - - def from_splittable(self, ustr, to_output=True): - """Convert a splittable string back into an encoded string. - - Uses the proper codec to try and convert the string from Unicode back - into an encoded format. Return the string as-is if it is not Unicode, - or if it could not be converted from Unicode. - - Characters that could not be converted from Unicode will be replaced - with an appropriate character (usually '?'). - - If to_output is True (the default), uses output_codec to convert to an - encoded format. If to_output is False, uses input_codec. - """ - if to_output: - codec = self.output_codec - else: - codec = self.input_codec - if not isinstance(ustr, unicode) or codec is None: - return ustr - try: - return ustr.encode(codec, 'replace') - except LookupError: - # Output codec not installed - return ustr - - def get_output_charset(self): - """Return the output character set. - - This is self.output_charset if that is not None, otherwise it is - self.input_charset. - """ - return self.output_charset or self.input_charset - - def encoded_header_len(self, s): - """Return the length of the encoded header string.""" - cset = self.get_output_charset() - # The len(s) of a 7bit encoding is len(s) - if self.header_encoding == BASE64: - return email.base64MIME.base64_len(s) + len(cset) + MISC_LEN - elif self.header_encoding == QP: - return email.quopriMIME.header_quopri_len(s) + len(cset) + MISC_LEN - elif self.header_encoding == SHORTEST: - lenb64 = email.base64MIME.base64_len(s) - lenqp = email.quopriMIME.header_quopri_len(s) - return min(lenb64, lenqp) + len(cset) + MISC_LEN - else: - return len(s) - - def header_encode(self, s, convert=False): - """Header-encode a string, optionally converting it to output_charset. - - If convert is True, the string will be converted from the input - charset to the output charset automatically. This is not useful for - multibyte character sets, which have line length issues (multibyte - characters must be split on a character, not a byte boundary); use the - high-level Header class to deal with these issues. convert defaults - to False. - - The type of encoding (base64 or quoted-printable) will be based on - self.header_encoding. - """ - cset = self.get_output_charset() - if convert: - s = self.convert(s) - # 7bit/8bit encodings return the string unchanged (modulo conversions) - if self.header_encoding == BASE64: - return email.base64MIME.header_encode(s, cset) - elif self.header_encoding == QP: - return email.quopriMIME.header_encode(s, cset, maxlinelen=None) - elif self.header_encoding == SHORTEST: - lenb64 = email.base64MIME.base64_len(s) - lenqp = email.quopriMIME.header_quopri_len(s) - if lenb64 < lenqp: - return email.base64MIME.header_encode(s, cset) - else: - return email.quopriMIME.header_encode(s, cset, maxlinelen=None) - else: - return s - - def body_encode(self, s, convert=True): - """Body-encode a string and convert it to output_charset. - - If convert is True (the default), the string will be converted from - the input charset to output charset automatically. Unlike - header_encode(), there are no issues with byte boundaries and - multibyte charsets in email bodies, so this is usually pretty safe. - - The type of encoding (base64 or quoted-printable) will be based on - self.body_encoding. - """ - if convert: - s = self.convert(s) - # 7bit/8bit encodings return the string unchanged (module conversions) - if self.body_encoding is BASE64: - return email.base64MIME.body_encode(s) - elif self.body_encoding is QP: - return email.quopriMIME.body_encode(s) - else: - return s Deleted: /python/trunk/Lib/email/Encoders.py ============================================================================== --- /python/trunk/Lib/email/Encoders.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,78 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Encodings and related functions.""" - -import base64 -from quopri import encodestring as _encodestring - -def _qencode(s): - enc = _encodestring(s, quotetabs=True) - # Must encode spaces, which quopri.encodestring() doesn't do - return enc.replace(' ', '=20') - - -def _bencode(s): - # We can't quite use base64.encodestring() since it tacks on a "courtesy - # newline". Blech! - if not s: - return s - hasnewline = (s[-1] == '\n') - value = base64.encodestring(s) - if not hasnewline and value[-1] == '\n': - return value[:-1] - return value - - - -def encode_base64(msg): - """Encode the message's payload in Base64. - - Also, add an appropriate Content-Transfer-Encoding header. - """ - orig = msg.get_payload() - encdata = _bencode(orig) - msg.set_payload(encdata) - msg['Content-Transfer-Encoding'] = 'base64' - - - -def encode_quopri(msg): - """Encode the message's payload in quoted-printable. - - Also, add an appropriate Content-Transfer-Encoding header. - """ - orig = msg.get_payload() - encdata = _qencode(orig) - msg.set_payload(encdata) - msg['Content-Transfer-Encoding'] = 'quoted-printable' - - - -def encode_7or8bit(msg): - """Set the Content-Transfer-Encoding header to 7bit or 8bit.""" - orig = msg.get_payload() - if orig is None: - # There's no payload. For backwards compatibility we use 7bit - msg['Content-Transfer-Encoding'] = '7bit' - return - # We play a trick to make this go fast. If encoding to ASCII succeeds, we - # know the data must be 7bit, otherwise treat it as 8bit. - try: - orig.encode('ascii') - except UnicodeError: - # iso-2022-* is non-ASCII but still 7-bit - charset = msg.get_charset() - output_cset = charset and charset.output_charset - if output_cset and output_cset.lower().startswith('iso-2202-'): - msg['Content-Transfer-Encoding'] = '7bit' - else: - msg['Content-Transfer-Encoding'] = '8bit' - else: - msg['Content-Transfer-Encoding'] = '7bit' - - - -def encode_noop(msg): - """Do nothing.""" Deleted: /python/trunk/Lib/email/Errors.py ============================================================================== --- /python/trunk/Lib/email/Errors.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,53 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""email package exception classes.""" - - - -class MessageError(Exception): - """Base class for errors in the email package.""" - - -class MessageParseError(MessageError): - """Base class for message parsing errors.""" - - -class HeaderParseError(MessageParseError): - """Error while parsing headers.""" - - -class BoundaryError(MessageParseError): - """Couldn't find terminating boundary.""" - - -class MultipartConversionError(MessageError, TypeError): - """Conversion to a multipart is prohibited.""" - - - -# These are parsing defects which the parser was able to work around. -class MessageDefect: - """Base class for a message defect.""" - - def __init__(self, line=None): - self.line = line - -class NoBoundaryInMultipartDefect(MessageDefect): - """A message claimed to be a multipart but had no boundary parameter.""" - -class StartBoundaryNotFoundDefect(MessageDefect): - """The claimed start boundary was never found.""" - -class FirstHeaderLineIsContinuationDefect(MessageDefect): - """A message had a continuation line as its first header line.""" - -class MisplacedEnvelopeHeaderDefect(MessageDefect): - """A 'Unix-from' header was found in the middle of a header block.""" - -class MalformedHeaderDefect(MessageDefect): - """Found a header that was missing a colon, or was otherwise malformed.""" - -class MultipartInvariantViolationDefect(MessageDefect): - """A message claimed to be a multipart but no subparts were found.""" Deleted: /python/trunk/Lib/email/FeedParser.py ============================================================================== --- /python/trunk/Lib/email/FeedParser.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,477 +0,0 @@ -# Copyright (C) 2004-2006 Python Software Foundation -# Authors: Baxter, Wouters and Warsaw -# Contact: email-sig at python.org - -"""FeedParser - An email feed parser. - -The feed parser implements an interface for incrementally parsing an email -message, line by line. This has advantages for certain applications, such as -those reading email messages off a socket. - -FeedParser.feed() is the primary interface for pushing new data into the -parser. It returns when there's nothing more it can do with the available -data. When you have no more data to push into the parser, call .close(). -This completes the parsing and returns the root message object. - -The other advantage of this parser is that it will never throw a parsing -exception. Instead, when it finds something unexpected, it adds a 'defect' to -the current message. Defects are just instances that live on the message -object's .defects attribute. -""" - -import re -from email import Errors -from email import Message - -NLCRE = re.compile('\r\n|\r|\n') -NLCRE_bol = re.compile('(\r\n|\r|\n)') -NLCRE_eol = re.compile('(\r\n|\r|\n)$') -NLCRE_crack = re.compile('(\r\n|\r|\n)') -# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character -# except controls, SP, and ":". -headerRE = re.compile(r'^(From |[\041-\071\073-\176]{1,}:|[\t ])') -EMPTYSTRING = '' -NL = '\n' - -NeedMoreData = object() - - - -class BufferedSubFile(object): - """A file-ish object that can have new data loaded into it. - - You can also push and pop line-matching predicates onto a stack. When the - current predicate matches the current line, a false EOF response - (i.e. empty string) is returned instead. This lets the parser adhere to a - simple abstraction -- it parses until EOF closes the current message. - """ - def __init__(self): - # The last partial line pushed into this object. - self._partial = '' - # The list of full, pushed lines, in reverse order - self._lines = [] - # The stack of false-EOF checking predicates. - self._eofstack = [] - # A flag indicating whether the file has been closed or not. - self._closed = False - - def push_eof_matcher(self, pred): - self._eofstack.append(pred) - - def pop_eof_matcher(self): - return self._eofstack.pop() - - def close(self): - # Don't forget any trailing partial line. - self._lines.append(self._partial) - self._partial = '' - self._closed = True - - def readline(self): - if not self._lines: - if self._closed: - return '' - return NeedMoreData - # Pop the line off the stack and see if it matches the current - # false-EOF predicate. - line = self._lines.pop() - # RFC 2046, section 5.1.2 requires us to recognize outer level - # boundaries at any level of inner nesting. Do this, but be sure it's - # in the order of most to least nested. - for ateof in self._eofstack[::-1]: - if ateof(line): - # We're at the false EOF. But push the last line back first. - self._lines.append(line) - return '' - return line - - def unreadline(self, line): - # Let the consumer push a line back into the buffer. - assert line is not NeedMoreData - self._lines.append(line) - - def push(self, data): - """Push some new data into this object.""" - # Handle any previous leftovers - data, self._partial = self._partial + data, '' - # Crack into lines, but preserve the newlines on the end of each - parts = NLCRE_crack.split(data) - # The *ahem* interesting behaviour of re.split when supplied grouping - # parentheses is that the last element of the resulting list is the - # data after the final RE. In the case of a NL/CR terminated string, - # this is the empty string. - self._partial = parts.pop() - # parts is a list of strings, alternating between the line contents - # and the eol character(s). Gather up a list of lines after - # re-attaching the newlines. - lines = [] - for i in range(len(parts) // 2): - lines.append(parts[i*2] + parts[i*2+1]) - self.pushlines(lines) - - def pushlines(self, lines): - # Reverse and insert at the front of the lines. - self._lines[:0] = lines[::-1] - - def is_closed(self): - return self._closed - - def __iter__(self): - return self - - def next(self): - line = self.readline() - if line == '': - raise StopIteration - return line - - - -class FeedParser: - """A feed-style parser of email.""" - - def __init__(self, _factory=Message.Message): - """_factory is called with no arguments to create a new message obj""" - self._factory = _factory - self._input = BufferedSubFile() - self._msgstack = [] - self._parse = self._parsegen().next - self._cur = None - self._last = None - self._headersonly = False - - # Non-public interface for supporting Parser's headersonly flag - def _set_headersonly(self): - self._headersonly = True - - def feed(self, data): - """Push more data into the parser.""" - self._input.push(data) - self._call_parse() - - def _call_parse(self): - try: - self._parse() - except StopIteration: - pass - - def close(self): - """Parse all remaining data and return the root message object.""" - self._input.close() - self._call_parse() - root = self._pop_message() - assert not self._msgstack - # Look for final set of defects - if root.get_content_maintype() == 'multipart' \ - and not root.is_multipart(): - root.defects.append(Errors.MultipartInvariantViolationDefect()) - return root - - def _new_message(self): - msg = self._factory() - if self._cur and self._cur.get_content_type() == 'multipart/digest': - msg.set_default_type('message/rfc822') - if self._msgstack: - self._msgstack[-1].attach(msg) - self._msgstack.append(msg) - self._cur = msg - self._last = msg - - def _pop_message(self): - retval = self._msgstack.pop() - if self._msgstack: - self._cur = self._msgstack[-1] - else: - self._cur = None - return retval - - def _parsegen(self): - # Create a new message and start by parsing headers. - self._new_message() - headers = [] - # Collect the headers, searching for a line that doesn't match the RFC - # 2822 header or continuation pattern (including an empty line). - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - if not headerRE.match(line): - # If we saw the RFC defined header/body separator - # (i.e. newline), just throw it away. Otherwise the line is - # part of the body so push it back. - if not NLCRE.match(line): - self._input.unreadline(line) - break - headers.append(line) - # Done with the headers, so parse them and figure out what we're - # supposed to see in the body of the message. - self._parse_headers(headers) - # Headers-only parsing is a backwards compatibility hack, which was - # necessary in the older parser, which could throw errors. All - # remaining lines in the input are thrown into the message body. - if self._headersonly: - lines = [] - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - if line == '': - break - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - return - if self._cur.get_content_type() == 'message/delivery-status': - # message/delivery-status contains blocks of headers separated by - # a blank line. We'll represent each header block as a separate - # nested message object, but the processing is a bit different - # than standard message/* types because there is no body for the - # nested messages. A blank line separates the subparts. - while True: - self._input.push_eof_matcher(NLCRE.match) - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - msg = self._pop_message() - # We need to pop the EOF matcher in order to tell if we're at - # the end of the current file, not the end of the last block - # of message headers. - self._input.pop_eof_matcher() - # The input stream must be sitting at the newline or at the - # EOF. We want to see if we're at the end of this subpart, so - # first consume the blank line, then test the next line to see - # if we're at this subpart's EOF. - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - break - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - break - if line == '': - break - # Not at EOF so this is a line we're going to need. - self._input.unreadline(line) - return - if self._cur.get_content_maintype() == 'message': - # The message claims to be a message/* type, then what follows is - # another RFC 2822 message. - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - self._pop_message() - return - if self._cur.get_content_maintype() == 'multipart': - boundary = self._cur.get_boundary() - if boundary is None: - # The message /claims/ to be a multipart but it has not - # defined a boundary. That's a problem which we'll handle by - # reading everything until the EOF and marking the message as - # defective. - self._cur.defects.append(Errors.NoBoundaryInMultipartDefect()) - lines = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - return - # Create a line match predicate which matches the inter-part - # boundary as well as the end-of-multipart boundary. Don't push - # this onto the input stream until we've scanned past the - # preamble. - separator = '--' + boundary - boundaryre = re.compile( - '(?P' + re.escape(separator) + - r')(?P--)?(?P[ \t]*)(?P\r\n|\r|\n)?$') - capturing_preamble = True - preamble = [] - linesep = False - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - if line == '': - break - mo = boundaryre.match(line) - if mo: - # If we're looking at the end boundary, we're done with - # this multipart. If there was a newline at the end of - # the closing boundary, then we need to initialize the - # epilogue with the empty string (see below). - if mo.group('end'): - linesep = mo.group('linesep') - break - # We saw an inter-part boundary. Were we in the preamble? - if capturing_preamble: - if preamble: - # According to RFC 2046, the last newline belongs - # to the boundary. - lastline = preamble[-1] - eolmo = NLCRE_eol.search(lastline) - if eolmo: - preamble[-1] = lastline[:-len(eolmo.group(0))] - self._cur.preamble = EMPTYSTRING.join(preamble) - capturing_preamble = False - self._input.unreadline(line) - continue - # We saw a boundary separating two parts. Consume any - # multiple boundary lines that may be following. Our - # interpretation of RFC 2046 BNF grammar does not produce - # body parts within such double boundaries. - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - mo = boundaryre.match(line) - if not mo: - self._input.unreadline(line) - break - # Recurse to parse this subpart; the input stream points - # at the subpart's first line. - self._input.push_eof_matcher(boundaryre.match) - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - # Because of RFC 2046, the newline preceding the boundary - # separator actually belongs to the boundary, not the - # previous subpart's payload (or epilogue if the previous - # part is a multipart). - if self._last.get_content_maintype() == 'multipart': - epilogue = self._last.epilogue - if epilogue == '': - self._last.epilogue = None - elif epilogue is not None: - mo = NLCRE_eol.search(epilogue) - if mo: - end = len(mo.group(0)) - self._last.epilogue = epilogue[:-end] - else: - payload = self._last.get_payload() - if isinstance(payload, basestring): - mo = NLCRE_eol.search(payload) - if mo: - payload = payload[:-len(mo.group(0))] - self._last.set_payload(payload) - self._input.pop_eof_matcher() - self._pop_message() - # Set the multipart up for newline cleansing, which will - # happen if we're in a nested multipart. - self._last = self._cur - else: - # I think we must be in the preamble - assert capturing_preamble - preamble.append(line) - # We've seen either the EOF or the end boundary. If we're still - # capturing the preamble, we never saw the start boundary. Note - # that as a defect and store the captured text as the payload. - # Everything from here to the EOF is epilogue. - if capturing_preamble: - self._cur.defects.append(Errors.StartBoundaryNotFoundDefect()) - self._cur.set_payload(EMPTYSTRING.join(preamble)) - epilogue = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - self._cur.epilogue = EMPTYSTRING.join(epilogue) - return - # If the end boundary ended in a newline, we'll need to make sure - # the epilogue isn't None - if linesep: - epilogue = [''] - else: - epilogue = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - epilogue.append(line) - # Any CRLF at the front of the epilogue is not technically part of - # the epilogue. Also, watch out for an empty string epilogue, - # which means a single newline. - if epilogue: - firstline = epilogue[0] - bolmo = NLCRE_bol.match(firstline) - if bolmo: - epilogue[0] = firstline[len(bolmo.group(0)):] - self._cur.epilogue = EMPTYSTRING.join(epilogue) - return - # Otherwise, it's some non-multipart type, so the entire rest of the - # file contents becomes the payload. - lines = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - - def _parse_headers(self, lines): - # Passed a list of lines that make up the headers for the current msg - lastheader = '' - lastvalue = [] - for lineno, line in enumerate(lines): - # Check for continuation - if line[0] in ' \t': - if not lastheader: - # The first line of the headers was a continuation. This - # is illegal, so let's note the defect, store the illegal - # line, and ignore it for purposes of headers. - defect = Errors.FirstHeaderLineIsContinuationDefect(line) - self._cur.defects.append(defect) - continue - lastvalue.append(line) - continue - if lastheader: - # XXX reconsider the joining of folded lines - lhdr = EMPTYSTRING.join(lastvalue)[:-1].rstrip('\r\n') - self._cur[lastheader] = lhdr - lastheader, lastvalue = '', [] - # Check for envelope header, i.e. unix-from - if line.startswith('From '): - if lineno == 0: - # Strip off the trailing newline - mo = NLCRE_eol.search(line) - if mo: - line = line[:-len(mo.group(0))] - self._cur.set_unixfrom(line) - continue - elif lineno == len(lines) - 1: - # Something looking like a unix-from at the end - it's - # probably the first line of the body, so push back the - # line and stop. - self._input.unreadline(line) - return - else: - # Weirdly placed unix-from line. Note this as a defect - # and ignore it. - defect = Errors.MisplacedEnvelopeHeaderDefect(line) - self._cur.defects.append(defect) - continue - # Split the line on the colon separating field name from value. - i = line.find(':') - if i < 0: - defect = Errors.MalformedHeaderDefect(line) - self._cur.defects.append(defect) - continue - lastheader = line[:i] - lastvalue = [line[i+1:].lstrip()] - # Done with all the lines, so handle the last header. - if lastheader: - # XXX reconsider the joining of folded lines - self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip('\r\n') Deleted: /python/trunk/Lib/email/Generator.py ============================================================================== --- /python/trunk/Lib/email/Generator.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,352 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Classes to generate plain text from a message object tree.""" - -import re -import sys -import time -import random -import warnings -from cStringIO import StringIO - -from email.Header import Header - -UNDERSCORE = '_' -NL = '\n' - -fcre = re.compile(r'^From ', re.MULTILINE) - -def _is8bitstring(s): - if isinstance(s, str): - try: - unicode(s, 'us-ascii') - except UnicodeError: - return True - return False - - - -class Generator: - """Generates output from a Message object tree. - - This basic generator writes the message to the given file object as plain - text. - """ - # - # Public interface - # - - def __init__(self, outfp, mangle_from_=True, maxheaderlen=78): - """Create the generator for message flattening. - - outfp is the output file-like object for writing the message to. It - must have a write() method. - - Optional mangle_from_ is a flag that, when True (the default), escapes - From_ lines in the body of the message by putting a `>' in front of - them. - - Optional maxheaderlen specifies the longest length for a non-continued - header. When a header line is longer (in characters, with tabs - expanded to 8 spaces) than maxheaderlen, the header will split as - defined in the Header class. Set maxheaderlen to zero to disable - header wrapping. The default is 78, as recommended (but not required) - by RFC 2822. - """ - self._fp = outfp - self._mangle_from_ = mangle_from_ - self._maxheaderlen = maxheaderlen - - def write(self, s): - # Just delegate to the file object - self._fp.write(s) - - def flatten(self, msg, unixfrom=False): - """Print the message object tree rooted at msg to the output file - specified when the Generator instance was created. - - unixfrom is a flag that forces the printing of a Unix From_ delimiter - before the first object in the message tree. If the original message - has no From_ delimiter, a `standard' one is crafted. By default, this - is False to inhibit the printing of any From_ delimiter. - - Note that for subobjects, no From_ line is printed. - """ - if unixfrom: - ufrom = msg.get_unixfrom() - if not ufrom: - ufrom = 'From nobody ' + time.ctime(time.time()) - print >> self._fp, ufrom - self._write(msg) - - # For backwards compatibility, but this is slower - def __call__(self, msg, unixfrom=False): - warnings.warn('__call__() deprecated; use flatten()', - DeprecationWarning, 2) - self.flatten(msg, unixfrom) - - def clone(self, fp): - """Clone this generator with the exact same options.""" - return self.__class__(fp, self._mangle_from_, self._maxheaderlen) - - # - # Protected interface - undocumented ;/ - # - - def _write(self, msg): - # We can't write the headers yet because of the following scenario: - # say a multipart message includes the boundary string somewhere in - # its body. We'd have to calculate the new boundary /before/ we write - # the headers so that we can write the correct Content-Type: - # parameter. - # - # The way we do this, so as to make the _handle_*() methods simpler, - # is to cache any subpart writes into a StringIO. The we write the - # headers and the StringIO contents. That way, subpart handlers can - # Do The Right Thing, and can still modify the Content-Type: header if - # necessary. - oldfp = self._fp - try: - self._fp = sfp = StringIO() - self._dispatch(msg) - finally: - self._fp = oldfp - # Write the headers. First we see if the message object wants to - # handle that itself. If not, we'll do it generically. - meth = getattr(msg, '_write_headers', None) - if meth is None: - self._write_headers(msg) - else: - meth(self) - self._fp.write(sfp.getvalue()) - - def _dispatch(self, msg): - # Get the Content-Type: for the message, then try to dispatch to - # self._handle__(). If there's no handler for the - # full MIME type, then dispatch to self._handle_(). If - # that's missing too, then dispatch to self._writeBody(). - main = msg.get_content_maintype() - sub = msg.get_content_subtype() - specific = UNDERSCORE.join((main, sub)).replace('-', '_') - meth = getattr(self, '_handle_' + specific, None) - if meth is None: - generic = main.replace('-', '_') - meth = getattr(self, '_handle_' + generic, None) - if meth is None: - meth = self._writeBody - meth(msg) - - # - # Default handlers - # - - def _write_headers(self, msg): - for h, v in msg.items(): - print >> self._fp, '%s:' % h, - if self._maxheaderlen == 0: - # Explicit no-wrapping - print >> self._fp, v - elif isinstance(v, Header): - # Header instances know what to do - print >> self._fp, v.encode() - elif _is8bitstring(v): - # If we have raw 8bit data in a byte string, we have no idea - # what the encoding is. There is no safe way to split this - # string. If it's ascii-subset, then we could do a normal - # ascii split, but if it's multibyte then we could break the - # string. There's no way to know so the least harm seems to - # be to not split the string and risk it being too long. - print >> self._fp, v - else: - # Header's got lots of smarts, so use it. - print >> self._fp, Header( - v, maxlinelen=self._maxheaderlen, - header_name=h, continuation_ws='\t').encode() - # A blank line always separates headers from body - print >> self._fp - - # - # Handlers for writing types and subtypes - # - - def _handle_text(self, msg): - payload = msg.get_payload() - if payload is None: - return - if not isinstance(payload, basestring): - raise TypeError('string payload expected: %s' % type(payload)) - if self._mangle_from_: - payload = fcre.sub('>From ', payload) - self._fp.write(payload) - - # Default body handler - _writeBody = _handle_text - - def _handle_multipart(self, msg): - # The trick here is to write out each part separately, merge them all - # together, and then make sure that the boundary we've chosen isn't - # present in the payload. - msgtexts = [] - subparts = msg.get_payload() - if subparts is None: - subparts = [] - elif isinstance(subparts, basestring): - # e.g. a non-strict parse of a message with no starting boundary. - self._fp.write(subparts) - return - elif not isinstance(subparts, list): - # Scalar payload - subparts = [subparts] - for part in subparts: - s = StringIO() - g = self.clone(s) - g.flatten(part, unixfrom=False) - msgtexts.append(s.getvalue()) - # Now make sure the boundary we've selected doesn't appear in any of - # the message texts. - alltext = NL.join(msgtexts) - # BAW: What about boundaries that are wrapped in double-quotes? - boundary = msg.get_boundary(failobj=_make_boundary(alltext)) - # If we had to calculate a new boundary because the body text - # contained that string, set the new boundary. We don't do it - # unconditionally because, while set_boundary() preserves order, it - # doesn't preserve newlines/continuations in headers. This is no big - # deal in practice, but turns out to be inconvenient for the unittest - # suite. - if msg.get_boundary() <> boundary: - msg.set_boundary(boundary) - # If there's a preamble, write it out, with a trailing CRLF - if msg.preamble is not None: - print >> self._fp, msg.preamble - # dash-boundary transport-padding CRLF - print >> self._fp, '--' + boundary - # body-part - if msgtexts: - self._fp.write(msgtexts.pop(0)) - # *encapsulation - # --> delimiter transport-padding - # --> CRLF body-part - for body_part in msgtexts: - # delimiter transport-padding CRLF - print >> self._fp, '\n--' + boundary - # body-part - self._fp.write(body_part) - # close-delimiter transport-padding - self._fp.write('\n--' + boundary + '--') - if msg.epilogue is not None: - print >> self._fp - self._fp.write(msg.epilogue) - - def _handle_message_delivery_status(self, msg): - # We can't just write the headers directly to self's file object - # because this will leave an extra newline between the last header - # block and the boundary. Sigh. - blocks = [] - for part in msg.get_payload(): - s = StringIO() - g = self.clone(s) - g.flatten(part, unixfrom=False) - text = s.getvalue() - lines = text.split('\n') - # Strip off the unnecessary trailing empty line - if lines and lines[-1] == '': - blocks.append(NL.join(lines[:-1])) - else: - blocks.append(text) - # Now join all the blocks with an empty line. This has the lovely - # effect of separating each block with an empty line, but not adding - # an extra one after the last one. - self._fp.write(NL.join(blocks)) - - def _handle_message(self, msg): - s = StringIO() - g = self.clone(s) - # The payload of a message/rfc822 part should be a multipart sequence - # of length 1. The zeroth element of the list should be the Message - # object for the subpart. Extract that object, stringify it, and - # write it out. - g.flatten(msg.get_payload(0), unixfrom=False) - self._fp.write(s.getvalue()) - - - -_FMT = '[Non-text (%(type)s) part of message omitted, filename %(filename)s]' - -class DecodedGenerator(Generator): - """Generator a text representation of a message. - - Like the Generator base class, except that non-text parts are substituted - with a format string representing the part. - """ - def __init__(self, outfp, mangle_from_=True, maxheaderlen=78, fmt=None): - """Like Generator.__init__() except that an additional optional - argument is allowed. - - Walks through all subparts of a message. If the subpart is of main - type `text', then it prints the decoded payload of the subpart. - - Otherwise, fmt is a format string that is used instead of the message - payload. fmt is expanded with the following keywords (in - %(keyword)s format): - - type : Full MIME type of the non-text part - maintype : Main MIME type of the non-text part - subtype : Sub-MIME type of the non-text part - filename : Filename of the non-text part - description: Description associated with the non-text part - encoding : Content transfer encoding of the non-text part - - The default value for fmt is None, meaning - - [Non-text (%(type)s) part of message omitted, filename %(filename)s] - """ - Generator.__init__(self, outfp, mangle_from_, maxheaderlen) - if fmt is None: - self._fmt = _FMT - else: - self._fmt = fmt - - def _dispatch(self, msg): - for part in msg.walk(): - maintype = part.get_content_maintype() - if maintype == 'text': - print >> self, part.get_payload(decode=True) - elif maintype == 'multipart': - # Just skip this - pass - else: - print >> self, self._fmt % { - 'type' : part.get_content_type(), - 'maintype' : part.get_content_maintype(), - 'subtype' : part.get_content_subtype(), - 'filename' : part.get_filename('[no filename]'), - 'description': part.get('Content-Description', - '[no description]'), - 'encoding' : part.get('Content-Transfer-Encoding', - '[no encoding]'), - } - - - -# Helper -_width = len(repr(sys.maxint-1)) -_fmt = '%%0%dd' % _width - -def _make_boundary(text=None): - # Craft a random boundary. If text is given, ensure that the chosen - # boundary doesn't appear in the text. - token = random.randrange(sys.maxint) - boundary = ('=' * 15) + (_fmt % token) + '==' - if text is None: - return boundary - b = boundary - counter = 0 - while True: - cre = re.compile('^--' + re.escape(b) + '(--)?$', re.MULTILINE) - if not cre.search(text): - break - b = boundary + '.' + str(counter) - counter += 1 - return b Deleted: /python/trunk/Lib/email/Header.py ============================================================================== --- /python/trunk/Lib/email/Header.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,495 +0,0 @@ -# Copyright (C) 2002-2004 Python Software Foundation -# Author: Ben Gertzfield, Barry Warsaw -# Contact: email-sig at python.org - -"""Header encoding and decoding functionality.""" - -import re -import binascii - -import email.quopriMIME -import email.base64MIME -from email.Errors import HeaderParseError -from email.Charset import Charset - -NL = '\n' -SPACE = ' ' -USPACE = u' ' -SPACE8 = ' ' * 8 -UEMPTYSTRING = u'' - -MAXLINELEN = 76 - -USASCII = Charset('us-ascii') -UTF8 = Charset('utf-8') - -# Match encoded-word strings in the form =?charset?q?Hello_World?= -ecre = re.compile(r''' - =\? # literal =? - (?P[^?]*?) # non-greedy up to the next ? is the charset - \? # literal ? - (?P[qb]) # either a "q" or a "b", case insensitive - \? # literal ? - (?P.*?) # non-greedy up to the next ?= is the encoded string - \?= # literal ?= - ''', re.VERBOSE | re.IGNORECASE) - -# Field name regexp, including trailing colon, but not separating whitespace, -# according to RFC 2822. Character range is from tilde to exclamation mark. -# For use with .match() -fcre = re.compile(r'[\041-\176]+:$') - - - -# Helpers -_max_append = email.quopriMIME._max_append - - - -def decode_header(header): - """Decode a message header value without converting charset. - - Returns a list of (decoded_string, charset) pairs containing each of the - decoded parts of the header. Charset is None for non-encoded parts of the - header, otherwise a lower-case string containing the name of the character - set specified in the encoded string. - - An email.Errors.HeaderParseError may be raised when certain decoding error - occurs (e.g. a base64 decoding exception). - """ - # If no encoding, just return the header - header = str(header) - if not ecre.search(header): - return [(header, None)] - decoded = [] - dec = '' - for line in header.splitlines(): - # This line might not have an encoding in it - if not ecre.search(line): - decoded.append((line, None)) - continue - parts = ecre.split(line) - while parts: - unenc = parts.pop(0).strip() - if unenc: - # Should we continue a long line? - if decoded and decoded[-1][1] is None: - decoded[-1] = (decoded[-1][0] + SPACE + unenc, None) - else: - decoded.append((unenc, None)) - if parts: - charset, encoding = [s.lower() for s in parts[0:2]] - encoded = parts[2] - dec = None - if encoding == 'q': - dec = email.quopriMIME.header_decode(encoded) - elif encoding == 'b': - try: - dec = email.base64MIME.decode(encoded) - except binascii.Error: - # Turn this into a higher level exception. BAW: Right - # now we throw the lower level exception away but - # when/if we get exception chaining, we'll preserve it. - raise HeaderParseError - if dec is None: - dec = encoded - - if decoded and decoded[-1][1] == charset: - decoded[-1] = (decoded[-1][0] + dec, decoded[-1][1]) - else: - decoded.append((dec, charset)) - del parts[0:3] - return decoded - - - -def make_header(decoded_seq, maxlinelen=None, header_name=None, - continuation_ws=' '): - """Create a Header from a sequence of pairs as returned by decode_header() - - decode_header() takes a header value string and returns a sequence of - pairs of the format (decoded_string, charset) where charset is the string - name of the character set. - - This function takes one of those sequence of pairs and returns a Header - instance. Optional maxlinelen, header_name, and continuation_ws are as in - the Header constructor. - """ - h = Header(maxlinelen=maxlinelen, header_name=header_name, - continuation_ws=continuation_ws) - for s, charset in decoded_seq: - # None means us-ascii but we can simply pass it on to h.append() - if charset is not None and not isinstance(charset, Charset): - charset = Charset(charset) - h.append(s, charset) - return h - - - -class Header: - def __init__(self, s=None, charset=None, - maxlinelen=None, header_name=None, - continuation_ws=' ', errors='strict'): - """Create a MIME-compliant header that can contain many character sets. - - Optional s is the initial header value. If None, the initial header - value is not set. You can later append to the header with .append() - method calls. s may be a byte string or a Unicode string, but see the - .append() documentation for semantics. - - Optional charset serves two purposes: it has the same meaning as the - charset argument to the .append() method. It also sets the default - character set for all subsequent .append() calls that omit the charset - argument. If charset is not provided in the constructor, the us-ascii - charset is used both as s's initial charset and as the default for - subsequent .append() calls. - - The maximum line length can be specified explicit via maxlinelen. For - splitting the first line to a shorter value (to account for the field - header which isn't included in s, e.g. `Subject') pass in the name of - the field in header_name. The default maxlinelen is 76. - - continuation_ws must be RFC 2822 compliant folding whitespace (usually - either a space or a hard tab) which will be prepended to continuation - lines. - - errors is passed through to the .append() call. - """ - if charset is None: - charset = USASCII - if not isinstance(charset, Charset): - charset = Charset(charset) - self._charset = charset - self._continuation_ws = continuation_ws - cws_expanded_len = len(continuation_ws.replace('\t', SPACE8)) - # BAW: I believe `chunks' and `maxlinelen' should be non-public. - self._chunks = [] - if s is not None: - self.append(s, charset, errors) - if maxlinelen is None: - maxlinelen = MAXLINELEN - if header_name is None: - # We don't know anything about the field header so the first line - # is the same length as subsequent lines. - self._firstlinelen = maxlinelen - else: - # The first line should be shorter to take into account the field - # header. Also subtract off 2 extra for the colon and space. - self._firstlinelen = maxlinelen - len(header_name) - 2 - # Second and subsequent lines should subtract off the length in - # columns of the continuation whitespace prefix. - self._maxlinelen = maxlinelen - cws_expanded_len - - def __str__(self): - """A synonym for self.encode().""" - return self.encode() - - def __unicode__(self): - """Helper for the built-in unicode function.""" - uchunks = [] - lastcs = None - for s, charset in self._chunks: - # We must preserve spaces between encoded and non-encoded word - # boundaries, which means for us we need to add a space when we go - # from a charset to None/us-ascii, or from None/us-ascii to a - # charset. Only do this for the second and subsequent chunks. - nextcs = charset - if uchunks: - if lastcs not in (None, 'us-ascii'): - if nextcs in (None, 'us-ascii'): - uchunks.append(USPACE) - nextcs = None - elif nextcs not in (None, 'us-ascii'): - uchunks.append(USPACE) - lastcs = nextcs - uchunks.append(unicode(s, str(charset))) - return UEMPTYSTRING.join(uchunks) - - # Rich comparison operators for equality only. BAW: does it make sense to - # have or explicitly disable <, <=, >, >= operators? - def __eq__(self, other): - # other may be a Header or a string. Both are fine so coerce - # ourselves to a string, swap the args and do another comparison. - return other == self.encode() - - def __ne__(self, other): - return not self == other - - def append(self, s, charset=None, errors='strict'): - """Append a string to the MIME header. - - Optional charset, if given, should be a Charset instance or the name - of a character set (which will be converted to a Charset instance). A - value of None (the default) means that the charset given in the - constructor is used. - - s may be a byte string or a Unicode string. If it is a byte string - (i.e. isinstance(s, str) is true), then charset is the encoding of - that byte string, and a UnicodeError will be raised if the string - cannot be decoded with that charset. If s is a Unicode string, then - charset is a hint specifying the character set of the characters in - the string. In this case, when producing an RFC 2822 compliant header - using RFC 2047 rules, the Unicode string will be encoded using the - following charsets in order: us-ascii, the charset hint, utf-8. The - first character set not to provoke a UnicodeError is used. - - Optional `errors' is passed as the third argument to any unicode() or - ustr.encode() call. - """ - if charset is None: - charset = self._charset - elif not isinstance(charset, Charset): - charset = Charset(charset) - # If the charset is our faux 8bit charset, leave the string unchanged - if charset <> '8bit': - # We need to test that the string can be converted to unicode and - # back to a byte string, given the input and output codecs of the - # charset. - if isinstance(s, str): - # Possibly raise UnicodeError if the byte string can't be - # converted to a unicode with the input codec of the charset. - incodec = charset.input_codec or 'us-ascii' - ustr = unicode(s, incodec, errors) - # Now make sure that the unicode could be converted back to a - # byte string with the output codec, which may be different - # than the iput coded. Still, use the original byte string. - outcodec = charset.output_codec or 'us-ascii' - ustr.encode(outcodec, errors) - elif isinstance(s, unicode): - # Now we have to be sure the unicode string can be converted - # to a byte string with a reasonable output codec. We want to - # use the byte string in the chunk. - for charset in USASCII, charset, UTF8: - try: - outcodec = charset.output_codec or 'us-ascii' - s = s.encode(outcodec, errors) - break - except UnicodeError: - pass - else: - assert False, 'utf-8 conversion failed' - self._chunks.append((s, charset)) - - def _split(self, s, charset, maxlinelen, splitchars): - # Split up a header safely for use with encode_chunks. - splittable = charset.to_splittable(s) - encoded = charset.from_splittable(splittable, True) - elen = charset.encoded_header_len(encoded) - # If the line's encoded length first, just return it - if elen <= maxlinelen: - return [(encoded, charset)] - # If we have undetermined raw 8bit characters sitting in a byte - # string, we really don't know what the right thing to do is. We - # can't really split it because it might be multibyte data which we - # could break if we split it between pairs. The least harm seems to - # be to not split the header at all, but that means they could go out - # longer than maxlinelen. - if charset == '8bit': - return [(s, charset)] - # BAW: I'm not sure what the right test here is. What we're trying to - # do is be faithful to RFC 2822's recommendation that ($2.2.3): - # - # "Note: Though structured field bodies are defined in such a way that - # folding can take place between many of the lexical tokens (and even - # within some of the lexical tokens), folding SHOULD be limited to - # placing the CRLF at higher-level syntactic breaks." - # - # For now, I can only imagine doing this when the charset is us-ascii, - # although it's possible that other charsets may also benefit from the - # higher-level syntactic breaks. - elif charset == 'us-ascii': - return self._split_ascii(s, charset, maxlinelen, splitchars) - # BAW: should we use encoded? - elif elen == len(s): - # We can split on _maxlinelen boundaries because we know that the - # encoding won't change the size of the string - splitpnt = maxlinelen - first = charset.from_splittable(splittable[:splitpnt], False) - last = charset.from_splittable(splittable[splitpnt:], False) - else: - # Binary search for split point - first, last = _binsplit(splittable, charset, maxlinelen) - # first is of the proper length so just wrap it in the appropriate - # chrome. last must be recursively split. - fsplittable = charset.to_splittable(first) - fencoded = charset.from_splittable(fsplittable, True) - chunk = [(fencoded, charset)] - return chunk + self._split(last, charset, self._maxlinelen, splitchars) - - def _split_ascii(self, s, charset, firstlen, splitchars): - chunks = _split_ascii(s, firstlen, self._maxlinelen, - self._continuation_ws, splitchars) - return zip(chunks, [charset]*len(chunks)) - - def _encode_chunks(self, newchunks, maxlinelen): - # MIME-encode a header with many different charsets and/or encodings. - # - # Given a list of pairs (string, charset), return a MIME-encoded - # string suitable for use in a header field. Each pair may have - # different charsets and/or encodings, and the resulting header will - # accurately reflect each setting. - # - # Each encoding can be email.Utils.QP (quoted-printable, for - # ASCII-like character sets like iso-8859-1), email.Utils.BASE64 - # (Base64, for non-ASCII like character sets like KOI8-R and - # iso-2022-jp), or None (no encoding). - # - # Each pair will be represented on a separate line; the resulting - # string will be in the format: - # - # =?charset1?q?Mar=EDa_Gonz=E1lez_Alonso?=\n - # =?charset2?b?SvxyZ2VuIEL2aW5n?=" - chunks = [] - for header, charset in newchunks: - if not header: - continue - if charset is None or charset.header_encoding is None: - s = header - else: - s = charset.header_encode(header) - # Don't add more folding whitespace than necessary - if chunks and chunks[-1].endswith(' '): - extra = '' - else: - extra = ' ' - _max_append(chunks, s, maxlinelen, extra) - joiner = NL + self._continuation_ws - return joiner.join(chunks) - - def encode(self, splitchars=';, '): - """Encode a message header into an RFC-compliant format. - - There are many issues involved in converting a given string for use in - an email header. Only certain character sets are readable in most - email clients, and as header strings can only contain a subset of - 7-bit ASCII, care must be taken to properly convert and encode (with - Base64 or quoted-printable) header strings. In addition, there is a - 75-character length limit on any given encoded header field, so - line-wrapping must be performed, even with double-byte character sets. - - This method will do its best to convert the string to the correct - character set used in email, and encode and line wrap it safely with - the appropriate scheme for that character set. - - If the given charset is not known or an error occurs during - conversion, this function will return the header untouched. - - Optional splitchars is a string containing characters to split long - ASCII lines on, in rough support of RFC 2822's `highest level - syntactic breaks'. This doesn't affect RFC 2047 encoded lines. - """ - newchunks = [] - maxlinelen = self._firstlinelen - lastlen = 0 - for s, charset in self._chunks: - # The first bit of the next chunk should be just long enough to - # fill the next line. Don't forget the space separating the - # encoded words. - targetlen = maxlinelen - lastlen - 1 - if targetlen < charset.encoded_header_len(''): - # Stick it on the next line - targetlen = maxlinelen - newchunks += self._split(s, charset, targetlen, splitchars) - lastchunk, lastcharset = newchunks[-1] - lastlen = lastcharset.encoded_header_len(lastchunk) - return self._encode_chunks(newchunks, maxlinelen) - - - -def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars): - lines = [] - maxlen = firstlen - for line in s.splitlines(): - # Ignore any leading whitespace (i.e. continuation whitespace) already - # on the line, since we'll be adding our own. - line = line.lstrip() - if len(line) < maxlen: - lines.append(line) - maxlen = restlen - continue - # Attempt to split the line at the highest-level syntactic break - # possible. Note that we don't have a lot of smarts about field - # syntax; we just try to break on semi-colons, then commas, then - # whitespace. - for ch in splitchars: - if ch in line: - break - else: - # There's nothing useful to split the line on, not even spaces, so - # just append this line unchanged - lines.append(line) - maxlen = restlen - continue - # Now split the line on the character plus trailing whitespace - cre = re.compile(r'%s\s*' % ch) - if ch in ';,': - eol = ch - else: - eol = '' - joiner = eol + ' ' - joinlen = len(joiner) - wslen = len(continuation_ws.replace('\t', SPACE8)) - this = [] - linelen = 0 - for part in cre.split(line): - curlen = linelen + max(0, len(this)-1) * joinlen - partlen = len(part) - onfirstline = not lines - # We don't want to split after the field name, if we're on the - # first line and the field name is present in the header string. - if ch == ' ' and onfirstline and \ - len(this) == 1 and fcre.match(this[0]): - this.append(part) - linelen += partlen - elif curlen + partlen > maxlen: - if this: - lines.append(joiner.join(this) + eol) - # If this part is longer than maxlen and we aren't already - # splitting on whitespace, try to recursively split this line - # on whitespace. - if partlen > maxlen and ch <> ' ': - subl = _split_ascii(part, maxlen, restlen, - continuation_ws, ' ') - lines.extend(subl[:-1]) - this = [subl[-1]] - else: - this = [part] - linelen = wslen + len(this[-1]) - maxlen = restlen - else: - this.append(part) - linelen += partlen - # Put any left over parts on a line by themselves - if this: - lines.append(joiner.join(this)) - return lines - - - -def _binsplit(splittable, charset, maxlinelen): - i = 0 - j = len(splittable) - while i < j: - # Invariants: - # 1. splittable[:k] fits for all k <= i (note that we *assume*, - # at the start, that splittable[:0] fits). - # 2. splittable[:k] does not fit for any k > j (at the start, - # this means we shouldn't look at any k > len(splittable)). - # 3. We don't know about splittable[:k] for k in i+1..j. - # 4. We want to set i to the largest k that fits, with i <= k <= j. - # - m = (i+j+1) >> 1 # ceiling((i+j)/2); i < m <= j - chunk = charset.from_splittable(splittable[:m], True) - chunklen = charset.encoded_header_len(chunk) - if chunklen <= maxlinelen: - # m is acceptable, so is a new lower bound. - i = m - else: - # m is not acceptable, so final i must be < m. - j = m - 1 - # i == j. Invariant #1 implies that splittable[:i] fits, and - # invariant #2 implies that splittable[:i+1] does not fit, so i - # is what we're looking for. - first = charset.from_splittable(splittable[:i], False) - last = charset.from_splittable(splittable[i:], False) - return first, last Deleted: /python/trunk/Lib/email/Iterators.py ============================================================================== --- /python/trunk/Lib/email/Iterators.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,67 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Various types of useful iterators and generators.""" - -import sys -from cStringIO import StringIO - - - -# This function will become a method of the Message class -def walk(self): - """Walk over the message tree, yielding each subpart. - - The walk is performed in depth-first order. This method is a - generator. - """ - yield self - if self.is_multipart(): - for subpart in self.get_payload(): - for subsubpart in subpart.walk(): - yield subsubpart - - - -# These two functions are imported into the Iterators.py interface module. -# The Python 2.2 version uses generators for efficiency. -def body_line_iterator(msg, decode=False): - """Iterate over the parts, returning string payloads line-by-line. - - Optional decode (default False) is passed through to .get_payload(). - """ - for subpart in msg.walk(): - payload = subpart.get_payload(decode=decode) - if isinstance(payload, basestring): - for line in StringIO(payload): - yield line - - -def typed_subpart_iterator(msg, maintype='text', subtype=None): - """Iterate over the subparts with a given MIME type. - - Use `maintype' as the main MIME type to match against; this defaults to - "text". Optional `subtype' is the MIME subtype to match against; if - omitted, only the main type is matched. - """ - for subpart in msg.walk(): - if subpart.get_content_maintype() == maintype: - if subtype is None or subpart.get_content_subtype() == subtype: - yield subpart - - - -def _structure(msg, fp=None, level=0, include_default=False): - """A handy debugging aid""" - if fp is None: - fp = sys.stdout - tab = ' ' * (level * 4) - print >> fp, tab + msg.get_content_type(), - if include_default: - print >> fp, '[%s]' % msg.get_default_type() - else: - print >> fp - if msg.is_multipart(): - for subpart in msg.get_payload(): - _structure(subpart, fp, level+1, include_default) Deleted: /python/trunk/Lib/email/MIMEAudio.py ============================================================================== --- /python/trunk/Lib/email/MIMEAudio.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,72 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Anthony Baxter -# Contact: email-sig at python.org - -"""Class representing audio/* type MIME documents.""" - -import sndhdr -from cStringIO import StringIO - -from email import Errors -from email import Encoders -from email.MIMENonMultipart import MIMENonMultipart - - - -_sndhdr_MIMEmap = {'au' : 'basic', - 'wav' :'x-wav', - 'aiff':'x-aiff', - 'aifc':'x-aiff', - } - -# There are others in sndhdr that don't have MIME types. :( -# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma?? -def _whatsnd(data): - """Try to identify a sound file type. - - sndhdr.what() has a pretty cruddy interface, unfortunately. This is why - we re-do it here. It would be easier to reverse engineer the Unix 'file' - command and use the standard 'magic' file, as shipped with a modern Unix. - """ - hdr = data[:512] - fakefile = StringIO(hdr) - for testfn in sndhdr.tests: - res = testfn(hdr, fakefile) - if res is not None: - return _sndhdr_MIMEmap.get(res[0]) - return None - - - -class MIMEAudio(MIMENonMultipart): - """Class for generating audio/* MIME documents.""" - - def __init__(self, _audiodata, _subtype=None, - _encoder=Encoders.encode_base64, **_params): - """Create an audio/* type MIME document. - - _audiodata is a string containing the raw audio data. If this data - can be decoded by the standard Python `sndhdr' module, then the - subtype will be automatically included in the Content-Type header. - Otherwise, you can specify the specific audio subtype via the - _subtype parameter. If _subtype is not given, and no subtype can be - guessed, a TypeError is raised. - - _encoder is a function which will perform the actual encoding for - transport of the image data. It takes one argument, which is this - Image instance. It should use get_payload() and set_payload() to - change the payload to the encoded form. It should also add any - Content-Transfer-Encoding or other headers to the message as - necessary. The default encoding is Base64. - - Any additional keyword arguments are passed to the base class - constructor, which turns them into parameters on the Content-Type - header. - """ - if _subtype is None: - _subtype = _whatsnd(_audiodata) - if _subtype is None: - raise TypeError('Could not find audio MIME subtype') - MIMENonMultipart.__init__(self, 'audio', _subtype, **_params) - self.set_payload(_audiodata) - _encoder(self) Deleted: /python/trunk/Lib/email/MIMEBase.py ============================================================================== --- /python/trunk/Lib/email/MIMEBase.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,24 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Base class for MIME specializations.""" - -from email import Message - - - -class MIMEBase(Message.Message): - """Base class for MIME specializations.""" - - def __init__(self, _maintype, _subtype, **_params): - """This constructor adds a Content-Type: and a MIME-Version: header. - - The Content-Type: header is taken from the _maintype and _subtype - arguments. Additional parameters for this header are taken from the - keyword arguments. - """ - Message.Message.__init__(self) - ctype = '%s/%s' % (_maintype, _subtype) - self.add_header('Content-Type', ctype, **_params) - self['MIME-Version'] = '1.0' Deleted: /python/trunk/Lib/email/MIMEImage.py ============================================================================== --- /python/trunk/Lib/email/MIMEImage.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,45 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Class representing image/* type MIME documents.""" - -import imghdr - -from email import Errors -from email import Encoders -from email.MIMENonMultipart import MIMENonMultipart - - - -class MIMEImage(MIMENonMultipart): - """Class for generating image/* type MIME documents.""" - - def __init__(self, _imagedata, _subtype=None, - _encoder=Encoders.encode_base64, **_params): - """Create an image/* type MIME document. - - _imagedata is a string containing the raw image data. If this data - can be decoded by the standard Python `imghdr' module, then the - subtype will be automatically included in the Content-Type header. - Otherwise, you can specify the specific image subtype via the _subtype - parameter. - - _encoder is a function which will perform the actual encoding for - transport of the image data. It takes one argument, which is this - Image instance. It should use get_payload() and set_payload() to - change the payload to the encoded form. It should also add any - Content-Transfer-Encoding or other headers to the message as - necessary. The default encoding is Base64. - - Any additional keyword arguments are passed to the base class - constructor, which turns them into parameters on the Content-Type - header. - """ - if _subtype is None: - _subtype = imghdr.what(None, _imagedata) - if _subtype is None: - raise TypeError('Could not guess image MIME subtype') - MIMENonMultipart.__init__(self, 'image', _subtype, **_params) - self.set_payload(_imagedata) - _encoder(self) Deleted: /python/trunk/Lib/email/MIMEMessage.py ============================================================================== --- /python/trunk/Lib/email/MIMEMessage.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,32 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Class representing message/* MIME documents.""" - -from email import Message -from email.MIMENonMultipart import MIMENonMultipart - - - -class MIMEMessage(MIMENonMultipart): - """Class representing message/* MIME documents.""" - - def __init__(self, _msg, _subtype='rfc822'): - """Create a message/* type MIME document. - - _msg is a message object and must be an instance of Message, or a - derived class of Message, otherwise a TypeError is raised. - - Optional _subtype defines the subtype of the contained message. The - default is "rfc822" (this is defined by the MIME standard, even though - the term "rfc822" is technically outdated by RFC 2822). - """ - MIMENonMultipart.__init__(self, 'message', _subtype) - if not isinstance(_msg, Message.Message): - raise TypeError('Argument is not an instance of Message') - # It's convenient to use this base class method. We need to do it - # this way or we'll get an exception - Message.Message.attach(self, _msg) - # And be sure our default type is set correctly - self.set_default_type('message/rfc822') Deleted: /python/trunk/Lib/email/MIMEMultipart.py ============================================================================== --- /python/trunk/Lib/email/MIMEMultipart.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,39 +0,0 @@ -# Copyright (C) 2002-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Base class for MIME multipart/* type messages.""" - -from email import MIMEBase - - - -class MIMEMultipart(MIMEBase.MIMEBase): - """Base class for MIME multipart/* type messages.""" - - def __init__(self, _subtype='mixed', boundary=None, _subparts=None, - **_params): - """Creates a multipart/* type message. - - By default, creates a multipart/mixed message, with proper - Content-Type and MIME-Version headers. - - _subtype is the subtype of the multipart content type, defaulting to - `mixed'. - - boundary is the multipart boundary string. By default it is - calculated as needed. - - _subparts is a sequence of initial subparts for the payload. It - must be an iterable object, such as a list. You can always - attach new subparts to the message by using the attach() method. - - Additional parameters for the Content-Type header are taken from the - keyword arguments (or passed into the _params argument). - """ - MIMEBase.MIMEBase.__init__(self, 'multipart', _subtype, **_params) - if _subparts: - for p in _subparts: - self.attach(p) - if boundary: - self.set_boundary(boundary) Deleted: /python/trunk/Lib/email/MIMENonMultipart.py ============================================================================== --- /python/trunk/Lib/email/MIMENonMultipart.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,24 +0,0 @@ -# Copyright (C) 2002-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Base class for MIME type messages that are not multipart.""" - -from email import Errors -from email import MIMEBase - - - -class MIMENonMultipart(MIMEBase.MIMEBase): - """Base class for MIME multipart/* type messages.""" - - __pychecker__ = 'unusednames=payload' - - def attach(self, payload): - # The public API prohibits attaching multiple subparts to MIMEBase - # derived subtypes since none of them are, by definition, of content - # type multipart/* - raise Errors.MultipartConversionError( - 'Cannot attach additional subparts to non-multipart/*') - - del __pychecker__ Deleted: /python/trunk/Lib/email/MIMEText.py ============================================================================== --- /python/trunk/Lib/email/MIMEText.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,28 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Class representing text/* type MIME documents.""" - -from email.MIMENonMultipart import MIMENonMultipart -from email.Encoders import encode_7or8bit - - - -class MIMEText(MIMENonMultipart): - """Class for generating text/* type MIME documents.""" - - def __init__(self, _text, _subtype='plain', _charset='us-ascii'): - """Create a text/* type MIME document. - - _text is the string for this message object. - - _subtype is the MIME sub content type, defaulting to "plain". - - _charset is the character set parameter added to the Content-Type - header. This defaults to "us-ascii". Note that as a side-effect, the - Content-Transfer-Encoding header will also be set. - """ - MIMENonMultipart.__init__(self, 'text', _subtype, - **{'charset': _charset}) - self.set_payload(_text, _charset) Deleted: /python/trunk/Lib/email/Message.py ============================================================================== --- /python/trunk/Lib/email/Message.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,814 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Basic message object for the email package object model.""" - -import re -import uu -import binascii -import warnings -from cStringIO import StringIO - -# Intrapackage imports -from email import Utils -from email import Errors -from email import Charset - -SEMISPACE = '; ' - -# Regular expression used to split header parameters. BAW: this may be too -# simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches -# most headers found in the wild. We may eventually need a full fledged -# parser eventually. -paramre = re.compile(r'\s*;\s*') -# Regular expression that matches `special' characters in parameters, the -# existance of which force quoting of the parameter value. -tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') - - - -# Helper functions -def _formatparam(param, value=None, quote=True): - """Convenience function to format and return a key=value pair. - - This will quote the value if needed or if quote is true. - """ - if value is not None and len(value) > 0: - # A tuple is used for RFC 2231 encoded parameter values where items - # are (charset, language, value). charset is a string, not a Charset - # instance. - if isinstance(value, tuple): - # Encode as per RFC 2231 - param += '*' - value = Utils.encode_rfc2231(value[2], value[0], value[1]) - # BAW: Please check this. I think that if quote is set it should - # force quoting even if not necessary. - if quote or tspecials.search(value): - return '%s="%s"' % (param, Utils.quote(value)) - else: - return '%s=%s' % (param, value) - else: - return param - -def _parseparam(s): - plist = [] - while s[:1] == ';': - s = s[1:] - end = s.find(';') - while end > 0 and s.count('"', 0, end) % 2: - end = s.find(';', end + 1) - if end < 0: - end = len(s) - f = s[:end] - if '=' in f: - i = f.index('=') - f = f[:i].strip().lower() + '=' + f[i+1:].strip() - plist.append(f.strip()) - s = s[end:] - return plist - - -def _unquotevalue(value): - # This is different than Utils.collapse_rfc2231_value() because it doesn't - # try to convert the value to a unicode. Message.get_param() and - # Message.get_params() are both currently defined to return the tuple in - # the face of RFC 2231 parameters. - if isinstance(value, tuple): - return value[0], value[1], Utils.unquote(value[2]) - else: - return Utils.unquote(value) - - - -class Message: - """Basic message object. - - A message object is defined as something that has a bunch of RFC 2822 - headers and a payload. It may optionally have an envelope header - (a.k.a. Unix-From or From_ header). If the message is a container (i.e. a - multipart or a message/rfc822), then the payload is a list of Message - objects, otherwise it is a string. - - Message objects implement part of the `mapping' interface, which assumes - there is exactly one occurrance of the header per message. Some headers - do in fact appear multiple times (e.g. Received) and for those headers, - you must use the explicit API to set or get all the headers. Not all of - the mapping methods are implemented. - """ - def __init__(self): - self._headers = [] - self._unixfrom = None - self._payload = None - self._charset = None - # Defaults for multipart messages - self.preamble = self.epilogue = None - self.defects = [] - # Default content type - self._default_type = 'text/plain' - - def __str__(self): - """Return the entire formatted message as a string. - This includes the headers, body, and envelope header. - """ - return self.as_string(unixfrom=True) - - def as_string(self, unixfrom=False): - """Return the entire formatted message as a string. - Optional `unixfrom' when True, means include the Unix From_ envelope - header. - - This is a convenience method and may not generate the message exactly - as you intend because by default it mangles lines that begin with - "From ". For more flexibility, use the flatten() method of a - Generator instance. - """ - from email.Generator import Generator - fp = StringIO() - g = Generator(fp) - g.flatten(self, unixfrom=unixfrom) - return fp.getvalue() - - def is_multipart(self): - """Return True if the message consists of multiple parts.""" - return isinstance(self._payload, list) - - # - # Unix From_ line - # - def set_unixfrom(self, unixfrom): - self._unixfrom = unixfrom - - def get_unixfrom(self): - return self._unixfrom - - # - # Payload manipulation. - # - def attach(self, payload): - """Add the given payload to the current payload. - - The current payload will always be a list of objects after this method - is called. If you want to set the payload to a scalar object, use - set_payload() instead. - """ - if self._payload is None: - self._payload = [payload] - else: - self._payload.append(payload) - - def get_payload(self, i=None, decode=False): - """Return a reference to the payload. - - The payload will either be a list object or a string. If you mutate - the list object, you modify the message's payload in place. Optional - i returns that index into the payload. - - Optional decode is a flag indicating whether the payload should be - decoded or not, according to the Content-Transfer-Encoding header - (default is False). - - When True and the message is not a multipart, the payload will be - decoded if this header's value is `quoted-printable' or `base64'. If - some other encoding is used, or the header is missing, or if the - payload has bogus data (i.e. bogus base64 or uuencoded data), the - payload is returned as-is. - - If the message is a multipart and the decode flag is True, then None - is returned. - """ - if i is None: - payload = self._payload - elif not isinstance(self._payload, list): - raise TypeError('Expected list, got %s' % type(self._payload)) - else: - payload = self._payload[i] - if decode: - if self.is_multipart(): - return None - cte = self.get('content-transfer-encoding', '').lower() - if cte == 'quoted-printable': - return Utils._qdecode(payload) - elif cte == 'base64': - try: - return Utils._bdecode(payload) - except binascii.Error: - # Incorrect padding - return payload - elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): - sfp = StringIO() - try: - uu.decode(StringIO(payload+'\n'), sfp) - payload = sfp.getvalue() - except uu.Error: - # Some decoding problem - return payload - # Everything else, including encodings with 8bit or 7bit are returned - # unchanged. - return payload - - def set_payload(self, payload, charset=None): - """Set the payload to the given value. - - Optional charset sets the message's default character set. See - set_charset() for details. - """ - self._payload = payload - if charset is not None: - self.set_charset(charset) - - def set_charset(self, charset): - """Set the charset of the payload to a given character set. - - charset can be a Charset instance, a string naming a character set, or - None. If it is a string it will be converted to a Charset instance. - If charset is None, the charset parameter will be removed from the - Content-Type field. Anything else will generate a TypeError. - - The message will be assumed to be of type text/* encoded with - charset.input_charset. It will be converted to charset.output_charset - and encoded properly, if needed, when generating the plain text - representation of the message. MIME headers (MIME-Version, - Content-Type, Content-Transfer-Encoding) will be added as needed. - - """ - if charset is None: - self.del_param('charset') - self._charset = None - return - if isinstance(charset, str): - charset = Charset.Charset(charset) - if not isinstance(charset, Charset.Charset): - raise TypeError(charset) - # BAW: should we accept strings that can serve as arguments to the - # Charset constructor? - self._charset = charset - if not self.has_key('MIME-Version'): - self.add_header('MIME-Version', '1.0') - if not self.has_key('Content-Type'): - self.add_header('Content-Type', 'text/plain', - charset=charset.get_output_charset()) - else: - self.set_param('charset', charset.get_output_charset()) - if str(charset) <> charset.get_output_charset(): - self._payload = charset.body_encode(self._payload) - if not self.has_key('Content-Transfer-Encoding'): - cte = charset.get_body_encoding() - try: - cte(self) - except TypeError: - self._payload = charset.body_encode(self._payload) - self.add_header('Content-Transfer-Encoding', cte) - - def get_charset(self): - """Return the Charset instance associated with the message's payload. - """ - return self._charset - - # - # MAPPING INTERFACE (partial) - # - def __len__(self): - """Return the total number of headers, including duplicates.""" - return len(self._headers) - - def __getitem__(self, name): - """Get a header value. - - Return None if the header is missing instead of raising an exception. - - Note that if the header appeared multiple times, exactly which - occurrance gets returned is undefined. Use get_all() to get all - the values matching a header field name. - """ - return self.get(name) - - def __setitem__(self, name, val): - """Set the value of a header. - - Note: this does not overwrite an existing header with the same field - name. Use __delitem__() first to delete any existing headers. - """ - self._headers.append((name, val)) - - def __delitem__(self, name): - """Delete all occurrences of a header, if present. - - Does not raise an exception if the header is missing. - """ - name = name.lower() - newheaders = [] - for k, v in self._headers: - if k.lower() <> name: - newheaders.append((k, v)) - self._headers = newheaders - - def __contains__(self, name): - return name.lower() in [k.lower() for k, v in self._headers] - - def has_key(self, name): - """Return true if the message contains the header.""" - missing = object() - return self.get(name, missing) is not missing - - def keys(self): - """Return a list of all the message's header field names. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return [k for k, v in self._headers] - - def values(self): - """Return a list of all the message's header values. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return [v for k, v in self._headers] - - def items(self): - """Get all the message's header fields and values. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return self._headers[:] - - def get(self, name, failobj=None): - """Get a header value. - - Like __getitem__() but return failobj instead of None when the field - is missing. - """ - name = name.lower() - for k, v in self._headers: - if k.lower() == name: - return v - return failobj - - # - # Additional useful stuff - # - - def get_all(self, name, failobj=None): - """Return a list of all the values for the named field. - - These will be sorted in the order they appeared in the original - message, and may contain duplicates. Any fields deleted and - re-inserted are always appended to the header list. - - If no such fields exist, failobj is returned (defaults to None). - """ - values = [] - name = name.lower() - for k, v in self._headers: - if k.lower() == name: - values.append(v) - if not values: - return failobj - return values - - def add_header(self, _name, _value, **_params): - """Extended header setting. - - name is the header field to add. keyword arguments can be used to set - additional parameters for the header field, with underscores converted - to dashes. Normally the parameter will be added as key="value" unless - value is None, in which case only the key will be added. - - Example: - - msg.add_header('content-disposition', 'attachment', filename='bud.gif') - """ - parts = [] - for k, v in _params.items(): - if v is None: - parts.append(k.replace('_', '-')) - else: - parts.append(_formatparam(k.replace('_', '-'), v)) - if _value is not None: - parts.insert(0, _value) - self._headers.append((_name, SEMISPACE.join(parts))) - - def replace_header(self, _name, _value): - """Replace a header. - - Replace the first matching header found in the message, retaining - header order and case. If no matching header was found, a KeyError is - raised. - """ - _name = _name.lower() - for i, (k, v) in zip(range(len(self._headers)), self._headers): - if k.lower() == _name: - self._headers[i] = (k, _value) - break - else: - raise KeyError(_name) - - # - # Deprecated methods. These will be removed in email 3.1. - # - - def get_type(self, failobj=None): - """Returns the message's content type. - - The returned string is coerced to lowercase and returned as a single - string of the form `maintype/subtype'. If there was no Content-Type - header in the message, failobj is returned (defaults to None). - """ - warnings.warn('get_type() deprecated; use get_content_type()', - DeprecationWarning, 2) - missing = object() - value = self.get('content-type', missing) - if value is missing: - return failobj - return paramre.split(value)[0].lower().strip() - - def get_main_type(self, failobj=None): - """Return the message's main content type if present.""" - warnings.warn('get_main_type() deprecated; use get_content_maintype()', - DeprecationWarning, 2) - missing = object() - ctype = self.get_type(missing) - if ctype is missing: - return failobj - if ctype.count('/') <> 1: - return failobj - return ctype.split('/')[0] - - def get_subtype(self, failobj=None): - """Return the message's content subtype if present.""" - warnings.warn('get_subtype() deprecated; use get_content_subtype()', - DeprecationWarning, 2) - missing = object() - ctype = self.get_type(missing) - if ctype is missing: - return failobj - if ctype.count('/') <> 1: - return failobj - return ctype.split('/')[1] - - # - # Use these three methods instead of the three above. - # - - def get_content_type(self): - """Return the message's content type. - - The returned string is coerced to lower case of the form - `maintype/subtype'. If there was no Content-Type header in the - message, the default type as given by get_default_type() will be - returned. Since according to RFC 2045, messages always have a default - type this will always return a value. - - RFC 2045 defines a message's default type to be text/plain unless it - appears inside a multipart/digest container, in which case it would be - message/rfc822. - """ - missing = object() - value = self.get('content-type', missing) - if value is missing: - # This should have no parameters - return self.get_default_type() - ctype = paramre.split(value)[0].lower().strip() - # RFC 2045, section 5.2 says if its invalid, use text/plain - if ctype.count('/') <> 1: - return 'text/plain' - return ctype - - def get_content_maintype(self): - """Return the message's main content type. - - This is the `maintype' part of the string returned by - get_content_type(). - """ - ctype = self.get_content_type() - return ctype.split('/')[0] - - def get_content_subtype(self): - """Returns the message's sub-content type. - - This is the `subtype' part of the string returned by - get_content_type(). - """ - ctype = self.get_content_type() - return ctype.split('/')[1] - - def get_default_type(self): - """Return the `default' content type. - - Most messages have a default content type of text/plain, except for - messages that are subparts of multipart/digest containers. Such - subparts have a default content type of message/rfc822. - """ - return self._default_type - - def set_default_type(self, ctype): - """Set the `default' content type. - - ctype should be either "text/plain" or "message/rfc822", although this - is not enforced. The default content type is not stored in the - Content-Type header. - """ - self._default_type = ctype - - def _get_params_preserve(self, failobj, header): - # Like get_params() but preserves the quoting of values. BAW: - # should this be part of the public interface? - missing = object() - value = self.get(header, missing) - if value is missing: - return failobj - params = [] - for p in _parseparam(';' + value): - try: - name, val = p.split('=', 1) - name = name.strip() - val = val.strip() - except ValueError: - # Must have been a bare attribute - name = p.strip() - val = '' - params.append((name, val)) - params = Utils.decode_params(params) - return params - - def get_params(self, failobj=None, header='content-type', unquote=True): - """Return the message's Content-Type parameters, as a list. - - The elements of the returned list are 2-tuples of key/value pairs, as - split on the `=' sign. The left hand side of the `=' is the key, - while the right hand side is the value. If there is no `=' sign in - the parameter the value is the empty string. The value is as - described in the get_param() method. - - Optional failobj is the object to return if there is no Content-Type - header. Optional header is the header to search instead of - Content-Type. If unquote is True, the value is unquoted. - """ - missing = object() - params = self._get_params_preserve(missing, header) - if params is missing: - return failobj - if unquote: - return [(k, _unquotevalue(v)) for k, v in params] - else: - return params - - def get_param(self, param, failobj=None, header='content-type', - unquote=True): - """Return the parameter value if found in the Content-Type header. - - Optional failobj is the object to return if there is no Content-Type - header, or the Content-Type header has no such parameter. Optional - header is the header to search instead of Content-Type. - - Parameter keys are always compared case insensitively. The return - value can either be a string, or a 3-tuple if the parameter was RFC - 2231 encoded. When it's a 3-tuple, the elements of the value are of - the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and - LANGUAGE can be None, in which case you should consider VALUE to be - encoded in the us-ascii charset. You can usually ignore LANGUAGE. - - Your application should be prepared to deal with 3-tuple return - values, and can convert the parameter to a Unicode string like so: - - param = msg.get_param('foo') - if isinstance(param, tuple): - param = unicode(param[2], param[0] or 'us-ascii') - - In any case, the parameter value (either the returned string, or the - VALUE item in the 3-tuple) is always unquoted, unless unquote is set - to False. - """ - if not self.has_key(header): - return failobj - for k, v in self._get_params_preserve(failobj, header): - if k.lower() == param.lower(): - if unquote: - return _unquotevalue(v) - else: - return v - return failobj - - def set_param(self, param, value, header='Content-Type', requote=True, - charset=None, language=''): - """Set a parameter in the Content-Type header. - - If the parameter already exists in the header, its value will be - replaced with the new value. - - If header is Content-Type and has not yet been defined for this - message, it will be set to "text/plain" and the new parameter and - value will be appended as per RFC 2045. - - An alternate header can specified in the header argument, and all - parameters will be quoted as necessary unless requote is False. - - If charset is specified, the parameter will be encoded according to RFC - 2231. Optional language specifies the RFC 2231 language, defaulting - to the empty string. Both charset and language should be strings. - """ - if not isinstance(value, tuple) and charset: - value = (charset, language, value) - - if not self.has_key(header) and header.lower() == 'content-type': - ctype = 'text/plain' - else: - ctype = self.get(header) - if not self.get_param(param, header=header): - if not ctype: - ctype = _formatparam(param, value, requote) - else: - ctype = SEMISPACE.join( - [ctype, _formatparam(param, value, requote)]) - else: - ctype = '' - for old_param, old_value in self.get_params(header=header, - unquote=requote): - append_param = '' - if old_param.lower() == param.lower(): - append_param = _formatparam(param, value, requote) - else: - append_param = _formatparam(old_param, old_value, requote) - if not ctype: - ctype = append_param - else: - ctype = SEMISPACE.join([ctype, append_param]) - if ctype <> self.get(header): - del self[header] - self[header] = ctype - - def del_param(self, param, header='content-type', requote=True): - """Remove the given parameter completely from the Content-Type header. - - The header will be re-written in place without the parameter or its - value. All values will be quoted as necessary unless requote is - False. Optional header specifies an alternative to the Content-Type - header. - """ - if not self.has_key(header): - return - new_ctype = '' - for p, v in self.get_params(header=header, unquote=requote): - if p.lower() <> param.lower(): - if not new_ctype: - new_ctype = _formatparam(p, v, requote) - else: - new_ctype = SEMISPACE.join([new_ctype, - _formatparam(p, v, requote)]) - if new_ctype <> self.get(header): - del self[header] - self[header] = new_ctype - - def set_type(self, type, header='Content-Type', requote=True): - """Set the main type and subtype for the Content-Type header. - - type must be a string in the form "maintype/subtype", otherwise a - ValueError is raised. - - This method replaces the Content-Type header, keeping all the - parameters in place. If requote is False, this leaves the existing - header's quoting as is. Otherwise, the parameters will be quoted (the - default). - - An alternative header can be specified in the header argument. When - the Content-Type header is set, we'll always also add a MIME-Version - header. - """ - # BAW: should we be strict? - if not type.count('/') == 1: - raise ValueError - # Set the Content-Type, you get a MIME-Version - if header.lower() == 'content-type': - del self['mime-version'] - self['MIME-Version'] = '1.0' - if not self.has_key(header): - self[header] = type - return - params = self.get_params(header=header, unquote=requote) - del self[header] - self[header] = type - # Skip the first param; it's the old type. - for p, v in params[1:]: - self.set_param(p, v, header, requote) - - def get_filename(self, failobj=None): - """Return the filename associated with the payload if present. - - The filename is extracted from the Content-Disposition header's - `filename' parameter, and it is unquoted. If that header is missing - the `filename' parameter, this method falls back to looking for the - `name' parameter. - """ - missing = object() - filename = self.get_param('filename', missing, 'content-disposition') - if filename is missing: - filename = self.get_param('name', missing, 'content-disposition') - if filename is missing: - return failobj - return Utils.collapse_rfc2231_value(filename).strip() - - def get_boundary(self, failobj=None): - """Return the boundary associated with the payload if present. - - The boundary is extracted from the Content-Type header's `boundary' - parameter, and it is unquoted. - """ - missing = object() - boundary = self.get_param('boundary', missing) - if boundary is missing: - return failobj - # RFC 2046 says that boundaries may begin but not end in w/s - return Utils.collapse_rfc2231_value(boundary).rstrip() - - def set_boundary(self, boundary): - """Set the boundary parameter in Content-Type to 'boundary'. - - This is subtly different than deleting the Content-Type header and - adding a new one with a new boundary parameter via add_header(). The - main difference is that using the set_boundary() method preserves the - order of the Content-Type header in the original message. - - HeaderParseError is raised if the message has no Content-Type header. - """ - missing = object() - params = self._get_params_preserve(missing, 'content-type') - if params is missing: - # There was no Content-Type header, and we don't know what type - # to set it to, so raise an exception. - raise Errors.HeaderParseError, 'No Content-Type header found' - newparams = [] - foundp = False - for pk, pv in params: - if pk.lower() == 'boundary': - newparams.append(('boundary', '"%s"' % boundary)) - foundp = True - else: - newparams.append((pk, pv)) - if not foundp: - # The original Content-Type header had no boundary attribute. - # Tack one on the end. BAW: should we raise an exception - # instead??? - newparams.append(('boundary', '"%s"' % boundary)) - # Replace the existing Content-Type header with the new value - newheaders = [] - for h, v in self._headers: - if h.lower() == 'content-type': - parts = [] - for k, v in newparams: - if v == '': - parts.append(k) - else: - parts.append('%s=%s' % (k, v)) - newheaders.append((h, SEMISPACE.join(parts))) - - else: - newheaders.append((h, v)) - self._headers = newheaders - - def get_content_charset(self, failobj=None): - """Return the charset parameter of the Content-Type header. - - The returned string is always coerced to lower case. If there is no - Content-Type header, or if that header has no charset parameter, - failobj is returned. - """ - missing = object() - charset = self.get_param('charset', missing) - if charset is missing: - return failobj - if isinstance(charset, tuple): - # RFC 2231 encoded, so decode it, and it better end up as ascii. - pcharset = charset[0] or 'us-ascii' - charset = unicode(charset[2], pcharset).encode('us-ascii') - # RFC 2046, $4.1.2 says charsets are not case sensitive - return charset.lower() - - def get_charsets(self, failobj=None): - """Return a list containing the charset(s) used in this message. - - The returned list of items describes the Content-Type headers' - charset parameter for this message and all the subparts in its - payload. - - Each item will either be a string (the value of the charset parameter - in the Content-Type header of that part) or the value of the - 'failobj' parameter (defaults to None), if the part does not have a - main MIME type of "text", or the charset is not defined. - - The list will contain one string for each part of the message, plus - one for the container message (i.e. self), so that a non-multipart - message will still return a list of length 1. - """ - return [part.get_content_charset(failobj) for part in self.walk()] - - # I.e. def walk(self): ... - from email.Iterators import walk Deleted: /python/trunk/Lib/email/Parser.py ============================================================================== --- /python/trunk/Lib/email/Parser.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,88 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw, Thomas Wouters, Anthony Baxter -# Contact: email-sig at python.org - -"""A parser of RFC 2822 and MIME email messages.""" - -import warnings -from cStringIO import StringIO -from email.FeedParser import FeedParser -from email.Message import Message - - - -class Parser: - def __init__(self, *args, **kws): - """Parser of RFC 2822 and MIME email messages. - - Creates an in-memory object tree representing the email message, which - can then be manipulated and turned over to a Generator to return the - textual representation of the message. - - The string must be formatted as a block of RFC 2822 headers and header - continuation lines, optionally preceeded by a `Unix-from' header. The - header block is terminated either by the end of the string or by a - blank line. - - _class is the class to instantiate for new message objects when they - must be created. This class must have a constructor that can take - zero arguments. Default is Message.Message. - """ - if len(args) >= 1: - if '_class' in kws: - raise TypeError("Multiple values for keyword arg '_class'") - kws['_class'] = args[0] - if len(args) == 2: - if 'strict' in kws: - raise TypeError("Multiple values for keyword arg 'strict'") - kws['strict'] = args[1] - if len(args) > 2: - raise TypeError('Too many arguments') - if '_class' in kws: - self._class = kws['_class'] - del kws['_class'] - else: - self._class = Message - if 'strict' in kws: - warnings.warn("'strict' argument is deprecated (and ignored)", - DeprecationWarning, 2) - del kws['strict'] - if kws: - raise TypeError('Unexpected keyword arguments') - - def parse(self, fp, headersonly=False): - """Create a message structure from the data in a file. - - Reads all the data from the file and returns the root of the message - structure. Optional headersonly is a flag specifying whether to stop - parsing after reading the headers or not. The default is False, - meaning it parses the entire contents of the file. - """ - feedparser = FeedParser(self._class) - if headersonly: - feedparser._set_headersonly() - while True: - data = fp.read(8192) - if not data: - break - feedparser.feed(data) - return feedparser.close() - - def parsestr(self, text, headersonly=False): - """Create a message structure from a string. - - Returns the root of the message structure. Optional headersonly is a - flag specifying whether to stop parsing after reading the headers or - not. The default is False, meaning it parses the entire contents of - the file. - """ - return self.parse(StringIO(text), headersonly=headersonly) - - - -class HeaderParser(Parser): - def parse(self, fp, headersonly=True): - return Parser.parse(self, fp, True) - - def parsestr(self, text, headersonly=True): - return Parser.parsestr(self, text, True) Deleted: /python/trunk/Lib/email/Utils.py ============================================================================== --- /python/trunk/Lib/email/Utils.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,291 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig at python.org - -"""Miscellaneous utilities.""" - -import os -import re -import time -import base64 -import random -import socket -import warnings -from cStringIO import StringIO - -from email._parseaddr import quote -from email._parseaddr import AddressList as _AddressList -from email._parseaddr import mktime_tz - -# We need wormarounds for bugs in these methods in older Pythons (see below) -from email._parseaddr import parsedate as _parsedate -from email._parseaddr import parsedate_tz as _parsedate_tz - -from quopri import decodestring as _qdecode - -# Intrapackage imports -from email.Encoders import _bencode, _qencode - -COMMASPACE = ', ' -EMPTYSTRING = '' -UEMPTYSTRING = u'' -CRLF = '\r\n' - -specialsre = re.compile(r'[][\\()<>@,:;".]') -escapesre = re.compile(r'[][\\()"]') - - - -# Helpers - -def _identity(s): - return s - - -def _bdecode(s): - # We can't quite use base64.encodestring() since it tacks on a "courtesy - # newline". Blech! - if not s: - return s - value = base64.decodestring(s) - if not s.endswith('\n') and value.endswith('\n'): - return value[:-1] - return value - - - -def fix_eols(s): - """Replace all line-ending characters with \r\n.""" - # Fix newlines with no preceding carriage return - s = re.sub(r'(?', name) - return '%s%s%s <%s>' % (quotes, name, quotes, address) - return address - - - -def getaddresses(fieldvalues): - """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" - all = COMMASPACE.join(fieldvalues) - a = _AddressList(all) - return a.addresslist - - - -ecre = re.compile(r''' - =\? # literal =? - (?P[^?]*?) # non-greedy up to the next ? is the charset - \? # literal ? - (?P[qb]) # either a "q" or a "b", case insensitive - \? # literal ? - (?P.*?) # non-greedy up to the next ?= is the atom - \?= # literal ?= - ''', re.VERBOSE | re.IGNORECASE) - - - -def formatdate(timeval=None, localtime=False, usegmt=False): - """Returns a date string as specified by RFC 2822, e.g.: - - Fri, 09 Nov 2001 01:08:47 -0000 - - Optional timeval if given is a floating point time value as accepted by - gmtime() and localtime(), otherwise the current time is used. - - Optional localtime is a flag that when True, interprets timeval, and - returns a date relative to the local timezone instead of UTC, properly - taking daylight savings time into account. - - Optional argument usegmt means that the timezone is written out as - an ascii string, not numeric one (so "GMT" instead of "+0000"). This - is needed for HTTP, and is only used when localtime==False. - """ - # Note: we cannot use strftime() because that honors the locale and RFC - # 2822 requires that day and month names be the English abbreviations. - if timeval is None: - timeval = time.time() - if localtime: - now = time.localtime(timeval) - # Calculate timezone offset, based on whether the local zone has - # daylight savings time, and whether DST is in effect. - if time.daylight and now[-1]: - offset = time.altzone - else: - offset = time.timezone - hours, minutes = divmod(abs(offset), 3600) - # Remember offset is in seconds west of UTC, but the timezone is in - # minutes east of UTC, so the signs differ. - if offset > 0: - sign = '-' - else: - sign = '+' - zone = '%s%02d%02d' % (sign, hours, minutes // 60) - else: - now = time.gmtime(timeval) - # Timezone offset is always -0000 - if usegmt: - zone = 'GMT' - else: - zone = '-0000' - return '%s, %02d %s %04d %02d:%02d:%02d %s' % ( - ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][now[6]], - now[2], - ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][now[1] - 1], - now[0], now[3], now[4], now[5], - zone) - - - -def make_msgid(idstring=None): - """Returns a string suitable for RFC 2822 compliant Message-ID, e.g: - - <20020201195627.33539.96671 at nightshade.la.mastaler.com> - - Optional idstring if given is a string used to strengthen the - uniqueness of the message id. - """ - timeval = time.time() - utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval)) - pid = os.getpid() - randint = random.randrange(100000) - if idstring is None: - idstring = '' - else: - idstring = '.' + idstring - idhost = socket.getfqdn() - msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost) - return msgid - - - -# These functions are in the standalone mimelib version only because they've -# subsequently been fixed in the latest Python versions. We use this to worm -# around broken older Pythons. -def parsedate(data): - if not data: - return None - return _parsedate(data) - - -def parsedate_tz(data): - if not data: - return None - return _parsedate_tz(data) - - -def parseaddr(addr): - addrs = _AddressList(addr).addresslist - if not addrs: - return '', '' - return addrs[0] - - -# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3. -def unquote(str): - """Remove quotes from a string.""" - if len(str) > 1: - if str.startswith('"') and str.endswith('"'): - return str[1:-1].replace('\\\\', '\\').replace('\\"', '"') - if str.startswith('<') and str.endswith('>'): - return str[1:-1] - return str - - - -# RFC2231-related functions - parameter encoding and decoding -def decode_rfc2231(s): - """Decode string according to RFC 2231""" - import urllib - parts = s.split("'", 2) - if len(parts) == 1: - return None, None, urllib.unquote(s) - charset, language, s = parts - return charset, language, urllib.unquote(s) - - -def encode_rfc2231(s, charset=None, language=None): - """Encode string according to RFC 2231. - - If neither charset nor language is given, then s is returned as-is. If - charset is given but not language, the string is encoded using the empty - string for language. - """ - import urllib - s = urllib.quote(s, safe='') - if charset is None and language is None: - return s - if language is None: - language = '' - return "%s'%s'%s" % (charset, language, s) - - -rfc2231_continuation = re.compile(r'^(?P\w+)\*((?P[0-9]+)\*?)?$') - -def decode_params(params): - """Decode parameters list according to RFC 2231. - - params is a sequence of 2-tuples containing (content type, string value). - """ - new_params = [] - # maps parameter's name to a list of continuations - rfc2231_params = {} - # params is a sequence of 2-tuples containing (content_type, string value) - name, value = params[0] - new_params.append((name, value)) - # Cycle through each of the rest of the parameters. - for name, value in params[1:]: - value = unquote(value) - mo = rfc2231_continuation.match(name) - if mo: - name, num = mo.group('name', 'num') - if num is not None: - num = int(num) - rfc2231_param1 = rfc2231_params.setdefault(name, []) - rfc2231_param1.append((num, value)) - else: - new_params.append((name, '"%s"' % quote(value))) - if rfc2231_params: - for name, continuations in rfc2231_params.items(): - value = [] - # Sort by number - continuations.sort() - # And now append all values in num order - for num, continuation in continuations: - value.append(continuation) - charset, language, value = decode_rfc2231(EMPTYSTRING.join(value)) - new_params.append( - (name, (charset, language, '"%s"' % quote(value)))) - return new_params - -def collapse_rfc2231_value(value, errors='replace', - fallback_charset='us-ascii'): - if isinstance(value, tuple): - rawval = unquote(value[2]) - charset = value[0] or 'us-ascii' - try: - return unicode(rawval, charset, errors) - except LookupError: - # XXX charset is unknown to Python. - return unicode(rawval, fallback_charset, errors) - else: - return unquote(value) Modified: python/trunk/Lib/email/__init__.py ============================================================================== --- python/trunk/Lib/email/__init__.py (original) +++ python/trunk/Lib/email/__init__.py Sat Mar 18 16:41:53 2006 @@ -4,9 +4,10 @@ """A package for parsing, handling, and generating email messages.""" -__version__ = '3.0.1' +__version__ = '4.0a2' __all__ = [ + # Old names 'base64MIME', 'Charset', 'Encoders', @@ -27,6 +28,19 @@ 'Utils', 'message_from_string', 'message_from_file', + # new names + 'base64mime', + 'charset', + 'encoders', + 'errors', + 'generator', + 'header', + 'iterators', + 'message', + 'mime', + 'parser', + 'quoprimime', + 'utils', ] @@ -39,7 +53,7 @@ Optional _class and strict are passed to the Parser constructor. """ - from email.Parser import Parser + from email.parser import Parser return Parser(*args, **kws).parsestr(s) @@ -48,5 +62,62 @@ Optional _class and strict are passed to the Parser constructor. """ - from email.Parser import Parser + from email.parser import Parser return Parser(*args, **kws).parse(fp) + + + +# Lazy loading to provide name mapping from new-style names (PEP 8 compatible +# email 4.0 module names), to old-style names (email 3.0 module names). +import sys + +class LazyImporter(object): + def __init__(self, module_name): + self.__name__ = 'email.' + module_name + + def __getattr__(self, name): + __import__(self.__name__) + mod = sys.modules[self.__name__] + self.__dict__.update(mod.__dict__) + return getattr(mod, name) + + +_LOWERNAMES = [ + # email. -> email. + 'Charset', + 'Encoders', + 'Errors', + 'FeedParser', + 'Generator', + 'Header', + 'Iterators', + 'Message', + 'Parser', + 'Utils', + 'base64MIME', + 'quopriMIME', + ] + +_MIMENAMES = [ + # email.MIME -> email.mime. + 'Audio', + 'Base', + 'Image', + 'Message', + 'Multipart', + 'NonMultipart', + 'Text', + ] + +for _name in _LOWERNAMES: + importer = LazyImporter(_name.lower()) + sys.modules['email.' + _name] = importer + setattr(sys.modules['email'], _name, importer) + + +import email.mime +for _name in _MIMENAMES: + importer = LazyImporter('mime.' + _name.lower()) + sys.modules['email.MIME' + _name] = importer + setattr(sys.modules['email'], 'MIME' + _name, importer) + setattr(sys.modules['email.mime'], _name, importer) Modified: python/trunk/Lib/email/_parseaddr.py ============================================================================== --- python/trunk/Lib/email/_parseaddr.py (original) +++ python/trunk/Lib/email/_parseaddr.py Sat Mar 18 16:41:53 2006 @@ -6,6 +6,13 @@ Lifted directly from rfc822.py. This should eventually be rewritten. """ +__all__ = [ + 'mktime_tz', + 'parsedate', + 'parsedate_tz', + 'quote', + ] + import time SPACE = ' ' Deleted: /python/trunk/Lib/email/base64MIME.py ============================================================================== --- /python/trunk/Lib/email/base64MIME.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,172 +0,0 @@ -# Copyright (C) 2002-2004 Python Software Foundation -# Author: Ben Gertzfield -# Contact: email-sig at python.org - -"""Base64 content transfer encoding per RFCs 2045-2047. - -This module handles the content transfer encoding method defined in RFC 2045 -to encode arbitrary 8-bit data using the three 8-bit bytes in four 7-bit -characters encoding known as Base64. - -It is used in the MIME standards for email to attach images, audio, and text -using some 8-bit character sets to messages. - -This module provides an interface to encode and decode both headers and bodies -with Base64 encoding. - -RFC 2045 defines a method for including character set information in an -`encoded-word' in a header. This method is commonly used for 8-bit real names -in To:, From:, Cc:, etc. fields, as well as Subject: lines. - -This module does not do the line wrapping or end-of-line character conversion -necessary for proper internationalized headers; it only does dumb encoding and -decoding. To deal with the various line wrapping issues, use the email.Header -module. -""" - -import re -from binascii import b2a_base64, a2b_base64 -from email.Utils import fix_eols - -CRLF = '\r\n' -NL = '\n' -EMPTYSTRING = '' - -# See also Charset.py -MISC_LEN = 7 - - - -# Helpers -def base64_len(s): - """Return the length of s when it is encoded with base64.""" - groups_of_3, leftover = divmod(len(s), 3) - # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in. - # Thanks, Tim! - n = groups_of_3 * 4 - if leftover: - n += 4 - return n - - - -def header_encode(header, charset='iso-8859-1', keep_eols=False, - maxlinelen=76, eol=NL): - """Encode a single header line with Base64 encoding in a given charset. - - Defined in RFC 2045, this Base64 encoding is identical to normal Base64 - encoding, except that each line must be intelligently wrapped (respecting - the Base64 encoding), and subsequent lines must start with a space. - - charset names the character set to use to encode the header. It defaults - to iso-8859-1. - - End-of-line characters (\\r, \\n, \\r\\n) will be automatically converted - to the canonical email line separator \\r\\n unless the keep_eols - parameter is True (the default is False). - - Each line of the header will be terminated in the value of eol, which - defaults to "\\n". Set this to "\\r\\n" if you are using the result of - this function directly in email. - - The resulting string will be in the form: - - "=?charset?b?WW/5ciBtYXp66XLrIHf8eiBhIGhhbXBzdGHuciBBIFlv+XIgbWF6euly?=\\n - =?charset?b?6yB3/HogYSBoYW1wc3Rh7nIgQkMgWW/5ciBtYXp66XLrIHf8eiBhIGhh?=" - - with each line wrapped at, at most, maxlinelen characters (defaults to 76 - characters). - """ - # Return empty headers unchanged - if not header: - return header - - if not keep_eols: - header = fix_eols(header) - - # Base64 encode each line, in encoded chunks no greater than maxlinelen in - # length, after the RFC chrome is added in. - base64ed = [] - max_encoded = maxlinelen - len(charset) - MISC_LEN - max_unencoded = max_encoded * 3 // 4 - - for i in range(0, len(header), max_unencoded): - base64ed.append(b2a_base64(header[i:i+max_unencoded])) - - # Now add the RFC chrome to each encoded chunk - lines = [] - for line in base64ed: - # Ignore the last character of each line if it is a newline - if line.endswith(NL): - line = line[:-1] - # Add the chrome - lines.append('=?%s?b?%s?=' % (charset, line)) - # Glue the lines together and return it. BAW: should we be able to - # specify the leading whitespace in the joiner? - joiner = eol + ' ' - return joiner.join(lines) - - - -def encode(s, binary=True, maxlinelen=76, eol=NL): - """Encode a string with base64. - - Each line will be wrapped at, at most, maxlinelen characters (defaults to - 76 characters). - - If binary is False, end-of-line characters will be converted to the - canonical email end-of-line sequence \\r\\n. Otherwise they will be left - verbatim (this is the default). - - Each line of encoded text will end with eol, which defaults to "\\n". Set - this to "\r\n" if you will be using the result of this function directly - in an email. - """ - if not s: - return s - - if not binary: - s = fix_eols(s) - - encvec = [] - max_unencoded = maxlinelen * 3 // 4 - for i in range(0, len(s), max_unencoded): - # BAW: should encode() inherit b2a_base64()'s dubious behavior in - # adding a newline to the encoded string? - enc = b2a_base64(s[i:i + max_unencoded]) - if enc.endswith(NL) and eol <> NL: - enc = enc[:-1] + eol - encvec.append(enc) - return EMPTYSTRING.join(encvec) - - -# For convenience and backwards compatibility w/ standard base64 module -body_encode = encode -encodestring = encode - - - -def decode(s, convert_eols=None): - """Decode a raw base64 string. - - If convert_eols is set to a string value, all canonical email linefeeds, - e.g. "\\r\\n", in the decoded text will be converted to the value of - convert_eols. os.linesep is a good choice for convert_eols if you are - decoding a text attachment. - - This function does not parse a full MIME header value encoded with - base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high - level email.Header class for that functionality. - """ - if not s: - return s - - dec = a2b_base64(s) - if convert_eols: - return dec.replace(CRLF, convert_eols) - return dec - - -# For convenience and backwards compatibility w/ standard base64 module -body_decode = decode -decodestring = decode Deleted: /python/trunk/Lib/email/quopriMIME.py ============================================================================== --- /python/trunk/Lib/email/quopriMIME.py Sat Mar 18 16:41:53 2006 +++ (empty file) @@ -1,318 +0,0 @@ -# Copyright (C) 2001-2004 Python Software Foundation -# Author: Ben Gertzfield -# Contact: email-sig at python.org - -"""Quoted-printable content transfer encoding per RFCs 2045-2047. - -This module handles the content transfer encoding method defined in RFC 2045 -to encode US ASCII-like 8-bit data called `quoted-printable'. It is used to -safely encode text that is in a character set similar to the 7-bit US ASCII -character set, but that includes some 8-bit characters that are normally not -allowed in email bodies or headers. - -Quoted-printable is very space-inefficient for encoding binary files; use the -email.base64MIME module for that instead. - -This module provides an interface to encode and decode both headers and bodies -with quoted-printable encoding. - -RFC 2045 defines a method for including character set information in an -`encoded-word' in a header. This method is commonly used for 8-bit real names -in To:/From:/Cc: etc. fields, as well as Subject: lines. - -This module does not do the line wrapping or end-of-line character -conversion necessary for proper internationalized headers; it only -does dumb encoding and decoding. To deal with the various line -wrapping issues, use the email.Header module. -""" - -import re -from string import hexdigits -from email.Utils import fix_eols - -CRLF = '\r\n' -NL = '\n' - -# See also Charset.py -MISC_LEN = 7 - -hqre = re.compile(r'[^-a-zA-Z0-9!*+/ ]') -bqre = re.compile(r'[^ !-<>-~\t]') - - - -# Helpers -def header_quopri_check(c): - """Return True if the character should be escaped with header quopri.""" - return bool(hqre.match(c)) - - -def body_quopri_check(c): - """Return True if the character should be escaped with body quopri.""" - return bool(bqre.match(c)) - - -def header_quopri_len(s): - """Return the length of str when it is encoded with header quopri.""" - count = 0 - for c in s: - if hqre.match(c): - count += 3 - else: - count += 1 - return count - - -def body_quopri_len(str): - """Return the length of str when it is encoded with body quopri.""" - count = 0 - for c in str: - if bqre.match(c): - count += 3 - else: - count += 1 - return count - - -def _max_append(L, s, maxlen, extra=''): - if not L: - L.append(s.lstrip()) - elif len(L[-1]) + len(s) <= maxlen: - L[-1] += extra + s - else: - L.append(s.lstrip()) - - -def unquote(s): - """Turn a string in the form =AB to the ASCII character with value 0xab""" - return chr(int(s[1:3], 16)) - - -def quote(c): - return "=%02X" % ord(c) - - - -def header_encode(header, charset="iso-8859-1", keep_eols=False, - maxlinelen=76, eol=NL): - """Encode a single header line with quoted-printable (like) encoding. - - Defined in RFC 2045, this `Q' encoding is similar to quoted-printable, but - used specifically for email header fields to allow charsets with mostly 7 - bit characters (and some 8 bit) to remain more or less readable in non-RFC - 2045 aware mail clients. - - charset names the character set to use to encode the header. It defaults - to iso-8859-1. - - The resulting string will be in the form: - - "=?charset?q?I_f=E2rt_in_your_g=E8n=E8ral_dire=E7tion?\\n - =?charset?q?Silly_=C8nglish_Kn=EEghts?=" - - with each line wrapped safely at, at most, maxlinelen characters (defaults - to 76 characters). If maxlinelen is None, the entire string is encoded in - one chunk with no splitting. - - End-of-line characters (\\r, \\n, \\r\\n) will be automatically converted - to the canonical email line separator \\r\\n unless the keep_eols - parameter is True (the default is False). - - Each line of the header will be terminated in the value of eol, which - defaults to "\\n". Set this to "\\r\\n" if you are using the result of - this function directly in email. - """ - # Return empty headers unchanged - if not header: - return header - - if not keep_eols: - header = fix_eols(header) - - # Quopri encode each line, in encoded chunks no greater than maxlinelen in - # length, after the RFC chrome is added in. - quoted = [] - if maxlinelen is None: - # An obnoxiously large number that's good enough - max_encoded = 100000 - else: - max_encoded = maxlinelen - len(charset) - MISC_LEN - 1 - - for c in header: - # Space may be represented as _ instead of =20 for readability - if c == ' ': - _max_append(quoted, '_', max_encoded) - # These characters can be included verbatim - elif not hqre.match(c): - _max_append(quoted, c, max_encoded) - # Otherwise, replace with hex value like =E2 - else: - _max_append(quoted, "=%02X" % ord(c), max_encoded) - - # Now add the RFC chrome to each encoded chunk and glue the chunks - # together. BAW: should we be able to specify the leading whitespace in - # the joiner? - joiner = eol + ' ' - return joiner.join(['=?%s?q?%s?=' % (charset, line) for line in quoted]) - - - -def encode(body, binary=False, maxlinelen=76, eol=NL): - """Encode with quoted-printable, wrapping at maxlinelen characters. - - If binary is False (the default), end-of-line characters will be converted - to the canonical email end-of-line sequence \\r\\n. Otherwise they will - be left verbatim. - - Each line of encoded text will end with eol, which defaults to "\\n". Set - this to "\\r\\n" if you will be using the result of this function directly - in an email. - - Each line will be wrapped at, at most, maxlinelen characters (defaults to - 76 characters). Long lines will have the `soft linefeed' quoted-printable - character "=" appended to them, so the decoded text will be identical to - the original text. - """ - if not body: - return body - - if not binary: - body = fix_eols(body) - - # BAW: We're accumulating the body text by string concatenation. That - # can't be very efficient, but I don't have time now to rewrite it. It - # just feels like this algorithm could be more efficient. - encoded_body = '' - lineno = -1 - # Preserve line endings here so we can check later to see an eol needs to - # be added to the output later. - lines = body.splitlines(1) - for line in lines: - # But strip off line-endings for processing this line. - if line.endswith(CRLF): - line = line[:-2] - elif line[-1] in CRLF: - line = line[:-1] - - lineno += 1 - encoded_line = '' - prev = None - linelen = len(line) - # Now we need to examine every character to see if it needs to be - # quopri encoded. BAW: again, string concatenation is inefficient. - for j in range(linelen): - c = line[j] - prev = c - if bqre.match(c): - c = quote(c) - elif j+1 == linelen: - # Check for whitespace at end of line; special case - if c not in ' \t': - encoded_line += c - prev = c - continue - # Check to see to see if the line has reached its maximum length - if len(encoded_line) + len(c) >= maxlinelen: - encoded_body += encoded_line + '=' + eol - encoded_line = '' - encoded_line += c - # Now at end of line.. - if prev and prev in ' \t': - # Special case for whitespace at end of file - if lineno + 1 == len(lines): - prev = quote(prev) - if len(encoded_line) + len(prev) > maxlinelen: - encoded_body += encoded_line + '=' + eol + prev - else: - encoded_body += encoded_line + prev - # Just normal whitespace at end of line - else: - encoded_body += encoded_line + prev + '=' + eol - encoded_line = '' - # Now look at the line we just finished and it has a line ending, we - # need to add eol to the end of the line. - if lines[lineno].endswith(CRLF) or lines[lineno][-1] in CRLF: - encoded_body += encoded_line + eol - else: - encoded_body += encoded_line - encoded_line = '' - return encoded_body - - -# For convenience and backwards compatibility w/ standard base64 module -body_encode = encode -encodestring = encode - - - -# BAW: I'm not sure if the intent was for the signature of this function to be -# the same as base64MIME.decode() or not... -def decode(encoded, eol=NL): - """Decode a quoted-printable string. - - Lines are separated with eol, which defaults to \\n. - """ - if not encoded: - return encoded - # BAW: see comment in encode() above. Again, we're building up the - # decoded string with string concatenation, which could be done much more - # efficiently. - decoded = '' - - for line in encoded.splitlines(): - line = line.rstrip() - if not line: - decoded += eol - continue - - i = 0 - n = len(line) - while i < n: - c = line[i] - if c <> '=': - decoded += c - i += 1 - # Otherwise, c == "=". Are we at the end of the line? If so, add - # a soft line break. - elif i+1 == n: - i += 1 - continue - # Decode if in form =AB - elif i+2 < n and line[i+1] in hexdigits and line[i+2] in hexdigits: - decoded += unquote(line[i:i+3]) - i += 3 - # Otherwise, not in form =AB, pass literally - else: - decoded += c - i += 1 - - if i == n: - decoded += eol - # Special case if original string did not end with eol - if not encoded.endswith(eol) and decoded.endswith(eol): - decoded = decoded[:-1] - return decoded - - -# For convenience and backwards compatibility w/ standard base64 module -body_decode = decode -decodestring = decode - - - -def _unquote_match(match): - """Turn a match in the form =AB to the ASCII character with value 0xab""" - s = match.group(0) - return unquote(s) - - -# Header decoding is done a bit differently -def header_decode(s): - """Decode a string encoded with RFC 2045 MIME header `Q' encoding. - - This function does not parse a full MIME header value encoded with - quoted-printable (like =?iso-8895-1?q?Hello_World?=) -- please use - the high level email.Header class for that functionality. - """ - s = s.replace('_', ' ') - return re.sub(r'=\w{2}', _unquote_match, s) Modified: python/trunk/Lib/email/test/test_email.py ============================================================================== --- python/trunk/Lib/email/test/test_email.py (original) +++ python/trunk/Lib/email/test/test_email.py Sat Mar 18 16:41:53 2006 @@ -39,9 +39,6 @@ EMPTYSTRING = '' SPACE = ' ' -# We don't care about DeprecationWarnings -warnings.filterwarnings('ignore', '', DeprecationWarning, __name__) - def openfile(filename, mode='r'): @@ -87,7 +84,7 @@ charset = Charset('iso-8859-1') msg.set_charset(charset) eq(msg['mime-version'], '1.0') - eq(msg.get_type(), 'text/plain') + eq(msg.get_content_type(), 'text/plain') eq(msg['content-type'], 'text/plain; charset="iso-8859-1"') eq(msg.get_param('charset'), 'iso-8859-1') eq(msg['content-transfer-encoding'], 'quoted-printable') @@ -211,6 +208,19 @@ msg.set_payload('foo') eq(msg.get_payload(decode=True), 'foo') + def test_decode_bogus_uu_payload_quietly(self): + msg = Message() + msg.set_payload('begin 664 foo.txt\n%') @@ -1706,16 +1716,16 @@ fp.close() container1 = msg.get_payload(0) eq(container1.get_default_type(), 'message/rfc822') - eq(container1.get_type(), None) + eq(container1.get_content_type(), 'message/rfc822') container2 = msg.get_payload(1) eq(container2.get_default_type(), 'message/rfc822') - eq(container2.get_type(), None) + eq(container2.get_content_type(), 'message/rfc822') container1a = container1.get_payload(0) eq(container1a.get_default_type(), 'text/plain') - eq(container1a.get_type(), 'text/plain') + eq(container1a.get_content_type(), 'text/plain') container2a = container2.get_payload(0) eq(container2a.get_default_type(), 'text/plain') - eq(container2a.get_type(), 'text/plain') + eq(container2a.get_content_type(), 'text/plain') def test_default_type_with_explicit_container_type(self): eq = self.assertEqual @@ -1726,16 +1736,16 @@ fp.close() container1 = msg.get_payload(0) eq(container1.get_default_type(), 'message/rfc822') - eq(container1.get_type(), 'message/rfc822') + eq(container1.get_content_type(), 'message/rfc822') container2 = msg.get_payload(1) eq(container2.get_default_type(), 'message/rfc822') - eq(container2.get_type(), 'message/rfc822') + eq(container2.get_content_type(), 'message/rfc822') container1a = container1.get_payload(0) eq(container1a.get_default_type(), 'text/plain') - eq(container1a.get_type(), 'text/plain') + eq(container1a.get_content_type(), 'text/plain') container2a = container2.get_payload(0) eq(container2a.get_default_type(), 'text/plain') - eq(container2a.get_type(), 'text/plain') + eq(container2a.get_content_type(), 'text/plain') def test_default_type_non_parsed(self): eq = self.assertEqual @@ -1750,9 +1760,9 @@ subpart2 = MIMEMessage(subpart2a) container.attach(subpart1) container.attach(subpart2) - eq(subpart1.get_type(), 'message/rfc822') + eq(subpart1.get_content_type(), 'message/rfc822') eq(subpart1.get_default_type(), 'message/rfc822') - eq(subpart2.get_type(), 'message/rfc822') + eq(subpart2.get_content_type(), 'message/rfc822') eq(subpart2.get_default_type(), 'message/rfc822') neq(container.as_string(0), '''\ Content-Type: multipart/digest; boundary="BOUNDARY" @@ -1784,9 +1794,9 @@ del subpart1['mime-version'] del subpart2['content-type'] del subpart2['mime-version'] - eq(subpart1.get_type(), None) + eq(subpart1.get_content_type(), 'message/rfc822') eq(subpart1.get_default_type(), 'message/rfc822') - eq(subpart2.get_type(), None) + eq(subpart2.get_content_type(), 'message/rfc822') eq(subpart2.get_default_type(), 'message/rfc822') neq(container.as_string(0), '''\ Content-Type: multipart/digest; boundary="BOUNDARY" @@ -1847,7 +1857,7 @@ def test_parse_text_message(self): eq = self.assertEquals msg, text = self._msgobj('msg_01.txt') - eq(msg.get_type(), 'text/plain') + eq(msg.get_content_type(), 'text/plain') eq(msg.get_content_maintype(), 'text') eq(msg.get_content_subtype(), 'plain') eq(msg.get_params()[1], ('charset', 'us-ascii')) @@ -1859,7 +1869,7 @@ def test_parse_untyped_message(self): eq = self.assertEquals msg, text = self._msgobj('msg_03.txt') - eq(msg.get_type(), None) + eq(msg.get_content_type(), 'text/plain') eq(msg.get_params(), None) eq(msg.get_param('charset'), None) self._idempotent(msg, text) @@ -1933,7 +1943,7 @@ unless = self.failUnless # Get a message object and reset the seek pointer for other tests msg, text = self._msgobj('msg_05.txt') - eq(msg.get_type(), 'multipart/report') + eq(msg.get_content_type(), 'multipart/report') # Test the Content-Type: parameters params = {} for pk, pv in msg.get_params(): @@ -1945,13 +1955,13 @@ eq(len(msg.get_payload()), 3) # Make sure the subparts are what we expect msg1 = msg.get_payload(0) - eq(msg1.get_type(), 'text/plain') + eq(msg1.get_content_type(), 'text/plain') eq(msg1.get_payload(), 'Yadda yadda yadda\n') msg2 = msg.get_payload(1) - eq(msg2.get_type(), None) + eq(msg2.get_content_type(), 'text/plain') eq(msg2.get_payload(), 'Yadda yadda yadda\n') msg3 = msg.get_payload(2) - eq(msg3.get_type(), 'message/rfc822') + eq(msg3.get_content_type(), 'message/rfc822') self.failUnless(isinstance(msg3, Message)) payload = msg3.get_payload() unless(isinstance(payload, list)) @@ -1965,7 +1975,7 @@ unless = self.failUnless msg, text = self._msgobj('msg_06.txt') # Check some of the outer headers - eq(msg.get_type(), 'message/rfc822') + eq(msg.get_content_type(), 'message/rfc822') # Make sure the payload is a list of exactly one sub-Message, and that # that submessage has a type of text/plain payload = msg.get_payload() @@ -1973,7 +1983,7 @@ eq(len(payload), 1) msg1 = payload[0] self.failUnless(isinstance(msg1, Message)) - eq(msg1.get_type(), 'text/plain') + eq(msg1.get_content_type(), 'text/plain') self.failUnless(isinstance(msg1.get_payload(), str)) eq(msg1.get_payload(), '\n') @@ -2058,13 +2068,19 @@ module = __import__('email') all = module.__all__ all.sort() - self.assertEqual(all, ['Charset', 'Encoders', 'Errors', 'Generator', - 'Header', 'Iterators', 'MIMEAudio', 'MIMEBase', - 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', - 'MIMENonMultipart', 'MIMEText', 'Message', - 'Parser', 'Utils', 'base64MIME', - 'message_from_file', 'message_from_string', - 'quopriMIME']) + self.assertEqual(all, [ + # Old names + 'Charset', 'Encoders', 'Errors', 'Generator', + 'Header', 'Iterators', 'MIMEAudio', 'MIMEBase', + 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', + 'MIMENonMultipart', 'MIMEText', 'Message', + 'Parser', 'Utils', 'base64MIME', + # new names + 'base64mime', 'charset', 'encoders', 'errors', 'generator', + 'header', 'iterators', 'message', 'message_from_file', + 'message_from_string', 'mime', 'parser', + 'quopriMIME', 'quoprimime', 'utils', + ]) def test_formatdate(self): now = time.time() @@ -2356,7 +2372,7 @@ fp.close() eq(msg['from'], 'ppp-request at zzz.org') eq(msg['to'], 'ppp at zzz.org') - eq(msg.get_type(), 'multipart/mixed') + eq(msg.get_content_type(), 'multipart/mixed') self.failIf(msg.is_multipart()) self.failUnless(isinstance(msg.get_payload(), str)) @@ -2405,10 +2421,10 @@ fp.close() eq(len(msg.get_payload()), 2) part1 = msg.get_payload(0) - eq(part1.get_type(), 'text/plain') + eq(part1.get_content_type(), 'text/plain') eq(part1.get_payload(), 'Simple email with attachment.\r\n\r\n') part2 = msg.get_payload(1) - eq(part2.get_type(), 'application/riscos') + eq(part2.get_content_type(), 'application/riscos') def test_multipart_digest_with_extra_mime_headers(self): eq = self.assertEqual @@ -2427,21 +2443,21 @@ eq(msg.is_multipart(), 1) eq(len(msg.get_payload()), 2) part1 = msg.get_payload(0) - eq(part1.get_type(), 'message/rfc822') + eq(part1.get_content_type(), 'message/rfc822') eq(part1.is_multipart(), 1) eq(len(part1.get_payload()), 1) part1a = part1.get_payload(0) eq(part1a.is_multipart(), 0) - eq(part1a.get_type(), 'text/plain') + eq(part1a.get_content_type(), 'text/plain') neq(part1a.get_payload(), 'message 1\n') # next message/rfc822 part2 = msg.get_payload(1) - eq(part2.get_type(), 'message/rfc822') + eq(part2.get_content_type(), 'message/rfc822') eq(part2.is_multipart(), 1) eq(len(part2.get_payload()), 1) part2a = part2.get_payload(0) eq(part2a.is_multipart(), 0) - eq(part2a.get_type(), 'text/plain') + eq(part2a.get_content_type(), 'text/plain') neq(part2a.get_payload(), 'message 2\n') def test_three_lines(self): @@ -2723,6 +2739,11 @@ c = Charset('fake') eq('hello w\xf6rld', c.body_encode('hello w\xf6rld')) + def test_unicode_charset_name(self): + charset = Charset(u'us-ascii') + self.assertEqual(str(charset), 'us-ascii') + self.assertRaises(Errors.CharsetError, Charset, 'asc\xffii') + # Test multilingual MIME headers. Modified: python/trunk/Lib/email/test/test_email_codecs.py ============================================================================== --- python/trunk/Lib/email/test/test_email_codecs.py (original) +++ python/trunk/Lib/email/test/test_email_codecs.py Sat Mar 18 16:41:53 2006 @@ -10,6 +10,13 @@ from email.Header import Header, decode_header from email.Message import Message +# We're compatible with Python 2.3, but it doesn't have the built-in Asian +# codecs, so we have to skip all these tests. +try: + unicode('foo', 'euc-jp') +except LookupError: + raise TestSkipped + class TestEmailAsianCodecs(TestEmailBase): Modified: python/trunk/Lib/test/test_pyclbr.py ============================================================================== --- python/trunk/Lib/test/test_pyclbr.py (original) +++ python/trunk/Lib/test/test_pyclbr.py Sat Mar 18 16:41:53 2006 @@ -170,7 +170,7 @@ cm('pydoc') # Tests for modules inside packages - cm('email.Parser') + cm('email.parser') cm('test.test_pyclbr') From barry at python.org Sat Mar 18 16:47:34 2006 From: barry at python.org (Barry Warsaw) Date: Sat, 18 Mar 2006 10:47:34 -0500 Subject: [Python-checkins] r43136 - in python/trunk: Doc/lib/email-dir.py Doc/lib/email-mime.py Doc/lib/email-simple.py Doc/lib/email-unpack.py Doc/lib/email.tex Doc/lib/emailcharsets.tex Doc/lib/emailencoders.tex Doc/lib/emailexc.tex Doc/lib/emailgenerator.tex Doc/lib/emailheaders.tex Doc/lib/emailiter.tex Doc/lib/emailmessage.tex Doc/lib/emailmimebase.tex Doc/lib/emailparser.tex Doc/lib/emailutil.tex Doc/lib/mimelib.tex Lib/email/Charset.py Lib/email/Encoders.py Lib/email/Errors.py Lib/email/FeedParser.py Lib/email/Generator.py Lib/email/Header.py Lib/email/Iterators.py Lib/email/MIMEAudio.py Lib/email/MIMEBase.py Lib/email/MIMEImage.py Lib/email/MIMEMessage.py Lib/email/MIMEMultipart.py Lib/email/MIMENonMultipart.py Lib/email/MIMEText.py Lib/email/Message.py Lib/email/Parser.py Lib/email/Utils.py Lib/email/__init__.py Lib/email/_parseaddr.py Lib/email/base64MIME.py Lib/email/base64mime.py Lib/email/charset.py Lib/email/encoders.py Lib/email/errors.py Lib/email/feedparser.py Lib/email/generator.py Lib/email/header.py Lib/email/iterators.py Lib/email/message.py Lib/email/mime Lib/email/parser.py Lib/email/quopriMIME.py Lib/email/quoprimime.py Lib/email/test/data/msg_26.txt Lib/email/test/data/msg_44.txt Lib/email/test/test_email.py Lib/email/test/test_email_codecs.py Lib/email/test/test_email_codecs_renamed.py Lib/email/test/test_email_renamed.py Lib/email/utils.py Lib/test/test_pyclbr.py In-Reply-To: <20060318154157.251AF1E400D@bag.python.org> References: <20060318154157.251AF1E400D@bag.python.org> Message-ID: <1142696854.32075.52.camel@geddy.wooz.org> On Sat, 2006-03-18 at 16:41 +0100, barry.warsaw wrote: > Author: barry.warsaw > Date: Sat Mar 18 16:41:53 2006 > New Revision: 43136 Just a note for those of you on case-insensitive file systems. You may have some trouble updating to this revision because svn will complain about an "object of the same name already exists". E.g. Header.py is deleted and header.py was added, but CIFS's won't know that. Just delete the old names and let svn up restore the new names. -Barry -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 309 bytes Desc: This is a digitally signed message part Url : http://mail.python.org/pipermail/python-checkins/attachments/20060318/8684df0e/attachment.pgp From python-checkins at python.org Sat Mar 18 17:17:17 2006 From: python-checkins at python.org (barry.warsaw) Date: Sat, 18 Mar 2006 17:17:17 +0100 (CET) Subject: [Python-checkins] r43137 - python/trunk/Lib/test/test_email_renamed.py Message-ID: <20060318161717.C37CE1E404A@bag.python.org> Author: barry.warsaw Date: Sat Mar 18 17:17:17 2006 New Revision: 43137 Added: python/trunk/Lib/test/test_email_renamed.py - copied, changed from r43136, python/trunk/Lib/test/test_email.py Log: Shim for test_email_renamed.py tests. Copied: python/trunk/Lib/test/test_email_renamed.py (from r43136, python/trunk/Lib/test/test_email.py) ============================================================================== --- python/trunk/Lib/test/test_email.py (original) +++ python/trunk/Lib/test/test_email_renamed.py Sat Mar 18 17:17:17 2006 @@ -1,9 +1,9 @@ -# Copyright (C) 2001,2002 Python Software Foundation +# Copyright (C) 2001-2006 Python Software Foundation # email package unit tests import unittest # The specific tests now live in Lib/email/test -from email.test.test_email import suite +from email.test.test_email_renamed import suite from test.test_support import run_suite def test_main(): From python-checkins at python.org Sat Mar 18 17:35:17 2006 From: python-checkins at python.org (walter.doerwald) Date: Sat, 18 Mar 2006 17:35:17 +0100 (CET) Subject: [Python-checkins] r43138 - python/trunk/Lib/codecs.py Message-ID: <20060318163517.F07CE1E400D@bag.python.org> Author: walter.doerwald Date: Sat Mar 18 17:35:17 2006 New Revision: 43138 Modified: python/trunk/Lib/codecs.py Log: Change raise statement to PEP 8 style. Modified: python/trunk/Lib/codecs.py ============================================================================== --- python/trunk/Lib/codecs.py (original) +++ python/trunk/Lib/codecs.py Sat Mar 18 17:35:17 2006 @@ -14,8 +14,7 @@ try: from _codecs import * except ImportError, why: - raise SystemError,\ - 'Failed to load the builtin codecs: %s' % why + raise SystemError('Failed to load the builtin codecs: %s' % why) __all__ = ["register", "lookup", "open", "EncodedFile", "BOM", "BOM_BE", "BOM_LE", "BOM32_BE", "BOM32_LE", "BOM64_BE", "BOM64_LE", From theller at python.net Sat Mar 18 18:36:18 2006 From: theller at python.net (Thomas Heller) Date: Sat, 18 Mar 2006 18:36:18 +0100 Subject: [Python-checkins] r43115 - in python/trunk: Lib/ctypes/__init__.py Lib/ctypes/test/test_byteswap.py Lib/ctypes/test/test_cfuncs.py Lib/ctypes/test/test_loading.py Lib/ctypes/test/test_sizes.py Modules/_ctypes/_ctypes.c Modules/_ctypes/callproc.c In-Reply-To: References: <20060317155300.A315E1E400B@bag.python.org> Message-ID: Neal Norwitz wrote: > On 3/17/06, thomas.heller wrote: >> Author: thomas.heller >> Date: Fri Mar 17 16:52:58 2006 >> New Revision: 43115 >> >> @@ -198,17 +199,20 @@ >> pass >> self.assertRaises(TypeError, setattr, S, "_fields_", [("s", T)]) >> >> - # crashes on solaris with a core dump. >> - def X_test_struct_fields(self): >> + def test_struct_fields_2(self): >> + # standard packing in struct uses no alignment. >> + # So, we have to align using pad bytes. >> + # >> + # Unaligned accesses will crash Python (on those platforms that >> + # don't allow it, like sparc solaris). > > Note: this is really a bug in Python that should be fixed. > > >> Modified: python/trunk/Modules/_ctypes/_ctypes.c >> ============================================================================== >> --- python/trunk/Modules/_ctypes/_ctypes.c (original) >> +++ python/trunk/Modules/_ctypes/_ctypes.c Fri Mar 17 16:52:58 2006 >> @@ -2529,9 +2556,14 @@ >> #ifdef MS_WIN32 >> address = FindAddress(handle, name, (PyObject *)type); >> if (!address) { >> - PyErr_Format(PyExc_AttributeError, >> - "function '%s' not found", >> - name); >> + if ((size_t)name & ~0xFFFF) >> + PyErr_Format(PyExc_AttributeError, >> + "function '%s' not found", >> + name); >> + else >> + PyErr_Format(PyExc_AttributeError, >> + "function ordinal %d not found", >> + name); > > name can't be both a string and an integer. That last error message > looks wrong. > > n I'm working on both. Thomas From python-checkins at python.org Sat Mar 18 19:07:35 2006 From: python-checkins at python.org (hyeshik.chang) Date: Sat, 18 Mar 2006 19:07:35 +0100 (CET) Subject: [Python-checkins] r43139 - python/trunk/Lib/email/mime Message-ID: <20060318180735.DB37F1E400D@bag.python.org> Author: hyeshik.chang Date: Sat Mar 18 19:07:35 2006 New Revision: 43139 Modified: python/trunk/Lib/email/mime/ (props changed) Log: Ignore *.pyc and *.pyo From python-checkins at python.org Sat Mar 18 19:12:26 2006 From: python-checkins at python.org (barry.warsaw) Date: Sat, 18 Mar 2006 19:12:26 +0100 (CET) Subject: [Python-checkins] r43140 - python/trunk/Doc Message-ID: <20060318181226.741AF1E400D@bag.python.org> Author: barry.warsaw Date: Sat Mar 18 19:12:26 2006 New Revision: 43140 Modified: python/trunk/Doc/ (props changed) Log: Ignore api.{dvi,idx,ind,l2h,log,toc} and modapi.ind, via suffix wildcards. From python-checkins at python.org Sat Mar 18 23:33:37 2006 From: python-checkins at python.org (neal.norwitz) Date: Sat, 18 Mar 2006 23:33:37 +0100 (CET) Subject: [Python-checkins] r43141 - peps/trunk/pep-0356.txt Message-ID: <20060318223337.4D7681E400E@bag.python.org> Author: neal.norwitz Date: Sat Mar 18 23:33:36 2006 New Revision: 43141 Modified: peps/trunk/pep-0356.txt Log: Add some open issues based on mail from py-dev. Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Sat Mar 18 23:33:36 2006 @@ -124,7 +124,15 @@ Open issues - - Review PEP 4: Deprecate and/or remove the modules + - xmlplus/xmlcore situation wrt ElementTree needs resolution + http://mail.python.org/pipermail/python-dev/2005-December/058752.html + + - should C modules listed in "Undocumented modules" be removed too? + "timing" (listed as obsolete), "cl" (listed as possibly not up-to-date), + and "sv" (listed as obsolete hardware specific). + + - Barry Warsaw wants some changes to PEP 352. + http://mail.python.org/pipermail/python-dev/2006-March/062570.html Copyright From python-checkins at python.org Sun Mar 19 12:20:32 2006 From: python-checkins at python.org (georg.brandl) Date: Sun, 19 Mar 2006 12:20:32 +0100 (CET) Subject: [Python-checkins] r43142 - python/trunk/Doc/tut/tut.tex Message-ID: <20060319112032.F3EBC1E4002@bag.python.org> Author: georg.brandl Date: Sun Mar 19 12:20:29 2006 New Revision: 43142 Modified: python/trunk/Doc/tut/tut.tex Log: Update tutorial wrt PEP 341 try-except-finally statement Modified: python/trunk/Doc/tut/tut.tex ============================================================================== --- python/trunk/Doc/tut/tut.tex (original) +++ python/trunk/Doc/tut/tut.tex Sun Mar 19 12:20:29 2006 @@ -3692,19 +3692,49 @@ KeyboardInterrupt \end{verbatim} -A \emph{finally clause} is executed whether or not an exception has -occurred in the try clause. When an exception has occurred, it is -re-raised after the finally clause is executed. The finally clause is -also executed ``on the way out'' when the \keyword{try} statement is -left via a \keyword{break} or \keyword{return} statement. - -The code in the finally clause is useful for releasing external -resources (such as files or network connections), regardless of -whether the use of the resource was successful. - -A \keyword{try} statement must either have one or more except clauses -or one finally clause, but not both (because it would be unclear which -clause should be executed first). +A \emph{finally clause} is always executed before leaving the +\keyword{try} statement, whether an exception has occurred or not. +When an exception has occurred in the \keyword{try} clause and has not +been handled by an \keyword{except} clause (or it has occurred in a +\keyword{except} or \keyword{else} clause), it is re-raised after the +\keyword{finally} clause has been executed. The \keyword{finally} clause +is also executed ``on the way out'' when any other clause of the +\keyword{try} statement is left via a \keyword{break}, \keyword{continue} +or \keyword{return} statement. A more complicated example: + +\begin{verbatim} +>>> def divide(x, y): +... try: +... result = x / y +... except ZeroDivisionError: +... print "division by zero!" +... else: +... print "result is", result +... finally: +... print "executing finally clause" +... +>>> divide(2, 1) +result is 2 +executing finally clause +>>> divide(2, 0) +division by zero! +executing finally clause +>>> divide("2", "1") +executing finally clause +Traceback (most recent call last): + File "", line 1, in ? + File "", line 3, in divide +TypeError: unsupported operand type(s) for /: 'str' and 'str' +\end{verbatim} + +As you can see, the \keyword{finally} clause is executed in any +event. The \exception{TypeError} raised by dividing two strings +is not handled by the \keyword{except} clause and therefore +re-raised after the \keyword{finally} clauses has been executed. + +In real world applications, the \keyword{finally} clause is useful +for releasing external resources (such as files or network connections), +regardless of whether the use of the resource was successful. \chapter{Classes \label{classes}} From python-checkins at python.org Sun Mar 19 21:40:09 2006 From: python-checkins at python.org (kurt.kaiser) Date: Sun, 19 Mar 2006 21:40:09 +0100 (CET) Subject: [Python-checkins] r43143 - python/trunk/Lib/idlelib/IOBinding.py python/trunk/Lib/idlelib/NEWS.txt Message-ID: <20060319204009.CF5CB1E402B@bag.python.org> Author: kurt.kaiser Date: Sun Mar 19 21:40:05 2006 New Revision: 43143 Modified: python/trunk/Lib/idlelib/IOBinding.py python/trunk/Lib/idlelib/NEWS.txt Log: Source file f.flush() after writing; trying to avoid lossage if user kills GUI. Report from B. Sherwood. Backport to 2.3.4. Modified: python/trunk/Lib/idlelib/IOBinding.py ============================================================================== --- python/trunk/Lib/idlelib/IOBinding.py (original) +++ python/trunk/Lib/idlelib/IOBinding.py Sun Mar 19 21:40:05 2006 @@ -377,6 +377,7 @@ try: f = open(filename, "wb") f.write(chars) + f.flush() f.close() return True except IOError, msg: Modified: python/trunk/Lib/idlelib/NEWS.txt ============================================================================== --- python/trunk/Lib/idlelib/NEWS.txt (original) +++ python/trunk/Lib/idlelib/NEWS.txt Sun Mar 19 21:40:05 2006 @@ -3,6 +3,9 @@ *Release date: XX-XXX-2006* +- Source file f.flush() after writing; trying to avoid lossage if user + kills GUI. + - Options / Keys / Advanced dialog made functional. Also, allow binding of 'movement' keys. @@ -70,7 +73,7 @@ - Improve error handling when .idlerc can't be created (warn and exit). -- The GUI was hanging if the shell window was closed while a raw_input() +- The GUI was hanging if the shell window was closed while a raw_input() was pending. Restored the quit() of the readline() mainloop(). http://mail.python.org/pipermail/idle-dev/2004-December/002307.html From python-checkins at python.org Sun Mar 19 23:12:04 2006 From: python-checkins at python.org (kurt.kaiser) Date: Sun, 19 Mar 2006 23:12:04 +0100 (CET) Subject: [Python-checkins] r43144 - python/branches/release24-maint/Lib/idlelib/IOBinding.py python/branches/release24-maint/Lib/idlelib/NEWS.txt Message-ID: <20060319221204.93F211E4007@bag.python.org> Author: kurt.kaiser Date: Sun Mar 19 23:12:03 2006 New Revision: 43144 Modified: python/branches/release24-maint/Lib/idlelib/IOBinding.py python/branches/release24-maint/Lib/idlelib/NEWS.txt Log: Source file f.flush() after writing; trying to avoid lossage if user kills GUI. Report from Bruce Sherwood. Modified: python/branches/release24-maint/Lib/idlelib/IOBinding.py ============================================================================== --- python/branches/release24-maint/Lib/idlelib/IOBinding.py (original) +++ python/branches/release24-maint/Lib/idlelib/IOBinding.py Sun Mar 19 23:12:03 2006 @@ -374,6 +374,7 @@ try: f = open(filename, "wb") f.write(chars) + f.flush() f.close() return True except IOError, msg: Modified: python/branches/release24-maint/Lib/idlelib/NEWS.txt ============================================================================== --- python/branches/release24-maint/Lib/idlelib/NEWS.txt (original) +++ python/branches/release24-maint/Lib/idlelib/NEWS.txt Sun Mar 19 23:12:03 2006 @@ -1,3 +1,12 @@ +What's New in IDLE 1.1.3? +========================= + +*Release date: + +- Source file f.flush() after writing; trying to avoid lossage if user + kills GUI. Reported by Bruce Sherwood. + + What's New in IDLE 1.1.2? ========================= From python-checkins at python.org Mon Mar 20 02:53:26 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 02:53:26 +0100 (CET) Subject: [Python-checkins] r43145 - in python/trunk: Modules/stropmodule.c Objects/classobject.c Objects/frameobject.c Objects/stringobject.c Parser/tokenizer.c Python/import.c Python/traceback.c Message-ID: <20060320015326.6C98E1E400F@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 02:53:23 2006 New Revision: 43145 Modified: python/trunk/Modules/stropmodule.c python/trunk/Objects/classobject.c python/trunk/Objects/frameobject.c python/trunk/Objects/stringobject.c python/trunk/Parser/tokenizer.c python/trunk/Python/import.c python/trunk/Python/traceback.c Log: Use macro versions instead of function versions when we already know the type. This will hopefully get rid of some Coverity warnings, be a hint to developers, and be marginally faster. Some asserts were added when the type is currently known, but depends on values from another function. Modified: python/trunk/Modules/stropmodule.c ============================================================================== --- python/trunk/Modules/stropmodule.c (original) +++ python/trunk/Modules/stropmodule.c Mon Mar 20 02:53:23 2006 @@ -942,7 +942,7 @@ } table = table1; - inlen = PyString_Size(input_obj); + inlen = PyString_GET_SIZE(input_obj); result = PyString_FromStringAndSize((char *)NULL, inlen); if (result == NULL) return NULL; Modified: python/trunk/Objects/classobject.c ============================================================================== --- python/trunk/Objects/classobject.c (original) +++ python/trunk/Objects/classobject.c Mon Mar 20 02:53:23 2006 @@ -388,15 +388,15 @@ Py_INCREF(name); return name; } - m = PyString_Size(mod); - n = PyString_Size(name); + m = PyString_GET_SIZE(mod); + n = PyString_GET_SIZE(name); res = PyString_FromStringAndSize((char *)NULL, m+1+n); if (res != NULL) { - char *s = PyString_AsString(res); - memcpy(s, PyString_AsString(mod), m); + char *s = PyString_AS_STRING(res); + memcpy(s, PyString_AS_STRING(mod), m); s += m; *s++ = '.'; - memcpy(s, PyString_AsString(name), n); + memcpy(s, PyString_AS_STRING(name), n); } return res; } Modified: python/trunk/Objects/frameobject.c ============================================================================== --- python/trunk/Objects/frameobject.c (original) +++ python/trunk/Objects/frameobject.c Mon Mar 20 02:53:23 2006 @@ -749,7 +749,7 @@ return; PyErr_Fetch(&error_type, &error_value, &error_traceback); fast = f->f_localsplus; - j = PyTuple_Size(map); + j = PyTuple_GET_SIZE(map); if (j > f->f_nlocals) j = f->f_nlocals; if (f->f_nlocals) @@ -787,7 +787,7 @@ return; PyErr_Fetch(&error_type, &error_value, &error_traceback); fast = f->f_localsplus; - j = PyTuple_Size(map); + j = PyTuple_GET_SIZE(map); if (j > f->f_nlocals) j = f->f_nlocals; if (f->f_nlocals) Modified: python/trunk/Objects/stringobject.c ============================================================================== --- python/trunk/Objects/stringobject.c (original) +++ python/trunk/Objects/stringobject.c Mon Mar 20 02:53:23 2006 @@ -569,8 +569,9 @@ if (!w) goto failed; /* Append bytes to output buffer. */ - r = PyString_AsString(w); - rn = PyString_Size(w); + assert(PyString_Check(w)); + r = PyString_AS_STRING(w); + rn = PyString_GET_SIZE(w); memcpy(p, r, rn); p += rn; Py_DECREF(w); @@ -2314,12 +2315,12 @@ } table = table1; - inlen = PyString_Size(input_obj); + 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); + input = PyString_AS_STRING(input_obj); if (dellen == 0) { /* If no deletions are required, use faster code */ Modified: python/trunk/Parser/tokenizer.c ============================================================================== --- python/trunk/Parser/tokenizer.c (original) +++ python/trunk/Parser/tokenizer.c Mon Mar 20 02:53:23 2006 @@ -711,7 +711,9 @@ if (utf8 == NULL) goto error_clear; - converted = new_string(PyString_AsString(utf8), PyString_Size(utf8)); + assert(PyString_Check(utf8)); + converted = new_string(PyString_AS_STRING(utf8), + PyString_GET_SIZE(utf8)); Py_DECREF(utf8); if (converted == NULL) goto error_nomem; Modified: python/trunk/Python/import.c ============================================================================== --- python/trunk/Python/import.c (original) +++ python/trunk/Python/import.c Mon Mar 20 02:53:23 2006 @@ -1216,12 +1216,12 @@ #endif if (!PyString_Check(v)) continue; - len = PyString_Size(v); + len = PyString_GET_SIZE(v); if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { Py_XDECREF(copy); continue; /* Too long */ } - strcpy(buf, PyString_AsString(v)); + strcpy(buf, PyString_AS_STRING(v)); if (strlen(buf) != len) { Py_XDECREF(copy); continue; /* v contains '\0' */ Modified: python/trunk/Python/traceback.c ============================================================================== --- python/trunk/Python/traceback.c (original) +++ python/trunk/Python/traceback.c Mon Mar 20 02:53:23 2006 @@ -165,7 +165,7 @@ } if (PyString_Check(v)) { size_t len; - len = PyString_Size(v); + len = PyString_GET_SIZE(v); if (len + 1 + taillen >= MAXPATHLEN) continue; /* Too long */ strcpy(namebuf, PyString_AsString(v)); From python-checkins at python.org Mon Mar 20 02:55:26 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 02:55:26 +0100 (CET) Subject: [Python-checkins] r43146 - python/trunk/Objects/abstract.c Message-ID: <20060320015526.86CE51E4041@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 02:55:26 2006 New Revision: 43146 Modified: python/trunk/Objects/abstract.c Log: Update function name to reflect params and stop casting to long to avoid losing data Modified: python/trunk/Objects/abstract.c ============================================================================== --- python/trunk/Objects/abstract.c (original) +++ python/trunk/Objects/abstract.c Mon Mar 20 02:55:26 2006 @@ -1248,13 +1248,13 @@ } static PyObject * -sliceobj_from_intint(Py_ssize_t i, Py_ssize_t j) +sliceobj_from_ssizet_ssizet(Py_ssize_t i, Py_ssize_t j) { PyObject *start, *end, *slice; - start = PyInt_FromLong((long)i); + start = PyInt_FromSsize_t(i); if (!start) return NULL; - end = PyInt_FromLong((long)j); + end = PyInt_FromSsize_t(j); if (!end) { Py_DECREF(start); return NULL; @@ -1289,7 +1289,7 @@ return m->sq_slice(s, i1, i2); } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) { PyObject *res; - PyObject *slice = sliceobj_from_intint(i1, i2); + PyObject *slice = sliceobj_from_ssizet_ssizet(i1, i2); if (!slice) return NULL; res = mp->mp_subscript(s, slice); @@ -1381,7 +1381,7 @@ return m->sq_ass_slice(s, i1, i2, o); } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) { int res; - PyObject *slice = sliceobj_from_intint(i1, i2); + PyObject *slice = sliceobj_from_ssizet_ssizet(i1, i2); if (!slice) return -1; res = mp->mp_ass_subscript(s, slice, o); From python-checkins at python.org Mon Mar 20 02:58:40 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 02:58:40 +0100 (CET) Subject: [Python-checkins] r43147 - in python/trunk: Lib/test/test_datetime.py Modules/datetimemodule.c Message-ID: <20060320015840.7222B1E400F@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 02:58:39 2006 New Revision: 43147 Modified: python/trunk/Lib/test/test_datetime.py python/trunk/Modules/datetimemodule.c Log: Fix problem spotted by Coverity that occurs if tzinfo.tzname().replace() returns a non-string when converting %Z. Will backport. Modified: python/trunk/Lib/test/test_datetime.py ============================================================================== --- python/trunk/Lib/test/test_datetime.py (original) +++ python/trunk/Lib/test/test_datetime.py Mon Mar 20 02:58:39 2006 @@ -1168,6 +1168,17 @@ self.assertEqual(dt2 - dt1, us) self.assert_(dt1 < dt2) + def test_strftime_with_bad_tzname_replace(self): + # verify ok if tzinfo.tzname().replace() returns a non-string + class MyTzInfo(FixedOffset): + def tzname(self, dt): + class MyStr(str): + def replace(self, *args): + return None + return MyStr('name') + t = self.theclass(2005, 3, 2, 0, 0, 0, 0, MyTzInfo(3, 'name')) + self.assertRaises(TypeError, t.strftime, '%Z') + def test_bad_constructor_arguments(self): # bad years self.theclass(MINYEAR, 1, 1) # no exception Modified: python/trunk/Modules/datetimemodule.c ============================================================================== --- python/trunk/Modules/datetimemodule.c (original) +++ python/trunk/Modules/datetimemodule.c Mon Mar 20 02:58:39 2006 @@ -1228,8 +1228,8 @@ } } assert(zreplacement != NULL); - ptoappend = PyString_AsString(zreplacement); - ntoappend = PyString_Size(zreplacement); + ptoappend = PyString_AS_STRING(zreplacement); + ntoappend = PyString_GET_SIZE(zreplacement); } else if (ch == 'Z') { /* format tzname */ @@ -1257,14 +1257,18 @@ 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); } } assert(Zreplacement != NULL); - ptoappend = PyString_AsString(Zreplacement); - ntoappend = PyString_Size(Zreplacement); + ptoappend = PyString_AS_STRING(Zreplacement); + ntoappend = PyString_GET_SIZE(Zreplacement); } else { /* percent followed by neither z nor Z */ @@ -1275,6 +1279,7 @@ /* Append the ntoappend chars starting at ptoappend to * the new format. */ + assert(ptoappend != NULL); assert(ntoappend >= 0); if (ntoappend == 0) continue; From python-checkins at python.org Mon Mar 20 03:04:24 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 03:04:24 +0100 (CET) Subject: [Python-checkins] r43148 - python/trunk/Mac/Modules/cf/_CFmodule.c Message-ID: <20060320020424.3192D1E400F@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 03:04:23 2006 New Revision: 43148 Modified: python/trunk/Mac/Modules/cf/_CFmodule.c Log: Get rid of some warnings. Modified: python/trunk/Mac/Modules/cf/_CFmodule.c ============================================================================== --- python/trunk/Mac/Modules/cf/_CFmodule.c (original) +++ python/trunk/Mac/Modules/cf/_CFmodule.c Mon Mar 20 03:04:23 2006 @@ -1329,7 +1329,7 @@ if (v == Py_None) { *p_itself = NULL; return 1; } if (PyString_Check(v)) { char *cStr; - int cLen; + Py_ssize_t cLen; if( PyString_AsStringAndSize(v, &cStr, &cLen) < 0 ) return 0; *p_itself = CFDataCreate((CFAllocatorRef)NULL, (unsigned char *)cStr, cLen); return 1; @@ -1826,7 +1826,7 @@ if (PyString_Check(v)) { char *cStr; if (!PyArg_Parse(v, "es", "ascii", &cStr)) - return NULL; + return 0; *p_itself = CFStringCreateWithCString((CFAllocatorRef)NULL, cStr, kCFStringEncodingASCII); return 1; } From python-checkins at python.org Mon Mar 20 03:05:59 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 03:05:59 +0100 (CET) Subject: [Python-checkins] r43149 - in python/branches/release24-maint: Lib/test/test_datetime.py Modules/datetimemodule.c Message-ID: <20060320020559.0069E1E400F@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 03:05:58 2006 New Revision: 43149 Modified: python/branches/release24-maint/Lib/test/test_datetime.py python/branches/release24-maint/Modules/datetimemodule.c Log: Backport 43147: Fix problem spotted by Coverity that occurs if tzinfo.tzname().replace() returns a non-string when converting %Z. Modified: python/branches/release24-maint/Lib/test/test_datetime.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_datetime.py (original) +++ python/branches/release24-maint/Lib/test/test_datetime.py Mon Mar 20 03:05:58 2006 @@ -1168,6 +1168,17 @@ self.assertEqual(dt2 - dt1, us) self.assert_(dt1 < dt2) + def test_strftime_with_bad_tzname_replace(self): + # verify ok if tzinfo.tzname().replace() returns a non-string + class MyTzInfo(FixedOffset): + def tzname(self, dt): + class MyStr(str): + def replace(self, *args): + return None + return MyStr('name') + t = self.theclass(2005, 3, 2, 0, 0, 0, 0, MyTzInfo(3, 'name')) + self.assertRaises(TypeError, t.strftime, '%Z') + def test_bad_constructor_arguments(self): # bad years self.theclass(MINYEAR, 1, 1) # no exception Modified: python/branches/release24-maint/Modules/datetimemodule.c ============================================================================== --- python/branches/release24-maint/Modules/datetimemodule.c (original) +++ python/branches/release24-maint/Modules/datetimemodule.c Mon Mar 20 03:05:58 2006 @@ -1228,8 +1228,8 @@ } } assert(zreplacement != NULL); - ptoappend = PyString_AsString(zreplacement); - ntoappend = PyString_Size(zreplacement); + ptoappend = PyString_AS_STRING(zreplacement); + ntoappend = PyString_GET_SIZE(zreplacement); } else if (ch == 'Z') { /* format tzname */ @@ -1257,14 +1257,18 @@ 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); } } assert(Zreplacement != NULL); - ptoappend = PyString_AsString(Zreplacement); - ntoappend = PyString_Size(Zreplacement); + ptoappend = PyString_AS_STRING(Zreplacement); + ntoappend = PyString_GET_SIZE(Zreplacement); } else { /* percent followed by neither z nor Z */ @@ -1275,6 +1279,7 @@ /* Append the ntoappend chars starting at ptoappend to * the new format. */ + assert(ptoappend != NULL); assert(ntoappend >= 0); if (ntoappend == 0) continue; From python-checkins at python.org Mon Mar 20 03:12:05 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 20 Mar 2006 03:12:05 +0100 (CET) Subject: [Python-checkins] r43150 - python/branches/release24-maint/Lib/test/test_importhooks.py Message-ID: <20060320021205.ECFF41E400F@bag.python.org> Author: tim.peters Date: Mon Mar 20 03:12:05 2006 New Revision: 43150 Modified: python/branches/release24-maint/Lib/test/test_importhooks.py Log: Merge revs 42842, 42844, and part of a whitespace normalization patch from the trunk. This stops test_socket_ssl from dying with: TypeError: 'NoneType' object is not callable in urlparsre.py's urljoin() when the tests are run in this order: test_??? test_importhooks test_socket_ssl "test_???" can be various things, but must be there. For example, test_urllibnet "works" to provoke the failure. Alas, nobody actually understands _why_ test_socket_ssl fails then, or why this hack makes the problem go away. Amazingly, the tests just happened to run in the right order on the 2.4 branch on two Windows buildbot slaves today, causing them both to fail their most recent test runs before this patch. Modified: python/branches/release24-maint/Lib/test/test_importhooks.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_importhooks.py (original) +++ python/branches/release24-maint/Lib/test/test_importhooks.py Mon Mar 20 03:12:05 2006 @@ -212,6 +212,13 @@ for mname in mnames: m = __import__(mname, globals(), locals(), ["__dummy__"]) m.__loader__ # to make sure we actually handled the import + # Delete urllib from modules because urlparse was imported above. + # Without this hack, test_socket_ssl fails if run in this order: + # regrtest.py test_codecmaps_tw test_importhooks test_socket_ssl + try: + del sys.modules['urllib'] + except KeyError: + pass def test_main(): test_support.run_unittest(ImportHooksTestCase) From nnorwitz at gmail.com Mon Mar 20 03:21:14 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sun, 19 Mar 2006 18:21:14 -0800 Subject: [Python-checkins] r43092 - in python/trunk: Lib/test/leakers/test_ctypes.py Misc/build.sh In-Reply-To: References: <20060317044539.A46561E4006@bag.python.org> Message-ID: On 3/17/06, Jim Jewett wrote: > Should some of the leaky excludes be removed from this list? > > Looking at recent leak results, there were no leaks for > > capi > cfgparser > charmapcodec > filecmp > threadedimport > threading > > I assume that the threading tests really are sporadic, but it would > be good to know if changes to capi add a new leak. Looking back over the last few days, it looks like most if not all of these tests reported leaks sporadically. So unfortunately, I don't think they can be removed yet. It would be great if someone took some time to find the problems and updated regrtest cleanup() so these tests can be removed from the list. http://mail.python.org/pipermail/python-checkins/2006-March/049982.html http://mail.python.org/pipermail/python-checkins/2006-March/050004.html http://mail.python.org/pipermail/python-checkins/2006-March/050020.html http://mail.python.org/pipermail/python-checkins/2006-March/050046.html All that is required is a debug build and running the tests a bunch of times like: ./python.exe ./Lib/test/regrtest.py -R 4:3: test_capi test_cfgparser test_charmapcodec test_filecmp test_threading test_threadedimport It's better to run without any tests specified and see which fail, since other tests may need to be added to cause the sporadic leaks. n From nnorwitz at gmail.com Mon Mar 20 03:38:43 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Sun, 19 Mar 2006 18:38:43 -0800 Subject: [Python-checkins] r43101 - in python/branches/p3yk: Demo/classes/bitvec.py Demo/metaclasses/Eiffel.py Demo/metaclasses/Meta.py Demo/metaclasses/Simple.py Demo/metaclasses/Synch.py Demo/metaclasses/Trace.py Demo/pdist/RCSProxy.py Demo/pdist/client Message-ID: On 3/17/06, A.M. Kuchling wrote: > On Fri, Mar 17, 2006 at 09:00:38AM +0100, neal.norwitz wrote: > > Remove apply() > > > > Modified: python/branches/p3yk/Demo/classes/bitvec.py > > Should these changes be applied to the Demo/ and Lib/ directories to > the trunk? Admittedly this sort of search-and-replace change is > discouraged, but if the work is already done... I wasn't extremely careful in making these changes, since it is a branch after all. I wouldn't be completely opposed to someone backporting these changes from the branch if it's well tested. Though I don't think it's particularly worthwhile. Too little benefit given the potential breakage. -0 n From python-checkins at python.org Mon Mar 20 05:08:16 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 05:08:16 +0100 (CET) Subject: [Python-checkins] r43151 - python/trunk/Modules/parsermodule.c python/trunk/Modules/posixmodule.c Message-ID: <20060320040816.BF75C1E4008@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 05:08:12 2006 New Revision: 43151 Modified: python/trunk/Modules/parsermodule.c python/trunk/Modules/posixmodule.c Log: SF #1445431, fix some leaks in error conditions. Modified: python/trunk/Modules/parsermodule.c ============================================================================== --- python/trunk/Modules/parsermodule.c (original) +++ python/trunk/Modules/parsermodule.c Mon Mar 20 05:08:12 2006 @@ -657,9 +657,10 @@ } } if (!ok) { - PyErr_SetObject(parser_error, - Py_BuildValue("os", elem, - "Illegal node construct.")); + PyObject *err = Py_BuildValue("os", elem, + "Illegal node construct."); + PyErr_SetObject(parser_error, err); + Py_XDECREF(err); Py_XDECREF(elem); return (0); } @@ -710,8 +711,9 @@ * It has to be one or the other; this is an error. * Throw an exception. */ - PyErr_SetObject(parser_error, - Py_BuildValue("os", elem, "unknown node type.")); + PyObject *err = Py_BuildValue("os", elem, "unknown node type."); + PyErr_SetObject(parser_error, err); + Py_XDECREF(err); Py_XDECREF(elem); return (0); } @@ -762,6 +764,7 @@ tuple = Py_BuildValue("os", tuple, "Illegal syntax-tree; cannot start with terminal symbol."); PyErr_SetObject(parser_error, tuple); + Py_XDECREF(tuple); } else if (ISNONTERMINAL(num)) { /* @@ -792,14 +795,16 @@ } } } - else + else { /* The tuple is illegal -- if the number is neither TERMINAL nor * NONTERMINAL, we can't use it. Not sure the implementation * allows this condition, but the API doesn't preclude it. */ - PyErr_SetObject(parser_error, - Py_BuildValue("os", tuple, - "Illegal component tuple.")); + PyObject *err = Py_BuildValue("os", tuple, + "Illegal component tuple."); + PyErr_SetObject(parser_error, err); + Py_XDECREF(err); + } return (res); } Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Mar 20 05:08:12 2006 @@ -6396,15 +6396,16 @@ name = tmpnam(buffer); #endif if (name == NULL) { - PyErr_SetObject(PyExc_OSError, - Py_BuildValue("is", 0, + PyObject *err = Py_BuildValue("is", 0, #ifdef USE_TMPNAM_R "unexpected NULL from tmpnam_r" #else "unexpected NULL from tmpnam" #endif - )); - return NULL; + ); + PyErr_SetObject(PyExc_OSError, err); + Py_XDECREF(err); + return NULL; } return PyString_FromString(buffer); } From python-checkins at python.org Mon Mar 20 05:35:06 2006 From: python-checkins at python.org (guido.van.rossum) Date: Mon, 20 Mar 2006 05:35:06 +0100 (CET) Subject: [Python-checkins] r43152 - python/branches/p3yk/Misc/NEWS Message-ID: <20060320043506.A895E1E4008@bag.python.org> Author: guido.van.rossum Date: Mon Mar 20 05:35:06 2006 New Revision: 43152 Modified: python/branches/p3yk/Misc/NEWS Log: Some more TODO items of things I'd like to start with. Mention the builtins that Neal killed. Modified: python/branches/p3yk/Misc/NEWS ============================================================================== --- python/branches/p3yk/Misc/NEWS (original) +++ python/branches/p3yk/Misc/NEWS Mon Mar 20 05:35:06 2006 @@ -12,7 +12,21 @@ TO DO ----- -- Make strings all Unicode. (First have to introduce the bytes type.) +- See PEP 3000. + +- Test merging certain changes from the 2.5 HEAD code. + +- Weed really old/weird stuff from the library. + +- Unify range() and xrange(). + +- Revamp the dict API: keys(), values(), items() return iterators, etc. + +- Add the bytes type. + +- Rework the standard I/O library to use bytes for binary files. + +- Make strings all Unicode. - Get rid of classic class implementation. @@ -31,6 +45,8 @@ - Absolute import is the default behavior for 'import foo' etc. +- input(), raw_input() and apply() are gone. + Extension Modules ----------------- From python-checkins at python.org Mon Mar 20 06:22:00 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 06:22:00 +0100 (CET) Subject: [Python-checkins] r43153 - in python/trunk: Doc/lib/libaudioop.tex Lib/test/test_audioop.py Misc/NEWS Modules/audioop.c Message-ID: <20060320052200.997E21E400F@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 06:21:58 2006 New Revision: 43153 Modified: python/trunk/Doc/lib/libaudioop.tex python/trunk/Lib/test/test_audioop.py python/trunk/Misc/NEWS python/trunk/Modules/audioop.c Log: SF [ 1231053 ] audioop - alaw encoding/decoding added, code updated This patch adds a-LAW encoding to audioop and replaces the old u-LAW encoding/decoding code with the current code from sox. Possible issues: the code from sox uses int16_t. Code by Lars Immisch Modified: python/trunk/Doc/lib/libaudioop.tex ============================================================================== --- python/trunk/Doc/lib/libaudioop.tex (original) +++ python/trunk/Doc/lib/libaudioop.tex Mon Mar 20 06:21:58 2006 @@ -12,9 +12,10 @@ modules. All scalar items are integers, unless specified otherwise. % This para is mostly here to provide an excuse for the index entries... -This module provides support for u-LAW and Intel/DVI ADPCM encodings. +This module provides support for a-LAW, u-LAW and Intel/DVI ADPCM encodings. \index{Intel/DVI ADPCM} \index{ADPCM, Intel/DVI} +\index{a-LAW} \index{u-LAW} A few of the more complicated operations only take 16-bit samples, @@ -42,6 +43,13 @@ has the width specified in \var{width}. \end{funcdesc} +\begin{funcdesc}{alaw2lin}{fragment, width} +Convert sound fragments in a-LAW encoding to linearly encoded sound +fragments. a-LAW encoding always uses 8 bits samples, so \var{width} +refers only to the sample width of the output fragment here. +\versionadded{2.5} +\end{funcdesc} + \begin{funcdesc}{avg}{fragment, width} Return the average over all samples in the fragment. \end{funcdesc} @@ -98,10 +106,6 @@ Return the value of sample \var{index} from the fragment. \end{funcdesc} -\begin{funcdesc}{lin2lin}{fragment, width, newwidth} -Convert samples between 1-, 2- and 4-byte formats. -\end{funcdesc} - \begin{funcdesc}{lin2adpcm}{fragment, width, state} Convert samples to 4 bit Intel/DVI ADPCM encoding. ADPCM coding is an adaptive coding scheme, whereby each 4 bit number is the difference @@ -117,6 +121,18 @@ packed 2 4-bit values per byte. \end{funcdesc} +\begin{funcdesc}{lin2alaw}{fragment, width} +Convert samples in the audio fragment to a-LAW encoding and return +this as a Python string. a-LAW is an audio encoding format whereby +you get a dynamic range of about 13 bits using only 8 bit samples. It +is used by the Sun audio hardware, among others. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{lin2lin}{fragment, width, newwidth} +Convert samples between 1-, 2- and 4-byte formats. +\end{funcdesc} + \begin{funcdesc}{lin2ulaw}{fragment, width} Convert samples in the audio fragment to u-LAW encoding and return this as a Python string. u-LAW is an audio encoding format whereby Modified: python/trunk/Lib/test/test_audioop.py ============================================================================== --- python/trunk/Lib/test/test_audioop.py (original) +++ python/trunk/Lib/test/test_audioop.py Mon Mar 20 06:21:58 2006 @@ -136,12 +136,30 @@ return 0 return 1 +def testlin2alaw(data): + if verbose: + print 'lin2alaw' + if audioop.lin2alaw(data[0], 1) != '\xd5\xc5\xf5' or \ + audioop.lin2alaw(data[1], 2) != '\xd5\xd5\xd5' or \ + audioop.lin2alaw(data[2], 4) != '\xd5\xd5\xd5': + return 0 + return 1 + +def testalaw2lin(data): + if verbose: + print 'alaw2lin' + # Cursory + d = audioop.lin2alaw(data[0], 1) + if audioop.alaw2lin(d, 1) != data[0]: + return 0 + return 1 + def testlin2ulaw(data): if verbose: print 'lin2ulaw' - if audioop.lin2ulaw(data[0], 1) != '\377\347\333' or \ - audioop.lin2ulaw(data[1], 2) != '\377\377\377' or \ - audioop.lin2ulaw(data[2], 4) != '\377\377\377': + if audioop.lin2ulaw(data[0], 1) != '\xff\xe7\xdb' or \ + audioop.lin2ulaw(data[1], 2) != '\xff\xff\xff' or \ + audioop.lin2ulaw(data[2], 4) != '\xff\xff\xff': return 0 return 1 Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Mar 20 06:21:58 2006 @@ -295,6 +295,9 @@ Extension Modules ----------------- +- Patch #1231053: The audioop module now supports encoding/decoding of alaw. + In addition, the existing ulaw code was updated. + - RFE #567972: Socket objects' family, type and proto properties are now exposed via new get...() methods. Modified: python/trunk/Modules/audioop.c ============================================================================== --- python/trunk/Modules/audioop.c (original) +++ python/trunk/Modules/audioop.c Mon Mar 20 06:21:58 2006 @@ -22,103 +22,247 @@ #endif #endif -/* Code shamelessly stolen from sox, +/* Code shamelessly stolen from sox, 12.17.7, g711.c ** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */ -#define MINLIN -32768 -#define MAXLIN 32767 -#define LINCLIP(x) do { if ( x < MINLIN ) x = MINLIN ; \ - else if ( x > MAXLIN ) x = MAXLIN; \ - } while ( 0 ) +/* From g711.c: + * + * December 30, 1994: + * Functions linear2alaw, linear2ulaw have been updated to correctly + * convert unquantized 16 bit values. + * Tables for direct u- to A-law and A- to u-law conversions have been + * corrected. + * Borge Lindberg, Center for PersonKommunikation, Aalborg University. + * bli at cpk.auc.dk + * + */ +#define BIAS 0x84 /* define the add-in bias for 16 bit samples */ +#define CLIP 32635 +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +static int16_t seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF, + 0x1FF, 0x3FF, 0x7FF, 0xFFF}; +static int16_t seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF, + 0x3FF, 0x7FF, 0xFFF, 0x1FFF}; + +static int16_t search(int16_t val, int16_t *table, int size) +{ + int i; -static unsigned char st_linear_to_ulaw(int sample); + for (i = 0; i < size; i++) { + if (val <= *table++) + return (i); + } + return (size); +} +#define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc]) +#define st_alaw2linear16(uc) (_st_alaw2linear16[uc]) + +int16_t _st_ulaw2linear16[256] = { + -32124, -31100, -30076, -29052, -28028, -27004, -25980, + -24956, -23932, -22908, -21884, -20860, -19836, -18812, + -17788, -16764, -15996, -15484, -14972, -14460, -13948, + -13436, -12924, -12412, -11900, -11388, -10876, -10364, + -9852, -9340, -8828, -8316, -7932, -7676, -7420, + -7164, -6908, -6652, -6396, -6140, -5884, -5628, + -5372, -5116, -4860, -4604, -4348, -4092, -3900, + -3772, -3644, -3516, -3388, -3260, -3132, -3004, + -2876, -2748, -2620, -2492, -2364, -2236, -2108, + -1980, -1884, -1820, -1756, -1692, -1628, -1564, + -1500, -1436, -1372, -1308, -1244, -1180, -1116, + -1052, -988, -924, -876, -844, -812, -780, + -748, -716, -684, -652, -620, -588, -556, + -524, -492, -460, -428, -396, -372, -356, + -340, -324, -308, -292, -276, -260, -244, + -228, -212, -196, -180, -164, -148, -132, + -120, -112, -104, -96, -88, -80, -72, + -64, -56, -48, -40, -32, -24, -16, + -8, 0, 32124, 31100, 30076, 29052, 28028, + 27004, 25980, 24956, 23932, 22908, 21884, 20860, + 19836, 18812, 17788, 16764, 15996, 15484, 14972, + 14460, 13948, 13436, 12924, 12412, 11900, 11388, + 10876, 10364, 9852, 9340, 8828, 8316, 7932, + 7676, 7420, 7164, 6908, 6652, 6396, 6140, + 5884, 5628, 5372, 5116, 4860, 4604, 4348, + 4092, 3900, 3772, 3644, 3516, 3388, 3260, + 3132, 3004, 2876, 2748, 2620, 2492, 2364, + 2236, 2108, 1980, 1884, 1820, 1756, 1692, + 1628, 1564, 1500, 1436, 1372, 1308, 1244, + 1180, 1116, 1052, 988, 924, 876, 844, + 812, 780, 748, 716, 684, 652, 620, + 588, 556, 524, 492, 460, 428, 396, + 372, 356, 340, 324, 308, 292, 276, + 260, 244, 228, 212, 196, 180, 164, + 148, 132, 120, 112, 104, 96, 88, + 80, 72, 64, 56, 48, 40, 32, + 24, 16, 8, 0 +}; /* -** This macro converts from ulaw to 16 bit linear, faster. -** -** Jef Poskanzer -** 23 October 1989 -** -** Input: 8 bit ulaw sample -** Output: signed 16 bit linear sample -*/ -#define st_ulaw_to_linear(ulawbyte) ulaw_table[ulawbyte] + * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data + * stored in a unsigned char. This function should only be called with + * the data shifted such that it only contains information in the lower + * 14-bits. + * + * In order to simplify the encoding process, the original linear magnitude + * is biased by adding 33 which shifts the encoding range from (0 - 8158) to + * (33 - 8191). The result can be seen in the following encoding table: + * + * Biased Linear Input Code Compressed Code + * ------------------------ --------------- + * 00000001wxyza 000wxyz + * 0000001wxyzab 001wxyz + * 000001wxyzabc 010wxyz + * 00001wxyzabcd 011wxyz + * 0001wxyzabcde 100wxyz + * 001wxyzabcdef 101wxyz + * 01wxyzabcdefg 110wxyz + * 1wxyzabcdefgh 111wxyz + * + * Each biased linear code has a leading 1 which identifies the segment + * number. The value of the segment number is equal to 7 minus the number + * of leading 0's. The quantization interval is directly available as the + * four bits wxyz. * The trailing bits (a - h) are ignored. + * + * Ordinarily the complement of the resulting code word is used for + * transmission, and so the code word is complemented before it is returned. + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ +unsigned char st_14linear2ulaw( + int16_t pcm_val) /* 2's complement (14-bit range) */ +{ + int16_t mask; + int16_t seg; + unsigned char uval; + + /* The original sox code does this in the calling function, not here */ + pcm_val = pcm_val >> 2; + + /* u-law inverts all bits */ + /* Get the sign and the magnitude of the value. */ + if (pcm_val < 0) { + pcm_val = -pcm_val; + mask = 0x7F; + } else { + mask = 0xFF; + } + if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */ + pcm_val += (BIAS >> 2); + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_uend, 8); + + /* + * Combine the sign, segment, quantization bits; + * and complement the code word. + */ + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF); + return (uval ^ mask); + } -static int ulaw_table[256] = { - -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, - -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, - -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, - -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316, - -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, - -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, - -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, - -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, - -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, - -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, - -876, -844, -812, -780, -748, -716, -684, -652, - -620, -588, -556, -524, -492, -460, -428, -396, - -372, -356, -340, -324, -308, -292, -276, -260, - -244, -228, -212, -196, -180, -164, -148, -132, - -120, -112, -104, -96, -88, -80, -72, -64, - -56, -48, -40, -32, -24, -16, -8, 0, - 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, - 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, - 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, - 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, - 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, - 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, - 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, - 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, - 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, - 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, - 876, 844, 812, 780, 748, 716, 684, 652, - 620, 588, 556, 524, 492, 460, 428, 396, - 372, 356, 340, 324, 308, 292, 276, 260, - 244, 228, 212, 196, 180, 164, 148, 132, - 120, 112, 104, 96, 88, 80, 72, 64, - 56, 48, 40, 32, 24, 16, 8, 0 }; +} -/* #define ZEROTRAP */ /* turn on the trap as per the MIL-STD */ -#define BIAS 0x84 /* define the add-in bias for 16 bit samples */ -#define CLIP 32635 +int16_t _st_alaw2linear16[256] = { + -5504, -5248, -6016, -5760, -4480, -4224, -4992, + -4736, -7552, -7296, -8064, -7808, -6528, -6272, + -7040, -6784, -2752, -2624, -3008, -2880, -2240, + -2112, -2496, -2368, -3776, -3648, -4032, -3904, + -3264, -3136, -3520, -3392, -22016, -20992, -24064, + -23040, -17920, -16896, -19968, -18944, -30208, -29184, + -32256, -31232, -26112, -25088, -28160, -27136, -11008, + -10496, -12032, -11520, -8960, -8448, -9984, -9472, + -15104, -14592, -16128, -15616, -13056, -12544, -14080, + -13568, -344, -328, -376, -360, -280, -264, + -312, -296, -472, -456, -504, -488, -408, + -392, -440, -424, -88, -72, -120, -104, + -24, -8, -56, -40, -216, -200, -248, + -232, -152, -136, -184, -168, -1376, -1312, + -1504, -1440, -1120, -1056, -1248, -1184, -1888, + -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, + -592, -944, -912, -1008, -976, -816, -784, + -880, -848, 5504, 5248, 6016, 5760, 4480, + 4224, 4992, 4736, 7552, 7296, 8064, 7808, + 6528, 6272, 7040, 6784, 2752, 2624, 3008, + 2880, 2240, 2112, 2496, 2368, 3776, 3648, + 4032, 3904, 3264, 3136, 3520, 3392, 22016, + 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, + 27136, 11008, 10496, 12032, 11520, 8960, 8448, + 9984, 9472, 15104, 14592, 16128, 15616, 13056, + 12544, 14080, 13568, 344, 328, 376, 360, + 280, 264, 312, 296, 472, 456, 504, + 488, 408, 392, 440, 424, 88, 72, + 120, 104, 24, 8, 56, 40, 216, + 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, + 1184, 1888, 1824, 2016, 1952, 1632, 1568, + 1760, 1696, 688, 656, 752, 720, 560, + 528, 624, 592, 944, 912, 1008, 976, + 816, 784, 880, 848 +}; -static unsigned char -st_linear_to_ulaw(int sample) -{ - static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}; - int sign, exponent, mantissa; - unsigned char ulawbyte; - - /* Get the sample into sign-magnitude. */ - sign = (sample >> 8) & 0x80; /* set aside the sign */ - if ( sign != 0 ) sample = -sample; /* get magnitude */ - if ( sample > CLIP ) sample = CLIP; /* clip the magnitude */ - - /* Convert from 16 bit linear to ulaw. */ - sample = sample + BIAS; - exponent = exp_lut[( sample >> 7 ) & 0xFF]; - mantissa = ( sample >> ( exponent + 3 ) ) & 0x0F; - ulawbyte = ~ ( sign | ( exponent << 4 ) | mantissa ); -#ifdef ZEROTRAP - if ( ulawbyte == 0 ) ulawbyte = 0x02; /* optional CCITT trap */ -#endif +/* + * linear2alaw() accepts an 13-bit signed integer and encodes it as A-law data + * stored in a unsigned char. This function should only be called with + * the data shifted such that it only contains information in the lower + * 13-bits. + * + * Linear Input Code Compressed Code + * ------------------------ --------------- + * 0000000wxyza 000wxyz + * 0000001wxyza 001wxyz + * 000001wxyzab 010wxyz + * 00001wxyzabc 011wxyz + * 0001wxyzabcd 100wxyz + * 001wxyzabcde 101wxyz + * 01wxyzabcdef 110wxyz + * 1wxyzabcdefg 111wxyz + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ +unsigned char st_linear2alaw( + int16_t pcm_val) /* 2's complement (13-bit range) */ +{ + int16_t mask; + short seg; + unsigned char aval; + + /* The original sox code does this in the calling function, not here */ + pcm_val = pcm_val >> 3; + + /* A-law using even bit inversion */ + if (pcm_val >= 0) { + mask = 0xD5; /* sign (7th) bit = 1 */ + } else { + mask = 0x55; /* sign bit = 0 */ + pcm_val = -pcm_val - 1; + } + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_aend, 8); - return ulawbyte; + /* Combine the sign, segment, and quantization bits. */ + + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + aval = (unsigned char) seg << SEG_SHIFT; + if (seg < 2) + aval |= (pcm_val >> 1) & QUANT_MASK; + else + aval |= (pcm_val >> seg) & QUANT_MASK; + return (aval ^ mask); + } } /* End of code taken from sox */ @@ -1107,7 +1251,7 @@ else if ( size == 2 ) val = (int)*SHORTP(cp, i); else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - *ncp++ = st_linear_to_ulaw(val); + *ncp++ = st_14linear2ulaw(val); } return rv; } @@ -1138,7 +1282,75 @@ for ( i=0; i < len*size; i += size ) { cval = *cp++; - val = st_ulaw_to_linear(cval); + val = st_ulaw2linear16(cval); + + if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); + else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); + } + return rv; +} + +static PyObject * +audioop_lin2alaw(PyObject *self, PyObject *args) +{ + signed char *cp; + unsigned char *ncp; + int len, size, val = 0; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len/size); + if ( rv == 0 ) + return 0; + ncp = (unsigned char *)PyString_AsString(rv); + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + *ncp++ = st_linear2alaw(val); + } + return rv; +} + +static PyObject * +audioop_alaw2lin(PyObject *self, PyObject *args) +{ + unsigned char *cp; + unsigned char cval; + signed char *ncp; + int len, size, val; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len*size); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + for ( i=0; i < len*size; i += size ) { + cval = *cp++; + val = st_alaw2linear16(cval); if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); @@ -1362,6 +1574,8 @@ { "bias", audioop_bias, METH_OLDARGS }, { "ulaw2lin", audioop_ulaw2lin, METH_OLDARGS }, { "lin2ulaw", audioop_lin2ulaw, METH_OLDARGS }, + { "alaw2lin", audioop_alaw2lin, METH_OLDARGS }, + { "lin2alaw", audioop_lin2alaw, METH_OLDARGS }, { "lin2lin", audioop_lin2lin, METH_OLDARGS }, { "adpcm2lin", audioop_adpcm2lin, METH_OLDARGS }, { "lin2adpcm", audioop_lin2adpcm, METH_OLDARGS }, From python-checkins at python.org Mon Mar 20 06:29:26 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 06:29:26 +0100 (CET) Subject: [Python-checkins] r43154 - python/trunk Message-ID: <20060320052926.A94DA1E400F@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 06:29:26 2006 New Revision: 43154 Modified: python/trunk/ (props changed) Log: ignore the fetched NormalizationTest.txt file From python-checkins at python.org Mon Mar 20 06:58:23 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 06:58:23 +0100 (CET) Subject: [Python-checkins] r43155 - python/trunk/Modules/audioop.c Message-ID: <20060320055823.672691E400F@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 06:58:21 2006 New Revision: 43155 Modified: python/trunk/Modules/audioop.c Log: replace use of int16_t with a (typedef'd) short, to fix Windows buildbots. expand tabs. Modified: python/trunk/Modules/audioop.c ============================================================================== --- python/trunk/Modules/audioop.c (original) +++ python/trunk/Modules/audioop.c Mon Mar 20 06:58:21 2006 @@ -15,6 +15,8 @@ #endif #endif +typedef short PyInt16; + #if defined(__CHAR_UNSIGNED__) #if defined(signed) /* This module currently does not work on systems where only unsigned @@ -38,30 +40,30 @@ */ #define BIAS 0x84 /* define the add-in bias for 16 bit samples */ #define CLIP 32635 -#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ -#define QUANT_MASK (0xf) /* Quantization field mask. */ -#define SEG_SHIFT (4) /* Left shift for segment number. */ -#define SEG_MASK (0x70) /* Segment field mask. */ - -static int16_t seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF, - 0x1FF, 0x3FF, 0x7FF, 0xFFF}; -static int16_t seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF, - 0x3FF, 0x7FF, 0xFFF, 0x1FFF}; - -static int16_t search(int16_t val, int16_t *table, int size) -{ - int i; - - for (i = 0; i < size; i++) { - if (val <= *table++) - return (i); - } - return (size); +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +static PyInt16 seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF, + 0x1FF, 0x3FF, 0x7FF, 0xFFF}; +static PyInt16 seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF, + 0x3FF, 0x7FF, 0xFFF, 0x1FFF}; + +static PyInt16 search(PyInt16 val, PyInt16 *table, int size) +{ + int i; + + for (i = 0; i < size; i++) { + if (val <= *table++) + return (i); + } + return (size); } #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc]) #define st_alaw2linear16(uc) (_st_alaw2linear16[uc]) -int16_t _st_ulaw2linear16[256] = { +PyInt16 _st_ulaw2linear16[256] = { -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, -15996, -15484, -14972, -14460, -13948, @@ -111,16 +113,16 @@ * is biased by adding 33 which shifts the encoding range from (0 - 8158) to * (33 - 8191). The result can be seen in the following encoding table: * - * Biased Linear Input Code Compressed Code - * ------------------------ --------------- - * 00000001wxyza 000wxyz - * 0000001wxyzab 001wxyz - * 000001wxyzabc 010wxyz - * 00001wxyzabcd 011wxyz - * 0001wxyzabcde 100wxyz - * 001wxyzabcdef 101wxyz - * 01wxyzabcdefg 110wxyz - * 1wxyzabcdefgh 111wxyz + * Biased Linear Input Code Compressed Code + * ------------------------ --------------- + * 00000001wxyza 000wxyz + * 0000001wxyzab 001wxyz + * 000001wxyzabc 010wxyz + * 00001wxyzabcd 011wxyz + * 0001wxyzabcde 100wxyz + * 001wxyzabcdef 101wxyz + * 01wxyzabcdefg 110wxyz + * 1wxyzabcdefgh 111wxyz * * Each biased linear code has a leading 1 which identifies the segment * number. The value of the segment number is equal to 7 minus the number @@ -134,43 +136,43 @@ * John Wiley & Sons, pps 98-111 and 472-476. */ unsigned char st_14linear2ulaw( - int16_t pcm_val) /* 2's complement (14-bit range) */ + PyInt16 pcm_val) /* 2's complement (14-bit range) */ { - int16_t mask; - int16_t seg; - unsigned char uval; - - /* The original sox code does this in the calling function, not here */ - pcm_val = pcm_val >> 2; - - /* u-law inverts all bits */ - /* Get the sign and the magnitude of the value. */ - if (pcm_val < 0) { - pcm_val = -pcm_val; - mask = 0x7F; - } else { - mask = 0xFF; - } - if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */ - pcm_val += (BIAS >> 2); - - /* Convert the scaled magnitude to segment number. */ - seg = search(pcm_val, seg_uend, 8); - - /* - * Combine the sign, segment, quantization bits; - * and complement the code word. - */ - if (seg >= 8) /* out of range, return maximum value. */ - return (unsigned char) (0x7F ^ mask); - else { - uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF); - return (uval ^ mask); - } + PyInt16 mask; + PyInt16 seg; + unsigned char uval; + + /* The original sox code does this in the calling function, not here */ + pcm_val = pcm_val >> 2; + + /* u-law inverts all bits */ + /* Get the sign and the magnitude of the value. */ + if (pcm_val < 0) { + pcm_val = -pcm_val; + mask = 0x7F; + } else { + mask = 0xFF; + } + if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */ + pcm_val += (BIAS >> 2); + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_uend, 8); + + /* + * Combine the sign, segment, quantization bits; + * and complement the code word. + */ + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF); + return (uval ^ mask); + } } -int16_t _st_alaw2linear16[256] = { +PyInt16 _st_alaw2linear16[256] = { -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, @@ -216,72 +218,72 @@ * the data shifted such that it only contains information in the lower * 13-bits. * - * Linear Input Code Compressed Code - * ------------------------ --------------- - * 0000000wxyza 000wxyz - * 0000001wxyza 001wxyz - * 000001wxyzab 010wxyz - * 00001wxyzabc 011wxyz - * 0001wxyzabcd 100wxyz - * 001wxyzabcde 101wxyz - * 01wxyzabcdef 110wxyz - * 1wxyzabcdefg 111wxyz + * Linear Input Code Compressed Code + * ------------------------ --------------- + * 0000000wxyza 000wxyz + * 0000001wxyza 001wxyz + * 000001wxyzab 010wxyz + * 00001wxyzabc 011wxyz + * 0001wxyzabcd 100wxyz + * 001wxyzabcde 101wxyz + * 01wxyzabcdef 110wxyz + * 1wxyzabcdefg 111wxyz * * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ unsigned char st_linear2alaw( - int16_t pcm_val) /* 2's complement (13-bit range) */ + PyInt16 pcm_val) /* 2's complement (13-bit range) */ { - int16_t mask; - short seg; - unsigned char aval; - - /* The original sox code does this in the calling function, not here */ - pcm_val = pcm_val >> 3; - - /* A-law using even bit inversion */ - if (pcm_val >= 0) { - mask = 0xD5; /* sign (7th) bit = 1 */ - } else { - mask = 0x55; /* sign bit = 0 */ - pcm_val = -pcm_val - 1; - } - - /* Convert the scaled magnitude to segment number. */ - seg = search(pcm_val, seg_aend, 8); - - /* Combine the sign, segment, and quantization bits. */ - - if (seg >= 8) /* out of range, return maximum value. */ - return (unsigned char) (0x7F ^ mask); - else { - aval = (unsigned char) seg << SEG_SHIFT; - if (seg < 2) - aval |= (pcm_val >> 1) & QUANT_MASK; - else - aval |= (pcm_val >> seg) & QUANT_MASK; - return (aval ^ mask); - } + PyInt16 mask; + short seg; + unsigned char aval; + + /* The original sox code does this in the calling function, not here */ + pcm_val = pcm_val >> 3; + + /* A-law using even bit inversion */ + if (pcm_val >= 0) { + mask = 0xD5; /* sign (7th) bit = 1 */ + } else { + mask = 0x55; /* sign bit = 0 */ + pcm_val = -pcm_val - 1; + } + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_aend, 8); + + /* Combine the sign, segment, and quantization bits. */ + + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + aval = (unsigned char) seg << SEG_SHIFT; + if (seg < 2) + aval |= (pcm_val >> 1) & QUANT_MASK; + else + aval |= (pcm_val >> seg) & QUANT_MASK; + return (aval ^ mask); + } } /* End of code taken from sox */ /* Intel ADPCM step variation table */ static int indexTable[16] = { - -1, -1, -1, -1, 2, 4, 6, 8, - -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8, }; static int stepsizeTable[89] = { - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, - 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, - 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, - 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, - 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, - 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, - 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, - 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, - 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 + 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, + 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, + 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, + 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, + 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, + 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, + 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, + 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 }; #define CHARP(cp, i) ((signed char *)(cp+i)) @@ -295,137 +297,137 @@ static PyObject * audioop_getsample(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0; - int i; - - if ( !PyArg_Parse(args, "(s#ii)", &cp, &len, &size, &i) ) - return 0; - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - if ( i < 0 || i >= len/size ) { - PyErr_SetString(AudioopError, "Index out of range"); - return 0; - } - 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); + signed char *cp; + int len, size, val = 0; + int i; + + if ( !PyArg_Parse(args, "(s#ii)", &cp, &len, &size, &i) ) + return 0; + if ( size != 1 && size != 2 && size != 4 ) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + if ( i < 0 || i >= len/size ) { + PyErr_SetString(AudioopError, "Index out of range"); + return 0; + } + 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); } static PyObject * audioop_max(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0; - int i; - int max = 0; - - if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) - return 0; - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - for ( i=0; i max ) max = val; - } - return PyInt_FromLong(max); + signed char *cp; + int len, size, val = 0; + int i; + int max = 0; + + if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) + return 0; + if ( size != 1 && size != 2 && size != 4 ) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + for ( i=0; i max ) max = val; + } + return PyInt_FromLong(max); } static PyObject * audioop_minmax(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0; - int i; - int min = 0x7fffffff, max = -0x7fffffff; - - if (!PyArg_Parse(args, "(s#i)", &cp, &len, &size)) - return NULL; - if (size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return NULL; - } - for (i = 0; i < len; i += size) { - if (size == 1) val = (int) *CHARP(cp, i); - else if (size == 2) val = (int) *SHORTP(cp, i); - else if (size == 4) val = (int) *LONGP(cp, i); - if (val > max) max = val; - if (val < min) min = val; - } - return Py_BuildValue("(ii)", min, max); + signed char *cp; + int len, size, val = 0; + int i; + int min = 0x7fffffff, max = -0x7fffffff; + + if (!PyArg_Parse(args, "(s#i)", &cp, &len, &size)) + return NULL; + if (size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return NULL; + } + for (i = 0; i < len; i += size) { + if (size == 1) val = (int) *CHARP(cp, i); + else if (size == 2) val = (int) *SHORTP(cp, i); + else if (size == 4) val = (int) *LONGP(cp, i); + if (val > max) max = val; + if (val < min) min = val; + } + return Py_BuildValue("(ii)", min, max); } static PyObject * audioop_avg(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0; - int i; - double avg = 0.0; - - if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) - return 0; - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - for ( i=0; i>= 1; - len2 >>= 1; - - if ( len1 < len2 ) { - PyErr_SetString(AudioopError, "First sample should be longer"); - return 0; - } - sum_ri_2 = _sum2(cp2, cp2, len2); - sum_aij_2 = _sum2(cp1, cp1, len2); - sum_aij_ri = _sum2(cp1, cp2, len2); - - result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2; - - best_result = result; - best_j = 0; - j = 0; - - for ( j=1; j<=len1-len2; j++) { - aj_m1 = (double)cp1[j-1]; - aj_lm1 = (double)cp1[j+len2-1]; - - sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1; - sum_aij_ri = _sum2(cp1+j, cp2, len2); - - result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) - / sum_aij_2; - - if ( result < best_result ) { - best_result = result; - best_j = j; - } - - } + short *cp1, *cp2; + int len1, len2; + int j, best_j; + double aj_m1, aj_lm1; + double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor; + + if ( !PyArg_Parse(args, "(s#s#)", &cp1, &len1, &cp2, &len2) ) + return 0; + if ( len1 & 1 || len2 & 1 ) { + PyErr_SetString(AudioopError, "Strings should be even-sized"); + return 0; + } + len1 >>= 1; + len2 >>= 1; + + if ( len1 < len2 ) { + PyErr_SetString(AudioopError, "First sample should be longer"); + return 0; + } + sum_ri_2 = _sum2(cp2, cp2, len2); + sum_aij_2 = _sum2(cp1, cp1, len2); + sum_aij_ri = _sum2(cp1, cp2, len2); + + result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2; + + best_result = result; + best_j = 0; + j = 0; + + for ( j=1; j<=len1-len2; j++) { + aj_m1 = (double)cp1[j-1]; + aj_lm1 = (double)cp1[j+len2-1]; + + sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1; + sum_aij_ri = _sum2(cp1+j, cp2, len2); + + result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) + / sum_aij_2; + + if ( result < best_result ) { + best_result = result; + best_j = j; + } + + } - factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2; + factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2; - return Py_BuildValue("(if)", best_j, factor); + return Py_BuildValue("(if)", best_j, factor); } /* @@ -521,27 +523,27 @@ static PyObject * audioop_findfactor(PyObject *self, PyObject *args) { - short *cp1, *cp2; - int len1, len2; - double sum_ri_2, sum_aij_ri, result; - - if ( !PyArg_Parse(args, "(s#s#)", &cp1, &len1, &cp2, &len2) ) - return 0; - if ( len1 & 1 || len2 & 1 ) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); - return 0; - } - if ( len1 != len2 ) { - PyErr_SetString(AudioopError, "Samples should be same size"); - return 0; - } - len2 >>= 1; - sum_ri_2 = _sum2(cp2, cp2, len2); - sum_aij_ri = _sum2(cp1, cp2, len2); + short *cp1, *cp2; + int len1, len2; + double sum_ri_2, sum_aij_ri, result; + + if ( !PyArg_Parse(args, "(s#s#)", &cp1, &len1, &cp2, &len2) ) + return 0; + if ( len1 & 1 || len2 & 1 ) { + PyErr_SetString(AudioopError, "Strings should be even-sized"); + return 0; + } + if ( len1 != len2 ) { + PyErr_SetString(AudioopError, "Samples should be same size"); + return 0; + } + len2 >>= 1; + sum_ri_2 = _sum2(cp2, cp2, len2); + sum_aij_ri = _sum2(cp1, cp2, len2); - result = sum_aij_ri / sum_ri_2; + result = sum_aij_ri / sum_ri_2; - return PyFloat_FromDouble(result); + return PyFloat_FromDouble(result); } /* @@ -551,1051 +553,1051 @@ static PyObject * audioop_findmax(PyObject *self, PyObject *args) { - short *cp1; - int len1, len2; - int j, best_j; - double aj_m1, aj_lm1; - double result, best_result; - - if ( !PyArg_Parse(args, "(s#i)", &cp1, &len1, &len2) ) - return 0; - if ( len1 & 1 ) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); - return 0; - } - len1 >>= 1; - - if ( len1 < len2 ) { - PyErr_SetString(AudioopError, "Input sample should be longer"); - return 0; - } - - result = _sum2(cp1, cp1, len2); - - best_result = result; - best_j = 0; - j = 0; - - for ( j=1; j<=len1-len2; j++) { - aj_m1 = (double)cp1[j-1]; - aj_lm1 = (double)cp1[j+len2-1]; - - result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1; - - if ( result > best_result ) { - best_result = result; - best_j = j; - } - - } + short *cp1; + int len1, len2; + int j, best_j; + double aj_m1, aj_lm1; + double result, best_result; + + if ( !PyArg_Parse(args, "(s#i)", &cp1, &len1, &len2) ) + return 0; + if ( len1 & 1 ) { + PyErr_SetString(AudioopError, "Strings should be even-sized"); + return 0; + } + len1 >>= 1; + + if ( len1 < len2 ) { + PyErr_SetString(AudioopError, "Input sample should be longer"); + return 0; + } + + result = _sum2(cp1, cp1, len2); + + best_result = result; + best_j = 0; + j = 0; + + for ( j=1; j<=len1-len2; j++) { + aj_m1 = (double)cp1[j-1]; + aj_lm1 = (double)cp1[j+len2-1]; + + result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1; + + if ( result > best_result ) { + best_result = result; + best_j = j; + } + + } - return PyInt_FromLong(best_j); + return PyInt_FromLong(best_j); } static PyObject * audioop_avgpp(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0, prevval = 0, prevextremevalid = 0, - prevextreme = 0; - int i; - double avg = 0.0; - int diff, prevdiff, extremediff, nextreme = 0; - - if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) - return 0; - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - /* Compute first delta value ahead. Also automatically makes us - ** skip the first extreme value - */ - if ( size == 1 ) prevval = (int)*CHARP(cp, 0); - else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0); - else if ( size == 4 ) prevval = (int)*LONGP(cp, 0); - if ( size == 1 ) val = (int)*CHARP(cp, size); - else if ( size == 2 ) val = (int)*SHORTP(cp, size); - else if ( size == 4 ) val = (int)*LONGP(cp, size); - prevdiff = val - prevval; - - for ( i=size; i max ) - max = extremediff; - } - prevextremevalid = 1; - prevextreme = prevval; - } - prevval = val; - if ( diff != 0 ) - prevdiff = diff; - } - return PyInt_FromLong(max); + signed char *cp; + int len, size, val = 0, prevval = 0, prevextremevalid = 0, + prevextreme = 0; + int i; + int max = 0; + int diff, prevdiff, extremediff; + + if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) + return 0; + if ( size != 1 && size != 2 && size != 4 ) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + /* Compute first delta value ahead. Also automatically makes us + ** skip the first extreme value + */ + if ( size == 1 ) prevval = (int)*CHARP(cp, 0); + else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0); + else if ( size == 4 ) prevval = (int)*LONGP(cp, 0); + if ( size == 1 ) val = (int)*CHARP(cp, size); + else if ( size == 2 ) val = (int)*SHORTP(cp, size); + else if ( size == 4 ) val = (int)*LONGP(cp, size); + prevdiff = val - prevval; + + for ( i=size; i max ) + max = extremediff; + } + prevextremevalid = 1; + prevextreme = prevval; + } + prevval = val; + if ( diff != 0 ) + prevdiff = diff; + } + return PyInt_FromLong(max); } static PyObject * audioop_cross(PyObject *self, PyObject *args) { - signed char *cp; - int len, size, val = 0; - int i; - int prevval, ncross; - - if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) - return 0; - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - ncross = -1; - prevval = 17; /* Anything <> 0,1 */ - for ( i=0; i> 7; - else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15; - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31; - val = val & 1; - if ( val != prevval ) ncross++; - prevval = val; - } - return PyInt_FromLong(ncross); + signed char *cp; + int len, size, val = 0; + int i; + int prevval, ncross; + + if ( !PyArg_Parse(args, "(s#i)", &cp, &len, &size) ) + return 0; + if ( size != 1 && size != 2 && size != 4 ) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + ncross = -1; + prevval = 17; /* Anything <> 0,1 */ + for ( i=0; i> 7; + else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15; + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31; + val = val & 1; + if ( val != prevval ) ncross++; + prevval = val; + } + return PyInt_FromLong(ncross); } static PyObject * audioop_mul(PyObject *self, PyObject *args) { - signed char *cp, *ncp; - int len, size, val = 0; - double factor, fval, maxval; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#id)", &cp, &len, &size, &factor ) ) - return 0; - - if ( size == 1 ) maxval = (double) 0x7f; - else if ( size == 2 ) maxval = (double) 0x7fff; - else if ( size == 4 ) maxval = (double) 0x7fffffff; - else { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = (int)*LONGP(cp, i); - fval = (double)val*factor; - if ( fval > maxval ) fval = maxval; - else if ( fval < -maxval ) fval = -maxval; - val = (int)fval; - if ( size == 1 ) *CHARP(ncp, i) = (signed char)val; - else if ( size == 2 ) *SHORTP(ncp, i) = (short)val; - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val; - } - return rv; + signed char *cp, *ncp; + int len, size, val = 0; + double factor, fval, maxval; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#id)", &cp, &len, &size, &factor ) ) + return 0; + + if ( size == 1 ) maxval = (double) 0x7f; + else if ( size == 2 ) maxval = (double) 0x7fff; + else if ( size == 4 ) maxval = (double) 0x7fffffff; + else { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = (int)*CHARP(cp, i); + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = (int)*LONGP(cp, i); + fval = (double)val*factor; + if ( fval > maxval ) fval = maxval; + else if ( fval < -maxval ) fval = -maxval; + val = (int)fval; + if ( size == 1 ) *CHARP(ncp, i) = (signed char)val; + else if ( size == 2 ) *SHORTP(ncp, i) = (short)val; + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val; + } + return rv; } static PyObject * audioop_tomono(PyObject *self, PyObject *args) { - signed char *cp, *ncp; - int len, size, val1 = 0, val2 = 0; - double fac1, fac2, fval, maxval; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#idd)", &cp, &len, &size, &fac1, &fac2 ) ) - return 0; - - if ( size == 1 ) maxval = (double) 0x7f; - else if ( size == 2 ) maxval = (double) 0x7fff; - else if ( size == 4 ) maxval = (double) 0x7fffffff; - else { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len/2); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - - for ( i=0; i < len; i += size*2 ) { - if ( size == 1 ) val1 = (int)*CHARP(cp, i); - else if ( size == 2 ) val1 = (int)*SHORTP(cp, i); - else if ( size == 4 ) val1 = (int)*LONGP(cp, i); - if ( size == 1 ) val2 = (int)*CHARP(cp, i+1); - else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2); - else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4); - fval = (double)val1*fac1 + (double)val2*fac2; - if ( fval > maxval ) fval = maxval; - else if ( fval < -maxval ) fval = -maxval; - val1 = (int)fval; - if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1; - else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1; - else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1; - } - return rv; + signed char *cp, *ncp; + int len, size, val1 = 0, val2 = 0; + double fac1, fac2, fval, maxval; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#idd)", &cp, &len, &size, &fac1, &fac2 ) ) + return 0; + + if ( size == 1 ) maxval = (double) 0x7f; + else if ( size == 2 ) maxval = (double) 0x7fff; + else if ( size == 4 ) maxval = (double) 0x7fffffff; + else { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len/2); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + + for ( i=0; i < len; i += size*2 ) { + if ( size == 1 ) val1 = (int)*CHARP(cp, i); + else if ( size == 2 ) val1 = (int)*SHORTP(cp, i); + else if ( size == 4 ) val1 = (int)*LONGP(cp, i); + if ( size == 1 ) val2 = (int)*CHARP(cp, i+1); + else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2); + else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4); + fval = (double)val1*fac1 + (double)val2*fac2; + if ( fval > maxval ) fval = maxval; + else if ( fval < -maxval ) fval = -maxval; + val1 = (int)fval; + if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1; + else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1; + else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1; + } + return rv; } static PyObject * audioop_tostereo(PyObject *self, PyObject *args) { - signed char *cp, *ncp; - int len, size, val1, val2, val = 0; - double fac1, fac2, fval, maxval; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#idd)", &cp, &len, &size, &fac1, &fac2 ) ) - return 0; - - if ( size == 1 ) maxval = (double) 0x7f; - else if ( size == 2 ) maxval = (double) 0x7fff; - else if ( size == 4 ) maxval = (double) 0x7fffffff; - else { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len*2); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = (int)*LONGP(cp, i); - - fval = (double)val*fac1; - if ( fval > maxval ) fval = maxval; - else if ( fval < -maxval ) fval = -maxval; - val1 = (int)fval; - - fval = (double)val*fac2; - if ( fval > maxval ) fval = maxval; - else if ( fval < -maxval ) fval = -maxval; - val2 = (int)fval; - - if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1; - else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1; - else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1; - - if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2; - else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2; - else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2; - } - return rv; + signed char *cp, *ncp; + int len, size, val1, val2, val = 0; + double fac1, fac2, fval, maxval; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#idd)", &cp, &len, &size, &fac1, &fac2 ) ) + return 0; + + if ( size == 1 ) maxval = (double) 0x7f; + else if ( size == 2 ) maxval = (double) 0x7fff; + else if ( size == 4 ) maxval = (double) 0x7fffffff; + else { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len*2); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = (int)*CHARP(cp, i); + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = (int)*LONGP(cp, i); + + fval = (double)val*fac1; + if ( fval > maxval ) fval = maxval; + else if ( fval < -maxval ) fval = -maxval; + val1 = (int)fval; + + fval = (double)val*fac2; + if ( fval > maxval ) fval = maxval; + else if ( fval < -maxval ) fval = -maxval; + val2 = (int)fval; + + if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1; + else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1; + else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1; + + if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2; + else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2; + else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2; + } + return rv; } static PyObject * audioop_add(PyObject *self, PyObject *args) { - signed char *cp1, *cp2, *ncp; - int len1, len2, size, val1 = 0, val2 = 0, maxval, newval; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#s#i)", - &cp1, &len1, &cp2, &len2, &size ) ) - return 0; - - if ( len1 != len2 ) { - PyErr_SetString(AudioopError, "Lengths should be the same"); - return 0; - } - - if ( size == 1 ) maxval = 0x7f; - else if ( size == 2 ) maxval = 0x7fff; - else if ( size == 4 ) maxval = 0x7fffffff; - else { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len1); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - for ( i=0; i < len1; i += size ) { - if ( size == 1 ) val1 = (int)*CHARP(cp1, i); - else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i); - else if ( size == 4 ) val1 = (int)*LONGP(cp1, i); - - if ( size == 1 ) val2 = (int)*CHARP(cp2, i); - else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i); - else if ( size == 4 ) val2 = (int)*LONGP(cp2, i); - - newval = val1 + val2; - /* truncate in case of overflow */ - if (newval > maxval) newval = maxval; - else if (newval < -maxval) newval = -maxval; - else if (size == 4 && (newval^val1) < 0 && (newval^val2) < 0) - newval = val1 > 0 ? maxval : - maxval; - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval; - else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval; - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval; - } - return rv; + signed char *cp1, *cp2, *ncp; + int len1, len2, size, val1 = 0, val2 = 0, maxval, newval; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#s#i)", + &cp1, &len1, &cp2, &len2, &size ) ) + return 0; + + if ( len1 != len2 ) { + PyErr_SetString(AudioopError, "Lengths should be the same"); + return 0; + } + + if ( size == 1 ) maxval = 0x7f; + else if ( size == 2 ) maxval = 0x7fff; + else if ( size == 4 ) maxval = 0x7fffffff; + else { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len1); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + for ( i=0; i < len1; i += size ) { + if ( size == 1 ) val1 = (int)*CHARP(cp1, i); + else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i); + else if ( size == 4 ) val1 = (int)*LONGP(cp1, i); + + if ( size == 1 ) val2 = (int)*CHARP(cp2, i); + else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i); + else if ( size == 4 ) val2 = (int)*LONGP(cp2, i); + + newval = val1 + val2; + /* truncate in case of overflow */ + if (newval > maxval) newval = maxval; + else if (newval < -maxval) newval = -maxval; + else if (size == 4 && (newval^val1) < 0 && (newval^val2) < 0) + newval = val1 > 0 ? maxval : - maxval; + + if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval; + else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval; + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval; + } + return rv; } static PyObject * audioop_bias(PyObject *self, PyObject *args) { - signed char *cp, *ncp; - int len, size, val = 0; - PyObject *rv; - int i; - int bias; - - if ( !PyArg_Parse(args, "(s#ii)", - &cp, &len, &size , &bias) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = (int)*CHARP(cp, i); - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = (int)*LONGP(cp, i); - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias); - } - return rv; + signed char *cp, *ncp; + int len, size, val = 0; + PyObject *rv; + int i; + int bias; + + if ( !PyArg_Parse(args, "(s#ii)", + &cp, &len, &size , &bias) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = (int)*CHARP(cp, i); + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = (int)*LONGP(cp, i); + + if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias); + else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias); + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias); + } + return rv; } static PyObject * audioop_reverse(PyObject *self, PyObject *args) { - signed char *cp; - unsigned char *ncp; - int len, size, val = 0; - PyObject *rv; - int i, j; - - if ( !PyArg_Parse(args, "(s#i)", - &cp, &len, &size) ) - return 0; - - if ( size != 1 && size != 2 && size != 4 ) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - j = len - i - size; - - if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8); - else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val); - else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16); - } - return rv; + signed char *cp; + unsigned char *ncp; + int len, size, val = 0; + PyObject *rv; + int i, j; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4 ) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len); + if ( rv == 0 ) + return 0; + ncp = (unsigned char *)PyString_AsString(rv); + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + j = len - i - size; + + if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8); + else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val); + else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16); + } + return rv; } static PyObject * audioop_lin2lin(PyObject *self, PyObject *args) { - signed char *cp; - unsigned char *ncp; - int len, size, size2, val = 0; - PyObject *rv; - int i, j; - - if ( !PyArg_Parse(args, "(s#ii)", - &cp, &len, &size, &size2) ) - return 0; - - if ( (size != 1 && size != 2 && size != 4) || - (size2 != 1 && size2 != 2 && size2 != 4)) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, (len/size)*size2); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0, j=0; i < len; i += size, j += size2 ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8); - else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val); - else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16); - } - return rv; + signed char *cp; + unsigned char *ncp; + int len, size, size2, val = 0; + PyObject *rv; + int i, j; + + if ( !PyArg_Parse(args, "(s#ii)", + &cp, &len, &size, &size2) ) + return 0; + + if ( (size != 1 && size != 2 && size != 4) || + (size2 != 1 && size2 != 2 && size2 != 4)) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, (len/size)*size2); + if ( rv == 0 ) + return 0; + ncp = (unsigned char *)PyString_AsString(rv); + + for ( i=0, j=0; i < len; i += size, j += size2 ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8); + else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val); + else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16); + } + return rv; } static int gcd(int a, int b) { - while (b > 0) { - int tmp = a % b; - a = b; - b = tmp; - } - return a; + while (b > 0) { + int tmp = a % b; + a = b; + b = tmp; + } + return a; } static PyObject * audioop_ratecv(PyObject *self, PyObject *args) { - char *cp, *ncp; - int len, 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; - - weightA = 1; - weightB = 0; - if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len, &size, &nchannels, - &inrate, &outrate, &state, &weightA, &weightB)) - return NULL; - if (size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return NULL; - } - if (nchannels < 1) { - PyErr_SetString(AudioopError, "# of channels should be >= 1"); - return NULL; - } - bytes_per_frame = size * nchannels; - if (bytes_per_frame / nchannels != size) { - /* This overflow test is rigorously correct because - both multiplicands are >= 1. Use the argument names - from the docs for the error msg. */ - PyErr_SetString(PyExc_OverflowError, - "width * nchannels too big for a C int"); - return NULL; - } - if (weightA < 1 || weightB < 0) { - PyErr_SetString(AudioopError, - "weightA should be >= 1, weightB should be >= 0"); - return NULL; - } - if (len % bytes_per_frame != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); - return NULL; - } - if (inrate <= 0 || outrate <= 0) { - PyErr_SetString(AudioopError, "sampling rate not > 0"); - return NULL; - } - /* divide inrate and outrate by their greatest common divisor */ - d = gcd(inrate, outrate); - inrate /= d; - outrate /= d; - - prev_i = (int *) malloc(nchannels * sizeof(int)); - cur_i = (int *) malloc(nchannels * sizeof(int)); - if (prev_i == NULL || cur_i == NULL) { - (void) PyErr_NoMemory(); - goto exit; - } - - len /= bytes_per_frame; /* # of frames */ - - if (state == Py_None) { - d = -outrate; - for (chan = 0; chan < nchannels; chan++) - prev_i[chan] = cur_i[chan] = 0; - } - else { - if (!PyArg_ParseTuple(state, - "iO!;audioop.ratecv: illegal state argument", - &d, &PyTuple_Type, &samps)) - goto exit; - if (PyTuple_Size(samps) != nchannels) { - PyErr_SetString(AudioopError, - "illegal state argument"); - goto exit; - } - for (chan = 0; chan < nchannels; chan++) { - if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan), - "ii:ratecv",&prev_i[chan],&cur_i[chan])) - goto exit; - } - } - - /* str <- Space for the output buffer. */ - { - /* There are len input frames, so we need (mathematically) - ceiling(len*outrate/inrate) output frames, and each frame - requires bytes_per_frame bytes. Computing this - without spurious overflow is the challenge; we can - settle for a reasonable upper bound, though. */ - int ceiling; /* the number of output frames */ - int nbytes; /* the number of output bytes needed */ - int q = len / inrate; - /* Now len = q * inrate + r exactly (with r = len % inrate), - and this is less than q * inrate + inrate = (q+1)*inrate. - So a reasonable upper bound on len*outrate/inrate is - ((q+1)*inrate)*outrate/inrate = - (q+1)*outrate. - */ - ceiling = (q+1) * outrate; - nbytes = ceiling * bytes_per_frame; - /* See whether anything overflowed; if not, get the space. */ - if (q+1 < 0 || - ceiling / outrate != q+1 || - nbytes / bytes_per_frame != ceiling) - str = NULL; - else - str = PyString_FromStringAndSize(NULL, nbytes); - - if (str == NULL) { - PyErr_SetString(PyExc_MemoryError, - "not enough memory for output buffer"); - goto exit; - } - } - ncp = PyString_AsString(str); - - for (;;) { - while (d < 0) { - if (len == 0) { - samps = PyTuple_New(nchannels); - if (samps == NULL) - goto exit; - for (chan = 0; chan < nchannels; chan++) - PyTuple_SetItem(samps, chan, - Py_BuildValue("(ii)", - prev_i[chan], - cur_i[chan])); - if (PyErr_Occurred()) - 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) - goto exit; - rv = Py_BuildValue("(O(iO))", str, d, samps); - Py_DECREF(samps); - Py_DECREF(str); - goto exit; /* return rv */ - } - for (chan = 0; chan < nchannels; chan++) { - prev_i[chan] = cur_i[chan]; - if (size == 1) - cur_i[chan] = ((int)*CHARP(cp, 0)) << 8; - else if (size == 2) - cur_i[chan] = (int)*SHORTP(cp, 0); - else if (size == 4) - cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16; - cp += size; - /* implements a simple digital filter */ - cur_i[chan] = - (weightA * cur_i[chan] + - weightB * prev_i[chan]) / - (weightA + weightB); - } - len--; - d += outrate; - } - while (d >= 0) { - for (chan = 0; chan < nchannels; chan++) { - cur_o = (prev_i[chan] * d + - cur_i[chan] * (outrate - d)) / - outrate; - if (size == 1) - *CHARP(ncp, 0) = (signed char)(cur_o >> 8); - else if (size == 2) - *SHORTP(ncp, 0) = (short)(cur_o); - else if (size == 4) - *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16); - ncp += size; - } - d -= inrate; - } - } + char *cp, *ncp; + int len, 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; + + weightA = 1; + weightB = 0; + if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len, &size, &nchannels, + &inrate, &outrate, &state, &weightA, &weightB)) + return NULL; + if (size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return NULL; + } + if (nchannels < 1) { + PyErr_SetString(AudioopError, "# of channels should be >= 1"); + return NULL; + } + bytes_per_frame = size * nchannels; + if (bytes_per_frame / nchannels != size) { + /* This overflow test is rigorously correct because + both multiplicands are >= 1. Use the argument names + from the docs for the error msg. */ + PyErr_SetString(PyExc_OverflowError, + "width * nchannels too big for a C int"); + return NULL; + } + if (weightA < 1 || weightB < 0) { + PyErr_SetString(AudioopError, + "weightA should be >= 1, weightB should be >= 0"); + return NULL; + } + if (len % bytes_per_frame != 0) { + PyErr_SetString(AudioopError, "not a whole number of frames"); + return NULL; + } + if (inrate <= 0 || outrate <= 0) { + PyErr_SetString(AudioopError, "sampling rate not > 0"); + return NULL; + } + /* divide inrate and outrate by their greatest common divisor */ + d = gcd(inrate, outrate); + inrate /= d; + outrate /= d; + + prev_i = (int *) malloc(nchannels * sizeof(int)); + cur_i = (int *) malloc(nchannels * sizeof(int)); + if (prev_i == NULL || cur_i == NULL) { + (void) PyErr_NoMemory(); + goto exit; + } + + len /= bytes_per_frame; /* # of frames */ + + if (state == Py_None) { + d = -outrate; + for (chan = 0; chan < nchannels; chan++) + prev_i[chan] = cur_i[chan] = 0; + } + else { + if (!PyArg_ParseTuple(state, + "iO!;audioop.ratecv: illegal state argument", + &d, &PyTuple_Type, &samps)) + goto exit; + if (PyTuple_Size(samps) != nchannels) { + PyErr_SetString(AudioopError, + "illegal state argument"); + goto exit; + } + for (chan = 0; chan < nchannels; chan++) { + if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan), + "ii:ratecv",&prev_i[chan],&cur_i[chan])) + goto exit; + } + } + + /* str <- Space for the output buffer. */ + { + /* There are len input frames, so we need (mathematically) + ceiling(len*outrate/inrate) output frames, and each frame + requires bytes_per_frame bytes. Computing this + without spurious overflow is the challenge; we can + settle for a reasonable upper bound, though. */ + int ceiling; /* the number of output frames */ + int nbytes; /* the number of output bytes needed */ + int q = len / inrate; + /* Now len = q * inrate + r exactly (with r = len % inrate), + and this is less than q * inrate + inrate = (q+1)*inrate. + So a reasonable upper bound on len*outrate/inrate is + ((q+1)*inrate)*outrate/inrate = + (q+1)*outrate. + */ + ceiling = (q+1) * outrate; + nbytes = ceiling * bytes_per_frame; + /* See whether anything overflowed; if not, get the space. */ + if (q+1 < 0 || + ceiling / outrate != q+1 || + nbytes / bytes_per_frame != ceiling) + str = NULL; + else + str = PyString_FromStringAndSize(NULL, nbytes); + + if (str == NULL) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + goto exit; + } + } + ncp = PyString_AsString(str); + + for (;;) { + while (d < 0) { + if (len == 0) { + samps = PyTuple_New(nchannels); + if (samps == NULL) + goto exit; + for (chan = 0; chan < nchannels; chan++) + PyTuple_SetItem(samps, chan, + Py_BuildValue("(ii)", + prev_i[chan], + cur_i[chan])); + if (PyErr_Occurred()) + 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) + goto exit; + rv = Py_BuildValue("(O(iO))", str, d, samps); + Py_DECREF(samps); + Py_DECREF(str); + goto exit; /* return rv */ + } + for (chan = 0; chan < nchannels; chan++) { + prev_i[chan] = cur_i[chan]; + if (size == 1) + cur_i[chan] = ((int)*CHARP(cp, 0)) << 8; + else if (size == 2) + cur_i[chan] = (int)*SHORTP(cp, 0); + else if (size == 4) + cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16; + cp += size; + /* implements a simple digital filter */ + cur_i[chan] = + (weightA * cur_i[chan] + + weightB * prev_i[chan]) / + (weightA + weightB); + } + len--; + d += outrate; + } + while (d >= 0) { + for (chan = 0; chan < nchannels; chan++) { + cur_o = (prev_i[chan] * d + + cur_i[chan] * (outrate - d)) / + outrate; + if (size == 1) + *CHARP(ncp, 0) = (signed char)(cur_o >> 8); + else if (size == 2) + *SHORTP(ncp, 0) = (short)(cur_o); + else if (size == 4) + *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16); + ncp += size; + } + d -= inrate; + } + } exit: - if (prev_i != NULL) - free(prev_i); - if (cur_i != NULL) - free(cur_i); - return rv; + if (prev_i != NULL) + free(prev_i); + if (cur_i != NULL) + free(cur_i); + return rv; } static PyObject * audioop_lin2ulaw(PyObject *self, PyObject *args) { - signed char *cp; - unsigned char *ncp; - int len, size, val = 0; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#i)", - &cp, &len, &size) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len/size); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - *ncp++ = st_14linear2ulaw(val); - } - return rv; + signed char *cp; + unsigned char *ncp; + int len, size, val = 0; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len/size); + if ( rv == 0 ) + return 0; + ncp = (unsigned char *)PyString_AsString(rv); + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + *ncp++ = st_14linear2ulaw(val); + } + return rv; } static PyObject * audioop_ulaw2lin(PyObject *self, PyObject *args) { - unsigned char *cp; - unsigned char cval; - signed char *ncp; - int len, size, val; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#i)", - &cp, &len, &size) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len*size); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - for ( i=0; i < len*size; i += size ) { - cval = *cp++; - val = st_ulaw2linear16(cval); - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); - } - return rv; + unsigned char *cp; + unsigned char cval; + signed char *ncp; + int len, size, val; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len*size); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + for ( i=0; i < len*size; i += size ) { + cval = *cp++; + val = st_ulaw2linear16(cval); + + if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); + else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); + } + return rv; } static PyObject * audioop_lin2alaw(PyObject *self, PyObject *args) { - signed char *cp; - unsigned char *ncp; - int len, size, val = 0; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#i)", - &cp, &len, &size) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len/size); - if ( rv == 0 ) - return 0; - ncp = (unsigned char *)PyString_AsString(rv); - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - *ncp++ = st_linear2alaw(val); - } - return rv; + signed char *cp; + unsigned char *ncp; + int len, size, val = 0; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len/size); + if ( rv == 0 ) + return 0; + ncp = (unsigned char *)PyString_AsString(rv); + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + *ncp++ = st_linear2alaw(val); + } + return rv; } static PyObject * audioop_alaw2lin(PyObject *self, PyObject *args) { - unsigned char *cp; - unsigned char cval; - signed char *ncp; - int len, size, val; - PyObject *rv; - int i; - - if ( !PyArg_Parse(args, "(s#i)", - &cp, &len, &size) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - rv = PyString_FromStringAndSize(NULL, len*size); - if ( rv == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(rv); - - for ( i=0; i < len*size; i += size ) { - cval = *cp++; - val = st_alaw2linear16(cval); - - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); - } - return rv; + unsigned char *cp; + unsigned char cval; + signed char *ncp; + int len, size, val; + PyObject *rv; + int i; + + if ( !PyArg_Parse(args, "(s#i)", + &cp, &len, &size) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + rv = PyString_FromStringAndSize(NULL, len*size); + if ( rv == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(rv); + + for ( i=0; i < len*size; i += size ) { + cval = *cp++; + val = st_alaw2linear16(cval); + + if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8); + else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val); + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16); + } + return rv; } static PyObject * audioop_lin2adpcm(PyObject *self, PyObject *args) { - signed char *cp; - signed char *ncp; - int len, size, val = 0, step, valpred, delta, - index, sign, vpdiff, diff; - PyObject *rv, *state, *str; - int i, outputbuffer = 0, bufferstep; - - if ( !PyArg_Parse(args, "(s#iO)", - &cp, &len, &size, &state) ) - return 0; - - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - str = PyString_FromStringAndSize(NULL, len/(size*2)); - if ( str == 0 ) - return 0; - ncp = (signed char *)PyString_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_Parse(state, "(ii)", &valpred, &index) ) - return 0; - - step = stepsizeTable[index]; - bufferstep = 1; - - for ( i=0; i < len; i += size ) { - if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; - else if ( size == 2 ) val = (int)*SHORTP(cp, i); - else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; - - /* Step 1 - compute difference with previous value */ - diff = val - valpred; - sign = (diff < 0) ? 8 : 0; - if ( sign ) diff = (-diff); - - /* Step 2 - Divide and clamp */ - /* Note: - ** This code *approximately* computes: - ** delta = diff*4/step; - ** vpdiff = (delta+0.5)*step/4; - ** but in shift step bits are dropped. The net result of this - ** is that even if you have fast mul/div hardware you cannot - ** put it to good use since the fixup would be too expensive. - */ - delta = 0; - vpdiff = (step >> 3); - - if ( diff >= step ) { - delta = 4; - diff -= step; - vpdiff += step; - } - step >>= 1; - if ( diff >= step ) { - delta |= 2; - diff -= step; - vpdiff += step; - } - step >>= 1; - if ( diff >= step ) { - delta |= 1; - vpdiff += step; - } - - /* Step 3 - Update previous value */ - if ( sign ) - valpred -= vpdiff; - else - valpred += vpdiff; - - /* Step 4 - Clamp previous value to 16 bits */ - if ( valpred > 32767 ) - valpred = 32767; - else if ( valpred < -32768 ) - valpred = -32768; - - /* Step 5 - Assemble value, update index and step values */ - delta |= sign; - - index += indexTable[delta]; - if ( index < 0 ) index = 0; - if ( index > 88 ) index = 88; - step = stepsizeTable[index]; - - /* Step 6 - Output value */ - if ( bufferstep ) { - outputbuffer = (delta << 4) & 0xf0; - } else { - *ncp++ = (delta & 0x0f) | outputbuffer; - } - bufferstep = !bufferstep; - } - rv = Py_BuildValue("(O(ii))", str, valpred, index); - Py_DECREF(str); - return rv; + signed char *cp; + signed char *ncp; + int len, size, val = 0, step, valpred, delta, + index, sign, vpdiff, diff; + PyObject *rv, *state, *str; + int i, outputbuffer = 0, bufferstep; + + if ( !PyArg_Parse(args, "(s#iO)", + &cp, &len, &size, &state) ) + return 0; + + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + str = PyString_FromStringAndSize(NULL, len/(size*2)); + if ( str == 0 ) + return 0; + ncp = (signed char *)PyString_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_Parse(state, "(ii)", &valpred, &index) ) + return 0; + + step = stepsizeTable[index]; + bufferstep = 1; + + for ( i=0; i < len; i += size ) { + if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; + else if ( size == 2 ) val = (int)*SHORTP(cp, i); + else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16; + + /* Step 1 - compute difference with previous value */ + diff = val - valpred; + sign = (diff < 0) ? 8 : 0; + if ( sign ) diff = (-diff); + + /* Step 2 - Divide and clamp */ + /* Note: + ** This code *approximately* computes: + ** delta = diff*4/step; + ** vpdiff = (delta+0.5)*step/4; + ** but in shift step bits are dropped. The net result of this + ** is that even if you have fast mul/div hardware you cannot + ** put it to good use since the fixup would be too expensive. + */ + delta = 0; + vpdiff = (step >> 3); + + if ( diff >= step ) { + delta = 4; + diff -= step; + vpdiff += step; + } + step >>= 1; + if ( diff >= step ) { + delta |= 2; + diff -= step; + vpdiff += step; + } + step >>= 1; + if ( diff >= step ) { + delta |= 1; + vpdiff += step; + } + + /* Step 3 - Update previous value */ + if ( sign ) + valpred -= vpdiff; + else + valpred += vpdiff; + + /* Step 4 - Clamp previous value to 16 bits */ + if ( valpred > 32767 ) + valpred = 32767; + else if ( valpred < -32768 ) + valpred = -32768; + + /* Step 5 - Assemble value, update index and step values */ + delta |= sign; + + index += indexTable[delta]; + if ( index < 0 ) index = 0; + if ( index > 88 ) index = 88; + step = stepsizeTable[index]; + + /* Step 6 - Output value */ + if ( bufferstep ) { + outputbuffer = (delta << 4) & 0xf0; + } else { + *ncp++ = (delta & 0x0f) | outputbuffer; + } + bufferstep = !bufferstep; + } + rv = Py_BuildValue("(O(ii))", str, valpred, index); + Py_DECREF(str); + return rv; } static PyObject * audioop_adpcm2lin(PyObject *self, PyObject *args) { - signed char *cp; - signed char *ncp; - int len, size, valpred, step, delta, index, sign, vpdiff; - PyObject *rv, *str, *state; - int i, inputbuffer = 0, bufferstep; - - if ( !PyArg_Parse(args, "(s#iO)", - &cp, &len, &size, &state) ) - return 0; - - if ( size != 1 && size != 2 && size != 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); - return 0; - } - - /* 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_Parse(state, "(ii)", &valpred, &index) ) - return 0; - - str = PyString_FromStringAndSize(NULL, len*size*2); - if ( str == 0 ) - return 0; - ncp = (signed char *)PyString_AsString(str); - - step = stepsizeTable[index]; - bufferstep = 0; - - for ( i=0; i < len*size*2; i += size ) { - /* Step 1 - get the delta value and compute next index */ - if ( bufferstep ) { - delta = inputbuffer & 0xf; - } else { - inputbuffer = *cp++; - delta = (inputbuffer >> 4) & 0xf; - } - - bufferstep = !bufferstep; - - /* Step 2 - Find new index value (for later) */ - index += indexTable[delta]; - if ( index < 0 ) index = 0; - if ( index > 88 ) index = 88; - - /* Step 3 - Separate sign and magnitude */ - sign = delta & 8; - delta = delta & 7; - - /* Step 4 - Compute difference and new predicted value */ - /* - ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment - ** in adpcm_coder. - */ - vpdiff = step >> 3; - if ( delta & 4 ) vpdiff += step; - if ( delta & 2 ) vpdiff += step>>1; - if ( delta & 1 ) vpdiff += step>>2; - - if ( sign ) - valpred -= vpdiff; - else - valpred += vpdiff; - - /* Step 5 - clamp output value */ - if ( valpred > 32767 ) - valpred = 32767; - else if ( valpred < -32768 ) - valpred = -32768; - - /* Step 6 - Update step value */ - step = stepsizeTable[index]; - - /* Step 6 - Output value */ - if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8); - else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred); - else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16); - } - - rv = Py_BuildValue("(O(ii))", str, valpred, index); - Py_DECREF(str); - return rv; + signed char *cp; + signed char *ncp; + int len, size, valpred, step, delta, index, sign, vpdiff; + PyObject *rv, *str, *state; + int i, inputbuffer = 0, bufferstep; + + if ( !PyArg_Parse(args, "(s#iO)", + &cp, &len, &size, &state) ) + return 0; + + if ( size != 1 && size != 2 && size != 4) { + PyErr_SetString(AudioopError, "Size should be 1, 2 or 4"); + return 0; + } + + /* 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_Parse(state, "(ii)", &valpred, &index) ) + return 0; + + str = PyString_FromStringAndSize(NULL, len*size*2); + if ( str == 0 ) + return 0; + ncp = (signed char *)PyString_AsString(str); + + step = stepsizeTable[index]; + bufferstep = 0; + + for ( i=0; i < len*size*2; i += size ) { + /* Step 1 - get the delta value and compute next index */ + if ( bufferstep ) { + delta = inputbuffer & 0xf; + } else { + inputbuffer = *cp++; + delta = (inputbuffer >> 4) & 0xf; + } + + bufferstep = !bufferstep; + + /* Step 2 - Find new index value (for later) */ + index += indexTable[delta]; + if ( index < 0 ) index = 0; + if ( index > 88 ) index = 88; + + /* Step 3 - Separate sign and magnitude */ + sign = delta & 8; + delta = delta & 7; + + /* Step 4 - Compute difference and new predicted value */ + /* + ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment + ** in adpcm_coder. + */ + vpdiff = step >> 3; + if ( delta & 4 ) vpdiff += step; + if ( delta & 2 ) vpdiff += step>>1; + if ( delta & 1 ) vpdiff += step>>2; + + if ( sign ) + valpred -= vpdiff; + else + valpred += vpdiff; + + /* Step 5 - clamp output value */ + if ( valpred > 32767 ) + valpred = 32767; + else if ( valpred < -32768 ) + valpred = -32768; + + /* Step 6 - Update step value */ + step = stepsizeTable[index]; + + /* Step 6 - Output value */ + if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8); + else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred); + else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16); + } + + rv = Py_BuildValue("(O(ii))", str, valpred, index); + Py_DECREF(str); + return rv; } static PyMethodDef audioop_methods[] = { - { "max", audioop_max, METH_OLDARGS }, - { "minmax", audioop_minmax, METH_OLDARGS }, - { "avg", audioop_avg, METH_OLDARGS }, - { "maxpp", audioop_maxpp, METH_OLDARGS }, - { "avgpp", audioop_avgpp, METH_OLDARGS }, - { "rms", audioop_rms, METH_OLDARGS }, - { "findfit", audioop_findfit, METH_OLDARGS }, - { "findmax", audioop_findmax, METH_OLDARGS }, - { "findfactor", audioop_findfactor, METH_OLDARGS }, - { "cross", audioop_cross, METH_OLDARGS }, - { "mul", audioop_mul, METH_OLDARGS }, - { "add", audioop_add, METH_OLDARGS }, - { "bias", audioop_bias, METH_OLDARGS }, - { "ulaw2lin", audioop_ulaw2lin, METH_OLDARGS }, - { "lin2ulaw", audioop_lin2ulaw, METH_OLDARGS }, - { "alaw2lin", audioop_alaw2lin, METH_OLDARGS }, - { "lin2alaw", audioop_lin2alaw, METH_OLDARGS }, - { "lin2lin", audioop_lin2lin, METH_OLDARGS }, - { "adpcm2lin", audioop_adpcm2lin, METH_OLDARGS }, - { "lin2adpcm", audioop_lin2adpcm, METH_OLDARGS }, - { "tomono", audioop_tomono, METH_OLDARGS }, - { "tostereo", audioop_tostereo, METH_OLDARGS }, - { "getsample", audioop_getsample, METH_OLDARGS }, - { "reverse", audioop_reverse, METH_OLDARGS }, - { "ratecv", audioop_ratecv, METH_VARARGS }, - { 0, 0 } + { "max", audioop_max, METH_OLDARGS }, + { "minmax", audioop_minmax, METH_OLDARGS }, + { "avg", audioop_avg, METH_OLDARGS }, + { "maxpp", audioop_maxpp, METH_OLDARGS }, + { "avgpp", audioop_avgpp, METH_OLDARGS }, + { "rms", audioop_rms, METH_OLDARGS }, + { "findfit", audioop_findfit, METH_OLDARGS }, + { "findmax", audioop_findmax, METH_OLDARGS }, + { "findfactor", audioop_findfactor, METH_OLDARGS }, + { "cross", audioop_cross, METH_OLDARGS }, + { "mul", audioop_mul, METH_OLDARGS }, + { "add", audioop_add, METH_OLDARGS }, + { "bias", audioop_bias, METH_OLDARGS }, + { "ulaw2lin", audioop_ulaw2lin, METH_OLDARGS }, + { "lin2ulaw", audioop_lin2ulaw, METH_OLDARGS }, + { "alaw2lin", audioop_alaw2lin, METH_OLDARGS }, + { "lin2alaw", audioop_lin2alaw, METH_OLDARGS }, + { "lin2lin", audioop_lin2lin, METH_OLDARGS }, + { "adpcm2lin", audioop_adpcm2lin, METH_OLDARGS }, + { "lin2adpcm", audioop_lin2adpcm, METH_OLDARGS }, + { "tomono", audioop_tomono, METH_OLDARGS }, + { "tostereo", audioop_tostereo, METH_OLDARGS }, + { "getsample", audioop_getsample, METH_OLDARGS }, + { "reverse", audioop_reverse, METH_OLDARGS }, + { "ratecv", audioop_ratecv, METH_VARARGS }, + { 0, 0 } }; PyMODINIT_FUNC initaudioop(void) { - PyObject *m, *d; - m = Py_InitModule("audioop", audioop_methods); - if (m == NULL) - return; - d = PyModule_GetDict(m); - AudioopError = PyErr_NewException("audioop.error", NULL, NULL); - if (AudioopError != NULL) - PyDict_SetItemString(d,"error",AudioopError); + PyObject *m, *d; + m = Py_InitModule("audioop", audioop_methods); + if (m == NULL) + return; + d = PyModule_GetDict(m); + AudioopError = PyErr_NewException("audioop.error", NULL, NULL); + if (AudioopError != NULL) + PyDict_SetItemString(d,"error",AudioopError); } From python-checkins at python.org Mon Mar 20 07:06:07 2006 From: python-checkins at python.org (tim.peters) Date: Mon, 20 Mar 2006 07:06:07 +0100 (CET) Subject: [Python-checkins] r43156 - python/branches/release24-maint/Tools/buildbot/README.txt python/branches/release24-maint/Tools/buildbot/build.bat python/branches/release24-maint/Tools/buildbot/external.bat python/branches/release24-maint/Tools/buildbot/fetch_data_files.py Message-ID: <20060320060607.D8D8A1E400F@bag.python.org> Author: tim.peters Date: Mon Mar 20 07:06:07 2006 New Revision: 43156 Added: python/branches/release24-maint/Tools/buildbot/README.txt (contents, props changed) python/branches/release24-maint/Tools/buildbot/fetch_data_files.py (contents, props changed) Modified: python/branches/release24-maint/Tools/buildbot/build.bat python/branches/release24-maint/Tools/buildbot/external.bat Log: The new fetch_data_files.py downloads all the input data files used by encoding tests. Fiddled the Windows buildbot helper scripts to invoke this if needed. Note that this isn't needed on the trunk (the encoding tests download input files automatically in 2.5). Added: python/branches/release24-maint/Tools/buildbot/README.txt ============================================================================== --- (empty file) +++ python/branches/release24-maint/Tools/buildbot/README.txt Mon Mar 20 07:06:07 2006 @@ -0,0 +1,14 @@ +Helpers used by buildbot-driven core Python testing. + +external.bat +build.bat +test.bat +clean.bat + On Windows, these scripts are executed by the code sent + from the buildbot master to the slaves. + +fetch_data_files.py + Download all the input files various encoding tests want. This is + used by build.bat on Windows (but could be used on any platform). + Note that in Python >= 2.5, the encoding tests download input files + automatically. Modified: python/branches/release24-maint/Tools/buildbot/build.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/build.bat (original) +++ python/branches/release24-maint/Tools/buildbot/build.bat Mon Mar 20 07:06:07 2006 @@ -1,4 +1,7 @@ @rem Used by the buildbot "compile" step. cmd /c Tools\buildbot\external.bat call "%VS71COMNTOOLS%vsvars32.bat" -devenv.com /useenv /build Debug PCbuild\pcbuild.sln +cd PCbuild +devenv.com /useenv /build Debug pcbuild.sln + at rem Fetch encoding test files. Note that python_d needs to be built first. +if not exist BIG5.TXT python_d.exe ..\Tools\buildbot\fetch_data_files.py \ No newline at end of file Modified: python/branches/release24-maint/Tools/buildbot/external.bat ============================================================================== --- python/branches/release24-maint/Tools/buildbot/external.bat (original) +++ python/branches/release24-maint/Tools/buildbot/external.bat Mon Mar 20 07:06:07 2006 @@ -4,5 +4,4 @@ cd .. @rem bzip -if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 - +if not exist bzip2-1.0.3 svn export http://svn.python.org/projects/external/bzip2-1.0.3 \ No newline at end of file Added: python/branches/release24-maint/Tools/buildbot/fetch_data_files.py ============================================================================== --- (empty file) +++ python/branches/release24-maint/Tools/buildbot/fetch_data_files.py Mon Mar 20 07:06:07 2006 @@ -0,0 +1,61 @@ +"""A helper to download input files needed by assorted encoding tests. + +fetch_data_files.py [directory] + +Files are downloaded to directory `directory`. If a directory isn't given, +it defaults to the current directory (.). +""" + +DATA_URLS = """ + http://people.freebsd.org/~perky/i18n/BIG5HKSCS.TXT + http://people.freebsd.org/~perky/i18n/EUC-CN.TXT + http://people.freebsd.org/~perky/i18n/EUC-JISX0213.TXT + http://people.freebsd.org/~perky/i18n/EUC-JP.TXT + http://people.freebsd.org/~perky/i18n/EUC-KR.TXT + http://people.freebsd.org/~perky/i18n/SHIFT_JISX0213.TXT + + http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT + http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT + http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT + http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT + + http://www.unicode.org/Public/3.2-Update/NormalizationTest-3.2.0.txt + + http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT + http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT + http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT +""" + +# Adapted from test_support.open_urlresource() in Python 2.5. +# Fetch the file give by `url` off the web, and store it in directory +# `directory`. The file name is extracted from the last URL component. +# If the file already exists, it's not fetched again. +def fetch_file_from_url(url, directory): + import urllib, urlparse + import os.path + + filename = urlparse.urlparse(url)[2].split('/')[-1] # '/': it's a URL! + target = os.path.join(directory, filename) + if os.path.exists(target): + print "\tskipping %r -- already exists" % target + else: + print "\tfetching %s ..." % url + urllib.urlretrieve(url, target) + +def main(urls, directory): + print "Downloading data files to %r" % directory + for url in urls.split(): + fetch_file_from_url(url, directory) + +if __name__ == "__main__": + import sys + + n = len(sys.argv) + if n == 1: + directory = "." + elif n == 2: + directory = sys.argv[1] + else: + raise ValueError("no more than one argument allowed") + + main(DATA_URLS, directory) From python-checkins at python.org Mon Mar 20 07:25:06 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 07:25:06 +0100 (CET) Subject: [Python-checkins] r43157 - python/tags/r25a0 Message-ID: <20060320062506.00A751E401A@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 07:25:04 2006 New Revision: 43157 Added: python/tags/r25a0/ - copied from r43156, python/trunk/ Log: experimenting with release stuff. please ignore From python-checkins at python.org Mon Mar 20 07:30:10 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 07:30:10 +0100 (CET) Subject: [Python-checkins] r43158 - in python/trunk: Doc/lib/libos.tex Lib/test/fork_wait.py Lib/test/test_fork1.py Lib/test/test_wait3.py Lib/test/test_wait4.py Misc/ACKS Misc/NEWS Modules/posixmodule.c configure configure.in pyconfig.h.in Message-ID: <20060320063010.E51041E4033@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 07:30:08 2006 New Revision: 43158 Added: python/trunk/Lib/test/fork_wait.py (contents, props changed) python/trunk/Lib/test/test_wait3.py (contents, props changed) python/trunk/Lib/test/test_wait4.py (contents, props changed) Modified: python/trunk/Doc/lib/libos.tex python/trunk/Lib/test/test_fork1.py python/trunk/Misc/ACKS python/trunk/Misc/NEWS python/trunk/Modules/posixmodule.c python/trunk/configure python/trunk/configure.in python/trunk/pyconfig.h.in Log: Patch #1309579: wait3 and wait4 were added to the posix module by Chad J. Schroeder. This was a fair amount of rework of the patch. Refactored test_fork1 so it could be reused by the new tests for wait3/4. Also made them into new style unittests (derive from unittest.TestCase). Modified: python/trunk/Doc/lib/libos.tex ============================================================================== --- python/trunk/Doc/lib/libos.tex (original) +++ python/trunk/Doc/lib/libos.tex Mon Mar 20 07:30:08 2006 @@ -1731,6 +1731,27 @@ return suitable process handles. \end{funcdesc} +\begin{funcdesc}{wait3}{\{optional{options}} +Similar to \function{waitpid()}, except no process id argument is given and +a 3-element tuple containing the child's process id, exit status indication, +and resource usage information is returned. Refer to +\module{resource}.\function{getrusage()} +for details on resource usage information. The option argument is the same +as that provided to \function{waitpid()} and \function{wait4()}. +Availability: \UNIX. +\versionadded{2.5} +\end{funcdesc} + +\begin{funcdesc}{wait4}{pid, options} +Similar to \function{waitpid()}, except a 3-element tuple, containing the +child's process id, exit status indication, and resource usage information +is returned. Refer to \module{resource}.\function{getrusage()} for details +on resource usage information. The arguments to \function{wait4()} are +the same as those provided to \function{waitpid()}. +Availability: \UNIX. +\versionadded{2.5} +\end{funcdesc} + \begin{datadesc}{WNOHANG} The option for \function{waitpid()} to return immediately if no child process status is available immediately. The function returns Added: python/trunk/Lib/test/fork_wait.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/fork_wait.py Mon Mar 20 07:30:08 2006 @@ -0,0 +1,71 @@ +"""This test case provides support for checking forking and wait behavior. + +To test different wait behavior, overrise the wait_impl method. + +We want fork1() semantics -- only the forking thread survives in the +child after a fork(). + +On some systems (e.g. Solaris without posix threads) we find that all +active threads survive in the child after a fork(); this is an error. + +While BeOS doesn't officially support fork and native threading in +the same application, the present example should work just fine. DC +""" + +import os, sys, time, thread, unittest +from test.test_support import TestSkipped + +LONGSLEEP = 2 +SHORTSLEEP = 0.5 +NUM_THREADS = 4 + +class ForkWait(unittest.TestCase): + + def setUp(self): + self.alive = {} + self.stop = 0 + + def f(self, id): + while not self.stop: + self.alive[id] = os.getpid() + try: + time.sleep(SHORTSLEEP) + except IOError: + pass + + def wait_impl(self, cpid): + spid, status = os.waitpid(cpid, 0) + self.assertEquals(spid, cpid) + self.assertEquals(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + + def test_wait(self): + for i in range(NUM_THREADS): + thread.start_new(self.f, (i,)) + + time.sleep(LONGSLEEP) + + a = self.alive.keys() + a.sort() + self.assertEquals(a, range(NUM_THREADS)) + + prefork_lives = self.alive.copy() + + if sys.platform in ['unixware7']: + cpid = os.fork1() + else: + cpid = os.fork() + + if cpid == 0: + # Child + time.sleep(LONGSLEEP) + n = 0 + for key in self.alive: + if self.alive[key] != prefork_lives[key]: + n += 1 + os._exit(n) + else: + # Parent + self.wait_impl(cpid) + # Tell threads to die + self.stop = 1 + time.sleep(2*SHORTSLEEP) # Wait for threads to die Modified: python/trunk/Lib/test/test_fork1.py ============================================================================== --- python/trunk/Lib/test/test_fork1.py (original) +++ python/trunk/Lib/test/test_fork1.py Mon Mar 20 07:30:08 2006 @@ -1,75 +1,23 @@ """This test checks for correct fork() behavior. - -We want fork1() semantics -- only the forking thread survives in the -child after a fork(). - -On some systems (e.g. Solaris without posix threads) we find that all -active threads survive in the child after a fork(); this is an error. - -While BeOS doesn't officially support fork and native threading in -the same application, the present example should work just fine. DC """ -import os, sys, time, thread -from test.test_support import verify, verbose, TestSkipped +import os +from test.fork_wait import ForkWait +from test.test_support import TestSkipped, run_unittest try: os.fork except AttributeError: raise TestSkipped, "os.fork not defined -- skipping test_fork1" -LONGSLEEP = 2 - -SHORTSLEEP = 0.5 - -NUM_THREADS = 4 - -alive = {} - -stop = 0 - -def f(id): - while not stop: - alive[id] = os.getpid() - try: - time.sleep(SHORTSLEEP) - except IOError: - pass - -def main(): - for i in range(NUM_THREADS): - thread.start_new(f, (i,)) - - time.sleep(LONGSLEEP) - - a = alive.keys() - a.sort() - verify(a == range(NUM_THREADS)) - - prefork_lives = alive.copy() - - if sys.platform in ['unixware7']: - cpid = os.fork1() - else: - cpid = os.fork() - - if cpid == 0: - # Child - time.sleep(LONGSLEEP) - n = 0 - for key in alive.keys(): - if alive[key] != prefork_lives[key]: - n = n+1 - os._exit(n) - else: - # Parent +class ForkTest(ForkWait): + def wait_impl(self, cpid): spid, status = os.waitpid(cpid, 0) - verify(spid == cpid) - verify(status == 0, - "cause = %d, exit = %d" % (status&0xff, status>>8) ) - global stop - # Tell threads to die - stop = 1 - time.sleep(2*SHORTSLEEP) # Wait for threads to die + self.assertEqual(spid, cpid) + self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + +def test_main(): + run_unittest(ForkTest) -main() +if __name__ == "__main__": + test_main() Added: python/trunk/Lib/test/test_wait3.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_wait3.py Mon Mar 20 07:30:08 2006 @@ -0,0 +1,32 @@ +"""This test checks for correct wait3() behavior. +""" + +import os +from test.fork_wait import ForkWait +from test.test_support import TestSkipped, run_unittest + +try: + os.fork +except AttributeError: + raise TestSkipped, "os.fork not defined -- skipping test_wait3" + +try: + os.wait3 +except AttributeError: + raise TestSkipped, "os.wait3 not defined -- skipping test_wait3" + +class Wait3Test(ForkWait): + def wait_impl(self, cpid): + while 1: + spid, status, rusage = os.wait3(0) + if spid == cpid: + break + self.assertEqual(spid, cpid) + self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertTrue(rusage) + +def test_main(): + run_unittest(Wait3Test) + +if __name__ == "__main__": + test_main() Added: python/trunk/Lib/test/test_wait4.py ============================================================================== --- (empty file) +++ python/trunk/Lib/test/test_wait4.py Mon Mar 20 07:30:08 2006 @@ -0,0 +1,29 @@ +"""This test checks for correct wait4() behavior. +""" + +import os +from test.fork_wait import ForkWait +from test.test_support import TestSkipped, run_unittest + +try: + os.fork +except AttributeError: + raise TestSkipped, "os.fork not defined -- skipping test_wait4" + +try: + os.wait4 +except AttributeError: + raise TestSkipped, "os.wait4 not defined -- skipping test_wait4" + +class Wait4Test(ForkWait): + def wait_impl(self, cpid): + spid, status, rusage = os.wait4(cpid, 0) + self.assertEqual(spid, cpid) + self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertTrue(rusage) + +def test_main(): + run_unittest(Wait4Test) + +if __name__ == "__main__": + test_main() Modified: python/trunk/Misc/ACKS ============================================================================== --- python/trunk/Misc/ACKS (original) +++ python/trunk/Misc/ACKS Mon Mar 20 07:30:08 2006 @@ -536,6 +536,7 @@ Gregor Schmid Ralf Schmitt Peter Schneider-Kamp +Chad J. Schroeder Sam Schulenburg Stefan Schwarzer Dietmar Schwertberger Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Mar 20 07:30:08 2006 @@ -295,6 +295,8 @@ Extension Modules ----------------- +- Patch #1309579: wait3 and wait4 were added to the posix module. + - Patch #1231053: The audioop module now supports encoding/decoding of alaw. In addition, the existing ulaw code was updated. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Mar 20 07:30:08 2006 @@ -5091,6 +5091,128 @@ } #endif /* HAVE_SETGROUPS */ +static PyObject * +wait_helper(int pid, int status, struct rusage *ru) +{ + PyObject *result; + static PyObject *struct_rusage; + + if (pid == -1) + return posix_error(); + + if (struct_rusage == NULL) { + PyObject *m = PyImport_ImportModule("resource"); + if (m == NULL) + return NULL; + struct_rusage = PyObject_GetAttrString(m, "struct_rusage"); + Py_DECREF(m); + if (struct_rusage == NULL) + return NULL; + } + + /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ + result = PyStructSequence_New((PyTypeObject*) struct_rusage); + if (!result) + return NULL; + +#ifndef doubletime +#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) +#endif + + PyStructSequence_SET_ITEM(result, 0, + PyFloat_FromDouble(doubletime(ru->ru_utime))); + 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)) + SET_INT(result, 2, ru->ru_maxrss); + SET_INT(result, 3, ru->ru_ixrss); + SET_INT(result, 4, ru->ru_idrss); + SET_INT(result, 5, ru->ru_isrss); + SET_INT(result, 6, ru->ru_minflt); + SET_INT(result, 7, ru->ru_majflt); + SET_INT(result, 8, ru->ru_nswap); + SET_INT(result, 9, ru->ru_inblock); + SET_INT(result, 10, ru->ru_oublock); + SET_INT(result, 11, ru->ru_msgsnd); + SET_INT(result, 12, ru->ru_msgrcv); + SET_INT(result, 13, ru->ru_nsignals); + SET_INT(result, 14, ru->ru_nvcsw); + SET_INT(result, 15, ru->ru_nivcsw); +#undef SET_INT + + if (PyErr_Occurred()) { + Py_DECREF(result); + return NULL; + } + + return Py_BuildValue("iiO", pid, status, result); +} + +#ifdef HAVE_WAIT3 +PyDoc_STRVAR(posix_wait3__doc__, +"wait3(options) -> (pid, status, rusage)\n\n\ +Wait for completion of a child process."); + +static PyObject * +posix_wait3(PyObject *self, PyObject *args) +{ + int pid, options; + struct rusage ru; + +#ifdef UNION_WAIT + union wait status; +#define status_i (status.w_status) +#else + int status; +#define status_i status +#endif + status_i = 0; + + if (!PyArg_ParseTuple(args, "i:wait3", &options)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + pid = wait3(&status, options, &ru); + Py_END_ALLOW_THREADS + + return wait_helper(pid, status_i, &ru); +#undef status_i +} +#endif /* HAVE_WAIT3 */ + +#ifdef HAVE_WAIT4 +PyDoc_STRVAR(posix_wait4__doc__, +"wait4(pid, options) -> (pid, status, rusage)\n\n\ +Wait for completion of a given child process."); + +static PyObject * +posix_wait4(PyObject *self, PyObject *args) +{ + int pid, options; + struct rusage ru; + +#ifdef UNION_WAIT + union wait status; +#define status_i (status.w_status) +#else + int status; +#define status_i status +#endif + status_i = 0; + + if (!PyArg_ParseTuple(args, "ii:wait4", &pid, &options)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + pid = wait4(pid, &status, options, &ru); + Py_END_ALLOW_THREADS + + return wait_helper(pid, status_i, &ru); +#undef status_i +} +#endif /* HAVE_WAIT4 */ + #ifdef HAVE_WAITPID PyDoc_STRVAR(posix_waitpid__doc__, "waitpid(pid, options) -> (pid, status)\n\n\ @@ -7696,6 +7818,12 @@ #ifdef HAVE_WAIT {"wait", posix_wait, METH_NOARGS, posix_wait__doc__}, #endif /* HAVE_WAIT */ +#ifdef HAVE_WAIT3 + {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__}, +#endif /* HAVE_WAIT3 */ +#ifdef HAVE_WAIT4 + {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__}, +#endif /* HAVE_WAIT4 */ #if defined(HAVE_WAITPID) || defined(HAVE_CWAIT) {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__}, #endif /* HAVE_WAITPID */ Modified: python/trunk/configure ============================================================================== --- python/trunk/configure (original) +++ python/trunk/configure Mon Mar 20 07:30:08 2006 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 42437 . +# From configure.in Revision: 42563 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for python 2.5. # @@ -14086,6 +14086,8 @@ + + for ac_func in alarm bind_textdomain_codeset chown clock confstr ctermid \ execv fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ @@ -14097,7 +14099,7 @@ setlocale setregid setreuid setsid setpgid setpgrp setuid setvbuf snprintf \ sigaction siginterrupt sigrelse strftime \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unsetenv utimes waitpid wcscoll _getpty + truncate uname unsetenv utimes waitpid wait3 wait4 wcscoll _getpty do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 Modified: python/trunk/configure.in ============================================================================== --- python/trunk/configure.in (original) +++ python/trunk/configure.in Mon Mar 20 07:30:08 2006 @@ -2148,7 +2148,7 @@ setlocale setregid setreuid setsid setpgid setpgrp setuid setvbuf snprintf \ sigaction siginterrupt sigrelse strftime \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unsetenv utimes waitpid wcscoll _getpty) + truncate uname unsetenv utimes waitpid wait3 wait4 wcscoll _getpty) # For some functions, having a definition is not sufficient, since # we want to take their address. Modified: python/trunk/pyconfig.h.in ============================================================================== --- python/trunk/pyconfig.h.in (original) +++ python/trunk/pyconfig.h.in Mon Mar 20 07:30:08 2006 @@ -670,6 +670,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIME_H +/* Define to 1 if you have the `wait3' function. */ +#undef HAVE_WAIT3 + +/* Define to 1 if you have the `wait4' function. */ +#undef HAVE_WAIT4 + /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID From python-checkins at python.org Mon Mar 20 07:30:53 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 07:30:53 +0100 (CET) Subject: [Python-checkins] r43159 - python/trunk/Misc/HISTORY python/trunk/Misc/NEWS Message-ID: <20060320063053.428B71E4029@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 07:30:41 2006 New Revision: 43159 Modified: python/trunk/Misc/HISTORY python/trunk/Misc/NEWS Log: moved older releases into HISTORY Modified: python/trunk/Misc/HISTORY ============================================================================== --- python/trunk/Misc/HISTORY (original) +++ python/trunk/Misc/HISTORY Mon Mar 20 07:30:41 2006 @@ -8,6 +8,5293 @@ ====================================================================== +What's New in Python 2.4 final? +=============================== + +*Release date: 30-NOV-2004* + +Core and builtins +----------------- + +- Bug 875692: Improve signal handling, especially when using threads, by + forcing an early re-execution of PyEval_EvalFrame() "periodic" code when + things_to_do is not cleared by Py_MakePendingCalls(). + + +What's New in Python 2.4 (release candidate 1) +============================================== + +*Release date: 18-NOV-2004* + +Core and builtins +----------------- + +- Bug 1061968: Fixes in 2.4a3 to address thread bug 1010677 reintroduced + the years-old thread shutdown race bug 225673. Numeric history lesson + aside, all bugs in all three reports are fixed now. + + +Library +------- + +- Bug 1052242: If exceptions are raised by an atexit handler function an + attempt is made to execute the remaining handlers. The last exception + raised is re-raised. + +- ``doctest``'s new support for adding ``pdb.set_trace()`` calls to + doctests was broken in a dramatic but shallow way. Fixed. + +- Bug 1065388: ``calendar``'s ``day_name``, ``day_abbr``, ``month_name``, + and ``month_abbr`` attributes emulate sequences of locale-correct + spellings of month and day names. Because the locale can change at + any time, the correct spelling is recomputed whenever one of these is + indexed. In the worst case, the index may be a slice object, so these + recomputed every day or month name each time they were indexed. This is + much slower than necessary in the usual case, when the index is just an + integer. In that case, only the single spelling needed is recomputed + now; and, when the index is a slice object, only the spellings needed + by the slice are recomputed now. + +- Patch 1061679: Added ``__all__`` to pickletools.py. + +Build +----- + +- Bug 1034277 / Patch 1035255: Remove compilation of core against CoreServices + and CoreFoundation on OS X. Involved removing PyMac_GetAppletScriptFile() + which has no known users. Thanks Bob Ippolito. + +C API +----- + +- The PyRange_New() function is deprecated. + + +What's New in Python 2.4 beta 2? +================================ + +*Release date: 03-NOV-2004* + +License +------- + +The Python Software Foundation changed the license under which Python +is released, to remove Python version numbers. There were no other +changes to the license. So, for example, wherever the license for +Python 2.3 said "Python 2.3", the new license says "Python". The +intent is to make it possible to refer to the PSF license in a more +durable way. For example, some people say they're confused by that +the Open Source Initiative's entry for the Python Software Foundation +License:: + + http://www.opensource.org/licenses/PythonSoftFoundation.php + +says "Python 2.1.1" all over it, wondering whether it applies only +to Python 2.1.1. + +The official name of the new license is the Python Software Foundation +License Version 2. + +Core and builtins +----------------- + +- Bug #1055820 Cyclic garbage collection was not protecting against that + calling a live weakref to a piece of cyclic trash could resurrect an + insane mutation of the trash if any Python code ran during gc (via + running a dead object's __del__ method, running another callback on a + weakref to a dead object, or via any Python code run in any other thread + that managed to obtain the GIL while a __del__ or callback was running + in the thread doing gc). The most likely symptom was "impossible" + ``AttributeError`` exceptions, appearing seemingly at random, on weakly + referenced objects. The cure was to clear all weakrefs to unreachable + objects before allowing any callbacks to run. + +- Bug #1054139 _PyString_Resize() now invalidates its cached hash value. + +Extension Modules +----------------- + +- Bug #1048870: the compiler now generates distinct code objects for + functions with identical bodies. This was producing confusing + traceback messages which pointed to the function where the code + object was first defined rather than the function being executed. + +Library +------- + +- Patch #1056967 changes the semantics of Template.safe_substitute() so that + no ValueError is raised on an 'invalid' match group. Now the delimiter is + returned. + +- Bug #1052503 pdb.runcall() was not passing along keyword arguments. + +- Bug #902037: XML.sax.saxutils.prepare_input_source() now combines relative + paths with a base path before checking os.path.isfile(). + +- The whichdb module can now be run from the command line. + +- Bug #1045381: time.strptime() can now infer the date using %U or %W (week of + the year) when the day of the week and year are also specified. + +- Bug #1048816: fix bug in Ctrl-K at start of line in curses.textpad.Textbox + +- Bug #1017553: fix bug in tarfile.filemode() + +- Patch #737473: fix bug that old source code is shown in tracebacks even if + the source code is updated and reloaded. + +Build +----- + +- Patch #1044395: --enable-shared is allowed in FreeBSD also. + +What's New in Python 2.4 beta 1? +================================ + +*Release date: 15-OCT-2004* + +Core and builtins +----------------- + +- Patch #975056: Restartable signals were not correctly disabled on + BSD systems. Consistently use PyOS_setsig() instead of signal(). + +- The internal portable implementation of thread-local storage (TLS), used + by the ``PyGILState_Ensure()``/``PyGILState_Release()`` API, was not + thread-correct. This could lead to a variety of problems, up to and + including segfaults. See bug 1041645 for an example. + +- Added a command line option, -m module, which searches sys.path for the + module and then runs it. (Contributed by Nick Coghlan.) + +- The bytecode optimizer now folds tuples of constants into a single + constant. + +- SF bug #513866: Float/long comparison anomaly. Prior to 2.4b1, when + an integer was compared to a float, the integer was coerced to a float. + That could yield spurious overflow errors (if the integer was very + large), and to anomalies such as + ``long(1e200)+1 == 1e200 == long(1e200)-1``. Coercion to float is no + longer performed, and cases like ``long(1e200)-1 < 1e200``, + ``long(1e200)+1 > 1e200`` and ``(1 << 20000) > 1e200`` are computed + correctly now. + +Extension modules +----------------- + +- ``collections.deque`` objects didn't play quite right with garbage + collection, which could lead to a segfault in a release build, or + an assert failure in a debug build. Also, added overflow checks, + better detection of mutation during iteration, and shielded deque + comparisons from unusual subclass overrides of the __iter__() method. + +Library +------- + +- Patch 1046644: distutils build_ext grew two new options - --swig for + specifying the swig executable to use, and --swig-opts to specify + options to pass to swig. --swig-opts="-c++" is the new way to spell + --swig-cpp. + +- Patch 983206: distutils now obeys environment variable LDSHARED, if + it is set. + +- Added Peter Astrand's subprocess.py module. See PEP 324 for details. + +- time.strptime() now properly escapes timezones and all other locale-specific + strings for regex-specific symbols. Was breaking under Japanese Windows when + the timezone was specified as "Tokyo (standard time)". + Closes bug #1039270. + +- Updates for the email package: + + + email.Utils.formatdate() grew a 'usegmt' argument for HTTP support. + + All deprecated APIs that in email 2.x issued warnings have been removed: + _encoder argument to the MIMEText constructor, Message.add_payload(), + Utils.dump_address_pair(), Utils.decode(), Utils.encode() + + New deprecations: Generator.__call__(), Message.get_type(), + Message.get_main_type(), Message.get_subtype(), the 'strict' argument to + the Parser constructor. These will be removed in email 3.1. + + Support for Python earlier than 2.3 has been removed (see PEP 291). + + All defect classes have been renamed to end in 'Defect'. + + Some FeedParser fixes; also a MultipartInvariantViolationDefect will be + added to messages that claim to be multipart but really aren't. + + Updates to documentation. + +- re's findall() and finditer() functions now take an optional flags argument + just like the compile(), search(), and match() functions. Also, documented + the previously existing start and stop parameters for the findall() and + finditer() methods of regular expression objects. + +- rfc822 Messages now support iterating over the headers. + +- The (undocumented) tarfile.Tarfile.membernames has been removed; + applications should use the getmember function. + +- httplib now offers symbolic constants for the HTTP status codes. + +- SF bug #1028306: Trying to compare a ``datetime.date`` to a + ``datetime.datetime`` mistakenly compared only the year, month and day. + Now it acts like a mixed-type comparison: ``False`` for ``==``, + ``True`` for ``!=``, and raises ``TypeError`` for other comparison + operators. Because datetime is a subclass of date, comparing only the + base class (date) members can still be done, if that's desired, by + forcing using of the approprate date method; e.g., + ``a_date.__eq__(a_datetime)`` is true if and only if the year, month + and day members of ``a_date`` and ``a_datetime`` are equal. + +- bdist_rpm now supports command line options --force-arch, + {pre,post}-install, {pre,post}-uninstall, and + {prep,build,install,clean,verify}-script. + +- SF patch #998993: The UTF-8 and the UTF-16 stateful decoders now support + decoding incomplete input (when the input stream is temporarily exhausted). + ``codecs.StreamReader`` now implements buffering, which enables proper + readline support for the UTF-16 decoders. ``codecs.StreamReader.read()`` + has a new argument ``chars`` which specifies the number of characters to + return. ``codecs.StreamReader.readline()`` and + ``codecs.StreamReader.readlines()`` have a new argument ``keepends``. + Trailing "\n"s will be stripped from the lines if ``keepends`` is false. + +- The documentation for doctest is greatly expanded, and now covers all + the new public features (of which there are many). + +- ``doctest.master`` was put back in, and ``doctest.testmod()`` once again + updates it. This isn't good, because every ``testmod()`` call + contributes to bloating the "hidden" state of ``doctest.master``, but + some old code apparently relies on it. For now, all we can do is + encourage people to stitch doctests together via doctest's unittest + integration features instead. + +- httplib now handles ipv6 address/port pairs. + +- SF bug #1017864: ConfigParser now correctly handles default keys, + processing them with ``ConfigParser.optionxform`` when supplied, + consistent with the handling of config file entries and runtime-set + options. + +- SF bug #997050: Document, test, & check for non-string values in + ConfigParser. Moved the new string-only restriction added in + rev. 1.65 to the SafeConfigParser class, leaving existing + ConfigParser & RawConfigParser behavior alone, and documented the + conditions under which non-string values work. + +Build +----- + +- Building on darwin now includes /opt/local/include and /opt/local/lib for + building extension modules. This is so as to include software installed as + a DarwinPorts port + +- pyport.h now defines a Py_IS_NAN macro. It works as-is when the + platform C computes true for ``x != x`` if and only if X is a NaN. + Other platforms can override the default definition with a platform- + specific spelling in that platform's pyconfig.h. You can also override + pyport.h's default Py_IS_INFINITY definition now. + +C API +----- + +- SF patch 1044089: New function ``PyEval_ThreadsInitialized()`` returns + non-zero if PyEval_InitThreads() has been called. + +- The undocumented and unused extern int ``_PyThread_Started`` was removed. + +- The C API calls ``PyInterpreterState_New()`` and ``PyThreadState_New()`` + are two of the very few advertised as being safe to call without holding + the GIL. However, this wasn't true in a debug build, as bug 1041645 + demonstrated. In a debug build, Python redirects the ``PyMem`` family + of calls to Python's small-object allocator, to get the benefit of + its extra debugging capabilities. But Python's small-object allocator + isn't threadsafe, relying on the GIL to avoid the expense of doing its + own locking. ``PyInterpreterState_New()`` and ``PyThreadState_New()`` + call the platform ``malloc()`` directly now, regardless of build type. + +- PyLong_AsUnsignedLong[Mask] now support int objects as well. + +- SF patch #998993: ``PyUnicode_DecodeUTF8Stateful`` and + ``PyUnicode_DecodeUTF16Stateful`` have been added, which implement stateful + decoding. + +Tests +----- + +- test__locale ported to unittest + +Mac +--- + +- ``plistlib`` now supports non-dict root objects. There is also a new + interface for reading and writing plist files: ``readPlist(pathOrFile)`` + and ``writePlist(rootObject, pathOrFile)`` + +Tools/Demos +----------- + +- The text file comparison scripts ``ndiff.py`` and ``diff.py`` now + read the input files in universal-newline mode. This spares them + from consuming a great deal of time to deduce the useless result that, + e.g., a file with Windows line ends and a file with Linux line ends + have no lines in common. + + +What's New in Python 2.4 alpha 3? +================================= + +*Release date: 02-SEP-2004* + +Core and builtins +----------------- + +- SF patch #1007189: ``from ... import ...`` statements now allow the name + list to be surrounded by parentheses. + +- Some speedups for long arithmetic, thanks to Trevor Perrin. Gradeschool + multiplication was sped a little by optimizing the C code. Gradeschool + squaring was sped by about a factor of 2, by exploiting that about half + the digit products are duplicates in a square. Because exponentiation + uses squaring often, this also speeds long power. For example, the time + to compute 17**1000000 dropped from about 14 seconds to 9 on my box due + to this much. The cutoff for Karatsuba multiplication was raised, + since gradeschool multiplication got quicker, and the cutoff was + aggressively small regardless. The exponentiation algorithm was switched + from right-to-left to left-to-right, which is more efficient for small + bases. In addition, if the exponent is large, the algorithm now does + 5 bits (instead of 1 bit) at a time. That cut the time to compute + 17**1000000 on my box in half again, down to about 4.5 seconds. + +- OverflowWarning is no longer generated. PEP 237 scheduled this to + occur in Python 2.3, but since OverflowWarning was disabled by default, + nobody realized it was still being generated. On the chance that user + code is still using them, the Python builtin OverflowWarning, and + corresponding C API PyExc_OverflowWarning, will exist until Python 2.5. + +- Py_InitializeEx has been added. + +- Fix the order of application of decorators. The proper order is bottom-up; + the first decorator listed is the last one called. + +- SF patch #1005778. Fix a seg fault if the list size changed while + calling list.index(). This could happen if a rich comparison function + modified the list. + +- The ``func_name`` (a.k.a. ``__name__``) attribute of user-defined + functions is now writable. + +- code_new (a.k.a new.code()) now checks its arguments sufficiently + carefully that passing them on to PyCode_New() won't trigger calls + to Py_FatalError() or PyErr_BadInternalCall(). It is still the case + that the returned code object might be entirely insane. + +- Subclasses of string can no longer be interned. The semantics of + interning were not clear here -- a subclass could be mutable, for + example -- and had bugs. Explicitly interning a subclass of string + via intern() will raise a TypeError. Internal operations that attempt + to intern a string subclass will have no effect. + +- Bug 1003935: xrange() could report bogus OverflowErrors. Documented + what xrange() intends, and repaired tests accordingly. + +Extension modules +----------------- + +- difflib now supports HTML side-by-side diff. + +- os.urandom has been added for systems that support sources of random + data. + +- Patch 1012740: truncate() on a writeable cStringIO now resets the + position to the end of the stream. This is consistent with the original + StringIO module and avoids inadvertently resurrecting data that was + supposed to have been truncated away. + +- Added socket.socketpair(). + +- Added CurrentByteIndex, CurrentColumnNumber, CurrentLineNumber + members to xml.parsers.expat.XMLParser object. + +- The mpz, rotor, and xreadlines modules, all deprecated in earlier + versions of Python, have now been removed. + +Library +------- + +- Patch #934356: if a module defines __all__, believe that rather than using + heuristics for filtering out imported names. + +- Patch #941486: added os.path.lexists(), which returns True for broken + symlinks, unlike os.path.exists(). + +- the random module now uses os.urandom() for seeding if it is available. + Added a new generator based on os.urandom(). + +- difflib and diff.py can now generate HTML. + +- bdist_rpm now includes version and release in the BuildRoot, and + replaces - by ``_`` in version and release. + +- distutils build/build_scripts now has an -e option to specify the + path to the Python interpreter for installed scripts. + +- PEP 292 classes Template and SafeTemplate are added to the string module. + +- tarfile now generates GNU tar files by default. + +- HTTPResponse has now a getheaders method. + +- Patch #1006219: let inspect.getsource handle '@' decorators. Thanks Simon + Percivall. + +- logging.handlers.SMTPHandler.date_time has been removed; + the class now uses email.Utils.formatdate to generate the time stamp. + +- A new function tkFont.nametofont was added to return an existing + font. The Font class constructor now has an additional exists argument + which, if True, requests to return/configure an existing font, rather + than creating a new one. + +- Updated the decimal package's min() and max() methods to match the + latest revision of the General Decimal Arithmetic Specification. + Quiet NaNs are ignored and equal values are sorted based on sign + and exponent. + +- The decimal package's Context.copy() method now returns deep copies. + +- Deprecated sys.exitfunc in favor of the atexit module. The sys.exitfunc + attribute will be kept around for backwards compatibility and atexit + will just become the one preferred way to do it. + +- patch #675551: Add get_history_item and replace_history_item functions + to the readline module. + +- bug #989672: pdb.doc and the help messages for the help_d and help_u methods + of the pdb.Pdb class gives have been corrected. d(own) goes to a newer + frame, u(p) to an older frame, not the other way around. + +- bug #990669: os.path.realpath() will resolve symlinks before normalizing the + path, as normalizing the path may alter the meaning of the path if it + contains symlinks. + +- bug #851123: shutil.copyfile will raise an exception when trying to copy a + file onto a link to itself. Thanks Gregory Ball. + +- bug #570300: Fix inspect to resolve file locations using os.path.realpath() + so as to properly list all functions in a module when the module itself is + reached through a symlink. Thanks Johannes Gijsbers. + +- doctest refactoring continued. See the docs for details. As part of + this effort, some old and little- (never?) used features are now + deprecated: the Tester class, the module is_private() function, and the + isprivate argument to testmod(). The Tester class supplied a feeble + "by hand" way to combine multiple doctests, if you knew exactly what + you were doing. The newer doctest features for unittest integration + already did a better job of that, are stronger now than ever, and the + new DocTestRunner class is a saner foundation if you want to do it by + hand. The "private name" filtering gimmick was a mistake from the + start, and testmod() changed long ago to ignore it by default. If + you want to filter out tests, the new DocTestFinder class can be used + to return a list of all doctests, and you can filter that list by + any computable criteria before passing it to a DocTestRunner instance. + +- Bug #891637, patch #1005466: fix inspect.getargs() crash on def foo((bar)). + +Tools/Demos +----------- + +- IDLE's shortcut keys for windows are now case insensitive so that + Control-V works the same as Control-v. + +- pygettext.py: Generate POT-Creation-Date header in ISO format. + +Build +----- + +- Backward incompatibility: longintrepr.h now triggers a compile-time + error if SHIFT (the number of bits in a Python long "digit") isn't + divisible by 5. This new requirement allows simple code for the new + 5-bits-at-a-time long_pow() implementation. If necessary, the + restriction could be removed (by complicating long_pow(), or by + falling back to the 1-bit-at-a-time algorithm), but there are no + plans to do so. + +- bug #991962: When building with --disable-toolbox-glue on Darwin no + attempt to build Mac-specific modules occurs. + +- The --with-tsc flag to configure to enable VM profiling with the + processor's timestamp counter now works on PPC platforms. + +- patch #1006629: Define _XOPEN_SOURCE to 500 on Solaris 8/9 to match + GCC's definition and avoid redefinition warnings. + +- Detect pthreads support (provided by gnu pth pthread emulation) on + GNU/k*BSD systems. + +- bug #1005737, #1007249: Fixed several build problems and warnings + found on old/legacy C compilers of HP-UX, IRIX and Tru64. + +C API +----- + +.. + +Documentation +------------- + +- patch #1005936, bug #1009373: fix index entries which contain + an underscore when viewed with Acrobat. + +- bug #990669: os.path.normpath may alter the meaning of a path if + it contains symbolic links. This has been documented in a comment + since 1992, but is now in the library reference as well. + +New platforms +------------- + +- FreeBSD 6 is now supported. + +Tests +----- + +.. + +Windows +------- + +- Boosted the stack reservation for python.exe and pythonw.exe from + the default 1MB to 2MB. Stack frames under VC 7.1 for 2.4 are enough + bigger than under VC 6.0 for 2.3.4 that deeply recursive progams + within the default sys.getrecursionlimit() default value of 1000 were + able to suffer undetected C stack overflows. The standard test program + test_compiler was one such program. If a Python process on Windows + "just vanishes" without a trace, and without an error message of any + kind, but with an exit code of 128, undetected stack overflow may be + the problem. + +Mac +--- + +.. + + +What's New in Python 2.4 alpha 2? +================================= + +*Release date: 05-AUG-2004* + +Core and builtins +----------------- + +- Patch #980695: Implements efficient string concatenation for statements + of the form s=s+t and s+=t. This will vary across implementations. + Accordingly, the str.join() method is strongly preferred for performance + sensitive code. + +- PEP-0318, Function Decorators have been added to the language. These are + implemented using the Java-style @decorator syntax, like so:: + + @staticmethod + def foo(bar): + + (The PEP needs to be updated to reflect the current state) + +- When importing a module M raises an exception, Python no longer leaves M + in sys.modules. Before 2.4a2 it did, and a subsequent import of M would + succeed, picking up a module object from sys.modules reflecting as much + of the initialization of M as completed before the exception was raised. + Subsequent imports got no indication that M was in a partially- + initialized state, and the importers could get into arbitrarily bad + trouble as a result (the M they got was in an unintended state, + arbitrarily far removed from M's author's intent). Now subsequent + imports of M will continue raising exceptions (but if, for example, the + source code for M is edited between import attempts, then perhaps later + attempts will succeed, or raise a different exception). + + This can break existing code, but in such cases the code was probably + working before by accident. In the Python source, the only case of + breakage discovered was in a test accidentally relying on a damaged + module remaining in sys.modules. Cases are also known where tests + deliberately provoking import errors remove damaged modules from + sys.modules themselves, and such tests will break now if they do an + unconditional del sys.modules[M]. + +- u'%s' % obj will now try obj.__unicode__() first and fallback to + obj.__str__() if no __unicode__ method can be found. + +- Patch #550732: Add PyArg_VaParseTupleAndKeywords(). Analogous to + PyArg_VaParse(). Both are now documented. Thanks Greg Chapman. + +- Allow string and unicode return types from .encode()/.decode() + methods on string and unicode objects. Added unicode.decode() + which was missing for no apparent reason. + +- An attempt to fix the mess that is Python's behaviour with + signal handlers and threads, complicated by readline's behaviour. + It's quite possible that there are still bugs here. + +- Added C macros Py_CLEAR and Py_VISIT to ease the implementation of + types that support garbage collection. + +- Compiler now treats None as a constant. + +- The type of values returned by __int__, __float__, __long__, + __oct__, and __hex__ are now checked. Returning an invalid type + will cause a TypeError to be raised. This matches the behavior of + Jython. + +- Implemented bind_textdomain_codeset() in locale module. + +- Added a workaround for proper string operations in BSDs. str.split + and str.is* methods can now work correctly with UTF-8 locales. + +- Bug #989185: unicode.iswide() and unicode.width() is dropped and + the East Asian Width support is moved to unicodedata extension + module. + +- Patch #941229: The source code encoding in interactive mode + now refers sys.stdin.encoding not just ISO-8859-1 anymore. This + allows for non-latin-1 users to write unicode strings directly. + +Extension modules +----------------- + +- cpickle now supports the same keyword arguments as pickle. + +Library +------- + +- Added new codecs and aliases for ISO_8859-11, ISO_8859-16 and + TIS-620 + +- Thanks to Edward Loper, doctest has been massively refactored, and + many new features were added. Full docs will appear later. For now + the doctest module comments and new test cases give good coverage. + The refactoring provides many hook points for customizing behavior + (such as how to report errors, and how to compare expected to actual + output). New features include a marker for expected + output containing blank lines, options to produce unified or context + diffs when actual output doesn't match expectations, an option to + normalize whitespace before comparing, and an option to use an + ellipsis to signify "don't care" regions of output. + +- Tkinter now supports the wish -sync and -use options. + +- The following methods in time support passing of None: ctime(), gmtime(), + and localtime(). If None is provided, the current time is used (the + same as when the argument is omitted). + [SF bug 658254, patch 663482] + +- nntplib does now allow to ignore a .netrc file. + +- urllib2 now recognizes Basic authentication even if other authentication + schemes are offered. + +- Bug #1001053. wave.open() now accepts unicode filenames. + +- gzip.GzipFile has a new fileno() method, to retrieve the handle of the + underlying file object (provided it has a fileno() method). This is + needed if you want to use os.fsync() on a GzipFile. + +- imaplib has two new methods: deleteacl and myrights. + +- nntplib has two new methods: description and descriptions. They + use a more RFC-compliant way of getting a newsgroup description. + +- Bug #993394. Fix a possible red herring of KeyError in 'threading' being + raised during interpreter shutdown from a registered function with atexit + when dummy_threading is being used. + +- Bug #857297/Patch #916874. Fix an error when extracting a hard link + from a tarfile. + +- Patch #846659. Fix an error in tarfile.py when using + GNU longname/longlink creation. + +- The obsolete FCNTL.py has been deleted. The builtin fcntl module + has been available (on platforms that support fcntl) since Python + 1.5a3, and all FCNTL.py did is export fcntl's names, after generating + a deprecation warning telling you to use fcntl directly. + +- Several new unicode codecs are added: big5hkscs, euc_jis_2004, + iso2022_jp_2004, shift_jis_2004. + +- Bug #788520. Queue.{get, get_nowait, put, put_nowait} have new + implementations, exploiting Conditions (which didn't exist at the time + Queue was introduced). A minor semantic change is that the Full and + Empty exceptions raised by non-blocking calls now occur only if the + queue truly was full or empty at the instant the queue was checked (of + course the Queue may no longer be full or empty by the time a calling + thread sees those exceptions, though). Before, the exceptions could + also be raised if it was "merely inconvenient" for the implementation + to determine the true state of the Queue (because the Queue was locked + by some other method in progress). + +- Bugs #979794 and #980117: difflib.get_grouped_opcodes() now handles the + case of comparing two empty lists. This affected both context_diff() and + unified_diff(), + +- Bug #980938: smtplib now prints debug output to sys.stderr. + +- Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by + returning the last point in the path that was not part of any loop. Thanks + AM Kuchling. + +- Bug #980327: ntpath not handles compressing erroneous slashes between the + drive letter and the rest of the path. Also clearly handles UNC addresses now + as well. Thanks Paul Moore. + +- bug #679953: zipfile.py should now work for files over 2 GB. The packed data + for file sizes (compressed and uncompressed) was being stored as signed + instead of unsigned. + +- decimal.py now only uses signals in the IBM spec. The other conditions are + no longer part of the public API. + +- codecs module now has two new generic APIs: encode() and decode() + which don't restrict the return types (unlike the unicode and + string methods of the same name). + +- Non-blocking SSL sockets work again; they were broken in Python 2.3. + SF patch 945642. + +- doctest unittest integration improvements: + + o Improved the unitest test output for doctest-based unit tests + + o Can now pass setUp and tearDown functions when creating + DocTestSuites. + +- The threading module has a new class, local, for creating objects + that provide thread-local data. + +- Bug #990307: when keep_empty_values is True, cgi.parse_qsl() + no longer returns spurious empty fields. + +- Implemented bind_textdomain_codeset() in gettext module. + +- Introduced in gettext module the l*gettext() family of functions, + which return translation strings encoded in the preferred encoding, + as informed by locale module's getpreferredencoding(). + +- optparse module (and tests) upgraded to Optik 1.5a1. Changes: + + - Add expansion of default values in help text: the string + "%default" in an option's help string is expanded to str() of + that option's default value, or "none" if no default value. + + - Bug #955889: option default values that happen to be strings are + now processed in the same way as values from the command line; this + allows generation of nicer help when using custom types. Can + be disabled with parser.set_process_default_values(False). + + - Bug #960515: don't crash when generating help for callback + options that specify 'type', but not 'dest' or 'metavar'. + + - Feature #815264: change the default help format for short options + that take an argument from e.g. "-oARG" to "-o ARG"; add + set_short_opt_delimiter() and set_long_opt_delimiter() methods to + HelpFormatter to allow (slight) customization of the formatting. + + - Patch #736940: internationalize Optik: all built-in user- + targeted literal strings are passed through gettext.gettext(). (If + you want translations (.po files), they're not included with Python + -- you'll find them in the Optik source distribution from + http://optik.sourceforge.net/ .) + + - Bug #878453: respect $COLUMNS environment variable for + wrapping help output. + + - Feature #988122: expand "%prog" in the 'description' passed + to OptionParser, just like in the 'usage' and 'version' strings. + (This is *not* done in the 'description' passed to OptionGroup.) + +C API +----- + +- PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx(): if an + error occurs while loading the module, these now delete the module's + entry from sys.modules. All ways of loading modules eventually call + one of these, so this is an error-case change in semantics for all + ways of loading modules. In rare cases, a module loader may wish + to keep a module object in sys.modules despite that the module's + code cannot be executed. In such cases, the module loader must + arrange to reinsert the name and module object in sys.modules. + PyImport_ReloadModule() has been changed to reinsert the original + module object into sys.modules if the module reload fails, so that + its visible semantics have not changed. + +- A large pile of datetime field-extraction macros is now documented, + thanks to Anthony Tuininga (patch #986010). + +Documentation +------------- + +- Improved the tutorial on creating types in C. + + - point out the importance of reassigning data members before + assigning their values + + - correct my misconception about return values from visitprocs. Sigh. + + - mention the labor saving Py_VISIT and Py_CLEAR macros. + +- Major rewrite of the math module docs, to address common confusions. + +Tests +----- + +- The test data files for the decimal test suite are now installed on + platforms that use the Makefile. + +- SF patch 995225: The test file testtar.tar accidentally contained + CVS keywords (like $Id$), which could cause spurious failures in + test_tarfile.py depending on how the test file was checked out. + + +What's New in Python 2.4 alpha 1? +================================= + +*Release date: 08-JUL-2004* + +Core and builtins +----------------- + +- weakref.ref is now the type object also known as + weakref.ReferenceType; it can be subclassed like any other new-style + class. There's less per-entry overhead in WeakValueDictionary + objects now (one object instead of three). + +- Bug #951851: Python crashed when reading import table of certain + Windows DLLs. + +- Bug #215126. The locals argument to eval(), execfile(), and exec now + accept any mapping type. + +- marshal now shares interned strings. This change introduces + a new .pyc magic. + +- Bug #966623. classes created with type() in an exec(, {}) don't + have a __module__, but code in typeobject assumed it would always + be there. + +- Python no longer relies on the LC_NUMERIC locale setting to be + the "C" locale; as a result, it no longer tries to prevent changing + the LC_NUMERIC category. + +- Bug #952807: Unpickling pickled instances of subclasses of + datetime.date, datetime.datetime and datetime.time could yield insane + objects. Thanks to Jiwon Seo for a fix. + +- Bug #845802: Python crashes when __init__.py is a directory. + +- Unicode objects received two new methods: iswide() and width(). + These query East Asian width information, as specified in Unicode + TR11. + +- Improved the tuple hashing algorithm to give fewer collisions in + common cases. Fixes bug #942952. + +- Implemented generator expressions (PEP 289). Coded by Jiwon Seo. + +- Enabled the profiling of C extension functions (and builtins) - check + new documentation and modified profile and bdb modules for more details + +- Set file.name to the object passed to open (instead of a new string) + +- Moved tracebackobject into traceback.h and renamed to PyTracebackObject + +- Optimized the byte coding for multiple assignments like "a,b=b,a" and + "a,b,c=1,2,3". Improves their speed by 25% to 30%. + +- Limit the nested depth of a tuple for the second argument to isinstance() + and issubclass() to the recursion limit of the interpreter. + Fixes bug #858016 . + +- Optimized dict iterators, creating separate types for each + and having them reveal their length. Also optimized the + methods: keys(), values(), and items(). + +- Implemented a newcode opcode, LIST_APPEND, that simplifies + the generated bytecode for list comprehensions and further + improves their performance (about 35%). + +- Implemented rich comparisons for floats, which seems to make + comparisons involving NaNs somewhat less surprising when the + underlying C compiler actually implements C99 semantics. + +- Optimized list.extend() to save memory and no longer create + intermediate sequences. Also, extend() now pre-allocates the + needed memory whenever the length of the iterable is known in + advance -- this halves the time to extend the list. + +- Optimized list resize operations to make fewer calls to the system + realloc(). Significantly speeds up list appends, list pops, + list comprehensions, and the list constructor (when the input iterable + length is not known). + +- Changed the internal list over-allocation scheme. For larger lists, + overallocation ranged between 3% and 25%. Now, it is a constant 12%. + For smaller lists (n<8), overallocation was upto eight elements. Now, + the overallocation is no more than three elements -- this improves space + utilization for applications that have large numbers of small lists. + +- Most list bodies now get re-used rather than freed. Speeds up list + instantiation and deletion by saving calls to malloc() and free(). + +- The dict.update() method now accepts all the same argument forms + as the dict() constructor. This now includes item lists and/or + keyword arguments. + +- Support for arbitrary objects supporting the read-only buffer + interface as the co_code field of code objects (something that was + only possible to create from C code) has been removed. + +- Made omitted callback and None equivalent for weakref.ref() and + weakref.proxy(); the None case wasn't handled correctly in all + cases. + +- Fixed problem where PyWeakref_NewRef() and PyWeakref_NewProxy() + assumed that initial existing entries in an object's weakref list + would not be removed while allocating a new weakref object. Since + GC could be invoked at that time, however, that assumption was + invalid. In a truly obscure case of GC being triggered during + creation for a new weakref object for an referent which already + has a weakref without a callback which is only referenced from + cyclic trash, a memory error can occur. This consistently created a + segfault in a debug build, but provided less predictable behavior in + a release build. + +- input() builtin function now respects compiler flags such as + __future__ statements. SF patch 876178. + +- Removed PendingDeprecationWarning from apply(). apply() remains + deprecated, but the nuisance warning will not be issued. + +- At Python shutdown time (Py_Finalize()), 2.3 called cyclic garbage + collection twice, both before and after tearing down modules. The + call after tearing down modules has been disabled, because too much + of Python has been torn down then for __del__ methods and weakref + callbacks to execute sanely. The most common symptom was a sequence + of uninformative messages on stderr when Python shut down, produced + by threads trying to raise exceptions, but unable to report the nature + of their problems because too much of the sys module had already been + destroyed. + +- Removed FutureWarnings related to hex/oct literals and conversions + and left shifts. (Thanks to Kalle Svensson for SF patch 849227.) + This addresses most of the remaining semantic changes promised by + PEP 237, except for repr() of a long, which still shows the trailing + 'L'. The PEP appears to promise warnings for operations that + changed semantics compared to Python 2.3, but this is not + implemented; we've suffered through enough warnings related to + hex/oct literals and I think it's best to be silent now. + +- For str and unicode objects, the ljust(), center(), and rjust() + methods now accept an optional argument specifying a fill + character other than a space. + +- When method objects have an attribute that can be satisfied either + by the function object or by the method object, the function + object's attribute usually wins. Christian Tismer pointed out that + that this is really a mistake, because this only happens for special + methods (like __reduce__) where the method object's version is + really more appropriate than the function's attribute. So from now + on, all method attributes will have precedence over function + attributes with the same name. + +- Critical bugfix, for SF bug 839548: if a weakref with a callback, + its callback, and its weakly referenced object, all became part of + cyclic garbage during a single run of garbage collection, the order + in which they were torn down was unpredictable. It was possible for + the callback to see partially-torn-down objects, leading to immediate + segfaults, or, if the callback resurrected garbage objects, to + resurrect insane objects that caused segfaults (or other surprises) + later. In one sense this wasn't surprising, because Python's cyclic gc + had no knowledge of Python's weakref objects. It does now. When + weakrefs with callbacks become part of cyclic garbage now, those + weakrefs are cleared first. The callbacks don't trigger then, + preventing the problems. If you need callbacks to trigger, then just + as when cyclic gc is not involved, you need to write your code so + that weakref objects outlive the objects they weakly reference. + +- Critical bugfix, for SF bug 840829: if cyclic garbage collection + happened to occur during a weakref callback for a new-style class + instance, subtle memory corruption was the result (in a release build; + in a debug build, a segfault occurred reliably very soon after). + This has been repaired. + +- Compiler flags set in PYTHONSTARTUP are now active in __main__. + +- Added two builtin types, set() and frozenset(). + +- Added a reversed() builtin function that returns a reverse iterator + over a sequence. + +- Added a sorted() builtin function that returns a new sorted list + from any iterable. + +- CObjects are now mutable (on the C level) through PyCObject_SetVoidPtr. + +- list.sort() now supports three keyword arguments: cmp, key, and reverse. + The key argument can be a function of one argument that extracts a + comparison key from the original record: mylist.sort(key=str.lower). + The reverse argument is a boolean value and if True will change the + sort order as if the comparison arguments were reversed. In addition, + the documentation has been amended to provide a guarantee that all sorts + starting with Py2.3 are guaranteed to be stable (the relative order of + records with equal keys is unchanged). + +- Added test whether wchar_t is signed or not. A signed wchar_t is not + usable as internal unicode type base for Py_UNICODE since the + unicode implementation assumes an unsigned type. + +- Fixed a bug in the cache of length-one Unicode strings that could + lead to a seg fault. The specific problem occurred when an earlier, + non-fatal error left an uninitialized Unicode object in the + freelist. + +- The % formatting operator now supports '%F' which is equivalent to + '%f'. This has always been documented but never implemented. + +- complex(obj) could leak a little memory if obj wasn't a string or + number. + +- zip() with no arguments now returns an empty list instead of raising + a TypeError exception. + +- obj.__contains__() now returns True/False instead of 1/0. SF patch + 820195. + +- Python no longer tries to be smart about recursive comparisons. + When comparing containers with cyclic references to themselves it + will now just hit the recursion limit. See SF patch 825639. + +- str and unicode builtin types now have an rsplit() method that is + same as split() except that it scans the string from the end + working towards the beginning. See SF feature request 801847. + +- Fixed a bug in object.__reduce_ex__ when using protocol 2. Failure + to clear the error when attempts to get the __getstate__ attribute + fail caused intermittent errors and odd behavior. + +- buffer objects based on other objects no longer cache a pointer to + the data and the data length. Instead, the appropriate tp_as_buffer + method is called as necessary. + +- fixed: if a file is opened with an explicit buffer size >= 1, repeated + close() calls would attempt to free() the buffer already free()ed on + the first call. + + +Extension modules +----------------- + +- Added socket.getservbyport(), and make the second argument in + getservbyname() and getservbyport() optional. + +- time module code that deals with input POSIX timestamps will now raise + ValueError if more than a second is lost in precision when the + timestamp is cast to the platform C time_t type. There's no chance + that the platform will do anything sensible with the result in such + cases. This includes ctime(), localtime() and gmtime(). Assorted + fromtimestamp() and utcfromtimestamp() methods in the datetime module + were also protected. Closes bugs #919012 and 975996. + +- fcntl.ioctl now warns if the mutate flag is not specified. + +- nt now properly allows to refer to UNC roots, e.g. in nt.stat(). + +- the weakref module now supports additional objects: array.array, + sre.pattern_objects, file objects, and sockets. + +- operator.isMappingType() and operator.isSequenceType() now give + fewer false positives. + +- socket.sslerror is now a subclass of socket.error . Also added + socket.error to the socket module's C API. + +- Bug #920575: A problem where the _locale module segfaults on + nl_langinfo(ERA) caused by GNU libc's illegal NULL return is fixed. + +- array objects now support the copy module. Also, their resizing + scheme has been updated to match that used for list objects. This improves + the performance (speed and memory usage) of append() operations. + Also, array.array() and array.extend() now accept any iterable argument + for repeated appends without needing to create another temporary array. + +- cStringIO.writelines() now accepts any iterable argument and writes + the lines one at a time rather than joining them and writing once. + Made a parallel change to StringIO.writelines(). Saves memory and + makes suitable for use with generator expressions. + +- time.strftime() now checks that the values in its time tuple argument + are within the proper boundaries to prevent possible crashes from the + platform's C library implementation of strftime(). Can possibly + break code that uses values outside the range that didn't cause + problems previously (such as sitting day of year to 0). Fixes bug + #897625. + +- The socket module now supports Bluetooth sockets, if the + system has + +- Added a collections module containing a new datatype, deque(), + offering high-performance, thread-safe, memory friendly appends + and pops on either side of the deque. + +- Several modules now take advantage of collections.deque() for + improved performance: Queue, mutex, shlex, threading, and pydoc. + +- The operator module has two new functions, attrgetter() and + itemgetter() which are useful for creating fast data extractor + functions for map(), list.sort(), itertools.groupby(), and + other functions that expect a function argument. + +- socket.SHUT_{RD,WR,RDWR} was added. + +- os.getsid was added. + +- The pwd module incorrectly advertised its struct type as + struct_pwent; this has been renamed to struct_passwd. (The old name + is still supported for backwards compatibility.) + +- The xml.parsers.expat module now provides Expat 1.95.7. + +- socket.IPPROTO_IPV6 was added. + +- readline.clear_history was added. + +- select.select() now accepts sequences for its first three arguments. + +- cStringIO now supports the f.closed attribute. + +- The signal module now exposes SIGRTMIN and SIGRTMAX (if available). + +- curses module now supports use_default_colors(). [patch #739124] + +- Bug #811028: ncurses.h breakage on FreeBSD/MacOS X + +- Bug #814613: INET_ADDRSTRLEN fix needed for all compilers on SGI + +- Implemented non-recursive SRE matching scheme (#757624). + +- Implemented (?(id/name)yes|no) support in SRE (#572936). + +- random.seed() with no arguments or None uses time.time() as a default + seed. Modified to match Py2.2 behavior and use fractional seconds so + that successive runs are more likely to produce different sequences. + +- random.Random has a new method, getrandbits(k), which returns an int + with k random bits. This method is now an optional part of the API + for user defined generators. Any generator that defines genrandbits() + can now use randrange() for ranges with a length >= 2**53. Formerly, + randrange would return only even numbers for ranges that large (see + SF bug #812202). Generators that do not define genrandbits() now + issue a warning when randrange() is called with a range that large. + +- itertools has a new function, groupby() for aggregating iterables + into groups sharing the same key (as determined by a key function). + It offers some of functionality of SQL's groupby keyword and of + the Unix uniq filter. + +- itertools now has a new tee() function which produces two independent + iterators from a single iterable. + +- itertools.izip() with no arguments now returns an empty iterator instead + of raising a TypeError exception. + +- Fixed #853061: allow BZ2Compressor.compress() to receive an empty string + as parameter. + +Library +------- + +- Added a new module: cProfile, a C profiler with the same interface as the + profile module. cProfile avoids some of the drawbacks of the hotshot + profiler and provides a bit more information than the other two profilers. + Based on "lsprof" (patch #1212837). + +- Bug #1266283: The new function "lexists" is now in os.path.__all__. + +- Bug #981530: Fix UnboundLocalError in shutil.rmtree(). This affects + the documented behavior: the function passed to the onerror() + handler can now also be os.listdir. + +- Bug #754449: threading.Thread objects no longer mask exceptions raised during + interpreter shutdown with another exception from attempting to handle the + original exception. + +- Added decimal.py per PEP 327. + +- Bug #981299: rsync is now a recognized protocol in urlparse that uses a + "netloc" portion of a URL. + +- Bug #919012: shutil.move() will not try to move a directory into itself. + Thanks Johannes Gijsbers. + +- Bug #934282: pydoc.stripid() is now case-insensitive. Thanks Robin Becker. + +- Bug #823209: cmath.log() now takes an optional base argument so that its + API matches math.log(). + +- Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions + that generate a -debuginfo.rpm + +- os.path.devnull has been added for all supported platforms. + +- Fixed #877165: distutils now picks the right C++ compiler command + on cygwin and mingw32. + +- urllib.urlopen().readline() now handles HTTP/0.9 correctly. + +- refactored site.py into functions. Also wrote regression tests for the + module. + +- The distutils install command now supports the --home option and + installation scheme for all platforms. + +- asyncore.loop now has a repeat count parameter that defaults to + looping forever. + +- The distutils sdist command now ignores all .svn directories, in + addition to CVS and RCS directories. .svn directories hold + administrative files for the Subversion source control system. + +- Added a new module: cookielib. Automatic cookie handling for HTTP + clients. Also, support for cookielib has been added to urllib2, so + urllib2.urlopen() can transparently handle cookies. + +- stringprep.py now uses built-in set() instead of sets.Set(). + +- Bug #876278: Unbounded recursion in modulefinder + +- Bug #780300: Swap public and system ID in LexicalHandler.startDTD. + Applications relying on the wrong order need to be corrected. + +- Bug #926075: Fixed a bug that returns a wrong pattern object + for a string or unicode object in sre.compile() when a different + type pattern with the same value exists. + +- Added countcallers arg to trace.Trace class (--trackcalls command line arg + when run from the command prompt). + +- Fixed a caching bug in platform.platform() where the argument of 'terse' was + not taken into consideration when caching value. + +- Added two new command-line arguments for profile (output file and + default sort). + +- Added global runctx function to profile module + +- Add hlist missing entryconfigure and entrycget methods. + +- The ptcp154 codec was added for Kazakh character set support. + +- Support non-anonymous ftp URLs in urllib2. + +- The encodings package will now apply codec name aliases + first before starting to try the import of the codec module. + This simplifies overriding built-in codecs with external + packages, e.g. the included CJK codecs with the JapaneseCodecs + package, by adjusting the aliases dictionary in encodings.aliases + accordingly. + +- base64 now supports RFC 3548 Base16, Base32, and Base64 encoding and + decoding standards. + +- urllib2 now supports processors. A processor is a handler that + implements an xxx_request or xxx_response method. These methods are + called for all requests. + +- distutils compilers now compile source files in the same order as + they are passed to the compiler. + +- pprint.pprint() and pprint.pformat() now have additional parameters + indent, width and depth. + +- Patch #750542: pprint now will pretty print subclasses of list, tuple + and dict too, as long as they don't overwrite __repr__(). + +- Bug #848614: distutils' msvccompiler fails to find the MSVC6 + compiler because of incomplete registry entries. + +- httplib.HTTP.putrequest now offers to omit the implicit Accept-Encoding. + +- Patch #841977: modulefinder didn't find extension modules in packages + +- imaplib.IMAP4.thread was added. + +- Plugged a minor hole in tempfile.mktemp() due to the use of + os.path.exists(), switched to using os.lstat() directly if possible. + +- bisect.py and heapq.py now have underlying C implementations + for better performance. + +- heapq.py has two new functions, nsmallest() and nlargest(). + +- traceback.format_exc has been added (similar to print_exc but it returns + a string). + +- xmlrpclib.MultiCall has been added. + +- poplib.POP3_SSL has been added. + +- tmpfile.mkstemp now returns an absolute path even if dir is relative. + +- urlparse is RFC 2396 compliant. + +- The fieldnames argument to the csv module's DictReader constructor is now + optional. If omitted, the first row of the file will be used as the + list of fieldnames. + +- encodings.bz2_codec was added for access to bz2 compression + using "a long string".encode('bz2') + +- Various improvements to unittest.py, realigned with PyUnit CVS. + +- dircache now passes exceptions to the caller, instead of returning + empty lists. + +- The bsddb module and dbhash module now support the iterator and + mapping protocols which make them more substitutable for dictionaries + and shelves. + +- The csv module's DictReader and DictWriter classes now accept keyword + arguments. This was an omission in the initial implementation. + +- The email package handles some RFC 2231 parameters with missing + CHARSET fields better. It also includes a patch to parameter + parsing when semicolons appear inside quotes. + +- sets.py now runs under Py2.2. In addition, the argument restrictions + for most set methods (but not the operators) have been relaxed to + allow any iterable. + +- _strptime.py now has a behind-the-scenes caching mechanism for the most + recent TimeRE instance used along with the last five unique directive + patterns. The overall module was also made more thread-safe. + +- random.cunifvariate() and random.stdgamma() were deprecated in Py2.3 + and removed in Py2.4. + +- Bug #823328: urllib2.py's HTTP Digest Auth support works again. + +- Patch #873597: CJK codecs are imported into rank of default codecs. + +Tools/Demos +----------- + +- A hotshotmain script was added to the Tools/scripts directory that + makes it easy to run a script under control of the hotshot profiler. + +- The db2pickle and pickle2db scripts can now dump/load gdbm files. + +- The file order on the command line of the pickle2db script was reversed. + It is now [ picklefile ] dbfile. This provides better symmetry with + db2pickle. The file arguments to both scripts are now source followed by + destination in situations where both files are given. + +- The pydoc script will display a link to the module documentation for + modules determined to be part of the core distribution. The documentation + base directory defaults to http://www.python.org/doc/current/lib/ but can + be changed by setting the PYTHONDOCS environment variable. + +- texcheck.py now detects double word errors. + +- md5sum.py mistakenly opened input files in text mode by default, a + silent and dangerous change from previous releases. It once again + opens input files in binary mode by default. The -t and -b flags + remain for compatibility with the 2.3 release, but -b is the default + now. + +- py-electric-colon now works when pending-delete/delete-selection mode is + in effect + +- py-help-at-point is no longer bound to the F1 key - it's still bound to + C-c C-h + +- Pynche was fixed to not crash when there is no ~/.pynche file and no + -d option was given. + +Build +----- + +- Bug #978645: Modules/getpath.c now builds properly in --disable-framework + build under OS X. + +- Profiling using gprof is now available if Python is configured with + --enable-profiling. + +- Profiling the VM using the Pentium TSC is now possible if Python + is configured --with-tsc. + +- In order to find libraries, setup.py now also looks in /lib64, for use + on AMD64. + +- Bug #934635: Fixed a bug where the configure script couldn't detect + getaddrinfo() properly if the KAME stack had SCTP support. + +- Support for missing ANSI C header files (limits.h, stddef.h, etc) was + removed. + +- Systems requiring the D4, D6 or D7 variants of pthreads are no longer + supported (see PEP 11). + +- Universal newline support can no longer be disabled (see PEP 11). + +- Support for DGUX, SunOS 4, IRIX 4 and Minix was removed (see PEP 11). + +- Support for systems requiring --with-dl-dld or --with-sgi-dl was removed + (see PEP 11). + +- Tests for sizeof(char) were removed since ANSI C mandates that + sizeof(char) must be 1. + +C API +----- + +- Thanks to Anthony Tuininga, the datetime module now supplies a C API + containing type-check macros and constructors. See new docs in the + Python/C API Reference Manual for details. + +- Private function _PyTime_DoubleToTimet added, to convert a Python + timestamp (C double) to platform time_t with some out-of-bounds + checking. Declared in new header file timefuncs.h. It would be + good to expose some other internal timemodule.c functions there. + +- New public functions PyEval_EvaluateFrame and PyGen_New to expose + generator objects. + +- New public functions Py_IncRef() and Py_DecRef(), exposing the + functionality of the Py_XINCREF() and Py_XDECREF macros. Useful for + runtime dynamic embedding of Python. See patch #938302, by Bob + Ippolito. + +- Added a new macro, PySequence_Fast_ITEMS, which retrieves a fast sequence's + underlying array of PyObject pointers. Useful for high speed looping. + +- Created a new method flag, METH_COEXIST, which causes a method to be loaded + even if already defined by a slot wrapper. This allows a __contains__ + method, for example, to co-exist with a defined sq_contains slot. This + is helpful because the PyCFunction can take advantage of optimized calls + whenever METH_O or METH_NOARGS flags are defined. + +- Added a new function, PyDict_Contains(d, k) which is like + PySequence_Contains() but is specific to dictionaries and executes + about 10% faster. + +- Added three new macros: Py_RETURN_NONE, Py_RETURN_TRUE, and Py_RETURN_FALSE. + Each return the singleton they mention after Py_INCREF()ing them. + +- Added a new function, PyTuple_Pack(n, ...) for constructing tuples from a + variable length argument list of Python objects without having to invoke + the more complex machinery of Py_BuildValue(). PyTuple_Pack(3, a, b, c) + is equivalent to Py_BuildValue("(OOO)", a, b, c). + +Windows +------- + +- The _winreg module could segfault when reading very large registry + values, due to unchecked alloca() calls (SF bug 851056). The fix is + uses either PyMem_Malloc(n) or PyString_FromStringAndSize(NULL, n), + as appropriate, followed by a size check. + +- file.truncate() could misbehave if the file was open for update + (modes r+, rb+, w+, wb+), and the most recent file operation before + the truncate() call was an input operation. SF bug 801631. + + +What's New in Python 2.3 final? +=============================== + +*Release date: 29-Jul-2003* + +IDLE +---- + +- Bug 778400: IDLE hangs when selecting "Edit with IDLE" from explorer. + This was unique to Windows, and was fixed by adding an -n switch to + the command the Windows installer creates to execute "Edit with IDLE" + context-menu actions. + +- IDLE displays a new message upon startup: some "personal firewall" + kinds of programs (for example, ZoneAlarm) open a dialog of their + own when any program opens a socket. IDLE does use sockets, talking + on the computer's internal loopback interface. This connection is not + visible on any external interface and no data is sent to or received + from the Internet. So, if you get such a dialog when opening IDLE, + asking whether to let pythonw.exe talk to address 127.0.0.1, say yes, + and rest assured no communication external to your machine is taking + place. If you don't allow it, IDLE won't be able to start. + + +What's New in Python 2.3 release candidate 2? +============================================= + +*Release date: 24-Jul-2003* + +Core and builtins +----------------- + +- It is now possible to import from zipfiles containing additional + data bytes before the zip compatible archive. Zipfiles containing a + comment at the end are still unsupported. + +Extension modules +----------------- + +- A longstanding bug in the parser module's initialization could cause + fatal internal refcount confusion when the module got initialized more + than once. This has been fixed. + +- Fixed memory leak in pyexpat; using the parser's ParseFile() method + with open files that aren't instances of the standard file type + caused an instance of the bound .read() method to be leaked on every + call. + +- Fixed some leaks in the locale module. + +Library +------- + +- Lib/encodings/rot_13.py when used as a script, now more properly + uses the first Python interpreter on your path. + +- Removed caching of TimeRE (and thus LocaleTime) in _strptime.py to + fix a locale related bug in the test suite. Although another patch + was needed to actually fix the problem, the cache code was not + restored. + +IDLE +---- + +- Calltips patches. + +Build +----- + +- For MacOSX, added -mno-fused-madd to BASECFLAGS to fix test_coercion + on Panther (OSX 10.3). + +C API +----- + +Windows +------- + +- The tempfile module could do insane imports on Windows if PYTHONCASEOK + was set, making temp file creation impossible. Repaired. + +- Add a patch to workaround pthread_sigmask() bugs in Cygwin. + +Mac +--- + +- Various fixes to pimp. + +- Scripts runs with pythonw no longer had full window manager access. + +- Don't force boot-disk-only install, for reasons unknown it causes + more problems than it solves. + + +What's New in Python 2.3 release candidate 1? +============================================= + +*Release date: 18-Jul-2003* + +Core and builtins +----------------- + +- The new function sys.getcheckinterval() returns the last value set + by sys.setcheckinterval(). + +- Several bugs in the symbol table phase of the compiler have been + fixed. Errors could be lost and compilation could fail without + reporting an error. SF patch 763201. + +- The interpreter is now more robust about importing the warnings + module. In an executable generated by freeze or similar programs, + earlier versions of 2.3 would fail if the warnings module could + not be found on the file system. Fixes SF bug 771097. + +- A warning about assignments to module attributes that shadow + builtins, present in earlier releases of 2.3, has been removed. + +- It is not possible to create subclasses of builtin types like str + and tuple that define an itemsize. Earlier releases of Python 2.3 + allowed this by mistake, leading to crashes and other problems. + +- The thread_id is now initialized to 0 in a non-thread build. SF bug + 770247. + +- SF bug 762891: "del p[key]" on proxy object no longer raises SystemError. + +Extension modules +----------------- + +- weakref.proxy() can now handle "del obj[i]" for proxy objects + defining __delitem__. Formerly, it generated a SystemError. + +- SSL no longer crashes the interpreter when the remote side disconnects. + +- On Unix the mmap module can again be used to map device files. + +- time.strptime now exclusively uses the Python implementation + contained within the _strptime module. + +- The print slot of weakref proxy objects was removed, because it was + not consistent with the object's repr slot. + +- The mmap module only checks file size for regular files, not + character or block devices. SF patch 708374. + +- The cPickle Pickler garbage collection support was fixed to traverse + the find_class attribute, if present. + +- There are several fixes for the bsddb3 wrapper module. + + bsddb3 no longer crashes if an environment is closed before a cursor + (SF bug 763298). + + The DB and DBEnv set_get_returns_none function was extended to take + a level instead of a boolean flag. The new level 2 means that in + addition, cursor.set()/.get() methods return None instead of raising + an exception. + + A typo was fixed in DBCursor.join_item(), preventing a crash. + +Library +------- + +- distutils now supports MSVC 7.1 + +- doctest now examines all docstrings by default. Previously, it would + skip over functions with private names (as indicated by the underscore + naming convention). The old default created too much of a risk that + user tests were being skipped inadvertently. Note, this change could + break code in the unlikely case that someone had intentionally put + failing tests in the docstrings of private functions. The breakage + is easily fixable by specifying the old behavior when calling testmod() + or Tester(). + +- There were several fixes to the way dumbdbms are closed. It's vital + that a dumbdbm database be closed properly, else the on-disk data + and directory files can be left in mutually inconsistent states. + dumbdbm.py's _Database.__del__() method attempted to close the + database properly, but a shutdown race in _Database._commit() could + prevent this from working, so that a program trusting __del__() to + get the on-disk files in synch could be badly surprised. The race + has been repaired. A sync() method was also added so that shelve + can guarantee data is written to disk. + + The close() method can now be called more than once without complaint. + +- The classes in threading.py are now new-style classes. That they + weren't before was an oversight. + +- The urllib2 digest authentication handlers now define the correct + auth_header. The earlier versions would fail at runtime. + +- SF bug 763023: fix uncaught ZeroDivisionError in difflib ratio methods + when there are no lines. + +- SF bug 763637: fix exception in Tkinter with after_cancel + which could occur with Tk 8.4 + +- SF bug 770601: CGIHTTPServer.py now passes the entire environment + to child processes. + +- SF bug 765238: add filter to fnmatch's __all__. + +- SF bug 748201: make time.strptime() error messages more helpful. + +- SF patch 764470: Do not dump the args attribute of a Fault object in + xmlrpclib. + +- SF patch 549151: urllib and urllib2 now redirect POSTs on 301 + responses. + +- SF patch 766650: The whichdb module was fixed to recognize dbm files + generated by gdbm on OS/2 EMX. + +- SF bugs 763047 and 763052: fixes bug of timezone value being left as + -1 when ``time.tzname[0] == time.tzname[1] and not time.daylight`` + is true when it should only when time.daylight is true. + +- SF bug 764548: re now allows subclasses of str and unicode to be + used as patterns. + +- SF bug 763637: In Tkinter, change after_cancel() to handle tuples + of varying sizes. Tk 8.4 returns a different number of values + than Tk 8.3. + +- SF bug 763023: difflib.ratio() did not catch zero division. + +- The Queue module now has an __all__ attribute. + +Tools/Demos +----------- + +- See Lib/idlelib/NEWS.txt for IDLE news. + +- SF bug 753592: webchecker/wsgui now handles user supplied directories. + +- The trace.py script has been removed. It is now in the standard library. + +Build +----- + +- Python now compiles with -fno-strict-aliasing if possible (SF bug 766696). + +- The socket module compiles on IRIX 6.5.10. + +- An irix64 system is treated the same way as an irix6 system (SF + patch 764560). + +- Several definitions were missing on FreeBSD 5.x unless the + __BSD_VISIBLE symbol was defined. configure now defines it as + needed. + +C API +----- + +- Unicode objects now support mbcs as a built-in encoding, so the C + API can use it without deferring to the encodings package. + +Windows +------- + +- The Windows implementation of PyThread_start_new_thread() never + checked error returns from Windows functions correctly. As a result, + it could claim to start a new thread even when the Microsoft + _beginthread() function failed (due to "too many threads" -- this is + on the order of thousands when it happens). In these cases, the + Python exception :: + + thread.error: can't start new thread + + is raised now. + +- SF bug 766669: Prevent a GPF on interpreter exit when sockets are in + use. The interpreter now calls WSACleanup() from Py_Finalize() + instead of from DLL teardown. + +Mac +--- + +- Bundlebuilder now inherits default values in the right way. It was + previously possible for app bundles to get a type of "BNDL" instead + of "APPL." Other improvements include, a --build-id option to + specify the CFBundleIdentifier and using the --python option to set + the executable in the bundle. + +- Fixed two bugs in MacOSX framework handling. + +- pythonw did not allow user interaction in 2.3rc1, this has been fixed. + +- Python is now compiled with -mno-fused-madd, making all tests pass + on Panther. + +What's New in Python 2.3 beta 2? +================================ + +*Release date: 29-Jun-2003* + +Core and builtins +----------------- + +- A program can now set the environment variable PYTHONINSPECT to some + string value in Python, and cause the interpreter to enter the + interactive prompt at program exit, as if Python had been invoked + with the -i option. + +- list.index() now accepts optional start and stop arguments. Similar + changes were made to UserList.index(). SF feature request 754014. + +- SF patch 751998 fixes an unwanted side effect of the previous fix + for SF bug 742860 (the next item). + +- SF bug 742860: "WeakKeyDictionary __delitem__ uses iterkeys". This + wasn't threadsafe, was very inefficient (expected time O(len(dict)) + instead of O(1)), and could raise a spurious RuntimeError if another + thread mutated the dict during __delitem__, or if a comparison function + mutated it. It also neglected to raise KeyError when the key wasn't + present; didn't raise TypeError when the key wasn't of a weakly + referencable type; and broke various more-or-less obscure dict + invariants by using a sequence of equality comparisons over the whole + set of dict keys instead of computing the key's hash code to narrow + the search to those keys with the same hash code. All of these are + considered to be bugs. A new implementation of __delitem__ repairs all + that, but note that fixing these bugs may change visible behavior in + code relying (whether intentionally or accidentally) on old behavior. + +- SF bug 734869: Fixed a compiler bug that caused a fatal error when + compiling a list comprehension that contained another list comprehension + embedded in a lambda expression. + +- SF bug 705231: builtin pow() no longer lets the platform C pow() + raise -1.0 to integer powers, because (at least) glibc gets it wrong + in some cases. The result should be -1.0 if the power is odd and 1.0 + if the power is even, and any float with a sufficiently large exponent + is (mathematically) an exact even integer. + +- SF bug 759227: A new-style class that implements __nonzero__() must + return a bool or int (but not an int subclass) from that method. This + matches the restriction on classic classes. + +- The encoding attribute has been added for file objects, and set to + the terminal encoding on Unix and Windows. + +- The softspace attribute of file objects became read-only by oversight. + It's writable again. + +- Reverted a 2.3 beta 1 change to iterators for subclasses of list and + tuple. By default, the iterators now access data elements directly + instead of going through __getitem__. If __getitem__ access is + preferred, then __iter__ can be overridden. + +- SF bug 735247: The staticmethod and super types participate in + garbage collection. Before this change, it was possible for leaks to + occur in functions with non-global free variables that used these types. + +Extension modules +----------------- + +- the socket module has a new exception, socket.timeout, to allow + timeouts to be handled separately from other socket errors. + +- SF bug 751276: cPickle has fixed to propagate exceptions raised in + user code. In earlier versions, cPickle caught and ignored any + exception when it performed operations that it expected to raise + specific exceptions like AttributeError. + +- cPickle Pickler and Unpickler objects now participate in garbage + collection. + +- mimetools.choose_boundary() could return duplicate strings at times, + especially likely on Windows. The strings returned are now guaranteed + unique within a single program run. + +- thread.interrupt_main() raises KeyboardInterrupt in the main thread. + dummy_thread has also been modified to try to simulate the behavior. + +- array.array.insert() now treats negative indices as being relative + to the end of the array, just like list.insert() does. (SF bug #739313) + +- The datetime module classes datetime, time, and timedelta are now + properly subclassable. + +- _tkinter.{get|set}busywaitinterval was added. + +- itertools.islice() now accepts stop=None as documented. + Fixes SF bug #730685. + +- the bsddb185 module is built in one restricted instance - + /usr/include/db.h exists and defines HASHVERSION to be 2. This is true + for many BSD-derived systems. + + +Library +------- + +- Some happy doctest extensions from Jim Fulton have been added to + doctest.py. These are already being used in Zope3. The two + primary ones: + + doctest.debug(module, name) extracts the doctests from the named object + in the given module, puts them in a temp file, and starts pdb running + on that file. This is great when a doctest fails. + + doctest.DocTestSuite(module=None) returns a synthesized unittest + TestSuite instance, to be run by the unittest framework, which + runs all the doctests in the module. This allows writing tests in + doctest style (which can be clearer and shorter than writing tests + in unittest style), without losing unittest's powerful testing + framework features (which doctest lacks). + +- For compatibility with doctests created before 2.3, if an expected + output block consists solely of "1" and the actual output block + consists solely of "True", it's accepted as a match; similarly + for "0" and "False". This is quite un-doctest-like, but is practical. + The behavior can be disabled by passing the new doctest module + constant DONT_ACCEPT_TRUE_FOR_1 to the new optionflags optional + argument. + +- ZipFile.testzip() now only traps BadZipfile exceptions. Previously, + a bare except caught to much and reported all errors as a problem + in the archive. + +- The logging module now has a new function, makeLogRecord() making + LogHandler easier to interact with DatagramHandler and SocketHandler. + +- The cgitb module has been extended to support plain text display (SF patch + 569574). + +- A brand new version of IDLE (from the IDLEfork project at + SourceForge) is now included as Lib/idlelib. The old Tools/idle is + no more. + +- Added a new module: trace (documentation missing). This module used + to be distributed in Tools/scripts. It uses sys.settrace() to trace + code execution -- either function calls or individual lines. It can + generate tracing output during execution or a post-mortem report of + code coverage. + +- The threading module has new functions settrace() and setprofile() + that cooperate with the functions of the same name in the sys + module. A function registered with the threading module will + be used for all threads it creates. The new trace module uses this + to provide tracing for code running in threads. + +- copy.py: applied SF patch 707900, fixing bug 702858, by Steven + Taschuk. Copying a new-style class that had a reference to itself + didn't work. (The same thing worked fine for old-style classes.) + Builtin functions are now treated as atomic, fixing bug #746304. + +- difflib.py has two new functions: context_diff() and unified_diff(). + +- More fixes to urllib (SF 549151): (a) When redirecting, always use + GET. This is common practice and more-or-less sanctioned by the + HTTP standard. (b) Add a handler for 307 redirection, which becomes + an error for POST, but a regular redirect for GET and HEAD + +- Added optional 'onerror' argument to os.walk(), to control error + handling. + +- inspect.is{method|data}descriptor was added, to allow pydoc display + __doc__ of data descriptors. + +- Fixed socket speed loss caused by use of the _socketobject wrapper class + in socket.py. + +- timeit.py now checks the current directory for imports. + +- urllib2.py now knows how to order proxy classes, so the user doesn't + have to insert it in front of other classes, nor do dirty tricks like + inserting a "dummy" HTTPHandler after a ProxyHandler when building an + opener with proxy support. + +- Iterators have been added for dbm keys. + +- random.Random objects can now be pickled. + +Tools/Demos +----------- + +- pydoc now offers help on keywords and topics. + +- Tools/idle is gone; long live Lib/idlelib. + +- diff.py prints file diffs in context, unified, or ndiff formats, + providing a command line interface to difflib.py. + +- texcheck.py is a new script for making a rough validation of Python LaTeX + files. + +Build +----- + +- Setting DESTDIR during 'make install' now allows specifying a + different root directory. + +C API +----- + +- PyType_Ready(): If a type declares that it participates in gc + (Py_TPFLAGS_HAVE_GC), and its base class does not, and its base class's + tp_free slot is the default _PyObject_Del, and type does not define + a tp_free slot itself, _PyObject_GC_Del is assigned to type->tp_free. + Previously _PyObject_Del was inherited, which could at best lead to a + segfault. In addition, if even after this magic the type's tp_free + slot is _PyObject_Del or NULL, and the type is a base type + (Py_TPFLAGS_BASETYPE), TypeError is raised: since the type is a base + type, its dealloc function must call type->tp_free, and since the type + is gc'able, tp_free must not be NULL or _PyObject_Del. + +- PyThreadState_SetAsyncExc(): A new API (deliberately accessible only + from C) to interrupt a thread by sending it an exception. It is + intentional that you have to write your own C extension to call it + from Python. + + +New platforms +------------- + +None this time. + +Tests +----- + +- test_imp rewritten so that it doesn't raise RuntimeError if run as a + side effect of being imported ("import test.autotest"). + +Windows +------- + +- The Windows installer ships with Tcl/Tk 8.4.3 (upgraded from 8.4.1). + +- The installer always suggested that Python be installed on the C: + drive, due to a hardcoded "C:" generated by the Wise installation + wizard. People with machines where C: is not the system drive + usually want Python installed on whichever drive is their system drive + instead. We removed the hardcoded "C:", and two testers on machines + where C: is not the system drive report that the installer now + suggests their system drive. Note that you can always select the + directory you want in the "Select Destination Directory" dialog -- + that's what it's for. + +Mac +--- + +- There's a new module called "autoGIL", which offers a mechanism to + automatically release the Global Interpreter Lock when an event loop + goes to sleep, allowing other threads to run. It's currently only + supported on OSX, in the Mach-O version. +- The OSA modules now allow direct access to properties of the + toplevel application class (in AppleScript terminology). +- The Package Manager can now update itself. + +SourceForge Bugs and Patches Applied +------------------------------------ + +430160, 471893, 501716, 542562, 549151, 569574, 595837, 596434, +598163, 604210, 604716, 610332, 612627, 614770, 620190, 621891, +622042, 639139, 640236, 644345, 649742, 649742, 658233, 660022, +661318, 661676, 662807, 662923, 666219, 672855, 678325, 682347, +683486, 684981, 685773, 686254, 692776, 692959, 693094, 696777, +697989, 700827, 703666, 708495, 708604, 708901, 710733, 711902, +713722, 715782, 718286, 719359, 719367, 723136, 723831, 723962, +724588, 724767, 724767, 725942, 726150, 726446, 726869, 727051, +727719, 727719, 727805, 728277, 728563, 728656, 729096, 729103, +729293, 729297, 729300, 729317, 729395, 729622, 729817, 730170, +730296, 730594, 730685, 730826, 730963, 731209, 731403, 731504, +731514, 731626, 731635, 731643, 731644, 731644, 731689, 732124, +732143, 732234, 732284, 732284, 732479, 732761, 732783, 732951, +733667, 733781, 734118, 734231, 734869, 735051, 735293, 735527, +735613, 735694, 736962, 736962, 737970, 738066, 739313, 740055, +740234, 740301, 741806, 742126, 742741, 742860, 742860, 742911, +744041, 744104, 744238, 744687, 744877, 745055, 745478, 745525, +745620, 746012, 746304, 746366, 746801, 746953, 747348, 747667, +747954, 748846, 748849, 748973, 748975, 749191, 749210, 749759, +749831, 749911, 750008, 750092, 750542, 750595, 751038, 751107, +751276, 751451, 751916, 751941, 751956, 751998, 752671, 753451, +753602, 753617, 753845, 753925, 754014, 754340, 754447, 755031, +755087, 755147, 755245, 755683, 755987, 756032, 756996, 757058, +757229, 757818, 757821, 757822, 758112, 758910, 759227, 759889, +760257, 760703, 760792, 761104, 761337, 761519, 761830, 762455 + + +What's New in Python 2.3 beta 1? +================================ + +*Release date: 25-Apr-2003* + +Core and builtins +----------------- + +- New format codes B, H, I, k and K have been implemented for + PyArg_ParseTuple and PyBuild_Value. + +- New builtin function sum(seq, start=0) returns the sum of all the + items in iterable object seq, plus start (items are normally numbers, + and cannot be strings). + +- bool() called without arguments now returns False rather than + raising an exception. This is consistent with calling the + constructors for the other builtin types -- called without argument + they all return the false value of that type. (SF patch #724135) + +- In support of PEP 269 (making the pgen parser generator accessible + from Python), some changes to the pgen code structure were made; a + few files that used to be linked only with pgen are now linked with + Python itself. + +- The repr() of a weakref object now shows the __name__ attribute of + the referenced object, if it has one. + +- super() no longer ignores data descriptors, except __class__. See + the thread started at + http://mail.python.org/pipermail/python-dev/2003-April/034338.html + +- list.insert(i, x) now interprets negative i as it would be + interpreted by slicing, so negative values count from the end of the + list. This was the only place where such an interpretation was not + placed on a list index. + +- range() now works even if the arguments are longs with magnitude + larger than sys.maxint, as long as the total length of the sequence + fits. E.g., range(2**100, 2**101, 2**100) is the following list: + [1267650600228229401496703205376L]. (SF patch #707427.) + +- Some horridly obscure problems were fixed involving interaction + between garbage collection and old-style classes with "ambitious" + getattr hooks. If an old-style instance didn't have a __del__ method, + but did have a __getattr__ hook, and the instance became reachable + only from an unreachable cycle, and the hook resurrected or deleted + unreachable objects when asked to resolve "__del__", anything up to + a segfault could happen. That's been repaired. + +- dict.pop now takes an optional argument specifying a default + value to return if the key is not in the dict. If a default is not + given and the key is not found, a KeyError will still be raised. + Parallel changes were made to UserDict.UserDict and UserDict.DictMixin. + [SF patch #693753] (contributed by Michael Stone.) + +- sys.getfilesystemencoding() was added to expose + Py_FileSystemDefaultEncoding. + +- New function sys.exc_clear() clears the current exception. This is + rarely needed, but can sometimes be useful to release objects + referenced by the traceback held in sys.exc_info()[2]. (SF patch + #693195.) + +- On 64-bit systems, a dictionary could contain duplicate long/int keys + if the key value was larger than 2**32. See SF bug #689659. + +- Fixed SF bug #663074. The codec system was using global static + variables to store internal data. As a result, any attempts to use the + unicode system with multiple active interpreters, or successive + interpreter executions, would fail. + +- "%c" % u"a" now returns a unicode string instead of raising a + TypeError. u"%c" % 0xffffffff now raises a OverflowError instead + of a ValueError to be consistent with "%c" % 256. See SF patch #710127. + +Extension modules +----------------- + +- The socket module now provides the functions inet_pton and inet_ntop + for converting between string and packed representation of IP + addresses. There is also a new module variable, has_ipv6, which is + True iff the current Python has IPv6 support. See SF patch #658327. + +- Tkinter wrappers around Tcl variables now pass objects directly + to Tcl, instead of first converting them to strings. + +- The .*? pattern in the re module is now special-cased to avoid the + recursion limit. (SF patch #720991 -- many thanks to Gary Herron + and Greg Chapman.) + +- New function sys.call_tracing() allows pdb to debug code + recursively. + +- New function gc.get_referents(obj) returns a list of objects + directly referenced by obj. In effect, it exposes what the object's + tp_traverse slot does, and can be helpful when debugging memory + leaks. + +- The iconv module has been removed from this release. + +- The platform-independent routines for packing floats in IEEE formats + (struct.pack's f, d codes; pickle and cPickle's protocol 1 + pickling of floats) ignored that rounding can cause a carry to + propagate. The worst consequence was that, in rare cases, f + could produce strings that, when unpacked again, were a factor of 2 + away from the original float. This has been fixed. See SF bug + #705836. + +- New function time.tzset() provides access to the C library tzset() + function, if supported. (SF patch #675422.) + +- Using createfilehandler, deletefilehandler, createtimerhandler functions + on Tkinter.tkinter (_tkinter module) no longer crashes the interpreter. + See SF bug #692416. + +- Modified the fcntl.ioctl() function to allow modification of a passed + mutable buffer (for details see the reference documentation). + +- Made user requested changes to the itertools module. + Subsumed the times() function into repeat(). + Added chain() and cycle(). + +- The rotor module is now deprecated; the encryption algorithm it uses + is not believed to be secure, and including crypto code with Python + has implications for exporting and importing it in various countries. + +- The socket module now always uses the _socketobject wrapper class, even on + platforms which have dup(2). The makefile() method is built directly + on top of the socket without duplicating the file descriptor, allowing + timeouts to work properly. + +Library +------- + +- New generator function os.walk() is an easy-to-use alternative to + os.path.walk(). See os module docs for details. os.path.walk() + isn't deprecated at this time, but may become deprecated in a + future release. + +- Added new module "platform" which provides a wide range of tools + for querying platform dependent features. + +- netrc now allows ASCII punctuation characters in passwords. + +- shelve now supports the optional writeback argument, and exposes + pickle protocol versions. + +- Several methods of nntplib.NNTP have grown an optional file argument + which specifies a file where to divert the command's output + (already supported by the body() method). (SF patch #720468) + +- The self-documenting XML server library DocXMLRPCServer was added. + +- Support for internationalized domain names has been added through + the 'idna' and 'punycode' encodings, the 'stringprep' module, the + 'mkstringprep' tool, and enhancements to the socket and httplib + modules. + +- htmlentitydefs has two new dictionaries: name2codepoint maps + HTML entity names to Unicode codepoints (as integers). + codepoint2name is the reverse mapping. See SF patch #722017. + +- pdb has a new command, "debug", which lets you step through + arbitrary code from the debugger's (pdb) prompt. + +- unittest.failUnlessEqual and its equivalent unittest.assertEqual now + return 'not a == b' rather than 'a != b'. This gives the desired + result for classes that define __eq__ without defining __ne__. + +- sgmllib now supports SGML marked sections, in particular the + MS Office extensions. + +- The urllib module now offers support for the iterator protocol. + SF patch 698520 contributed by Brett Cannon. + +- New module timeit provides a simple framework for timing the + execution speed of expressions and statements. + +- sets.Set objects now support mixed-type __eq__ and __ne__, instead + of raising TypeError. If x is a Set object and y is a non-Set object, + x == y is False, and x != y is True. This is akin to the change made + for mixed-type comparisons of datetime objects in 2.3a2; more info + about the rationale is in the NEWS entry for that. See also SF bug + report . + +- On Unix platforms, if os.listdir() is called with a Unicode argument, + it now returns Unicode strings. (This behavior was added earlier + to the Windows NT/2k/XP version of os.listdir().) + +- Distutils: both 'py_modules' and 'packages' keywords can now be specified + in core.setup(). Previously you could supply one or the other, but + not both of them. (SF patch #695090 from Bernhard Herzog) + +- New csv package makes it easy to read/write CSV files. + +- Module shlex has been extended to allow posix-like shell parsings, + including a split() function for easy spliting of quoted strings and + commands. An iterator interface was also implemented. + +Tools/Demos +----------- + +- New script combinerefs.py helps analyze new PYTHONDUMPREFS output. + See the module docstring for details. + +Build +----- + +- Fix problem building on OSF1 because the compiler only accepted + preprocessor directives that start in column 1. (SF bug #691793.) + +C API +----- + +- Added PyGC_Collect(), equivalent to calling gc.collect(). + +- PyThreadState_GetDict() was changed not to raise an exception or + issue a fatal error when no current thread state is available. This + makes it possible to print dictionaries when no thread is active. + +- LONG_LONG was renamed to PY_LONG_LONG. Extensions that use this and + need compatibility with previous versions can use this: + + #ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG + #endif + +- Added PyObject_SelfIter() to fill the tp_iter slot for the + typical case where the method returns its self argument. + +- The extended type structure used for heap types (new-style + classes defined by Python code using a class statement) is now + exported from object.h as PyHeapTypeObject. (SF patch #696193.) + +New platforms +------------- + +None this time. + +Tests +----- + +- test_timeout now requires -u network to be passed to regrtest to run. + See SF bug #692988. + +Windows +------- + +- os.fsync() now exists on Windows, and calls the Microsoft _commit() + function. + +- New function winsound.MessageBeep() wraps the Win32 API + MessageBeep(). + +Mac +--- + +- os.listdir() now returns Unicode strings on MacOS X when called with + a Unicode argument. See the general news item under "Library". + +- A new method MacOS.WMAvailable() returns true if it is safe to access + the window manager, false otherwise. + +- EasyDialogs dialogs are now movable-modal, and if the application is + currently in the background they will ask to be moved to the foreground + before displaying. + +- OSA Scripting support has improved a lot, and gensuitemodule.py can now + be used by mere mortals. The documentation is now also more or less + complete. + +- The IDE (in a framework build) now includes introductory documentation + in Apple Help Viewer format. + + +What's New in Python 2.3 alpha 2? +================================= + +*Release date: 19-Feb-2003* + +Core and builtins +----------------- + +- Negative positions returned from PEP 293 error callbacks are now + treated as being relative to the end of the input string. Positions + that are out of bounds raise an IndexError. + +- sys.path[0] (the directory from which the script is loaded) is now + turned into an absolute pathname, unless it is the empty string. + (SF patch #664376.) + +- Finally fixed the bug in compile() and exec where a string ending + with an indented code block but no newline would raise SyntaxError. + This would have been a four-line change in parsetok.c... Except + codeop.py depends on this behavior, so a compilation flag had to be + invented that causes the tokenizer to revert to the old behavior; + this required extra changes to 2 .h files, 2 .c files, and 2 .py + files. (Fixes SF bug #501622.) + +- If a new-style class defines neither __new__ nor __init__, its + constructor would ignore all arguments. This is changed now: the + constructor refuses arguments in this case. This might break code + that worked under Python 2.2. The simplest fix is to add a no-op + __init__: ``def __init__(self, *args, **kw): pass``. + +- Through a bytecode optimizer bug (and I bet you didn't even know + Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants + with a leading minus sign would come out with the wrong sign. + ("Unsigned" hex/oct constants are those with a face value in the + range sys.maxint+1 through sys.maxint*2+1, inclusive; these have + always been interpreted as negative numbers through sign folding.) + E.g. 0xffffffff is -1, and -(0xffffffff) is 1, but -0xffffffff would + come out as -4294967295. This was the case in Python 2.2 through + 2.2.2 and 2.3a1, and in Python 2.4 it will once again have that + value, but according to PEP 237 it really needs to be 1 now. This + will be backported to Python 2.2.3 a well. (SF #660455) + +- int(s, base) sometimes sign-folds hex and oct constants; it only + does this when base is 0 and s.strip() starts with a '0'. When the + sign is actually folded, as in int("0xffffffff", 0) on a 32-bit + machine, which returns -1, a FutureWarning is now issued; in Python + 2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and + int("0xffffffff", 16) right now. (PEP 347) + +- super(X, x): x may now be a proxy for an X instance, i.e. + issubclass(x.__class__, X) but not issubclass(type(x), X). + +- isinstance(x, X): if X is a new-style class, this is now equivalent + to issubclass(type(x), X) or issubclass(x.__class__, X). Previously + only type(x) was tested. (For classic classes this was already the + case.) + +- compile(), eval() and the exec statement now fully support source code + passed as unicode strings. + +- int subclasses can be initialized with longs if the value fits in an int. + See SF bug #683467. + +- long(string, base) takes time linear in len(string) when base is a power + of 2 now. It used to take time quadratic in len(string). + +- filter returns now Unicode results for Unicode arguments. + +- raw_input can now return Unicode objects. + +- List objects' sort() method now accepts None as the comparison function. + Passing None is semantically identical to calling sort() with no + arguments. + +- Fixed crash when printing a subclass of str and __str__ returned self. + See SF bug #667147. + +- Fixed an invalid RuntimeWarning and an undetected error when trying + to convert a long integer into a float which couldn't fit. + See SF bug #676155. + +- Function objects now have a __module__ attribute that is bound to + the name of the module in which the function was defined. This + applies for C functions and methods as well as functions and methods + defined in Python. This attribute is used by pickle.whichmodule(), + which changes the behavior of whichmodule slightly. In Python 2.2 + whichmodule() returns "__main__" for functions that are not defined + at the top-level of a module (examples: methods, nested functions). + Now whichmodule() will return the proper module name. + +Extension modules +----------------- + +- operator.isNumberType() now checks that the object has a nb_int or + nb_float slot, rather than simply checking whether it has a non-NULL + tp_as_number pointer. + +- The imp module now has ways to acquire and release the "import + lock": imp.acquire_lock() and imp.release_lock(). Note: this is a + reentrant lock, so releasing the lock only truly releases it when + this is the last release_lock() call. You can check with + imp.lock_held(). (SF bug #580952 and patch #683257.) + +- Change to cPickle to match pickle.py (see below and PEP 307). + +- Fix some bugs in the parser module. SF bug #678518. + +- Thanks to Scott David Daniels, a subtle bug in how the zlib + extension implemented flush() was fixed. Scott also rewrote the + zlib test suite using the unittest module. (SF bug #640230 and + patch #678531.) + +- Added an itertools module containing high speed, memory efficient + looping constructs inspired by tools from Haskell and SML. + +- The SSL module now handles sockets with a timeout set correctly (SF + patch #675750, fixing SF bug #675552). + +- os/posixmodule has grown the sysexits.h constants (EX_OK and friends). + +- Fixed broken threadstate swap in readline that could cause fatal + errors when a readline hook was being invoked while a background + thread was active. (SF bugs #660476 and #513033.) + +- fcntl now exposes the strops.h I_* constants. + +- Fix a crash on Solaris that occurred when calling close() on + an mmap'ed file which was already closed. (SF patch #665913) + +- Fixed several serious bugs in the zipimport implementation. + +- datetime changes: + + The date class is now properly subclassable. (SF bug #720908) + + The datetime and datetimetz classes have been collapsed into a single + datetime class, and likewise the time and timetz classes into a single + time class. Previously, a datetimetz object with tzinfo=None acted + exactly like a datetime object, and similarly for timetz. This wasn't + enough of a difference to justify distinct classes, and life is simpler + now. + + today() and now() now round system timestamps to the closest + microsecond . This repairs an + irritation most likely seen on Windows systems. + + In dt.astimezone(tz), if tz.utcoffset(dt) returns a duration, + ValueError is raised if tz.dst(dt) returns None (2.3a1 treated it + as 0 instead, but a tzinfo subclass wishing to participate in + time zone conversion has to take a stand on whether it supports + DST; if you don't care about DST, then code dst() to return 0 minutes, + meaning that DST is never in effect). + + The tzinfo methods utcoffset() and dst() must return a timedelta object + (or None) now. In 2.3a1 they could also return an int or long, but that + was an unhelpfully redundant leftover from an earlier version wherein + they couldn't return a timedelta. TOOWTDI. + + The example tzinfo class for local time had a bug. It was replaced + by a later example coded by Guido. + + datetime.astimezone(tz) no longer raises an exception when the + input datetime has no UTC equivalent in tz. For typical "hybrid" time + zones (a single tzinfo subclass modeling both standard and daylight + time), this case can arise one hour per year, at the hour daylight time + ends. See new docs for details. In short, the new behavior mimics + the local wall clock's behavior of repeating an hour in local time. + + dt.astimezone() can no longer be used to convert between naive and aware + datetime objects. If you merely want to attach, or remove, a tzinfo + object, without any conversion of date and time members, use + dt.replace(tzinfo=whatever) instead, where "whatever" is None or a + tzinfo subclass instance. + + A new method tzinfo.fromutc(dt) can be overridden in tzinfo subclasses + to give complete control over how a UTC time is to be converted to + a local time. The default astimezone() implementation calls fromutc() + as its last step, so a tzinfo subclass can affect that too by overriding + fromutc(). It's expected that the default fromutc() implementation will + be suitable as-is for "almost all" time zone subclasses, but the + creativity of political time zone fiddling appears unbounded -- fromutc() + allows the highly motivated to emulate any scheme expressible in Python. + + datetime.now(): The optional tzinfo argument was undocumented (that's + repaired), and its name was changed to tz ("tzinfo" is overloaded enough + already). With a tz argument, now(tz) used to return the local date + and time, and attach tz to it, without any conversion of date and time + members. This was less than useful. Now now(tz) returns the current + date and time as local time in tz's time zone, akin to :: + + tz.fromutc(datetime.utcnow().replace(tzinfo=utc)) + + where "utc" is an instance of a tzinfo subclass modeling UTC. Without + a tz argument, now() continues to return the current local date and time, + as a naive datetime object. + + datetime.fromtimestamp(): Like datetime.now() above, this had less than + useful behavior when the optional tinzo argument was specified. See + also SF bug report . + + date and datetime comparison: In order to prevent comparison from + falling back to the default compare-object-addresses strategy, these + raised TypeError whenever they didn't understand the other object type. + They still do, except when the other object has a "timetuple" attribute, + in which case they return NotImplemented now. This gives other + datetime objects (e.g., mxDateTime) a chance to intercept the + comparison. + + date, time, datetime and timedelta comparison: When the exception + for mixed-type comparisons in the last paragraph doesn't apply, if + the comparison is == then False is returned, and if the comparison is + != then True is returned. Because dict lookup and the "in" operator + only invoke __eq__, this allows, for example, :: + + if some_datetime in some_sequence: + + and :: + + some_dict[some_timedelta] = whatever + + to work as expected, without raising TypeError just because the + sequence is heterogeneous, or the dict has mixed-type keys. [This + seems like a good idea to implement for all mixed-type comparisons + that don't want to allow falling back to address comparison.] + + The constructors building a datetime from a timestamp could raise + ValueError if the platform C localtime()/gmtime() inserted "leap + seconds". Leap seconds are ignored now. On such platforms, it's + possible to have timestamps that differ by a second, yet where + datetimes constructed from them are equal. + + The pickle format of date, time and datetime objects has changed + completely. The undocumented pickler and unpickler functions no + longer exist. The undocumented __setstate__() and __getstate__() + methods no longer exist either. + +Library +------- + +- The logging module was updated slightly; the WARN level was renamed + to WARNING, and the matching function/method warn() to warning(). + +- The pickle and cPickle modules were updated with a new pickling + protocol (documented by pickletools.py, see below) and several + extensions to the pickle customization API (__reduce__, __setstate__ + etc.). The copy module now uses more of the pickle customization + API to copy objects that don't implement __copy__ or __deepcopy__. + See PEP 307 for details. + +- The distutils "register" command now uses http://www.python.org/pypi + as the default repository. (See PEP 301.) + +- the platform dependent path related variables sep, altsep, extsep, + pathsep, curdir, pardir and defpath are now defined in the platform + dependent path modules (e.g. ntpath.py) rather than os.py, so these + variables are now available via os.path. They continue to be + available from the os module. + (see ). + +- array.array was added to the types repr.py knows about (see + ). + +- The new pickletools.py contains lots of documentation about pickle + internals, and supplies some helpers for working with pickles, such as + a symbolic pickle disassembler. + +- Xmlrpclib.py now supports the builtin boolean type. + +- py_compile has a new 'doraise' flag and a new PyCompileError + exception. + +- SimpleXMLRPCServer now supports CGI through the CGIXMLRPCRequestHandler + class. + +- The sets module now raises TypeError in __cmp__, to clarify that + sets are not intended to be three-way-compared; the comparison + operators are overloaded as subset/superset tests. + +- Bastion.py and rexec.py are disabled. These modules are not safe in + Python 2.2. or 2.3. + +- realpath is now exported when doing ``from poxixpath import *``. + It is also exported for ntpath, macpath, and os2emxpath. + See SF bug #659228. + +- New module tarfile from Lars Gustäbel provides a comprehensive interface + to tar archive files with transparent gzip and bzip2 compression. + See SF patch #651082. + +- urlparse can now parse imap:// URLs. See SF feature request #618024. + +- Tkinter.Canvas.scan_dragto() provides an optional parameter to support + the gain value which is passed to Tk. SF bug# 602259. + +- Fix logging.handlers.SysLogHandler protocol when using UNIX domain sockets. + See SF patch #642974. + +- The dospath module was deleted. Use the ntpath module when manipulating + DOS paths from other platforms. + +Tools/Demos +----------- + +- Two new scripts (db2pickle.py and pickle2db.py) were added to the + Tools/scripts directory to facilitate conversion from the old bsddb module + to the new one. While the user-visible API of the new module is + compatible with the old one, it's likely that the version of the + underlying database library has changed. To convert from the old library, + run the db2pickle.py script using the old version of Python to convert it + to a pickle file. After upgrading Python, run the pickle2db.py script + using the new version of Python to reconstitute your database. For + example: + + % python2.2 db2pickle.py -h some.db > some.pickle + % python2.3 pickle2db.py -h some.db.new < some.pickle + + Run the scripts without any args to get a usage message. + + +Build +----- + +- The audio driver tests (test_ossaudiodev.py and + test_linuxaudiodev.py) are no longer run by default. This is + because they don't always work, depending on your hardware and + software. To run these tests, you must use an invocation like :: + + ./python Lib/test/regrtest.py -u audio test_ossaudiodev + +- On systems which build using the configure script, compiler flags which + used to be lumped together using the OPT flag have been split into two + groups, OPT and BASECFLAGS. OPT is meant to carry just optimization- and + debug-related flags like "-g" and "-O3". BASECFLAGS is meant to carry + compiler flags that are required to get a clean compile. On some + platforms (many Linux flavors in particular) BASECFLAGS will be empty by + default. On others, such as Mac OS X and SCO, it will contain required + flags. This change allows people building Python to override OPT without + fear of clobbering compiler flags which are required to get a clean build. + +- On Darwin/Mac OS X platforms, /sw/lib and /sw/include are added to the + relevant search lists in setup.py. This allows users building Python to + take advantage of the many packages available from the fink project + . + +- A new Makefile target, scriptsinstall, installs a number of useful scripts + from the Tools/scripts directory. + +C API +----- + +- PyEval_GetFrame() is now declared to return a ``PyFrameObject *`` + instead of a plain ``PyObject *``. (SF patch #686601.) + +- PyNumber_Check() now checks that the object has a nb_int or nb_float + slot, rather than simply checking whether it has a non-NULL + tp_as_number pointer. + +- A C type that inherits from a base type that defines tp_as_buffer + will now inherit the tp_as_buffer pointer if it doesn't define one. + (SF #681367) + +- The PyArg_Parse functions now issue a DeprecationWarning if a float + argument is provided when an integer is specified (this affects the 'b', + 'B', 'h', 'H', 'i', and 'l' codes). Future versions of Python will + raise a TypeError. + +Tests +----- + +- Several tests weren't being run from regrtest.py (test_timeout.py, + test_tarfile.py, test_netrc.py, test_multifile.py, + test_importhooks.py and test_imp.py). Now they are. (Note to + developers: please read Lib/test/README when creating a new test, to + make sure to do it right! All tests need to use either unittest or + pydoc.) + +- Added test_posix.py, a test suite for the posix module. + +- Added test_hexoct.py, a test suite for hex/oct constant folding. + +Windows +------- + +- The timeout code for socket connect() didn't work right; this has + now been fixed. test_timeout.py should pass (at least most of the + time). + +- distutils' msvccompiler class now passes the preprocessor options to + the resource compiler. See SF patch #669198. + +- The bsddb module now ships with Sleepycat's 4.1.25.NC, the latest + release without strong cryptography. + +- sys.path[0], if it contains a directory name, is now always an + absolute pathname. (SF patch #664376.) + +- The new logging package is now installed by the Windows installer. It + wasn't in 2.3a1 due to oversight. + +Mac +--- + +- There are new dialogs EasyDialogs.AskFileForOpen, AskFileForSave + and AskFolder. The old macfs.StandardGetFile and friends are deprecated. + +- Most of the standard library now uses pathnames or FSRefs in preference + of FSSpecs, and use the underlying Carbon.File and Carbon.Folder modules + in stead of macfs. macfs will probably be deprecated in the future. + +- Type Carbon.File.FSCatalogInfo and supporting methods have been implemented. + This also makes macfs.FSSpec.SetDates() work again. + +- There is a new module pimp, the package install manager for Python, and + accompanying applet PackageManager. These allow you to easily download + and install pretested extension packages either in source or binary + form. Only in MacPython-OSX. + +- Applets are now built with bundlebuilder in MacPython-OSX, which should make + them more robust and also provides a path towards BuildApplication. The + downside of this change is that applets can no longer be run from the + Terminal window, this will hopefully be fixed in the 2.3b1. + + +What's New in Python 2.3 alpha 1? +================================= + +*Release date: 31-Dec-2002* + +Type/class unification and new-style classes +-------------------------------------------- + +- One can now assign to __bases__ and __name__ of new-style classes. + +- dict() now accepts keyword arguments so that dict(one=1, two=2) + is the equivalent of {"one": 1, "two": 2}. Accordingly, + the existing (but undocumented) 'items' keyword argument has + been eliminated. This means that dict(items=someMapping) now has + a different meaning than before. + +- int() now returns a long object if the argument is outside the + integer range, so int("4" * 1000), int(1e200) and int(1L<<1000) will + all return long objects instead of raising an OverflowError. + +- Assignment to __class__ is disallowed if either the old or the new + class is a statically allocated type object (such as defined by an + extension module). This prevents anomalies like 2.__class__ = bool. + +- New-style object creation and deallocation have been sped up + significantly; they are now faster than classic instance creation + and deallocation. + +- The __slots__ variable can now mention "private" names, and the + right thing will happen (e.g. __slots__ = ["__foo"]). + +- The built-ins slice() and buffer() are now callable types. The + types classobj (formerly class), code, function, instance, and + instancemethod (formerly instance-method), which have no built-in + names but are accessible through the types module, are now also + callable. The type dict-proxy is renamed to dictproxy. + +- Cycles going through the __class__ link of a new-style instance are + now detected by the garbage collector. + +- Classes using __slots__ are now properly garbage collected. + [SF bug 519621] + +- Tightened the __slots__ rules: a slot name must be a valid Python + identifier. + +- The constructor for the module type now requires a name argument and + takes an optional docstring argument. Previously, this constructor + ignored its arguments. As a consequence, deriving a class from a + module (not from the module type) is now illegal; previously this + created an unnamed module, just like invoking the module type did. + [SF bug 563060] + +- A new type object, 'basestring', is added. This is a common base type + for 'str' and 'unicode', and can be used instead of + types.StringTypes, e.g. to test whether something is "a string": + isinstance(x, basestring) is True for Unicode and 8-bit strings. This + is an abstract base class and cannot be instantiated directly. + +- Changed new-style class instantiation so that when C's __new__ + method returns something that's not a C instance, its __init__ is + not called. [SF bug #537450] + +- Fixed super() to work correctly with class methods. [SF bug #535444] + +- If you try to pickle an instance of a class that has __slots__ but + doesn't define or override __getstate__, a TypeError is now raised. + This is done by adding a bozo __getstate__ to the class that always + raises TypeError. (Before, this would appear to be pickled, but the + state of the slots would be lost.) + +Core and builtins +----------------- + +- Import from zipfiles is now supported. The name of a zipfile placed + on sys.path causes the import statement to look for importable Python + modules (with .py, pyc and .pyo extensions) and packages inside the + zipfile. The zipfile import follows the specification (though not + the sample implementation) of PEP 273. The semantics of __path__ are + compatible with those that have been implemented in Jython since + Jython 2.1. + +- PEP 302 has been accepted. Although it was initially developed to + support zipimport, it offers a new, general import hook mechanism. + Several new variables have been added to the sys module: + sys.meta_path, sys.path_hooks, and sys.path_importer_cache; these + make extending the import statement much more convenient than + overriding the __import__ built-in function. For a description of + these, see PEP 302. + +- A frame object's f_lineno attribute can now be written to from a + trace function to change which line will execute next. A command to + exploit this from pdb has been added. [SF patch #643835] + +- The _codecs support module for codecs.py was turned into a builtin + module to assure that at least the builtin codecs are available + to the Python parser for source code decoding according to PEP 263. + +- issubclass now supports a tuple as the second argument, just like + isinstance does. ``issubclass(X, (A, B))`` is equivalent to + ``issubclass(X, A) or issubclass(X, B)``. + +- Thanks to Armin Rigo, the last known way to provoke a system crash + by cleverly arranging for a comparison function to mutate a list + during a list.sort() operation has been fixed. The effect of + attempting to mutate a list, or even to inspect its contents or + length, while a sort is in progress, is not defined by the language. + The C implementation of Python 2.3 attempts to detect mutations, + and raise ValueError if one occurs, but there's no guarantee that + all mutations will be caught, or that any will be caught across + releases or implementations. + +- Unicode file name processing for Windows (PEP 277) is implemented. + All platforms now have an os.path.supports_unicode_filenames attribute, + which is set to True on Windows NT/2000/XP, and False elsewhere. + +- Codec error handling callbacks (PEP 293) are implemented. + Error handling in unicode.encode or str.decode can now be customized. + +- A subtle change to the semantics of the built-in function intern(): + interned strings are no longer immortal. You must keep a reference + to the return value intern() around to get the benefit. + +- Use of 'None' as a variable, argument or attribute name now + issues a SyntaxWarning. In the future, None may become a keyword. + +- SET_LINENO is gone. co_lnotab is now consulted to determine when to + call the trace function. C code that accessed f_lineno should call + PyCode_Addr2Line instead (f_lineno is still there, but only kept up + to date when there is a trace function set). + +- There's a new warning category, FutureWarning. This is used to warn + about a number of situations where the value or sign of an integer + result will change in Python 2.4 as a result of PEP 237 (integer + unification). The warnings implement stage B0 mentioned in that + PEP. The warnings are about the following situations: + + - Octal and hex literals without 'L' prefix in the inclusive range + [0x80000000..0xffffffff]; these are currently negative ints, but + in Python 2.4 they will be positive longs with the same bit + pattern. + + - Left shifts on integer values that cause the outcome to lose + bits or have a different sign than the left operand. To be + precise: x< -*-" in the first + or second line of a Python source file indicates the encoding. + +- list.sort() has a new implementation. While cross-platform results + may vary, and in data-dependent ways, this is much faster on many + kinds of partially ordered lists than the previous implementation, + and reported to be just as fast on randomly ordered lists on + several major platforms. This sort is also stable (if A==B and A + precedes B in the list at the start, A precedes B after the sort too), + although the language definition does not guarantee stability. A + potential drawback is that list.sort() may require temp space of + len(list)*2 bytes (``*4`` on a 64-bit machine). It's therefore possible + for list.sort() to raise MemoryError now, even if a comparison function + does not. See for full details. + +- All standard iterators now ensure that, once StopIteration has been + raised, all future calls to next() on the same iterator will also + raise StopIteration. There used to be various counterexamples to + this behavior, which could caused confusion or subtle program + breakage, without any benefits. (Note that this is still an + iterator's responsibility; the iterator framework does not enforce + this.) + +- Ctrl+C handling on Windows has been made more consistent with + other platforms. KeyboardInterrupt can now reliably be caught, + and Ctrl+C at an interactive prompt no longer terminates the + process under NT/2k/XP (it never did under Win9x). Ctrl+C will + interrupt time.sleep() in the main thread, and any child processes + created via the popen family (on win2k; we can't make win9x work + reliably) are also interrupted (as generally happens on for Linux/Unix.) + [SF bugs 231273, 439992 and 581232] + +- sys.getwindowsversion() has been added on Windows. This + returns a tuple with information about the version of Windows + currently running. + +- Slices and repetitions of buffer objects now consistently return + a string. Formerly, strings would be returned most of the time, + but a buffer object would be returned when the repetition count + was one or when the slice range was all inclusive. + +- Unicode objects in sys.path are no longer ignored but treated + as directory names. + +- Fixed string.startswith and string.endswith builtin methods + so they accept negative indices. [SF bug 493951] + +- Fixed a bug with a continue inside a try block and a yield in the + finally clause. [SF bug 567538] + +- Most builtin sequences now support "extended slices", i.e. slices + with a third "stride" parameter. For example, "hello world"[::-1] + gives "dlrow olleh". + +- A new warning PendingDeprecationWarning was added to provide + direction on features which are in the process of being deprecated. + The warning will not be printed by default. To see the pending + deprecations, use -Walways::PendingDeprecationWarning:: + as a command line option or warnings.filterwarnings() in code. + +- Deprecated features of xrange objects have been removed as + promised. The start, stop, and step attributes and the tolist() + method no longer exist. xrange repetition and slicing have been + removed. + +- New builtin function enumerate(x), from PEP 279. Example: + enumerate("abc") is an iterator returning (0,"a"), (1,"b"), (2,"c"). + The argument can be an arbitrary iterable object. + +- The assert statement no longer tests __debug__ at runtime. This means + that assert statements cannot be disabled by assigning a false value + to __debug__. + +- A method zfill() was added to str and unicode, that fills a numeric + string to the left with zeros. For example, + "+123".zfill(6) -> "+00123". + +- Complex numbers supported divmod() and the // and % operators, but + these make no sense. Since this was documented, they're being + deprecated now. + +- String and unicode methods lstrip(), rstrip() and strip() now take + an optional argument that specifies the characters to strip. For + example, "Foo!!!?!?!?".rstrip("?!") -> "Foo". + +- There's a new dictionary constructor (a class method of the dict + class), dict.fromkeys(iterable, value=None). It constructs a + dictionary with keys taken from the iterable and all values set to a + single value. It can be used for building sets and for removing + duplicates from sequences. + +- Added a new dict method pop(key). This removes and returns the + value corresponding to key. [SF patch #539949] + +- A new built-in type, bool, has been added, as well as built-in + names for its two values, True and False. Comparisons and sundry + other operations that return a truth value have been changed to + return a bool instead. Read PEP 285 for an explanation of why this + is backward compatible. + +- Fixed two bugs reported as SF #535905: under certain conditions, + deallocating a deeply nested structure could cause a segfault in the + garbage collector, due to interaction with the "trashcan" code; + access to the current frame during destruction of a local variable + could access a pointer to freed memory. + +- The optional object allocator ("pymalloc") has been enabled by + default. The recommended practice for memory allocation and + deallocation has been streamlined. A header file is included, + Misc/pymemcompat.h, which can be bundled with 3rd party extensions + and lets them use the same API with Python versions from 1.5.2 + onwards. + +- PyErr_Display will provide file and line information for all exceptions + that have an attribute print_file_and_line, not just SyntaxErrors. + +- The UTF-8 codec will now encode and decode Unicode surrogates + correctly and without raising exceptions for unpaired ones. + +- Universal newlines (PEP 278) is implemented. Briefly, using 'U' + instead of 'r' when opening a text file for reading changes the line + ending convention so that any of '\r', '\r\n', and '\n' is + recognized (even mixed in one file); all three are converted to + '\n', the standard Python line end character. + +- file.xreadlines() now raises a ValueError if the file is closed: + Previously, an xreadlines object was returned which would raise + a ValueError when the xreadlines.next() method was called. + +- sys.exit() inadvertently allowed more than one argument. + An exception will now be raised if more than one argument is used. + +- Changed evaluation order of dictionary literals to conform to the + general left to right evaluation order rule. Now {f1(): f2()} will + evaluate f1 first. + +- Fixed bug #521782: when a file was in non-blocking mode, file.read() + could silently lose data or wrongly throw an unknown error. + +- The sq_repeat, sq_inplace_repeat, sq_concat and sq_inplace_concat + slots are now always tried after trying the corresponding nb_* slots. + This fixes a number of minor bugs (see bug #624807). + +- Fix problem with dynamic loading on 64-bit AIX (see bug #639945). + +Extension modules +----------------- + +- Added three operators to the operator module: + operator.pow(a,b) which is equivalent to: a**b. + operator.is_(a,b) which is equivalent to: a is b. + operator.is_not(a,b) which is equivalent to: a is not b. + +- posix.openpty now works on all systems that have /dev/ptmx. + +- A module zipimport exists to support importing code from zip + archives. + +- The new datetime module supplies classes for manipulating dates and + times. The basic design came from the Zope "fishbowl process", and + favors practical commercial applications over calendar esoterica. See + + http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage + +- _tkinter now returns Tcl objects, instead of strings. Objects which + have Python equivalents are converted to Python objects, other objects + are wrapped. This can be configured through the wantobjects method, + or Tkinter.wantobjects. + +- The PyBSDDB wrapper around the Sleepycat Berkeley DB library has + been added as the package bsddb. The traditional bsddb module is + still available in source code, but not built automatically anymore, + and is now named bsddb185. This supports Berkeley DB versions from + 3.0 to 4.1. For help converting your databases from the old module (which + probably used an obsolete version of Berkeley DB) to the new module, see + the db2pickle.py and pickle2db.py scripts described in the Tools/Demos + section above. + +- unicodedata was updated to Unicode 3.2. It supports normalization + and names for Hangul syllables and CJK unified ideographs. + +- resource.getrlimit() now returns longs instead of ints. + +- readline now dynamically adjusts its input/output stream if + sys.stdin/stdout changes. + +- The _tkinter module (and hence Tkinter) has dropped support for + Tcl/Tk 8.0 and 8.1. Only Tcl/Tk versions 8.2, 8.3 and 8.4 are + supported. + +- cPickle.BadPickleGet is now a class. + +- The time stamps in os.stat_result are floating point numbers + after stat_float_times has been called. + +- If the size passed to mmap.mmap() is larger than the length of the + file on non-Windows platforms, a ValueError is raised. [SF bug 585792] + +- The xreadlines module is slated for obsolescence. + +- The strptime function in the time module is now always available (a + Python implementation is used when the C library doesn't define it). + +- The 'new' module is no longer an extension, but a Python module that + only exists for backwards compatibility. Its contents are no longer + functions but callable type objects. + +- The bsddb.*open functions can now take 'None' as a filename. + This will create a temporary in-memory bsddb that won't be + written to disk. + +- posix.getloadavg, posix.lchown, posix.killpg, posix.mknod, and + posix.getpgid have been added where available. + +- The locale module now exposes the C library's gettext interface. It + also has a new function getpreferredencoding. + +- A security hole ("double free") was found in zlib-1.1.3, a popular + third party compression library used by some Python modules. The + hole was quickly plugged in zlib-1.1.4, and the Windows build of + Python now ships with zlib-1.1.4. + +- pwd, grp, and resource return enhanced tuples now, with symbolic + field names. + +- array.array is now a type object. A new format character + 'u' indicates Py_UNICODE arrays. For those, .tounicode and + .fromunicode methods are available. Arrays now support __iadd__ + and __imul__. + +- dl now builds on every system that has dlfcn.h. Failure in case + of sizeof(int)!=sizeof(long)!=sizeof(void*) is delayed until dl.open + is called. + +- The sys module acquired a new attribute, api_version, which evaluates + to the value of the PYTHON_API_VERSION macro with which the + interpreter was compiled. + +- Fixed bug #470582: sre module would return a tuple (None, 'a', 'ab') + when applying the regular expression '^((a)c)?(ab)$' on 'ab'. It now + returns (None, None, 'ab'), as expected. Also fixed handling of + lastindex/lastgroup match attributes in similar cases. For example, + when running the expression r'(a)(b)?b' over 'ab', lastindex must be + 1, not 2. + +- Fixed bug #581080: sre scanner was not checking the buffer limit + before increasing the current pointer. This was creating an infinite + loop in the search function, once the pointer exceeded the buffer + limit. + +- The os.fdopen function now enforces a file mode starting with the + letter 'r', 'w' or 'a', otherwise a ValueError is raised. This fixes + bug #623464. + +- The linuxaudiodev module is now deprecated; it is being replaced by + ossaudiodev. The interface has been extended to cover a lot more of + OSS (see www.opensound.com), including most DSP ioctls and the + OSS mixer API. Documentation forthcoming in 2.3a2. + +Library +------- + +- imaplib.py now supports SSL (Tino Lange and Piers Lauder). + +- Freeze's modulefinder.py has been moved to the standard library; + slightly improved so it will issue less false missing submodule + reports (see sf path #643711 for details). Documentation will follow + with Python 2.3a2. + +- os.path exposes getctime. + +- unittest.py now has two additional methods called assertAlmostEqual() + and failIfAlmostEqual(). They implement an approximate comparison + by rounding the difference between the two arguments and comparing + the result to zero. Approximate comparison is essential for + unit tests of floating point results. + +- calendar.py now depends on the new datetime module rather than + the time module. As a result, the range of allowable dates + has been increased. + +- pdb has a new 'j(ump)' command to select the next line to be + executed. + +- The distutils created windows installers now can run a + postinstallation script. + +- doctest.testmod can now be called without argument, which means to + test the current module. + +- When canceling a server that implemented threading with a keyboard + interrupt, the server would shut down but not terminate (waiting on + client threads). A new member variable, daemon_threads, was added to + the ThreadingMixIn class in SocketServer.py to make it explicit that + this behavior needs to be controlled. + +- A new module, optparse, provides a fancy alternative to getopt for + command line parsing. It is a slightly modified version of Greg + Ward's Optik package. + +- UserDict.py now defines a DictMixin class which defines all dictionary + methods for classes that already have a minimum mapping interface. + This greatly simplifies writing classes that need to be substitutable + for dictionaries (such as the shelve module). + +- shelve.py now subclasses from UserDict.DictMixin. Now shelve supports + all dictionary methods. This eases the transition to persistent + storage for scripts originally written with dictionaries in mind. + +- shelve.open and the various classes in shelve.py now accept an optional + binary flag, which defaults to False. If True, the values stored in the + shelf are binary pickles. + +- A new package, logging, implements the logging API defined by PEP + 282. The code is written by Vinay Sajip. + +- StreamReader, StreamReaderWriter and StreamRecoder in the codecs + modules are iterators now. + +- gzip.py now handles files exceeding 2GB. Files over 4GB also work + now (provided the OS supports it, and Python is configured with large + file support), but in that case the underlying gzip file format can + record only the least-significant 32 bits of the file size, so that + some tools working with gzipped files may report an incorrect file + size. + +- xml.sax.saxutils.unescape has been added, to replace entity references + with their entity value. + +- Queue.Queue.{put,get} now support an optional timeout argument. + +- Various features of Tk 8.4 are exposed in Tkinter.py. The multiple + option of tkFileDialog is exposed as function askopenfile{,name}s. + +- Various configure methods of Tkinter have been stream-lined, so that + tag_configure, image_configure, window_configure now return a + dictionary when invoked with no argument. + +- Importing the readline module now no longer has the side effect of + calling setlocale(LC_CTYPE, ""). The initial "C" locale, or + whatever locale is explicitly set by the user, is preserved. If you + want repr() of 8-bit strings in your preferred encoding to preserve + all printable characters of that encoding, you have to add the + following code to your $PYTHONSTARTUP file or to your application's + main(): + + import locale + locale.setlocale(locale.LC_CTYPE, "") + +- shutil.move was added. shutil.copytree now reports errors as an + exception at the end, instead of printing error messages. + +- Encoding name normalization was generalized to not only + replace hyphens with underscores, but also all other non-alphanumeric + characters (with the exception of the dot which is used for Python + package names during lookup). The aliases.py mapping was updated + to the new standard. + +- mimetypes has two new functions: guess_all_extensions() which + returns a list of all known extensions for a mime type, and + add_type() which adds one mapping between a mime type and + an extension to the database. + +- New module: sets, defines the class Set that implements a mutable + set type using the keys of a dict to represent the set. There's + also a class ImmutableSet which is useful when you need sets of sets + or when you need to use sets as dict keys, and a class BaseSet which + is the base class of the two. + +- Added random.sample(population,k) for random sampling without replacement. + Returns a k length list of unique elements chosen from the population. + +- random.randrange(-sys.maxint-1, sys.maxint) no longer raises + OverflowError. That is, it now accepts any combination of 'start' + and 'stop' arguments so long as each is in the range of Python's + bounded integers. + +- Thanks to Raymond Hettinger, random.random() now uses a new core + generator. The Mersenne Twister algorithm is implemented in C, + threadsafe, faster than the previous generator, has an astronomically + large period (2**19937-1), creates random floats to full 53-bit + precision, and may be the most widely tested random number generator + in existence. + + The random.jumpahead(n) method has different semantics for the new + generator. Instead of jumping n steps ahead, it uses n and the + existing state to create a new state. This means that jumpahead() + continues to support multi-threaded code needing generators of + non-overlapping sequences. However, it will break code which relies + on jumpahead moving a specific number of steps forward. + + The attributes random.whseed and random.__whseed have no meaning for + the new generator. Code using these attributes should switch to a + new class, random.WichmannHill which is provided for backward + compatibility and to make an alternate generator available. + +- New "algorithms" module: heapq, implements a heap queue. Thanks to + Kevin O'Connor for the code and François Pinard for an entertaining + write-up explaining the theory and practical uses of heaps. + +- New encoding for the Palm OS character set: palmos. + +- binascii.crc32() and the zipfile module had problems on some 64-bit + platforms. These have been fixed. On a platform with 8-byte C longs, + crc32() now returns a signed-extended 4-byte result, so that its value + as a Python int is equal to the value computed a 32-bit platform. + +- xml.dom.minidom.toxml and toprettyxml now take an optional encoding + argument. + +- Some fixes in the copy module: when an object is copied through its + __reduce__ method, there was no check for a __setstate__ method on + the result [SF patch 565085]; deepcopy should treat instances of + custom metaclasses the same way it treats instances of type 'type' + [SF patch 560794]. + +- Sockets now support timeout mode. After s.settimeout(T), where T is + a float expressing seconds, subsequent operations raise an exception + if they cannot be completed within T seconds. To disable timeout + mode, use s.settimeout(None). There's also a module function, + socket.setdefaulttimeout(T), which sets the default for all sockets + created henceforth. + +- getopt.gnu_getopt was added. This supports GNU-style option + processing, where options can be mixed with non-option arguments. + +- Stop using strings for exceptions. String objects used for + exceptions are now classes deriving from Exception. The objects + changed were: Tkinter.TclError, bdb.BdbQuit, macpath.norm_error, + tabnanny.NannyNag, and xdrlib.Error. + +- Constants BOM_UTF8, BOM_UTF16, BOM_UTF16_LE, BOM_UTF16_BE, + BOM_UTF32, BOM_UTF32_LE and BOM_UTF32_BE that represent the Byte + Order Mark in UTF-8, UTF-16 and UTF-32 encodings for little and + big endian systems were added to the codecs module. The old names + BOM32_* and BOM64_* were off by a factor of 2. + +- Added conversion functions math.degrees() and math.radians(). + +- math.log() now takes an optional argument: math.log(x[, base]). + +- ftplib.retrlines() now tests for callback is None rather than testing + for False. Was causing an error when given a callback object which + was callable but also returned len() as zero. The change may + create new breakage if the caller relied on the undocumented behavior + and called with callback set to [] or some other False value not + identical to None. + +- random.gauss() uses a piece of hidden state used by nothing else, + and the .seed() and .whseed() methods failed to reset it. In other + words, setting the seed didn't completely determine the sequence of + results produced by random.gauss(). It does now. Programs repeatedly + mixing calls to a seed method with calls to gauss() may see different + results now. + +- The pickle.Pickler class grew a clear_memo() method to mimic that + provided by cPickle.Pickler. + +- difflib's SequenceMatcher class now does a dynamic analysis of + which elements are so frequent as to constitute noise. For + comparing files as sequences of lines, this generally works better + than the IS_LINE_JUNK function, and function ndiff's linejunk + argument defaults to None now as a result. A happy benefit is + that SequenceMatcher may run much faster now when applied + to large files with many duplicate lines (for example, C program + text with lots of repeated "}" and "return NULL;" lines). + +- New Text.dump() method in Tkinter module. + +- New distutils commands for building packagers were added to + support pkgtool on Solaris and swinstall on HP-UX. + +- distutils now has a new abstract binary packager base class + command/bdist_packager, which simplifies writing packagers. + This will hopefully provide the missing bits to encourage + people to submit more packagers, e.g. for Debian, FreeBSD + and other systems. + +- The UTF-16, -LE and -BE stream readers now raise a + NotImplementedError for all calls to .readline(). Previously, they + used to just produce garbage or fail with an encoding error -- + UTF-16 is a 2-byte encoding and the C lib's line reading APIs don't + work well with these. + +- compileall now supports quiet operation. + +- The BaseHTTPServer now implements optional HTTP/1.1 persistent + connections. + +- socket module: the SSL support was broken out of the main + _socket module C helper and placed into a new _ssl helper + which now gets imported by socket.py if available and working. + +- encodings package: added aliases for all supported IANA character + sets + +- ftplib: to safeguard the user's privacy, anonymous login will use + "anonymous@" as default password, rather than the real user and host + name. + +- webbrowser: tightened up the command passed to os.system() so that + arbitrary shell code can't be executed because a bogus URL was + passed in. + +- gettext.translation has an optional fallback argument, and + gettext.find an optional all argument. Translations will now fallback + on a per-message basis. The module supports plural forms, by means + of gettext.[d]ngettext and Translation.[u]ngettext. + +- distutils bdist commands now offer a --skip-build option. + +- warnings.warn now accepts a Warning instance as first argument. + +- The xml.sax.expatreader.ExpatParser class will no longer create + circular references by using itself as the locator that gets passed + to the content handler implementation. [SF bug #535474] + +- The email.Parser.Parser class now properly parses strings regardless + of their line endings, which can be any of \r, \n, or \r\n (CR, LF, + or CRLF). Also, the Header class's constructor default arguments + has changed slightly so that an explicit maxlinelen value is always + honored, and so unicode conversion error handling can be specified. + +- distutils' build_ext command now links C++ extensions with the C++ + compiler available in the Makefile or CXX environment variable, if + running under \*nix. + +- New module bz2: provides a comprehensive interface for the bz2 compression + library. It implements a complete file interface, one-shot (de)compression + functions, and types for sequential (de)compression. + +- New pdb command 'pp' which is like 'p' except that it pretty-prints + the value of its expression argument. + +- Now bdist_rpm distutils command understands a verify_script option in + the config file, including the contents of the referred filename in + the "%verifyscript" section of the rpm spec file. + +- Fixed bug #495695: webbrowser module would run graphic browsers in a + unix environment even if DISPLAY was not set. Also, support for + skipstone browser was included. + +- Fixed bug #636769: rexec would run unallowed code if subclasses of + strings were used as parameters for certain functions. + +Tools/Demos +----------- + +- pygettext.py now supports globbing on Windows, and accepts module + names in addition to accepting file names. + +- The SGI demos (Demo/sgi) have been removed. Nobody thought they + were interesting any more. (The SGI library modules and extensions + are still there; it is believed that at least some of these are + still used and useful.) + +- IDLE supports the new encoding declarations (PEP 263); it can also + deal with legacy 8-bit files if they use the locale's encoding. It + allows non-ASCII strings in the interactive shell and executes them + in the locale's encoding. + +- freeze.py now produces binaries which can import shared modules, + unlike before when this failed due to missing symbol exports in + the generated binary. + +Build +----- + +- On Unix, IDLE is now installed automatically. + +- The fpectl module is not built by default; it's dangerous or useless + except in the hands of experts. + +- The public Python C API will generally be declared using PyAPI_FUNC + and PyAPI_DATA macros, while Python extension module init functions + will be declared with PyMODINIT_FUNC. DL_EXPORT/DL_IMPORT macros + are deprecated. + +- A bug was fixed that could cause COUNT_ALLOCS builds to segfault, or + get into infinite loops, when a new-style class got garbage-collected. + Unfortunately, to avoid this, the way COUNT_ALLOCS works requires + that new-style classes be immortal in COUNT_ALLOCS builds. Note that + COUNT_ALLOCS is not enabled by default, in either release or debug + builds, and that new-style classes are immortal only in COUNT_ALLOCS + builds. + +- Compiling out the cyclic garbage collector is no longer an option. + The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges + that it's always defined (for the benefit of any extension modules + that may be conditionalizing on it). A bonus is that any extension + type participating in cyclic gc can choose to participate in the + Py_TRASHCAN mechanism now too; in the absence of cyclic gc, this used + to require editing the core to teach the trashcan mechanism about the + new type. + +- According to Annex F of the current C standard, + + The Standard C macro HUGE_VAL and its float and long double analogs, + HUGE_VALF and HUGE_VALL, expand to expressions whose values are + positive infinities. + + Python only uses the double HUGE_VAL, and only to #define its own symbol + Py_HUGE_VAL. Some platforms have incorrect definitions for HUGE_VAL. + pyport.h used to try to worm around that, but the workarounds triggered + other bugs on other platforms, so we gave up. If your platform defines + HUGE_VAL incorrectly, you'll need to #define Py_HUGE_VAL to something + that works on your platform. The only instance of this I'm sure about + is on an unknown subset of Cray systems, described here: + + http://www.cray.com/swpubs/manuals/SN-2194_2.0/html-SN-2194_2.0/x3138.htm + + Presumably 2.3a1 breaks such systems. If anyone uses such a system, help! + +- The configure option --without-doc-strings can be used to remove the + doc strings from the builtin functions and modules; this reduces the + size of the executable. + +- The universal newlines option (PEP 278) is on by default. On Unix + it can be disabled by passing --without-universal-newlines to the + configure script. On other platforms, remove + WITH_UNIVERSAL_NEWLINES from pyconfig.h. + +- On Unix, a shared libpython2.3.so can be created with --enable-shared. + +- All uses of the CACHE_HASH, INTERN_STRINGS, and DONT_SHARE_SHORT_STRINGS + preprocessor symbols were eliminated. The internal decisions they + controlled stopped being experimental long ago. + +- The tools used to build the documentation now work under Cygwin as + well as Unix. + +- The bsddb and dbm module builds have been changed to try and avoid version + skew problems and disable linkage with Berkeley DB 1.85 unless the + installer knows what s/he's doing. See the section on building these + modules in the README file for details. + +C API +----- + +- PyNumber_Check() now returns true for string and unicode objects. + This is a result of these types having a partially defined + tp_as_number slot. (This is not a feature, but an indication that + PyNumber_Check() is not very useful to determine numeric behavior. + It may be deprecated.) + +- The string object's layout has changed: the pointer member + ob_sinterned has been replaced by an int member ob_sstate. On some + platforms (e.g. most 64-bit systems) this may change the offset of + the ob_sval member, so as a precaution the API_VERSION has been + incremented. The apparently unused feature of "indirect interned + strings", supported by the ob_sinterned member, is gone. Interned + strings are now usually mortal; there is a new API, + PyString_InternImmortal() that creates immortal interned strings. + (The ob_sstate member can only take three values; however, while + making it a char saves a few bytes per string object on average, in + it also slowed things down a bit because ob_sval was no longer + aligned.) + +- The Py_InitModule*() functions now accept NULL for the 'methods' + argument. Modules without global functions are becoming more common + now that factories can be types rather than functions. + +- New C API PyUnicode_FromOrdinal() which exposes unichr() at C + level. + +- New functions PyErr_SetExcFromWindowsErr() and + PyErr_SetExcFromWindowsErrWithFilename(). Similar to + PyErr_SetFromWindowsErrWithFilename() and + PyErr_SetFromWindowsErr(), but they allow to specify + the exception type to raise. Available on Windows. + +- Py_FatalError() is now declared as taking a const char* argument. It + was previously declared without const. This should not affect working + code. + +- Added new macro PySequence_ITEM(o, i) that directly calls + sq_item without rechecking that o is a sequence and without + adjusting for negative indices. + +- PyRange_New() now raises ValueError if the fourth argument is not 1. + This is part of the removal of deprecated features of the xrange + object. + +- PyNumber_Coerce() and PyNumber_CoerceEx() now also invoke the type's + coercion if both arguments have the same type but this type has the + CHECKTYPES flag set. This is to better support proxies. + +- The type of tp_free has been changed from "``void (*)(PyObject *)``" to + "``void (*)(void *)``". + +- PyObject_Del, PyObject_GC_Del are now functions instead of macros. + +- A type can now inherit its metatype from its base type. Previously, + when PyType_Ready() was called, if ob_type was found to be NULL, it + was always set to &PyType_Type; now it is set to base->ob_type, + where base is tp_base, defaulting to &PyObject_Type. + +- PyType_Ready() accidentally did not inherit tp_is_gc; now it does. + +- The PyCore_* family of APIs have been removed. + +- The "u#" parser marker will now pass through Unicode objects as-is + without going through the buffer API. + +- The enumerators of cmp_op have been renamed to use the prefix ``PyCmp_``. + +- An old #define of ANY as void has been removed from pyport.h. This + hasn't been used since Python's pre-ANSI days, and the #define has + been marked as obsolete since then. SF bug 495548 says it created + conflicts with other packages, so keeping it around wasn't harmless. + +- Because Python's magic number scheme broke on January 1st, we decided + to stop Python development. Thanks for all the fish! + +- Some of us don't like fish, so we changed Python's magic number + scheme to a new one. See Python/import.c for details. + +New platforms +------------- + +- OpenVMS is now supported. + +- AtheOS is now supported. + +- the EMX runtime environment on OS/2 is now supported. + +- GNU/Hurd is now supported. + +Tests +----- + +- The regrtest.py script's -u option now provides a way to say "allow + all resources except this one." For example, to allow everything + except bsddb, give the option '-uall,-bsddb'. + +Windows +------- + +- The Windows distribution now ships with version 4.0.14 of the + Sleepycat Berkeley database library. This should be a huge + improvement over the previous Berkeley DB 1.85, which had many + bugs. + XXX What are the licensing issues here? + XXX If a user has a database created with a previous version of + XXX Python, what must they do to convert it? + XXX I'm still not sure how to link this thing (see PCbuild/readme.txt). + XXX The version # is likely to change before 2.3a1. + +- The Windows distribution now ships with a Secure Sockets Library (SLL) + module (_ssl.pyd) + +- The Windows distribution now ships with Tcl/Tk version 8.4.1 (it + previously shipped with Tcl/Tk 8.3.2). + +- When Python is built under a Microsoft compiler, sys.version now + includes the compiler version number (_MSC_VER). For example, under + MSVC 6, sys.version contains the substring "MSC v.1200 ". 1200 is + the value of _MSC_VER under MSVC 6. + +- Sometimes the uninstall executable (UNWISE.EXE) vanishes. One cause + of that has been fixed in the installer (disabled Wise's "delete in- + use files" uninstall option). + +- Fixed a bug in urllib's proxy handling in Windows. [SF bug #503031] + +- The installer now installs Start menu shortcuts under (the local + equivalent of) "All Users" when doing an Admin install. + +- file.truncate([newsize]) now works on Windows for all newsize values. + It used to fail if newsize didn't fit in 32 bits, reflecting a + limitation of MS _chsize (which is no longer used). + +- os.waitpid() is now implemented for Windows, and can be used to block + until a specified process exits. This is similar to, but not exactly + the same as, os.waitpid() on POSIX systems. If you're waiting for + a specific process whose pid was obtained from one of the spawn() + functions, the same Python os.waitpid() code works across platforms. + See the docs for details. The docs were changed to clarify that + spawn functions return, and waitpid requires, a process handle on + Windows (not the same thing as a Windows process id). + +- New tempfile.TemporaryFile implementation for Windows: this doesn't + need a TemporaryFileWrapper wrapper anymore, and should be immune + to a nasty problem: before 2.3, if you got a temp file on Windows, it + got wrapped in an object whose close() method first closed the + underlying file, then deleted the file. This usually worked fine. + However, the spawn family of functions on Windows create (at a low C + level) the same set of open files in the spawned process Q as were + open in the spawning process P. If a temp file f was among them, then + doing f.close() in P first closed P's C-level file handle on f, but Q's + C-level file handle on f remained open, so the attempt in P to delete f + blew up with a "Permission denied" error (Windows doesn't allow + deleting open files). This was surprising, subtle, and difficult to + work around. + +- The os module now exports all the symbolic constants usable with the + low-level os.open() on Windows: the new constants in 2.3 are + O_NOINHERIT, O_SHORT_LIVED, O_TEMPORARY, O_RANDOM and O_SEQUENTIAL. + The others were also available in 2.2: O_APPEND, O_BINARY, O_CREAT, + O_EXCL, O_RDONLY, O_RDWR, O_TEXT, O_TRUNC and O_WRONLY. Contrary + to Microsoft docs, O_SHORT_LIVED does not seem to imply O_TEMPORARY + (so specify both if you want both; note that neither is useful unless + specified with O_CREAT too). + +Mac +---- + +- Mac/Relnotes is gone, the release notes are now here. + +- Python (the OSX-only, unix-based version, not the OS9-compatible CFM + version) now fully supports unicode strings as arguments to various file + system calls, eg. open(), file(), os.stat() and os.listdir(). + +- The current naming convention for Python on the Macintosh is that MacPython + refers to the unix-based OSX-only version, and MacPython-OS9 refers to the + CFM-based version that runs on both OS9 and OSX. + +- All MacPython-OS9 functionality is now available in an OSX unix build, + including the Carbon modules, the IDE, OSA support, etc. A lot of this + will only work correctly in a framework build, though, because you cannot + talk to the window manager unless your application is run from a .app + bundle. There is a command line tool "pythonw" that runs your script + with an interpreter living in such a .app bundle, this interpreter should + be used to run any Python script using the window manager (including + Tkinter or wxPython scripts). + +- Most of Mac/Lib has moved to Lib/plat-mac, which is again used both in + MacPython-OSX and MacPython-OS9. The only modules remaining in Mac/Lib + are specifically for MacPython-OS9 (CFM support, preference resources, etc). + +- A new utility PythonLauncher will start a Python interpreter when a .py or + .pyw script is double-clicked in the Finder. By default .py scripts are + run with a normal Python interpreter in a Terminal window and .pyw + files are run with a window-aware pythonw interpreter without a Terminal + window, but all this can be customized. + +- MacPython-OS9 is now Carbon-only, so it runs on Mac OS 9 or Mac OS X and + possibly on Mac OS 8.6 with the right CarbonLib installed, but not on earlier + releases. + +- Many tools such as BuildApplet.py and gensuitemodule.py now support a command + line interface too. + +- All the Carbon classes are now PEP253 compliant, meaning that you can + subclass them from Python. Most of the attributes have gone, you should + now use the accessor function call API, which is also what Apple's + documentation uses. Some attributes such as grafport.visRgn are still + available for convenience. + +- New Carbon modules File (implementing the APIs in Files.h and Aliases.h) + and Folder (APIs from Folders.h). The old macfs builtin module is + gone, and replaced by a Python wrapper around the new modules. + +- Pathname handling should now be fully consistent: MacPython-OSX always uses + unix pathnames and MacPython-OS9 always uses colon-separated Mac pathnames + (also when running on Mac OS X). + +- New Carbon modules Help and AH give access to the Carbon Help Manager. + There are hooks in the IDE to allow accessing the Python documentation + (and Apple's Carbon and Cocoa documentation) through the Help Viewer. + See Mac/OSX/README for converting the Python documentation to a + Help Viewer compatible form and installing it. + +- OSA support has been redesigned and the generated Python classes now + mirror the inheritance defined by the underlying OSA classes. + +- MacPython no longer maps both \r and \n to \n on input for any text file. + This feature has been replaced by universal newline support (PEP278). + +- The default encoding for Python sourcefiles in MacPython-OS9 is no longer + mac-roman (or whatever your local Mac encoding was) but "ascii", like on + other platforms. If you really need sourcefiles with Mac characters in them + you can change this in site.py. + + +What's New in Python 2.2 final? +=============================== + +*Release date: 21-Dec-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- pickle.py, cPickle: allow pickling instances of new-style classes + with a custom metaclass. + +Core and builtins +----------------- + +- weakref proxy object: when comparing, unwrap both arguments if both + are proxies. + +Extension modules +----------------- + +- binascii.b2a_base64(): fix a potential buffer overrun when encoding + very short strings. + +- cPickle: the obscure "fast" mode was suspected of causing stack + overflows on the Mac. Hopefully fixed this by setting the recursion + limit much smaller. If the limit is too low (it only affects + performance), you can change it by defining PY_CPICKLE_FAST_LIMIT + when compiling cPickle.c (or in pyconfig.h). + +Library +------- + +- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at + close or delete time). + +- rfc822.py: fixed a bug where the address '<>' was converted to None + instead of an empty string (also fixes the email.Utils module). + +- xmlrpclib.py: version 1.0.0; uses precision for doubles. + +- test suite: the pickle and cPickle tests were not executing any code + when run from the standard regression test. + +Tools/Demos +----------- + +Build +----- + +C API +----- + +New platforms +------------- + +Tests +----- + +Windows +------- + +- distutils package: fixed broken Windows installers (bdist_wininst). + +- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper + instances are deleted at process exit time. + +- socket.py: prevent mysterious warnings when socket instances are + deleted at process exit time. + +- posixmodule.c: fix a Windows crash with stat() of a filename ending + in backslash. + +Mac +---- + +- The Carbon toolbox modules have been upgraded to Universal Headers + 3.4, and experimental CoreGraphics and CarbonEvents modules have + been added. All only for framework-enabled MacOSX. + + +What's New in Python 2.2c1? +=========================== + +*Release date: 14-Dec-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- Guido's tutorial introduction to the new type/class features has + been extensively updated. See + + http://www.python.org/2.2/descrintro.html + + That remains the primary documentation in this area. + +- Fixed a leak: instance variables declared with __slots__ were never + deleted! + +- The "delete attribute" method of descriptor objects is called + __delete__, not __del__. In previous releases, it was mistakenly + called __del__, which created an unfortunate overloading condition + with finalizers. (The "get attribute" and "set attribute" methods + are still called __get__ and __set__, respectively.) + +- Some subtle issues with the super built-in were fixed: + + (a) When super itself is subclassed, its __get__ method would still + return an instance of the base class (i.e., of super). + + (b) super(C, C()).__class__ would return C rather than super. This + is confusing. To fix this, I decided to change the semantics of + super so that it only applies to code attributes, not to data + attributes. After all, overriding data attributes is not + supported anyway. + + (c) The __get__ method didn't check whether the argument was an + instance of the type used in creation of the super instance. + +- Previously, hash() of an instance of a subclass of a mutable type + (list or dictionary) would return some value, rather than raising + TypeError. This has been fixed. Also, directly calling + dict.__hash__ and list.__hash__ now raises the same TypeError + (previously, these were the same as object.__hash__). + +- New-style objects now support deleting their __dict__. This is for + all intents and purposes equivalent to assigning a brand new empty + dictionary, but saves space if the object is not used further. + +Core and builtins +----------------- + +- -Qnew now works as documented in PEP 238: when -Qnew is passed on + the command line, all occurrences of "/" use true division instead + of classic division. See the PEP for details. Note that "all" + means all instances in library and 3rd-party modules, as well as in + your own code. As the PEP says, -Qnew is intended for use only in + educational environments with control over the libraries in use. + Note that test_coercion.py in the standard Python test suite fails + under -Qnew; this is expected, and won't be repaired until true + division becomes the default (in the meantime, test_coercion is + testing the current rules). + +- complex() now only allows the first argument to be a string + argument, and raises TypeError if either the second arg is a string + or if the second arg is specified when the first is a string. + +Extension modules +----------------- + +- gc.get_referents was renamed to gc.get_referrers. + +Library +------- + +- Functions in the os.spawn() family now release the global interpreter + lock around calling the platform spawn. They should always have done + this, but did not before 2.2c1. Multithreaded programs calling + an os.spawn function with P_WAIT will no longer block all Python threads + until the spawned program completes. It's possible that some programs + relies on blocking, although more likely by accident than by design. + +- webbrowser defaults to netscape.exe on OS/2 now. + +- Tix.ResizeHandle exposes detach_widget, hide, and show. + +- The charset alias windows_1252 has been added. + +- types.StringTypes is a tuple containing the defined string types; + usually this will be (str, unicode), but if Python was compiled + without Unicode support it will be just (str,). + +- The pulldom and minidom modules were synchronized to PyXML. + +Tools/Demos +----------- + +- A new script called Tools/scripts/google.py was added, which fires + off a search on Google. + +Build +----- + +- Note that release builds of Python should arrange to define the + preprocessor symbol NDEBUG on the command line (or equivalent). + In the 2.2 pre-release series we tried to define this by magic in + Python.h instead, but it proved to cause problems for extension + authors. The Unix, Windows and Mac builds now all define NDEBUG in + release builds via cmdline (or equivalent) instead. Ports to + other platforms should do likewise. + +- It is no longer necessary to use --with-suffix when building on a + case-insensitive file system (such as Mac OS X HFS+). In the build + directory an extension is used, but not in the installed python. + +C API +----- + +- New function PyDict_MergeFromSeq2() exposes the builtin dict + constructor's logic for updating a dictionary from an iterable object + producing key-value pairs. + +- PyArg_ParseTupleAndKeywords() requires that the number of entries in + the keyword list equal the number of argument specifiers. This + wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even + dump core in some bad cases. This has been repaired. As a result, + PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that + previously went unchallenged. + +New platforms +------------- + +Tests +----- + +Windows +------- + +Mac +---- + +- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin", + without any trailing digits. + +- Changed logic for finding python home in Mac OS X framework Pythons. + Now sys.executable points to the executable again, in stead of to + the shared library. The latter is used only for locating the python + home. + + +What's New in Python 2.2b2? +=========================== + +*Release date: 16-Nov-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- Multiple inheritance mixing new-style and classic classes in the + list of base classes is now allowed, so this works now: + + class Classic: pass + class Mixed(Classic, object): pass + + The MRO (method resolution order) for each base class is respected + according to its kind, but the MRO for the derived class is computed + using new-style MRO rules if any base class is a new-style class. + This needs to be documented. + +- The new builtin dictionary() constructor, and dictionary type, have + been renamed to dict. This reflects a decade of common usage. + +- dict() now accepts an iterable object producing 2-sequences. For + example, dict(d.items()) == d for any dictionary d. The argument, + and the elements of the argument, can be any iterable objects. + +- New-style classes can now have a __del__ method, which is called + when the instance is deleted (just like for classic classes). + +- Assignment to object.__dict__ is now possible, for objects that are + instances of new-style classes that have a __dict__ (unless the base + class forbids it). + +- Methods of built-in types now properly check for keyword arguments + (formerly these were silently ignored). The only built-in methods + that take keyword arguments are __call__, __init__ and __new__. + +- The socket function has been converted to a type; see below. + +Core and builtins +----------------- + +- Assignment to __debug__ raises SyntaxError at compile-time. This + was promised when 2.1c1 was released as "What's New in Python 2.1c1" + (see below) says. + +- Clarified the error messages for unsupported operands to an operator + (like 1 + ''). + +Extension modules +----------------- + +- mmap has a new keyword argument, "access", allowing a uniform way for + both Windows and Unix users to create read-only, write-through and + copy-on-write memory mappings. This was previously possible only on + Unix. A new keyword argument was required to support this in a + uniform way because the mmap() signatures had diverged across + platforms. Thanks to Jay T Miller for repairing this! + +- By default, the gc.garbage list now contains only those instances in + unreachable cycles that have __del__ methods; in 2.1 it contained all + instances in unreachable cycles. "Instances" here has been generalized + to include instances of both new-style and old-style classes. + +- The socket module defines a new method for socket objects, + sendall(). This is like send() but may make multiple calls to + send() until all data has been sent. Also, the socket function has + been converted to a subclassable type, like list and tuple (etc.) + before it; socket and SocketType are now the same thing. + +- Various bugfixes to the curses module. There is now a test suite + for the curses module (you have to run it manually). + +- binascii.b2a_base64 no longer places an arbitrary restriction of 57 + bytes on its input. + +Library +------- + +- tkFileDialog exposes a Directory class and askdirectory + convenience function. + +- Symbolic group names in regular expressions must be unique. For + example, the regexp r'(?P)(?P)' is not allowed, because a + single name can't mean both "group 1" and "group 2" simultaneously. + Python 2.2 detects this error at regexp compilation time; + previously, the error went undetected, and results were + unpredictable. Also in sre, the pattern.split(), pattern.sub(), and + pattern.subn() methods have been rewritten in C. Also, an + experimental function/method finditer() has been added, which works + like findall() but returns an iterator. + +- Tix exposes more commands through the classes DirSelectBox, + DirSelectDialog, ListNoteBook, Meter, CheckList, and the + methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, + tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. + +- Traceback objects are now scanned by cyclic garbage collection, so + cycles created by casual use of sys.exc_info() no longer cause + permanent memory leaks (provided garbage collection is enabled). + +- os.extsep -- a new variable needed by the RISCOS support. It is the + separator used by extensions, and is '.' on all platforms except + RISCOS, where it is '/'. There is no need to use this variable + unless you have a masochistic desire to port your code to RISCOS. + +- mimetypes.py has optional support for non-standard, but commonly + found types. guess_type() and guess_extension() now accept an + optional 'strict' flag, defaulting to true, which controls whether + recognize non-standard types or not. A few non-standard types we + know about have been added. Also, when run as a script, there are + new -l and -e options. + +- statcache is now deprecated. + +- email.Utils.formatdate() now produces the preferred RFC 2822 style + dates with numeric timezones (it used to produce obsolete dates + hard coded to "GMT" timezone). An optional 'localtime' flag is + added to produce dates in the local timezone, with daylight savings + time properly taken into account. + +- In pickle and cPickle, instead of masking errors in load() by + transforming them into SystemError, we let the original exception + propagate out. Also, implement support for __safe_for_unpickling__ + in pickle, as it already was supported in cPickle. + +Tools/Demos +----------- + +Build +----- + +- The dbm module is built using libdb1 if available. The bsddb module + is built with libdb3 if available. + +- Misc/Makefile.pre.in has been removed by BDFL pronouncement. + +C API +----- + +- New function PySequence_Fast_GET_SIZE() returns the size of a non- + NULL result from PySequence_Fast(), more quickly than calling + PySequence_Size(). + +- New argument unpacking function PyArg_UnpackTuple() added. + +- New functions PyObject_CallFunctionObjArgs() and + PyObject_CallMethodObjArgs() have been added to make it more + convenient and efficient to call functions and methods from C. + +- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's + possible that this will propagate errors it didn't before. + +- New function PyObject_CheckReadBuffer(), which returns true if its + argument supports the single-segment readable buffer interface. + +New platforms +------------- + +- We've finally confirmed that this release builds on HP-UX 11.00, + *with* threads, and passes the test suite. + +- Thanks to a series of patches from Michael Muller, Python may build + again under OS/2 Visual Age C++. + +- Updated RISCOS port by Dietmar Schwertberger. + +Tests +----- + +- Added a test script for the curses module. It isn't run automatically; + regrtest.py must be run with '-u curses' to enable it. + +Windows +------- + +Mac +---- + +- PythonScript has been moved to unsupported and is slated to be + removed completely in the next release. + +- It should now be possible to build applets that work on both OS9 and + OSX. + +- The core is now linked with CoreServices not Carbon; as a side + result, default 8bit encoding on OSX is now ASCII. + +- Python should now build on OSX 10.1.1 + + +What's New in Python 2.2b1? +=========================== + +*Release date: 19-Oct-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- New-style classes are now always dynamic (except for built-in and + extension types). There is no longer a performance penalty, and I + no longer see another reason to keep this baggage around. One relic + remains: the __dict__ of a new-style class is a read-only proxy; you + must set the class's attribute to modify it. As a consequence, the + __defined__ attribute of new-style types no longer exists, for lack + of need: there is once again only one __dict__ (although in the + future a __cache__ may be resurrected with a similar function, if I + can prove that it actually speeds things up). + +- C.__doc__ now works as expected for new-style classes (in 2.2a4 it + always returned None, even when there was a class docstring). + +- doctest now finds and runs docstrings attached to new-style classes, + class methods, static methods, and properties. + +Core and builtins +----------------- + +- A very subtle syntactical pitfall in list comprehensions was fixed. + For example: [a+b for a in 'abc', for b in 'def']. The comma in + this example is a mistake. Previously, this would silently let 'a' + iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce', + 'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be', + 'bf', 'cd', 'ce', 'cf']. Now, this is flagged as a syntax error. + Note that [a for a in ] is a convoluted way to say + [] anyway, so it's not like any expressiveness is lost. + +- getattr(obj, name, default) now only catches AttributeError, as + documented, rather than returning the default value for all + exceptions (which could mask bugs in a __getattr__ hook, for + example). + +- Weak reference objects are now part of the core and offer a C API. + A bug which could allow a core dump when binary operations involved + proxy reference has been fixed. weakref.ReferenceError is now a + built-in exception. + +- unicode(obj) now behaves more like str(obj), accepting arbitrary + objects, and calling a __unicode__ method if it exists. + unicode(obj, encoding) and unicode(obj, encoding, errors) still + require an 8-bit string or character buffer argument. + +- isinstance() now allows any object as the first argument and a + class, a type or something with a __bases__ tuple attribute for the + second argument. The second argument may also be a tuple of a + class, type, or something with __bases__, in which case isinstance() + will return true if the first argument is an instance of any of the + things contained in the second argument tuple. E.g. + + isinstance(x, (A, B)) + + returns true if x is an instance of A or B. + +Extension modules +----------------- + +- thread.start_new_thread() now returns the thread ID (previously None). + +- binascii has now two quopri support functions, a2b_qp and b2a_qp. + +- readline now supports setting the startup_hook and the + pre_event_hook, and adds the add_history() function. + +- os and posix supports chroot(), setgroups() and unsetenv() where + available. The stat(), fstat(), statvfs() and fstatvfs() functions + now return "pseudo-sequences" -- the various fields can now be + accessed as attributes (e.g. os.stat("/").st_mtime) but for + backwards compatibility they also behave as a fixed-length sequence. + Some platform-specific fields (e.g. st_rdev) are only accessible as + attributes. + +- time: localtime(), gmtime() and strptime() now return a + pseudo-sequence similar to the os.stat() return value, with + attributes like tm_year etc. + +- Decompression objects in the zlib module now accept an optional + second parameter to decompress() that specifies the maximum amount + of memory to use for the uncompressed data. + +- optional SSL support in the socket module now exports OpenSSL + functions RAND_add(), RAND_egd(), and RAND_status(). These calls + are useful on platforms like Solaris where OpenSSL does not + automatically seed its PRNG. Also, the keyfile and certfile + arguments to socket.ssl() are now optional. + +- posixmodule (and by extension, the os module on POSIX platforms) now + exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW. + +Library +------- + +- doctest now excludes functions and classes not defined by the module + being tested, thanks to Tim Hochberg. + +- HotShot, a new profiler implemented using a C-based callback, has + been added. This substantially reduces the overhead of profiling, + but it is still quite preliminary. Support modules and + documentation will be added in upcoming releases (before 2.2 final). + +- profile now produces correct output in situations where an exception + raised in Python is cleared by C code (e.g. hasattr()). This used + to cause wrong output, including spurious claims of recursive + functions and attribution of time spent to the wrong function. + + The code and documentation for the derived OldProfile and HotProfile + profiling classes was removed. The code hasn't worked for years (if + you tried to use them, they raised exceptions). OldProfile + intended to reproduce the behavior of the profiler Python used more + than 7 years ago, and isn't interesting anymore. HotProfile intended + to provide a faster profiler (but producing less information), and + that's a worthy goal we intend to meet via a different approach (but + without losing information). + +- Profile.calibrate() has a new implementation that should deliver + a much better system-specific calibration constant. The constant can + now be specified in an instance constructor, or as a Profile class or + instance variable, instead of by editing profile.py's source code. + Calibration must still be done manually (see the docs for the profile + module). + + Note that Profile.calibrate() must be overridden by subclasses. + Improving the accuracy required exploiting detailed knowledge of + profiler internals; the earlier method abstracted away the details + and measured a simplified model instead, but consequently computed + a constant too small by a factor of 2 on some modern machines. + +- quopri's encode and decode methods take an optional header parameter, + which indicates whether output is intended for the header 'Q' + encoding. + +- The SocketServer.ThreadingMixIn class now closes the request after + finish_request() returns. (Not when it errors out though.) + +- The nntplib module's NNTP.body() method has grown a 'file' argument + to allow saving the message body to a file. + +- The email package has added a class email.Parser.HeaderParser which + only parses headers and does not recurse into the message's body. + Also, the module/class MIMEAudio has been added for representing + audio data (contributed by Anthony Baxter). + +- ftplib should be able to handle files > 2GB. + +- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO, + ON, and OFF. + +- xml.dom.minidom NodeList objects now support the length attribute + and item() method as required by the DOM specifications. + +Tools/Demos +----------- + +- Demo/dns was removed. It no longer serves any purpose; a package + derived from it is now maintained by Anthony Baxter, see + http://PyDNS.SourceForge.net. + +- The freeze tool has been made more robust, and two new options have + been added: -X and -E. + +Build +----- + +- configure will use CXX in LINKCC if CXX is used to build main() and + the system requires to link a C++ main using the C++ compiler. + +C API +----- + +- The documentation for the tp_compare slot is updated to require that + the return value must be -1, 0, 1; an arbitrary number <0 or >0 is + not correct. This is not yet enforced but will be enforced in + Python 2.3; even later, we may use -2 to indicate errors and +2 for + "NotImplemented". Right now, -1 should be used for an error return. + +- PyLong_AsLongLong() now accepts int (as well as long) arguments. + Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well + as long) arguments. + +- PyThread_start_new_thread() now returns a long int giving the thread + ID, if one can be calculated; it returns -1 for error, 0 if no + thread ID is calculated (this is an incompatible change, but only + the thread module used this API). This code has only really been + tested on Linux and Windows; other platforms please beware (and + report any bugs or strange behavior). + +- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as + input. + +New platforms +------------- + +Tests +----- + +Windows +------- + +- Installer: If you install IDLE, and don't disable file-extension + registration, a new "Edit with IDLE" context (right-click) menu entry + is created for .py and .pyw files. + +- The signal module now supports SIGBREAK on Windows, thanks to Steven + Scott. Note that SIGBREAK is unique to Windows. The default SIGBREAK + action remains to call Win32 ExitProcess(). This can be changed via + signal.signal(). For example:: + + # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C + # (SIGINT) behavior. + import signal + signal.signal(signal.SIGBREAK, signal.default_int_handler) + + try: + while 1: + pass + except KeyboardInterrupt: + # We get here on Ctrl+C or Ctrl+Break now; if we had not changed + # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the + # program without the possibility for any Python-level cleanup). + print "Clean exit" + + +What's New in Python 2.2a4? +=========================== + +*Release date: 28-Sep-2001* + +Type/class unification and new-style classes +-------------------------------------------- + +- pydoc and inspect are now aware of new-style classes; + e.g. help(list) at the interactive prompt now shows proper + documentation for all operations on list objects. + +- Applications using Jim Fulton's ExtensionClass module can now safely + be used with Python 2.2. In particular, Zope 2.4.1 now works with + Python 2.2 (as well as with Python 2.1.1). The Demo/metaclass + examples also work again. It is hoped that Gtk and Boost also work + with 2.2a4 and beyond. (If you can confirm this, please write + webmaster at python.org; if there are still problems, please open a bug + report on SourceForge.) + +- property() now takes 4 keyword arguments: fget, fset, fdel and doc. + These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__' + in the constructed property object. fget, fset and fdel weren't + discoverable from Python in 2.2a3. __doc__ is new, and allows to + associate a docstring with a property. + +- Comparison overloading is now more completely implemented. For + example, a str subclass instance can properly be compared to a str + instance, and it can properly overload comparison. Ditto for most + other built-in object types. + +- The repr() of new-style classes has changed; instead of a new-style class is now rendered as , + *except* for built-in types, which are still rendered as (to avoid upsetting existing code that might parse or + otherwise rely on repr() of certain type objects). + +- The repr() of new-style objects is now always ; + previously, it was sometimes . + +- For new-style classes, what was previously called __getattr__ is now + called __getattribute__. This method, if defined, is called for + *every* attribute access. A new __getattr__ hook more similar to the + one in classic classes is defined which is called only if regular + attribute access raises AttributeError; to catch *all* attribute + access, you can use __getattribute__ (for new-style classes). If + both are defined, __getattribute__ is called first, and if it raises + AttributeError, __getattr__ is called. + +- The __class__ attribute of new-style objects can be assigned to. + The new class must have the same C-level object layout as the old + class. + +- The builtin file type can be subclassed now. In the usual pattern, + "file" is the name of the builtin type, and file() is a new builtin + constructor, with the same signature as the builtin open() function. + file() is now the preferred way to open a file. + +- Previously, __new__ would only see sequential arguments passed to + the type in a constructor call; __init__ would see both sequential + and keyword arguments. This made no sense whatsoever any more, so + now both __new__ and __init__ see all arguments. + +- Previously, hash() applied to an instance of a subclass of str or + unicode always returned 0. This has been repaired. + +- Previously, an operation on an instance of a subclass of an + immutable type (int, long, float, complex, tuple, str, unicode), + where the subtype didn't override the operation (and so the + operation was handled by the builtin type), could return that + instance instead a value of the base type. For example, if s was of + a str subclass type, s[:] returned s as-is. Now it returns a str + with the same value as s. + +- Provisional support for pickling new-style objects has been added. + +Core +---- + +- file.writelines() now accepts any iterable object producing strings. + +- PyUnicode_FromEncodedObject() now works very much like + PyObject_Str(obj) in that it tries to use __str__/tp_str + on the object if the object is not a string or buffer. This + makes unicode() behave like str() when applied to non-string/buffer + objects. + +- PyFile_WriteObject now passes Unicode objects to the file's write + method. As a result, all file-like objects which may be the target + of a print statement must support Unicode objects, i.e. they must + at least convert them into ASCII strings. + +- Thread scheduling on Solaris should be improved; it is no longer + necessary to insert a small sleep at the start of a thread in order + to let other runnable threads be scheduled. + +Library +------- + +- StringIO.StringIO instances and cStringIO.StringIO instances support + read character buffer compatible objects for their .write() methods. + These objects are converted to strings and then handled as such + by the instances. + +- The "email" package has been added. This is basically a port of the + mimelib package with API changes + and some implementations updated to use iterators and generators. + +- difflib.ndiff() and difflib.Differ.compare() are generators now. This + restores the ability of Tools/scripts/ndiff.py to start producing output + before the entire comparison is complete. + +- StringIO.StringIO instances and cStringIO.StringIO instances support + iteration just like file objects (i.e. their .readline() method is + called for each iteration until it returns an empty string). + +- The codecs module has grown four new helper APIs to access + builtin codecs: getencoder(), getdecoder(), getreader(), + getwriter(). + +- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer) + simplifies writing XML RPC servers. + +- os.path.realpath(): a new function that returns the absolute pathname + after interpretation of symbolic links. On non-Unix systems, this + is an alias for os.path.abspath(). + +- operator.indexOf() (PySequence_Index() in the C API) now works with any + iterable object. + +- smtplib now supports various authentication and security features of + the SMTP protocol through the new login() and starttls() methods. + +- hmac: a new module implementing keyed hashing for message + authentication. + +- mimetypes now recognizes more extensions and file types. At the + same time, some mappings not sanctioned by IANA were removed. + +- The "compiler" package has been brought up to date to the state of + Python 2.2 bytecode generation. It has also been promoted from a + Tool to a standard library package. (Tools/compiler still exists as + a sample driver.) + +Build +----- + +- Large file support (LFS) is now automatic when the platform supports + it; no more manual configuration tweaks are needed. On Linux, at + least, it's possible to have a system whose C library supports large + files but whose kernel doesn't; in this case, large file support is + still enabled but doesn't do you any good unless you upgrade your + kernel or share your Python executable with another system whose + kernel has large file support. + +- The configure script now supplies plausible defaults in a + cross-compilation environment. This doesn't mean that the supplied + values are always correct, or that cross-compilation now works + flawlessly -- but it's a first step (and it shuts up most of + autoconf's warnings about AC_TRY_RUN). + +- The Unix build is now a bit less chatty, courtesy of the parser + generator. The build is completely silent (except for errors) when + using "make -s", thanks to a -q option to setup.py. + +C API +----- + +- The "structmember" API now supports some new flag bits to deny read + and/or write access to attributes in restricted execution mode. + +New platforms +------------- + +- Compaq's iPAQ handheld, running the "familiar" Linux distribution + (http://familiar.handhelds.org). + +Tests +----- + +- The "classic" standard tests, which work by comparing stdout to + an expected-output file under Lib/test/output/, no longer stop at + the first mismatch. Instead the test is run to completion, and a + variant of ndiff-style comparison is used to report all differences. + This is much easier to understand than the previous style of reporting. + +- The unittest-based standard tests now use regrtest's test_main() + convention, instead of running as a side-effect of merely being + imported. This allows these tests to be run in more natural and + flexible ways as unittests, outside the regrtest framework. + +- regrtest.py is much better integrated with unittest and doctest now, + especially in regard to reporting errors. + +Windows +------- + +- Large file support now also works for files > 4GB, on filesystems + that support it (NTFS under Windows 2000). See "What's New in + Python 2.2a3" for more detail. + + +What's New in Python 2.2a3? +=========================== + +*Release Date: 07-Sep-2001* + +Core +---- + +- Conversion of long to float now raises OverflowError if the long is too + big to represent as a C double. + +- The 3-argument builtin pow() no longer allows a third non-None argument + if either of the first two arguments is a float, or if both are of + integer types and the second argument is negative (in which latter case + the arguments are converted to float, so this is really the same + restriction). + +- The builtin dir() now returns more information, and sometimes much + more, generally naming all attributes of an object, and all attributes + reachable from the object via its class, and from its class's base + classes, and so on from them too. Example: in 2.2a2, dir([]) returned + an empty list. In 2.2a3, + + >>> dir([]) + ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', + '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__', + '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__', + '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__', + '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', + 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', + 'reverse', 'sort'] + + dir(module) continues to return only the module's attributes, though. + +- Overflowing operations on plain ints now return a long int rather + than raising OverflowError. This is a partial implementation of PEP + 237. You can use -Wdefault::OverflowWarning to enable a warning for + this situation, and -Werror::OverflowWarning to revert to the old + OverflowError exception. + +- A new command line option, -Q, is added to control run-time + warnings for the use of classic division. (See PEP 238.) Possible + values are -Qold, -Qwarn, -Qwarnall, and -Qnew. The default is + -Qold, meaning the / operator has its classic meaning and no + warnings are issued. Using -Qwarn issues a run-time warning about + all uses of classic division for int and long arguments; -Qwarnall + also warns about classic division for float and complex arguments + (for use with fixdiv.py). + [Note: the remainder of this item (preserved below) became + obsolete in 2.2c1 -- -Qnew has global effect in 2.2] :: + + Using -Qnew is questionable; it turns on new division by default, but + only in the __main__ module. You can usefully combine -Qwarn or + -Qwarnall and -Qnew: this gives the __main__ module new division, and + warns about classic division everywhere else. + +- Many built-in types can now be subclassed. This applies to int, + long, float, str, unicode, and tuple. (The types complex, list and + dictionary can also be subclassed; this was introduced earlier.) + Note that restrictions apply when subclassing immutable built-in + types: you can only affect the value of the instance by overloading + __new__. You can add mutable attributes, and the subclass instances + will have a __dict__ attribute, but you cannot change the "value" + (as implemented by the base class) of an immutable subclass instance + once it is created. + +- The dictionary constructor now takes an optional argument, a + mapping-like object, and initializes the dictionary from its + (key, value) pairs. + +- A new built-in type, super, has been added. This facilitates making + "cooperative super calls" in a multiple inheritance setting. For an + explanation, see http://www.python.org/2.2/descrintro.html#cooperation + +- A new built-in type, property, has been added. This enables the + creation of "properties". These are attributes implemented by + getter and setter functions (or only one of these for read-only or + write-only attributes), without the need to override __getattr__. + See http://www.python.org/2.2/descrintro.html#property + +- The syntax of floating-point and imaginary literals has been + liberalized, to allow leading zeroes. Examples of literals now + legal that were SyntaxErrors before: + + 00.0 0e3 0100j 07.5 00000000000000000008. + +- An old tokenizer bug allowed floating point literals with an incomplete + exponent, such as 1e and 3.1e-. Such literals now raise SyntaxError. + +Library +------- + +- telnetlib includes symbolic names for the options, and support for + setting an option negotiation callback. It also supports processing + of suboptions. + +- The new C standard no longer requires that math libraries set errno to + ERANGE on overflow. For platform libraries that exploit this new + freedom, Python's overflow-checking was wholly broken. A new overflow- + checking scheme attempts to repair that, but may not be reliable on all + platforms (C doesn't seem to provide anything both useful and portable + in this area anymore). + +- Asynchronous timeout actions are available through the new class + threading.Timer. + +- math.log and math.log10 now return sensible results for even huge + long arguments. For example, math.log10(10 ** 10000) ~= 10000.0. + +- A new function, imp.lock_held(), returns 1 when the import lock is + currently held. See the docs for the imp module. + +- pickle, cPickle and marshal on 32-bit platforms can now correctly read + dumps containing ints written on platforms where Python ints are 8 bytes. + When read on a box where Python ints are 4 bytes, such values are + converted to Python longs. + +- In restricted execution mode (using the rexec module), unmarshalling + code objects is no longer allowed. This plugs a security hole. + +- unittest.TestResult instances no longer store references to tracebacks + generated by test failures. This prevents unexpected dangling references + to objects that should be garbage collected between tests. + +Tools +----- + +- Tools/scripts/fixdiv.py has been added which can be used to fix + division operators as per PEP 238. + +Build +----- + +- If you are an adventurous person using Mac OS X you may want to look at + Mac/OSX. There is a Makefile there that will build Python as a real Mac + application, which can be used for experimenting with Carbon or Cocoa. + Discussion of this on pythonmac-sig, please. + +C API +----- + +- New function PyObject_Dir(obj), like Python __builtin__.dir(obj). + +- Note that PyLong_AsDouble can fail! This has always been true, but no + callers checked for it. It's more likely to fail now, because overflow + errors are properly detected now. The proper way to check:: + + double x = PyLong_AsDouble(some_long_object); + if (x == -1.0 && PyErr_Occurred()) { + /* The conversion failed. */ + } + +- The GC API has been changed. Extensions that use the old API will still + compile but will not participate in GC. To upgrade an extension + module: + + - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC + + - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and + PyObject_GC_Del to deallocate them + + - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini + to PyObject_GC_UnTrack + + - remove PyGC_HEAD_SIZE from object size calculations + + - remove calls to PyObject_AS_GC and PyObject_FROM_GC + +- Two new functions: PyString_FromFormat() and PyString_FromFormatV(). + These can be used safely to construct string objects from a + sprintf-style format string (similar to the format string supported + by PyErr_Format()). + +New platforms +------------- + +- Stephen Hansen contributed patches sufficient to get a clean compile + under Borland C (Windows), but he reports problems running it and ran + out of time to complete the port. Volunteers? Expect a MemoryError + when importing the types module; this is probably shallow, and + causing later failures too. + +Tests +----- + +Windows +------- + +- Large file support is now enabled on Win32 platforms as well as on + Win64. This means that, for example, you can use f.tell() and f.seek() + to manipulate files larger than 2 gigabytes (provided you have enough + disk space, and are using a Windows filesystem that supports large + partitions). Windows filesystem limits: FAT has a 2GB (gigabyte) + filesize limit, and large file support makes no difference there. + FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now. + NTFS has no practical limit on file size, and files of any size can be + used from Python now. + +- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC + points to command.com (patch from Brian Quinlan). + + +What's New in Python 2.2a2? +=========================== + +*Release Date: 22-Aug-2001* + +Build +----- + +- Tim Peters developed a brand new Windows installer using Wise 8.1, + generously donated to us by Wise Solutions. + +- configure supports a new option --enable-unicode, with the values + ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode + type and supporting code is completely removed from the interpreter. + +- A new configure option --enable-framework builds a Mac OS X framework, + which "make frameworkinstall" will install. This provides a starting + point for more mac-like functionality, join pythonmac-sig at python.org + if you are interested in helping. + +- The NeXT platform is no longer supported. + +- The 'new' module is now statically linked. + +Tools +----- + +- The new Tools/scripts/cleanfuture.py can be used to automatically + edit out obsolete future statements from Python source code. See + the module docstring for details. + +Tests +----- + +- regrtest.py now knows which tests are expected to be skipped on some + platforms, allowing to give clearer test result output. regrtest + also has optional --use/-u switch to run normally disabled tests + which require network access or consume significant disk resources. + +- Several new tests in the standard test suite, with special thanks to + Nick Mathewson. + +Core +---- + +- The floor division operator // has been added as outlined in PEP + 238. The / operator still provides classic division (and will until + Python 3.0) unless "from __future__ import division" is included, in + which case the / operator will provide true division. The operator + module provides truediv() and floordiv() functions. Augmented + assignment variants are included, as are the equivalent overloadable + methods and C API methods. See the PEP for a full discussion: + + +- Future statements are now effective in simulated interactive shells + (like IDLE). This should "just work" by magic, but read Michael + Hudson's "Future statements in simulated shells" PEP 264 for full + details: . + +- The type/class unification (PEP 252-253) was integrated into the + trunk and is not so tentative any more (the exact specification of + some features is still tentative). A lot of work has done on fixing + bugs and adding robustness and features (performance still has to + come a long way). + +- Warnings about a mismatch in the Python API during extension import + now use the Python warning framework (which makes it possible to + write filters for these warnings). + +- A function's __dict__ (aka func_dict) will now always be a + dictionary. It used to be possible to delete it or set it to None, + but now both actions raise TypeErrors. It is still legal to set it + to a dictionary object. Getting func.__dict__ before any attributes + have been assigned now returns an empty dictionary instead of None. + +- A new command line option, -E, was added which disables the use of + all environment variables, or at least those that are specifically + significant to Python. Usually those have a name starting with + "PYTHON". This was used to fix a problem where the tests fail if + the user happens to have PYTHONHOME or PYTHONPATH pointing to an + older distribution. + +Library +------- + +- New class Differ and new functions ndiff() and restore() in difflib.py. + These package the algorithms used by the popular Tools/scripts/ndiff.py, + for programmatic reuse. + +- New function xml.sax.saxutils.quoteattr(): Quote an XML attribute + value using the minimal quoting required for the value; more + reliable than using xml.sax.saxutils.escape() for attribute values. + +- Readline completion support for cmd.Cmd was added. + +- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings. + +- Added function threading.BoundedSemaphore() + +- Added Ka-Ping Yee's cgitb.py module. + +- The 'new' module now exposes the CO_xxx flags. + +- The gc module offers the get_referents function. + +New platforms +------------- + +C API +----- + +- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added + which provide a cross-platform implementations for the + relatively new snprintf()/vsnprintf() C lib APIs. In contrast to + the standard sprintf() and vsprintf() C lib APIs, these versions + apply bounds checking on the used buffer which enhances protection + against buffer overruns. + +- Unicode APIs now use name mangling to assure that mixing interpreters + and extensions using different Unicode widths is rendered next to + impossible. Trying to import an incompatible Unicode-aware extension + will result in an ImportError. Unicode extensions writers must make + sure to check the Unicode width compatibility in their extensions by + using at least one of the mangled Unicode APIs in the extension. + +- Two new flags METH_NOARGS and METH_O are available in method definition + tables to simplify implementation of methods with no arguments and a + single untyped argument. Calling such methods is more efficient than + calling corresponding METH_VARARGS methods. METH_OLDARGS is now + deprecated. + +Windows +------- + +- "import module" now compiles module.pyw if it exists and nothing else + relevant is found. + + +What's New in Python 2.2a1? +=========================== + +*Release date: 18-Jul-2001* + +Core +---- + +- TENTATIVELY, a large amount of code implementing much of what's + described in PEP 252 (Making Types Look More Like Classes) and PEP + 253 (Subtyping Built-in Types) was added. This will be released + with Python 2.2a1. Documentation will be provided separately + through http://www.python.org/2.2/. The purpose of releasing this + with Python 2.2a1 is to test backwards compatibility. It is + possible, though not likely, that a decision is made not to release + this code as part of 2.2 final, if any serious backwards + incompatibilities are found during alpha testing that cannot be + repaired. + +- Generators were added; this is a new way to create an iterator (see + below) using what looks like a simple function containing one or + more 'yield' statements. See PEP 255. Since this adds a new + keyword to the language, this feature must be enabled by including a + future statement: "from __future__ import generators" (see PEP 236). + Generators will become a standard feature in a future release + (probably 2.3). Without this future statement, 'yield' remains an + ordinary identifier, but a warning is issued each time it is used. + (These warnings currently don't conform to the warnings framework of + PEP 230; we intend to fix this in 2.2a2.) + +- The UTF-16 codec was modified to be more RFC compliant. It will now + only remove BOM characters at the start of the string and then + only if running in native mode (UTF-16-LE and -BE won't remove a + leading BMO character). + +- Strings now have a new method .decode() to complement the already + existing .encode() method. These two methods provide direct access + to the corresponding decoders and encoders of the registered codecs. + + To enhance the usability of the .encode() method, the special + casing of Unicode object return values was dropped (Unicode objects + were auto-magically converted to string using the default encoding). + + Both methods will now return whatever the codec in charge of the + requested encoding returns as object, e.g. Unicode codecs will + return Unicode objects when decoding is requested ("äöü".decode("latin-1") + will return u"äöü"). This enables codec writer to create codecs + for various simple to use conversions. + + New codecs were added to demonstrate these new features (the .encode() + and .decode() columns indicate the type of the returned objects): + + +---------+-----------+-----------+-----------------------------+ + |Name | .encode() | .decode() | Description | + +=========+===========+===========+=============================+ + |uu | string | string | UU codec (e.g. for email) | + +---------+-----------+-----------+-----------------------------+ + |base64 | string | string | base64 codec | + +---------+-----------+-----------+-----------------------------+ + |quopri | string | string | quoted-printable codec | + +---------+-----------+-----------+-----------------------------+ + |zlib | string | string | zlib compression | + +---------+-----------+-----------+-----------------------------+ + |hex | string | string | 2-byte hex codec | + +---------+-----------+-----------+-----------------------------+ + |rot-13 | string | Unicode | ROT-13 Unicode charmap codec| + +---------+-----------+-----------+-----------------------------+ + +- Some operating systems now support the concept of a default Unicode + encoding for file system operations. Notably, Windows supports 'mbcs' + as the default. The Macintosh will also adopt this concept in the medium + term, although the default encoding for that platform will be other than + 'mbcs'. + + On operating system that support non-ASCII filenames, it is common for + functions that return filenames (such as os.listdir()) to return Python + string objects pre-encoded using the default file system encoding for + the platform. As this encoding is likely to be different from Python's + default encoding, converting this name to a Unicode object before passing + it back to the Operating System would result in a Unicode error, as Python + would attempt to use its default encoding (generally ASCII) rather than + the default encoding for the file system. + + In general, this change simply removes surprises when working with + Unicode and the file system, making these operations work as you expect, + increasing the transparency of Unicode objects in this context. + See [????] for more details, including examples. + +- Float (and complex) literals in source code were evaluated to full + precision only when running from a .py file; the same code loaded from a + .pyc (or .pyo) file could suffer numeric differences starting at about the + 12th significant decimal digit. For example, on a machine with IEEE-754 + floating arithmetic, + + x = 9007199254740992.0 + print long(x) + + printed 9007199254740992 if run directly from .py, but 9007199254740000 + if from a compiled (.pyc or .pyo) file. This was due to marshal using + str(float) instead of repr(float) when building code objects. marshal + now uses repr(float) instead, which should reproduce floats to full + machine precision (assuming the platform C float<->string I/O conversion + functions are of good quality). + + This may cause floating-point results to change in some cases, and + usually for the better, but may also cause numerically unstable + algorithms to break. + +- The implementation of dicts suffers fewer collisions, which has speed + benefits. However, the order in which dict entries appear in dict.keys(), + dict.values() and dict.items() may differ from previous releases for a + given dict. Nothing is defined about this order, so no program should + rely on it. Nevertheless, it's easy to write test cases that rely on the + order by accident, typically because of printing the str() or repr() of a + dict to an "expected results" file. See Lib/test/test_support.py's new + sortdict(dict) function for a simple way to display a dict in sorted + order. + +- Many other small changes to dicts were made, resulting in faster + operation along the most common code paths. + +- Dictionary objects now support the "in" operator: "x in dict" means + the same as dict.has_key(x). + +- The update() method of dictionaries now accepts generic mapping + objects. Specifically the argument object must support the .keys() + and __getitem__() methods. This allows you to say, for example, + {}.update(UserDict()) + +- Iterators were added; this is a generalized way of providing values + to a for loop. See PEP 234. There's a new built-in function iter() + to return an iterator. There's a new protocol to get the next value + from an iterator using the next() method (in Python) or the + tp_iternext slot (in C). There's a new protocol to get iterators + using the __iter__() method (in Python) or the tp_iter slot (in C). + Iterating (i.e. a for loop) over a dictionary generates its keys. + Iterating over a file generates its lines. + +- The following functions were generalized to work nicely with iterator + arguments:: + + map(), filter(), reduce(), zip() + list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API) + max(), min() + join() method of strings + extend() method of lists + 'x in y' and 'x not in y' (PySequence_Contains() in C API) + operator.countOf() (PySequence_Count() in C API) + right-hand side of assignment statements with multiple targets, such as :: + x, y, z = some_iterable_object_returning_exactly_3_values + +- Accessing module attributes is significantly faster (for example, + random.random or os.path or yourPythonModule.yourAttribute). + +- Comparing dictionary objects via == and != is faster, and now works even + if the keys and values don't support comparisons other than ==. + +- Comparing dictionaries in ways other than == and != is slower: there were + insecurities in the dict comparison implementation that could cause Python + to crash if the element comparison routines for the dict keys and/or + values mutated the dicts. Making the code bulletproof slowed it down. + +- Collisions in dicts are resolved via a new approach, which can help + dramatically in bad cases. For example, looking up every key in a dict + d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x + faster now. Thanks to Christian Tismer for pointing out the cause and + the nature of an effective cure (last December! better late than never). + +- repr() is much faster for large containers (dict, list, tuple). + + +Library +------- + +- The constants ascii_letters, ascii_lowercase. and ascii_uppercase + were added to the string module. These a locale-independent + constants, unlike letters, lowercase, and uppercase. These are now + use in appropriate locations in the standard library. + +- The flags used in dlopen calls can now be configured using + sys.setdlopenflags and queried using sys.getdlopenflags. + +- Fredrik Lundh's xmlrpclib is now a standard library module. This + provides full client-side XML-RPC support. In addition, + Demo/xmlrpc/ contains two server frameworks (one SocketServer-based, + one asyncore-based). Thanks to Eric Raymond for the documentation. + +- The xrange() object is simplified: it no longer supports slicing, + repetition, comparisons, efficient 'in' checking, the tolist() + method, or the start, stop and step attributes. See PEP 260. + +- A new function fnmatch.filter to filter lists of file names was added. + +- calendar.py uses month and day names based on the current locale. + +- strop is now *really* obsolete (this was announced before with 1.6), + and issues DeprecationWarning when used (except for the four items + that are still imported into string.py). + +- Cookie.py now sorts key+value pairs by key in output strings. + +- pprint.isrecursive(object) didn't correctly identify recursive objects. + Now it does. + +- pprint functions now much faster for large containers (tuple, list, dict). + +- New 'q' and 'Q' format codes in the struct module, corresponding to C + types "long long" and "unsigned long long" (on Windows, __int64). In + native mode, these can be used only when the platform C compiler supports + these types (when HAVE_LONG_LONG is #define'd by the Python config + process), and then they inherit the sizes and alignments of the C types. + In standard mode, 'q' and 'Q' are supported on all platforms, and are + 8-byte integral types. + +- The site module installs a new built-in function 'help' that invokes + pydoc.help. It must be invoked as 'help()'; when invoked as 'help', + it displays a message reminding the user to use 'help()' or + 'help(object)'. + +Tests +----- + +- New test_mutants.py runs dict comparisons where the key and value + comparison operators mutate the dicts randomly during comparison. This + rapidly causes Python to crash under earlier releases (not for the faint + of heart: it can also cause Win9x to freeze or reboot!). + +- New test_pprint.py verifies that pprint.isrecursive() and + pprint.isreadable() return sensible results. Also verifies that simple + cases produce correct output. + +C API +----- + +- Removed the unused last_is_sticky argument from the internal + _PyTuple_Resize(). If this affects you, you were cheating. + What's New in Python 2.1 (final)? ================================= Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Mon Mar 20 07:30:41 2006 @@ -1001,5293 +1001,6 @@ - Fixed a display glitch in Pynche, which could cause the right arrow to wiggle over by a pixel. -What's New in Python 2.4 final? -=============================== - -*Release date: 30-NOV-2004* - -Core and builtins ------------------ - -- Bug 875692: Improve signal handling, especially when using threads, by - forcing an early re-execution of PyEval_EvalFrame() "periodic" code when - things_to_do is not cleared by Py_MakePendingCalls(). - - -What's New in Python 2.4 (release candidate 1) -============================================== - -*Release date: 18-NOV-2004* - -Core and builtins ------------------ - -- Bug 1061968: Fixes in 2.4a3 to address thread bug 1010677 reintroduced - the years-old thread shutdown race bug 225673. Numeric history lesson - aside, all bugs in all three reports are fixed now. - - -Library -------- - -- Bug 1052242: If exceptions are raised by an atexit handler function an - attempt is made to execute the remaining handlers. The last exception - raised is re-raised. - -- ``doctest``'s new support for adding ``pdb.set_trace()`` calls to - doctests was broken in a dramatic but shallow way. Fixed. - -- Bug 1065388: ``calendar``'s ``day_name``, ``day_abbr``, ``month_name``, - and ``month_abbr`` attributes emulate sequences of locale-correct - spellings of month and day names. Because the locale can change at - any time, the correct spelling is recomputed whenever one of these is - indexed. In the worst case, the index may be a slice object, so these - recomputed every day or month name each time they were indexed. This is - much slower than necessary in the usual case, when the index is just an - integer. In that case, only the single spelling needed is recomputed - now; and, when the index is a slice object, only the spellings needed - by the slice are recomputed now. - -- Patch 1061679: Added ``__all__`` to pickletools.py. - -Build ------ - -- Bug 1034277 / Patch 1035255: Remove compilation of core against CoreServices - and CoreFoundation on OS X. Involved removing PyMac_GetAppletScriptFile() - which has no known users. Thanks Bob Ippolito. - -C API ------ - -- The PyRange_New() function is deprecated. - - -What's New in Python 2.4 beta 2? -================================ - -*Release date: 03-NOV-2004* - -License -------- - -The Python Software Foundation changed the license under which Python -is released, to remove Python version numbers. There were no other -changes to the license. So, for example, wherever the license for -Python 2.3 said "Python 2.3", the new license says "Python". The -intent is to make it possible to refer to the PSF license in a more -durable way. For example, some people say they're confused by that -the Open Source Initiative's entry for the Python Software Foundation -License:: - - http://www.opensource.org/licenses/PythonSoftFoundation.php - -says "Python 2.1.1" all over it, wondering whether it applies only -to Python 2.1.1. - -The official name of the new license is the Python Software Foundation -License Version 2. - -Core and builtins ------------------ - -- Bug #1055820 Cyclic garbage collection was not protecting against that - calling a live weakref to a piece of cyclic trash could resurrect an - insane mutation of the trash if any Python code ran during gc (via - running a dead object's __del__ method, running another callback on a - weakref to a dead object, or via any Python code run in any other thread - that managed to obtain the GIL while a __del__ or callback was running - in the thread doing gc). The most likely symptom was "impossible" - ``AttributeError`` exceptions, appearing seemingly at random, on weakly - referenced objects. The cure was to clear all weakrefs to unreachable - objects before allowing any callbacks to run. - -- Bug #1054139 _PyString_Resize() now invalidates its cached hash value. - -Extension Modules ------------------ - -- Bug #1048870: the compiler now generates distinct code objects for - functions with identical bodies. This was producing confusing - traceback messages which pointed to the function where the code - object was first defined rather than the function being executed. - -Library -------- - -- Patch #1056967 changes the semantics of Template.safe_substitute() so that - no ValueError is raised on an 'invalid' match group. Now the delimiter is - returned. - -- Bug #1052503 pdb.runcall() was not passing along keyword arguments. - -- Bug #902037: XML.sax.saxutils.prepare_input_source() now combines relative - paths with a base path before checking os.path.isfile(). - -- The whichdb module can now be run from the command line. - -- Bug #1045381: time.strptime() can now infer the date using %U or %W (week of - the year) when the day of the week and year are also specified. - -- Bug #1048816: fix bug in Ctrl-K at start of line in curses.textpad.Textbox - -- Bug #1017553: fix bug in tarfile.filemode() - -- Patch #737473: fix bug that old source code is shown in tracebacks even if - the source code is updated and reloaded. - -Build ------ - -- Patch #1044395: --enable-shared is allowed in FreeBSD also. - -What's New in Python 2.4 beta 1? -================================ - -*Release date: 15-OCT-2004* - -Core and builtins ------------------ - -- Patch #975056: Restartable signals were not correctly disabled on - BSD systems. Consistently use PyOS_setsig() instead of signal(). - -- The internal portable implementation of thread-local storage (TLS), used - by the ``PyGILState_Ensure()``/``PyGILState_Release()`` API, was not - thread-correct. This could lead to a variety of problems, up to and - including segfaults. See bug 1041645 for an example. - -- Added a command line option, -m module, which searches sys.path for the - module and then runs it. (Contributed by Nick Coghlan.) - -- The bytecode optimizer now folds tuples of constants into a single - constant. - -- SF bug #513866: Float/long comparison anomaly. Prior to 2.4b1, when - an integer was compared to a float, the integer was coerced to a float. - That could yield spurious overflow errors (if the integer was very - large), and to anomalies such as - ``long(1e200)+1 == 1e200 == long(1e200)-1``. Coercion to float is no - longer performed, and cases like ``long(1e200)-1 < 1e200``, - ``long(1e200)+1 > 1e200`` and ``(1 << 20000) > 1e200`` are computed - correctly now. - -Extension modules ------------------ - -- ``collections.deque`` objects didn't play quite right with garbage - collection, which could lead to a segfault in a release build, or - an assert failure in a debug build. Also, added overflow checks, - better detection of mutation during iteration, and shielded deque - comparisons from unusual subclass overrides of the __iter__() method. - -Library -------- - -- Patch 1046644: distutils build_ext grew two new options - --swig for - specifying the swig executable to use, and --swig-opts to specify - options to pass to swig. --swig-opts="-c++" is the new way to spell - --swig-cpp. - -- Patch 983206: distutils now obeys environment variable LDSHARED, if - it is set. - -- Added Peter Astrand's subprocess.py module. See PEP 324 for details. - -- time.strptime() now properly escapes timezones and all other locale-specific - strings for regex-specific symbols. Was breaking under Japanese Windows when - the timezone was specified as "Tokyo (standard time)". - Closes bug #1039270. - -- Updates for the email package: - - + email.Utils.formatdate() grew a 'usegmt' argument for HTTP support. - + All deprecated APIs that in email 2.x issued warnings have been removed: - _encoder argument to the MIMEText constructor, Message.add_payload(), - Utils.dump_address_pair(), Utils.decode(), Utils.encode() - + New deprecations: Generator.__call__(), Message.get_type(), - Message.get_main_type(), Message.get_subtype(), the 'strict' argument to - the Parser constructor. These will be removed in email 3.1. - + Support for Python earlier than 2.3 has been removed (see PEP 291). - + All defect classes have been renamed to end in 'Defect'. - + Some FeedParser fixes; also a MultipartInvariantViolationDefect will be - added to messages that claim to be multipart but really aren't. - + Updates to documentation. - -- re's findall() and finditer() functions now take an optional flags argument - just like the compile(), search(), and match() functions. Also, documented - the previously existing start and stop parameters for the findall() and - finditer() methods of regular expression objects. - -- rfc822 Messages now support iterating over the headers. - -- The (undocumented) tarfile.Tarfile.membernames has been removed; - applications should use the getmember function. - -- httplib now offers symbolic constants for the HTTP status codes. - -- SF bug #1028306: Trying to compare a ``datetime.date`` to a - ``datetime.datetime`` mistakenly compared only the year, month and day. - Now it acts like a mixed-type comparison: ``False`` for ``==``, - ``True`` for ``!=``, and raises ``TypeError`` for other comparison - operators. Because datetime is a subclass of date, comparing only the - base class (date) members can still be done, if that's desired, by - forcing using of the approprate date method; e.g., - ``a_date.__eq__(a_datetime)`` is true if and only if the year, month - and day members of ``a_date`` and ``a_datetime`` are equal. - -- bdist_rpm now supports command line options --force-arch, - {pre,post}-install, {pre,post}-uninstall, and - {prep,build,install,clean,verify}-script. - -- SF patch #998993: The UTF-8 and the UTF-16 stateful decoders now support - decoding incomplete input (when the input stream is temporarily exhausted). - ``codecs.StreamReader`` now implements buffering, which enables proper - readline support for the UTF-16 decoders. ``codecs.StreamReader.read()`` - has a new argument ``chars`` which specifies the number of characters to - return. ``codecs.StreamReader.readline()`` and - ``codecs.StreamReader.readlines()`` have a new argument ``keepends``. - Trailing "\n"s will be stripped from the lines if ``keepends`` is false. - -- The documentation for doctest is greatly expanded, and now covers all - the new public features (of which there are many). - -- ``doctest.master`` was put back in, and ``doctest.testmod()`` once again - updates it. This isn't good, because every ``testmod()`` call - contributes to bloating the "hidden" state of ``doctest.master``, but - some old code apparently relies on it. For now, all we can do is - encourage people to stitch doctests together via doctest's unittest - integration features instead. - -- httplib now handles ipv6 address/port pairs. - -- SF bug #1017864: ConfigParser now correctly handles default keys, - processing them with ``ConfigParser.optionxform`` when supplied, - consistent with the handling of config file entries and runtime-set - options. - -- SF bug #997050: Document, test, & check for non-string values in - ConfigParser. Moved the new string-only restriction added in - rev. 1.65 to the SafeConfigParser class, leaving existing - ConfigParser & RawConfigParser behavior alone, and documented the - conditions under which non-string values work. - -Build ------ - -- Building on darwin now includes /opt/local/include and /opt/local/lib for - building extension modules. This is so as to include software installed as - a DarwinPorts port - -- pyport.h now defines a Py_IS_NAN macro. It works as-is when the - platform C computes true for ``x != x`` if and only if X is a NaN. - Other platforms can override the default definition with a platform- - specific spelling in that platform's pyconfig.h. You can also override - pyport.h's default Py_IS_INFINITY definition now. - -C API ------ - -- SF patch 1044089: New function ``PyEval_ThreadsInitialized()`` returns - non-zero if PyEval_InitThreads() has been called. - -- The undocumented and unused extern int ``_PyThread_Started`` was removed. - -- The C API calls ``PyInterpreterState_New()`` and ``PyThreadState_New()`` - are two of the very few advertised as being safe to call without holding - the GIL. However, this wasn't true in a debug build, as bug 1041645 - demonstrated. In a debug build, Python redirects the ``PyMem`` family - of calls to Python's small-object allocator, to get the benefit of - its extra debugging capabilities. But Python's small-object allocator - isn't threadsafe, relying on the GIL to avoid the expense of doing its - own locking. ``PyInterpreterState_New()`` and ``PyThreadState_New()`` - call the platform ``malloc()`` directly now, regardless of build type. - -- PyLong_AsUnsignedLong[Mask] now support int objects as well. - -- SF patch #998993: ``PyUnicode_DecodeUTF8Stateful`` and - ``PyUnicode_DecodeUTF16Stateful`` have been added, which implement stateful - decoding. - -Tests ------ - -- test__locale ported to unittest - -Mac ---- - -- ``plistlib`` now supports non-dict root objects. There is also a new - interface for reading and writing plist files: ``readPlist(pathOrFile)`` - and ``writePlist(rootObject, pathOrFile)`` - -Tools/Demos ------------ - -- The text file comparison scripts ``ndiff.py`` and ``diff.py`` now - read the input files in universal-newline mode. This spares them - from consuming a great deal of time to deduce the useless result that, - e.g., a file with Windows line ends and a file with Linux line ends - have no lines in common. - - -What's New in Python 2.4 alpha 3? -================================= - -*Release date: 02-SEP-2004* - -Core and builtins ------------------ - -- SF patch #1007189: ``from ... import ...`` statements now allow the name - list to be surrounded by parentheses. - -- Some speedups for long arithmetic, thanks to Trevor Perrin. Gradeschool - multiplication was sped a little by optimizing the C code. Gradeschool - squaring was sped by about a factor of 2, by exploiting that about half - the digit products are duplicates in a square. Because exponentiation - uses squaring often, this also speeds long power. For example, the time - to compute 17**1000000 dropped from about 14 seconds to 9 on my box due - to this much. The cutoff for Karatsuba multiplication was raised, - since gradeschool multiplication got quicker, and the cutoff was - aggressively small regardless. The exponentiation algorithm was switched - from right-to-left to left-to-right, which is more efficient for small - bases. In addition, if the exponent is large, the algorithm now does - 5 bits (instead of 1 bit) at a time. That cut the time to compute - 17**1000000 on my box in half again, down to about 4.5 seconds. - -- OverflowWarning is no longer generated. PEP 237 scheduled this to - occur in Python 2.3, but since OverflowWarning was disabled by default, - nobody realized it was still being generated. On the chance that user - code is still using them, the Python builtin OverflowWarning, and - corresponding C API PyExc_OverflowWarning, will exist until Python 2.5. - -- Py_InitializeEx has been added. - -- Fix the order of application of decorators. The proper order is bottom-up; - the first decorator listed is the last one called. - -- SF patch #1005778. Fix a seg fault if the list size changed while - calling list.index(). This could happen if a rich comparison function - modified the list. - -- The ``func_name`` (a.k.a. ``__name__``) attribute of user-defined - functions is now writable. - -- code_new (a.k.a new.code()) now checks its arguments sufficiently - carefully that passing them on to PyCode_New() won't trigger calls - to Py_FatalError() or PyErr_BadInternalCall(). It is still the case - that the returned code object might be entirely insane. - -- Subclasses of string can no longer be interned. The semantics of - interning were not clear here -- a subclass could be mutable, for - example -- and had bugs. Explicitly interning a subclass of string - via intern() will raise a TypeError. Internal operations that attempt - to intern a string subclass will have no effect. - -- Bug 1003935: xrange() could report bogus OverflowErrors. Documented - what xrange() intends, and repaired tests accordingly. - -Extension modules ------------------ - -- difflib now supports HTML side-by-side diff. - -- os.urandom has been added for systems that support sources of random - data. - -- Patch 1012740: truncate() on a writeable cStringIO now resets the - position to the end of the stream. This is consistent with the original - StringIO module and avoids inadvertently resurrecting data that was - supposed to have been truncated away. - -- Added socket.socketpair(). - -- Added CurrentByteIndex, CurrentColumnNumber, CurrentLineNumber - members to xml.parsers.expat.XMLParser object. - -- The mpz, rotor, and xreadlines modules, all deprecated in earlier - versions of Python, have now been removed. - -Library -------- - -- Patch #934356: if a module defines __all__, believe that rather than using - heuristics for filtering out imported names. - -- Patch #941486: added os.path.lexists(), which returns True for broken - symlinks, unlike os.path.exists(). - -- the random module now uses os.urandom() for seeding if it is available. - Added a new generator based on os.urandom(). - -- difflib and diff.py can now generate HTML. - -- bdist_rpm now includes version and release in the BuildRoot, and - replaces - by ``_`` in version and release. - -- distutils build/build_scripts now has an -e option to specify the - path to the Python interpreter for installed scripts. - -- PEP 292 classes Template and SafeTemplate are added to the string module. - -- tarfile now generates GNU tar files by default. - -- HTTPResponse has now a getheaders method. - -- Patch #1006219: let inspect.getsource handle '@' decorators. Thanks Simon - Percivall. - -- logging.handlers.SMTPHandler.date_time has been removed; - the class now uses email.Utils.formatdate to generate the time stamp. - -- A new function tkFont.nametofont was added to return an existing - font. The Font class constructor now has an additional exists argument - which, if True, requests to return/configure an existing font, rather - than creating a new one. - -- Updated the decimal package's min() and max() methods to match the - latest revision of the General Decimal Arithmetic Specification. - Quiet NaNs are ignored and equal values are sorted based on sign - and exponent. - -- The decimal package's Context.copy() method now returns deep copies. - -- Deprecated sys.exitfunc in favor of the atexit module. The sys.exitfunc - attribute will be kept around for backwards compatibility and atexit - will just become the one preferred way to do it. - -- patch #675551: Add get_history_item and replace_history_item functions - to the readline module. - -- bug #989672: pdb.doc and the help messages for the help_d and help_u methods - of the pdb.Pdb class gives have been corrected. d(own) goes to a newer - frame, u(p) to an older frame, not the other way around. - -- bug #990669: os.path.realpath() will resolve symlinks before normalizing the - path, as normalizing the path may alter the meaning of the path if it - contains symlinks. - -- bug #851123: shutil.copyfile will raise an exception when trying to copy a - file onto a link to itself. Thanks Gregory Ball. - -- bug #570300: Fix inspect to resolve file locations using os.path.realpath() - so as to properly list all functions in a module when the module itself is - reached through a symlink. Thanks Johannes Gijsbers. - -- doctest refactoring continued. See the docs for details. As part of - this effort, some old and little- (never?) used features are now - deprecated: the Tester class, the module is_private() function, and the - isprivate argument to testmod(). The Tester class supplied a feeble - "by hand" way to combine multiple doctests, if you knew exactly what - you were doing. The newer doctest features for unittest integration - already did a better job of that, are stronger now than ever, and the - new DocTestRunner class is a saner foundation if you want to do it by - hand. The "private name" filtering gimmick was a mistake from the - start, and testmod() changed long ago to ignore it by default. If - you want to filter out tests, the new DocTestFinder class can be used - to return a list of all doctests, and you can filter that list by - any computable criteria before passing it to a DocTestRunner instance. - -- Bug #891637, patch #1005466: fix inspect.getargs() crash on def foo((bar)). - -Tools/Demos ------------ - -- IDLE's shortcut keys for windows are now case insensitive so that - Control-V works the same as Control-v. - -- pygettext.py: Generate POT-Creation-Date header in ISO format. - -Build ------ - -- Backward incompatibility: longintrepr.h now triggers a compile-time - error if SHIFT (the number of bits in a Python long "digit") isn't - divisible by 5. This new requirement allows simple code for the new - 5-bits-at-a-time long_pow() implementation. If necessary, the - restriction could be removed (by complicating long_pow(), or by - falling back to the 1-bit-at-a-time algorithm), but there are no - plans to do so. - -- bug #991962: When building with --disable-toolbox-glue on Darwin no - attempt to build Mac-specific modules occurs. - -- The --with-tsc flag to configure to enable VM profiling with the - processor's timestamp counter now works on PPC platforms. - -- patch #1006629: Define _XOPEN_SOURCE to 500 on Solaris 8/9 to match - GCC's definition and avoid redefinition warnings. - -- Detect pthreads support (provided by gnu pth pthread emulation) on - GNU/k*BSD systems. - -- bug #1005737, #1007249: Fixed several build problems and warnings - found on old/legacy C compilers of HP-UX, IRIX and Tru64. - -C API ------ - -.. - -Documentation -------------- - -- patch #1005936, bug #1009373: fix index entries which contain - an underscore when viewed with Acrobat. - -- bug #990669: os.path.normpath may alter the meaning of a path if - it contains symbolic links. This has been documented in a comment - since 1992, but is now in the library reference as well. - -New platforms -------------- - -- FreeBSD 6 is now supported. - -Tests ------ - -.. - -Windows -------- - -- Boosted the stack reservation for python.exe and pythonw.exe from - the default 1MB to 2MB. Stack frames under VC 7.1 for 2.4 are enough - bigger than under VC 6.0 for 2.3.4 that deeply recursive progams - within the default sys.getrecursionlimit() default value of 1000 were - able to suffer undetected C stack overflows. The standard test program - test_compiler was one such program. If a Python process on Windows - "just vanishes" without a trace, and without an error message of any - kind, but with an exit code of 128, undetected stack overflow may be - the problem. - -Mac ---- - -.. - - -What's New in Python 2.4 alpha 2? -================================= - -*Release date: 05-AUG-2004* - -Core and builtins ------------------ - -- Patch #980695: Implements efficient string concatenation for statements - of the form s=s+t and s+=t. This will vary across implementations. - Accordingly, the str.join() method is strongly preferred for performance - sensitive code. - -- PEP-0318, Function Decorators have been added to the language. These are - implemented using the Java-style @decorator syntax, like so:: - - @staticmethod - def foo(bar): - - (The PEP needs to be updated to reflect the current state) - -- When importing a module M raises an exception, Python no longer leaves M - in sys.modules. Before 2.4a2 it did, and a subsequent import of M would - succeed, picking up a module object from sys.modules reflecting as much - of the initialization of M as completed before the exception was raised. - Subsequent imports got no indication that M was in a partially- - initialized state, and the importers could get into arbitrarily bad - trouble as a result (the M they got was in an unintended state, - arbitrarily far removed from M's author's intent). Now subsequent - imports of M will continue raising exceptions (but if, for example, the - source code for M is edited between import attempts, then perhaps later - attempts will succeed, or raise a different exception). - - This can break existing code, but in such cases the code was probably - working before by accident. In the Python source, the only case of - breakage discovered was in a test accidentally relying on a damaged - module remaining in sys.modules. Cases are also known where tests - deliberately provoking import errors remove damaged modules from - sys.modules themselves, and such tests will break now if they do an - unconditional del sys.modules[M]. - -- u'%s' % obj will now try obj.__unicode__() first and fallback to - obj.__str__() if no __unicode__ method can be found. - -- Patch #550732: Add PyArg_VaParseTupleAndKeywords(). Analogous to - PyArg_VaParse(). Both are now documented. Thanks Greg Chapman. - -- Allow string and unicode return types from .encode()/.decode() - methods on string and unicode objects. Added unicode.decode() - which was missing for no apparent reason. - -- An attempt to fix the mess that is Python's behaviour with - signal handlers and threads, complicated by readline's behaviour. - It's quite possible that there are still bugs here. - -- Added C macros Py_CLEAR and Py_VISIT to ease the implementation of - types that support garbage collection. - -- Compiler now treats None as a constant. - -- The type of values returned by __int__, __float__, __long__, - __oct__, and __hex__ are now checked. Returning an invalid type - will cause a TypeError to be raised. This matches the behavior of - Jython. - -- Implemented bind_textdomain_codeset() in locale module. - -- Added a workaround for proper string operations in BSDs. str.split - and str.is* methods can now work correctly with UTF-8 locales. - -- Bug #989185: unicode.iswide() and unicode.width() is dropped and - the East Asian Width support is moved to unicodedata extension - module. - -- Patch #941229: The source code encoding in interactive mode - now refers sys.stdin.encoding not just ISO-8859-1 anymore. This - allows for non-latin-1 users to write unicode strings directly. - -Extension modules ------------------ - -- cpickle now supports the same keyword arguments as pickle. - -Library -------- - -- Added new codecs and aliases for ISO_8859-11, ISO_8859-16 and - TIS-620 - -- Thanks to Edward Loper, doctest has been massively refactored, and - many new features were added. Full docs will appear later. For now - the doctest module comments and new test cases give good coverage. - The refactoring provides many hook points for customizing behavior - (such as how to report errors, and how to compare expected to actual - output). New features include a marker for expected - output containing blank lines, options to produce unified or context - diffs when actual output doesn't match expectations, an option to - normalize whitespace before comparing, and an option to use an - ellipsis to signify "don't care" regions of output. - -- Tkinter now supports the wish -sync and -use options. - -- The following methods in time support passing of None: ctime(), gmtime(), - and localtime(). If None is provided, the current time is used (the - same as when the argument is omitted). - [SF bug 658254, patch 663482] - -- nntplib does now allow to ignore a .netrc file. - -- urllib2 now recognizes Basic authentication even if other authentication - schemes are offered. - -- Bug #1001053. wave.open() now accepts unicode filenames. - -- gzip.GzipFile has a new fileno() method, to retrieve the handle of the - underlying file object (provided it has a fileno() method). This is - needed if you want to use os.fsync() on a GzipFile. - -- imaplib has two new methods: deleteacl and myrights. - -- nntplib has two new methods: description and descriptions. They - use a more RFC-compliant way of getting a newsgroup description. - -- Bug #993394. Fix a possible red herring of KeyError in 'threading' being - raised during interpreter shutdown from a registered function with atexit - when dummy_threading is being used. - -- Bug #857297/Patch #916874. Fix an error when extracting a hard link - from a tarfile. - -- Patch #846659. Fix an error in tarfile.py when using - GNU longname/longlink creation. - -- The obsolete FCNTL.py has been deleted. The builtin fcntl module - has been available (on platforms that support fcntl) since Python - 1.5a3, and all FCNTL.py did is export fcntl's names, after generating - a deprecation warning telling you to use fcntl directly. - -- Several new unicode codecs are added: big5hkscs, euc_jis_2004, - iso2022_jp_2004, shift_jis_2004. - -- Bug #788520. Queue.{get, get_nowait, put, put_nowait} have new - implementations, exploiting Conditions (which didn't exist at the time - Queue was introduced). A minor semantic change is that the Full and - Empty exceptions raised by non-blocking calls now occur only if the - queue truly was full or empty at the instant the queue was checked (of - course the Queue may no longer be full or empty by the time a calling - thread sees those exceptions, though). Before, the exceptions could - also be raised if it was "merely inconvenient" for the implementation - to determine the true state of the Queue (because the Queue was locked - by some other method in progress). - -- Bugs #979794 and #980117: difflib.get_grouped_opcodes() now handles the - case of comparing two empty lists. This affected both context_diff() and - unified_diff(), - -- Bug #980938: smtplib now prints debug output to sys.stderr. - -- Bug #930024: posixpath.realpath() now handles infinite loops in symlinks by - returning the last point in the path that was not part of any loop. Thanks - AM Kuchling. - -- Bug #980327: ntpath not handles compressing erroneous slashes between the - drive letter and the rest of the path. Also clearly handles UNC addresses now - as well. Thanks Paul Moore. - -- bug #679953: zipfile.py should now work for files over 2 GB. The packed data - for file sizes (compressed and uncompressed) was being stored as signed - instead of unsigned. - -- decimal.py now only uses signals in the IBM spec. The other conditions are - no longer part of the public API. - -- codecs module now has two new generic APIs: encode() and decode() - which don't restrict the return types (unlike the unicode and - string methods of the same name). - -- Non-blocking SSL sockets work again; they were broken in Python 2.3. - SF patch 945642. - -- doctest unittest integration improvements: - - o Improved the unitest test output for doctest-based unit tests - - o Can now pass setUp and tearDown functions when creating - DocTestSuites. - -- The threading module has a new class, local, for creating objects - that provide thread-local data. - -- Bug #990307: when keep_empty_values is True, cgi.parse_qsl() - no longer returns spurious empty fields. - -- Implemented bind_textdomain_codeset() in gettext module. - -- Introduced in gettext module the l*gettext() family of functions, - which return translation strings encoded in the preferred encoding, - as informed by locale module's getpreferredencoding(). - -- optparse module (and tests) upgraded to Optik 1.5a1. Changes: - - - Add expansion of default values in help text: the string - "%default" in an option's help string is expanded to str() of - that option's default value, or "none" if no default value. - - - Bug #955889: option default values that happen to be strings are - now processed in the same way as values from the command line; this - allows generation of nicer help when using custom types. Can - be disabled with parser.set_process_default_values(False). - - - Bug #960515: don't crash when generating help for callback - options that specify 'type', but not 'dest' or 'metavar'. - - - Feature #815264: change the default help format for short options - that take an argument from e.g. "-oARG" to "-o ARG"; add - set_short_opt_delimiter() and set_long_opt_delimiter() methods to - HelpFormatter to allow (slight) customization of the formatting. - - - Patch #736940: internationalize Optik: all built-in user- - targeted literal strings are passed through gettext.gettext(). (If - you want translations (.po files), they're not included with Python - -- you'll find them in the Optik source distribution from - http://optik.sourceforge.net/ .) - - - Bug #878453: respect $COLUMNS environment variable for - wrapping help output. - - - Feature #988122: expand "%prog" in the 'description' passed - to OptionParser, just like in the 'usage' and 'version' strings. - (This is *not* done in the 'description' passed to OptionGroup.) - -C API ------ - -- PyImport_ExecCodeModule() and PyImport_ExecCodeModuleEx(): if an - error occurs while loading the module, these now delete the module's - entry from sys.modules. All ways of loading modules eventually call - one of these, so this is an error-case change in semantics for all - ways of loading modules. In rare cases, a module loader may wish - to keep a module object in sys.modules despite that the module's - code cannot be executed. In such cases, the module loader must - arrange to reinsert the name and module object in sys.modules. - PyImport_ReloadModule() has been changed to reinsert the original - module object into sys.modules if the module reload fails, so that - its visible semantics have not changed. - -- A large pile of datetime field-extraction macros is now documented, - thanks to Anthony Tuininga (patch #986010). - -Documentation -------------- - -- Improved the tutorial on creating types in C. - - - point out the importance of reassigning data members before - assigning their values - - - correct my misconception about return values from visitprocs. Sigh. - - - mention the labor saving Py_VISIT and Py_CLEAR macros. - -- Major rewrite of the math module docs, to address common confusions. - -Tests ------ - -- The test data files for the decimal test suite are now installed on - platforms that use the Makefile. - -- SF patch 995225: The test file testtar.tar accidentally contained - CVS keywords (like $Id$), which could cause spurious failures in - test_tarfile.py depending on how the test file was checked out. - - -What's New in Python 2.4 alpha 1? -================================= - -*Release date: 08-JUL-2004* - -Core and builtins ------------------ - -- weakref.ref is now the type object also known as - weakref.ReferenceType; it can be subclassed like any other new-style - class. There's less per-entry overhead in WeakValueDictionary - objects now (one object instead of three). - -- Bug #951851: Python crashed when reading import table of certain - Windows DLLs. - -- Bug #215126. The locals argument to eval(), execfile(), and exec now - accept any mapping type. - -- marshal now shares interned strings. This change introduces - a new .pyc magic. - -- Bug #966623. classes created with type() in an exec(, {}) don't - have a __module__, but code in typeobject assumed it would always - be there. - -- Python no longer relies on the LC_NUMERIC locale setting to be - the "C" locale; as a result, it no longer tries to prevent changing - the LC_NUMERIC category. - -- Bug #952807: Unpickling pickled instances of subclasses of - datetime.date, datetime.datetime and datetime.time could yield insane - objects. Thanks to Jiwon Seo for a fix. - -- Bug #845802: Python crashes when __init__.py is a directory. - -- Unicode objects received two new methods: iswide() and width(). - These query East Asian width information, as specified in Unicode - TR11. - -- Improved the tuple hashing algorithm to give fewer collisions in - common cases. Fixes bug #942952. - -- Implemented generator expressions (PEP 289). Coded by Jiwon Seo. - -- Enabled the profiling of C extension functions (and builtins) - check - new documentation and modified profile and bdb modules for more details - -- Set file.name to the object passed to open (instead of a new string) - -- Moved tracebackobject into traceback.h and renamed to PyTracebackObject - -- Optimized the byte coding for multiple assignments like "a,b=b,a" and - "a,b,c=1,2,3". Improves their speed by 25% to 30%. - -- Limit the nested depth of a tuple for the second argument to isinstance() - and issubclass() to the recursion limit of the interpreter. - Fixes bug #858016 . - -- Optimized dict iterators, creating separate types for each - and having them reveal their length. Also optimized the - methods: keys(), values(), and items(). - -- Implemented a newcode opcode, LIST_APPEND, that simplifies - the generated bytecode for list comprehensions and further - improves their performance (about 35%). - -- Implemented rich comparisons for floats, which seems to make - comparisons involving NaNs somewhat less surprising when the - underlying C compiler actually implements C99 semantics. - -- Optimized list.extend() to save memory and no longer create - intermediate sequences. Also, extend() now pre-allocates the - needed memory whenever the length of the iterable is known in - advance -- this halves the time to extend the list. - -- Optimized list resize operations to make fewer calls to the system - realloc(). Significantly speeds up list appends, list pops, - list comprehensions, and the list constructor (when the input iterable - length is not known). - -- Changed the internal list over-allocation scheme. For larger lists, - overallocation ranged between 3% and 25%. Now, it is a constant 12%. - For smaller lists (n<8), overallocation was upto eight elements. Now, - the overallocation is no more than three elements -- this improves space - utilization for applications that have large numbers of small lists. - -- Most list bodies now get re-used rather than freed. Speeds up list - instantiation and deletion by saving calls to malloc() and free(). - -- The dict.update() method now accepts all the same argument forms - as the dict() constructor. This now includes item lists and/or - keyword arguments. - -- Support for arbitrary objects supporting the read-only buffer - interface as the co_code field of code objects (something that was - only possible to create from C code) has been removed. - -- Made omitted callback and None equivalent for weakref.ref() and - weakref.proxy(); the None case wasn't handled correctly in all - cases. - -- Fixed problem where PyWeakref_NewRef() and PyWeakref_NewProxy() - assumed that initial existing entries in an object's weakref list - would not be removed while allocating a new weakref object. Since - GC could be invoked at that time, however, that assumption was - invalid. In a truly obscure case of GC being triggered during - creation for a new weakref object for an referent which already - has a weakref without a callback which is only referenced from - cyclic trash, a memory error can occur. This consistently created a - segfault in a debug build, but provided less predictable behavior in - a release build. - -- input() builtin function now respects compiler flags such as - __future__ statements. SF patch 876178. - -- Removed PendingDeprecationWarning from apply(). apply() remains - deprecated, but the nuisance warning will not be issued. - -- At Python shutdown time (Py_Finalize()), 2.3 called cyclic garbage - collection twice, both before and after tearing down modules. The - call after tearing down modules has been disabled, because too much - of Python has been torn down then for __del__ methods and weakref - callbacks to execute sanely. The most common symptom was a sequence - of uninformative messages on stderr when Python shut down, produced - by threads trying to raise exceptions, but unable to report the nature - of their problems because too much of the sys module had already been - destroyed. - -- Removed FutureWarnings related to hex/oct literals and conversions - and left shifts. (Thanks to Kalle Svensson for SF patch 849227.) - This addresses most of the remaining semantic changes promised by - PEP 237, except for repr() of a long, which still shows the trailing - 'L'. The PEP appears to promise warnings for operations that - changed semantics compared to Python 2.3, but this is not - implemented; we've suffered through enough warnings related to - hex/oct literals and I think it's best to be silent now. - -- For str and unicode objects, the ljust(), center(), and rjust() - methods now accept an optional argument specifying a fill - character other than a space. - -- When method objects have an attribute that can be satisfied either - by the function object or by the method object, the function - object's attribute usually wins. Christian Tismer pointed out that - that this is really a mistake, because this only happens for special - methods (like __reduce__) where the method object's version is - really more appropriate than the function's attribute. So from now - on, all method attributes will have precedence over function - attributes with the same name. - -- Critical bugfix, for SF bug 839548: if a weakref with a callback, - its callback, and its weakly referenced object, all became part of - cyclic garbage during a single run of garbage collection, the order - in which they were torn down was unpredictable. It was possible for - the callback to see partially-torn-down objects, leading to immediate - segfaults, or, if the callback resurrected garbage objects, to - resurrect insane objects that caused segfaults (or other surprises) - later. In one sense this wasn't surprising, because Python's cyclic gc - had no knowledge of Python's weakref objects. It does now. When - weakrefs with callbacks become part of cyclic garbage now, those - weakrefs are cleared first. The callbacks don't trigger then, - preventing the problems. If you need callbacks to trigger, then just - as when cyclic gc is not involved, you need to write your code so - that weakref objects outlive the objects they weakly reference. - -- Critical bugfix, for SF bug 840829: if cyclic garbage collection - happened to occur during a weakref callback for a new-style class - instance, subtle memory corruption was the result (in a release build; - in a debug build, a segfault occurred reliably very soon after). - This has been repaired. - -- Compiler flags set in PYTHONSTARTUP are now active in __main__. - -- Added two builtin types, set() and frozenset(). - -- Added a reversed() builtin function that returns a reverse iterator - over a sequence. - -- Added a sorted() builtin function that returns a new sorted list - from any iterable. - -- CObjects are now mutable (on the C level) through PyCObject_SetVoidPtr. - -- list.sort() now supports three keyword arguments: cmp, key, and reverse. - The key argument can be a function of one argument that extracts a - comparison key from the original record: mylist.sort(key=str.lower). - The reverse argument is a boolean value and if True will change the - sort order as if the comparison arguments were reversed. In addition, - the documentation has been amended to provide a guarantee that all sorts - starting with Py2.3 are guaranteed to be stable (the relative order of - records with equal keys is unchanged). - -- Added test whether wchar_t is signed or not. A signed wchar_t is not - usable as internal unicode type base for Py_UNICODE since the - unicode implementation assumes an unsigned type. - -- Fixed a bug in the cache of length-one Unicode strings that could - lead to a seg fault. The specific problem occurred when an earlier, - non-fatal error left an uninitialized Unicode object in the - freelist. - -- The % formatting operator now supports '%F' which is equivalent to - '%f'. This has always been documented but never implemented. - -- complex(obj) could leak a little memory if obj wasn't a string or - number. - -- zip() with no arguments now returns an empty list instead of raising - a TypeError exception. - -- obj.__contains__() now returns True/False instead of 1/0. SF patch - 820195. - -- Python no longer tries to be smart about recursive comparisons. - When comparing containers with cyclic references to themselves it - will now just hit the recursion limit. See SF patch 825639. - -- str and unicode builtin types now have an rsplit() method that is - same as split() except that it scans the string from the end - working towards the beginning. See SF feature request 801847. - -- Fixed a bug in object.__reduce_ex__ when using protocol 2. Failure - to clear the error when attempts to get the __getstate__ attribute - fail caused intermittent errors and odd behavior. - -- buffer objects based on other objects no longer cache a pointer to - the data and the data length. Instead, the appropriate tp_as_buffer - method is called as necessary. - -- fixed: if a file is opened with an explicit buffer size >= 1, repeated - close() calls would attempt to free() the buffer already free()ed on - the first call. - - -Extension modules ------------------ - -- Added socket.getservbyport(), and make the second argument in - getservbyname() and getservbyport() optional. - -- time module code that deals with input POSIX timestamps will now raise - ValueError if more than a second is lost in precision when the - timestamp is cast to the platform C time_t type. There's no chance - that the platform will do anything sensible with the result in such - cases. This includes ctime(), localtime() and gmtime(). Assorted - fromtimestamp() and utcfromtimestamp() methods in the datetime module - were also protected. Closes bugs #919012 and 975996. - -- fcntl.ioctl now warns if the mutate flag is not specified. - -- nt now properly allows to refer to UNC roots, e.g. in nt.stat(). - -- the weakref module now supports additional objects: array.array, - sre.pattern_objects, file objects, and sockets. - -- operator.isMappingType() and operator.isSequenceType() now give - fewer false positives. - -- socket.sslerror is now a subclass of socket.error . Also added - socket.error to the socket module's C API. - -- Bug #920575: A problem where the _locale module segfaults on - nl_langinfo(ERA) caused by GNU libc's illegal NULL return is fixed. - -- array objects now support the copy module. Also, their resizing - scheme has been updated to match that used for list objects. This improves - the performance (speed and memory usage) of append() operations. - Also, array.array() and array.extend() now accept any iterable argument - for repeated appends without needing to create another temporary array. - -- cStringIO.writelines() now accepts any iterable argument and writes - the lines one at a time rather than joining them and writing once. - Made a parallel change to StringIO.writelines(). Saves memory and - makes suitable for use with generator expressions. - -- time.strftime() now checks that the values in its time tuple argument - are within the proper boundaries to prevent possible crashes from the - platform's C library implementation of strftime(). Can possibly - break code that uses values outside the range that didn't cause - problems previously (such as sitting day of year to 0). Fixes bug - #897625. - -- The socket module now supports Bluetooth sockets, if the - system has - -- Added a collections module containing a new datatype, deque(), - offering high-performance, thread-safe, memory friendly appends - and pops on either side of the deque. - -- Several modules now take advantage of collections.deque() for - improved performance: Queue, mutex, shlex, threading, and pydoc. - -- The operator module has two new functions, attrgetter() and - itemgetter() which are useful for creating fast data extractor - functions for map(), list.sort(), itertools.groupby(), and - other functions that expect a function argument. - -- socket.SHUT_{RD,WR,RDWR} was added. - -- os.getsid was added. - -- The pwd module incorrectly advertised its struct type as - struct_pwent; this has been renamed to struct_passwd. (The old name - is still supported for backwards compatibility.) - -- The xml.parsers.expat module now provides Expat 1.95.7. - -- socket.IPPROTO_IPV6 was added. - -- readline.clear_history was added. - -- select.select() now accepts sequences for its first three arguments. - -- cStringIO now supports the f.closed attribute. - -- The signal module now exposes SIGRTMIN and SIGRTMAX (if available). - -- curses module now supports use_default_colors(). [patch #739124] - -- Bug #811028: ncurses.h breakage on FreeBSD/MacOS X - -- Bug #814613: INET_ADDRSTRLEN fix needed for all compilers on SGI - -- Implemented non-recursive SRE matching scheme (#757624). - -- Implemented (?(id/name)yes|no) support in SRE (#572936). - -- random.seed() with no arguments or None uses time.time() as a default - seed. Modified to match Py2.2 behavior and use fractional seconds so - that successive runs are more likely to produce different sequences. - -- random.Random has a new method, getrandbits(k), which returns an int - with k random bits. This method is now an optional part of the API - for user defined generators. Any generator that defines genrandbits() - can now use randrange() for ranges with a length >= 2**53. Formerly, - randrange would return only even numbers for ranges that large (see - SF bug #812202). Generators that do not define genrandbits() now - issue a warning when randrange() is called with a range that large. - -- itertools has a new function, groupby() for aggregating iterables - into groups sharing the same key (as determined by a key function). - It offers some of functionality of SQL's groupby keyword and of - the Unix uniq filter. - -- itertools now has a new tee() function which produces two independent - iterators from a single iterable. - -- itertools.izip() with no arguments now returns an empty iterator instead - of raising a TypeError exception. - -- Fixed #853061: allow BZ2Compressor.compress() to receive an empty string - as parameter. - -Library -------- - -- Added a new module: cProfile, a C profiler with the same interface as the - profile module. cProfile avoids some of the drawbacks of the hotshot - profiler and provides a bit more information than the other two profilers. - Based on "lsprof" (patch #1212837). - -- Bug #1266283: The new function "lexists" is now in os.path.__all__. - -- Bug #981530: Fix UnboundLocalError in shutil.rmtree(). This affects - the documented behavior: the function passed to the onerror() - handler can now also be os.listdir. - -- Bug #754449: threading.Thread objects no longer mask exceptions raised during - interpreter shutdown with another exception from attempting to handle the - original exception. - -- Added decimal.py per PEP 327. - -- Bug #981299: rsync is now a recognized protocol in urlparse that uses a - "netloc" portion of a URL. - -- Bug #919012: shutil.move() will not try to move a directory into itself. - Thanks Johannes Gijsbers. - -- Bug #934282: pydoc.stripid() is now case-insensitive. Thanks Robin Becker. - -- Bug #823209: cmath.log() now takes an optional base argument so that its - API matches math.log(). - -- Bug #957381: distutils bdist_rpm no longer fails on recent RPM versions - that generate a -debuginfo.rpm - -- os.path.devnull has been added for all supported platforms. - -- Fixed #877165: distutils now picks the right C++ compiler command - on cygwin and mingw32. - -- urllib.urlopen().readline() now handles HTTP/0.9 correctly. - -- refactored site.py into functions. Also wrote regression tests for the - module. - -- The distutils install command now supports the --home option and - installation scheme for all platforms. - -- asyncore.loop now has a repeat count parameter that defaults to - looping forever. - -- The distutils sdist command now ignores all .svn directories, in - addition to CVS and RCS directories. .svn directories hold - administrative files for the Subversion source control system. - -- Added a new module: cookielib. Automatic cookie handling for HTTP - clients. Also, support for cookielib has been added to urllib2, so - urllib2.urlopen() can transparently handle cookies. - -- stringprep.py now uses built-in set() instead of sets.Set(). - -- Bug #876278: Unbounded recursion in modulefinder - -- Bug #780300: Swap public and system ID in LexicalHandler.startDTD. - Applications relying on the wrong order need to be corrected. - -- Bug #926075: Fixed a bug that returns a wrong pattern object - for a string or unicode object in sre.compile() when a different - type pattern with the same value exists. - -- Added countcallers arg to trace.Trace class (--trackcalls command line arg - when run from the command prompt). - -- Fixed a caching bug in platform.platform() where the argument of 'terse' was - not taken into consideration when caching value. - -- Added two new command-line arguments for profile (output file and - default sort). - -- Added global runctx function to profile module - -- Add hlist missing entryconfigure and entrycget methods. - -- The ptcp154 codec was added for Kazakh character set support. - -- Support non-anonymous ftp URLs in urllib2. - -- The encodings package will now apply codec name aliases - first before starting to try the import of the codec module. - This simplifies overriding built-in codecs with external - packages, e.g. the included CJK codecs with the JapaneseCodecs - package, by adjusting the aliases dictionary in encodings.aliases - accordingly. - -- base64 now supports RFC 3548 Base16, Base32, and Base64 encoding and - decoding standards. - -- urllib2 now supports processors. A processor is a handler that - implements an xxx_request or xxx_response method. These methods are - called for all requests. - -- distutils compilers now compile source files in the same order as - they are passed to the compiler. - -- pprint.pprint() and pprint.pformat() now have additional parameters - indent, width and depth. - -- Patch #750542: pprint now will pretty print subclasses of list, tuple - and dict too, as long as they don't overwrite __repr__(). - -- Bug #848614: distutils' msvccompiler fails to find the MSVC6 - compiler because of incomplete registry entries. - -- httplib.HTTP.putrequest now offers to omit the implicit Accept-Encoding. - -- Patch #841977: modulefinder didn't find extension modules in packages - -- imaplib.IMAP4.thread was added. - -- Plugged a minor hole in tempfile.mktemp() due to the use of - os.path.exists(), switched to using os.lstat() directly if possible. - -- bisect.py and heapq.py now have underlying C implementations - for better performance. - -- heapq.py has two new functions, nsmallest() and nlargest(). - -- traceback.format_exc has been added (similar to print_exc but it returns - a string). - -- xmlrpclib.MultiCall has been added. - -- poplib.POP3_SSL has been added. - -- tmpfile.mkstemp now returns an absolute path even if dir is relative. - -- urlparse is RFC 2396 compliant. - -- The fieldnames argument to the csv module's DictReader constructor is now - optional. If omitted, the first row of the file will be used as the - list of fieldnames. - -- encodings.bz2_codec was added for access to bz2 compression - using "a long string".encode('bz2') - -- Various improvements to unittest.py, realigned with PyUnit CVS. - -- dircache now passes exceptions to the caller, instead of returning - empty lists. - -- The bsddb module and dbhash module now support the iterator and - mapping protocols which make them more substitutable for dictionaries - and shelves. - -- The csv module's DictReader and DictWriter classes now accept keyword - arguments. This was an omission in the initial implementation. - -- The email package handles some RFC 2231 parameters with missing - CHARSET fields better. It also includes a patch to parameter - parsing when semicolons appear inside quotes. - -- sets.py now runs under Py2.2. In addition, the argument restrictions - for most set methods (but not the operators) have been relaxed to - allow any iterable. - -- _strptime.py now has a behind-the-scenes caching mechanism for the most - recent TimeRE instance used along with the last five unique directive - patterns. The overall module was also made more thread-safe. - -- random.cunifvariate() and random.stdgamma() were deprecated in Py2.3 - and removed in Py2.4. - -- Bug #823328: urllib2.py's HTTP Digest Auth support works again. - -- Patch #873597: CJK codecs are imported into rank of default codecs. - -Tools/Demos ------------ - -- A hotshotmain script was added to the Tools/scripts directory that - makes it easy to run a script under control of the hotshot profiler. - -- The db2pickle and pickle2db scripts can now dump/load gdbm files. - -- The file order on the command line of the pickle2db script was reversed. - It is now [ picklefile ] dbfile. This provides better symmetry with - db2pickle. The file arguments to both scripts are now source followed by - destination in situations where both files are given. - -- The pydoc script will display a link to the module documentation for - modules determined to be part of the core distribution. The documentation - base directory defaults to http://www.python.org/doc/current/lib/ but can - be changed by setting the PYTHONDOCS environment variable. - -- texcheck.py now detects double word errors. - -- md5sum.py mistakenly opened input files in text mode by default, a - silent and dangerous change from previous releases. It once again - opens input files in binary mode by default. The -t and -b flags - remain for compatibility with the 2.3 release, but -b is the default - now. - -- py-electric-colon now works when pending-delete/delete-selection mode is - in effect - -- py-help-at-point is no longer bound to the F1 key - it's still bound to - C-c C-h - -- Pynche was fixed to not crash when there is no ~/.pynche file and no - -d option was given. - -Build ------ - -- Bug #978645: Modules/getpath.c now builds properly in --disable-framework - build under OS X. - -- Profiling using gprof is now available if Python is configured with - --enable-profiling. - -- Profiling the VM using the Pentium TSC is now possible if Python - is configured --with-tsc. - -- In order to find libraries, setup.py now also looks in /lib64, for use - on AMD64. - -- Bug #934635: Fixed a bug where the configure script couldn't detect - getaddrinfo() properly if the KAME stack had SCTP support. - -- Support for missing ANSI C header files (limits.h, stddef.h, etc) was - removed. - -- Systems requiring the D4, D6 or D7 variants of pthreads are no longer - supported (see PEP 11). - -- Universal newline support can no longer be disabled (see PEP 11). - -- Support for DGUX, SunOS 4, IRIX 4 and Minix was removed (see PEP 11). - -- Support for systems requiring --with-dl-dld or --with-sgi-dl was removed - (see PEP 11). - -- Tests for sizeof(char) were removed since ANSI C mandates that - sizeof(char) must be 1. - -C API ------ - -- Thanks to Anthony Tuininga, the datetime module now supplies a C API - containing type-check macros and constructors. See new docs in the - Python/C API Reference Manual for details. - -- Private function _PyTime_DoubleToTimet added, to convert a Python - timestamp (C double) to platform time_t with some out-of-bounds - checking. Declared in new header file timefuncs.h. It would be - good to expose some other internal timemodule.c functions there. - -- New public functions PyEval_EvaluateFrame and PyGen_New to expose - generator objects. - -- New public functions Py_IncRef() and Py_DecRef(), exposing the - functionality of the Py_XINCREF() and Py_XDECREF macros. Useful for - runtime dynamic embedding of Python. See patch #938302, by Bob - Ippolito. - -- Added a new macro, PySequence_Fast_ITEMS, which retrieves a fast sequence's - underlying array of PyObject pointers. Useful for high speed looping. - -- Created a new method flag, METH_COEXIST, which causes a method to be loaded - even if already defined by a slot wrapper. This allows a __contains__ - method, for example, to co-exist with a defined sq_contains slot. This - is helpful because the PyCFunction can take advantage of optimized calls - whenever METH_O or METH_NOARGS flags are defined. - -- Added a new function, PyDict_Contains(d, k) which is like - PySequence_Contains() but is specific to dictionaries and executes - about 10% faster. - -- Added three new macros: Py_RETURN_NONE, Py_RETURN_TRUE, and Py_RETURN_FALSE. - Each return the singleton they mention after Py_INCREF()ing them. - -- Added a new function, PyTuple_Pack(n, ...) for constructing tuples from a - variable length argument list of Python objects without having to invoke - the more complex machinery of Py_BuildValue(). PyTuple_Pack(3, a, b, c) - is equivalent to Py_BuildValue("(OOO)", a, b, c). - -Windows -------- - -- The _winreg module could segfault when reading very large registry - values, due to unchecked alloca() calls (SF bug 851056). The fix is - uses either PyMem_Malloc(n) or PyString_FromStringAndSize(NULL, n), - as appropriate, followed by a size check. - -- file.truncate() could misbehave if the file was open for update - (modes r+, rb+, w+, wb+), and the most recent file operation before - the truncate() call was an input operation. SF bug 801631. - - -What's New in Python 2.3 final? -=============================== - -*Release date: 29-Jul-2003* - -IDLE ----- - -- Bug 778400: IDLE hangs when selecting "Edit with IDLE" from explorer. - This was unique to Windows, and was fixed by adding an -n switch to - the command the Windows installer creates to execute "Edit with IDLE" - context-menu actions. - -- IDLE displays a new message upon startup: some "personal firewall" - kinds of programs (for example, ZoneAlarm) open a dialog of their - own when any program opens a socket. IDLE does use sockets, talking - on the computer's internal loopback interface. This connection is not - visible on any external interface and no data is sent to or received - from the Internet. So, if you get such a dialog when opening IDLE, - asking whether to let pythonw.exe talk to address 127.0.0.1, say yes, - and rest assured no communication external to your machine is taking - place. If you don't allow it, IDLE won't be able to start. - - -What's New in Python 2.3 release candidate 2? -============================================= - -*Release date: 24-Jul-2003* - -Core and builtins ------------------ - -- It is now possible to import from zipfiles containing additional - data bytes before the zip compatible archive. Zipfiles containing a - comment at the end are still unsupported. - -Extension modules ------------------ - -- A longstanding bug in the parser module's initialization could cause - fatal internal refcount confusion when the module got initialized more - than once. This has been fixed. - -- Fixed memory leak in pyexpat; using the parser's ParseFile() method - with open files that aren't instances of the standard file type - caused an instance of the bound .read() method to be leaked on every - call. - -- Fixed some leaks in the locale module. - -Library -------- - -- Lib/encodings/rot_13.py when used as a script, now more properly - uses the first Python interpreter on your path. - -- Removed caching of TimeRE (and thus LocaleTime) in _strptime.py to - fix a locale related bug in the test suite. Although another patch - was needed to actually fix the problem, the cache code was not - restored. - -IDLE ----- - -- Calltips patches. - -Build ------ - -- For MacOSX, added -mno-fused-madd to BASECFLAGS to fix test_coercion - on Panther (OSX 10.3). - -C API ------ - -Windows -------- - -- The tempfile module could do insane imports on Windows if PYTHONCASEOK - was set, making temp file creation impossible. Repaired. - -- Add a patch to workaround pthread_sigmask() bugs in Cygwin. - -Mac ---- - -- Various fixes to pimp. - -- Scripts runs with pythonw no longer had full window manager access. - -- Don't force boot-disk-only install, for reasons unknown it causes - more problems than it solves. - - -What's New in Python 2.3 release candidate 1? -============================================= - -*Release date: 18-Jul-2003* - -Core and builtins ------------------ - -- The new function sys.getcheckinterval() returns the last value set - by sys.setcheckinterval(). - -- Several bugs in the symbol table phase of the compiler have been - fixed. Errors could be lost and compilation could fail without - reporting an error. SF patch 763201. - -- The interpreter is now more robust about importing the warnings - module. In an executable generated by freeze or similar programs, - earlier versions of 2.3 would fail if the warnings module could - not be found on the file system. Fixes SF bug 771097. - -- A warning about assignments to module attributes that shadow - builtins, present in earlier releases of 2.3, has been removed. - -- It is not possible to create subclasses of builtin types like str - and tuple that define an itemsize. Earlier releases of Python 2.3 - allowed this by mistake, leading to crashes and other problems. - -- The thread_id is now initialized to 0 in a non-thread build. SF bug - 770247. - -- SF bug 762891: "del p[key]" on proxy object no longer raises SystemError. - -Extension modules ------------------ - -- weakref.proxy() can now handle "del obj[i]" for proxy objects - defining __delitem__. Formerly, it generated a SystemError. - -- SSL no longer crashes the interpreter when the remote side disconnects. - -- On Unix the mmap module can again be used to map device files. - -- time.strptime now exclusively uses the Python implementation - contained within the _strptime module. - -- The print slot of weakref proxy objects was removed, because it was - not consistent with the object's repr slot. - -- The mmap module only checks file size for regular files, not - character or block devices. SF patch 708374. - -- The cPickle Pickler garbage collection support was fixed to traverse - the find_class attribute, if present. - -- There are several fixes for the bsddb3 wrapper module. - - bsddb3 no longer crashes if an environment is closed before a cursor - (SF bug 763298). - - The DB and DBEnv set_get_returns_none function was extended to take - a level instead of a boolean flag. The new level 2 means that in - addition, cursor.set()/.get() methods return None instead of raising - an exception. - - A typo was fixed in DBCursor.join_item(), preventing a crash. - -Library -------- - -- distutils now supports MSVC 7.1 - -- doctest now examines all docstrings by default. Previously, it would - skip over functions with private names (as indicated by the underscore - naming convention). The old default created too much of a risk that - user tests were being skipped inadvertently. Note, this change could - break code in the unlikely case that someone had intentionally put - failing tests in the docstrings of private functions. The breakage - is easily fixable by specifying the old behavior when calling testmod() - or Tester(). - -- There were several fixes to the way dumbdbms are closed. It's vital - that a dumbdbm database be closed properly, else the on-disk data - and directory files can be left in mutually inconsistent states. - dumbdbm.py's _Database.__del__() method attempted to close the - database properly, but a shutdown race in _Database._commit() could - prevent this from working, so that a program trusting __del__() to - get the on-disk files in synch could be badly surprised. The race - has been repaired. A sync() method was also added so that shelve - can guarantee data is written to disk. - - The close() method can now be called more than once without complaint. - -- The classes in threading.py are now new-style classes. That they - weren't before was an oversight. - -- The urllib2 digest authentication handlers now define the correct - auth_header. The earlier versions would fail at runtime. - -- SF bug 763023: fix uncaught ZeroDivisionError in difflib ratio methods - when there are no lines. - -- SF bug 763637: fix exception in Tkinter with after_cancel - which could occur with Tk 8.4 - -- SF bug 770601: CGIHTTPServer.py now passes the entire environment - to child processes. - -- SF bug 765238: add filter to fnmatch's __all__. - -- SF bug 748201: make time.strptime() error messages more helpful. - -- SF patch 764470: Do not dump the args attribute of a Fault object in - xmlrpclib. - -- SF patch 549151: urllib and urllib2 now redirect POSTs on 301 - responses. - -- SF patch 766650: The whichdb module was fixed to recognize dbm files - generated by gdbm on OS/2 EMX. - -- SF bugs 763047 and 763052: fixes bug of timezone value being left as - -1 when ``time.tzname[0] == time.tzname[1] and not time.daylight`` - is true when it should only when time.daylight is true. - -- SF bug 764548: re now allows subclasses of str and unicode to be - used as patterns. - -- SF bug 763637: In Tkinter, change after_cancel() to handle tuples - of varying sizes. Tk 8.4 returns a different number of values - than Tk 8.3. - -- SF bug 763023: difflib.ratio() did not catch zero division. - -- The Queue module now has an __all__ attribute. - -Tools/Demos ------------ - -- See Lib/idlelib/NEWS.txt for IDLE news. - -- SF bug 753592: webchecker/wsgui now handles user supplied directories. - -- The trace.py script has been removed. It is now in the standard library. - -Build ------ - -- Python now compiles with -fno-strict-aliasing if possible (SF bug 766696). - -- The socket module compiles on IRIX 6.5.10. - -- An irix64 system is treated the same way as an irix6 system (SF - patch 764560). - -- Several definitions were missing on FreeBSD 5.x unless the - __BSD_VISIBLE symbol was defined. configure now defines it as - needed. - -C API ------ - -- Unicode objects now support mbcs as a built-in encoding, so the C - API can use it without deferring to the encodings package. - -Windows -------- - -- The Windows implementation of PyThread_start_new_thread() never - checked error returns from Windows functions correctly. As a result, - it could claim to start a new thread even when the Microsoft - _beginthread() function failed (due to "too many threads" -- this is - on the order of thousands when it happens). In these cases, the - Python exception :: - - thread.error: can't start new thread - - is raised now. - -- SF bug 766669: Prevent a GPF on interpreter exit when sockets are in - use. The interpreter now calls WSACleanup() from Py_Finalize() - instead of from DLL teardown. - -Mac ---- - -- Bundlebuilder now inherits default values in the right way. It was - previously possible for app bundles to get a type of "BNDL" instead - of "APPL." Other improvements include, a --build-id option to - specify the CFBundleIdentifier and using the --python option to set - the executable in the bundle. - -- Fixed two bugs in MacOSX framework handling. - -- pythonw did not allow user interaction in 2.3rc1, this has been fixed. - -- Python is now compiled with -mno-fused-madd, making all tests pass - on Panther. - -What's New in Python 2.3 beta 2? -================================ - -*Release date: 29-Jun-2003* - -Core and builtins ------------------ - -- A program can now set the environment variable PYTHONINSPECT to some - string value in Python, and cause the interpreter to enter the - interactive prompt at program exit, as if Python had been invoked - with the -i option. - -- list.index() now accepts optional start and stop arguments. Similar - changes were made to UserList.index(). SF feature request 754014. - -- SF patch 751998 fixes an unwanted side effect of the previous fix - for SF bug 742860 (the next item). - -- SF bug 742860: "WeakKeyDictionary __delitem__ uses iterkeys". This - wasn't threadsafe, was very inefficient (expected time O(len(dict)) - instead of O(1)), and could raise a spurious RuntimeError if another - thread mutated the dict during __delitem__, or if a comparison function - mutated it. It also neglected to raise KeyError when the key wasn't - present; didn't raise TypeError when the key wasn't of a weakly - referencable type; and broke various more-or-less obscure dict - invariants by using a sequence of equality comparisons over the whole - set of dict keys instead of computing the key's hash code to narrow - the search to those keys with the same hash code. All of these are - considered to be bugs. A new implementation of __delitem__ repairs all - that, but note that fixing these bugs may change visible behavior in - code relying (whether intentionally or accidentally) on old behavior. - -- SF bug 734869: Fixed a compiler bug that caused a fatal error when - compiling a list comprehension that contained another list comprehension - embedded in a lambda expression. - -- SF bug 705231: builtin pow() no longer lets the platform C pow() - raise -1.0 to integer powers, because (at least) glibc gets it wrong - in some cases. The result should be -1.0 if the power is odd and 1.0 - if the power is even, and any float with a sufficiently large exponent - is (mathematically) an exact even integer. - -- SF bug 759227: A new-style class that implements __nonzero__() must - return a bool or int (but not an int subclass) from that method. This - matches the restriction on classic classes. - -- The encoding attribute has been added for file objects, and set to - the terminal encoding on Unix and Windows. - -- The softspace attribute of file objects became read-only by oversight. - It's writable again. - -- Reverted a 2.3 beta 1 change to iterators for subclasses of list and - tuple. By default, the iterators now access data elements directly - instead of going through __getitem__. If __getitem__ access is - preferred, then __iter__ can be overridden. - -- SF bug 735247: The staticmethod and super types participate in - garbage collection. Before this change, it was possible for leaks to - occur in functions with non-global free variables that used these types. - -Extension modules ------------------ - -- the socket module has a new exception, socket.timeout, to allow - timeouts to be handled separately from other socket errors. - -- SF bug 751276: cPickle has fixed to propagate exceptions raised in - user code. In earlier versions, cPickle caught and ignored any - exception when it performed operations that it expected to raise - specific exceptions like AttributeError. - -- cPickle Pickler and Unpickler objects now participate in garbage - collection. - -- mimetools.choose_boundary() could return duplicate strings at times, - especially likely on Windows. The strings returned are now guaranteed - unique within a single program run. - -- thread.interrupt_main() raises KeyboardInterrupt in the main thread. - dummy_thread has also been modified to try to simulate the behavior. - -- array.array.insert() now treats negative indices as being relative - to the end of the array, just like list.insert() does. (SF bug #739313) - -- The datetime module classes datetime, time, and timedelta are now - properly subclassable. - -- _tkinter.{get|set}busywaitinterval was added. - -- itertools.islice() now accepts stop=None as documented. - Fixes SF bug #730685. - -- the bsddb185 module is built in one restricted instance - - /usr/include/db.h exists and defines HASHVERSION to be 2. This is true - for many BSD-derived systems. - - -Library -------- - -- Some happy doctest extensions from Jim Fulton have been added to - doctest.py. These are already being used in Zope3. The two - primary ones: - - doctest.debug(module, name) extracts the doctests from the named object - in the given module, puts them in a temp file, and starts pdb running - on that file. This is great when a doctest fails. - - doctest.DocTestSuite(module=None) returns a synthesized unittest - TestSuite instance, to be run by the unittest framework, which - runs all the doctests in the module. This allows writing tests in - doctest style (which can be clearer and shorter than writing tests - in unittest style), without losing unittest's powerful testing - framework features (which doctest lacks). - -- For compatibility with doctests created before 2.3, if an expected - output block consists solely of "1" and the actual output block - consists solely of "True", it's accepted as a match; similarly - for "0" and "False". This is quite un-doctest-like, but is practical. - The behavior can be disabled by passing the new doctest module - constant DONT_ACCEPT_TRUE_FOR_1 to the new optionflags optional - argument. - -- ZipFile.testzip() now only traps BadZipfile exceptions. Previously, - a bare except caught to much and reported all errors as a problem - in the archive. - -- The logging module now has a new function, makeLogRecord() making - LogHandler easier to interact with DatagramHandler and SocketHandler. - -- The cgitb module has been extended to support plain text display (SF patch - 569574). - -- A brand new version of IDLE (from the IDLEfork project at - SourceForge) is now included as Lib/idlelib. The old Tools/idle is - no more. - -- Added a new module: trace (documentation missing). This module used - to be distributed in Tools/scripts. It uses sys.settrace() to trace - code execution -- either function calls or individual lines. It can - generate tracing output during execution or a post-mortem report of - code coverage. - -- The threading module has new functions settrace() and setprofile() - that cooperate with the functions of the same name in the sys - module. A function registered with the threading module will - be used for all threads it creates. The new trace module uses this - to provide tracing for code running in threads. - -- copy.py: applied SF patch 707900, fixing bug 702858, by Steven - Taschuk. Copying a new-style class that had a reference to itself - didn't work. (The same thing worked fine for old-style classes.) - Builtin functions are now treated as atomic, fixing bug #746304. - -- difflib.py has two new functions: context_diff() and unified_diff(). - -- More fixes to urllib (SF 549151): (a) When redirecting, always use - GET. This is common practice and more-or-less sanctioned by the - HTTP standard. (b) Add a handler for 307 redirection, which becomes - an error for POST, but a regular redirect for GET and HEAD - -- Added optional 'onerror' argument to os.walk(), to control error - handling. - -- inspect.is{method|data}descriptor was added, to allow pydoc display - __doc__ of data descriptors. - -- Fixed socket speed loss caused by use of the _socketobject wrapper class - in socket.py. - -- timeit.py now checks the current directory for imports. - -- urllib2.py now knows how to order proxy classes, so the user doesn't - have to insert it in front of other classes, nor do dirty tricks like - inserting a "dummy" HTTPHandler after a ProxyHandler when building an - opener with proxy support. - -- Iterators have been added for dbm keys. - -- random.Random objects can now be pickled. - -Tools/Demos ------------ - -- pydoc now offers help on keywords and topics. - -- Tools/idle is gone; long live Lib/idlelib. - -- diff.py prints file diffs in context, unified, or ndiff formats, - providing a command line interface to difflib.py. - -- texcheck.py is a new script for making a rough validation of Python LaTeX - files. - -Build ------ - -- Setting DESTDIR during 'make install' now allows specifying a - different root directory. - -C API ------ - -- PyType_Ready(): If a type declares that it participates in gc - (Py_TPFLAGS_HAVE_GC), and its base class does not, and its base class's - tp_free slot is the default _PyObject_Del, and type does not define - a tp_free slot itself, _PyObject_GC_Del is assigned to type->tp_free. - Previously _PyObject_Del was inherited, which could at best lead to a - segfault. In addition, if even after this magic the type's tp_free - slot is _PyObject_Del or NULL, and the type is a base type - (Py_TPFLAGS_BASETYPE), TypeError is raised: since the type is a base - type, its dealloc function must call type->tp_free, and since the type - is gc'able, tp_free must not be NULL or _PyObject_Del. - -- PyThreadState_SetAsyncExc(): A new API (deliberately accessible only - from C) to interrupt a thread by sending it an exception. It is - intentional that you have to write your own C extension to call it - from Python. - - -New platforms -------------- - -None this time. - -Tests ------ - -- test_imp rewritten so that it doesn't raise RuntimeError if run as a - side effect of being imported ("import test.autotest"). - -Windows -------- - -- The Windows installer ships with Tcl/Tk 8.4.3 (upgraded from 8.4.1). - -- The installer always suggested that Python be installed on the C: - drive, due to a hardcoded "C:" generated by the Wise installation - wizard. People with machines where C: is not the system drive - usually want Python installed on whichever drive is their system drive - instead. We removed the hardcoded "C:", and two testers on machines - where C: is not the system drive report that the installer now - suggests their system drive. Note that you can always select the - directory you want in the "Select Destination Directory" dialog -- - that's what it's for. - -Mac ---- - -- There's a new module called "autoGIL", which offers a mechanism to - automatically release the Global Interpreter Lock when an event loop - goes to sleep, allowing other threads to run. It's currently only - supported on OSX, in the Mach-O version. -- The OSA modules now allow direct access to properties of the - toplevel application class (in AppleScript terminology). -- The Package Manager can now update itself. - -SourceForge Bugs and Patches Applied ------------------------------------- - -430160, 471893, 501716, 542562, 549151, 569574, 595837, 596434, -598163, 604210, 604716, 610332, 612627, 614770, 620190, 621891, -622042, 639139, 640236, 644345, 649742, 649742, 658233, 660022, -661318, 661676, 662807, 662923, 666219, 672855, 678325, 682347, -683486, 684981, 685773, 686254, 692776, 692959, 693094, 696777, -697989, 700827, 703666, 708495, 708604, 708901, 710733, 711902, -713722, 715782, 718286, 719359, 719367, 723136, 723831, 723962, -724588, 724767, 724767, 725942, 726150, 726446, 726869, 727051, -727719, 727719, 727805, 728277, 728563, 728656, 729096, 729103, -729293, 729297, 729300, 729317, 729395, 729622, 729817, 730170, -730296, 730594, 730685, 730826, 730963, 731209, 731403, 731504, -731514, 731626, 731635, 731643, 731644, 731644, 731689, 732124, -732143, 732234, 732284, 732284, 732479, 732761, 732783, 732951, -733667, 733781, 734118, 734231, 734869, 735051, 735293, 735527, -735613, 735694, 736962, 736962, 737970, 738066, 739313, 740055, -740234, 740301, 741806, 742126, 742741, 742860, 742860, 742911, -744041, 744104, 744238, 744687, 744877, 745055, 745478, 745525, -745620, 746012, 746304, 746366, 746801, 746953, 747348, 747667, -747954, 748846, 748849, 748973, 748975, 749191, 749210, 749759, -749831, 749911, 750008, 750092, 750542, 750595, 751038, 751107, -751276, 751451, 751916, 751941, 751956, 751998, 752671, 753451, -753602, 753617, 753845, 753925, 754014, 754340, 754447, 755031, -755087, 755147, 755245, 755683, 755987, 756032, 756996, 757058, -757229, 757818, 757821, 757822, 758112, 758910, 759227, 759889, -760257, 760703, 760792, 761104, 761337, 761519, 761830, 762455 - - -What's New in Python 2.3 beta 1? -================================ - -*Release date: 25-Apr-2003* - -Core and builtins ------------------ - -- New format codes B, H, I, k and K have been implemented for - PyArg_ParseTuple and PyBuild_Value. - -- New builtin function sum(seq, start=0) returns the sum of all the - items in iterable object seq, plus start (items are normally numbers, - and cannot be strings). - -- bool() called without arguments now returns False rather than - raising an exception. This is consistent with calling the - constructors for the other builtin types -- called without argument - they all return the false value of that type. (SF patch #724135) - -- In support of PEP 269 (making the pgen parser generator accessible - from Python), some changes to the pgen code structure were made; a - few files that used to be linked only with pgen are now linked with - Python itself. - -- The repr() of a weakref object now shows the __name__ attribute of - the referenced object, if it has one. - -- super() no longer ignores data descriptors, except __class__. See - the thread started at - http://mail.python.org/pipermail/python-dev/2003-April/034338.html - -- list.insert(i, x) now interprets negative i as it would be - interpreted by slicing, so negative values count from the end of the - list. This was the only place where such an interpretation was not - placed on a list index. - -- range() now works even if the arguments are longs with magnitude - larger than sys.maxint, as long as the total length of the sequence - fits. E.g., range(2**100, 2**101, 2**100) is the following list: - [1267650600228229401496703205376L]. (SF patch #707427.) - -- Some horridly obscure problems were fixed involving interaction - between garbage collection and old-style classes with "ambitious" - getattr hooks. If an old-style instance didn't have a __del__ method, - but did have a __getattr__ hook, and the instance became reachable - only from an unreachable cycle, and the hook resurrected or deleted - unreachable objects when asked to resolve "__del__", anything up to - a segfault could happen. That's been repaired. - -- dict.pop now takes an optional argument specifying a default - value to return if the key is not in the dict. If a default is not - given and the key is not found, a KeyError will still be raised. - Parallel changes were made to UserDict.UserDict and UserDict.DictMixin. - [SF patch #693753] (contributed by Michael Stone.) - -- sys.getfilesystemencoding() was added to expose - Py_FileSystemDefaultEncoding. - -- New function sys.exc_clear() clears the current exception. This is - rarely needed, but can sometimes be useful to release objects - referenced by the traceback held in sys.exc_info()[2]. (SF patch - #693195.) - -- On 64-bit systems, a dictionary could contain duplicate long/int keys - if the key value was larger than 2**32. See SF bug #689659. - -- Fixed SF bug #663074. The codec system was using global static - variables to store internal data. As a result, any attempts to use the - unicode system with multiple active interpreters, or successive - interpreter executions, would fail. - -- "%c" % u"a" now returns a unicode string instead of raising a - TypeError. u"%c" % 0xffffffff now raises a OverflowError instead - of a ValueError to be consistent with "%c" % 256. See SF patch #710127. - -Extension modules ------------------ - -- The socket module now provides the functions inet_pton and inet_ntop - for converting between string and packed representation of IP - addresses. There is also a new module variable, has_ipv6, which is - True iff the current Python has IPv6 support. See SF patch #658327. - -- Tkinter wrappers around Tcl variables now pass objects directly - to Tcl, instead of first converting them to strings. - -- The .*? pattern in the re module is now special-cased to avoid the - recursion limit. (SF patch #720991 -- many thanks to Gary Herron - and Greg Chapman.) - -- New function sys.call_tracing() allows pdb to debug code - recursively. - -- New function gc.get_referents(obj) returns a list of objects - directly referenced by obj. In effect, it exposes what the object's - tp_traverse slot does, and can be helpful when debugging memory - leaks. - -- The iconv module has been removed from this release. - -- The platform-independent routines for packing floats in IEEE formats - (struct.pack's f, d codes; pickle and cPickle's protocol 1 - pickling of floats) ignored that rounding can cause a carry to - propagate. The worst consequence was that, in rare cases, f - could produce strings that, when unpacked again, were a factor of 2 - away from the original float. This has been fixed. See SF bug - #705836. - -- New function time.tzset() provides access to the C library tzset() - function, if supported. (SF patch #675422.) - -- Using createfilehandler, deletefilehandler, createtimerhandler functions - on Tkinter.tkinter (_tkinter module) no longer crashes the interpreter. - See SF bug #692416. - -- Modified the fcntl.ioctl() function to allow modification of a passed - mutable buffer (for details see the reference documentation). - -- Made user requested changes to the itertools module. - Subsumed the times() function into repeat(). - Added chain() and cycle(). - -- The rotor module is now deprecated; the encryption algorithm it uses - is not believed to be secure, and including crypto code with Python - has implications for exporting and importing it in various countries. - -- The socket module now always uses the _socketobject wrapper class, even on - platforms which have dup(2). The makefile() method is built directly - on top of the socket without duplicating the file descriptor, allowing - timeouts to work properly. - -Library -------- - -- New generator function os.walk() is an easy-to-use alternative to - os.path.walk(). See os module docs for details. os.path.walk() - isn't deprecated at this time, but may become deprecated in a - future release. - -- Added new module "platform" which provides a wide range of tools - for querying platform dependent features. - -- netrc now allows ASCII punctuation characters in passwords. - -- shelve now supports the optional writeback argument, and exposes - pickle protocol versions. - -- Several methods of nntplib.NNTP have grown an optional file argument - which specifies a file where to divert the command's output - (already supported by the body() method). (SF patch #720468) - -- The self-documenting XML server library DocXMLRPCServer was added. - -- Support for internationalized domain names has been added through - the 'idna' and 'punycode' encodings, the 'stringprep' module, the - 'mkstringprep' tool, and enhancements to the socket and httplib - modules. - -- htmlentitydefs has two new dictionaries: name2codepoint maps - HTML entity names to Unicode codepoints (as integers). - codepoint2name is the reverse mapping. See SF patch #722017. - -- pdb has a new command, "debug", which lets you step through - arbitrary code from the debugger's (pdb) prompt. - -- unittest.failUnlessEqual and its equivalent unittest.assertEqual now - return 'not a == b' rather than 'a != b'. This gives the desired - result for classes that define __eq__ without defining __ne__. - -- sgmllib now supports SGML marked sections, in particular the - MS Office extensions. - -- The urllib module now offers support for the iterator protocol. - SF patch 698520 contributed by Brett Cannon. - -- New module timeit provides a simple framework for timing the - execution speed of expressions and statements. - -- sets.Set objects now support mixed-type __eq__ and __ne__, instead - of raising TypeError. If x is a Set object and y is a non-Set object, - x == y is False, and x != y is True. This is akin to the change made - for mixed-type comparisons of datetime objects in 2.3a2; more info - about the rationale is in the NEWS entry for that. See also SF bug - report . - -- On Unix platforms, if os.listdir() is called with a Unicode argument, - it now returns Unicode strings. (This behavior was added earlier - to the Windows NT/2k/XP version of os.listdir().) - -- Distutils: both 'py_modules' and 'packages' keywords can now be specified - in core.setup(). Previously you could supply one or the other, but - not both of them. (SF patch #695090 from Bernhard Herzog) - -- New csv package makes it easy to read/write CSV files. - -- Module shlex has been extended to allow posix-like shell parsings, - including a split() function for easy spliting of quoted strings and - commands. An iterator interface was also implemented. - -Tools/Demos ------------ - -- New script combinerefs.py helps analyze new PYTHONDUMPREFS output. - See the module docstring for details. - -Build ------ - -- Fix problem building on OSF1 because the compiler only accepted - preprocessor directives that start in column 1. (SF bug #691793.) - -C API ------ - -- Added PyGC_Collect(), equivalent to calling gc.collect(). - -- PyThreadState_GetDict() was changed not to raise an exception or - issue a fatal error when no current thread state is available. This - makes it possible to print dictionaries when no thread is active. - -- LONG_LONG was renamed to PY_LONG_LONG. Extensions that use this and - need compatibility with previous versions can use this: - - #ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG - #endif - -- Added PyObject_SelfIter() to fill the tp_iter slot for the - typical case where the method returns its self argument. - -- The extended type structure used for heap types (new-style - classes defined by Python code using a class statement) is now - exported from object.h as PyHeapTypeObject. (SF patch #696193.) - -New platforms -------------- - -None this time. - -Tests ------ - -- test_timeout now requires -u network to be passed to regrtest to run. - See SF bug #692988. - -Windows -------- - -- os.fsync() now exists on Windows, and calls the Microsoft _commit() - function. - -- New function winsound.MessageBeep() wraps the Win32 API - MessageBeep(). - -Mac ---- - -- os.listdir() now returns Unicode strings on MacOS X when called with - a Unicode argument. See the general news item under "Library". - -- A new method MacOS.WMAvailable() returns true if it is safe to access - the window manager, false otherwise. - -- EasyDialogs dialogs are now movable-modal, and if the application is - currently in the background they will ask to be moved to the foreground - before displaying. - -- OSA Scripting support has improved a lot, and gensuitemodule.py can now - be used by mere mortals. The documentation is now also more or less - complete. - -- The IDE (in a framework build) now includes introductory documentation - in Apple Help Viewer format. - - -What's New in Python 2.3 alpha 2? -================================= - -*Release date: 19-Feb-2003* - -Core and builtins ------------------ - -- Negative positions returned from PEP 293 error callbacks are now - treated as being relative to the end of the input string. Positions - that are out of bounds raise an IndexError. - -- sys.path[0] (the directory from which the script is loaded) is now - turned into an absolute pathname, unless it is the empty string. - (SF patch #664376.) - -- Finally fixed the bug in compile() and exec where a string ending - with an indented code block but no newline would raise SyntaxError. - This would have been a four-line change in parsetok.c... Except - codeop.py depends on this behavior, so a compilation flag had to be - invented that causes the tokenizer to revert to the old behavior; - this required extra changes to 2 .h files, 2 .c files, and 2 .py - files. (Fixes SF bug #501622.) - -- If a new-style class defines neither __new__ nor __init__, its - constructor would ignore all arguments. This is changed now: the - constructor refuses arguments in this case. This might break code - that worked under Python 2.2. The simplest fix is to add a no-op - __init__: ``def __init__(self, *args, **kw): pass``. - -- Through a bytecode optimizer bug (and I bet you didn't even know - Python *had* a bytecode optimizer :-), "unsigned" hex/oct constants - with a leading minus sign would come out with the wrong sign. - ("Unsigned" hex/oct constants are those with a face value in the - range sys.maxint+1 through sys.maxint*2+1, inclusive; these have - always been interpreted as negative numbers through sign folding.) - E.g. 0xffffffff is -1, and -(0xffffffff) is 1, but -0xffffffff would - come out as -4294967295. This was the case in Python 2.2 through - 2.2.2 and 2.3a1, and in Python 2.4 it will once again have that - value, but according to PEP 237 it really needs to be 1 now. This - will be backported to Python 2.2.3 a well. (SF #660455) - -- int(s, base) sometimes sign-folds hex and oct constants; it only - does this when base is 0 and s.strip() starts with a '0'. When the - sign is actually folded, as in int("0xffffffff", 0) on a 32-bit - machine, which returns -1, a FutureWarning is now issued; in Python - 2.4, this will return 4294967295L, as do int("+0xffffffff", 0) and - int("0xffffffff", 16) right now. (PEP 347) - -- super(X, x): x may now be a proxy for an X instance, i.e. - issubclass(x.__class__, X) but not issubclass(type(x), X). - -- isinstance(x, X): if X is a new-style class, this is now equivalent - to issubclass(type(x), X) or issubclass(x.__class__, X). Previously - only type(x) was tested. (For classic classes this was already the - case.) - -- compile(), eval() and the exec statement now fully support source code - passed as unicode strings. - -- int subclasses can be initialized with longs if the value fits in an int. - See SF bug #683467. - -- long(string, base) takes time linear in len(string) when base is a power - of 2 now. It used to take time quadratic in len(string). - -- filter returns now Unicode results for Unicode arguments. - -- raw_input can now return Unicode objects. - -- List objects' sort() method now accepts None as the comparison function. - Passing None is semantically identical to calling sort() with no - arguments. - -- Fixed crash when printing a subclass of str and __str__ returned self. - See SF bug #667147. - -- Fixed an invalid RuntimeWarning and an undetected error when trying - to convert a long integer into a float which couldn't fit. - See SF bug #676155. - -- Function objects now have a __module__ attribute that is bound to - the name of the module in which the function was defined. This - applies for C functions and methods as well as functions and methods - defined in Python. This attribute is used by pickle.whichmodule(), - which changes the behavior of whichmodule slightly. In Python 2.2 - whichmodule() returns "__main__" for functions that are not defined - at the top-level of a module (examples: methods, nested functions). - Now whichmodule() will return the proper module name. - -Extension modules ------------------ - -- operator.isNumberType() now checks that the object has a nb_int or - nb_float slot, rather than simply checking whether it has a non-NULL - tp_as_number pointer. - -- The imp module now has ways to acquire and release the "import - lock": imp.acquire_lock() and imp.release_lock(). Note: this is a - reentrant lock, so releasing the lock only truly releases it when - this is the last release_lock() call. You can check with - imp.lock_held(). (SF bug #580952 and patch #683257.) - -- Change to cPickle to match pickle.py (see below and PEP 307). - -- Fix some bugs in the parser module. SF bug #678518. - -- Thanks to Scott David Daniels, a subtle bug in how the zlib - extension implemented flush() was fixed. Scott also rewrote the - zlib test suite using the unittest module. (SF bug #640230 and - patch #678531.) - -- Added an itertools module containing high speed, memory efficient - looping constructs inspired by tools from Haskell and SML. - -- The SSL module now handles sockets with a timeout set correctly (SF - patch #675750, fixing SF bug #675552). - -- os/posixmodule has grown the sysexits.h constants (EX_OK and friends). - -- Fixed broken threadstate swap in readline that could cause fatal - errors when a readline hook was being invoked while a background - thread was active. (SF bugs #660476 and #513033.) - -- fcntl now exposes the strops.h I_* constants. - -- Fix a crash on Solaris that occurred when calling close() on - an mmap'ed file which was already closed. (SF patch #665913) - -- Fixed several serious bugs in the zipimport implementation. - -- datetime changes: - - The date class is now properly subclassable. (SF bug #720908) - - The datetime and datetimetz classes have been collapsed into a single - datetime class, and likewise the time and timetz classes into a single - time class. Previously, a datetimetz object with tzinfo=None acted - exactly like a datetime object, and similarly for timetz. This wasn't - enough of a difference to justify distinct classes, and life is simpler - now. - - today() and now() now round system timestamps to the closest - microsecond . This repairs an - irritation most likely seen on Windows systems. - - In dt.astimezone(tz), if tz.utcoffset(dt) returns a duration, - ValueError is raised if tz.dst(dt) returns None (2.3a1 treated it - as 0 instead, but a tzinfo subclass wishing to participate in - time zone conversion has to take a stand on whether it supports - DST; if you don't care about DST, then code dst() to return 0 minutes, - meaning that DST is never in effect). - - The tzinfo methods utcoffset() and dst() must return a timedelta object - (or None) now. In 2.3a1 they could also return an int or long, but that - was an unhelpfully redundant leftover from an earlier version wherein - they couldn't return a timedelta. TOOWTDI. - - The example tzinfo class for local time had a bug. It was replaced - by a later example coded by Guido. - - datetime.astimezone(tz) no longer raises an exception when the - input datetime has no UTC equivalent in tz. For typical "hybrid" time - zones (a single tzinfo subclass modeling both standard and daylight - time), this case can arise one hour per year, at the hour daylight time - ends. See new docs for details. In short, the new behavior mimics - the local wall clock's behavior of repeating an hour in local time. - - dt.astimezone() can no longer be used to convert between naive and aware - datetime objects. If you merely want to attach, or remove, a tzinfo - object, without any conversion of date and time members, use - dt.replace(tzinfo=whatever) instead, where "whatever" is None or a - tzinfo subclass instance. - - A new method tzinfo.fromutc(dt) can be overridden in tzinfo subclasses - to give complete control over how a UTC time is to be converted to - a local time. The default astimezone() implementation calls fromutc() - as its last step, so a tzinfo subclass can affect that too by overriding - fromutc(). It's expected that the default fromutc() implementation will - be suitable as-is for "almost all" time zone subclasses, but the - creativity of political time zone fiddling appears unbounded -- fromutc() - allows the highly motivated to emulate any scheme expressible in Python. - - datetime.now(): The optional tzinfo argument was undocumented (that's - repaired), and its name was changed to tz ("tzinfo" is overloaded enough - already). With a tz argument, now(tz) used to return the local date - and time, and attach tz to it, without any conversion of date and time - members. This was less than useful. Now now(tz) returns the current - date and time as local time in tz's time zone, akin to :: - - tz.fromutc(datetime.utcnow().replace(tzinfo=utc)) - - where "utc" is an instance of a tzinfo subclass modeling UTC. Without - a tz argument, now() continues to return the current local date and time, - as a naive datetime object. - - datetime.fromtimestamp(): Like datetime.now() above, this had less than - useful behavior when the optional tinzo argument was specified. See - also SF bug report . - - date and datetime comparison: In order to prevent comparison from - falling back to the default compare-object-addresses strategy, these - raised TypeError whenever they didn't understand the other object type. - They still do, except when the other object has a "timetuple" attribute, - in which case they return NotImplemented now. This gives other - datetime objects (e.g., mxDateTime) a chance to intercept the - comparison. - - date, time, datetime and timedelta comparison: When the exception - for mixed-type comparisons in the last paragraph doesn't apply, if - the comparison is == then False is returned, and if the comparison is - != then True is returned. Because dict lookup and the "in" operator - only invoke __eq__, this allows, for example, :: - - if some_datetime in some_sequence: - - and :: - - some_dict[some_timedelta] = whatever - - to work as expected, without raising TypeError just because the - sequence is heterogeneous, or the dict has mixed-type keys. [This - seems like a good idea to implement for all mixed-type comparisons - that don't want to allow falling back to address comparison.] - - The constructors building a datetime from a timestamp could raise - ValueError if the platform C localtime()/gmtime() inserted "leap - seconds". Leap seconds are ignored now. On such platforms, it's - possible to have timestamps that differ by a second, yet where - datetimes constructed from them are equal. - - The pickle format of date, time and datetime objects has changed - completely. The undocumented pickler and unpickler functions no - longer exist. The undocumented __setstate__() and __getstate__() - methods no longer exist either. - -Library -------- - -- The logging module was updated slightly; the WARN level was renamed - to WARNING, and the matching function/method warn() to warning(). - -- The pickle and cPickle modules were updated with a new pickling - protocol (documented by pickletools.py, see below) and several - extensions to the pickle customization API (__reduce__, __setstate__ - etc.). The copy module now uses more of the pickle customization - API to copy objects that don't implement __copy__ or __deepcopy__. - See PEP 307 for details. - -- The distutils "register" command now uses http://www.python.org/pypi - as the default repository. (See PEP 301.) - -- the platform dependent path related variables sep, altsep, extsep, - pathsep, curdir, pardir and defpath are now defined in the platform - dependent path modules (e.g. ntpath.py) rather than os.py, so these - variables are now available via os.path. They continue to be - available from the os module. - (see ). - -- array.array was added to the types repr.py knows about (see - ). - -- The new pickletools.py contains lots of documentation about pickle - internals, and supplies some helpers for working with pickles, such as - a symbolic pickle disassembler. - -- Xmlrpclib.py now supports the builtin boolean type. - -- py_compile has a new 'doraise' flag and a new PyCompileError - exception. - -- SimpleXMLRPCServer now supports CGI through the CGIXMLRPCRequestHandler - class. - -- The sets module now raises TypeError in __cmp__, to clarify that - sets are not intended to be three-way-compared; the comparison - operators are overloaded as subset/superset tests. - -- Bastion.py and rexec.py are disabled. These modules are not safe in - Python 2.2. or 2.3. - -- realpath is now exported when doing ``from poxixpath import *``. - It is also exported for ntpath, macpath, and os2emxpath. - See SF bug #659228. - -- New module tarfile from Lars Gustäbel provides a comprehensive interface - to tar archive files with transparent gzip and bzip2 compression. - See SF patch #651082. - -- urlparse can now parse imap:// URLs. See SF feature request #618024. - -- Tkinter.Canvas.scan_dragto() provides an optional parameter to support - the gain value which is passed to Tk. SF bug# 602259. - -- Fix logging.handlers.SysLogHandler protocol when using UNIX domain sockets. - See SF patch #642974. - -- The dospath module was deleted. Use the ntpath module when manipulating - DOS paths from other platforms. - -Tools/Demos ------------ - -- Two new scripts (db2pickle.py and pickle2db.py) were added to the - Tools/scripts directory to facilitate conversion from the old bsddb module - to the new one. While the user-visible API of the new module is - compatible with the old one, it's likely that the version of the - underlying database library has changed. To convert from the old library, - run the db2pickle.py script using the old version of Python to convert it - to a pickle file. After upgrading Python, run the pickle2db.py script - using the new version of Python to reconstitute your database. For - example: - - % python2.2 db2pickle.py -h some.db > some.pickle - % python2.3 pickle2db.py -h some.db.new < some.pickle - - Run the scripts without any args to get a usage message. - - -Build ------ - -- The audio driver tests (test_ossaudiodev.py and - test_linuxaudiodev.py) are no longer run by default. This is - because they don't always work, depending on your hardware and - software. To run these tests, you must use an invocation like :: - - ./python Lib/test/regrtest.py -u audio test_ossaudiodev - -- On systems which build using the configure script, compiler flags which - used to be lumped together using the OPT flag have been split into two - groups, OPT and BASECFLAGS. OPT is meant to carry just optimization- and - debug-related flags like "-g" and "-O3". BASECFLAGS is meant to carry - compiler flags that are required to get a clean compile. On some - platforms (many Linux flavors in particular) BASECFLAGS will be empty by - default. On others, such as Mac OS X and SCO, it will contain required - flags. This change allows people building Python to override OPT without - fear of clobbering compiler flags which are required to get a clean build. - -- On Darwin/Mac OS X platforms, /sw/lib and /sw/include are added to the - relevant search lists in setup.py. This allows users building Python to - take advantage of the many packages available from the fink project - . - -- A new Makefile target, scriptsinstall, installs a number of useful scripts - from the Tools/scripts directory. - -C API ------ - -- PyEval_GetFrame() is now declared to return a ``PyFrameObject *`` - instead of a plain ``PyObject *``. (SF patch #686601.) - -- PyNumber_Check() now checks that the object has a nb_int or nb_float - slot, rather than simply checking whether it has a non-NULL - tp_as_number pointer. - -- A C type that inherits from a base type that defines tp_as_buffer - will now inherit the tp_as_buffer pointer if it doesn't define one. - (SF #681367) - -- The PyArg_Parse functions now issue a DeprecationWarning if a float - argument is provided when an integer is specified (this affects the 'b', - 'B', 'h', 'H', 'i', and 'l' codes). Future versions of Python will - raise a TypeError. - -Tests ------ - -- Several tests weren't being run from regrtest.py (test_timeout.py, - test_tarfile.py, test_netrc.py, test_multifile.py, - test_importhooks.py and test_imp.py). Now they are. (Note to - developers: please read Lib/test/README when creating a new test, to - make sure to do it right! All tests need to use either unittest or - pydoc.) - -- Added test_posix.py, a test suite for the posix module. - -- Added test_hexoct.py, a test suite for hex/oct constant folding. - -Windows -------- - -- The timeout code for socket connect() didn't work right; this has - now been fixed. test_timeout.py should pass (at least most of the - time). - -- distutils' msvccompiler class now passes the preprocessor options to - the resource compiler. See SF patch #669198. - -- The bsddb module now ships with Sleepycat's 4.1.25.NC, the latest - release without strong cryptography. - -- sys.path[0], if it contains a directory name, is now always an - absolute pathname. (SF patch #664376.) - -- The new logging package is now installed by the Windows installer. It - wasn't in 2.3a1 due to oversight. - -Mac ---- - -- There are new dialogs EasyDialogs.AskFileForOpen, AskFileForSave - and AskFolder. The old macfs.StandardGetFile and friends are deprecated. - -- Most of the standard library now uses pathnames or FSRefs in preference - of FSSpecs, and use the underlying Carbon.File and Carbon.Folder modules - in stead of macfs. macfs will probably be deprecated in the future. - -- Type Carbon.File.FSCatalogInfo and supporting methods have been implemented. - This also makes macfs.FSSpec.SetDates() work again. - -- There is a new module pimp, the package install manager for Python, and - accompanying applet PackageManager. These allow you to easily download - and install pretested extension packages either in source or binary - form. Only in MacPython-OSX. - -- Applets are now built with bundlebuilder in MacPython-OSX, which should make - them more robust and also provides a path towards BuildApplication. The - downside of this change is that applets can no longer be run from the - Terminal window, this will hopefully be fixed in the 2.3b1. - - -What's New in Python 2.3 alpha 1? -================================= - -*Release date: 31-Dec-2002* - -Type/class unification and new-style classes --------------------------------------------- - -- One can now assign to __bases__ and __name__ of new-style classes. - -- dict() now accepts keyword arguments so that dict(one=1, two=2) - is the equivalent of {"one": 1, "two": 2}. Accordingly, - the existing (but undocumented) 'items' keyword argument has - been eliminated. This means that dict(items=someMapping) now has - a different meaning than before. - -- int() now returns a long object if the argument is outside the - integer range, so int("4" * 1000), int(1e200) and int(1L<<1000) will - all return long objects instead of raising an OverflowError. - -- Assignment to __class__ is disallowed if either the old or the new - class is a statically allocated type object (such as defined by an - extension module). This prevents anomalies like 2.__class__ = bool. - -- New-style object creation and deallocation have been sped up - significantly; they are now faster than classic instance creation - and deallocation. - -- The __slots__ variable can now mention "private" names, and the - right thing will happen (e.g. __slots__ = ["__foo"]). - -- The built-ins slice() and buffer() are now callable types. The - types classobj (formerly class), code, function, instance, and - instancemethod (formerly instance-method), which have no built-in - names but are accessible through the types module, are now also - callable. The type dict-proxy is renamed to dictproxy. - -- Cycles going through the __class__ link of a new-style instance are - now detected by the garbage collector. - -- Classes using __slots__ are now properly garbage collected. - [SF bug 519621] - -- Tightened the __slots__ rules: a slot name must be a valid Python - identifier. - -- The constructor for the module type now requires a name argument and - takes an optional docstring argument. Previously, this constructor - ignored its arguments. As a consequence, deriving a class from a - module (not from the module type) is now illegal; previously this - created an unnamed module, just like invoking the module type did. - [SF bug 563060] - -- A new type object, 'basestring', is added. This is a common base type - for 'str' and 'unicode', and can be used instead of - types.StringTypes, e.g. to test whether something is "a string": - isinstance(x, basestring) is True for Unicode and 8-bit strings. This - is an abstract base class and cannot be instantiated directly. - -- Changed new-style class instantiation so that when C's __new__ - method returns something that's not a C instance, its __init__ is - not called. [SF bug #537450] - -- Fixed super() to work correctly with class methods. [SF bug #535444] - -- If you try to pickle an instance of a class that has __slots__ but - doesn't define or override __getstate__, a TypeError is now raised. - This is done by adding a bozo __getstate__ to the class that always - raises TypeError. (Before, this would appear to be pickled, but the - state of the slots would be lost.) - -Core and builtins ------------------ - -- Import from zipfiles is now supported. The name of a zipfile placed - on sys.path causes the import statement to look for importable Python - modules (with .py, pyc and .pyo extensions) and packages inside the - zipfile. The zipfile import follows the specification (though not - the sample implementation) of PEP 273. The semantics of __path__ are - compatible with those that have been implemented in Jython since - Jython 2.1. - -- PEP 302 has been accepted. Although it was initially developed to - support zipimport, it offers a new, general import hook mechanism. - Several new variables have been added to the sys module: - sys.meta_path, sys.path_hooks, and sys.path_importer_cache; these - make extending the import statement much more convenient than - overriding the __import__ built-in function. For a description of - these, see PEP 302. - -- A frame object's f_lineno attribute can now be written to from a - trace function to change which line will execute next. A command to - exploit this from pdb has been added. [SF patch #643835] - -- The _codecs support module for codecs.py was turned into a builtin - module to assure that at least the builtin codecs are available - to the Python parser for source code decoding according to PEP 263. - -- issubclass now supports a tuple as the second argument, just like - isinstance does. ``issubclass(X, (A, B))`` is equivalent to - ``issubclass(X, A) or issubclass(X, B)``. - -- Thanks to Armin Rigo, the last known way to provoke a system crash - by cleverly arranging for a comparison function to mutate a list - during a list.sort() operation has been fixed. The effect of - attempting to mutate a list, or even to inspect its contents or - length, while a sort is in progress, is not defined by the language. - The C implementation of Python 2.3 attempts to detect mutations, - and raise ValueError if one occurs, but there's no guarantee that - all mutations will be caught, or that any will be caught across - releases or implementations. - -- Unicode file name processing for Windows (PEP 277) is implemented. - All platforms now have an os.path.supports_unicode_filenames attribute, - which is set to True on Windows NT/2000/XP, and False elsewhere. - -- Codec error handling callbacks (PEP 293) are implemented. - Error handling in unicode.encode or str.decode can now be customized. - -- A subtle change to the semantics of the built-in function intern(): - interned strings are no longer immortal. You must keep a reference - to the return value intern() around to get the benefit. - -- Use of 'None' as a variable, argument or attribute name now - issues a SyntaxWarning. In the future, None may become a keyword. - -- SET_LINENO is gone. co_lnotab is now consulted to determine when to - call the trace function. C code that accessed f_lineno should call - PyCode_Addr2Line instead (f_lineno is still there, but only kept up - to date when there is a trace function set). - -- There's a new warning category, FutureWarning. This is used to warn - about a number of situations where the value or sign of an integer - result will change in Python 2.4 as a result of PEP 237 (integer - unification). The warnings implement stage B0 mentioned in that - PEP. The warnings are about the following situations: - - - Octal and hex literals without 'L' prefix in the inclusive range - [0x80000000..0xffffffff]; these are currently negative ints, but - in Python 2.4 they will be positive longs with the same bit - pattern. - - - Left shifts on integer values that cause the outcome to lose - bits or have a different sign than the left operand. To be - precise: x< -*-" in the first - or second line of a Python source file indicates the encoding. - -- list.sort() has a new implementation. While cross-platform results - may vary, and in data-dependent ways, this is much faster on many - kinds of partially ordered lists than the previous implementation, - and reported to be just as fast on randomly ordered lists on - several major platforms. This sort is also stable (if A==B and A - precedes B in the list at the start, A precedes B after the sort too), - although the language definition does not guarantee stability. A - potential drawback is that list.sort() may require temp space of - len(list)*2 bytes (``*4`` on a 64-bit machine). It's therefore possible - for list.sort() to raise MemoryError now, even if a comparison function - does not. See for full details. - -- All standard iterators now ensure that, once StopIteration has been - raised, all future calls to next() on the same iterator will also - raise StopIteration. There used to be various counterexamples to - this behavior, which could caused confusion or subtle program - breakage, without any benefits. (Note that this is still an - iterator's responsibility; the iterator framework does not enforce - this.) - -- Ctrl+C handling on Windows has been made more consistent with - other platforms. KeyboardInterrupt can now reliably be caught, - and Ctrl+C at an interactive prompt no longer terminates the - process under NT/2k/XP (it never did under Win9x). Ctrl+C will - interrupt time.sleep() in the main thread, and any child processes - created via the popen family (on win2k; we can't make win9x work - reliably) are also interrupted (as generally happens on for Linux/Unix.) - [SF bugs 231273, 439992 and 581232] - -- sys.getwindowsversion() has been added on Windows. This - returns a tuple with information about the version of Windows - currently running. - -- Slices and repetitions of buffer objects now consistently return - a string. Formerly, strings would be returned most of the time, - but a buffer object would be returned when the repetition count - was one or when the slice range was all inclusive. - -- Unicode objects in sys.path are no longer ignored but treated - as directory names. - -- Fixed string.startswith and string.endswith builtin methods - so they accept negative indices. [SF bug 493951] - -- Fixed a bug with a continue inside a try block and a yield in the - finally clause. [SF bug 567538] - -- Most builtin sequences now support "extended slices", i.e. slices - with a third "stride" parameter. For example, "hello world"[::-1] - gives "dlrow olleh". - -- A new warning PendingDeprecationWarning was added to provide - direction on features which are in the process of being deprecated. - The warning will not be printed by default. To see the pending - deprecations, use -Walways::PendingDeprecationWarning:: - as a command line option or warnings.filterwarnings() in code. - -- Deprecated features of xrange objects have been removed as - promised. The start, stop, and step attributes and the tolist() - method no longer exist. xrange repetition and slicing have been - removed. - -- New builtin function enumerate(x), from PEP 279. Example: - enumerate("abc") is an iterator returning (0,"a"), (1,"b"), (2,"c"). - The argument can be an arbitrary iterable object. - -- The assert statement no longer tests __debug__ at runtime. This means - that assert statements cannot be disabled by assigning a false value - to __debug__. - -- A method zfill() was added to str and unicode, that fills a numeric - string to the left with zeros. For example, - "+123".zfill(6) -> "+00123". - -- Complex numbers supported divmod() and the // and % operators, but - these make no sense. Since this was documented, they're being - deprecated now. - -- String and unicode methods lstrip(), rstrip() and strip() now take - an optional argument that specifies the characters to strip. For - example, "Foo!!!?!?!?".rstrip("?!") -> "Foo". - -- There's a new dictionary constructor (a class method of the dict - class), dict.fromkeys(iterable, value=None). It constructs a - dictionary with keys taken from the iterable and all values set to a - single value. It can be used for building sets and for removing - duplicates from sequences. - -- Added a new dict method pop(key). This removes and returns the - value corresponding to key. [SF patch #539949] - -- A new built-in type, bool, has been added, as well as built-in - names for its two values, True and False. Comparisons and sundry - other operations that return a truth value have been changed to - return a bool instead. Read PEP 285 for an explanation of why this - is backward compatible. - -- Fixed two bugs reported as SF #535905: under certain conditions, - deallocating a deeply nested structure could cause a segfault in the - garbage collector, due to interaction with the "trashcan" code; - access to the current frame during destruction of a local variable - could access a pointer to freed memory. - -- The optional object allocator ("pymalloc") has been enabled by - default. The recommended practice for memory allocation and - deallocation has been streamlined. A header file is included, - Misc/pymemcompat.h, which can be bundled with 3rd party extensions - and lets them use the same API with Python versions from 1.5.2 - onwards. - -- PyErr_Display will provide file and line information for all exceptions - that have an attribute print_file_and_line, not just SyntaxErrors. - -- The UTF-8 codec will now encode and decode Unicode surrogates - correctly and without raising exceptions for unpaired ones. - -- Universal newlines (PEP 278) is implemented. Briefly, using 'U' - instead of 'r' when opening a text file for reading changes the line - ending convention so that any of '\r', '\r\n', and '\n' is - recognized (even mixed in one file); all three are converted to - '\n', the standard Python line end character. - -- file.xreadlines() now raises a ValueError if the file is closed: - Previously, an xreadlines object was returned which would raise - a ValueError when the xreadlines.next() method was called. - -- sys.exit() inadvertently allowed more than one argument. - An exception will now be raised if more than one argument is used. - -- Changed evaluation order of dictionary literals to conform to the - general left to right evaluation order rule. Now {f1(): f2()} will - evaluate f1 first. - -- Fixed bug #521782: when a file was in non-blocking mode, file.read() - could silently lose data or wrongly throw an unknown error. - -- The sq_repeat, sq_inplace_repeat, sq_concat and sq_inplace_concat - slots are now always tried after trying the corresponding nb_* slots. - This fixes a number of minor bugs (see bug #624807). - -- Fix problem with dynamic loading on 64-bit AIX (see bug #639945). - -Extension modules ------------------ - -- Added three operators to the operator module: - operator.pow(a,b) which is equivalent to: a**b. - operator.is_(a,b) which is equivalent to: a is b. - operator.is_not(a,b) which is equivalent to: a is not b. - -- posix.openpty now works on all systems that have /dev/ptmx. - -- A module zipimport exists to support importing code from zip - archives. - -- The new datetime module supplies classes for manipulating dates and - times. The basic design came from the Zope "fishbowl process", and - favors practical commercial applications over calendar esoterica. See - - http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage - -- _tkinter now returns Tcl objects, instead of strings. Objects which - have Python equivalents are converted to Python objects, other objects - are wrapped. This can be configured through the wantobjects method, - or Tkinter.wantobjects. - -- The PyBSDDB wrapper around the Sleepycat Berkeley DB library has - been added as the package bsddb. The traditional bsddb module is - still available in source code, but not built automatically anymore, - and is now named bsddb185. This supports Berkeley DB versions from - 3.0 to 4.1. For help converting your databases from the old module (which - probably used an obsolete version of Berkeley DB) to the new module, see - the db2pickle.py and pickle2db.py scripts described in the Tools/Demos - section above. - -- unicodedata was updated to Unicode 3.2. It supports normalization - and names for Hangul syllables and CJK unified ideographs. - -- resource.getrlimit() now returns longs instead of ints. - -- readline now dynamically adjusts its input/output stream if - sys.stdin/stdout changes. - -- The _tkinter module (and hence Tkinter) has dropped support for - Tcl/Tk 8.0 and 8.1. Only Tcl/Tk versions 8.2, 8.3 and 8.4 are - supported. - -- cPickle.BadPickleGet is now a class. - -- The time stamps in os.stat_result are floating point numbers - after stat_float_times has been called. - -- If the size passed to mmap.mmap() is larger than the length of the - file on non-Windows platforms, a ValueError is raised. [SF bug 585792] - -- The xreadlines module is slated for obsolescence. - -- The strptime function in the time module is now always available (a - Python implementation is used when the C library doesn't define it). - -- The 'new' module is no longer an extension, but a Python module that - only exists for backwards compatibility. Its contents are no longer - functions but callable type objects. - -- The bsddb.*open functions can now take 'None' as a filename. - This will create a temporary in-memory bsddb that won't be - written to disk. - -- posix.getloadavg, posix.lchown, posix.killpg, posix.mknod, and - posix.getpgid have been added where available. - -- The locale module now exposes the C library's gettext interface. It - also has a new function getpreferredencoding. - -- A security hole ("double free") was found in zlib-1.1.3, a popular - third party compression library used by some Python modules. The - hole was quickly plugged in zlib-1.1.4, and the Windows build of - Python now ships with zlib-1.1.4. - -- pwd, grp, and resource return enhanced tuples now, with symbolic - field names. - -- array.array is now a type object. A new format character - 'u' indicates Py_UNICODE arrays. For those, .tounicode and - .fromunicode methods are available. Arrays now support __iadd__ - and __imul__. - -- dl now builds on every system that has dlfcn.h. Failure in case - of sizeof(int)!=sizeof(long)!=sizeof(void*) is delayed until dl.open - is called. - -- The sys module acquired a new attribute, api_version, which evaluates - to the value of the PYTHON_API_VERSION macro with which the - interpreter was compiled. - -- Fixed bug #470582: sre module would return a tuple (None, 'a', 'ab') - when applying the regular expression '^((a)c)?(ab)$' on 'ab'. It now - returns (None, None, 'ab'), as expected. Also fixed handling of - lastindex/lastgroup match attributes in similar cases. For example, - when running the expression r'(a)(b)?b' over 'ab', lastindex must be - 1, not 2. - -- Fixed bug #581080: sre scanner was not checking the buffer limit - before increasing the current pointer. This was creating an infinite - loop in the search function, once the pointer exceeded the buffer - limit. - -- The os.fdopen function now enforces a file mode starting with the - letter 'r', 'w' or 'a', otherwise a ValueError is raised. This fixes - bug #623464. - -- The linuxaudiodev module is now deprecated; it is being replaced by - ossaudiodev. The interface has been extended to cover a lot more of - OSS (see www.opensound.com), including most DSP ioctls and the - OSS mixer API. Documentation forthcoming in 2.3a2. - -Library -------- - -- imaplib.py now supports SSL (Tino Lange and Piers Lauder). - -- Freeze's modulefinder.py has been moved to the standard library; - slightly improved so it will issue less false missing submodule - reports (see sf path #643711 for details). Documentation will follow - with Python 2.3a2. - -- os.path exposes getctime. - -- unittest.py now has two additional methods called assertAlmostEqual() - and failIfAlmostEqual(). They implement an approximate comparison - by rounding the difference between the two arguments and comparing - the result to zero. Approximate comparison is essential for - unit tests of floating point results. - -- calendar.py now depends on the new datetime module rather than - the time module. As a result, the range of allowable dates - has been increased. - -- pdb has a new 'j(ump)' command to select the next line to be - executed. - -- The distutils created windows installers now can run a - postinstallation script. - -- doctest.testmod can now be called without argument, which means to - test the current module. - -- When canceling a server that implemented threading with a keyboard - interrupt, the server would shut down but not terminate (waiting on - client threads). A new member variable, daemon_threads, was added to - the ThreadingMixIn class in SocketServer.py to make it explicit that - this behavior needs to be controlled. - -- A new module, optparse, provides a fancy alternative to getopt for - command line parsing. It is a slightly modified version of Greg - Ward's Optik package. - -- UserDict.py now defines a DictMixin class which defines all dictionary - methods for classes that already have a minimum mapping interface. - This greatly simplifies writing classes that need to be substitutable - for dictionaries (such as the shelve module). - -- shelve.py now subclasses from UserDict.DictMixin. Now shelve supports - all dictionary methods. This eases the transition to persistent - storage for scripts originally written with dictionaries in mind. - -- shelve.open and the various classes in shelve.py now accept an optional - binary flag, which defaults to False. If True, the values stored in the - shelf are binary pickles. - -- A new package, logging, implements the logging API defined by PEP - 282. The code is written by Vinay Sajip. - -- StreamReader, StreamReaderWriter and StreamRecoder in the codecs - modules are iterators now. - -- gzip.py now handles files exceeding 2GB. Files over 4GB also work - now (provided the OS supports it, and Python is configured with large - file support), but in that case the underlying gzip file format can - record only the least-significant 32 bits of the file size, so that - some tools working with gzipped files may report an incorrect file - size. - -- xml.sax.saxutils.unescape has been added, to replace entity references - with their entity value. - -- Queue.Queue.{put,get} now support an optional timeout argument. - -- Various features of Tk 8.4 are exposed in Tkinter.py. The multiple - option of tkFileDialog is exposed as function askopenfile{,name}s. - -- Various configure methods of Tkinter have been stream-lined, so that - tag_configure, image_configure, window_configure now return a - dictionary when invoked with no argument. - -- Importing the readline module now no longer has the side effect of - calling setlocale(LC_CTYPE, ""). The initial "C" locale, or - whatever locale is explicitly set by the user, is preserved. If you - want repr() of 8-bit strings in your preferred encoding to preserve - all printable characters of that encoding, you have to add the - following code to your $PYTHONSTARTUP file or to your application's - main(): - - import locale - locale.setlocale(locale.LC_CTYPE, "") - -- shutil.move was added. shutil.copytree now reports errors as an - exception at the end, instead of printing error messages. - -- Encoding name normalization was generalized to not only - replace hyphens with underscores, but also all other non-alphanumeric - characters (with the exception of the dot which is used for Python - package names during lookup). The aliases.py mapping was updated - to the new standard. - -- mimetypes has two new functions: guess_all_extensions() which - returns a list of all known extensions for a mime type, and - add_type() which adds one mapping between a mime type and - an extension to the database. - -- New module: sets, defines the class Set that implements a mutable - set type using the keys of a dict to represent the set. There's - also a class ImmutableSet which is useful when you need sets of sets - or when you need to use sets as dict keys, and a class BaseSet which - is the base class of the two. - -- Added random.sample(population,k) for random sampling without replacement. - Returns a k length list of unique elements chosen from the population. - -- random.randrange(-sys.maxint-1, sys.maxint) no longer raises - OverflowError. That is, it now accepts any combination of 'start' - and 'stop' arguments so long as each is in the range of Python's - bounded integers. - -- Thanks to Raymond Hettinger, random.random() now uses a new core - generator. The Mersenne Twister algorithm is implemented in C, - threadsafe, faster than the previous generator, has an astronomically - large period (2**19937-1), creates random floats to full 53-bit - precision, and may be the most widely tested random number generator - in existence. - - The random.jumpahead(n) method has different semantics for the new - generator. Instead of jumping n steps ahead, it uses n and the - existing state to create a new state. This means that jumpahead() - continues to support multi-threaded code needing generators of - non-overlapping sequences. However, it will break code which relies - on jumpahead moving a specific number of steps forward. - - The attributes random.whseed and random.__whseed have no meaning for - the new generator. Code using these attributes should switch to a - new class, random.WichmannHill which is provided for backward - compatibility and to make an alternate generator available. - -- New "algorithms" module: heapq, implements a heap queue. Thanks to - Kevin O'Connor for the code and François Pinard for an entertaining - write-up explaining the theory and practical uses of heaps. - -- New encoding for the Palm OS character set: palmos. - -- binascii.crc32() and the zipfile module had problems on some 64-bit - platforms. These have been fixed. On a platform with 8-byte C longs, - crc32() now returns a signed-extended 4-byte result, so that its value - as a Python int is equal to the value computed a 32-bit platform. - -- xml.dom.minidom.toxml and toprettyxml now take an optional encoding - argument. - -- Some fixes in the copy module: when an object is copied through its - __reduce__ method, there was no check for a __setstate__ method on - the result [SF patch 565085]; deepcopy should treat instances of - custom metaclasses the same way it treats instances of type 'type' - [SF patch 560794]. - -- Sockets now support timeout mode. After s.settimeout(T), where T is - a float expressing seconds, subsequent operations raise an exception - if they cannot be completed within T seconds. To disable timeout - mode, use s.settimeout(None). There's also a module function, - socket.setdefaulttimeout(T), which sets the default for all sockets - created henceforth. - -- getopt.gnu_getopt was added. This supports GNU-style option - processing, where options can be mixed with non-option arguments. - -- Stop using strings for exceptions. String objects used for - exceptions are now classes deriving from Exception. The objects - changed were: Tkinter.TclError, bdb.BdbQuit, macpath.norm_error, - tabnanny.NannyNag, and xdrlib.Error. - -- Constants BOM_UTF8, BOM_UTF16, BOM_UTF16_LE, BOM_UTF16_BE, - BOM_UTF32, BOM_UTF32_LE and BOM_UTF32_BE that represent the Byte - Order Mark in UTF-8, UTF-16 and UTF-32 encodings for little and - big endian systems were added to the codecs module. The old names - BOM32_* and BOM64_* were off by a factor of 2. - -- Added conversion functions math.degrees() and math.radians(). - -- math.log() now takes an optional argument: math.log(x[, base]). - -- ftplib.retrlines() now tests for callback is None rather than testing - for False. Was causing an error when given a callback object which - was callable but also returned len() as zero. The change may - create new breakage if the caller relied on the undocumented behavior - and called with callback set to [] or some other False value not - identical to None. - -- random.gauss() uses a piece of hidden state used by nothing else, - and the .seed() and .whseed() methods failed to reset it. In other - words, setting the seed didn't completely determine the sequence of - results produced by random.gauss(). It does now. Programs repeatedly - mixing calls to a seed method with calls to gauss() may see different - results now. - -- The pickle.Pickler class grew a clear_memo() method to mimic that - provided by cPickle.Pickler. - -- difflib's SequenceMatcher class now does a dynamic analysis of - which elements are so frequent as to constitute noise. For - comparing files as sequences of lines, this generally works better - than the IS_LINE_JUNK function, and function ndiff's linejunk - argument defaults to None now as a result. A happy benefit is - that SequenceMatcher may run much faster now when applied - to large files with many duplicate lines (for example, C program - text with lots of repeated "}" and "return NULL;" lines). - -- New Text.dump() method in Tkinter module. - -- New distutils commands for building packagers were added to - support pkgtool on Solaris and swinstall on HP-UX. - -- distutils now has a new abstract binary packager base class - command/bdist_packager, which simplifies writing packagers. - This will hopefully provide the missing bits to encourage - people to submit more packagers, e.g. for Debian, FreeBSD - and other systems. - -- The UTF-16, -LE and -BE stream readers now raise a - NotImplementedError for all calls to .readline(). Previously, they - used to just produce garbage or fail with an encoding error -- - UTF-16 is a 2-byte encoding and the C lib's line reading APIs don't - work well with these. - -- compileall now supports quiet operation. - -- The BaseHTTPServer now implements optional HTTP/1.1 persistent - connections. - -- socket module: the SSL support was broken out of the main - _socket module C helper and placed into a new _ssl helper - which now gets imported by socket.py if available and working. - -- encodings package: added aliases for all supported IANA character - sets - -- ftplib: to safeguard the user's privacy, anonymous login will use - "anonymous@" as default password, rather than the real user and host - name. - -- webbrowser: tightened up the command passed to os.system() so that - arbitrary shell code can't be executed because a bogus URL was - passed in. - -- gettext.translation has an optional fallback argument, and - gettext.find an optional all argument. Translations will now fallback - on a per-message basis. The module supports plural forms, by means - of gettext.[d]ngettext and Translation.[u]ngettext. - -- distutils bdist commands now offer a --skip-build option. - -- warnings.warn now accepts a Warning instance as first argument. - -- The xml.sax.expatreader.ExpatParser class will no longer create - circular references by using itself as the locator that gets passed - to the content handler implementation. [SF bug #535474] - -- The email.Parser.Parser class now properly parses strings regardless - of their line endings, which can be any of \r, \n, or \r\n (CR, LF, - or CRLF). Also, the Header class's constructor default arguments - has changed slightly so that an explicit maxlinelen value is always - honored, and so unicode conversion error handling can be specified. - -- distutils' build_ext command now links C++ extensions with the C++ - compiler available in the Makefile or CXX environment variable, if - running under \*nix. - -- New module bz2: provides a comprehensive interface for the bz2 compression - library. It implements a complete file interface, one-shot (de)compression - functions, and types for sequential (de)compression. - -- New pdb command 'pp' which is like 'p' except that it pretty-prints - the value of its expression argument. - -- Now bdist_rpm distutils command understands a verify_script option in - the config file, including the contents of the referred filename in - the "%verifyscript" section of the rpm spec file. - -- Fixed bug #495695: webbrowser module would run graphic browsers in a - unix environment even if DISPLAY was not set. Also, support for - skipstone browser was included. - -- Fixed bug #636769: rexec would run unallowed code if subclasses of - strings were used as parameters for certain functions. - -Tools/Demos ------------ - -- pygettext.py now supports globbing on Windows, and accepts module - names in addition to accepting file names. - -- The SGI demos (Demo/sgi) have been removed. Nobody thought they - were interesting any more. (The SGI library modules and extensions - are still there; it is believed that at least some of these are - still used and useful.) - -- IDLE supports the new encoding declarations (PEP 263); it can also - deal with legacy 8-bit files if they use the locale's encoding. It - allows non-ASCII strings in the interactive shell and executes them - in the locale's encoding. - -- freeze.py now produces binaries which can import shared modules, - unlike before when this failed due to missing symbol exports in - the generated binary. - -Build ------ - -- On Unix, IDLE is now installed automatically. - -- The fpectl module is not built by default; it's dangerous or useless - except in the hands of experts. - -- The public Python C API will generally be declared using PyAPI_FUNC - and PyAPI_DATA macros, while Python extension module init functions - will be declared with PyMODINIT_FUNC. DL_EXPORT/DL_IMPORT macros - are deprecated. - -- A bug was fixed that could cause COUNT_ALLOCS builds to segfault, or - get into infinite loops, when a new-style class got garbage-collected. - Unfortunately, to avoid this, the way COUNT_ALLOCS works requires - that new-style classes be immortal in COUNT_ALLOCS builds. Note that - COUNT_ALLOCS is not enabled by default, in either release or debug - builds, and that new-style classes are immortal only in COUNT_ALLOCS - builds. - -- Compiling out the cyclic garbage collector is no longer an option. - The old symbol WITH_CYCLE_GC is now ignored, and Python.h arranges - that it's always defined (for the benefit of any extension modules - that may be conditionalizing on it). A bonus is that any extension - type participating in cyclic gc can choose to participate in the - Py_TRASHCAN mechanism now too; in the absence of cyclic gc, this used - to require editing the core to teach the trashcan mechanism about the - new type. - -- According to Annex F of the current C standard, - - The Standard C macro HUGE_VAL and its float and long double analogs, - HUGE_VALF and HUGE_VALL, expand to expressions whose values are - positive infinities. - - Python only uses the double HUGE_VAL, and only to #define its own symbol - Py_HUGE_VAL. Some platforms have incorrect definitions for HUGE_VAL. - pyport.h used to try to worm around that, but the workarounds triggered - other bugs on other platforms, so we gave up. If your platform defines - HUGE_VAL incorrectly, you'll need to #define Py_HUGE_VAL to something - that works on your platform. The only instance of this I'm sure about - is on an unknown subset of Cray systems, described here: - - http://www.cray.com/swpubs/manuals/SN-2194_2.0/html-SN-2194_2.0/x3138.htm - - Presumably 2.3a1 breaks such systems. If anyone uses such a system, help! - -- The configure option --without-doc-strings can be used to remove the - doc strings from the builtin functions and modules; this reduces the - size of the executable. - -- The universal newlines option (PEP 278) is on by default. On Unix - it can be disabled by passing --without-universal-newlines to the - configure script. On other platforms, remove - WITH_UNIVERSAL_NEWLINES from pyconfig.h. - -- On Unix, a shared libpython2.3.so can be created with --enable-shared. - -- All uses of the CACHE_HASH, INTERN_STRINGS, and DONT_SHARE_SHORT_STRINGS - preprocessor symbols were eliminated. The internal decisions they - controlled stopped being experimental long ago. - -- The tools used to build the documentation now work under Cygwin as - well as Unix. - -- The bsddb and dbm module builds have been changed to try and avoid version - skew problems and disable linkage with Berkeley DB 1.85 unless the - installer knows what s/he's doing. See the section on building these - modules in the README file for details. - -C API ------ - -- PyNumber_Check() now returns true for string and unicode objects. - This is a result of these types having a partially defined - tp_as_number slot. (This is not a feature, but an indication that - PyNumber_Check() is not very useful to determine numeric behavior. - It may be deprecated.) - -- The string object's layout has changed: the pointer member - ob_sinterned has been replaced by an int member ob_sstate. On some - platforms (e.g. most 64-bit systems) this may change the offset of - the ob_sval member, so as a precaution the API_VERSION has been - incremented. The apparently unused feature of "indirect interned - strings", supported by the ob_sinterned member, is gone. Interned - strings are now usually mortal; there is a new API, - PyString_InternImmortal() that creates immortal interned strings. - (The ob_sstate member can only take three values; however, while - making it a char saves a few bytes per string object on average, in - it also slowed things down a bit because ob_sval was no longer - aligned.) - -- The Py_InitModule*() functions now accept NULL for the 'methods' - argument. Modules without global functions are becoming more common - now that factories can be types rather than functions. - -- New C API PyUnicode_FromOrdinal() which exposes unichr() at C - level. - -- New functions PyErr_SetExcFromWindowsErr() and - PyErr_SetExcFromWindowsErrWithFilename(). Similar to - PyErr_SetFromWindowsErrWithFilename() and - PyErr_SetFromWindowsErr(), but they allow to specify - the exception type to raise. Available on Windows. - -- Py_FatalError() is now declared as taking a const char* argument. It - was previously declared without const. This should not affect working - code. - -- Added new macro PySequence_ITEM(o, i) that directly calls - sq_item without rechecking that o is a sequence and without - adjusting for negative indices. - -- PyRange_New() now raises ValueError if the fourth argument is not 1. - This is part of the removal of deprecated features of the xrange - object. - -- PyNumber_Coerce() and PyNumber_CoerceEx() now also invoke the type's - coercion if both arguments have the same type but this type has the - CHECKTYPES flag set. This is to better support proxies. - -- The type of tp_free has been changed from "``void (*)(PyObject *)``" to - "``void (*)(void *)``". - -- PyObject_Del, PyObject_GC_Del are now functions instead of macros. - -- A type can now inherit its metatype from its base type. Previously, - when PyType_Ready() was called, if ob_type was found to be NULL, it - was always set to &PyType_Type; now it is set to base->ob_type, - where base is tp_base, defaulting to &PyObject_Type. - -- PyType_Ready() accidentally did not inherit tp_is_gc; now it does. - -- The PyCore_* family of APIs have been removed. - -- The "u#" parser marker will now pass through Unicode objects as-is - without going through the buffer API. - -- The enumerators of cmp_op have been renamed to use the prefix ``PyCmp_``. - -- An old #define of ANY as void has been removed from pyport.h. This - hasn't been used since Python's pre-ANSI days, and the #define has - been marked as obsolete since then. SF bug 495548 says it created - conflicts with other packages, so keeping it around wasn't harmless. - -- Because Python's magic number scheme broke on January 1st, we decided - to stop Python development. Thanks for all the fish! - -- Some of us don't like fish, so we changed Python's magic number - scheme to a new one. See Python/import.c for details. - -New platforms -------------- - -- OpenVMS is now supported. - -- AtheOS is now supported. - -- the EMX runtime environment on OS/2 is now supported. - -- GNU/Hurd is now supported. - -Tests ------ - -- The regrtest.py script's -u option now provides a way to say "allow - all resources except this one." For example, to allow everything - except bsddb, give the option '-uall,-bsddb'. - -Windows -------- - -- The Windows distribution now ships with version 4.0.14 of the - Sleepycat Berkeley database library. This should be a huge - improvement over the previous Berkeley DB 1.85, which had many - bugs. - XXX What are the licensing issues here? - XXX If a user has a database created with a previous version of - XXX Python, what must they do to convert it? - XXX I'm still not sure how to link this thing (see PCbuild/readme.txt). - XXX The version # is likely to change before 2.3a1. - -- The Windows distribution now ships with a Secure Sockets Library (SLL) - module (_ssl.pyd) - -- The Windows distribution now ships with Tcl/Tk version 8.4.1 (it - previously shipped with Tcl/Tk 8.3.2). - -- When Python is built under a Microsoft compiler, sys.version now - includes the compiler version number (_MSC_VER). For example, under - MSVC 6, sys.version contains the substring "MSC v.1200 ". 1200 is - the value of _MSC_VER under MSVC 6. - -- Sometimes the uninstall executable (UNWISE.EXE) vanishes. One cause - of that has been fixed in the installer (disabled Wise's "delete in- - use files" uninstall option). - -- Fixed a bug in urllib's proxy handling in Windows. [SF bug #503031] - -- The installer now installs Start menu shortcuts under (the local - equivalent of) "All Users" when doing an Admin install. - -- file.truncate([newsize]) now works on Windows for all newsize values. - It used to fail if newsize didn't fit in 32 bits, reflecting a - limitation of MS _chsize (which is no longer used). - -- os.waitpid() is now implemented for Windows, and can be used to block - until a specified process exits. This is similar to, but not exactly - the same as, os.waitpid() on POSIX systems. If you're waiting for - a specific process whose pid was obtained from one of the spawn() - functions, the same Python os.waitpid() code works across platforms. - See the docs for details. The docs were changed to clarify that - spawn functions return, and waitpid requires, a process handle on - Windows (not the same thing as a Windows process id). - -- New tempfile.TemporaryFile implementation for Windows: this doesn't - need a TemporaryFileWrapper wrapper anymore, and should be immune - to a nasty problem: before 2.3, if you got a temp file on Windows, it - got wrapped in an object whose close() method first closed the - underlying file, then deleted the file. This usually worked fine. - However, the spawn family of functions on Windows create (at a low C - level) the same set of open files in the spawned process Q as were - open in the spawning process P. If a temp file f was among them, then - doing f.close() in P first closed P's C-level file handle on f, but Q's - C-level file handle on f remained open, so the attempt in P to delete f - blew up with a "Permission denied" error (Windows doesn't allow - deleting open files). This was surprising, subtle, and difficult to - work around. - -- The os module now exports all the symbolic constants usable with the - low-level os.open() on Windows: the new constants in 2.3 are - O_NOINHERIT, O_SHORT_LIVED, O_TEMPORARY, O_RANDOM and O_SEQUENTIAL. - The others were also available in 2.2: O_APPEND, O_BINARY, O_CREAT, - O_EXCL, O_RDONLY, O_RDWR, O_TEXT, O_TRUNC and O_WRONLY. Contrary - to Microsoft docs, O_SHORT_LIVED does not seem to imply O_TEMPORARY - (so specify both if you want both; note that neither is useful unless - specified with O_CREAT too). - -Mac ----- - -- Mac/Relnotes is gone, the release notes are now here. - -- Python (the OSX-only, unix-based version, not the OS9-compatible CFM - version) now fully supports unicode strings as arguments to various file - system calls, eg. open(), file(), os.stat() and os.listdir(). - -- The current naming convention for Python on the Macintosh is that MacPython - refers to the unix-based OSX-only version, and MacPython-OS9 refers to the - CFM-based version that runs on both OS9 and OSX. - -- All MacPython-OS9 functionality is now available in an OSX unix build, - including the Carbon modules, the IDE, OSA support, etc. A lot of this - will only work correctly in a framework build, though, because you cannot - talk to the window manager unless your application is run from a .app - bundle. There is a command line tool "pythonw" that runs your script - with an interpreter living in such a .app bundle, this interpreter should - be used to run any Python script using the window manager (including - Tkinter or wxPython scripts). - -- Most of Mac/Lib has moved to Lib/plat-mac, which is again used both in - MacPython-OSX and MacPython-OS9. The only modules remaining in Mac/Lib - are specifically for MacPython-OS9 (CFM support, preference resources, etc). - -- A new utility PythonLauncher will start a Python interpreter when a .py or - .pyw script is double-clicked in the Finder. By default .py scripts are - run with a normal Python interpreter in a Terminal window and .pyw - files are run with a window-aware pythonw interpreter without a Terminal - window, but all this can be customized. - -- MacPython-OS9 is now Carbon-only, so it runs on Mac OS 9 or Mac OS X and - possibly on Mac OS 8.6 with the right CarbonLib installed, but not on earlier - releases. - -- Many tools such as BuildApplet.py and gensuitemodule.py now support a command - line interface too. - -- All the Carbon classes are now PEP253 compliant, meaning that you can - subclass them from Python. Most of the attributes have gone, you should - now use the accessor function call API, which is also what Apple's - documentation uses. Some attributes such as grafport.visRgn are still - available for convenience. - -- New Carbon modules File (implementing the APIs in Files.h and Aliases.h) - and Folder (APIs from Folders.h). The old macfs builtin module is - gone, and replaced by a Python wrapper around the new modules. - -- Pathname handling should now be fully consistent: MacPython-OSX always uses - unix pathnames and MacPython-OS9 always uses colon-separated Mac pathnames - (also when running on Mac OS X). - -- New Carbon modules Help and AH give access to the Carbon Help Manager. - There are hooks in the IDE to allow accessing the Python documentation - (and Apple's Carbon and Cocoa documentation) through the Help Viewer. - See Mac/OSX/README for converting the Python documentation to a - Help Viewer compatible form and installing it. - -- OSA support has been redesigned and the generated Python classes now - mirror the inheritance defined by the underlying OSA classes. - -- MacPython no longer maps both \r and \n to \n on input for any text file. - This feature has been replaced by universal newline support (PEP278). - -- The default encoding for Python sourcefiles in MacPython-OS9 is no longer - mac-roman (or whatever your local Mac encoding was) but "ascii", like on - other platforms. If you really need sourcefiles with Mac characters in them - you can change this in site.py. - - -What's New in Python 2.2 final? -=============================== - -*Release date: 21-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pickle.py, cPickle: allow pickling instances of new-style classes - with a custom metaclass. - -Core and builtins ------------------ - -- weakref proxy object: when comparing, unwrap both arguments if both - are proxies. - -Extension modules ------------------ - -- binascii.b2a_base64(): fix a potential buffer overrun when encoding - very short strings. - -- cPickle: the obscure "fast" mode was suspected of causing stack - overflows on the Mac. Hopefully fixed this by setting the recursion - limit much smaller. If the limit is too low (it only affects - performance), you can change it by defining PY_CPICKLE_FAST_LIMIT - when compiling cPickle.c (or in pyconfig.h). - -Library -------- - -- dumbdbm.py: fixed a dumb old bug (the file didn't get synched at - close or delete time). - -- rfc822.py: fixed a bug where the address '<>' was converted to None - instead of an empty string (also fixes the email.Utils module). - -- xmlrpclib.py: version 1.0.0; uses precision for doubles. - -- test suite: the pickle and cPickle tests were not executing any code - when run from the standard regression test. - -Tools/Demos ------------ - -Build ------ - -C API ------ - -New platforms -------------- - -Tests ------ - -Windows -------- - -- distutils package: fixed broken Windows installers (bdist_wininst). - -- tempfile.py: prevent mysterious warnings when TemporaryFileWrapper - instances are deleted at process exit time. - -- socket.py: prevent mysterious warnings when socket instances are - deleted at process exit time. - -- posixmodule.c: fix a Windows crash with stat() of a filename ending - in backslash. - -Mac ----- - -- The Carbon toolbox modules have been upgraded to Universal Headers - 3.4, and experimental CoreGraphics and CarbonEvents modules have - been added. All only for framework-enabled MacOSX. - - -What's New in Python 2.2c1? -=========================== - -*Release date: 14-Dec-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Guido's tutorial introduction to the new type/class features has - been extensively updated. See - - http://www.python.org/2.2/descrintro.html - - That remains the primary documentation in this area. - -- Fixed a leak: instance variables declared with __slots__ were never - deleted! - -- The "delete attribute" method of descriptor objects is called - __delete__, not __del__. In previous releases, it was mistakenly - called __del__, which created an unfortunate overloading condition - with finalizers. (The "get attribute" and "set attribute" methods - are still called __get__ and __set__, respectively.) - -- Some subtle issues with the super built-in were fixed: - - (a) When super itself is subclassed, its __get__ method would still - return an instance of the base class (i.e., of super). - - (b) super(C, C()).__class__ would return C rather than super. This - is confusing. To fix this, I decided to change the semantics of - super so that it only applies to code attributes, not to data - attributes. After all, overriding data attributes is not - supported anyway. - - (c) The __get__ method didn't check whether the argument was an - instance of the type used in creation of the super instance. - -- Previously, hash() of an instance of a subclass of a mutable type - (list or dictionary) would return some value, rather than raising - TypeError. This has been fixed. Also, directly calling - dict.__hash__ and list.__hash__ now raises the same TypeError - (previously, these were the same as object.__hash__). - -- New-style objects now support deleting their __dict__. This is for - all intents and purposes equivalent to assigning a brand new empty - dictionary, but saves space if the object is not used further. - -Core and builtins ------------------ - -- -Qnew now works as documented in PEP 238: when -Qnew is passed on - the command line, all occurrences of "/" use true division instead - of classic division. See the PEP for details. Note that "all" - means all instances in library and 3rd-party modules, as well as in - your own code. As the PEP says, -Qnew is intended for use only in - educational environments with control over the libraries in use. - Note that test_coercion.py in the standard Python test suite fails - under -Qnew; this is expected, and won't be repaired until true - division becomes the default (in the meantime, test_coercion is - testing the current rules). - -- complex() now only allows the first argument to be a string - argument, and raises TypeError if either the second arg is a string - or if the second arg is specified when the first is a string. - -Extension modules ------------------ - -- gc.get_referents was renamed to gc.get_referrers. - -Library -------- - -- Functions in the os.spawn() family now release the global interpreter - lock around calling the platform spawn. They should always have done - this, but did not before 2.2c1. Multithreaded programs calling - an os.spawn function with P_WAIT will no longer block all Python threads - until the spawned program completes. It's possible that some programs - relies on blocking, although more likely by accident than by design. - -- webbrowser defaults to netscape.exe on OS/2 now. - -- Tix.ResizeHandle exposes detach_widget, hide, and show. - -- The charset alias windows_1252 has been added. - -- types.StringTypes is a tuple containing the defined string types; - usually this will be (str, unicode), but if Python was compiled - without Unicode support it will be just (str,). - -- The pulldom and minidom modules were synchronized to PyXML. - -Tools/Demos ------------ - -- A new script called Tools/scripts/google.py was added, which fires - off a search on Google. - -Build ------ - -- Note that release builds of Python should arrange to define the - preprocessor symbol NDEBUG on the command line (or equivalent). - In the 2.2 pre-release series we tried to define this by magic in - Python.h instead, but it proved to cause problems for extension - authors. The Unix, Windows and Mac builds now all define NDEBUG in - release builds via cmdline (or equivalent) instead. Ports to - other platforms should do likewise. - -- It is no longer necessary to use --with-suffix when building on a - case-insensitive file system (such as Mac OS X HFS+). In the build - directory an extension is used, but not in the installed python. - -C API ------ - -- New function PyDict_MergeFromSeq2() exposes the builtin dict - constructor's logic for updating a dictionary from an iterable object - producing key-value pairs. - -- PyArg_ParseTupleAndKeywords() requires that the number of entries in - the keyword list equal the number of argument specifiers. This - wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even - dump core in some bad cases. This has been repaired. As a result, - PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that - previously went unchallenged. - -New platforms -------------- - -Tests ------ - -Windows -------- - -Mac ----- - -- In unix-Python on Mac OS X (and darwin) sys.platform is now "darwin", - without any trailing digits. - -- Changed logic for finding python home in Mac OS X framework Pythons. - Now sys.executable points to the executable again, in stead of to - the shared library. The latter is used only for locating the python - home. - - -What's New in Python 2.2b2? -=========================== - -*Release date: 16-Nov-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- Multiple inheritance mixing new-style and classic classes in the - list of base classes is now allowed, so this works now: - - class Classic: pass - class Mixed(Classic, object): pass - - The MRO (method resolution order) for each base class is respected - according to its kind, but the MRO for the derived class is computed - using new-style MRO rules if any base class is a new-style class. - This needs to be documented. - -- The new builtin dictionary() constructor, and dictionary type, have - been renamed to dict. This reflects a decade of common usage. - -- dict() now accepts an iterable object producing 2-sequences. For - example, dict(d.items()) == d for any dictionary d. The argument, - and the elements of the argument, can be any iterable objects. - -- New-style classes can now have a __del__ method, which is called - when the instance is deleted (just like for classic classes). - -- Assignment to object.__dict__ is now possible, for objects that are - instances of new-style classes that have a __dict__ (unless the base - class forbids it). - -- Methods of built-in types now properly check for keyword arguments - (formerly these were silently ignored). The only built-in methods - that take keyword arguments are __call__, __init__ and __new__. - -- The socket function has been converted to a type; see below. - -Core and builtins ------------------ - -- Assignment to __debug__ raises SyntaxError at compile-time. This - was promised when 2.1c1 was released as "What's New in Python 2.1c1" - (see below) says. - -- Clarified the error messages for unsupported operands to an operator - (like 1 + ''). - -Extension modules ------------------ - -- mmap has a new keyword argument, "access", allowing a uniform way for - both Windows and Unix users to create read-only, write-through and - copy-on-write memory mappings. This was previously possible only on - Unix. A new keyword argument was required to support this in a - uniform way because the mmap() signatures had diverged across - platforms. Thanks to Jay T Miller for repairing this! - -- By default, the gc.garbage list now contains only those instances in - unreachable cycles that have __del__ methods; in 2.1 it contained all - instances in unreachable cycles. "Instances" here has been generalized - to include instances of both new-style and old-style classes. - -- The socket module defines a new method for socket objects, - sendall(). This is like send() but may make multiple calls to - send() until all data has been sent. Also, the socket function has - been converted to a subclassable type, like list and tuple (etc.) - before it; socket and SocketType are now the same thing. - -- Various bugfixes to the curses module. There is now a test suite - for the curses module (you have to run it manually). - -- binascii.b2a_base64 no longer places an arbitrary restriction of 57 - bytes on its input. - -Library -------- - -- tkFileDialog exposes a Directory class and askdirectory - convenience function. - -- Symbolic group names in regular expressions must be unique. For - example, the regexp r'(?P)(?P)' is not allowed, because a - single name can't mean both "group 1" and "group 2" simultaneously. - Python 2.2 detects this error at regexp compilation time; - previously, the error went undetected, and results were - unpredictable. Also in sre, the pattern.split(), pattern.sub(), and - pattern.subn() methods have been rewritten in C. Also, an - experimental function/method finditer() has been added, which works - like findall() but returns an iterator. - -- Tix exposes more commands through the classes DirSelectBox, - DirSelectDialog, ListNoteBook, Meter, CheckList, and the - methods tix_addbitmapdir, tix_cget, tix_configure, tix_filedialog, - tix_getbitmap, tix_getimage, tix_option_get, and tix_resetoptions. - -- Traceback objects are now scanned by cyclic garbage collection, so - cycles created by casual use of sys.exc_info() no longer cause - permanent memory leaks (provided garbage collection is enabled). - -- os.extsep -- a new variable needed by the RISCOS support. It is the - separator used by extensions, and is '.' on all platforms except - RISCOS, where it is '/'. There is no need to use this variable - unless you have a masochistic desire to port your code to RISCOS. - -- mimetypes.py has optional support for non-standard, but commonly - found types. guess_type() and guess_extension() now accept an - optional 'strict' flag, defaulting to true, which controls whether - recognize non-standard types or not. A few non-standard types we - know about have been added. Also, when run as a script, there are - new -l and -e options. - -- statcache is now deprecated. - -- email.Utils.formatdate() now produces the preferred RFC 2822 style - dates with numeric timezones (it used to produce obsolete dates - hard coded to "GMT" timezone). An optional 'localtime' flag is - added to produce dates in the local timezone, with daylight savings - time properly taken into account. - -- In pickle and cPickle, instead of masking errors in load() by - transforming them into SystemError, we let the original exception - propagate out. Also, implement support for __safe_for_unpickling__ - in pickle, as it already was supported in cPickle. - -Tools/Demos ------------ - -Build ------ - -- The dbm module is built using libdb1 if available. The bsddb module - is built with libdb3 if available. - -- Misc/Makefile.pre.in has been removed by BDFL pronouncement. - -C API ------ - -- New function PySequence_Fast_GET_SIZE() returns the size of a non- - NULL result from PySequence_Fast(), more quickly than calling - PySequence_Size(). - -- New argument unpacking function PyArg_UnpackTuple() added. - -- New functions PyObject_CallFunctionObjArgs() and - PyObject_CallMethodObjArgs() have been added to make it more - convenient and efficient to call functions and methods from C. - -- PyArg_ParseTupleAndKeywords() no longer masks errors, so it's - possible that this will propagate errors it didn't before. - -- New function PyObject_CheckReadBuffer(), which returns true if its - argument supports the single-segment readable buffer interface. - -New platforms -------------- - -- We've finally confirmed that this release builds on HP-UX 11.00, - *with* threads, and passes the test suite. - -- Thanks to a series of patches from Michael Muller, Python may build - again under OS/2 Visual Age C++. - -- Updated RISCOS port by Dietmar Schwertberger. - -Tests ------ - -- Added a test script for the curses module. It isn't run automatically; - regrtest.py must be run with '-u curses' to enable it. - -Windows -------- - -Mac ----- - -- PythonScript has been moved to unsupported and is slated to be - removed completely in the next release. - -- It should now be possible to build applets that work on both OS9 and - OSX. - -- The core is now linked with CoreServices not Carbon; as a side - result, default 8bit encoding on OSX is now ASCII. - -- Python should now build on OSX 10.1.1 - - -What's New in Python 2.2b1? -=========================== - -*Release date: 19-Oct-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- New-style classes are now always dynamic (except for built-in and - extension types). There is no longer a performance penalty, and I - no longer see another reason to keep this baggage around. One relic - remains: the __dict__ of a new-style class is a read-only proxy; you - must set the class's attribute to modify it. As a consequence, the - __defined__ attribute of new-style types no longer exists, for lack - of need: there is once again only one __dict__ (although in the - future a __cache__ may be resurrected with a similar function, if I - can prove that it actually speeds things up). - -- C.__doc__ now works as expected for new-style classes (in 2.2a4 it - always returned None, even when there was a class docstring). - -- doctest now finds and runs docstrings attached to new-style classes, - class methods, static methods, and properties. - -Core and builtins ------------------ - -- A very subtle syntactical pitfall in list comprehensions was fixed. - For example: [a+b for a in 'abc', for b in 'def']. The comma in - this example is a mistake. Previously, this would silently let 'a' - iterate over the singleton tuple ('abc',), yielding ['abcd', 'abce', - 'abcf'] rather than the intended ['ad', 'ae', 'af', 'bd', 'be', - 'bf', 'cd', 'ce', 'cf']. Now, this is flagged as a syntax error. - Note that [a for a in ] is a convoluted way to say - [] anyway, so it's not like any expressiveness is lost. - -- getattr(obj, name, default) now only catches AttributeError, as - documented, rather than returning the default value for all - exceptions (which could mask bugs in a __getattr__ hook, for - example). - -- Weak reference objects are now part of the core and offer a C API. - A bug which could allow a core dump when binary operations involved - proxy reference has been fixed. weakref.ReferenceError is now a - built-in exception. - -- unicode(obj) now behaves more like str(obj), accepting arbitrary - objects, and calling a __unicode__ method if it exists. - unicode(obj, encoding) and unicode(obj, encoding, errors) still - require an 8-bit string or character buffer argument. - -- isinstance() now allows any object as the first argument and a - class, a type or something with a __bases__ tuple attribute for the - second argument. The second argument may also be a tuple of a - class, type, or something with __bases__, in which case isinstance() - will return true if the first argument is an instance of any of the - things contained in the second argument tuple. E.g. - - isinstance(x, (A, B)) - - returns true if x is an instance of A or B. - -Extension modules ------------------ - -- thread.start_new_thread() now returns the thread ID (previously None). - -- binascii has now two quopri support functions, a2b_qp and b2a_qp. - -- readline now supports setting the startup_hook and the - pre_event_hook, and adds the add_history() function. - -- os and posix supports chroot(), setgroups() and unsetenv() where - available. The stat(), fstat(), statvfs() and fstatvfs() functions - now return "pseudo-sequences" -- the various fields can now be - accessed as attributes (e.g. os.stat("/").st_mtime) but for - backwards compatibility they also behave as a fixed-length sequence. - Some platform-specific fields (e.g. st_rdev) are only accessible as - attributes. - -- time: localtime(), gmtime() and strptime() now return a - pseudo-sequence similar to the os.stat() return value, with - attributes like tm_year etc. - -- Decompression objects in the zlib module now accept an optional - second parameter to decompress() that specifies the maximum amount - of memory to use for the uncompressed data. - -- optional SSL support in the socket module now exports OpenSSL - functions RAND_add(), RAND_egd(), and RAND_status(). These calls - are useful on platforms like Solaris where OpenSSL does not - automatically seed its PRNG. Also, the keyfile and certfile - arguments to socket.ssl() are now optional. - -- posixmodule (and by extension, the os module on POSIX platforms) now - exports O_LARGEFILE, O_DIRECT, O_DIRECTORY, and O_NOFOLLOW. - -Library -------- - -- doctest now excludes functions and classes not defined by the module - being tested, thanks to Tim Hochberg. - -- HotShot, a new profiler implemented using a C-based callback, has - been added. This substantially reduces the overhead of profiling, - but it is still quite preliminary. Support modules and - documentation will be added in upcoming releases (before 2.2 final). - -- profile now produces correct output in situations where an exception - raised in Python is cleared by C code (e.g. hasattr()). This used - to cause wrong output, including spurious claims of recursive - functions and attribution of time spent to the wrong function. - - The code and documentation for the derived OldProfile and HotProfile - profiling classes was removed. The code hasn't worked for years (if - you tried to use them, they raised exceptions). OldProfile - intended to reproduce the behavior of the profiler Python used more - than 7 years ago, and isn't interesting anymore. HotProfile intended - to provide a faster profiler (but producing less information), and - that's a worthy goal we intend to meet via a different approach (but - without losing information). - -- Profile.calibrate() has a new implementation that should deliver - a much better system-specific calibration constant. The constant can - now be specified in an instance constructor, or as a Profile class or - instance variable, instead of by editing profile.py's source code. - Calibration must still be done manually (see the docs for the profile - module). - - Note that Profile.calibrate() must be overridden by subclasses. - Improving the accuracy required exploiting detailed knowledge of - profiler internals; the earlier method abstracted away the details - and measured a simplified model instead, but consequently computed - a constant too small by a factor of 2 on some modern machines. - -- quopri's encode and decode methods take an optional header parameter, - which indicates whether output is intended for the header 'Q' - encoding. - -- The SocketServer.ThreadingMixIn class now closes the request after - finish_request() returns. (Not when it errors out though.) - -- The nntplib module's NNTP.body() method has grown a 'file' argument - to allow saving the message body to a file. - -- The email package has added a class email.Parser.HeaderParser which - only parses headers and does not recurse into the message's body. - Also, the module/class MIMEAudio has been added for representing - audio data (contributed by Anthony Baxter). - -- ftplib should be able to handle files > 2GB. - -- ConfigParser.getboolean() now also interprets TRUE, FALSE, YES, NO, - ON, and OFF. - -- xml.dom.minidom NodeList objects now support the length attribute - and item() method as required by the DOM specifications. - -Tools/Demos ------------ - -- Demo/dns was removed. It no longer serves any purpose; a package - derived from it is now maintained by Anthony Baxter, see - http://PyDNS.SourceForge.net. - -- The freeze tool has been made more robust, and two new options have - been added: -X and -E. - -Build ------ - -- configure will use CXX in LINKCC if CXX is used to build main() and - the system requires to link a C++ main using the C++ compiler. - -C API ------ - -- The documentation for the tp_compare slot is updated to require that - the return value must be -1, 0, 1; an arbitrary number <0 or >0 is - not correct. This is not yet enforced but will be enforced in - Python 2.3; even later, we may use -2 to indicate errors and +2 for - "NotImplemented". Right now, -1 should be used for an error return. - -- PyLong_AsLongLong() now accepts int (as well as long) arguments. - Consequently, PyArg_ParseTuple's 'L' code also accepts int (as well - as long) arguments. - -- PyThread_start_new_thread() now returns a long int giving the thread - ID, if one can be calculated; it returns -1 for error, 0 if no - thread ID is calculated (this is an incompatible change, but only - the thread module used this API). This code has only really been - tested on Linux and Windows; other platforms please beware (and - report any bugs or strange behavior). - -- PyUnicode_FromEncodedObject() no longer accepts Unicode objects as - input. - -New platforms -------------- - -Tests ------ - -Windows -------- - -- Installer: If you install IDLE, and don't disable file-extension - registration, a new "Edit with IDLE" context (right-click) menu entry - is created for .py and .pyw files. - -- The signal module now supports SIGBREAK on Windows, thanks to Steven - Scott. Note that SIGBREAK is unique to Windows. The default SIGBREAK - action remains to call Win32 ExitProcess(). This can be changed via - signal.signal(). For example:: - - # Make Ctrl+Break raise KeyboardInterrupt, like Python's default Ctrl+C - # (SIGINT) behavior. - import signal - signal.signal(signal.SIGBREAK, signal.default_int_handler) - - try: - while 1: - pass - except KeyboardInterrupt: - # We get here on Ctrl+C or Ctrl+Break now; if we had not changed - # SIGBREAK, only on Ctrl+C (and Ctrl+Break would terminate the - # program without the possibility for any Python-level cleanup). - print "Clean exit" - - -What's New in Python 2.2a4? -=========================== - -*Release date: 28-Sep-2001* - -Type/class unification and new-style classes --------------------------------------------- - -- pydoc and inspect are now aware of new-style classes; - e.g. help(list) at the interactive prompt now shows proper - documentation for all operations on list objects. - -- Applications using Jim Fulton's ExtensionClass module can now safely - be used with Python 2.2. In particular, Zope 2.4.1 now works with - Python 2.2 (as well as with Python 2.1.1). The Demo/metaclass - examples also work again. It is hoped that Gtk and Boost also work - with 2.2a4 and beyond. (If you can confirm this, please write - webmaster at python.org; if there are still problems, please open a bug - report on SourceForge.) - -- property() now takes 4 keyword arguments: fget, fset, fdel and doc. - These map to read-only attributes 'fget', 'fset', 'fdel', and '__doc__' - in the constructed property object. fget, fset and fdel weren't - discoverable from Python in 2.2a3. __doc__ is new, and allows to - associate a docstring with a property. - -- Comparison overloading is now more completely implemented. For - example, a str subclass instance can properly be compared to a str - instance, and it can properly overload comparison. Ditto for most - other built-in object types. - -- The repr() of new-style classes has changed; instead of a new-style class is now rendered as , - *except* for built-in types, which are still rendered as (to avoid upsetting existing code that might parse or - otherwise rely on repr() of certain type objects). - -- The repr() of new-style objects is now always ; - previously, it was sometimes . - -- For new-style classes, what was previously called __getattr__ is now - called __getattribute__. This method, if defined, is called for - *every* attribute access. A new __getattr__ hook more similar to the - one in classic classes is defined which is called only if regular - attribute access raises AttributeError; to catch *all* attribute - access, you can use __getattribute__ (for new-style classes). If - both are defined, __getattribute__ is called first, and if it raises - AttributeError, __getattr__ is called. - -- The __class__ attribute of new-style objects can be assigned to. - The new class must have the same C-level object layout as the old - class. - -- The builtin file type can be subclassed now. In the usual pattern, - "file" is the name of the builtin type, and file() is a new builtin - constructor, with the same signature as the builtin open() function. - file() is now the preferred way to open a file. - -- Previously, __new__ would only see sequential arguments passed to - the type in a constructor call; __init__ would see both sequential - and keyword arguments. This made no sense whatsoever any more, so - now both __new__ and __init__ see all arguments. - -- Previously, hash() applied to an instance of a subclass of str or - unicode always returned 0. This has been repaired. - -- Previously, an operation on an instance of a subclass of an - immutable type (int, long, float, complex, tuple, str, unicode), - where the subtype didn't override the operation (and so the - operation was handled by the builtin type), could return that - instance instead a value of the base type. For example, if s was of - a str subclass type, s[:] returned s as-is. Now it returns a str - with the same value as s. - -- Provisional support for pickling new-style objects has been added. - -Core ----- - -- file.writelines() now accepts any iterable object producing strings. - -- PyUnicode_FromEncodedObject() now works very much like - PyObject_Str(obj) in that it tries to use __str__/tp_str - on the object if the object is not a string or buffer. This - makes unicode() behave like str() when applied to non-string/buffer - objects. - -- PyFile_WriteObject now passes Unicode objects to the file's write - method. As a result, all file-like objects which may be the target - of a print statement must support Unicode objects, i.e. they must - at least convert them into ASCII strings. - -- Thread scheduling on Solaris should be improved; it is no longer - necessary to insert a small sleep at the start of a thread in order - to let other runnable threads be scheduled. - -Library -------- - -- StringIO.StringIO instances and cStringIO.StringIO instances support - read character buffer compatible objects for their .write() methods. - These objects are converted to strings and then handled as such - by the instances. - -- The "email" package has been added. This is basically a port of the - mimelib package with API changes - and some implementations updated to use iterators and generators. - -- difflib.ndiff() and difflib.Differ.compare() are generators now. This - restores the ability of Tools/scripts/ndiff.py to start producing output - before the entire comparison is complete. - -- StringIO.StringIO instances and cStringIO.StringIO instances support - iteration just like file objects (i.e. their .readline() method is - called for each iteration until it returns an empty string). - -- The codecs module has grown four new helper APIs to access - builtin codecs: getencoder(), getdecoder(), getreader(), - getwriter(). - -- SimpleXMLRPCServer: a new module (based upon SimpleHTMLServer) - simplifies writing XML RPC servers. - -- os.path.realpath(): a new function that returns the absolute pathname - after interpretation of symbolic links. On non-Unix systems, this - is an alias for os.path.abspath(). - -- operator.indexOf() (PySequence_Index() in the C API) now works with any - iterable object. - -- smtplib now supports various authentication and security features of - the SMTP protocol through the new login() and starttls() methods. - -- hmac: a new module implementing keyed hashing for message - authentication. - -- mimetypes now recognizes more extensions and file types. At the - same time, some mappings not sanctioned by IANA were removed. - -- The "compiler" package has been brought up to date to the state of - Python 2.2 bytecode generation. It has also been promoted from a - Tool to a standard library package. (Tools/compiler still exists as - a sample driver.) - -Build ------ - -- Large file support (LFS) is now automatic when the platform supports - it; no more manual configuration tweaks are needed. On Linux, at - least, it's possible to have a system whose C library supports large - files but whose kernel doesn't; in this case, large file support is - still enabled but doesn't do you any good unless you upgrade your - kernel or share your Python executable with another system whose - kernel has large file support. - -- The configure script now supplies plausible defaults in a - cross-compilation environment. This doesn't mean that the supplied - values are always correct, or that cross-compilation now works - flawlessly -- but it's a first step (and it shuts up most of - autoconf's warnings about AC_TRY_RUN). - -- The Unix build is now a bit less chatty, courtesy of the parser - generator. The build is completely silent (except for errors) when - using "make -s", thanks to a -q option to setup.py. - -C API ------ - -- The "structmember" API now supports some new flag bits to deny read - and/or write access to attributes in restricted execution mode. - -New platforms -------------- - -- Compaq's iPAQ handheld, running the "familiar" Linux distribution - (http://familiar.handhelds.org). - -Tests ------ - -- The "classic" standard tests, which work by comparing stdout to - an expected-output file under Lib/test/output/, no longer stop at - the first mismatch. Instead the test is run to completion, and a - variant of ndiff-style comparison is used to report all differences. - This is much easier to understand than the previous style of reporting. - -- The unittest-based standard tests now use regrtest's test_main() - convention, instead of running as a side-effect of merely being - imported. This allows these tests to be run in more natural and - flexible ways as unittests, outside the regrtest framework. - -- regrtest.py is much better integrated with unittest and doctest now, - especially in regard to reporting errors. - -Windows -------- - -- Large file support now also works for files > 4GB, on filesystems - that support it (NTFS under Windows 2000). See "What's New in - Python 2.2a3" for more detail. - - -What's New in Python 2.2a3? -=========================== - -*Release Date: 07-Sep-2001* - -Core ----- - -- Conversion of long to float now raises OverflowError if the long is too - big to represent as a C double. - -- The 3-argument builtin pow() no longer allows a third non-None argument - if either of the first two arguments is a float, or if both are of - integer types and the second argument is negative (in which latter case - the arguments are converted to float, so this is really the same - restriction). - -- The builtin dir() now returns more information, and sometimes much - more, generally naming all attributes of an object, and all attributes - reachable from the object via its class, and from its class's base - classes, and so on from them too. Example: in 2.2a2, dir([]) returned - an empty list. In 2.2a3, - - >>> dir([]) - ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', - '__eq__', '__ge__', '__getattr__', '__getitem__', '__getslice__', - '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__le__', - '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__repr__', - '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', - 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', - 'reverse', 'sort'] - - dir(module) continues to return only the module's attributes, though. - -- Overflowing operations on plain ints now return a long int rather - than raising OverflowError. This is a partial implementation of PEP - 237. You can use -Wdefault::OverflowWarning to enable a warning for - this situation, and -Werror::OverflowWarning to revert to the old - OverflowError exception. - -- A new command line option, -Q, is added to control run-time - warnings for the use of classic division. (See PEP 238.) Possible - values are -Qold, -Qwarn, -Qwarnall, and -Qnew. The default is - -Qold, meaning the / operator has its classic meaning and no - warnings are issued. Using -Qwarn issues a run-time warning about - all uses of classic division for int and long arguments; -Qwarnall - also warns about classic division for float and complex arguments - (for use with fixdiv.py). - [Note: the remainder of this item (preserved below) became - obsolete in 2.2c1 -- -Qnew has global effect in 2.2] :: - - Using -Qnew is questionable; it turns on new division by default, but - only in the __main__ module. You can usefully combine -Qwarn or - -Qwarnall and -Qnew: this gives the __main__ module new division, and - warns about classic division everywhere else. - -- Many built-in types can now be subclassed. This applies to int, - long, float, str, unicode, and tuple. (The types complex, list and - dictionary can also be subclassed; this was introduced earlier.) - Note that restrictions apply when subclassing immutable built-in - types: you can only affect the value of the instance by overloading - __new__. You can add mutable attributes, and the subclass instances - will have a __dict__ attribute, but you cannot change the "value" - (as implemented by the base class) of an immutable subclass instance - once it is created. - -- The dictionary constructor now takes an optional argument, a - mapping-like object, and initializes the dictionary from its - (key, value) pairs. - -- A new built-in type, super, has been added. This facilitates making - "cooperative super calls" in a multiple inheritance setting. For an - explanation, see http://www.python.org/2.2/descrintro.html#cooperation - -- A new built-in type, property, has been added. This enables the - creation of "properties". These are attributes implemented by - getter and setter functions (or only one of these for read-only or - write-only attributes), without the need to override __getattr__. - See http://www.python.org/2.2/descrintro.html#property - -- The syntax of floating-point and imaginary literals has been - liberalized, to allow leading zeroes. Examples of literals now - legal that were SyntaxErrors before: - - 00.0 0e3 0100j 07.5 00000000000000000008. - -- An old tokenizer bug allowed floating point literals with an incomplete - exponent, such as 1e and 3.1e-. Such literals now raise SyntaxError. - -Library -------- - -- telnetlib includes symbolic names for the options, and support for - setting an option negotiation callback. It also supports processing - of suboptions. - -- The new C standard no longer requires that math libraries set errno to - ERANGE on overflow. For platform libraries that exploit this new - freedom, Python's overflow-checking was wholly broken. A new overflow- - checking scheme attempts to repair that, but may not be reliable on all - platforms (C doesn't seem to provide anything both useful and portable - in this area anymore). - -- Asynchronous timeout actions are available through the new class - threading.Timer. - -- math.log and math.log10 now return sensible results for even huge - long arguments. For example, math.log10(10 ** 10000) ~= 10000.0. - -- A new function, imp.lock_held(), returns 1 when the import lock is - currently held. See the docs for the imp module. - -- pickle, cPickle and marshal on 32-bit platforms can now correctly read - dumps containing ints written on platforms where Python ints are 8 bytes. - When read on a box where Python ints are 4 bytes, such values are - converted to Python longs. - -- In restricted execution mode (using the rexec module), unmarshalling - code objects is no longer allowed. This plugs a security hole. - -- unittest.TestResult instances no longer store references to tracebacks - generated by test failures. This prevents unexpected dangling references - to objects that should be garbage collected between tests. - -Tools ------ - -- Tools/scripts/fixdiv.py has been added which can be used to fix - division operators as per PEP 238. - -Build ------ - -- If you are an adventurous person using Mac OS X you may want to look at - Mac/OSX. There is a Makefile there that will build Python as a real Mac - application, which can be used for experimenting with Carbon or Cocoa. - Discussion of this on pythonmac-sig, please. - -C API ------ - -- New function PyObject_Dir(obj), like Python __builtin__.dir(obj). - -- Note that PyLong_AsDouble can fail! This has always been true, but no - callers checked for it. It's more likely to fail now, because overflow - errors are properly detected now. The proper way to check:: - - double x = PyLong_AsDouble(some_long_object); - if (x == -1.0 && PyErr_Occurred()) { - /* The conversion failed. */ - } - -- The GC API has been changed. Extensions that use the old API will still - compile but will not participate in GC. To upgrade an extension - module: - - - rename Py_TPFLAGS_GC to PyTPFLAGS_HAVE_GC - - - use PyObject_GC_New or PyObject_GC_NewVar to allocate objects and - PyObject_GC_Del to deallocate them - - - rename PyObject_GC_Init to PyObject_GC_Track and PyObject_GC_Fini - to PyObject_GC_UnTrack - - - remove PyGC_HEAD_SIZE from object size calculations - - - remove calls to PyObject_AS_GC and PyObject_FROM_GC - -- Two new functions: PyString_FromFormat() and PyString_FromFormatV(). - These can be used safely to construct string objects from a - sprintf-style format string (similar to the format string supported - by PyErr_Format()). - -New platforms -------------- - -- Stephen Hansen contributed patches sufficient to get a clean compile - under Borland C (Windows), but he reports problems running it and ran - out of time to complete the port. Volunteers? Expect a MemoryError - when importing the types module; this is probably shallow, and - causing later failures too. - -Tests ------ - -Windows -------- - -- Large file support is now enabled on Win32 platforms as well as on - Win64. This means that, for example, you can use f.tell() and f.seek() - to manipulate files larger than 2 gigabytes (provided you have enough - disk space, and are using a Windows filesystem that supports large - partitions). Windows filesystem limits: FAT has a 2GB (gigabyte) - filesize limit, and large file support makes no difference there. - FAT32's limit is 4GB, and files >= 2GB are easier to use from Python now. - NTFS has no practical limit on file size, and files of any size can be - used from Python now. - -- The w9xpopen hack is now used on Windows NT and 2000 too when COMPSPEC - points to command.com (patch from Brian Quinlan). - - -What's New in Python 2.2a2? -=========================== - -*Release Date: 22-Aug-2001* - -Build ------ - -- Tim Peters developed a brand new Windows installer using Wise 8.1, - generously donated to us by Wise Solutions. - -- configure supports a new option --enable-unicode, with the values - ucs2 and ucs4 (new in 2.2a1). With --disable-unicode, the Unicode - type and supporting code is completely removed from the interpreter. - -- A new configure option --enable-framework builds a Mac OS X framework, - which "make frameworkinstall" will install. This provides a starting - point for more mac-like functionality, join pythonmac-sig at python.org - if you are interested in helping. - -- The NeXT platform is no longer supported. - -- The 'new' module is now statically linked. - -Tools ------ - -- The new Tools/scripts/cleanfuture.py can be used to automatically - edit out obsolete future statements from Python source code. See - the module docstring for details. - -Tests ------ - -- regrtest.py now knows which tests are expected to be skipped on some - platforms, allowing to give clearer test result output. regrtest - also has optional --use/-u switch to run normally disabled tests - which require network access or consume significant disk resources. - -- Several new tests in the standard test suite, with special thanks to - Nick Mathewson. - -Core ----- - -- The floor division operator // has been added as outlined in PEP - 238. The / operator still provides classic division (and will until - Python 3.0) unless "from __future__ import division" is included, in - which case the / operator will provide true division. The operator - module provides truediv() and floordiv() functions. Augmented - assignment variants are included, as are the equivalent overloadable - methods and C API methods. See the PEP for a full discussion: - - -- Future statements are now effective in simulated interactive shells - (like IDLE). This should "just work" by magic, but read Michael - Hudson's "Future statements in simulated shells" PEP 264 for full - details: . - -- The type/class unification (PEP 252-253) was integrated into the - trunk and is not so tentative any more (the exact specification of - some features is still tentative). A lot of work has done on fixing - bugs and adding robustness and features (performance still has to - come a long way). - -- Warnings about a mismatch in the Python API during extension import - now use the Python warning framework (which makes it possible to - write filters for these warnings). - -- A function's __dict__ (aka func_dict) will now always be a - dictionary. It used to be possible to delete it or set it to None, - but now both actions raise TypeErrors. It is still legal to set it - to a dictionary object. Getting func.__dict__ before any attributes - have been assigned now returns an empty dictionary instead of None. - -- A new command line option, -E, was added which disables the use of - all environment variables, or at least those that are specifically - significant to Python. Usually those have a name starting with - "PYTHON". This was used to fix a problem where the tests fail if - the user happens to have PYTHONHOME or PYTHONPATH pointing to an - older distribution. - -Library -------- - -- New class Differ and new functions ndiff() and restore() in difflib.py. - These package the algorithms used by the popular Tools/scripts/ndiff.py, - for programmatic reuse. - -- New function xml.sax.saxutils.quoteattr(): Quote an XML attribute - value using the minimal quoting required for the value; more - reliable than using xml.sax.saxutils.escape() for attribute values. - -- Readline completion support for cmd.Cmd was added. - -- Calling os.tempnam() or os.tmpnam() generate RuntimeWarnings. - -- Added function threading.BoundedSemaphore() - -- Added Ka-Ping Yee's cgitb.py module. - -- The 'new' module now exposes the CO_xxx flags. - -- The gc module offers the get_referents function. - -New platforms -------------- - -C API ------ - -- Two new APIs PyOS_snprintf() and PyOS_vsnprintf() were added - which provide a cross-platform implementations for the - relatively new snprintf()/vsnprintf() C lib APIs. In contrast to - the standard sprintf() and vsprintf() C lib APIs, these versions - apply bounds checking on the used buffer which enhances protection - against buffer overruns. - -- Unicode APIs now use name mangling to assure that mixing interpreters - and extensions using different Unicode widths is rendered next to - impossible. Trying to import an incompatible Unicode-aware extension - will result in an ImportError. Unicode extensions writers must make - sure to check the Unicode width compatibility in their extensions by - using at least one of the mangled Unicode APIs in the extension. - -- Two new flags METH_NOARGS and METH_O are available in method definition - tables to simplify implementation of methods with no arguments and a - single untyped argument. Calling such methods is more efficient than - calling corresponding METH_VARARGS methods. METH_OLDARGS is now - deprecated. - -Windows -------- - -- "import module" now compiles module.pyw if it exists and nothing else - relevant is found. - - -What's New in Python 2.2a1? -=========================== - -*Release date: 18-Jul-2001* - -Core ----- - -- TENTATIVELY, a large amount of code implementing much of what's - described in PEP 252 (Making Types Look More Like Classes) and PEP - 253 (Subtyping Built-in Types) was added. This will be released - with Python 2.2a1. Documentation will be provided separately - through http://www.python.org/2.2/. The purpose of releasing this - with Python 2.2a1 is to test backwards compatibility. It is - possible, though not likely, that a decision is made not to release - this code as part of 2.2 final, if any serious backwards - incompatibilities are found during alpha testing that cannot be - repaired. - -- Generators were added; this is a new way to create an iterator (see - below) using what looks like a simple function containing one or - more 'yield' statements. See PEP 255. Since this adds a new - keyword to the language, this feature must be enabled by including a - future statement: "from __future__ import generators" (see PEP 236). - Generators will become a standard feature in a future release - (probably 2.3). Without this future statement, 'yield' remains an - ordinary identifier, but a warning is issued each time it is used. - (These warnings currently don't conform to the warnings framework of - PEP 230; we intend to fix this in 2.2a2.) - -- The UTF-16 codec was modified to be more RFC compliant. It will now - only remove BOM characters at the start of the string and then - only if running in native mode (UTF-16-LE and -BE won't remove a - leading BMO character). - -- Strings now have a new method .decode() to complement the already - existing .encode() method. These two methods provide direct access - to the corresponding decoders and encoders of the registered codecs. - - To enhance the usability of the .encode() method, the special - casing of Unicode object return values was dropped (Unicode objects - were auto-magically converted to string using the default encoding). - - Both methods will now return whatever the codec in charge of the - requested encoding returns as object, e.g. Unicode codecs will - return Unicode objects when decoding is requested ("äöü".decode("latin-1") - will return u"äöü"). This enables codec writer to create codecs - for various simple to use conversions. - - New codecs were added to demonstrate these new features (the .encode() - and .decode() columns indicate the type of the returned objects): - - +---------+-----------+-----------+-----------------------------+ - |Name | .encode() | .decode() | Description | - +=========+===========+===========+=============================+ - |uu | string | string | UU codec (e.g. for email) | - +---------+-----------+-----------+-----------------------------+ - |base64 | string | string | base64 codec | - +---------+-----------+-----------+-----------------------------+ - |quopri | string | string | quoted-printable codec | - +---------+-----------+-----------+-----------------------------+ - |zlib | string | string | zlib compression | - +---------+-----------+-----------+-----------------------------+ - |hex | string | string | 2-byte hex codec | - +---------+-----------+-----------+-----------------------------+ - |rot-13 | string | Unicode | ROT-13 Unicode charmap codec| - +---------+-----------+-----------+-----------------------------+ - -- Some operating systems now support the concept of a default Unicode - encoding for file system operations. Notably, Windows supports 'mbcs' - as the default. The Macintosh will also adopt this concept in the medium - term, although the default encoding for that platform will be other than - 'mbcs'. - - On operating system that support non-ASCII filenames, it is common for - functions that return filenames (such as os.listdir()) to return Python - string objects pre-encoded using the default file system encoding for - the platform. As this encoding is likely to be different from Python's - default encoding, converting this name to a Unicode object before passing - it back to the Operating System would result in a Unicode error, as Python - would attempt to use its default encoding (generally ASCII) rather than - the default encoding for the file system. - - In general, this change simply removes surprises when working with - Unicode and the file system, making these operations work as you expect, - increasing the transparency of Unicode objects in this context. - See [????] for more details, including examples. - -- Float (and complex) literals in source code were evaluated to full - precision only when running from a .py file; the same code loaded from a - .pyc (or .pyo) file could suffer numeric differences starting at about the - 12th significant decimal digit. For example, on a machine with IEEE-754 - floating arithmetic, - - x = 9007199254740992.0 - print long(x) - - printed 9007199254740992 if run directly from .py, but 9007199254740000 - if from a compiled (.pyc or .pyo) file. This was due to marshal using - str(float) instead of repr(float) when building code objects. marshal - now uses repr(float) instead, which should reproduce floats to full - machine precision (assuming the platform C float<->string I/O conversion - functions are of good quality). - - This may cause floating-point results to change in some cases, and - usually for the better, but may also cause numerically unstable - algorithms to break. - -- The implementation of dicts suffers fewer collisions, which has speed - benefits. However, the order in which dict entries appear in dict.keys(), - dict.values() and dict.items() may differ from previous releases for a - given dict. Nothing is defined about this order, so no program should - rely on it. Nevertheless, it's easy to write test cases that rely on the - order by accident, typically because of printing the str() or repr() of a - dict to an "expected results" file. See Lib/test/test_support.py's new - sortdict(dict) function for a simple way to display a dict in sorted - order. - -- Many other small changes to dicts were made, resulting in faster - operation along the most common code paths. - -- Dictionary objects now support the "in" operator: "x in dict" means - the same as dict.has_key(x). - -- The update() method of dictionaries now accepts generic mapping - objects. Specifically the argument object must support the .keys() - and __getitem__() methods. This allows you to say, for example, - {}.update(UserDict()) - -- Iterators were added; this is a generalized way of providing values - to a for loop. See PEP 234. There's a new built-in function iter() - to return an iterator. There's a new protocol to get the next value - from an iterator using the next() method (in Python) or the - tp_iternext slot (in C). There's a new protocol to get iterators - using the __iter__() method (in Python) or the tp_iter slot (in C). - Iterating (i.e. a for loop) over a dictionary generates its keys. - Iterating over a file generates its lines. - -- The following functions were generalized to work nicely with iterator - arguments:: - - map(), filter(), reduce(), zip() - list(), tuple() (PySequence_Tuple() and PySequence_Fast() in C API) - max(), min() - join() method of strings - extend() method of lists - 'x in y' and 'x not in y' (PySequence_Contains() in C API) - operator.countOf() (PySequence_Count() in C API) - right-hand side of assignment statements with multiple targets, such as :: - x, y, z = some_iterable_object_returning_exactly_3_values - -- Accessing module attributes is significantly faster (for example, - random.random or os.path or yourPythonModule.yourAttribute). - -- Comparing dictionary objects via == and != is faster, and now works even - if the keys and values don't support comparisons other than ==. - -- Comparing dictionaries in ways other than == and != is slower: there were - insecurities in the dict comparison implementation that could cause Python - to crash if the element comparison routines for the dict keys and/or - values mutated the dicts. Making the code bulletproof slowed it down. - -- Collisions in dicts are resolved via a new approach, which can help - dramatically in bad cases. For example, looking up every key in a dict - d with d.keys() == [i << 16 for i in range(20000)] is approximately 500x - faster now. Thanks to Christian Tismer for pointing out the cause and - the nature of an effective cure (last December! better late than never). - -- repr() is much faster for large containers (dict, list, tuple). - - -Library -------- - -- The constants ascii_letters, ascii_lowercase. and ascii_uppercase - were added to the string module. These a locale-independent - constants, unlike letters, lowercase, and uppercase. These are now - use in appropriate locations in the standard library. - -- The flags used in dlopen calls can now be configured using - sys.setdlopenflags and queried using sys.getdlopenflags. - -- Fredrik Lundh's xmlrpclib is now a standard library module. This - provides full client-side XML-RPC support. In addition, - Demo/xmlrpc/ contains two server frameworks (one SocketServer-based, - one asyncore-based). Thanks to Eric Raymond for the documentation. - -- The xrange() object is simplified: it no longer supports slicing, - repetition, comparisons, efficient 'in' checking, the tolist() - method, or the start, stop and step attributes. See PEP 260. - -- A new function fnmatch.filter to filter lists of file names was added. - -- calendar.py uses month and day names based on the current locale. - -- strop is now *really* obsolete (this was announced before with 1.6), - and issues DeprecationWarning when used (except for the four items - that are still imported into string.py). - -- Cookie.py now sorts key+value pairs by key in output strings. - -- pprint.isrecursive(object) didn't correctly identify recursive objects. - Now it does. - -- pprint functions now much faster for large containers (tuple, list, dict). - -- New 'q' and 'Q' format codes in the struct module, corresponding to C - types "long long" and "unsigned long long" (on Windows, __int64). In - native mode, these can be used only when the platform C compiler supports - these types (when HAVE_LONG_LONG is #define'd by the Python config - process), and then they inherit the sizes and alignments of the C types. - In standard mode, 'q' and 'Q' are supported on all platforms, and are - 8-byte integral types. - -- The site module installs a new built-in function 'help' that invokes - pydoc.help. It must be invoked as 'help()'; when invoked as 'help', - it displays a message reminding the user to use 'help()' or - 'help(object)'. - -Tests ------ - -- New test_mutants.py runs dict comparisons where the key and value - comparison operators mutate the dicts randomly during comparison. This - rapidly causes Python to crash under earlier releases (not for the faint - of heart: it can also cause Win9x to freeze or reboot!). - -- New test_pprint.py verifies that pprint.isrecursive() and - pprint.isreadable() return sensible results. Also verifies that simple - cases produce correct output. - -C API ------ - -- Removed the unused last_is_sticky argument from the internal - _PyTuple_Resize(). If this affects you, you were cheating. - ---- **(For information about older versions, consult the HISTORY file.)** From python-checkins at python.org Mon Mar 20 07:33:01 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 07:33:01 +0100 (CET) Subject: [Python-checkins] r43160 - python/trunk/Include/pyport.h Message-ID: <20060320063301.D37ED1E4010@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 07:33:01 2006 New Revision: 43160 Modified: python/trunk/Include/pyport.h Log: Get Py_DEPRECATED to work with gcc 4.x too Modified: python/trunk/Include/pyport.h ============================================================================== --- python/trunk/Include/pyport.h (original) +++ python/trunk/Include/pyport.h Mon Mar 20 07:33:01 2006 @@ -406,7 +406,8 @@ * typedef int T1 Py_DEPRECATED(2.4); * extern int x() Py_DEPRECATED(2.5); */ -#if defined(__GNUC__) && (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) +#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ + (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) #else #define Py_DEPRECATED(VERSION_UNUSED) From python-checkins at python.org Mon Mar 20 07:34:08 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 07:34:08 +0100 (CET) Subject: [Python-checkins] r43161 - python/trunk/Modules/audioop.c Message-ID: <20060320063408.64AC61E4003@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 07:34:06 2006 New Revision: 43161 Modified: python/trunk/Modules/audioop.c Log: Make some functions static, reformat function decl to be consistent and check for error from PyModule_GetDict() Modified: python/trunk/Modules/audioop.c ============================================================================== --- python/trunk/Modules/audioop.c (original) +++ python/trunk/Modules/audioop.c Mon Mar 20 07:34:06 2006 @@ -50,7 +50,8 @@ static PyInt16 seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF}; -static PyInt16 search(PyInt16 val, PyInt16 *table, int size) +static PyInt16 +search(PyInt16 val, PyInt16 *table, int size) { int i; @@ -63,7 +64,7 @@ #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc]) #define st_alaw2linear16(uc) (_st_alaw2linear16[uc]) -PyInt16 _st_ulaw2linear16[256] = { +static PyInt16 _st_ulaw2linear16[256] = { -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, -15996, -15484, -14972, -14460, -13948, @@ -135,8 +136,8 @@ * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ -unsigned char st_14linear2ulaw( - PyInt16 pcm_val) /* 2's complement (14-bit range) */ +static unsigned char +st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */ { PyInt16 mask; PyInt16 seg; @@ -172,7 +173,7 @@ } -PyInt16 _st_alaw2linear16[256] = { +static PyInt16 _st_alaw2linear16[256] = { -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, -2752, -2624, -3008, -2880, -2240, @@ -232,8 +233,8 @@ * For further information see John C. Bellamy's Digital Telephony, 1982, * John Wiley & Sons, pps 98-111 and 472-476. */ -unsigned char st_linear2alaw( - PyInt16 pcm_val) /* 2's complement (13-bit range) */ +static unsigned char +st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */ { PyInt16 mask; short seg; @@ -1597,6 +1598,8 @@ if (m == NULL) return; d = PyModule_GetDict(m); + if (d == NULL) + return; AudioopError = PyErr_NewException("audioop.error", NULL, NULL); if (AudioopError != NULL) PyDict_SetItemString(d,"error",AudioopError); From python-checkins at python.org Mon Mar 20 07:48:35 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 07:48:35 +0100 (CET) Subject: [Python-checkins] r43162 - python/trunk/Modules/posixmodule.c Message-ID: <20060320064835.693831E4003@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 07:48:34 2006 New Revision: 43162 Modified: python/trunk/Modules/posixmodule.c Log: Try to cleanup a lot of boilerplate #ifdef wrt wait types and make the code more consistent (and smaller by 85 lines or so). Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Mar 20 07:48:34 2006 @@ -264,6 +264,12 @@ #define WTERMSIG(u_wait) ((u_wait).w_termsig) #endif +#define WAIT_TYPE union wait +#define WAIT_STATUS_INT(s) (s.w_status) + +#else /* !UNION_WAIT */ +#define WAIT_TYPE int +#define WAIT_STATUS_INT(s) (s) #endif /* UNION_WAIT */ /* Don't use the "_r" form if we don't need it (also, won't have a @@ -5159,15 +5165,8 @@ { int pid, options; struct rusage ru; - -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; if (!PyArg_ParseTuple(args, "i:wait3", &options)) return NULL; @@ -5176,8 +5175,7 @@ pid = wait3(&status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, status_i, &ru); -#undef status_i + return wait_helper(pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT3 */ @@ -5191,15 +5189,8 @@ { int pid, options; struct rusage ru; - -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; if (!PyArg_ParseTuple(args, "ii:wait4", &pid, &options)) return NULL; @@ -5208,8 +5199,7 @@ pid = wait4(pid, &status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, status_i, &ru); -#undef status_i + return wait_helper(pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT4 */ @@ -5222,14 +5212,8 @@ posix_waitpid(PyObject *self, PyObject *args) { int pid, options; -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options)) return NULL; @@ -5238,8 +5222,8 @@ Py_END_ALLOW_THREADS if (pid == -1) return posix_error(); - else - return Py_BuildValue("ii", pid, status_i); + + return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status)); } #elif defined(HAVE_CWAIT) @@ -5262,10 +5246,9 @@ Py_END_ALLOW_THREADS if (pid == -1) return posix_error(); - else - /* shift the status left a byte so this is more like the - POSIX waitpid */ - return Py_BuildValue("ii", pid, status << 8); + + /* shift the status left a byte so this is more like the POSIX waitpid */ + return Py_BuildValue("ii", pid, status << 8); } #endif /* HAVE_WAITPID || HAVE_CWAIT */ @@ -5278,23 +5261,16 @@ posix_wait(PyObject *self, PyObject *noargs) { int pid; -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - status_i = 0; Py_BEGIN_ALLOW_THREADS pid = wait(&status); Py_END_ALLOW_THREADS if (pid == -1) return posix_error(); - else - return Py_BuildValue("ii", pid, status_i); -#undef status_i + + return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status)); } #endif @@ -6132,22 +6108,13 @@ static PyObject * posix_WCOREDUMP(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status))) return NULL; - } return PyBool_FromLong(WCOREDUMP(status)); -#undef status_i } #endif /* WCOREDUMP */ @@ -6160,22 +6127,13 @@ static PyObject * posix_WIFCONTINUED(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WCONTINUED", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status))) return NULL; - } return PyBool_FromLong(WIFCONTINUED(status)); -#undef status_i } #endif /* WIFCONTINUED */ @@ -6187,22 +6145,13 @@ static PyObject * posix_WIFSTOPPED(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status))) return NULL; - } return PyBool_FromLong(WIFSTOPPED(status)); -#undef status_i } #endif /* WIFSTOPPED */ @@ -6214,22 +6163,13 @@ static PyObject * posix_WIFSIGNALED(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status))) return NULL; - } return PyBool_FromLong(WIFSIGNALED(status)); -#undef status_i } #endif /* WIFSIGNALED */ @@ -6242,22 +6182,13 @@ static PyObject * posix_WIFEXITED(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status))) return NULL; - } return PyBool_FromLong(WIFEXITED(status)); -#undef status_i } #endif /* WIFEXITED */ @@ -6269,22 +6200,13 @@ static PyObject * posix_WEXITSTATUS(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status))) return NULL; - } return Py_BuildValue("i", WEXITSTATUS(status)); -#undef status_i } #endif /* WEXITSTATUS */ @@ -6297,22 +6219,13 @@ static PyObject * posix_WTERMSIG(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status))) return NULL; - } return Py_BuildValue("i", WTERMSIG(status)); -#undef status_i } #endif /* WTERMSIG */ @@ -6325,22 +6238,13 @@ static PyObject * posix_WSTOPSIG(PyObject *self, PyObject *args) { -#ifdef UNION_WAIT - union wait status; -#define status_i (status.w_status) -#else - int status; -#define status_i status -#endif - status_i = 0; + WAIT_TYPE status; + WAIT_STATUS_INT(status) = 0; - if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i)) - { + if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status))) return NULL; - } return Py_BuildValue("i", WSTOPSIG(status)); -#undef status_i } #endif /* WSTOPSIG */ From python-checkins at python.org Mon Mar 20 08:10:01 2006 From: python-checkins at python.org (anthony.baxter) Date: Mon, 20 Mar 2006 08:10:01 +0100 (CET) Subject: [Python-checkins] r43163 - in python/trunk/Lib: email/__init__.py test/test_wait3.py Message-ID: <20060320071001.B21441E4003@bag.python.org> Author: anthony.baxter Date: Mon Mar 20 08:10:01 2006 New Revision: 43163 Modified: python/trunk/Lib/email/__init__.py python/trunk/Lib/test/test_wait3.py Log: whitespace n11n Modified: python/trunk/Lib/email/__init__.py ============================================================================== --- python/trunk/Lib/email/__init__.py (original) +++ python/trunk/Lib/email/__init__.py Mon Mar 20 08:10:01 2006 @@ -72,14 +72,14 @@ import sys class LazyImporter(object): - def __init__(self, module_name): - self.__name__ = 'email.' + module_name + def __init__(self, module_name): + self.__name__ = 'email.' + module_name - def __getattr__(self, name): - __import__(self.__name__) - mod = sys.modules[self.__name__] - self.__dict__.update(mod.__dict__) - return getattr(mod, name) + def __getattr__(self, name): + __import__(self.__name__) + mod = sys.modules[self.__name__] + self.__dict__.update(mod.__dict__) + return getattr(mod, name) _LOWERNAMES = [ Modified: python/trunk/Lib/test/test_wait3.py ============================================================================== --- python/trunk/Lib/test/test_wait3.py (original) +++ python/trunk/Lib/test/test_wait3.py Mon Mar 20 08:10:01 2006 @@ -18,9 +18,9 @@ class Wait3Test(ForkWait): def wait_impl(self, cpid): while 1: - spid, status, rusage = os.wait3(0) - if spid == cpid: - break + spid, status, rusage = os.wait3(0) + if spid == cpid: + break self.assertEqual(spid, cpid) self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) self.assertTrue(rusage) From python-checkins at python.org Mon Mar 20 08:25:27 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 08:25:27 +0100 (CET) Subject: [Python-checkins] r43164 - python/trunk/Modules/posixmodule.c Message-ID: <20060320072527.1B3D51E402A@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 08:25:26 2006 New Revision: 43164 Modified: python/trunk/Modules/posixmodule.c Log: The helper is only necessary for wait3/4. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Mar 20 08:25:26 2006 @@ -5097,6 +5097,7 @@ } #endif /* HAVE_SETGROUPS */ +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) static PyObject * wait_helper(int pid, int status, struct rusage *ru) { @@ -5154,6 +5155,7 @@ return Py_BuildValue("iiO", pid, status, result); } +#endif /* HAVE_WAIT3 || HAVE_WAIT4 */ #ifdef HAVE_WAIT3 PyDoc_STRVAR(posix_wait3__doc__, From python-checkins at python.org Mon Mar 20 08:54:01 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 08:54:01 +0100 (CET) Subject: [Python-checkins] r43165 - in python/trunk: Lib/ctypes/test/test_byteswap.py Lib/ctypes/test/test_unaligned_structures.py Modules/_ctypes/cfield.c Message-ID: <20060320075401.9ED451E4003@bag.python.org> Author: thomas.heller Date: Mon Mar 20 08:54:01 2006 New Revision: 43165 Added: python/trunk/Lib/ctypes/test/test_unaligned_structures.py Modified: python/trunk/Lib/ctypes/test/test_byteswap.py python/trunk/Modules/_ctypes/cfield.c Log: Accessing unaligned structure fields works now on all architectures. Including unittest. Modified: python/trunk/Lib/ctypes/test/test_byteswap.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_byteswap.py (original) +++ python/trunk/Lib/ctypes/test/test_byteswap.py Mon Mar 20 08:54:01 2006 @@ -2,7 +2,6 @@ from binascii import hexlify from ctypes import * -from ctypes.test import is_resource_enabled def bin(s): return hexlify(buffer(s)).upper() @@ -222,54 +221,60 @@ s2 = struct.pack(fmt, 0x12, 0x1234, 0x12345678, 3.14) self.failUnlessEqual(bin(s1), bin(s2)) - if is_resource_enabled("unaligned_access"): + def test_unaligned_nonnative_struct_fields(self): + if sys.byteorder == "little": + base = BigEndianStructure + fmt = ">b h xi xd" + else: + base = LittleEndianStructure + fmt = "> sys.stderr, typ.value + self.failUnlessEqual(typ.value.offset, 1) + o = typ() + o.value = 4 + self.failUnlessEqual(o.value, 4) + +if __name__ == '__main__': + unittest.main() Modified: python/trunk/Modules/_ctypes/cfield.c ============================================================================== --- python/trunk/Modules/_ctypes/cfield.c (original) +++ python/trunk/Modules/_ctypes/cfield.c Mon Mar 20 08:54:01 2006 @@ -536,9 +536,12 @@ h_set(void *ptr, PyObject *value, unsigned size) { long val; + short x; if (get_long(value, &val) < 0) return NULL; - *(short *)ptr = (short)SET(*(short *)ptr, (short)val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, (short)val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -550,24 +553,28 @@ short field; if (get_long(value, &val) < 0) return NULL; - field = SWAP_2(*(short *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_2(field); field = SET(field, (short)val, size); - *(short *)ptr = SWAP_2(field); + field = SWAP_2(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } static PyObject * h_get(void *ptr, unsigned size) { - short val = *(short *)ptr; + short val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); - return PyInt_FromLong(val); + return PyInt_FromLong((long)val); } static PyObject * h_get_sw(void *ptr, unsigned size) { - short val = *(short *)ptr; + short val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_2(val); GET_BITFIELD(val, size); return PyInt_FromLong(val); @@ -577,10 +584,12 @@ H_set(void *ptr, PyObject *value, unsigned size) { unsigned long val; + unsigned short x; if (get_ulong(value, &val) < 0) return NULL; - *(unsigned short *)ptr = (unsigned short)SET(*(unsigned short *)ptr, - (unsigned short)val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, (unsigned short)val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -591,9 +600,11 @@ unsigned short field; if (get_ulong(value, &val) < 0) return NULL; - field = SWAP_2(*(unsigned short *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_2(field); field = SET(field, (unsigned short)val, size); - *(unsigned short *)ptr = SWAP_2(field); + field = SWAP_2(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -601,7 +612,8 @@ static PyObject * H_get(void *ptr, unsigned size) { - unsigned short val = *(unsigned short *)ptr; + unsigned short val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyInt_FromLong(val); } @@ -609,7 +621,8 @@ static PyObject * H_get_sw(void *ptr, unsigned size) { - unsigned short val = *(unsigned short *)ptr; + unsigned short val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_2(val); GET_BITFIELD(val, size); return PyInt_FromLong(val); @@ -619,9 +632,12 @@ i_set(void *ptr, PyObject *value, unsigned size) { long val; + int x; if (get_long(value, &val) < 0) return NULL; - *(int *)ptr = (int)SET(*(int *)ptr, (int)val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, (int)val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -632,9 +648,11 @@ int field; if (get_long(value, &val) < 0) return NULL; - field = SWAP_INT(*(int *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_INT(field); field = SET(field, (int)val, size); - *(int *)ptr = SWAP_INT(field); + field = SWAP_INT(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -642,7 +660,8 @@ static PyObject * i_get(void *ptr, unsigned size) { - int val = *(int *)ptr; + int val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyInt_FromLong(val); } @@ -650,7 +669,8 @@ static PyObject * i_get_sw(void *ptr, unsigned size) { - int val = *(int *)ptr; + int val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_INT(val); GET_BITFIELD(val, size); return PyInt_FromLong(val); @@ -684,9 +704,12 @@ I_set(void *ptr, PyObject *value, unsigned size) { unsigned long val; + unsigned int x; if (get_ulong(value, &val) < 0) return NULL; - *(unsigned int *)ptr = (unsigned int)SET(*(unsigned int *)ptr, (unsigned int)val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, (unsigned int)val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -697,9 +720,10 @@ unsigned int field; if (get_ulong(value, &val) < 0) return NULL; - field = SWAP_INT(*(unsigned int *)ptr); + memcpy(&field, ptr, sizeof(field)); field = (unsigned int)SET(field, (unsigned int)val, size); - *(unsigned int *)ptr = SWAP_INT(field); + field = SWAP_INT(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -707,7 +731,8 @@ static PyObject * I_get(void *ptr, unsigned size) { - unsigned int val = *(unsigned int *)ptr; + unsigned int val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyLong_FromUnsignedLong(val); } @@ -715,7 +740,8 @@ static PyObject * I_get_sw(void *ptr, unsigned size) { - unsigned int val = *(unsigned int *)ptr; + unsigned int val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_INT(val); GET_BITFIELD(val, size); return PyLong_FromUnsignedLong(val); @@ -725,9 +751,12 @@ l_set(void *ptr, PyObject *value, unsigned size) { long val; + long x; if (get_long(value, &val) < 0) return NULL; - *(long *)ptr = (long)SET(*(long *)ptr, val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -738,9 +767,11 @@ long field; if (get_long(value, &val) < 0) return NULL; - field = SWAP_LONG(*(long *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_LONG(field); field = (long)SET(field, val, size); - *(long *)ptr = SWAP_LONG(field); + field = SWAP_LONG(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -748,7 +779,8 @@ static PyObject * l_get(void *ptr, unsigned size) { - long val = *(long *)ptr; + long val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyInt_FromLong(val); } @@ -756,7 +788,8 @@ static PyObject * l_get_sw(void *ptr, unsigned size) { - long val = *(long *)ptr; + long val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_LONG(val); GET_BITFIELD(val, size); return PyInt_FromLong(val); @@ -766,9 +799,12 @@ L_set(void *ptr, PyObject *value, unsigned size) { unsigned long val; + unsigned long x; if (get_ulong(value, &val) < 0) return NULL; - *(unsigned long *)ptr = (unsigned long)SET(*(unsigned long *)ptr, val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -779,9 +815,11 @@ unsigned long field; if (get_ulong(value, &val) < 0) return NULL; - field = SWAP_LONG(*(unsigned long *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_LONG(field); field = (unsigned long)SET(field, val, size); - *(unsigned long *)ptr = SWAP_LONG(field); + field = SWAP_LONG(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -789,7 +827,8 @@ static PyObject * L_get(void *ptr, unsigned size) { - unsigned long val = *(unsigned long *)ptr; + unsigned long val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyLong_FromUnsignedLong(val); } @@ -797,7 +836,8 @@ static PyObject * L_get_sw(void *ptr, unsigned size) { - unsigned long val = *(unsigned long *)ptr; + unsigned long val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_LONG(val); GET_BITFIELD(val, size); return PyLong_FromUnsignedLong(val); @@ -808,9 +848,12 @@ q_set(void *ptr, PyObject *value, unsigned size) { PY_LONG_LONG val; + PY_LONG_LONG x; if (get_longlong(value, &val) < 0) return NULL; - *(PY_LONG_LONG *)ptr = (PY_LONG_LONG)SET(*(PY_LONG_LONG *)ptr, val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -821,16 +864,19 @@ PY_LONG_LONG field; if (get_longlong(value, &val) < 0) return NULL; - field = SWAP_8(*(PY_LONG_LONG *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_8(field); field = (PY_LONG_LONG)SET(field, val, size); - *(PY_LONG_LONG *)ptr = SWAP_8(field); + field = SWAP_8(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } static PyObject * q_get(void *ptr, unsigned size) { - PY_LONG_LONG val = *(PY_LONG_LONG *)ptr; + PY_LONG_LONG val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyLong_FromLongLong(val); } @@ -838,7 +884,8 @@ static PyObject * q_get_sw(void *ptr, unsigned size) { - PY_LONG_LONG val = *(PY_LONG_LONG *)ptr; + PY_LONG_LONG val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_8(val); GET_BITFIELD(val, size); return PyLong_FromLongLong(val); @@ -848,9 +895,12 @@ Q_set(void *ptr, PyObject *value, unsigned size) { unsigned PY_LONG_LONG val; + unsigned PY_LONG_LONG x; if (get_ulonglong(value, &val) < 0) return NULL; - *(unsigned PY_LONG_LONG *)ptr = (unsigned PY_LONG_LONG)SET(*(unsigned PY_LONG_LONG *)ptr, val, size); + memcpy(&x, ptr, sizeof(x)); + x = SET(x, val, size); + memcpy(ptr, &x, sizeof(x)); _RET(value); } @@ -861,16 +911,19 @@ unsigned PY_LONG_LONG field; if (get_ulonglong(value, &val) < 0) return NULL; - field = SWAP_8(*(unsigned PY_LONG_LONG *)ptr); + memcpy(&field, ptr, sizeof(field)); + field = SWAP_8(field); field = (unsigned PY_LONG_LONG)SET(field, val, size); - *(unsigned PY_LONG_LONG *)ptr = SWAP_8(field); + field = SWAP_8(field); + memcpy(ptr, &field, sizeof(field)); _RET(value); } static PyObject * Q_get(void *ptr, unsigned size) { - unsigned PY_LONG_LONG val = *(unsigned PY_LONG_LONG *)ptr; + unsigned PY_LONG_LONG val; + memcpy(&val, ptr, sizeof(val)); GET_BITFIELD(val, size); return PyLong_FromUnsignedLongLong(val); } @@ -878,7 +931,8 @@ static PyObject * Q_get_sw(void *ptr, unsigned size) { - unsigned PY_LONG_LONG val = *(unsigned PY_LONG_LONG *)ptr; + unsigned PY_LONG_LONG val; + memcpy(&val, ptr, sizeof(val)); val = SWAP_8(val); GET_BITFIELD(val, size); return PyLong_FromUnsignedLongLong(val); @@ -903,14 +957,16 @@ value->ob_type->tp_name); return NULL; } - *(double *)ptr = x; + memcpy(ptr, &x, sizeof(double)); _RET(value); } static PyObject * d_get(void *ptr, unsigned size) { - return PyFloat_FromDouble(*(double *)ptr); + double val; + memcpy(&val, ptr, sizeof(val)); + return PyFloat_FromDouble(val); } static PyObject * @@ -957,14 +1013,16 @@ value->ob_type->tp_name); return NULL; } - *(float *)ptr = x; + memcpy(ptr, &x, sizeof(x)); _RET(value); } static PyObject * f_get(void *ptr, unsigned size) { - return PyFloat_FromDouble(*(float *)ptr); + float val; + memcpy(&val, ptr, sizeof(val)); + return PyFloat_FromDouble(val); } static PyObject * From python-checkins at python.org Mon Mar 20 09:11:58 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 09:11:58 +0100 (CET) Subject: [Python-checkins] r43166 - python/trunk/Lib/ctypes/test/test_keeprefs.py Message-ID: <20060320081158.03FBA1E4010@bag.python.org> Author: thomas.heller Date: Mon Mar 20 09:11:56 2006 New Revision: 43166 Modified: python/trunk/Lib/ctypes/test/test_keeprefs.py Log: Plug a leak in the ctypes test suite when tests are run repeatedly. Modified: python/trunk/Lib/ctypes/test/test_keeprefs.py ============================================================================== --- python/trunk/Lib/ctypes/test/test_keeprefs.py (original) +++ python/trunk/Lib/ctypes/test/test_keeprefs.py Mon Mar 20 09:11:56 2006 @@ -140,5 +140,10 @@ r.a[0].x = 42 r.a[0].y = 99 + # to avoid leaking when tests are run several times + # clean up the types left in the cache. + from ctypes import _pointer_type_cache + del _pointer_type_cache[POINT] + if __name__ == "__main__": unittest.main() From python-checkins at python.org Mon Mar 20 09:28:21 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 09:28:21 +0100 (CET) Subject: [Python-checkins] r43167 - python/trunk/Modules/_ctypes/_ctypes.c Message-ID: <20060320082821.29F131E4010@bag.python.org> Author: thomas.heller Date: Mon Mar 20 09:28:19 2006 New Revision: 43167 Modified: python/trunk/Modules/_ctypes/_ctypes.c Log: Fix bug found by Coverty. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Mon Mar 20 09:28:19 2006 @@ -2512,7 +2512,7 @@ #endif if (PyString_Check(obj) || PyUnicode_Check(obj)) { *pname = PyString_AsString(obj); - return pname ? 1 : 0; + return *pname ? 1 : 0; } PyErr_SetString(PyExc_TypeError, "function name must be string or integer"); From python-checkins at python.org Mon Mar 20 09:29:31 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 09:29:31 +0100 (CET) Subject: [Python-checkins] r43168 - python/trunk/Modules/_ctypes/callproc.c Message-ID: <20060320082931.6FE4E1E4010@bag.python.org> Author: thomas.heller Date: Mon Mar 20 09:29:28 2006 New Revision: 43168 Modified: python/trunk/Modules/_ctypes/callproc.c Log: Fix another bug found by Coverty. Modified: python/trunk/Modules/_ctypes/callproc.c ============================================================================== --- python/trunk/Modules/_ctypes/callproc.c (original) +++ python/trunk/Modules/_ctypes/callproc.c Mon Mar 20 09:29:28 2006 @@ -1363,7 +1363,7 @@ converter(PyObject *obj, void **address) { *address = PyLong_AsVoidPtr(obj); - return address != NULL; + return *address != NULL; } static PyObject * From python-checkins at python.org Mon Mar 20 09:47:12 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 09:47:12 +0100 (CET) Subject: [Python-checkins] r43169 - python/trunk/Modules/posixmodule.c Message-ID: <20060320084712.E5C691E4010@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 09:47:12 2006 New Revision: 43169 Modified: python/trunk/Modules/posixmodule.c Log: Damn Coverity. I can't even sneak in a leak any more. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Mon Mar 20 09:47:12 2006 @@ -5153,7 +5153,7 @@ return NULL; } - return Py_BuildValue("iiO", pid, status, result); + return Py_BuildValue("iiN", pid, status, result); } #endif /* HAVE_WAIT3 || HAVE_WAIT4 */ From python-checkins at python.org Mon Mar 20 09:48:58 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 09:48:58 +0100 (CET) Subject: [Python-checkins] r43169 - svn:log Message-ID: <20060320084858.76C461E4010@bag.python.org> Author: neal.norwitz Revision: 43169 Property Name: svn:log New Property Value: Damn Coverity. I can't even sneak in a leak any more. :-) From python-checkins at python.org Mon Mar 20 09:53:01 2006 From: python-checkins at python.org (neal.norwitz) Date: Mon, 20 Mar 2006 09:53:01 +0100 (CET) Subject: [Python-checkins] r43170 - peps/trunk/pep-0356.txt Message-ID: <20060320085301.1B5971E4011@bag.python.org> Author: neal.norwitz Date: Mon Mar 20 09:53:00 2006 New Revision: 43170 Modified: peps/trunk/pep-0356.txt Log: Update possible change for Gen Exit Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Mon Mar 20 09:53:00 2006 @@ -131,8 +131,8 @@ "timing" (listed as obsolete), "cl" (listed as possibly not up-to-date), and "sv" (listed as obsolete hardware specific). - - Barry Warsaw wants some changes to PEP 352. - http://mail.python.org/pipermail/python-dev/2006-March/062570.html + - Move GeneratorExit in hierarchy? (make special like KeyboardInterrupt) + http://mail.python.org/pipermail/python-dev/2006-March/062635.html Copyright From anthony at interlink.com.au Mon Mar 20 10:19:32 2006 From: anthony at interlink.com.au (Anthony Baxter) Date: Mon, 20 Mar 2006 20:19:32 +1100 Subject: [Python-checkins] release24-maint FREEZE for 2.4.3c1, this Thursday Message-ID: <200603202019.37243.anthony@interlink.com.au> I'd like to freeze the release24-maint branch for 2.4.3c1 this Thursday 23rd March from 0000 UTC. I'll post a note once that's done, but as usual, please please only check in critical fixes in the week between 2.4.3c1 and 2.4.3 (which will follow next week). Please let me know if you have any issues with this. Should I also put this sort of information somewhere on the web? Maybe a slot at the top of the buildbot page? Thanks, Anthony -- Anthony Baxter It's never too late to have a happy childhood. From python-checkins at python.org Mon Mar 20 10:22:40 2006 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Mar 2006 10:22:40 +0100 (CET) Subject: [Python-checkins] r43171 - python/branches/release24-maint/Lib/logging/__init__.py Message-ID: <20060320092240.E45571E4010@bag.python.org> Author: vinay.sajip Date: Mon Mar 20 10:22:40 2006 New Revision: 43171 Modified: python/branches/release24-maint/Lib/logging/__init__.py Log: Catch situations where currentframe() returns None. See SF patch #1447410, this is a different implementation. Modified: python/branches/release24-maint/Lib/logging/__init__.py ============================================================================== --- python/branches/release24-maint/Lib/logging/__init__.py (original) +++ python/branches/release24-maint/Lib/logging/__init__.py Mon Mar 20 10:22:40 2006 @@ -1045,13 +1045,16 @@ file name, line number and function name. """ f = currentframe().f_back - while 1: + rv = "(unknown file)", 0, "(unknown function)" + while hasattr(f, "f_code"): co = f.f_code filename = os.path.normcase(co.co_filename) if filename == _srcfile: f = f.f_back continue - return filename, f.f_lineno, co.co_name + rv = (filename, f.f_lineno, co.co_name) + break + return rv def makeRecord(self, name, level, fn, lno, msg, args, exc_info): """ @@ -1324,12 +1327,14 @@ """ for h in _handlerList[:]: # was _handlers.keys(): #errors might occur, for example, if files are locked - #we just ignore them + #we just ignore them if raiseExceptions is not set try: h.flush() h.close() except: - pass + if raiseExceptions: + raise + #else, swallow #Let's try and shutdown automatically on application exit... try: From python-checkins at python.org Mon Mar 20 10:37:16 2006 From: python-checkins at python.org (armin.rigo) Date: Mon, 20 Mar 2006 10:37:16 +0100 (CET) Subject: [Python-checkins] r43172 - python/branches/release24-maint/Modules/_hotshot.c Message-ID: <20060320093716.C9F731E4011@bag.python.org> Author: armin.rigo Date: Mon Mar 20 10:37:16 2006 New Revision: 43172 Modified: python/branches/release24-maint/Modules/_hotshot.c Log: Backport of r41629: hotshot generated half-meaningless numbers since the introduction of C calls profiling events. Modified: python/branches/release24-maint/Modules/_hotshot.c ============================================================================== --- python/branches/release24-maint/Modules/_hotshot.c (original) +++ python/branches/release24-maint/Modules/_hotshot.c Mon Mar 20 10:37:16 2006 @@ -846,38 +846,6 @@ /* The workhorse: the profiler callback function. */ static int -profiler_callback(ProfilerObject *self, PyFrameObject *frame, int what, - PyObject *arg) -{ - int tdelta = -1; - int fileno; - - if (self->frametimings) - tdelta = get_tdelta(self); - switch (what) { - case PyTrace_CALL: - fileno = get_fileno(self, frame->f_code); - if (fileno < 0) - return -1; - if (pack_enter(self, fileno, tdelta, - frame->f_code->co_firstlineno) < 0) - return -1; - break; - case PyTrace_RETURN: - if (pack_exit(self, tdelta) < 0) - return -1; - break; - default: - /* should never get here */ - break; - } - return 0; -} - - -/* Alternate callback when we want PyTrace_LINE events */ - -static int tracer_callback(ProfilerObject *self, PyFrameObject *frame, int what, PyObject *arg) { @@ -895,7 +863,7 @@ case PyTrace_RETURN: return pack_exit(self, get_tdelta(self)); - case PyTrace_LINE: + 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)); @@ -989,7 +957,7 @@ if (self->lineevents) PyEval_SetTrace((Py_tracefunc) tracer_callback, (PyObject *)self); else - PyEval_SetProfile((Py_tracefunc) profiler_callback, (PyObject *)self); + PyEval_SetProfile((Py_tracefunc) tracer_callback, (PyObject *)self); } static void From python-checkins at python.org Mon Mar 20 10:38:59 2006 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Mar 2006 10:38:59 +0100 (CET) Subject: [Python-checkins] r43173 - python/trunk/README Message-ID: <20060320093859.E7E821E4010@bag.python.org> Author: georg.brandl Date: Mon Mar 20 10:38:58 2006 New Revision: 43173 Modified: python/trunk/README Log: Remove mention of fpectl in README. Modified: python/trunk/README ============================================================================== --- python/trunk/README (original) +++ python/trunk/README Mon Mar 20 10:38:58 2006 @@ -1057,11 +1057,6 @@ --with-tsc: Profile using the Pentium timestamping counter (TSC). ---with-fpectl: Enable building the ``fpectl'' module which can be used - to control the generation of SIGFPE and its conversion into a - Python exception. Note: this module is dangerous or useless - except in the hands of experts. - Building for multiple architectures (using the VPATH feature) ------------------------------------------------------------- From python-checkins at python.org Mon Mar 20 11:22:43 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 11:22:43 +0100 (CET) Subject: [Python-checkins] r43174 - python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/ctypes.h Message-ID: <20060320102243.8ACDD1E4010@bag.python.org> Author: thomas.heller Date: Mon Mar 20 11:22:42 2006 New Revision: 43174 Modified: python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/ctypes.h Log: Apply patch from Martin v. Loewis: Avoid function pointer casts. https://sourceforge.net/tracker/?func=detail&atid=532156&aid=1453037&group_id=71702 Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Mon Mar 20 11:22:42 2006 @@ -1878,8 +1878,9 @@ { NULL }, }; -static Py_ssize_t CData_GetBuffer(CDataObject *self, Py_ssize_t seg, void **pptr) +static Py_ssize_t CData_GetBuffer(PyObject *_self, Py_ssize_t seg, void **pptr) { + CDataObject *self = (CDataObject *)_self; if (seg != 0) { /* Hm. Must this set an exception? */ return -1; @@ -1888,7 +1889,7 @@ return self->b_size; } -static Py_ssize_t CData_GetSegcount(CDataObject *self, Py_ssize_t *lenp) +static Py_ssize_t CData_GetSegcount(PyObject *_self, Py_ssize_t *lenp) { if (lenp) *lenp = 1; @@ -1896,10 +1897,10 @@ } static PyBufferProcs CData_as_buffer = { - (readbufferproc)CData_GetBuffer, - (writebufferproc)CData_GetBuffer, - (segcountproc)CData_GetSegcount, - (charbufferproc)NULL, + CData_GetBuffer, + CData_GetBuffer, + CData_GetSegcount, + NULL, }; /* @@ -3492,8 +3493,9 @@ } static PyObject * -Array_item(CDataObject *self, int index) +Array_item(PyObject *_self, int index) { + CDataObject *self = (CDataObject *)_self; int offset, size; StgDictObject *stgdict; @@ -3516,8 +3518,9 @@ } static PyObject * -Array_slice(CDataObject *self, Py_ssize_t ilow, Py_ssize_t ihigh) +Array_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) { + CDataObject *self = (CDataObject *)_self; StgDictObject *stgdict, *itemdict; PyObject *proto; PyListObject *np; @@ -3551,15 +3554,16 @@ return NULL; for (i = 0; i < len; i++) { - PyObject *v = Array_item(self, i+ilow); + PyObject *v = Array_item(_self, i+ilow); PyList_SET_ITEM(np, i, v); } return (PyObject *)np; } static int -Array_ass_item(CDataObject *self, int index, PyObject *value) +Array_ass_item(PyObject *_self, int index, PyObject *value) { + CDataObject *self = (CDataObject *)_self; int size, offset; StgDictObject *stgdict; char *ptr; @@ -3585,8 +3589,9 @@ } static int -Array_ass_slice(CDataObject *self, int ilow, int ihigh, PyObject *value) +Array_ass_slice(PyObject *_self, int ilow, int ihigh, PyObject *value) { + CDataObject *self = (CDataObject *)_self; int i, len; if (value == NULL) { @@ -3617,7 +3622,7 @@ int result; if (item == NULL) return -1; - result = Array_ass_item(self, i+ilow, item); + result = Array_ass_item(_self, i+ilow, item); Py_DECREF(item); if (result == -1) return -1; @@ -3626,19 +3631,20 @@ } static int -Array_length(CDataObject *self) +Array_length(PyObject *_self) { + CDataObject *self = (CDataObject *)_self; return self->b_length; } static PySequenceMethods Array_as_sequence = { - (lenfunc)Array_length, /* sq_length; */ + Array_length, /* sq_length; */ 0, /* sq_concat; */ 0, /* sq_repeat; */ - (ssizeargfunc)Array_item, /* sq_item; */ - (ssizessizeargfunc)Array_slice, /* sq_slice; */ - (ssizeobjargproc)Array_ass_item, /* sq_ass_item; */ - (ssizessizeobjargproc)Array_ass_slice, /* sq_ass_slice; */ + Array_item, /* sq_item; */ + Array_slice, /* sq_slice; */ + Array_ass_item, /* sq_ass_item; */ + Array_ass_slice, /* sq_ass_slice; */ 0, /* sq_contains; */ 0, /* sq_inplace_concat; */ @@ -3990,8 +3996,9 @@ Pointer_Type */ static PyObject * -Pointer_item(CDataObject *self, int index) +Pointer_item(PyObject *_self, int index) { + CDataObject *self = (CDataObject *)_self; int size, offset; StgDictObject *stgdict, *itemdict; PyObject *proto; @@ -4017,8 +4024,9 @@ } static int -Pointer_ass_item(CDataObject *self, int index, PyObject *value) +Pointer_ass_item(PyObject *_self, int index, PyObject *value) { + CDataObject *self = (CDataObject *)_self; int size; StgDictObject *stgdict; @@ -4159,8 +4167,9 @@ } static PyObject * -Pointer_slice(CDataObject *self, Py_ssize_t ilow, Py_ssize_t ihigh) +Pointer_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh) { + CDataObject *self = (CDataObject *)_self; PyListObject *np; StgDictObject *stgdict, *itemdict; PyObject *proto; @@ -4190,7 +4199,7 @@ return NULL; for (i = 0; i < len; i++) { - PyObject *v = Pointer_item(self, i+ilow); + PyObject *v = Pointer_item(_self, i+ilow); PyList_SET_ITEM(np, i, v); } return (PyObject *)np; @@ -4200,9 +4209,9 @@ 0, /* inquiry sq_length; */ 0, /* binaryfunc sq_concat; */ 0, /* intargfunc sq_repeat; */ - (ssizeargfunc)Pointer_item, /* intargfunc sq_item; */ - (ssizessizeargfunc)Pointer_slice, /* intintargfunc sq_slice; */ - (ssizeobjargproc)Pointer_ass_item, /* intobjargproc sq_ass_item; */ + Pointer_item, /* intargfunc sq_item; */ + Pointer_slice, /* intintargfunc sq_slice; */ + Pointer_ass_item, /* intobjargproc sq_ass_item; */ 0, /* intintobjargproc sq_ass_slice; */ 0, /* objobjproc sq_contains; */ /* Added in release 2.0 */ Modified: python/trunk/Modules/_ctypes/ctypes.h ============================================================================== --- python/trunk/Modules/_ctypes/ctypes.h (original) +++ python/trunk/Modules/_ctypes/ctypes.h Mon Mar 20 11:22:42 2006 @@ -2,15 +2,6 @@ #if (PY_VERSION_HEX < 0x02050000) typedef int Py_ssize_t; -#define lenfunc inquiry -#define readbufferproc getreadbufferproc -#define writebufferproc getwritebufferproc -#define segcountproc getsegcountproc -#define charbufferproc getcharbufferproc -#define ssizeargfunc intargfunc -#define ssizessizeargfunc intintargfunc -#define ssizeobjargproc intobjargproc -#define ssizessizeobjargproc intintobjargproc #endif #ifndef MS_WIN32 From python-checkins at python.org Mon Mar 20 15:22:05 2006 From: python-checkins at python.org (thomas.heller) Date: Mon, 20 Mar 2006 15:22:05 +0100 (CET) Subject: [Python-checkins] r43175 - python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callbacks.c Message-ID: <20060320142205.E06791E4010@bag.python.org> Author: thomas.heller Date: Mon Mar 20 15:22:05 2006 New Revision: 43175 Modified: python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callbacks.c Log: Avoid a potential double-free bug. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Mon Mar 20 15:22:05 2006 @@ -3191,8 +3191,10 @@ Py_CLEAR(self->converters); Py_CLEAR(self->paramflags); - if (self->thunk) + if (self->thunk) { FreeCallback(self->thunk); + PyMem_Free(self->thunk); + } self->thunk = NULL; return CData_clear((CDataObject *)self); Modified: python/trunk/Modules/_ctypes/callbacks.c ============================================================================== --- python/trunk/Modules/_ctypes/callbacks.c (original) +++ python/trunk/Modules/_ctypes/callbacks.c Mon Mar 20 15:22:05 2006 @@ -292,7 +292,6 @@ void FreeCallback(THUNK thunk) { FreeClosure(((ffi_info *)thunk)->pcl); - PyMem_Free(thunk); } THUNK AllocFunctionCallback(PyObject *callable, From python-checkins at python.org Mon Mar 20 19:36:00 2006 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 20 Mar 2006 19:36:00 +0100 (CET) Subject: [Python-checkins] r43176 - python/trunk/Doc/api/concrete.tex Message-ID: <20060320183600.D89A31E4006@bag.python.org> Author: raymond.hettinger Date: Mon Mar 20 19:35:55 2006 New Revision: 43176 Modified: python/trunk/Doc/api/concrete.tex Log: Show an example of calling a named set method. Modified: python/trunk/Doc/api/concrete.tex ============================================================================== --- python/trunk/Doc/api/concrete.tex (original) +++ python/trunk/Doc/api/concrete.tex Mon Mar 20 19:35:55 2006 @@ -3025,8 +3025,8 @@ \cfunction{PyNumber_Or()}, \cfunction{PyNumber_Xor()}, \cfunction{PyNumber_InPlaceAdd()}, \cfunction{PyNumber_InPlaceSubtract()}, \cfunction{PyNumber_InPlaceOr()}, and \cfunction{PyNumber_InPlaceXor()}). -Note, \cfunction{PyNumber_InPlaceSubtract()} is also useful clearing -clearing a set (\code{s-=s}). + +For example, to clear a set, write: \code{PyObject_CallMethod(s, "clear", NULL)} \begin{ctypedesc}{PySetObject} This subtype of \ctype{PyObject} is used to hold the internal data for From python-checkins at python.org Mon Mar 20 23:28:40 2006 From: python-checkins at python.org (phillip.eby) Date: Mon, 20 Mar 2006 23:28:40 +0100 (CET) Subject: [Python-checkins] r43177 - in sandbox/trunk/setuptools: EasyInstall.txt setup.py setuptools.egg-info/entry_points.txt Message-ID: <20060320222840.0C7391E4009@bag.python.org> Author: phillip.eby Date: Mon Mar 20 23:28:38 2006 New Revision: 43177 Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setup.py sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt Log: Added ``easy_install-N.N`` script(s) for convenience when using multiple Python versions. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Mon Mar 20 23:28:38 2006 @@ -322,6 +322,16 @@ ----------------- +Multiple Python Versions +~~~~~~~~~~~~~~~~~~~~~~~~ + +As of version 0.6a11, EasyInstall installs itself under two names: +``easy_install`` and ``easy_install-N.N``, where ``N.N`` is the Python version +used to install it. Thus, if you install EasyInstall for both Python 2.3 and +2.4, you can use the ``easy_install-2.3`` or ``easy_install-2.4`` scripts to +install packages for Python 2.3 or 2.4, respectively. + + Restricting Downloads with ``--allow-hosts`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1079,6 +1089,9 @@ time out or be missing a file. 0.6a11 + * Added ``easy_install-N.N`` script(s) for convenience when using multiple + Python versions. + * Added automatic handling of installation conflicts. Eggs are now shifted to the front of sys.path, in an order consistent with where they came from, making EasyInstall seamlessly co-operate with system package managers. Modified: sandbox/trunk/setuptools/setup.py ============================================================================== --- sandbox/trunk/setuptools/setup.py (original) +++ sandbox/trunk/setuptools/setup.py Mon Mar 20 23:28:38 2006 @@ -73,13 +73,13 @@ "depends.txt = setuptools.command.egg_info:warn_depends_obsolete", ], "console_scripts": - ["easy_install = setuptools.command.easy_install:main"], + ["easy_install = setuptools.command.easy_install:main", + "easy_install-%s = setuptools.command.easy_install:main" + % sys.version[:3] + ], }, - - - classifiers = [f.strip() for f in """ Development Status :: 3 - Alpha Intended Audience :: Developers Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt ============================================================================== --- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt (original) +++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt Mon Mar 20 23:28:38 2006 @@ -22,6 +22,7 @@ [console_scripts] easy_install = setuptools.command.easy_install:main +easy_install-2.3 = setuptools.command.easy_install:main [distutils.commands] bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm From guido at python.org Mon Mar 20 23:54:23 2006 From: guido at python.org (Guido van Rossum) Date: Mon, 20 Mar 2006 14:54:23 -0800 Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c In-Reply-To: <20060317191736.A13151E4006@bag.python.org> References: <20060317191736.A13151E4006@bag.python.org> Message-ID: Why are these accessor methods? A more Pythonic API would make them read-only attributes, like the various attributes of file objects. --Guido On 3/17/06, georg.brandl wrote: > Author: georg.brandl > Date: Fri Mar 17 20:17:34 2006 > New Revision: 43126 > > Modified: > python/trunk/Doc/lib/libsocket.tex > python/trunk/Lib/socket.py > python/trunk/Lib/test/test_socket.py > python/trunk/Misc/NEWS > python/trunk/Modules/socketmodule.c > Log: > RFE #567972: Socket objects' family, type and proto properties are > now exposed via new get...() methods. > > > Modified: python/trunk/Doc/lib/libsocket.tex > ============================================================================== > --- python/trunk/Doc/lib/libsocket.tex (original) > +++ python/trunk/Doc/lib/libsocket.tex Fri Mar 17 20:17:34 2006 > @@ -626,7 +626,7 @@ > \end{methoddesc} > > \begin{methoddesc}[socket]{gettimeout}{} > -Returns the timeout in floating seconds associated with socket > +Return the timeout in floating seconds associated with socket > operations, or \code{None} if no timeout is set. This reflects > the last call to \method{setblocking()} or \method{settimeout()}. > \versionadded{2.3} > @@ -654,6 +654,21 @@ > setting, and in general it is recommended to call > \method{settimeout()} before calling \method{connect()}. > > +\begin{methoddesc}[socket]{getfamily}{} > +Return the socket family, as given to the \class{socket} constructor. > +\versionadded{2.5} > +\end{methoddesc} > + > +\begin{methoddesc}[socket]{gettype}{} > +Return the socket type, as given to the \class{socket} constructor. > +\versionadded{2.5} > +\end{methoddesc} > + > +\begin{methoddesc}[socket]{getproto}{} > +Return the socket protocol, as given to the \class{socket} constructor. > +\versionadded{2.5} > +\end{methoddesc} > + > \begin{methoddesc}[socket]{setsockopt}{level, optname, value} > Set the value of the given socket option (see the \UNIX{} manual page > \manpage{setsockopt}{2}). The needed symbolic constants are defined in > > Modified: python/trunk/Lib/socket.py > ============================================================================== > --- python/trunk/Lib/socket.py (original) > +++ python/trunk/Lib/socket.py Fri Mar 17 20:17:34 2006 > @@ -183,6 +183,24 @@ > and bufsize arguments are as for the built-in open() function.""" > return _fileobject(self._sock, mode, bufsize) > > + def getfamily(self): > + """getfamily() -> socket family > + > + Return the socket family.""" > + return self._sock.family > + > + def gettype(self): > + """gettype() -> socket type > + > + Return the socket type.""" > + return self._sock.type > + > + def getproto(self): > + """getproto() -> socket protocol > + > + Return the socket protocol.""" > + return self._sock.proto > + > _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" > "%s.__doc__ = _realsocket.%s.__doc__\n") > for _m in _socketmethods: > > Modified: python/trunk/Lib/test/test_socket.py > ============================================================================== > --- python/trunk/Lib/test/test_socket.py (original) > +++ python/trunk/Lib/test/test_socket.py Fri Mar 17 20:17:34 2006 > @@ -469,6 +469,14 @@ > sock.close() > self.assertRaises(socket.error, sock.send, "spam") > > + def testNewGetMethods(self): > + # testing getfamily(), gettype() and getprotocol() > + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > + self.assertEqual(sock.getfamily(), socket.AF_INET) > + self.assertEqual(sock.gettype(), socket.SOCK_STREAM) > + self.assertEqual(sock.getproto(), 0) > + sock.close() > + > class BasicTCPTest(SocketConnectedTest): > > def __init__(self, methodName='runTest'): > > Modified: python/trunk/Misc/NEWS > ============================================================================== > --- python/trunk/Misc/NEWS (original) > +++ python/trunk/Misc/NEWS Fri Mar 17 20:17:34 2006 > @@ -291,6 +291,9 @@ > Extension Modules > ----------------- > > +- RFE #567972: Socket objects' family, type and proto properties are > + now exposed via new get...() methods. > + > - Everything under lib-old was removed. This includes the following modules: > Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, > lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, > > Modified: python/trunk/Modules/socketmodule.c > ============================================================================== > --- python/trunk/Modules/socketmodule.c (original) > +++ python/trunk/Modules/socketmodule.c Fri Mar 17 20:17:34 2006 > @@ -62,6 +62,7 @@ > */ > > #include "Python.h" > +#include "structmember.h" > > #undef MAX > #define MAX(x, y) ((x) < (y) ? (y) : (x)) > @@ -2502,6 +2503,14 @@ > {NULL, NULL} /* sentinel */ > }; > > +/* SockObject members */ > +static PyMemberDef sock_memberlist[] = { > + {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"}, > + {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"}, > + {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"}, > + {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"}, > + {0}, > +}; > > /* Deallocate a socket object in response to the last Py_DECREF(). > First close the file description. */ > @@ -2625,7 +2634,7 @@ > 0, /* tp_iter */ > 0, /* tp_iternext */ > sock_methods, /* tp_methods */ > - 0, /* tp_members */ > + sock_memberlist, /* tp_members */ > 0, /* tp_getset */ > 0, /* tp_base */ > 0, /* tp_dict */ > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From g.brandl at gmx.net Mon Mar 20 23:57:58 2006 From: g.brandl at gmx.net (Georg Brandl) Date: Mon, 20 Mar 2006 23:57:58 +0100 Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c In-Reply-To: References: <20060317191736.A13151E4006@bag.python.org> Message-ID: Guido van Rossum wrote: > Why are these accessor methods? A more Pythonic API would make them > read-only attributes, like the various attributes of file objects. I had them as properties in a first version of the patch, but MvL said """ I also wonder what style of API should be used. All other state access goes through get-methods(), which all start with get except for fileno(). Adding properties would introduce another API style, so -1. """ Georg From python-checkins at python.org Tue Mar 21 00:06:24 2006 From: python-checkins at python.org (phillip.eby) Date: Tue, 21 Mar 2006 00:06:24 +0100 (CET) Subject: [Python-checkins] r43178 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools/command/easy_install.py Message-ID: <20060320230624.208371E4009@bag.python.org> Author: phillip.eby Date: Tue Mar 21 00:06:22 2006 New Revision: 43178 Modified: sandbox/trunk/setuptools/EasyInstall.txt sandbox/trunk/setuptools/setuptools/command/easy_install.py Log: Use relative paths in ``.pth`` files when eggs are being installed to the same directory as the ``.pth`` file. This maximizes portability of the target directory when building applications that contain eggs. Modified: sandbox/trunk/setuptools/EasyInstall.txt ============================================================================== --- sandbox/trunk/setuptools/EasyInstall.txt (original) +++ sandbox/trunk/setuptools/EasyInstall.txt Tue Mar 21 00:06:22 2006 @@ -1089,6 +1089,10 @@ time out or be missing a file. 0.6a11 + * Use relative paths in ``.pth`` files when eggs are being installed to the + same directory as the ``.pth`` file. This maximizes portability of the + target directory when building applications that contain eggs. + * Added ``easy_install-N.N`` script(s) for convenience when using multiple Python versions. Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original) +++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Tue Mar 21 00:06:22 2006 @@ -974,7 +974,7 @@ filename = os.path.join(self.install_dir,'setuptools.pth') if os.path.islink(filename): os.unlink(filename) f = open(filename, 'wt') - f.write(dist.location+'\n') + f.write(self.pth_file.make_relative(dist.location)+'\n') f.close() def unpack_progress(self, src, dst): @@ -1316,8 +1316,9 @@ dirty = False def __init__(self, filename): - self.filename = filename; self._load() - Environment.__init__(self, [], None, None) + self.filename = filename + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load(); Environment.__init__(self, [], None, None) for path in yield_lines(self.paths): map(self.add, find_distributions(path, True)) @@ -1336,7 +1337,9 @@ continue # skip non-existent paths, in case somebody deleted a package # manually, and duplicate paths as well - path = self.paths[-1] = normalize_path(path) + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir,path) + ) if not os.path.exists(path) or path in seen: self.paths.pop() # skip it self.dirty = True # we cleaned up, so we're dirty now :) @@ -1345,18 +1348,15 @@ if self.paths and not saw_import: self.dirty = True # ensure anything we touch has import wrappers - while self.paths and not self.paths[-1].strip(): self.paths.pop() - - def save(self): """Write changed .pth file back to disk""" if not self.dirty: return - data = '\n'.join(self.paths) + data = '\n'.join(map(self.make_relative,self.paths)) if data: log.debug("Saving %s", self.filename) data = ( @@ -1392,6 +1392,12 @@ Environment.remove(self,dist) + def make_relative(self,path): + if normalize_path(os.path.dirname(path))==self.basedir: + return os.path.basename(path) + return path + + def get_script_header(script_text, executable=sys_executable): """Create a #! line, getting options (if any) from script_text""" from distutils.command.build_scripts import first_line_re @@ -1427,12 +1433,6 @@ - - - - - - def get_script_args(dist, executable=sys_executable): """Yield write_script() argument tuples for a distribution's entrypoints""" spec = str(dist.as_requirement()) From martin at v.loewis.de Tue Mar 21 00:12:25 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Tue, 21 Mar 2006 00:12:25 +0100 Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c In-Reply-To: References: <20060317191736.A13151E4006@bag.python.org> Message-ID: <441F36D9.80708@v.loewis.de> Guido van Rossum wrote: > Why are these accessor methods? A more Pythonic API would make them > read-only attributes, like the various attributes of file objects. This goes back to a patch comment from me, in python.org/sf/567972: """ I also wonder what style of API should be used. All other state access goes through get-methods(), which all start with get except for fileno(). Adding properties would introduce another API style, so -1. """ Not sure what I was thinking there - although fileno() *is* a function. Looking into the library, I see many accessor functions starting with either get_ or get; however, I don't recall why that could have been relevant for socket objects. If you think that should be changed to attributes, we should do that. Regards, Martin From guido at python.org Tue Mar 21 01:17:00 2006 From: guido at python.org (Guido van Rossum) Date: Mon, 20 Mar 2006 16:17:00 -0800 Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c In-Reply-To: <441F36D9.80708@v.loewis.de> References: <20060317191736.A13151E4006@bag.python.org> <441F36D9.80708@v.loewis.de> Message-ID: On 3/20/06, "Martin v. L?wis" wrote: > Guido van Rossum wrote: > > Why are these accessor methods? A more Pythonic API would make them > > read-only attributes, like the various attributes of file objects. > > This goes back to a patch comment from me, in python.org/sf/567972: > > """ > I also wonder what style of API should be used. All other > state access goes through get-methods(), which all start > with get except for fileno(). Adding properties would > introduce another API style, so -1. > """ > > Not sure what I was thinking there - although fileno() *is* > a function. This is because fileno() is a function in C stdio. > Looking into the library, I see many accessor > functions starting with either get_ or get; however, I don't > recall why that could have been relevant for socket objects. > > If you think that should be changed to attributes, we should > do that. Accessor functions are typical for APIs translated too literally from Java. (threading.py being an example :-( ) I'd like to change this as long as we're doing greenfield API design. -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-checkins at python.org Tue Mar 21 01:57:14 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 01:57:14 +0100 (CET) Subject: [Python-checkins] r43179 - peps/trunk/pep2pyramid.py Message-ID: <20060321005714.2EEAB1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 01:57:13 2006 New Revision: 43179 Modified: peps/trunk/pep2pyramid.py Log: Remove svn integration. Generate to the current directory. Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Tue Mar 21 01:57:13 2006 @@ -34,7 +34,7 @@ The optional arguments ``peps`` are either pep numbers or .txt files. """ -destDirBase = '/home/jafo/cvs/beta.python.org/build/data/doc/peps/' +destDirBase = '.' import sys import os @@ -418,11 +418,11 @@ shutil.copyfile(outpath, os.path.join(destDir, '..', 'body.html')) # add to SVN if necessary - if needSvn: - ret = os.system('svn add "%s"' % destDir) - if ret != 0 and ret != None: - print 'SVN returned "%s", expecting 0 or None' % repr(ret) - sys.exit(1) + #if needSvn: + # ret = os.system('svn add "%s"' % destDir) + # if ret != 0 and ret != None: + # print 'SVN returned "%s", expecting 0 or None' % repr(ret) + # sys.exit(1) return outpath From python-checkins at python.org Tue Mar 21 04:04:56 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 04:04:56 +0100 (CET) Subject: [Python-checkins] r43180 - peps/trunk/pep2pyramid.py Message-ID: <20060321030456.00CED1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 04:04:55 2006 New Revision: 43180 Modified: peps/trunk/pep2pyramid.py Log: Compile PEPs into doc directory. Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Tue Mar 21 04:04:55 2006 @@ -34,7 +34,7 @@ The optional arguments ``peps`` are either pep numbers or .txt files. """ -destDirBase = '.' +destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/doc/peps' import sys import os From python-checkins at python.org Tue Mar 21 04:57:30 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 04:57:30 +0100 (CET) Subject: [Python-checkins] r43180 - peps/trunk/pep2pyramid.py Message-ID: <20060321035730.DDF951E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 04:04:55 2006 New Revision: 43180 Modified: peps/trunk/pep2pyramid.py Log: Compile PEPs into doc directory. Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Tue Mar 21 04:04:55 2006 @@ -34,7 +34,7 @@ The optional arguments ``peps`` are either pep numbers or .txt files. """ -destDirBase = '.' +destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/doc/peps' import sys import os From python-checkins at python.org Tue Mar 21 04:58:46 2006 From: python-checkins at python.org (tim.peters) Date: Tue, 21 Mar 2006 04:58:46 +0100 (CET) Subject: [Python-checkins] r43181 - in python/trunk: Lib/test/test_capi.py Modules/_testcapimodule.c Message-ID: <20060321035846.43C601E402E@bag.python.org> Author: tim.peters Date: Tue Mar 21 04:58:41 2006 New Revision: 43181 Modified: python/trunk/Lib/test/test_capi.py python/trunk/Modules/_testcapimodule.c Log: Try to repair at least one segfault on the Mac buildbot, as diagnosed by Nick Coghlan. test_capi.py: A test module should never spawn a thread as a side effect of being imported. Because this one did, the segfault one of its thread tests caused didn't occur until a few tests after test_regrtest.py thought test_capi was finished. Repair that. Also join() the thread spawned at the end, so that test_capi is truly finished when regrtest reports that it's done. _testcapimodule.c test_thread_state(): this spawns a couple of non-threading.py threads, passing them a PyObject* argument, but did nothing to ensure that those threads finished before returning. As a result, the PyObject* _could_ (although this was unlikely) get decref'ed out of existence before the threads got around to using it. Added explicit synchronization (via a Python mutex) so that test_thread_state can reliably wait for its spawned threads to finish. Modified: python/trunk/Lib/test/test_capi.py ============================================================================== --- python/trunk/Lib/test/test_capi.py (original) +++ python/trunk/Lib/test/test_capi.py Tue Mar 21 04:58:41 2006 @@ -5,44 +5,51 @@ from test import test_support import _testcapi -for name in dir(_testcapi): - if name.startswith('test_'): - test = getattr(_testcapi, name) +def test_main(): + + for name in dir(_testcapi): + if name.startswith('test_'): + test = getattr(_testcapi, name) + if test_support.verbose: + print "internal", name + try: + test() + except _testcapi.error: + raise test_support.TestFailed, sys.exc_info()[1] + + # some extra thread-state tests driven via _testcapi + def TestThreadState(): + import thread + import time + if test_support.verbose: - print "internal", name - try: - test() - except _testcapi.error: - raise test_support.TestFailed, sys.exc_info()[1] - -# some extra thread-state tests driven via _testcapi -def TestThreadState(): - import thread - import time - - if test_support.verbose: - print "auto-thread-state" - - idents = [] - - def callback(): - idents.append(thread.get_ident()) - - _testcapi._test_thread_state(callback) - time.sleep(1) - # Check our main thread is in the list exactly 3 times. - if idents.count(thread.get_ident()) != 3: - raise test_support.TestFailed, \ - "Couldn't find main thread correctly in the list" - -try: - _testcapi._test_thread_state - have_thread_state = True -except AttributeError: - have_thread_state = False - -if have_thread_state: - TestThreadState() - import threading - t=threading.Thread(target=TestThreadState) - t.start() + print "auto-thread-state" + + idents = [] + + def callback(): + idents.append(thread.get_ident()) + + _testcapi._test_thread_state(callback) + a = b = callback + time.sleep(1) + # Check our main thread is in the list exactly 3 times. + if idents.count(thread.get_ident()) != 3: + raise test_support.TestFailed, \ + "Couldn't find main thread correctly in the list" + + try: + _testcapi._test_thread_state + have_thread_state = True + except AttributeError: + have_thread_state = False + + if have_thread_state: + TestThreadState() + import threading + t=threading.Thread(target=TestThreadState) + t.start() + t.join() + +if __name__ == "__main__": + test_main() Modified: python/trunk/Modules/_testcapimodule.c ============================================================================== --- python/trunk/Modules/_testcapimodule.c (original) +++ python/trunk/Modules/_testcapimodule.c Tue Mar 21 04:58:41 2006 @@ -10,7 +10,6 @@ #ifdef WITH_THREAD #include "pythread.h" #endif /* WITH_THREAD */ - static PyObject *TestError; /* set to exception object in init */ /* Raise TestError with test_name + ": " + msg, and return NULL. */ @@ -482,7 +481,7 @@ PyObject *codec_incrementalencoder(PyObject *self, PyObject *args) { const char *encoding, *errors = NULL; - if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder", + if (!PyArg_ParseTuple(args, "s|s:test_incrementalencoder", &encoding, &errors)) return NULL; return PyCodec_IncrementalEncoder(encoding, errors); @@ -492,7 +491,7 @@ PyObject *codec_incrementaldecoder(PyObject *self, PyObject *args) { const char *encoding, *errors = NULL; - if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder", + if (!PyArg_ParseTuple(args, "s|s:test_incrementaldecoder", &encoding, &errors)) return NULL; return PyCodec_IncrementalDecoder(encoding, errors); @@ -583,7 +582,17 @@ #ifdef WITH_THREAD -void _make_call(void *callable) +/* test_thread_state spawns a thread of its own, and that thread releases + * `thread_done` when it's finished. The driver code has to know when the + * thread finishes, because the thread uses a PyObject (the callable) that + * may go away when the driver finishes. The former lack of this explicit + * synchronization caused rare segfaults, so rare that they were seen only + * on a Mac buildbot (although they were possible on any box). + */ +static PyThread_type_lock thread_done = NULL; + +static void +_make_call(void *callable) { PyObject *rc; PyGILState_STATE s = PyGILState_Ensure(); @@ -592,32 +601,53 @@ PyGILState_Release(s); } +/* Same thing, but releases `thread_done` when it returns. This variant + * should be called only from threads spawned by test_thread_state(). + */ +static void +_make_call_from_thread(void *callable) +{ + _make_call(callable); + PyThread_release_lock(thread_done); +} + static PyObject * test_thread_state(PyObject *self, PyObject *args) { PyObject *fn; + if (!PyArg_ParseTuple(args, "O:test_thread_state", &fn)) return NULL; - /* Ensure Python is setup for threading */ + + /* Ensure Python is set up for threading */ PyEval_InitThreads(); - /* Start a new thread for our callback. */ - PyThread_start_new_thread( _make_call, fn); + thread_done = PyThread_allocate_lock(); + if (thread_done == NULL) + return PyErr_NoMemory(); + PyThread_acquire_lock(thread_done, 1); + + /* Start a new thread with our callback. */ + PyThread_start_new_thread(_make_call_from_thread, fn); /* Make the callback with the thread lock held by this thread */ _make_call(fn); /* Do it all again, but this time with the thread-lock released */ Py_BEGIN_ALLOW_THREADS _make_call(fn); + PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */ Py_END_ALLOW_THREADS + /* And once more with and without a thread - XXX - should use a lock and work out exactly what we are trying - to test + XXX - should use a lock and work out exactly what we are trying + to test */ Py_BEGIN_ALLOW_THREADS - PyThread_start_new_thread( _make_call, fn); + PyThread_start_new_thread(_make_call_from_thread, fn); _make_call(fn); + PyThread_acquire_lock(thread_done, 1); /* wait for thread to finish */ Py_END_ALLOW_THREADS - Py_INCREF(Py_None); - return Py_None; + + PyThread_free_lock(thread_done); + Py_RETURN_NONE; } #endif From python-checkins at python.org Tue Mar 21 09:48:05 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Mar 2006 09:48:05 +0100 (CET) Subject: [Python-checkins] r43182 - python/trunk/Doc/lib/libfuncs.tex Message-ID: <20060321084805.2CE771E4009@bag.python.org> Author: georg.brandl Date: Tue Mar 21 09:48:04 2006 New Revision: 43182 Modified: python/trunk/Doc/lib/libfuncs.tex Log: Add a note about pow(x,y) equalling x**y (the "**" operator was used unmotivated in the pow() docs) Modified: python/trunk/Doc/lib/libfuncs.tex ============================================================================== --- python/trunk/Doc/lib/libfuncs.tex (original) +++ python/trunk/Doc/lib/libfuncs.tex Tue Mar 21 09:48:04 2006 @@ -735,8 +735,11 @@ \begin{funcdesc}{pow}{x, y\optional{, z}} Return \var{x} to the power \var{y}; if \var{z} is present, return \var{x} to the power \var{y}, modulo \var{z} (computed more - efficiently than \code{pow(\var{x}, \var{y}) \%\ \var{z}}). The - arguments must have numeric types. With mixed operand types, the + efficiently than \code{pow(\var{x}, \var{y}) \%\ \var{z}}). + The two-argument form \code{pow(\var{x}, \var{y})} is equivalent to using + the power operator: \code{\var{x}**\var{y}}. + + The arguments must have numeric types. With mixed operand types, the coercion rules for binary arithmetic operators apply. For int and long int operands, the result has the same type as the operands (after coercion) unless the second argument is negative; in that From python-checkins at python.org Tue Mar 21 13:08:39 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 13:08:39 +0100 (CET) Subject: [Python-checkins] r43184 - in python/trunk: PCbuild/_ssl.mak PCbuild/readme.txt Tools/buildbot/external.bat Message-ID: <20060321120839.AD69A1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 13:08:39 2006 New Revision: 43184 Modified: python/trunk/PCbuild/_ssl.mak python/trunk/PCbuild/readme.txt python/trunk/Tools/buildbot/external.bat Log: Update to OpenSSL 0.9.8a Modified: python/trunk/PCbuild/_ssl.mak ============================================================================== --- python/trunk/PCbuild/_ssl.mak (original) +++ python/trunk/PCbuild/_ssl.mak Tue Mar 21 13:08:39 2006 @@ -12,7 +12,7 @@ !ENDIF INCLUDES=-I ../Include -I ../PC -I $(SSL_DIR)/inc32 -LIBS=gdi32.lib wsock32.lib /libpath:$(SSL_LIB_DIR) libeay32.lib ssleay32.lib +LIBS=gdi32.lib wsock32.lib user32.lib advapi32.lib /libpath:$(SSL_LIB_DIR) libeay32.lib ssleay32.lib SOURCE=../Modules/_ssl.c $(SSL_LIB_DIR)/libeay32.lib $(SSL_LIB_DIR)/ssleay32.lib Modified: python/trunk/PCbuild/readme.txt ============================================================================== --- python/trunk/PCbuild/readme.txt (original) +++ python/trunk/PCbuild/readme.txt Tue Mar 21 13:08:39 2006 @@ -227,19 +227,11 @@ _ssl Python wrapper for the secure sockets library. - Get the latest source code for OpenSSL from - http://www.openssl.org + Get the source code through - You (probably) don't want the "engine" code. For example, get - openssl-0.9.7d.tar.gz - not - openssl-engine-0.9.7d.tar.gz - - (see #1233049 for using 0.9.8). - Unpack into the "dist" directory, retaining the folder name from - the archive - for example, the latest stable OpenSSL will install as - dist/openssl-0.9.7d + svn export http://svn.python.org/projects/external/openssl-0.9.8a + Alternatively, get the latest version from http://www.openssl.org. You can (theoretically) use any version of OpenSSL you like - the build process will automatically select the latest version. Modified: python/trunk/Tools/buildbot/external.bat ============================================================================== --- python/trunk/Tools/buildbot/external.bat (original) +++ python/trunk/Tools/buildbot/external.bat Tue Mar 21 13:08:39 2006 @@ -12,3 +12,6 @@ if not exist db-4.4.20\build_win32\debug\libdb44sd.lib ( devenv db-4.4.20\build_win32\Berkeley_DB.sln /build Debug /project db_static ) + + at rem OpenSSL +if not exist openssl-0.9.8a svn export http://svn.python.org/projects/external/openssl-0.9.8a From g.brandl at gmx.net Tue Mar 21 13:23:03 2006 From: g.brandl at gmx.net (Georg Brandl) Date: Tue, 21 Mar 2006 13:23:03 +0100 Subject: [Python-checkins] r43126 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Misc/NEWS Modules/socketmodule.c In-Reply-To: References: <20060317191736.A13151E4006@bag.python.org> <441F36D9.80708@v.loewis.de> Message-ID: Guido van Rossum wrote: >> Looking into the library, I see many accessor >> functions starting with either get_ or get; however, I don't >> recall why that could have been relevant for socket objects. >> >> If you think that should be changed to attributes, we should >> do that. > > Accessor functions are typical for APIs translated too literally from > Java. (threading.py being an example :-( ) > > I'd like to change this as long as we're doing greenfield API design. Does that mean to change it to attributes? (since I'm no professional BDFL channeler I could have misread your sentence ;) Georg From python-checkins at python.org Tue Mar 21 14:18:52 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 14:18:52 +0100 (CET) Subject: [Python-checkins] r43188 - external/tix-8.4.0/win/makefile.vc Message-ID: <20060321131852.5DE2E1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 14:18:51 2006 New Revision: 43188 Modified: external/tix-8.4.0/win/makefile.vc Log: Fix bugs in the build process: use rd/md for directories, do link with the CRT, install tix84.dll into the bin directory. Modified: external/tix-8.4.0/win/makefile.vc ============================================================================== --- external/tix-8.4.0/win/makefile.vc (original) +++ external/tix-8.4.0/win/makefile.vc Tue Mar 21 14:18:51 2006 @@ -117,8 +117,8 @@ link32 = "$(TOOLS32)\bin\link.exe" include32 = -I"$(TOOLS32)\include" -RMDIR = $(TCL_DIR)\win\rmd.bat -MKDIR = $(TCL_DIR)\win\mkd.bat +RMDIR = rd +MKDIR = md RM = del # @@ -132,17 +132,16 @@ !ENDIF # declarations common to all linker options -lcommon = /NODEFAULTLIB /RELEASE /NOLOGO +lcommon = /RELEASE /NOLOGO # declarations for use on Intel i386, i486, and Pentium systems !IF "$(MACHINE)" == "IX86" -DLLENTRY = @12 lflags = $(lcommon) /MACHINE:$(MACHINE) !ELSE lflags = $(lcommon) /MACHINE:$(MACHINE) !ENDIF -dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll +dlllflags = $(lflags) -dll baselibs = kernel32.lib $(optlibs) advapi32.lib user32.lib winlibs = $(baselibs) gdi32.lib comdlg32.lib @@ -416,11 +415,12 @@ LIB_INSTALL_DIR = $(INSTALL_DIR)\lib\tix$(DOTVERSION) INCLUDE_INSTALL_DIR = $(INSTALL_DIR)\include +BIN_INSTALL_DIR = $(INSTALL_DIR)\bin install: all -@$(MKDIR) "$(LIB_INSTALL_DIR)" @echo installing $(TIX_DLL) - @copy "$(TIX_DLL)" "$(LIB_INSTALL_DIR)" + @copy "$(TIX_DLL)" "$(BIN_INSTALL_DIR)" @echo installing $(TIX_LIB) @copy "$(TIX_LIB)" "$(LIB_INSTALL_DIR)" @echo installing library files From python-checkins at python.org Tue Mar 21 14:19:21 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 14:19:21 +0100 (CET) Subject: [Python-checkins] r43189 - external/tix-8.4.0/win/make_pkgIndex.tcl Message-ID: <20060321131921.27DDC1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 14:19:20 2006 New Revision: 43189 Modified: external/tix-8.4.0/win/make_pkgIndex.tcl Log: Add missing backslash Modified: external/tix-8.4.0/win/make_pkgIndex.tcl ============================================================================== --- external/tix-8.4.0/win/make_pkgIndex.tcl (original) +++ external/tix-8.4.0/win/make_pkgIndex.tcl Tue Mar 21 14:19:20 2006 @@ -22,6 +22,6 @@ puts -nonewline $fd "[file tail [lindex $argv 1]]\]\" Tix\]" puts $fd "" puts -nonewline $fd "package ifneeded wm_default 1.0 " -puts -nonewline $fd "\[list source \[file join $dir pref WmDefault.tcl\]\]" +puts -nonewline $fd "\[list source \[file join \$dir pref WmDefault.tcl\]\]" puts $fd "" close $fd From python-checkins at python.org Tue Mar 21 14:19:57 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 14:19:57 +0100 (CET) Subject: [Python-checkins] r43190 - external/tix-8.4.0/win/python.mak Message-ID: <20060321131957.99A661E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 14:19:57 2006 New Revision: 43190 Added: external/tix-8.4.0/win/python.mak (contents, props changed) Log: Add Python-specific makefile Added: external/tix-8.4.0/win/python.mak ============================================================================== --- (empty file) +++ external/tix-8.4.0/win/python.mak Tue Mar 21 14:19:57 2006 @@ -0,0 +1,10 @@ +TCL_MAJOR=8 +TCL_MINOR=4 +TCL_PATCH=12 +INSTALL_DIR=..\..\tcltk +TOOLS32=$(MSVCDIR) +TOOLS32_rc=$(MSVCDIR) +MKDIR=md +RMDIR=rd + +!include "makefile.vc" From python-checkins at python.org Tue Mar 21 14:20:29 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 14:20:29 +0100 (CET) Subject: [Python-checkins] r43191 - in python/trunk: PC/tix.diff PCbuild/readme.txt Tools/buildbot/external.bat Message-ID: <20060321132029.EDAFA1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 14:20:29 2006 New Revision: 43191 Removed: python/trunk/PC/tix.diff Modified: python/trunk/PCbuild/readme.txt python/trunk/Tools/buildbot/external.bat Log: Update to Tk 8.4.12 and Tix 8.4.0 Deleted: /python/trunk/PC/tix.diff ============================================================================== --- /python/trunk/PC/tix.diff Tue Mar 21 14:20:29 2006 +++ (empty file) @@ -1,108 +0,0 @@ -diff -ur tix-8.1.4/win/common.mak tix-8.1.4.new/win/common.mak ---- tix-8.1.4/win/common.mak 2002-12-11 07:19:42.000000000 +0100 -+++ tix-8.1.4.new/win/common.mak 2004-08-03 21:45:09.859375000 +0200 -@@ -18,10 +18,10 @@ - # support files - # - #---------------------------------------------------------------------- --TCL_VER = 8.3 -+TCL_VER = 8.4 - ITCL_VER = - --INSTALLDIR = C:\progra~1\tcl -+INSTALLDIR = ..\..\tcltk - - !IFNDEF TIX_DEBUG - NODEBUG = 1 -@@ -61,7 +61,7 @@ - !IF "$(TCL_VER)" == "8.4" - TCLMAJOR=8 - TCLMINOR=4 --TCLPATCH=1 -+TCLPATCH=7 - TMPDIR = tk$(TCL_VER) - !ENDIF - -@@ -176,14 +176,14 @@ - $(TMPDIR)\tixWinWm.obj - - RMDIR = $(TCLDIR)\win\rmd.bat --MKDIR = $(TCLDIR)\win\mkd.bat -+MKDIR = mkdir - RM = del - - install: install-binaries install-libraries - - install-binaries: $(TCLSH) -- $(MKDIR) "$(BIN_INSTALL_DIR)" -- $(MKDIR) "$(LIB_INSTALL_DIR)" -+ -$(MKDIR) "$(BIN_INSTALL_DIR)" -+ -$(MKDIR) "$(LIB_INSTALL_DIR)" - @echo installing $(TIXDLL) - @copy "$(TIXDLL)" "$(BIN_INSTALL_DIR)" - @copy "$(TIXLIB)" "$(LIB_INSTALL_DIR)" -diff -ur tix-8.1.4/win/makefile.vc tix-8.1.4.new/win/makefile.vc ---- tix-8.1.4/win/makefile.vc 2002-12-02 04:02:54.000000000 +0100 -+++ tix-8.1.4.new/win/makefile.vc 2004-08-03 21:42:07.953125000 +0200 -@@ -54,12 +54,11 @@ - DBGX = d - !ENDIF - --cc32 = "$(TOOLS32)\bin\cl.exe" --rc32 = "$(TOOLS32_rc)\bin\rc.exe" --link32 = "$(TOOLS32)\bin\link.exe" --include32 = -I"$(TOOLS32)\include" -+cc32 = "cl.exe" -+rc32 = "rc.exe" -+link32 = "link.exe" - --TIX_INCLUDES = $(include32) \ -+TIX_INCLUDES = \ - -I$(ROOT)\win -I$(ROOT)\generic \ - -I$(TKDIR)\generic -I$(TKDIR)\win -I$(TKDIR)\xlib \ - -I$(TCLDIR)\generic $(ITCL_CFLAGS) -@@ -171,7 +170,7 @@ - # - cvarsdll = -D_X86_=1 -DWIN32 -D_WIN32 -D_MT -D_DLL - cflagsdll = $(cvarsdll) -c -W3 -nologo -Fp$(TMPDIR)\ -YX -MD \ -- -Oti -Gs -GD -+ -Oti -Gs -Gd - - ###################################################################### - # Project specific targets -@@ -181,7 +180,6 @@ - - $(DUMPEXTS): $(WINDIR)\winDumpExts.c - $(cc32) $(CON_CFLAGS) -Fo$(TMPDIR)\ /c $? -- set LIB="$(TOOLS32)\lib" - $(link32) $(ldebug) $(conlflags) $(guilibs) -out:$@ \ - $(TMPDIR)\winDumpExts.obj - -@@ -193,7 +191,6 @@ - # (ToDo) $(TIXDLL) doesn't have resources to define its icon, etc. - # - $(TIXDLL): $(TIXOBJS) $(TMPDIR)\tixvc.def -- set LIB="$(TOOLS32)\lib" - $(link32) $(ldebug) $(dlllflags) -def:$(TMPDIR)\tixvc.def \ - $(TKLIBDIR)\$(TKLIB) $(TCLLIBDIR)\$(TCLLIB) $(guilibsdll) \ - $(ITCL_LIBS) -out:$@ @<< -@@ -202,7 +199,6 @@ - - - $(TIXWISH): $(WISHOBJS) $(TIXOBJS) $(TIXLIB) $(TMPDIR)\tixwish.res -- set LIB="$(TOOLS32)\lib" - $(link32) $(ldebug) $(guilflags) \ - $(WISHOBJS) $(TMPDIR)\tixwish.res $(TIXLIB) \ - $(TKLIBDIR)\$(TKLIB) $(TCLLIBDIR)\$(TCLLIB) $(guilibsdll) \ -diff -ur tix-8.1.4/win/tk8.4/pkgIndex.tcl tix-8.1.4.new/win/tk8.4/pkgIndex.tcl ---- tix-8.1.4/win/tk8.4/pkgIndex.tcl 2002-12-15 04:21:54.000000000 +0100 -+++ tix-8.1.4.new/win/tk8.4/pkgIndex.tcl 2004-08-31 08:38:43.921875000 +0200 -@@ -15,7 +15,7 @@ - # We look in the ../../bin directory (an installed Tcl) - lappend dirs ../../bin - # We look in the ../../DLLs directory (an installed Python) --lappend dirs ../../Dlls -+lappend dirs [file join [file dirname [info nameofexe]] DLLs] - # If not, this pkgIndex.tcl will probably fail. - - Modified: python/trunk/PCbuild/readme.txt ============================================================================== --- python/trunk/PCbuild/readme.txt (original) +++ python/trunk/PCbuild/readme.txt Tue Mar 21 14:20:29 2006 @@ -64,27 +64,21 @@ _tkinter Python wrapper for the Tk windowing system. Requires building - Tcl/Tk first. Following are instructions for Tcl/Tk 8.4.7; these - should work for version 8.4.6 too, with suitable substitutions: + Tcl/Tk first. Following are instructions for Tcl/Tk 8.4.12. Get source ---------- - Go to - http://prdownloads.sourceforge.net/tcl/ - and download - tcl847-src.zip - tk847-src.zip - Unzip into - dist\tcl8.4.7\ - dist\tk8.4.7\ - respectively. + In the dist directory, run + svn export http://svn.python.org/projects/external/tcl8.4.12 + svn export http://svn.python.org/projects/external/tk8.4.12 + svn export http://svn.python.org/projects/external/tix-8.4.0 Build Tcl first (done here w/ MSVC 7.1 on Windows XP) --------------- Use "Start -> All Programs -> Microsoft Visual Studio .NET 2003 -> Visual Studio .NET Tools -> Visual Studio .NET 2003 Command Prompt" to get a shell window with the correct environment settings - cd dist\tcl8.4.7\win + cd dist\tcl8.4.12\win nmake -f makefile.vc nmake -f makefile.vc INSTALLDIR=..\..\tcltk install @@ -99,9 +93,9 @@ Build Tk -------- - cd dist\tk8.4.7\win - nmake -f makefile.vc TCLDIR=..\..\tcl8.4.7 - nmake -f makefile.vc TCLDIR=..\..\tcl8.4.7 INSTALLDIR=..\..\tcltk install + cd dist\tk8.4.12\win + nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 + nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 INSTALLDIR=..\..\tcltk install XXX Should we compile with OPTS=threads? @@ -109,7 +103,7 @@ XXX directory. Is all of that really needed for Python use of Tcl/Tk? Optional: run tests, via - nmake -f makefile.vc TCLDIR=..\..\tcl8.4.7 test + nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 test On WinXP Pro, wholly up to date as of 30-Aug-2004: all.tcl: Total 8420 Passed 6826 Skipped 1581 Failed 13 @@ -118,12 +112,9 @@ Built Tix --------- - Download from http://prdownloads.sourceforge.net/tix/tix-8.1.4.tar.gz - cd dist\tix-8.1.4 - [cygwin]patch -p1 < ..\..\python\PC\tix.diff - cd win - nmake -f makefile.vc - nmake -f makefile.vc install + cd dist\tix-8.4.0\win + nmake -f python.mak + nmake -f python.mak install bz2 Python wrapper for the libbz2 compression library. Homepage Modified: python/trunk/Tools/buildbot/external.bat ============================================================================== --- python/trunk/Tools/buildbot/external.bat (original) +++ python/trunk/Tools/buildbot/external.bat Tue Mar 21 14:20:29 2006 @@ -15,3 +15,17 @@ @rem OpenSSL if not exist openssl-0.9.8a svn export http://svn.python.org/projects/external/openssl-0.9.8a + + at rem tcltk +if not exist tcl8.4.12 ( + if exist tcltk rd /s/q tcltk + svn export http://svn.python.org/projects/external/tcl8.4.12 + svn export http://svn.python.org/projects/external/tk8.4.12 + cd tcl8.4.12\win + nmake -f makefile.vc + nmake -f makefile.vc INSTALLDIR=..\..\tcltk install + cd ..\.. + cd tk8.4.12\win + nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 + nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 INSTALLDIR=..\..\tcltk install +) From python-checkins at python.org Tue Mar 21 15:41:49 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 15:41:49 +0100 (CET) Subject: [Python-checkins] r43192 - peps/trunk/pep2pyramid.py Message-ID: <20060321144149.405291E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 15:41:48 2006 New Revision: 43192 Modified: peps/trunk/pep2pyramid.py Log: Move PEP directory to dev (patch by Tim Parkin). Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Tue Mar 21 15:41:48 2006 @@ -34,7 +34,7 @@ The optional arguments ``peps`` are either pep numbers or .txt files. """ -destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/doc/peps' +destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/dev/peps' import sys import os @@ -244,7 +244,7 @@ need_pre = 0 print >> outfile, re.sub( parts[1], - '%s' % (int(parts[1]), + '%s' % (int(parts[1]), parts[1]), line, 1), continue elif parts and '@' in parts[-1]: From python-checkins at python.org Tue Mar 21 16:02:12 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 16:02:12 +0100 (CET) Subject: [Python-checkins] r43193 - peps/trunk/pep-0353.txt Message-ID: <20060321150212.2738A1E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 16:02:10 2006 New Revision: 43193 Modified: peps/trunk/pep-0353.txt Log: Add link to Fredrik Lundh's scanner. Modified: peps/trunk/pep-0353.txt ============================================================================== --- peps/trunk/pep-0353.txt (original) +++ peps/trunk/pep-0353.txt Tue Mar 21 16:02:10 2006 @@ -167,6 +167,11 @@ PY_SIZE_T_CLEAN must be defined before including Python.h if the calls have been updated accordingly. +Fredrik Lundh has written a scanner_ which checks the code +of a C module for usage of APIs whose signature has changed. + +.. _scanner: http://svn.effbot.python-hosting.com/stuff/sandbox/python/ssizecheck.py + Discussion ========== From python-checkins at python.org Tue Mar 21 19:05:51 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:05:51 +0100 (CET) Subject: [Python-checkins] r43194 - python/branches/p3yk/Misc/ignore Message-ID: <20060321180551.74A491E4081@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:05:50 2006 New Revision: 43194 Added: python/branches/p3yk/Misc/ignore Log: testing svn emails Added: python/branches/p3yk/Misc/ignore ============================================================================== --- (empty file) +++ python/branches/p3yk/Misc/ignore Tue Mar 21 19:05:50 2006 @@ -0,0 +1 @@ +ignore From python-checkins at python.org Tue Mar 21 19:13:09 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:13:09 +0100 (CET) Subject: [Python-checkins] r43195 - python/branches/p3yk/Misc/ignore Message-ID: <20060321181309.A3C2F1E4027@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:13:08 2006 New Revision: 43195 Modified: python/branches/p3yk/Misc/ignore Log: testing svn emails Modified: python/branches/p3yk/Misc/ignore ============================================================================== --- python/branches/p3yk/Misc/ignore (original) +++ python/branches/p3yk/Misc/ignore Tue Mar 21 19:13:08 2006 @@ -1 +1 @@ -ignore +ingore From python-checkins at python.org Tue Mar 21 19:17:26 2006 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Mar 2006 19:17:26 +0100 (CET) Subject: [Python-checkins] r43196 - in python/trunk: Doc/lib/libsocket.tex Lib/socket.py Lib/test/test_socket.py Message-ID: <20060321181726.C5A901E4020@bag.python.org> Author: georg.brandl Date: Tue Mar 21 19:17:25 2006 New Revision: 43196 Modified: python/trunk/Doc/lib/libsocket.tex python/trunk/Lib/socket.py python/trunk/Lib/test/test_socket.py Log: Correct API design mistake from rev. 43126: make socket attributes readonly properties. Modified: python/trunk/Doc/lib/libsocket.tex ============================================================================== --- python/trunk/Doc/lib/libsocket.tex (original) +++ python/trunk/Doc/lib/libsocket.tex Tue Mar 21 19:17:25 2006 @@ -654,21 +654,6 @@ setting, and in general it is recommended to call \method{settimeout()} before calling \method{connect()}. -\begin{methoddesc}[socket]{getfamily}{} -Return the socket family, as given to the \class{socket} constructor. -\versionadded{2.5} -\end{methoddesc} - -\begin{methoddesc}[socket]{gettype}{} -Return the socket type, as given to the \class{socket} constructor. -\versionadded{2.5} -\end{methoddesc} - -\begin{methoddesc}[socket]{getproto}{} -Return the socket protocol, as given to the \class{socket} constructor. -\versionadded{2.5} -\end{methoddesc} - \begin{methoddesc}[socket]{setsockopt}{level, optname, value} Set the value of the given socket option (see the \UNIX{} manual page \manpage{setsockopt}{2}). The needed symbolic constants are defined in @@ -692,6 +677,25 @@ instead. +Socket objects also have these (read-only) attributes that correspond +to the values given to the \class{socket} constructor. + +\begin{memberdesc}[socket]{family} +The socket family. +\versionadded{2.5} +\end{memberdesc} + +\begin{memberdesc}[socket]{type} +The socket type. +\versionadded{2.5} +\end{memberdesc} + +\begin{memberdesc}[socket]{proto} +The socket protocol. +\versionadded{2.5} +\end{memberdesc} + + \subsection{SSL Objects \label{ssl-objects}} SSL objects have the following methods. Modified: python/trunk/Lib/socket.py ============================================================================== --- python/trunk/Lib/socket.py (original) +++ python/trunk/Lib/socket.py Tue Mar 21 19:17:25 2006 @@ -182,24 +182,10 @@ Return a regular file object corresponding to the socket. The mode and bufsize arguments are as for the built-in open() function.""" return _fileobject(self._sock, mode, bufsize) - - def getfamily(self): - """getfamily() -> socket family - - Return the socket family.""" - return self._sock.family - - def gettype(self): - """gettype() -> socket type - - Return the socket type.""" - return self._sock.type - - def getproto(self): - """getproto() -> socket protocol - - Return the socket protocol.""" - return self._sock.proto + + family = property(lambda self: self._sock.family, doc="the socket family") + type = property(lambda self: self._sock.type, doc="the socket type") + proto = property(lambda self: self._sock.proto, doc="the socket protocol") _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" "%s.__doc__ = _realsocket.%s.__doc__\n") Modified: python/trunk/Lib/test/test_socket.py ============================================================================== --- python/trunk/Lib/test/test_socket.py (original) +++ python/trunk/Lib/test/test_socket.py Tue Mar 21 19:17:25 2006 @@ -469,12 +469,12 @@ sock.close() self.assertRaises(socket.error, sock.send, "spam") - def testNewGetMethods(self): - # testing getfamily(), gettype() and getprotocol() + def testNewAttributes(self): + # testing .family, .type and .protocol sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.assertEqual(sock.getfamily(), socket.AF_INET) - self.assertEqual(sock.gettype(), socket.SOCK_STREAM) - self.assertEqual(sock.getproto(), 0) + self.assertEqual(sock.family, socket.AF_INET) + self.assertEqual(sock.type, socket.SOCK_STREAM) + self.assertEqual(sock.proto, 0) sock.close() class BasicTCPTest(SocketConnectedTest): From python-checkins at python.org Tue Mar 21 19:18:20 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:18:20 +0100 (CET) Subject: [Python-checkins] r43197 - python/branches/p3yk/Misc/ignore Message-ID: <20060321181820.E650B1E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:18:20 2006 New Revision: 43197 Modified: python/branches/p3yk/Misc/ignore Log: testing svn emails Modified: python/branches/p3yk/Misc/ignore ============================================================================== --- python/branches/p3yk/Misc/ignore (original) +++ python/branches/p3yk/Misc/ignore Tue Mar 21 19:18:20 2006 @@ -1 +1 @@ -ingore +ignore From python-checkins at python.org Tue Mar 21 19:21:43 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:21:43 +0100 (CET) Subject: [Python-checkins] r43198 - python/branches/p3yk/Misc/ignore Message-ID: <20060321182143.882F11E400A@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:21:43 2006 New Revision: 43198 Modified: python/branches/p3yk/Misc/ignore Log: testing svn emails Modified: python/branches/p3yk/Misc/ignore ============================================================================== --- python/branches/p3yk/Misc/ignore (original) +++ python/branches/p3yk/Misc/ignore Tue Mar 21 19:21:43 2006 @@ -1 +1 @@ -ignore +ingore From python-checkins at python.org Tue Mar 21 19:29:20 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:29:20 +0100 (CET) Subject: [Python-checkins] r43199 - python/branches/p3yk/Misc/ignore Message-ID: <20060321182920.21C201E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:29:19 2006 New Revision: 43199 Modified: python/branches/p3yk/Misc/ignore Log: testing svn emails Modified: python/branches/p3yk/Misc/ignore ============================================================================== --- python/branches/p3yk/Misc/ignore (original) +++ python/branches/p3yk/Misc/ignore Tue Mar 21 19:29:19 2006 @@ -1 +1 @@ -ingore +ignore From python-checkins at python.org Tue Mar 21 19:30:38 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 19:30:38 +0100 (CET) Subject: [Python-checkins] r43200 - python/trunk/Misc/ignore Message-ID: <20060321183038.6B2971E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 19:30:37 2006 New Revision: 43200 Added: python/trunk/Misc/ignore Log: py trunk svn test Added: python/trunk/Misc/ignore ============================================================================== --- (empty file) +++ python/trunk/Misc/ignore Tue Mar 21 19:30:37 2006 @@ -0,0 +1 @@ +py25 ignore From martin at v.loewis.de Tue Mar 21 19:52:40 2006 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Tue, 21 Mar 2006 19:52:40 +0100 Subject: [Python-checkins] r43200 - python/trunk/Misc/ignore In-Reply-To: <20060321183038.6B2971E4009@bag.python.org> References: <20060321183038.6B2971E4009@bag.python.org> Message-ID: <44204B78.3050304@v.loewis.de> barry.warsaw wrote: > Author: barry.warsaw > Date: Tue Mar 21 19:30:37 2006 > New Revision: 43200 > > Added: > python/trunk/Misc/ignore > Log: > py trunk svn test Out of curiosity: what is it that you are testing? Regards, Martin From python-checkins at python.org Tue Mar 21 20:04:56 2006 From: python-checkins at python.org (phillip.eby) Date: Tue, 21 Mar 2006 20:04:56 +0100 (CET) Subject: [Python-checkins] r43201 - sandbox/trunk/setuptools/setuptools/command/bdist_egg.py Message-ID: <20060321190456.C24351E4009@bag.python.org> Author: phillip.eby Date: Tue Mar 21 20:04:55 2006 New Revision: 43201 Modified: sandbox/trunk/setuptools/setuptools/command/bdist_egg.py Log: Don't generate a loader .py file in .egg file for extensions that aren't actually built. This prevents problems w/customized setups that make some extensions optional (e.g. scipy.distutils). Modified: sandbox/trunk/setuptools/setuptools/command/bdist_egg.py ============================================================================== --- sandbox/trunk/setuptools/setuptools/command/bdist_egg.py (original) +++ sandbox/trunk/setuptools/setuptools/command/bdist_egg.py Tue Mar 21 20:04:55 2006 @@ -307,7 +307,8 @@ fullname = build_cmd.get_ext_fullname(ext.name) filename = build_cmd.get_ext_filename(fullname) if not os.path.basename(filename).startswith('dl-'): - ext_outputs.append(filename) + if os.path.exists(os.path.join(self.bdist_dir,filename)): + ext_outputs.append(filename) return all_outputs, ext_outputs @@ -325,7 +326,6 @@ - def walk_egg(egg_dir): """Walk an unpacked egg's contents, skipping the metadata directory""" walker = os.walk(egg_dir) From python-checkins at python.org Tue Mar 21 20:06:40 2006 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Mar 2006 20:06:40 +0100 (CET) Subject: [Python-checkins] r43202 - peps/trunk/pep-0353.txt Message-ID: <20060321190640.89EC31E4009@bag.python.org> Author: martin.v.loewis Date: Tue Mar 21 20:06:39 2006 New Revision: 43202 Modified: peps/trunk/pep-0353.txt Log: Add lenfunc. Modified: peps/trunk/pep-0353.txt ============================================================================== --- peps/trunk/pep-0353.txt (original) +++ peps/trunk/pep-0353.txt Tue Mar 21 20:06:39 2006 @@ -67,7 +67,7 @@ transparently process long int objects. New function pointer typedefs ssizeargfunc, ssizessizeargfunc, -ssizeobjargproc, and ssizessizeobjargproc are introduced. The +ssizeobjargproc, ssizessizeobjargproc, and lenfunc are introduced. The buffer interface function types are now called readbufferproc, writebufferproc, segcountproc, and charbufferproc. From python-checkins at python.org Tue Mar 21 20:26:34 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 20:26:34 +0100 (CET) Subject: [Python-checkins] r43204 - python/trunk/Misc/ignore Message-ID: <20060321192634.6E8F31E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 20:26:34 2006 New Revision: 43204 Modified: python/trunk/Misc/ignore Log: py trunk svn test Modified: python/trunk/Misc/ignore ============================================================================== --- python/trunk/Misc/ignore (original) +++ python/trunk/Misc/ignore Tue Mar 21 20:26:34 2006 @@ -1 +1 @@ -py25 ignore +py25 ingore From python-checkins at python.org Tue Mar 21 20:37:40 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 20:37:40 +0100 (CET) Subject: [Python-checkins] r43206 - python/trunk/Misc/ignore Message-ID: <20060321193740.CFCF11E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 20:37:40 2006 New Revision: 43206 Modified: python/trunk/Misc/ignore Log: py trunk svn test Modified: python/trunk/Misc/ignore ============================================================================== --- python/trunk/Misc/ignore (original) +++ python/trunk/Misc/ignore Tue Mar 21 20:37:40 2006 @@ -1 +1 @@ -py25 ingore +py25 ignore From python-checkins at python.org Tue Mar 21 20:46:27 2006 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Mar 2006 20:46:27 +0100 (CET) Subject: [Python-checkins] r43207 - python/trunk/Misc/ignore Message-ID: <20060321194627.056F41E4009@bag.python.org> Author: barry.warsaw Date: Tue Mar 21 20:46:26 2006 New Revision: 43207 Removed: python/trunk/Misc/ignore Log: remove test file Deleted: /python/trunk/Misc/ignore ============================================================================== --- /python/trunk/Misc/ignore Tue Mar 21 20:46:26 2006 +++ (empty file) @@ -1 +0,0 @@ -py25 ignore From python-checkins at python.org Wed Mar 22 03:45:53 2006 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Mar 2006 03:45:53 +0100 (CET) Subject: [Python-checkins] r43209 - python/trunk/Misc/NEWS Message-ID: <20060322024553.8D7C71E4004@bag.python.org> Author: barry.warsaw Date: Wed Mar 22 03:45:50 2006 New Revision: 43209 Modified: python/trunk/Misc/NEWS Log: News about email 4.0. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 22 03:45:50 2006 @@ -477,6 +477,14 @@ Library ------- +- email 4.0 package now integrated. This is largely the same as the email 3.0 + package that was included in Python 2.3, except that PEP 8 module names are + now used (e.g. mail.message instead of email.Message). The MIME classes + have been moved to a subpackage (e.g. email.mime.text instead of + email.MIMEText). The old names are still supported for now. Several + deprecated Message methods have been removed and lots of bugs have been + fixed. More details can be found in the email package documentation. + - Patch #1436130: codecs.lookup() now returns a CodecInfo object (a subclass of tuple) that provides incremental decoders and encoders (a way to use stateful codecs without the stream API). Functions From python-checkins at python.org Wed Mar 22 03:58:22 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 22 Mar 2006 03:58:22 +0100 (CET) Subject: [Python-checkins] r43210 - python/trunk/Lib/test/regrtest.py Message-ID: <20060322025822.86F411E4004@bag.python.org> Author: tim.peters Date: Wed Mar 22 03:58:17 2006 New Revision: 43210 Modified: python/trunk/Lib/test/regrtest.py Log: Record that test_wait[34] get skipped on native Windows. Modified: python/trunk/Lib/test/regrtest.py ============================================================================== --- python/trunk/Lib/test/regrtest.py (original) +++ python/trunk/Lib/test/regrtest.py Wed Mar 22 03:58:17 2006 @@ -744,6 +744,8 @@ test_sunaudiodev test_threadsignals test_timing + test_wait3 + test_wait4 """, 'linux2': """ From python-checkins at python.org Wed Mar 22 04:23:25 2006 From: python-checkins at python.org (tim.peters) Date: Wed, 22 Mar 2006 04:23:25 +0100 (CET) Subject: [Python-checkins] r43211 - python/trunk/Lib/socket.py Message-ID: <20060322032325.EB7841E4004@bag.python.org> Author: tim.peters Date: Wed Mar 22 04:23:21 2006 New Revision: 43211 Modified: python/trunk/Lib/socket.py Log: Whitespace normalization. Modified: python/trunk/Lib/socket.py ============================================================================== --- python/trunk/Lib/socket.py (original) +++ python/trunk/Lib/socket.py Wed Mar 22 04:23:21 2006 @@ -182,7 +182,7 @@ Return a regular file object corresponding to the socket. The mode and bufsize arguments are as for the built-in open() function.""" return _fileobject(self._sock, mode, bufsize) - + family = property(lambda self: self._sock.family, doc="the socket family") type = property(lambda self: self._sock.type, doc="the socket type") proto = property(lambda self: self._sock.proto, doc="the socket protocol") From python-checkins at python.org Wed Mar 22 05:00:00 2006 From: python-checkins at python.org (david.goodger) Date: Wed, 22 Mar 2006 05:00:00 +0100 (CET) Subject: [Python-checkins] r43212 - peps/trunk/docutils.conf Message-ID: <20060322040000.7EA061E4004@bag.python.org> Author: david.goodger Date: Wed Mar 22 04:59:59 2006 New Revision: 43212 Modified: peps/trunk/docutils.conf Log: fixed settings Modified: peps/trunk/docutils.conf ============================================================================== --- peps/trunk/docutils.conf (original) +++ peps/trunk/docutils.conf Wed Mar 22 04:59:59 2006 @@ -13,3 +13,5 @@ # link to the stylesheet; don't embed it embed-stylesheet: 0 +pep-home: /dev/peps/ +# pep-base-url: http://www.python.org/dev/peps/ From python-checkins at python.org Wed Mar 22 05:00:21 2006 From: python-checkins at python.org (anthony.baxter) Date: Wed, 22 Mar 2006 05:00:21 +0100 (CET) Subject: [Python-checkins] r43213 - python/branches/release24-maint/Include/patchlevel.h Message-ID: <20060322040021.4282B1E4004@bag.python.org> Author: anthony.baxter Date: Wed Mar 22 05:00:19 2006 New Revision: 43213 Modified: python/branches/release24-maint/Include/patchlevel.h Log: 2.4.3c1 preparations Modified: python/branches/release24-maint/Include/patchlevel.h ============================================================================== --- python/branches/release24-maint/Include/patchlevel.h (original) +++ python/branches/release24-maint/Include/patchlevel.h Wed Mar 22 05:00:19 2006 @@ -21,12 +21,12 @@ /* Version parsed out into numeric values */ #define PY_MAJOR_VERSION 2 #define PY_MINOR_VERSION 4 -#define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "2.4.2" +#define PY_VERSION "2.4.3c1" /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. Use this for numeric comparisons, e.g. #if PY_VERSION_HEX >= ... */ From python-checkins at python.org Wed Mar 22 06:24:32 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 22 Mar 2006 06:24:32 +0100 (CET) Subject: [Python-checkins] r43214 - peps/trunk/pep-3000.txt Message-ID: <20060322052432.419F01E4004@bag.python.org> Author: neal.norwitz Date: Wed Mar 22 06:24:31 2006 New Revision: 43214 Modified: peps/trunk/pep-3000.txt Log: Add Outstanding Issues section Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 22 06:24:31 2006 @@ -193,6 +193,14 @@ (Probably also just remove the thread module as a public API, in favor of always using threading.py.) +Outstanding Issues +================== + +* Require C99, so we can use // comments, named initializers, declare variables + without introducing a new scope, among other benefits. + +* Remove support for old systems, including: OS2, BeOS, RISCOS, (SGI) Irix, Tru64 + References ========== From python-checkins at python.org Wed Mar 22 07:44:15 2006 From: python-checkins at python.org (georg.brandl) Date: Wed, 22 Mar 2006 07:44:15 +0100 (CET) Subject: [Python-checkins] r43215 - python/trunk/Misc/NEWS Message-ID: <20060322064415.6C9C31E4004@bag.python.org> Author: georg.brandl Date: Wed Mar 22 07:44:14 2006 New Revision: 43215 Modified: python/trunk/Misc/NEWS Log: Change NEWS entry for recent socket API change Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 22 07:44:14 2006 @@ -301,7 +301,7 @@ In addition, the existing ulaw code was updated. - RFE #567972: Socket objects' family, type and proto properties are - now exposed via new get...() methods. + now exposed via new attributes. - Everything under lib-old was removed. This includes the following modules: Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, From python-checkins at python.org Wed Mar 22 08:13:31 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 22 Mar 2006 08:13:31 +0100 (CET) Subject: [Python-checkins] r43217 - python/trunk/Lib/plat-mac/applesingle.py Message-ID: <20060322071331.046FF1E4004@bag.python.org> Author: neal.norwitz Date: Wed Mar 22 08:13:30 2006 New Revision: 43217 Modified: python/trunk/Lib/plat-mac/applesingle.py Log: Damn another occurrence of using as as a keywordf Modified: python/trunk/Lib/plat-mac/applesingle.py ============================================================================== --- python/trunk/Lib/plat-mac/applesingle.py (original) +++ python/trunk/Lib/plat-mac/applesingle.py Wed Mar 22 08:13:30 2006 @@ -119,8 +119,8 @@ infile = infile.as_pathname() infile = open(infile, 'rb') - as = AppleSingle(infile, verbose=verbose) - as.tofile(outpath, resonly=resonly) + asfile = AppleSingle(infile, verbose=verbose) + asfile.tofile(outpath, resonly=resonly) def _test(): if len(sys.argv) < 3 or sys.argv[1] == '-r' and len(sys.argv) != 4: From python-checkins at python.org Wed Mar 22 09:52:49 2006 From: python-checkins at python.org (hyeshik.chang) Date: Wed, 22 Mar 2006 09:52:49 +0100 (CET) Subject: [Python-checkins] r43219 - python/trunk/Include/pyport.h Message-ID: <20060322085249.D29601E401E@bag.python.org> Author: hyeshik.chang Date: Wed Mar 22 09:52:43 2006 New Revision: 43219 Modified: python/trunk/Include/pyport.h Log: Remove false information from the comment and reformat it like other comments in the file. (SF #1455641) Modified: python/trunk/Include/pyport.h ============================================================================== --- python/trunk/Include/pyport.h (original) +++ python/trunk/Include/pyport.h Wed Mar 22 09:52:43 2006 @@ -476,14 +476,12 @@ #endif -/******************************************************************* -On 4.4BSD-descendants, ctype functions serves the whole range of -wchar_t character set rather than single byte code points only. -This characteristic can break some operations of string object -including str.upper() and str.split() on UTF-8 locales. This -workaround was provided by Tim Robbins of FreeBSD project. He said -the incompatibility will be fixed in FreeBSD 6. -********************************************************************/ +/* On 4.4BSD-descendants, ctype functions serves the whole range of + * wchar_t character set rather than single byte code points only. + * This characteristic can break some operations of string object + * including str.upper() and str.split() on UTF-8 locales. This + * workaround was provided by Tim Robbins of FreeBSD project. + */ #ifdef __FreeBSD__ #include From python-checkins at python.org Wed Mar 22 10:39:00 2006 From: python-checkins at python.org (neal.norwitz) Date: Wed, 22 Mar 2006 10:39:00 +0100 (CET) Subject: [Python-checkins] r43223 - peps/trunk/pep-3000.txt Message-ID: <20060322093900.195F81E4004@bag.python.org> Author: neal.norwitz Date: Wed Mar 22 10:38:59 2006 New Revision: 43223 Modified: peps/trunk/pep-3000.txt Log: Oops, I started this list before Alan said he was going to maintain OS2 Modified: peps/trunk/pep-3000.txt ============================================================================== --- peps/trunk/pep-3000.txt (original) +++ peps/trunk/pep-3000.txt Wed Mar 22 10:38:59 2006 @@ -199,7 +199,7 @@ * Require C99, so we can use // comments, named initializers, declare variables without introducing a new scope, among other benefits. -* Remove support for old systems, including: OS2, BeOS, RISCOS, (SGI) Irix, Tru64 +* Remove support for old systems, including: BeOS, RISCOS, (SGI) Irix, Tru64 References ========== From python-checkins at python.org Wed Mar 22 11:09:28 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 22 Mar 2006 11:09:28 +0100 (CET) Subject: [Python-checkins] r43224 - python/trunk/Misc/NEWS Message-ID: <20060322100928.3BAF01E4004@bag.python.org> Author: thomas.heller Date: Wed Mar 22 11:09:27 2006 New Revision: 43224 Modified: python/trunk/Misc/NEWS Log: ctypes was added. Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Wed Mar 22 11:09:27 2006 @@ -477,6 +477,8 @@ Library ------- +- Added the ctypes ffi package. + - email 4.0 package now integrated. This is largely the same as the email 3.0 package that was included in Python 2.3, except that PEP 8 module names are now used (e.g. mail.message instead of email.Message). The MIME classes From python-checkins at python.org Wed Mar 22 13:59:55 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 22 Mar 2006 13:59:55 +0100 (CET) Subject: [Python-checkins] r43225 - python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callbacks.c python/trunk/Modules/_ctypes/callproc.c python/trunk/Modules/_ctypes/ctypes.h Message-ID: <20060322125955.AE2CA1E4005@bag.python.org> Author: thomas.heller Date: Wed Mar 22 13:59:53 2006 New Revision: 43225 Modified: python/trunk/Modules/_ctypes/_ctypes.c python/trunk/Modules/_ctypes/callbacks.c python/trunk/Modules/_ctypes/callproc.c python/trunk/Modules/_ctypes/ctypes.h Log: Include on windows, to avoid warnings when compiling with mingw. Don't use SEH when compiling wth mingw. Use IS_INTRESOURCE to determine function name from function ordinal. Rewrite the code that allocates and frees callback functions, hopefully this avoids the coverty warnings: Remove the THUNK typedef, and move the definition of struct ffi_info into the header file. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Wed Mar 22 13:59:53 2006 @@ -105,6 +105,10 @@ #include #ifdef MS_WIN32 #include +#include +#ifndef IS_INTRESOURCE +#define IS_INTRESOURCE(x) (((size_t)(x) >> 16) == 0) +#endif # ifdef _WIN32_WCE /* Unlike desktop Windows, WinCE has both W and A variants of GetProcAddress, but the default W version is not what we want */ @@ -2402,7 +2406,7 @@ funcname -> _funcname@ where n is 0, 4, 8, 12, ..., 128 */ - mangled_name = _alloca(strlen(name) + 1 + 1 + 1 + 3); /* \0 _ @ %d */ + mangled_name = alloca(strlen(name) + 1 + 1 + 1 + 3); /* \0 _ @ %d */ for (i = 0; i < 32; ++i) { sprintf(mangled_name, "_%s@%d", name, i*4); address = (PPROC)GetProcAddress(handle, mangled_name); @@ -2557,14 +2561,14 @@ #ifdef MS_WIN32 address = FindAddress(handle, name, (PyObject *)type); if (!address) { - if ((size_t)name & ~0xFFFF) + if (!IS_INTRESOURCE(name)) PyErr_Format(PyExc_AttributeError, "function '%s' not found", name); else PyErr_Format(PyExc_AttributeError, "function ordinal %d not found", - name); + (WORD)(size_t)name); return NULL; } #else @@ -2651,7 +2655,7 @@ CFuncPtrObject *self; PyObject *callable; StgDictObject *dict; - THUNK thunk; + ffi_info *thunk; if (PyTuple_GET_SIZE(args) == 0) return GenericCData_new(type, args, kwds); @@ -3192,10 +3196,10 @@ Py_CLEAR(self->paramflags); if (self->thunk) { - FreeCallback(self->thunk); + FreeClosure(self->thunk->pcl); PyMem_Free(self->thunk); + self->thunk = NULL; } - self->thunk = NULL; return CData_clear((CDataObject *)self); } Modified: python/trunk/Modules/_ctypes/callbacks.c ============================================================================== --- python/trunk/Modules/_ctypes/callbacks.c (original) +++ python/trunk/Modules/_ctypes/callbacks.c Wed Mar 22 13:59:53 2006 @@ -264,16 +264,6 @@ PyGILState_Release(state); } -typedef struct { - ffi_closure *pcl; /* the C callable */ - ffi_cif cif; - PyObject *converters; - PyObject *callable; - SETFUNC setfunc; - ffi_type *restype; - ffi_type *atypes[0]; -} ffi_info; - static void closure_fcn(ffi_cif *cif, void *resp, void **args, @@ -289,15 +279,10 @@ args); } -void FreeCallback(THUNK thunk) -{ - FreeClosure(((ffi_info *)thunk)->pcl); -} - -THUNK AllocFunctionCallback(PyObject *callable, - PyObject *converters, - PyObject *restype, - int is_cdecl) +ffi_info *AllocFunctionCallback(PyObject *callable, + PyObject *converters, + PyObject *restype, + int is_cdecl) { int result; ffi_info *p; @@ -306,8 +291,10 @@ nArgs = PySequence_Size(converters); p = (ffi_info *)PyMem_Malloc(sizeof(ffi_info) + sizeof(ffi_type) * (nArgs + 1)); - if (p == NULL) - return (THUNK)PyErr_NoMemory(); + if (p == NULL) { + PyErr_NoMemory(); + return NULL; + } p->pcl = MallocClosure(); if (p->pcl == NULL) { PyErr_NoMemory(); @@ -356,11 +343,12 @@ p->converters = converters; p->callable = callable; - return (THUNK)p; + return p; error: if (p) { - FreeCallback((THUNK)p); + if (p->pcl) + FreeClosure(p->pcl); PyMem_Free(p); } return NULL; Modified: python/trunk/Modules/_ctypes/callproc.c ============================================================================== --- python/trunk/Modules/_ctypes/callproc.c (original) +++ python/trunk/Modules/_ctypes/callproc.c Wed Mar 22 13:59:53 2006 @@ -64,14 +64,17 @@ #endif #ifdef MS_WIN32 -#define alloca _alloca +#include #endif #include #include "ctypes.h" -#ifdef _DEBUG -#define DEBUG_EXCEPTIONS /* */ +#if defined(_DEBUG) || defined(__MINGW32__) +/* Don't use structured exception handling on Windows if this is defined. + MingW, AFAIK, doesn't support it. +*/ +#define DONT_USE_SEH #endif #ifdef MS_WIN32 @@ -96,6 +99,7 @@ return lpMsgBuf; } +#ifndef DONT_USE_SEH void SetException(DWORD code, EXCEPTION_RECORD *pr) { TCHAR *lpMsgBuf; @@ -254,6 +258,7 @@ *record = *ptrs->ExceptionRecord; return EXCEPTION_EXECUTE_HANDLER; } +#endif static PyObject * check_hresult(PyObject *self, PyObject *args) @@ -612,9 +617,11 @@ int cc; #ifdef MS_WIN32 int delta; +#ifndef DONT_USE_SEH DWORD dwExceptionCode = 0; EXCEPTION_RECORD record; #endif +#endif /* XXX check before here */ if (restype == NULL) { PyErr_SetString(PyExc_RuntimeError, @@ -640,14 +647,14 @@ if ((flags & FUNCFLAG_PYTHONAPI) == 0) Py_UNBLOCK_THREADS #ifdef MS_WIN32 -#ifndef DEBUG_EXCEPTIONS +#ifndef DONT_USE_SEH __try { #endif delta = #endif ffi_call(&cif, (void *)pProc, resmem, avalues); #ifdef MS_WIN32 -#ifndef DEBUG_EXCEPTIONS +#ifndef DONT_USE_SEH } __except (HandleException(GetExceptionInformation(), &dwExceptionCode, &record)) { @@ -658,10 +665,12 @@ if ((flags & FUNCFLAG_PYTHONAPI) == 0) Py_BLOCK_THREADS #ifdef MS_WIN32 +#ifndef DONT_USE_SEH if (dwExceptionCode) { SetException(dwExceptionCode, &record); return -1; } +#endif if (delta < 0) { if (flags & FUNCFLAG_CDECL) PyErr_Format(PyExc_ValueError, Modified: python/trunk/Modules/_ctypes/ctypes.h ============================================================================== --- python/trunk/Modules/_ctypes/ctypes.h (original) +++ python/trunk/Modules/_ctypes/ctypes.h Wed Mar 22 13:59:53 2006 @@ -21,8 +21,9 @@ #define PY_LONG_LONG LONG_LONG #endif -typedef int (*THUNK)(void); typedef struct tagCDataObject CDataObject; +typedef PyObject *(* GETFUNC)(void *, unsigned size); +typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); /* A default buffer in CDataObject, which can be used for small C types. If this buffer is too small, PyMem_Malloc will be called to create a larger one, @@ -63,6 +64,16 @@ }; typedef struct { + ffi_closure *pcl; /* the C callable */ + ffi_cif cif; + PyObject *converters; + PyObject *callable; + SETFUNC setfunc; + ffi_type *restype; + ffi_type *atypes[0]; +} ffi_info; + +typedef struct { /* First part identical to tagCDataObject */ PyObject_HEAD char *b_ptr; /* pointer to memory block */ @@ -76,7 +87,7 @@ union value b_value; /* end of tagCDataObject, additional fields follow */ - THUNK thunk; + ffi_info *thunk; PyObject *callable; /* These two fields will override the ones in the type's stgdict if @@ -145,17 +156,12 @@ extern void init_callbacks_in_module(PyObject *m); -extern THUNK AllocFunctionCallback(PyObject *callable, - PyObject *converters, - PyObject *restype, - int stdcall); -extern void FreeCallback(THUNK); - extern PyMethodDef module_methods[]; -typedef PyObject *(* GETFUNC)(void *, unsigned size); -typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); - +extern ffi_info *AllocFunctionCallback(PyObject *callable, + PyObject *converters, + PyObject *restype, + int stdcall); /* a table entry describing a predefined ctypes type */ struct fielddesc { char code; From python-checkins at python.org Wed Mar 22 14:21:17 2006 From: python-checkins at python.org (thomas.heller) Date: Wed, 22 Mar 2006 14:21:17 +0100 (CET) Subject: [Python-checkins] r43226 - python/trunk/Modules/_ctypes/_ctypes.c Message-ID: <20060322132117.0FF321E4005@bag.python.org> Author: thomas.heller Date: Wed Mar 22 14:21:16 2006 New Revision: 43226 Modified: python/trunk/Modules/_ctypes/_ctypes.c Log: Fix some int/Py_ssize_t issues which led to compiler warnings on 64-bit platforms. Modified: python/trunk/Modules/_ctypes/_ctypes.c ============================================================================== --- python/trunk/Modules/_ctypes/_ctypes.c (original) +++ python/trunk/Modules/_ctypes/_ctypes.c Wed Mar 22 14:21:16 2006 @@ -3499,7 +3499,7 @@ } static PyObject * -Array_item(PyObject *_self, int index) +Array_item(PyObject *_self, Py_ssize_t index) { CDataObject *self = (CDataObject *)_self; int offset, size; @@ -3567,7 +3567,7 @@ } static int -Array_ass_item(PyObject *_self, int index, PyObject *value) +Array_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) { CDataObject *self = (CDataObject *)_self; int size, offset; @@ -3595,7 +3595,7 @@ } static int -Array_ass_slice(PyObject *_self, int ilow, int ihigh, PyObject *value) +Array_ass_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *value) { CDataObject *self = (CDataObject *)_self; int i, len; @@ -3636,7 +3636,7 @@ return 0; } -static int +static Py_ssize_t Array_length(PyObject *_self) { CDataObject *self = (CDataObject *)_self; @@ -4002,7 +4002,7 @@ Pointer_Type */ static PyObject * -Pointer_item(PyObject *_self, int index) +Pointer_item(PyObject *_self, Py_ssize_t index) { CDataObject *self = (CDataObject *)_self; int size, offset; @@ -4030,7 +4030,7 @@ } static int -Pointer_ass_item(PyObject *_self, int index, PyObject *value) +Pointer_ass_item(PyObject *_self, Py_ssize_t index, PyObject *value) { CDataObject *self = (CDataObject *)_self; int size; From python-checkins at python.org Wed Mar 22 14:55:51 2006 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 22 Mar 2006 14:55:51 +0100 (CET) Subject: [Python-checkins] r43227 - in python/branches/release24-maint: Lib/test/test_compile.py Misc/NEWS Python/compile.c Message-ID: <20060322135551.B47F21E4005@bag.python.org> Author: martin.v.loewis Date: Wed Mar 22 14:55:50 2006 New Revision: 43227 Modified: python/branches/release24-maint/Lib/test/test_compile.py python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Python/compile.c Log: Change SystemError into SyntaxError, when a Unicode string containing an encoding declaration is compile()d. Fixes #1115379. Modified: python/branches/release24-maint/Lib/test/test_compile.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_compile.py (original) +++ python/branches/release24-maint/Lib/test/test_compile.py Wed Mar 22 14:55:50 2006 @@ -261,6 +261,10 @@ f1, f2 = f() self.assertNotEqual(id(f1.func_code), id(f2.func_code)) + def test_unicode_encoding(self): + # SF bug 1115379 + self.assertRaises(SyntaxError, compile, u"# -*- coding: utf-8 -*-\npass\n", "tmp", "exec") + def test_main(): test_support.run_unittest(TestSpecifics) Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Wed Mar 22 14:55:50 2006 @@ -12,6 +12,9 @@ Core and builtins ----------------- +- Bug #1115379: Compiling a Unicode string with an encoding declaration + now gives a SyntaxError. + - Fix missing check on whether the PendingDeprecationWarning for string exceptions was re-raised as an actual PendingDeprecationWarning when 'warnings' is set to a filter action of "error" Modified: python/branches/release24-maint/Python/compile.c ============================================================================== --- python/branches/release24-maint/Python/compile.c (original) +++ python/branches/release24-maint/Python/compile.c Wed Mar 22 14:55:50 2006 @@ -4952,6 +4952,12 @@ return NULL; if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { sc.c_encoding = "utf-8"; + if (TYPE(n) == encoding_decl) { + com_error(&sc, PyExc_SyntaxError, + "encoding declaration in Unicode string"); + co = NULL; + goto exit; + } } else if (TYPE(n) == encoding_decl) { sc.c_encoding = STR(n); n = CHILD(n, 0); @@ -5044,7 +5050,7 @@ PyErr_SetString(PyExc_SystemError, "lost syntax error"); } exit: - if (base == NULL) { + if (base == NULL && sc.c_symtable != NULL) { PySymtable_Free(sc.c_symtable); sc.c_symtable = NULL; } From python-checkins at python.org Wed Mar 22 15:57:55 2006 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Mar 2006 15:57:55 +0100 (CET) Subject: [Python-checkins] r43228 - python/trunk/Makefile.pre.in Message-ID: <20060322145755.1137C1E4005@bag.python.org> Author: barry.warsaw Date: Wed Mar 22 15:57:54 2006 New Revision: 43228 Modified: python/trunk/Makefile.pre.in Log: Add email/mime to LIBSUBDIRS. Fixes SF bug # 1454912. Modified: python/trunk/Makefile.pre.in ============================================================================== --- python/trunk/Makefile.pre.in (original) +++ python/trunk/Makefile.pre.in Wed Mar 22 15:57:54 2006 @@ -680,7 +680,8 @@ PLATMACPATH=:plat-mac:plat-mac/lib-scriptpackages LIBSUBDIRS= lib-old lib-tk site-packages test test/output test/data \ test/decimaltestdata \ - encodings email email/test email/test/data compiler hotshot \ + encodings compiler hotshot \ + email email/mime email/test email/test/data \ logging bsddb bsddb/test csv ctypes idlelib idlelib/Icons \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ curses $(MACHDEPS) From python-checkins at python.org Thu Mar 23 03:13:44 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:13:44 +0100 (CET) Subject: [Python-checkins] r43229 - python/branches/release24-maint/Misc/NEWS Message-ID: <20060323021344.539551E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:13:43 2006 New Revision: 43229 Modified: python/branches/release24-maint/Misc/NEWS Log: 2.4.3c1 Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Thu Mar 23 03:13:43 2006 @@ -7,7 +7,7 @@ What's New in Python 2.4.3c1? ============================= -*Release date: XX-XX-200X* +*Release date: 23-MAR-2006* Core and builtins ----------------- From python-checkins at python.org Thu Mar 23 03:20:58 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:20:58 +0100 (CET) Subject: [Python-checkins] r43230 - in python/branches/release24-maint: Doc/commontex/boilerplate.tex Doc/commontex/license.tex LICENSE Lib/idlelib/NEWS.txt Lib/idlelib/idlever.py Misc/RPM/python-2.4.spec PCbuild/BUILDno.txt PCbuild/pythoncore.vcproj Message-ID: <20060323022058.8A35F1E400A@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:20:57 2006 New Revision: 43230 Modified: python/branches/release24-maint/Doc/commontex/boilerplate.tex python/branches/release24-maint/Doc/commontex/license.tex python/branches/release24-maint/LICENSE python/branches/release24-maint/Lib/idlelib/NEWS.txt python/branches/release24-maint/Lib/idlelib/idlever.py python/branches/release24-maint/Misc/RPM/python-2.4.spec python/branches/release24-maint/PCbuild/BUILDno.txt python/branches/release24-maint/PCbuild/pythoncore.vcproj Log: 2.4.3c1 Modified: python/branches/release24-maint/Doc/commontex/boilerplate.tex ============================================================================== --- python/branches/release24-maint/Doc/commontex/boilerplate.tex (original) +++ python/branches/release24-maint/Doc/commontex/boilerplate.tex Thu Mar 23 03:20:57 2006 @@ -5,5 +5,5 @@ Email: \email{docs at python.org} } -\date{28 September 2005} % XXX update before final release! +\date{23 March 2006} % XXX update before final release! \input{patchlevel} % include Python version information Modified: python/branches/release24-maint/Doc/commontex/license.tex ============================================================================== --- python/branches/release24-maint/Doc/commontex/license.tex (original) +++ python/branches/release24-maint/Doc/commontex/license.tex Thu Mar 23 03:20:57 2006 @@ -49,6 +49,7 @@ \linev{2.4}{2.3}{2004}{PSF}{yes} \linev{2.4.1}{2.4}{2005}{PSF}{yes} \linev{2.4.2}{2.4.1}{2005}{PSF}{yes} + \linev{2.4.3}{2.4.2}{2006}{PSF}{yes} \end{tablev} \note{GPL-compatible doesn't mean that we're distributing Modified: python/branches/release24-maint/LICENSE ============================================================================== --- python/branches/release24-maint/LICENSE (original) +++ python/branches/release24-maint/LICENSE Thu Mar 23 03:20:57 2006 @@ -51,6 +51,7 @@ 2.4 2.3 2004 PSF yes 2.4.1 2.4.1 2005 PSF yes 2.4.2 2.4.1 2005 PSF yes + 2.4.3 2.4.2 2006 PSF yes Footnotes: Modified: python/branches/release24-maint/Lib/idlelib/NEWS.txt ============================================================================== --- python/branches/release24-maint/Lib/idlelib/NEWS.txt (original) +++ python/branches/release24-maint/Lib/idlelib/NEWS.txt Thu Mar 23 03:20:57 2006 @@ -1,7 +1,7 @@ -What's New in IDLE 1.1.3? -========================= +What's New in IDLE 1.1.3c1? +=========================== -*Release date: +*Release date: 23-MAR-2006* - Source file f.flush() after writing; trying to avoid lossage if user kills GUI. Reported by Bruce Sherwood. Modified: python/branches/release24-maint/Lib/idlelib/idlever.py ============================================================================== --- python/branches/release24-maint/Lib/idlelib/idlever.py (original) +++ python/branches/release24-maint/Lib/idlelib/idlever.py Thu Mar 23 03:20:57 2006 @@ -1 +1 @@ -IDLE_VERSION = "1.1.2" +IDLE_VERSION = "1.1.3" Modified: python/branches/release24-maint/Misc/RPM/python-2.4.spec ============================================================================== --- python/branches/release24-maint/Misc/RPM/python-2.4.spec (original) +++ python/branches/release24-maint/Misc/RPM/python-2.4.spec Thu Mar 23 03:20:57 2006 @@ -33,7 +33,7 @@ ################################# %define name python -%define version 2.4.2 +%define version 2.4.3c1 %define libvers 2.4 %define release 1pydotorg %define __prefix /usr Modified: python/branches/release24-maint/PCbuild/BUILDno.txt ============================================================================== --- python/branches/release24-maint/PCbuild/BUILDno.txt (original) +++ python/branches/release24-maint/PCbuild/BUILDno.txt Thu Mar 23 03:20:57 2006 @@ -33,6 +33,8 @@ Windows Python BUILD numbers ---------------------------- + 68 2.4.3c1 + 23-Mar-2006 67 2.4.2 28-Sep-2005 66 2.4.2c1 Modified: python/branches/release24-maint/PCbuild/pythoncore.vcproj ============================================================================== --- python/branches/release24-maint/PCbuild/pythoncore.vcproj (original) +++ python/branches/release24-maint/PCbuild/pythoncore.vcproj Thu Mar 23 03:20:57 2006 @@ -1385,7 +1385,7 @@ Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=67"/> + PreprocessorDefinitions="BUILD=68"/> @@ -1393,7 +1393,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=67"/> + PreprocessorDefinitions="BUILD=68"/> @@ -1401,7 +1401,7 @@ Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" - PreprocessorDefinitions="BUILD=67"/> + PreprocessorDefinitions="BUILD=68"/> Author: anthony.baxter Date: Thu Mar 23 03:21:49 2006 New Revision: 43231 Modified: python/branches/release24-maint/ (props changed) python/branches/release24-maint/Lib/ (props changed) python/branches/release24-maint/Lib/bsddb/ (props changed) python/branches/release24-maint/Lib/compiler/ (props changed) python/branches/release24-maint/Lib/curses/ (props changed) python/branches/release24-maint/Lib/distutils/ (props changed) python/branches/release24-maint/Lib/distutils/command/ (props changed) python/branches/release24-maint/Lib/distutils/tests/ (props changed) python/branches/release24-maint/Lib/email/ (props changed) python/branches/release24-maint/Lib/email/test/ (props changed) python/branches/release24-maint/Lib/encodings/ (props changed) python/branches/release24-maint/Lib/hotshot/ (props changed) python/branches/release24-maint/Lib/lib-tk/ (props changed) python/branches/release24-maint/Lib/logging/ (props changed) python/branches/release24-maint/Lib/test/ (props changed) python/branches/release24-maint/Lib/xml/ (props changed) python/branches/release24-maint/Lib/xml/dom/ (props changed) python/branches/release24-maint/Lib/xml/parsers/ (props changed) python/branches/release24-maint/Lib/xml/sax/ (props changed) Log: update svn:ignore across the board From python-checkins at python.org Thu Mar 23 03:22:33 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:22:33 +0100 (CET) Subject: [Python-checkins] r43232 - python/tags/r243c1 Message-ID: <20060323022233.094231E400A@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:22:32 2006 New Revision: 43232 Added: python/tags/r243c1/ - copied from r43231, python/branches/release24-maint/ Log: Tagging for 2.4.3c1 From python-checkins at python.org Thu Mar 23 03:25:51 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:25:51 +0100 (CET) Subject: [Python-checkins] r43233 - python/tags/r243c1 Message-ID: <20060323022551.446911E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:25:51 2006 New Revision: 43233 Removed: python/tags/r243c1/ Log: take2... From python-checkins at python.org Thu Mar 23 03:26:08 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:26:08 +0100 (CET) Subject: [Python-checkins] r43234 - in python/branches/release24-maint: .cvsignore Demo/embed Demo/embed/.cvsignore Doc Doc/.cvsignore Doc/api Doc/api/.cvsignore Doc/commontex Doc/commontex/.cvsignore Doc/dist Doc/dist/.cvsignore Doc/ext Doc/ext/.cvsignore Doc/html Doc/html/.cvsignore Doc/info Doc/info/.cvsignore Doc/isilo Doc/isilo/.cvsignore Doc/lib Doc/lib/.cvsignore Doc/mac Doc/mac/.cvsignore Doc/paper-a4 Doc/paper-a4/.cvsignore Doc/paper-letter Doc/paper-letter/.cvsignore Doc/ref Doc/ref/.cvsignore Doc/tut Doc/tut/.cvsignore Grammar Grammar/.cvsignore Mac/OSX Mac/OSX/.cvsignore Mac/OSX/PythonLauncher Mac/OSX/PythonLauncher/.cvsignore Mac/OSX/PythonLauncher/PythonLauncher.pbproj Mac/OSX/PythonLauncher/PythonLauncher.pbproj/.cvsignore Modules Modules/.cvsignore Objects Objects/.cvsignore PC PC/.cvsignore PC/VC6 PC/VC6/.cvsignore PC/bdist_wininst PC/bdist_wininst/.cvsignore PC/example_nt PC/example_nt/.cvsignore PCbuild PCbuild/.cvsignore Parser Parser/.cvsignore Python Python/.cvsignore Tools/freeze Tools/freeze/.cvsignore Message-ID: <20060323022608.3BEFF1E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:26:07 2006 New Revision: 43234 Removed: python/branches/release24-maint/.cvsignore python/branches/release24-maint/Demo/embed/.cvsignore python/branches/release24-maint/Doc/.cvsignore python/branches/release24-maint/Doc/api/.cvsignore python/branches/release24-maint/Doc/commontex/.cvsignore python/branches/release24-maint/Doc/dist/.cvsignore python/branches/release24-maint/Doc/ext/.cvsignore python/branches/release24-maint/Doc/html/.cvsignore python/branches/release24-maint/Doc/info/.cvsignore python/branches/release24-maint/Doc/isilo/.cvsignore python/branches/release24-maint/Doc/lib/.cvsignore python/branches/release24-maint/Doc/mac/.cvsignore python/branches/release24-maint/Doc/paper-a4/.cvsignore python/branches/release24-maint/Doc/paper-letter/.cvsignore python/branches/release24-maint/Doc/ref/.cvsignore python/branches/release24-maint/Doc/tut/.cvsignore python/branches/release24-maint/Grammar/.cvsignore python/branches/release24-maint/Mac/OSX/.cvsignore python/branches/release24-maint/Mac/OSX/PythonLauncher/.cvsignore python/branches/release24-maint/Mac/OSX/PythonLauncher/PythonLauncher.pbproj/.cvsignore python/branches/release24-maint/Modules/.cvsignore python/branches/release24-maint/Objects/.cvsignore python/branches/release24-maint/PC/.cvsignore python/branches/release24-maint/PC/VC6/.cvsignore python/branches/release24-maint/PC/bdist_wininst/.cvsignore python/branches/release24-maint/PC/example_nt/.cvsignore python/branches/release24-maint/PCbuild/.cvsignore python/branches/release24-maint/Parser/.cvsignore python/branches/release24-maint/Python/.cvsignore python/branches/release24-maint/Tools/freeze/.cvsignore Modified: python/branches/release24-maint/ (props changed) python/branches/release24-maint/Demo/embed/ (props changed) python/branches/release24-maint/Doc/ (props changed) python/branches/release24-maint/Doc/api/ (props changed) python/branches/release24-maint/Doc/commontex/ (props changed) python/branches/release24-maint/Doc/dist/ (props changed) python/branches/release24-maint/Doc/ext/ (props changed) python/branches/release24-maint/Doc/html/ (props changed) python/branches/release24-maint/Doc/info/ (props changed) python/branches/release24-maint/Doc/isilo/ (props changed) python/branches/release24-maint/Doc/lib/ (props changed) python/branches/release24-maint/Doc/mac/ (props changed) python/branches/release24-maint/Doc/paper-a4/ (props changed) python/branches/release24-maint/Doc/paper-letter/ (props changed) python/branches/release24-maint/Doc/ref/ (props changed) python/branches/release24-maint/Doc/tut/ (props changed) python/branches/release24-maint/Grammar/ (props changed) python/branches/release24-maint/Mac/OSX/ (props changed) python/branches/release24-maint/Mac/OSX/PythonLauncher/ (props changed) python/branches/release24-maint/Mac/OSX/PythonLauncher/PythonLauncher.pbproj/ (props changed) python/branches/release24-maint/Modules/ (props changed) python/branches/release24-maint/Objects/ (props changed) python/branches/release24-maint/PC/ (props changed) python/branches/release24-maint/PC/VC6/ (props changed) python/branches/release24-maint/PC/bdist_wininst/ (props changed) python/branches/release24-maint/PC/example_nt/ (props changed) python/branches/release24-maint/PCbuild/ (props changed) python/branches/release24-maint/Parser/ (props changed) python/branches/release24-maint/Python/ (props changed) python/branches/release24-maint/Tools/freeze/ (props changed) Log: update - still some old .cvsignore files lying around Deleted: /python/branches/release24-maint/.cvsignore ============================================================================== --- /python/branches/release24-maint/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,11 +0,0 @@ -.purify -config.log -config.cache -config.status -Makefile -buildno -python -build -Makefile.pre -platform -pyconfig.h Deleted: /python/branches/release24-maint/Demo/embed/.cvsignore ============================================================================== --- /python/branches/release24-maint/Demo/embed/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -demo -loop -importexc Deleted: /python/branches/release24-maint/Doc/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,6 +0,0 @@ -*.tgz -*.tar.bz2 -*.zip -*.tar -pkglist.html -.doctype Deleted: /python/branches/release24-maint/Doc/api/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/api/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/commontex/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/commontex/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1 +0,0 @@ -patchlevel.tex Deleted: /python/branches/release24-maint/Doc/dist/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/dist/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/ext/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/ext/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/html/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/html/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,14 +0,0 @@ -api -doc -ext -lib -mac -ref -tut -dist -inst -whatsnew -acks.html -index.html -modindex.html - at webchecker.pickle Deleted: /python/branches/release24-maint/Doc/info/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/info/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,2 +0,0 @@ -*.info* -*.texi Deleted: /python/branches/release24-maint/Doc/isilo/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/isilo/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,11 +0,0 @@ -api -doc -ext -lib -mac -ref -tut -dist -inst -whatsnew -python-*.pdb Deleted: /python/branches/release24-maint/Doc/lib/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/lib/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/mac/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/mac/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/paper-a4/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/paper-a4/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,16 +0,0 @@ -*.ind -*.log -*.aux -*.dvi -*.toc -*.ps -*.idx -*.ilg -*.pdf -*.bkm -*.syn -*.pla -*.l2h -*.how -README -*.tex Deleted: /python/branches/release24-maint/Doc/paper-letter/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/paper-letter/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,16 +0,0 @@ -*.ind -*.log -*.aux -*.dvi -*.toc -*.ps -*.idx -*.ilg -*.pdf -*.bkm -*.syn -*.pla -*.l2h -*.how -README -*.tex Deleted: /python/branches/release24-maint/Doc/ref/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/ref/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Doc/tut/.cvsignore ============================================================================== --- /python/branches/release24-maint/Doc/tut/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -*.esis -*.esis1 -*.xml Deleted: /python/branches/release24-maint/Grammar/.cvsignore ============================================================================== --- /python/branches/release24-maint/Grammar/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -graminit.h -graminit.c -Makefile Deleted: /python/branches/release24-maint/Mac/OSX/.cvsignore ============================================================================== --- /python/branches/release24-maint/Mac/OSX/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,4 +0,0 @@ -build -build-html -Mac.jaguar.pth -pythonw.sh Deleted: /python/branches/release24-maint/Mac/OSX/PythonLauncher/.cvsignore ============================================================================== --- /python/branches/release24-maint/Mac/OSX/PythonLauncher/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1 +0,0 @@ -build Deleted: /python/branches/release24-maint/Mac/OSX/PythonLauncher/PythonLauncher.pbproj/.cvsignore ============================================================================== --- /python/branches/release24-maint/Mac/OSX/PythonLauncher/PythonLauncher.pbproj/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1 +0,0 @@ -*.pbxuser Deleted: /python/branches/release24-maint/Modules/.cvsignore ============================================================================== --- /python/branches/release24-maint/Modules/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,9 +0,0 @@ -Setup -Makefile.pre -Setup.thread -Setup.config -Setup.local -hassignal -config.c -Makefile -add2lib Deleted: /python/branches/release24-maint/Objects/.cvsignore ============================================================================== --- /python/branches/release24-maint/Objects/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,2 +0,0 @@ -add2lib -Makefile Deleted: /python/branches/release24-maint/PC/.cvsignore ============================================================================== --- /python/branches/release24-maint/PC/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,2 +0,0 @@ -pythonnt_rc.h -pythonnt_rc_d.h Deleted: /python/branches/release24-maint/PC/VC6/.cvsignore ============================================================================== --- /python/branches/release24-maint/PC/VC6/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,14 +0,0 @@ -*.WSM -*.bsc -*.dbg -*.dll -*.exe -*.exp -*.ilk -*.lib -*.ncb -*.opt -*.pdb -*.plg -*.pyd -*-temp-* Deleted: /python/branches/release24-maint/PC/bdist_wininst/.cvsignore ============================================================================== --- /python/branches/release24-maint/PC/bdist_wininst/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,8 +0,0 @@ -temp-debug -temp-release -wininst-7.1.ncb -wininst-7.1.suo -wininst.ncb -wininst.opt -wininst.pdb -wininst.plg Deleted: /python/branches/release24-maint/PC/example_nt/.cvsignore ============================================================================== --- /python/branches/release24-maint/PC/example_nt/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,5 +0,0 @@ -? example.ncb -? release -? debug -? .c -? example.mdp Deleted: /python/branches/release24-maint/PCbuild/.cvsignore ============================================================================== --- /python/branches/release24-maint/PCbuild/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,29 +0,0 @@ -*.WSM -*.bsc -*.dbg -*.dll -*.exe -*.exp -*.ilk -*.lib -*.ncb -*.opt -*.pdb -*.plg -*.pyd -*-temp-* -*.suo -NormalizationTest-3.2.0.txt -JOHAB.TXT -EUC-KR.TXT -EUC-JP.TXT -EUC-JISX0213.TXT -EUC-CN.TXT -CP950.TXT -CP949.TXT -CP936.TXT -CP932.TXT -BIG5HKSCS.TXT -BIG5.TXT -SHIFT_JISX0213.TXT -SHIFTJIS.TXT Deleted: /python/branches/release24-maint/Parser/.cvsignore ============================================================================== --- /python/branches/release24-maint/Parser/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,3 +0,0 @@ -Makefile -pgen -add2lib Deleted: /python/branches/release24-maint/Python/.cvsignore ============================================================================== --- /python/branches/release24-maint/Python/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,2 +0,0 @@ -Makefile -add2lib Deleted: /python/branches/release24-maint/Tools/freeze/.cvsignore ============================================================================== --- /python/branches/release24-maint/Tools/freeze/.cvsignore Thu Mar 23 03:26:07 2006 +++ (empty file) @@ -1,6 +0,0 @@ -M_*.c -*.o -Makefile -config.c -frozen.c -hello From python-checkins at python.org Thu Mar 23 03:26:32 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:26:32 +0100 (CET) Subject: [Python-checkins] r43235 - python/tags/r243c1 Message-ID: <20060323022632.87F8C1E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:26:32 2006 New Revision: 43235 Added: python/tags/r243c1/ - copied from r43234, python/branches/release24-maint/ Log: 2.4.3c1 From python-checkins at python.org Thu Mar 23 03:49:17 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:49:17 +0100 (CET) Subject: [Python-checkins] r43236 - python/branches/release24-maint/Include/patchlevel.h Message-ID: <20060323024917.7A88E1E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:49:17 2006 New Revision: 43236 Modified: python/branches/release24-maint/Include/patchlevel.h Log: aarrrrghhh Modified: python/branches/release24-maint/Include/patchlevel.h ============================================================================== --- python/branches/release24-maint/Include/patchlevel.h (original) +++ python/branches/release24-maint/Include/patchlevel.h Thu Mar 23 03:49:17 2006 @@ -23,7 +23,7 @@ #define PY_MINOR_VERSION 4 #define PY_MICRO_VERSION 3 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA -#define PY_RELEASE_SERIAL 0 +#define PY_RELEASE_SERIAL 1 /* Version as a string */ #define PY_VERSION "2.4.3c1" From python-checkins at python.org Thu Mar 23 03:49:35 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:49:35 +0100 (CET) Subject: [Python-checkins] r43237 - python/tags/r243c1 Message-ID: <20060323024935.854DF1E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:49:35 2006 New Revision: 43237 Removed: python/tags/r243c1/ Log: take 3 From python-checkins at python.org Thu Mar 23 03:50:36 2006 From: python-checkins at python.org (anthony.baxter) Date: Thu, 23 Mar 2006 03:50:36 +0100 (CET) Subject: [Python-checkins] r43238 - python/tags/r243c1 Message-ID: <20060323025036.B2A6A1E4009@bag.python.org> Author: anthony.baxter Date: Thu Mar 23 03:50:34 2006 New Revision: 43238 Added: python/tags/r243c1/ - copied from r43237, python/branches/release24-maint/ Log: 2.4.3c1 From neal at metaslash.com Thu Mar 23 03:50:11 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 22 Mar 2006 21:50:11 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) Message-ID: <20060323025011.GA24753@python.psfb.org> TEXINPUTS=/home/neal/python/r24/Doc/commontex: python /home/neal/python/r24/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/api api/api.tex *** Session transcript and error messages are in /home/neal/python/r24/Doc/html/api/api.how. *** Exited with status 1. The relevant lines from the transcript are: ------------------------------------------------------------------------ +++ latex api This is TeX, Version 3.14159 (Web2C 7.4.5) (/home/neal/python/r24/Doc/api/api.tex LaTeX2e <2001/06/01> Babel and hyphenation patterns for american, french, german, ngerman, n ohyphenation, loaded. (/home/neal/python/r24/Doc/texinputs/manual.cls Document Class: manual 1998/03/03 Document class (Python manual) (/home/neal/python/r24/Doc/texinputs/pypaper.sty (/usr/share/texmf/tex/latex/psnfss/times.sty) Using Times instead of Computer Modern. ) (/usr/share/texmf/tex/latex/misc/fancybox.sty Style option: `fancybox' v1.3 <2000/09/19> (tvz) ) (/usr/share/texmf/tex/latex/base/report.cls Document Class: report 2001/04/21 v1.4e Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) (/home/neal/python/r24/Doc/texinputs/fancyhdr.sty) Using fancier footers than usual. (/home/neal/python/r24/Doc/texinputs/fncychap.sty) Using fancy chapter headings. (/home/neal/python/r24/Doc/texinputs/python.sty (/usr/share/texmf/tex/latex/tools/longtable.sty) (/usr/share/texmf/tex/latex/tools/verbatim.sty) (/usr/share/texmf/tex/latex/base/alltt.sty))) (/home/neal/python/r24/Doc/commontex/boilerplate.tex ! LaTeX Error: Missing \begin{document}. See the LaTeX manual or LaTeX Companion for explanation. Type H for immediate help. ... l.8 < <<<<<< .mine ? ! Emergency stop. ... l.8 < <<<<<< .mine No pages of output. Transcript written on api.log. *** Session transcript and error messages are in /home/neal/python/r24/Doc/html/api/api.how. *** Exited with status 1. +++ TEXINPUTS=/home/neal/python/r24/Doc/api:/home/neal/python/r24/Doc/commontex:/home/neal/python/r24/Doc/paper-letter:/home/neal/python/r24/Doc/texinputs: +++ latex api make: *** [html/api/api.html] Error 1 From fdrake at acm.org Thu Mar 23 04:20:45 2006 From: fdrake at acm.org (Fred L. Drake, Jr.) Date: Wed, 22 Mar 2006 22:20:45 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) In-Reply-To: <20060323025011.GA24753@python.psfb.org> References: <20060323025011.GA24753@python.psfb.org> Message-ID: <200603222220.45436.fdrake@acm.org> On Wednesday 22 March 2006 21:50, Neal Norwitz wrote: ... > --dir html/api api/api.tex *** Session transcript and error messages are > in /home/neal/python/r24/Doc/html/api/api.how. *** Exited with status 1. > The relevant lines from the transcript are: > ------------------------------------------------------------------------ > +++ latex api ... > (/home/neal/python/r24/Doc/commontex/boilerplate.tex > > ! LaTeX Error: Missing \begin{document}. > > See the LaTeX manual or LaTeX Companion for explanation. > Type H for immediate help. > ... > > l.8 < > <<<<<< .mine > ? > ! Emergency stop. > ... > > l.8 < > <<<<<< .mine I don't know what happened here. I just built the complete set of docs for 2.4.3c1 from Anthony's third tag (a fresh checkout), and had no problems whatsoever. I've got a doc build running on the release24-maint branch now. -Fred -- Fred L. Drake, Jr. From fdrake at acm.org Thu Mar 23 04:26:49 2006 From: fdrake at acm.org (Fred L. Drake, Jr.) Date: Wed, 22 Mar 2006 22:26:49 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) In-Reply-To: <200603222220.45436.fdrake@acm.org> References: <20060323025011.GA24753@python.psfb.org> <200603222220.45436.fdrake@acm.org> Message-ID: <200603222226.49455.fdrake@acm.org> On Wednesday 22 March 2006 22:20, Fred L. Drake, Jr. wrote: > On Wednesday 22 March 2006 21:50, Neal Norwitz wrote: > > l.8 < > > <<<<<< .mine > > ? > > ! Emergency stop. > > ... > > > > l.8 < > > <<<<<< .mine > > I don't know what happened here. I just built the complete set of docs > for 2.4.3c1 from Anthony's third tag (a fresh checkout), and had no > problems whatsoever. I've got a doc build running on the release24-maint > branch now. Ok, no problems with that build. Actually, it does look a lot like LaTeX is choking on a merge turd. There shouldn't be any of those checked in. :-) There aren't any in my checkouts. -Fred -- Fred L. Drake, Jr. From nnorwitz at gmail.com Thu Mar 23 04:50:28 2006 From: nnorwitz at gmail.com (Neal Norwitz) Date: Wed, 22 Mar 2006 19:50:28 -0800 Subject: [Python-checkins] Python Regression Test Failures doc (1) In-Reply-To: <200603222226.49455.fdrake@acm.org> References: <20060323025011.GA24753@python.psfb.org> <200603222220.45436.fdrake@acm.org> <200603222226.49455.fdrake@acm.org> Message-ID: On 3/22/06, Fred L. Drake, Jr. wrote: > > > > I don't know what happened here. I just built the complete set of docs > > for 2.4.3c1 from Anthony's third tag (a fresh checkout), and had no > > problems whatsoever. I've got a doc build running on the release24-maint > > branch now. > > Ok, no problems with that build. > > Actually, it does look a lot like LaTeX is choking on a merge turd. There > shouldn't be any of those checked in. :-) There aren't any in my checkouts. Ah, I bet I know what happened. I had an outstanding change to force today's date in the doc, rather than the last released date and that was a conflict. I'll fix it when I get home. n From neal at metaslash.com Thu Mar 23 04:50:06 2006 From: neal at metaslash.com (Neal Norwitz) Date: Wed, 22 Mar 2006 22:50:06 -0500 Subject: [Python-checkins] Python Regression Test Failures doc (1) Message-ID: <20060323035006.GA5742@python.psfb.org> TEXINPUTS=/home/neal/python/r24/Doc/commontex: python /home/neal/python/r24/Doc/tools/mkhowto --html --about html/stdabout.dat --iconserver ../icons --favicon ../icons/pyfav.png --address "See About this document... for information on suggesting changes." --up-link ../index.html --up-title "Python Documentation Index" --global-module-index "../modindex.html" --dvips-safe --dir html/api api/api.tex *** Session transcript and error messages are in /home/neal/python/r24/Doc/html/api/api.how. *** Exited with status 1. The relevant lines from the transcript are: ------------------------------------------------------------------------ +++ latex api This is TeX, Version 3.14159 (Web2C 7.4.5) (/home/neal/python/r24/Doc/api/api.tex LaTeX2e <2001/06/01> Babel and hyphenation patterns for american, french, german, ngerman, n ohyphenation, loaded. (/home/neal/python/r24/Doc/texinputs/manual.cls Document Class: manual 1998/03/03 Document class (Python manual) (/home/neal/python/r24/Doc/texinputs/pypaper.sty (/usr/share/texmf/tex/latex/psnfss/times.sty) Using Times instead of Computer Modern. ) (/usr/share/texmf/tex/latex/misc/fancybox.sty Style option: `fancybox' v1.3 <2000/09/19> (tvz) ) (/usr/share/texmf/tex/latex/base/report.cls Document Class: report 2001/04/21 v1.4e Standard LaTeX document class (/usr/share/texmf/tex/latex/base/size10.clo)) (/home/neal/python/r24/Doc/texinputs/fancyhdr.sty) Using fancier footers than usual. (/home/neal/python/r24/Doc/texinputs/fncychap.sty) Using fancy chapter headings. (/home/neal/python/r24/Doc/texinputs/python.sty (/usr/share/texmf/tex/latex/tools/longtable.sty) (/usr/share/texmf/tex/latex/tools/verbatim.sty) (/usr/share/texmf/tex/latex/base/alltt.sty))) (/home/neal/python/r24/Doc/commontex/boilerplate.tex ! LaTeX Error: Missing \begin{document}. See the LaTeX manual or LaTeX Companion for explanation. Type H for immediate help. ... l.8 < <<<<<< .mine ? ! Emergency stop. ... l.8 < <<<<<< .mine No pages of output. Transcript written on api.log. *** Session transcript and error messages are in /home/neal/python/r24/Doc/html/api/api.how. *** Exited with status 1. +++ TEXINPUTS=/home/neal/python/r24/Doc/api:/home/neal/python/r24/Doc/commontex:/home/neal/python/r24/Doc/paper-letter:/home/neal/python/r24/Doc/texinputs: +++ latex api make: *** [html/api/api.html] Error 1 From python-checkins at python.org Thu Mar 23 05:23:24 2006 From: python-checkins at python.org (david.goodger) Date: Thu, 23 Mar 2006 05:23:24 +0100 (CET) Subject: [Python-checkins] r43239 - peps/trunk/pep2pyramid.py Message-ID: <20060323042324.F16161E4009@bag.python.org> Author: david.goodger Date: Thu Mar 23 05:23:24 2006 New Revision: 43239 Modified: peps/trunk/pep2pyramid.py Log: fixed PEP references; removed unused options; updated Docutils support Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Thu Mar 23 05:23:24 2006 @@ -1,29 +1,14 @@ #!/usr/bin/env python -"""Convert PEPs to (X)HTML - courtesy of /F +""" +Convert PEPs to (X)HTML fragments for Pyramid - courtesy of /F Usage: %(PROGRAM)s [options] [ ...] Options: --u, --user - python.org username - --b, --browse - After generating the HTML, direct your web browser to view it - (using the Python webbrowser module). If both -i and -b are - given, this will browse the on-line HTML; otherwise it will - browse the local HTML. If no pep arguments are given, this - will browse PEP 0. - --i, --install - After generating the HTML, install it and the plaintext source file - (.txt) on python.org. In that case the user's name is used in the scp - and ssh commands, unless "-u username" is given (in which case, it is - used instead). Without -i, -u is ignored. - --l, --local - Same as -i/--install, except install on the local machine. Use this - when logged in to the python.org machine (dinsdale). +-d , --destdir + Specify the base destination directory for Pyramid files. + Default: /data/ftp.python.org/pub/beta.python.org/build/data/dev/peps -q, --quiet Turn off verbose messages. @@ -34,8 +19,6 @@ The optional arguments ``peps`` are either pep numbers or .txt files. """ -destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/dev/peps' - import sys import os import re @@ -47,17 +30,17 @@ import time import shutil +destDirBase = '/data/ftp.python.org/pub/beta.python.org/build/data/dev/peps' + REQUIRES = {'python': '2.2', - 'docutils': '0.2.7'} + 'docutils': '0.5'} PROGRAM = sys.argv[0] RFCURL = 'http://www.faqs.org/rfcs/rfc%d.html' -PEPURL = 'pep-%04d.html' -PEPCVSURL = ('http://svn.python.org/view/peps/trunk/pep-%04d.txt') -PEPDIRRUL = 'http://www.python.org/peps/' +PEPURL = '/dev/peps/pep-%04d.html' +PEPCVSURL = 'http://svn.python.org/view/*checkout*/peps/trunk/pep-%04d.txt' +PEPDIRURL = 'http://www.python.org/dev/peps/' -HOST = "dinsdale.python.org" # host for update -HDIR = "/data/ftp.python.org/pub/www.python.org/peps" # target host directory LOCALVARS = "Local Variables:" COMMENT = """""" # The generated HTML doesn't validate -- you cannot use
      and

      inside #
       tags.  But if I change that, the result doesn't look very nice...
      -DTD = ('')
       
       fixpat = re.compile("((https?|ftp):[-_a-zA-Z0-9/.+~:?#$=&,]+)|(pep-\d+(.txt)?)|"
                           "(RFC[- ]?(?P\d+))|"
      @@ -179,6 +177,7 @@
           if pep:
               title = "PEP " + pep + " -- " + title
           r = random.choice(range(64))
      +    print >> outfile, COMMENT
           print >> outfile, '
      \n' for k, v in header: if k.lower() in ('author', 'discussions-to'): Modified: peps/trunk/pyramid-pep-template ============================================================================== --- peps/trunk/pyramid-pep-template (original) +++ peps/trunk/pyramid-pep-template Thu Mar 23 15:28:55 2006 @@ -1 +1,6 @@ + %(body)s From python-checkins at python.org Thu Mar 23 15:29:53 2006 From: python-checkins at python.org (david.goodger) Date: Thu, 23 Mar 2006 15:29:53 +0100 (CET) Subject: [Python-checkins] r43252 - peps/trunk Message-ID: <20060323142953.001981E400A@bag.python.org> Author: david.goodger Date: Thu Mar 23 15:29:53 2006 New Revision: 43252 Modified: peps/trunk/ (props changed) Log: Docutils update From python-checkins at python.org Thu Mar 23 17:39:58 2006 From: python-checkins at python.org (david.goodger) Date: Thu, 23 Mar 2006 17:39:58 +0100 (CET) Subject: [Python-checkins] r43253 - peps/trunk/pep-0356.txt Message-ID: <20060323163958.DE9131E400A@bag.python.org> Author: david.goodger Date: Thu Mar 23 17:39:58 2006 New Revision: 43253 Modified: peps/trunk/pep-0356.txt Log: checking build process Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Thu Mar 23 17:39:58 2006 @@ -144,4 +144,7 @@ Local Variables: mode: indented-text indent-tabs-mode: nil +sentence-end-double-space: t +fill-column: 70 +coding: utf-8 End: From python-checkins at python.org Thu Mar 23 18:04:16 2006 From: python-checkins at python.org (david.goodger) Date: Thu, 23 Mar 2006 18:04:16 +0100 (CET) Subject: [Python-checkins] r43254 - peps/trunk/pep-0356.txt Message-ID: <20060323170416.466781E400A@bag.python.org> Author: david.goodger Date: Thu Mar 23 18:04:15 2006 New Revision: 43254 Modified: peps/trunk/pep-0356.txt Log: added Last-Modified header Modified: peps/trunk/pep-0356.txt ============================================================================== --- peps/trunk/pep-0356.txt (original) +++ peps/trunk/pep-0356.txt Thu Mar 23 18:04:15 2006 @@ -1,6 +1,7 @@ PEP: 356 Title: Python 2.5 Release Schedule Version: $Revision$ +Last-Modified: $Date$ Author: Neal Norwitz, GvR, Anthony Baxter Status: Draft Type: Informational From python-checkins at python.org Thu Mar 23 19:16:44 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 23 Mar 2006 19:16:44 +0100 (CET) Subject: [Python-checkins] r43255 - python/trunk/Lib/test/test_quopri.py Message-ID: <20060323181644.290941E400A@bag.python.org> Author: martin.v.loewis Date: Thu Mar 23 19:16:43 2006 New Revision: 43255 Modified: python/trunk/Lib/test/test_quopri.py Log: Rewrite pipe code using subprocess, to make sure the child process is closed when the test completes. Modified: python/trunk/Lib/test/test_quopri.py ============================================================================== --- python/trunk/Lib/test/test_quopri.py (original) +++ python/trunk/Lib/test/test_quopri.py Thu Mar 23 19:16:43 2006 @@ -1,7 +1,7 @@ from test import test_support import unittest -import sys, os, cStringIO +import sys, os, cStringIO, subprocess import quopri @@ -176,17 +176,17 @@ def test_scriptencode(self): (p, e) = self.STRINGS[-1] - (cin, cout) = os.popen2("%s -mquopri" % sys.executable) - cin.write(p) - cin.close() - self.assert_(cout.read() == e) + process = subprocess.Popen([sys.executable, "-mquopri"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + cout, cerr = process.communicate(p) + self.assert_(cout == e) def test_scriptdecode(self): (p, e) = self.STRINGS[-1] - (cin, cout) = os.popen2("%s -mquopri -d" % sys.executable) - cin.write(e) - cin.close() - self.assert_(cout.read() == p) + process = subprocess.Popen([sys.executable, "-mquopri", "-d"], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + cout, cerr = process.communicate(e) + self.assert_(cout == p) def test_main(): test_support.run_unittest(QuopriTestCase) From python-checkins at python.org Thu Mar 23 19:18:36 2006 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 23 Mar 2006 19:18:36 +0100 (CET) Subject: [Python-checkins] r43256 - in python/trunk: Lib/popen2.py Misc/NEWS Message-ID: <20060323181836.550161E400A@bag.python.org> Author: martin.v.loewis Date: Thu Mar 23 19:18:35 2006 New Revision: 43256 Modified: python/trunk/Lib/popen2.py python/trunk/Misc/NEWS Log: Preserve command name, for later printing of active commands. If there are active commands when the tests start, fail, printing these commands. Modified: python/trunk/Lib/popen2.py ============================================================================== --- python/trunk/Lib/popen2.py (original) +++ python/trunk/Lib/popen2.py Thu Mar 23 19:18:35 2006 @@ -39,6 +39,7 @@ specified, it specifies the size of the I/O buffers to/from the child process.""" _cleanup() + self.cmd = cmd p2cread, p2cwrite = os.pipe() c2pread, c2pwrite = os.pipe() if capturestderr: @@ -186,6 +187,9 @@ __all__.extend(["Popen3", "Popen4"]) def _test(): + # When the test runs, there shouldn't be any open pipes + _cleanup() + assert not _active, "Active pipes when test starts " + repr([c.cmd for c in _active]) cmd = "cat" teststr = "ab cd\n" if os.name == "nt": Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Thu Mar 23 19:18:35 2006 @@ -483,6 +483,8 @@ Library ------- +- popen2.Popen objects now preserve the command in a .cmd attribute. + - Added the ctypes ffi package. - email 4.0 package now integrated. This is largely the same as the email 3.0 From python-checkins at python.org Thu Mar 23 19:45:55 2006 From: python-checkins at python.org (david.goodger) Date: Thu, 23 Mar 2006 19:45:55 +0100 (CET) Subject: [Python-checkins] r43257 - peps/trunk/pep2pyramid.py Message-ID: <20060323184555.94A631E400A@bag.python.org> Author: david.goodger Date: Thu Mar 23 19:45:55 2006 New Revision: 43257 Modified: peps/trunk/pep2pyramid.py Log: fixed encoding error by replacing all open() calls with codecs.open(), both on input and output (sheesh -- I shoulda known better) Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Thu Mar 23 19:45:55 2006 @@ -21,6 +21,7 @@ import sys import os +import codecs import re import cgi import glob @@ -57,6 +58,13 @@ "(PEP\s+(?P\d+))|" ".") +CONTENT_HTML = """\ + +' @@ -292,7 +297,7 @@ settings=docutils_settings, # Allow Docutils traceback if there's an exception: settings_overrides={'traceback': 1}) - outfile.write(parts['body']) + outfile.write(parts['whole']) title = 'PEP %s -- %s' % (parts['pepnum'], parts['title'][0]) return title @@ -365,6 +370,7 @@ # for PEP 0, copy body to parent directory as well if pepnum == '0000': shutil.copyfile(outpath, os.path.join(destDir, '..', 'body.html')) + copy_aux_files(inpath, destDir) return outpath def set_up_pyramid(inpath): @@ -401,6 +407,20 @@ fp.close() os.chmod(filename, 0664) +def copy_aux_files(pep_path, dest_dir): + """ + Copy auxiliary files whose names match 'pep-XXXX-*.*'. + """ + dirname, pepname = os.path.split(pep_path) + base, ext = os.path.splitext(pepname) + files = glob.glob(os.path.join(dirname, base) + '-*.*') + for path in files: + filename = os.path.basename(path) + dest_path = os.path.join(dest_dir, filename) + print '%s -> %s' % (path, dest_path) + shutil.copy(path, dest_path) + + PEP_TYPE_DISPATCH = {'text/plain': fixfile, 'text/x-rst': fix_rst_pep} @@ -466,25 +486,15 @@ verbose = 0 if args: - peptxt = [] - html = [] for pep in args: - file = find_pep(pep) - peptxt.append(file) - newfile = make_html(file, verbose=verbose) - if newfile: - html.append(newfile) + filename = find_pep(pep) + make_html(filename, verbose=verbose) else: # do them all - peptxt = [] - html = [] files = glob.glob("pep-*.txt") files.sort() - for file in files: - peptxt.append(file) - newfile = make_html(file, verbose=verbose) - if newfile: - html.append(newfile) + for filename in files: + make_html(filename, verbose=verbose) From python-checkins at python.org Fri Mar 24 04:06:17 2006 From: python-checkins at python.org (david.goodger) Date: Fri, 24 Mar 2006 04:06:17 +0100 (CET) Subject: [Python-checkins] r43266 - peps/trunk/docutils.conf Message-ID: <20060324030617.A5BCF1E401A@bag.python.org> Author: david.goodger Date: Fri Mar 24 04:06:17 2006 New Revision: 43266 Modified: peps/trunk/docutils.conf Log: removed www.python.org hostname from PEP base URL so mirrors work Modified: peps/trunk/docutils.conf ============================================================================== --- peps/trunk/docutils.conf (original) +++ peps/trunk/docutils.conf Fri Mar 24 04:06:17 2006 @@ -13,5 +13,9 @@ # link to the stylesheet; don't embed it embed-stylesheet: 0 + +# path to PEPs, for template: pep-home: /dev/peps/ -# pep-base-url: http://www.python.org/dev/peps/ + +# base URL for PEP references (no host so mirrors work): +pep-base-url: /dev/peps/ From python-checkins at python.org Fri Mar 24 04:14:55 2006 From: python-checkins at python.org (david.goodger) Date: Fri, 24 Mar 2006 04:14:55 +0100 (CET) Subject: [Python-checkins] r43267 - peps/trunk/pep2pyramid.py Message-ID: <20060324031455.5BC5C1E400A@bag.python.org> Author: david.goodger Date: Fri Mar 24 04:14:52 2006 New Revision: 43267 Modified: peps/trunk/pep2pyramid.py Log: changes from Martin Thomas: Added PEPANCHOR expression, removed trailing .html; shuffled around PEPURL etc.; removed http://www.python.org/ from URL (for mirrors) Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Fri Mar 24 04:14:52 2006 @@ -37,9 +37,10 @@ 'docutils': '0.5'} PROGRAM = sys.argv[0] RFCURL = 'http://www.faqs.org/rfcs/rfc%d.html' -PEPURL = '/dev/peps/pep-%04d' PEPCVSURL = 'http://svn.python.org/view/*checkout*/peps/trunk/pep-%04d.txt' -PEPDIRURL = 'http://www.python.org/dev/peps/' +PEPDIRURL = '/dev/peps/' +PEPURL = PEPDIRURL + 'pep-%04d' +PEPANCHOR = '%i' LOCALVARS = "Local Variables:" @@ -118,6 +119,8 @@ ltext.append(c) break link = EMPTYSTRING.join(ltext) + elif text.endswith('.txt') and text <> current: + link = PEPDIRURL + os.path.splitext(text)[0] + '/' + text elif text.startswith('pep-') and text <> current: link = os.path.splitext(text)[0] + ".html" elif text.startswith('PEP'): @@ -208,8 +211,7 @@ otherpeps = '' for otherpep in re.split(',?\s+', v): otherpep = int(otherpep) - otherpeps += '%i ' % (otherpep, - otherpep) + otherpeps += PEPANCHOR % (otherpep, otherpep) v = otherpeps elif k.lower() in ('last-modified',): date = v or time.strftime('%Y-%m-%d', From python-checkins at python.org Fri Mar 24 04:24:04 2006 From: python-checkins at python.org (david.goodger) Date: Fri, 24 Mar 2006 04:24:04 +0100 (CET) Subject: [Python-checkins] r43268 - peps/trunk/pep-0001.txt Message-ID: <20060324032404.BF6311E400A@bag.python.org> Author: david.goodger Date: Fri Mar 24 04:24:04 2006 New Revision: 43268 Modified: peps/trunk/pep-0001.txt Log: added Auxiliary Files section; updated URLs; updated text file description Modified: peps/trunk/pep-0001.txt ============================================================================== --- peps/trunk/pep-0001.txt (original) +++ peps/trunk/pep-0001.txt Fri Mar 24 04:24:04 2006 @@ -25,9 +25,9 @@ author is responsible for building consensus within the community and documenting dissenting opinions. -Because the PEPs are maintained as text files under CVS control, their -revision history is the historical record of the feature proposal -[1]_. +Because the PEPs are maintained as text files in a versioned +repository, their revision history is the historical record of the +feature proposal [1]_. PEP Types @@ -229,17 +229,16 @@ ========================= There are two PEP formats available to authors: plaintext and -reStructuredText_. +reStructuredText_. Both are UTF-8-encoded text files. -Plaintext PEPs are written in plain ASCII text, contain minimal -structural markup, and should adhere to a rigid style. PEP 9 contains -a boilerplate template [3]_ you can use to get started writing your -plaintext PEP. +Plaintext PEPs are written with minimal structural markup that adheres +to a rigid style. PEP 9 contains a instructions and a template [3]_ +you can use to get started writing your plaintext PEP. ReStructuredText_ PEPs allow for rich markup that is still quite easy to read, but results in much better-looking and more functional HTML. -PEP 12 contains a boilerplate template [4]_ for use with -reStructuredText PEPs. +PEP 12 contains instructions and a template [4]_ for reStructuredText +PEPs. There is a Python script that converts both styles of PEPs to HTML for viewing on the web [5]_. Parsing and conversion of plaintext PEPs is @@ -326,6 +325,15 @@ obsolete. +Auxiliary Files +=============== + +PEPs may include auxiliary files such as diagrams. Such files must be +named ``pep-XXXX-Y.ext``, where "XXXX" is the PEP number, "Y" is a +serial number (starting at 1), and "ext" is replaced by the actual +file extension (e.g. "png"). + + Reporting PEP Bugs, or Submitting PEP Updates ============================================= @@ -387,18 +395,18 @@ http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/nondist/peps/ .. [2] PEP 2, Procedure for Adding New Modules, Faassen - (http://www.python.org/peps/pep-0002.html) + (http://www.python.org/dev/peps/pep-0002) .. [3] PEP 9, Sample Plaintext PEP Template, Warsaw - (http://www.python.org/peps/pep-0009.html) + (http://www.python.org/dev/peps/pep-0009) .. [4] PEP 12, Sample reStructuredText PEP Template, Goodger, Warsaw - (http://www.python.org/peps/pep-0012.html) + (http://www.python.org/dev/peps/pep-0012) .. [5] The script referred to here is pep2html.py, which lives in the same directory in the CVS tree as the PEPs themselves. Try ``pep2html.py --help`` for details. The URL for viewing PEPs on - the web is http://www.python.org/peps/. + the web is http://www.python.org/dev/peps/. .. _patch manager: http://sourceforge.net/tracker/?group_id=5470&atid=305470 From python-checkins at python.org Fri Mar 24 06:36:34 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 06:36:34 +0100 (CET) Subject: [Python-checkins] r43269 - python/trunk/Tools/scripts/byext.py Message-ID: <20060324053634.0B9C71E400B@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 06:36:33 2006 New Revision: 43269 Modified: python/trunk/Tools/scripts/byext.py Log: SF bug #1457411, fix errors using variables that don't exist. Rename file -> filename to be clear. Will backport. Modified: python/trunk/Tools/scripts/byext.py ============================================================================== --- python/trunk/Tools/scripts/byext.py (original) +++ python/trunk/Tools/scripts/byext.py Fri Mar 24 06:36:33 2006 @@ -17,7 +17,7 @@ elif os.path.isfile(arg): self.statfile(arg) else: - sys.stderr.write("Can't find %s\n" % file) + sys.stderr.write("Can't find %s\n" % arg) self.addstats("", "unknown", 1) def statdir(self, dir): @@ -25,8 +25,8 @@ try: names = os.listdir(dir) except os.error, err: - sys.stderr.write("Can't list %s: %s\n" % (file, err)) - self.addstats(ext, "unlistable", 1) + sys.stderr.write("Can't list %s: %s\n" % (dir, err)) + self.addstats("", "unlistable", 1) return names.sort() for name in names: @@ -42,9 +42,9 @@ else: self.statfile(full) - def statfile(self, file): - head, ext = os.path.splitext(file) - head, base = os.path.split(file) + def statfile(self, filename): + head, ext = os.path.splitext(filename) + head, base = os.path.split(filename) if ext == base: ext = "" # E.g. .cvsignore is deemed not to have an extension ext = os.path.normcase(ext) @@ -52,9 +52,9 @@ ext = "" self.addstats(ext, "files", 1) try: - f = open(file, "rb") + f = open(filename, "rb") except IOError, err: - sys.stderr.write("Can't open %s: %s\n" % (file, err)) + sys.stderr.write("Can't open %s: %s\n" % (filename, err)) self.addstats(ext, "unopenable", 1) return data = f.read() From python-checkins at python.org Fri Mar 24 06:41:48 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 06:41:48 +0100 (CET) Subject: [Python-checkins] r43270 - python/branches/release24-maint/Tools/scripts/byext.py Message-ID: <20060324054148.B8CEC1E400B@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 06:41:48 2006 New Revision: 43270 Modified: python/branches/release24-maint/Tools/scripts/byext.py Log: Backport: SF bug #1457411, fix errors using variables that don't exist. Rename file -> filename to be clear. Modified: python/branches/release24-maint/Tools/scripts/byext.py ============================================================================== --- python/branches/release24-maint/Tools/scripts/byext.py (original) +++ python/branches/release24-maint/Tools/scripts/byext.py Fri Mar 24 06:41:48 2006 @@ -17,7 +17,7 @@ elif os.path.isfile(arg): self.statfile(arg) else: - sys.stderr.write("Can't find %s\n" % file) + sys.stderr.write("Can't find %s\n" % arg) self.addstats("", "unknown", 1) def statdir(self, dir): @@ -25,8 +25,8 @@ try: names = os.listdir(dir) except os.error, err: - sys.stderr.write("Can't list %s: %s\n" % (file, err)) - self.addstats(ext, "unlistable", 1) + sys.stderr.write("Can't list %s: %s\n" % (dir, err)) + self.addstats("", "unlistable", 1) return names.sort() for name in names: @@ -42,9 +42,9 @@ else: self.statfile(full) - def statfile(self, file): - head, ext = os.path.splitext(file) - head, base = os.path.split(file) + def statfile(self, filename): + head, ext = os.path.splitext(filename) + head, base = os.path.split(filename) if ext == base: ext = "" # E.g. .cvsignore is deemed not to have an extension ext = os.path.normcase(ext) @@ -52,9 +52,9 @@ ext = "" self.addstats(ext, "files", 1) try: - f = open(file, "rb") + f = open(filename, "rb") except IOError, err: - sys.stderr.write("Can't open %s: %s\n" % (file, err)) + sys.stderr.write("Can't open %s: %s\n" % (filename, err)) self.addstats(ext, "unopenable", 1) return data = f.read() From python-checkins at python.org Fri Mar 24 08:03:44 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 08:03:44 +0100 (CET) Subject: [Python-checkins] r43274 - python/trunk/Lib/test/test_richcmp.py Message-ID: <20060324070344.919CE1E400B@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 08:03:44 2006 New Revision: 43274 Modified: python/trunk/Lib/test/test_richcmp.py Log: Exceptions should inherit from Exception now. Modified: python/trunk/Lib/test/test_richcmp.py ============================================================================== --- python/trunk/Lib/test/test_richcmp.py (original) +++ python/trunk/Lib/test/test_richcmp.py Fri Mar 24 08:03:44 2006 @@ -211,7 +211,7 @@ # Check that exceptions in __nonzero__ are properly # propagated by the not operator import operator - class Exc: + class Exc(Exception): pass class Bad: def __nonzero__(self): @@ -305,7 +305,7 @@ def test_badentry(self): # make sure that exceptions for item comparison are properly # propagated in list comparisons - class Exc: + class Exc(Exception): pass class Bad: def __eq__(self, other): From python-checkins at python.org Fri Mar 24 08:30:57 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 08:30:57 +0100 (CET) Subject: [Python-checkins] r43277 - python/trunk/Lib/test/test_augassign.py Message-ID: <20060324073057.02F971E4012@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 08:30:56 2006 New Revision: 43277 Modified: python/trunk/Lib/test/test_augassign.py Log: Hmmm, I don't think we wanted to test // twice and / not at all (in this section). Modified: python/trunk/Lib/test/test_augassign.py ============================================================================== --- python/trunk/Lib/test/test_augassign.py (original) +++ python/trunk/Lib/test/test_augassign.py Fri Mar 24 08:30:56 2006 @@ -5,7 +5,7 @@ x *= 2 x **= 2 x -= 8 -x //= 2 +x /= 2 x //= 1 x %= 12 x &= 2 @@ -19,7 +19,7 @@ x[0] *= 2 x[0] **= 2 x[0] -= 8 -x[0] //= 2 +x[0] /= 2 x[0] //= 2 x[0] %= 12 x[0] &= 2 @@ -33,7 +33,7 @@ x[0] *= 2 x[0] **= 2 x[0] -= 8 -x[0] //= 2 +x[0] /= 2 x[0] //= 1 x[0] %= 12 x[0] &= 2 From buildbot at python.org Fri Mar 24 08:51:31 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 24 Mar 2006 07:51:31 +0000 Subject: [Python-checkins] buildbot warnings in amd64 gentoo trunk Message-ID: <20060324075131.644EC1E400B@bag.python.org> The Buildbot has detected a new failure of amd64 gentoo trunk. Full details are available at: http://www.python.org/dev/buildbot/all/amd64%20gentoo%20trunk/builds/127 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: neal.norwitz Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 24 09:02:51 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 09:02:51 +0100 (CET) Subject: [Python-checkins] r43282 - python/trunk/Lib/test/test_normalization.py Message-ID: <20060324080251.4CF4A1E400B@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 09:02:51 2006 New Revision: 43282 Modified: python/trunk/Lib/test/test_normalization.py Log: Exceptions should inherit from Exception now. Modified: python/trunk/Lib/test/test_normalization.py ============================================================================== --- python/trunk/Lib/test/test_normalization.py (original) +++ python/trunk/Lib/test/test_normalization.py Fri Mar 24 09:02:51 2006 @@ -7,7 +7,7 @@ TESTDATAFILE = "NormalizationTest" + os.extsep + "txt" TESTDATAURL = "http://www.unicode.org/Public/4.1.0/ucd/" + TESTDATAFILE -class RangeError: +class RangeError(Exception): pass def NFC(str): From python-checkins at python.org Fri Mar 24 09:14:54 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 24 Mar 2006 09:14:54 +0100 (CET) Subject: [Python-checkins] r43286 - in python/trunk/Lib: popen2.py test/test_popen2.py Message-ID: <20060324081454.D475C1E400B@bag.python.org> Author: martin.v.loewis Date: Fri Mar 24 09:14:54 2006 New Revision: 43286 Modified: python/trunk/Lib/popen2.py python/trunk/Lib/test/test_popen2.py Log: Bug #1183780: Add Popen objects to _active only in __del__. Cleanup terminated processes as well. Add cmd attribute to Popen4. Modified: python/trunk/Lib/popen2.py ============================================================================== --- python/trunk/Lib/popen2.py (original) +++ python/trunk/Lib/popen2.py Fri Mar 24 09:14:54 2006 @@ -20,7 +20,13 @@ def _cleanup(): for inst in _active[:]: - inst.poll() + if inst.poll(_deadstate=sys.maxint) >= 0: + try: + _active.remove(inst) + except ValueError: + # This can happen if two threads create a new Popen instance. + # It's harmless that it was already removed, so ignore. + pass class Popen3: """Class representing a child process. Normally instances are created @@ -61,7 +67,13 @@ self.childerr = os.fdopen(errout, 'r', bufsize) else: self.childerr = None - _active.append(self) + + def __del__(self): + # In case the child hasn't been waited on, check if it's done. + self.poll(_deadstate=sys.maxint) + if self.sts < 0: + # Child is still running, keep us alive until we can wait on it. + _active.append(self) def _run_child(self, cmd): if isinstance(cmd, basestring): @@ -76,7 +88,7 @@ finally: os._exit(1) - def poll(self): + def poll(self, _deadstate=None): """Return the exit status of the child process if it has finished, or -1 if it hasn't finished yet.""" if self.sts < 0: @@ -84,9 +96,9 @@ pid, sts = os.waitpid(self.pid, os.WNOHANG) if pid == self.pid: self.sts = sts - _active.remove(self) except os.error: - pass + if _deadstate is not None: + self.sts = _deadstate return self.sts def wait(self): @@ -95,7 +107,6 @@ pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self.sts = sts - _active.remove(self) return self.sts @@ -104,6 +115,7 @@ def __init__(self, cmd, bufsize=-1): _cleanup() + self.cmd = cmd p2cread, p2cwrite = os.pipe() c2pread, c2pwrite = os.pipe() self.pid = os.fork() @@ -117,7 +129,6 @@ self.tochild = os.fdopen(p2cwrite, 'w', bufsize) os.close(c2pwrite) self.fromchild = os.fdopen(c2pread, 'r', bufsize) - _active.append(self) if sys.platform[:3] == "win" or sys.platform == "os2emx": @@ -220,6 +231,7 @@ raise ValueError("unexpected %r on stderr" % (got,)) for inst in _active[:]: inst.wait() + _cleanup() if _active: raise ValueError("_active not empty") print "All OK" Modified: python/trunk/Lib/test/test_popen2.py ============================================================================== --- python/trunk/Lib/test/test_popen2.py (original) +++ python/trunk/Lib/test/test_popen2.py Fri Mar 24 09:14:54 2006 @@ -35,6 +35,9 @@ # same test as popen2._test(), but using the os.popen*() API print "Testing os module:" import popen2 + # When the test runs, there shouldn't be any open pipes + popen2._cleanup() + assert not popen2._active, "Active pipes when test starts " + repr([c.cmd for c in popen2._active]) cmd = "cat" teststr = "ab cd\n" if os.name == "nt": @@ -65,6 +68,7 @@ raise ValueError("unexpected %r on stderr" % (got,)) for inst in popen2._active[:]: inst.wait() + popen2._cleanup() if popen2._active: raise ValueError("_active not empty") print "All OK" From python-checkins at python.org Fri Mar 24 09:26:27 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 24 Mar 2006 09:26:27 +0100 (CET) Subject: [Python-checkins] r43287 - python/trunk/Lib/popen2.py Message-ID: <20060324082627.BB3C11E400C@bag.python.org> Author: martin.v.loewis Date: Fri Mar 24 09:26:26 2006 New Revision: 43287 Modified: python/trunk/Lib/popen2.py Log: Clarify cases when waitpid might not return self.pid. Modified: python/trunk/Lib/popen2.py ============================================================================== --- python/trunk/Lib/popen2.py (original) +++ python/trunk/Lib/popen2.py Fri Mar 24 09:26:26 2006 @@ -94,6 +94,7 @@ if self.sts < 0: try: pid, sts = os.waitpid(self.pid, os.WNOHANG) + # pid will be 0 if self.pid hasn't terminated if pid == self.pid: self.sts = sts except os.error: @@ -105,8 +106,10 @@ """Wait for and return the exit status of the child process.""" if self.sts < 0: pid, sts = os.waitpid(self.pid, 0) - if pid == self.pid: - self.sts = sts + # This used to be a test, but it is believed to be + # always true, so I changed it to an assertion - mvl + assert pid == self.pid + self.sts = sts return self.sts From python-checkins at python.org Fri Mar 24 09:58:38 2006 From: python-checkins at python.org (neal.norwitz) Date: Fri, 24 Mar 2006 09:58:38 +0100 (CET) Subject: [Python-checkins] r43289 - python/trunk/Lib/test/test_cpickle.py Message-ID: <20060324085838.7E95C1E400B@bag.python.org> Author: neal.norwitz Date: Fri Mar 24 09:58:38 2006 New Revision: 43289 Modified: python/trunk/Lib/test/test_cpickle.py Log: Use absolute import. Modified: python/trunk/Lib/test/test_cpickle.py ============================================================================== --- python/trunk/Lib/test/test_cpickle.py (original) +++ python/trunk/Lib/test/test_cpickle.py Fri Mar 24 09:58:38 2006 @@ -1,7 +1,7 @@ import cPickle import unittest from cStringIO import StringIO -from pickletester import AbstractPickleTests, AbstractPickleModuleTests +from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests from test import test_support class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests): From buildbot at python.org Fri Mar 24 10:30:47 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 24 Mar 2006 09:30:47 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP trunk Message-ID: <20060324093047.AADCA1E400B@bag.python.org> The Buildbot has detected a new failure of x86 XP trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP%20trunk/builds/128 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: neal.norwitz Build Had Warnings: warnings failed slave lost sincerely, -The Buildbot From buildbot at python.org Fri Mar 24 10:44:50 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 24 Mar 2006 09:44:50 +0000 Subject: [Python-checkins] buildbot warnings in x86 gentoo trunk Message-ID: <20060324094451.272D31E400B@bag.python.org> The Buildbot has detected a new failure of x86 gentoo trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20gentoo%20trunk/builds/130 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: neal.norwitz Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 24 13:39:26 2006 From: python-checkins at python.org (david.goodger) Date: Fri, 24 Mar 2006 13:39:26 +0100 (CET) Subject: [Python-checkins] r43290 - peps/trunk/pep2pyramid.py Message-ID: <20060324123926.14A2E1E400B@bag.python.org> Author: david.goodger Date: Fri Mar 24 13:39:25 2006 New Revision: 43290 Modified: peps/trunk/pep2pyramid.py Log: fixed accidental deletion Modified: peps/trunk/pep2pyramid.py ============================================================================== --- peps/trunk/pep2pyramid.py (original) +++ peps/trunk/pep2pyramid.py Fri Mar 24 13:39:25 2006 @@ -61,7 +61,7 @@ CONTENT_HTML = """\ -' # day outside month + else: + return '' % (self.cssclasses[weekday], day) -# Spacing of month columns for 3-column year calendar + def formatweek(self, theweek): + """ + Return a complete week as a table row. + """ + s = ''.join(self.formatday(d, wd) for (d, wd) in theweek) + return '%s' % s + + def formatweekday(self, day): + """ + Return a weekday name as a table header. + """ + return '' % (self.cssclasses[day], day_abbr[day]) + + def formatweekheader(self): + """ + Return a header for a week as a table row. + """ + s = ''.join(self.formatweekday(i) for i in self.iterweekdays()) + return '%s' % s + + def formatmonthname(self, theyear, themonth, withyear=True): + """ + Return a month name as a table row. + """ + if withyear: + s = '%s %s' % (month_name[themonth], theyear) + else: + s = '%s' % month_name[themonth] + return '' % s + + def formatmonth(self, theyear, themonth, withyear=True): + """ + Return a formatted month as a table. + """ + v = [] + a = v.append + a('
      %s: s + cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] + + def formatday(self, day, weekday): + """ + Return a day as a table cell. + """ + if day == 0: + return ' %d
      %s
      %s
      ') + a('\n') + a(self.formatmonthname(theyear, themonth, withyear=withyear)) + a('\n') + a(self.formatweekheader()) + a('\n') + for week in self.monthdays2calendar(theyear, themonth): + a(self.formatweek(week)) + a('\n') + a('
      ') + a('\n') + return ''.join(v) + + def formatyear(self, theyear, width=3): + """ + Return a formatted year as a table of tables. + """ + v = [] + a = v.append + width = max(width, 1) + a('') + a('\n') + a('' % (width, theyear)) + for i in xrange(January, January+12, width): + # months in this row + months = xrange(i, min(i+width, 13)) + a('') + for m in months: + a('') + a('') + a('
      %s
      ') + a(self.formatmonth(theyear, m, withyear=False)) + a('
      ') + return ''.join(v) + + def formatyearpage(self, theyear, width=3, css='calendar.css', encoding=None): + """ + Return a formatted year as a complete HTML page. + """ + if encoding is None: + encoding = sys.getdefaultencoding() + v = [] + a = v.append + a('\n' % encoding) + a('\n') + a('\n') + a('\n') + a('\n' % encoding) + if css is not None: + a('\n' % css) + a('Calendar for %d</title\n' % theyear) + a('</head>\n') + a('<body>\n') + a(self.formatyear(theyear, width)) + a('</body>\n') + a('</html>\n') + return ''.join(v).encode(encoding) + + +# Support for old module level interface +c = TextCalendar() + +firstweekday = c.firstweekday +setfirstweekday = c.setfirstweekday +monthcalendar = c.monthdayscalendar +prweek = c.prweek +week = c.formatweek +weekheader = c.formatweekheader +prmonth = c.prmonth +month = c.formatmonth +calendar = c.formatyear +prcal = c.pryear + + +# Spacing of month columns for multi-column year calendar _colwidth = 7*3 - 1 # Amount printed by prweek() _spacing = 6 # Number of spaces between columns -def format3c(a, b, c, colwidth=_colwidth, spacing=_spacing): - """Prints 3-column formatting for year calendars""" - print format3cstring(a, b, c, colwidth, spacing) - -def format3cstring(a, b, c, colwidth=_colwidth, spacing=_spacing): - """Returns a string formatted from 3 strings, centered within 3 columns.""" - return (a.center(colwidth) + ' ' * spacing + b.center(colwidth) + - ' ' * spacing + c.center(colwidth)) - -def prcal(year, w=0, l=0, c=_spacing): - """Print a year's calendar.""" - print calendar(year, w, l, c), - -def calendar(year, w=0, l=0, c=_spacing): - """Returns a year's calendar as a multi-line string.""" - w = max(2, w) - l = max(1, l) - c = max(2, c) - colwidth = (w + 1) * 7 - 1 - s = repr(year).center(colwidth * 3 + c * 2).rstrip() + '\n' * l - header = weekheader(w) - header = format3cstring(header, header, header, colwidth, c).rstrip() - for q in range(January, January+12, 3): - s = (s + '\n' * l + - format3cstring(month_name[q], month_name[q+1], month_name[q+2], - colwidth, c).rstrip() + - '\n' * l + header + '\n' * l) - data = [] - height = 0 - for amonth in range(q, q + 3): - cal = monthcalendar(year, amonth) - if len(cal) > height: - height = len(cal) - data.append(cal) - for i in range(height): - weeks = [] - for cal in data: - if i >= len(cal): - weeks.append('') - else: - weeks.append(week(cal[i], w)) - s = s + format3cstring(weeks[0], weeks[1], weeks[2], - colwidth, c).rstrip() + '\n' * l - return s[:-l] + '\n' + +def format(cols, colwidth=_colwidth, spacing=_spacing): + """Prints multi-column formatting for year calendars""" + print formatstring(cols, colwidth, spacing) + + +def formatstring(cols, colwidth=_colwidth, spacing=_spacing): + """Returns a string formatted from n strings, centered within n columns.""" + spacing *= ' ' + return spacing.join(c.center(colwidth) for c in cols) + EPOCH = 1970 _EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal() + def timegm(tuple): """Unrelated but handy function to calculate Unix timestamp from GMT.""" year, month, day, hour, minute, second = tuple[:6] @@ -229,3 +520,65 @@ minutes = hours*60 + minute seconds = minutes*60 + second return seconds + + +def main(args): + import optparse + parser = optparse.OptionParser(usage="usage: %prog [options] [year] [month]") + parser.add_option("-w", "--width", + dest="width", type="int", default=2, + help="width of date column (default 2, text only)") + parser.add_option("-l", "--lines", + dest="lines", type="int", default=1, + help="number of lines for each week (default 1, text only)") + parser.add_option("-s", "--spacing", + dest="spacing", type="int", default=6, + help="spacing between months (default 6, text only)") + parser.add_option("-m", "--months", + dest="months", type="int", default=3, + help="months per row (default 3, text only)") + parser.add_option("-c", "--css", + dest="css", default="calendar.css", + help="CSS to use for page (html only)") + parser.add_option("-e", "--encoding", + dest="encoding", default=None, + help="Encoding to use for CSS output (html only)") + parser.add_option("-t", "--type", + dest="type", default="text", + choices=("text", "html"), + help="output type (text or html)") + + (options, args) = parser.parse_args(args) + + if options.type == "html": + cal = HTMLCalendar() + encoding = options.encoding + if encoding is None: + encoding = sys.getdefaultencoding() + optdict = dict(encoding=encoding, css=options.css) + if len(args) == 1: + print cal.formatyearpage(datetime.date.today().year, **optdict) + elif len(args) == 2: + print cal.formatyearpage(int(args[1]), **optdict) + else: + parser.error("incorrect number of arguments") + sys.exit(1) + else: + cal = TextCalendar() + optdict = dict(w=options.width, l=options.lines) + if len(args) != 3: + optdict["c"] = options.spacing + optdict["m"] = options.months + if len(args) == 1: + print cal.formatyear(datetime.date.today().year, **optdict) + elif len(args) == 2: + print cal.formatyear(int(args[1]), **optdict) + elif len(args) == 3: + print cal.formatmonth(int(args[1]), int(args[2]), **optdict) + else: + parser.error("incorrect number of arguments") + sys.exit(1) + + +if __name__ == "__main__": + main(sys.argv) Modified: python/trunk/Lib/test/test_calendar.py ============================================================================== --- python/trunk/Lib/test/test_calendar.py (original) +++ python/trunk/Lib/test/test_calendar.py Fri Mar 31 17:26:22 2006 @@ -4,6 +4,64 @@ from test import test_support +result_2004 = """ + 2004 + + January February March +Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 3 4 1 1 2 3 4 5 6 7 + 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14 +12 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21 +19 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28 +26 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31 + + April May June +Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 3 4 1 2 1 2 3 4 5 6 + 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13 +12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20 +19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27 +26 27 28 29 30 24 25 26 27 28 29 30 28 29 30 + 31 + + July August September +Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 3 4 1 1 2 3 4 5 + 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12 +12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19 +19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26 +26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30 + 30 31 + + October November December +Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su + 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 + 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12 +11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19 +18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26 +25 26 27 28 29 30 31 29 30 27 28 29 30 31 +""" + + +class OutputTestCase(unittest.TestCase): + def normalize_calendar(self, s): + def neitherspacenordigit(c): + return not c.isspace() and not c.isdigit() + + lines = [] + for line in s.splitlines(False): + # Drop texts, as they are locale dependent + if line and not filter(neitherspacenordigit, line): + lines.append(line) + return lines + + def test_output(self): + self.assertEqual( + self.normalize_calendar(calendar.calendar(2004)), + self.normalize_calendar(result_2004) + ) + + class CalendarTestCase(unittest.TestCase): def test_isleap(self): # Make sure that the return is right for a few years, and @@ -72,57 +130,57 @@ firstweekday = calendar.MONDAY def test_february(self): - # A 28-day february starting of monday (7+7+7+7 days) + # A 28-day february starting on monday (7+7+7+7 days) self.check_weeks(1999, 2, (7, 7, 7, 7)) - # A 28-day february starting of tuesday (6+7+7+7+1 days) + # A 28-day february starting on tuesday (6+7+7+7+1 days) self.check_weeks(2005, 2, (6, 7, 7, 7, 1)) - # A 28-day february starting of sunday (1+7+7+7+6 days) + # A 28-day february starting on sunday (1+7+7+7+6 days) self.check_weeks(1987, 2, (1, 7, 7, 7, 6)) - # A 29-day february starting of monday (7+7+7+7+1 days) + # A 29-day february starting on monday (7+7+7+7+1 days) self.check_weeks(1988, 2, (7, 7, 7, 7, 1)) - # A 29-day february starting of tuesday (6+7+7+7+2 days) + # A 29-day february starting on tuesday (6+7+7+7+2 days) self.check_weeks(1972, 2, (6, 7, 7, 7, 2)) - # A 29-day february starting of sunday (1+7+7+7+7 days) + # A 29-day february starting on sunday (1+7+7+7+7 days) self.check_weeks(2004, 2, (1, 7, 7, 7, 7)) def test_april(self): - # A 30-day april starting of monday (7+7+7+7+2 days) + # A 30-day april starting on monday (7+7+7+7+2 days) self.check_weeks(1935, 4, (7, 7, 7, 7, 2)) - # A 30-day april starting of tuesday (6+7+7+7+3 days) + # A 30-day april starting on tuesday (6+7+7+7+3 days) self.check_weeks(1975, 4, (6, 7, 7, 7, 3)) - # A 30-day april starting of sunday (1+7+7+7+7+1 days) + # A 30-day april starting on sunday (1+7+7+7+7+1 days) self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1)) - # A 30-day april starting of saturday (2+7+7+7+7 days) + # A 30-day april starting on saturday (2+7+7+7+7 days) self.check_weeks(1995, 4, (2, 7, 7, 7, 7)) - # A 30-day april starting of friday (3+7+7+7+6 days) + # A 30-day april starting on friday (3+7+7+7+6 days) self.check_weeks(1994, 4, (3, 7, 7, 7, 6)) def test_december(self): - # A 31-day december starting of monday (7+7+7+7+3 days) + # A 31-day december starting on monday (7+7+7+7+3 days) self.check_weeks(1980, 12, (7, 7, 7, 7, 3)) - # A 31-day december starting of tuesday (6+7+7+7+4 days) + # A 31-day december starting on tuesday (6+7+7+7+4 days) self.check_weeks(1987, 12, (6, 7, 7, 7, 4)) - # A 31-day december starting of sunday (1+7+7+7+7+2 days) + # A 31-day december starting on sunday (1+7+7+7+7+2 days) self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2)) - # A 31-day december starting of thursday (4+7+7+7+6 days) + # A 31-day december starting on thursday (4+7+7+7+6 days) self.check_weeks(1988, 12, (4, 7, 7, 7, 6)) - # A 31-day december starting of friday (3+7+7+7+7 days) + # A 31-day december starting on friday (3+7+7+7+7 days) self.check_weeks(2017, 12, (3, 7, 7, 7, 7)) - # A 31-day december starting of saturday (2+7+7+7+7+1 days) + # A 31-day december starting on saturday (2+7+7+7+7+1 days) self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1)) @@ -130,62 +188,63 @@ firstweekday = calendar.SUNDAY def test_february(self): - # A 28-day february starting of sunday (7+7+7+7 days) + # A 28-day february starting on sunday (7+7+7+7 days) self.check_weeks(2009, 2, (7, 7, 7, 7)) - # A 28-day february starting of monday (6+7+7+7+1 days) + # A 28-day february starting on monday (6+7+7+7+1 days) self.check_weeks(1999, 2, (6, 7, 7, 7, 1)) - # A 28-day february starting of saturday (1+7+7+7+6 days) + # A 28-day february starting on saturday (1+7+7+7+6 days) self.check_weeks(1997, 2, (1, 7, 7, 7, 6)) - # A 29-day february starting of sunday (7+7+7+7+1 days) + # A 29-day february starting on sunday (7+7+7+7+1 days) self.check_weeks(2004, 2, (7, 7, 7, 7, 1)) - # A 29-day february starting of monday (6+7+7+7+2 days) + # A 29-day february starting on monday (6+7+7+7+2 days) self.check_weeks(1960, 2, (6, 7, 7, 7, 2)) - # A 29-day february starting of saturday (1+7+7+7+7 days) + # A 29-day february starting on saturday (1+7+7+7+7 days) self.check_weeks(1964, 2, (1, 7, 7, 7, 7)) def test_april(self): - # A 30-day april starting of sunday (7+7+7+7+2 days) + # A 30-day april starting on sunday (7+7+7+7+2 days) self.check_weeks(1923, 4, (7, 7, 7, 7, 2)) - # A 30-day april starting of monday (6+7+7+7+3 days) + # A 30-day april starting on monday (6+7+7+7+3 days) self.check_weeks(1918, 4, (6, 7, 7, 7, 3)) - # A 30-day april starting of saturday (1+7+7+7+7+1 days) + # A 30-day april starting on saturday (1+7+7+7+7+1 days) self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1)) - # A 30-day april starting of friday (2+7+7+7+7 days) + # A 30-day april starting on friday (2+7+7+7+7 days) self.check_weeks(1960, 4, (2, 7, 7, 7, 7)) - # A 30-day april starting of thursday (3+7+7+7+6 days) + # A 30-day april starting on thursday (3+7+7+7+6 days) self.check_weeks(1909, 4, (3, 7, 7, 7, 6)) def test_december(self): - # A 31-day december starting of sunday (7+7+7+7+3 days) + # A 31-day december starting on sunday (7+7+7+7+3 days) self.check_weeks(2080, 12, (7, 7, 7, 7, 3)) - # A 31-day december starting of monday (6+7+7+7+4 days) + # A 31-day december starting on monday (6+7+7+7+4 days) self.check_weeks(1941, 12, (6, 7, 7, 7, 4)) - # A 31-day december starting of saturday (1+7+7+7+7+2 days) + # A 31-day december starting on saturday (1+7+7+7+7+2 days) self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2)) - # A 31-day december starting of wednesday (4+7+7+7+6 days) + # A 31-day december starting on wednesday (4+7+7+7+6 days) self.check_weeks(1948, 12, (4, 7, 7, 7, 6)) - # A 31-day december starting of thursday (3+7+7+7+7 days) + # A 31-day december starting on thursday (3+7+7+7+7 days) self.check_weeks(1927, 12, (3, 7, 7, 7, 7)) - # A 31-day december starting of friday (2+7+7+7+7+1 days) + # A 31-day december starting on friday (2+7+7+7+7+1 days) self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1)) def test_main(): test_support.run_unittest( + OutputTestCase, CalendarTestCase, MondayTestCase, SundayTestCase Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 17:26:22 2006 @@ -895,6 +895,10 @@ - Patch #1413711: Certain patterns of differences were making difflib touch the recursion limit. +- Bug #947906: An object oriented interface has been added to the calendar + module. It's possible to generate HTML calendar now and the module can be + called as a script (e.g. via ``python -mcalendar``). + Build ----- From python-checkins at python.org Fri Mar 31 17:31:43 2006 From: python-checkins at python.org (thomas.wouters) Date: Fri, 31 Mar 2006 17:31:43 +0200 (CEST) Subject: [Python-checkins] r43484 - python/trunk/Lib/test/test_generators.py Message-ID: <20060331153143.D34511E4003@bag.python.org> Author: thomas.wouters Date: Fri Mar 31 17:31:43 2006 New Revision: 43484 Modified: python/trunk/Lib/test/test_generators.py Log: Fix the reference leak in test_generators, by explicitly breaking the cycle we are about to leave behind. An example of the cause of this leak can be found in the leakers directory, in case we ever want to tackle the underlying problem. Modified: python/trunk/Lib/test/test_generators.py ============================================================================== --- python/trunk/Lib/test/test_generators.py (original) +++ python/trunk/Lib/test/test_generators.py Fri Mar 31 17:31:43 2006 @@ -675,7 +675,10 @@ all and thereby wasting memory. Thanks to itertools.tee, it is now clear "how to get the internal uses of -m235 to share a single generator". +m235 to share a single generator". Unfortunately, using generators this way +creates a reference-cycle that the garbage collector (currently) can't clean +up, so we have to explicitly break the cycle (by calling the inner +generator's close() method) >>> from itertools import tee >>> def m235(): @@ -685,10 +688,11 @@ ... merge(times(3, m3), ... times(5, m5))): ... yield n -... m2, m3, m5, mRes = tee(_m235(), 4) -... return mRes +... m1 = _m235() +... m2, m3, m5, mRes = tee(m1, 4) +... return m1.close, mRes ->>> it = m235() +>>> closer, it = m235() >>> for i in range(5): ... print firstn(it, 15) [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24] @@ -696,6 +700,7 @@ [81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192] [200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384] [400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675] +>>> closer() The "tee" function does just what we want. It internally keeps a generated result for as long as it has not been "consumed" from all of the duplicated @@ -703,8 +708,10 @@ sequence during hours without increasing memory usage, or very little. The beauty of it is that recursive running after their tail FP algorithms -are quite straightforwardly expressed with this Python idiom. - +are quite straightforwardly expressed with this Python idiom. The problem is +that this creates the same kind of reference cycle as the m235() +implementation above, and again we have to explicitly close the innermost +generator to clean up the cycle. Ye olde Fibonacci generator, tee style. @@ -721,11 +728,14 @@ ... for res in _isum(fibHead, fibTail): ... yield res ... -... fibHead, fibTail, fibRes = tee(_fib(), 3) -... return fibRes +... realfib = _fib() +... fibHead, fibTail, fibRes = tee(realfib, 3) +... return realfib.close, fibRes ->>> firstn(fib(), 17) +>>> closer, fibber = fib() +>>> firstn(fibber, 17) [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584] +>>> closer() """ From python-checkins at python.org Fri Mar 31 17:38:44 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 17:38:44 +0200 (CEST) Subject: [Python-checkins] r43485 - python/trunk/Doc/lib/libcalendar.tex Message-ID: <20060331153844.8EC7F1E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 31 17:38:44 2006 New Revision: 43485 Modified: python/trunk/Doc/lib/libcalendar.tex Log: Complete markup. Modified: python/trunk/Doc/lib/libcalendar.tex ============================================================================== --- python/trunk/Doc/lib/libcalendar.tex (original) +++ python/trunk/Doc/lib/libcalendar.tex Fri Mar 31 17:38:44 2006 @@ -24,25 +24,32 @@ \begin{classdesc}{Calendar}{\optional{firstweekday}} Creates a \class{Calendar} object. \var{firstweekday} is an integer -specifying the first day of the week. 0 is Monday, 6 is Sunday. +specifying the first day of the week. \code{0} is Monday (the default), +\code{6} is Sunday. -A \class{Calendar} object provides several method that can +A \class{Calendar} object provides several methods that can be used for preparing the calendar data for formatting. This class doesn't do any formatting itself. This is the job of subclasses. \versionadded{2.5} +\end{classdesc} + +\class{Calendar} instances have the following methods: \begin{methoddesc}{firstweekday}{} Return the first day of the week (as specified in the constructor -or changed via \method{setfirstweekday()}. +or changed via \method{setfirstweekday()}). +\end{methoddesc} \begin{methoddesc}{setfirstweekday}{weekday} Set the first day of the week. +\end{methoddesc} \begin{methoddesc}{iterweekdays}{weekday} Return an iterator for the week day numbers that will be used for one week. The first number from the iterator will be the -same as the number return by \method{firstweekday()}. +same as the number returned by \method{firstweekday()}. +\end{methoddesc} \begin{methoddesc}{itermonthdates}{year, month} Return an iterator for the month \var{month} (1-12) in the @@ -50,99 +57,123 @@ \class{datetime.date} objects) for the month and all days before the start of the month or after the end of the month that are required to get a complete week. +\end{methoddesc} \begin{methoddesc}{itermonthdays2}{year, month} Return an iterator for the month \var{month} in the year \var{year} similar to \method{itermonthdates()}. Days returned -will be tuple consisting of a day number and a week day +will be tuples consisting of a day number and a week day number. +\end{methoddesc} \begin{methoddesc}{itermonthdays}{year, month} Return an iterator for the month \var{month} in the year \var{year} similar to \method{itermonthdates()}. Days returned will simply be day numbers. +\end{methoddesc} \begin{methoddesc}{monthdatescalendar}{year, month} Return a list of the weeks in the month \var{month} of the \var{year} as full weeks. Weeks are lists of seven \class{datetime.date} objects. +\end{methoddesc} \begin{methoddesc}{monthdays2calendar}{year, month} Return a list of the weeks in the month \var{month} of the \var{year} as full weeks. Weeks are lists of seven tuples of day numbers and weekday numbers. +\end{methoddesc} \begin{methoddesc}{monthdayscalendar}{year, month} Return a list of the weeks in the month \var{month} of the \var{year} as full weeks. Weeks are lists of seven day numbers. +\end{methoddesc} \begin{methoddesc}{yeardatescalendar}{year, month\optional{, width}} Return the data for the specified year ready for formatting. The return -value is a list of month rows. Each month row contains upto \var{width} +value is a list of month rows. Each month row contains up to \var{width} months (defaulting to 3). Each month contains between 4 and 6 weeks and -each week contains 1-7 days. Days are \class{datetime.date} objects. +each week contains 1--7 days. Days are \class{datetime.date} objects. +\end{methoddesc} \begin{methoddesc}{yeardays2calendar}{year, month\optional{, width}} Return the data for the specified year ready for formatting (similar to \method{yeardatescalendar()}). Entries in the week lists are tuples of day numbers and weekday numbers. Day numbers outside this month are zero. +\end{methoddesc} \begin{methoddesc}{yeardayscalendar}{year, month\optional{, width}} Return the data for the specified year ready for formatting (similar to \method{yeardatescalendar()}). Entries in the week lists are day numbers. Day numbers outside this month are zero. +\end{methoddesc} \begin{classdesc}{TextCalendar}{\optional{firstweekday}} -This class can be used for generating plain text calendars. +This class can be used to generate plain text calendars. \versionadded{2.5} +\end{classdesc} + +\class{TextCalendar} instances have the following methods: \begin{methoddesc}{formatmonth}{theyear, themonth\optional{, w\optional{, l}}} -Returns a month's calendar in a multi-line string. If \var{w} is +Return a month's calendar in a multi-line string. If \var{w} is provided, it specifies the width of the date columns, which are centered. If \var{l} is given, it specifies the number of lines that each week will use. Depends on the first weekday as set by \function{setfirstweekday()}. +\end{methoddesc} \begin{methoddesc}{prmonth}{theyear, themonth\optional{, w\optional{, l}}} -Prints a month's calendar as returned by \method{formatmonth()}. +Print a month's calendar as returned by \method{formatmonth()}. +\end{methoddesc} -\begin{methoddesc}{formatyear}{theyear, themonth\optional{, w\optional{, l\optional{, c\optional{, m}}}}} -Returns a \var{m}-column calendar for an entire year as a multi-line string. +\begin{methoddesc}{formatyear}{theyear, themonth\optional{, w\optional{, + l\optional{, c\optional{, m}}}}} +Return a \var{m}-column calendar for an entire year as a multi-line string. Optional parameters \var{w}, \var{l}, and \var{c} are for date column width, lines per week, and number of spaces between month columns, respectively. Depends on the first weekday as set by \method{setfirstweekday()}. The earliest year for which a calendar can be generated is platform-dependent. +\end{methoddesc} -\begin{methoddesc}{pryear}{theyear\optional{, w\optional{, l\optional{, c\optional{, m}}}}} -Prints the calendar for an entire year as returned by \method{formatyear()}. -\end{funcdesc} +\begin{methoddesc}{pryear}{theyear\optional{, w\optional{, l\optional{, + c\optional{, m}}}}} +Print the calendar for an entire year as returned by \method{formatyear()}. +\end{methoddesc} \begin{classdesc}{HTMLCalendar}{\optional{firstweekday}} -This class can be used for generating HTML calendars. +This class can be used to generate HTML calendars. \versionadded{2.5} +\end{classdesc} + +\class{HTMLCalendar} instances have the following methods: \begin{methoddesc}{formatmonth}{theyear, themonth\optional{, withyear}} -Returns a month's calendar as an HTML table. If \var{withyear} is +Return a month's calendar as an HTML table. If \var{withyear} is true the year will be included in the header, otherwise just the -monthname will be used. +month name will be used. +\end{methoddesc} \begin{methoddesc}{formatyear}{theyear, themonth\optional{, width}} -Returns a year's calendar as an HTML table. \var{width} (defaulting to 3) +Return a year's calendar as an HTML table. \var{width} (defaulting to 3) specifies the number of months per row. +\end{methoddesc} -\begin{methoddesc}{formatyearpage}{theyear, themonth\optional{, width\optional{, css\optional{, encoding}}}} -Returns a year's calendar as an complete HTML page. \var{width} +\begin{methoddesc}{formatyearpage}{theyear, themonth\optional{, + width\optional{, css\optional{, encoding}}}} +Return a year's calendar as a complete HTML page. \var{width} (defaulting to 3) specifies the number of months per row. \var{css} is the name for the cascading style sheet to be used. \constant{None} -can be passed, if no style sheet should be used. \var{encoding} +can be passed if no style sheet should be used. \var{encoding} specifies the encoding to be used for the output (defaulting -the the system default encoding). +to the system default encoding). +\end{methoddesc} For simple text calendars this module provides the following functions. From buildbot at python.org Fri Mar 31 17:54:07 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 15:54:07 +0000 Subject: [Python-checkins] buildbot warnings in alpha Tru64 5.1 trunk Message-ID: <20060331155407.E7E5A1E4003@bag.python.org> The Buildbot has detected a new failure of alpha Tru64 5.1 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/alpha%20Tru64%205.1%20trunk/builds/42 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 17:59:14 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 17:59:14 +0200 (CEST) Subject: [Python-checkins] r43486 - in python/trunk/Lib: test/test_traceback.py traceback.py Message-ID: <20060331155914.8A3761E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 17:59:13 2006 New Revision: 43486 Modified: python/trunk/Lib/test/test_traceback.py python/trunk/Lib/traceback.py Log: traceback now shows error position for all SyntaxError subclasses, e.g. IndentationError. (bug #1447885) Modified: python/trunk/Lib/test/test_traceback.py ============================================================================== --- python/trunk/Lib/test/test_traceback.py (original) +++ python/trunk/Lib/test/test_traceback.py Fri Mar 31 17:59:13 2006 @@ -23,6 +23,9 @@ def syntax_error_without_caret(self): # XXX why doesn't compile raise the same traceback? import test.badsyntax_nocaret + + def syntax_error_bad_indentation(self): + compile("def spam():\n print 1\n print 2", "?", "exec") def test_caret(self): err = self.get_exception_format(self.syntax_error_with_caret, @@ -40,6 +43,13 @@ self.assert_(len(err) == 3) self.assert_(err[1].strip() == "[x for x in x] = x") + def test_bad_indentation(self): + err = self.get_exception_format(self.syntax_error_bad_indentation, + IndentationError) + self.assert_(len(err) == 4) + self.assert_("^" in err[2]) + self.assert_(err[1].strip() == "print 2") + def test_bug737473(self): import sys, os, tempfile, time Modified: python/trunk/Lib/traceback.py ============================================================================== --- python/trunk/Lib/traceback.py (original) +++ python/trunk/Lib/traceback.py Fri Mar 31 17:59:13 2006 @@ -165,7 +165,7 @@ if value is None: list.append(str(stype) + '\n') else: - if etype is SyntaxError: + if issubclass(etype, SyntaxError): try: msg, (filename, lineno, offset, line) = value except: From python-checkins at python.org Fri Mar 31 18:12:37 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 18:12:37 +0200 (CEST) Subject: [Python-checkins] r43487 - python/trunk/Doc/ref/ref3.tex Message-ID: <20060331161237.BEF2A1E4019@bag.python.org> Author: georg.brandl Date: Fri Mar 31 18:12:34 2006 New Revision: 43487 Modified: python/trunk/Doc/ref/ref3.tex Log: typos Modified: python/trunk/Doc/ref/ref3.tex ============================================================================== --- python/trunk/Doc/ref/ref3.tex (original) +++ python/trunk/Doc/ref/ref3.tex Fri Mar 31 18:12:34 2006 @@ -1035,7 +1035,7 @@ %========================================================================= \section{New-style and classic classes} -Classes and instances come in two flavours: old-style or classic, and new-style. +Classes and instances come in two flavors: old-style or classic, and new-style. Up to Python 2.1, old-style classes were the only flavour available to the user. The concept of (old-style) class is unrelated to the concept of type: if @@ -1065,7 +1065,7 @@ implemented before for compatibility concerns, like the method resolution order in case of multiple inheritance. -This manuel is not up-to-date with respect to new-style classes. For now, +This manual is not up-to-date with respect to new-style classes. For now, please see \url{http://www.python.org/doc/newstyle.html} for more information. The plan is to eventually drop old-style classes, leaving only the semantics of From python-checkins at python.org Fri Mar 31 18:19:18 2006 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 31 Mar 2006 18:19:18 +0200 (CEST) Subject: [Python-checkins] r43488 - python/trunk/Doc/tools/prechm.py Message-ID: <20060331161918.D1E0A1E4003@bag.python.org> Author: martin.v.loewis Date: Fri Mar 31 18:19:18 2006 New Revision: 43488 Modified: python/trunk/Doc/tools/prechm.py Log: Add 2.5 libraries. Modified: python/trunk/Doc/tools/prechm.py ============================================================================== --- python/trunk/Doc/tools/prechm.py (original) +++ python/trunk/Doc/tools/prechm.py Fri Mar 31 18:19:18 2006 @@ -150,6 +150,22 @@ # Library Doc list of books: # each 'book' : (Dir, Title, First page, Content page, Index page) supported_libraries = { + '2.5': + [ + Book('.', 'Main page', 'index'), + Book('.', 'Global Module Index', 'modindex'), + Book('whatsnew', "What's New", 'index', 'contents'), + Book('tut','Tutorial','tut','node2'), + Book('lib','Library Reference','lib','contents','genindex'), + Book('ref','Language Reference','ref','contents','genindex'), + Book('mac','Macintosh Reference','mac','contents','genindex'), + Book('ext','Extending and Embedding','ext','contents'), + Book('api','Python/C API','api','contents','genindex'), + Book('doc','Documenting Python','doc','contents'), + Book('inst','Installing Python Modules', 'inst', 'index'), + Book('dist','Distributing Python Modules', 'dist', 'index', 'genindex'), + ], + '2.4': [ Book('.', 'Main page', 'index'), From python-checkins at python.org Fri Mar 31 18:41:23 2006 From: python-checkins at python.org (jeremy.hylton) Date: Fri, 31 Mar 2006 18:41:23 +0200 (CEST) Subject: [Python-checkins] r43489 - python/trunk/Python/pyarena.c Message-ID: <20060331164123.96D1F1E4003@bag.python.org> Author: jeremy.hylton Date: Fri Mar 31 18:41:22 2006 New Revision: 43489 Modified: python/trunk/Python/pyarena.c Log: Expand comments. Explicitly clear all elements from arena->a_objects and remove assert() that refcount is 1. It's possible for a program to get a reference to the list via sys.getobjects() or via gc functions. Modified: python/trunk/Python/pyarena.c ============================================================================== --- python/trunk/Python/pyarena.c (original) +++ python/trunk/Python/pyarena.c Fri Mar 31 18:41:22 2006 @@ -6,6 +6,9 @@ Measurements with standard library modules suggest the average allocation is about 20 bytes and that most compiles use a single block. + + TODO(jhylton): Think about a realloc API, maybe just for the last + allocation? */ #define DEFAULT_BLOCK_SIZE 8192 @@ -39,9 +42,25 @@ */ struct _arena { + /* Pointer to the first block allocated for the arena, never NULL. + It is used only to find the first block when the arena is + being freed. + */ block *a_head; + + /* Pointer to the block currently used for allocation. It's + ab_next field should be NULL. If it is not-null after a + call to block_alloc(), it means a new block has been allocated + and a_cur should be reset to point it. + */ block *a_cur; + + /* A Python list object containing references to all the PyObject + pointers associated with this area. They will be DECREFed + when the arena is freed. + */ PyObject *a_objects; + #if defined(Py_DEBUG) /* Debug output */ size_t total_allocs; @@ -134,6 +153,7 @@ void PyArena_Free(PyArena *arena) { + int r; assert(arena); #if defined(Py_DEBUG) /* @@ -146,6 +166,13 @@ #endif block_free(arena->a_head); assert(arena->a_objects->ob_refcnt == 1); + + /* Clear all the elements from the list. This is necessary + to guarantee that they will be DECREFed. */ + r = PyList_SetSlice(arena->a_objects, + 0, PyList_GET_SIZE(arena->a_objects), NULL); + assert(r == 0); + assert(PyList_GET_SIZE(arena->a_objects) == 0); Py_DECREF(arena->a_objects); free(arena); } From python-checkins at python.org Fri Mar 31 19:18:14 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 19:18:14 +0200 (CEST) Subject: [Python-checkins] r43490 - in python/trunk: Lib/mimetools.py Lib/test/test_urllib2.py Misc/NEWS Message-ID: <20060331171814.60B971E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 31 19:18:06 2006 New Revision: 43490 Modified: python/trunk/Lib/mimetools.py python/trunk/Lib/test/test_urllib2.py python/trunk/Misc/NEWS Log: Bug #1250170, Patch #1462230: handle socket.gethostname() failures gracefully Modified: python/trunk/Lib/mimetools.py ============================================================================== --- python/trunk/Lib/mimetools.py (original) +++ python/trunk/Lib/mimetools.py Fri Mar 31 19:18:06 2006 @@ -127,7 +127,10 @@ import time if _prefix is None: import socket - hostid = socket.gethostbyname(socket.gethostname()) + try: + hostid = socket.gethostbyname(socket.gethostname()) + except socket.gaierror: + hostid = '127.0.0.1' try: uid = repr(os.getuid()) except AttributeError: Modified: python/trunk/Lib/test/test_urllib2.py ============================================================================== --- python/trunk/Lib/test/test_urllib2.py (original) +++ python/trunk/Lib/test/test_urllib2.py Fri Mar 31 19:18:06 2006 @@ -349,13 +349,19 @@ TESTFN = test_support.TESTFN urlpath = sanepathname2url(os.path.abspath(TESTFN)) towrite = "hello, world\n" - for url in [ + urls = [ "file://localhost%s" % urlpath, "file://%s" % urlpath, "file://%s%s" % (socket.gethostbyname('localhost'), urlpath), - "file://%s%s" % (socket.gethostbyname(socket.gethostname()), - urlpath), - ]: + ] + try: + localaddr = socket.gethostbyname(socket.gethostname()) + except socket.gaierror: + localaddr = '' + if localaddr: + urls.append("file://%s%s" % (localaddr, urlpath)) + + for url in urls: f = open(TESTFN, "wb") try: try: Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 19:18:06 2006 @@ -485,6 +485,9 @@ Library ------- +- Bug #1250170: mimetools now gracefully handles socket.gethostname() + failures gracefully. + - patch #1457316: "setup.py upload" now supports --identity to select the key to be used for signing the uploaded code. From buildbot at python.org Fri Mar 31 19:28:39 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 17:28:39 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP trunk Message-ID: <20060331172839.C08A31E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP%20trunk/builds/211 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings failed slave lost sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 20:01:20 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:01:20 +0200 (CEST) Subject: [Python-checkins] r43491 - in python/trunk: Lib/test/test_socket_ssl.py Misc/NEWS Modules/_ssl.c Message-ID: <20060331180120.6655F1E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:01:16 2006 New Revision: 43491 Modified: python/trunk/Lib/test/test_socket_ssl.py python/trunk/Misc/NEWS python/trunk/Modules/_ssl.c Log: Patch #1380952: fix SSL objects timing out on consecutive read()s Modified: python/trunk/Lib/test/test_socket_ssl.py ============================================================================== --- python/trunk/Lib/test/test_socket_ssl.py (original) +++ python/trunk/Lib/test/test_socket_ssl.py Fri Mar 31 20:01:16 2006 @@ -26,6 +26,19 @@ buf = f.read() f.close() +def test_timeout(): + test_support.requires('network') + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(30.0) + # connect to service which issues an welcome banner (without need to write anything) + s.connect(("gmail.org", 995)) + ss = socket.ssl(s) + # read part of return welcome banner twice,# read part of return welcome banner twice + ss.read(1) + ss.read(1) + s.close() + def test_rude_shutdown(): try: import threading @@ -74,6 +87,7 @@ raise test_support.TestSkipped("socket module has no ssl support") test_rude_shutdown() test_basic() + test_timeout() if __name__ == "__main__": test_main() Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 20:01:16 2006 @@ -303,6 +303,8 @@ Extension Modules ----------------- +- Patch #1380952: fix SSL objects timing out on consecutive read()s + - Patch #1309579: wait3 and wait4 were added to the posix module. - Patch #1231053: The audioop module now supports encoding/decoding of alaw. Modified: python/trunk/Modules/_ssl.c ============================================================================== --- python/trunk/Modules/_ssl.c (original) +++ python/trunk/Modules/_ssl.c Fri Mar 31 20:01:16 2006 @@ -474,15 +474,22 @@ if (!(buf = PyString_FromStringAndSize((char *) 0, len))) return NULL; - - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); - if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, "The read operation timed out"); - Py_DECREF(buf); - return NULL; - } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { - PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); - return NULL; + + /* first check if there are bytes ready to be read */ + Py_BEGIN_ALLOW_THREADS + count = SSL_pending(self->ssl); + Py_END_ALLOW_THREADS + + if (!count) { + sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + if (sockstate == SOCKET_HAS_TIMED_OUT) { + PyErr_SetString(PySSLErrorObject, "The read operation timed out"); + Py_DECREF(buf); + return NULL; + } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { + PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); + return NULL; + } } do { err = 0; From python-checkins at python.org Fri Mar 31 20:01:26 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:01:26 +0200 (CEST) Subject: [Python-checkins] r43492 - in python/branches/release24-maint: Lib/test/test_socket_ssl.py Misc/NEWS Modules/_ssl.c Message-ID: <20060331180126.A58021E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:01:24 2006 New Revision: 43492 Modified: python/branches/release24-maint/Lib/test/test_socket_ssl.py python/branches/release24-maint/Misc/NEWS python/branches/release24-maint/Modules/_ssl.c Log: Patch #1380952: fix SSL objects timing out on consecutive read()s (backport from rev. 43491) Modified: python/branches/release24-maint/Lib/test/test_socket_ssl.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_socket_ssl.py (original) +++ python/branches/release24-maint/Lib/test/test_socket_ssl.py Fri Mar 31 20:01:24 2006 @@ -27,6 +27,19 @@ buf = f.read() f.close() +def test_timeout(): + test_support.requires('network') + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(30.0) + # connect to service which issues an welcome banner (without need to write anything) + s.connect(("gmail.org", 995)) + ss = socket.ssl(s) + # read part of return welcome banner twice,# read part of return welcome banner twice + ss.read(1) + ss.read(1) + s.close() + def test_rude_shutdown(): try: import thread @@ -63,6 +76,7 @@ raise test_support.TestSkipped("socket module has no ssl support") test_rude_shutdown() test_basic() + test_timeout() if __name__ == "__main__": test_main() Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Fri Mar 31 20:01:24 2006 @@ -25,6 +25,8 @@ Extension Modules ----------------- +- Patch #1380952: fix SSL objects timing out on consecutive read()s + - Ubuntu bug #29289: Fixed a bug that the gb18030 codec raises RuntimeError on encoding surrogate pair area on UCS4 build. Modified: python/branches/release24-maint/Modules/_ssl.c ============================================================================== --- python/branches/release24-maint/Modules/_ssl.c (original) +++ python/branches/release24-maint/Modules/_ssl.c Fri Mar 31 20:01:24 2006 @@ -474,15 +474,22 @@ if (!(buf = PyString_FromStringAndSize((char *) 0, len))) return NULL; - - sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); - if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, "The read operation timed out"); - Py_DECREF(buf); - return NULL; - } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { - PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); - return NULL; + + /* first check if there are bytes ready to be read */ + Py_BEGIN_ALLOW_THREADS + count = SSL_pending(self->ssl); + Py_END_ALLOW_THREADS + + if (!count) { + sockstate = check_socket_and_wait_for_timeout(self->Socket, 0); + if (sockstate == SOCKET_HAS_TIMED_OUT) { + PyErr_SetString(PySSLErrorObject, "The read operation timed out"); + Py_DECREF(buf); + return NULL; + } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { + PyErr_SetString(PySSLErrorObject, "Underlying socket too large for select()."); + return NULL; + } } do { err = 0; From python-checkins at python.org Fri Mar 31 20:25:44 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:25:44 +0200 (CEST) Subject: [Python-checkins] r43493 - in python/trunk: Lib/copy_reg.py Lib/test/test_copy_reg.py Misc/NEWS Message-ID: <20060331182544.F025F1E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:25:44 2006 New Revision: 43493 Modified: python/trunk/Lib/copy_reg.py python/trunk/Lib/test/test_copy_reg.py python/trunk/Misc/NEWS Log: Patch #1462313, bug #1443328: the pickle modules now can handle classes that have __private names in their __slots__. Modified: python/trunk/Lib/copy_reg.py ============================================================================== --- python/trunk/Lib/copy_reg.py (original) +++ python/trunk/Lib/copy_reg.py Fri Mar 31 20:25:44 2006 @@ -116,8 +116,19 @@ # Slots found -- gather slot names from all base classes for c in cls.__mro__: if "__slots__" in c.__dict__: - names += [name for name in c.__dict__["__slots__"] - if name not in ("__dict__", "__weakref__")] + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, basestring): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + names.append('_%s%s' % (c.__name__, name)) + else: + names.append(name) # Cache the outcome in the class if at all possible try: Modified: python/trunk/Lib/test/test_copy_reg.py ============================================================================== --- python/trunk/Lib/test/test_copy_reg.py (original) +++ python/trunk/Lib/test/test_copy_reg.py Fri Mar 31 20:25:44 2006 @@ -8,6 +8,22 @@ pass +class WithoutSlots(object): + pass + +class WithWeakref(object): + __slots__ = ('__weakref__',) + +class WithPrivate(object): + __slots__ = ('__spam',) + +class WithSingleString(object): + __slots__ = 'spam' + +class WithInherited(WithSingleString): + __slots__ = ('eggs',) + + class CopyRegTestCase(unittest.TestCase): def test_class(self): @@ -84,6 +100,19 @@ self.assertRaises(ValueError, copy_reg.add_extension, mod, func, code) + def test_slotnames(self): + self.assertEquals(copy_reg._slotnames(WithoutSlots), []) + self.assertEquals(copy_reg._slotnames(WithWeakref), []) + expected = ['_WithPrivate__spam'] + self.assertEquals(copy_reg._slotnames(WithPrivate), expected) + self.assertEquals(copy_reg._slotnames(WithSingleString), ['spam']) + expected = ['eggs', 'spam'] + expected.sort() + result = copy_reg._slotnames(WithInherited) + result.sort() + self.assertEquals(result, expected) + + def test_main(): test_support.run_unittest(CopyRegTestCase) Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 20:25:44 2006 @@ -487,6 +487,9 @@ Library ------- +- Patch #1462313, bug #1443328: the pickle modules now can handle classes + that have __private names in their __slots__. + - Bug #1250170: mimetools now gracefully handles socket.gethostname() failures gracefully. From python-checkins at python.org Fri Mar 31 20:25:49 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:25:49 +0200 (CEST) Subject: [Python-checkins] r43494 - in python/branches/release24-maint: Lib/copy_reg.py Lib/test/test_copy_reg.py Misc/NEWS Message-ID: <20060331182549.E9E2D1E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:25:48 2006 New Revision: 43494 Modified: python/branches/release24-maint/Lib/copy_reg.py python/branches/release24-maint/Lib/test/test_copy_reg.py python/branches/release24-maint/Misc/NEWS Log: Patch #1462313, bug #1443328: the pickle modules now can handle classes that have __private names in their __slots__. (backport from rev. 43493) Modified: python/branches/release24-maint/Lib/copy_reg.py ============================================================================== --- python/branches/release24-maint/Lib/copy_reg.py (original) +++ python/branches/release24-maint/Lib/copy_reg.py Fri Mar 31 20:25:48 2006 @@ -116,8 +116,19 @@ # Slots found -- gather slot names from all base classes for c in cls.__mro__: if "__slots__" in c.__dict__: - names += [name for name in c.__dict__["__slots__"] - if name not in ("__dict__", "__weakref__")] + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, basestring): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + names.append('_%s%s' % (c.__name__, name)) + else: + names.append(name) # Cache the outcome in the class if at all possible try: Modified: python/branches/release24-maint/Lib/test/test_copy_reg.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_copy_reg.py (original) +++ python/branches/release24-maint/Lib/test/test_copy_reg.py Fri Mar 31 20:25:48 2006 @@ -8,6 +8,22 @@ pass +class WithoutSlots(object): + pass + +class WithWeakref(object): + __slots__ = ('__weakref__',) + +class WithPrivate(object): + __slots__ = ('__spam',) + +class WithSingleString(object): + __slots__ = 'spam' + +class WithInherited(WithSingleString): + __slots__ = ('eggs',) + + class CopyRegTestCase(unittest.TestCase): def test_class(self): @@ -84,6 +100,19 @@ self.assertRaises(ValueError, copy_reg.add_extension, mod, func, code) + def test_slotnames(self): + self.assertEquals(copy_reg._slotnames(WithoutSlots), []) + self.assertEquals(copy_reg._slotnames(WithWeakref), []) + expected = ['_WithPrivate__spam'] + self.assertEquals(copy_reg._slotnames(WithPrivate), expected) + self.assertEquals(copy_reg._slotnames(WithSingleString), ['spam']) + expected = ['eggs', 'spam'] + expected.sort() + result = copy_reg._slotnames(WithInherited) + result.sort() + self.assertEquals(result, expected) + + def test_main(): test_support.run_unittest(CopyRegTestCase) Modified: python/branches/release24-maint/Misc/NEWS ============================================================================== --- python/branches/release24-maint/Misc/NEWS (original) +++ python/branches/release24-maint/Misc/NEWS Fri Mar 31 20:25:48 2006 @@ -121,6 +121,9 @@ Library ------- +- Patch #1462313, bug #1443328: the pickle modules now can handle classes + that have __private names in their __slots__. + - A regrtest option -w was added to re-run failed tests in verbose mode. - Patch #1337756: fileinput now handles Unicode filenames correctly. From buildbot at python.org Fri Mar 31 20:26:05 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:26:05 +0000 Subject: [Python-checkins] buildbot warnings in x86 W2k 2.4 Message-ID: <20060331182605.644C31E4003@bag.python.org> The Buildbot has detected a new failure of x86 W2k 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20W2k%202.4/builds/46 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 20:26:49 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:26:49 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP-2 2.4 Message-ID: <20060331182649.7C78C1E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP-2 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP-2%202.4/builds/44 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 20:27:49 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:27:49 +0000 Subject: [Python-checkins] buildbot warnings in x86 W2k trunk Message-ID: <20060331182749.646821E4010@bag.python.org> The Buildbot has detected a new failure of x86 W2k trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20W2k%20trunk/builds/219 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 20:28:20 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:28:20 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP-2 trunk Message-ID: <20060331182820.D175C1E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP-2 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP-2%20trunk/builds/146 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 20:42:17 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:42:17 +0200 (CEST) Subject: [Python-checkins] r43495 - in python/trunk: Doc/lib/libgetpass.tex Lib/getpass.py Misc/NEWS Message-ID: <20060331184217.B98931E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:42:16 2006 New Revision: 43495 Modified: python/trunk/Doc/lib/libgetpass.tex python/trunk/Lib/getpass.py python/trunk/Misc/NEWS Log: Bug #1445068: getpass.getpass() can now be given an explicit stream argument to specify where to write the prompt. Modified: python/trunk/Doc/lib/libgetpass.tex ============================================================================== --- python/trunk/Doc/lib/libgetpass.tex (original) +++ python/trunk/Doc/lib/libgetpass.tex Fri Mar 31 20:42:16 2006 @@ -11,11 +11,15 @@ The \module{getpass} module provides two functions: -\begin{funcdesc}{getpass}{\optional{prompt}} +\begin{funcdesc}{getpass}{\optional{prompt\optional{, stream}}} Prompt the user for a password without echoing. The user is prompted using the string \var{prompt}, which defaults to - \code{'Password: '}. + \code{'Password: '}. On \UNIX, the prompt is written to the + file-like object \var{stream}, which defaults to + \code{sys.stdout} (this argument is ignored on Windows). + Availability: Macintosh, \UNIX, Windows. + \versionadded[The \var{stream} parameter]{2.5} \end{funcdesc} Modified: python/trunk/Lib/getpass.py ============================================================================== --- python/trunk/Lib/getpass.py (original) +++ python/trunk/Lib/getpass.py Fri Mar 31 20:42:16 2006 @@ -15,11 +15,14 @@ __all__ = ["getpass","getuser"] -def unix_getpass(prompt='Password: '): +def unix_getpass(prompt='Password: ', stream=None): """Prompt for a password, with echo turned off. + The prompt is written on stream, by default stdout. Restore terminal settings at end. """ + if stream is None: + stream = sys.stdout try: fd = sys.stdin.fileno() @@ -32,18 +35,18 @@ new[3] = new[3] & ~termios.ECHO # 3 == 'lflags' try: termios.tcsetattr(fd, termios.TCSADRAIN, new) - passwd = _raw_input(prompt) + passwd = _raw_input(prompt, stream) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old) - sys.stdout.write('\n') + stream.write('\n') return passwd -def win_getpass(prompt='Password: '): +def win_getpass(prompt='Password: ', stream=None): """Prompt for password with echo off, using Windows getch().""" if sys.stdin is not sys.__stdin__: - return default_getpass(prompt) + return default_getpass(prompt, stream) import msvcrt for c in prompt: msvcrt.putch(c) @@ -63,17 +66,19 @@ return pw -def default_getpass(prompt='Password: '): - print "Warning: Problem with getpass. Passwords may be echoed." - return _raw_input(prompt) +def default_getpass(prompt='Password: ', stream=None): + print >>sys.stderr, "Warning: Problem with getpass. Passwords may be echoed." + return _raw_input(prompt, stream) -def _raw_input(prompt=""): +def _raw_input(prompt="", stream=None): # A raw_input() replacement that doesn't save the string in the # GNU readline history. + if stream is None: + stream = sys.stdout prompt = str(prompt) if prompt: - sys.stdout.write(prompt) + stream.write(prompt) line = sys.stdin.readline() if not line: raise EOFError Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 20:42:16 2006 @@ -487,6 +487,9 @@ Library ------- +- Bug #1445068: getpass.getpass() can now be given an explicit stream + argument to specify where to write the prompt. + - Patch #1462313, bug #1443328: the pickle modules now can handle classes that have __private names in their __slots__. From buildbot at python.org Fri Mar 31 20:47:58 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:47:58 +0000 Subject: [Python-checkins] buildbot warnings in x86 gentoo 2.4 Message-ID: <20060331184758.5FE241E4003@bag.python.org> The Buildbot has detected a new failure of x86 gentoo 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20gentoo%202.4/builds/48 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 20:54:54 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 20:54:54 +0200 (CEST) Subject: [Python-checkins] r43496 - in python/trunk: Lib/test/test_builtin.py Misc/NEWS Python/bltinmodule.c Message-ID: <20060331185454.A5E931E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 20:54:53 2006 New Revision: 43496 Modified: python/trunk/Lib/test/test_builtin.py python/trunk/Misc/NEWS python/trunk/Python/bltinmodule.c Log: Patch #1460496: round() now accepts keyword arguments. Modified: python/trunk/Lib/test/test_builtin.py ============================================================================== --- python/trunk/Lib/test/test_builtin.py (original) +++ python/trunk/Lib/test/test_builtin.py Fri Mar 31 20:54:53 2006 @@ -1395,6 +1395,9 @@ self.assertEqual(round(-8.0, -1), -10.0) + # test new kwargs + self.assertEqual(round(number=-8.0, ndigits=-1), -10.0) + self.assertRaises(TypeError, round) def test_setattr(self): Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Fri Mar 31 20:54:53 2006 @@ -12,6 +12,8 @@ Core and builtins ----------------- +- Patch #1460496: round() now accepts keyword arguments. + - Fixed bug #1459029 - unicode reprs were double-escaped. - Patch #1396919: The system scope threads are reenabled on FreeBSD Modified: python/trunk/Python/bltinmodule.c ============================================================================== --- python/trunk/Python/bltinmodule.c (original) +++ python/trunk/Python/bltinmodule.c Fri Mar 31 20:54:53 2006 @@ -1870,32 +1870,34 @@ static PyObject * -builtin_round(PyObject *self, PyObject *args) +builtin_round(PyObject *self, PyObject *args, PyObject *kwds) { - double x; + double number; double f; int ndigits = 0; int i; + static char *kwlist[] = {"number", "ndigits", 0}; - if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits)) - return NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "d|i:round", + kwlist, &number, &ndigits)) + return NULL; f = 1.0; i = abs(ndigits); while (--i >= 0) f = f*10.0; if (ndigits < 0) - x /= f; + number /= f; else - x *= f; - if (x >= 0.0) - x = floor(x + 0.5); + number *= f; + if (number >= 0.0) + number = floor(number + 0.5); else - x = ceil(x - 0.5); + number = ceil(number - 0.5); if (ndigits < 0) - x *= f; + number *= f; else - x /= f; - return PyFloat_FromDouble(x); + number /= f; + return PyFloat_FromDouble(number); } PyDoc_STRVAR(round_doc, @@ -2248,7 +2250,7 @@ {"reduce", builtin_reduce, METH_VARARGS, reduce_doc}, {"reload", builtin_reload, METH_O, reload_doc}, {"repr", builtin_repr, METH_O, repr_doc}, - {"round", builtin_round, METH_VARARGS, round_doc}, + {"round", (PyCFunction)builtin_round, METH_VARARGS | METH_KEYWORDS, round_doc}, {"setattr", builtin_setattr, METH_VARARGS, setattr_doc}, {"sorted", (PyCFunction)builtin_sorted, METH_VARARGS | METH_KEYWORDS, sorted_doc}, {"sum", builtin_sum, METH_VARARGS, sum_doc}, From buildbot at python.org Fri Mar 31 20:57:20 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 18:57:20 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP 2.4 Message-ID: <20060331185720.8C00E1E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP%202.4/builds/43 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 21:09:11 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 19:09:11 +0000 Subject: [Python-checkins] buildbot warnings in x86 gentoo trunk Message-ID: <20060331190911.56B511E4003@bag.python.org> The Buildbot has detected a new failure of x86 gentoo trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20gentoo%20trunk/builds/230 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 21:09:57 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 21:09:57 +0200 (CEST) Subject: [Python-checkins] r43497 - python/trunk/Lib/test/test_socket_ssl.py Message-ID: <20060331190957.2CA3A1E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 21:09:56 2006 New Revision: 43497 Modified: python/trunk/Lib/test/test_socket_ssl.py Log: Disable test_socket_ssl timeout test on Windows. Modified: python/trunk/Lib/test/test_socket_ssl.py ============================================================================== --- python/trunk/Lib/test/test_socket_ssl.py (original) +++ python/trunk/Lib/test/test_socket_ssl.py Fri Mar 31 21:09:56 2006 @@ -1,5 +1,6 @@ # Test just the SSL support in the socket module, in a moderately bogus way. +import sys from test import test_support import socket @@ -26,18 +27,19 @@ buf = f.read() f.close() -def test_timeout(): - test_support.requires('network') - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.settimeout(30.0) - # connect to service which issues an welcome banner (without need to write anything) - s.connect(("gmail.org", 995)) - ss = socket.ssl(s) - # read part of return welcome banner twice,# read part of return welcome banner twice - ss.read(1) - ss.read(1) - s.close() +if not sys.platform.startswith('win'): + def test_timeout(): + test_support.requires('network') + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(30.0) + # connect to service which issues an welcome banner (without need to write anything) + s.connect(("gmail.org", 995)) + ss = socket.ssl(s) + # read part of return welcome banner twice,# read part of return welcome banner twice + ss.read(1) + ss.read(1) + s.close() def test_rude_shutdown(): try: From python-checkins at python.org Fri Mar 31 21:20:14 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 21:20:14 +0200 (CEST) Subject: [Python-checkins] r43498 - python/trunk/Doc/lib/libos.tex Message-ID: <20060331192014.A34B01E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 21:20:13 2006 New Revision: 43498 Modified: python/trunk/Doc/lib/libos.tex Log: bug #1444104: add note about fdopen() to os.open(). Modified: python/trunk/Doc/lib/libos.tex ============================================================================== --- python/trunk/Doc/lib/libos.tex (original) +++ python/trunk/Doc/lib/libos.tex Fri Mar 31 21:20:13 2006 @@ -547,7 +547,8 @@ This function is intended for low-level I/O. For normal usage, use the built-in function \function{open()}, which returns a ``file object'' with \method{read()} and \method{write()} methods (and many -more). +more). To wrap a file descriptor in a ``file object'', use +\function{fdopen()}. \end{notice} \end{funcdesc} From python-checkins at python.org Fri Mar 31 21:34:14 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 21:34:14 +0200 (CEST) Subject: [Python-checkins] r43499 - python/trunk/Lib/smtplib.py Message-ID: <20060331193414.2794F1E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 21:34:13 2006 New Revision: 43499 Modified: python/trunk/Lib/smtplib.py Log: bug #1257988: don't bail out on gethostbyname(gethostname()) failure Modified: python/trunk/Lib/smtplib.py ============================================================================== --- python/trunk/Lib/smtplib.py (original) +++ python/trunk/Lib/smtplib.py Fri Mar 31 21:34:13 2006 @@ -255,7 +255,11 @@ self.local_hostname = fqdn else: # We can't find an fqdn hostname, so use a domain literal - addr = socket.gethostbyname(socket.gethostname()) + addr = '127.0.0.1' + try: + addr = socket.gethostbyname(socket.gethostname()) + except socket.gaierror: + pass self.local_hostname = '[%s]' % addr def set_debuglevel(self, debuglevel): From python-checkins at python.org Fri Mar 31 21:34:18 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 21:34:18 +0200 (CEST) Subject: [Python-checkins] r43500 - python/branches/release24-maint/Lib/smtplib.py Message-ID: <20060331193418.34FC31E4008@bag.python.org> Author: georg.brandl Date: Fri Mar 31 21:34:17 2006 New Revision: 43500 Modified: python/branches/release24-maint/Lib/smtplib.py Log: bug #1257988: don't bail out on gethostbyname(gethostname()) failure (backport from rev. 43499) Modified: python/branches/release24-maint/Lib/smtplib.py ============================================================================== --- python/branches/release24-maint/Lib/smtplib.py (original) +++ python/branches/release24-maint/Lib/smtplib.py Fri Mar 31 21:34:17 2006 @@ -255,7 +255,11 @@ self.local_hostname = fqdn else: # We can't find an fqdn hostname, so use a domain literal - addr = socket.gethostbyname(socket.gethostname()) + addr = '127.0.0.1' + try: + addr = socket.gethostbyname(socket.gethostname()) + except socket.gaierror: + pass self.local_hostname = '[%s]' % addr def set_debuglevel(self, debuglevel): From buildbot at python.org Fri Mar 31 21:45:54 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 19:45:54 +0000 Subject: [Python-checkins] buildbot warnings in alpha Tru64 5.1 2.4 Message-ID: <20060331194554.69B161E4003@bag.python.org> The Buildbot has detected a new failure of alpha Tru64 5.1 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/alpha%20Tru64%205.1%202.4/builds/6 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 22:00:12 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:00:12 +0200 (CEST) Subject: [Python-checkins] r43501 - python/trunk/Modules/posixmodule.c Message-ID: <20060331200012.A75971E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:00:11 2006 New Revision: 43501 Modified: python/trunk/Modules/posixmodule.c Log: bug #1461855: make os.fdopen() add the O_APPEND flag if using "a" mode. glibc, for example, does this already on its own, but it seems that the solaris libc doesn't. This leads to Python code being able to over- write file contents even though having specified "a" mode. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Fri Mar 31 22:00:11 2006 @@ -5768,9 +5768,20 @@ "invalid file mode '%s'", mode); return NULL; } - Py_BEGIN_ALLOW_THREADS - fp = fdopen(fd, mode); + 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) + /* restore old mode if fdopen failed */ + fcntl(fd, F_SETFL, flags); + } else { + fp = fdopen(fd, mode); + } Py_END_ALLOW_THREADS if (fp == NULL) return posix_error(); From python-checkins at python.org Fri Mar 31 22:00:16 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:00:16 +0200 (CEST) Subject: [Python-checkins] r43502 - python/branches/release24-maint/Modules/posixmodule.c Message-ID: <20060331200016.6E7471E400D@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:00:15 2006 New Revision: 43502 Modified: python/branches/release24-maint/Modules/posixmodule.c Log: bug #1461855: make os.fdopen() add the O_APPEND flag if using "a" mode. glibc, for example, does this already on its own, but it seems that the solaris libc doesn't. This leads to Python code being able to over- write file contents even though having specified "a" mode. (backport from rev. 43501) Modified: python/branches/release24-maint/Modules/posixmodule.c ============================================================================== --- python/branches/release24-maint/Modules/posixmodule.c (original) +++ python/branches/release24-maint/Modules/posixmodule.c Fri Mar 31 22:00:15 2006 @@ -5458,9 +5458,20 @@ "invalid file mode '%s'", mode); return NULL; } - Py_BEGIN_ALLOW_THREADS - fp = fdopen(fd, mode); + 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) + /* restore old mode if fdopen failed */ + fcntl(fd, F_SETFL, flags); + } else { + fp = fdopen(fd, mode); + } Py_END_ALLOW_THREADS if (fp == NULL) return posix_error(); From python-checkins at python.org Fri Mar 31 22:02:43 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:02:43 +0200 (CEST) Subject: [Python-checkins] r43503 - python/trunk/Lib/urllib2.py Message-ID: <20060331200243.455941E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:02:40 2006 New Revision: 43503 Modified: python/trunk/Lib/urllib2.py Log: Update version number to 2.5 Modified: python/trunk/Lib/urllib2.py ============================================================================== --- python/trunk/Lib/urllib2.py (original) +++ python/trunk/Lib/urllib2.py Fri Mar 31 22:02:40 2006 @@ -119,7 +119,7 @@ # support for FileHandler, proxies via environment variables from urllib import localhost, url2pathname, getproxies -__version__ = "2.4" +__version__ = "2.5" _opener = None def urlopen(url, data=None): From buildbot at python.org Fri Mar 31 22:08:56 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:08:56 +0000 Subject: [Python-checkins] buildbot failure in x86 W2k trunk Message-ID: <20060331200856.328361E4003@bag.python.org> The Buildbot has detected a new failure of x86 W2k trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20W2k%20trunk/builds/225 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl BUILD FAILED: failed compile sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 22:09:18 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:09:18 +0000 Subject: [Python-checkins] buildbot failure in x86 XP-2 trunk Message-ID: <20060331200918.4C0581E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP-2 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP-2%20trunk/builds/152 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl BUILD FAILED: failed compile sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 22:27:23 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:27:23 +0200 (CEST) Subject: [Python-checkins] r43504 - python/trunk/Modules/posixmodule.c Message-ID: <20060331202723.14B801E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:27:22 2006 New Revision: 43504 Modified: python/trunk/Modules/posixmodule.c Log: Add guards against fcntl() not being available on Windows. Modified: python/trunk/Modules/posixmodule.c ============================================================================== --- python/trunk/Modules/posixmodule.c (original) +++ python/trunk/Modules/posixmodule.c Fri Mar 31 22:27:22 2006 @@ -5769,6 +5769,7 @@ return NULL; } 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; @@ -5782,6 +5783,9 @@ } else { fp = fdopen(fd, mode); } +#else + fp = fdopen(fd, mode); +#endif Py_END_ALLOW_THREADS if (fp == NULL) return posix_error(); From python-checkins at python.org Fri Mar 31 22:27:27 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:27:27 +0200 (CEST) Subject: [Python-checkins] r43505 - python/branches/release24-maint/Modules/posixmodule.c Message-ID: <20060331202727.942781E4003@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:27:27 2006 New Revision: 43505 Modified: python/branches/release24-maint/Modules/posixmodule.c Log: Add guards against fcntl() not being available on Windows. (backport from rev. 43504) Modified: python/branches/release24-maint/Modules/posixmodule.c ============================================================================== --- python/branches/release24-maint/Modules/posixmodule.c (original) +++ python/branches/release24-maint/Modules/posixmodule.c Fri Mar 31 22:27:27 2006 @@ -5459,6 +5459,7 @@ return NULL; } 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; @@ -5472,6 +5473,9 @@ } else { fp = fdopen(fd, mode); } +#else + fp = fdopen(fd, mode); +#endif Py_END_ALLOW_THREADS if (fp == NULL) return posix_error(); From python-checkins at python.org Fri Mar 31 22:31:03 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:31:03 +0200 (CEST) Subject: [Python-checkins] r43506 - python/trunk/Objects/fileobject.c Message-ID: <20060331203103.71E9B1E4022@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:31:02 2006 New Revision: 43506 Modified: python/trunk/Objects/fileobject.c Log: Bug #1177964: make file iterator raise MemoryError on too big files Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Fri Mar 31 22:31:02 2006 @@ -1797,7 +1797,7 @@ /* Make sure that file has a readahead buffer with at least one byte (unless at EOF) and no more than bufsize. Returns negative value on - error */ + error, will set MemoryError if bufsize bytes cannot be allocated. */ static int readahead(PyFileObject *f, int bufsize) { @@ -1810,6 +1810,7 @@ drop_readahead(f); } if ((f->f_buf = PyMem_Malloc(bufsize)) == NULL) { + PyErr_NoMemory(); return -1; } Py_BEGIN_ALLOW_THREADS From python-checkins at python.org Fri Mar 31 22:31:06 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 22:31:06 +0200 (CEST) Subject: [Python-checkins] r43507 - python/branches/release24-maint/Objects/fileobject.c Message-ID: <20060331203106.685531E401E@bag.python.org> Author: georg.brandl Date: Fri Mar 31 22:31:05 2006 New Revision: 43507 Modified: python/branches/release24-maint/Objects/fileobject.c Log: Bug #1177964: make file iterator raise MemoryError on too big files (backport from rev. 43506) Modified: python/branches/release24-maint/Objects/fileobject.c ============================================================================== --- python/branches/release24-maint/Objects/fileobject.c (original) +++ python/branches/release24-maint/Objects/fileobject.c Fri Mar 31 22:31:05 2006 @@ -1697,7 +1697,7 @@ /* Make sure that file has a readahead buffer with at least one byte (unless at EOF) and no more than bufsize. Returns negative value on - error */ + error, will set MemoryError if bufsize bytes cannot be allocated. */ static int readahead(PyFileObject *f, int bufsize) { @@ -1710,6 +1710,7 @@ drop_readahead(f); } if ((f->f_buf = PyMem_Malloc(bufsize)) == NULL) { + PyErr_NoMemory(); return -1; } Py_BEGIN_ALLOW_THREADS From buildbot at python.org Fri Mar 31 22:43:17 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:43:17 +0000 Subject: [Python-checkins] buildbot warnings in alpha Tru64 5.1 trunk Message-ID: <20060331204317.257FD1E4003@bag.python.org> The Buildbot has detected a new failure of alpha Tru64 5.1 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/alpha%20Tru64%205.1%20trunk/builds/51 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 22:53:47 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:53:47 +0000 Subject: [Python-checkins] buildbot warnings in x86 XP-2 trunk Message-ID: <20060331205347.B72401E4003@bag.python.org> The Buildbot has detected a new failure of x86 XP-2 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP-2%20trunk/builds/153 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 22:55:12 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:55:12 +0000 Subject: [Python-checkins] buildbot warnings in x86 W2k trunk Message-ID: <20060331205512.739631E400E@bag.python.org> The Buildbot has detected a new failure of x86 W2k trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20W2k%20trunk/builds/226 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From buildbot at python.org Fri Mar 31 22:55:49 2006 From: buildbot at python.org (buildbot at python.org) Date: Fri, 31 Mar 2006 20:55:49 +0000 Subject: [Python-checkins] buildbot warnings in x86 gentoo 2.4 Message-ID: <20060331205549.CEB711E4003@bag.python.org> The Buildbot has detected a new failure of x86 gentoo 2.4. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20gentoo%202.4/builds/52 Buildbot URL: http://www.python.org/dev/buildbot/all/ Build Reason: Build Source Stamp: [branch branches/release24-maint] HEAD Blamelist: georg.brandl Build Had Warnings: warnings test sincerely, -The Buildbot From python-checkins at python.org Fri Mar 31 23:12:33 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 23:12:33 +0200 (CEST) Subject: [Python-checkins] r43508 - python/trunk/Lib/test/test_socket_ssl.py Message-ID: <20060331211233.51FAA1E4008@bag.python.org> Author: georg.brandl Date: Fri Mar 31 23:12:32 2006 New Revision: 43508 Modified: python/trunk/Lib/test/test_socket_ssl.py Log: Make test_socket_ssl finally pass on WIn Modified: python/trunk/Lib/test/test_socket_ssl.py ============================================================================== --- python/trunk/Lib/test/test_socket_ssl.py (original) +++ python/trunk/Lib/test/test_socket_ssl.py Fri Mar 31 23:12:32 2006 @@ -40,6 +40,9 @@ ss.read(1) ss.read(1) s.close() +else: + def test_timeout(): + pass def test_rude_shutdown(): try: From python-checkins at python.org Fri Mar 31 23:13:21 2006 From: python-checkins at python.org (georg.brandl) Date: Fri, 31 Mar 2006 23:13:21 +0200 (CEST) Subject: [Python-checkins] r43509 - python/branches/release24-maint/Lib/test/test_socket_ssl.py Message-ID: <20060331211321.3E1201E4006@bag.python.org> Author: georg.brandl Date: Fri Mar 31 23:13:20 2006 New Revision: 43509 Modified: python/branches/release24-maint/Lib/test/test_socket_ssl.py Log: Make test_socket_ssl pass on Windows Modified: python/branches/release24-maint/Lib/test/test_socket_ssl.py ============================================================================== --- python/branches/release24-maint/Lib/test/test_socket_ssl.py (original) +++ python/branches/release24-maint/Lib/test/test_socket_ssl.py Fri Mar 31 23:13:20 2006 @@ -1,5 +1,6 @@ # Test just the SSL support in the socket module, in a moderately bogus way. +import sys from test import test_support import socket import time @@ -27,18 +28,22 @@ buf = f.read() f.close() -def test_timeout(): - test_support.requires('network') +if not sys.platform.startswith('win'): + def test_timeout(): + test_support.requires('network') - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.settimeout(30.0) - # connect to service which issues an welcome banner (without need to write anything) - s.connect(("gmail.org", 995)) - ss = socket.ssl(s) - # read part of return welcome banner twice,# read part of return welcome banner twice - ss.read(1) - ss.read(1) - s.close() + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(30.0) + # connect to service which issues an welcome banner (without need to write anything) + s.connect(("gmail.org", 995)) + ss = socket.ssl(s) + # read part of return welcome banner twice,# read part of return welcome banner twice + ss.read(1) + ss.read(1) + s.close() +else: + def test_timeout(): + pass def test_rude_shutdown(): try: