[Python-checkins] r60742 - in python/branches/trunk-math: Demo/classes/README Doc/Makefile Doc/README.txt Doc/builddoc.bat Doc/c-api/float.rst Doc/c-api/int.rst Doc/c-api/set.rst Doc/conf.py Doc/extending/windows.rst Doc/howto/advocacy.rst Doc/howto/curses.rst Doc/howto/regex.rst Doc/howto/unicode.rst Doc/includes/email-alternative.py Doc/library/calendar.rst Doc/library/curses.rst Doc/library/decimal.rst Doc/library/email-examples.rst Doc/library/fractions.rst Doc/library/functions.rst Doc/library/itertools.rst Doc/library/math.rst Doc/library/numbers.rst Doc/library/pickletools.rst Doc/library/queue.rst Doc/library/rational.rst Doc/library/re.rst Doc/library/socket.rst Doc/library/stdtypes.rst Doc/library/sys.rst Doc/library/tempfile.rst Doc/library/urllib2.rst Doc/library/userdict.rst Doc/make.bat Doc/reference/datamodel.rst Doc/whatsnew/2.6.rst Include/abstract.h Include/floatobject.h Include/intobject.h Include/longobject.h Include/pyport.h Include/pythonrun.h Include/setobject.h Lib/DocXMLRPCServer.py Lib/UserList.py Lib/UserString.py Lib/_abcoll.py Lib/calendar.py Lib/decimal.py Lib/distutils/__init__.py Lib/distutils/command/build_ext.py Lib/distutils/sysconfig.py Lib/fractions.py Lib/numbers.py Lib/pickletools.py Lib/pydoc.py Lib/rational.py Lib/re.py Lib/tarfile.py Lib/tempfile.py Lib/test/cjkencodings_test.py Lib/test/output/test_cProfile Lib/test/output/test_profile Lib/test/profilee.py Lib/test/regrtest.py Lib/test/seq_tests.py Lib/test/test_abstract_numbers.py Lib/test/test_builtin.py Lib/test/test_cProfile.py Lib/test/test_codecmaps_hk.py Lib/test/test_complex.py Lib/test/test_contains.py Lib/test/test_cprofile.py Lib/test/test_decimal.py Lib/test/test_defaultdict.py Lib/test/test_descr.py Lib/test/test_docxmlrpc.py Lib/test/test_fractions.py Lib/test/test_funcattrs.py Lib/test/test_iterlen.py Lib/test/test_largefile.py Lib/test/test_mailbox.py Lib/test/test_math.py Lib/test/test_multibytecodec_support.py Lib/test/test_pickletools.py Lib/test/test_profile.py Lib/test/test_queue.py Lib/test/test_rational.py Lib/test/test_socket_ssl.py Lib/test/test_socketserver.py Lib/test/test_sys.py Lib/test/test_tarfile.py Lib/test/test_tempfile.py Lib/test/test_trace.py Lib/test/test_urllib2.py Lib/test/test_wave.py Lib/test/testtar.tar Lib/urllib2.py Misc/ACKS Misc/NEWS Misc/build.sh Misc/python-mode.el Modules/_bsddb.c Modules/_collectionsmodule.c Modules/_ctypes/_ctypes.c Modules/_ctypes/libffi/src/x86/ffi_darwin.c Modules/cjkcodecs/_codecs_hk.c Modules/cjkcodecs/mappings_hk.h Modules/mathmodule.c Modules/posixmodule.c Objects/abstract.c Objects/classobject.c Objects/dictobject.c Objects/floatobject.c Objects/frameobject.c Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/methodobject.c Objects/rangeobject.c Objects/setobject.c Objects/tupleobject.c Objects/unicodeobject.c PC/os2emx/Makefile PC/os2emx/README.os2emx PC/os2emx/python25.def PC/os2emx/python26.def PC/pyconfig.h PC/readme.txt PCbuild/_bsddb.vcproj PCbuild/build.bat PCbuild/pyd.vsprops PCbuild/pyd_d.vsprops PCbuild/readme.txt Python/bltinmodule.c Python/compile.c Python/import.c Python/marshal.c Python/pythonrun.c Python/strtod.c Python/sysmodule.c README configure configure.in pyconfig.h.in setup.py

christian.heimes python-checkins at python.org
Tue Feb 12 06:36:27 CET 2008


Author: christian.heimes
Date: Tue Feb 12 06:36:19 2008
New Revision: 60742

Added:
   python/branches/trunk-math/Doc/includes/email-alternative.py
      - copied unchanged from r60734, python/trunk/Doc/includes/email-alternative.py
   python/branches/trunk-math/Doc/library/fractions.rst
      - copied unchanged from r60734, python/trunk/Doc/library/fractions.rst
   python/branches/trunk-math/Doc/make.bat
      - copied unchanged from r60734, python/trunk/Doc/make.bat
   python/branches/trunk-math/Lib/fractions.py
      - copied unchanged from r60734, python/trunk/Lib/fractions.py
   python/branches/trunk-math/Lib/test/profilee.py
      - copied unchanged from r60734, python/trunk/Lib/test/profilee.py
   python/branches/trunk-math/Lib/test/test_cprofile.py
      - copied unchanged from r60734, python/trunk/Lib/test/test_cprofile.py
   python/branches/trunk-math/Lib/test/test_fractions.py
      - copied unchanged from r60734, python/trunk/Lib/test/test_fractions.py
   python/branches/trunk-math/PC/os2emx/python26.def
      - copied unchanged from r60734, python/trunk/PC/os2emx/python26.def
Removed:
   python/branches/trunk-math/Doc/builddoc.bat
   python/branches/trunk-math/Doc/library/rational.rst
   python/branches/trunk-math/Lib/rational.py
   python/branches/trunk-math/Lib/test/output/test_cProfile
   python/branches/trunk-math/Lib/test/output/test_profile
   python/branches/trunk-math/Lib/test/test_cProfile.py
   python/branches/trunk-math/Lib/test/test_rational.py
   python/branches/trunk-math/PC/os2emx/python25.def
Modified:
   python/branches/trunk-math/   (props changed)
   python/branches/trunk-math/Demo/classes/README
   python/branches/trunk-math/Doc/Makefile
   python/branches/trunk-math/Doc/README.txt
   python/branches/trunk-math/Doc/c-api/float.rst
   python/branches/trunk-math/Doc/c-api/int.rst
   python/branches/trunk-math/Doc/c-api/set.rst
   python/branches/trunk-math/Doc/conf.py
   python/branches/trunk-math/Doc/extending/windows.rst
   python/branches/trunk-math/Doc/howto/advocacy.rst
   python/branches/trunk-math/Doc/howto/curses.rst
   python/branches/trunk-math/Doc/howto/regex.rst
   python/branches/trunk-math/Doc/howto/unicode.rst
   python/branches/trunk-math/Doc/library/calendar.rst
   python/branches/trunk-math/Doc/library/curses.rst
   python/branches/trunk-math/Doc/library/decimal.rst
   python/branches/trunk-math/Doc/library/email-examples.rst
   python/branches/trunk-math/Doc/library/functions.rst
   python/branches/trunk-math/Doc/library/itertools.rst
   python/branches/trunk-math/Doc/library/math.rst
   python/branches/trunk-math/Doc/library/numbers.rst
   python/branches/trunk-math/Doc/library/pickletools.rst
   python/branches/trunk-math/Doc/library/queue.rst
   python/branches/trunk-math/Doc/library/re.rst
   python/branches/trunk-math/Doc/library/socket.rst
   python/branches/trunk-math/Doc/library/stdtypes.rst
   python/branches/trunk-math/Doc/library/sys.rst
   python/branches/trunk-math/Doc/library/tempfile.rst
   python/branches/trunk-math/Doc/library/urllib2.rst
   python/branches/trunk-math/Doc/library/userdict.rst
   python/branches/trunk-math/Doc/reference/datamodel.rst
   python/branches/trunk-math/Doc/whatsnew/2.6.rst
   python/branches/trunk-math/Include/abstract.h
   python/branches/trunk-math/Include/floatobject.h
   python/branches/trunk-math/Include/intobject.h
   python/branches/trunk-math/Include/longobject.h
   python/branches/trunk-math/Include/pyport.h
   python/branches/trunk-math/Include/pythonrun.h
   python/branches/trunk-math/Include/setobject.h
   python/branches/trunk-math/Lib/DocXMLRPCServer.py
   python/branches/trunk-math/Lib/UserList.py
   python/branches/trunk-math/Lib/UserString.py
   python/branches/trunk-math/Lib/_abcoll.py
   python/branches/trunk-math/Lib/calendar.py
   python/branches/trunk-math/Lib/decimal.py
   python/branches/trunk-math/Lib/distutils/__init__.py
   python/branches/trunk-math/Lib/distutils/command/build_ext.py
   python/branches/trunk-math/Lib/distutils/sysconfig.py
   python/branches/trunk-math/Lib/numbers.py
   python/branches/trunk-math/Lib/pickletools.py
   python/branches/trunk-math/Lib/pydoc.py
   python/branches/trunk-math/Lib/re.py
   python/branches/trunk-math/Lib/tarfile.py
   python/branches/trunk-math/Lib/tempfile.py
   python/branches/trunk-math/Lib/test/cjkencodings_test.py
   python/branches/trunk-math/Lib/test/regrtest.py
   python/branches/trunk-math/Lib/test/seq_tests.py
   python/branches/trunk-math/Lib/test/test_abstract_numbers.py
   python/branches/trunk-math/Lib/test/test_builtin.py
   python/branches/trunk-math/Lib/test/test_codecmaps_hk.py
   python/branches/trunk-math/Lib/test/test_complex.py
   python/branches/trunk-math/Lib/test/test_contains.py
   python/branches/trunk-math/Lib/test/test_decimal.py
   python/branches/trunk-math/Lib/test/test_defaultdict.py
   python/branches/trunk-math/Lib/test/test_descr.py
   python/branches/trunk-math/Lib/test/test_docxmlrpc.py
   python/branches/trunk-math/Lib/test/test_funcattrs.py
   python/branches/trunk-math/Lib/test/test_iterlen.py
   python/branches/trunk-math/Lib/test/test_largefile.py
   python/branches/trunk-math/Lib/test/test_mailbox.py
   python/branches/trunk-math/Lib/test/test_math.py
   python/branches/trunk-math/Lib/test/test_multibytecodec_support.py
   python/branches/trunk-math/Lib/test/test_pickletools.py
   python/branches/trunk-math/Lib/test/test_profile.py   (contents, props changed)
   python/branches/trunk-math/Lib/test/test_queue.py
   python/branches/trunk-math/Lib/test/test_socket_ssl.py
   python/branches/trunk-math/Lib/test/test_socketserver.py
   python/branches/trunk-math/Lib/test/test_sys.py
   python/branches/trunk-math/Lib/test/test_tarfile.py
   python/branches/trunk-math/Lib/test/test_tempfile.py
   python/branches/trunk-math/Lib/test/test_trace.py
   python/branches/trunk-math/Lib/test/test_urllib2.py
   python/branches/trunk-math/Lib/test/test_wave.py
   python/branches/trunk-math/Lib/test/testtar.tar
   python/branches/trunk-math/Lib/urllib2.py
   python/branches/trunk-math/Misc/ACKS
   python/branches/trunk-math/Misc/NEWS
   python/branches/trunk-math/Misc/build.sh
   python/branches/trunk-math/Misc/python-mode.el
   python/branches/trunk-math/Modules/_bsddb.c
   python/branches/trunk-math/Modules/_collectionsmodule.c
   python/branches/trunk-math/Modules/_ctypes/_ctypes.c
   python/branches/trunk-math/Modules/_ctypes/libffi/src/x86/ffi_darwin.c
   python/branches/trunk-math/Modules/cjkcodecs/_codecs_hk.c
   python/branches/trunk-math/Modules/cjkcodecs/mappings_hk.h
   python/branches/trunk-math/Modules/mathmodule.c
   python/branches/trunk-math/Modules/posixmodule.c
   python/branches/trunk-math/Objects/abstract.c
   python/branches/trunk-math/Objects/classobject.c
   python/branches/trunk-math/Objects/dictobject.c
   python/branches/trunk-math/Objects/floatobject.c
   python/branches/trunk-math/Objects/frameobject.c
   python/branches/trunk-math/Objects/intobject.c
   python/branches/trunk-math/Objects/listobject.c
   python/branches/trunk-math/Objects/longobject.c
   python/branches/trunk-math/Objects/methodobject.c
   python/branches/trunk-math/Objects/rangeobject.c
   python/branches/trunk-math/Objects/setobject.c
   python/branches/trunk-math/Objects/tupleobject.c
   python/branches/trunk-math/Objects/unicodeobject.c
   python/branches/trunk-math/PC/os2emx/Makefile
   python/branches/trunk-math/PC/os2emx/README.os2emx
   python/branches/trunk-math/PC/pyconfig.h
   python/branches/trunk-math/PC/readme.txt
   python/branches/trunk-math/PCbuild/_bsddb.vcproj
   python/branches/trunk-math/PCbuild/build.bat
   python/branches/trunk-math/PCbuild/pyd.vsprops
   python/branches/trunk-math/PCbuild/pyd_d.vsprops
   python/branches/trunk-math/PCbuild/readme.txt
   python/branches/trunk-math/Python/bltinmodule.c
   python/branches/trunk-math/Python/compile.c
   python/branches/trunk-math/Python/import.c
   python/branches/trunk-math/Python/marshal.c
   python/branches/trunk-math/Python/pythonrun.c
   python/branches/trunk-math/Python/strtod.c
   python/branches/trunk-math/Python/sysmodule.c
   python/branches/trunk-math/README
   python/branches/trunk-math/configure
   python/branches/trunk-math/configure.in
   python/branches/trunk-math/pyconfig.h.in
   python/branches/trunk-math/setup.py
Log:
Merged revisions 60445-60734 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r60448 | christian.heimes | 2008-01-30 18:21:22 +0100 (Wed, 30 Jan 2008) | 1 line
  
  Fixed some references leaks in sys.
........
  r60450 | christian.heimes | 2008-01-30 19:58:29 +0100 (Wed, 30 Jan 2008) | 1 line
  
  The previous change was causing a segfault after multiple calls to Py_Initialize() and Py_Finalize().
........
  r60463 | raymond.hettinger | 2008-01-30 23:17:31 +0100 (Wed, 30 Jan 2008) | 1 line
  
  Update itertool recipes
........
  r60464 | christian.heimes | 2008-01-30 23:54:18 +0100 (Wed, 30 Jan 2008) | 1 line
  
  Bug #1234: Fixed semaphore errors on AIX 5.2
........
  r60469 | raymond.hettinger | 2008-01-31 02:38:15 +0100 (Thu, 31 Jan 2008) | 6 lines
  
  Fix defect in __ixor__ which would get the wrong
  answer if the input iterable had a duplicate element
  (two calls to toggle() reverse each other).  Borrow
  the correct code from sets.py.
........
  r60470 | raymond.hettinger | 2008-01-31 02:42:11 +0100 (Thu, 31 Jan 2008) | 1 line
  
  Missing return
........
  r60471 | jeffrey.yasskin | 2008-01-31 08:44:11 +0100 (Thu, 31 Jan 2008) | 4 lines
  
  Added more documentation on how mixed-mode arithmetic should be implemented. I
  also noticed and fixed a bug in Rational's forward operators (they were
  claiming all instances of numbers.Rational instead of just the concrete types).
........
  r60480 | jeffrey.yasskin | 2008-01-31 18:45:59 +0100 (Thu, 31 Jan 2008) | 3 lines
  
  Remove unused to-be-magic methods from Rational per issue 1968. Do not port
  this patch to py3k.
........
  r60482 | raymond.hettinger | 2008-01-31 23:07:16 +0100 (Thu, 31 Jan 2008) | 1 line
  
  Minor wordsmithing on docstring
........
  r60483 | mark.dickinson | 2008-01-31 23:17:37 +0100 (Thu, 31 Jan 2008) | 5 lines
  
  Issue #1678380.  Fix a bug that identifies 0j and -0j when they appear
  in the same code unit. The fix is essentially the same as the fix for a
  previous bug identifying 0. and -0.
........
  r60484 | christian.heimes | 2008-02-01 00:08:23 +0100 (Fri, 01 Feb 2008) | 1 line
  
  Fixed bug #1983: Return from fork() is pid_t, not int
........
  r60486 | jeffrey.yasskin | 2008-02-01 07:22:46 +0100 (Fri, 01 Feb 2008) | 4 lines
  
  Move __builtins__.trunc() to math.trunc() per
  http://mail.python.org/pipermail/python-dev/2008-January/076626.html and issue
  1965.
........
  r60487 | jeffrey.yasskin | 2008-02-01 08:05:46 +0100 (Fri, 01 Feb 2008) | 3 lines
  
  Roll back r60248. It's useful to encourage users not to change Rational
  instances.
........
  r60488 | neal.norwitz | 2008-02-01 08:22:59 +0100 (Fri, 01 Feb 2008) | 1 line
  
  Fix refleak
........
  r60493 | georg.brandl | 2008-02-01 12:59:08 +0100 (Fri, 01 Feb 2008) | 2 lines
  
  Update IPv6 RFC number.
........
  r60497 | georg.brandl | 2008-02-01 16:50:15 +0100 (Fri, 01 Feb 2008) | 2 lines
  
  Add link checker builder, written for GHOP by Thomas Lamb.
........
  r60500 | georg.brandl | 2008-02-01 19:08:09 +0100 (Fri, 01 Feb 2008) | 2 lines
  
  Rename batch file.
........
  r60504 | christian.heimes | 2008-02-01 19:49:26 +0100 (Fri, 01 Feb 2008) | 1 line
  
  More int -> pid_t.
........
  r60507 | georg.brandl | 2008-02-01 20:24:01 +0100 (Fri, 01 Feb 2008) | 2 lines
  
  Wording nit.
........
  r60510 | georg.brandl | 2008-02-01 21:45:33 +0100 (Fri, 01 Feb 2008) | 2 lines
  
  Update for latest sphinx latex writer.
........
  r60511 | raymond.hettinger | 2008-02-01 22:30:23 +0100 (Fri, 01 Feb 2008) | 1 line
  
  Issue #1996: float.as_integer_ratio() should return fraction in lowest terms.
........
  r60512 | raymond.hettinger | 2008-02-01 23:15:52 +0100 (Fri, 01 Feb 2008) | 1 line
  
  Integer ratio should return ints instead of longs whereever possible.
........
  r60513 | raymond.hettinger | 2008-02-01 23:22:50 +0100 (Fri, 01 Feb 2008) | 1 line
  
  labs() takes a long for an input.
........
  r60514 | raymond.hettinger | 2008-02-01 23:42:59 +0100 (Fri, 01 Feb 2008) | 1 line
  
  Test round-trip on float.as_integer_ratio() and float.__truediv__().
........
  r60515 | marc-andre.lemburg | 2008-02-01 23:58:17 +0100 (Fri, 01 Feb 2008) | 3 lines
  
  Bump distutils version number to match Python version.
........
  r60516 | raymond.hettinger | 2008-02-02 00:12:19 +0100 (Sat, 02 Feb 2008) | 1 line
  
  Fix int/long typecase.  Add check for non-binary floating point.
........
  r60517 | raymond.hettinger | 2008-02-02 00:45:44 +0100 (Sat, 02 Feb 2008) | 1 line
  
  Add protection from weirdness while scaling the mantissa to an integer.
........
  r60518 | raymond.hettinger | 2008-02-02 06:11:40 +0100 (Sat, 02 Feb 2008) | 1 line
  
  Simpler solution to handling non-IEEE 754 environments.
........
  r60519 | raymond.hettinger | 2008-02-02 06:24:44 +0100 (Sat, 02 Feb 2008) | 1 line
  
  Neaten-up a bit.
........
  r60520 | georg.brandl | 2008-02-02 10:56:20 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Amendments to the urllib2 docs, written for GHOP by Thomas Lamb.
........
  r60521 | georg.brandl | 2008-02-02 11:12:36 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Rewrite test_descr as unittest, written for GHOP by Jeff Wheeler.
........
  r60522 | georg.brandl | 2008-02-02 11:18:15 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Rewrite test_funcattrs as unittest, written for GHOP by Jeff Wheeler.
........
  r60525 | georg.brandl | 2008-02-02 11:49:58 +0100 (Sat, 02 Feb 2008) | 3 lines
  
  Add email example how to send a multipart message.
  Written for GHOP by Martin Matejek.
........
  r60526 | georg.brandl | 2008-02-02 12:05:00 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Rewrite test_socketserver as unittest, written for GHOP by Benjamin Petersen.
........
  r60527 | georg.brandl | 2008-02-02 12:05:34 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Add GHOP contributor.
........
  r60528 | georg.brandl | 2008-02-02 12:39:29 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Rewrite test_queue as unittest. Written for GHOP by Ian Seyer.
........
  r60529 | georg.brandl | 2008-02-02 12:46:07 +0100 (Sat, 02 Feb 2008) | 3 lines
  
  Rewrite test_cprofile as unittest (and rename the file to be consistent
  with all other test files). Written for GHOP by Benjamin Peterson.
........
  r60530 | mark.dickinson | 2008-02-02 18:16:13 +0100 (Sat, 02 Feb 2008) | 2 lines
  
  Make the Rational constructor accept '3.' and '.2' as well as '3.2'.
........
  r60531 | neal.norwitz | 2008-02-02 19:52:51 +0100 (Sat, 02 Feb 2008) | 1 line
  
  Update the leaky tests (ie, ignore these tests if they report leaks).  This version has been running for a while.
........
  r60533 | skip.montanaro | 2008-02-02 20:11:57 +0100 (Sat, 02 Feb 2008) | 7 lines
  
  Split the refleak mail body into two parts, the first being those failing
  tests which are deemed more important issues, the second those which are
  known to have difficult to solve problems and are generally expected to
  leak.  Hopefully this doesn't break the script...
........
  r60534 | georg.brandl | 2008-02-03 00:59:21 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Fix a conversion mistake that caused test_queue to fail intermittently.
........
  r60535 | georg.brandl | 2008-02-03 01:04:50 +0100 (Sun, 03 Feb 2008) | 3 lines
  
  Wait for a delay before reaping children -- this should fix the 
  test_socketserver failures on several platforms.
........
  r60536 | brett.cannon | 2008-02-03 03:07:55 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Fix a minor typo.
........
  r60537 | brett.cannon | 2008-02-03 03:08:45 +0100 (Sun, 03 Feb 2008) | 3 lines
  
  Directories from CPPFLAGS and LDFLAGS were being added in the reverse order for
  searches as to how they were listed in the environment variable.
........
  r60538 | brett.cannon | 2008-02-03 03:34:14 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Remove extra tick marks and add a missing closing parenthesis.
........
  r60539 | brett.cannon | 2008-02-03 03:43:01 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Use context manager for a lock.
........
  r60540 | andrew.macintyre | 2008-02-03 07:58:06 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Update OS/2 EMX build bits for 2.6.
........
  r60541 | andrew.macintyre | 2008-02-03 08:01:11 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Rename module definition file to reflect v2.6.
........
  r60542 | andrew.macintyre | 2008-02-03 08:07:31 +0100 (Sun, 03 Feb 2008) | 6 lines
  
  The wrapper function is supposed to be for spawnvpe() so that's
  what we should call [this wrapper only available on OS/2].
  
  Backport candidate to 2.5.
........
  r60544 | gregory.p.smith | 2008-02-03 08:20:53 +0100 (Sun, 03 Feb 2008) | 6 lines
  
  Merge this fix from the pybsddb tree:
  r293 | jcea | 2008-01-31 01:08:19 -0800 (Thu, 31 Jan 2008) | 4 lines
  
  Solved memory leak when using cursors with
  databases without environment.
........
  r60546 | gregory.p.smith | 2008-02-03 09:01:46 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  remove a repeated occurance of a hardcoded berkeleydb library version number
........
  r60549 | brett.cannon | 2008-02-03 10:59:21 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Add an entry for r60537.
........
  r60550 | georg.brandl | 2008-02-03 13:29:00 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  #2003: fix sentence.
........
  r60551 | christian.heimes | 2008-02-03 15:34:18 +0100 (Sun, 03 Feb 2008) | 2 lines
  
  Fixed paths to Windows build directories in build_ext.py
  Use vsbuild instead of devenv in build.bat and _bsddb.vcproj
........
  r60553 | neal.norwitz | 2008-02-03 17:53:09 +0100 (Sun, 03 Feb 2008) | 1 line
  
  Ignore leaky warnings from test_asynchat
........
  r60555 | christian.heimes | 2008-02-03 20:51:13 +0100 (Sun, 03 Feb 2008) | 1 line
  
  Another int -> pid_t case
........
  r60560 | amaury.forgeotdarc | 2008-02-03 23:51:43 +0100 (Sun, 03 Feb 2008) | 6 lines
  
  Ensure that PySet_Add() operates on a newly created frozenset, like PyTuple_SetItem does.
  
  Add PyFrozenSet_Check(), which was not needed before; The list of Py*Set_Check* macros seems to be complete now.
  
  Add missing NEWS entries about all this.
........
  r60563 | amaury.forgeotdarc | 2008-02-04 00:14:32 +0100 (Mon, 04 Feb 2008) | 2 lines
  
  Nasty typo in setobject.h
........
  r60564 | amaury.forgeotdarc | 2008-02-04 00:15:32 +0100 (Mon, 04 Feb 2008) | 3 lines
  
  Correct test_mailbox on win32: since the test sets a custom 'colon' attribute 
  to the main mailbox, copy it to secondary mailbox instances.
........
  r60565 | amaury.forgeotdarc | 2008-02-04 00:57:24 +0100 (Mon, 04 Feb 2008) | 2 lines
  
  Let test_socketserver pass on win32, which does not have AF_UNIX sockets.
........
  r60566 | jeffrey.yasskin | 2008-02-04 02:04:35 +0100 (Mon, 04 Feb 2008) | 2 lines
  
  Make int() and long() fall back to __trunc__(). See issue 2002.
........
  r60567 | christian.heimes | 2008-02-04 19:00:12 +0100 (Mon, 04 Feb 2008) | 3 lines
  
  Patch #1953
  I implemented the function sys._compact_freelists() and C API functions PyInt_/PyFloat_CompactFreeList() to compact the pre-allocated blocks of ints and floats. They allow the user to reduce the memory usage of a Python process that deals with lots of numbers.
  The patch also renames sys._cleartypecache to sys._clear_type_cache
........
  r60568 | christian.heimes | 2008-02-04 19:48:38 +0100 (Mon, 04 Feb 2008) | 1 line
  
  Increase debugging to investige failing tests on some build bots
........
  r60570 | christian.heimes | 2008-02-04 20:30:05 +0100 (Mon, 04 Feb 2008) | 1 line
  
  Small adjustments for test compact freelist test. It's no passing on Windows as well.
........
  r60573 | amaury.forgeotdarc | 2008-02-04 21:53:14 +0100 (Mon, 04 Feb 2008) | 2 lines
  
  Correct quotes in NEWS file
........
  r60575 | amaury.forgeotdarc | 2008-02-04 22:45:05 +0100 (Mon, 04 Feb 2008) | 13 lines
  
  #1750076: Debugger did not step on every iteration of a while statement.
  
  The mapping between bytecode offsets and source lines (lnotab) did not contain
  an entry for the beginning of the loop.
  
  Now it does, and the lnotab can be a bit larger: 
  in particular, several statements on the same line generate several entries. 
  However, this does not bother the settrace function, which will trigger only
  one 'line' event.
  
  The lnotab seems to be exactly the same as with python2.4. 
........
  r60584 | amaury.forgeotdarc | 2008-02-05 01:26:21 +0100 (Tue, 05 Feb 2008) | 3 lines
  
  Change r60575 broke test_compile:
  there is no need to emit co_lnotab item when both offsets are zeros.
........
  r60587 | skip.montanaro | 2008-02-05 03:32:16 +0100 (Tue, 05 Feb 2008) | 1 line
  
  sync with most recent version from python-mode sf project
........
  r60588 | lars.gustaebel | 2008-02-05 12:51:40 +0100 (Tue, 05 Feb 2008) | 5 lines
  
  Issue #2004: Use mode 0700 for temporary directories and default
  permissions for missing directories.
  
  (will backport to 2.5)
........
  r60590 | georg.brandl | 2008-02-05 13:01:24 +0100 (Tue, 05 Feb 2008) | 2 lines
  
  Convert external links to internal links. Fixes #2010.
........
  r60592 | marc-andre.lemburg | 2008-02-05 15:50:40 +0100 (Tue, 05 Feb 2008) | 3 lines
  
  Keep distutils Python 2.1 compatible (or even Python 2.4 in this case).
........
  r60593 | andrew.kuchling | 2008-02-05 17:06:57 +0100 (Tue, 05 Feb 2008) | 5 lines
  
  Update PEP URL.
  (This code is duplicated between pydoc and DocXMLRPCServer; maybe it 
  should be refactored as a GHOP project.)
  
  2.5.2 backport candidate.
........
  r60596 | guido.van.rossum | 2008-02-05 18:32:15 +0100 (Tue, 05 Feb 2008) | 2 lines
  
  In the experimental 'Scanner' feature, the group count was set wrong.
........
  r60599 | georg.brandl | 2008-02-05 19:32:47 +0100 (Tue, 05 Feb 2008) | 2 lines
  
  Fix unittest conversion breakage.
........
  r60602 | facundo.batista | 2008-02-05 20:03:32 +0100 (Tue, 05 Feb 2008) | 3 lines
  
  
  Issue 1951. Converts wave test cases to unittest.
........
  r60603 | georg.brandl | 2008-02-05 20:07:10 +0100 (Tue, 05 Feb 2008) | 2 lines
  
  Actually run the test.
........
  r60604 | skip.montanaro | 2008-02-05 20:24:30 +0100 (Tue, 05 Feb 2008) | 2 lines
  
  correct object name
........
  r60605 | georg.brandl | 2008-02-05 20:58:17 +0100 (Tue, 05 Feb 2008) | 7 lines
  
  * Use the same code to profile for test_profile and test_cprofile.
  * Convert both to unittest.
  * Use the same unit testing code.
  * Include the expected output in both test files.
  * Make it possible to regenerate the expected output by running
    the file as a script with an '-r' argument.
........
  r60613 | raymond.hettinger | 2008-02-06 02:49:00 +0100 (Wed, 06 Feb 2008) | 1 line
  
  Sync-up with Py3k work.
........
  r60614 | christian.heimes | 2008-02-06 13:44:34 +0100 (Wed, 06 Feb 2008) | 1 line
  
  Limit free list of method and builtin function objects to 256 entries each.
........
  r60616 | christian.heimes | 2008-02-06 14:33:44 +0100 (Wed, 06 Feb 2008) | 7 lines
  
  Unified naming convention for free lists and their limits. All free lists
  in Object/ are named ``free_list``, the counter ``numfree`` and the upper
  limit is a macro ``PyName_MAXFREELIST`` inside an #ifndef block.
  
  The chances should make it easier to adjust Python for platforms with
  less memory, e.g. mobile phones.
........
  r60618 | walter.doerwald | 2008-02-06 15:31:55 +0100 (Wed, 06 Feb 2008) | 6 lines
  
  Remove month parameter from Calendar.yeardatescalendar(),
  Calendar.yeardays2calendar() and Calendar.yeardayscalendar() as the methods
  don't have such a parameter. Fixes issue #2017.
  
  Rewrap content to 80 chars.
........
  r60622 | facundo.batista | 2008-02-06 20:28:49 +0100 (Wed, 06 Feb 2008) | 4 lines
  
  
  Fixes issue 1959. Converted tests to unittest.
  Thanks Giampaolo Rodola.
........
  r60626 | thomas.heller | 2008-02-06 21:29:17 +0100 (Wed, 06 Feb 2008) | 3 lines
  
  Fixed refcounts and error handling.
  
  Should not be merged to py3k branch.
........
  r60630 | mark.dickinson | 2008-02-06 23:10:50 +0100 (Wed, 06 Feb 2008) | 4 lines
  
  Issue 1979: Make Decimal comparisons (other than !=, ==) involving NaN 
  raise InvalidOperation (and return False if InvalidOperation is trapped).
........
  r60632 | mark.dickinson | 2008-02-06 23:25:16 +0100 (Wed, 06 Feb 2008) | 2 lines
  
  Remove incorrect usage of :const: in documentation.
........
  r60634 | georg.brandl | 2008-02-07 00:45:51 +0100 (Thu, 07 Feb 2008) | 2 lines
  
  Revert accidental changes to test_queue in r60605.
........
  r60636 | raymond.hettinger | 2008-02-07 01:54:20 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Issue 2025:  Add tuple.count() and tuple.index() to follow the ABC in collections.Sequence.
........
  r60637 | mark.dickinson | 2008-02-07 02:14:23 +0100 (Thu, 07 Feb 2008) | 2 lines
  
  Fix broken link in decimal documentation.
........
  r60638 | mark.dickinson | 2008-02-07 02:42:06 +0100 (Thu, 07 Feb 2008) | 3 lines
  
  IEEE 754 should be IEEE 854;  give precise reference for
  comparisons involving NaNs.
........
  r60639 | raymond.hettinger | 2008-02-07 03:12:52 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Return ints instead of longs for tuple.count() and tuple.index().
........
  r60640 | raymond.hettinger | 2008-02-07 04:10:33 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Merge 60627.
........
  r60641 | raymond.hettinger | 2008-02-07 04:25:46 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Merge r60628, r60631, and r60633.  Register UserList and UserString will the appropriate ABCs.
........
  r60642 | brett.cannon | 2008-02-07 08:47:31 +0100 (Thu, 07 Feb 2008) | 3 lines
  
  Cast a struct to a void pointer so as to do a type-safe pointer comparison
  (mistmatch found by clang).
........
  r60643 | brett.cannon | 2008-02-07 09:04:07 +0100 (Thu, 07 Feb 2008) | 2 lines
  
  Remove unnecessary curly braces around an int literal.
........
  r60644 | andrew.kuchling | 2008-02-07 12:43:47 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Update URL
........
  r60645 | facundo.batista | 2008-02-07 17:16:29 +0100 (Thu, 07 Feb 2008) | 4 lines
  
  
  Fixes issue 2026.  Tests converted to unittest.  Thanks
  Giampaolo Rodola.
........
  r60646 | christian.heimes | 2008-02-07 18:15:30 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Added some statistics code to dict and list object code. I wanted to test how a larger freelist affects the reusage of freed objects. Contrary to my gut feelings 80 objects is more than fine for small apps. I haven't profiled a large app yet.
........
  r60648 | facundo.batista | 2008-02-07 20:06:52 +0100 (Thu, 07 Feb 2008) | 6 lines
  
  
  Fixes Issue 1401. When redirected, a possible POST get converted
  to GET, so it loses its payload. So, it also must lose the
  headers related to the payload (if it has no content any more,
  it shouldn't indicate content length and type).
........
  r60649 | walter.doerwald | 2008-02-07 20:30:22 +0100 (Thu, 07 Feb 2008) | 3 lines
  
  Clarify that the output of TextCalendar.formatmonth() and
  TextCalendar.formatyear() for custom instances won't be influenced by calls
  to the module global setfirstweekday() function. Fixes #2018.
........
  r60651 | walter.doerwald | 2008-02-07 20:48:34 +0100 (Thu, 07 Feb 2008) | 3 lines
  
  Fix documentation for Calendar.iterweekdays(): firstweekday is a property.
  Fixes second part of #2018.
........
  r60653 | walter.doerwald | 2008-02-07 20:57:32 +0100 (Thu, 07 Feb 2008) | 2 lines
  
  Fix typo in docstring for Calendar.itermonthdays().
........
  r60655 | raymond.hettinger | 2008-02-07 21:04:37 +0100 (Thu, 07 Feb 2008) | 1 line
  
  The float conversion recipe is simpler in Py2.6
........
  r60657 | raymond.hettinger | 2008-02-07 21:10:49 +0100 (Thu, 07 Feb 2008) | 1 line
  
  Fix typo
........
  r60660 | brett.cannon | 2008-02-07 23:27:10 +0100 (Thu, 07 Feb 2008) | 3 lines
  
  Make sure a switch statement does not have repetitive case statements.
  Error found through LLVM post-2.1 svn.
........
  r60661 | christian.heimes | 2008-02-08 01:11:31 +0100 (Fri, 08 Feb 2008) | 1 line
  
  Deallocate content of the dict free list on interpreter shutdown
........
  r60662 | christian.heimes | 2008-02-08 01:14:34 +0100 (Fri, 08 Feb 2008) | 1 line
  
  Use prefix decrement
........
  r60663 | amaury.forgeotdarc | 2008-02-08 01:56:02 +0100 (Fri, 08 Feb 2008) | 5 lines
  
  issue 2045: Infinite recursion when printing a subclass of defaultdict,
  if default_factory is set to a bound method.
  
  Will backport.
........
  r60667 | jeffrey.yasskin | 2008-02-08 07:45:40 +0100 (Fri, 08 Feb 2008) | 2 lines
  
  Oops! 2.6's Rational.__ne__ didn't work.
........
  r60671 | hyeshik.chang | 2008-02-08 18:10:20 +0100 (Fri, 08 Feb 2008) | 2 lines
  
  Update big5hkscs codec to conform to the HKSCS:2004 revision.
........
  r60673 | raymond.hettinger | 2008-02-08 23:30:04 +0100 (Fri, 08 Feb 2008) | 4 lines
  
  Remove unnecessary modulo division.
  The preceding test guarantees that 0 <= i < len.
........
  r60674 | raymond.hettinger | 2008-02-09 00:02:27 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Speed-up __iter__() mixin method.
........
  r60675 | raymond.hettinger | 2008-02-09 00:34:21 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Fill-in missing Set comparisons
........
  r60677 | raymond.hettinger | 2008-02-09 00:57:06 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Add advice on choosing between DictMixin and MutableMapping
........
  r60679 | raymond.hettinger | 2008-02-09 02:18:42 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Make ABC containers inherit as documented.
........
  r60684 | raymond.hettinger | 2008-02-09 04:34:52 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Merge with r60683.
........
  r60687 | raymond.hettinger | 2008-02-09 05:37:49 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Add -3 warnings that set.copy(), dict.copy(), and defaultdict.copy() will go away in Py3.x
........
  r60689 | raymond.hettinger | 2008-02-09 11:04:19 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Metaclass declaration is inherited
........
  r60691 | raymond.hettinger | 2008-02-09 11:06:20 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Temporarily disable this test. It's been broken for a week.
........
  r60695 | nick.coghlan | 2008-02-09 16:28:09 +0100 (Sat, 09 Feb 2008) | 1 line
  
  Issue 2021: Allow NamedTemporaryFile and SpooledTemporaryFile to be used as context managers. (The NamedTemporaryFile fix should be considered for backporting to 2.5)
........
  r60696 | christian.heimes | 2008-02-09 20:55:22 +0100 (Sat, 09 Feb 2008) | 5 lines
  
  Issue #1706: Require Windows 2000+
  Added Py_BUILD_CORE_MODULES macro to set WINVER and NTDDI_VERSION to Windows 2000 for core modules, too
  Added -d option to build.bat (same as -c Debug) and fixed warning about /build option
  Updated Windows related readme.txt files
........
  r60701 | georg.brandl | 2008-02-09 22:36:15 +0100 (Sat, 09 Feb 2008) | 2 lines
  
  Needs only 2.4 now.
........
  r60702 | georg.brandl | 2008-02-09 22:38:54 +0100 (Sat, 09 Feb 2008) | 2 lines
  
  Docs are rst now.
........
  r60703 | georg.brandl | 2008-02-09 23:00:00 +0100 (Sat, 09 Feb 2008) | 2 lines
  
  Fix link.
........
  r60704 | georg.brandl | 2008-02-10 00:09:25 +0100 (Sun, 10 Feb 2008) | 2 lines
  
  Fix for newest doctools.
........
  r60707 | eric.smith | 2008-02-10 02:36:53 +0100 (Sun, 10 Feb 2008) | 17 lines
  
  Added PyNumber_ToBase and supporting routines _PyInt_Format and
  _PyLong_Format.  In longobject.c, changed long_format to
  _PyLong_Format.  In intobject.c, changed uses of PyOS_snprintf to
  _PyInt_Format instead.
  
  _PyLong_Format is similar to py3k's routine of the same name, except
  it has 2 additional parameters: addL and newstyle.  addL was existing
  in long_format, and controls adding the trailing "L".  This is
  unneeded in py3k.  newstyle is used to control whether octal prepends
  "0" (the pre-2.6 style), or "0o" (the 3.0 sytle).
  
  PyNumber_ToBase is needed for PEP 3127 (Integer Literal Support and
  Syntax) and PEP 3101 (Advanced String Formatting).
  
  This changeset does not need merging into py3k.
........
  r60709 | raymond.hettinger | 2008-02-10 08:21:09 +0100 (Sun, 10 Feb 2008) | 1 line
  
  Clarify that decimal also supports fixed-point arithmetic.
........
  r60710 | nick.coghlan | 2008-02-10 08:32:52 +0100 (Sun, 10 Feb 2008) | 1 line
  
  Add missing NEWS entry for r60695
........
  r60712 | mark.dickinson | 2008-02-10 15:58:38 +0100 (Sun, 10 Feb 2008) | 3 lines
  
  Turn classmethods into staticmethods, and avoid calling the constructor
  of subclasses of Rational.  (See discussion in issue #1682.)
........
  r60713 | eric.smith | 2008-02-10 16:07:44 +0100 (Sun, 10 Feb 2008) | 1 line
  
  Forgot to modify header file in r60707.
........
  r60715 | mark.dickinson | 2008-02-10 16:19:58 +0100 (Sun, 10 Feb 2008) | 2 lines
  
  Typos in decimal comment and documentation
........
  r60716 | skip.montanaro | 2008-02-10 16:31:54 +0100 (Sun, 10 Feb 2008) | 2 lines
  
  Get the saying right. ;-)
........
  r60717 | skip.montanaro | 2008-02-10 16:32:16 +0100 (Sun, 10 Feb 2008) | 2 lines
  
  whoops - revert
........
  r60718 | mark.dickinson | 2008-02-10 20:23:36 +0100 (Sun, 10 Feb 2008) | 2 lines
  
  Remove reference to Rational
........
  r60719 | raymond.hettinger | 2008-02-10 21:35:16 +0100 (Sun, 10 Feb 2008) | 1 line
  
  Complete an open todo on pickletools -- add a pickle optimizer.
........
  r60721 | mark.dickinson | 2008-02-10 22:29:51 +0100 (Sun, 10 Feb 2008) | 3 lines
  
  Rename rational.Rational to fractions.Fraction, to avoid name clash
  with numbers.Rational.  See issue #1682 for related discussion.
........
  r60722 | christian.heimes | 2008-02-11 03:26:22 +0100 (Mon, 11 Feb 2008) | 1 line
  
  The test requires the network resource
........
  r60723 | mark.dickinson | 2008-02-11 04:11:55 +0100 (Mon, 11 Feb 2008) | 3 lines
  
  Put an extra space into the repr of a Fraction:
  Fraction(1, 2) instead of Fraction(1,2).
........
  r60731 | raymond.hettinger | 2008-02-11 19:51:08 +0100 (Mon, 11 Feb 2008) | 1 line
  
  No need to register classes that already inherit from ABCs.
........
  r60733 | lars.gustaebel | 2008-02-11 20:17:10 +0100 (Mon, 11 Feb 2008) | 2 lines
  
  Make sure that xstar headers are read correctly.
........
  r60734 | raymond.hettinger | 2008-02-11 21:05:53 +0100 (Mon, 11 Feb 2008) | 1 line
  
  Add tests for pickletools.optimize().
........


Modified: python/branches/trunk-math/Demo/classes/README
==============================================================================
--- python/branches/trunk-math/Demo/classes/README	(original)
+++ python/branches/trunk-math/Demo/classes/README	Tue Feb 12 06:36:19 2008
@@ -4,7 +4,6 @@
 Dates.py	Date manipulation package by Tim Peters
 Dbm.py		Wrapper around built-in dbm, supporting	arbitrary values
 Range.py	Example of a generator: re-implement built-in range()
-Rat.py		Rational numbers
 Rev.py		Yield the reverse of a sequence
 Vec.py		A simple vector class
 bitvec.py	A bit-vector class by Jan-Hein B\"uhrman

Modified: python/branches/trunk-math/Doc/Makefile
==============================================================================
--- python/branches/trunk-math/Doc/Makefile	(original)
+++ python/branches/trunk-math/Doc/Makefile	Tue Feb 12 06:36:19 2008
@@ -16,11 +16,12 @@
 
 help:
 	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html     to make standalone HTML files"
-	@echo "  web      to make file usable by Sphinx.web"
-	@echo "  htmlhelp to make HTML files and a HTML help project"
-	@echo "  latex    to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  changes  to make an overview over all changed/added/deprecated items"
+	@echo "  html      to make standalone HTML files"
+	@echo "  web       to make file usable by Sphinx.web"
+	@echo "  htmlhelp  to make HTML files and a HTML help project"
+	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  changes   to make an overview over all changed/added/deprecated items"
+	@echo "  linkcheck to check all external links for integrity"
 
 checkout:
 	@if [ ! -d tools/sphinx ]; then \
@@ -71,6 +72,11 @@
 changes: build
 	@echo "The overview file is in build/changes."
 
+linkcheck: BUILDER = linkcheck
+linkcheck: build
+	@echo "Link check complete; look for any errors in the above output "\
+	      "or in build/$(BUILDER)/output.txt"
+
 clean:
 	-rm -rf build/*
 	-rm -rf tools/sphinx

Modified: python/branches/trunk-math/Doc/README.txt
==============================================================================
--- python/branches/trunk-math/Doc/README.txt	(original)
+++ python/branches/trunk-math/Doc/README.txt	Tue Feb 12 06:36:19 2008
@@ -14,7 +14,7 @@
 Building the docs
 =================
 
-You need to install Python 2.5 or higher; the toolset used to build the docs are
+You need to install Python 2.4 or higher; the toolset used to build the docs are
 written in Python.  The toolset used to build the documentation is called
 *Sphinx*, it is not included in this tree, but maintained separately in the
 Python Subversion repository.  Also needed are Jinja, a templating engine
@@ -51,6 +51,10 @@
  * "latex", which builds LaTeX source files that can be run with "pdflatex"
    to produce PDF documents.
 
+ * "linkcheck", which checks all external references to see whether they are
+   broken, redirected or malformed, and outputs this information to stdout
+   as well as a plain-text (.txt) file.
+
  * "changes", which builds an overview over all versionadded/versionchanged/
    deprecated items in the current version. This is meant as a help for the
    writer of the "What's New" document.

Deleted: /python/branches/trunk-math/Doc/builddoc.bat
==============================================================================
--- /python/branches/trunk-math/Doc/builddoc.bat	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,52 +0,0 @@
- at echo off
-setlocal
-
-set SVNROOT=http://svn.python.org/projects
-if "%PYTHON%" EQU "" set PYTHON=python25
-
-if "%1" EQU "" goto help
-if "%1" EQU "html" goto build
-if "%1" EQU "htmlhelp" goto build
-if "%1" EQU "web" goto build
-if "%1" EQU "webrun" goto webrun
-if "%1" EQU "checkout" goto checkout
-if "%1" EQU "update" goto update
-
-:help
-echo HELP
-echo.
-echo builddoc checkout
-echo builddoc update
-echo builddoc html
-echo builddoc htmlhelp
-echo builddoc web
-echo builddoc webrun
-echo.
-goto end
-
-:checkout
-svn co %SVNROOT%/doctools/trunk/sphinx tools/sphinx
-svn co %SVNROOT%/external/docutils-0.4/docutils tools/docutils
-svn co %SVNROOT%/external/Pygments-0.9/pygments tools/pygments
-goto end
-
-:update
-svn update tools/sphinx
-svn update tools/docutils
-svn update tools/pygments
-goto end
-
-:build
-if not exist build mkdir build
-if not exist build\%1 mkdir build\%1
-if not exist build\doctrees mkdir build\doctrees
-cmd /C %PYTHON% tools\sphinx-build.py -b%1 -dbuild\doctrees . build\%1
-if "%1" EQU "htmlhelp" "%ProgramFiles%\HTML Help Workshop\hhc.exe" build\htmlhelp\pydoc.hhp
-goto end
-
-:webrun
-set PYTHONPATH=tools
-%PYTHON% -m sphinx.web build\web
-goto end
-
-:end

Modified: python/branches/trunk-math/Doc/c-api/float.rst
==============================================================================
--- python/branches/trunk-math/Doc/c-api/float.rst	(original)
+++ python/branches/trunk-math/Doc/c-api/float.rst	Tue Feb 12 06:36:19 2008
@@ -84,3 +84,12 @@
    Return the minimum normalized positive float *DBL_MIN* as C :ctype:`double`.
 
    .. versionadded:: 2.6
+
+
+.. cfunction:: void PyFloat_CompactFreeList(size_t *bc, size_t *bf, size_t *sum)
+
+   Compact the float free list. *bc* is the number of allocated blocks before
+   blocks are freed, *bf* is the number of freed blocks and *sum* is the number
+   of remaining objects in the blocks.
+
+   .. versionadded:: 2.6

Modified: python/branches/trunk-math/Doc/c-api/int.rst
==============================================================================
--- python/branches/trunk-math/Doc/c-api/int.rst	(original)
+++ python/branches/trunk-math/Doc/c-api/int.rst	Tue Feb 12 06:36:19 2008
@@ -120,3 +120,12 @@
 
    Return the system's idea of the largest integer it can handle
    (:const:`LONG_MAX`, as defined in the system header files).
+
+
+.. cfunction:: void PyInt_CompactFreeList(size_t *bc, size_t *bf, size_t *sum)
+
+   Compact the integer free list. *bc* is the number of allocated blocks before
+   blocks are freed, *bf* is the number of freed blocks and *sum* is the number
+   of remaining objects in the blocks.
+
+   .. versionadded:: 2.6

Modified: python/branches/trunk-math/Doc/c-api/set.rst
==============================================================================
--- python/branches/trunk-math/Doc/c-api/set.rst	(original)
+++ python/branches/trunk-math/Doc/c-api/set.rst	Tue Feb 12 06:36:19 2008
@@ -58,6 +58,13 @@
 
    .. versionadded:: 2.6
 
+.. cfunction:: int PyFrozenSet_Check(PyObject *p)
+
+   Return true if *p* is a :class:`frozenset` object or an instance of a
+   subtype.
+
+   .. versionadded:: 2.6
+
 .. cfunction:: int PyAnySet_Check(PyObject *p)
 
    Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an

Modified: python/branches/trunk-math/Doc/conf.py
==============================================================================
--- python/branches/trunk-math/Doc/conf.py	(original)
+++ python/branches/trunk-math/Doc/conf.py	Tue Feb 12 06:36:19 2008
@@ -38,16 +38,16 @@
 today_fmt = '%B %d, %Y'
 
 # List of files that shouldn't be included in the build.
-unused_files = [
-    'whatsnew/2.0.rst',
-    'whatsnew/2.1.rst',
-    'whatsnew/2.2.rst',
-    'whatsnew/2.3.rst',
-    'whatsnew/2.4.rst',
-    'whatsnew/2.5.rst',
-    'maclib/scrap.rst',
-    'library/xmllib.rst',
-    'library/xml.etree.rst',
+unused_docs = [
+    'whatsnew/2.0',
+    'whatsnew/2.1',
+    'whatsnew/2.2',
+    'whatsnew/2.3',
+    'whatsnew/2.4',
+    'whatsnew/2.5',
+    'maclib/scrap',
+    'library/xmllib',
+    'library/xml.etree',
 ]
 
 # Relative filename of the reference count data file.
@@ -102,29 +102,29 @@
 # (source start file, target name, title, author, document class [howto/manual]).
 _stdauthor = r'Guido van Rossum\\Fred L. Drake, Jr., editor'
 latex_documents = [
-    ('c-api/index.rst', 'c-api.tex',
+    ('c-api/index', 'c-api.tex',
      'The Python/C API', _stdauthor, 'manual'),
-    ('distutils/index.rst', 'distutils.tex',
+    ('distutils/index', 'distutils.tex',
      'Distributing Python Modules', _stdauthor, 'manual'),
-    ('documenting/index.rst', 'documenting.tex',
+    ('documenting/index', 'documenting.tex',
      'Documenting Python', 'Georg Brandl', 'manual'),
-    ('extending/index.rst', 'extending.tex',
+    ('extending/index', 'extending.tex',
      'Extending and Embedding Python', _stdauthor, 'manual'),
-    ('install/index.rst', 'install.tex',
+    ('install/index', 'install.tex',
      'Installing Python Modules', _stdauthor, 'manual'),
-    ('library/index.rst', 'library.tex',
+    ('library/index', 'library.tex',
      'The Python Library Reference', _stdauthor, 'manual'),
-    ('reference/index.rst', 'reference.tex',
+    ('reference/index', 'reference.tex',
      'The Python Language Reference', _stdauthor, 'manual'),
-    ('tutorial/index.rst', 'tutorial.tex',
+    ('tutorial/index', 'tutorial.tex',
      'Python Tutorial', _stdauthor, 'manual'),
-    ('using/index.rst', 'using.tex',
+    ('using/index', 'using.tex',
      'Using Python', _stdauthor, 'manual'),
-    ('whatsnew/' + version + '.rst', 'whatsnew.tex',
+    ('whatsnew/' + version, 'whatsnew.tex',
      'What\'s New in Python', 'A. M. Kuchling', 'howto'),
 ]
 # Collect all HOWTOs individually
-latex_documents.extend(('howto/' + fn, 'howto-' + fn[:-4] + '.tex',
+latex_documents.extend(('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex',
                         'HOWTO', _stdauthor, 'howto')
                        for fn in os.listdir('howto')
                        if fn.endswith('.rst') and fn != 'index.rst')
@@ -138,4 +138,4 @@
 '''
 
 # Documents to append as an appendix to all manuals.
-latex_appendices = ['glossary.rst', 'about.rst', 'license.rst', 'copyright.rst']
+latex_appendices = ['glossary', 'about', 'license', 'copyright']

Modified: python/branches/trunk-math/Doc/extending/windows.rst
==============================================================================
--- python/branches/trunk-math/Doc/extending/windows.rst	(original)
+++ python/branches/trunk-math/Doc/extending/windows.rst	Tue Feb 12 06:36:19 2008
@@ -179,7 +179,7 @@
 
    MyObject_Type.ob_type = &PyType_Type;
 
-Refer to section 3 of the `Python FAQ <http://www.python.org/doc/FAQ.html>`_ for
+Refer to section 3 of the `Python FAQ <http://www.python.org/doc/faq>`_ for
 details on why you must do this.
 
 

Modified: python/branches/trunk-math/Doc/howto/advocacy.rst
==============================================================================
--- python/branches/trunk-math/Doc/howto/advocacy.rst	(original)
+++ python/branches/trunk-math/Doc/howto/advocacy.rst	Tue Feb 12 06:36:19 2008
@@ -265,7 +265,7 @@
 **What are the restrictions on Python's use?**
 
 They're practically nonexistent.  Consult the :file:`Misc/COPYRIGHT` file in the
-source distribution, or http://www.python.org/doc/Copyright.html for the full
+source distribution, or the section :ref:`history-and-license` for the full
 language, but it boils down to three conditions.
 
 * You have to leave the copyright notice on the software; if you don't include

Modified: python/branches/trunk-math/Doc/howto/curses.rst
==============================================================================
--- python/branches/trunk-math/Doc/howto/curses.rst	(original)
+++ python/branches/trunk-math/Doc/howto/curses.rst	Tue Feb 12 06:36:19 2008
@@ -1,3 +1,5 @@
+.. _curses-howto:
+
 **********************************
   Curses Programming with Python
 **********************************

Modified: python/branches/trunk-math/Doc/howto/regex.rst
==============================================================================
--- python/branches/trunk-math/Doc/howto/regex.rst	(original)
+++ python/branches/trunk-math/Doc/howto/regex.rst	Tue Feb 12 06:36:19 2008
@@ -1,3 +1,5 @@
+.. _regex-howto:
+
 ****************************
   Regular Expression HOWTO  
 ****************************

Modified: python/branches/trunk-math/Doc/howto/unicode.rst
==============================================================================
--- python/branches/trunk-math/Doc/howto/unicode.rst	(original)
+++ python/branches/trunk-math/Doc/howto/unicode.rst	Tue Feb 12 06:36:19 2008
@@ -277,7 +277,7 @@
 
 Encodings are specified as strings containing the encoding's name.  Python 2.4
 comes with roughly 100 different encodings; see the Python Library Reference at
-<http://docs.python.org/lib/standard-encodings.html> for a list.  Some encodings
+:ref:`standard-encodings` for a list.  Some encodings
 have multiple names; for example, 'latin-1', 'iso_8859_1' and '8859' are all
 synonyms for the same encoding.
 

Modified: python/branches/trunk-math/Doc/library/calendar.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/calendar.rst	(original)
+++ python/branches/trunk-math/Doc/library/calendar.rst	Tue Feb 12 06:36:19 2008
@@ -39,9 +39,9 @@
 
 .. method:: Calendar.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 returned by
-   :meth:`firstweekday`.
+   Return an iterator for the week day numbers that will be used for one week.
+   The first value from the iterator will be the same as the value of the
+   :attr:`firstweekday` property.
 
 
 .. method:: Calendar.itermonthdates(year, month)
@@ -83,22 +83,22 @@
    Weeks are lists of seven day numbers.
 
 
-.. method:: Calendar.yeardatescalendar(year, month[, width])
+.. method:: Calendar.yeardatescalendar(year[, width])
 
-   Return the data for the specified year ready for formatting. The return value is
-   a list of month rows. Each month row contains up to *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.
+   Return the data for the specified year ready for formatting. The return value
+   is a list of month rows. Each month row contains up to *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.
 
 
-.. method:: Calendar.yeardays2calendar(year, month[, width])
+.. method:: Calendar.yeardays2calendar(year[, width])
 
    Return the data for the specified year ready for formatting (similar to
-   :meth:`yeardatescalendar`). Entries in the week lists are tuples of day numbers
-   and weekday numbers. Day numbers outside this month are zero.
+   :meth:`yeardatescalendar`). Entries in the week lists are tuples of day
+   numbers and weekday numbers. Day numbers outside this month are zero.
 
 
-.. method:: Calendar.yeardayscalendar(year, month[, width])
+.. method:: Calendar.yeardayscalendar(year[, width])
 
    Return the data for the specified year ready for formatting (similar to
    :meth:`yeardatescalendar`). Entries in the week lists are day numbers. Day
@@ -117,9 +117,10 @@
 .. method:: TextCalendar.formatmonth(theyear, themonth[, w[, l]])
 
    Return a month's calendar in a multi-line string. If *w* is provided, it
-   specifies the width of the date columns, which are centered. If *l* is given, it
-   specifies the number of lines that each week will use. Depends on the first
-   weekday as set by :func:`setfirstweekday`.
+   specifies the width of the date columns, which are centered. If *l* is given,
+   it specifies the number of lines that each week will use. Depends on the
+   first weekday as specified in the constructor or set by the
+   :meth:`setfirstweekday` method.
 
 
 .. method:: TextCalendar.prmonth(theyear, themonth[, w[, l]])
@@ -129,11 +130,12 @@
 
 .. method:: TextCalendar.formatyear(theyear, themonth[, w[, l[, c[, m]]]])
 
-   Return a *m*-column calendar for an entire year as a multi-line string. Optional
-   parameters *w*, *l*, and *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 :meth:`setfirstweekday`.  The earliest year for which a
-   calendar can be generated is platform-dependent.
+   Return a *m*-column calendar for an entire year as a multi-line string.
+   Optional parameters *w*, *l*, and *c* are for date column width, lines per
+   week, and number of spaces between month columns, respectively. Depends on
+   the first weekday as specified in the constructor or set by the
+   :meth:`setfirstweekday` method.  The earliest year for which a calendar can
+   be generated is platform-dependent.
 
 
 .. method:: TextCalendar.pryear(theyear[, w[, l[, c[, m]]]])

Modified: python/branches/trunk-math/Doc/library/curses.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/curses.rst	(original)
+++ python/branches/trunk-math/Doc/library/curses.rst	Tue Feb 12 06:36:19 2008
@@ -48,9 +48,9 @@
       Convenience function to ensure proper terminal setup and resetting on
       application entry and exit.
 
-   `Curses Programming with Python <http://www.python.org/doc/howto/curses/curses.html>`_
+   :ref:`curses-howto`
       Tutorial material on using curses with Python, by Andrew Kuchling and Eric
-      Raymond, is available on the Python Web site.
+      Raymond.
 
    The :file:`Demo/curses/` directory in the Python source distribution contains
    some example programs using the curses bindings provided by this module.

Modified: python/branches/trunk-math/Doc/library/decimal.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/decimal.rst	(original)
+++ python/branches/trunk-math/Doc/library/decimal.rst	Tue Feb 12 06:36:19 2008
@@ -1,6 +1,6 @@
 
-:mod:`decimal` --- Decimal floating point arithmetic
-====================================================
+:mod:`decimal` --- Decimal fixed point and floating point arithmetic
+====================================================================
 
 .. module:: decimal
    :synopsis: Implementation of the General Decimal Arithmetic  Specification.
@@ -21,6 +21,11 @@
 The :mod:`decimal` module provides support for decimal floating point
 arithmetic.  It offers several advantages over the :class:`float` datatype:
 
+* Decimal "is based on a floating-point model which was designed with people
+  in mind, and necessarily has a paramount guiding principle -- computers must
+  provide an arithmetic that works in the same way as the arithmetic that
+  people learn at school." -- excerpt from the decimal arithmetic specification.
+
 * Decimal numbers can be represented exactly.  In contrast, numbers like
   :const:`1.1` do not have an exact representation in binary floating point. End
   users typically would not expect :const:`1.1` to display as
@@ -30,7 +35,7 @@
   + 0.1 + 0.1 - 0.3`` is exactly equal to zero.  In binary floating point, the result
   is :const:`5.5511151231257827e-017`.  While near to zero, the differences
   prevent reliable equality testing and differences can accumulate. For this
-  reason, decimal would be preferred in accounting applications which have strict
+  reason, decimal is preferred in accounting applications which have strict
   equality invariants.
 
 * The decimal module incorporates a notion of significant places so that ``1.30
@@ -55,6 +60,13 @@
   standards.  While the built-in float type exposes only a modest portion of its
   capabilities, the decimal module exposes all required parts of the standard.
   When needed, the programmer has full control over rounding and signal handling.
+  This includes an option to enforce exact arithmetic by using exceptions
+  to block any inexact operations.
+
+* The decimal module was designed to support "without prejudice, both exact
+  unrounded decimal arithmetic (sometimes called fixed-point arithmetic)
+  and rounded floating-point arithmetic."  -- excerpt from the decimal
+  arithmetic specification.
 
 The module design is centered around three concepts:  the decimal number, the
 context for arithmetic, and signals.
@@ -91,7 +103,7 @@
      Specification <http://www2.hursley.ibm.com/decimal/decarith.html>`_.
 
    * IEEE standard 854-1987, `Unofficial IEEE 854 Text
-     <http://www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html>`_.
+     <http://754r.ucbtest.org/standards/854.pdf>`_.
 
 .. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -878,7 +890,7 @@
    :const:`ROUND_HALF_EVEN`.  All flags are cleared.  No traps are enabled (so that
    exceptions are not raised during computations).
 
-   Because the trapped are disabled, this context is useful for applications that
+   Because the traps are disabled, this context is useful for applications that
    prefer to have result value of :const:`NaN` or :const:`Infinity` instead of
    raising exceptions.  This allows an application to complete a run in the
    presence of conditions that would otherwise halt the program.
@@ -1290,6 +1302,19 @@
 operation.  This is a useful return value when an invalid result needs to
 interrupt a calculation for special handling.
 
+The behavior of Python's comparison operators can be a little surprising where a
+:const:`NaN` is involved.  A test for equality where one of the operands is a
+quiet or signaling :const:`NaN` always returns :const:`False` (even when doing
+``Decimal('NaN')==Decimal('NaN')``), while a test for inequality always returns
+:const:`True`.  An attempt to compare two Decimals using any of the ``<``,
+``<=``, ``>`` or ``>=`` operators will raise the :exc:`InvalidOperation` signal
+if either operand is a :const:`NaN`, and return :const:`False` if this signal is
+not trapped.  Note that the General Decimal Arithmetic specification does not
+specify the behavior of direct comparisons; these rules for comparisons
+involving a :const:`NaN` were taken from the IEEE 854 standard (see Table 3 in
+section 5.7).  To ensure strict standards-compliance, use the :meth:`compare`
+and :meth:`compare-signal` methods instead.
+
 The signed zeros can result from calculations that underflow. They keep the sign
 that would have resulted if the calculation had been carried out to greater
 precision.  Since their magnitude is zero, both positive and negative zeros are
@@ -1568,39 +1593,29 @@
 
 A. Yes, all binary floating point numbers can be exactly expressed as a
 Decimal.  An exact conversion may take more precision than intuition would
-suggest, so trapping :const:`Inexact` will signal a need for more precision::
+suggest, so we trap :const:`Inexact` to signal a need for more precision::
+
+    def float_to_decimal(f):
+        "Convert a floating point number to a Decimal with no loss of information"
+        n, d = f.as_integer_ratio()
+        with localcontext() as ctx:
+            ctx.traps[Inexact] = True
+            while True:
+                try:
+                   return Decimal(n) / Decimal(d)
+                except Inexact:
+                    ctx.prec += 1
 
-   def floatToDecimal(f):
-       "Convert a floating point number to a Decimal with no loss of information"
-       # Transform (exactly) a float to a mantissa (0.5 <= abs(m) < 1.0) and an
-       # exponent.  Double the mantissa until it is an integer.  Use the integer
-       # mantissa and exponent to compute an equivalent Decimal.  If this cannot
-       # be done exactly, then retry with more precision.
-
-       mantissa, exponent = math.frexp(f)
-       while mantissa != int(mantissa):
-           mantissa *= 2.0
-           exponent -= 1
-       mantissa = int(mantissa)
-
-       oldcontext = getcontext()
-       setcontext(Context(traps=[Inexact]))
-       try:
-           while True:
-               try:
-                  return mantissa * Decimal(2) ** exponent
-               except Inexact:
-                   getcontext().prec += 1
-       finally:
-           setcontext(oldcontext)
+    >>> float_to_decimal(math.pi)
+    Decimal("3.141592653589793115997963468544185161590576171875")
 
-Q. Why isn't the :func:`floatToDecimal` routine included in the module?
+Q. Why isn't the :func:`float_to_decimal` routine included in the module?
 
 A. There is some question about whether it is advisable to mix binary and
 decimal floating point.  Also, its use requires some care to avoid the
 representation issues associated with binary floating point::
 
-   >>> floatToDecimal(1.1)
+   >>> float_to_decimal(1.1)
    Decimal("1.100000000000000088817841970012523233890533447265625")
 
 Q. Within a complex calculation, how can I make sure that I haven't gotten a

Modified: python/branches/trunk-math/Doc/library/email-examples.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/email-examples.rst	(original)
+++ python/branches/trunk-math/Doc/library/email-examples.rst	Tue Feb 12 06:36:19 2008
@@ -16,18 +16,23 @@
 
 
 Here's an example of how to send the entire contents of a directory as an email
-message:  [1]_
+message: [1]_
 
 .. literalinclude:: ../includes/email-dir.py
 
 
-And finally, here's an example of how to unpack a MIME message like the one
+Here's an example of how to unpack a MIME message like the one
 above, into a directory of files:
 
 .. literalinclude:: ../includes/email-unpack.py
 
+Here's an example of how to create an HTML message with an alternative plain
+text version: [2]_
+
+.. literalinclude:: ../includes/email-alternative.py
+
 
 .. rubric:: Footnotes
 
 .. [1] Thanks to Matthew Dixon Cowles for the original inspiration and examples.
-
+.. [2] Contributed by Martin Matejek.

Modified: python/branches/trunk-math/Doc/library/functions.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/functions.rst	(original)
+++ python/branches/trunk-math/Doc/library/functions.rst	Tue Feb 12 06:36:19 2008
@@ -1145,14 +1145,6 @@
    .. versionadded:: 2.2
 
 
-.. function:: trunc(x)
-
-   Return the :class:`Real` value *x* truncated to an :class:`Integral` (usually
-   a long integer). Delegates to ``x.__trunc__()``.
-
-   .. versionadded:: 2.6
-
-
 .. function:: tuple([iterable])
 
    Return a tuple whose items are the same and in the same order as *iterable*'s

Modified: python/branches/trunk-math/Doc/library/itertools.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/itertools.rst	(original)
+++ python/branches/trunk-math/Doc/library/itertools.rst	Tue Feb 12 06:36:19 2008
@@ -401,17 +401,6 @@
    27
    64
 
-   >>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura',
-   ...                '', 'martin', '', 'walter', '', 'mark']
-   >>> for name in islice(reportlines, 3, None, 2):
-   ...    print name.title()
-   ...
-   Alex
-   Laura
-   Martin
-   Walter
-   Mark
-
    # Show a dictionary sorted and grouped by value
    >>> from operator import itemgetter
    >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3)
@@ -534,5 +523,16 @@
        "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
        return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
 
-
+   def roundrobin(*iterables):
+       "roundrobin('abc', 'd', 'ef') --> 'a', 'd', 'e', 'b', 'f', 'c'"
+       # Recipe contributed by George Sakkis
+       pending = len(iterables)
+       nexts = cycle(iter(it).next for it in iterables)
+       while pending:
+           try:
+               for next in nexts:
+                   yield next()
+           except StopIteration:
+               pending -= 1
+               nexts = cycle(islice(nexts, pending))
 

Modified: python/branches/trunk-math/Doc/library/math.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/math.rst	(original)
+++ python/branches/trunk-math/Doc/library/math.rst	Tue Feb 12 06:36:19 2008
@@ -103,6 +103,14 @@
    Return the fractional and integer parts of *x*.  Both results carry the sign of
    *x*, and both are floats.
 
+
+.. function:: trunc(x)
+
+   Return the :class:`Real` value *x* truncated to an :class:`Integral` (usually
+   a long integer). Delegates to ``x.__trunc__()``.
+
+   .. versionadded:: 2.6
+
 Note that :func:`frexp` and :func:`modf` have a different call/return pattern
 than their C equivalents: they take a single argument and return a pair of
 values, rather than returning their second return value through an 'output

Modified: python/branches/trunk-math/Doc/library/numbers.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/numbers.rst	(original)
+++ python/branches/trunk-math/Doc/library/numbers.rst	Tue Feb 12 06:36:19 2008
@@ -99,3 +99,144 @@
    3-argument form of :func:`pow`, and the bit-string operations: ``<<``,
    ``>>``, ``&``, ``^``, ``|``, ``~``. Provides defaults for :func:`float`,
    :attr:`Rational.numerator`, and :attr:`Rational.denominator`.
+
+
+Notes for type implementors
+---------------------------
+
+Implementors should be careful to make equal numbers equal and hash
+them to the same values. This may be subtle if there are two different
+extensions of the real numbers. For example, :class:`fractions.Fraction`
+implements :func:`hash` as follows::
+
+    def __hash__(self):
+        if self.denominator == 1:
+            # Get integers right.
+            return hash(self.numerator)
+        # Expensive check, but definitely correct.
+        if self == float(self):
+            return hash(float(self))
+        else:
+            # Use tuple's hash to avoid a high collision rate on
+            # simple fractions.
+            return hash((self.numerator, self.denominator))
+
+
+Adding More Numeric ABCs
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+There are, of course, more possible ABCs for numbers, and this would
+be a poor hierarchy if it precluded the possibility of adding
+those. You can add ``MyFoo`` between :class:`Complex` and
+:class:`Real` with::
+
+    class MyFoo(Complex): ...
+    MyFoo.register(Real)
+
+
+Implementing the arithmetic operations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We want to implement the arithmetic operations so that mixed-mode
+operations either call an implementation whose author knew about the
+types of both arguments, or convert both to the nearest built in type
+and do the operation there. For subtypes of :class:`Integral`, this
+means that :meth:`__add__` and :meth:`__radd__` should be defined as::
+
+    class MyIntegral(Integral):
+
+        def __add__(self, other):
+            if isinstance(other, MyIntegral):
+                return do_my_adding_stuff(self, other)
+            elif isinstance(other, OtherTypeIKnowAbout):
+                return do_my_other_adding_stuff(self, other)
+            else:
+                return NotImplemented
+
+        def __radd__(self, other):
+            if isinstance(other, MyIntegral):
+                return do_my_adding_stuff(other, self)
+            elif isinstance(other, OtherTypeIKnowAbout):
+                return do_my_other_adding_stuff(other, self)
+            elif isinstance(other, Integral):
+                return int(other) + int(self)
+            elif isinstance(other, Real):
+                return float(other) + float(self)
+            elif isinstance(other, Complex):
+                return complex(other) + complex(self)
+            else:
+                return NotImplemented
+
+
+There are 5 different cases for a mixed-type operation on subclasses
+of :class:`Complex`. I'll refer to all of the above code that doesn't
+refer to ``MyIntegral`` and ``OtherTypeIKnowAbout`` as
+"boilerplate". ``a`` will be an instance of ``A``, which is a subtype
+of :class:`Complex` (``a : A <: Complex``), and ``b : B <:
+Complex``. I'll consider ``a + b``:
+
+    1. If ``A`` defines an :meth:`__add__` which accepts ``b``, all is
+       well.
+    2. If ``A`` falls back to the boilerplate code, and it were to
+       return a value from :meth:`__add__`, we'd miss the possibility
+       that ``B`` defines a more intelligent :meth:`__radd__`, so the
+       boilerplate should return :const:`NotImplemented` from
+       :meth:`__add__`. (Or ``A`` may not implement :meth:`__add__` at
+       all.)
+    3. Then ``B``'s :meth:`__radd__` gets a chance. If it accepts
+       ``a``, all is well.
+    4. If it falls back to the boilerplate, there are no more possible
+       methods to try, so this is where the default implementation
+       should live.
+    5. If ``B <: A``, Python tries ``B.__radd__`` before
+       ``A.__add__``. This is ok, because it was implemented with
+       knowledge of ``A``, so it can handle those instances before
+       delegating to :class:`Complex`.
+
+If ``A<:Complex`` and ``B<:Real`` without sharing any other knowledge,
+then the appropriate shared operation is the one involving the built
+in :class:`complex`, and both :meth:`__radd__` s land there, so ``a+b
+== b+a``.
+
+Because most of the operations on any given type will be very similar,
+it can be useful to define a helper function which generates the
+forward and reverse instances of any given operator. For example,
+:class:`fractions.Fraction` uses::
+
+    def _operator_fallbacks(monomorphic_operator, fallback_operator):
+        def forward(a, b):
+            if isinstance(b, (int, long, Fraction)):
+                return monomorphic_operator(a, b)
+            elif isinstance(b, float):
+                return fallback_operator(float(a), b)
+            elif isinstance(b, complex):
+                return fallback_operator(complex(a), b)
+            else:
+                return NotImplemented
+        forward.__name__ = '__' + fallback_operator.__name__ + '__'
+        forward.__doc__ = monomorphic_operator.__doc__
+
+        def reverse(b, a):
+            if isinstance(a, Rational):
+                # Includes ints.
+                return monomorphic_operator(a, b)
+            elif isinstance(a, numbers.Real):
+                return fallback_operator(float(a), float(b))
+            elif isinstance(a, numbers.Complex):
+                return fallback_operator(complex(a), complex(b))
+            else:
+                return NotImplemented
+        reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
+        reverse.__doc__ = monomorphic_operator.__doc__
+
+        return forward, reverse
+
+    def _add(a, b):
+        """a + b"""
+        return Fraction(a.numerator * b.denominator +
+                        b.numerator * a.denominator,
+                        a.denominator * b.denominator)
+
+    __add__, __radd__ = _operator_fallbacks(_add, operator.add)
+
+    # ...
\ No newline at end of file

Modified: python/branches/trunk-math/Doc/library/pickletools.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/pickletools.rst	(original)
+++ python/branches/trunk-math/Doc/library/pickletools.rst	Tue Feb 12 06:36:19 2008
@@ -35,3 +35,10 @@
    the opcode's argument; *pos* is the position at which this opcode is located.
    *pickle* can be a string or a file-like object.
 
+.. function:: optimize(picklestring)
+
+   Returns a new equivalent pickle string after eliminating unused ``PUT``
+   opcodes. The optimized pickle is shorter, takes less transmission time,
+   requires less storage space, and unpickles more efficiently.
+
+   .. versionadded:: 2.6

Modified: python/branches/trunk-math/Doc/library/queue.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/queue.rst	(original)
+++ python/branches/trunk-math/Doc/library/queue.rst	Tue Feb 12 06:36:19 2008
@@ -68,7 +68,7 @@
 Queue Objects
 -------------
 
-Queue objects (:class:``Queue``, :class:``LifoQueue``, or :class:``PriorityQueue``
+Queue objects (:class:`Queue`, :class:`LifoQueue`, or :class:`PriorityQueue`)
 provide the public methods described below.  
 
 

Deleted: /python/branches/trunk-math/Doc/library/rational.rst
==============================================================================
--- /python/branches/trunk-math/Doc/library/rational.rst	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,75 +0,0 @@
-
-:mod:`rational` --- Rational numbers
-====================================
-
-.. module:: rational
-   :synopsis: Rational numbers.
-.. moduleauthor:: Jeffrey Yasskin <jyasskin at gmail.com>
-.. sectionauthor:: Jeffrey Yasskin <jyasskin at gmail.com>
-.. versionadded:: 2.6
-
-
-The :mod:`rational` module defines an immutable, infinite-precision
-Rational number class.
-
-
-.. class:: Rational(numerator=0, denominator=1)
-           Rational(other_rational)
-           Rational(string)
-
-   The first version requires that *numerator* and *denominator* are
-   instances of :class:`numbers.Integral` and returns a new
-   ``Rational`` representing ``numerator/denominator``. If
-   *denominator* is :const:`0`, raises a :exc:`ZeroDivisionError`. The
-   second version requires that *other_rational* is an instance of
-   :class:`numbers.Rational` and returns an instance of
-   :class:`Rational` with the same value. The third version expects a
-   string of the form ``[-+]?[0-9]+(/[0-9]+)?``, optionally surrounded
-   by spaces.
-
-   Implements all of the methods and operations from
-   :class:`numbers.Rational` and is immutable and hashable.
-
-
-.. method:: Rational.from_float(flt)
-
-   This classmethod constructs a :class:`Rational` representing the
-   exact value of *flt*, which must be a :class:`float`. Beware that
-   ``Rational.from_float(0.3)`` is not the same value as ``Rational(3,
-   10)``
-
-
-.. method:: Rational.from_decimal(dec)
-
-   This classmethod constructs a :class:`Rational` representing the
-   exact value of *dec*, which must be a
-   :class:`decimal.Decimal`.
-
-
-.. method:: Rational.__floor__()
-
-   Returns the greatest :class:`int` ``<= self``. Will be accessible
-   through :func:`math.floor` in Py3k.
-
-
-.. method:: Rational.__ceil__()
-
-   Returns the least :class:`int` ``>= self``. Will be accessible
-   through :func:`math.ceil` in Py3k.
-
-
-.. method:: Rational.__round__()
-            Rational.__round__(ndigits)
-
-   The first version returns the nearest :class:`int` to ``self``,
-   rounding half to even. The second version rounds ``self`` to the
-   nearest multiple of ``Rational(1, 10**ndigits)`` (logically, if
-   ``ndigits`` is negative), again rounding half toward even. Will be
-   accessible through :func:`round` in Py3k.
-
-
-.. seealso::
-
-   Module :mod:`numbers`
-      The abstract base classes making up the numeric tower.
-

Modified: python/branches/trunk-math/Doc/library/re.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/re.rst	(original)
+++ python/branches/trunk-math/Doc/library/re.rst	Tue Feb 12 06:36:19 2008
@@ -65,8 +65,7 @@
 above, or almost any textbook about compiler construction.
 
 A brief explanation of the format of regular expressions follows.  For further
-information and a gentler presentation, consult the Regular Expression HOWTO,
-accessible from http://www.python.org/doc/howto/.
+information and a gentler presentation, consult the :ref:`regex-howto`.
 
 Regular expressions can contain both special and ordinary characters. Most
 ordinary characters, like ``'A'``, ``'a'``, or ``'0'``, are the simplest regular

Modified: python/branches/trunk-math/Doc/library/socket.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/socket.rst	(original)
+++ python/branches/trunk-math/Doc/library/socket.rst	Tue Feb 12 06:36:19 2008
@@ -23,7 +23,7 @@
 socket-related system calls are also a valuable source of information on the
 details of socket semantics.  For Unix, refer to the manual pages; for Windows,
 see the WinSock (or Winsock 2) specification. For IPv6-ready APIs, readers may
-want to refer to :rfc:`2553` titled Basic Socket Interface Extensions for IPv6.
+want to refer to :rfc:`3493` titled Basic Socket Interface Extensions for IPv6.
 
 .. index:: object: socket
 

Modified: python/branches/trunk-math/Doc/library/stdtypes.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/stdtypes.rst	(original)
+++ python/branches/trunk-math/Doc/library/stdtypes.rst	Tue Feb 12 06:36:19 2008
@@ -1867,7 +1867,7 @@
 .. method:: dict.values()
 
    Return a copy of the dictionary's list of values.  See the note for
-   :meth:`mapping.items`.
+   :meth:`dict.items`.
 
 
 .. _bltin-file-objects:

Modified: python/branches/trunk-math/Doc/library/sys.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/sys.rst	(original)
+++ python/branches/trunk-math/Doc/library/sys.rst	Tue Feb 12 06:36:19 2008
@@ -58,9 +58,29 @@
    A string containing the copyright pertaining to the Python interpreter.
 
 
-.. function:: _cleartypecache()
+.. function:: _compact_freelists()
 
-   Clear the internal type lookup cache.
+   Compact the free lists of integers and floats by deallocating unused blocks.
+   It can reduce the memory usage of the Python process several tenth of
+   thousands of integers or floats have been allocated at once.
+
+   The return value is a tuple of tuples each containing three elements,
+   amount of used objects, total block count before the blocks are deallocated
+   and amount of freed blocks. The first tuple refers to ints, the second to
+   floats.
+
+   This function should be used for specialized purposes only.
+
+   .. versionadded:: 2.6
+
+
+.. function:: _clear_type_cache()
+
+   Clear the internal type cache. The type cache is used to speed up attribute
+   and method lookups. Use the function *only* to drop unnecessary references
+   during reference leak debugging.
+
+   This function should be used for internal and specialized purposes only.
 
    .. versionadded:: 2.6
 

Modified: python/branches/trunk-math/Doc/library/tempfile.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/tempfile.rst	(original)
+++ python/branches/trunk-math/Doc/library/tempfile.rst	Tue Feb 12 06:36:19 2008
@@ -51,7 +51,8 @@
 
    The returned object is a true file object on POSIX platforms.  On other
    platforms, it is a file-like object whose :attr:`file` attribute is the
-   underlying true file object.
+   underlying true file object. This file-like object can be used in a :keyword:`with`
+   statement, just like a normal file.
 
 
 .. function:: NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix[, prefix[, dir[, delete]]]]]])
@@ -65,7 +66,8 @@
    If *delete* is true (the default), the file is deleted as soon as it is closed.
 
    The returned object is always a file-like object whose :attr:`file` attribute
-   is the underlying true file object.
+   is the underlying true file object. This file-like object can be used in a :keyword:`with`
+   statement, just like a normal file.
 
    .. versionadded:: 2.3
 
@@ -85,7 +87,8 @@
 
    The returned object is a file-like object whose :attr:`_file` attribute
    is either a :class:`StringIO` object or a true file object, depending on
-   whether :func:`rollover` has been called.
+   whether :func:`rollover` has been called. This file-like object can be used in a
+   :keyword:`with` statement, just like a normal file.
 
    .. versionadded:: 2.6
 

Modified: python/branches/trunk-math/Doc/library/urllib2.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/urllib2.rst	(original)
+++ python/branches/trunk-math/Doc/library/urllib2.rst	Tue Feb 12 06:36:19 2008
@@ -33,10 +33,12 @@
 
    This function returns a file-like object with two additional methods:
 
-   * :meth:`geturl` --- return the URL of the resource retrieved
+   * :meth:`geturl` --- return the URL of the resource retrieved, commonly used to
+     determine if a redirect was followed
 
-   * :meth:`info` --- return the meta-information of the page, as a dictionary-like
-     object
+   * :meth:`info` --- return the meta-information of the page, such as headers, in
+     the form of an ``httplib.HTTPMessage`` instance
+     (see `Quick Reference to HTTP Headers <http://www.cs.tut.fi/~jkorpela/http.html>`_)
 
    Raises :exc:`URLError` on errors.
 
@@ -84,18 +86,32 @@
    The handlers raise this exception (or derived exceptions) when they run into a
    problem.  It is a subclass of :exc:`IOError`.
 
+   .. attribute:: reason
+
+      The reason for this error.  It can be a message string or another exception
+      instance (:exc:`socket.error` for remote URLs, :exc:`OSError` for local
+      URLs).
+
 
 .. exception:: HTTPError
 
-   A subclass of :exc:`URLError`, it can also function as a non-exceptional
-   file-like return value (the same thing that :func:`urlopen` returns).  This
-   is useful when handling exotic HTTP errors, such as requests for
-   authentication.
+   Though being an exception (a subclass of :exc:`URLError`), an :exc:`HTTPError`
+   can also function as a non-exceptional file-like return value (the same thing
+   that :func:`urlopen` returns).  This is useful when handling exotic HTTP
+   errors, such as requests for authentication.
+
+   .. attribute:: code
+
+      An HTTP status code as defined in `RFC 2616 <http://www.faqs.org/rfcs/rfc2616.html>`_. 
+      This numeric value corresponds to a value found in the dictionary of
+      codes as found in :attr:`BaseHTTPServer.BaseHTTPRequestHandler.responses`.
+
+
 
 The following classes are provided:
 
 
-.. class:: Request(url[, data][, headers] [, origin_req_host][, unverifiable])
+.. class:: Request(url[, data][, headers][, origin_req_host][, unverifiable])
 
    This class is an abstraction of a URL request.
 
@@ -110,7 +126,12 @@
    returns a string in this format.
 
    *headers* should be a dictionary, and will be treated as if :meth:`add_header`
-   was called with each key and value as arguments.
+   was called with each key and value as arguments.  This is often used to "spoof"
+   the ``User-Agent`` header, which is used by a browser to identify itself --
+   some HTTP servers only allow requests coming from common browsers as opposed
+   to scripts.  For example, Mozilla Firefox may identify itself as ``"Mozilla/5.0
+   (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"``, while :mod:`urllib2`'s
+   default user agent string is ``"Python-urllib/2.6"`` (on Python 2.6).
 
    The final two arguments are only of interest for correct handling of third-party
    HTTP cookies:

Modified: python/branches/trunk-math/Doc/library/userdict.rst
==============================================================================
--- python/branches/trunk-math/Doc/library/userdict.rst	(original)
+++ python/branches/trunk-math/Doc/library/userdict.rst	Tue Feb 12 06:36:19 2008
@@ -68,6 +68,8 @@
    Since the mixin has no knowledge of the subclass constructor, it does not define
    :meth:`__init__` or :meth:`copy`.
 
+   Starting with Python version 2.6, it is recommended to use
+   :class:`collections.MutableMapping` instead of :class:`DictMixin`.
 
 :mod:`UserList` --- Class wrapper for list objects
 ==================================================

Modified: python/branches/trunk-math/Doc/reference/datamodel.rst
==============================================================================
--- python/branches/trunk-math/Doc/reference/datamodel.rst	(original)
+++ python/branches/trunk-math/Doc/reference/datamodel.rst	Tue Feb 12 06:36:19 2008
@@ -1078,7 +1078,7 @@
 a single built-in type, called ``instance``.
 
 New-style classes were introduced in Python 2.2 to unify classes and types.  A
-new-style class neither more nor less than a user-defined type.  If *x* is an
+new-style class is neither more nor less than a user-defined type.  If *x* is an
 instance of a new-style class, then ``type(x)`` is the same as ``x.__class__``.
 
 The major motivation for introducing new-style classes is to provide a unified

Modified: python/branches/trunk-math/Doc/whatsnew/2.6.rst
==============================================================================
--- python/branches/trunk-math/Doc/whatsnew/2.6.rst	(original)
+++ python/branches/trunk-math/Doc/whatsnew/2.6.rst	Tue Feb 12 06:36:19 2008
@@ -578,8 +578,8 @@
 
 :class:`Rational` numbers derive from :class:`Real`, have
 :attr:`numerator` and :attr:`denominator` properties, and can be
-converted to floats.  Python 2.6 adds a simple rational-number class
-in the :mod:`rational` module.
+converted to floats.  Python 2.6 adds a simple rational-number class,
+:class:`Fraction`, in the :mod:`fractions` module.
 
 :class:`Integral` numbers derive from :class:`Rational`, and
 can be shifted left and right with ``<<`` and ``>>``, 
@@ -598,29 +598,29 @@
 
   
 
-The Rational Module
+The Fraction Module
 --------------------------------------------------
 
 To fill out the hierarchy of numeric types, a rational-number class
-has been added as the :mod:`rational` module.  Rational numbers are
+has been added as the :mod:`fractions` module.  Rational numbers are
 represented as a fraction; rational numbers can exactly represent
 numbers such as two-thirds that floating-point numbers can only
 approximate.
 
-The :class:`Rational` constructor takes two :class:`Integral` values
+The :class:`Fraction` constructor takes two :class:`Integral` values
 that will be the numerator and denominator of the resulting fraction. ::
 
-    >>> from rational import Rational
-    >>> a = Rational(2, 3)
-    >>> b = Rational(2, 5)
+    >>> from fractions import Fraction
+    >>> a = Fraction(2, 3)
+    >>> b = Fraction(2, 5)
     >>> float(a), float(b)
     (0.66666666666666663, 0.40000000000000002)
     >>> a+b
-    rational.Rational(16,15)
+    Fraction(16, 15)
     >>> a/b
-    rational.Rational(5,3)
+    Fraction(5, 3)
 
-The :mod:`rational` module is based upon an implementation by Sjoerd
+The :mod:`fractions` module is based upon an implementation by Sjoerd
 Mullender that was in Python's :file:`Demo/classes/` directory for a
 long time.  This implementation was significantly updated by Jeffrey
 Yaskin.

Modified: python/branches/trunk-math/Include/abstract.h
==============================================================================
--- python/branches/trunk-math/Include/abstract.h	(original)
+++ python/branches/trunk-math/Include/abstract.h	Tue Feb 12 06:36:19 2008
@@ -761,6 +761,19 @@
      PyAPI_FUNC(Py_ssize_t) PyNumber_AsSsize_t(PyObject *o, PyObject *exc);
 
        /*
+         Returns the Integral instance converted to an int. The
+         instance is expected to be int or long or have an __int__
+         method. Steals integral's reference. error_format will be
+         used to create the TypeError if integral isn't actually an
+         Integral instance. error_format should be a format string
+         that can accept a char* naming integral's type.
+       */
+
+     PyAPI_FUNC(PyObject *) _PyNumber_ConvertIntegralToInt(
+             PyObject *integral,
+             const char* error_format);
+
+       /*
         Returns the object converted to Py_ssize_t by going through
         PyNumber_Index first.  If an overflow error occurs while
         converting the int-or-long to Py_ssize_t, then the second argument
@@ -919,6 +932,15 @@
        */
 
 
+     PyAPI_FUNC(PyObject *) PyNumber_ToBase(PyObject *n, int base);
+
+       /*
+	 Returns the integer n converted to a string with a base, with a base
+	 marker of 0b, 0o or 0x prefixed if applicable.
+	 If n is not an int object, it is converted with PyNumber_Index first.
+       */
+
+
 /*  Sequence protocol:*/
 
      PyAPI_FUNC(int) PySequence_Check(PyObject *o);

Modified: python/branches/trunk-math/Include/floatobject.h
==============================================================================
--- python/branches/trunk-math/Include/floatobject.h	(original)
+++ python/branches/trunk-math/Include/floatobject.h	Tue Feb 12 06:36:19 2008
@@ -104,6 +104,8 @@
 PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le);
 PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le);
 
+/* free list api */
+PyAPI_FUNC(void) PyFloat_CompactFreeList(size_t *, size_t *, size_t *);
 
 #ifdef __cplusplus
 }

Modified: python/branches/trunk-math/Include/intobject.h
==============================================================================
--- python/branches/trunk-math/Include/intobject.h	(original)
+++ python/branches/trunk-math/Include/intobject.h	Tue Feb 12 06:36:19 2008
@@ -59,6 +59,15 @@
 PyAPI_FUNC(unsigned long) PyOS_strtoul(char *, char **, int);
 PyAPI_FUNC(long) PyOS_strtol(char *, char **, int);
 
+/* free list api */
+PyAPI_FUNC(void) PyInt_CompactFreeList(size_t *, size_t *, size_t *);
+
+/* Convert an integer to the given base.  Returns a string.
+   If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
+   If newstyle is zero, then use the pre-2.6 behavior of octal having
+   a leading "0" */
+PyAPI_FUNC(PyObject*) _PyInt_Format(PyIntObject* v, int base, int newstyle);
+
 #ifdef __cplusplus
 }
 #endif

Modified: python/branches/trunk-math/Include/longobject.h
==============================================================================
--- python/branches/trunk-math/Include/longobject.h	(original)
+++ python/branches/trunk-math/Include/longobject.h	Tue Feb 12 06:36:19 2008
@@ -112,6 +112,13 @@
 	unsigned char* bytes, size_t n,
 	int little_endian, int is_signed);
 
+/* _PyLong_Format: Convert the long to a string object with given base,
+   appending a base prefix of 0[box] if base is 2, 8 or 16.
+   Add a trailing "L" if addL is non-zero.
+   If newstyle is zero, then use the pre-2.6 behavior of octal having
+   a leading "0", instead of the prefix "0o" */
+PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *aa, int base, int addL, int newstyle);
+
 #ifdef __cplusplus
 }
 #endif

Modified: python/branches/trunk-math/Include/pyport.h
==============================================================================
--- python/branches/trunk-math/Include/pyport.h	(original)
+++ python/branches/trunk-math/Include/pyport.h	Tue Feb 12 06:36:19 2008
@@ -122,6 +122,10 @@
 /* Smallest negative value of type Py_ssize_t. */
 #define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
 
+#if SIZEOF_PID_T > SIZEOF_LONG
+#   error "Python doesn't support sizeof(pid_t) > sizeof(long)"
+#endif
+
 /* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
  * format to convert an argument with the width of a size_t or Py_ssize_t.
  * C99 introduced "z" for this purpose, but not all platforms support that;
@@ -456,7 +460,7 @@
    functions, even though they are included in libutil. */
 #include <termios.h>
 extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
-extern int forkpty(int *, char *, struct termios *, struct winsize *);
+extern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
 #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
 #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
 

Modified: python/branches/trunk-math/Include/pythonrun.h
==============================================================================
--- python/branches/trunk-math/Include/pythonrun.h	(original)
+++ python/branches/trunk-math/Include/pythonrun.h	Tue Feb 12 06:36:19 2008
@@ -130,6 +130,7 @@
 PyAPI_FUNC(void) PyMethod_Fini(void);
 PyAPI_FUNC(void) PyFrame_Fini(void);
 PyAPI_FUNC(void) PyCFunction_Fini(void);
+PyAPI_FUNC(void) PyDict_Fini(void);
 PyAPI_FUNC(void) PyTuple_Fini(void);
 PyAPI_FUNC(void) PyList_Fini(void);
 PyAPI_FUNC(void) PySet_Fini(void);

Modified: python/branches/trunk-math/Include/setobject.h
==============================================================================
--- python/branches/trunk-math/Include/setobject.h	(original)
+++ python/branches/trunk-math/Include/setobject.h	Tue Feb 12 06:36:19 2008
@@ -74,7 +74,11 @@
 	  PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \
 	  PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type))
 #define PySet_Check(ob) \
-	(Py_TYPE(ob) == &PySet_Type || PyType_IsSubtype(Py_TYPE(ob), &PySet_Type))
+	(Py_TYPE(ob) == &PySet_Type || \
+	PyType_IsSubtype(Py_TYPE(ob), &PySet_Type))
+#define   PyFrozenSet_Check(ob) \
+	(Py_TYPE(ob) == &PyFrozenSet_Type || \
+	  PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type))
 
 PyAPI_FUNC(PyObject *) PySet_New(PyObject *);
 PyAPI_FUNC(PyObject *) PyFrozenSet_New(PyObject *);

Modified: python/branches/trunk-math/Lib/DocXMLRPCServer.py
==============================================================================
--- python/branches/trunk-math/Lib/DocXMLRPCServer.py	(original)
+++ python/branches/trunk-math/Lib/DocXMLRPCServer.py	Tue Feb 12 06:36:19 2008
@@ -30,7 +30,7 @@
         results = []
         here = 0
 
-        # XXX Note that this regular expressions does not allow for the
+        # XXX Note that this regular expression does not allow for the
         # hyperlinking of arbitrary strings being used as method
         # names. Only methods with names consisting of word characters
         # and '.'s are hyperlinked.
@@ -52,7 +52,7 @@
                 url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc)
                 results.append('<a href="%s">%s</a>' % (url, escape(all)))
             elif pep:
-                url = 'http://www.python.org/peps/pep-%04d.html' % int(pep)
+                url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep)
                 results.append('<a href="%s">%s</a>' % (url, escape(all)))
             elif text[end:end+1] == '(':
                 results.append(self.namelink(name, methods, funcs, classes))

Modified: python/branches/trunk-math/Lib/UserList.py
==============================================================================
--- python/branches/trunk-math/Lib/UserList.py	(original)
+++ python/branches/trunk-math/Lib/UserList.py	Tue Feb 12 06:36:19 2008
@@ -1,6 +1,8 @@
 """A more or less complete user-defined wrapper around list objects."""
 
-class UserList:
+import collections
+
+class UserList(collections.MutableSequence):
     def __init__(self, initlist=None):
         self.data = []
         if initlist is not None:

Modified: python/branches/trunk-math/Lib/UserString.py
==============================================================================
--- python/branches/trunk-math/Lib/UserString.py	(original)
+++ python/branches/trunk-math/Lib/UserString.py	Tue Feb 12 06:36:19 2008
@@ -6,10 +6,11 @@
 This module requires Python 1.6 or later.
 """
 import sys
+import collections
 
 __all__ = ["UserString","MutableString"]
 
-class UserString:
+class UserString(collections.Sequence):
     def __init__(self, seq):
         if isinstance(seq, basestring):
             self.data = seq
@@ -129,7 +130,9 @@
     def upper(self): return self.__class__(self.data.upper())
     def zfill(self, width): return self.__class__(self.data.zfill(width))
 
-class MutableString(UserString):
+collections.Sequence.register(UserString)
+
+class MutableString(UserString, collections.MutableSequence):
     """mutable string objects
 
     Python strings are immutable objects.  This has the advantage, that
@@ -208,6 +211,8 @@
     def __imul__(self, n):
         self.data *= n
         return self
+    def insert(self, index, value):
+        self[index:index] = value
 
 if __name__ == "__main__":
     # execute the regression test to stdout, if called as a script:

Modified: python/branches/trunk-math/Lib/_abcoll.py
==============================================================================
--- python/branches/trunk-math/Lib/_abcoll.py	(original)
+++ python/branches/trunk-math/Lib/_abcoll.py	Tue Feb 12 06:36:19 2008
@@ -56,8 +56,7 @@
 Iterable.register(str)
 
 
-class Iterator:
-    __metaclass__ = ABCMeta
+class Iterator(Iterable):
 
     @abstractmethod
     def __next__(self):
@@ -122,9 +121,7 @@
 ### SETS ###
 
 
-class Set:
-    __metaclass__ = ABCMeta
-
+class Set(Sized, Iterable, Container):
     """A set is a finite, iterable container.
 
     This class provides concrete generic implementations of all
@@ -135,19 +132,6 @@
     then the other operations will automatically follow suit.
     """
 
-    @abstractmethod
-    def __contains__(self, value):
-        return False
-
-    @abstractmethod
-    def __iter__(self):
-        while False:
-            yield None
-
-    @abstractmethod
-    def __len__(self):
-        return 0
-
     def __le__(self, other):
         if not isinstance(other, Set):
             return NotImplemented
@@ -163,14 +147,32 @@
             return NotImplemented
         return len(self) < len(other) and self.__le__(other)
 
+    def __gt__(self, other):
+        if not isinstance(other, Set):
+            return NotImplemented
+        return other < self
+
+    def __ge__(self, other):
+        if not isinstance(other, Set):
+            return NotImplemented
+        return other <= self
+
     def __eq__(self, other):
         if not isinstance(other, Set):
             return NotImplemented
         return len(self) == len(other) and self.__le__(other)
 
+    def __ne__(self, other):
+        return not (self == other)
+
     @classmethod
     def _from_iterable(cls, it):
-        return frozenset(it)
+        '''Construct an instance of the class from any iterable input.
+
+        Must override this method if the class constructor signature
+        does not accept an iterable for an input.
+        '''
+        return cls(it)
 
     def __and__(self, other):
         if not isinstance(other, Iterable):
@@ -266,16 +268,6 @@
         self.discard(value)
         return value
 
-    def toggle(self, value):
-        """Return True if it was added, False if deleted."""
-        # XXX This implementation is not thread-safe
-        if value in self:
-            self.discard(value)
-            return False
-        else:
-            self.add(value)
-            return True
-
     def clear(self):
         """This is slow (creates N new iterators!) but effective."""
         try:
@@ -296,9 +288,13 @@
         return self
 
     def __ixor__(self, it):
-        # This calls toggle(), so if that is overridded, we call the override
+        if not isinstance(it, Set):
+            it = self._from_iterable(it)
         for value in it:
-            self.toggle(it)
+            if value in self:
+                self.discard(value)
+            else:
+                self.add(value)
         return self
 
     def __isub__(self, it):
@@ -312,8 +308,7 @@
 ### MAPPINGS ###
 
 
-class Mapping:
-    __metaclass__ = ABCMeta
+class Mapping(Sized, Iterable, Container):
 
     @abstractmethod
     def __getitem__(self, key):
@@ -333,15 +328,6 @@
         else:
             return True
 
-    @abstractmethod
-    def __len__(self):
-        return 0
-
-    @abstractmethod
-    def __iter__(self):
-        while False:
-            yield None
-
     def keys(self):
         return KeysView(self)
 
@@ -351,9 +337,14 @@
     def values(self):
         return ValuesView(self)
 
+    def __eq__(self, other):
+        return isinstance(other, Mapping) and \
+               dict(self.items()) == dict(other.items())
 
-class MappingView:
-    __metaclass__ = ABCMeta
+    def __ne__(self, other):
+        return not (self == other)
+
+class MappingView(Sized):
 
     def __init__(self, mapping):
         self._mapping = mapping
@@ -459,15 +450,20 @@
         for key, value in kwds.items():
             self[key] = value
 
+    def setdefault(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            self[key] = default
+        return default
+
 MutableMapping.register(dict)
 
 
 ### SEQUENCES ###
 
 
-class Sequence:
-    __metaclass__ = ABCMeta
-
+class Sequence(Sized, Iterable, Container):
     """All the operations on a read-only sequence.
 
     Concrete subclasses must override __new__ or __init__,
@@ -478,19 +474,15 @@
     def __getitem__(self, index):
         raise IndexError
 
-    @abstractmethod
-    def __len__(self):
-        return 0
-
     def __iter__(self):
         i = 0
-        while True:
-            try:
+        try:
+            while True:
                 v = self[i]
-            except IndexError:
-                break
-            yield v
-            i += 1
+                yield v
+                i += 1
+        except IndexError:
+            return
 
     def __contains__(self, value):
         for v in self:

Modified: python/branches/trunk-math/Lib/calendar.py
==============================================================================
--- python/branches/trunk-math/Lib/calendar.py	(original)
+++ python/branches/trunk-math/Lib/calendar.py	Tue Feb 12 06:36:19 2008
@@ -179,8 +179,8 @@
 
     def itermonthdays(self, year, month):
         """
-        Like itermonthdates(), but will yield day numbers tuples. For days
-        outside the specified month the day number is 0.
+        Like itermonthdates(), but will yield day numbers. For days outside
+        the specified month the day number is 0.
         """
         for date in self.itermonthdates(year, month):
             if date.month != month:

Modified: python/branches/trunk-math/Lib/decimal.py
==============================================================================
--- python/branches/trunk-math/Lib/decimal.py	(original)
+++ python/branches/trunk-math/Lib/decimal.py	Tue Feb 12 06:36:19 2008
@@ -717,6 +717,39 @@
             return other._fix_nan(context)
         return 0
 
+    def _compare_check_nans(self, other, context):
+        """Version of _check_nans used for the signaling comparisons
+        compare_signal, __le__, __lt__, __ge__, __gt__.
+
+        Signal InvalidOperation if either self or other is a (quiet
+        or signaling) NaN.  Signaling NaNs take precedence over quiet
+        NaNs.
+
+        Return 0 if neither operand is a NaN.
+
+        """
+        if context is None:
+            context = getcontext()
+
+        if self._is_special or other._is_special:
+            if self.is_snan():
+                return context._raise_error(InvalidOperation,
+                                            'comparison involving sNaN',
+                                            self)
+            elif other.is_snan():
+                return context._raise_error(InvalidOperation,
+                                            'comparison involving sNaN',
+                                            other)
+            elif self.is_qnan():
+                return context._raise_error(InvalidOperation,
+                                            'comparison involving NaN',
+                                            self)
+            elif other.is_qnan():
+                return context._raise_error(InvalidOperation,
+                                            'comparison involving NaN',
+                                            other)
+        return 0
+
     def __nonzero__(self):
         """Return True if self is nonzero; otherwise return False.
 
@@ -724,18 +757,13 @@
         """
         return self._is_special or self._int != '0'
 
-    def __cmp__(self, other):
-        other = _convert_other(other)
-        if other is NotImplemented:
-            # Never return NotImplemented
-            return 1
+    def _cmp(self, other):
+        """Compare the two non-NaN decimal instances self and other.
 
-        if self._is_special or other._is_special:
-            # check for nans, without raising on a signaling nan
-            if self._isnan() or other._isnan():
-                return 1  # Comparison involving NaN's always reports self > other
+        Returns -1 if self < other, 0 if self == other and 1
+        if self > other.  This routine is for internal use only."""
 
-            # INF = INF
+        if self._is_special or other._is_special:
             return cmp(self._isinfinity(), other._isinfinity())
 
         # check for zeros;  note that cmp(0, -0) should return 0
@@ -764,15 +792,71 @@
         else: # self_adjusted < other_adjusted
             return -((-1)**self._sign)
 
+    # Note: The Decimal standard doesn't cover rich comparisons for
+    # Decimals.  In particular, the specification is silent on the
+    # subject of what should happen for a comparison involving a NaN.
+    # We take the following approach:
+    #
+    #   == comparisons involving a NaN always return False
+    #   != comparisons involving a NaN always return True
+    #   <, >, <= and >= comparisons involving a (quiet or signaling)
+    #      NaN signal InvalidOperation, and return False if the
+    #      InvalidOperation is not trapped.
+    #
+    # This behavior is designed to conform as closely as possible to
+    # that specified by IEEE 754.
+
     def __eq__(self, other):
-        if not isinstance(other, (Decimal, int, long)):
-            return NotImplemented
-        return self.__cmp__(other) == 0
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        if self.is_nan() or other.is_nan():
+            return False
+        return self._cmp(other) == 0
 
     def __ne__(self, other):
-        if not isinstance(other, (Decimal, int, long)):
-            return NotImplemented
-        return self.__cmp__(other) != 0
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        if self.is_nan() or other.is_nan():
+            return True
+        return self._cmp(other) != 0
+
+    def __lt__(self, other, context=None):
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        ans = self._compare_check_nans(other, context)
+        if ans:
+            return False
+        return self._cmp(other) < 0
+
+    def __le__(self, other, context=None):
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        ans = self._compare_check_nans(other, context)
+        if ans:
+            return False
+        return self._cmp(other) <= 0
+
+    def __gt__(self, other, context=None):
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        ans = self._compare_check_nans(other, context)
+        if ans:
+            return False
+        return self._cmp(other) > 0
+
+    def __ge__(self, other, context=None):
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        ans = self._compare_check_nans(other, context)
+        if ans:
+            return False
+        return self._cmp(other) >= 0
 
     def compare(self, other, context=None):
         """Compares one to another.
@@ -791,7 +875,7 @@
             if ans:
                 return ans
 
-        return Decimal(self.__cmp__(other))
+        return Decimal(self._cmp(other))
 
     def __hash__(self):
         """x.__hash__() <==> hash(x)"""
@@ -2452,7 +2536,7 @@
                     return other._fix_nan(context)
                 return self._check_nans(other, context)
 
-        c = self.__cmp__(other)
+        c = self._cmp(other)
         if c == 0:
             # If both operands are finite and equal in numerical value
             # then an ordering is applied:
@@ -2494,7 +2578,7 @@
                     return other._fix_nan(context)
                 return self._check_nans(other, context)
 
-        c = self.__cmp__(other)
+        c = self._cmp(other)
         if c == 0:
             c = self.compare_total(other)
 
@@ -2542,23 +2626,10 @@
         It's pretty much like compare(), but all NaNs signal, with signaling
         NaNs taking precedence over quiet NaNs.
         """
-        if context is None:
-            context = getcontext()
-
-        self_is_nan = self._isnan()
-        other_is_nan = other._isnan()
-        if self_is_nan == 2:
-            return context._raise_error(InvalidOperation, 'sNaN',
-                                        self)
-        if other_is_nan == 2:
-            return context._raise_error(InvalidOperation, 'sNaN',
-                                        other)
-        if self_is_nan:
-            return context._raise_error(InvalidOperation, 'NaN in compare_signal',
-                                        self)
-        if other_is_nan:
-            return context._raise_error(InvalidOperation, 'NaN in compare_signal',
-                                        other)
+        other = _convert_other(other, raiseit = True)
+        ans = self._compare_check_nans(other, context)
+        if ans:
+            return ans
         return self.compare(other, context=context)
 
     def compare_total(self, other):
@@ -3065,7 +3136,7 @@
                     return other._fix_nan(context)
                 return self._check_nans(other, context)
 
-        c = self.copy_abs().__cmp__(other.copy_abs())
+        c = self.copy_abs()._cmp(other.copy_abs())
         if c == 0:
             c = self.compare_total(other)
 
@@ -3095,7 +3166,7 @@
                     return other._fix_nan(context)
                 return self._check_nans(other, context)
 
-        c = self.copy_abs().__cmp__(other.copy_abs())
+        c = self.copy_abs()._cmp(other.copy_abs())
         if c == 0:
             c = self.compare_total(other)
 
@@ -3170,7 +3241,7 @@
         if ans:
             return ans
 
-        comparison = self.__cmp__(other)
+        comparison = self._cmp(other)
         if comparison == 0:
             return self.copy_sign(other)
 

Modified: python/branches/trunk-math/Lib/distutils/__init__.py
==============================================================================
--- python/branches/trunk-math/Lib/distutils/__init__.py	(original)
+++ python/branches/trunk-math/Lib/distutils/__init__.py	Tue Feb 12 06:36:19 2008
@@ -20,4 +20,4 @@
 # In general, major and minor version should loosely follow the Python
 # version number the distutils code was shipped with.
 #
-__version__ = "2.5.1"
+__version__ = "2.6.0"

Modified: python/branches/trunk-math/Lib/distutils/command/build_ext.py
==============================================================================
--- python/branches/trunk-math/Lib/distutils/command/build_ext.py	(original)
+++ python/branches/trunk-math/Lib/distutils/command/build_ext.py	Tue Feb 12 06:36:19 2008
@@ -182,13 +182,13 @@
             self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
             if MSVC_VERSION == 9:
                 self.library_dirs.append(os.path.join(sys.exec_prefix,
-                                         'PCBuild9'))
+                                         'PCbuild'))
             elif MSVC_VERSION == 8:
                 self.library_dirs.append(os.path.join(sys.exec_prefix,
-                                         'PCBuild8', 'win32release'))
+                                         'PC', 'VS8.0', 'win32release'))
             else:
                 self.library_dirs.append(os.path.join(sys.exec_prefix,
-                                         'PCBuild'))
+                                         'PC', 'VS7.1'))
 
         # OS/2 (EMX) doesn't support Debug vs Release builds, but has the
         # import libraries in its "Config" subdirectory

Modified: python/branches/trunk-math/Lib/distutils/sysconfig.py
==============================================================================
--- python/branches/trunk-math/Lib/distutils/sysconfig.py	(original)
+++ python/branches/trunk-math/Lib/distutils/sysconfig.py	Tue Feb 12 06:36:19 2008
@@ -37,8 +37,12 @@
 # different (hard-wired) directories.
 # Setup.local is available for Makefile builds including VPATH builds,
 # Setup.dist is available on Windows
-python_build = any(os.path.isfile(os.path.join(project_base, "Modules", fn))
-                   for fn in ("Setup.dist", "Setup.local"))
+def _python_build():
+    for fn in ("Setup.dist", "Setup.local"):
+        if os.path.isfile(os.path.join(project_base, "Modules", fn)):
+            return True
+    return False
+python_build = _python_build()
 
 
 def get_python_version():

Modified: python/branches/trunk-math/Lib/numbers.py
==============================================================================
--- python/branches/trunk-math/Lib/numbers.py	(original)
+++ python/branches/trunk-math/Lib/numbers.py	Tue Feb 12 06:36:19 2008
@@ -174,7 +174,10 @@
         """self == other"""
         raise NotImplementedError
 
-    # __ne__ is inherited from object and negates whatever __eq__ does.
+    def __ne__(self, other):
+        """self != other"""
+        # The default __ne__ doesn't negate __eq__ until 3.0.
+        return not (self == other)
 
 Complex.register(complex)
 
@@ -292,7 +295,13 @@
 
     # Concrete implementation of Real's conversion to float.
     def __float__(self):
-        """float(self) = self.numerator / self.denominator"""
+        """float(self) = self.numerator / self.denominator
+
+        It's important that this conversion use the integer's "true"
+        division rather than casting one side to float before dividing
+        so that ratios of huge integers convert without overflowing.
+
+        """
         return self.numerator / self.denominator
 
 

Modified: python/branches/trunk-math/Lib/pickletools.py
==============================================================================
--- python/branches/trunk-math/Lib/pickletools.py	(original)
+++ python/branches/trunk-math/Lib/pickletools.py	Tue Feb 12 06:36:19 2008
@@ -10,9 +10,7 @@
    Print a symbolic disassembly of a pickle.
 '''
 
-__all__ = ['dis',
-           'genops',
-          ]
+__all__ = ['dis', 'genops', 'optimize']
 
 # Other ideas:
 #
@@ -1858,6 +1856,33 @@
             break
 
 ##############################################################################
+# A pickle optimizer.
+
+def optimize(p):
+    'Optimize a pickle string by removing unused PUT opcodes'
+    gets = set()            # set of args used by a GET opcode
+    puts = []               # (arg, startpos, stoppos) for the PUT opcodes
+    prevpos = None          # set to pos if previous opcode was a PUT
+    for opcode, arg, pos in genops(p):
+        if prevpos is not None:
+            puts.append((prevarg, prevpos, pos))
+            prevpos = None
+        if 'PUT' in opcode.name:
+            prevarg, prevpos = arg, pos
+        elif 'GET' in opcode.name:
+            gets.add(arg)
+
+    # Copy the pickle string except for PUTS without a corresponding GET
+    s = []
+    i = 0
+    for arg, start, stop in puts:
+        j = stop if (arg in gets) else start
+        s.append(p[i:j])
+        i = stop
+    s.append(p[i:])
+    return ''.join(s)
+
+##############################################################################
 # A symbolic pickle disassembler.
 
 def dis(pickle, out=None, memo=None, indentlevel=4):

Modified: python/branches/trunk-math/Lib/pydoc.py
==============================================================================
--- python/branches/trunk-math/Lib/pydoc.py	(original)
+++ python/branches/trunk-math/Lib/pydoc.py	Tue Feb 12 06:36:19 2008
@@ -540,7 +540,7 @@
                 url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc)
                 results.append('<a href="%s">%s</a>' % (url, escape(all)))
             elif pep:
-                url = 'http://www.python.org/peps/pep-%04d' % int(pep)
+                url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep)
                 results.append('<a href="%s">%s</a>' % (url, escape(all)))
             elif text[end:end+1] == '(':
                 results.append(self.namelink(name, methods, funcs, classes))

Deleted: /python/branches/trunk-math/Lib/rational.py
==============================================================================
--- /python/branches/trunk-math/Lib/rational.py	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,478 +0,0 @@
-# Originally contributed by Sjoerd Mullender.
-# Significantly modified by Jeffrey Yasskin <jyasskin at gmail.com>.
-
-"""Rational, infinite-precision, real numbers."""
-
-from __future__ import division
-import math
-import numbers
-import operator
-import re
-
-__all__ = ["Rational"]
-
-RationalAbc = numbers.Rational
-
-
-def gcd(a, b):
-    """Calculate the Greatest Common Divisor of a and b.
-
-    Unless b==0, the result will have the same sign as b (so that when
-    b is divided by it, the result comes out positive).
-    """
-    while b:
-        a, b = b, a%b
-    return a
-
-
-_RATIONAL_FORMAT = re.compile(
-    r'^\s*(?P<sign>[-+]?)(?P<num>\d+)'
-    r'(?:/(?P<denom>\d+)|\.(?P<decimal>\d+))?\s*$')
-
-
-class Rational(RationalAbc):
-    """This class implements rational numbers.
-
-    Rational(8, 6) will produce a rational number equivalent to
-    4/3. Both arguments must be Integral. The numerator defaults to 0
-    and the denominator defaults to 1 so that Rational(3) == 3 and
-    Rational() == 0.
-
-    Rationals can also be constructed from strings of the form
-    '[-+]?[0-9]+((/|.)[0-9]+)?', optionally surrounded by spaces.
-
-    """
-
-    __slots__ = ('numerator', 'denominator')
-
-    # We're immutable, so use __new__ not __init__
-    def __new__(cls, numerator=0, denominator=1):
-        """Constructs a Rational.
-
-        Takes a string like '3/2' or '1.5', another Rational, or a
-        numerator/denominator pair.
-
-        """
-        self = super(Rational, cls).__new__(cls)
-
-        if denominator == 1:
-            if isinstance(numerator, basestring):
-                # Handle construction from strings.
-                input = numerator
-                m = _RATIONAL_FORMAT.match(input)
-                if m is None:
-                    raise ValueError('Invalid literal for Rational: ' + input)
-                numerator = m.group('num')
-                decimal = m.group('decimal')
-                if decimal:
-                    # The literal is a decimal number.
-                    numerator = int(numerator + decimal)
-                    denominator = 10**len(decimal)
-                else:
-                    # The literal is an integer or fraction.
-                    numerator = int(numerator)
-                    # Default denominator to 1.
-                    denominator = int(m.group('denom') or 1)
-
-                if m.group('sign') == '-':
-                    numerator = -numerator
-
-            elif (not isinstance(numerator, numbers.Integral) and
-                  isinstance(numerator, RationalAbc)):
-                # Handle copies from other rationals.
-                other_rational = numerator
-                numerator = other_rational.numerator
-                denominator = other_rational.denominator
-
-        if (not isinstance(numerator, numbers.Integral) or
-            not isinstance(denominator, numbers.Integral)):
-            raise TypeError("Rational(%(numerator)s, %(denominator)s):"
-                            " Both arguments must be integral." % locals())
-
-        if denominator == 0:
-            raise ZeroDivisionError('Rational(%s, 0)' % numerator)
-
-        g = gcd(numerator, denominator)
-        self.numerator = int(numerator // g)
-        self.denominator = int(denominator // g)
-        return self
-
-    @classmethod
-    def from_float(cls, f):
-        """Converts a finite float to a rational number, exactly.
-
-        Beware that Rational.from_float(0.3) != Rational(3, 10).
-
-        """
-        if not isinstance(f, float):
-            raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
-                            (cls.__name__, f, type(f).__name__))
-        if math.isnan(f) or math.isinf(f):
-            raise TypeError("Cannot convert %r to %s." % (f, cls.__name__))
-        return cls(*f.as_integer_ratio())
-
-    @classmethod
-    def from_decimal(cls, dec):
-        """Converts a finite Decimal instance to a rational number, exactly."""
-        from decimal import Decimal
-        if not isinstance(dec, Decimal):
-            raise TypeError(
-                "%s.from_decimal() only takes Decimals, not %r (%s)" %
-                (cls.__name__, dec, type(dec).__name__))
-        if not dec.is_finite():
-            # Catches infinities and nans.
-            raise TypeError("Cannot convert %s to %s." % (dec, cls.__name__))
-        sign, digits, exp = dec.as_tuple()
-        digits = int(''.join(map(str, digits)))
-        if sign:
-            digits = -digits
-        if exp >= 0:
-            return cls(digits * 10 ** exp)
-        else:
-            return cls(digits, 10 ** -exp)
-
-    @classmethod
-    def from_continued_fraction(cls, seq):
-        'Build a Rational from a continued fraction expessed as a sequence'
-        n, d = 1, 0
-        for e in reversed(seq):
-            n, d = d, n
-            n += e * d
-        return cls(n, d) if seq else cls(0)
-
-    def as_continued_fraction(self):
-        'Return continued fraction expressed as a list'
-        n = self.numerator
-        d = self.denominator
-        cf = []
-        while d:
-            e = int(n // d)
-            cf.append(e)
-            n -= e * d
-            n, d = d, n
-        return cf
-
-    def approximate(self, max_denominator):
-        'Best rational approximation with a denominator <= max_denominator'
-        # XXX First cut at algorithm
-        # Still needs rounding rules as specified at
-        #       http://en.wikipedia.org/wiki/Continued_fraction
-        if self.denominator <= max_denominator:
-            return self
-        cf = self.as_continued_fraction()
-        result = Rational(0)
-        for i in range(1, len(cf)):
-            new = self.from_continued_fraction(cf[:i])
-            if new.denominator > max_denominator:
-                break
-            result = new
-        return result
-
-    def __repr__(self):
-        """repr(self)"""
-        return ('Rational(%r,%r)' % (self.numerator, self.denominator))
-
-    def __str__(self):
-        """str(self)"""
-        if self.denominator == 1:
-            return str(self.numerator)
-        else:
-            return '%s/%s' % (self.numerator, self.denominator)
-
-    """ XXX This section needs a lot more commentary
-
-    * Explain the typical sequence of checks, calls, and fallbacks.
-    * Explain the subtle reasons why this logic was needed.
-    * It is not clear how common cases are handled (for example, how
-      does the ratio of two huge integers get converted to a float
-      without overflowing the long-->float conversion.
-
-    """
-
-    def _operator_fallbacks(monomorphic_operator, fallback_operator):
-        """Generates forward and reverse operators given a purely-rational
-        operator and a function from the operator module.
-
-        Use this like:
-        __op__, __rop__ = _operator_fallbacks(just_rational_op, operator.op)
-
-        """
-        def forward(a, b):
-            if isinstance(b, RationalAbc):
-                # Includes ints.
-                return monomorphic_operator(a, b)
-            elif isinstance(b, float):
-                return fallback_operator(float(a), b)
-            elif isinstance(b, complex):
-                return fallback_operator(complex(a), b)
-            else:
-                return NotImplemented
-        forward.__name__ = '__' + fallback_operator.__name__ + '__'
-        forward.__doc__ = monomorphic_operator.__doc__
-
-        def reverse(b, a):
-            if isinstance(a, RationalAbc):
-                # Includes ints.
-                return monomorphic_operator(a, b)
-            elif isinstance(a, numbers.Real):
-                return fallback_operator(float(a), float(b))
-            elif isinstance(a, numbers.Complex):
-                return fallback_operator(complex(a), complex(b))
-            else:
-                return NotImplemented
-        reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
-        reverse.__doc__ = monomorphic_operator.__doc__
-
-        return forward, reverse
-
-    def _add(a, b):
-        """a + b"""
-        return Rational(a.numerator * b.denominator +
-                        b.numerator * a.denominator,
-                        a.denominator * b.denominator)
-
-    __add__, __radd__ = _operator_fallbacks(_add, operator.add)
-
-    def _sub(a, b):
-        """a - b"""
-        return Rational(a.numerator * b.denominator -
-                        b.numerator * a.denominator,
-                        a.denominator * b.denominator)
-
-    __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
-
-    def _mul(a, b):
-        """a * b"""
-        return Rational(a.numerator * b.numerator, a.denominator * b.denominator)
-
-    __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
-
-    def _div(a, b):
-        """a / b"""
-        return Rational(a.numerator * b.denominator,
-                        a.denominator * b.numerator)
-
-    __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
-    __div__, __rdiv__ = _operator_fallbacks(_div, operator.div)
-
-    def __floordiv__(a, b):
-        """a // b"""
-        # Will be math.floor(a / b) in 3.0.
-        div = a / b
-        if isinstance(div, RationalAbc):
-            # trunc(math.floor(div)) doesn't work if the rational is
-            # more precise than a float because the intermediate
-            # rounding may cross an integer boundary.
-            return div.numerator // div.denominator
-        else:
-            return math.floor(div)
-
-    def __rfloordiv__(b, a):
-        """a // b"""
-        # Will be math.floor(a / b) in 3.0.
-        div = a / b
-        if isinstance(div, RationalAbc):
-            # trunc(math.floor(div)) doesn't work if the rational is
-            # more precise than a float because the intermediate
-            # rounding may cross an integer boundary.
-            return div.numerator // div.denominator
-        else:
-            return math.floor(div)
-
-    def __mod__(a, b):
-        """a % b"""
-        div = a // b
-        return a - b * div
-
-    def __rmod__(b, a):
-        """a % b"""
-        div = a // b
-        return a - b * div
-
-    def __pow__(a, b):
-        """a ** b
-
-        If b is not an integer, the result will be a float or complex
-        since roots are generally irrational. If b is an integer, the
-        result will be rational.
-
-        """
-        if isinstance(b, RationalAbc):
-            if b.denominator == 1:
-                power = b.numerator
-                if power >= 0:
-                    return Rational(a.numerator ** power,
-                                    a.denominator ** power)
-                else:
-                    return Rational(a.denominator ** -power,
-                                    a.numerator ** -power)
-            else:
-                # A fractional power will generally produce an
-                # irrational number.
-                return float(a) ** float(b)
-        else:
-            return float(a) ** b
-
-    def __rpow__(b, a):
-        """a ** b"""
-        if b.denominator == 1 and b.numerator >= 0:
-            # If a is an int, keep it that way if possible.
-            return a ** b.numerator
-
-        if isinstance(a, RationalAbc):
-            return Rational(a.numerator, a.denominator) ** b
-
-        if b.denominator == 1:
-            return a ** b.numerator
-
-        return a ** float(b)
-
-    def __pos__(a):
-        """+a: Coerces a subclass instance to Rational"""
-        return Rational(a.numerator, a.denominator)
-
-    def __neg__(a):
-        """-a"""
-        return Rational(-a.numerator, a.denominator)
-
-    def __abs__(a):
-        """abs(a)"""
-        return Rational(abs(a.numerator), a.denominator)
-
-    def __trunc__(a):
-        """trunc(a)"""
-        if a.numerator < 0:
-            return -(-a.numerator // a.denominator)
-        else:
-            return a.numerator // a.denominator
-
-    __int__ = __trunc__
-
-    def __floor__(a):
-        """Will be math.floor(a) in 3.0."""
-        return a.numerator // a.denominator
-
-    def __ceil__(a):
-        """Will be math.ceil(a) in 3.0."""
-        # The negations cleverly convince floordiv to return the ceiling.
-        return -(-a.numerator // a.denominator)
-
-    def __round__(self, ndigits=None):
-        """Will be round(self, ndigits) in 3.0.
-
-        Rounds half toward even.
-        """
-        if ndigits is None:
-            floor, remainder = divmod(self.numerator, self.denominator)
-            if remainder * 2 < self.denominator:
-                return floor
-            elif remainder * 2 > self.denominator:
-                return floor + 1
-            # Deal with the half case:
-            elif floor % 2 == 0:
-                return floor
-            else:
-                return floor + 1
-        shift = 10**abs(ndigits)
-        # See _operator_fallbacks.forward to check that the results of
-        # these operations will always be Rational and therefore have
-        # __round__().
-        if ndigits > 0:
-            return Rational((self * shift).__round__(), shift)
-        else:
-            return Rational((self / shift).__round__() * shift)
-
-    def __hash__(self):
-        """hash(self)
-
-        Tricky because values that are exactly representable as a
-        float must have the same hash as that float.
-
-        """
-        # XXX since this method is expensive, consider caching the result
-        if self.denominator == 1:
-            # Get integers right.
-            return hash(self.numerator)
-        # Expensive check, but definitely correct.
-        if self == float(self):
-            return hash(float(self))
-        else:
-            # Use tuple's hash to avoid a high collision rate on
-            # simple fractions.
-            return hash((self.numerator, self.denominator))
-
-    def __eq__(a, b):
-        """a == b"""
-        if isinstance(b, RationalAbc):
-            return (a.numerator == b.numerator and
-                    a.denominator == b.denominator)
-        if isinstance(b, numbers.Complex) and b.imag == 0:
-            b = b.real
-        if isinstance(b, float):
-            return a == a.from_float(b)
-        else:
-            # XXX: If b.__eq__ is implemented like this method, it may
-            # give the wrong answer after float(a) changes a's
-            # value. Better ways of doing this are welcome.
-            return float(a) == b
-
-    def _subtractAndCompareToZero(a, b, op):
-        """Helper function for comparison operators.
-
-        Subtracts b from a, exactly if possible, and compares the
-        result with 0 using op, in such a way that the comparison
-        won't recurse. If the difference raises a TypeError, returns
-        NotImplemented instead.
-
-        """
-        if isinstance(b, numbers.Complex) and b.imag == 0:
-            b = b.real
-        if isinstance(b, float):
-            b = a.from_float(b)
-        try:
-            # XXX: If b <: Real but not <: RationalAbc, this is likely
-            # to fall back to a float. If the actual values differ by
-            # less than MIN_FLOAT, this could falsely call them equal,
-            # which would make <= inconsistent with ==. Better ways of
-            # doing this are welcome.
-            diff = a - b
-        except TypeError:
-            return NotImplemented
-        if isinstance(diff, RationalAbc):
-            return op(diff.numerator, 0)
-        return op(diff, 0)
-
-    def __lt__(a, b):
-        """a < b"""
-        return a._subtractAndCompareToZero(b, operator.lt)
-
-    def __gt__(a, b):
-        """a > b"""
-        return a._subtractAndCompareToZero(b, operator.gt)
-
-    def __le__(a, b):
-        """a <= b"""
-        return a._subtractAndCompareToZero(b, operator.le)
-
-    def __ge__(a, b):
-        """a >= b"""
-        return a._subtractAndCompareToZero(b, operator.ge)
-
-    def __nonzero__(a):
-        """a != 0"""
-        return a.numerator != 0
-
-    # support for pickling, copy, and deepcopy
-
-    def __reduce__(self):
-        return (self.__class__, (str(self),))
-
-    def __copy__(self):
-        if type(self) == Rational:
-            return self     # I'm immutable; therefore I am my own clone
-        return self.__class__(self.numerator, self.denominator)
-
-    def __deepcopy__(self, memo):
-        if type(self) == Rational:
-            return self     # My components are also immutable
-        return self.__class__(self.numerator, self.denominator)

Modified: python/branches/trunk-math/Lib/re.py
==============================================================================
--- python/branches/trunk-math/Lib/re.py	(original)
+++ python/branches/trunk-math/Lib/re.py	Tue Feb 12 06:36:19 2008
@@ -300,8 +300,8 @@
             p.append(sre_parse.SubPattern(s, [
                 (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))),
                 ]))
+        s.groups = len(p)+1
         p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
-        s.groups = len(p)
         self.scanner = sre_compile.compile(p)
     def scan(self, string):
         result = []

Modified: python/branches/trunk-math/Lib/tarfile.py
==============================================================================
--- python/branches/trunk-math/Lib/tarfile.py	(original)
+++ python/branches/trunk-math/Lib/tarfile.py	Tue Feb 12 06:36:19 2008
@@ -2021,15 +2021,11 @@
 
         for tarinfo in members:
             if tarinfo.isdir():
-                # Extract directory with a safe mode, so that
-                # all files below can be extracted as well.
-                try:
-                    os.makedirs(os.path.join(path, tarinfo.name), 0700)
-                except EnvironmentError:
-                    pass
+                # Extract directories with a safe mode.
                 directories.append(tarinfo)
-            else:
-                self.extract(tarinfo, path)
+                tarinfo = copy.copy(tarinfo)
+                tarinfo.mode = 0700
+            self.extract(tarinfo, path)
 
         # Reverse sort directories.
         directories.sort(lambda a, b: cmp(a.name, b.name))
@@ -2134,6 +2130,8 @@
         # Create all upper directories.
         upperdirs = os.path.dirname(targetpath)
         if upperdirs and not os.path.exists(upperdirs):
+            # Create directories that are not part of the archive with
+            # default permissions.
             os.makedirs(upperdirs)
 
         if tarinfo.islnk() or tarinfo.issym():
@@ -2170,7 +2168,9 @@
         """Make a directory called targetpath.
         """
         try:
-            os.mkdir(targetpath)
+            # Use a safe mode for the directory, the real mode is set
+            # later in _extract_member().
+            os.mkdir(targetpath, 0700)
         except EnvironmentError, e:
             if e.errno != errno.EEXIST:
                 raise

Modified: python/branches/trunk-math/Lib/tempfile.py
==============================================================================
--- python/branches/trunk-math/Lib/tempfile.py	(original)
+++ python/branches/trunk-math/Lib/tempfile.py	Tue Feb 12 06:36:19 2008
@@ -370,6 +370,7 @@
 
     raise IOError, (_errno.EEXIST, "No usable temporary filename found")
 
+
 class _TemporaryFileWrapper:
     """Temporary file wrapper
 
@@ -385,17 +386,25 @@
         self.delete = delete
 
     def __getattr__(self, name):
+        # Attribute lookups are delegated to the underlying file
+        # and cached for non-numeric results
+        # (i.e. methods are cached, closed and friends are not)
         file = self.__dict__['file']
         a = getattr(file, name)
-        if type(a) != type(0):
+        if not issubclass(type(a), type(0)):
             setattr(self, name, a)
         return a
 
+    # The underlying __enter__ method returns the wrong object
+    # (self.file) so override it to return the wrapper
+    def __enter__(self):
+        self.file.__enter__()
+        return self
+
     # NT provides delete-on-close as a primitive, so we don't need
     # the wrapper to do anything special.  We still use it so that
     # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
     if _os.name != 'nt':
-
         # Cache the unlinker so we don't get spurious errors at
         # shutdown when the module-level "os" is None'd out.  Note
         # that this must be referenced as self.unlink, because the
@@ -413,6 +422,14 @@
         def __del__(self):
             self.close()
 
+        # Need to trap __exit__ as well to ensure the file gets
+        # deleted when used in a with statement
+        def __exit__(self, exc, value, tb):
+            result = self.file.__exit__(exc, value, tb)
+            self.close()
+            return result
+
+
 def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
                        prefix=template, dir=None, delete=True):
     """Create and return a temporary file.
@@ -511,6 +528,20 @@
 
         self._rolled = True
 
+    # The method caching trick from NamedTemporaryFile
+    # won't work here, because _file may change from a
+    # _StringIO instance to a real file. So we list
+    # all the methods directly.
+
+    # Context management protocol
+    def __enter__(self):
+        if self._file.closed:
+            raise ValueError("Cannot enter context with closed file")
+        return self
+
+    def __exit__(self, exc, value, tb):
+        self._file.close()
+
     # file protocol
     def __iter__(self):
         return self._file.__iter__()

Modified: python/branches/trunk-math/Lib/test/cjkencodings_test.py
==============================================================================
--- python/branches/trunk-math/Lib/test/cjkencodings_test.py	(original)
+++ python/branches/trunk-math/Lib/test/cjkencodings_test.py	Tue Feb 12 06:36:19 2008
@@ -64,8 +64,10 @@
 "\xab\x96\xe7\x9a\x84\xe5\x95\x8f\xe9\xa1\x8c\xe5\xb0\xb1\xe6\x98"
 "\xaf\x3a\x0a\x0a"),
 'big5hkscs': (
-"\x88\x45\x88\x5c\x8a\x73\x8b\xda\x8d\xd8\x0a",
-"\xf0\xa0\x84\x8c\xc4\x9a\xe9\xb5\xae\xe7\xbd\x93\xe6\xb4\x86\x0a"),
+"\x88\x45\x88\x5c\x8a\x73\x8b\xda\x8d\xd8\x0a\x88\x66\x88\x62\x88"
+"\xa7\x20\x88\xa7\x88\xa3\x0a",
+"\xf0\xa0\x84\x8c\xc4\x9a\xe9\xb5\xae\xe7\xbd\x93\xe6\xb4\x86\x0a"
+"\xc3\x8a\xc3\x8a\xcc\x84\xc3\xaa\x20\xc3\xaa\xc3\xaa\xcc\x84\x0a"),
 'cp949': (
 "\x8c\x63\xb9\xe6\xb0\xa2\xc7\xcf\x20\xbc\x84\xbd\xc3\xc4\xdd\xb6"
 "\xf3\x0a\x0a\xa8\xc0\xa8\xc0\xb3\xb3\x21\x21\x20\xec\xd7\xce\xfa"

Deleted: /python/branches/trunk-math/Lib/test/output/test_cProfile
==============================================================================
--- /python/branches/trunk-math/Lib/test/output/test_cProfile	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,79 +0,0 @@
-test_cProfile
-         126 function calls (106 primitive calls) in 1.000 CPU seconds
-
-   Ordered by: standard name
-
-   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
-        1    0.000    0.000    1.000    1.000 <string>:1(<module>)
-        8    0.064    0.008    0.080    0.010 test_cProfile.py:103(subhelper)
-       28    0.028    0.001    0.028    0.001 test_cProfile.py:115(__getattr__)
-        1    0.270    0.270    1.000    1.000 test_cProfile.py:30(testfunc)
-     23/3    0.150    0.007    0.170    0.057 test_cProfile.py:40(factorial)
-       20    0.020    0.001    0.020    0.001 test_cProfile.py:53(mul)
-        2    0.040    0.020    0.600    0.300 test_cProfile.py:60(helper)
-        4    0.116    0.029    0.120    0.030 test_cProfile.py:78(helper1)
-        2    0.000    0.000    0.140    0.070 test_cProfile.py:89(helper2_indirect)
-        8    0.312    0.039    0.400    0.050 test_cProfile.py:93(helper2)
-       12    0.000    0.000    0.012    0.001 {hasattr}
-        4    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
-        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
-        8    0.000    0.000    0.000    0.000 {range}
-        4    0.000    0.000    0.000    0.000 {sys.exc_info}
-
-
-   Ordered by: standard name
-
-Function                                          called...
-                                                      ncalls  tottime  cumtime
-<string>:1(<module>)                              ->       1    0.270    1.000  test_cProfile.py:30(testfunc)
-test_cProfile.py:103(subhelper)                   ->      16    0.016    0.016  test_cProfile.py:115(__getattr__)
-                                                           8    0.000    0.000  {range}
-test_cProfile.py:115(__getattr__)                 ->
-test_cProfile.py:30(testfunc)                     ->       1    0.014    0.130  test_cProfile.py:40(factorial)
-                                                           2    0.040    0.600  test_cProfile.py:60(helper)
-test_cProfile.py:40(factorial)                    ->    20/3    0.130    0.147  test_cProfile.py:40(factorial)
-                                                          20    0.020    0.020  test_cProfile.py:53(mul)
-test_cProfile.py:53(mul)                          ->
-test_cProfile.py:60(helper)                       ->       4    0.116    0.120  test_cProfile.py:78(helper1)
-                                                           2    0.000    0.140  test_cProfile.py:89(helper2_indirect)
-                                                           6    0.234    0.300  test_cProfile.py:93(helper2)
-test_cProfile.py:78(helper1)                      ->       4    0.000    0.004  {hasattr}
-                                                           4    0.000    0.000  {method 'append' of 'list' objects}
-                                                           4    0.000    0.000  {sys.exc_info}
-test_cProfile.py:89(helper2_indirect)             ->       2    0.006    0.040  test_cProfile.py:40(factorial)
-                                                           2    0.078    0.100  test_cProfile.py:93(helper2)
-test_cProfile.py:93(helper2)                      ->       8    0.064    0.080  test_cProfile.py:103(subhelper)
-                                                           8    0.000    0.008  {hasattr}
-{hasattr}                                         ->      12    0.012    0.012  test_cProfile.py:115(__getattr__)
-{method 'append' of 'list' objects}               ->
-{method 'disable' of '_lsprof.Profiler' objects}  ->
-{range}                                           ->
-{sys.exc_info}                                    ->
-
-
-   Ordered by: standard name
-
-Function                                          was called by...
-                                                      ncalls  tottime  cumtime
-<string>:1(<module>)                              <-
-test_cProfile.py:103(subhelper)                   <-       8    0.064    0.080  test_cProfile.py:93(helper2)
-test_cProfile.py:115(__getattr__)                 <-      16    0.016    0.016  test_cProfile.py:103(subhelper)
-                                                          12    0.012    0.012  {hasattr}
-test_cProfile.py:30(testfunc)                     <-       1    0.270    1.000  <string>:1(<module>)
-test_cProfile.py:40(factorial)                    <-       1    0.014    0.130  test_cProfile.py:30(testfunc)
-                                                        20/3    0.130    0.147  test_cProfile.py:40(factorial)
-                                                           2    0.006    0.040  test_cProfile.py:89(helper2_indirect)
-test_cProfile.py:53(mul)                          <-      20    0.020    0.020  test_cProfile.py:40(factorial)
-test_cProfile.py:60(helper)                       <-       2    0.040    0.600  test_cProfile.py:30(testfunc)
-test_cProfile.py:78(helper1)                      <-       4    0.116    0.120  test_cProfile.py:60(helper)
-test_cProfile.py:89(helper2_indirect)             <-       2    0.000    0.140  test_cProfile.py:60(helper)
-test_cProfile.py:93(helper2)                      <-       6    0.234    0.300  test_cProfile.py:60(helper)
-                                                           2    0.078    0.100  test_cProfile.py:89(helper2_indirect)
-{hasattr}                                         <-       4    0.000    0.004  test_cProfile.py:78(helper1)
-                                                           8    0.000    0.008  test_cProfile.py:93(helper2)
-{method 'append' of 'list' objects}               <-       4    0.000    0.000  test_cProfile.py:78(helper1)
-{method 'disable' of '_lsprof.Profiler' objects}  <-
-{range}                                           <-       8    0.000    0.000  test_cProfile.py:103(subhelper)
-{sys.exc_info}                                    <-       4    0.000    0.000  test_cProfile.py:78(helper1)
-
-

Deleted: /python/branches/trunk-math/Lib/test/output/test_profile
==============================================================================
--- /python/branches/trunk-math/Lib/test/output/test_profile	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,84 +0,0 @@
-test_profile
-         127 function calls (107 primitive calls) in 1.000 CPU seconds
-
-   Ordered by: standard name
-
-   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
-        4    0.000    0.000    0.000    0.000 :0(append)
-        4    0.000    0.000    0.000    0.000 :0(exc_info)
-       12    0.000    0.000    0.012    0.001 :0(hasattr)
-        8    0.000    0.000    0.000    0.000 :0(range)
-        1    0.000    0.000    0.000    0.000 :0(setprofile)
-        1    0.000    0.000    1.000    1.000 <string>:1(<module>)
-        0    0.000             0.000          profile:0(profiler)
-        1    0.000    0.000    1.000    1.000 profile:0(testfunc())
-        8    0.064    0.008    0.080    0.010 test_profile.py:103(subhelper)
-       28    0.028    0.001    0.028    0.001 test_profile.py:115(__getattr__)
-        1    0.270    0.270    1.000    1.000 test_profile.py:30(testfunc)
-     23/3    0.150    0.007    0.170    0.057 test_profile.py:40(factorial)
-       20    0.020    0.001    0.020    0.001 test_profile.py:53(mul)
-        2    0.040    0.020    0.600    0.300 test_profile.py:60(helper)
-        4    0.116    0.029    0.120    0.030 test_profile.py:78(helper1)
-        2    0.000    0.000    0.140    0.070 test_profile.py:89(helper2_indirect)
-        8    0.312    0.039    0.400    0.050 test_profile.py:93(helper2)
-
-
-   Ordered by: standard name
-
-Function                              called...
-:0(append)                            ->
-:0(exc_info)                          ->
-:0(hasattr)                           -> test_profile.py:115(__getattr__)(12)    0.028
-:0(range)                             ->
-:0(setprofile)                        ->
-<string>:1(<module>)                  -> test_profile.py:30(testfunc)(1)    1.000
-profile:0(profiler)                   -> profile:0(testfunc())(1)    1.000
-profile:0(testfunc())                 -> :0(setprofile)(1)    0.000
-                                         <string>:1(<module>)(1)    1.000
-test_profile.py:103(subhelper)        -> :0(range)(8)    0.000
-                                         test_profile.py:115(__getattr__)(16)    0.028
-test_profile.py:115(__getattr__)      ->
-test_profile.py:30(testfunc)          -> test_profile.py:40(factorial)(1)    0.170
-                                         test_profile.py:60(helper)(2)    0.600
-test_profile.py:40(factorial)         -> test_profile.py:40(factorial)(20)    0.170
-                                         test_profile.py:53(mul)(20)    0.020
-test_profile.py:53(mul)               ->
-test_profile.py:60(helper)            -> test_profile.py:78(helper1)(4)    0.120
-                                         test_profile.py:89(helper2_indirect)(2)    0.140
-                                         test_profile.py:93(helper2)(6)    0.400
-test_profile.py:78(helper1)           -> :0(append)(4)    0.000
-                                         :0(exc_info)(4)    0.000
-                                         :0(hasattr)(4)    0.012
-test_profile.py:89(helper2_indirect)  -> test_profile.py:40(factorial)(2)    0.170
-                                         test_profile.py:93(helper2)(2)    0.400
-test_profile.py:93(helper2)           -> :0(hasattr)(8)    0.012
-                                         test_profile.py:103(subhelper)(8)    0.080
-
-
-   Ordered by: standard name
-
-Function                              was called by...
-:0(append)                            <- test_profile.py:78(helper1)(4)    0.120
-:0(exc_info)                          <- test_profile.py:78(helper1)(4)    0.120
-:0(hasattr)                           <- test_profile.py:78(helper1)(4)    0.120
-                                         test_profile.py:93(helper2)(8)    0.400
-:0(range)                             <- test_profile.py:103(subhelper)(8)    0.080
-:0(setprofile)                        <- profile:0(testfunc())(1)    1.000
-<string>:1(<module>)                  <- profile:0(testfunc())(1)    1.000
-profile:0(profiler)                   <-
-profile:0(testfunc())                 <- profile:0(profiler)(1)    0.000
-test_profile.py:103(subhelper)        <- test_profile.py:93(helper2)(8)    0.400
-test_profile.py:115(__getattr__)      <- :0(hasattr)(12)    0.012
-                                         test_profile.py:103(subhelper)(16)    0.080
-test_profile.py:30(testfunc)          <- <string>:1(<module>)(1)    1.000
-test_profile.py:40(factorial)         <- test_profile.py:30(testfunc)(1)    1.000
-                                         test_profile.py:40(factorial)(20)    0.170
-                                         test_profile.py:89(helper2_indirect)(2)    0.140
-test_profile.py:53(mul)               <- test_profile.py:40(factorial)(20)    0.170
-test_profile.py:60(helper)            <- test_profile.py:30(testfunc)(2)    1.000
-test_profile.py:78(helper1)           <- test_profile.py:60(helper)(4)    0.600
-test_profile.py:89(helper2_indirect)  <- test_profile.py:60(helper)(2)    0.600
-test_profile.py:93(helper2)           <- test_profile.py:60(helper)(6)    0.600
-                                         test_profile.py:89(helper2_indirect)(2)    0.140
-
-

Modified: python/branches/trunk-math/Lib/test/regrtest.py
==============================================================================
--- python/branches/trunk-math/Lib/test/regrtest.py	(original)
+++ python/branches/trunk-math/Lib/test/regrtest.py	Tue Feb 12 06:36:19 2008
@@ -710,7 +710,7 @@
     sys.path_importer_cache.update(pic)
 
     # clear type cache
-    sys._cleartypecache()
+    sys._clear_type_cache()
 
     # Clear ABC registries, restoring previously saved ABC registries.
     for abc in [getattr(_abcoll, a) for a in _abcoll.__all__]:

Modified: python/branches/trunk-math/Lib/test/seq_tests.py
==============================================================================
--- python/branches/trunk-math/Lib/test/seq_tests.py	(original)
+++ python/branches/trunk-math/Lib/test/seq_tests.py	Tue Feb 12 06:36:19 2008
@@ -4,6 +4,7 @@
 
 import unittest
 from test import test_support
+import sys
 
 # Various iterables
 # This is used for checking the constructor (here and in test_deque.py)
@@ -328,3 +329,64 @@
         self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([]))
         self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0))
         self.assertRaises(TypeError, a.__getitem__, 'x')
+
+    def test_count(self):
+        a = self.type2test([0, 1, 2])*3
+        self.assertEqual(a.count(0), 3)
+        self.assertEqual(a.count(1), 3)
+        self.assertEqual(a.count(3), 0)
+
+        self.assertRaises(TypeError, a.count)
+
+        class BadExc(Exception):
+            pass
+
+        class BadCmp:
+            def __eq__(self, other):
+                if other == 2:
+                    raise BadExc()
+                return False
+
+        self.assertRaises(BadExc, a.count, BadCmp())
+
+    def test_index(self):
+        u = self.type2test([0, 1])
+        self.assertEqual(u.index(0), 0)
+        self.assertEqual(u.index(1), 1)
+        self.assertRaises(ValueError, u.index, 2)
+
+        u = self.type2test([-2, -1, 0, 0, 1, 2])
+        self.assertEqual(u.count(0), 2)
+        self.assertEqual(u.index(0), 2)
+        self.assertEqual(u.index(0, 2), 2)
+        self.assertEqual(u.index(-2, -10), 0)
+        self.assertEqual(u.index(0, 3), 3)
+        self.assertEqual(u.index(0, 3, 4), 3)
+        self.assertRaises(ValueError, u.index, 2, 0, -10)
+
+        self.assertRaises(TypeError, u.index)
+
+        class BadExc(Exception):
+            pass
+
+        class BadCmp:
+            def __eq__(self, other):
+                if other == 2:
+                    raise BadExc()
+                return False
+
+        a = self.type2test([0, 1, 2, 3])
+        self.assertRaises(BadExc, a.index, BadCmp())
+
+        a = self.type2test([-2, -1, 0, 0, 1, 2])
+        self.assertEqual(a.index(0), 2)
+        self.assertEqual(a.index(0, 2), 2)
+        self.assertEqual(a.index(0, -4), 2)
+        self.assertEqual(a.index(-2, -10), 0)
+        self.assertEqual(a.index(0, 3), 3)
+        self.assertEqual(a.index(0, -3), 3)
+        self.assertEqual(a.index(0, 3, 4), 3)
+        self.assertEqual(a.index(0, -3, -2), 3)
+        self.assertEqual(a.index(0, -4*sys.maxint, 4*sys.maxint), 2)
+        self.assertRaises(ValueError, a.index, 0, 4*sys.maxint,-4*sys.maxint)
+        self.assertRaises(ValueError, a.index, 2, 0, -10)

Modified: python/branches/trunk-math/Lib/test/test_abstract_numbers.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_abstract_numbers.py	(original)
+++ python/branches/trunk-math/Lib/test/test_abstract_numbers.py	Tue Feb 12 06:36:19 2008
@@ -1,11 +1,12 @@
 """Unit tests for numbers.py."""
 
+import math
+import operator
 import unittest
-from test import test_support
-from numbers import Number
-from numbers import Exact, Inexact
 from numbers import Complex, Real, Rational, Integral
-import operator
+from numbers import Exact, Inexact
+from numbers import Number
+from test import test_support
 
 class TestNumbers(unittest.TestCase):
     def test_int(self):
@@ -49,8 +50,8 @@
         self.failUnless(issubclass(complex, Inexact))
 
         c1, c2 = complex(3, 2), complex(4,1)
-        # XXX: This is not ideal, but see the comment in builtin_trunc().
-        self.assertRaises(AttributeError, trunc, c1)
+        # XXX: This is not ideal, but see the comment in math_trunc().
+        self.assertRaises(AttributeError, math.trunc, c1)
         self.assertRaises(TypeError, float, c1)
         self.assertRaises(TypeError, int, c1)
 

Modified: python/branches/trunk-math/Lib/test/test_builtin.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_builtin.py	(original)
+++ python/branches/trunk-math/Lib/test/test_builtin.py	Tue Feb 12 06:36:19 2008
@@ -5,7 +5,7 @@
                               run_unittest, run_with_locale
 from operator import neg
 
-import sys, warnings, cStringIO, random, rational, UserDict
+import sys, warnings, cStringIO, random, fractions, UserDict
 warnings.filterwarnings("ignore", "hex../oct.. of negative int",
                         FutureWarning, __name__)
 warnings.filterwarnings("ignore", "integer argument expected",
@@ -689,7 +689,21 @@
         self.assertRaises(TypeError, float, Foo4(42))
 
     def test_floatasratio(self):
-        R = rational.Rational
+        for f, ratio in [
+                (0.875, (7, 8)),
+                (-0.875, (-7, 8)),
+                (0.0, (0, 1)),
+                (11.5, (23, 2)),
+            ]:
+            self.assertEqual(f.as_integer_ratio(), ratio)
+
+        for i in range(10000):
+            f = random.random()
+            f *= 10 ** random.randint(-100, 100)
+            n, d = f.as_integer_ratio()
+            self.assertEqual(float(n).__truediv__(d), f)
+
+        R = fractions.Fraction
         self.assertEqual(R(0, 1),
                          R(*float(0.0).as_integer_ratio()))
         self.assertEqual(R(5, 2),
@@ -920,6 +934,14 @@
 
     def test_intconversion(self):
         # Test __int__()
+        class ClassicMissingMethods:
+            pass
+        self.assertRaises(AttributeError, int, ClassicMissingMethods())
+
+        class MissingMethods(object):
+            pass
+        self.assertRaises(TypeError, int, MissingMethods())
+
         class Foo0:
             def __int__(self):
                 return 42
@@ -951,6 +973,49 @@
         self.assertEqual(int(Foo4()), 42L)
         self.assertRaises(TypeError, int, Foo5())
 
+        class Classic:
+            pass
+        for base in (object, Classic):
+            class IntOverridesTrunc(base):
+                def __int__(self):
+                    return 42
+                def __trunc__(self):
+                    return -12
+            self.assertEqual(int(IntOverridesTrunc()), 42)
+
+            class JustTrunc(base):
+                def __trunc__(self):
+                    return 42
+            self.assertEqual(int(JustTrunc()), 42)
+
+            for trunc_result_base in (object, Classic):
+                class Integral(trunc_result_base):
+                    def __int__(self):
+                        return 42
+
+                class TruncReturnsNonInt(base):
+                    def __trunc__(self):
+                        return Integral()
+                self.assertEqual(int(TruncReturnsNonInt()), 42)
+
+                class NonIntegral(trunc_result_base):
+                    def __trunc__(self):
+                        # Check that we avoid infinite recursion.
+                        return NonIntegral()
+
+                class TruncReturnsNonIntegral(base):
+                    def __trunc__(self):
+                        return NonIntegral()
+                try:
+                    int(TruncReturnsNonIntegral())
+                except TypeError as e:
+                    self.assertEquals(str(e),
+                                      "__trunc__ returned non-Integral"
+                                      " (type NonIntegral)")
+                else:
+                    self.fail("Failed to raise TypeError with %s" %
+                              ((base, trunc_result_base),))
+
     def test_intern(self):
         self.assertRaises(TypeError, intern)
         s = "never interned before"
@@ -1193,6 +1258,14 @@
 
     def test_longconversion(self):
         # Test __long__()
+        class ClassicMissingMethods:
+            pass
+        self.assertRaises(AttributeError, long, ClassicMissingMethods())
+
+        class MissingMethods(object):
+            pass
+        self.assertRaises(TypeError, long, MissingMethods())
+
         class Foo0:
             def __long__(self):
                 return 42L
@@ -1224,6 +1297,49 @@
         self.assertEqual(long(Foo4()), 42)
         self.assertRaises(TypeError, long, Foo5())
 
+        class Classic:
+            pass
+        for base in (object, Classic):
+            class LongOverridesTrunc(base):
+                def __long__(self):
+                    return 42
+                def __trunc__(self):
+                    return -12
+            self.assertEqual(long(LongOverridesTrunc()), 42)
+
+            class JustTrunc(base):
+                def __trunc__(self):
+                    return 42
+            self.assertEqual(long(JustTrunc()), 42)
+
+            for trunc_result_base in (object, Classic):
+                class Integral(trunc_result_base):
+                    def __int__(self):
+                        return 42
+
+                class TruncReturnsNonLong(base):
+                    def __trunc__(self):
+                        return Integral()
+                self.assertEqual(long(TruncReturnsNonLong()), 42)
+
+                class NonIntegral(trunc_result_base):
+                    def __trunc__(self):
+                        # Check that we avoid infinite recursion.
+                        return NonIntegral()
+
+                class TruncReturnsNonIntegral(base):
+                    def __trunc__(self):
+                        return NonIntegral()
+                try:
+                    long(TruncReturnsNonIntegral())
+                except TypeError as e:
+                    self.assertEquals(str(e),
+                                      "__trunc__ returned non-Integral"
+                                      " (type NonIntegral)")
+                else:
+                    self.fail("Failed to raise TypeError with %s" %
+                              ((base, trunc_result_base),))
+
     def test_map(self):
         self.assertEqual(
             map(None, 'hello world'),
@@ -1766,38 +1882,6 @@
                 raise ValueError
         self.assertRaises(ValueError, sum, BadSeq())
 
-    def test_trunc(self):
-
-        self.assertEqual(trunc(1), 1)
-        self.assertEqual(trunc(-1), -1)
-        self.assertEqual(type(trunc(1)), int)
-        self.assertEqual(type(trunc(1.5)), int)
-        self.assertEqual(trunc(1.5), 1)
-        self.assertEqual(trunc(-1.5), -1)
-        self.assertEqual(trunc(1.999999), 1)
-        self.assertEqual(trunc(-1.999999), -1)
-        self.assertEqual(trunc(-0.999999), -0)
-        self.assertEqual(trunc(-100.999), -100)
-
-        class TestTrunc(object):
-            def __trunc__(self):
-                return 23
-
-        class TestNoTrunc(object):
-            pass
-
-        self.assertEqual(trunc(TestTrunc()), 23)
-
-        self.assertRaises(TypeError, trunc)
-        self.assertRaises(TypeError, trunc, 1, 2)
-        # XXX: This is not ideal, but see the comment in builtin_trunc().
-        self.assertRaises(AttributeError, trunc, TestNoTrunc())
-
-        t = TestNoTrunc()
-        t.__trunc__ = lambda *args: args
-        self.assertEquals((), trunc(t))
-        self.assertRaises(TypeError, trunc, t, 0)
-
     def test_tuple(self):
         self.assertEqual(tuple(()), ())
         t0_3 = (0, 1, 2, 3)

Deleted: /python/branches/trunk-math/Lib/test/test_cProfile.py
==============================================================================
--- /python/branches/trunk-math/Lib/test/test_cProfile.py	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,123 +0,0 @@
-"""Test suite for the cProfile module."""
-
-import cProfile, pstats, sys
-
-# In order to have reproducible time, we simulate a timer in the global
-# variable 'ticks', which represents simulated time in milliseconds.
-# (We can't use a helper function increment the timer since it would be
-# included in the profile and would appear to consume all the time.)
-ticks = 0
-
-# IMPORTANT: this is an output test.  *ALL* NUMBERS in the expected
-# output are relevant.  If you change the formatting of pstats,
-# please don't just regenerate output/test_cProfile without checking
-# very carefully that not a single number has changed.
-
-def test_main():
-    global ticks
-    ticks = 42000
-    prof = cProfile.Profile(timer, 0.001)
-    prof.runctx("testfunc()", globals(), locals())
-    assert ticks == 43000, ticks
-    st = pstats.Stats(prof)
-    st.strip_dirs().sort_stats('stdname').print_stats()
-    st.print_callees()
-    st.print_callers()
-
-def timer():
-    return ticks
-
-def testfunc():
-    # 1 call
-    # 1000 ticks total: 270 ticks local, 730 ticks in subfunctions
-    global ticks
-    ticks += 99
-    helper()                            # 300
-    helper()                            # 300
-    ticks += 171
-    factorial(14)                       # 130
-
-def factorial(n):
-    # 23 calls total
-    # 170 ticks total, 150 ticks local
-    # 3 primitive calls, 130, 20 and 20 ticks total
-    # including 116, 17, 17 ticks local
-    global ticks
-    if n > 0:
-        ticks += n
-        return mul(n, factorial(n-1))
-    else:
-        ticks += 11
-        return 1
-
-def mul(a, b):
-    # 20 calls
-    # 1 tick, local
-    global ticks
-    ticks += 1
-    return a * b
-
-def helper():
-    # 2 calls
-    # 300 ticks total: 20 ticks local, 260 ticks in subfunctions
-    global ticks
-    ticks += 1
-    helper1()                           # 30
-    ticks += 2
-    helper1()                           # 30
-    ticks += 6
-    helper2()                           # 50
-    ticks += 3
-    helper2()                           # 50
-    ticks += 2
-    helper2()                           # 50
-    ticks += 5
-    helper2_indirect()                  # 70
-    ticks += 1
-
-def helper1():
-    # 4 calls
-    # 30 ticks total: 29 ticks local, 1 tick in subfunctions
-    global ticks
-    ticks += 10
-    hasattr(C(), "foo")                 # 1
-    ticks += 19
-    lst = []
-    lst.append(42)                      # 0
-    sys.exc_info()                      # 0
-
-def helper2_indirect():
-    helper2()                           # 50
-    factorial(3)                        # 20
-
-def helper2():
-    # 8 calls
-    # 50 ticks local: 39 ticks local, 11 ticks in subfunctions
-    global ticks
-    ticks += 11
-    hasattr(C(), "bar")                 # 1
-    ticks += 13
-    subhelper()                         # 10
-    ticks += 15
-
-def subhelper():
-    # 8 calls
-    # 10 ticks total: 8 ticks local, 2 ticks in subfunctions
-    global ticks
-    ticks += 2
-    for i in range(2):                  # 0
-        try:
-            C().foo                     # 1 x 2
-        except AttributeError:
-            ticks += 3                  # 3 x 2
-
-class C:
-    def __getattr__(self, name):
-        # 28 calls
-        # 1 tick, local
-        global ticks
-        ticks += 1
-        raise AttributeError
-
-if __name__ == "__main__":
-    test_main()

Modified: python/branches/trunk-math/Lib/test/test_codecmaps_hk.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_codecmaps_hk.py	(original)
+++ python/branches/trunk-math/Lib/test/test_codecmaps_hk.py	Tue Feb 12 06:36:19 2008
@@ -11,10 +11,11 @@
 class TestBig5HKSCSMap(test_multibytecodec_support.TestBase_Mapping,
                        unittest.TestCase):
     encoding = 'big5hkscs'
-    mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS.TXT'
+    mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS-2004.TXT'
 
 def test_main():
     test_support.run_unittest(__name__)
 
 if __name__ == "__main__":
+    test_support.use_resources = ['urlfetch']
     test_main()

Modified: python/branches/trunk-math/Lib/test/test_complex.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_complex.py	(original)
+++ python/branches/trunk-math/Lib/test/test_complex.py	Tue Feb 12 06:36:19 2008
@@ -359,6 +359,13 @@
             except (OSError, IOError):
                 pass
 
+    if float.__getformat__("double").startswith("IEEE"):
+        def test_plus_minus_0j(self):
+            # test that -0j and 0j literals are not identified
+            z1, z2 = 0j, -0j
+            self.assertEquals(atan2(z1.imag, -1.), atan2(0., -1.))
+            self.assertEquals(atan2(z2.imag, -1.), atan2(-0., -1.))
+
 def test_main():
     test_support.run_unittest(ComplexTest)
 

Modified: python/branches/trunk-math/Lib/test/test_contains.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_contains.py	(original)
+++ python/branches/trunk-math/Lib/test/test_contains.py	Tue Feb 12 06:36:19 2008
@@ -1,133 +1,111 @@
-from test.test_support import TestFailed, have_unicode
+from test.test_support import have_unicode, run_unittest
+import unittest
 
-class base_set:
 
+class base_set:
     def __init__(self, el):
         self.el = el
 
 class set(base_set):
-
     def __contains__(self, el):
         return self.el == el
 
 class seq(base_set):
-
     def __getitem__(self, n):
         return [self.el][n]
 
-def check(ok, *args):
-    if not ok:
-        raise TestFailed, " ".join(map(str, args))
-
-a = base_set(1)
-b = set(1)
-c = seq(1)
-
-check(1 in b, "1 not in set(1)")
-check(0 not in b, "0 in set(1)")
-check(1 in c, "1 not in seq(1)")
-check(0 not in c, "0 in seq(1)")
-
-try:
-    1 in a
-    check(0, "in base_set did not raise error")
-except TypeError:
-    pass
-
-try:
-    1 not in a
-    check(0, "not in base_set did not raise error")
-except TypeError:
-    pass
-
-# Test char in string
-
-check('c' in 'abc', "'c' not in 'abc'")
-check('d' not in 'abc', "'d' in 'abc'")
-
-check('' in '', "'' not in ''")
-check('' in 'abc', "'' not in 'abc'")
-
-try:
-    None in 'abc'
-    check(0, "None in 'abc' did not raise error")
-except TypeError:
-    pass
-
-
-if have_unicode:
-
-    # Test char in Unicode
-
-    check('c' in unicode('abc'), "'c' not in u'abc'")
-    check('d' not in unicode('abc'), "'d' in u'abc'")
-
-    check('' in unicode(''), "'' not in u''")
-    check(unicode('') in '', "u'' not in ''")
-    check(unicode('') in unicode(''), "u'' not in u''")
-    check('' in unicode('abc'), "'' not in u'abc'")
-    check(unicode('') in 'abc', "u'' not in 'abc'")
-    check(unicode('') in unicode('abc'), "u'' not in u'abc'")
-
-    try:
-        None in unicode('abc')
-        check(0, "None in u'abc' did not raise error")
-    except TypeError:
-        pass
-
-    # Test Unicode char in Unicode
-
-    check(unicode('c') in unicode('abc'), "u'c' not in u'abc'")
-    check(unicode('d') not in unicode('abc'), "u'd' in u'abc'")
-
-    # Test Unicode char in string
-
-    check(unicode('c') in 'abc', "u'c' not in 'abc'")
-    check(unicode('d') not in 'abc', "u'd' in 'abc'")
-
-# A collection of tests on builtin sequence types
-a = range(10)
-for i in a:
-    check(i in a, "%r not in %r" % (i, a))
-check(16 not in a, "16 not in %r" % (a,))
-check(a not in a, "%s not in %r" % (a, a))
-
-a = tuple(a)
-for i in a:
-    check(i in a, "%r not in %r" % (i, a))
-check(16 not in a, "16 not in %r" % (a,))
-check(a not in a, "%r not in %r" % (a, a))
-
-class Deviant1:
-    """Behaves strangely when compared
-
-    This class is designed to make sure that the contains code
-    works when the list is modified during the check.
-    """
-
-    aList = range(15)
-
-    def __cmp__(self, other):
-        if other == 12:
-            self.aList.remove(12)
-            self.aList.remove(13)
-            self.aList.remove(14)
-        return 1
-
-check(Deviant1() not in Deviant1.aList, "Deviant1 failed")
-
-class Deviant2:
-    """Behaves strangely when compared
-
-    This class raises an exception during comparison.  That in
-    turn causes the comparison to fail with a TypeError.
-    """
-
-    def __cmp__(self, other):
-        if other == 4:
-            raise RuntimeError, "gotcha"
-
-try:
-    check(Deviant2() not in a, "oops")
-except TypeError:
-    pass
+
+class TestContains(unittest.TestCase):
+    def test_common_tests(self):
+        a = base_set(1)
+        b = set(1)
+        c = seq(1)
+        self.assert_(1 in b)
+        self.assert_(0 not in b)
+        self.assert_(1 in c)
+        self.assert_(0 not in c)
+        self.assertRaises(TypeError, lambda: 1 in a)
+        self.assertRaises(TypeError, lambda: 1 not in a)
+
+        # test char in string
+        self.assert_('c' in 'abc')
+        self.assert_('d' not in 'abc')
+
+        self.assert_('' in '')
+        self.assert_('' in 'abc')
+
+        self.assertRaises(TypeError, lambda: None in 'abc')
+
+    if have_unicode:
+        def test_char_in_unicode(self):
+            self.assert_('c' in unicode('abc'))
+            self.assert_('d' not in unicode('abc'))
+
+            self.assert_('' in unicode(''))
+            self.assert_(unicode('') in '')
+            self.assert_(unicode('') in unicode(''))
+            self.assert_('' in unicode('abc'))
+            self.assert_(unicode('') in 'abc')
+            self.assert_(unicode('') in unicode('abc'))
+
+            self.assertRaises(TypeError, lambda: None in unicode('abc'))
+
+            # test Unicode char in Unicode
+            self.assert_(unicode('c') in unicode('abc'))
+            self.assert_(unicode('d') not in unicode('abc'))
+
+            # test Unicode char in string
+            self.assert_(unicode('c') in 'abc')
+            self.assert_(unicode('d') not in 'abc')
+
+    def test_builtin_sequence_types(self):
+        # a collection of tests on builtin sequence types
+        a = range(10)
+        for i in a:
+            self.assert_(i in a)
+        self.assert_(16 not in a)
+        self.assert_(a not in a)
+
+        a = tuple(a)
+        for i in a:
+            self.assert_(i in a)
+        self.assert_(16 not in a)
+        self.assert_(a not in a)
+
+        class Deviant1:
+            """Behaves strangely when compared
+
+            This class is designed to make sure that the contains code
+            works when the list is modified during the check.
+            """
+            aList = range(15)
+            def __cmp__(self, other):
+                if other == 12:
+                    self.aList.remove(12)
+                    self.aList.remove(13)
+                    self.aList.remove(14)
+                return 1
+
+        self.assert_(Deviant1() not in Deviant1.aList)
+
+        class Deviant2:
+            """Behaves strangely when compared
+
+            This class raises an exception during comparison.  That in
+            turn causes the comparison to fail with a TypeError.
+            """
+            def __cmp__(self, other):
+                if other == 4:
+                    raise RuntimeError, "gotcha"
+
+        try:
+            self.assert_(Deviant2() not in a)
+        except TypeError:
+            pass
+
+
+def test_main():
+    run_unittest(TestContains)
+
+if __name__ == '__main__':
+    test_main()

Modified: python/branches/trunk-math/Lib/test/test_decimal.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_decimal.py	(original)
+++ python/branches/trunk-math/Lib/test/test_decimal.py	Tue Feb 12 06:36:19 2008
@@ -25,10 +25,11 @@
 """
 from __future__ import with_statement
 
-import unittest
 import glob
+import math
 import os, sys
 import pickle, copy
+import unittest
 from decimal import *
 from test.test_support import (TestSkipped, run_unittest, run_doctest,
                                is_resource_enabled)
@@ -837,6 +838,19 @@
         self.assertEqual(-Decimal(45), Decimal(-45))           #  -
         self.assertEqual(abs(Decimal(45)), abs(Decimal(-45)))  # abs
 
+    def test_nan_comparisons(self):
+        n = Decimal('NaN')
+        s = Decimal('sNaN')
+        i = Decimal('Inf')
+        f = Decimal('2')
+        for x, y in [(n, n), (n, i), (i, n), (n, f), (f, n),
+                     (s, n), (n, s), (s, i), (i, s), (s, f), (f, s), (s, s)]:
+            self.assert_(x != y)
+            self.assert_(not (x == y))
+            self.assert_(not (x < y))
+            self.assert_(not (x <= y))
+            self.assert_(not (x > y))
+            self.assert_(not (x >= y))
 
 # The following are two functions used to test threading in the next class
 
@@ -1146,7 +1160,12 @@
         checkSameDec("__add__", True)
         checkSameDec("__div__", True)
         checkSameDec("__divmod__", True)
-        checkSameDec("__cmp__", True)
+        checkSameDec("__eq__", True)
+        checkSameDec("__ne__", True)
+        checkSameDec("__le__", True)
+        checkSameDec("__lt__", True)
+        checkSameDec("__ge__", True)
+        checkSameDec("__gt__", True)
         checkSameDec("__float__")
         checkSameDec("__floordiv__", True)
         checkSameDec("__hash__")
@@ -1225,7 +1244,7 @@
             # should work the same as to_integral in the ROUND_DOWN mode
             d = Decimal(s)
             r = d.to_integral(ROUND_DOWN)
-            self.assertEqual(Decimal(trunc(d)), r)
+            self.assertEqual(Decimal(math.trunc(d)), r)
 
 class ContextAPItests(unittest.TestCase):
 

Modified: python/branches/trunk-math/Lib/test/test_defaultdict.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_defaultdict.py	(original)
+++ python/branches/trunk-math/Lib/test/test_defaultdict.py	Tue Feb 12 06:36:19 2008
@@ -141,6 +141,29 @@
         else:
             self.fail("expected KeyError")
 
+    def test_recursive_repr(self):
+        # Issue2045: stack overflow when default_factory is a bound method
+        class sub(defaultdict):
+            def __init__(self):
+                self.default_factory = self._factory
+            def _factory(self):
+                return []
+        d = sub()
+        self.assert_(repr(d).startswith(
+            "defaultdict(<bound method sub._factory of defaultdict(..."))
+
+        # NOTE: printing a subclass of a builtin type does not call its
+        # tp_print slot. So this part is essentially the same test as above.
+        tfn = tempfile.mktemp()
+        try:
+            f = open(tfn, "w+")
+            try:
+                print >>f, d
+            finally:
+                f.close()
+        finally:
+            os.remove(tfn)
+
 
 def test_main():
     test_support.run_unittest(TestDefaultDict)

Modified: python/branches/trunk-math/Lib/test/test_descr.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_descr.py	(original)
+++ python/branches/trunk-math/Lib/test/test_descr.py	Tue Feb 12 06:36:19 2008
@@ -1,4637 +1,4332 @@
-# Test enhancements related to descriptors and new-style classes
+import types
+import unittest
+import warnings
+
+from copy import deepcopy
+from test import test_support
+
+
+class OperatorsTest(unittest.TestCase):
+
+    def __init__(self, *args, **kwargs):
+        unittest.TestCase.__init__(self, *args, **kwargs)
+        self.binops = {
+            'add': '+',
+            'sub': '-',
+            'mul': '*',
+            'div': '/',
+            'divmod': 'divmod',
+            'pow': '**',
+            'lshift': '<<',
+            'rshift': '>>',
+            'and': '&',
+            'xor': '^',
+            'or': '|',
+            'cmp': 'cmp',
+            'lt': '<',
+            'le': '<=',
+            'eq': '==',
+            'ne': '!=',
+            'gt': '>',
+            'ge': '>=',
+        }
+
+        for name, expr in self.binops.items():
+            if expr.islower():
+                expr = expr + "(a, b)"
+            else:
+                expr = 'a %s b' % expr
+            self.binops[name] = expr
+
+        self.unops = {
+            'pos': '+',
+            'neg': '-',
+            'abs': 'abs',
+            'invert': '~',
+            'int': 'int',
+            'long': 'long',
+            'float': 'float',
+            'oct': 'oct',
+            'hex': 'hex',
+        }
+
+        for name, expr in self.unops.items():
+            if expr.islower():
+                expr = expr + "(a)"
+            else:
+                expr = '%s a' % expr
+            self.unops[name] = expr
+
+    def setUp(self):
+        self.original_filters = warnings.filters[:]
+        warnings.filterwarnings("ignore",
+                 r'complex divmod\(\), // and % are deprecated$',
+                 DeprecationWarning, r'(<string>|%s)$' % __name__)
+
+    def tearDown(self):
+        warnings.filters = self.original_filters
+
+    def unop_test(self, a, res, expr="len(a)", meth="__len__"):
+        d = {'a': a}
+        self.assertEqual(eval(expr, d), res)
+        t = type(a)
+        m = getattr(t, meth)
+
+        # Find method in parent class
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+
+        self.assertEqual(m, t.__dict__[meth])
+        self.assertEqual(m(a), res)
+        bm = getattr(a, meth)
+        self.assertEqual(bm(), res)
+
+    def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
+        d = {'a': a, 'b': b}
+
+        # XXX Hack so this passes before 2.3 when -Qnew is specified.
+        if meth == "__div__" and 1/2 == 0.5:
+            meth = "__truediv__"
+
+        if meth == '__divmod__': pass
+
+        self.assertEqual(eval(expr, d), res)
+        t = type(a)
+        m = getattr(t, meth)
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+        self.assertEqual(m, t.__dict__[meth])
+        self.assertEqual(m(a, b), res)
+        bm = getattr(a, meth)
+        self.assertEqual(bm(b), res)
+
+    def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
+        d = {'a': a, 'b': b, 'c': c}
+        self.assertEqual(eval(expr, d), res)
+        t = type(a)
+        m = getattr(t, meth)
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+        self.assertEqual(m, t.__dict__[meth])
+        self.assertEqual(m(a, b, c), res)
+        bm = getattr(a, meth)
+        self.assertEqual(bm(b, c), res)
+
+    def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
+        d = {'a': deepcopy(a), 'b': b}
+        exec stmt in d
+        self.assertEqual(d['a'], res)
+        t = type(a)
+        m = getattr(t, meth)
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+        self.assertEqual(m, t.__dict__[meth])
+        d['a'] = deepcopy(a)
+        m(d['a'], b)
+        self.assertEqual(d['a'], res)
+        d['a'] = deepcopy(a)
+        bm = getattr(d['a'], meth)
+        bm(b)
+        self.assertEqual(d['a'], res)
+
+    def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
+        d = {'a': deepcopy(a), 'b': b, 'c': c}
+        exec stmt in d
+        self.assertEqual(d['a'], res)
+        t = type(a)
+        m = getattr(t, meth)
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+        self.assertEqual(m, t.__dict__[meth])
+        d['a'] = deepcopy(a)
+        m(d['a'], b, c)
+        self.assertEqual(d['a'], res)
+        d['a'] = deepcopy(a)
+        bm = getattr(d['a'], meth)
+        bm(b, c)
+        self.assertEqual(d['a'], res)
+
+    def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
+        dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
+        exec stmt in dictionary
+        self.assertEqual(dictionary['a'], res)
+        t = type(a)
+        while meth not in t.__dict__:
+            t = t.__bases__[0]
+        m = getattr(t, meth)
+        self.assertEqual(m, t.__dict__[meth])
+        dictionary['a'] = deepcopy(a)
+        m(dictionary['a'], b, c, d)
+        self.assertEqual(dictionary['a'], res)
+        dictionary['a'] = deepcopy(a)
+        bm = getattr(dictionary['a'], meth)
+        bm(b, c, d)
+        self.assertEqual(dictionary['a'], res)
+
+    def test_lists(self):
+        # Testing list operations...
+        # Asserts are within individual test methods
+        self.binop_test([1], [2], [1,2], "a+b", "__add__")
+        self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
+        self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
+        self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
+        self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
+        self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
+        self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
+        self.unop_test([1,2,3], 3, "len(a)", "__len__")
+        self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
+        self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
+        self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
+        self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
+                        "__setslice__")
+
+    def test_dicts(self):
+        # Testing dict operations...
+        self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
+        self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
+        self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
+        self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
+
+        d = {1:2, 3:4}
+        l1 = []
+        for i in d.keys():
+            l1.append(i)
+        l = []
+        for i in iter(d):
+            l.append(i)
+        self.assertEqual(l, l1)
+        l = []
+        for i in d.__iter__():
+            l.append(i)
+        self.assertEqual(l, l1)
+        l = []
+        for i in dict.__iter__(d):
+            l.append(i)
+        self.assertEqual(l, l1)
+        d = {1:2, 3:4}
+        self.unop_test(d, 2, "len(a)", "__len__")
+        self.assertEqual(eval(repr(d), {}), d)
+        self.assertEqual(eval(d.__repr__(), {}), d)
+        self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
+                        "__setitem__")
+
+    # Tests for unary and binary operators
+    def number_operators(self, a, b, skip=[]):
+        dict = {'a': a, 'b': b}
+
+        for name, expr in self.binops.items():
+            if name not in skip:
+                name = "__%s__" % name
+                if hasattr(a, name):
+                    res = eval(expr, dict)
+                    self.binop_test(a, b, res, expr, name)
+
+        for name, expr in self.unops.items():
+            if name not in skip:
+                name = "__%s__" % name
+                if hasattr(a, name):
+                    res = eval(expr, dict)
+                    self.unop_test(a, res, expr, name)
+
+    def test_ints(self):
+        # Testing int operations...
+        self.number_operators(100, 3)
+        # The following crashes in Python 2.2
+        self.assertEqual((1).__nonzero__(), 1)
+        self.assertEqual((0).__nonzero__(), 0)
+        # This returns 'NotImplemented' in Python 2.2
+        class C(int):
+            def __add__(self, other):
+                return NotImplemented
+        self.assertEqual(C(5L), 5)
+        try:
+            C() + ""
+        except TypeError:
+            pass
+        else:
+            self.fail("NotImplemented should have caused TypeError")
+        import sys
+        try:
+            C(sys.maxint+1)
+        except OverflowError:
+            pass
+        else:
+            self.fail("should have raised OverflowError")
+
+    def test_longs(self):
+        # Testing long operations...
+        self.number_operators(100L, 3L)
+
+    def test_floats(self):
+        # Testing float operations...
+        self.number_operators(100.0, 3.0)
+
+    def test_complexes(self):
+        # Testing complex operations...
+        self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
+                                                  'int', 'long', 'float'])
+
+        class Number(complex):
+            __slots__ = ['prec']
+            def __new__(cls, *args, **kwds):
+                result = complex.__new__(cls, *args)
+                result.prec = kwds.get('prec', 12)
+                return result
+            def __repr__(self):
+                prec = self.prec
+                if self.imag == 0.0:
+                    return "%.*g" % (prec, self.real)
+                if self.real == 0.0:
+                    return "%.*gj" % (prec, self.imag)
+                return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
+            __str__ = __repr__
+
+        a = Number(3.14, prec=6)
+        self.assertEqual(repr(a), "3.14")
+        self.assertEqual(a.prec, 6)
+
+        a = Number(a, prec=2)
+        self.assertEqual(repr(a), "3.1")
+        self.assertEqual(a.prec, 2)
+
+        a = Number(234.5)
+        self.assertEqual(repr(a), "234.5")
+        self.assertEqual(a.prec, 12)
+
+    def test_spam_lists(self):
+        # Testing spamlist operations...
+        import copy, xxsubtype as spam
+
+        def spamlist(l, memo=None):
+            import xxsubtype as spam
+            return spam.spamlist(l)
+
+        # This is an ugly hack:
+        copy._deepcopy_dispatch[spam.spamlist] = spamlist
+
+        self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
+                       "__add__")
+        self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
+        self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
+        self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
+        self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
+                        "__getslice__")
+        self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
+                       "__iadd__")
+        self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
+                       "__imul__")
+        self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
+        self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
+                       "__mul__")
+        self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
+                       "__rmul__")
+        self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
+                        "__setitem__")
+        self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
+                   spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
+        # Test subclassing
+        class C(spam.spamlist):
+            def foo(self): return 1
+        a = C()
+        self.assertEqual(a, [])
+        self.assertEqual(a.foo(), 1)
+        a.append(100)
+        self.assertEqual(a, [100])
+        self.assertEqual(a.getstate(), 0)
+        a.setstate(42)
+        self.assertEqual(a.getstate(), 42)
+
+    def test_spam_dicts(self):
+        # Testing spamdict operations...
+        import copy, xxsubtype as spam
+        def spamdict(d, memo=None):
+            import xxsubtype as spam
+            sd = spam.spamdict()
+            for k, v in d.items():
+                sd[k] = v
+            return sd
+        # This is an ugly hack:
+        copy._deepcopy_dispatch[spam.spamdict] = spamdict
+
+        self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
+                       "__cmp__")
+        self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
+        self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
+        self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
+        d = spamdict({1:2,3:4})
+        l1 = []
+        for i in d.keys():
+            l1.append(i)
+        l = []
+        for i in iter(d):
+            l.append(i)
+        self.assertEqual(l, l1)
+        l = []
+        for i in d.__iter__():
+            l.append(i)
+        self.assertEqual(l, l1)
+        l = []
+        for i in type(spamdict({})).__iter__(d):
+            l.append(i)
+        self.assertEqual(l, l1)
+        straightd = {1:2, 3:4}
+        spamd = spamdict(straightd)
+        self.unop_test(spamd, 2, "len(a)", "__len__")
+        self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
+        self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
+                   "a[b]=c", "__setitem__")
+        # Test subclassing
+        class C(spam.spamdict):
+            def foo(self): return 1
+        a = C()
+        self.assertEqual(a.items(), [])
+        self.assertEqual(a.foo(), 1)
+        a['foo'] = 'bar'
+        self.assertEqual(a.items(), [('foo', 'bar')])
+        self.assertEqual(a.getstate(), 0)
+        a.setstate(100)
+        self.assertEqual(a.getstate(), 100)
+
+class ClassPropertiesAndMethods(unittest.TestCase):
+
+    def test_python_dicts(self):
+        # Testing Python subclass of dict...
+        self.assert_(issubclass(dict, dict))
+        self.assert_(isinstance({}, dict))
+        d = dict()
+        self.assertEqual(d, {})
+        self.assert_(d.__class__ is dict)
+        self.assert_(isinstance(d, dict))
+        class C(dict):
+            state = -1
+            def __init__(self_local, *a, **kw):
+                if a:
+                    self.assertEqual(len(a), 1)
+                    self_local.state = a[0]
+                if kw:
+                    for k, v in kw.items():
+                        self_local[v] = k
+            def __getitem__(self, key):
+                return self.get(key, 0)
+            def __setitem__(self_local, key, value):
+                self.assert_(isinstance(key, type(0)))
+                dict.__setitem__(self_local, key, value)
+            def setstate(self, state):
+                self.state = state
+            def getstate(self):
+                return self.state
+        self.assert_(issubclass(C, dict))
+        a1 = C(12)
+        self.assertEqual(a1.state, 12)
+        a2 = C(foo=1, bar=2)
+        self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
+        a = C()
+        self.assertEqual(a.state, -1)
+        self.assertEqual(a.getstate(), -1)
+        a.setstate(0)
+        self.assertEqual(a.state, 0)
+        self.assertEqual(a.getstate(), 0)
+        a.setstate(10)
+        self.assertEqual(a.state, 10)
+        self.assertEqual(a.getstate(), 10)
+        self.assertEqual(a[42], 0)
+        a[42] = 24
+        self.assertEqual(a[42], 24)
+        N = 50
+        for i in range(N):
+            a[i] = C()
+            for j in range(N):
+                a[i][j] = i*j
+        for i in range(N):
+            for j in range(N):
+                self.assertEqual(a[i][j], i*j)
+
+    def test_python_lists(self):
+        # Testing Python subclass of list...
+        class C(list):
+            def __getitem__(self, i):
+                return list.__getitem__(self, i) + 100
+            def __getslice__(self, i, j):
+                return (i, j)
+        a = C()
+        a.extend([0,1,2])
+        self.assertEqual(a[0], 100)
+        self.assertEqual(a[1], 101)
+        self.assertEqual(a[2], 102)
+        self.assertEqual(a[100:200], (100,200))
+
+    def test_metaclass(self):
+        # Testing __metaclass__...
+        class C:
+            __metaclass__ = type
+            def __init__(self):
+                self.__state = 0
+            def getstate(self):
+                return self.__state
+            def setstate(self, state):
+                self.__state = state
+        a = C()
+        self.assertEqual(a.getstate(), 0)
+        a.setstate(10)
+        self.assertEqual(a.getstate(), 10)
+        class D:
+            class __metaclass__(type):
+                def myself(cls): return cls
+        self.assertEqual(D.myself(), D)
+        d = D()
+        self.assertEqual(d.__class__, D)
+        class M1(type):
+            def __new__(cls, name, bases, dict):
+                dict['__spam__'] = 1
+                return type.__new__(cls, name, bases, dict)
+        class C:
+            __metaclass__ = M1
+        self.assertEqual(C.__spam__, 1)
+        c = C()
+        self.assertEqual(c.__spam__, 1)
+
+        class _instance(object):
+            pass
+        class M2(object):
+            @staticmethod
+            def __new__(cls, name, bases, dict):
+                self = object.__new__(cls)
+                self.name = name
+                self.bases = bases
+                self.dict = dict
+                return self
+            def __call__(self):
+                it = _instance()
+                # Early binding of methods
+                for key in self.dict:
+                    if key.startswith("__"):
+                        continue
+                    setattr(it, key, self.dict[key].__get__(it, self))
+                return it
+        class C:
+            __metaclass__ = M2
+            def spam(self):
+                return 42
+        self.assertEqual(C.name, 'C')
+        self.assertEqual(C.bases, ())
+        self.assert_('spam' in C.dict)
+        c = C()
+        self.assertEqual(c.spam(), 42)
+
+        # More metaclass examples
+
+        class autosuper(type):
+            # Automatically add __super to the class
+            # This trick only works for dynamic classes
+            def __new__(metaclass, name, bases, dict):
+                cls = super(autosuper, metaclass).__new__(metaclass,
+                                                          name, bases, dict)
+                # Name mangling for __super removes leading underscores
+                while name[:1] == "_":
+                    name = name[1:]
+                if name:
+                    name = "_%s__super" % name
+                else:
+                    name = "__super"
+                setattr(cls, name, super(cls))
+                return cls
+        class A:
+            __metaclass__ = autosuper
+            def meth(self):
+                return "A"
+        class B(A):
+            def meth(self):
+                return "B" + self.__super.meth()
+        class C(A):
+            def meth(self):
+                return "C" + self.__super.meth()
+        class D(C, B):
+            def meth(self):
+                return "D" + self.__super.meth()
+        self.assertEqual(D().meth(), "DCBA")
+        class E(B, C):
+            def meth(self):
+                return "E" + self.__super.meth()
+        self.assertEqual(E().meth(), "EBCA")
+
+        class autoproperty(type):
+            # Automatically create property attributes when methods
+            # named _get_x and/or _set_x are found
+            def __new__(metaclass, name, bases, dict):
+                hits = {}
+                for key, val in dict.iteritems():
+                    if key.startswith("_get_"):
+                        key = key[5:]
+                        get, set = hits.get(key, (None, None))
+                        get = val
+                        hits[key] = get, set
+                    elif key.startswith("_set_"):
+                        key = key[5:]
+                        get, set = hits.get(key, (None, None))
+                        set = val
+                        hits[key] = get, set
+                for key, (get, set) in hits.iteritems():
+                    dict[key] = property(get, set)
+                return super(autoproperty, metaclass).__new__(metaclass,
+                                                            name, bases, dict)
+        class A:
+            __metaclass__ = autoproperty
+            def _get_x(self):
+                return -self.__x
+            def _set_x(self, x):
+                self.__x = -x
+        a = A()
+        self.assert_(not hasattr(a, "x"))
+        a.x = 12
+        self.assertEqual(a.x, 12)
+        self.assertEqual(a._A__x, -12)
+
+        class multimetaclass(autoproperty, autosuper):
+            # Merge of multiple cooperating metaclasses
+            pass
+        class A:
+            __metaclass__ = multimetaclass
+            def _get_x(self):
+                return "A"
+        class B(A):
+            def _get_x(self):
+                return "B" + self.__super._get_x()
+        class C(A):
+            def _get_x(self):
+                return "C" + self.__super._get_x()
+        class D(C, B):
+            def _get_x(self):
+                return "D" + self.__super._get_x()
+        self.assertEqual(D().x, "DCBA")
+
+        # Make sure type(x) doesn't call x.__class__.__init__
+        class T(type):
+            counter = 0
+            def __init__(self, *args):
+                T.counter += 1
+        class C:
+            __metaclass__ = T
+        self.assertEqual(T.counter, 1)
+        a = C()
+        self.assertEqual(type(a), C)
+        self.assertEqual(T.counter, 1)
+
+        class C(object): pass
+        c = C()
+        try: c()
+        except TypeError: pass
+        else: self.fail("calling object w/o call method should raise "
+                        "TypeError")
+
+        # Testing code to find most derived baseclass
+        class A(type):
+            def __new__(*args, **kwargs):
+                return type.__new__(*args, **kwargs)
+
+        class B(object):
+            pass
+
+        class C(object):
+            __metaclass__ = A
+
+        # The most derived metaclass of D is A rather than type.
+        class D(B, C):
+            pass
+
+    def test_module_subclasses(self):
+        # Testing Python subclass of module...
+        log = []
+        import types, sys
+        MT = type(sys)
+        class MM(MT):
+            def __init__(self, name):
+                MT.__init__(self, name)
+            def __getattribute__(self, name):
+                log.append(("getattr", name))
+                return MT.__getattribute__(self, name)
+            def __setattr__(self, name, value):
+                log.append(("setattr", name, value))
+                MT.__setattr__(self, name, value)
+            def __delattr__(self, name):
+                log.append(("delattr", name))
+                MT.__delattr__(self, name)
+        a = MM("a")
+        a.foo = 12
+        x = a.foo
+        del a.foo
+        self.assertEqual(log, [("setattr", "foo", 12),
+                               ("getattr", "foo"),
+                               ("delattr", "foo")])
+
+        # http://python.org/sf/1174712
+        try:
+            class Module(types.ModuleType, str):
+                pass
+        except TypeError:
+            pass
+        else:
+            self.fail("inheriting from ModuleType and str at the same time "
+                      "should fail")
+
+    def test_multiple_inheritence(self):
+        # Testing multiple inheritance...
+        class C(object):
+            def __init__(self):
+                self.__state = 0
+            def getstate(self):
+                return self.__state
+            def setstate(self, state):
+                self.__state = state
+        a = C()
+        self.assertEqual(a.getstate(), 0)
+        a.setstate(10)
+        self.assertEqual(a.getstate(), 10)
+        class D(dict, C):
+            def __init__(self):
+                type({}).__init__(self)
+                C.__init__(self)
+        d = D()
+        self.assertEqual(d.keys(), [])
+        d["hello"] = "world"
+        self.assertEqual(d.items(), [("hello", "world")])
+        self.assertEqual(d["hello"], "world")
+        self.assertEqual(d.getstate(), 0)
+        d.setstate(10)
+        self.assertEqual(d.getstate(), 10)
+        self.assertEqual(D.__mro__, (D, dict, C, object))
+
+        # SF bug #442833
+        class Node(object):
+            def __int__(self):
+                return int(self.foo())
+            def foo(self):
+                return "23"
+        class Frag(Node, list):
+            def foo(self):
+                return "42"
+        self.assertEqual(Node().__int__(), 23)
+        self.assertEqual(int(Node()), 23)
+        self.assertEqual(Frag().__int__(), 42)
+        self.assertEqual(int(Frag()), 42)
+
+        # MI mixing classic and new-style classes.
+
+        class A:
+            x = 1
+
+        class B(A):
+            pass
+
+        class C(A):
+            x = 2
+
+        class D(B, C):
+            pass
+        self.assertEqual(D.x, 1)
+
+        # Classic MRO is preserved for a classic base class.
+        class E(D, object):
+            pass
+        self.assertEqual(E.__mro__, (E, D, B, A, C, object))
+        self.assertEqual(E.x, 1)
+
+        # But with a mix of classic bases, their MROs are combined using
+        # new-style MRO.
+        class F(B, C, object):
+            pass
+        self.assertEqual(F.__mro__, (F, B, C, A, object))
+        self.assertEqual(F.x, 2)
+
+        # Try something else.
+        class C:
+            def cmethod(self):
+                return "C a"
+            def all_method(self):
+                return "C b"
+
+        class M1(C, object):
+            def m1method(self):
+                return "M1 a"
+            def all_method(self):
+                return "M1 b"
+
+        self.assertEqual(M1.__mro__, (M1, C, object))
+        m = M1()
+        self.assertEqual(m.cmethod(), "C a")
+        self.assertEqual(m.m1method(), "M1 a")
+        self.assertEqual(m.all_method(), "M1 b")
+
+        class D(C):
+            def dmethod(self):
+                return "D a"
+            def all_method(self):
+                return "D b"
+
+        class M2(D, object):
+            def m2method(self):
+                return "M2 a"
+            def all_method(self):
+                return "M2 b"
+
+        self.assertEqual(M2.__mro__, (M2, D, C, object))
+        m = M2()
+        self.assertEqual(m.cmethod(), "C a")
+        self.assertEqual(m.dmethod(), "D a")
+        self.assertEqual(m.m2method(), "M2 a")
+        self.assertEqual(m.all_method(), "M2 b")
+
+        class M3(M1, M2, object):
+            def m3method(self):
+                return "M3 a"
+            def all_method(self):
+                return "M3 b"
+        self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
+        m = M3()
+        self.assertEqual(m.cmethod(), "C a")
+        self.assertEqual(m.dmethod(), "D a")
+        self.assertEqual(m.m1method(), "M1 a")
+        self.assertEqual(m.m2method(), "M2 a")
+        self.assertEqual(m.m3method(), "M3 a")
+        self.assertEqual(m.all_method(), "M3 b")
+
+        class Classic:
+            pass
+        try:
+            class New(Classic):
+                __metaclass__ = type
+        except TypeError:
+            pass
+        else:
+            self.fail("new class with only classic bases - shouldn't be")
+
+    def test_diamond_inheritence(self):
+        # Testing multiple inheritance special cases...
+        class A(object):
+            def spam(self): return "A"
+        self.assertEqual(A().spam(), "A")
+        class B(A):
+            def boo(self): return "B"
+            def spam(self): return "B"
+        self.assertEqual(B().spam(), "B")
+        self.assertEqual(B().boo(), "B")
+        class C(A):
+            def boo(self): return "C"
+        self.assertEqual(C().spam(), "A")
+        self.assertEqual(C().boo(), "C")
+        class D(B, C): pass
+        self.assertEqual(D().spam(), "B")
+        self.assertEqual(D().boo(), "B")
+        self.assertEqual(D.__mro__, (D, B, C, A, object))
+        class E(C, B): pass
+        self.assertEqual(E().spam(), "B")
+        self.assertEqual(E().boo(), "C")
+        self.assertEqual(E.__mro__, (E, C, B, A, object))
+        # MRO order disagreement
+        try:
+            class F(D, E): pass
+        except TypeError:
+            pass
+        else:
+            self.fail("expected MRO order disagreement (F)")
+        try:
+            class G(E, D): pass
+        except TypeError:
+            pass
+        else:
+            self.fail("expected MRO order disagreement (G)")
+
+    # see thread python-dev/2002-October/029035.html
+    def test_ex5_from_c3_switch(self):
+        # Testing ex5 from C3 switch discussion...
+        class A(object): pass
+        class B(object): pass
+        class C(object): pass
+        class X(A): pass
+        class Y(A): pass
+        class Z(X,B,Y,C): pass
+        self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
+
+    # see "A Monotonic Superclass Linearization for Dylan",
+    # by Kim Barrett et al. (OOPSLA 1996)
+    def test_monotonicity(self):
+        # Testing MRO monotonicity...
+        class Boat(object): pass
+        class DayBoat(Boat): pass
+        class WheelBoat(Boat): pass
+        class EngineLess(DayBoat): pass
+        class SmallMultihull(DayBoat): pass
+        class PedalWheelBoat(EngineLess,WheelBoat): pass
+        class SmallCatamaran(SmallMultihull): pass
+        class Pedalo(PedalWheelBoat,SmallCatamaran): pass
+
+        self.assertEqual(PedalWheelBoat.__mro__,
+              (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
+        self.assertEqual(SmallCatamaran.__mro__,
+              (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
+        self.assertEqual(Pedalo.__mro__,
+              (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
+               SmallMultihull, DayBoat, WheelBoat, Boat, object))
+
+    # see "A Monotonic Superclass Linearization for Dylan",
+    # by Kim Barrett et al. (OOPSLA 1996)
+    def test_consistency_with_epg(self):
+        # Testing consistentcy with EPG...
+        class Pane(object): pass
+        class ScrollingMixin(object): pass
+        class EditingMixin(object): pass
+        class ScrollablePane(Pane,ScrollingMixin): pass
+        class EditablePane(Pane,EditingMixin): pass
+        class EditableScrollablePane(ScrollablePane,EditablePane): pass
+
+        self.assertEqual(EditableScrollablePane.__mro__,
+              (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
+                ScrollingMixin, EditingMixin, object))
+
+    def test_mro_disagreement(self):
+        # Testing error messages for MRO disagreement...
+        mro_err_msg = """Cannot create a consistent method resolution
+order (MRO) for bases """
+
+        def raises(exc, expected, callable, *args):
+            try:
+                callable(*args)
+            except exc, msg:
+                if not str(msg).startswith(expected):
+                    self.fail("Message %r, expected %r" % (str(msg), expected))
+            else:
+                self.fail("Expected %s" % exc)
+
+        class A(object): pass
+        class B(A): pass
+        class C(object): pass
+
+        # Test some very simple errors
+        raises(TypeError, "duplicate base class A",
+               type, "X", (A, A), {})
+        raises(TypeError, mro_err_msg,
+               type, "X", (A, B), {})
+        raises(TypeError, mro_err_msg,
+               type, "X", (A, C, B), {})
+        # Test a slightly more complex error
+        class GridLayout(object): pass
+        class HorizontalGrid(GridLayout): pass
+        class VerticalGrid(GridLayout): pass
+        class HVGrid(HorizontalGrid, VerticalGrid): pass
+        class VHGrid(VerticalGrid, HorizontalGrid): pass
+        raises(TypeError, mro_err_msg,
+               type, "ConfusedGrid", (HVGrid, VHGrid), {})
+
+    def test_object_class(self):
+        # Testing object class...
+        a = object()
+        self.assertEqual(a.__class__, object)
+        self.assertEqual(type(a), object)
+        b = object()
+        self.assertNotEqual(a, b)
+        self.assertFalse(hasattr(a, "foo"))
+        try:
+            a.foo = 12
+        except (AttributeError, TypeError):
+            pass
+        else:
+            self.fail("object() should not allow setting a foo attribute")
+        self.assertFalse(hasattr(object(), "__dict__"))
+
+        class Cdict(object):
+            pass
+        x = Cdict()
+        self.assertEqual(x.__dict__, {})
+        x.foo = 1
+        self.assertEqual(x.foo, 1)
+        self.assertEqual(x.__dict__, {'foo': 1})
+
+    def test_slots(self):
+        # Testing __slots__...
+        class C0(object):
+            __slots__ = []
+        x = C0()
+        self.assertFalse(hasattr(x, "__dict__"))
+        self.assertFalse(hasattr(x, "foo"))
+
+        class C1(object):
+            __slots__ = ['a']
+        x = C1()
+        self.assertFalse(hasattr(x, "__dict__"))
+        self.assertFalse(hasattr(x, "a"))
+        x.a = 1
+        self.assertEqual(x.a, 1)
+        x.a = None
+        self.assertEqual(x.a, None)
+        del x.a
+        self.assertFalse(hasattr(x, "a"))
+
+        class C3(object):
+            __slots__ = ['a', 'b', 'c']
+        x = C3()
+        self.assertFalse(hasattr(x, "__dict__"))
+        self.assertFalse(hasattr(x, 'a'))
+        self.assertFalse(hasattr(x, 'b'))
+        self.assertFalse(hasattr(x, 'c'))
+        x.a = 1
+        x.b = 2
+        x.c = 3
+        self.assertEqual(x.a, 1)
+        self.assertEqual(x.b, 2)
+        self.assertEqual(x.c, 3)
+
+        class C4(object):
+            """Validate name mangling"""
+            __slots__ = ['__a']
+            def __init__(self, value):
+                self.__a = value
+            def get(self):
+                return self.__a
+        x = C4(5)
+        self.assertFalse(hasattr(x, '__dict__'))
+        self.assertFalse(hasattr(x, '__a'))
+        self.assertEqual(x.get(), 5)
+        try:
+            x.__a = 6
+        except AttributeError:
+            pass
+        else:
+            self.fail("Double underscored names not mangled")
+
+        # Make sure slot names are proper identifiers
+        try:
+            class C(object):
+                __slots__ = [None]
+        except TypeError:
+            pass
+        else:
+            self.fail("[None] slots not caught")
+        try:
+            class C(object):
+                __slots__ = ["foo bar"]
+        except TypeError:
+            pass
+        else:
+            self.fail("['foo bar'] slots not caught")
+        try:
+            class C(object):
+                __slots__ = ["foo\0bar"]
+        except TypeError:
+            pass
+        else:
+            self.fail("['foo\\0bar'] slots not caught")
+        try:
+            class C(object):
+                __slots__ = ["1"]
+        except TypeError:
+            pass
+        else:
+            self.fail("['1'] slots not caught")
+        try:
+            class C(object):
+                __slots__ = [""]
+        except TypeError:
+            pass
+        else:
+            self.fail("[''] slots not caught")
+        class C(object):
+            __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
+        # XXX(nnorwitz): was there supposed to be something tested
+        # from the class above?
+
+        # Test a single string is not expanded as a sequence.
+        class C(object):
+            __slots__ = "abc"
+        c = C()
+        c.abc = 5
+        self.assertEqual(c.abc, 5)
+
+        # Test unicode slot names
+        try:
+            unicode
+        except NameError:
+            pass
+        else:
+            # Test a single unicode string is not expanded as a sequence.
+            class C(object):
+                __slots__ = unicode("abc")
+            c = C()
+            c.abc = 5
+            self.assertEqual(c.abc, 5)
+
+            # _unicode_to_string used to modify slots in certain circumstances
+            slots = (unicode("foo"), unicode("bar"))
+            class C(object):
+                __slots__ = slots
+            x = C()
+            x.foo = 5
+            self.assertEqual(x.foo, 5)
+            self.assertEqual(type(slots[0]), unicode)
+            # this used to leak references
+            try:
+                class C(object):
+                    __slots__ = [unichr(128)]
+            except (TypeError, UnicodeEncodeError):
+                pass
+            else:
+                self.fail("[unichr(128)] slots not caught")
+
+        # Test leaks
+        class Counted(object):
+            counter = 0    # counts the number of instances alive
+            def __init__(self):
+                Counted.counter += 1
+            def __del__(self):
+                Counted.counter -= 1
+        class C(object):
+            __slots__ = ['a', 'b', 'c']
+        x = C()
+        x.a = Counted()
+        x.b = Counted()
+        x.c = Counted()
+        self.assertEqual(Counted.counter, 3)
+        del x
+        self.assertEqual(Counted.counter, 0)
+        class D(C):
+            pass
+        x = D()
+        x.a = Counted()
+        x.z = Counted()
+        self.assertEqual(Counted.counter, 2)
+        del x
+        self.assertEqual(Counted.counter, 0)
+        class E(D):
+            __slots__ = ['e']
+        x = E()
+        x.a = Counted()
+        x.z = Counted()
+        x.e = Counted()
+        self.assertEqual(Counted.counter, 3)
+        del x
+        self.assertEqual(Counted.counter, 0)
+
+        # Test cyclical leaks [SF bug 519621]
+        class F(object):
+            __slots__ = ['a', 'b']
+        log = []
+        s = F()
+        s.a = [Counted(), s]
+        self.assertEqual(Counted.counter, 1)
+        s = None
+        import gc
+        gc.collect()
+        self.assertEqual(Counted.counter, 0)
+
+        # Test lookup leaks [SF bug 572567]
+        import sys,gc
+        class G(object):
+            def __cmp__(self, other):
+                return 0
+        g = G()
+        orig_objects = len(gc.get_objects())
+        for i in xrange(10):
+            g==g
+        new_objects = len(gc.get_objects())
+        self.assertEqual(orig_objects, new_objects)
+        class H(object):
+            __slots__ = ['a', 'b']
+            def __init__(self):
+                self.a = 1
+                self.b = 2
+            def __del__(self_):
+                self.assertEqual(self_.a, 1)
+                self.assertEqual(self_.b, 2)
+
+        save_stderr = sys.stderr
+        sys.stderr = sys.stdout
+        h = H()
+        try:
+            del h
+        finally:
+            sys.stderr = save_stderr
+
+    def test_slots_special(self):
+        # Testing __dict__ and __weakref__ in __slots__...
+        class D(object):
+            __slots__ = ["__dict__"]
+        a = D()
+        self.assert_(hasattr(a, "__dict__"))
+        self.assertFalse(hasattr(a, "__weakref__"))
+        a.foo = 42
+        self.assertEqual(a.__dict__, {"foo": 42})
+
+        class W(object):
+            __slots__ = ["__weakref__"]
+        a = W()
+        self.assert_(hasattr(a, "__weakref__"))
+        self.assertFalse(hasattr(a, "__dict__"))
+        try:
+            a.foo = 42
+        except AttributeError:
+            pass
+        else:
+            self.fail("shouldn't be allowed to set a.foo")
+
+        class C1(W, D):
+            __slots__ = []
+        a = C1()
+        self.assert_(hasattr(a, "__dict__"))
+        self.assert_(hasattr(a, "__weakref__"))
+        a.foo = 42
+        self.assertEqual(a.__dict__, {"foo": 42})
+
+        class C2(D, W):
+            __slots__ = []
+        a = C2()
+        self.assert_(hasattr(a, "__dict__"))
+        self.assert_(hasattr(a, "__weakref__"))
+        a.foo = 42
+        self.assertEqual(a.__dict__, {"foo": 42})
+
+    def test_dynamics(self):
+        # Testing class attribute propagation...
+        class D(object):
+            pass
+        class E(D):
+            pass
+        class F(D):
+            pass
+        D.foo = 1
+        self.assertEqual(D.foo, 1)
+        # Test that dynamic attributes are inherited
+        self.assertEqual(E.foo, 1)
+        self.assertEqual(F.foo, 1)
+        # Test dynamic instances
+        class C(object):
+            pass
+        a = C()
+        self.assertFalse(hasattr(a, "foobar"))
+        C.foobar = 2
+        self.assertEqual(a.foobar, 2)
+        C.method = lambda self: 42
+        self.assertEqual(a.method(), 42)
+        C.__repr__ = lambda self: "C()"
+        self.assertEqual(repr(a), "C()")
+        C.__int__ = lambda self: 100
+        self.assertEqual(int(a), 100)
+        self.assertEqual(a.foobar, 2)
+        self.assertFalse(hasattr(a, "spam"))
+        def mygetattr(self, name):
+            if name == "spam":
+                return "spam"
+            raise AttributeError
+        C.__getattr__ = mygetattr
+        self.assertEqual(a.spam, "spam")
+        a.new = 12
+        self.assertEqual(a.new, 12)
+        def mysetattr(self, name, value):
+            if name == "spam":
+                raise AttributeError
+            return object.__setattr__(self, name, value)
+        C.__setattr__ = mysetattr
+        try:
+            a.spam = "not spam"
+        except AttributeError:
+            pass
+        else:
+            self.fail("expected AttributeError")
+        self.assertEqual(a.spam, "spam")
+        class D(C):
+            pass
+        d = D()
+        d.foo = 1
+        self.assertEqual(d.foo, 1)
+
+        # Test handling of int*seq and seq*int
+        class I(int):
+            pass
+        self.assertEqual("a"*I(2), "aa")
+        self.assertEqual(I(2)*"a", "aa")
+        self.assertEqual(2*I(3), 6)
+        self.assertEqual(I(3)*2, 6)
+        self.assertEqual(I(3)*I(2), 6)
+
+        # Test handling of long*seq and seq*long
+        class L(long):
+            pass
+        self.assertEqual("a"*L(2L), "aa")
+        self.assertEqual(L(2L)*"a", "aa")
+        self.assertEqual(2*L(3), 6)
+        self.assertEqual(L(3)*2, 6)
+        self.assertEqual(L(3)*L(2), 6)
+
+        # Test comparison of classes with dynamic metaclasses
+        class dynamicmetaclass(type):
+            pass
+        class someclass:
+            __metaclass__ = dynamicmetaclass
+        self.assertNotEqual(someclass, object)
+
+    def test_errors(self):
+        # Testing errors...
+        try:
+            class C(list, dict):
+                pass
+        except TypeError:
+            pass
+        else:
+            self.fail("inheritance from both list and dict should be illegal")
+
+        try:
+            class C(object, None):
+                pass
+        except TypeError:
+            pass
+        else:
+            self.fail("inheritance from non-type should be illegal")
+        class Classic:
+            pass
+
+        try:
+            class C(type(len)):
+                pass
+        except TypeError:
+            pass
+        else:
+            self.fail("inheritance from CFunction should be illegal")
+
+        try:
+            class C(object):
+                __slots__ = 1
+        except TypeError:
+            pass
+        else:
+            self.fail("__slots__ = 1 should be illegal")
+
+        try:
+            class C(object):
+                __slots__ = [1]
+        except TypeError:
+            pass
+        else:
+            self.fail("__slots__ = [1] should be illegal")
+
+        class M1(type):
+            pass
+        class M2(type):
+            pass
+        class A1(object):
+            __metaclass__ = M1
+        class A2(object):
+            __metaclass__ = M2
+        try:
+            class B(A1, A2):
+                pass
+        except TypeError:
+            pass
+        else:
+            self.fail("finding the most derived metaclass should have failed")
+
+    def test_classmethods(self):
+        # Testing class methods...
+        class C(object):
+            def foo(*a): return a
+            goo = classmethod(foo)
+        c = C()
+        self.assertEqual(C.goo(1), (C, 1))
+        self.assertEqual(c.goo(1), (C, 1))
+        self.assertEqual(c.foo(1), (c, 1))
+        class D(C):
+            pass
+        d = D()
+        self.assertEqual(D.goo(1), (D, 1))
+        self.assertEqual(d.goo(1), (D, 1))
+        self.assertEqual(d.foo(1), (d, 1))
+        self.assertEqual(D.foo(d, 1), (d, 1))
+        # Test for a specific crash (SF bug 528132)
+        def f(cls, arg): return (cls, arg)
+        ff = classmethod(f)
+        self.assertEqual(ff.__get__(0, int)(42), (int, 42))
+        self.assertEqual(ff.__get__(0)(42), (int, 42))
+
+        # Test super() with classmethods (SF bug 535444)
+        self.assertEqual(C.goo.im_self, C)
+        self.assertEqual(D.goo.im_self, D)
+        self.assertEqual(super(D,D).goo.im_self, D)
+        self.assertEqual(super(D,d).goo.im_self, D)
+        self.assertEqual(super(D,D).goo(), (D,))
+        self.assertEqual(super(D,d).goo(), (D,))
+
+        # Verify that argument is checked for callability (SF bug 753451)
+        try:
+            classmethod(1).__get__(1)
+        except TypeError:
+            pass
+        else:
+            self.fail("classmethod should check for callability")
+
+        # Verify that classmethod() doesn't allow keyword args
+        try:
+            classmethod(f, kw=1)
+        except TypeError:
+            pass
+        else:
+            self.fail("classmethod shouldn't accept keyword args")
+
+    def test_classmethods_in_c(self):
+        # Testing C-based class methods...
+        import xxsubtype as spam
+        a = (1, 2, 3)
+        d = {'abc': 123}
+        x, a1, d1 = spam.spamlist.classmeth(*a, **d)
+        self.assertEqual(x, spam.spamlist)
+        self.assertEqual(a, a1)
+        self.assertEqual(d, d1)
+        x, a1, d1 = spam.spamlist().classmeth(*a, **d)
+        self.assertEqual(x, spam.spamlist)
+        self.assertEqual(a, a1)
+        self.assertEqual(d, d1)
+
+    def test_staticmethods(self):
+        # Testing static methods...
+        class C(object):
+            def foo(*a): return a
+            goo = staticmethod(foo)
+        c = C()
+        self.assertEqual(C.goo(1), (1,))
+        self.assertEqual(c.goo(1), (1,))
+        self.assertEqual(c.foo(1), (c, 1,))
+        class D(C):
+            pass
+        d = D()
+        self.assertEqual(D.goo(1), (1,))
+        self.assertEqual(d.goo(1), (1,))
+        self.assertEqual(d.foo(1), (d, 1))
+        self.assertEqual(D.foo(d, 1), (d, 1))
+
+    def test_staticmethods_in_c(self):
+        # Testing C-based static methods...
+        import xxsubtype as spam
+        a = (1, 2, 3)
+        d = {"abc": 123}
+        x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
+        self.assertEqual(x, None)
+        self.assertEqual(a, a1)
+        self.assertEqual(d, d1)
+        x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
+        self.assertEqual(x, None)
+        self.assertEqual(a, a1)
+        self.assertEqual(d, d1)
+
+    def test_classic(self):
+        # Testing classic classes...
+        class C:
+            def foo(*a): return a
+            goo = classmethod(foo)
+        c = C()
+        self.assertEqual(C.goo(1), (C, 1))
+        self.assertEqual(c.goo(1), (C, 1))
+        self.assertEqual(c.foo(1), (c, 1))
+        class D(C):
+            pass
+        d = D()
+        self.assertEqual(D.goo(1), (D, 1))
+        self.assertEqual(d.goo(1), (D, 1))
+        self.assertEqual(d.foo(1), (d, 1))
+        self.assertEqual(D.foo(d, 1), (d, 1))
+        class E: # *not* subclassing from C
+            foo = C.foo
+        self.assertEqual(E().foo, C.foo) # i.e., unbound
+        self.assert_(repr(C.foo.__get__(C())).startswith("<bound method "))
+
+    def test_compattr(self):
+        # Testing computed attributes...
+        class C(object):
+            class computed_attribute(object):
+                def __init__(self, get, set=None, delete=None):
+                    self.__get = get
+                    self.__set = set
+                    self.__delete = delete
+                def __get__(self, obj, type=None):
+                    return self.__get(obj)
+                def __set__(self, obj, value):
+                    return self.__set(obj, value)
+                def __delete__(self, obj):
+                    return self.__delete(obj)
+            def __init__(self):
+                self.__x = 0
+            def __get_x(self):
+                x = self.__x
+                self.__x = x+1
+                return x
+            def __set_x(self, x):
+                self.__x = x
+            def __delete_x(self):
+                del self.__x
+            x = computed_attribute(__get_x, __set_x, __delete_x)
+        a = C()
+        self.assertEqual(a.x, 0)
+        self.assertEqual(a.x, 1)
+        a.x = 10
+        self.assertEqual(a.x, 10)
+        self.assertEqual(a.x, 11)
+        del a.x
+        self.assertEqual(hasattr(a, 'x'), 0)
+
+    def test_newslots(self):
+        # Testing __new__ slot override...
+        class C(list):
+            def __new__(cls):
+                self = list.__new__(cls)
+                self.foo = 1
+                return self
+            def __init__(self):
+                self.foo = self.foo + 2
+        a = C()
+        self.assertEqual(a.foo, 3)
+        self.assertEqual(a.__class__, C)
+        class D(C):
+            pass
+        b = D()
+        self.assertEqual(b.foo, 3)
+        self.assertEqual(b.__class__, D)
+
+    def test_altmro(self):
+        # Testing mro() and overriding it...
+        class A(object):
+            def f(self): return "A"
+        class B(A):
+            pass
+        class C(A):
+            def f(self): return "C"
+        class D(B, C):
+            pass
+        self.assertEqual(D.mro(), [D, B, C, A, object])
+        self.assertEqual(D.__mro__, (D, B, C, A, object))
+        self.assertEqual(D().f(), "C")
+
+        class PerverseMetaType(type):
+            def mro(cls):
+                L = type.mro(cls)
+                L.reverse()
+                return L
+        class X(D,B,C,A):
+            __metaclass__ = PerverseMetaType
+        self.assertEqual(X.__mro__, (object, A, C, B, D, X))
+        self.assertEqual(X().f(), "A")
+
+        try:
+            class X(object):
+                class __metaclass__(type):
+                    def mro(self):
+                        return [self, dict, object]
+        except TypeError:
+            pass
+        else:
+            self.fail("devious mro() return not caught")
+
+        try:
+            class X(object):
+                class __metaclass__(type):
+                    def mro(self):
+                        return [1]
+        except TypeError:
+            pass
+        else:
+            self.fail("non-class mro() return not caught")
+
+        try:
+            class X(object):
+                class __metaclass__(type):
+                    def mro(self):
+                        return 1
+        except TypeError:
+            pass
+        else:
+            self.fail("non-sequence mro() return not caught")
+
+    def test_overloading(self):
+        # Testing operator overloading...
+
+        class B(object):
+            "Intermediate class because object doesn't have a __setattr__"
+
+        class C(B):
+            def __getattr__(self, name):
+                if name == "foo":
+                    return ("getattr", name)
+                else:
+                    raise AttributeError
+            def __setattr__(self, name, value):
+                if name == "foo":
+                    self.setattr = (name, value)
+                else:
+                    return B.__setattr__(self, name, value)
+            def __delattr__(self, name):
+                if name == "foo":
+                    self.delattr = name
+                else:
+                    return B.__delattr__(self, name)
+
+            def __getitem__(self, key):
+                return ("getitem", key)
+            def __setitem__(self, key, value):
+                self.setitem = (key, value)
+            def __delitem__(self, key):
+                self.delitem = key
+
+            def __getslice__(self, i, j):
+                return ("getslice", i, j)
+            def __setslice__(self, i, j, value):
+                self.setslice = (i, j, value)
+            def __delslice__(self, i, j):
+                self.delslice = (i, j)
+
+        a = C()
+        self.assertEqual(a.foo, ("getattr", "foo"))
+        a.foo = 12
+        self.assertEqual(a.setattr, ("foo", 12))
+        del a.foo
+        self.assertEqual(a.delattr, "foo")
+
+        self.assertEqual(a[12], ("getitem", 12))
+        a[12] = 21
+        self.assertEqual(a.setitem, (12, 21))
+        del a[12]
+        self.assertEqual(a.delitem, 12)
+
+        self.assertEqual(a[0:10], ("getslice", 0, 10))
+        a[0:10] = "foo"
+        self.assertEqual(a.setslice, (0, 10, "foo"))
+        del a[0:10]
+        self.assertEqual(a.delslice, (0, 10))
+
+    def test_methods(self):
+        # Testing methods...
+        class C(object):
+            def __init__(self, x):
+                self.x = x
+            def foo(self):
+                return self.x
+        c1 = C(1)
+        self.assertEqual(c1.foo(), 1)
+        class D(C):
+            boo = C.foo
+            goo = c1.foo
+        d2 = D(2)
+        self.assertEqual(d2.foo(), 2)
+        self.assertEqual(d2.boo(), 2)
+        self.assertEqual(d2.goo(), 1)
+        class E(object):
+            foo = C.foo
+        self.assertEqual(E().foo, C.foo) # i.e., unbound
+        self.assert_(repr(C.foo.__get__(C(1))).startswith("<bound method "))
+
+    def test_specials(self):
+        # Testing special operators...
+        # Test operators like __hash__ for which a built-in default exists
+
+        # Test the default behavior for static classes
+        class C(object):
+            def __getitem__(self, i):
+                if 0 <= i < 10: return i
+                raise IndexError
+        c1 = C()
+        c2 = C()
+        self.assert_(not not c1) # What?
+        self.assertNotEqual(id(c1), id(c2))
+        hash(c1)
+        hash(c2)
+        self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
+        self.assertEqual(c1, c1)
+        self.assert_(c1 != c2)
+        self.assert_(not c1 != c1)
+        self.assert_(not c1 == c2)
+        # Note that the module name appears in str/repr, and that varies
+        # depending on whether this test is run standalone or from a framework.
+        self.assert_(str(c1).find('C object at ') >= 0)
+        self.assertEqual(str(c1), repr(c1))
+        self.assert_(-1 not in c1)
+        for i in range(10):
+            self.assert_(i in c1)
+        self.assertFalse(10 in c1)
+        # Test the default behavior for dynamic classes
+        class D(object):
+            def __getitem__(self, i):
+                if 0 <= i < 10: return i
+                raise IndexError
+        d1 = D()
+        d2 = D()
+        self.assert_(not not d1)
+        self.assertNotEqual(id(d1), id(d2))
+        hash(d1)
+        hash(d2)
+        self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
+        self.assertEqual(d1, d1)
+        self.assertNotEqual(d1, d2)
+        self.assert_(not d1 != d1)
+        self.assert_(not d1 == d2)
+        # Note that the module name appears in str/repr, and that varies
+        # depending on whether this test is run standalone or from a framework.
+        self.assert_(str(d1).find('D object at ') >= 0)
+        self.assertEqual(str(d1), repr(d1))
+        self.assert_(-1 not in d1)
+        for i in range(10):
+            self.assert_(i in d1)
+        self.assertFalse(10 in d1)
+        # Test overridden behavior for static classes
+        class Proxy(object):
+            def __init__(self, x):
+                self.x = x
+            def __nonzero__(self):
+                return not not self.x
+            def __hash__(self):
+                return hash(self.x)
+            def __eq__(self, other):
+                return self.x == other
+            def __ne__(self, other):
+                return self.x != other
+            def __cmp__(self, other):
+                return cmp(self.x, other.x)
+            def __str__(self):
+                return "Proxy:%s" % self.x
+            def __repr__(self):
+                return "Proxy(%r)" % self.x
+            def __contains__(self, value):
+                return value in self.x
+        p0 = Proxy(0)
+        p1 = Proxy(1)
+        p_1 = Proxy(-1)
+        self.assertFalse(p0)
+        self.assert_(not not p1)
+        self.assertEqual(hash(p0), hash(0))
+        self.assertEqual(p0, p0)
+        self.assertNotEqual(p0, p1)
+        self.assert_(not p0 != p0)
+        self.assertEqual(not p0, p1)
+        self.assertEqual(cmp(p0, p1), -1)
+        self.assertEqual(cmp(p0, p0), 0)
+        self.assertEqual(cmp(p0, p_1), 1)
+        self.assertEqual(str(p0), "Proxy:0")
+        self.assertEqual(repr(p0), "Proxy(0)")
+        p10 = Proxy(range(10))
+        self.assertFalse(-1 in p10)
+        for i in range(10):
+            self.assert_(i in p10)
+        self.assertFalse(10 in p10)
+        # Test overridden behavior for dynamic classes
+        class DProxy(object):
+            def __init__(self, x):
+                self.x = x
+            def __nonzero__(self):
+                return not not self.x
+            def __hash__(self):
+                return hash(self.x)
+            def __eq__(self, other):
+                return self.x == other
+            def __ne__(self, other):
+                return self.x != other
+            def __cmp__(self, other):
+                return cmp(self.x, other.x)
+            def __str__(self):
+                return "DProxy:%s" % self.x
+            def __repr__(self):
+                return "DProxy(%r)" % self.x
+            def __contains__(self, value):
+                return value in self.x
+        p0 = DProxy(0)
+        p1 = DProxy(1)
+        p_1 = DProxy(-1)
+        self.assertFalse(p0)
+        self.assert_(not not p1)
+        self.assertEqual(hash(p0), hash(0))
+        self.assertEqual(p0, p0)
+        self.assertNotEqual(p0, p1)
+        self.assertNotEqual(not p0, p0)
+        self.assertEqual(not p0, p1)
+        self.assertEqual(cmp(p0, p1), -1)
+        self.assertEqual(cmp(p0, p0), 0)
+        self.assertEqual(cmp(p0, p_1), 1)
+        self.assertEqual(str(p0), "DProxy:0")
+        self.assertEqual(repr(p0), "DProxy(0)")
+        p10 = DProxy(range(10))
+        self.assertFalse(-1 in p10)
+        for i in range(10):
+            self.assert_(i in p10)
+        self.assertFalse(10 in p10)
 
-# XXX Please, please, please, someone convert this to unittest style!
+        # Safety test for __cmp__
+        def unsafecmp(a, b):
+            try:
+                a.__class__.__cmp__(a, b)
+            except TypeError:
+                pass
+            else:
+                self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
+                    a.__class__, a, b))
 
-from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
-from copy import deepcopy
-import warnings
-import types
+        unsafecmp(u"123", "123")
+        unsafecmp("123", u"123")
+        unsafecmp(1, 1.0)
+        unsafecmp(1.0, 1)
+        unsafecmp(1, 1L)
+        unsafecmp(1L, 1)
+
+    def test_recursions(self):
+        # Testing recursion checks ...
+        class Letter(str):
+            def __new__(cls, letter):
+                if letter == 'EPS':
+                    return str.__new__(cls)
+                return str.__new__(cls, letter)
+            def __str__(self):
+                if not self:
+                    return 'EPS'
+                return self
+        # sys.stdout needs to be the original to trigger the recursion bug
+        import sys
+        test_stdout = sys.stdout
+        sys.stdout = test_support.get_original_stdout()
+        try:
+            # nothing should actually be printed, this should raise an exception
+            print Letter('w')
+        except RuntimeError:
+            pass
+        else:
+            self.fail("expected a RuntimeError for print recursion")
+        finally:
+            sys.stdout = test_stdout
+
+        # Bug #1202533.
+        class A(object):
+            pass
+        A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
+        try:
+            A()*2
+        except RuntimeError:
+            pass
+        else:
+            self.fail("expected a RuntimeError")
+
+    def test_weakrefs(self):
+        # Testing weak references...
+        import weakref
+        class C(object):
+            pass
+        c = C()
+        r = weakref.ref(c)
+        self.assertEqual(r(), c)
+        del c
+        self.assertEqual(r(), None)
+        del r
+        class NoWeak(object):
+            __slots__ = ['foo']
+        no = NoWeak()
+        try:
+            weakref.ref(no)
+        except TypeError, msg:
+            self.assert_(str(msg).find("weak reference") >= 0)
+        else:
+            self.fail("weakref.ref(no) should be illegal")
+        class Weak(object):
+            __slots__ = ['foo', '__weakref__']
+        yes = Weak()
+        r = weakref.ref(yes)
+        self.assertEqual(r(), yes)
+        del yes
+        self.assertEqual(r(), None)
+        del r
+
+    def test_properties(self):
+        # Testing property...
+        class C(object):
+            def getx(self):
+                return self.__x
+            def setx(self, value):
+                self.__x = value
+            def delx(self):
+                del self.__x
+            x = property(getx, setx, delx, doc="I'm the x property.")
+        a = C()
+        self.assertFalse(hasattr(a, "x"))
+        a.x = 42
+        self.assertEqual(a._C__x, 42)
+        self.assertEqual(a.x, 42)
+        del a.x
+        self.assertFalse(hasattr(a, "x"))
+        self.assertFalse(hasattr(a, "_C__x"))
+        C.x.__set__(a, 100)
+        self.assertEqual(C.x.__get__(a), 100)
+        C.x.__delete__(a)
+        self.assertFalse(hasattr(a, "x"))
+
+        raw = C.__dict__['x']
+        self.assert_(isinstance(raw, property))
+
+        attrs = dir(raw)
+        self.assert_("__doc__" in attrs)
+        self.assert_("fget" in attrs)
+        self.assert_("fset" in attrs)
+        self.assert_("fdel" in attrs)
+
+        self.assertEqual(raw.__doc__, "I'm the x property.")
+        self.assert_(raw.fget is C.__dict__['getx'])
+        self.assert_(raw.fset is C.__dict__['setx'])
+        self.assert_(raw.fdel is C.__dict__['delx'])
+
+        for attr in "__doc__", "fget", "fset", "fdel":
+            try:
+                setattr(raw, attr, 42)
+            except TypeError, msg:
+                if str(msg).find('readonly') < 0:
+                    self.fail("when setting readonly attr %r on a property, "
+                                     "got unexpected TypeError msg %r" % (attr, str(msg)))
+            else:
+                self.fail("expected TypeError from trying to set readonly %r "
+                                 "attr on a property" % attr)
+
+        class D(object):
+            __getitem__ = property(lambda s: 1/0)
+
+        d = D()
+        try:
+            for i in d:
+                str(i)
+        except ZeroDivisionError:
+            pass
+        else:
+            self.fail("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)
+            self.assertEqual(prop.__doc__, "getter method")
+            prop2 = property(fset=setter)
+            self.assertEqual(prop2.__doc__, None)
+
+        # this segfaulted in 2.5b2
+        try:
+            import _testcapi
+        except ImportError:
+            pass
+        else:
+            class X(object):
+                p = property(_testcapi.test_with_docstring)
+
+    def test_properties_plus(self):
+        class C(object):
+            foo = property(doc="hello")
+            @foo.getter
+            def foo(self):
+                return self._foo
+            @foo.setter
+            def foo(self, value):
+                self._foo = abs(value)
+            @foo.deleter
+            def foo(self):
+                del self._foo
+        c = C()
+        self.assertEqual(C.foo.__doc__, "hello")
+        self.assertFalse(hasattr(c, "foo"))
+        c.foo = -42
+        self.assert_(hasattr(c, '_foo'))
+        self.assertEqual(c._foo, 42)
+        self.assertEqual(c.foo, 42)
+        del c.foo
+        self.assertFalse(hasattr(c, '_foo'))
+        self.assertFalse(hasattr(c, "foo"))
+
+        class D(C):
+            @C.foo.deleter
+            def foo(self):
+                try:
+                    del self._foo
+                except AttributeError:
+                    pass
+        d = D()
+        d.foo = 24
+        self.assertEqual(d.foo, 24)
+        del d.foo
+        del d.foo
+
+        class E(object):
+            @property
+            def foo(self):
+                return self._foo
+            @foo.setter
+            def foo(self, value):
+                raise RuntimeError
+            @foo.setter
+            def foo(self, value):
+                self._foo = abs(value)
+            @foo.deleter
+            def foo(self, value=None):
+                del self._foo
+
+        e = E()
+        e.foo = -42
+        self.assertEqual(e.foo, 42)
+        del e.foo
+
+        class F(E):
+            @E.foo.deleter
+            def foo(self):
+                del self._foo
+            @foo.setter
+            def foo(self, value):
+                self._foo = max(0, value)
+        f = F()
+        f.foo = -10
+        self.assertEqual(f.foo, 0)
+        del f.foo
+
+    def test_dict_constructors(self):
+        # Testing dict constructor ...
+        d = dict()
+        self.assertEqual(d, {})
+        d = dict({})
+        self.assertEqual(d, {})
+        d = dict({1: 2, 'a': 'b'})
+        self.assertEqual(d, {1: 2, 'a': 'b'})
+        self.assertEqual(d, dict(d.items()))
+        self.assertEqual(d, dict(d.iteritems()))
+        d = dict({'one':1, 'two':2})
+        self.assertEqual(d, dict(one=1, two=2))
+        self.assertEqual(d, dict(**d))
+        self.assertEqual(d, dict({"one": 1}, two=2))
+        self.assertEqual(d, dict([("two", 2)], one=1))
+        self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
+        self.assertEqual(d, dict(**d))
 
-warnings.filterwarnings("ignore",
-         r'complex divmod\(\), // and % are deprecated$',
-         DeprecationWarning, r'(<string>|%s)$' % __name__)
-
-def veris(a, b):
-    if a is not b:
-        raise TestFailed, "%r is %r" % (a, b)
-
-def testunop(a, res, expr="len(a)", meth="__len__"):
-    if verbose: print "checking", expr
-    dict = {'a': a}
-    vereq(eval(expr, dict), res)
-    t = type(a)
-    m = getattr(t, meth)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    vereq(m, t.__dict__[meth])
-    vereq(m(a), res)
-    bm = getattr(a, meth)
-    vereq(bm(), res)
-
-def testbinop(a, b, res, expr="a+b", meth="__add__"):
-    if verbose: print "checking", expr
-    dict = {'a': a, 'b': b}
-
-    # XXX Hack so this passes before 2.3 when -Qnew is specified.
-    if meth == "__div__" and 1/2 == 0.5:
-        meth = "__truediv__"
-
-    vereq(eval(expr, dict), res)
-    t = type(a)
-    m = getattr(t, meth)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    vereq(m, t.__dict__[meth])
-    vereq(m(a, b), res)
-    bm = getattr(a, meth)
-    vereq(bm(b), res)
-
-def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
-    if verbose: print "checking", expr
-    dict = {'a': a, 'b': b, 'c': c}
-    vereq(eval(expr, dict), res)
-    t = type(a)
-    m = getattr(t, meth)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    vereq(m, t.__dict__[meth])
-    vereq(m(a, b, c), res)
-    bm = getattr(a, meth)
-    vereq(bm(b, c), res)
-
-def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
-    if verbose: print "checking", stmt
-    dict = {'a': deepcopy(a), 'b': b}
-    exec stmt in dict
-    vereq(dict['a'], res)
-    t = type(a)
-    m = getattr(t, meth)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    vereq(m, t.__dict__[meth])
-    dict['a'] = deepcopy(a)
-    m(dict['a'], b)
-    vereq(dict['a'], res)
-    dict['a'] = deepcopy(a)
-    bm = getattr(dict['a'], meth)
-    bm(b)
-    vereq(dict['a'], res)
-
-def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
-    if verbose: print "checking", stmt
-    dict = {'a': deepcopy(a), 'b': b, 'c': c}
-    exec stmt in dict
-    vereq(dict['a'], res)
-    t = type(a)
-    m = getattr(t, meth)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    vereq(m, t.__dict__[meth])
-    dict['a'] = deepcopy(a)
-    m(dict['a'], b, c)
-    vereq(dict['a'], res)
-    dict['a'] = deepcopy(a)
-    bm = getattr(dict['a'], meth)
-    bm(b, c)
-    vereq(dict['a'], res)
-
-def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
-    if verbose: print "checking", stmt
-    dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
-    exec stmt in dict
-    vereq(dict['a'], res)
-    t = type(a)
-    while meth not in t.__dict__:
-        t = t.__bases__[0]
-    m = getattr(t, meth)
-    vereq(m, t.__dict__[meth])
-    dict['a'] = deepcopy(a)
-    m(dict['a'], b, c, d)
-    vereq(dict['a'], res)
-    dict['a'] = deepcopy(a)
-    bm = getattr(dict['a'], meth)
-    bm(b, c, d)
-    vereq(dict['a'], res)
-
-def class_docstrings():
-    class Classic:
-        "A classic docstring."
-    vereq(Classic.__doc__, "A classic docstring.")
-    vereq(Classic.__dict__['__doc__'], "A classic docstring.")
-
-    class Classic2:
-        pass
-    verify(Classic2.__doc__ is None)
-
-    class NewStatic(object):
-        "Another docstring."
-    vereq(NewStatic.__doc__, "Another docstring.")
-    vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
-
-    class NewStatic2(object):
-        pass
-    verify(NewStatic2.__doc__ is None)
-
-    class NewDynamic(object):
-        "Another docstring."
-    vereq(NewDynamic.__doc__, "Another docstring.")
-    vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
-
-    class NewDynamic2(object):
-        pass
-    verify(NewDynamic2.__doc__ is None)
-
-def lists():
-    if verbose: print "Testing list operations..."
-    testbinop([1], [2], [1,2], "a+b", "__add__")
-    testbinop([1,2,3], 2, 1, "b in a", "__contains__")
-    testbinop([1,2,3], 4, 0, "b in a", "__contains__")
-    testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
-    testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
-    testsetop([1], [2], [1,2], "a+=b", "__iadd__")
-    testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
-    testunop([1,2,3], 3, "len(a)", "__len__")
-    testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
-    testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
-    testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
-    testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
-
-def dicts():
-    if verbose: print "Testing dict operations..."
-    testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
-    testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
-    testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
-    testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
-    d = {1:2,3:4}
-    l1 = []
-    for i in d.keys(): l1.append(i)
-    l = []
-    for i in iter(d): l.append(i)
-    vereq(l, l1)
-    l = []
-    for i in d.__iter__(): l.append(i)
-    vereq(l, l1)
-    l = []
-    for i in dict.__iter__(d): l.append(i)
-    vereq(l, l1)
-    d = {1:2, 3:4}
-    testunop(d, 2, "len(a)", "__len__")
-    vereq(eval(repr(d), {}), d)
-    vereq(eval(d.__repr__(), {}), d)
-    testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
-
-def dict_constructor():
-    if verbose:
-        print "Testing dict constructor ..."
-    d = dict()
-    vereq(d, {})
-    d = dict({})
-    vereq(d, {})
-    d = dict({1: 2, 'a': 'b'})
-    vereq(d, {1: 2, 'a': 'b'})
-    vereq(d, dict(d.items()))
-    vereq(d, dict(d.iteritems()))
-    d = dict({'one':1, 'two':2})
-    vereq(d, dict(one=1, two=2))
-    vereq(d, dict(**d))
-    vereq(d, dict({"one": 1}, two=2))
-    vereq(d, dict([("two", 2)], one=1))
-    vereq(d, dict([("one", 100), ("two", 200)], **d))
-    verify(d is not dict(**d))
-    for badarg in 0, 0L, 0j, "0", [0], (0,):
-        try:
-            dict(badarg)
-        except TypeError:
-            pass
-        except ValueError:
-            if badarg == "0":
-                # It's a sequence, and its elements are also sequences (gotta
-                # love strings <wink>), but they aren't of length 2, so this
-                # one seemed better as a ValueError than a TypeError.
+        for badarg in 0, 0L, 0j, "0", [0], (0,):
+            try:
+                dict(badarg)
+            except TypeError:
                 pass
+            except ValueError:
+                if badarg == "0":
+                    # It's a sequence, and its elements are also sequences (gotta
+                    # love strings <wink>), but they aren't of length 2, so this
+                    # one seemed better as a ValueError than a TypeError.
+                    pass
+                else:
+                    self.fail("no TypeError from dict(%r)" % badarg)
             else:
-                raise TestFailed("no TypeError from dict(%r)" % badarg)
+                self.fail("no TypeError from dict(%r)" % badarg)
+
+        try:
+            dict({}, {})
+        except TypeError:
+            pass
         else:
-            raise TestFailed("no TypeError from dict(%r)" % badarg)
+            self.fail("no TypeError from dict({}, {})")
 
-    try:
-        dict({}, {})
-    except TypeError:
-        pass
-    else:
-        raise TestFailed("no TypeError from dict({}, {})")
-
-    class Mapping:
-        # Lacks a .keys() method; will be added later.
-        dict = {1:2, 3:4, 'a':1j}
-
-    try:
-        dict(Mapping())
-    except TypeError:
-        pass
-    else:
-        raise TestFailed("no TypeError from dict(incomplete mapping)")
-
-    Mapping.keys = lambda self: self.dict.keys()
-    Mapping.__getitem__ = lambda self, i: self.dict[i]
-    d = dict(Mapping())
-    vereq(d, Mapping.dict)
-
-    # Init from sequence of iterable objects, each producing a 2-sequence.
-    class AddressBookEntry:
-        def __init__(self, first, last):
-            self.first = first
-            self.last = last
-        def __iter__(self):
-            return iter([self.first, self.last])
-
-    d = dict([AddressBookEntry('Tim', 'Warsaw'),
-              AddressBookEntry('Barry', 'Peters'),
-              AddressBookEntry('Tim', 'Peters'),
-              AddressBookEntry('Barry', 'Warsaw')])
-    vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
-
-    d = dict(zip(range(4), range(1, 5)))
-    vereq(d, dict([(i, i+1) for i in range(4)]))
-
-    # Bad sequence lengths.
-    for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
-        try:
-            dict(bad)
-        except ValueError:
-            pass
-        else:
-            raise TestFailed("no ValueError from dict(%r)" % bad)
-
-def test_dir():
-    if verbose:
-        print "Testing dir() ..."
-    junk = 12
-    vereq(dir(), ['junk'])
-    del junk
-
-    # Just make sure these don't blow up!
-    for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
-        dir(arg)
-
-    # Try classic classes.
-    class C:
-        Cdata = 1
-        def Cmethod(self): pass
-
-    cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
-    vereq(dir(C), cstuff)
-    verify('im_self' in dir(C.Cmethod))
-
-    c = C()  # c.__doc__ is an odd thing to see here; ditto c.__module__.
-    vereq(dir(c), cstuff)
-
-    c.cdata = 2
-    c.cmethod = lambda self: 0
-    vereq(dir(c), cstuff + ['cdata', 'cmethod'])
-    verify('im_self' in dir(c.Cmethod))
-
-    class A(C):
-        Adata = 1
-        def Amethod(self): pass
-
-    astuff = ['Adata', 'Amethod'] + cstuff
-    vereq(dir(A), astuff)
-    verify('im_self' in dir(A.Amethod))
-    a = A()
-    vereq(dir(a), astuff)
-    verify('im_self' in dir(a.Amethod))
-    a.adata = 42
-    a.amethod = lambda self: 3
-    vereq(dir(a), astuff + ['adata', 'amethod'])
-
-    # The same, but with new-style classes.  Since these have object as a
-    # base class, a lot more gets sucked in.
-    def interesting(strings):
-        return [s for s in strings if not s.startswith('_')]
-
-    class C(object):
-        Cdata = 1
-        def Cmethod(self): pass
-
-    cstuff = ['Cdata', 'Cmethod']
-    vereq(interesting(dir(C)), cstuff)
-
-    c = C()
-    vereq(interesting(dir(c)), cstuff)
-    verify('im_self' in dir(C.Cmethod))
-
-    c.cdata = 2
-    c.cmethod = lambda self: 0
-    vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
-    verify('im_self' in dir(c.Cmethod))
-
-    class A(C):
-        Adata = 1
-        def Amethod(self): pass
-
-    astuff = ['Adata', 'Amethod'] + cstuff
-    vereq(interesting(dir(A)), astuff)
-    verify('im_self' in dir(A.Amethod))
-    a = A()
-    vereq(interesting(dir(a)), astuff)
-    a.adata = 42
-    a.amethod = lambda self: 3
-    vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
-    verify('im_self' in dir(a.Amethod))
-
-    # Try a module subclass.
-    import sys
-    class M(type(sys)):
-        pass
-    minstance = M("m")
-    minstance.b = 2
-    minstance.a = 1
-    names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
-    vereq(names, ['a', 'b'])
-
-    class M2(M):
-        def getdict(self):
-            return "Not a dict!"
-        __dict__ = property(getdict)
-
-    m2instance = M2("m2")
-    m2instance.b = 2
-    m2instance.a = 1
-    vereq(m2instance.__dict__, "Not a dict!")
-    try:
-        dir(m2instance)
-    except TypeError:
-        pass
-
-    # Two essentially featureless objects, just inheriting stuff from
-    # object.
-    vereq(dir(None), dir(Ellipsis))
-
-    # Nasty test case for proxied objects
-    class Wrapper(object):
-        def __init__(self, obj):
-            self.__obj = obj
-        def __repr__(self):
-            return "Wrapper(%s)" % repr(self.__obj)
-        def __getitem__(self, key):
-            return Wrapper(self.__obj[key])
-        def __len__(self):
-            return len(self.__obj)
-        def __getattr__(self, name):
-            return Wrapper(getattr(self.__obj, name))
+        class Mapping:
+            # Lacks a .keys() method; will be added later.
+            dict = {1:2, 3:4, 'a':1j}
 
-    class C(object):
-        def __getclass(self):
-            return Wrapper(type(self))
-        __class__ = property(__getclass)
-
-    dir(C()) # This used to segfault
-
-binops = {
-    'add': '+',
-    'sub': '-',
-    'mul': '*',
-    'div': '/',
-    'mod': '%',
-    'divmod': 'divmod',
-    'pow': '**',
-    'lshift': '<<',
-    'rshift': '>>',
-    'and': '&',
-    'xor': '^',
-    'or': '|',
-    'cmp': 'cmp',
-    'lt': '<',
-    'le': '<=',
-    'eq': '==',
-    'ne': '!=',
-    'gt': '>',
-    'ge': '>=',
-    }
-
-for name, expr in binops.items():
-    if expr.islower():
-        expr = expr + "(a, b)"
-    else:
-        expr = 'a %s b' % expr
-    binops[name] = expr
-
-unops = {
-    'pos': '+',
-    'neg': '-',
-    'abs': 'abs',
-    'invert': '~',
-    'int': 'int',
-    'long': 'long',
-    'float': 'float',
-    'oct': 'oct',
-    'hex': 'hex',
-    }
-
-for name, expr in unops.items():
-    if expr.islower():
-        expr = expr + "(a)"
-    else:
-        expr = '%s a' % expr
-    unops[name] = expr
-
-def numops(a, b, skip=[]):
-    dict = {'a': a, 'b': b}
-    for name, expr in binops.items():
-        if name not in skip:
-            name = "__%s__" % name
-            if hasattr(a, name):
-                res = eval(expr, dict)
-                testbinop(a, b, res, expr, name)
-    for name, expr in unops.items():
-        if name not in skip:
-            name = "__%s__" % name
-            if hasattr(a, name):
-                res = eval(expr, dict)
-                testunop(a, res, expr, name)
-
-def ints():
-    if verbose: print "Testing int operations..."
-    numops(100, 3)
-    # The following crashes in Python 2.2
-    vereq((1).__nonzero__(), 1)
-    vereq((0).__nonzero__(), 0)
-    # This returns 'NotImplemented' in Python 2.2
-    class C(int):
-        def __add__(self, other):
-            return NotImplemented
-    vereq(C(5L), 5)
-    try:
-        C() + ""
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "NotImplemented should have caused TypeError"
-    import sys
-    try:
-        C(sys.maxint+1)
-    except OverflowError:
-        pass
-    else:
-        raise TestFailed, "should have raised OverflowError"
-
-def longs():
-    if verbose: print "Testing long operations..."
-    numops(100L, 3L)
-
-def floats():
-    if verbose: print "Testing float operations..."
-    numops(100.0, 3.0)
-
-def complexes():
-    if verbose: print "Testing complex operations..."
-    numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
-    class Number(complex):
-        __slots__ = ['prec']
-        def __new__(cls, *args, **kwds):
-            result = complex.__new__(cls, *args)
-            result.prec = kwds.get('prec', 12)
-            return result
-        def __repr__(self):
-            prec = self.prec
-            if self.imag == 0.0:
-                return "%.*g" % (prec, self.real)
-            if self.real == 0.0:
-                return "%.*gj" % (prec, self.imag)
-            return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
-        __str__ = __repr__
-
-    a = Number(3.14, prec=6)
-    vereq(repr(a), "3.14")
-    vereq(a.prec, 6)
-
-    a = Number(a, prec=2)
-    vereq(repr(a), "3.1")
-    vereq(a.prec, 2)
-
-    a = Number(234.5)
-    vereq(repr(a), "234.5")
-    vereq(a.prec, 12)
-
-def spamlists():
-    if verbose: print "Testing spamlist operations..."
-    import copy, xxsubtype as spam
-    def spamlist(l, memo=None):
-        import xxsubtype as spam
-        return spam.spamlist(l)
-    # This is an ugly hack:
-    copy._deepcopy_dispatch[spam.spamlist] = spamlist
-
-    testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
-    testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
-    testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
-    testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
-    testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
-               "a[b:c]", "__getslice__")
-    testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
-              "a+=b", "__iadd__")
-    testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
-    testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
-    testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
-    testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
-    testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
-    testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
-               spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
-    # Test subclassing
-    class C(spam.spamlist):
-        def foo(self): return 1
-    a = C()
-    vereq(a, [])
-    vereq(a.foo(), 1)
-    a.append(100)
-    vereq(a, [100])
-    vereq(a.getstate(), 0)
-    a.setstate(42)
-    vereq(a.getstate(), 42)
-
-def spamdicts():
-    if verbose: print "Testing spamdict operations..."
-    import copy, xxsubtype as spam
-    def spamdict(d, memo=None):
-        import xxsubtype as spam
-        sd = spam.spamdict()
-        for k, v in d.items(): sd[k] = v
-        return sd
-    # This is an ugly hack:
-    copy._deepcopy_dispatch[spam.spamdict] = spamdict
-
-    testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
-    testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
-    testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
-    testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
-    d = spamdict({1:2,3:4})
-    l1 = []
-    for i in d.keys(): l1.append(i)
-    l = []
-    for i in iter(d): l.append(i)
-    vereq(l, l1)
-    l = []
-    for i in d.__iter__(): l.append(i)
-    vereq(l, l1)
-    l = []
-    for i in type(spamdict({})).__iter__(d): l.append(i)
-    vereq(l, l1)
-    straightd = {1:2, 3:4}
-    spamd = spamdict(straightd)
-    testunop(spamd, 2, "len(a)", "__len__")
-    testunop(spamd, repr(straightd), "repr(a)", "__repr__")
-    testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
-               "a[b]=c", "__setitem__")
-    # Test subclassing
-    class C(spam.spamdict):
-        def foo(self): return 1
-    a = C()
-    vereq(a.items(), [])
-    vereq(a.foo(), 1)
-    a['foo'] = 'bar'
-    vereq(a.items(), [('foo', 'bar')])
-    vereq(a.getstate(), 0)
-    a.setstate(100)
-    vereq(a.getstate(), 100)
-
-def pydicts():
-    if verbose: print "Testing Python subclass of dict..."
-    verify(issubclass(dict, dict))
-    verify(isinstance({}, dict))
-    d = dict()
-    vereq(d, {})
-    verify(d.__class__ is dict)
-    verify(isinstance(d, dict))
-    class C(dict):
-        state = -1
-        def __init__(self, *a, **kw):
-            if a:
-                vereq(len(a), 1)
-                self.state = a[0]
-            if kw:
-                for k, v in kw.items(): self[v] = k
-        def __getitem__(self, key):
-            return self.get(key, 0)
-        def __setitem__(self, key, value):
-            verify(isinstance(key, type(0)))
-            dict.__setitem__(self, key, value)
-        def setstate(self, state):
-            self.state = state
-        def getstate(self):
-            return self.state
-    verify(issubclass(C, dict))
-    a1 = C(12)
-    vereq(a1.state, 12)
-    a2 = C(foo=1, bar=2)
-    vereq(a2[1] == 'foo' and a2[2], 'bar')
-    a = C()
-    vereq(a.state, -1)
-    vereq(a.getstate(), -1)
-    a.setstate(0)
-    vereq(a.state, 0)
-    vereq(a.getstate(), 0)
-    a.setstate(10)
-    vereq(a.state, 10)
-    vereq(a.getstate(), 10)
-    vereq(a[42], 0)
-    a[42] = 24
-    vereq(a[42], 24)
-    if verbose: print "pydict stress test ..."
-    N = 50
-    for i in range(N):
-        a[i] = C()
-        for j in range(N):
-            a[i][j] = i*j
-    for i in range(N):
-        for j in range(N):
-            vereq(a[i][j], i*j)
-
-def pylists():
-    if verbose: print "Testing Python subclass of list..."
-    class C(list):
-        def __getitem__(self, i):
-            return list.__getitem__(self, i) + 100
-        def __getslice__(self, i, j):
-            return (i, j)
-    a = C()
-    a.extend([0,1,2])
-    vereq(a[0], 100)
-    vereq(a[1], 101)
-    vereq(a[2], 102)
-    vereq(a[100:200], (100,200))
-
-def metaclass():
-    if verbose: print "Testing __metaclass__..."
-    class C:
-        __metaclass__ = type
-        def __init__(self):
-            self.__state = 0
-        def getstate(self):
-            return self.__state
-        def setstate(self, state):
-            self.__state = state
-    a = C()
-    vereq(a.getstate(), 0)
-    a.setstate(10)
-    vereq(a.getstate(), 10)
-    class D:
-        class __metaclass__(type):
-            def myself(cls): return cls
-    vereq(D.myself(), D)
-    d = D()
-    verify(d.__class__ is D)
-    class M1(type):
-        def __new__(cls, name, bases, dict):
-            dict['__spam__'] = 1
-            return type.__new__(cls, name, bases, dict)
-    class C:
-        __metaclass__ = M1
-    vereq(C.__spam__, 1)
-    c = C()
-    vereq(c.__spam__, 1)
-
-    class _instance(object):
-        pass
-    class M2(object):
-        @staticmethod
-        def __new__(cls, name, bases, dict):
-            self = object.__new__(cls)
-            self.name = name
-            self.bases = bases
-            self.dict = dict
-            return self
-        def __call__(self):
-            it = _instance()
-            # Early binding of methods
-            for key in self.dict:
-                if key.startswith("__"):
+        try:
+            dict(Mapping())
+        except TypeError:
+            pass
+        else:
+            self.fail("no TypeError from dict(incomplete mapping)")
+
+        Mapping.keys = lambda self: self.dict.keys()
+        Mapping.__getitem__ = lambda self, i: self.dict[i]
+        d = dict(Mapping())
+        self.assertEqual(d, Mapping.dict)
+
+        # Init from sequence of iterable objects, each producing a 2-sequence.
+        class AddressBookEntry:
+            def __init__(self, first, last):
+                self.first = first
+                self.last = last
+            def __iter__(self):
+                return iter([self.first, self.last])
+
+        d = dict([AddressBookEntry('Tim', 'Warsaw'),
+                  AddressBookEntry('Barry', 'Peters'),
+                  AddressBookEntry('Tim', 'Peters'),
+                  AddressBookEntry('Barry', 'Warsaw')])
+        self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
+
+        d = dict(zip(range(4), range(1, 5)))
+        self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
+
+        # Bad sequence lengths.
+        for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
+            try:
+                dict(bad)
+            except ValueError:
+                pass
+            else:
+                self.fail("no ValueError from dict(%r)" % bad)
+
+    def test_dir(self):
+        # Testing dir() ...
+        junk = 12
+        self.assertEqual(dir(), ['junk', 'self'])
+        del junk
+
+        # Just make sure these don't blow up!
+        for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
+            dir(arg)
+
+        # Try classic classes.
+        class C:
+            Cdata = 1
+            def Cmethod(self): pass
+
+        cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
+        self.assertEqual(dir(C), cstuff)
+        self.assert_('im_self' in dir(C.Cmethod))
+
+        c = C()  # c.__doc__ is an odd thing to see here; ditto c.__module__.
+        self.assertEqual(dir(c), cstuff)
+
+        c.cdata = 2
+        c.cmethod = lambda self: 0
+        self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
+        self.assert_('im_self' in dir(c.Cmethod))
+
+        class A(C):
+            Adata = 1
+            def Amethod(self): pass
+
+        astuff = ['Adata', 'Amethod'] + cstuff
+        self.assertEqual(dir(A), astuff)
+        self.assert_('im_self' in dir(A.Amethod))
+        a = A()
+        self.assertEqual(dir(a), astuff)
+        self.assert_('im_self' in dir(a.Amethod))
+        a.adata = 42
+        a.amethod = lambda self: 3
+        self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
+
+        # The same, but with new-style classes.  Since these have object as a
+        # base class, a lot more gets sucked in.
+        def interesting(strings):
+            return [s for s in strings if not s.startswith('_')]
+
+        class C(object):
+            Cdata = 1
+            def Cmethod(self): pass
+
+        cstuff = ['Cdata', 'Cmethod']
+        self.assertEqual(interesting(dir(C)), cstuff)
+
+        c = C()
+        self.assertEqual(interesting(dir(c)), cstuff)
+        self.assert_('im_self' in dir(C.Cmethod))
+
+        c.cdata = 2
+        c.cmethod = lambda self: 0
+        self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
+        self.assert_('im_self' in dir(c.Cmethod))
+
+        class A(C):
+            Adata = 1
+            def Amethod(self): pass
+
+        astuff = ['Adata', 'Amethod'] + cstuff
+        self.assertEqual(interesting(dir(A)), astuff)
+        self.assert_('im_self' in dir(A.Amethod))
+        a = A()
+        self.assertEqual(interesting(dir(a)), astuff)
+        a.adata = 42
+        a.amethod = lambda self: 3
+        self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
+        self.assert_('im_self' in dir(a.Amethod))
+
+        # Try a module subclass.
+        import sys
+        class M(type(sys)):
+            pass
+        minstance = M("m")
+        minstance.b = 2
+        minstance.a = 1
+        names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
+        self.assertEqual(names, ['a', 'b'])
+
+        class M2(M):
+            def getdict(self):
+                return "Not a dict!"
+            __dict__ = property(getdict)
+
+        m2instance = M2("m2")
+        m2instance.b = 2
+        m2instance.a = 1
+        self.assertEqual(m2instance.__dict__, "Not a dict!")
+        try:
+            dir(m2instance)
+        except TypeError:
+            pass
+
+        # Two essentially featureless objects, just inheriting stuff from
+        # object.
+        self.assertEqual(dir(None), dir(Ellipsis))
+
+        # Nasty test case for proxied objects
+        class Wrapper(object):
+            def __init__(self, obj):
+                self.__obj = obj
+            def __repr__(self):
+                return "Wrapper(%s)" % repr(self.__obj)
+            def __getitem__(self, key):
+                return Wrapper(self.__obj[key])
+            def __len__(self):
+                return len(self.__obj)
+            def __getattr__(self, name):
+                return Wrapper(getattr(self.__obj, name))
+
+        class C(object):
+            def __getclass(self):
+                return Wrapper(type(self))
+            __class__ = property(__getclass)
+
+        dir(C()) # This used to segfault
+
+    def test_supers(self):
+        # Testing super...
+
+        class A(object):
+            def meth(self, a):
+                return "A(%r)" % a
+
+        self.assertEqual(A().meth(1), "A(1)")
+
+        class B(A):
+            def __init__(self):
+                self.__super = super(B, self)
+            def meth(self, a):
+                return "B(%r)" % a + self.__super.meth(a)
+
+        self.assertEqual(B().meth(2), "B(2)A(2)")
+
+        class C(A):
+            def meth(self, a):
+                return "C(%r)" % a + self.__super.meth(a)
+        C._C__super = super(C)
+
+        self.assertEqual(C().meth(3), "C(3)A(3)")
+
+        class D(C, B):
+            def meth(self, a):
+                return "D(%r)" % a + super(D, self).meth(a)
+
+        self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
+
+        # Test for subclassing super
+
+        class mysuper(super):
+            def __init__(self, *args):
+                return super(mysuper, self).__init__(*args)
+
+        class E(D):
+            def meth(self, a):
+                return "E(%r)" % a + mysuper(E, self).meth(a)
+
+        self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
+
+        class F(E):
+            def meth(self, a):
+                s = self.__super # == mysuper(F, self)
+                return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
+        F._F__super = mysuper(F)
+
+        self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
+
+        # Make sure certain errors are raised
+
+        try:
+            super(D, 42)
+        except TypeError:
+            pass
+        else:
+            self.fail("shouldn't allow super(D, 42)")
+
+        try:
+            super(D, C())
+        except TypeError:
+            pass
+        else:
+            self.fail("shouldn't allow super(D, C())")
+
+        try:
+            super(D).__get__(12)
+        except TypeError:
+            pass
+        else:
+            self.fail("shouldn't allow super(D).__get__(12)")
+
+        try:
+            super(D).__get__(C())
+        except TypeError:
+            pass
+        else:
+            self.fail("shouldn't allow super(D).__get__(C())")
+
+        # Make sure data descriptors can be overridden and accessed via super
+        # (new feature in Python 2.3)
+
+        class DDbase(object):
+            def getx(self): return 42
+            x = property(getx)
+
+        class DDsub(DDbase):
+            def getx(self): return "hello"
+            x = property(getx)
+
+        dd = DDsub()
+        self.assertEqual(dd.x, "hello")
+        self.assertEqual(super(DDsub, dd).x, 42)
+
+        # Ensure that super() lookup of descriptor from classmethod
+        # works (SF ID# 743627)
+
+        class Base(object):
+            aProp = property(lambda self: "foo")
+
+        class Sub(Base):
+            @classmethod
+            def test(klass):
+                return super(Sub,klass).aProp
+
+        self.assertEqual(Sub.test(), Base.aProp)
+
+        # Verify that super() doesn't allow keyword args
+        try:
+            super(Base, kw=1)
+        except TypeError:
+            pass
+        else:
+            self.assertEqual("super shouldn't accept keyword args")
+
+    def test_basic_inheritance(self):
+        # Testing inheritance from basic types...
+
+        class hexint(int):
+            def __repr__(self):
+                return hex(self)
+            def __add__(self, other):
+                return hexint(int.__add__(self, other))
+            # (Note that overriding __radd__ doesn't work,
+            # because the int type gets first dibs.)
+        self.assertEqual(repr(hexint(7) + 9), "0x10")
+        self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
+        a = hexint(12345)
+        self.assertEqual(a, 12345)
+        self.assertEqual(int(a), 12345)
+        self.assert_(int(a).__class__ is int)
+        self.assertEqual(hash(a), hash(12345))
+        self.assert_((+a).__class__ is int)
+        self.assert_((a >> 0).__class__ is int)
+        self.assert_((a << 0).__class__ is int)
+        self.assert_((hexint(0) << 12).__class__ is int)
+        self.assert_((hexint(0) >> 12).__class__ is int)
+
+        class octlong(long):
+            __slots__ = []
+            def __str__(self):
+                s = oct(self)
+                if s[-1] == 'L':
+                    s = s[:-1]
+                return s
+            def __add__(self, other):
+                return self.__class__(super(octlong, self).__add__(other))
+            __radd__ = __add__
+        self.assertEqual(str(octlong(3) + 5), "010")
+        # (Note that overriding __radd__ here only seems to work
+        # because the example uses a short int left argument.)
+        self.assertEqual(str(5 + octlong(3000)), "05675")
+        a = octlong(12345)
+        self.assertEqual(a, 12345L)
+        self.assertEqual(long(a), 12345L)
+        self.assertEqual(hash(a), hash(12345L))
+        self.assert_(long(a).__class__ is long)
+        self.assert_((+a).__class__ is long)
+        self.assert_((-a).__class__ is long)
+        self.assert_((-octlong(0)).__class__ is long)
+        self.assert_((a >> 0).__class__ is long)
+        self.assert_((a << 0).__class__ is long)
+        self.assert_((a - 0).__class__ is long)
+        self.assert_((a * 1).__class__ is long)
+        self.assert_((a ** 1).__class__ is long)
+        self.assert_((a // 1).__class__ is long)
+        self.assert_((1 * a).__class__ is long)
+        self.assert_((a | 0).__class__ is long)
+        self.assert_((a ^ 0).__class__ is long)
+        self.assert_((a & -1L).__class__ is long)
+        self.assert_((octlong(0) << 12).__class__ is long)
+        self.assert_((octlong(0) >> 12).__class__ is long)
+        self.assert_(abs(octlong(0)).__class__ is long)
+
+        # Because octlong overrides __add__, we can't check the absence of +0
+        # optimizations using octlong.
+        class longclone(long):
+            pass
+        a = longclone(1)
+        self.assert_((a + 0).__class__ is long)
+        self.assert_((0 + a).__class__ is long)
+
+        # Check that negative clones don't segfault
+        a = longclone(-1)
+        self.assertEqual(a.__dict__, {})
+        self.assertEqual(long(a), -1)  # self.assert_ PyNumber_Long() copies the sign bit
+
+        class precfloat(float):
+            __slots__ = ['prec']
+            def __init__(self, value=0.0, prec=12):
+                self.prec = int(prec)
+            def __repr__(self):
+                return "%.*g" % (self.prec, self)
+        self.assertEqual(repr(precfloat(1.1)), "1.1")
+        a = precfloat(12345)
+        self.assertEqual(a, 12345.0)
+        self.assertEqual(float(a), 12345.0)
+        self.assert_(float(a).__class__ is float)
+        self.assertEqual(hash(a), hash(12345.0))
+        self.assert_((+a).__class__ is float)
+
+        class madcomplex(complex):
+            def __repr__(self):
+                return "%.17gj%+.17g" % (self.imag, self.real)
+        a = madcomplex(-3, 4)
+        self.assertEqual(repr(a), "4j-3")
+        base = complex(-3, 4)
+        self.assertEqual(base.__class__, complex)
+        self.assertEqual(a, base)
+        self.assertEqual(complex(a), base)
+        self.assertEqual(complex(a).__class__, complex)
+        a = madcomplex(a)  # just trying another form of the constructor
+        self.assertEqual(repr(a), "4j-3")
+        self.assertEqual(a, base)
+        self.assertEqual(complex(a), base)
+        self.assertEqual(complex(a).__class__, complex)
+        self.assertEqual(hash(a), hash(base))
+        self.assertEqual((+a).__class__, complex)
+        self.assertEqual((a + 0).__class__, complex)
+        self.assertEqual(a + 0, base)
+        self.assertEqual((a - 0).__class__, complex)
+        self.assertEqual(a - 0, base)
+        self.assertEqual((a * 1).__class__, complex)
+        self.assertEqual(a * 1, base)
+        self.assertEqual((a / 1).__class__, complex)
+        self.assertEqual(a / 1, base)
+
+        class madtuple(tuple):
+            _rev = None
+            def rev(self):
+                if self._rev is not None:
+                    return self._rev
+                L = list(self)
+                L.reverse()
+                self._rev = self.__class__(L)
+                return self._rev
+        a = madtuple((1,2,3,4,5,6,7,8,9,0))
+        self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
+        self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
+        self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
+        for i in range(512):
+            t = madtuple(range(i))
+            u = t.rev()
+            v = u.rev()
+            self.assertEqual(v, t)
+        a = madtuple((1,2,3,4,5))
+        self.assertEqual(tuple(a), (1,2,3,4,5))
+        self.assert_(tuple(a).__class__ is tuple)
+        self.assertEqual(hash(a), hash((1,2,3,4,5)))
+        self.assert_(a[:].__class__ is tuple)
+        self.assert_((a * 1).__class__ is tuple)
+        self.assert_((a * 0).__class__ is tuple)
+        self.assert_((a + ()).__class__ is tuple)
+        a = madtuple(())
+        self.assertEqual(tuple(a), ())
+        self.assert_(tuple(a).__class__ is tuple)
+        self.assert_((a + a).__class__ is tuple)
+        self.assert_((a * 0).__class__ is tuple)
+        self.assert_((a * 1).__class__ is tuple)
+        self.assert_((a * 2).__class__ is tuple)
+        self.assert_(a[:].__class__ is tuple)
+
+        class madstring(str):
+            _rev = None
+            def rev(self):
+                if self._rev is not None:
+                    return self._rev
+                L = list(self)
+                L.reverse()
+                self._rev = self.__class__("".join(L))
+                return self._rev
+        s = madstring("abcdefghijklmnopqrstuvwxyz")
+        self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
+        self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
+        self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
+        for i in range(256):
+            s = madstring("".join(map(chr, range(i))))
+            t = s.rev()
+            u = t.rev()
+            self.assertEqual(u, s)
+        s = madstring("12345")
+        self.assertEqual(str(s), "12345")
+        self.assert_(str(s).__class__ is str)
+
+        base = "\x00" * 5
+        s = madstring(base)
+        self.assertEqual(s, base)
+        self.assertEqual(str(s), base)
+        self.assert_(str(s).__class__ is str)
+        self.assertEqual(hash(s), hash(base))
+        self.assertEqual({s: 1}[base], 1)
+        self.assertEqual({base: 1}[s], 1)
+        self.assert_((s + "").__class__ is str)
+        self.assertEqual(s + "", base)
+        self.assert_(("" + s).__class__ is str)
+        self.assertEqual("" + s, base)
+        self.assert_((s * 0).__class__ is str)
+        self.assertEqual(s * 0, "")
+        self.assert_((s * 1).__class__ is str)
+        self.assertEqual(s * 1, base)
+        self.assert_((s * 2).__class__ is str)
+        self.assertEqual(s * 2, base + base)
+        self.assert_(s[:].__class__ is str)
+        self.assertEqual(s[:], base)
+        self.assert_(s[0:0].__class__ is str)
+        self.assertEqual(s[0:0], "")
+        self.assert_(s.strip().__class__ is str)
+        self.assertEqual(s.strip(), base)
+        self.assert_(s.lstrip().__class__ is str)
+        self.assertEqual(s.lstrip(), base)
+        self.assert_(s.rstrip().__class__ is str)
+        self.assertEqual(s.rstrip(), base)
+        identitytab = ''.join([chr(i) for i in range(256)])
+        self.assert_(s.translate(identitytab).__class__ is str)
+        self.assertEqual(s.translate(identitytab), base)
+        self.assert_(s.translate(identitytab, "x").__class__ is str)
+        self.assertEqual(s.translate(identitytab, "x"), base)
+        self.assertEqual(s.translate(identitytab, "\x00"), "")
+        self.assert_(s.replace("x", "x").__class__ is str)
+        self.assertEqual(s.replace("x", "x"), base)
+        self.assert_(s.ljust(len(s)).__class__ is str)
+        self.assertEqual(s.ljust(len(s)), base)
+        self.assert_(s.rjust(len(s)).__class__ is str)
+        self.assertEqual(s.rjust(len(s)), base)
+        self.assert_(s.center(len(s)).__class__ is str)
+        self.assertEqual(s.center(len(s)), base)
+        self.assert_(s.lower().__class__ is str)
+        self.assertEqual(s.lower(), base)
+
+        class madunicode(unicode):
+            _rev = None
+            def rev(self):
+                if self._rev is not None:
+                    return self._rev
+                L = list(self)
+                L.reverse()
+                self._rev = self.__class__(u"".join(L))
+                return self._rev
+        u = madunicode("ABCDEF")
+        self.assertEqual(u, u"ABCDEF")
+        self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
+        self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
+        base = u"12345"
+        u = madunicode(base)
+        self.assertEqual(unicode(u), base)
+        self.assert_(unicode(u).__class__ is unicode)
+        self.assertEqual(hash(u), hash(base))
+        self.assertEqual({u: 1}[base], 1)
+        self.assertEqual({base: 1}[u], 1)
+        self.assert_(u.strip().__class__ is unicode)
+        self.assertEqual(u.strip(), base)
+        self.assert_(u.lstrip().__class__ is unicode)
+        self.assertEqual(u.lstrip(), base)
+        self.assert_(u.rstrip().__class__ is unicode)
+        self.assertEqual(u.rstrip(), base)
+        self.assert_(u.replace(u"x", u"x").__class__ is unicode)
+        self.assertEqual(u.replace(u"x", u"x"), base)
+        self.assert_(u.replace(u"xy", u"xy").__class__ is unicode)
+        self.assertEqual(u.replace(u"xy", u"xy"), base)
+        self.assert_(u.center(len(u)).__class__ is unicode)
+        self.assertEqual(u.center(len(u)), base)
+        self.assert_(u.ljust(len(u)).__class__ is unicode)
+        self.assertEqual(u.ljust(len(u)), base)
+        self.assert_(u.rjust(len(u)).__class__ is unicode)
+        self.assertEqual(u.rjust(len(u)), base)
+        self.assert_(u.lower().__class__ is unicode)
+        self.assertEqual(u.lower(), base)
+        self.assert_(u.upper().__class__ is unicode)
+        self.assertEqual(u.upper(), base)
+        self.assert_(u.capitalize().__class__ is unicode)
+        self.assertEqual(u.capitalize(), base)
+        self.assert_(u.title().__class__ is unicode)
+        self.assertEqual(u.title(), base)
+        self.assert_((u + u"").__class__ is unicode)
+        self.assertEqual(u + u"", base)
+        self.assert_((u"" + u).__class__ is unicode)
+        self.assertEqual(u"" + u, base)
+        self.assert_((u * 0).__class__ is unicode)
+        self.assertEqual(u * 0, u"")
+        self.assert_((u * 1).__class__ is unicode)
+        self.assertEqual(u * 1, base)
+        self.assert_((u * 2).__class__ is unicode)
+        self.assertEqual(u * 2, base + base)
+        self.assert_(u[:].__class__ is unicode)
+        self.assertEqual(u[:], base)
+        self.assert_(u[0:0].__class__ is unicode)
+        self.assertEqual(u[0:0], u"")
+
+        class sublist(list):
+            pass
+        a = sublist(range(5))
+        self.assertEqual(a, range(5))
+        a.append("hello")
+        self.assertEqual(a, range(5) + ["hello"])
+        a[5] = 5
+        self.assertEqual(a, range(6))
+        a.extend(range(6, 20))
+        self.assertEqual(a, range(20))
+        a[-5:] = []
+        self.assertEqual(a, range(15))
+        del a[10:15]
+        self.assertEqual(len(a), 10)
+        self.assertEqual(a, range(10))
+        self.assertEqual(list(a), range(10))
+        self.assertEqual(a[0], 0)
+        self.assertEqual(a[9], 9)
+        self.assertEqual(a[-10], 0)
+        self.assertEqual(a[-1], 9)
+        self.assertEqual(a[:5], range(5))
+
+        class CountedInput(file):
+            """Counts lines read by self.readline().
+
+            self.lineno is the 0-based ordinal of the last line read, up to
+            a maximum of one greater than the number of lines in the file.
+
+            self.ateof is true if and only if the final "" line has been read,
+            at which point self.lineno stops incrementing, and further calls
+            to readline() continue to return "".
+            """
+
+            lineno = 0
+            ateof = 0
+            def readline(self):
+                if self.ateof:
+                    return ""
+                s = file.readline(self)
+                # Next line works too.
+                # s = super(CountedInput, self).readline()
+                self.lineno += 1
+                if s == "":
+                    self.ateof = 1
+                return s
+
+        f = file(name=test_support.TESTFN, mode='w')
+        lines = ['a\n', 'b\n', 'c\n']
+        try:
+            f.writelines(lines)
+            f.close()
+            f = CountedInput(test_support.TESTFN)
+            for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
+                got = f.readline()
+                self.assertEqual(expected, got)
+                self.assertEqual(f.lineno, i)
+                self.assertEqual(f.ateof, (i > len(lines)))
+            f.close()
+        finally:
+            try:
+                f.close()
+            except:
+                pass
+            test_support.unlink(test_support.TESTFN)
+
+    def test_keywords(self):
+        # Testing keyword args to basic type constructors ...
+        self.assertEqual(int(x=1), 1)
+        self.assertEqual(float(x=2), 2.0)
+        self.assertEqual(long(x=3), 3L)
+        self.assertEqual(complex(imag=42, real=666), complex(666, 42))
+        self.assertEqual(str(object=500), '500')
+        self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
+        self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
+        self.assertEqual(list(sequence=(0, 1, 2)), range(3))
+        # note: as of Python 2.3, dict() no longer has an "items" keyword arg
+
+        for constructor in (int, float, long, complex, str, unicode,
+                            tuple, list, file):
+            try:
+                constructor(bogus_keyword_arg=1)
+            except TypeError:
+                pass
+            else:
+                self.fail("expected TypeError from bogus keyword argument to %r"
+                            % constructor)
+
+    def test_str_subclass_as_dict_key(self):
+        # Testing a str subclass used as dict key ..
+
+        class cistr(str):
+            """Sublcass of str that computes __eq__ case-insensitively.
+
+            Also computes a hash code of the string in canonical form.
+            """
+
+            def __init__(self, value):
+                self.canonical = value.lower()
+                self.hashcode = hash(self.canonical)
+
+            def __eq__(self, other):
+                if not isinstance(other, cistr):
+                    other = cistr(other)
+                return self.canonical == other.canonical
+
+            def __hash__(self):
+                return self.hashcode
+
+        self.assertEqual(cistr('ABC'), 'abc')
+        self.assertEqual('aBc', cistr('ABC'))
+        self.assertEqual(str(cistr('ABC')), 'ABC')
+
+        d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
+        self.assertEqual(d[cistr('one')], 1)
+        self.assertEqual(d[cistr('tWo')], 2)
+        self.assertEqual(d[cistr('THrEE')], 3)
+        self.assert_(cistr('ONe') in d)
+        self.assertEqual(d.get(cistr('thrEE')), 3)
+
+    def test_classic_comparisons(self):
+        # Testing classic comparisons...
+        class classic:
+            pass
+
+        for base in (classic, int, object):
+            class C(base):
+                def __init__(self, value):
+                    self.value = int(value)
+                def __cmp__(self, other):
+                    if isinstance(other, C):
+                        return cmp(self.value, other.value)
+                    if isinstance(other, int) or isinstance(other, long):
+                        return cmp(self.value, other)
+                    return NotImplemented
+
+            c1 = C(1)
+            c2 = C(2)
+            c3 = C(3)
+            self.assertEqual(c1, 1)
+            c = {1: c1, 2: c2, 3: c3}
+            for x in 1, 2, 3:
+                for y in 1, 2, 3:
+                    self.assert_(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
+                    for op in "<", "<=", "==", "!=", ">", ">=":
+                        self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
+                               "x=%d, y=%d" % (x, y))
+                    self.assert_(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
+                    self.assert_(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
+
+    def test_rich_comparisons(self):
+        # Testing rich comparisons...
+        class Z(complex):
+            pass
+        z = Z(1)
+        self.assertEqual(z, 1+0j)
+        self.assertEqual(1+0j, z)
+        class ZZ(complex):
+            def __eq__(self, other):
+                try:
+                    return abs(self - other) <= 1e-6
+                except:
+                    return NotImplemented
+        zz = ZZ(1.0000003)
+        self.assertEqual(zz, 1+0j)
+        self.assertEqual(1+0j, zz)
+
+        class classic:
+            pass
+        for base in (classic, int, object, list):
+            class C(base):
+                def __init__(self, value):
+                    self.value = int(value)
+                def __cmp__(self_, other):
+                    self.fail("shouldn't call __cmp__")
+                def __eq__(self, other):
+                    if isinstance(other, C):
+                        return self.value == other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value == other
+                    return NotImplemented
+                def __ne__(self, other):
+                    if isinstance(other, C):
+                        return self.value != other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value != other
+                    return NotImplemented
+                def __lt__(self, other):
+                    if isinstance(other, C):
+                        return self.value < other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value < other
+                    return NotImplemented
+                def __le__(self, other):
+                    if isinstance(other, C):
+                        return self.value <= other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value <= other
+                    return NotImplemented
+                def __gt__(self, other):
+                    if isinstance(other, C):
+                        return self.value > other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value > other
+                    return NotImplemented
+                def __ge__(self, other):
+                    if isinstance(other, C):
+                        return self.value >= other.value
+                    if isinstance(other, int) or isinstance(other, long):
+                        return self.value >= other
+                    return NotImplemented
+            c1 = C(1)
+            c2 = C(2)
+            c3 = C(3)
+            self.assertEqual(c1, 1)
+            c = {1: c1, 2: c2, 3: c3}
+            for x in 1, 2, 3:
+                for y in 1, 2, 3:
+                    for op in "<", "<=", "==", "!=", ">", ">=":
+                        self.assert_(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
+                               "x=%d, y=%d" % (x, y))
+                        self.assert_(eval("c[x] %s y" % op) == eval("x %s y" % op),
+                               "x=%d, y=%d" % (x, y))
+                        self.assert_(eval("x %s c[y]" % op) == eval("x %s y" % op),
+                               "x=%d, y=%d" % (x, y))
+
+    def test_coercions(self):
+        # Testing coercions...
+        class I(int): pass
+        coerce(I(0), 0)
+        coerce(0, I(0))
+        class L(long): pass
+        coerce(L(0), 0)
+        coerce(L(0), 0L)
+        coerce(0, L(0))
+        coerce(0L, L(0))
+        class F(float): pass
+        coerce(F(0), 0)
+        coerce(F(0), 0L)
+        coerce(F(0), 0.)
+        coerce(0, F(0))
+        coerce(0L, F(0))
+        coerce(0., F(0))
+        class C(complex): pass
+        coerce(C(0), 0)
+        coerce(C(0), 0L)
+        coerce(C(0), 0.)
+        coerce(C(0), 0j)
+        coerce(0, C(0))
+        coerce(0L, C(0))
+        coerce(0., C(0))
+        coerce(0j, C(0))
+
+    def test_descrdoc(self):
+        # Testing descriptor doc strings...
+        def check(descr, what):
+            self.assertEqual(descr.__doc__, what)
+        check(file.closed, "True if the file is closed") # getset descriptor
+        check(file.name, "file name") # member descriptor
+
+    def test_doc_descriptor(self):
+        # Testing __doc__ descriptor...
+        # SF bug 542984
+        class DocDescr(object):
+            def __get__(self, object, otype):
+                if object:
+                    object = object.__class__.__name__ + ' instance'
+                if otype:
+                    otype = otype.__name__
+                return 'object=%s; type=%s' % (object, otype)
+        class OldClass:
+            __doc__ = DocDescr()
+        class NewClass(object):
+            __doc__ = DocDescr()
+        self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
+        self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
+        self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
+        self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
+
+    def test_set_class(self):
+        # Testing __class__ assignment...
+        class C(object): pass
+        class D(object): pass
+        class E(object): pass
+        class F(D, E): pass
+        for cls in C, D, E, F:
+            for cls2 in C, D, E, F:
+                x = cls()
+                x.__class__ = cls2
+                self.assert_(x.__class__ is cls2)
+                x.__class__ = cls
+                self.assert_(x.__class__ is cls)
+        def cant(x, C):
+            try:
+                x.__class__ = C
+            except TypeError:
+                pass
+            else:
+                self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
+            try:
+                delattr(x, "__class__")
+            except TypeError:
+                pass
+            else:
+                self.fail("shouldn't allow del %r.__class__" % x)
+        cant(C(), list)
+        cant(list(), C)
+        cant(C(), 1)
+        cant(C(), object)
+        cant(object(), list)
+        cant(list(), object)
+        class Int(int): __slots__ = []
+        cant(2, Int)
+        cant(Int(), int)
+        cant(True, int)
+        cant(2, bool)
+        o = object()
+        cant(o, type(1))
+        cant(o, type(None))
+        del o
+        class G(object):
+            __slots__ = ["a", "b"]
+        class H(object):
+            __slots__ = ["b", "a"]
+        try:
+            unicode
+        except NameError:
+            class I(object):
+                __slots__ = ["a", "b"]
+        else:
+            class I(object):
+                __slots__ = [unicode("a"), unicode("b")]
+        class J(object):
+            __slots__ = ["c", "b"]
+        class K(object):
+            __slots__ = ["a", "b", "d"]
+        class L(H):
+            __slots__ = ["e"]
+        class M(I):
+            __slots__ = ["e"]
+        class N(J):
+            __slots__ = ["__weakref__"]
+        class P(J):
+            __slots__ = ["__dict__"]
+        class Q(J):
+            pass
+        class R(J):
+            __slots__ = ["__dict__", "__weakref__"]
+
+        for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
+            x = cls()
+            x.a = 1
+            x.__class__ = cls2
+            self.assert_(x.__class__ is cls2,
+                   "assigning %r as __class__ for %r silently failed" % (cls2, x))
+            self.assertEqual(x.a, 1)
+            x.__class__ = cls
+            self.assert_(x.__class__ is cls,
+                   "assigning %r as __class__ for %r silently failed" % (cls, x))
+            self.assertEqual(x.a, 1)
+        for cls in G, J, K, L, M, N, P, R, list, Int:
+            for cls2 in G, J, K, L, M, N, P, R, list, Int:
+                if cls is cls2:
                     continue
-                setattr(it, key, self.dict[key].__get__(it, self))
-            return it
-    class C:
-        __metaclass__ = M2
-        def spam(self):
-            return 42
-    vereq(C.name, 'C')
-    vereq(C.bases, ())
-    verify('spam' in C.dict)
-    c = C()
-    vereq(c.spam(), 42)
-
-    # More metaclass examples
-
-    class autosuper(type):
-        # Automatically add __super to the class
-        # This trick only works for dynamic classes
-        def __new__(metaclass, name, bases, dict):
-            cls = super(autosuper, metaclass).__new__(metaclass,
-                                                      name, bases, dict)
-            # Name mangling for __super removes leading underscores
-            while name[:1] == "_":
-                name = name[1:]
-            if name:
-                name = "_%s__super" % name
+                cant(cls(), cls2)
+
+    def test_set_dict(self):
+        # Testing __dict__ assignment...
+        class C(object): pass
+        a = C()
+        a.__dict__ = {'b': 1}
+        self.assertEqual(a.b, 1)
+        def cant(x, dict):
+            try:
+                x.__dict__ = dict
+            except (AttributeError, TypeError):
+                pass
+            else:
+                self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
+        cant(a, None)
+        cant(a, [])
+        cant(a, 1)
+        del a.__dict__ # Deleting __dict__ is allowed
+
+        class Base(object):
+            pass
+        def verify_dict_readonly(x):
+            """
+            x has to be an instance of a class inheriting from Base.
+            """
+            cant(x, {})
+            try:
+                del x.__dict__
+            except (AttributeError, TypeError):
+                pass
+            else:
+                self.fail("shouldn't allow del %r.__dict__" % x)
+            dict_descr = Base.__dict__["__dict__"]
+            try:
+                dict_descr.__set__(x, {})
+            except (AttributeError, TypeError):
+                pass
             else:
-                name = "__super"
-            setattr(cls, name, super(cls))
-            return cls
-    class A:
-        __metaclass__ = autosuper
-        def meth(self):
-            return "A"
-    class B(A):
-        def meth(self):
-            return "B" + self.__super.meth()
-    class C(A):
-        def meth(self):
-            return "C" + self.__super.meth()
-    class D(C, B):
-        def meth(self):
-            return "D" + self.__super.meth()
-    vereq(D().meth(), "DCBA")
-    class E(B, C):
-        def meth(self):
-            return "E" + self.__super.meth()
-    vereq(E().meth(), "EBCA")
-
-    class autoproperty(type):
-        # Automatically create property attributes when methods
-        # named _get_x and/or _set_x are found
-        def __new__(metaclass, name, bases, dict):
-            hits = {}
-            for key, val in dict.iteritems():
-                if key.startswith("_get_"):
-                    key = key[5:]
-                    get, set = hits.get(key, (None, None))
-                    get = val
-                    hits[key] = get, set
-                elif key.startswith("_set_"):
-                    key = key[5:]
-                    get, set = hits.get(key, (None, None))
-                    set = val
-                    hits[key] = get, set
-            for key, (get, set) in hits.iteritems():
-                dict[key] = property(get, set)
-            return super(autoproperty, metaclass).__new__(metaclass,
-                                                        name, bases, dict)
-    class A:
-        __metaclass__ = autoproperty
-        def _get_x(self):
-            return -self.__x
-        def _set_x(self, x):
-            self.__x = -x
-    a = A()
-    verify(not hasattr(a, "x"))
-    a.x = 12
-    vereq(a.x, 12)
-    vereq(a._A__x, -12)
-
-    class multimetaclass(autoproperty, autosuper):
-        # Merge of multiple cooperating metaclasses
-        pass
-    class A:
-        __metaclass__ = multimetaclass
-        def _get_x(self):
-            return "A"
-    class B(A):
-        def _get_x(self):
-            return "B" + self.__super._get_x()
-    class C(A):
-        def _get_x(self):
-            return "C" + self.__super._get_x()
-    class D(C, B):
-        def _get_x(self):
-            return "D" + self.__super._get_x()
-    vereq(D().x, "DCBA")
-
-    # Make sure type(x) doesn't call x.__class__.__init__
-    class T(type):
-        counter = 0
-        def __init__(self, *args):
-            T.counter += 1
-    class C:
-        __metaclass__ = T
-    vereq(T.counter, 1)
-    a = C()
-    vereq(type(a), C)
-    vereq(T.counter, 1)
-
-    class C(object): pass
-    c = C()
-    try: c()
-    except TypeError: pass
-    else: raise TestFailed, "calling object w/o call method should raise TypeError"
-
-    # Testing code to find most derived baseclass
-    class A(type):
-        def __new__(*args, **kwargs):
-            return type.__new__(*args, **kwargs)
-
-    class B(object):
-        pass
-
-    class C(object):
-        __metaclass__ = A
-
-    # The most derived metaclass of D is A rather than type.
-    class D(B, C):
-        pass
-
-
-def pymods():
-    if verbose: print "Testing Python subclass of module..."
-    log = []
-    import sys
-    MT = type(sys)
-    class MM(MT):
-        def __init__(self, name):
-            MT.__init__(self, name)
+                self.fail("dict_descr allowed access to %r's dict" % x)
+
+        # Classes don't allow __dict__ assignment and have readonly dicts
+        class Meta1(type, Base):
+            pass
+        class Meta2(Base, type):
+            pass
+        class D(object):
+            __metaclass__ = Meta1
+        class E(object):
+            __metaclass__ = Meta2
+        for cls in C, D, E:
+            verify_dict_readonly(cls)
+            class_dict = cls.__dict__
+            try:
+                class_dict["spam"] = "eggs"
+            except TypeError:
+                pass
+            else:
+                self.fail("%r's __dict__ can be modified" % cls)
+
+        # Modules also disallow __dict__ assignment
+        class Module1(types.ModuleType, Base):
+            pass
+        class Module2(Base, types.ModuleType):
+            pass
+        for ModuleType in Module1, Module2:
+            mod = ModuleType("spam")
+            verify_dict_readonly(mod)
+            mod.__dict__["spam"] = "eggs"
+
+        # Exception's __dict__ can be replaced, but not deleted
+        class Exception1(Exception, Base):
+            pass
+        class Exception2(Base, Exception):
+            pass
+        for ExceptionType in Exception, Exception1, Exception2:
+            e = ExceptionType()
+            e.__dict__ = {"a": 1}
+            self.assertEqual(e.a, 1)
+            try:
+                del e.__dict__
+            except (TypeError, AttributeError):
+                pass
+            else:
+                self.fail("%r's __dict__ can be deleted" % e)
+
+    def test_pickles(self):
+        # Testing pickling and copying new-style classes and objects...
+        import pickle, cPickle
+
+        def sorteditems(d):
+            L = d.items()
+            L.sort()
+            return L
+
+        global C
+        class C(object):
+            def __init__(self, a, b):
+                super(C, self).__init__()
+                self.a = a
+                self.b = b
+            def __repr__(self):
+                return "C(%r, %r)" % (self.a, self.b)
+
+        global C1
+        class C1(list):
+            def __new__(cls, a, b):
+                return super(C1, cls).__new__(cls)
+            def __getnewargs__(self):
+                return (self.a, self.b)
+            def __init__(self, a, b):
+                self.a = a
+                self.b = b
+            def __repr__(self):
+                return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
+
+        global C2
+        class C2(int):
+            def __new__(cls, a, b, val=0):
+                return super(C2, cls).__new__(cls, val)
+            def __getnewargs__(self):
+                return (self.a, self.b, int(self))
+            def __init__(self, a, b, val=0):
+                self.a = a
+                self.b = b
+            def __repr__(self):
+                return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
+
+        global C3
+        class C3(object):
+            def __init__(self, foo):
+                self.foo = foo
+            def __getstate__(self):
+                return self.foo
+            def __setstate__(self, foo):
+                self.foo = foo
+
+        global C4classic, C4
+        class C4classic: # classic
+            pass
+        class C4(C4classic, object): # mixed inheritance
+            pass
+
+        for p in pickle, cPickle:
+            for bin in 0, 1:
+                for cls in C, C1, C2:
+                    s = p.dumps(cls, bin)
+                    cls2 = p.loads(s)
+                    self.assert_(cls2 is cls)
+
+                a = C1(1, 2); a.append(42); a.append(24)
+                b = C2("hello", "world", 42)
+                s = p.dumps((a, b), bin)
+                x, y = p.loads(s)
+                self.assertEqual(x.__class__, a.__class__)
+                self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
+                self.assertEqual(y.__class__, b.__class__)
+                self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
+                self.assertEqual(repr(x), repr(a))
+                self.assertEqual(repr(y), repr(b))
+                # Test for __getstate__ and __setstate__ on new style class
+                u = C3(42)
+                s = p.dumps(u, bin)
+                v = p.loads(s)
+                self.assertEqual(u.__class__, v.__class__)
+                self.assertEqual(u.foo, v.foo)
+                # Test for picklability of hybrid class
+                u = C4()
+                u.foo = 42
+                s = p.dumps(u, bin)
+                v = p.loads(s)
+                self.assertEqual(u.__class__, v.__class__)
+                self.assertEqual(u.foo, v.foo)
+
+        # Testing copy.deepcopy()
+        import copy
+        for cls in C, C1, C2:
+            cls2 = copy.deepcopy(cls)
+            self.assert_(cls2 is cls)
+
+        a = C1(1, 2); a.append(42); a.append(24)
+        b = C2("hello", "world", 42)
+        x, y = copy.deepcopy((a, b))
+        self.assertEqual(x.__class__, a.__class__)
+        self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
+        self.assertEqual(y.__class__, b.__class__)
+        self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
+        self.assertEqual(repr(x), repr(a))
+        self.assertEqual(repr(y), repr(b))
+
+    def test_pickle_slots(self):
+        # Testing pickling of classes with __slots__ ...
+        import pickle, cPickle
+        # Pickling of classes with __slots__ but without __getstate__ should fail
+        global B, C, D, E
+        class B(object):
+            pass
+        for base in [object, B]:
+            class C(base):
+                __slots__ = ['a']
+            class D(C):
+                pass
+            try:
+                pickle.dumps(C())
+            except TypeError:
+                pass
+            else:
+                self.fail("should fail: pickle C instance - %s" % base)
+            try:
+                cPickle.dumps(C())
+            except TypeError:
+                pass
+            else:
+                self.fail("should fail: cPickle C instance - %s" % base)
+            try:
+                pickle.dumps(C())
+            except TypeError:
+                pass
+            else:
+                self.fail("should fail: pickle D instance - %s" % base)
+            try:
+                cPickle.dumps(D())
+            except TypeError:
+                pass
+            else:
+                self.fail("should fail: cPickle D instance - %s" % base)
+            # Give C a nice generic __getstate__ and __setstate__
+            class C(base):
+                __slots__ = ['a']
+                def __getstate__(self):
+                    try:
+                        d = self.__dict__.copy()
+                    except AttributeError:
+                        d = {}
+                    for cls in self.__class__.__mro__:
+                        for sn in cls.__dict__.get('__slots__', ()):
+                            try:
+                                d[sn] = getattr(self, sn)
+                            except AttributeError:
+                                pass
+                    return d
+                def __setstate__(self, d):
+                    for k, v in d.items():
+                        setattr(self, k, v)
+            class D(C):
+                pass
+            # Now it should work
+            x = C()
+            y = pickle.loads(pickle.dumps(x))
+            self.assertEqual(hasattr(y, 'a'), 0)
+            y = cPickle.loads(cPickle.dumps(x))
+            self.assertEqual(hasattr(y, 'a'), 0)
+            x.a = 42
+            y = pickle.loads(pickle.dumps(x))
+            self.assertEqual(y.a, 42)
+            y = cPickle.loads(cPickle.dumps(x))
+            self.assertEqual(y.a, 42)
+            x = D()
+            x.a = 42
+            x.b = 100
+            y = pickle.loads(pickle.dumps(x))
+            self.assertEqual(y.a + y.b, 142)
+            y = cPickle.loads(cPickle.dumps(x))
+            self.assertEqual(y.a + y.b, 142)
+            # A subclass that adds a slot should also work
+            class E(C):
+                __slots__ = ['b']
+            x = E()
+            x.a = 42
+            x.b = "foo"
+            y = pickle.loads(pickle.dumps(x))
+            self.assertEqual(y.a, x.a)
+            self.assertEqual(y.b, x.b)
+            y = cPickle.loads(cPickle.dumps(x))
+            self.assertEqual(y.a, x.a)
+            self.assertEqual(y.b, x.b)
+
+    def test_binary_operator_override(self):
+        # Testing overrides of binary operations...
+        class I(int):
+            def __repr__(self):
+                return "I(%r)" % int(self)
+            def __add__(self, other):
+                return I(int(self) + int(other))
+            __radd__ = __add__
+            def __pow__(self, other, mod=None):
+                if mod is None:
+                    return I(pow(int(self), int(other)))
+                else:
+                    return I(pow(int(self), int(other), int(mod)))
+            def __rpow__(self, other, mod=None):
+                if mod is None:
+                    return I(pow(int(other), int(self), mod))
+                else:
+                    return I(pow(int(other), int(self), int(mod)))
+
+        self.assertEqual(repr(I(1) + I(2)), "I(3)")
+        self.assertEqual(repr(I(1) + 2), "I(3)")
+        self.assertEqual(repr(1 + I(2)), "I(3)")
+        self.assertEqual(repr(I(2) ** I(3)), "I(8)")
+        self.assertEqual(repr(2 ** I(3)), "I(8)")
+        self.assertEqual(repr(I(2) ** 3), "I(8)")
+        self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
+        class S(str):
+            def __eq__(self, other):
+                return self.lower() == other.lower()
+
+    def test_subclass_propagation(self):
+        # Testing propagation of slot functions to subclasses...
+        class A(object):
+            pass
+        class B(A):
+            pass
+        class C(A):
+            pass
+        class D(B, C):
+            pass
+        d = D()
+        orig_hash = hash(d) # related to id(d) in platform-dependent ways
+        A.__hash__ = lambda self: 42
+        self.assertEqual(hash(d), 42)
+        C.__hash__ = lambda self: 314
+        self.assertEqual(hash(d), 314)
+        B.__hash__ = lambda self: 144
+        self.assertEqual(hash(d), 144)
+        D.__hash__ = lambda self: 100
+        self.assertEqual(hash(d), 100)
+        del D.__hash__
+        self.assertEqual(hash(d), 144)
+        del B.__hash__
+        self.assertEqual(hash(d), 314)
+        del C.__hash__
+        self.assertEqual(hash(d), 42)
+        del A.__hash__
+        self.assertEqual(hash(d), orig_hash)
+        d.foo = 42
+        d.bar = 42
+        self.assertEqual(d.foo, 42)
+        self.assertEqual(d.bar, 42)
         def __getattribute__(self, name):
-            log.append(("getattr", name))
-            return MT.__getattribute__(self, name)
-        def __setattr__(self, name, value):
-            log.append(("setattr", name, value))
-            MT.__setattr__(self, name, value)
-        def __delattr__(self, name):
-            log.append(("delattr", name))
-            MT.__delattr__(self, name)
-    a = MM("a")
-    a.foo = 12
-    x = a.foo
-    del a.foo
-    vereq(log, [("setattr", "foo", 12),
-                ("getattr", "foo"),
-                ("delattr", "foo")])
-
-    # http://python.org/sf/1174712
-    try:
-        class Module(types.ModuleType, str):
-            pass
-    except TypeError:
-        pass
-    else:
-        raise TestFailed("inheriting from ModuleType and str at the "
-                          "same time should fail")
-
-def multi():
-    if verbose: print "Testing multiple inheritance..."
-    class C(object):
-        def __init__(self):
-            self.__state = 0
-        def getstate(self):
-            return self.__state
-        def setstate(self, state):
-            self.__state = state
-    a = C()
-    vereq(a.getstate(), 0)
-    a.setstate(10)
-    vereq(a.getstate(), 10)
-    class D(dict, C):
-        def __init__(self):
-            type({}).__init__(self)
-            C.__init__(self)
-    d = D()
-    vereq(d.keys(), [])
-    d["hello"] = "world"
-    vereq(d.items(), [("hello", "world")])
-    vereq(d["hello"], "world")
-    vereq(d.getstate(), 0)
-    d.setstate(10)
-    vereq(d.getstate(), 10)
-    vereq(D.__mro__, (D, dict, C, object))
-
-    # SF bug #442833
-    class Node(object):
-        def __int__(self):
-            return int(self.foo())
-        def foo(self):
-            return "23"
-    class Frag(Node, list):
-        def foo(self):
-            return "42"
-    vereq(Node().__int__(), 23)
-    vereq(int(Node()), 23)
-    vereq(Frag().__int__(), 42)
-    vereq(int(Frag()), 42)
-
-    # MI mixing classic and new-style classes.
-
-    class A:
-        x = 1
-
-    class B(A):
-        pass
-
-    class C(A):
-        x = 2
-
-    class D(B, C):
-        pass
-    vereq(D.x, 1)
-
-    # Classic MRO is preserved for a classic base class.
-    class E(D, object):
-        pass
-    vereq(E.__mro__, (E, D, B, A, C, object))
-    vereq(E.x, 1)
-
-    # But with a mix of classic bases, their MROs are combined using
-    # new-style MRO.
-    class F(B, C, object):
-        pass
-    vereq(F.__mro__, (F, B, C, A, object))
-    vereq(F.x, 2)
-
-    # Try something else.
-    class C:
-        def cmethod(self):
-            return "C a"
-        def all_method(self):
-            return "C b"
-
-    class M1(C, object):
-        def m1method(self):
-            return "M1 a"
-        def all_method(self):
-            return "M1 b"
-
-    vereq(M1.__mro__, (M1, C, object))
-    m = M1()
-    vereq(m.cmethod(), "C a")
-    vereq(m.m1method(), "M1 a")
-    vereq(m.all_method(), "M1 b")
-
-    class D(C):
-        def dmethod(self):
-            return "D a"
-        def all_method(self):
-            return "D b"
-
-    class M2(D, object):
-        def m2method(self):
-            return "M2 a"
-        def all_method(self):
-            return "M2 b"
-
-    vereq(M2.__mro__, (M2, D, C, object))
-    m = M2()
-    vereq(m.cmethod(), "C a")
-    vereq(m.dmethod(), "D a")
-    vereq(m.m2method(), "M2 a")
-    vereq(m.all_method(), "M2 b")
-
-    class M3(M1, M2, object):
-        def m3method(self):
-            return "M3 a"
-        def all_method(self):
-            return "M3 b"
-    vereq(M3.__mro__, (M3, M1, M2, D, C, object))
-    m = M3()
-    vereq(m.cmethod(), "C a")
-    vereq(m.dmethod(), "D a")
-    vereq(m.m1method(), "M1 a")
-    vereq(m.m2method(), "M2 a")
-    vereq(m.m3method(), "M3 a")
-    vereq(m.all_method(), "M3 b")
-
-    class Classic:
-        pass
-    try:
-        class New(Classic):
-            __metaclass__ = type
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "new class with only classic bases - shouldn't be"
-
-def diamond():
-    if verbose: print "Testing multiple inheritance special cases..."
-    class A(object):
-        def spam(self): return "A"
-    vereq(A().spam(), "A")
-    class B(A):
-        def boo(self): return "B"
-        def spam(self): return "B"
-    vereq(B().spam(), "B")
-    vereq(B().boo(), "B")
-    class C(A):
-        def boo(self): return "C"
-    vereq(C().spam(), "A")
-    vereq(C().boo(), "C")
-    class D(B, C): pass
-    vereq(D().spam(), "B")
-    vereq(D().boo(), "B")
-    vereq(D.__mro__, (D, B, C, A, object))
-    class E(C, B): pass
-    vereq(E().spam(), "B")
-    vereq(E().boo(), "C")
-    vereq(E.__mro__, (E, C, B, A, object))
-    # MRO order disagreement
-    try:
-        class F(D, E): pass
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "expected MRO order disagreement (F)"
-    try:
-        class G(E, D): pass
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "expected MRO order disagreement (G)"
-
-
-# see thread python-dev/2002-October/029035.html
-def ex5():
-    if verbose: print "Testing ex5 from C3 switch discussion..."
-    class A(object): pass
-    class B(object): pass
-    class C(object): pass
-    class X(A): pass
-    class Y(A): pass
-    class Z(X,B,Y,C): pass
-    vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
-
-# see "A Monotonic Superclass Linearization for Dylan",
-# by Kim Barrett et al. (OOPSLA 1996)
-def monotonicity():
-    if verbose: print "Testing MRO monotonicity..."
-    class Boat(object): pass
-    class DayBoat(Boat): pass
-    class WheelBoat(Boat): pass
-    class EngineLess(DayBoat): pass
-    class SmallMultihull(DayBoat): pass
-    class PedalWheelBoat(EngineLess,WheelBoat): pass
-    class SmallCatamaran(SmallMultihull): pass
-    class Pedalo(PedalWheelBoat,SmallCatamaran): pass
-
-    vereq(PedalWheelBoat.__mro__,
-          (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
-           object))
-    vereq(SmallCatamaran.__mro__,
-          (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
-
-    vereq(Pedalo.__mro__,
-          (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
-           SmallMultihull, DayBoat, WheelBoat, Boat, object))
-
-# see "A Monotonic Superclass Linearization for Dylan",
-# by Kim Barrett et al. (OOPSLA 1996)
-def consistency_with_epg():
-    if verbose: print "Testing consistentcy with EPG..."
-    class Pane(object): pass
-    class ScrollingMixin(object): pass
-    class EditingMixin(object): pass
-    class ScrollablePane(Pane,ScrollingMixin): pass
-    class EditablePane(Pane,EditingMixin): pass
-    class EditableScrollablePane(ScrollablePane,EditablePane): pass
-
-    vereq(EditableScrollablePane.__mro__,
-          (EditableScrollablePane, ScrollablePane, EditablePane,
-           Pane, ScrollingMixin, EditingMixin, object))
+            if name == "foo":
+                return 24
+            return object.__getattribute__(self, name)
+        A.__getattribute__ = __getattribute__
+        self.assertEqual(d.foo, 24)
+        self.assertEqual(d.bar, 42)
+        def __getattr__(self, name):
+            if name in ("spam", "foo", "bar"):
+                return "hello"
+            raise AttributeError, name
+        B.__getattr__ = __getattr__
+        self.assertEqual(d.spam, "hello")
+        self.assertEqual(d.foo, 24)
+        self.assertEqual(d.bar, 42)
+        del A.__getattribute__
+        self.assertEqual(d.foo, 42)
+        del d.foo
+        self.assertEqual(d.foo, "hello")
+        self.assertEqual(d.bar, 42)
+        del B.__getattr__
+        try:
+            d.foo
+        except AttributeError:
+            pass
+        else:
+            self.fail("d.foo should be undefined now")
+
+        # Test a nasty bug in recurse_down_subclasses()
+        import gc
+        class A(object):
+            pass
+        class B(A):
+            pass
+        del B
+        gc.collect()
+        A.__setitem__ = lambda *a: None # crash
+
+    def test_buffer_inheritance(self):
+        # Testing that buffer interface is inherited ...
+
+        import binascii
+        # SF bug [#470040] ParseTuple t# vs subclasses.
+
+        class MyStr(str):
+            pass
+        base = 'abc'
+        m = MyStr(base)
+        # b2a_hex uses the buffer interface to get its argument's value, via
+        # PyArg_ParseTuple 't#' code.
+        self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
+
+        # It's not clear that unicode will continue to support the character
+        # buffer interface, and this test will fail if that's taken away.
+        class MyUni(unicode):
+            pass
+        base = u'abc'
+        m = MyUni(base)
+        self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
+
+        class MyInt(int):
+            pass
+        m = MyInt(42)
+        try:
+            binascii.b2a_hex(m)
+            self.fail('subclass of int should not have a buffer interface')
+        except TypeError:
+            pass
 
-mro_err_msg = """Cannot create a consistent method resolution
-order (MRO) for bases """
+    def test_str_of_str_subclass(self):
+        # Testing __str__ defined in subclass of str ...
+        import binascii
+        import cStringIO
+
+        class octetstring(str):
+            def __str__(self):
+                return binascii.b2a_hex(self)
+            def __repr__(self):
+                return self + " repr"
+
+        o = octetstring('A')
+        self.assertEqual(type(o), octetstring)
+        self.assertEqual(type(str(o)), str)
+        self.assertEqual(type(repr(o)), str)
+        self.assertEqual(ord(o), 0x41)
+        self.assertEqual(str(o), '41')
+        self.assertEqual(repr(o), 'A repr')
+        self.assertEqual(o.__str__(), '41')
+        self.assertEqual(o.__repr__(), 'A repr')
+
+        capture = cStringIO.StringIO()
+        # Calling str() or not exercises different internal paths.
+        print >> capture, o
+        print >> capture, str(o)
+        self.assertEqual(capture.getvalue(), '41\n41\n')
+        capture.close()
+
+    def test_keyword_arguments(self):
+        # Testing keyword arguments to __init__, __call__...
+        def f(a): return a
+        self.assertEqual(f.__call__(a=42), 42)
+        a = []
+        list.__init__(a, sequence=[0, 1, 2])
+        self.assertEqual(a, [0, 1, 2])
+
+    def test_recursive_call(self):
+        # Testing recursive __call__() by setting to instance of class...
+        class A(object):
+            pass
 
-def mro_disagreement():
-    if verbose: print "Testing error messages for MRO disagreement..."
-    def raises(exc, expected, callable, *args):
-        try:
-            callable(*args)
-        except exc, msg:
-            if not str(msg).startswith(expected):
-                raise TestFailed, "Message %r, expected %r" % (str(msg),
-                                                               expected)
-        else:
-            raise TestFailed, "Expected %s" % exc
-    class A(object): pass
-    class B(A): pass
-    class C(object): pass
-    # Test some very simple errors
-    raises(TypeError, "duplicate base class A",
-           type, "X", (A, A), {})
-    raises(TypeError, mro_err_msg,
-           type, "X", (A, B), {})
-    raises(TypeError, mro_err_msg,
-           type, "X", (A, C, B), {})
-    # Test a slightly more complex error
-    class GridLayout(object): pass
-    class HorizontalGrid(GridLayout): pass
-    class VerticalGrid(GridLayout): pass
-    class HVGrid(HorizontalGrid, VerticalGrid): pass
-    class VHGrid(VerticalGrid, HorizontalGrid): pass
-    raises(TypeError, mro_err_msg,
-           type, "ConfusedGrid", (HVGrid, VHGrid), {})
-
-def objects():
-    if verbose: print "Testing object class..."
-    a = object()
-    vereq(a.__class__, object)
-    vereq(type(a), object)
-    b = object()
-    verify(a is not b)
-    verify(not hasattr(a, "foo"))
-    try:
-        a.foo = 12
-    except (AttributeError, TypeError):
-        pass
-    else:
-        verify(0, "object() should not allow setting a foo attribute")
-    verify(not hasattr(object(), "__dict__"))
-
-    class Cdict(object):
-        pass
-    x = Cdict()
-    vereq(x.__dict__, {})
-    x.foo = 1
-    vereq(x.foo, 1)
-    vereq(x.__dict__, {'foo': 1})
-
-def slots():
-    if verbose: print "Testing __slots__..."
-    class C0(object):
-        __slots__ = []
-    x = C0()
-    verify(not hasattr(x, "__dict__"))
-    verify(not hasattr(x, "foo"))
-
-    class C1(object):
-        __slots__ = ['a']
-    x = C1()
-    verify(not hasattr(x, "__dict__"))
-    verify(not hasattr(x, "a"))
-    x.a = 1
-    vereq(x.a, 1)
-    x.a = None
-    veris(x.a, None)
-    del x.a
-    verify(not hasattr(x, "a"))
-
-    class C3(object):
-        __slots__ = ['a', 'b', 'c']
-    x = C3()
-    verify(not hasattr(x, "__dict__"))
-    verify(not hasattr(x, 'a'))
-    verify(not hasattr(x, 'b'))
-    verify(not hasattr(x, 'c'))
-    x.a = 1
-    x.b = 2
-    x.c = 3
-    vereq(x.a, 1)
-    vereq(x.b, 2)
-    vereq(x.c, 3)
-
-    class C4(object):
-        """Validate name mangling"""
-        __slots__ = ['__a']
-        def __init__(self, value):
-            self.__a = value
-        def get(self):
-            return self.__a
-    x = C4(5)
-    verify(not hasattr(x, '__dict__'))
-    verify(not hasattr(x, '__a'))
-    vereq(x.get(), 5)
-    try:
-        x.__a = 6
-    except AttributeError:
-        pass
-    else:
-        raise TestFailed, "Double underscored names not mangled"
+        A.__call__ = A()
+        try:
+            A()()
+        except RuntimeError:
+            pass
+        else:
+            self.fail("Recursion limit should have been reached for __call__()")
 
-    # Make sure slot names are proper identifiers
-    try:
-        class C(object):
-            __slots__ = [None]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "[None] slots not caught"
-    try:
-        class C(object):
-            __slots__ = ["foo bar"]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "['foo bar'] slots not caught"
-    try:
+    def test_delete_hook(self):
+        # Testing __del__ hook...
+        log = []
         class C(object):
-            __slots__ = ["foo\0bar"]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "['foo\\0bar'] slots not caught"
-    try:
-        class C(object):
-            __slots__ = ["1"]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "['1'] slots not caught"
-    try:
-        class C(object):
-            __slots__ = [""]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "[''] slots not caught"
-    class C(object):
-        __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
-    # XXX(nnorwitz): was there supposed to be something tested
-    # from the class above?
-
-    # Test a single string is not expanded as a sequence.
-    class C(object):
-        __slots__ = "abc"
-    c = C()
-    c.abc = 5
-    vereq(c.abc, 5)
-
-    # Test unicode slot names
-    try:
-        unicode
-    except NameError:
-        pass
-    else:
-        # Test a single unicode string is not expanded as a sequence.
-        class C(object):
-            __slots__ = unicode("abc")
+            def __del__(self):
+                log.append(1)
         c = C()
-        c.abc = 5
-        vereq(c.abc, 5)
+        self.assertEqual(log, [])
+        del c
+        self.assertEqual(log, [1])
+
+        class D(object): pass
+        d = D()
+        try: del d[0]
+        except TypeError: pass
+        else: self.fail("invalid del() didn't raise TypeError")
 
-        # _unicode_to_string used to modify slots in certain circumstances
-        slots = (unicode("foo"), unicode("bar"))
-        class C(object):
-            __slots__ = slots
-        x = C()
-        x.foo = 5
-        vereq(x.foo, 5)
-        veris(type(slots[0]), unicode)
-        # this used to leak references
+    def test_hash_inheritance(self):
+        # Testing hash of mutable subclasses...
+
+        class mydict(dict):
+            pass
+        d = mydict()
         try:
-            class C(object):
-                __slots__ = [unichr(128)]
-        except (TypeError, UnicodeEncodeError):
+            hash(d)
+        except TypeError:
             pass
         else:
-            raise TestFailed, "[unichr(128)] slots not caught"
+            self.fail("hash() of dict subclass should fail")
 
-    # Test leaks
-    class Counted(object):
-        counter = 0    # counts the number of instances alive
-        def __init__(self):
-            Counted.counter += 1
-        def __del__(self):
-            Counted.counter -= 1
-    class C(object):
-        __slots__ = ['a', 'b', 'c']
-    x = C()
-    x.a = Counted()
-    x.b = Counted()
-    x.c = Counted()
-    vereq(Counted.counter, 3)
-    del x
-    vereq(Counted.counter, 0)
-    class D(C):
-        pass
-    x = D()
-    x.a = Counted()
-    x.z = Counted()
-    vereq(Counted.counter, 2)
-    del x
-    vereq(Counted.counter, 0)
-    class E(D):
-        __slots__ = ['e']
-    x = E()
-    x.a = Counted()
-    x.z = Counted()
-    x.e = Counted()
-    vereq(Counted.counter, 3)
-    del x
-    vereq(Counted.counter, 0)
-
-    # Test cyclical leaks [SF bug 519621]
-    class F(object):
-        __slots__ = ['a', 'b']
-    log = []
-    s = F()
-    s.a = [Counted(), s]
-    vereq(Counted.counter, 1)
-    s = None
-    import gc
-    gc.collect()
-    vereq(Counted.counter, 0)
-
-    # Test lookup leaks [SF bug 572567]
-    import sys,gc
-    class G(object):
-        def __cmp__(self, other):
-            return 0
-    g = G()
-    orig_objects = len(gc.get_objects())
-    for i in xrange(10):
-        g==g
-    new_objects = len(gc.get_objects())
-    vereq(orig_objects, new_objects)
-    class H(object):
-        __slots__ = ['a', 'b']
-        def __init__(self):
-            self.a = 1
-            self.b = 2
-        def __del__(self):
-            assert self.a == 1
-            assert self.b == 2
-
-    save_stderr = sys.stderr
-    sys.stderr = sys.stdout
-    h = H()
-    try:
-        del h
-    finally:
-        sys.stderr = save_stderr
-
-def slotspecials():
-    if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
-
-    class D(object):
-        __slots__ = ["__dict__"]
-    a = D()
-    verify(hasattr(a, "__dict__"))
-    verify(not hasattr(a, "__weakref__"))
-    a.foo = 42
-    vereq(a.__dict__, {"foo": 42})
-
-    class W(object):
-        __slots__ = ["__weakref__"]
-    a = W()
-    verify(hasattr(a, "__weakref__"))
-    verify(not hasattr(a, "__dict__"))
-    try:
-        a.foo = 42
-    except AttributeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be allowed to set a.foo"
-
-    class C1(W, D):
-        __slots__ = []
-    a = C1()
-    verify(hasattr(a, "__dict__"))
-    verify(hasattr(a, "__weakref__"))
-    a.foo = 42
-    vereq(a.__dict__, {"foo": 42})
-
-    class C2(D, W):
-        __slots__ = []
-    a = C2()
-    verify(hasattr(a, "__dict__"))
-    verify(hasattr(a, "__weakref__"))
-    a.foo = 42
-    vereq(a.__dict__, {"foo": 42})
-
-# MRO order disagreement
-#
-#    class C3(C1, C2):
-#        __slots__ = []
-#
-#    class C4(C2, C1):
-#        __slots__ = []
-
-def dynamics():
-    if verbose: print "Testing class attribute propagation..."
-    class D(object):
-        pass
-    class E(D):
-        pass
-    class F(D):
-        pass
-    D.foo = 1
-    vereq(D.foo, 1)
-    # Test that dynamic attributes are inherited
-    vereq(E.foo, 1)
-    vereq(F.foo, 1)
-    # Test dynamic instances
-    class C(object):
-        pass
-    a = C()
-    verify(not hasattr(a, "foobar"))
-    C.foobar = 2
-    vereq(a.foobar, 2)
-    C.method = lambda self: 42
-    vereq(a.method(), 42)
-    C.__repr__ = lambda self: "C()"
-    vereq(repr(a), "C()")
-    C.__int__ = lambda self: 100
-    vereq(int(a), 100)
-    vereq(a.foobar, 2)
-    verify(not hasattr(a, "spam"))
-    def mygetattr(self, name):
-        if name == "spam":
-            return "spam"
-        raise AttributeError
-    C.__getattr__ = mygetattr
-    vereq(a.spam, "spam")
-    a.new = 12
-    vereq(a.new, 12)
-    def mysetattr(self, name, value):
-        if name == "spam":
-            raise AttributeError
-        return object.__setattr__(self, name, value)
-    C.__setattr__ = mysetattr
-    try:
-        a.spam = "not spam"
-    except AttributeError:
-        pass
-    else:
-        verify(0, "expected AttributeError")
-    vereq(a.spam, "spam")
-    class D(C):
-        pass
-    d = D()
-    d.foo = 1
-    vereq(d.foo, 1)
-
-    # Test handling of int*seq and seq*int
-    class I(int):
-        pass
-    vereq("a"*I(2), "aa")
-    vereq(I(2)*"a", "aa")
-    vereq(2*I(3), 6)
-    vereq(I(3)*2, 6)
-    vereq(I(3)*I(2), 6)
-
-    # Test handling of long*seq and seq*long
-    class L(long):
-        pass
-    vereq("a"*L(2L), "aa")
-    vereq(L(2L)*"a", "aa")
-    vereq(2*L(3), 6)
-    vereq(L(3)*2, 6)
-    vereq(L(3)*L(2), 6)
-
-    # Test comparison of classes with dynamic metaclasses
-    class dynamicmetaclass(type):
-        pass
-    class someclass:
-        __metaclass__ = dynamicmetaclass
-    verify(someclass != object)
-
-def errors():
-    if verbose: print "Testing errors..."
-
-    try:
-        class C(list, dict):
-            pass
-    except TypeError:
-        pass
-    else:
-        verify(0, "inheritance from both list and dict should be illegal")
-
-    try:
-        class C(object, None):
-            pass
-    except TypeError:
-        pass
-    else:
-        verify(0, "inheritance from non-type should be illegal")
-    class Classic:
-        pass
-
-    try:
-        class C(type(len)):
-            pass
-    except TypeError:
-        pass
-    else:
-        verify(0, "inheritance from CFunction should be illegal")
+        class mylist(list):
+            pass
+        d = mylist()
+        try:
+            hash(d)
+        except TypeError:
+            pass
+        else:
+            self.fail("hash() of list subclass should fail")
 
-    try:
-        class C(object):
-            __slots__ = 1
-    except TypeError:
-        pass
-    else:
-        verify(0, "__slots__ = 1 should be illegal")
+    def test_str_operations(self):
+        try: 'a' + 5
+        except TypeError: pass
+        else: self.fail("'' + 5 doesn't raise TypeError")
+
+        try: ''.split('')
+        except ValueError: pass
+        else: self.fail("''.split('') doesn't raise ValueError")
+
+        try: ''.join([0])
+        except TypeError: pass
+        else: self.fail("''.join([0]) doesn't raise TypeError")
+
+        try: ''.rindex('5')
+        except ValueError: pass
+        else: self.fail("''.rindex('5') doesn't raise ValueError")
+
+        try: '%(n)s' % None
+        except TypeError: pass
+        else: self.fail("'%(n)s' % None doesn't raise TypeError")
+
+        try: '%(n' % {}
+        except ValueError: pass
+        else: self.fail("'%(n' % {} '' doesn't raise ValueError")
+
+        try: '%*s' % ('abc')
+        except TypeError: pass
+        else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
+
+        try: '%*.*s' % ('abc', 5)
+        except TypeError: pass
+        else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
+
+        try: '%s' % (1, 2)
+        except TypeError: pass
+        else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
+
+        try: '%' % None
+        except ValueError: pass
+        else: self.fail("'%' % None doesn't raise ValueError")
+
+        self.assertEqual('534253'.isdigit(), 1)
+        self.assertEqual('534253x'.isdigit(), 0)
+        self.assertEqual('%c' % 5, '\x05')
+        self.assertEqual('%c' % '5', '5')
+
+    def test_deepcopy_recursive(self):
+        # Testing deepcopy of recursive objects...
+        class Node:
+            pass
+        a = Node()
+        b = Node()
+        a.b = b
+        b.a = a
+        z = deepcopy(a) # This blew up before
+
+    def test_unintialized_modules(self):
+        # Testing uninitialized module objects...
+        from types import ModuleType as M
+        m = M.__new__(M)
+        str(m)
+        self.assertEqual(hasattr(m, "__name__"), 0)
+        self.assertEqual(hasattr(m, "__file__"), 0)
+        self.assertEqual(hasattr(m, "foo"), 0)
+        self.assertEqual(m.__dict__, None)
+        m.foo = 1
+        self.assertEqual(m.__dict__, {"foo": 1})
 
-    try:
+    def test_funny_new(self):
+        # Testing __new__ returning something unexpected...
         class C(object):
-            __slots__ = [1]
-    except TypeError:
-        pass
-    else:
-        verify(0, "__slots__ = [1] should be illegal")
-
-    class M1(type):
-        pass
-    class M2(type):
-        pass
-    class A1(object):
-        __metaclass__ = M1
-    class A2(object):
-        __metaclass__ = M2
-    try:
-        class B(A1, A2):
-            pass
-    except TypeError:
-        pass
-    else:
-        verify(0, "finding the most derived metaclass should have failed")
-
-def classmethods():
-    if verbose: print "Testing class methods..."
-    class C(object):
-        def foo(*a): return a
-        goo = classmethod(foo)
-    c = C()
-    vereq(C.goo(1), (C, 1))
-    vereq(c.goo(1), (C, 1))
-    vereq(c.foo(1), (c, 1))
-    class D(C):
-        pass
-    d = D()
-    vereq(D.goo(1), (D, 1))
-    vereq(d.goo(1), (D, 1))
-    vereq(d.foo(1), (d, 1))
-    vereq(D.foo(d, 1), (d, 1))
-    # Test for a specific crash (SF bug 528132)
-    def f(cls, arg): return (cls, arg)
-    ff = classmethod(f)
-    vereq(ff.__get__(0, int)(42), (int, 42))
-    vereq(ff.__get__(0)(42), (int, 42))
-
-    # Test super() with classmethods (SF bug 535444)
-    veris(C.goo.im_self, C)
-    veris(D.goo.im_self, D)
-    veris(super(D,D).goo.im_self, D)
-    veris(super(D,d).goo.im_self, D)
-    vereq(super(D,D).goo(), (D,))
-    vereq(super(D,d).goo(), (D,))
-
-    # Verify that argument is checked for callability (SF bug 753451)
-    try:
-        classmethod(1).__get__(1)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "classmethod should check for callability"
-
-    # Verify that classmethod() doesn't allow keyword args
-    try:
-        classmethod(f, kw=1)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "classmethod shouldn't accept keyword args"
-
-def classmethods_in_c():
-    if verbose: print "Testing C-based class methods..."
-    import xxsubtype as spam
-    a = (1, 2, 3)
-    d = {'abc': 123}
-    x, a1, d1 = spam.spamlist.classmeth(*a, **d)
-    veris(x, spam.spamlist)
-    vereq(a, a1)
-    vereq(d, d1)
-    x, a1, d1 = spam.spamlist().classmeth(*a, **d)
-    veris(x, spam.spamlist)
-    vereq(a, a1)
-    vereq(d, d1)
-
-def staticmethods():
-    if verbose: print "Testing static methods..."
-    class C(object):
-        def foo(*a): return a
-        goo = staticmethod(foo)
-    c = C()
-    vereq(C.goo(1), (1,))
-    vereq(c.goo(1), (1,))
-    vereq(c.foo(1), (c, 1,))
-    class D(C):
-        pass
-    d = D()
-    vereq(D.goo(1), (1,))
-    vereq(d.goo(1), (1,))
-    vereq(d.foo(1), (d, 1))
-    vereq(D.foo(d, 1), (d, 1))
-
-def staticmethods_in_c():
-    if verbose: print "Testing C-based static methods..."
-    import xxsubtype as spam
-    a = (1, 2, 3)
-    d = {"abc": 123}
-    x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
-    veris(x, None)
-    vereq(a, a1)
-    vereq(d, d1)
-    x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
-    veris(x, None)
-    vereq(a, a1)
-    vereq(d, d1)
-
-def classic():
-    if verbose: print "Testing classic classes..."
-    class C:
-        def foo(*a): return a
-        goo = classmethod(foo)
-    c = C()
-    vereq(C.goo(1), (C, 1))
-    vereq(c.goo(1), (C, 1))
-    vereq(c.foo(1), (c, 1))
-    class D(C):
-        pass
-    d = D()
-    vereq(D.goo(1), (D, 1))
-    vereq(d.goo(1), (D, 1))
-    vereq(d.foo(1), (d, 1))
-    vereq(D.foo(d, 1), (d, 1))
-    class E: # *not* subclassing from C
-        foo = C.foo
-    vereq(E().foo, C.foo) # i.e., unbound
-    verify(repr(C.foo.__get__(C())).startswith("<bound method "))
-
-def compattr():
-    if verbose: print "Testing computed attributes..."
-    class C(object):
-        class computed_attribute(object):
-            def __init__(self, get, set=None, delete=None):
-                self.__get = get
-                self.__set = set
-                self.__delete = delete
-            def __get__(self, obj, type=None):
-                return self.__get(obj)
-            def __set__(self, obj, value):
-                return self.__set(obj, value)
-            def __delete__(self, obj):
-                return self.__delete(obj)
-        def __init__(self):
-            self.__x = 0
-        def __get_x(self):
-            x = self.__x
-            self.__x = x+1
-            return x
-        def __set_x(self, x):
-            self.__x = x
-        def __delete_x(self):
-            del self.__x
-        x = computed_attribute(__get_x, __set_x, __delete_x)
-    a = C()
-    vereq(a.x, 0)
-    vereq(a.x, 1)
-    a.x = 10
-    vereq(a.x, 10)
-    vereq(a.x, 11)
-    del a.x
-    vereq(hasattr(a, 'x'), 0)
-
-def newslot():
-    if verbose: print "Testing __new__ slot override..."
-    class C(list):
-        def __new__(cls):
-            self = list.__new__(cls)
-            self.foo = 1
-            return self
-        def __init__(self):
-            self.foo = self.foo + 2
-    a = C()
-    vereq(a.foo, 3)
-    verify(a.__class__ is C)
-    class D(C):
-        pass
-    b = D()
-    vereq(b.foo, 3)
-    verify(b.__class__ is D)
-
-def altmro():
-    if verbose: print "Testing mro() and overriding it..."
-    class A(object):
-        def f(self): return "A"
-    class B(A):
-        pass
-    class C(A):
-        def f(self): return "C"
-    class D(B, C):
-        pass
-    vereq(D.mro(), [D, B, C, A, object])
-    vereq(D.__mro__, (D, B, C, A, object))
-    vereq(D().f(), "C")
-
-    class PerverseMetaType(type):
-        def mro(cls):
-            L = type.mro(cls)
-            L.reverse()
-            return L
-    class X(D,B,C,A):
-        __metaclass__ = PerverseMetaType
-    vereq(X.__mro__, (object, A, C, B, D, X))
-    vereq(X().f(), "A")
-
-    try:
-        class X(object):
-            class __metaclass__(type):
-                def mro(self):
-                    return [self, dict, object]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "devious mro() return not caught"
+            def __new__(cls, arg):
+                if isinstance(arg, str): return [1, 2, 3]
+                elif isinstance(arg, int): return object.__new__(D)
+                else: return object.__new__(cls)
+        class D(C):
+            def __init__(self, arg):
+                self.foo = arg
+        self.assertEqual(C("1"), [1, 2, 3])
+        self.assertEqual(D("1"), [1, 2, 3])
+        d = D(None)
+        self.assertEqual(d.foo, None)
+        d = C(1)
+        self.assertEqual(isinstance(d, D), True)
+        self.assertEqual(d.foo, 1)
+        d = D(1)
+        self.assertEqual(isinstance(d, D), True)
+        self.assertEqual(d.foo, 1)
+
+    def test_imul_bug(self):
+        # Testing for __imul__ problems...
+        # SF bug 544647
+        class C(object):
+            def __imul__(self, other):
+                return (self, other)
+        x = C()
+        y = x
+        y *= 1.0
+        self.assertEqual(y, (x, 1.0))
+        y = x
+        y *= 2
+        self.assertEqual(y, (x, 2))
+        y = x
+        y *= 3L
+        self.assertEqual(y, (x, 3L))
+        y = x
+        y *= 1L<<100
+        self.assertEqual(y, (x, 1L<<100))
+        y = x
+        y *= None
+        self.assertEqual(y, (x, None))
+        y = x
+        y *= "foo"
+        self.assertEqual(y, (x, "foo"))
+
+    def test_copy_setstate(self):
+        # Testing that copy.*copy() correctly uses __setstate__...
+        import copy
+        class C(object):
+            def __init__(self, foo=None):
+                self.foo = foo
+                self.__foo = foo
+            def setfoo(self, foo=None):
+                self.foo = foo
+            def getfoo(self):
+                return self.__foo
+            def __getstate__(self):
+                return [self.foo]
+            def __setstate__(self_, lst):
+                self.assertEqual(len(lst), 1)
+                self_.__foo = self_.foo = lst[0]
+        a = C(42)
+        a.setfoo(24)
+        self.assertEqual(a.foo, 24)
+        self.assertEqual(a.getfoo(), 42)
+        b = copy.copy(a)
+        self.assertEqual(b.foo, 24)
+        self.assertEqual(b.getfoo(), 24)
+        b = copy.deepcopy(a)
+        self.assertEqual(b.foo, 24)
+        self.assertEqual(b.getfoo(), 24)
+
+    def test_slices(self):
+        # Testing cases with slices and overridden __getitem__ ...
+
+        # Strings
+        self.assertEqual("hello"[:4], "hell")
+        self.assertEqual("hello"[slice(4)], "hell")
+        self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
+        class S(str):
+            def __getitem__(self, x):
+                return str.__getitem__(self, x)
+        self.assertEqual(S("hello")[:4], "hell")
+        self.assertEqual(S("hello")[slice(4)], "hell")
+        self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
+        # Tuples
+        self.assertEqual((1,2,3)[:2], (1,2))
+        self.assertEqual((1,2,3)[slice(2)], (1,2))
+        self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
+        class T(tuple):
+            def __getitem__(self, x):
+                return tuple.__getitem__(self, x)
+        self.assertEqual(T((1,2,3))[:2], (1,2))
+        self.assertEqual(T((1,2,3))[slice(2)], (1,2))
+        self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
+        # Lists
+        self.assertEqual([1,2,3][:2], [1,2])
+        self.assertEqual([1,2,3][slice(2)], [1,2])
+        self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
+        class L(list):
+            def __getitem__(self, x):
+                return list.__getitem__(self, x)
+        self.assertEqual(L([1,2,3])[:2], [1,2])
+        self.assertEqual(L([1,2,3])[slice(2)], [1,2])
+        self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
+        # Now do lists and __setitem__
+        a = L([1,2,3])
+        a[slice(1, 3)] = [3,2]
+        self.assertEqual(a, [1,3,2])
+        a[slice(0, 2, 1)] = [3,1]
+        self.assertEqual(a, [3,1,2])
+        a.__setitem__(slice(1, 3), [2,1])
+        self.assertEqual(a, [3,2,1])
+        a.__setitem__(slice(0, 2, 1), [2,3])
+        self.assertEqual(a, [2,3,1])
 
-    try:
-        class X(object):
-            class __metaclass__(type):
-                def mro(self):
-                    return [1]
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "non-class mro() return not caught"
+    def test_subtype_resurrection(self):
+        # Testing resurrection of new-style instance...
 
-    try:
-        class X(object):
-            class __metaclass__(type):
-                def mro(self):
-                    return 1
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "non-sequence mro() return not caught"
+        class C(object):
+            container = []
 
+            def __del__(self):
+                # resurrect the instance
+                C.container.append(self)
 
-def overloading():
-    if verbose: print "Testing operator overloading..."
+        c = C()
+        c.attr = 42
 
-    class B(object):
-        "Intermediate class because object doesn't have a __setattr__"
+        # The most interesting thing here is whether this blows up, due to flawed
+        # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
+        del c
+
+        # If that didn't blow up, it's also interesting to see whether clearing
+        # the last container slot works:  that will attempt to delete c again,
+        # which will cause c to get appended back to the container again "during"
+        # the del.
+        del C.container[-1]
+        self.assertEqual(len(C.container), 1)
+        self.assertEqual(C.container[-1].attr, 42)
+
+        # Make c mortal again, so that the test framework with -l doesn't report
+        # it as a leak.
+        del C.__del__
+
+    def test_slots_trash(self):
+        # Testing slot trash...
+        # Deallocating deeply nested slotted trash caused stack overflows
+        class trash(object):
+            __slots__ = ['x']
+            def __init__(self, x):
+                self.x = x
+        o = None
+        for i in xrange(50000):
+            o = trash(o)
+        del o
+
+    def test_slots_multiple_inheritance(self):
+        # SF bug 575229, multiple inheritance w/ slots dumps core
+        class A(object):
+            __slots__=()
+        class B(object):
+            pass
+        class C(A,B) :
+            __slots__=()
+        self.assertEqual(C.__basicsize__, B.__basicsize__)
+        self.assert_(hasattr(C, '__dict__'))
+        self.assert_(hasattr(C, '__weakref__'))
+        C().x = 2
+
+    def test_rmul(self):
+        # Testing correct invocation of __rmul__...
+        # SF patch 592646
+        class C(object):
+            def __mul__(self, other):
+                return "mul"
+            def __rmul__(self, other):
+                return "rmul"
+        a = C()
+        self.assertEqual(a*2, "mul")
+        self.assertEqual(a*2.2, "mul")
+        self.assertEqual(2*a, "rmul")
+        self.assertEqual(2.2*a, "rmul")
+
+    def test_ipow(self):
+        # Testing correct invocation of __ipow__...
+        # [SF bug 620179]
+        class C(object):
+            def __ipow__(self, other):
+                pass
+        a = C()
+        a **= 2
 
-    class C(B):
+    def test_mutable_bases(self):
+        # Testing mutable bases...
 
-        def __getattr__(self, name):
-            if name == "foo":
-                return ("getattr", name)
-            else:
-                raise AttributeError
-        def __setattr__(self, name, value):
-            if name == "foo":
-                self.setattr = (name, value)
-            else:
-                return B.__setattr__(self, name, value)
-        def __delattr__(self, name):
-            if name == "foo":
-                self.delattr = name
-            else:
-                return B.__delattr__(self, name)
+        # stuff that should work:
+        class C(object):
+            pass
+        class C2(object):
+            def __getattribute__(self, attr):
+                if attr == 'a':
+                    return 2
+                else:
+                    return super(C2, self).__getattribute__(attr)
+            def meth(self):
+                return 1
+        class D(C):
+            pass
+        class E(D):
+            pass
+        d = D()
+        e = E()
+        D.__bases__ = (C,)
+        D.__bases__ = (C2,)
+        self.assertEqual(d.meth(), 1)
+        self.assertEqual(e.meth(), 1)
+        self.assertEqual(d.a, 2)
+        self.assertEqual(e.a, 2)
+        self.assertEqual(C2.__subclasses__(), [D])
 
-        def __getitem__(self, key):
-            return ("getitem", key)
-        def __setitem__(self, key, value):
-            self.setitem = (key, value)
-        def __delitem__(self, key):
-            self.delitem = key
-
-        def __getslice__(self, i, j):
-            return ("getslice", i, j)
-        def __setslice__(self, i, j, value):
-            self.setslice = (i, j, value)
-        def __delslice__(self, i, j):
-            self.delslice = (i, j)
-
-    a = C()
-    vereq(a.foo, ("getattr", "foo"))
-    a.foo = 12
-    vereq(a.setattr, ("foo", 12))
-    del a.foo
-    vereq(a.delattr, "foo")
-
-    vereq(a[12], ("getitem", 12))
-    a[12] = 21
-    vereq(a.setitem, (12, 21))
-    del a[12]
-    vereq(a.delitem, 12)
-
-    vereq(a[0:10], ("getslice", 0, 10))
-    a[0:10] = "foo"
-    vereq(a.setslice, (0, 10, "foo"))
-    del a[0:10]
-    vereq(a.delslice, (0, 10))
-
-def methods():
-    if verbose: print "Testing methods..."
-    class C(object):
-        def __init__(self, x):
-            self.x = x
-        def foo(self):
-            return self.x
-    c1 = C(1)
-    vereq(c1.foo(), 1)
-    class D(C):
-        boo = C.foo
-        goo = c1.foo
-    d2 = D(2)
-    vereq(d2.foo(), 2)
-    vereq(d2.boo(), 2)
-    vereq(d2.goo(), 1)
-    class E(object):
-        foo = C.foo
-    vereq(E().foo, C.foo) # i.e., unbound
-    verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
-
-def specials():
-    # Test operators like __hash__ for which a built-in default exists
-    if verbose: print "Testing special operators..."
-    # Test the default behavior for static classes
-    class C(object):
-        def __getitem__(self, i):
-            if 0 <= i < 10: return i
-            raise IndexError
-    c1 = C()
-    c2 = C()
-    verify(not not c1)
-    verify(id(c1) != id(c2))
-    hash(c1)
-    hash(c2)
-    vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
-    vereq(c1, c1)
-    verify(c1 != c2)
-    verify(not c1 != c1)
-    verify(not c1 == c2)
-    # Note that the module name appears in str/repr, and that varies
-    # depending on whether this test is run standalone or from a framework.
-    verify(str(c1).find('C object at ') >= 0)
-    vereq(str(c1), repr(c1))
-    verify(-1 not in c1)
-    for i in range(10):
-        verify(i in c1)
-    verify(10 not in c1)
-    # Test the default behavior for dynamic classes
-    class D(object):
-        def __getitem__(self, i):
-            if 0 <= i < 10: return i
-            raise IndexError
-    d1 = D()
-    d2 = D()
-    verify(not not d1)
-    verify(id(d1) != id(d2))
-    hash(d1)
-    hash(d2)
-    vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
-    vereq(d1, d1)
-    verify(d1 != d2)
-    verify(not d1 != d1)
-    verify(not d1 == d2)
-    # Note that the module name appears in str/repr, and that varies
-    # depending on whether this test is run standalone or from a framework.
-    verify(str(d1).find('D object at ') >= 0)
-    vereq(str(d1), repr(d1))
-    verify(-1 not in d1)
-    for i in range(10):
-        verify(i in d1)
-    verify(10 not in d1)
-    # Test overridden behavior for static classes
-    class Proxy(object):
-        def __init__(self, x):
-            self.x = x
-        def __nonzero__(self):
-            return not not self.x
-        def __hash__(self):
-            return hash(self.x)
-        def __eq__(self, other):
-            return self.x == other
-        def __ne__(self, other):
-            return self.x != other
-        def __cmp__(self, other):
-            return cmp(self.x, other.x)
-        def __str__(self):
-            return "Proxy:%s" % self.x
-        def __repr__(self):
-            return "Proxy(%r)" % self.x
-        def __contains__(self, value):
-            return value in self.x
-    p0 = Proxy(0)
-    p1 = Proxy(1)
-    p_1 = Proxy(-1)
-    verify(not p0)
-    verify(not not p1)
-    vereq(hash(p0), hash(0))
-    vereq(p0, p0)
-    verify(p0 != p1)
-    verify(not p0 != p0)
-    vereq(not p0, p1)
-    vereq(cmp(p0, p1), -1)
-    vereq(cmp(p0, p0), 0)
-    vereq(cmp(p0, p_1), 1)
-    vereq(str(p0), "Proxy:0")
-    vereq(repr(p0), "Proxy(0)")
-    p10 = Proxy(range(10))
-    verify(-1 not in p10)
-    for i in range(10):
-        verify(i in p10)
-    verify(10 not in p10)
-    # Test overridden behavior for dynamic classes
-    class DProxy(object):
-        def __init__(self, x):
-            self.x = x
-        def __nonzero__(self):
-            return not not self.x
-        def __hash__(self):
-            return hash(self.x)
-        def __eq__(self, other):
-            return self.x == other
-        def __ne__(self, other):
-            return self.x != other
-        def __cmp__(self, other):
-            return cmp(self.x, other.x)
-        def __str__(self):
-            return "DProxy:%s" % self.x
-        def __repr__(self):
-            return "DProxy(%r)" % self.x
-        def __contains__(self, value):
-            return value in self.x
-    p0 = DProxy(0)
-    p1 = DProxy(1)
-    p_1 = DProxy(-1)
-    verify(not p0)
-    verify(not not p1)
-    vereq(hash(p0), hash(0))
-    vereq(p0, p0)
-    verify(p0 != p1)
-    verify(not p0 != p0)
-    vereq(not p0, p1)
-    vereq(cmp(p0, p1), -1)
-    vereq(cmp(p0, p0), 0)
-    vereq(cmp(p0, p_1), 1)
-    vereq(str(p0), "DProxy:0")
-    vereq(repr(p0), "DProxy(0)")
-    p10 = DProxy(range(10))
-    verify(-1 not in p10)
-    for i in range(10):
-        verify(i in p10)
-    verify(10 not in p10)
-    # Safety test for __cmp__
-    def unsafecmp(a, b):
-        try:
-            a.__class__.__cmp__(a, b)
-        except TypeError:
-            pass
-        else:
-            raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
-                a.__class__, a, b)
-    unsafecmp(u"123", "123")
-    unsafecmp("123", u"123")
-    unsafecmp(1, 1.0)
-    unsafecmp(1.0, 1)
-    unsafecmp(1, 1L)
-    unsafecmp(1L, 1)
-
-def recursions():
-    if verbose:
-        print "Testing recursion checks ..."
-
-    class Letter(str):
-        def __new__(cls, letter):
-            if letter == 'EPS':
-                return str.__new__(cls)
-            return str.__new__(cls, letter)
-        def __str__(self):
-            if not self:
-                return 'EPS'
-            return self
-    # sys.stdout needs to be the original to trigger the recursion bug
-    import sys
-    test_stdout = sys.stdout
-    sys.stdout = get_original_stdout()
-    try:
-        # nothing should actually be printed, this should raise an exception
-        print Letter('w')
-    except RuntimeError:
-        pass
-    else:
-        raise TestFailed, "expected a RuntimeError for print recursion"
-    sys.stdout = test_stdout
-
-    # Bug #1202533.
-    class A(object):
-        pass
-    A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
-    try:
-        A()*2
-    except RuntimeError:
-        pass
-    else:
-        raise TestFailed("expected a RuntimeError")
-
-def weakrefs():
-    if verbose: print "Testing weak references..."
-    import weakref
-    class C(object):
-        pass
-    c = C()
-    r = weakref.ref(c)
-    verify(r() is c)
-    del c
-    verify(r() is None)
-    del r
-    class NoWeak(object):
-        __slots__ = ['foo']
-    no = NoWeak()
-    try:
-        weakref.ref(no)
-    except TypeError, msg:
-        verify(str(msg).find("weak reference") >= 0)
-    else:
-        verify(0, "weakref.ref(no) should be illegal")
-    class Weak(object):
-        __slots__ = ['foo', '__weakref__']
-    yes = Weak()
-    r = weakref.ref(yes)
-    verify(r() is yes)
-    del yes
-    verify(r() is None)
-    del r
-
-def properties():
-    if verbose: print "Testing property..."
-    class C(object):
-        def getx(self):
-            return self.__x
-        def setx(self, value):
-            self.__x = value
-        def delx(self):
-            del self.__x
-        x = property(getx, setx, delx, doc="I'm the x property.")
-    a = C()
-    verify(not hasattr(a, "x"))
-    a.x = 42
-    vereq(a._C__x, 42)
-    vereq(a.x, 42)
-    del a.x
-    verify(not hasattr(a, "x"))
-    verify(not hasattr(a, "_C__x"))
-    C.x.__set__(a, 100)
-    vereq(C.x.__get__(a), 100)
-    C.x.__delete__(a)
-    verify(not hasattr(a, "x"))
-
-    raw = C.__dict__['x']
-    verify(isinstance(raw, property))
-
-    attrs = dir(raw)
-    verify("__doc__" in attrs)
-    verify("fget" in attrs)
-    verify("fset" in attrs)
-    verify("fdel" in attrs)
-
-    vereq(raw.__doc__, "I'm the x property.")
-    verify(raw.fget is C.__dict__['getx'])
-    verify(raw.fset is C.__dict__['setx'])
-    verify(raw.fdel is C.__dict__['delx'])
+        # stuff that shouldn't:
+        class L(list):
+            pass
 
-    for attr in "__doc__", "fget", "fset", "fdel":
-        try:
-            setattr(raw, attr, 42)
-        except TypeError, msg:
-            if str(msg).find('readonly') < 0:
-                raise TestFailed("when setting readonly attr %r on a "
-                                 "property, got unexpected TypeError "
-                                 "msg %r" % (attr, str(msg)))
-        else:
-            raise TestFailed("expected TypeError from trying to set "
-                             "readonly %r attr on a property" % attr)
-
-    class D(object):
-        __getitem__ = property(lambda s: 1/0)
-
-    d = D()
-    try:
-        for i in d:
-            str(i)
-    except ZeroDivisionError:
-        pass
-    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)
-
-    # this segfaulted in 2.5b2
-    try:
-        import _testcapi
-    except ImportError:
-        pass
-    else:
-        class X(object):
-            p = property(_testcapi.test_with_docstring)
-
-
-def properties_plus():
-    class C(object):
-        foo = property(doc="hello")
-        @foo.getter
-        def foo(self):
-            return self._foo
-        @foo.setter
-        def foo(self, value):
-            self._foo = abs(value)
-        @foo.deleter
-        def foo(self):
-            del self._foo
-    c = C()
-    assert C.foo.__doc__ == "hello"
-    assert not hasattr(c, "foo")
-    c.foo = -42
-    assert hasattr(c, '_foo')
-    assert c._foo == 42
-    assert c.foo == 42
-    del c.foo
-    assert not hasattr(c, '_foo')
-    assert not hasattr(c, "foo")
-
-    class D(C):
-        @C.foo.deleter
-        def foo(self):
-            try:
-                del self._foo
-            except AttributeError:
-                pass
-    d = D()
-    d.foo = 24
-    assert d.foo == 24
-    del d.foo
-    del d.foo
-
-    class E(object):
-        @property
-        def foo(self):
-            return self._foo
-        @foo.setter
-        def foo(self, value):
-            raise RuntimeError
-        @foo.setter
-        def foo(self, value):
-            self._foo = abs(value)
-        @foo.deleter
-        def foo(self, value=None):
-            del self._foo
-
-    e = E()
-    e.foo = -42
-    assert e.foo == 42
-    del e.foo
-
-    class F(E):
-        @E.foo.deleter
-        def foo(self):
-            del self._foo
-        @foo.setter
-        def foo(self, value):
-            self._foo = max(0, value)
-    f = F()
-    f.foo = -10
-    assert f.foo == 0
-    del f.foo
-
-
-def supers():
-    if verbose: print "Testing super..."
-
-    class A(object):
-        def meth(self, a):
-            return "A(%r)" % a
-
-    vereq(A().meth(1), "A(1)")
-
-    class B(A):
-        def __init__(self):
-            self.__super = super(B, self)
-        def meth(self, a):
-            return "B(%r)" % a + self.__super.meth(a)
-
-    vereq(B().meth(2), "B(2)A(2)")
-
-    class C(A):
-        def meth(self, a):
-            return "C(%r)" % a + self.__super.meth(a)
-    C._C__super = super(C)
-
-    vereq(C().meth(3), "C(3)A(3)")
-
-    class D(C, B):
-        def meth(self, a):
-            return "D(%r)" % a + super(D, self).meth(a)
-
-    vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
-
-    # Test for subclassing super
-
-    class mysuper(super):
-        def __init__(self, *args):
-            return super(mysuper, self).__init__(*args)
-
-    class E(D):
-        def meth(self, a):
-            return "E(%r)" % a + mysuper(E, self).meth(a)
-
-    vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
-
-    class F(E):
-        def meth(self, a):
-            s = self.__super # == mysuper(F, self)
-            return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
-    F._F__super = mysuper(F)
-
-    vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
-
-    # Make sure certain errors are raised
-
-    try:
-        super(D, 42)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't allow super(D, 42)"
-
-    try:
-        super(D, C())
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't allow super(D, C())"
-
-    try:
-        super(D).__get__(12)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't allow super(D).__get__(12)"
-
-    try:
-        super(D).__get__(C())
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't allow super(D).__get__(C())"
-
-    # Make sure data descriptors can be overridden and accessed via super
-    # (new feature in Python 2.3)
-
-    class DDbase(object):
-        def getx(self): return 42
-        x = property(getx)
-
-    class DDsub(DDbase):
-        def getx(self): return "hello"
-        x = property(getx)
-
-    dd = DDsub()
-    vereq(dd.x, "hello")
-    vereq(super(DDsub, dd).x, 42)
-
-    # Ensure that super() lookup of descriptor from classmethod
-    # works (SF ID# 743627)
-
-    class Base(object):
-        aProp = property(lambda self: "foo")
-
-    class Sub(Base):
-        @classmethod
-        def test(klass):
-            return super(Sub,klass).aProp
-
-    veris(Sub.test(), Base.aProp)
-
-    # Verify that super() doesn't allow keyword args
-    try:
-        super(Base, kw=1)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "super shouldn't accept keyword args"
-
-def inherits():
-    if verbose: print "Testing inheritance from basic types..."
-
-    class hexint(int):
-        def __repr__(self):
-            return hex(self)
-        def __add__(self, other):
-            return hexint(int.__add__(self, other))
-        # (Note that overriding __radd__ doesn't work,
-        # because the int type gets first dibs.)
-    vereq(repr(hexint(7) + 9), "0x10")
-    vereq(repr(hexint(1000) + 7), "0x3ef")
-    a = hexint(12345)
-    vereq(a, 12345)
-    vereq(int(a), 12345)
-    verify(int(a).__class__ is int)
-    vereq(hash(a), hash(12345))
-    verify((+a).__class__ is int)
-    verify((a >> 0).__class__ is int)
-    verify((a << 0).__class__ is int)
-    verify((hexint(0) << 12).__class__ is int)
-    verify((hexint(0) >> 12).__class__ is int)
-
-    class octlong(long):
-        __slots__ = []
-        def __str__(self):
-            s = oct(self)
-            if s[-1] == 'L':
-                s = s[:-1]
-            return s
-        def __add__(self, other):
-            return self.__class__(super(octlong, self).__add__(other))
-        __radd__ = __add__
-    vereq(str(octlong(3) + 5), "010")
-    # (Note that overriding __radd__ here only seems to work
-    # because the example uses a short int left argument.)
-    vereq(str(5 + octlong(3000)), "05675")
-    a = octlong(12345)
-    vereq(a, 12345L)
-    vereq(long(a), 12345L)
-    vereq(hash(a), hash(12345L))
-    verify(long(a).__class__ is long)
-    verify((+a).__class__ is long)
-    verify((-a).__class__ is long)
-    verify((-octlong(0)).__class__ is long)
-    verify((a >> 0).__class__ is long)
-    verify((a << 0).__class__ is long)
-    verify((a - 0).__class__ is long)
-    verify((a * 1).__class__ is long)
-    verify((a ** 1).__class__ is long)
-    verify((a // 1).__class__ is long)
-    verify((1 * a).__class__ is long)
-    verify((a | 0).__class__ is long)
-    verify((a ^ 0).__class__ is long)
-    verify((a & -1L).__class__ is long)
-    verify((octlong(0) << 12).__class__ is long)
-    verify((octlong(0) >> 12).__class__ is long)
-    verify(abs(octlong(0)).__class__ is long)
-
-    # Because octlong overrides __add__, we can't check the absence of +0
-    # optimizations using octlong.
-    class longclone(long):
-        pass
-    a = longclone(1)
-    verify((a + 0).__class__ is long)
-    verify((0 + a).__class__ is long)
-
-    # Check that negative clones don't segfault
-    a = longclone(-1)
-    vereq(a.__dict__, {})
-    vereq(long(a), -1)  # verify PyNumber_Long() copies the sign bit
-
-    class precfloat(float):
-        __slots__ = ['prec']
-        def __init__(self, value=0.0, prec=12):
-            self.prec = int(prec)
-        def __repr__(self):
-            return "%.*g" % (self.prec, self)
-    vereq(repr(precfloat(1.1)), "1.1")
-    a = precfloat(12345)
-    vereq(a, 12345.0)
-    vereq(float(a), 12345.0)
-    verify(float(a).__class__ is float)
-    vereq(hash(a), hash(12345.0))
-    verify((+a).__class__ is float)
-
-    class madcomplex(complex):
-        def __repr__(self):
-            return "%.17gj%+.17g" % (self.imag, self.real)
-    a = madcomplex(-3, 4)
-    vereq(repr(a), "4j-3")
-    base = complex(-3, 4)
-    veris(base.__class__, complex)
-    vereq(a, base)
-    vereq(complex(a), base)
-    veris(complex(a).__class__, complex)
-    a = madcomplex(a)  # just trying another form of the constructor
-    vereq(repr(a), "4j-3")
-    vereq(a, base)
-    vereq(complex(a), base)
-    veris(complex(a).__class__, complex)
-    vereq(hash(a), hash(base))
-    veris((+a).__class__, complex)
-    veris((a + 0).__class__, complex)
-    vereq(a + 0, base)
-    veris((a - 0).__class__, complex)
-    vereq(a - 0, base)
-    veris((a * 1).__class__, complex)
-    vereq(a * 1, base)
-    veris((a / 1).__class__, complex)
-    vereq(a / 1, base)
-
-    class madtuple(tuple):
-        _rev = None
-        def rev(self):
-            if self._rev is not None:
-                return self._rev
-            L = list(self)
-            L.reverse()
-            self._rev = self.__class__(L)
-            return self._rev
-    a = madtuple((1,2,3,4,5,6,7,8,9,0))
-    vereq(a, (1,2,3,4,5,6,7,8,9,0))
-    vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
-    vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
-    for i in range(512):
-        t = madtuple(range(i))
-        u = t.rev()
-        v = u.rev()
-        vereq(v, t)
-    a = madtuple((1,2,3,4,5))
-    vereq(tuple(a), (1,2,3,4,5))
-    verify(tuple(a).__class__ is tuple)
-    vereq(hash(a), hash((1,2,3,4,5)))
-    verify(a[:].__class__ is tuple)
-    verify((a * 1).__class__ is tuple)
-    verify((a * 0).__class__ is tuple)
-    verify((a + ()).__class__ is tuple)
-    a = madtuple(())
-    vereq(tuple(a), ())
-    verify(tuple(a).__class__ is tuple)
-    verify((a + a).__class__ is tuple)
-    verify((a * 0).__class__ is tuple)
-    verify((a * 1).__class__ is tuple)
-    verify((a * 2).__class__ is tuple)
-    verify(a[:].__class__ is tuple)
-
-    class madstring(str):
-        _rev = None
-        def rev(self):
-            if self._rev is not None:
-                return self._rev
-            L = list(self)
-            L.reverse()
-            self._rev = self.__class__("".join(L))
-            return self._rev
-    s = madstring("abcdefghijklmnopqrstuvwxyz")
-    vereq(s, "abcdefghijklmnopqrstuvwxyz")
-    vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
-    vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
-    for i in range(256):
-        s = madstring("".join(map(chr, range(i))))
-        t = s.rev()
-        u = t.rev()
-        vereq(u, s)
-    s = madstring("12345")
-    vereq(str(s), "12345")
-    verify(str(s).__class__ is str)
-
-    base = "\x00" * 5
-    s = madstring(base)
-    vereq(s, base)
-    vereq(str(s), base)
-    verify(str(s).__class__ is str)
-    vereq(hash(s), hash(base))
-    vereq({s: 1}[base], 1)
-    vereq({base: 1}[s], 1)
-    verify((s + "").__class__ is str)
-    vereq(s + "", base)
-    verify(("" + s).__class__ is str)
-    vereq("" + s, base)
-    verify((s * 0).__class__ is str)
-    vereq(s * 0, "")
-    verify((s * 1).__class__ is str)
-    vereq(s * 1, base)
-    verify((s * 2).__class__ is str)
-    vereq(s * 2, base + base)
-    verify(s[:].__class__ is str)
-    vereq(s[:], base)
-    verify(s[0:0].__class__ is str)
-    vereq(s[0:0], "")
-    verify(s.strip().__class__ is str)
-    vereq(s.strip(), base)
-    verify(s.lstrip().__class__ is str)
-    vereq(s.lstrip(), base)
-    verify(s.rstrip().__class__ is str)
-    vereq(s.rstrip(), base)
-    identitytab = ''.join([chr(i) for i in range(256)])
-    verify(s.translate(identitytab).__class__ is str)
-    vereq(s.translate(identitytab), base)
-    verify(s.translate(identitytab, "x").__class__ is str)
-    vereq(s.translate(identitytab, "x"), base)
-    vereq(s.translate(identitytab, "\x00"), "")
-    verify(s.replace("x", "x").__class__ is str)
-    vereq(s.replace("x", "x"), base)
-    verify(s.ljust(len(s)).__class__ is str)
-    vereq(s.ljust(len(s)), base)
-    verify(s.rjust(len(s)).__class__ is str)
-    vereq(s.rjust(len(s)), base)
-    verify(s.center(len(s)).__class__ is str)
-    vereq(s.center(len(s)), base)
-    verify(s.lower().__class__ is str)
-    vereq(s.lower(), base)
-
-    class madunicode(unicode):
-        _rev = None
-        def rev(self):
-            if self._rev is not None:
-                return self._rev
-            L = list(self)
-            L.reverse()
-            self._rev = self.__class__(u"".join(L))
-            return self._rev
-    u = madunicode("ABCDEF")
-    vereq(u, u"ABCDEF")
-    vereq(u.rev(), madunicode(u"FEDCBA"))
-    vereq(u.rev().rev(), madunicode(u"ABCDEF"))
-    base = u"12345"
-    u = madunicode(base)
-    vereq(unicode(u), base)
-    verify(unicode(u).__class__ is unicode)
-    vereq(hash(u), hash(base))
-    vereq({u: 1}[base], 1)
-    vereq({base: 1}[u], 1)
-    verify(u.strip().__class__ is unicode)
-    vereq(u.strip(), base)
-    verify(u.lstrip().__class__ is unicode)
-    vereq(u.lstrip(), base)
-    verify(u.rstrip().__class__ is unicode)
-    vereq(u.rstrip(), base)
-    verify(u.replace(u"x", u"x").__class__ is unicode)
-    vereq(u.replace(u"x", u"x"), base)
-    verify(u.replace(u"xy", u"xy").__class__ is unicode)
-    vereq(u.replace(u"xy", u"xy"), base)
-    verify(u.center(len(u)).__class__ is unicode)
-    vereq(u.center(len(u)), base)
-    verify(u.ljust(len(u)).__class__ is unicode)
-    vereq(u.ljust(len(u)), base)
-    verify(u.rjust(len(u)).__class__ is unicode)
-    vereq(u.rjust(len(u)), base)
-    verify(u.lower().__class__ is unicode)
-    vereq(u.lower(), base)
-    verify(u.upper().__class__ is unicode)
-    vereq(u.upper(), base)
-    verify(u.capitalize().__class__ is unicode)
-    vereq(u.capitalize(), base)
-    verify(u.title().__class__ is unicode)
-    vereq(u.title(), base)
-    verify((u + u"").__class__ is unicode)
-    vereq(u + u"", base)
-    verify((u"" + u).__class__ is unicode)
-    vereq(u"" + u, base)
-    verify((u * 0).__class__ is unicode)
-    vereq(u * 0, u"")
-    verify((u * 1).__class__ is unicode)
-    vereq(u * 1, base)
-    verify((u * 2).__class__ is unicode)
-    vereq(u * 2, base + base)
-    verify(u[:].__class__ is unicode)
-    vereq(u[:], base)
-    verify(u[0:0].__class__ is unicode)
-    vereq(u[0:0], u"")
-
-    class sublist(list):
-        pass
-    a = sublist(range(5))
-    vereq(a, range(5))
-    a.append("hello")
-    vereq(a, range(5) + ["hello"])
-    a[5] = 5
-    vereq(a, range(6))
-    a.extend(range(6, 20))
-    vereq(a, range(20))
-    a[-5:] = []
-    vereq(a, range(15))
-    del a[10:15]
-    vereq(len(a), 10)
-    vereq(a, range(10))
-    vereq(list(a), range(10))
-    vereq(a[0], 0)
-    vereq(a[9], 9)
-    vereq(a[-10], 0)
-    vereq(a[-1], 9)
-    vereq(a[:5], range(5))
-
-    class CountedInput(file):
-        """Counts lines read by self.readline().
-
-        self.lineno is the 0-based ordinal of the last line read, up to
-        a maximum of one greater than the number of lines in the file.
-
-        self.ateof is true if and only if the final "" line has been read,
-        at which point self.lineno stops incrementing, and further calls
-        to readline() continue to return "".
-        """
-
-        lineno = 0
-        ateof = 0
-        def readline(self):
-            if self.ateof:
-                return ""
-            s = file.readline(self)
-            # Next line works too.
-            # s = super(CountedInput, self).readline()
-            self.lineno += 1
-            if s == "":
-                self.ateof = 1
-            return s
-
-    f = file(name=TESTFN, mode='w')
-    lines = ['a\n', 'b\n', 'c\n']
-    try:
-        f.writelines(lines)
-        f.close()
-        f = CountedInput(TESTFN)
-        for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
-            got = f.readline()
-            vereq(expected, got)
-            vereq(f.lineno, i)
-            vereq(f.ateof, (i > len(lines)))
-        f.close()
-    finally:
         try:
-            f.close()
-        except:
+            L.__bases__ = (dict,)
+        except TypeError:
             pass
+        else:
+            self.fail("shouldn't turn list subclass into dict subclass")
+
         try:
-            import os
-            os.unlink(TESTFN)
-        except:
+            list.__bases__ = (dict,)
+        except TypeError:
             pass
+        else:
+            self.fail("shouldn't be able to assign to list.__bases__")
 
-def keywords():
-    if verbose:
-        print "Testing keyword args to basic type constructors ..."
-    vereq(int(x=1), 1)
-    vereq(float(x=2), 2.0)
-    vereq(long(x=3), 3L)
-    vereq(complex(imag=42, real=666), complex(666, 42))
-    vereq(str(object=500), '500')
-    vereq(unicode(string='abc', errors='strict'), u'abc')
-    vereq(tuple(sequence=range(3)), (0, 1, 2))
-    vereq(list(sequence=(0, 1, 2)), range(3))
-    # note: as of Python 2.3, dict() no longer has an "items" keyword arg
-
-    for constructor in (int, float, long, complex, str, unicode,
-                        tuple, list, file):
-        try:
-            constructor(bogus_keyword_arg=1)
+        try:
+            D.__bases__ = (C2, list)
         except TypeError:
             pass
         else:
-            raise TestFailed("expected TypeError from bogus keyword "
-                             "argument to %r" % constructor)
-
-def restricted():
-    # XXX This test is disabled because rexec is not deemed safe
-    return
-    import rexec
-    if verbose:
-        print "Testing interaction with restricted execution ..."
-
-    sandbox = rexec.RExec()
-
-    code1 = """f = open(%r, 'w')""" % TESTFN
-    code2 = """f = file(%r, 'w')""" % TESTFN
-    code3 = """\
-f = open(%r)
-t = type(f)  # a sneaky way to get the file() constructor
-f.close()
-f = t(%r, 'w')  # rexec can't catch this by itself
-""" % (TESTFN, TESTFN)
+            assert 0, "best_base calculation found wanting"
 
-    f = open(TESTFN, 'w')  # Create the file so code3 can find it.
-    f.close()
-
-    try:
-        for code in code1, code2, code3:
-            try:
-                sandbox.r_exec(code)
-            except IOError, msg:
-                if str(msg).find("restricted") >= 0:
-                    outcome = "OK"
-                else:
-                    outcome = "got an exception, but not an expected one"
-            else:
-                outcome = "expected a restricted-execution exception"
+        try:
+            del D.__bases__
+        except TypeError:
+            pass
+        else:
+            self.fail("shouldn't be able to delete .__bases__")
 
-            if outcome != "OK":
-                raise TestFailed("%s, in %r" % (outcome, code))
+        try:
+            D.__bases__ = ()
+        except TypeError, msg:
+            if str(msg) == "a new-style class can't have only classic bases":
+                self.fail("wrong error message for .__bases__ = ()")
+        else:
+            self.fail("shouldn't be able to set .__bases__ to ()")
 
-    finally:
         try:
-            import os
-            os.unlink(TESTFN)
-        except:
+            D.__bases__ = (D,)
+        except TypeError:
             pass
+        else:
+            # actually, we'll have crashed by here...
+            self.fail("shouldn't be able to create inheritance cycles")
 
-def str_subclass_as_dict_key():
-    if verbose:
-        print "Testing a str subclass used as dict key .."
-
-    class cistr(str):
-        """Sublcass of str that computes __eq__ case-insensitively.
-
-        Also computes a hash code of the string in canonical form.
-        """
-
-        def __init__(self, value):
-            self.canonical = value.lower()
-            self.hashcode = hash(self.canonical)
-
-        def __eq__(self, other):
-            if not isinstance(other, cistr):
-                other = cistr(other)
-            return self.canonical == other.canonical
-
-        def __hash__(self):
-            return self.hashcode
-
-    vereq(cistr('ABC'), 'abc')
-    vereq('aBc', cistr('ABC'))
-    vereq(str(cistr('ABC')), 'ABC')
-
-    d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
-    vereq(d[cistr('one')], 1)
-    vereq(d[cistr('tWo')], 2)
-    vereq(d[cistr('THrEE')], 3)
-    verify(cistr('ONe') in d)
-    vereq(d.get(cistr('thrEE')), 3)
-
-def classic_comparisons():
-    if verbose: print "Testing classic comparisons..."
-    class classic:
-        pass
-    for base in (classic, int, object):
-        if verbose: print "        (base = %s)" % base
-        class C(base):
-            def __init__(self, value):
-                self.value = int(value)
-            def __cmp__(self, other):
-                if isinstance(other, C):
-                    return cmp(self.value, other.value)
-                if isinstance(other, int) or isinstance(other, long):
-                    return cmp(self.value, other)
-                return NotImplemented
-        c1 = C(1)
-        c2 = C(2)
-        c3 = C(3)
-        vereq(c1, 1)
-        c = {1: c1, 2: c2, 3: c3}
-        for x in 1, 2, 3:
-            for y in 1, 2, 3:
-                verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
-                for op in "<", "<=", "==", "!=", ">", ">=":
-                    verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
-                           "x=%d, y=%d" % (x, y))
-                verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
-                verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
-
-def rich_comparisons():
-    if verbose:
-        print "Testing rich comparisons..."
-    class Z(complex):
-        pass
-    z = Z(1)
-    vereq(z, 1+0j)
-    vereq(1+0j, z)
-    class ZZ(complex):
-        def __eq__(self, other):
-            try:
-                return abs(self - other) <= 1e-6
-            except:
-                return NotImplemented
-    zz = ZZ(1.0000003)
-    vereq(zz, 1+0j)
-    vereq(1+0j, zz)
-
-    class classic:
-        pass
-    for base in (classic, int, object, list):
-        if verbose: print "        (base = %s)" % base
-        class C(base):
-            def __init__(self, value):
-                self.value = int(value)
-            def __cmp__(self, other):
-                raise TestFailed, "shouldn't call __cmp__"
-            def __eq__(self, other):
-                if isinstance(other, C):
-                    return self.value == other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value == other
-                return NotImplemented
-            def __ne__(self, other):
-                if isinstance(other, C):
-                    return self.value != other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value != other
-                return NotImplemented
-            def __lt__(self, other):
-                if isinstance(other, C):
-                    return self.value < other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value < other
-                return NotImplemented
-            def __le__(self, other):
-                if isinstance(other, C):
-                    return self.value <= other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value <= other
-                return NotImplemented
-            def __gt__(self, other):
-                if isinstance(other, C):
-                    return self.value > other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value > other
-                return NotImplemented
-            def __ge__(self, other):
-                if isinstance(other, C):
-                    return self.value >= other.value
-                if isinstance(other, int) or isinstance(other, long):
-                    return self.value >= other
-                return NotImplemented
-        c1 = C(1)
-        c2 = C(2)
-        c3 = C(3)
-        vereq(c1, 1)
-        c = {1: c1, 2: c2, 3: c3}
-        for x in 1, 2, 3:
-            for y in 1, 2, 3:
-                for op in "<", "<=", "==", "!=", ">", ">=":
-                    verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
-                           "x=%d, y=%d" % (x, y))
-                    verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
-                           "x=%d, y=%d" % (x, y))
-                    verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
-                           "x=%d, y=%d" % (x, y))
-
-def coercions():
-    if verbose: print "Testing coercions..."
-    class I(int): pass
-    coerce(I(0), 0)
-    coerce(0, I(0))
-    class L(long): pass
-    coerce(L(0), 0)
-    coerce(L(0), 0L)
-    coerce(0, L(0))
-    coerce(0L, L(0))
-    class F(float): pass
-    coerce(F(0), 0)
-    coerce(F(0), 0L)
-    coerce(F(0), 0.)
-    coerce(0, F(0))
-    coerce(0L, F(0))
-    coerce(0., F(0))
-    class C(complex): pass
-    coerce(C(0), 0)
-    coerce(C(0), 0L)
-    coerce(C(0), 0.)
-    coerce(C(0), 0j)
-    coerce(0, C(0))
-    coerce(0L, C(0))
-    coerce(0., C(0))
-    coerce(0j, C(0))
-
-def descrdoc():
-    if verbose: print "Testing descriptor doc strings..."
-    def check(descr, what):
-        vereq(descr.__doc__, what)
-    check(file.closed, "True if the file is closed") # getset descriptor
-    check(file.name, "file name") # member descriptor
-
-def setclass():
-    if verbose: print "Testing __class__ assignment..."
-    class C(object): pass
-    class D(object): pass
-    class E(object): pass
-    class F(D, E): pass
-    for cls in C, D, E, F:
-        for cls2 in C, D, E, F:
-            x = cls()
-            x.__class__ = cls2
-            verify(x.__class__ is cls2)
-            x.__class__ = cls
-            verify(x.__class__ is cls)
-    def cant(x, C):
         try:
-            x.__class__ = C
+            D.__bases__ = (C, C)
         except TypeError:
             pass
         else:
-            raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
+            self.fail("didn't detect repeated base classes")
+
         try:
-            delattr(x, "__class__")
+            D.__bases__ = (E,)
         except TypeError:
             pass
         else:
-            raise TestFailed, "shouldn't allow del %r.__class__" % x
-    cant(C(), list)
-    cant(list(), C)
-    cant(C(), 1)
-    cant(C(), object)
-    cant(object(), list)
-    cant(list(), object)
-    class Int(int): __slots__ = []
-    cant(2, Int)
-    cant(Int(), int)
-    cant(True, int)
-    cant(2, bool)
-    o = object()
-    cant(o, type(1))
-    cant(o, type(None))
-    del o
-    class G(object):
-        __slots__ = ["a", "b"]
-    class H(object):
-        __slots__ = ["b", "a"]
-    try:
-        unicode
-    except NameError:
-        class I(object):
-            __slots__ = ["a", "b"]
-    else:
-        class I(object):
-            __slots__ = [unicode("a"), unicode("b")]
-    class J(object):
-        __slots__ = ["c", "b"]
-    class K(object):
-        __slots__ = ["a", "b", "d"]
-    class L(H):
-        __slots__ = ["e"]
-    class M(I):
-        __slots__ = ["e"]
-    class N(J):
-        __slots__ = ["__weakref__"]
-    class P(J):
-        __slots__ = ["__dict__"]
-    class Q(J):
-        pass
-    class R(J):
-        __slots__ = ["__dict__", "__weakref__"]
+            self.fail("shouldn't be able to create inheritance cycles")
 
-    for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
-        x = cls()
-        x.a = 1
-        x.__class__ = cls2
-        verify(x.__class__ is cls2,
-               "assigning %r as __class__ for %r silently failed" % (cls2, x))
-        vereq(x.a, 1)
-        x.__class__ = cls
-        verify(x.__class__ is cls,
-               "assigning %r as __class__ for %r silently failed" % (cls, x))
-        vereq(x.a, 1)
-    for cls in G, J, K, L, M, N, P, R, list, Int:
-        for cls2 in G, J, K, L, M, N, P, R, list, Int:
-            if cls is cls2:
-                continue
-            cant(cls(), cls2)
-
-def setdict():
-    if verbose: print "Testing __dict__ assignment..."
-    class C(object): pass
-    a = C()
-    a.__dict__ = {'b': 1}
-    vereq(a.b, 1)
-    def cant(x, dict):
+        # let's throw a classic class into the mix:
+        class Classic:
+            def meth2(self):
+                return 3
+
+        D.__bases__ = (C, Classic)
+
+        self.assertEqual(d.meth2(), 3)
+        self.assertEqual(e.meth2(), 3)
         try:
-            x.__dict__ = dict
-        except (AttributeError, TypeError):
+            d.a
+        except AttributeError:
             pass
         else:
-            raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
-    cant(a, None)
-    cant(a, [])
-    cant(a, 1)
-    del a.__dict__ # Deleting __dict__ is allowed
-
-    class Base(object):
-        pass
-    def verify_dict_readonly(x):
-        """
-        x has to be an instance of a class inheriting from Base.
-        """
-        cant(x, {})
+            self.fail("attribute should have vanished")
+
         try:
-            del x.__dict__
-        except (AttributeError, TypeError):
+            D.__bases__ = (Classic,)
+        except TypeError:
+            pass
+        else:
+            self.fail("new-style class must have a new-style base")
+
+    def test_mutable_bases_with_failing_mro(self):
+        # Testing mutable bases with failing mro...
+        class WorkOnce(type):
+            def __new__(self, name, bases, ns):
+                self.flag = 0
+                return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
+            def mro(self):
+                if self.flag > 0:
+                    raise RuntimeError, "bozo"
+                else:
+                    self.flag += 1
+                    return type.mro(self)
+
+        class WorkAlways(type):
+            def mro(self):
+                # this is here to make sure that .mro()s aren't called
+                # with an exception set (which was possible at one point).
+                # An error message will be printed in a debug build.
+                # What's a good way to test for this?
+                return type.mro(self)
+
+        class C(object):
+            pass
+
+        class C2(object):
+            pass
+
+        class D(C):
+            pass
+
+        class E(D):
             pass
+
+        class F(D):
+            __metaclass__ = WorkOnce
+
+        class G(D):
+            __metaclass__ = WorkAlways
+
+        # Immediate subclasses have their mro's adjusted in alphabetical
+        # order, so E's will get adjusted before adjusting F's fails.  We
+        # check here that E's gets restored.
+
+        E_mro_before = E.__mro__
+        D_mro_before = D.__mro__
+
+        try:
+            D.__bases__ = (C2,)
+        except RuntimeError:
+            self.assertEqual(E.__mro__, E_mro_before)
+            self.assertEqual(D.__mro__, D_mro_before)
         else:
-            raise TestFailed, "shouldn't allow del %r.__dict__" % x
-        dict_descr = Base.__dict__["__dict__"]
+            self.fail("exception not propagated")
+
+    def test_mutable_bases_catch_mro_conflict(self):
+        # Testing mutable bases catch mro conflict...
+        class A(object):
+            pass
+
+        class B(object):
+            pass
+
+        class C(A, B):
+            pass
+
+        class D(A, B):
+            pass
+
+        class E(C, D):
+            pass
+
         try:
-            dict_descr.__set__(x, {})
-        except (AttributeError, TypeError):
+            C.__bases__ = (B, A)
+        except TypeError:
             pass
         else:
-            raise TestFailed, "dict_descr allowed access to %r's dict" % x
+            self.fail("didn't catch MRO conflict")
+
+    def test_mutable_names(self):
+        # Testing mutable names...
+        class C(object):
+            pass
+
+        # C.__module__ could be 'test_descr' or '__main__'
+        mod = C.__module__
+
+        C.__name__ = 'D'
+        self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
+
+        C.__name__ = 'D.E'
+        self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
+
+    def test_subclass_right_op(self):
+        # Testing correct dispatch of subclass overloading __r<op>__...
+
+        # This code tests various cases where right-dispatch of a subclass
+        # should be preferred over left-dispatch of a base class.
+
+        # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
+
+        class B(int):
+            def __floordiv__(self, other):
+                return "B.__floordiv__"
+            def __rfloordiv__(self, other):
+                return "B.__rfloordiv__"
+
+        self.assertEqual(B(1) // 1, "B.__floordiv__")
+        self.assertEqual(1 // B(1), "B.__rfloordiv__")
+
+        # Case 2: subclass of object; this is just the baseline for case 3
+
+        class C(object):
+            def __floordiv__(self, other):
+                return "C.__floordiv__"
+            def __rfloordiv__(self, other):
+                return "C.__rfloordiv__"
+
+        self.assertEqual(C() // 1, "C.__floordiv__")
+        self.assertEqual(1 // C(), "C.__rfloordiv__")
+
+        # Case 3: subclass of new-style class; here it gets interesting
 
-    # Classes don't allow __dict__ assignment and have readonly dicts
-    class Meta1(type, Base):
-        pass
-    class Meta2(Base, type):
-        pass
-    class D(object):
-        __metaclass__ = Meta1
-    class E(object):
-        __metaclass__ = Meta2
-    for cls in C, D, E:
-        verify_dict_readonly(cls)
-        class_dict = cls.__dict__
-        try:
-            class_dict["spam"] = "eggs"
-        except TypeError:
-            pass
-        else:
-            raise TestFailed, "%r's __dict__ can be modified" % cls
-
-    # Modules also disallow __dict__ assignment
-    class Module1(types.ModuleType, Base):
-        pass
-    class Module2(Base, types.ModuleType):
-        pass
-    for ModuleType in Module1, Module2:
-        mod = ModuleType("spam")
-        verify_dict_readonly(mod)
-        mod.__dict__["spam"] = "eggs"
-
-    # Exception's __dict__ can be replaced, but not deleted
-    class Exception1(Exception, Base):
-        pass
-    class Exception2(Base, Exception):
-        pass
-    for ExceptionType in Exception, Exception1, Exception2:
-        e = ExceptionType()
-        e.__dict__ = {"a": 1}
-        vereq(e.a, 1)
-        try:
-            del e.__dict__
-        except (TypeError, AttributeError):
-            pass
-        else:
-            raise TestFaied, "%r's __dict__ can be deleted" % e
-
-
-def pickles():
-    if verbose:
-        print "Testing pickling and copying new-style classes and objects..."
-    import pickle, cPickle
-
-    def sorteditems(d):
-        L = d.items()
-        L.sort()
-        return L
-
-    global C
-    class C(object):
-        def __init__(self, a, b):
-            super(C, self).__init__()
-            self.a = a
-            self.b = b
-        def __repr__(self):
-            return "C(%r, %r)" % (self.a, self.b)
-
-    global C1
-    class C1(list):
-        def __new__(cls, a, b):
-            return super(C1, cls).__new__(cls)
-        def __getnewargs__(self):
-            return (self.a, self.b)
-        def __init__(self, a, b):
-            self.a = a
-            self.b = b
-        def __repr__(self):
-            return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
-
-    global C2
-    class C2(int):
-        def __new__(cls, a, b, val=0):
-            return super(C2, cls).__new__(cls, val)
-        def __getnewargs__(self):
-            return (self.a, self.b, int(self))
-        def __init__(self, a, b, val=0):
-            self.a = a
-            self.b = b
-        def __repr__(self):
-            return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
-
-    global C3
-    class C3(object):
-        def __init__(self, foo):
-            self.foo = foo
-        def __getstate__(self):
-            return self.foo
-        def __setstate__(self, foo):
-            self.foo = foo
-
-    global C4classic, C4
-    class C4classic: # classic
-        pass
-    class C4(C4classic, object): # mixed inheritance
-        pass
-
-    for p in pickle, cPickle:
-        for bin in 0, 1:
-            if verbose:
-                print p.__name__, ["text", "binary"][bin]
-
-            for cls in C, C1, C2:
-                s = p.dumps(cls, bin)
-                cls2 = p.loads(s)
-                verify(cls2 is cls)
-
-            a = C1(1, 2); a.append(42); a.append(24)
-            b = C2("hello", "world", 42)
-            s = p.dumps((a, b), bin)
-            x, y = p.loads(s)
-            vereq(x.__class__, a.__class__)
-            vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
-            vereq(y.__class__, b.__class__)
-            vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
-            vereq(repr(x), repr(a))
-            vereq(repr(y), repr(b))
-            if verbose:
-                print "a = x =", a
-                print "b = y =", b
-            # Test for __getstate__ and __setstate__ on new style class
-            u = C3(42)
-            s = p.dumps(u, bin)
-            v = p.loads(s)
-            veris(u.__class__, v.__class__)
-            vereq(u.foo, v.foo)
-            # Test for picklability of hybrid class
-            u = C4()
-            u.foo = 42
-            s = p.dumps(u, bin)
-            v = p.loads(s)
-            veris(u.__class__, v.__class__)
-            vereq(u.foo, v.foo)
-
-    # Testing copy.deepcopy()
-    if verbose:
-        print "deepcopy"
-    import copy
-    for cls in C, C1, C2:
-        cls2 = copy.deepcopy(cls)
-        verify(cls2 is cls)
-
-    a = C1(1, 2); a.append(42); a.append(24)
-    b = C2("hello", "world", 42)
-    x, y = copy.deepcopy((a, b))
-    vereq(x.__class__, a.__class__)
-    vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
-    vereq(y.__class__, b.__class__)
-    vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
-    vereq(repr(x), repr(a))
-    vereq(repr(y), repr(b))
-    if verbose:
-        print "a = x =", a
-        print "b = y =", b
-
-def pickleslots():
-    if verbose: print "Testing pickling of classes with __slots__ ..."
-    import pickle, cPickle
-    # Pickling of classes with __slots__ but without __getstate__ should fail
-    global B, C, D, E
-    class B(object):
-        pass
-    for base in [object, B]:
-        class C(base):
-            __slots__ = ['a']
         class D(C):
+            def __floordiv__(self, other):
+                return "D.__floordiv__"
+            def __rfloordiv__(self, other):
+                return "D.__rfloordiv__"
+
+        self.assertEqual(D() // C(), "D.__floordiv__")
+        self.assertEqual(C() // D(), "D.__rfloordiv__")
+
+        # Case 4: this didn't work right in 2.2.2 and 2.3a1
+
+        class E(C):
             pass
+
+        self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
+
+        self.assertEqual(E() // 1, "C.__floordiv__")
+        self.assertEqual(1 // E(), "C.__rfloordiv__")
+        self.assertEqual(E() // C(), "C.__floordiv__")
+        self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
+
+    def test_meth_class_get(self):
+        # Testing __get__ method of METH_CLASS C methods...
+        # Full coverage of descrobject.c::classmethod_get()
+
+        # Baseline
+        arg = [1, 2, 3]
+        res = {1: None, 2: None, 3: None}
+        self.assertEqual(dict.fromkeys(arg), res)
+        self.assertEqual({}.fromkeys(arg), res)
+
+        # Now get the descriptor
+        descr = dict.__dict__["fromkeys"]
+
+        # More baseline using the descriptor directly
+        self.assertEqual(descr.__get__(None, dict)(arg), res)
+        self.assertEqual(descr.__get__({})(arg), res)
+
+        # Now check various error cases
         try:
-            pickle.dumps(C())
+            descr.__get__(None, None)
         except TypeError:
             pass
         else:
-            raise TestFailed, "should fail: pickle C instance - %s" % base
+            self.fail("shouldn't have allowed descr.__get__(None, None)")
         try:
-            cPickle.dumps(C())
+            descr.__get__(42)
         except TypeError:
             pass
         else:
-            raise TestFailed, "should fail: cPickle C instance - %s" % base
+            self.fail("shouldn't have allowed descr.__get__(42)")
         try:
-            pickle.dumps(C())
+            descr.__get__(None, 42)
         except TypeError:
             pass
         else:
-            raise TestFailed, "should fail: pickle D instance - %s" % base
+            self.fail("shouldn't have allowed descr.__get__(None, 42)")
         try:
-            cPickle.dumps(D())
+            descr.__get__(None, int)
         except TypeError:
             pass
         else:
-            raise TestFailed, "should fail: cPickle D instance - %s" % base
-        # Give C a nice generic __getstate__ and __setstate__
-        class C(base):
-            __slots__ = ['a']
-            def __getstate__(self):
-                try:
-                    d = self.__dict__.copy()
-                except AttributeError:
-                    d = {}
-                for cls in self.__class__.__mro__:
-                    for sn in cls.__dict__.get('__slots__', ()):
-                        try:
-                            d[sn] = getattr(self, sn)
-                        except AttributeError:
-                            pass
-                return d
-            def __setstate__(self, d):
-                for k, v in d.items():
-                    setattr(self, k, v)
+            self.fail("shouldn't have allowed descr.__get__(None, int)")
+
+    def test_isinst_isclass(self):
+        # Testing proxy isinstance() and isclass()...
+        class Proxy(object):
+            def __init__(self, obj):
+                self.__obj = obj
+            def __getattribute__(self, name):
+                if name.startswith("_Proxy__"):
+                    return object.__getattribute__(self, name)
+                else:
+                    return getattr(self.__obj, name)
+        # Test with a classic class
+        class C:
+            pass
+        a = C()
+        pa = Proxy(a)
+        self.assert_(isinstance(a, C))  # Baseline
+        self.assert_(isinstance(pa, C)) # Test
+        # Test with a classic subclass
         class D(C):
             pass
-        # Now it should work
-        x = C()
-        y = pickle.loads(pickle.dumps(x))
-        vereq(hasattr(y, 'a'), 0)
-        y = cPickle.loads(cPickle.dumps(x))
-        vereq(hasattr(y, 'a'), 0)
-        x.a = 42
-        y = pickle.loads(pickle.dumps(x))
-        vereq(y.a, 42)
-        y = cPickle.loads(cPickle.dumps(x))
-        vereq(y.a, 42)
-        x = D()
-        x.a = 42
-        x.b = 100
-        y = pickle.loads(pickle.dumps(x))
-        vereq(y.a + y.b, 142)
-        y = cPickle.loads(cPickle.dumps(x))
-        vereq(y.a + y.b, 142)
-        # A subclass that adds a slot should also work
-        class E(C):
-            __slots__ = ['b']
-        x = E()
-        x.a = 42
-        x.b = "foo"
-        y = pickle.loads(pickle.dumps(x))
-        vereq(y.a, x.a)
-        vereq(y.b, x.b)
-        y = cPickle.loads(cPickle.dumps(x))
-        vereq(y.a, x.a)
-        vereq(y.b, x.b)
-
-def copies():
-    if verbose: print "Testing copy.copy() and copy.deepcopy()..."
-    import copy
-    class C(object):
-        pass
-
-    a = C()
-    a.foo = 12
-    b = copy.copy(a)
-    vereq(b.__dict__, a.__dict__)
-
-    a.bar = [1,2,3]
-    c = copy.copy(a)
-    vereq(c.bar, a.bar)
-    verify(c.bar is a.bar)
-
-    d = copy.deepcopy(a)
-    vereq(d.__dict__, a.__dict__)
-    a.bar.append(4)
-    vereq(d.bar, [1,2,3])
-
-def binopoverride():
-    if verbose: print "Testing overrides of binary operations..."
-    class I(int):
-        def __repr__(self):
-            return "I(%r)" % int(self)
-        def __add__(self, other):
-            return I(int(self) + int(other))
-        __radd__ = __add__
-        def __pow__(self, other, mod=None):
-            if mod is None:
-                return I(pow(int(self), int(other)))
-            else:
-                return I(pow(int(self), int(other), int(mod)))
-        def __rpow__(self, other, mod=None):
-            if mod is None:
-                return I(pow(int(other), int(self), mod))
-            else:
-                return I(pow(int(other), int(self), int(mod)))
+        a = D()
+        pa = Proxy(a)
+        self.assert_(isinstance(a, C))  # Baseline
+        self.assert_(isinstance(pa, C)) # Test
+        # Test with a new-style class
+        class C(object):
+            pass
+        a = C()
+        pa = Proxy(a)
+        self.assert_(isinstance(a, C))  # Baseline
+        self.assert_(isinstance(pa, C)) # Test
+        # Test with a new-style subclass
+        class D(C):
+            pass
+        a = D()
+        pa = Proxy(a)
+        self.assert_(isinstance(a, C))  # Baseline
+        self.assert_(isinstance(pa, C)) # Test
+
+    def test_proxy_super(self):
+        # Testing super() for a proxy object...
+        class Proxy(object):
+            def __init__(self, obj):
+                self.__obj = obj
+            def __getattribute__(self, name):
+                if name.startswith("_Proxy__"):
+                    return object.__getattribute__(self, name)
+                else:
+                    return getattr(self.__obj, name)
 
-    vereq(repr(I(1) + I(2)), "I(3)")
-    vereq(repr(I(1) + 2), "I(3)")
-    vereq(repr(1 + I(2)), "I(3)")
-    vereq(repr(I(2) ** I(3)), "I(8)")
-    vereq(repr(2 ** I(3)), "I(8)")
-    vereq(repr(I(2) ** 3), "I(8)")
-    vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
-    class S(str):
-        def __eq__(self, other):
-            return self.lower() == other.lower()
-
-def subclasspropagation():
-    if verbose: print "Testing propagation of slot functions to subclasses..."
-    class A(object):
-        pass
-    class B(A):
-        pass
-    class C(A):
-        pass
-    class D(B, C):
-        pass
-    d = D()
-    orig_hash = hash(d) # related to id(d) in platform-dependent ways
-    A.__hash__ = lambda self: 42
-    vereq(hash(d), 42)
-    C.__hash__ = lambda self: 314
-    vereq(hash(d), 314)
-    B.__hash__ = lambda self: 144
-    vereq(hash(d), 144)
-    D.__hash__ = lambda self: 100
-    vereq(hash(d), 100)
-    del D.__hash__
-    vereq(hash(d), 144)
-    del B.__hash__
-    vereq(hash(d), 314)
-    del C.__hash__
-    vereq(hash(d), 42)
-    del A.__hash__
-    vereq(hash(d), orig_hash)
-    d.foo = 42
-    d.bar = 42
-    vereq(d.foo, 42)
-    vereq(d.bar, 42)
-    def __getattribute__(self, name):
-        if name == "foo":
-            return 24
-        return object.__getattribute__(self, name)
-    A.__getattribute__ = __getattribute__
-    vereq(d.foo, 24)
-    vereq(d.bar, 42)
-    def __getattr__(self, name):
-        if name in ("spam", "foo", "bar"):
-            return "hello"
-        raise AttributeError, name
-    B.__getattr__ = __getattr__
-    vereq(d.spam, "hello")
-    vereq(d.foo, 24)
-    vereq(d.bar, 42)
-    del A.__getattribute__
-    vereq(d.foo, 42)
-    del d.foo
-    vereq(d.foo, "hello")
-    vereq(d.bar, 42)
-    del B.__getattr__
-    try:
-        d.foo
-    except AttributeError:
-        pass
-    else:
-        raise TestFailed, "d.foo should be undefined now"
-
-    # Test a nasty bug in recurse_down_subclasses()
-    import gc
-    class A(object):
-        pass
-    class B(A):
-        pass
-    del B
-    gc.collect()
-    A.__setitem__ = lambda *a: None # crash
-
-def buffer_inherit():
-    import binascii
-    # SF bug [#470040] ParseTuple t# vs subclasses.
-    if verbose:
-        print "Testing that buffer interface is inherited ..."
-
-    class MyStr(str):
-        pass
-    base = 'abc'
-    m = MyStr(base)
-    # b2a_hex uses the buffer interface to get its argument's value, via
-    # PyArg_ParseTuple 't#' code.
-    vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
-
-    # It's not clear that unicode will continue to support the character
-    # buffer interface, and this test will fail if that's taken away.
-    class MyUni(unicode):
-        pass
-    base = u'abc'
-    m = MyUni(base)
-    vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
-
-    class MyInt(int):
-        pass
-    m = MyInt(42)
-    try:
-        binascii.b2a_hex(m)
-        raise TestFailed('subclass of int should not have a buffer interface')
-    except TypeError:
-        pass
-
-def str_of_str_subclass():
-    import binascii
-    import cStringIO
-
-    if verbose:
-        print "Testing __str__ defined in subclass of str ..."
-
-    class octetstring(str):
-        def __str__(self):
-            return binascii.b2a_hex(self)
-        def __repr__(self):
-            return self + " repr"
-
-    o = octetstring('A')
-    vereq(type(o), octetstring)
-    vereq(type(str(o)), str)
-    vereq(type(repr(o)), str)
-    vereq(ord(o), 0x41)
-    vereq(str(o), '41')
-    vereq(repr(o), 'A repr')
-    vereq(o.__str__(), '41')
-    vereq(o.__repr__(), 'A repr')
-
-    capture = cStringIO.StringIO()
-    # Calling str() or not exercises different internal paths.
-    print >> capture, o
-    print >> capture, str(o)
-    vereq(capture.getvalue(), '41\n41\n')
-    capture.close()
-
-def kwdargs():
-    if verbose: print "Testing keyword arguments to __init__, __call__..."
-    def f(a): return a
-    vereq(f.__call__(a=42), 42)
-    a = []
-    list.__init__(a, sequence=[0, 1, 2])
-    vereq(a, [0, 1, 2])
-
-def recursive__call__():
-    if verbose: print ("Testing recursive __call__() by setting to instance of "
-                        "class ...")
-    class A(object):
-        pass
-
-    A.__call__ = A()
-    try:
-        A()()
-    except RuntimeError:
-        pass
-    else:
-        raise TestFailed("Recursion limit should have been reached for "
-                         "__call__()")
-
-def delhook():
-    if verbose: print "Testing __del__ hook..."
-    log = []
-    class C(object):
-        def __del__(self):
-            log.append(1)
-    c = C()
-    vereq(log, [])
-    del c
-    vereq(log, [1])
-
-    class D(object): pass
-    d = D()
-    try: del d[0]
-    except TypeError: pass
-    else: raise TestFailed, "invalid del() didn't raise TypeError"
-
-def hashinherit():
-    if verbose: print "Testing hash of mutable subclasses..."
-
-    class mydict(dict):
-        pass
-    d = mydict()
-    try:
-        hash(d)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "hash() of dict subclass should fail"
-
-    class mylist(list):
-        pass
-    d = mylist()
-    try:
-        hash(d)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "hash() of list subclass should fail"
-
-def strops():
-    try: 'a' + 5
-    except TypeError: pass
-    else: raise TestFailed, "'' + 5 doesn't raise TypeError"
-
-    try: ''.split('')
-    except ValueError: pass
-    else: raise TestFailed, "''.split('') doesn't raise ValueError"
-
-    try: ''.join([0])
-    except TypeError: pass
-    else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
-
-    try: ''.rindex('5')
-    except ValueError: pass
-    else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
-
-    try: '%(n)s' % None
-    except TypeError: pass
-    else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
-
-    try: '%(n' % {}
-    except ValueError: pass
-    else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
-
-    try: '%*s' % ('abc')
-    except TypeError: pass
-    else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
-
-    try: '%*.*s' % ('abc', 5)
-    except TypeError: pass
-    else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
-
-    try: '%s' % (1, 2)
-    except TypeError: pass
-    else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
-
-    try: '%' % None
-    except ValueError: pass
-    else: raise TestFailed, "'%' % None doesn't raise ValueError"
-
-    vereq('534253'.isdigit(), 1)
-    vereq('534253x'.isdigit(), 0)
-    vereq('%c' % 5, '\x05')
-    vereq('%c' % '5', '5')
-
-def deepcopyrecursive():
-    if verbose: print "Testing deepcopy of recursive objects..."
-    class Node:
-        pass
-    a = Node()
-    b = Node()
-    a.b = b
-    b.a = a
-    z = deepcopy(a) # This blew up before
-
-def modules():
-    if verbose: print "Testing uninitialized module objects..."
-    from types import ModuleType as M
-    m = M.__new__(M)
-    str(m)
-    vereq(hasattr(m, "__name__"), 0)
-    vereq(hasattr(m, "__file__"), 0)
-    vereq(hasattr(m, "foo"), 0)
-    vereq(m.__dict__, None)
-    m.foo = 1
-    vereq(m.__dict__, {"foo": 1})
-
-def dictproxyiterkeys():
-    class C(object):
-        def meth(self):
-            pass
-    if verbose: print "Testing dict-proxy iterkeys..."
-    keys = [ key for key in C.__dict__.iterkeys() ]
-    keys.sort()
-    vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
-
-def dictproxyitervalues():
-    class C(object):
-        def meth(self):
-            pass
-    if verbose: print "Testing dict-proxy itervalues..."
-    values = [ values for values in C.__dict__.itervalues() ]
-    vereq(len(values), 5)
-
-def dictproxyiteritems():
-    class C(object):
-        def meth(self):
-            pass
-    if verbose: print "Testing dict-proxy iteritems..."
-    keys = [ key for (key, value) in C.__dict__.iteritems() ]
-    keys.sort()
-    vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
-
-def funnynew():
-    if verbose: print "Testing __new__ returning something unexpected..."
-    class C(object):
-        def __new__(cls, arg):
-            if isinstance(arg, str): return [1, 2, 3]
-            elif isinstance(arg, int): return object.__new__(D)
-            else: return object.__new__(cls)
-    class D(C):
-        def __init__(self, arg):
-            self.foo = arg
-    vereq(C("1"), [1, 2, 3])
-    vereq(D("1"), [1, 2, 3])
-    d = D(None)
-    veris(d.foo, None)
-    d = C(1)
-    vereq(isinstance(d, D), True)
-    vereq(d.foo, 1)
-    d = D(1)
-    vereq(isinstance(d, D), True)
-    vereq(d.foo, 1)
-
-def imulbug():
-    # SF bug 544647
-    if verbose: print "Testing for __imul__ problems..."
-    class C(object):
-        def __imul__(self, other):
-            return (self, other)
-    x = C()
-    y = x
-    y *= 1.0
-    vereq(y, (x, 1.0))
-    y = x
-    y *= 2
-    vereq(y, (x, 2))
-    y = x
-    y *= 3L
-    vereq(y, (x, 3L))
-    y = x
-    y *= 1L<<100
-    vereq(y, (x, 1L<<100))
-    y = x
-    y *= None
-    vereq(y, (x, None))
-    y = x
-    y *= "foo"
-    vereq(y, (x, "foo"))
-
-def docdescriptor():
-    # SF bug 542984
-    if verbose: print "Testing __doc__ descriptor..."
-    class DocDescr(object):
-        def __get__(self, object, otype):
-            if object:
-                object = object.__class__.__name__ + ' instance'
-            if otype:
-                otype = otype.__name__
-            return 'object=%s; type=%s' % (object, otype)
-    class OldClass:
-        __doc__ = DocDescr()
-    class NewClass(object):
-        __doc__ = DocDescr()
-    vereq(OldClass.__doc__, 'object=None; type=OldClass')
-    vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
-    vereq(NewClass.__doc__, 'object=None; type=NewClass')
-    vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
-
-def copy_setstate():
-    if verbose:
-        print "Testing that copy.*copy() correctly uses __setstate__..."
-    import copy
-    class C(object):
-        def __init__(self, foo=None):
-            self.foo = foo
-            self.__foo = foo
-        def setfoo(self, foo=None):
-            self.foo = foo
-        def getfoo(self):
-            return self.__foo
-        def __getstate__(self):
-            return [self.foo]
-        def __setstate__(self, lst):
-            assert len(lst) == 1
-            self.__foo = self.foo = lst[0]
-    a = C(42)
-    a.setfoo(24)
-    vereq(a.foo, 24)
-    vereq(a.getfoo(), 42)
-    b = copy.copy(a)
-    vereq(b.foo, 24)
-    vereq(b.getfoo(), 24)
-    b = copy.deepcopy(a)
-    vereq(b.foo, 24)
-    vereq(b.getfoo(), 24)
-
-def slices():
-    if verbose:
-        print "Testing cases with slices and overridden __getitem__ ..."
-    # Strings
-    vereq("hello"[:4], "hell")
-    vereq("hello"[slice(4)], "hell")
-    vereq(str.__getitem__("hello", slice(4)), "hell")
-    class S(str):
-        def __getitem__(self, x):
-            return str.__getitem__(self, x)
-    vereq(S("hello")[:4], "hell")
-    vereq(S("hello")[slice(4)], "hell")
-    vereq(S("hello").__getitem__(slice(4)), "hell")
-    # Tuples
-    vereq((1,2,3)[:2], (1,2))
-    vereq((1,2,3)[slice(2)], (1,2))
-    vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
-    class T(tuple):
-        def __getitem__(self, x):
-            return tuple.__getitem__(self, x)
-    vereq(T((1,2,3))[:2], (1,2))
-    vereq(T((1,2,3))[slice(2)], (1,2))
-    vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
-    # Lists
-    vereq([1,2,3][:2], [1,2])
-    vereq([1,2,3][slice(2)], [1,2])
-    vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
-    class L(list):
-        def __getitem__(self, x):
-            return list.__getitem__(self, x)
-    vereq(L([1,2,3])[:2], [1,2])
-    vereq(L([1,2,3])[slice(2)], [1,2])
-    vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
-    # Now do lists and __setitem__
-    a = L([1,2,3])
-    a[slice(1, 3)] = [3,2]
-    vereq(a, [1,3,2])
-    a[slice(0, 2, 1)] = [3,1]
-    vereq(a, [3,1,2])
-    a.__setitem__(slice(1, 3), [2,1])
-    vereq(a, [3,2,1])
-    a.__setitem__(slice(0, 2, 1), [2,3])
-    vereq(a, [2,3,1])
-
-def subtype_resurrection():
-    if verbose:
-        print "Testing resurrection of new-style instance..."
-
-    class C(object):
-        container = []
-
-        def __del__(self):
-            # resurrect the instance
-            C.container.append(self)
-
-    c = C()
-    c.attr = 42
-    # The most interesting thing here is whether this blows up, due to flawed
-    #  GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
-    del c
-
-    # If that didn't blow up, it's also interesting to see whether clearing
-    # the last container slot works:  that will attempt to delete c again,
-    # which will cause c to get appended back to the container again "during"
-    # the del.
-    del C.container[-1]
-    vereq(len(C.container), 1)
-    vereq(C.container[-1].attr, 42)
-
-    # Make c mortal again, so that the test framework with -l doesn't report
-    # it as a leak.
-    del C.__del__
-
-def slottrash():
-    # Deallocating deeply nested slotted trash caused stack overflows
-    if verbose:
-        print "Testing slot trash..."
-    class trash(object):
-        __slots__ = ['x']
-        def __init__(self, x):
-            self.x = x
-    o = None
-    for i in xrange(50000):
-        o = trash(o)
-    del o
-
-def slotmultipleinheritance():
-    # SF bug 575229, multiple inheritance w/ slots dumps core
-    class A(object):
-        __slots__=()
-    class B(object):
-        pass
-    class C(A,B) :
-        __slots__=()
-    vereq(C.__basicsize__, B.__basicsize__)
-    verify(hasattr(C, '__dict__'))
-    verify(hasattr(C, '__weakref__'))
-    C().x = 2
-
-def testrmul():
-    # SF patch 592646
-    if verbose:
-        print "Testing correct invocation of __rmul__..."
-    class C(object):
-        def __mul__(self, other):
-            return "mul"
-        def __rmul__(self, other):
-            return "rmul"
-    a = C()
-    vereq(a*2, "mul")
-    vereq(a*2.2, "mul")
-    vereq(2*a, "rmul")
-    vereq(2.2*a, "rmul")
-
-def testipow():
-    # [SF bug 620179]
-    if verbose:
-        print "Testing correct invocation of __ipow__..."
-    class C(object):
-        def __ipow__(self, other):
-            pass
-    a = C()
-    a **= 2
-
-def do_this_first():
-    if verbose:
-        print "Testing SF bug 551412 ..."
-    # This dumps core when SF bug 551412 isn't fixed --
-    # but only when test_descr.py is run separately.
-    # (That can't be helped -- as soon as PyType_Ready()
-    # is called for PyLong_Type, the bug is gone.)
-    class UserLong(object):
-        def __pow__(self, *args):
-            pass
-    try:
-        pow(0L, UserLong(), 0L)
-    except:
-        pass
-
-    if verbose:
-        print "Testing SF bug 570483..."
-    # Another segfault only when run early
-    # (before PyType_Ready(tuple) is called)
-    type.mro(tuple)
-
-def test_mutable_bases():
-    if verbose:
-        print "Testing mutable bases..."
-    # stuff that should work:
-    class C(object):
-        pass
-    class C2(object):
-        def __getattribute__(self, attr):
-            if attr == 'a':
-                return 2
-            else:
-                return super(C2, self).__getattribute__(attr)
-        def meth(self):
-            return 1
-    class D(C):
-        pass
-    class E(D):
-        pass
-    d = D()
-    e = E()
-    D.__bases__ = (C,)
-    D.__bases__ = (C2,)
-    vereq(d.meth(), 1)
-    vereq(e.meth(), 1)
-    vereq(d.a, 2)
-    vereq(e.a, 2)
-    vereq(C2.__subclasses__(), [D])
-
-    # stuff that shouldn't:
-    class L(list):
-        pass
-
-    try:
-        L.__bases__ = (dict,)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't turn list subclass into dict subclass"
-
-    try:
-        list.__bases__ = (dict,)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to assign to list.__bases__"
-
-    try:
-        D.__bases__ = (C2, list)
-    except TypeError:
-        pass
-    else:
-        assert 0, "best_base calculation found wanting"
-
-    try:
-        del D.__bases__
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to delete .__bases__"
-
-    try:
-        D.__bases__ = ()
-    except TypeError, msg:
-        if str(msg) == "a new-style class can't have only classic bases":
-            raise TestFailed, "wrong error message for .__bases__ = ()"
-    else:
-        raise TestFailed, "shouldn't be able to set .__bases__ to ()"
-
-    try:
-        D.__bases__ = (D,)
-    except TypeError:
-        pass
-    else:
-        # actually, we'll have crashed by here...
-        raise TestFailed, "shouldn't be able to create inheritance cycles"
-
-    try:
-        D.__bases__ = (C, C)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "didn't detect repeated base classes"
-
-    try:
-        D.__bases__ = (E,)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to create inheritance cycles"
-
-    # let's throw a classic class into the mix:
-    class Classic:
-        def meth2(self):
-            return 3
-
-    D.__bases__ = (C, Classic)
-
-    vereq(d.meth2(), 3)
-    vereq(e.meth2(), 3)
-    try:
-        d.a
-    except AttributeError:
-        pass
-    else:
-        raise TestFailed, "attribute should have vanished"
-
-    try:
-        D.__bases__ = (Classic,)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "new-style class must have a new-style base"
-
-def test_mutable_bases_with_failing_mro():
-    if verbose:
-        print "Testing mutable bases with failing mro..."
-    class WorkOnce(type):
-        def __new__(self, name, bases, ns):
-            self.flag = 0
-            return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
-        def mro(self):
-            if self.flag > 0:
-                raise RuntimeError, "bozo"
-            else:
-                self.flag += 1
-                return type.mro(self)
+        class B(object):
+            def f(self):
+                return "B.f"
+
+        class C(B):
+            def f(self):
+                return super(C, self).f() + "->C.f"
+
+        obj = C()
+        p = Proxy(obj)
+        self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
+
+    def test_carloverre(self):
+        # Testing prohibition of Carlo Verre's hack...
+        try:
+            object.__setattr__(str, "foo", 42)
+        except TypeError:
+            pass
+        else:
+            self.fail("Carlo Verre __setattr__ suceeded!")
+        try:
+            object.__delattr__(str, "lower")
+        except TypeError:
+            pass
+        else:
+            self.fail("Carlo Verre __delattr__ succeeded!")
 
-    class WorkAlways(type):
-        def mro(self):
-            # this is here to make sure that .mro()s aren't called
-            # with an exception set (which was possible at one point).
-            # An error message will be printed in a debug build.
-            # What's a good way to test for this?
-            return type.mro(self)
+    def test_weakref_segfault(self):
+        # Testing weakref segfault...
+        # SF 742911
+        import weakref
 
-    class C(object):
-        pass
+        class Provoker:
+            def __init__(self, referrent):
+                self.ref = weakref.ref(referrent)
 
-    class C2(object):
-        pass
+            def __del__(self):
+                x = self.ref()
 
-    class D(C):
-        pass
+        class Oops(object):
+            pass
+
+        o = Oops()
+        o.whatever = Provoker(o)
+        del o
+
+    def test_wrapper_segfault(self):
+        # SF 927248: deeply nested wrappers could cause stack overflow
+        f = lambda:None
+        for i in xrange(1000000):
+            f = f.__call__
+        f = None
+
+    def test_file_fault(self):
+        # Testing sys.stdout is changed in getattr...
+        import sys
+        class StdoutGuard:
+            def __getattr__(self, attr):
+                sys.stdout = sys.__stdout__
+                raise RuntimeError("Premature access to sys.stdout.%s" % attr)
+        sys.stdout = StdoutGuard()
+        try:
+            print "Oops!"
+        except RuntimeError:
+            pass
 
-    class E(D):
-        pass
+    def test_vicious_descriptor_nonsense(self):
+        # Testing vicious_descriptor_nonsense...
 
-    class F(D):
-        __metaclass__ = WorkOnce
+        # A potential segfault spotted by Thomas Wouters in mail to
+        # python-dev 2003-04-17, turned into an example & fixed by Michael
+        # Hudson just less than four months later...
+
+        class Evil(object):
+            def __hash__(self):
+                return hash('attr')
+            def __eq__(self, other):
+                del C.attr
+                return 0
 
-    class G(D):
-        __metaclass__ = WorkAlways
+        class Descr(object):
+            def __get__(self, ob, type=None):
+                return 1
 
-    # Immediate subclasses have their mro's adjusted in alphabetical
-    # order, so E's will get adjusted before adjusting F's fails.  We
-    # check here that E's gets restored.
+        class C(object):
+            attr = Descr()
 
-    E_mro_before = E.__mro__
-    D_mro_before = D.__mro__
+        c = C()
+        c.__dict__[Evil()] = 0
 
-    try:
-        D.__bases__ = (C2,)
-    except RuntimeError:
-        vereq(E.__mro__, E_mro_before)
-        vereq(D.__mro__, D_mro_before)
-    else:
-        raise TestFailed, "exception not propagated"
-
-def test_mutable_bases_catch_mro_conflict():
-    if verbose:
-        print "Testing mutable bases catch mro conflict..."
-    class A(object):
-        pass
-
-    class B(object):
-        pass
-
-    class C(A, B):
-        pass
-
-    class D(A, B):
-        pass
-
-    class E(C, D):
-        pass
-
-    try:
-        C.__bases__ = (B, A)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "didn't catch MRO conflict"
-
-def mutable_names():
-    if verbose:
-        print "Testing mutable names..."
-    class C(object):
-        pass
-
-    # C.__module__ could be 'test_descr' or '__main__'
-    mod = C.__module__
-
-    C.__name__ = 'D'
-    vereq((C.__module__, C.__name__), (mod, 'D'))
-
-    C.__name__ = 'D.E'
-    vereq((C.__module__, C.__name__), (mod, 'D.E'))
-
-def subclass_right_op():
-    if verbose:
-        print "Testing correct dispatch of subclass overloading __r<op>__..."
-
-    # This code tests various cases where right-dispatch of a subclass
-    # should be preferred over left-dispatch of a base class.
-
-    # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
-
-    class B(int):
-        def __floordiv__(self, other):
-            return "B.__floordiv__"
-        def __rfloordiv__(self, other):
-            return "B.__rfloordiv__"
-
-    vereq(B(1) // 1, "B.__floordiv__")
-    vereq(1 // B(1), "B.__rfloordiv__")
-
-    # Case 2: subclass of object; this is just the baseline for case 3
-
-    class C(object):
-        def __floordiv__(self, other):
-            return "C.__floordiv__"
-        def __rfloordiv__(self, other):
-            return "C.__rfloordiv__"
-
-    vereq(C() // 1, "C.__floordiv__")
-    vereq(1 // C(), "C.__rfloordiv__")
-
-    # Case 3: subclass of new-style class; here it gets interesting
-
-    class D(C):
-        def __floordiv__(self, other):
-            return "D.__floordiv__"
-        def __rfloordiv__(self, other):
-            return "D.__rfloordiv__"
-
-    vereq(D() // C(), "D.__floordiv__")
-    vereq(C() // D(), "D.__rfloordiv__")
-
-    # Case 4: this didn't work right in 2.2.2 and 2.3a1
-
-    class E(C):
-        pass
-
-    vereq(E.__rfloordiv__, C.__rfloordiv__)
-
-    vereq(E() // 1, "C.__floordiv__")
-    vereq(1 // E(), "C.__rfloordiv__")
-    vereq(E() // C(), "C.__floordiv__")
-    vereq(C() // E(), "C.__floordiv__") # This one would fail
-
-def dict_type_with_metaclass():
-    if verbose:
-        print "Testing type of __dict__ when __metaclass__ set..."
-
-    class B(object):
-        pass
-    class M(type):
-        pass
-    class C:
-        # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
-        __metaclass__ = M
-    veris(type(C.__dict__), type(B.__dict__))
-
-def meth_class_get():
-    # Full coverage of descrobject.c::classmethod_get()
-    if verbose:
-        print "Testing __get__ method of METH_CLASS C methods..."
-    # Baseline
-    arg = [1, 2, 3]
-    res = {1: None, 2: None, 3: None}
-    vereq(dict.fromkeys(arg), res)
-    vereq({}.fromkeys(arg), res)
-    # Now get the descriptor
-    descr = dict.__dict__["fromkeys"]
-    # More baseline using the descriptor directly
-    vereq(descr.__get__(None, dict)(arg), res)
-    vereq(descr.__get__({})(arg), res)
-    # Now check various error cases
-    try:
-        descr.__get__(None, None)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
-    try:
-        descr.__get__(42)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't have allowed descr.__get__(42)"
-    try:
-        descr.__get__(None, 42)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
-    try:
-        descr.__get__(None, int)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
-
-def isinst_isclass():
-    if verbose:
-        print "Testing proxy isinstance() and isclass()..."
-    class Proxy(object):
-        def __init__(self, obj):
-            self.__obj = obj
-        def __getattribute__(self, name):
-            if name.startswith("_Proxy__"):
-                return object.__getattribute__(self, name)
-            else:
-                return getattr(self.__obj, name)
-    # Test with a classic class
-    class C:
-        pass
-    a = C()
-    pa = Proxy(a)
-    verify(isinstance(a, C))  # Baseline
-    verify(isinstance(pa, C)) # Test
-    # Test with a classic subclass
-    class D(C):
-        pass
-    a = D()
-    pa = Proxy(a)
-    verify(isinstance(a, C))  # Baseline
-    verify(isinstance(pa, C)) # Test
-    # Test with a new-style class
-    class C(object):
-        pass
-    a = C()
-    pa = Proxy(a)
-    verify(isinstance(a, C))  # Baseline
-    verify(isinstance(pa, C)) # Test
-    # Test with a new-style subclass
-    class D(C):
-        pass
-    a = D()
-    pa = Proxy(a)
-    verify(isinstance(a, C))  # Baseline
-    verify(isinstance(pa, C)) # Test
-
-def proxysuper():
-    if verbose:
-        print "Testing super() for a proxy object..."
-    class Proxy(object):
-        def __init__(self, obj):
-            self.__obj = obj
-        def __getattribute__(self, name):
-            if name.startswith("_Proxy__"):
-                return object.__getattribute__(self, name)
-            else:
-                return getattr(self.__obj, name)
+        self.assertEqual(c.attr, 1)
+        # this makes a crash more likely:
+        import gc; gc.collect()
+        self.assertEqual(hasattr(c, 'attr'), False)
+
+    def test_init(self):
+        # SF 1155938
+        class Foo(object):
+            def __init__(self):
+                return 10
+        try:
+            Foo()
+        except TypeError:
+            pass
+        else:
+            self.fail("did not test __init__() for None return")
+
+    def test_method_wrapper(self):
+        # Testing method-wrapper objects...
+        # <type 'method-wrapper'> did not support any reflection before 2.5
+
+        l = []
+        self.assertEqual(l.__add__, l.__add__)
+        self.assertEqual(l.__add__, [].__add__)
+        self.assert_(l.__add__ != [5].__add__)
+        self.assert_(l.__add__ != l.__mul__)
+        self.assert_(l.__add__.__name__ == '__add__')
+        self.assert_(l.__add__.__self__ is l)
+        self.assert_(l.__add__.__objclass__ is list)
+        self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
+        try:
+            hash(l.__add__)
+        except TypeError:
+            pass
+        else:
+            self.fail("no TypeError from hash([].__add__)")
+
+        t = ()
+        t += (7,)
+        self.assertEqual(t.__add__, (7,).__add__)
+        self.assertEqual(hash(t.__add__), hash((7,).__add__))
+
+    def test_not_implemented(self):
+        # Testing NotImplemented...
+        # all binary methods should be able to return a NotImplemented
+        import sys
+        import types
+        import operator
+
+        def specialmethod(self, other):
+            return NotImplemented
 
-    class B(object):
-        def f(self):
-            return "B.f"
-
-    class C(B):
-        def f(self):
-            return super(C, self).f() + "->C.f"
-
-    obj = C()
-    p = Proxy(obj)
-    vereq(C.__dict__["f"](p), "B.f->C.f")
-
-def carloverre():
-    if verbose:
-        print "Testing prohibition of Carlo Verre's hack..."
-    try:
-        object.__setattr__(str, "foo", 42)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "Carlo Verre __setattr__ suceeded!"
-    try:
-        object.__delattr__(str, "lower")
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "Carlo Verre __delattr__ succeeded!"
-
-def weakref_segfault():
-    # SF 742911
-    if verbose:
-        print "Testing weakref segfault..."
-
-    import weakref
-
-    class Provoker:
-        def __init__(self, referrent):
-            self.ref = weakref.ref(referrent)
-
-        def __del__(self):
-            x = self.ref()
-
-    class Oops(object):
-        pass
-
-    o = Oops()
-    o.whatever = Provoker(o)
-    del o
-
-def wrapper_segfault():
-    # SF 927248: deeply nested wrappers could cause stack overflow
-    f = lambda:None
-    for i in xrange(1000000):
-        f = f.__call__
-    f = None
-
-# Fix SF #762455, segfault when sys.stdout is changed in getattr
-def filefault():
-    if verbose:
-        print "Testing sys.stdout is changed in getattr..."
-    import sys
-    class StdoutGuard:
-        def __getattr__(self, attr):
-            sys.stdout = sys.__stdout__
-            raise RuntimeError("Premature access to sys.stdout.%s" % attr)
-    sys.stdout = StdoutGuard()
-    try:
-        print "Oops!"
-    except RuntimeError:
-        pass
-
-def vicious_descriptor_nonsense():
-    # A potential segfault spotted by Thomas Wouters in mail to
-    # python-dev 2003-04-17, turned into an example & fixed by Michael
-    # Hudson just less than four months later...
-    if verbose:
-        print "Testing vicious_descriptor_nonsense..."
-
-    class Evil(object):
-        def __hash__(self):
-            return hash('attr')
-        def __eq__(self, other):
-            del C.attr
-            return 0
-
-    class Descr(object):
-        def __get__(self, ob, type=None):
-            return 1
-
-    class C(object):
-        attr = Descr()
-
-    c = C()
-    c.__dict__[Evil()] = 0
-
-    vereq(c.attr, 1)
-    # this makes a crash more likely:
-    import gc; gc.collect()
-    vereq(hasattr(c, 'attr'), False)
-
-def test_init():
-    # SF 1155938
-    class Foo(object):
-        def __init__(self):
-            return 10
-    try:
-        Foo()
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "did not test __init__() for None return"
-
-def methodwrapper():
-    # <type 'method-wrapper'> did not support any reflection before 2.5
-    if verbose:
-        print "Testing method-wrapper objects..."
-
-    l = []
-    vereq(l.__add__, l.__add__)
-    vereq(l.__add__, [].__add__)
-    verify(l.__add__ != [5].__add__)
-    verify(l.__add__ != l.__mul__)
-    verify(l.__add__.__name__ == '__add__')
-    verify(l.__add__.__self__ is l)
-    verify(l.__add__.__objclass__ is list)
-    vereq(l.__add__.__doc__, list.__add__.__doc__)
-    try:
-        hash(l.__add__)
-    except TypeError:
-        pass
-    else:
-        raise TestFailed("no TypeError from hash([].__add__)")
-
-    t = ()
-    t += (7,)
-    vereq(t.__add__, (7,).__add__)
-    vereq(hash(t.__add__), hash((7,).__add__))
-
-def notimplemented():
-    # all binary methods should be able to return a NotImplemented
-    if verbose:
-        print "Testing NotImplemented..."
-
-    import sys
-    import types
-    import operator
-
-    def specialmethod(self, other):
-        return NotImplemented
-
-    def check(expr, x, y):
-        try:
-            exec expr in {'x': x, 'y': y, 'operator': operator}
-        except TypeError:
-            pass
-        else:
-            raise TestFailed("no TypeError from %r" % (expr,))
-
-    N1 = sys.maxint + 1L    # might trigger OverflowErrors instead of TypeErrors
-    N2 = sys.maxint         # if sizeof(int) < sizeof(long), might trigger
-                            #   ValueErrors instead of TypeErrors
-    for metaclass in [type, types.ClassType]:
-        for name, expr, iexpr in [
-                ('__add__',      'x + y',                   'x += y'),
-                ('__sub__',      'x - y',                   'x -= y'),
-                ('__mul__',      'x * y',                   'x *= y'),
-                ('__truediv__',  'operator.truediv(x, y)',  None),
-                ('__floordiv__', 'operator.floordiv(x, y)', None),
-                ('__div__',      'x / y',                   'x /= y'),
-                ('__mod__',      'x % y',                   'x %= y'),
-                ('__divmod__',   'divmod(x, y)',            None),
-                ('__pow__',      'x ** y',                  'x **= y'),
-                ('__lshift__',   'x << y',                  'x <<= y'),
-                ('__rshift__',   'x >> y',                  'x >>= y'),
-                ('__and__',      'x & y',                   'x &= y'),
-                ('__or__',       'x | y',                   'x |= y'),
-                ('__xor__',      'x ^ y',                   'x ^= y'),
-                ('__coerce__',   'coerce(x, y)',            None)]:
-            if name == '__coerce__':
-                rname = name
+        def check(expr, x, y):
+            try:
+                exec expr in {'x': x, 'y': y, 'operator': operator}
+            except TypeError:
+                pass
             else:
-                rname = '__r' + name[2:]
-            A = metaclass('A', (), {name: specialmethod})
-            B = metaclass('B', (), {rname: specialmethod})
-            a = A()
-            b = B()
-            check(expr, a, a)
-            check(expr, a, b)
-            check(expr, b, a)
-            check(expr, b, b)
-            check(expr, a, N1)
-            check(expr, a, N2)
-            check(expr, N1, b)
-            check(expr, N2, b)
-            if iexpr:
-                check(iexpr, a, a)
-                check(iexpr, a, b)
-                check(iexpr, b, a)
-                check(iexpr, b, b)
-                check(iexpr, a, N1)
-                check(iexpr, a, N2)
-                iname = '__i' + name[2:]
-                C = metaclass('C', (), {iname: specialmethod})
-                c = C()
-                check(iexpr, c, a)
-                check(iexpr, c, b)
-                check(iexpr, c, N1)
-                check(iexpr, c, N2)
-
-def test_assign_slice():
-    # ceval.c's assign_slice used to check for
-    # tp->tp_as_sequence->sq_slice instead of
-    # tp->tp_as_sequence->sq_ass_slice
-    if verbose:
-        print "Testing assign_slice..."
-
-    class C(object):
-        def __setslice__(self, start, stop, value):
-            self.value = value
-
-    c = C()
-    c[1:2] = 3
-    vereq(c.value, 3)
-
-def test_weakref_in_del_segfault():
-    # This used to segfault until r60057
-    if verbose:
-        print "Testing weakref in del segfault..."
-
-    import weakref
-    global ref
-
-    class Target():
-        def __del__(self):
-            global ref
-            ref = weakref.ref(self)
-
-    w = Target()
-    del w
-    del ref
-
-def test_borrowed_ref_3_segfault():
-    # This used to segfault until r60224
-    if verbose:
-        print "Testing borrowed ref 3 segfault..."
-
-    class KeyFunc(object):
-        def __call__(self, n):
-            del d['key']
-            return 1
-
-    d = {'key': KeyFunc()}
-    try:
-        min(range(10), **d)
-    except:
-        pass
-
-def test_borrowed_ref_4_segfault():
-    # This used to segfault until r60224
-    if verbose:
-        print "Testing borrowed ref 4 segfault..."
+                self.fail("no TypeError from %r" % (expr,))
 
-    import types
-    import __builtin__
+        N1 = sys.maxint + 1L    # might trigger OverflowErrors instead of
+                                # TypeErrors
+        N2 = sys.maxint         # if sizeof(int) < sizeof(long), might trigger
+                                #   ValueErrors instead of TypeErrors
+        for metaclass in [type, types.ClassType]:
+            for name, expr, iexpr in [
+                    ('__add__',      'x + y',                   'x += y'),
+                    ('__sub__',      'x - y',                   'x -= y'),
+                    ('__mul__',      'x * y',                   'x *= y'),
+                    ('__truediv__',  'operator.truediv(x, y)',  None),
+                    ('__floordiv__', 'operator.floordiv(x, y)', None),
+                    ('__div__',      'x / y',                   'x /= y'),
+                    ('__mod__',      'x % y',                   'x %= y'),
+                    ('__divmod__',   'divmod(x, y)',            None),
+                    ('__pow__',      'x ** y',                  'x **= y'),
+                    ('__lshift__',   'x << y',                  'x <<= y'),
+                    ('__rshift__',   'x >> y',                  'x >>= y'),
+                    ('__and__',      'x & y',                   'x &= y'),
+                    ('__or__',       'x | y',                   'x |= y'),
+                    ('__xor__',      'x ^ y',                   'x ^= y'),
+                    ('__coerce__',   'coerce(x, y)',            None)]:
+                if name == '__coerce__':
+                    rname = name
+                else:
+                    rname = '__r' + name[2:]
+                A = metaclass('A', (), {name: specialmethod})
+                B = metaclass('B', (), {rname: specialmethod})
+                a = A()
+                b = B()
+                check(expr, a, a)
+                check(expr, a, b)
+                check(expr, b, a)
+                check(expr, b, b)
+                check(expr, a, N1)
+                check(expr, a, N2)
+                check(expr, N1, b)
+                check(expr, N2, b)
+                if iexpr:
+                    check(iexpr, a, a)
+                    check(iexpr, a, b)
+                    check(iexpr, b, a)
+                    check(iexpr, b, b)
+                    check(iexpr, a, N1)
+                    check(iexpr, a, N2)
+                    iname = '__i' + name[2:]
+                    C = metaclass('C', (), {iname: specialmethod})
+                    c = C()
+                    check(iexpr, c, a)
+                    check(iexpr, c, b)
+                    check(iexpr, c, N1)
+                    check(iexpr, c, N2)
+
+    def test_assign_slice(self):
+        # ceval.c's assign_slice used to check for
+        # tp->tp_as_sequence->sq_slice instead of
+        # tp->tp_as_sequence->sq_ass_slice
 
-    class X(object):
-        def __getattr__(self, name):
-            # this is called with name == '__bases__' by PyObject_IsInstance()
-            # during the unbound method call -- it frees the unbound method
-            # itself before it invokes its im_func.
-            del __builtin__.__import__
-            return ()
-
-    pseudoclass = X()
-
-    class Y(object):
-        def __call__(self, *args):
-            # 'self' was freed already
-            return (self, args)
-
-    # make an unbound method
-    orig_import = __import__
-    try:
-        __builtin__.__import__ = types.MethodType(Y(), None, (pseudoclass, str))
-        import spam
-    finally:
-        __builtin__.__import__ = orig_import
-
-def test_losing_dict_ref_segfault():
-    # This used to segfault;
-    # derived from issue #1303614, test67.py
-    if verbose:
-        print "Testing losing dict ref segfault..."
-
-    class Strange(object):
-        def __hash__(self):
-            return hash('hello')
-
-        def __eq__(self, other):
-            x.__dict__ = {}   # the old x.__dict__ is deallocated
-            return False
-
-    class X(object):
-        pass
-
-    v = 123
-    x = X()
-    x.__dict__ = {Strange(): 42, 'hello': v+456}
-    x.hello
+        class C(object):
+            def __setslice__(self, start, stop, value):
+                self.value = value
+
+        c = C()
+        c[1:2] = 3
+        self.assertEqual(c.value, 3)
 
 
-def test_main():
-    weakref_segfault() # Must be first, somehow
-    wrapper_segfault()
-    do_this_first()
-    class_docstrings()
-    lists()
-    dicts()
-    dict_constructor()
-    test_dir()
-    ints()
-    longs()
-    floats()
-    complexes()
-    spamlists()
-    spamdicts()
-    pydicts()
-    pylists()
-    metaclass()
-    pymods()
-    multi()
-    mro_disagreement()
-    diamond()
-    ex5()
-    monotonicity()
-    consistency_with_epg()
-    objects()
-    slots()
-    slotspecials()
-    dynamics()
-    errors()
-    classmethods()
-    classmethods_in_c()
-    staticmethods()
-    staticmethods_in_c()
-    classic()
-    compattr()
-    newslot()
-    altmro()
-    overloading()
-    methods()
-    specials()
-    recursions()
-    weakrefs()
-    properties()
-    properties_plus()
-    supers()
-    inherits()
-    keywords()
-    restricted()
-    str_subclass_as_dict_key()
-    classic_comparisons()
-    rich_comparisons()
-    coercions()
-    descrdoc()
-    setclass()
-    setdict()
-    pickles()
-    copies()
-    binopoverride()
-    subclasspropagation()
-    buffer_inherit()
-    str_of_str_subclass()
-    kwdargs()
-    recursive__call__()
-    delhook()
-    hashinherit()
-    strops()
-    deepcopyrecursive()
-    modules()
-    dictproxyiterkeys()
-    dictproxyitervalues()
-    dictproxyiteritems()
-    pickleslots()
-    funnynew()
-    imulbug()
-    docdescriptor()
-    copy_setstate()
-    slices()
-    subtype_resurrection()
-    slottrash()
-    slotmultipleinheritance()
-    testrmul()
-    testipow()
-    test_mutable_bases()
-    test_mutable_bases_with_failing_mro()
-    test_mutable_bases_catch_mro_conflict()
-    mutable_names()
-    subclass_right_op()
-    dict_type_with_metaclass()
-    meth_class_get()
-    isinst_isclass()
-    proxysuper()
-    carloverre()
-    filefault()
-    vicious_descriptor_nonsense()
-    test_init()
-    methodwrapper()
-    notimplemented()
-    test_assign_slice()
-    test_weakref_in_del_segfault()
-    test_borrowed_ref_3_segfault()
-    test_borrowed_ref_4_segfault()
-    test_losing_dict_ref_segfault()
+class DictProxyTests(unittest.TestCase):
+    def setUp(self):
+        class C(object):
+            def meth(self):
+                pass
+        self.C = C
+
+    def test_iter_keys(self):
+        # Testing dict-proxy iterkeys...
+        keys = [ key for key in self.C.__dict__.iterkeys() ]
+        keys.sort()
+        self.assertEquals(keys, ['__dict__', '__doc__', '__module__',
+            '__weakref__', 'meth'])
+
+    def test_iter_values(self):
+        # Testing dict-proxy itervalues...
+        values = [ values for values in self.C.__dict__.itervalues() ]
+        self.assertEqual(len(values), 5)
+
+    def test_iter_items(self):
+        # Testing dict-proxy iteritems...
+        keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
+        keys.sort()
+        self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
+            '__weakref__', 'meth'])
+
+    def test_dict_type_with_metaclass(self):
+        # Testing type of __dict__ when __metaclass__ set...
+        class B(object):
+            pass
+        class M(type):
+            pass
+        class C:
+            # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
+            __metaclass__ = M
+        self.assertEqual(type(C.__dict__), type(B.__dict__))
+
+
+class PTypesLongInitTest(unittest.TestCase):
+    # This is in its own TestCase so that it can be run before any other tests.
+    def test_pytype_long_ready(self):
+        # Testing SF bug 551412 ...
+
+        # This dumps core when SF bug 551412 isn't fixed --
+        # but only when test_descr.py is run separately.
+        # (That can't be helped -- as soon as PyType_Ready()
+        # is called for PyLong_Type, the bug is gone.)
+        class UserLong(object):
+            def __pow__(self, *args):
+                pass
+        try:
+            pow(0L, UserLong(), 0L)
+        except:
+            pass
+
+        # Another segfault only when run early
+        # (before PyType_Ready(tuple) is called)
+        type.mro(tuple)
 
-    if verbose: print "All OK"
+
+def test_main():
+    # Run all local test cases, with PTypesLongInitTest first.
+    test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
+                              ClassPropertiesAndMethods, DictProxyTests)
 
 if __name__ == "__main__":
     test_main()

Modified: python/branches/trunk-math/Lib/test/test_docxmlrpc.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_docxmlrpc.py	(original)
+++ python/branches/trunk-math/Lib/test/test_docxmlrpc.py	Tue Feb 12 06:36:19 2008
@@ -120,7 +120,7 @@
         response = self.client.getresponse()
 
         self.assert_( # This is ugly ... how can it be made better?
-"""<dl><dt><a name="-add"><strong>add</strong></a>(x, y)</dt><dd><tt>Add&nbsp;two&nbsp;instances&nbsp;together.&nbsp;This&nbsp;follows&nbsp;<a href="http://www.python.org/peps/pep-0008.html">PEP008</a>,&nbsp;but&nbsp;has&nbsp;nothing<br>\nto&nbsp;do&nbsp;with&nbsp;<a href="http://www.rfc-editor.org/rfc/rfc1952.txt">RFC1952</a>.&nbsp;Case&nbsp;should&nbsp;matter:&nbsp;pEp008&nbsp;and&nbsp;rFC1952.&nbsp;&nbsp;Things<br>\nthat&nbsp;start&nbsp;with&nbsp;http&nbsp;and&nbsp;ftp&nbsp;should&nbsp;be&nbsp;auto-linked,&nbsp;too:<br>\n<a href="http://google.com">http://google.com</a>.</tt></dd></dl>"""
+"""<dl><dt><a name="-add"><strong>add</strong></a>(x, y)</dt><dd><tt>Add&nbsp;two&nbsp;instances&nbsp;together.&nbsp;This&nbsp;follows&nbsp;<a href="http://www.python.org/dev/peps/pep-0008/">PEP008</a>,&nbsp;but&nbsp;has&nbsp;nothing<br>\nto&nbsp;do&nbsp;with&nbsp;<a href="http://www.rfc-editor.org/rfc/rfc1952.txt">RFC1952</a>.&nbsp;Case&nbsp;should&nbsp;matter:&nbsp;pEp008&nbsp;and&nbsp;rFC1952.&nbsp;&nbsp;Things<br>\nthat&nbsp;start&nbsp;with&nbsp;http&nbsp;and&nbsp;ftp&nbsp;should&nbsp;be&nbsp;auto-linked,&nbsp;too:<br>\n<a href="http://google.com">http://google.com</a>.</tt></dd></dl>"""
           in response.read())
 
     def test_system_methods(self):

Modified: python/branches/trunk-math/Lib/test/test_funcattrs.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_funcattrs.py	(original)
+++ python/branches/trunk-math/Lib/test/test_funcattrs.py	Tue Feb 12 06:36:19 2008
@@ -1,414 +1,282 @@
-from test.test_support import verbose, TestFailed, verify
+from test import test_support
 import types
+import unittest
 
-class F:
-    def a(self):
-        pass
-
-def b():
-    'my docstring'
-    pass
-
-# __module__ is a special attribute
-verify(b.__module__ == __name__)
-verify(verify.__module__ == "test.test_support")
-
-# setting attributes on functions
-try:
-    b.publish
-except AttributeError: pass
-else: raise TestFailed, 'expected AttributeError'
-
-if b.__dict__ <> {}:
-    raise TestFailed, 'expected unassigned func.__dict__ to be {}'
-
-b.publish = 1
-if b.publish <> 1:
-    raise TestFailed, 'function attribute not set to expected value'
-
-docstring = 'its docstring'
-b.__doc__ = docstring
-if b.__doc__ <> docstring:
-    raise TestFailed, 'problem with setting __doc__ attribute'
-
-if 'publish' not in dir(b):
-    raise TestFailed, 'attribute not in dir()'
-
-try:
-    del b.__dict__
-except TypeError: pass
-else: raise TestFailed, 'del func.__dict__ expected TypeError'
-
-b.publish = 1
-try:
-    b.__dict__ = None
-except TypeError: pass
-else: raise TestFailed, 'func.__dict__ = None expected TypeError'
-
-d = {'hello': 'world'}
-b.__dict__ = d
-if b.func_dict is not d:
-    raise TestFailed, 'func.__dict__ assignment to dictionary failed'
-if b.hello <> 'world':
-    raise TestFailed, 'attribute after func.__dict__ assignment failed'
-
-f1 = F()
-f2 = F()
-
-try:
-    F.a.publish
-except AttributeError: pass
-else: raise TestFailed, 'expected AttributeError'
-
-try:
-    f1.a.publish
-except AttributeError: pass
-else: raise TestFailed, 'expected AttributeError'
-
-# In Python 2.1 beta 1, we disallowed setting attributes on unbound methods
-# (it was already disallowed on bound methods).  See the PEP for details.
-try:
-    F.a.publish = 1
-except (AttributeError, TypeError): pass
-else: raise TestFailed, 'expected AttributeError or TypeError'
-
-# But setting it explicitly on the underlying function object is okay.
-F.a.im_func.publish = 1
-
-if F.a.publish <> 1:
-    raise TestFailed, 'unbound method attribute not set to expected value'
-
-if f1.a.publish <> 1:
-    raise TestFailed, 'bound method attribute access did not work'
-
-if f2.a.publish <> 1:
-    raise TestFailed, 'bound method attribute access did not work'
-
-if 'publish' not in dir(F.a):
-    raise TestFailed, 'attribute not in dir()'
-
-try:
-    f1.a.publish = 0
-except (AttributeError, TypeError): pass
-else: raise TestFailed, 'expected AttributeError or TypeError'
-
-# See the comment above about the change in semantics for Python 2.1b1
-try:
-    F.a.myclass = F
-except (AttributeError, TypeError): pass
-else: raise TestFailed, 'expected AttributeError or TypeError'
-
-F.a.im_func.myclass = F
-
-f1.a.myclass
-f2.a.myclass
-f1.a.myclass
-F.a.myclass
-
-if f1.a.myclass is not f2.a.myclass or \
-       f1.a.myclass is not F.a.myclass:
-    raise TestFailed, 'attributes were not the same'
-
-# try setting __dict__
-try:
-    F.a.__dict__ = (1, 2, 3)
-except (AttributeError, TypeError): pass
-else: raise TestFailed, 'expected TypeError or AttributeError'
-
-F.a.im_func.__dict__ = {'one': 11, 'two': 22, 'three': 33}
-
-if f1.a.two <> 22:
-    raise TestFailed, 'setting __dict__'
-
-from UserDict import UserDict
-d = UserDict({'four': 44, 'five': 55})
-
-try:
-    F.a.__dict__ = d
-except (AttributeError, TypeError): pass
-else: raise TestFailed
+class FuncAttrsTest(unittest.TestCase):
+    def setUp(self):
+        class F:
+            def a(self):
+                pass
+        def b():
+            return 3
+        self.f = F
+        self.fi = F()
+        self.b = b
+
+    def cannot_set_attr(self,obj, name, value, exceptions):
+        # This method is not called as a test (name doesn't start with 'test'),
+        # but may be used by other tests.
+        try: setattr(obj, name, value)
+        except exceptions: pass
+        else: self.fail("shouldn't be able to set %s to %r" % (name, value))
+        try: delattr(obj, name)
+        except exceptions: pass
+        else: self.fail("shouldn't be able to del %s" % name)
+
+
+class FunctionPropertiesTest(FuncAttrsTest):
+    # Include the external setUp method that is common to all tests
+    def test_module(self):
+        self.assertEqual(self.b.__module__, __name__)
+
+    def test_dir_includes_correct_attrs(self):
+        self.b.known_attr = 7
+        self.assert_('known_attr' in dir(self.b),
+            "set attributes not in dir listing of method")
+        # Test on underlying function object of method
+        self.f.a.im_func.known_attr = 7
+        self.assert_('known_attr' in dir(self.f.a),
+            "set attribute on unbound method implementation in class not in "
+                     "dir")
+        self.assert_('known_attr' in dir(self.fi.a),
+            "set attribute on unbound method implementations, should show up"
+                     " in next dir")
+
+    def test_duplicate_function_equality(self):
+        # Body of `duplicate' is the exact same as self.b
+        def duplicate():
+            'my docstring'
+            return 3
+        self.assertNotEqual(self.b, duplicate)
+
+    def test_copying_func_code(self):
+        def test(): pass
+        self.assertEqual(test(), None)
+        test.func_code = self.b.func_code
+        self.assertEqual(test(), 3) # self.b always returns 3, arbitrarily
+
+    def test_func_globals(self):
+        self.assertEqual(self.b.func_globals, globals())
+        self.cannot_set_attr(self.b, 'func_globals', 2, TypeError)
+
+    def test_func_name(self):
+        self.assertEqual(self.b.__name__, 'b')
+        self.assertEqual(self.b.func_name, 'b')
+        self.b.__name__ = 'c'
+        self.assertEqual(self.b.__name__, 'c')
+        self.assertEqual(self.b.func_name, 'c')
+        self.b.func_name = 'd'
+        self.assertEqual(self.b.__name__, 'd')
+        self.assertEqual(self.b.func_name, 'd')
+        # __name__ and func_name must be a string
+        self.cannot_set_attr(self.b, '__name__', 7, TypeError)
+        self.cannot_set_attr(self.b, 'func_name', 7, TypeError)
+        # __name__ must be available when in restricted mode. Exec will raise
+        # AttributeError if __name__ is not available on f.
+        s = """def f(): pass\nf.__name__"""
+        exec s in {'__builtins__': {}}
+        # Test on methods, too
+        self.assertEqual(self.f.a.__name__, 'a')
+        self.assertEqual(self.fi.a.__name__, 'a')
+        self.cannot_set_attr(self.f.a, "__name__", 'a', AttributeError)
+        self.cannot_set_attr(self.fi.a, "__name__", 'a', AttributeError)
+
+    def test_func_code(self):
+        num_one, num_two = 7, 8
+        def a(): pass
+        def b(): return 12
+        def c(): return num_one
+        def d(): return num_two
+        def e(): return num_one, num_two
+        for func in [a, b, c, d, e]:
+            self.assertEqual(type(func.func_code), types.CodeType)
+        self.assertEqual(c(), 7)
+        self.assertEqual(d(), 8)
+        d.func_code = c.func_code
+        self.assertEqual(c.func_code, d.func_code)
+        self.assertEqual(c(), 7)
+        # self.assertEqual(d(), 7)
+        try: b.func_code = c.func_code
+        except ValueError: pass
+        else: self.fail(
+            "func_code with different numbers of free vars should not be "
+            "possible")
+        try: e.func_code = d.func_code
+        except ValueError: pass
+        else: self.fail(
+            "func_code with different numbers of free vars should not be "
+            "possible")
+
+    def test_blank_func_defaults(self):
+        self.assertEqual(self.b.func_defaults, None)
+        del self.b.func_defaults
+        self.assertEqual(self.b.func_defaults, None)
+
+    def test_func_default_args(self):
+        def first_func(a, b):
+            return a+b
+        def second_func(a=1, b=2):
+            return a+b
+        self.assertEqual(first_func.func_defaults, None)
+        self.assertEqual(second_func.func_defaults, (1, 2))
+        first_func.func_defaults = (1, 2)
+        self.assertEqual(first_func.func_defaults, (1, 2))
+        self.assertEqual(first_func(), 3)
+        self.assertEqual(first_func(3), 5)
+        self.assertEqual(first_func(3, 5), 8)
+        del second_func.func_defaults
+        self.assertEqual(second_func.func_defaults, None)
+        try: second_func()
+        except TypeError: pass
+        else: self.fail(
+            "func_defaults does not update; deleting it does not remove "
+            "requirement")
+
+class ImplicitReferencesTest(FuncAttrsTest):
+    def test_im_class(self):
+        self.assertEqual(self.f.a.im_class, self.f)
+        self.assertEqual(self.fi.a.im_class, self.f)
+        self.cannot_set_attr(self.f.a, "im_class", self.f, TypeError)
+        self.cannot_set_attr(self.fi.a, "im_class", self.f, TypeError)
+
+    def test_im_func(self):
+        self.f.b = self.b
+        self.assertEqual(self.f.b.im_func, self.b)
+        self.assertEqual(self.fi.b.im_func, self.b)
+        self.cannot_set_attr(self.f.b, "im_func", self.b, TypeError)
+        self.cannot_set_attr(self.fi.b, "im_func", self.b, TypeError)
+
+    def test_im_self(self):
+        self.assertEqual(self.f.a.im_self, None)
+        self.assertEqual(self.fi.a.im_self, self.fi)
+        self.cannot_set_attr(self.f.a, "im_self", None, TypeError)
+        self.cannot_set_attr(self.fi.a, "im_self", self.fi, TypeError)
+
+    def test_im_func_non_method(self):
+        # Behavior should be the same when a method is added via an attr
+        # assignment
+        self.f.id = types.MethodType(id, None, self.f)
+        self.assertEqual(self.fi.id(), id(self.fi))
+        self.assertNotEqual(self.fi.id(), id(self.f))
+        # Test usage
+        try: self.f.id.unknown_attr
+        except AttributeError: pass
+        else: self.fail("using unknown attributes should raise AttributeError")
+        # Test assignment and deletion
+        self.cannot_set_attr(self.f.id, 'unknown_attr', 2, AttributeError)
+        self.cannot_set_attr(self.fi.id, 'unknown_attr', 2, AttributeError)
+
+    def test_implicit_method_properties(self):
+        self.f.a.im_func.known_attr = 7
+        self.assertEqual(self.f.a.known_attr, 7)
+        self.assertEqual(self.fi.a.known_attr, 7)
+
+class ArbitraryFunctionAttrTest(FuncAttrsTest):
+    def test_set_attr(self):
+        self.b.known_attr = 7
+        self.assertEqual(self.b.known_attr, 7)
+        for func in [self.f.a, self.fi.a]:
+            try: func.known_attr = 7
+            except AttributeError: pass
+            else: self.fail("setting attributes on methods should raise error")
+
+    def test_delete_unknown_attr(self):
+        try: del self.b.unknown_attr
+        except AttributeError: pass
+        else: self.fail("deleting unknown attribute should raise TypeError")
+
+    def test_setting_attrs_duplicates(self):
+        try: self.f.a.klass = self.f
+        except AttributeError: pass
+        else: self.fail("setting arbitrary attribute in unbound function "
+                        " should raise AttributeError")
+        self.f.a.im_func.klass = self.f
+        for method in [self.f.a, self.fi.a, self.fi.a.im_func]:
+            self.assertEqual(method.klass, self.f)
+
+    def test_unset_attr(self):
+        for func in [self.b, self.f.a, self.fi.a]:
+            try:  func.non_existant_attr
+            except AttributeError: pass
+            else: self.fail("using unknown attributes should raise "
+                            "AttributeError")
+
+class FunctionDictsTest(FuncAttrsTest):
+    def test_setting_dict_to_invalid(self):
+        self.cannot_set_attr(self.b, '__dict__', None, TypeError)
+        self.cannot_set_attr(self.b, 'func_dict', None, TypeError)
+        from UserDict import UserDict
+        d = UserDict({'known_attr': 7})
+        self.cannot_set_attr(self.f.a.im_func, '__dict__', d, TypeError)
+        self.cannot_set_attr(self.fi.a.im_func, '__dict__', d, TypeError)
+
+    def test_setting_dict_to_valid(self):
+        d = {'known_attr': 7}
+        self.b.__dict__ = d
+        # Setting dict is only possible on the underlying function objects
+        self.f.a.im_func.__dict__ = d
+        # Test assignment
+        self.assertEqual(d, self.b.__dict__)
+        self.assertEqual(d, self.b.func_dict)
+        # ... and on all the different ways of referencing the method's func
+        self.assertEqual(d, self.f.a.im_func.__dict__)
+        self.assertEqual(d, self.f.a.__dict__)
+        self.assertEqual(d, self.fi.a.im_func.__dict__)
+        self.assertEqual(d, self.fi.a.__dict__)
+        # Test value
+        self.assertEqual(self.b.known_attr, 7)
+        self.assertEqual(self.b.__dict__['known_attr'], 7)
+        self.assertEqual(self.b.func_dict['known_attr'], 7)
+        # ... and again, on all the different method's names
+        self.assertEqual(self.f.a.im_func.known_attr, 7)
+        self.assertEqual(self.f.a.known_attr, 7)
+        self.assertEqual(self.fi.a.im_func.known_attr, 7)
+        self.assertEqual(self.fi.a.known_attr, 7)
+
+    def test_delete_func_dict(self):
+        try: del self.b.__dict__
+        except TypeError: pass
+        else: self.fail("deleting function dictionary should raise TypeError")
+        try: del self.b.func_dict
+        except TypeError: pass
+        else: self.fail("deleting function dictionary should raise TypeError")
+
+    def test_unassigned_dict(self):
+        self.assertEqual(self.b.__dict__, {})
+
+    def test_func_as_dict_key(self):
+        value = "Some string"
+        d = {}
+        d[self.b] = value
+        self.assertEqual(d[self.b], value)
+
+class FunctionDocstringTest(FuncAttrsTest):
+    def test_set_docstring_attr(self):
+        self.assertEqual(self.b.__doc__, None)
+        self.assertEqual(self.b.func_doc, None)
+        docstr = "A test method that does nothing"
+        self.b.__doc__ = self.f.a.im_func.__doc__ = docstr
+        self.assertEqual(self.b.__doc__, docstr)
+        self.assertEqual(self.b.func_doc, docstr)
+        self.assertEqual(self.f.a.__doc__, docstr)
+        self.assertEqual(self.fi.a.__doc__, docstr)
+        self.cannot_set_attr(self.f.a, "__doc__", docstr, AttributeError)
+        self.cannot_set_attr(self.fi.a, "__doc__", docstr, AttributeError)
+
+    def test_delete_docstring(self):
+        self.b.__doc__ = "The docstring"
+        del self.b.__doc__
+        self.assertEqual(self.b.__doc__, None)
+        self.assertEqual(self.b.func_doc, None)
+        self.b.func_doc = "The docstring"
+        del self.b.func_doc
+        self.assertEqual(self.b.__doc__, None)
+        self.assertEqual(self.b.func_doc, None)
+
+def test_main():
+    test_support.run_unittest(FunctionPropertiesTest, ImplicitReferencesTest,
+                              ArbitraryFunctionAttrTest, FunctionDictsTest,
+                              FunctionDocstringTest)
 
-if f2.a.one <> f1.a.one <> F.a.one <> 11:
-    raise TestFailed
-
-# im_func may not be a Python method!
-import types
-F.id = types.MethodType(id, None, F)
-
-eff = F()
-if eff.id() <> id(eff):
-    raise TestFailed
-
-try:
-    F.id.foo
-except AttributeError: pass
-else: raise TestFailed
-
-try:
-    F.id.foo = 12
-except (AttributeError, TypeError): pass
-else: raise TestFailed
-
-try:
-    F.id.foo
-except AttributeError: pass
-else: raise TestFailed
-
-try:
-    eff.id.foo
-except AttributeError: pass
-else: raise TestFailed
-
-try:
-    eff.id.foo = 12
-except (AttributeError, TypeError): pass
-else: raise TestFailed
-
-try:
-    eff.id.foo
-except AttributeError: pass
-else: raise TestFailed
-
-# Regression test for a crash in pre-2.1a1
-def another():
-    pass
-
-try:
-    del another.__dict__
-except TypeError: pass
-else: raise TestFailed
-
-try:
-    del another.func_dict
-except TypeError: pass
-else: raise TestFailed
-
-try:
-    another.func_dict = None
-except TypeError: pass
-else: raise TestFailed
-
-try:
-    del another.bar
-except AttributeError: pass
-else: raise TestFailed
-
-# This isn't specifically related to function attributes, but it does test a
-# core dump regression in funcobject.c
-del another.func_defaults
-
-def foo():
-    pass
-
-def bar():
-    pass
-
-def temp():
-    print 1
-
-if foo==bar:
-    raise TestFailed
-
-d={}
-d[foo] = 1
-
-foo.func_code = temp.func_code
-
-d[foo]
-
-# Test all predefined function attributes systematically
-
-def cantset(obj, name, value, exception=(AttributeError, TypeError)):
-    verify(hasattr(obj, name)) # Otherwise it's probably a typo
-    try:
-        setattr(obj, name, value)
-    except exception:
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to set %s to %r" % (name, value)
-    try:
-        delattr(obj, name)
-    except (AttributeError, TypeError):
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to del %s" % name
-
-def test_func_closure():
-    a = 12
-    def f(): print a
-    c = f.func_closure
-    verify(isinstance(c, tuple))
-    verify(len(c) == 1)
-    verify(c[0].__class__.__name__ == "cell") # don't have a type object handy
-    cantset(f, "func_closure", c)
-
-def test_empty_cell():
-    def f(): print a
-    try:
-        f.func_closure[0].cell_contents
-    except ValueError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be able to read an empty cell"
-
-    a = 12
-
-def test_func_doc():
-    def f(): pass
-    verify(f.__doc__ is None)
-    verify(f.func_doc is None)
-    f.__doc__ = "hello"
-    verify(f.__doc__ == "hello")
-    verify(f.func_doc == "hello")
-    del f.__doc__
-    verify(f.__doc__ is None)
-    verify(f.func_doc is None)
-    f.func_doc = "world"
-    verify(f.__doc__ == "world")
-    verify(f.func_doc == "world")
-    del f.func_doc
-    verify(f.func_doc is None)
-    verify(f.__doc__ is None)
-
-def test_func_globals():
-    def f(): pass
-    verify(f.func_globals is globals())
-    cantset(f, "func_globals", globals())
-
-def test_func_name():
-    def f(): pass
-    verify(f.__name__ == "f")
-    verify(f.func_name == "f")
-    f.__name__ = "g"
-    verify(f.__name__ == "g")
-    verify(f.func_name == "g")
-    f.func_name = "h"
-    verify(f.__name__ == "h")
-    verify(f.func_name == "h")
-    cantset(f, "func_globals", 1)
-    cantset(f, "__name__", 1)
-    # test that you can access func.__name__ in restricted mode
-    s = """def f(): pass\nf.__name__"""
-    exec s in {'__builtins__':{}}
-
-
-def test_func_code():
-    a = b = 24
-    def f(): pass
-    def g(): print 12
-    def f1(): print a
-    def g1(): print b
-    def f2(): print a, b
-    verify(type(f.func_code) is types.CodeType)
-    f.func_code = g.func_code
-    cantset(f, "func_code", None)
-    # can't change the number of free vars
-    cantset(f,  "func_code", f1.func_code, exception=ValueError)
-    cantset(f1, "func_code",  f.func_code, exception=ValueError)
-    cantset(f1, "func_code", f2.func_code, exception=ValueError)
-    f1.func_code = g1.func_code
-
-def test_func_defaults():
-    def f(a, b): return (a, b)
-    verify(f.func_defaults is None)
-    f.func_defaults = (1, 2)
-    verify(f.func_defaults == (1, 2))
-    verify(f(10) == (10, 2))
-    def g(a=1, b=2): return (a, b)
-    verify(g.func_defaults == (1, 2))
-    del g.func_defaults
-    verify(g.func_defaults is None)
-    try:
-        g()
-    except TypeError:
-        pass
-    else:
-        raise TestFailed, "shouldn't be allowed to call g() w/o defaults"
-
-def test_func_dict():
-    def f(): pass
-    a = f.__dict__
-    b = f.func_dict
-    verify(a == {})
-    verify(a is b)
-    f.hello = 'world'
-    verify(a == {'hello': 'world'})
-    verify(f.func_dict is a is f.__dict__)
-    f.func_dict = {}
-    verify(not hasattr(f, "hello"))
-    f.__dict__ = {'world': 'hello'}
-    verify(f.world == "hello")
-    verify(f.__dict__ is f.func_dict == {'world': 'hello'})
-    cantset(f, "func_dict", None)
-    cantset(f, "__dict__", None)
-
-def test_im_class():
-    class C:
-        def foo(self): pass
-    verify(C.foo.im_class is C)
-    verify(C().foo.im_class is C)
-    cantset(C.foo, "im_class", C)
-    cantset(C().foo, "im_class", C)
-
-def test_im_func():
-    def foo(self): pass
-    class C:
-        pass
-    C.foo = foo
-    verify(C.foo.im_func is foo)
-    verify(C().foo.im_func is foo)
-    cantset(C.foo, "im_func", foo)
-    cantset(C().foo, "im_func", foo)
-
-def test_im_self():
-    class C:
-        def foo(self): pass
-    verify(C.foo.im_self is None)
-    c = C()
-    verify(c.foo.im_self is c)
-    cantset(C.foo, "im_self", None)
-    cantset(c.foo, "im_self", c)
-
-def test_im_dict():
-    class C:
-        def foo(self): pass
-        foo.bar = 42
-    verify(C.foo.__dict__ == {'bar': 42})
-    verify(C().foo.__dict__ == {'bar': 42})
-    cantset(C.foo, "__dict__", C.foo.__dict__)
-    cantset(C().foo, "__dict__", C.foo.__dict__)
-
-def test_im_doc():
-    class C:
-        def foo(self): "hello"
-    verify(C.foo.__doc__ == "hello")
-    verify(C().foo.__doc__ == "hello")
-    cantset(C.foo, "__doc__", "hello")
-    cantset(C().foo, "__doc__", "hello")
-
-def test_im_name():
-    class C:
-        def foo(self): pass
-    verify(C.foo.__name__ == "foo")
-    verify(C().foo.__name__ == "foo")
-    cantset(C.foo, "__name__", "foo")
-    cantset(C().foo, "__name__", "foo")
-
-def testmore():
-    test_func_closure()
-    test_empty_cell()
-    test_func_doc()
-    test_func_globals()
-    test_func_name()
-    test_func_code()
-    test_func_defaults()
-    test_func_dict()
-    # Tests for instance method attributes
-    test_im_class()
-    test_im_func()
-    test_im_self()
-    test_im_dict()
-    test_im_doc()
-    test_im_name()
-
-testmore()
+if __name__ == "__main__":
+    test_main()

Modified: python/branches/trunk-math/Lib/test/test_iterlen.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_iterlen.py	(original)
+++ python/branches/trunk-math/Lib/test/test_iterlen.py	Tue Feb 12 06:36:19 2008
@@ -45,7 +45,6 @@
 from test import test_support
 from itertools import repeat
 from collections import deque
-from UserList import UserList
 from __builtin__ import len as _len
 
 n = 10
@@ -196,45 +195,6 @@
         d.extend(xrange(20))
         self.assertEqual(len(it), 0)
 
-class TestSeqIter(TestInvariantWithoutMutations):
-
-    def setUp(self):
-        self.it = iter(UserList(range(n)))
-
-    def test_mutation(self):
-        d = UserList(range(n))
-        it = iter(d)
-        it.next()
-        it.next()
-        self.assertEqual(len(it), n-2)
-        d.append(n)
-        self.assertEqual(len(it), n-1)  # grow with append
-        d[1:] = []
-        self.assertEqual(len(it), 0)
-        self.assertEqual(list(it), [])
-        d.extend(xrange(20))
-        self.assertEqual(len(it), 0)
-
-class TestSeqIterReversed(TestInvariantWithoutMutations):
-
-    def setUp(self):
-        self.it = reversed(UserList(range(n)))
-
-    def test_mutation(self):
-        d = UserList(range(n))
-        it = reversed(d)
-        it.next()
-        it.next()
-        self.assertEqual(len(it), n-2)
-        d.append(n)
-        self.assertEqual(len(it), n-2)  # ignore append
-        d[1:] = []
-        self.assertEqual(len(it), 0)
-        self.assertEqual(list(it), [])  # confirm invariant
-        d.extend(xrange(20))
-        self.assertEqual(len(it), 0)
-
-
 def test_main():
     unittests = [
         TestRepeat,
@@ -249,8 +209,6 @@
         TestSet,
         TestList,
         TestListReversed,
-        TestSeqIter,
-        TestSeqIterReversed,
     ]
     test_support.run_unittest(*unittests)
 

Modified: python/branches/trunk-math/Lib/test/test_largefile.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_largefile.py	(original)
+++ python/branches/trunk-math/Lib/test/test_largefile.py	Tue Feb 12 06:36:19 2008
@@ -1,12 +1,12 @@
-#!python
+"""Test largefile support on system where this makes sense.
+"""
 
-#----------------------------------------------------------------------
-# test largefile support on system where this makes sense
-#
-#----------------------------------------------------------------------
-
-from test import test_support
-import os, stat, sys
+import os
+import stat
+import sys
+import unittest
+from test.test_support import run_unittest, TESTFN, verbose, requires, \
+                              TestSkipped, unlink
 
 try:
     import signal
@@ -17,154 +17,167 @@
 except (ImportError, AttributeError):
     pass
 
-
 # create >2GB file (2GB = 2147483648 bytes)
 size = 2500000000L
-name = test_support.TESTFN
-
-
-# On Windows and Mac OSX this test comsumes large resources; It takes
-# a long time to build the >2GB file and takes >2GB of disk space
-# therefore the resource must be enabled to run this test.  If not,
-# nothing after this line stanza will be executed.
-if sys.platform[:3] == 'win' or sys.platform == 'darwin':
-    test_support.requires(
-        'largefile',
-        'test requires %s bytes and a long time to run' % str(size))
-else:
-    # Only run if the current filesystem supports large files.
-    # (Skip this test on Windows, since we now always support large files.)
-    f = open(test_support.TESTFN, 'wb')
-    try:
-        # 2**31 == 2147483648
-        f.seek(2147483649L)
-        # Seeking is not enough of a test: you must write and flush, too!
-        f.write("x")
-        f.flush()
-    except (IOError, OverflowError):
-        f.close()
-        os.unlink(test_support.TESTFN)
-        raise test_support.TestSkipped, \
-              "filesystem does not have largefile support"
-    else:
-        f.close()
 
 
-def expect(got_this, expect_this):
-    if test_support.verbose:
-        print '%r =?= %r ...' % (got_this, expect_this),
-    if got_this != expect_this:
-        if test_support.verbose:
-            print 'no'
-        raise test_support.TestFailed, 'got %r, but expected %r' %\
-              (got_this, expect_this)
+class TestCase(unittest.TestCase):
+    """Test that each file function works as expected for a large
+    (i.e. > 2GB, do  we have to check > 4GB) files.
+    """
+
+    def test_seek(self):
+        if verbose:
+            print 'create large file via seek (may be sparse file) ...'
+        f = open(TESTFN, 'wb')
+        try:
+            f.write('z')
+            f.seek(0)
+            f.seek(size)
+            f.write('a')
+            f.flush()
+            if verbose:
+                print 'check file size with os.fstat'
+            self.assertEqual(os.fstat(f.fileno())[stat.ST_SIZE], size+1)
+        finally:
+            f.close()
+
+    def test_osstat(self):
+        if verbose:
+            print 'check file size with os.stat'
+        self.assertEqual(os.stat(TESTFN)[stat.ST_SIZE], size+1)
+
+    def test_seek_read(self):
+        if verbose:
+            print 'play around with seek() and read() with the built largefile'
+        f = open(TESTFN, 'rb')
+        try:
+            self.assertEqual(f.tell(), 0)
+            self.assertEqual(f.read(1), 'z')
+            self.assertEqual(f.tell(), 1)
+            f.seek(0)
+            self.assertEqual(f.tell(), 0)
+            f.seek(0, 0)
+            self.assertEqual(f.tell(), 0)
+            f.seek(42)
+            self.assertEqual(f.tell(), 42)
+            f.seek(42, 0)
+            self.assertEqual(f.tell(), 42)
+            f.seek(42, 1)
+            self.assertEqual(f.tell(), 84)
+            f.seek(0, 1)
+            self.assertEqual(f.tell(), 84)
+            f.seek(0, 2)  # seek from the end
+            self.assertEqual(f.tell(), size + 1 + 0)
+            f.seek(-10, 2)
+            self.assertEqual(f.tell(), size + 1 - 10)
+            f.seek(-size-1, 2)
+            self.assertEqual(f.tell(), 0)
+            f.seek(size)
+            self.assertEqual(f.tell(), size)
+            # the 'a' that was written at the end of file above
+            self.assertEqual(f.read(1), 'a')
+            f.seek(-size-1, 1)
+            self.assertEqual(f.read(1), 'z')
+            self.assertEqual(f.tell(), 1)
+        finally:
+            f.close()
+
+    def test_lseek(self):
+        if verbose:
+            print 'play around with os.lseek() with the built largefile'
+        f = open(TESTFN, 'rb')
+        try:
+            self.assertEqual(os.lseek(f.fileno(), 0, 0), 0)
+            self.assertEqual(os.lseek(f.fileno(), 42, 0), 42)
+            self.assertEqual(os.lseek(f.fileno(), 42, 1), 84)
+            self.assertEqual(os.lseek(f.fileno(), 0, 1), 84)
+            self.assertEqual(os.lseek(f.fileno(), 0, 2), size+1+0)
+            self.assertEqual(os.lseek(f.fileno(), -10, 2), size+1-10)
+            self.assertEqual(os.lseek(f.fileno(), -size-1, 2), 0)
+            self.assertEqual(os.lseek(f.fileno(), size, 0), size)
+            # the 'a' that was written at the end of file above
+            self.assertEqual(f.read(1), 'a')
+        finally:
+            f.close()
+
+    def test_truncate(self):
+        if verbose:
+            print 'try truncate'
+        f = open(TESTFN, 'r+b')
+        # this is already decided before start running the test suite
+        # but we do it anyway for extra protection
+        if not hasattr(f, 'truncate'):
+            raise TestSkipped, "open().truncate() not available on this system"
+        try:
+            f.seek(0, 2)
+            # else we've lost track of the true size
+            self.assertEqual(f.tell(), size+1)
+            # Cut it back via seek + truncate with no argument.
+            newsize = size - 10
+            f.seek(newsize)
+            f.truncate()
+            self.assertEqual(f.tell(), newsize)  # else pointer moved
+            f.seek(0, 2)
+            self.assertEqual(f.tell(), newsize)  # else wasn't truncated
+            # Ensure that truncate(smaller than true size) shrinks
+            # the file.
+            newsize -= 1
+            f.seek(42)
+            f.truncate(newsize)
+            self.assertEqual(f.tell(), 42)       # else pointer moved
+            f.seek(0, 2)
+            self.assertEqual(f.tell(), newsize)  # else wasn't truncated
+
+            # XXX truncate(larger than true size) is ill-defined
+            # across platform; cut it waaaaay back
+            f.seek(0)
+            f.truncate(1)
+            self.assertEqual(f.tell(), 0)       # else pointer moved
+            self.assertEqual(len(f.read()), 1)  # else wasn't truncated
+        finally:
+            f.close()
+
+
+def main_test():
+    # On Windows and Mac OSX this test comsumes large resources; It
+    # takes a long time to build the >2GB file and takes >2GB of disk
+    # space therefore the resource must be enabled to run this test.
+    # If not, nothing after this line stanza will be executed.
+    if sys.platform[:3] == 'win' or sys.platform == 'darwin':
+        requires('largefile',
+                 'test requires %s bytes and a long time to run' % str(size))
     else:
-        if test_support.verbose:
-            print 'yes'
-
-
-# test that each file function works as expected for a large (i.e. >2GB, do
-# we have to check >4GB) files
-
-if test_support.verbose:
-    print 'create large file via seek (may be sparse file) ...'
-f = open(name, 'wb')
-try:
-    f.write('z')
-    f.seek(0)
-    f.seek(size)
-    f.write('a')
-    f.flush()
-    if test_support.verbose:
-        print 'check file size with os.fstat'
-    expect(os.fstat(f.fileno())[stat.ST_SIZE], size+1)
-finally:
-    f.close()
-if test_support.verbose:
-    print 'check file size with os.stat'
-expect(os.stat(name)[stat.ST_SIZE], size+1)
-
-if test_support.verbose:
-    print 'play around with seek() and read() with the built largefile'
-f = open(name, 'rb')
-try:
-    expect(f.tell(), 0)
-    expect(f.read(1), 'z')
-    expect(f.tell(), 1)
-    f.seek(0)
-    expect(f.tell(), 0)
-    f.seek(0, 0)
-    expect(f.tell(), 0)
-    f.seek(42)
-    expect(f.tell(), 42)
-    f.seek(42, 0)
-    expect(f.tell(), 42)
-    f.seek(42, 1)
-    expect(f.tell(), 84)
-    f.seek(0, 1)
-    expect(f.tell(), 84)
-    f.seek(0, 2) # seek from the end
-    expect(f.tell(), size + 1 + 0)
-    f.seek(-10, 2)
-    expect(f.tell(), size + 1 - 10)
-    f.seek(-size-1, 2)
-    expect(f.tell(), 0)
-    f.seek(size)
-    expect(f.tell(), size)
-    expect(f.read(1), 'a') # the 'a' that was written at the end of file above
-    f.seek(-size-1, 1)
-    expect(f.read(1), 'z')
-    expect(f.tell(), 1)
-finally:
+        # Only run if the current filesystem supports large files.
+        # (Skip this test on Windows, since we now always support
+        # large files.)
+        f = open(TESTFN, 'wb')
+        try:
+            # 2**31 == 2147483648
+            f.seek(2147483649L)
+            # Seeking is not enough of a test: you must write and
+            # flush, too!
+            f.write("x")
+            f.flush()
+        except (IOError, OverflowError):
+            f.close()
+            unlink(TESTFN)
+            raise TestSkipped, "filesystem does not have largefile support"
+        else:
+            f.close()
+    suite = unittest.TestSuite()
+    suite.addTest(TestCase('test_seek'))
+    suite.addTest(TestCase('test_osstat'))
+    suite.addTest(TestCase('test_seek_read'))
+    suite.addTest(TestCase('test_lseek'))
+    f = open(TESTFN, 'w')
+    if hasattr(f, 'truncate'):
+        suite.addTest(TestCase('test_truncate'))
     f.close()
+    unlink(TESTFN)
+    run_unittest(suite)
+    unlink(TESTFN)
 
-if test_support.verbose:
-    print 'play around with os.lseek() with the built largefile'
-f = open(name, 'rb')
-try:
-    expect(os.lseek(f.fileno(), 0, 0), 0)
-    expect(os.lseek(f.fileno(), 42, 0), 42)
-    expect(os.lseek(f.fileno(), 42, 1), 84)
-    expect(os.lseek(f.fileno(), 0, 1), 84)
-    expect(os.lseek(f.fileno(), 0, 2), size+1+0)
-    expect(os.lseek(f.fileno(), -10, 2), size+1-10)
-    expect(os.lseek(f.fileno(), -size-1, 2), 0)
-    expect(os.lseek(f.fileno(), size, 0), size)
-    expect(f.read(1), 'a') # the 'a' that was written at the end of file above
-finally:
-    f.close()
-
-if hasattr(f, 'truncate'):
-    if test_support.verbose:
-        print 'try truncate'
-    f = open(name, 'r+b')
-    try:
-        f.seek(0, 2)
-        expect(f.tell(), size+1)    # else we've lost track of the true size
-        # Cut it back via seek + truncate with no argument.
-        newsize = size - 10
-        f.seek(newsize)
-        f.truncate()
-        expect(f.tell(), newsize)   # else pointer moved
-        f.seek(0, 2)
-        expect(f.tell(), newsize)   # else wasn't truncated
-        # Ensure that truncate(smaller than true size) shrinks the file.
-        newsize -= 1
-        f.seek(42)
-        f.truncate(newsize)
-        expect(f.tell(), 42)        # else pointer moved
-        f.seek(0, 2)
-        expect(f.tell(), newsize)   # else wasn't truncated
-
-        # XXX truncate(larger than true size) is ill-defined across platforms
-
-        # cut it waaaaay back
-        f.seek(0)
-        f.truncate(1)
-        expect(f.tell(), 0)         # else pointer moved
-        expect(len(f.read()), 1)    # else wasn't truncated
-
-    finally:
-        f.close()
 
-os.unlink(name)
+if __name__ == '__main__':
+    main_test()

Modified: python/branches/trunk-math/Lib/test/test_mailbox.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_mailbox.py	(original)
+++ python/branches/trunk-math/Lib/test/test_mailbox.py	Tue Feb 12 06:36:19 2008
@@ -520,6 +520,7 @@
         class FakeMessage(mailbox.MaildirMessage):
             pass
         box = mailbox.Maildir(self._path, factory=FakeMessage)
+        box.colon = self._box.colon
         msg2 = box.get_message(key)
         self.assert_(isinstance(msg2, FakeMessage))
 

Modified: python/branches/trunk-math/Lib/test/test_math.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_math.py	(original)
+++ python/branches/trunk-math/Lib/test/test_math.py	Tue Feb 12 06:36:19 2008
@@ -454,6 +454,37 @@
         self.ftest('tanh(-inf)', math.tanh(NINF), -1)
         self.assert_(math.isnan(math.tanh(NAN)))
 
+    def test_trunc(self):
+        self.assertEqual(math.trunc(1), 1)
+        self.assertEqual(math.trunc(-1), -1)
+        self.assertEqual(type(math.trunc(1)), int)
+        self.assertEqual(type(math.trunc(1.5)), int)
+        self.assertEqual(math.trunc(1.5), 1)
+        self.assertEqual(math.trunc(-1.5), -1)
+        self.assertEqual(math.trunc(1.999999), 1)
+        self.assertEqual(math.trunc(-1.999999), -1)
+        self.assertEqual(math.trunc(-0.999999), -0)
+        self.assertEqual(math.trunc(-100.999), -100)
+
+        class TestTrunc(object):
+            def __trunc__(self):
+                return 23
+
+        class TestNoTrunc(object):
+            pass
+
+        self.assertEqual(math.trunc(TestTrunc()), 23)
+
+        self.assertRaises(TypeError, math.trunc)
+        self.assertRaises(TypeError, math.trunc, 1, 2)
+        # XXX: This is not ideal, but see the comment in math_trunc().
+        self.assertRaises(AttributeError, math.trunc, TestNoTrunc())
+
+        t = TestNoTrunc()
+        t.__trunc__ = lambda *args: args
+        self.assertEquals((), math.trunc(t))
+        self.assertRaises(TypeError, math.trunc, t, 0)
+
     def testCopysign(self):
         self.assertEqual(math.copysign(1, 42), 1.0)
         self.assertEqual(math.copysign(0., 42), 0.0)

Modified: python/branches/trunk-math/Lib/test/test_multibytecodec_support.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_multibytecodec_support.py	(original)
+++ python/branches/trunk-math/Lib/test/test_multibytecodec_support.py	Tue Feb 12 06:36:19 2008
@@ -323,9 +323,17 @@
 
     def _testpoint(self, csetch, unich):
         if (csetch, unich) not in self.pass_enctest:
-            self.assertEqual(unich.encode(self.encoding), csetch)
+            try:
+                self.assertEqual(unich.encode(self.encoding), csetch)
+            except UnicodeError, exc:
+                self.fail('Encoding failed while testing %s -> %s: %s' % (
+                            repr(unich), repr(csetch), exc.reason))
         if (csetch, unich) not in self.pass_dectest:
-            self.assertEqual(unicode(csetch, self.encoding), unich)
+            try:
+                self.assertEqual(csetch.decode(self.encoding), unich)
+            except UnicodeError, exc:
+                self.fail('Decoding failed while testing %s -> %s: %s' % (
+                            repr(csetch), repr(unich), exc.reason))
 
 def load_teststring(encoding):
     from test import cjkencodings_test

Modified: python/branches/trunk-math/Lib/test/test_pickletools.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_pickletools.py	(original)
+++ python/branches/trunk-math/Lib/test/test_pickletools.py	Tue Feb 12 06:36:19 2008
@@ -1,3 +1,24 @@
+import pickle
 import pickletools
 from test import test_support
-test_support.run_doctest(pickletools)
+from test.pickletester import AbstractPickleTests
+from test.pickletester import AbstractPickleModuleTests
+
+class OptimizedPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
+
+    def dumps(self, arg, proto=0, fast=0):
+        return pickletools.optimize(pickle.dumps(arg, proto))
+
+    def loads(self, buf):
+        return pickle.loads(buf)
+
+    module = pickle
+    error = KeyError
+
+def test_main():
+    test_support.run_unittest(OptimizedPickleTests)
+    test_support.run_doctest(pickletools)
+
+
+if __name__ == "__main__":
+    test_main()

Modified: python/branches/trunk-math/Lib/test/test_profile.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_profile.py	(original)
+++ python/branches/trunk-math/Lib/test/test_profile.py	Tue Feb 12 06:36:19 2008
@@ -1,123 +1,166 @@
 """Test suite for the profile module."""
 
-import profile, pstats, sys
+import os
+import sys
+import pstats
+import unittest
+from StringIO import StringIO
+from test.test_support import run_unittest
+
+import profile
+from test.profilee import testfunc, timer
+
+
+class ProfileTest(unittest.TestCase):
+
+    profilerclass = profile.Profile
+    methodnames = ['print_stats', 'print_callers', 'print_callees']
+    expected_output = {}
+
+    @classmethod
+    def do_profiling(cls):
+        results = []
+        prof = cls.profilerclass(timer, 0.001)
+        prof.runctx("testfunc()", globals(), locals())
+        results.append(timer())
+        for methodname in cls.methodnames:
+            s = StringIO()
+            stats = pstats.Stats(prof, stream=s)
+            stats.strip_dirs().sort_stats("stdname")
+            getattr(stats, methodname)()
+            results.append(s.getvalue())
+        return results
+
+    def test_cprofile(self):
+        results = self.do_profiling()
+        self.assertEqual(results[0], 43000)
+        for i, method in enumerate(self.methodnames):
+            self.assertEqual(results[i+1], self.expected_output[method],
+                             "Stats.%s output for %s doesn't fit expectation!" %
+                             (method, self.profilerclass.__name__))
+
+
+def regenerate_expected_output(filename, cls):
+    filename = filename.rstrip('co')
+    print 'Regenerating %s...' % filename
+    results = cls.do_profiling()
+
+    newfile = []
+    with open(filename, 'r') as f:
+        for line in f:
+            newfile.append(line)
+            if line[:6] == '#--cut':
+                break
+
+    with open(filename, 'w') as f:
+        f.writelines(newfile)
+        for i, method in enumerate(cls.methodnames):
+            f.write('%s.expected_output[%r] = """\\\n%s"""\n' % (
+                cls.__name__, method, results[i+1]))
+        f.write('\nif __name__ == "__main__":\n    main()\n')
 
-# In order to have reproducible time, we simulate a timer in the global
-# variable 'ticks', which represents simulated time in milliseconds.
-# (We can't use a helper function increment the timer since it would be
-# included in the profile and would appear to consume all the time.)
-ticks = 0
-
-# IMPORTANT: this is an output test.  *ALL* NUMBERS in the expected
-# output are relevant.  If you change the formatting of pstats,
-# please don't just regenerate output/test_profile without checking
-# very carefully that not a single number has changed.
 
 def test_main():
-    global ticks
-    ticks = 42000
-    prof = profile.Profile(timer)
-    prof.runctx("testfunc()", globals(), locals())
-    assert ticks == 43000, ticks
-    st = pstats.Stats(prof)
-    st.strip_dirs().sort_stats('stdname').print_stats()
-    st.print_callees()
-    st.print_callers()
-
-def timer():
-    return ticks*0.001
-
-def testfunc():
-    # 1 call
-    # 1000 ticks total: 270 ticks local, 730 ticks in subfunctions
-    global ticks
-    ticks += 99
-    helper()                            # 300
-    helper()                            # 300
-    ticks += 171
-    factorial(14)                       # 130
-
-def factorial(n):
-    # 23 calls total
-    # 170 ticks total, 150 ticks local
-    # 3 primitive calls, 130, 20 and 20 ticks total
-    # including 116, 17, 17 ticks local
-    global ticks
-    if n > 0:
-        ticks += n
-        return mul(n, factorial(n-1))
+    run_unittest(ProfileTest)
+
+def main():
+    if '-r' not in sys.argv:
+        test_main()
     else:
-        ticks += 11
-        return 1
+        regenerate_expected_output(__file__, ProfileTest)
+
+
+# Don't remove this comment. Everything below it is auto-generated.
+#--cut--------------------------------------------------------------------------
+ProfileTest.expected_output['print_stats'] = """\
+         127 function calls (107 primitive calls) in 999.749 CPU seconds
+
+   Ordered by: standard name
+
+   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
+        4   -0.004   -0.001   -0.004   -0.001 :0(append)
+        4   -0.004   -0.001   -0.004   -0.001 :0(exc_info)
+       12   -0.024   -0.002   11.964    0.997 :0(hasattr)
+        8   -0.008   -0.001   -0.008   -0.001 :0(range)
+        1    0.000    0.000    0.000    0.000 :0(setprofile)
+        1   -0.002   -0.002  999.751  999.751 <string>:1(<module>)
+        0    0.000             0.000          profile:0(profiler)
+        1   -0.002   -0.002  999.749  999.749 profile:0(testfunc())
+       28   27.972    0.999   27.972    0.999 profilee.py:110(__getattr__)
+        1  269.996  269.996  999.753  999.753 profilee.py:25(testfunc)
+     23/3  149.937    6.519  169.917   56.639 profilee.py:35(factorial)
+       20   19.980    0.999   19.980    0.999 profilee.py:48(mul)
+        2   39.986   19.993  599.814  299.907 profilee.py:55(helper)
+        4  115.984   28.996  119.964   29.991 profilee.py:73(helper1)
+        2   -0.006   -0.003  139.942   69.971 profilee.py:84(helper2_indirect)
+        8  311.976   38.997  399.896   49.987 profilee.py:88(helper2)
+        8   63.968    7.996   79.944    9.993 profilee.py:98(subhelper)
+
+
+"""
+ProfileTest.expected_output['print_callers'] = """\
+   Ordered by: standard name
+
+Function                          was called by...
+:0(append)                        <- profilee.py:73(helper1)(4)  119.964
+:0(exc_info)                      <- profilee.py:73(helper1)(4)  119.964
+:0(hasattr)                       <- profilee.py:73(helper1)(4)  119.964
+                                     profilee.py:88(helper2)(8)  399.896
+:0(range)                         <- profilee.py:98(subhelper)(8)   79.944
+:0(setprofile)                    <- profile:0(testfunc())(1)  999.749
+<string>:1(<module>)              <- profile:0(testfunc())(1)  999.749
+profile:0(profiler)               <-
+profile:0(testfunc())             <- profile:0(profiler)(1)    0.000
+profilee.py:110(__getattr__)      <- :0(hasattr)(12)   11.964
+                                     profilee.py:98(subhelper)(16)   79.944
+profilee.py:25(testfunc)          <- <string>:1(<module>)(1)  999.751
+profilee.py:35(factorial)         <- profilee.py:25(testfunc)(1)  999.753
+                                     profilee.py:35(factorial)(20)  169.917
+                                     profilee.py:84(helper2_indirect)(2)  139.942
+profilee.py:48(mul)               <- profilee.py:35(factorial)(20)  169.917
+profilee.py:55(helper)            <- profilee.py:25(testfunc)(2)  999.753
+profilee.py:73(helper1)           <- profilee.py:55(helper)(4)  599.814
+profilee.py:84(helper2_indirect)  <- profilee.py:55(helper)(2)  599.814
+profilee.py:88(helper2)           <- profilee.py:55(helper)(6)  599.814
+                                     profilee.py:84(helper2_indirect)(2)  139.942
+profilee.py:98(subhelper)         <- profilee.py:88(helper2)(8)  399.896
+
+
+"""
+ProfileTest.expected_output['print_callees'] = """\
+   Ordered by: standard name
+
+Function                          called...
+:0(append)                        ->
+:0(exc_info)                      ->
+:0(hasattr)                       -> profilee.py:110(__getattr__)(12)   27.972
+:0(range)                         ->
+:0(setprofile)                    ->
+<string>:1(<module>)              -> profilee.py:25(testfunc)(1)  999.753
+profile:0(profiler)               -> profile:0(testfunc())(1)  999.749
+profile:0(testfunc())             -> :0(setprofile)(1)    0.000
+                                     <string>:1(<module>)(1)  999.751
+profilee.py:110(__getattr__)      ->
+profilee.py:25(testfunc)          -> profilee.py:35(factorial)(1)  169.917
+                                     profilee.py:55(helper)(2)  599.814
+profilee.py:35(factorial)         -> profilee.py:35(factorial)(20)  169.917
+                                     profilee.py:48(mul)(20)   19.980
+profilee.py:48(mul)               ->
+profilee.py:55(helper)            -> profilee.py:73(helper1)(4)  119.964
+                                     profilee.py:84(helper2_indirect)(2)  139.942
+                                     profilee.py:88(helper2)(6)  399.896
+profilee.py:73(helper1)           -> :0(append)(4)   -0.004
+                                     :0(exc_info)(4)   -0.004
+                                     :0(hasattr)(4)   11.964
+profilee.py:84(helper2_indirect)  -> profilee.py:35(factorial)(2)  169.917
+                                     profilee.py:88(helper2)(2)  399.896
+profilee.py:88(helper2)           -> :0(hasattr)(8)   11.964
+                                     profilee.py:98(subhelper)(8)   79.944
+profilee.py:98(subhelper)         -> :0(range)(8)   -0.008
+                                     profilee.py:110(__getattr__)(16)   27.972
+
 
-def mul(a, b):
-    # 20 calls
-    # 1 tick, local
-    global ticks
-    ticks += 1
-    return a * b
-
-def helper():
-    # 2 calls
-    # 300 ticks total: 20 ticks local, 260 ticks in subfunctions
-    global ticks
-    ticks += 1
-    helper1()                           # 30
-    ticks += 2
-    helper1()                           # 30
-    ticks += 6
-    helper2()                           # 50
-    ticks += 3
-    helper2()                           # 50
-    ticks += 2
-    helper2()                           # 50
-    ticks += 5
-    helper2_indirect()                  # 70
-    ticks += 1
-
-def helper1():
-    # 4 calls
-    # 30 ticks total: 29 ticks local, 1 tick in subfunctions
-    global ticks
-    ticks += 10
-    hasattr(C(), "foo")                 # 1
-    ticks += 19
-    lst = []
-    lst.append(42)                      # 0
-    sys.exc_info()                      # 0
-
-def helper2_indirect():
-    helper2()                           # 50
-    factorial(3)                        # 20
-
-def helper2():
-    # 8 calls
-    # 50 ticks local: 39 ticks local, 11 ticks in subfunctions
-    global ticks
-    ticks += 11
-    hasattr(C(), "bar")                 # 1
-    ticks += 13
-    subhelper()                         # 10
-    ticks += 15
-
-def subhelper():
-    # 8 calls
-    # 10 ticks total: 8 ticks local, 2 ticks in subfunctions
-    global ticks
-    ticks += 2
-    for i in range(2):                  # 0
-        try:
-            C().foo                     # 1 x 2
-        except AttributeError:
-            ticks += 3                  # 3 x 2
-
-class C:
-    def __getattr__(self, name):
-        # 28 calls
-        # 1 tick, local
-        global ticks
-        ticks += 1
-        raise AttributeError
+"""
 
 if __name__ == "__main__":
-    test_main()
+    main()

Modified: python/branches/trunk-math/Lib/test/test_queue.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_queue.py	(original)
+++ python/branches/trunk-math/Lib/test/test_queue.py	Tue Feb 12 06:36:19 2008
@@ -4,8 +4,8 @@
 import sys
 import threading
 import time
-
-from test.test_support import verify, TestFailed, verbose
+import unittest
+from test import test_support
 
 QUEUE_SIZE = 5
 
@@ -30,50 +30,176 @@
         self.startedEvent.set()
         self.fn(*self.args)
 
+
 # Execute a function that blocks, and in a separate thread, a function that
-# triggers the release.  Returns the result of the blocking function.
-# Caution:  block_func must guarantee to block until trigger_func is
-# called, and trigger_func must guarantee to change queue state so that
-# block_func can make enough progress to return.  In particular, a
-# block_func that just raises an exception regardless of whether trigger_func
-# is called will lead to timing-dependent sporadic failures, and one of
-# those went rarely seen but undiagnosed for years.  Now block_func
-# must be unexceptional.  If block_func is supposed to raise an exception,
-# call _doExceptionalBlockingTest() instead.
-def _doBlockingTest(block_func, block_args, trigger_func, trigger_args):
-    t = _TriggerThread(trigger_func, trigger_args)
-    t.start()
-    result = block_func(*block_args)
-    # If block_func returned before our thread made the call, we failed!
-    if not t.startedEvent.isSet():
-        raise TestFailed("blocking function '%r' appeared not to block" %
-                         block_func)
-    t.join(10) # make sure the thread terminates
-    if t.isAlive():
-        raise TestFailed("trigger function '%r' appeared to not return" %
-                         trigger_func)
-    return result
-
-# Call this instead if block_func is supposed to raise an exception.
-def _doExceptionalBlockingTest(block_func, block_args, trigger_func,
-                               trigger_args, expected_exception_class):
-    t = _TriggerThread(trigger_func, trigger_args)
-    t.start()
-    try:
-        try:
-            block_func(*block_args)
-        except expected_exception_class:
-            raise
+# triggers the release.  Returns the result of the blocking function.  Caution:
+# block_func must guarantee to block until trigger_func is called, and
+# trigger_func must guarantee to change queue state so that block_func can make
+# enough progress to return.  In particular, a block_func that just raises an
+# exception regardless of whether trigger_func is called will lead to
+# timing-dependent sporadic failures, and one of those went rarely seen but
+# undiagnosed for years.  Now block_func must be unexceptional.  If block_func
+# is supposed to raise an exception, call do_exceptional_blocking_test()
+# instead.
+
+class BlockingTestMixin:
+
+    def do_blocking_test(self, block_func, block_args, trigger_func, trigger_args):
+        self.t = _TriggerThread(trigger_func, trigger_args)
+        self.t.start()
+        self.result = block_func(*block_args)
+        # If block_func returned before our thread made the call, we failed!
+        if not self.t.startedEvent.isSet():
+            self.fail("blocking function '%r' appeared not to block" %
+                      block_func)
+        self.t.join(10) # make sure the thread terminates
+        if self.t.isAlive():
+            self.fail("trigger function '%r' appeared to not return" %
+                      trigger_func)
+        return self.result
+
+    # Call this instead if block_func is supposed to raise an exception.
+    def do_exceptional_blocking_test(self,block_func, block_args, trigger_func,
+                                   trigger_args, expected_exception_class):
+        self.t = _TriggerThread(trigger_func, trigger_args)
+        self.t.start()
+        try:
+            try:
+                block_func(*block_args)
+            except expected_exception_class:
+                raise
+            else:
+                self.fail("expected exception of kind %r" %
+                                 expected_exception_class)
+        finally:
+            self.t.join(10) # make sure the thread terminates
+            if self.t.isAlive():
+                self.fail("trigger function '%r' appeared to not return" %
+                                 trigger_func)
+            if not self.t.startedEvent.isSet():
+                self.fail("trigger thread ended but event never set")
+
+
+class BaseQueueTest(unittest.TestCase, BlockingTestMixin):
+    def setUp(self):
+        self.cum = 0
+        self.cumlock = threading.Lock()
+
+    def simple_queue_test(self, q):
+        if not q.empty():
+            raise RuntimeError, "Call this function with an empty queue"
+        # I guess we better check things actually queue correctly a little :)
+        q.put(111)
+        q.put(333)
+        q.put(222)
+        target_order = dict(Queue = [111, 333, 222],
+                            LifoQueue = [222, 333, 111],
+                            PriorityQueue = [111, 222, 333])
+        actual_order = [q.get(), q.get(), q.get()]
+        self.assertEquals(actual_order, target_order[q.__class__.__name__],
+                          "Didn't seem to queue the correct data!")
+        for i in range(QUEUE_SIZE-1):
+            q.put(i)
+            self.assert_(not q.empty(), "Queue should not be empty")
+        self.assert_(not q.full(), "Queue should not be full")
+        q.put("last")
+        self.assert_(q.full(), "Queue should be full")
+        try:
+            q.put("full", block=0)
+            self.fail("Didn't appear to block with a full queue")
+        except Queue.Full:
+            pass
+        try:
+            q.put("full", timeout=0.01)
+            self.fail("Didn't appear to time-out with a full queue")
+        except Queue.Full:
+            pass
+        # Test a blocking put
+        self.do_blocking_test(q.put, ("full",), q.get, ())
+        self.do_blocking_test(q.put, ("full", True, 10), q.get, ())
+        # Empty it
+        for i in range(QUEUE_SIZE):
+            q.get()
+        self.assert_(q.empty(), "Queue should be empty")
+        try:
+            q.get(block=0)
+            self.fail("Didn't appear to block with an empty queue")
+        except Queue.Empty:
+            pass
+        try:
+            q.get(timeout=0.01)
+            self.fail("Didn't appear to time-out with an empty queue")
+        except Queue.Empty:
+            pass
+        # Test a blocking get
+        self.do_blocking_test(q.get, (), q.put, ('empty',))
+        self.do_blocking_test(q.get, (True, 10), q.put, ('empty',))
+
+
+    def worker(self, q):
+        while True:
+            x = q.get()
+            if x is None:
+                q.task_done()
+                return
+            with self.cumlock:
+                self.cum += x
+            q.task_done()
+
+    def queue_join_test(self, q):
+        self.cum = 0
+        for i in (0,1):
+            threading.Thread(target=self.worker, args=(q,)).start()
+        for i in xrange(100):
+            q.put(i)
+        q.join()
+        self.assertEquals(self.cum, sum(range(100)),
+                          "q.join() did not block until all tasks were done")
+        for i in (0,1):
+            q.put(None)         # instruct the threads to close
+        q.join()                # verify that you can join twice
+
+    def test_queue_task_done(self):
+        # Test to make sure a queue task completed successfully.
+        q = self.type2test()
+        try:
+            q.task_done()
+        except ValueError:
+            pass
         else:
-            raise TestFailed("expected exception of kind %r" %
-                             expected_exception_class)
-    finally:
-        t.join(10) # make sure the thread terminates
-        if t.isAlive():
-            raise TestFailed("trigger function '%r' appeared to not return" %
-                             trigger_func)
-        if not t.startedEvent.isSet():
-            raise TestFailed("trigger thread ended but event never set")
+            self.fail("Did not detect task count going negative")
+
+    def test_queue_join(self):
+        # Test that a queue join()s successfully, and before anything else
+        # (done twice for insurance).
+        q = self.type2test()
+        self.queue_join_test(q)
+        self.queue_join_test(q)
+        try:
+            q.task_done()
+        except ValueError:
+            pass
+        else:
+            self.fail("Did not detect task count going negative")
+
+    def test_simple_queue(self):
+        # Do it a couple of times on the same queue.
+        # Done twice to make sure works with same instance reused.
+        q = self.type2test(QUEUE_SIZE)
+        self.simple_queue_test(q)
+        self.simple_queue_test(q)
+
+
+class QueueTest(BaseQueueTest):
+    type2test = Queue.Queue
+
+class LifoQueueTest(BaseQueueTest):
+    type2test = Queue.LifoQueue
+
+class PriorityQueueTest(BaseQueueTest):
+    type2test = Queue.PriorityQueue
+
+
 
 # A Queue subclass that can provoke failure at a moment's notice :)
 class FailingQueueException(Exception):
@@ -95,194 +221,101 @@
             raise FailingQueueException, "You Lose"
         return Queue.Queue._get(self)
 
-def FailingQueueTest(q):
-    if not q.empty():
-        raise RuntimeError, "Call this function with an empty queue"
-    for i in range(QUEUE_SIZE-1):
-        q.put(i)
-    # Test a failing non-blocking put.
-    q.fail_next_put = True
-    try:
-        q.put("oops", block=0)
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    q.fail_next_put = True
-    try:
-        q.put("oops", timeout=0.1)
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    q.put("last")
-    verify(q.full(), "Queue should be full")
-    # Test a failing blocking put
-    q.fail_next_put = True
-    try:
-        _doBlockingTest(q.put, ("full",), q.get, ())
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    # Check the Queue isn't damaged.
-    # put failed, but get succeeded - re-add
-    q.put("last")
-    # Test a failing timeout put
-    q.fail_next_put = True
-    try:
-        _doExceptionalBlockingTest(q.put, ("full", True, 10), q.get, (),
-                                   FailingQueueException)
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    # Check the Queue isn't damaged.
-    # put failed, but get succeeded - re-add
-    q.put("last")
-    verify(q.full(), "Queue should be full")
-    q.get()
-    verify(not q.full(), "Queue should not be full")
-    q.put("last")
-    verify(q.full(), "Queue should be full")
-    # Test a blocking put
-    _doBlockingTest( q.put, ("full",), q.get, ())
-    # Empty it
-    for i in range(QUEUE_SIZE):
-        q.get()
-    verify(q.empty(), "Queue should be empty")
-    q.put("first")
-    q.fail_next_get = True
-    try:
+class FailingQueueTest(unittest.TestCase, BlockingTestMixin):
+
+    def failing_queue_test(self, q):
+        if not q.empty():
+            raise RuntimeError, "Call this function with an empty queue"
+        for i in range(QUEUE_SIZE-1):
+            q.put(i)
+        # Test a failing non-blocking put.
+        q.fail_next_put = True
+        try:
+            q.put("oops", block=0)
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        q.fail_next_put = True
+        try:
+            q.put("oops", timeout=0.1)
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        q.put("last")
+        self.assert_(q.full(), "Queue should be full")
+        # Test a failing blocking put
+        q.fail_next_put = True
+        try:
+            self.do_blocking_test(q.put, ("full",), q.get, ())
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        # Check the Queue isn't damaged.
+        # put failed, but get succeeded - re-add
+        q.put("last")
+        # Test a failing timeout put
+        q.fail_next_put = True
+        try:
+            self.do_exceptional_blocking_test(q.put, ("full", True, 10), q.get, (),
+                                              FailingQueueException)
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        # Check the Queue isn't damaged.
+        # put failed, but get succeeded - re-add
+        q.put("last")
+        self.assert_(q.full(), "Queue should be full")
         q.get()
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    verify(not q.empty(), "Queue should not be empty")
-    q.fail_next_get = True
-    try:
-        q.get(timeout=0.1)
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    verify(not q.empty(), "Queue should not be empty")
-    q.get()
-    verify(q.empty(), "Queue should be empty")
-    q.fail_next_get = True
-    try:
-        _doExceptionalBlockingTest(q.get, (), q.put, ('empty',),
-                                   FailingQueueException)
-        raise TestFailed("The queue didn't fail when it should have")
-    except FailingQueueException:
-        pass
-    # put succeeded, but get failed.
-    verify(not q.empty(), "Queue should not be empty")
-    q.get()
-    verify(q.empty(), "Queue should be empty")
-
-def SimpleQueueTest(q):
-    if not q.empty():
-        raise RuntimeError, "Call this function with an empty queue"
-    # I guess we better check things actually queue correctly a little :)
-    q.put(111)
-    q.put(333)
-    q.put(222)
-    target_order = dict(Queue = [111, 333, 222],
-                        LifoQueue = [222, 333, 111],
-                        PriorityQueue = [111, 222, 333])
-    actual_order = [q.get(), q.get(), q.get()]
-    verify(actual_order == target_order[q.__class__.__name__],
-           "Didn't seem to queue the correct data!")
-    for i in range(QUEUE_SIZE-1):
-        q.put(i)
-        verify(not q.empty(), "Queue should not be empty")
-    verify(not q.full(), "Queue should not be full")
-    q.put("last")
-    verify(q.full(), "Queue should be full")
-    try:
-        q.put("full", block=0)
-        raise TestFailed("Didn't appear to block with a full queue")
-    except Queue.Full:
-        pass
-    try:
-        q.put("full", timeout=0.01)
-        raise TestFailed("Didn't appear to time-out with a full queue")
-    except Queue.Full:
-        pass
-    # Test a blocking put
-    _doBlockingTest(q.put, ("full",), q.get, ())
-    _doBlockingTest(q.put, ("full", True, 10), q.get, ())
-    # Empty it
-    for i in range(QUEUE_SIZE):
+        self.assert_(not q.full(), "Queue should not be full")
+        q.put("last")
+        self.assert_(q.full(), "Queue should be full")
+        # Test a blocking put
+        self.do_blocking_test(q.put, ("full",), q.get, ())
+        # Empty it
+        for i in range(QUEUE_SIZE):
+            q.get()
+        self.assert_(q.empty(), "Queue should be empty")
+        q.put("first")
+        q.fail_next_get = True
+        try:
+            q.get()
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        self.assert_(not q.empty(), "Queue should not be empty")
+        q.fail_next_get = True
+        try:
+            q.get(timeout=0.1)
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        self.assert_(not q.empty(), "Queue should not be empty")
         q.get()
-    verify(q.empty(), "Queue should be empty")
-    try:
-        q.get(block=0)
-        raise TestFailed("Didn't appear to block with an empty queue")
-    except Queue.Empty:
-        pass
-    try:
-        q.get(timeout=0.01)
-        raise TestFailed("Didn't appear to time-out with an empty queue")
-    except Queue.Empty:
-        pass
-    # Test a blocking get
-    _doBlockingTest(q.get, (), q.put, ('empty',))
-    _doBlockingTest(q.get, (True, 10), q.put, ('empty',))
-
-cum = 0
-cumlock = threading.Lock()
-
-def worker(q):
-    global cum
-    while True:
-        x = q.get()
-        if x is None:
-            q.task_done()
-            return
-        cumlock.acquire()
+        self.assert_(q.empty(), "Queue should be empty")
+        q.fail_next_get = True
         try:
-            cum += x
-        finally:
-            cumlock.release()
-        q.task_done()
+            self.do_exceptional_blocking_test(q.get, (), q.put, ('empty',),
+                                              FailingQueueException)
+            self.fail("The queue didn't fail when it should have")
+        except FailingQueueException:
+            pass
+        # put succeeded, but get failed.
+        self.assert_(not q.empty(), "Queue should not be empty")
+        q.get()
+        self.assert_(q.empty(), "Queue should be empty")
+
+    def test_failing_queue(self):
+        # Test to make sure a queue is functioning correctly.
+        # Done twice to the same instance.
+        q = FailingQueue(QUEUE_SIZE)
+        self.failing_queue_test(q)
+        self.failing_queue_test(q)
+
+
+def test_main():
+    test_support.run_unittest(QueueTest, LifoQueueTest, PriorityQueueTest,
+                              FailingQueueTest)
 
-def QueueJoinTest(q):
-    global cum
-    cum = 0
-    for i in (0,1):
-        threading.Thread(target=worker, args=(q,)).start()
-    for i in xrange(100):
-        q.put(i)
-    q.join()
-    verify(cum==sum(range(100)), "q.join() did not block until all tasks were done")
-    for i in (0,1):
-        q.put(None)         # instruct the threads to close
-    q.join()                # verify that you can join twice
-
-def QueueTaskDoneTest(q):
-    try:
-        q.task_done()
-    except ValueError:
-        pass
-    else:
-        raise TestFailed("Did not detect task count going negative")
-
-def test():
-    for Q in Queue.Queue, Queue.LifoQueue, Queue.PriorityQueue:
-        q = Q()
-        QueueTaskDoneTest(q)
-        QueueJoinTest(q)
-        QueueJoinTest(q)
-        QueueTaskDoneTest(q)
-
-        q = Q(QUEUE_SIZE)
-        # Do it a couple of times on the same queue
-        SimpleQueueTest(q)
-        SimpleQueueTest(q)
-        if verbose:
-            print "Simple Queue tests seemed to work for", Q.__name__
-
-    q = FailingQueue(QUEUE_SIZE)
-    FailingQueueTest(q)
-    FailingQueueTest(q)
-    if verbose:
-        print "Failing Queue tests seemed to work"
 
-test()
+if __name__ == "__main__":
+    test_main()

Deleted: /python/branches/trunk-math/Lib/test/test_rational.py
==============================================================================
--- /python/branches/trunk-math/Lib/test/test_rational.py	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,408 +0,0 @@
-"""Tests for Lib/rational.py."""
-
-from decimal import Decimal
-from test.test_support import run_unittest, verbose
-import math
-import operator
-import rational
-import unittest
-from copy import copy, deepcopy
-from cPickle import dumps, loads
-R = rational.Rational
-gcd = rational.gcd
-
-
-class GcdTest(unittest.TestCase):
-
-    def testMisc(self):
-        self.assertEquals(0, gcd(0, 0))
-        self.assertEquals(1, gcd(1, 0))
-        self.assertEquals(-1, gcd(-1, 0))
-        self.assertEquals(1, gcd(0, 1))
-        self.assertEquals(-1, gcd(0, -1))
-        self.assertEquals(1, gcd(7, 1))
-        self.assertEquals(-1, gcd(7, -1))
-        self.assertEquals(1, gcd(-23, 15))
-        self.assertEquals(12, gcd(120, 84))
-        self.assertEquals(-12, gcd(84, -120))
-
-
-def _components(r):
-    return (r.numerator, r.denominator)
-
-
-class RationalTest(unittest.TestCase):
-
-    def assertTypedEquals(self, expected, actual):
-        """Asserts that both the types and values are the same."""
-        self.assertEquals(type(expected), type(actual))
-        self.assertEquals(expected, actual)
-
-    def assertRaisesMessage(self, exc_type, message,
-                            callable, *args, **kwargs):
-        """Asserts that callable(*args, **kwargs) raises exc_type(message)."""
-        try:
-            callable(*args, **kwargs)
-        except exc_type, e:
-            self.assertEquals(message, str(e))
-        else:
-            self.fail("%s not raised" % exc_type.__name__)
-
-    def testInit(self):
-        self.assertEquals((0, 1), _components(R()))
-        self.assertEquals((7, 1), _components(R(7)))
-        self.assertEquals((7, 3), _components(R(R(7, 3))))
-
-        self.assertEquals((-1, 1), _components(R(-1, 1)))
-        self.assertEquals((-1, 1), _components(R(1, -1)))
-        self.assertEquals((1, 1), _components(R(-2, -2)))
-        self.assertEquals((1, 2), _components(R(5, 10)))
-        self.assertEquals((7, 15), _components(R(7, 15)))
-        self.assertEquals((10**23, 1), _components(R(10**23)))
-
-        self.assertRaisesMessage(ZeroDivisionError, "Rational(12, 0)",
-                                 R, 12, 0)
-        self.assertRaises(TypeError, R, 1.5)
-        self.assertRaises(TypeError, R, 1.5 + 3j)
-
-        self.assertRaises(TypeError, R, R(1, 2), 3)
-        self.assertRaises(TypeError, R, "3/2", 3)
-
-    def testFromString(self):
-        self.assertEquals((5, 1), _components(R("5")))
-        self.assertEquals((3, 2), _components(R("3/2")))
-        self.assertEquals((3, 2), _components(R(" \n  +3/2")))
-        self.assertEquals((-3, 2), _components(R("-3/2  ")))
-        self.assertEquals((13, 2), _components(R("    013/02 \n  ")))
-        self.assertEquals((13, 2), _components(R(u"    013/02 \n  ")))
-
-        self.assertEquals((16, 5), _components(R(" 3.2 ")))
-        self.assertEquals((-16, 5), _components(R(u" -3.2 ")))
-
-
-        self.assertRaisesMessage(
-            ZeroDivisionError, "Rational(3, 0)",
-            R, "3/0")
-        self.assertRaisesMessage(
-            ValueError, "Invalid literal for Rational: 3/",
-            R, "3/")
-        self.assertRaisesMessage(
-            ValueError, "Invalid literal for Rational: 3 /2",
-            R, "3 /2")
-        self.assertRaisesMessage(
-            # Denominators don't need a sign.
-            ValueError, "Invalid literal for Rational: 3/+2",
-            R, "3/+2")
-        self.assertRaisesMessage(
-            # Imitate float's parsing.
-            ValueError, "Invalid literal for Rational: + 3/2",
-            R, "+ 3/2")
-        self.assertRaisesMessage(
-            # Avoid treating '.' as a regex special character.
-            ValueError, "Invalid literal for Rational: 3a2",
-            R, "3a2")
-        self.assertRaisesMessage(
-            # Only parse ordinary decimals, not scientific form.
-            ValueError, "Invalid literal for Rational: 3.2e4",
-            R, "3.2e4")
-        self.assertRaisesMessage(
-            # Don't accept combinations of decimals and rationals.
-            ValueError, "Invalid literal for Rational: 3/7.2",
-            R, "3/7.2")
-        self.assertRaisesMessage(
-            # Don't accept combinations of decimals and rationals.
-            ValueError, "Invalid literal for Rational: 3.2/7",
-            R, "3.2/7")
-
-    def testImmutable(self):
-        r = R(7, 3)
-        r.__init__(2, 15)
-        self.assertEquals((7, 3), _components(r))
-
-    def testFromFloat(self):
-        self.assertRaisesMessage(
-            TypeError, "Rational.from_float() only takes floats, not 3 (int)",
-            R.from_float, 3)
-
-        self.assertEquals((0, 1), _components(R.from_float(-0.0)))
-        self.assertEquals((10, 1), _components(R.from_float(10.0)))
-        self.assertEquals((-5, 2), _components(R.from_float(-2.5)))
-        self.assertEquals((99999999999999991611392, 1),
-                          _components(R.from_float(1e23)))
-        self.assertEquals(float(10**23), float(R.from_float(1e23)))
-        self.assertEquals((3602879701896397, 1125899906842624),
-                          _components(R.from_float(3.2)))
-        self.assertEquals(3.2, float(R.from_float(3.2)))
-
-        inf = 1e1000
-        nan = inf - inf
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert inf to Rational.",
-            R.from_float, inf)
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert -inf to Rational.",
-            R.from_float, -inf)
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert nan to Rational.",
-            R.from_float, nan)
-
-    def testFromDecimal(self):
-        self.assertRaisesMessage(
-            TypeError,
-            "Rational.from_decimal() only takes Decimals, not 3 (int)",
-            R.from_decimal, 3)
-        self.assertEquals(R(0), R.from_decimal(Decimal("-0")))
-        self.assertEquals(R(5, 10), R.from_decimal(Decimal("0.5")))
-        self.assertEquals(R(5, 1000), R.from_decimal(Decimal("5e-3")))
-        self.assertEquals(R(5000), R.from_decimal(Decimal("5e3")))
-        self.assertEquals(1 - R(1, 10**30),
-                          R.from_decimal(Decimal("0." + "9" * 30)))
-
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert Infinity to Rational.",
-            R.from_decimal, Decimal("inf"))
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert -Infinity to Rational.",
-            R.from_decimal, Decimal("-inf"))
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert NaN to Rational.",
-            R.from_decimal, Decimal("nan"))
-        self.assertRaisesMessage(
-            TypeError, "Cannot convert sNaN to Rational.",
-            R.from_decimal, Decimal("snan"))
-
-    def testFromContinuedFraction(self):
-        self.assertRaises(TypeError, R.from_continued_fraction, None)
-        phi = R.from_continued_fraction([1]*100)
-        self.assertEquals(round(phi - (1 + 5 ** 0.5) / 2, 10), 0.0)
-
-        minusphi = R.from_continued_fraction([-1]*100)
-        self.assertEquals(round(minusphi + (1 + 5 ** 0.5) / 2, 10), 0.0)
-
-        self.assertEquals(R.from_continued_fraction([0]), R(0))
-        self.assertEquals(R.from_continued_fraction([]), R(0))
-
-    def testAsContinuedFraction(self):
-        self.assertEqual(R.from_float(math.pi).as_continued_fraction()[:15],
-                         [3, 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 3, 3])
-        self.assertEqual(R.from_float(-math.pi).as_continued_fraction()[:16],
-                         [-4, 1, 6, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 3, 3])
-        self.assertEqual(R(0).as_continued_fraction(), [0])
-
-    def testApproximateFrom(self):
-        self.assertEqual(R.from_float(math.pi).approximate(10000), R(355, 113))
-        self.assertEqual(R.from_float(-math.pi).approximate(10000), R(-355, 113))
-        self.assertEqual(R.from_float(0.0).approximate(10000), R(0))
-
-    def testConversions(self):
-        self.assertTypedEquals(-1, trunc(R(-11, 10)))
-        self.assertTypedEquals(-1, int(R(-11, 10)))
-        self.assertTypedEquals(-2, R(-11, 10).__floor__())
-        self.assertTypedEquals(-1, R(-11, 10).__ceil__())
-        self.assertTypedEquals(-1, R(-10, 10).__ceil__())
-
-        self.assertTypedEquals(0, R(-1, 10).__round__())
-        self.assertTypedEquals(0, R(-5, 10).__round__())
-        self.assertTypedEquals(-2, R(-15, 10).__round__())
-        self.assertTypedEquals(-1, R(-7, 10).__round__())
-
-        self.assertEquals(False, bool(R(0, 1)))
-        self.assertEquals(True, bool(R(3, 2)))
-        self.assertTypedEquals(0.1, float(R(1, 10)))
-
-        # Check that __float__ isn't implemented by converting the
-        # numerator and denominator to float before dividing.
-        self.assertRaises(OverflowError, float, long('2'*400+'7'))
-        self.assertAlmostEquals(2.0/3,
-                                float(R(long('2'*400+'7'), long('3'*400+'1'))))
-
-        self.assertTypedEquals(0.1+0j, complex(R(1,10)))
-
-    def testRound(self):
-        self.assertTypedEquals(R(-200), R(-150).__round__(-2))
-        self.assertTypedEquals(R(-200), R(-250).__round__(-2))
-        self.assertTypedEquals(R(30), R(26).__round__(-1))
-        self.assertTypedEquals(R(-2, 10), R(-15, 100).__round__(1))
-        self.assertTypedEquals(R(-2, 10), R(-25, 100).__round__(1))
-
-
-    def testArithmetic(self):
-        self.assertEquals(R(1, 2), R(1, 10) + R(2, 5))
-        self.assertEquals(R(-3, 10), R(1, 10) - R(2, 5))
-        self.assertEquals(R(1, 25), R(1, 10) * R(2, 5))
-        self.assertEquals(R(1, 4), R(1, 10) / R(2, 5))
-        self.assertTypedEquals(2, R(9, 10) // R(2, 5))
-        self.assertTypedEquals(10**23, R(10**23, 1) // R(1))
-        self.assertEquals(R(2, 3), R(-7, 3) % R(3, 2))
-        self.assertEquals(R(8, 27), R(2, 3) ** R(3))
-        self.assertEquals(R(27, 8), R(2, 3) ** R(-3))
-        self.assertTypedEquals(2.0, R(4) ** R(1, 2))
-        # Will return 1j in 3.0:
-        self.assertRaises(ValueError, pow, R(-1), R(1, 2))
-
-    def testMixedArithmetic(self):
-        self.assertTypedEquals(R(11, 10), R(1, 10) + 1)
-        self.assertTypedEquals(1.1, R(1, 10) + 1.0)
-        self.assertTypedEquals(1.1 + 0j, R(1, 10) + (1.0 + 0j))
-        self.assertTypedEquals(R(11, 10), 1 + R(1, 10))
-        self.assertTypedEquals(1.1, 1.0 + R(1, 10))
-        self.assertTypedEquals(1.1 + 0j, (1.0 + 0j) + R(1, 10))
-
-        self.assertTypedEquals(R(-9, 10), R(1, 10) - 1)
-        self.assertTypedEquals(-0.9, R(1, 10) - 1.0)
-        self.assertTypedEquals(-0.9 + 0j, R(1, 10) - (1.0 + 0j))
-        self.assertTypedEquals(R(9, 10), 1 - R(1, 10))
-        self.assertTypedEquals(0.9, 1.0 - R(1, 10))
-        self.assertTypedEquals(0.9 + 0j, (1.0 + 0j) - R(1, 10))
-
-        self.assertTypedEquals(R(1, 10), R(1, 10) * 1)
-        self.assertTypedEquals(0.1, R(1, 10) * 1.0)
-        self.assertTypedEquals(0.1 + 0j, R(1, 10) * (1.0 + 0j))
-        self.assertTypedEquals(R(1, 10), 1 * R(1, 10))
-        self.assertTypedEquals(0.1, 1.0 * R(1, 10))
-        self.assertTypedEquals(0.1 + 0j, (1.0 + 0j) * R(1, 10))
-
-        self.assertTypedEquals(R(1, 10), R(1, 10) / 1)
-        self.assertTypedEquals(0.1, R(1, 10) / 1.0)
-        self.assertTypedEquals(0.1 + 0j, R(1, 10) / (1.0 + 0j))
-        self.assertTypedEquals(R(10, 1), 1 / R(1, 10))
-        self.assertTypedEquals(10.0, 1.0 / R(1, 10))
-        self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / R(1, 10))
-
-        self.assertTypedEquals(0, R(1, 10) // 1)
-        self.assertTypedEquals(0.0, R(1, 10) // 1.0)
-        self.assertTypedEquals(10, 1 // R(1, 10))
-        self.assertTypedEquals(10**23, 10**22 // R(1, 10))
-        self.assertTypedEquals(10.0, 1.0 // R(1, 10))
-
-        self.assertTypedEquals(R(1, 10), R(1, 10) % 1)
-        self.assertTypedEquals(0.1, R(1, 10) % 1.0)
-        self.assertTypedEquals(R(0, 1), 1 % R(1, 10))
-        self.assertTypedEquals(0.0, 1.0 % R(1, 10))
-
-        # No need for divmod since we don't override it.
-
-        # ** has more interesting conversion rules.
-        self.assertTypedEquals(R(100, 1), R(1, 10) ** -2)
-        self.assertTypedEquals(R(100, 1), R(10, 1) ** 2)
-        self.assertTypedEquals(0.1, R(1, 10) ** 1.0)
-        self.assertTypedEquals(0.1 + 0j, R(1, 10) ** (1.0 + 0j))
-        self.assertTypedEquals(4 , 2 ** R(2, 1))
-        # Will return 1j in 3.0:
-        self.assertRaises(ValueError, pow, (-1), R(1, 2))
-        self.assertTypedEquals(R(1, 4) , 2 ** R(-2, 1))
-        self.assertTypedEquals(2.0 , 4 ** R(1, 2))
-        self.assertTypedEquals(0.25, 2.0 ** R(-2, 1))
-        self.assertTypedEquals(1.0 + 0j, (1.0 + 0j) ** R(1, 10))
-
-    def testMixingWithDecimal(self):
-        # Decimal refuses mixed comparisons.
-        self.assertRaisesMessage(
-            TypeError,
-            "unsupported operand type(s) for +: 'Rational' and 'Decimal'",
-            operator.add, R(3,11), Decimal('3.1415926'))
-        self.assertNotEquals(R(5, 2), Decimal('2.5'))
-
-    def testComparisons(self):
-        self.assertTrue(R(1, 2) < R(2, 3))
-        self.assertFalse(R(1, 2) < R(1, 2))
-        self.assertTrue(R(1, 2) <= R(2, 3))
-        self.assertTrue(R(1, 2) <= R(1, 2))
-        self.assertFalse(R(2, 3) <= R(1, 2))
-        self.assertTrue(R(1, 2) == R(1, 2))
-        self.assertFalse(R(1, 2) == R(1, 3))
-
-    def testMixedLess(self):
-        self.assertTrue(2 < R(5, 2))
-        self.assertFalse(2 < R(4, 2))
-        self.assertTrue(R(5, 2) < 3)
-        self.assertFalse(R(4, 2) < 2)
-
-        self.assertTrue(R(1, 2) < 0.6)
-        self.assertFalse(R(1, 2) < 0.4)
-        self.assertTrue(0.4 < R(1, 2))
-        self.assertFalse(0.5 < R(1, 2))
-
-    def testMixedLessEqual(self):
-        self.assertTrue(0.5 <= R(1, 2))
-        self.assertFalse(0.6 <= R(1, 2))
-        self.assertTrue(R(1, 2) <= 0.5)
-        self.assertFalse(R(1, 2) <= 0.4)
-        self.assertTrue(2 <= R(4, 2))
-        self.assertFalse(2 <= R(3, 2))
-        self.assertTrue(R(4, 2) <= 2)
-        self.assertFalse(R(5, 2) <= 2)
-
-    def testBigFloatComparisons(self):
-        # Because 10**23 can't be represented exactly as a float:
-        self.assertFalse(R(10**23) == float(10**23))
-        # The first test demonstrates why these are important.
-        self.assertFalse(1e23 < float(R(trunc(1e23) + 1)))
-        self.assertTrue(1e23 < R(trunc(1e23) + 1))
-        self.assertFalse(1e23 <= R(trunc(1e23) - 1))
-        self.assertTrue(1e23 > R(trunc(1e23) - 1))
-        self.assertFalse(1e23 >= R(trunc(1e23) + 1))
-
-    def testBigComplexComparisons(self):
-        self.assertFalse(R(10**23) == complex(10**23))
-        self.assertTrue(R(10**23) > complex(10**23))
-        self.assertFalse(R(10**23) <= complex(10**23))
-
-    def testMixedEqual(self):
-        self.assertTrue(0.5 == R(1, 2))
-        self.assertFalse(0.6 == R(1, 2))
-        self.assertTrue(R(1, 2) == 0.5)
-        self.assertFalse(R(1, 2) == 0.4)
-        self.assertTrue(2 == R(4, 2))
-        self.assertFalse(2 == R(3, 2))
-        self.assertTrue(R(4, 2) == 2)
-        self.assertFalse(R(5, 2) == 2)
-
-    def testStringification(self):
-        self.assertEquals("Rational(7,3)", repr(R(7, 3)))
-        self.assertEquals("7/3", str(R(7, 3)))
-        self.assertEquals("7", str(R(7, 1)))
-
-    def testHash(self):
-        self.assertEquals(hash(2.5), hash(R(5, 2)))
-        self.assertEquals(hash(10**50), hash(R(10**50)))
-        self.assertNotEquals(hash(float(10**23)), hash(R(10**23)))
-
-    def testApproximatePi(self):
-        # Algorithm borrowed from
-        # http://docs.python.org/lib/decimal-recipes.html
-        three = R(3)
-        lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
-        while abs(s - lasts) > R(1, 10**9):
-            lasts = s
-            n, na = n+na, na+8
-            d, da = d+da, da+32
-            t = (t * n) / d
-            s += t
-        self.assertAlmostEquals(math.pi, s)
-
-    def testApproximateCos1(self):
-        # Algorithm borrowed from
-        # http://docs.python.org/lib/decimal-recipes.html
-        x = R(1)
-        i, lasts, s, fact, num, sign = 0, 0, R(1), 1, 1, 1
-        while abs(s - lasts) > R(1, 10**9):
-            lasts = s
-            i += 2
-            fact *= i * (i-1)
-            num *= x * x
-            sign *= -1
-            s += num / fact * sign
-        self.assertAlmostEquals(math.cos(1), s)
-
-    def test_copy_deepcopy_pickle(self):
-        r = R(13, 7)
-        self.assertEqual(r, loads(dumps(r)))
-        self.assertEqual(id(r), id(copy(r)))
-        self.assertEqual(id(r), id(deepcopy(r)))
-
-def test_main():
-    run_unittest(RationalTest, GcdTest)
-
-if __name__ == '__main__':
-    test_main()

Modified: python/branches/trunk-math/Lib/test/test_socket_ssl.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_socket_ssl.py	(original)
+++ python/branches/trunk-math/Lib/test/test_socket_ssl.py	Tue Feb 12 06:36:19 2008
@@ -131,6 +131,8 @@
         raise last_exc
 
     def test_978833(self):
+        if not test_support.is_resource_enabled("network"):
+            return
         if test_support.verbose:
             print "test_978833 ..."
 

Modified: python/branches/trunk-math/Lib/test/test_socketserver.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_socketserver.py	(original)
+++ python/branches/trunk-math/Lib/test/test_socketserver.py	Tue Feb 12 06:36:19 2008
@@ -1,20 +1,32 @@
-# Test suite for SocketServer.py
+"""
+Test suite for SocketServer.py.
+"""
 
-from test import test_support
-from test.test_support import (verbose, verify, TESTFN, TestSkipped,
-                               reap_children)
-test_support.requires('network')
-
-from SocketServer import *
+import os
 import socket
 import errno
+import imp
 import select
 import time
 import threading
-import os
+from functools import wraps
+import unittest
+import SocketServer
+
+import test.test_support
+from test.test_support import reap_children, verbose, TestSkipped
+from test.test_support import TESTFN as TEST_FILE
+
+test.test_support.requires("network")
 
 NREQ = 3
 DELAY = 0.5
+TEST_STR = "hello world\n"
+HOST = "localhost"
+
+HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX")
+HAVE_FORKING = hasattr(os, "fork") and os.name != "os2"
+
 
 class MyMixinHandler:
     def handle(self):
@@ -23,50 +35,42 @@
         time.sleep(DELAY)
         self.wfile.write(line)
 
-class MyStreamHandler(MyMixinHandler, StreamRequestHandler):
+
+def receive(sock, n, timeout=20):
+    r, w, x = select.select([sock], [], [], timeout)
+    if sock in r:
+        return sock.recv(n)
+    else:
+        raise RuntimeError, "timed out on %r" % (sock,)
+
+
+class MyStreamHandler(MyMixinHandler, SocketServer.StreamRequestHandler):
     pass
 
-class MyDatagramHandler(MyMixinHandler, DatagramRequestHandler):
+class MyDatagramHandler(MyMixinHandler,
+    SocketServer.DatagramRequestHandler):
     pass
 
+if HAVE_UNIX_SOCKETS:
+    class ForkingUnixStreamServer(SocketServer.ForkingMixIn,
+                                  SocketServer.UnixStreamServer):
+        pass
+
+    class ForkingUnixDatagramServer(SocketServer.ForkingMixIn,
+                                    SocketServer.UnixDatagramServer):
+        pass
+
+
 class MyMixinServer:
     def serve_a_few(self):
         for i in range(NREQ):
             self.handle_request()
+
     def handle_error(self, request, client_address):
         self.close_request(request)
         self.server_close()
         raise
 
-teststring = "hello world\n"
-
-def receive(sock, n, timeout=20):
-    r, w, x = select.select([sock], [], [], timeout)
-    if sock in r:
-        return sock.recv(n)
-    else:
-        raise RuntimeError, "timed out on %r" % (sock,)
-
-def testdgram(proto, addr):
-    s = socket.socket(proto, socket.SOCK_DGRAM)
-    s.sendto(teststring, addr)
-    buf = data = receive(s, 100)
-    while data and '\n' not in buf:
-        data = receive(s, 100)
-        buf += data
-    verify(buf == teststring)
-    s.close()
-
-def teststream(proto, addr):
-    s = socket.socket(proto, socket.SOCK_STREAM)
-    s.connect(addr)
-    s.sendall(teststring)
-    buf = data = receive(s, 100)
-    while data and '\n' not in buf:
-        data = receive(s, 100)
-        buf += data
-    verify(buf == teststring)
-    s.close()
 
 class ServerThread(threading.Thread):
     def __init__(self, addr, svrcls, hdlrcls):
@@ -75,6 +79,7 @@
         self.__svrcls = svrcls
         self.__hdlrcls = hdlrcls
         self.ready = threading.Event()
+
     def run(self):
         class svrcls(MyMixinServer, self.__svrcls):
             pass
@@ -93,64 +98,8 @@
         svr.serve_a_few()
         if verbose: print "thread: done"
 
-seed = 0
-def pickport():
-    global seed
-    seed += 1
-    return 10000 + (os.getpid() % 1000)*10 + seed
-
-host = "localhost"
-testfiles = []
-def pickaddr(proto):
-    if proto == socket.AF_INET:
-        return (host, pickport())
-    else:
-        fn = TESTFN + str(pickport())
-        if os.name == 'os2':
-            # AF_UNIX socket names on OS/2 require a specific prefix
-            # which can't include a drive letter and must also use
-            # backslashes as directory separators
-            if fn[1] == ':':
-                fn = fn[2:]
-            if fn[0] in (os.sep, os.altsep):
-                fn = fn[1:]
-            fn = os.path.join('\socket', fn)
-            if os.sep == '/':
-                fn = fn.replace(os.sep, os.altsep)
-            else:
-                fn = fn.replace(os.altsep, os.sep)
-        testfiles.append(fn)
-        return fn
-
-def cleanup():
-    for fn in testfiles:
-        try:
-            os.remove(fn)
-        except os.error:
-            pass
-    testfiles[:] = []
 
-def testloop(proto, servers, hdlrcls, testfunc):
-    for svrcls in servers:
-        addr = pickaddr(proto)
-        if verbose:
-            print "ADDR =", addr
-            print "CLASS =", svrcls
-        t = ServerThread(addr, svrcls, hdlrcls)
-        if verbose: print "server created"
-        t.start()
-        if verbose: print "server running"
-        for i in range(NREQ):
-            t.ready.wait(10*DELAY)
-            if not t.ready.isSet():
-                raise RuntimeError("Server not ready within a reasonable time")
-            if verbose: print "test client", i
-            testfunc(proto, addr)
-        if verbose: print "waiting for server"
-        t.join()
-        if verbose: print "done"
-
-class ForgivingTCPServer(TCPServer):
+class ForgivingTCPServer(SocketServer.TCPServer):
     # prevent errors if another process is using the port we want
     def server_bind(self):
         host, default_port = self.server_address
@@ -160,64 +109,148 @@
         for port in [default_port, 3434, 8798, 23833]:
             try:
                 self.server_address = host, port
-                TCPServer.server_bind(self)
+                SocketServer.TCPServer.server_bind(self)
                 break
             except socket.error, (err, msg):
                 if err != errno.EADDRINUSE:
                     raise
-                print >>sys.__stderr__, \
-                    '  WARNING: failed to listen on port %d, trying another' % port
+                print >> sys.__stderr__, \
+                    "WARNING: failed to listen on port %d, trying another: " % port
+
+
+class SocketServerTest(unittest.TestCase):
+    """Test all socket servers."""
+
+    def setUp(self):
+        self.port_seed = 0
+        self.test_files = []
+
+    def tearDown(self):
+        time.sleep(DELAY)
+        reap_children()
+
+        for fn in self.test_files:
+            try:
+                os.remove(fn)
+            except os.error:
+                pass
+        self.test_files[:] = []
+
+    def pickport(self):
+        self.port_seed += 1
+        return 10000 + (os.getpid() % 1000)*10 + self.port_seed
+
+    def pickaddr(self, proto):
+        if proto == socket.AF_INET:
+            return (HOST, self.pickport())
+        else:
+            fn = TEST_FILE + str(self.pickport())
+            if os.name == 'os2':
+                # AF_UNIX socket names on OS/2 require a specific prefix
+                # which can't include a drive letter and must also use
+                # backslashes as directory separators
+                if fn[1] == ':':
+                    fn = fn[2:]
+                if fn[0] in (os.sep, os.altsep):
+                    fn = fn[1:]
+                fn = os.path.join('\socket', fn)
+                if os.sep == '/':
+                    fn = fn.replace(os.sep, os.altsep)
+                else:
+                    fn = fn.replace(os.altsep, os.sep)
+            self.test_files.append(fn)
+            return fn
+
+    def run_servers(self, proto, servers, hdlrcls, testfunc):
+        for svrcls in servers:
+            addr = self.pickaddr(proto)
+            if verbose:
+                print "ADDR =", addr
+                print "CLASS =", svrcls
+            t = ServerThread(addr, svrcls, hdlrcls)
+            if verbose: print "server created"
+            t.start()
+            if verbose: print "server running"
+            for i in range(NREQ):
+                t.ready.wait(10*DELAY)
+                self.assert_(t.ready.isSet(),
+                    "Server not ready within a reasonable time")
+                if verbose: print "test client", i
+                testfunc(proto, addr)
+            if verbose: print "waiting for server"
+            t.join()
+            if verbose: print "done"
+
+    def stream_examine(self, proto, addr):
+        s = socket.socket(proto, socket.SOCK_STREAM)
+        s.connect(addr)
+        s.sendall(TEST_STR)
+        buf = data = receive(s, 100)
+        while data and '\n' not in buf:
+            data = receive(s, 100)
+            buf += data
+        self.assertEquals(buf, TEST_STR)
+        s.close()
+
+    def dgram_examine(self, proto, addr):
+        s = socket.socket(proto, socket.SOCK_DGRAM)
+        s.sendto(TEST_STR, addr)
+        buf = data = receive(s, 100)
+        while data and '\n' not in buf:
+            data = receive(s, 100)
+            buf += data
+        self.assertEquals(buf, TEST_STR)
+        s.close()
+
+    def test_TCPServers(self):
+        # Test SocketServer.TCPServer
+        servers = [ForgivingTCPServer, SocketServer.ThreadingTCPServer]
+        if HAVE_FORKING:
+            servers.append(SocketServer.ForkingTCPServer)
+        self.run_servers(socket.AF_INET, servers,
+                         MyStreamHandler, self.stream_examine)
+
+    def test_UDPServers(self):
+        # Test SocketServer.UDPServer
+        servers = [SocketServer.UDPServer,
+                   SocketServer.ThreadingUDPServer]
+        if HAVE_FORKING:
+            servers.append(SocketServer.ForkingUDPServer)
+        self.run_servers(socket.AF_INET, servers, MyDatagramHandler,
+                         self.dgram_examine)
+
+    def test_stream_servers(self):
+        # Test SocketServer's stream servers
+        if not HAVE_UNIX_SOCKETS:
+            return
+        servers = [SocketServer.UnixStreamServer,
+                   SocketServer.ThreadingUnixStreamServer]
+        if HAVE_FORKING:
+            servers.append(ForkingUnixStreamServer)
+        self.run_servers(socket.AF_UNIX, servers, MyStreamHandler,
+                         self.stream_examine)
+
+    # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
+    # client address so this cannot work:
+
+    # def test_dgram_servers(self):
+    #     # Test SocketServer.UnixDatagramServer
+    #     if not HAVE_UNIX_SOCKETS:
+    #         return
+    #     servers = [SocketServer.UnixDatagramServer,
+    #                SocketServer.ThreadingUnixDatagramServer]
+    #     if HAVE_FORKING:
+    #         servers.append(ForkingUnixDatagramServer)
+    #     self.run_servers(socket.AF_UNIX, servers, MyDatagramHandler,
+    #                      self.dgram_examine)
 
-tcpservers = [ForgivingTCPServer, ThreadingTCPServer]
-if hasattr(os, 'fork') and os.name not in ('os2',):
-    tcpservers.append(ForkingTCPServer)
-udpservers = [UDPServer, ThreadingUDPServer]
-if hasattr(os, 'fork') and os.name not in ('os2',):
-    udpservers.append(ForkingUDPServer)
-
-if not hasattr(socket, 'AF_UNIX'):
-    streamservers = []
-    dgramservers = []
-else:
-    class ForkingUnixStreamServer(ForkingMixIn, UnixStreamServer): pass
-    streamservers = [UnixStreamServer, ThreadingUnixStreamServer]
-    if hasattr(os, 'fork') and os.name not in ('os2',):
-        streamservers.append(ForkingUnixStreamServer)
-    class ForkingUnixDatagramServer(ForkingMixIn, UnixDatagramServer): pass
-    dgramservers = [UnixDatagramServer, ThreadingUnixDatagramServer]
-    if hasattr(os, 'fork') and os.name not in ('os2',):
-        dgramservers.append(ForkingUnixDatagramServer)
-
-def sloppy_cleanup():
-    # See http://python.org/sf/1540386
-    # We need to reap children here otherwise a child from one server
-    # can be left running for the next server and cause a test failure.
-    time.sleep(DELAY)
-    reap_children()
-
-def testall():
-    testloop(socket.AF_INET, tcpservers, MyStreamHandler, teststream)
-    sloppy_cleanup()
-    testloop(socket.AF_INET, udpservers, MyDatagramHandler, testdgram)
-    if hasattr(socket, 'AF_UNIX'):
-        sloppy_cleanup()
-        testloop(socket.AF_UNIX, streamservers, MyStreamHandler, teststream)
-        # Alas, on Linux (at least) recvfrom() doesn't return a meaningful
-        # client address so this cannot work:
-        ##testloop(socket.AF_UNIX, dgramservers, MyDatagramHandler, testdgram)
 
 def test_main():
-    import imp
     if imp.lock_held():
-        # If the import lock is held, the threads will hang.
+        # If the import lock is held, the threads will hang
         raise TestSkipped("can't run when import lock is held")
 
-    reap_children()
-    try:
-        testall()
-    finally:
-        cleanup()
-    reap_children()
+    test.test_support.run_unittest(SocketServerTest)
 
 if __name__ == "__main__":
     test_main()

Modified: python/branches/trunk-math/Lib/test/test_sys.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_sys.py	(original)
+++ python/branches/trunk-math/Lib/test/test_sys.py	Tue Feb 12 06:36:19 2008
@@ -363,6 +363,27 @@
             self.assertEqual(type(getattr(sys.flags, attr)), int, attr)
         self.assert_(repr(sys.flags))
 
+    def test_clear_type_cache(self):
+        sys._clear_type_cache()
+
+    def test_compact_freelists(self):
+        sys._compact_freelists()
+        r = sys._compact_freelists()
+##        # freed blocks shouldn't change
+##        self.assertEqual(r[0][2], 0)
+##        self.assertEqual(r[1][2], 0)
+##        # fill freelists
+##        ints = list(range(10000))
+##        floats = [float(i) for i in ints]
+##        del ints
+##        del floats
+##        # should free more than 200 blocks each
+##        r = sys._compact_freelists()
+##        self.assert_(r[0][1] > 100, r[0][1])
+##        self.assert_(r[1][2] > 100, r[1][1])
+##
+##        self.assert_(r[0][2] > 100, r[0][2])
+##        self.assert_(r[1][2] > 100, r[1][2])
 
 def test_main():
     test.test_support.run_unittest(SysModuleTest)

Modified: python/branches/trunk-math/Lib/test/test_tarfile.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_tarfile.py	(original)
+++ python/branches/trunk-math/Lib/test/test_tarfile.py	Tue Feb 12 06:36:19 2008
@@ -208,6 +208,15 @@
         self.assert_(tarinfo.type == tarfile.DIRTYPE,
                 "v7 dirtype failed")
 
+    def test_xstar_type(self):
+        # The xstar format stores extra atime and ctime fields inside the
+        # space reserved for the prefix field. The prefix field must be
+        # ignored in this case, otherwise it will mess up the name.
+        try:
+            self.tar.getmember("misc/regtype-xstar")
+        except KeyError:
+            self.fail("failed to find misc/regtype-xstar (mangled prefix?)")
+
     def test_check_members(self):
         for tarinfo in self.tar:
             self.assert_(int(tarinfo.mtime) == 07606136617,

Modified: python/branches/trunk-math/Lib/test/test_tempfile.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_tempfile.py	(original)
+++ python/branches/trunk-math/Lib/test/test_tempfile.py	Tue Feb 12 06:36:19 2008
@@ -1,5 +1,5 @@
 # tempfile.py unit tests.
-
+from __future__ import with_statement
 import tempfile
 import os
 import sys
@@ -619,7 +619,6 @@
 
     def test_multiple_close(self):
         # A NamedTemporaryFile can be closed many times without error
-
         f = tempfile.NamedTemporaryFile()
         f.write('abc\n')
         f.close()
@@ -629,6 +628,16 @@
         except:
             self.failOnException("close")
 
+    def test_context_manager(self):
+        # A NamedTemporaryFile can be used as a context manager
+        with tempfile.NamedTemporaryFile() as f:
+            self.failUnless(os.path.exists(f.name))
+        self.failIf(os.path.exists(f.name))
+        def use_closed():
+            with f:
+                pass
+        self.failUnlessRaises(ValueError, use_closed)
+
     # How to test the mode and bufsize parameters?
 
 test_classes.append(test_NamedTemporaryFile)
@@ -707,10 +716,23 @@
         self.failUnless(f.fileno() > 0)
         self.failUnless(f._rolled)
 
-    def test_multiple_close(self):
+    def test_multiple_close_before_rollover(self):
         # A SpooledTemporaryFile can be closed many times without error
         f = tempfile.SpooledTemporaryFile()
         f.write('abc\n')
+        self.failIf(f._rolled)
+        f.close()
+        try:
+            f.close()
+            f.close()
+        except:
+            self.failOnException("close")
+
+    def test_multiple_close_after_rollover(self):
+        # A SpooledTemporaryFile can be closed many times without error
+        f = tempfile.SpooledTemporaryFile(max_size=1)
+        f.write('abc\n')
+        self.failUnless(f._rolled)
         f.close()
         try:
             f.close()
@@ -732,6 +754,46 @@
         seek(0, 0)
         self.failUnless(read(70) == 'a'*35 + 'b'*35)
 
+    def test_context_manager_before_rollover(self):
+        # A SpooledTemporaryFile can be used as a context manager
+        with tempfile.SpooledTemporaryFile(max_size=1) as f:
+            self.failIf(f._rolled)
+            self.failIf(f.closed)
+        self.failUnless(f.closed)
+        def use_closed():
+            with f:
+                pass
+        self.failUnlessRaises(ValueError, use_closed)
+
+    def test_context_manager_during_rollover(self):
+        # A SpooledTemporaryFile can be used as a context manager
+        with tempfile.SpooledTemporaryFile(max_size=1) as f:
+            self.failIf(f._rolled)
+            f.write('abc\n')
+            f.flush()
+            self.failUnless(f._rolled)
+            self.failIf(f.closed)
+        self.failUnless(f.closed)
+        def use_closed():
+            with f:
+                pass
+        self.failUnlessRaises(ValueError, use_closed)
+
+    def test_context_manager_after_rollover(self):
+        # A SpooledTemporaryFile can be used as a context manager
+        f = tempfile.SpooledTemporaryFile(max_size=1)
+        f.write('abc\n')
+        f.flush()
+        self.failUnless(f._rolled)
+        with f:
+            self.failIf(f.closed)
+        self.failUnless(f.closed)
+        def use_closed():
+            with f:
+                pass
+        self.failUnlessRaises(ValueError, use_closed)
+
+
 test_classes.append(test_SpooledTemporaryFile)
 
 

Modified: python/branches/trunk-math/Lib/test/test_trace.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_trace.py	(original)
+++ python/branches/trunk-math/Lib/test/test_trace.py	Tue Feb 12 06:36:19 2008
@@ -252,14 +252,16 @@
                 "\n".join(difflib.ndiff([str(x) for x in expected_events],
                                         [str(x) for x in events])))
 
-
-    def run_test(self, func):
+    def run_and_compare(self, func, events):
         tracer = Tracer()
         sys.settrace(tracer.trace)
         func()
         sys.settrace(None)
         self.compare_events(func.func_code.co_firstlineno,
-                            tracer.events, func.events)
+                            tracer.events, events)
+
+    def run_test(self, func):
+        self.run_and_compare(func, func.events)
 
     def run_test2(self, func):
         tracer = Tracer()
@@ -321,6 +323,58 @@
         self.compare_events(generator_example.__code__.co_firstlineno,
                             tracer.events, generator_example.events)
 
+    def test_14_onliner_if(self):
+        def onliners():
+            if True: False
+            else: True
+            return 0
+        self.run_and_compare(
+            onliners,
+            [(0, 'call'),
+             (1, 'line'),
+             (3, 'line'),
+             (3, 'return')])
+
+    def test_15_loops(self):
+        # issue1750076: "while" expression is skipped by debugger
+        def for_example():
+            for x in range(2):
+                pass
+        self.run_and_compare(
+            for_example,
+            [(0, 'call'),
+             (1, 'line'),
+             (2, 'line'),
+             (1, 'line'),
+             (2, 'line'),
+             (1, 'line'),
+             (1, 'return')])
+
+        def while_example():
+            # While expression should be traced on every loop
+            x = 2
+            while x > 0:
+                x -= 1
+        self.run_and_compare(
+            while_example,
+            [(0, 'call'),
+             (2, 'line'),
+             (3, 'line'),
+             (4, 'line'),
+             (3, 'line'),
+             (4, 'line'),
+             (3, 'line'),
+             (3, 'return')])
+
+    def test_16_blank_lines(self):
+        exec("def f():\n" + "\n" * 256 + "    pass")
+        self.run_and_compare(
+            f,
+            [(0, 'call'),
+             (257, 'line'),
+             (257, 'return')])
+
+
 class RaisingTraceFuncTestCase(unittest.TestCase):
     def trace(self, frame, event, arg):
         """A trace function that raises an exception in response to a

Modified: python/branches/trunk-math/Lib/test/test_urllib2.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_urllib2.py	(original)
+++ python/branches/trunk-math/Lib/test/test_urllib2.py	Tue Feb 12 06:36:19 2008
@@ -822,6 +822,8 @@
                 method = getattr(h, "http_error_%s" % code)
                 req = Request(from_url, data)
                 req.add_header("Nonsense", "viking=withhold")
+                if data is not None:
+                    req.add_header("Content-Length", str(len(data)))
                 req.add_unredirected_header("Spam", "spam")
                 try:
                     method(req, MockFile(), code, "Blah",
@@ -834,6 +836,13 @@
                     self.assertEqual(o.req.get_method(), "GET")
                 except AttributeError:
                     self.assert_(not o.req.has_data())
+
+                # now it's a GET, there should not be headers regarding content
+                # (possibly dragged from before being a POST)
+                headers = [x.lower() for x in o.req.headers]
+                self.assertTrue("content-length" not in headers)
+                self.assertTrue("content-type" not in headers)
+
                 self.assertEqual(o.req.headers["Nonsense"],
                                  "viking=withhold")
                 self.assert_("Spam" not in o.req.headers)

Modified: python/branches/trunk-math/Lib/test/test_wave.py
==============================================================================
--- python/branches/trunk-math/Lib/test/test_wave.py	(original)
+++ python/branches/trunk-math/Lib/test/test_wave.py	Tue Feb 12 06:36:19 2008
@@ -1,32 +1,45 @@
-from test.test_support import TestFailed, TESTFN
+from test.test_support import TESTFN, run_unittest
 import os
 import wave
-
-def check(t, msg=None):
-    if not t:
-        raise TestFailed, msg
+import unittest
 
 nchannels = 2
 sampwidth = 2
 framerate = 8000
 nframes = 100
 
-f = wave.open(TESTFN, 'wb')
-f.setnchannels(nchannels)
-f.setsampwidth(sampwidth)
-f.setframerate(framerate)
-f.setnframes(nframes)
-output = '\0' * nframes * nchannels * sampwidth
-f.writeframes(output)
-f.close()
-
-f = wave.open(TESTFN, 'rb')
-check(nchannels == f.getnchannels(), "nchannels")
-check(sampwidth == f.getsampwidth(), "sampwidth")
-check(framerate == f.getframerate(), "framerate")
-check(nframes == f.getnframes(), "nframes")
-input = f.readframes(nframes)
-check(input == output, "data")
-f.close()
+class TestWave(unittest.TestCase):
+
+    def setUp(self):
+        self.f = None
+
+    def tearDown(self):
+        if self.f is not None:
+            self.f.close()
+        try:
+            os.remove(TESTFN)
+        except OSError:
+            pass
+
+    def test_it(self):
+        self.f = wave.open(TESTFN, 'wb')
+        self.f.setnchannels(nchannels)
+        self.f.setsampwidth(sampwidth)
+        self.f.setframerate(framerate)
+        self.f.setnframes(nframes)
+        output = '\0' * nframes * nchannels * sampwidth
+        self.f.writeframes(output)
+        self.f.close()
+
+        self.f = wave.open(TESTFN, 'rb')
+        self.assertEqual(nchannels, self.f.getnchannels())
+        self.assertEqual(sampwidth, self.f.getsampwidth())
+        self.assertEqual(framerate, self.f.getframerate())
+        self.assertEqual(nframes, self.f.getnframes())
+        self.assertEqual(self.f.readframes(nframes), output)
+
+def test_main():
+    run_unittest(TestWave)
 
-os.remove(TESTFN)
+if __name__ == '__main__':
+    test_main()

Modified: python/branches/trunk-math/Lib/test/testtar.tar
==============================================================================
Binary files. No diff available.

Modified: python/branches/trunk-math/Lib/urllib2.py
==============================================================================
--- python/branches/trunk-math/Lib/urllib2.py	(original)
+++ python/branches/trunk-math/Lib/urllib2.py	Tue Feb 12 06:36:19 2008
@@ -534,8 +534,11 @@
             # do the same.
             # be conciliant with URIs containing a space
             newurl = newurl.replace(' ', '%20')
+            newheaders = dict((k,v) for k,v in req.headers.items()
+                              if k.lower() not in ("content-length", "content-type")
+                             )
             return Request(newurl,
-                           headers=req.headers,
+                           headers=newheaders,
                            origin_req_host=req.get_origin_req_host(),
                            unverifiable=True)
         else:

Modified: python/branches/trunk-math/Misc/ACKS
==============================================================================
--- python/branches/trunk-math/Misc/ACKS	(original)
+++ python/branches/trunk-math/Misc/ACKS	Tue Feb 12 06:36:19 2008
@@ -509,6 +509,7 @@
 Mark Perrego
 Trevor Perrin
 Tim Peters
+Benjamin Peterson
 Chris Petrilli
 Bjorn Pettersen
 Geoff Philbrick
@@ -598,6 +599,7 @@
 Jiwon Seo
 Jerry Seutter
 Denis Severson
+Ian Seyer
 Ha Shao
 Bruce Sherwood
 Pete Shinners

Modified: python/branches/trunk-math/Misc/NEWS
==============================================================================
--- python/branches/trunk-math/Misc/NEWS	(original)
+++ python/branches/trunk-math/Misc/NEWS	Tue Feb 12 06:36:19 2008
@@ -20,10 +20,32 @@
   without the four functions and copysign in libm were added to a new file
   Python/pymath.c.
 
+- Issue #2045: Fix an infinite recursion triggered when printing a subclass of
+  collections.defaultdict, if its default_factory is set to a bound method.
+
+- Fixed a minor memory leak in dictobject.c. The content of the free
+  list was not freed on interpreter shutdown.
+
+- Limit free list of method and builtin function objects to 256 entries
+  each.
+
+- Patch #1953: Added ``sys._compact_freelists()`` and the C API functions
+  ``PyInt_CompactFreeList`` and ``PyFloat_CompactFreeList``
+  to compact the internal free lists of pre-allocted ints and floats.
+
+- Bug #1983: Fixed return type of fork(), fork1() and forkpty() calls.
+  Python expected the return type int but the fork familie returns pi_t.
+
+- Issue #1678380: Fix a bug that identifies 0j and -0j when they appear
+  in the same code unit.
+
+- Issue #2025 :  Add tuple.count() and tuple.index() methods to comply with
+  the collections.Sequence API.
+
 - Patch #1970 by Antoine Pitrou: Speedup unicode whitespace and linebreak
   detection
 
-- Added ``PyType_ClearCache()`` and ``sys._cleartypecache`` to clear the
+- Added ``PyType_ClearCache()`` and ``sys._clear_type_cache`` to clear the
   internal lookup cache for ref leak tests.
 
 - Patch #1473257: generator objects gain a gi_code attribute. This is the
@@ -386,6 +408,27 @@
 Library
 -------
 
+- Rename rational.py to fractions.py and the rational.Rational class
+  to fractions.Fraction, to avoid the name clash with the abstract
+  base class numbers.Rational.  See discussion in issue #1682.
+
+- The pickletools module now provides an optimize() function
+  that eliminates unused PUT opcodes from a pickle string.
+
+- #2021: Allow tempfile.NamedTemporaryFile and SpooledTemporaryFile
+  to be used in with statements by correctly supporting the context
+  management protocol.
+
+- #1979: Add rich comparisons to Decimal, and make Decimal comparisons
+  involving a NaN follow the IEEE 754 standard.
+
+- #2004: tarfile.py: Use mode 0700 for temporary directories and default
+  permissions for missing directories.
+
+- #175006: The debugger used to skip the condition of a "while" statement
+  after the first iteration. Now it correctly steps on the expression, and
+  breakpoints on the "while" statement are honored on each loop.
+
 - #1765140: add an optional delay argument to FileHandler and its
   subclasses. Defaults to false (existing behaviour), but if true,
   defers opening the file until the first call to emit().
@@ -1094,6 +1137,8 @@
 Extension Modules
 -----------------
 
+- Updated ``big5hkscs`` codec to the HKSCS revision of 2004.
+
 - #1940: make it possible to use curses.filter() before curses.initscr()
   as the documentation says.
 
@@ -1272,9 +1317,14 @@
 
 - Bug #1372: zlibmodule.c: int overflow in PyZlib_decompress
 
+- bsddb module: Fix memory leak when using database cursors on
+  databases without a DBEnv.
+
 Tests
 -----
 
+- Refactor test_profile and test_cprofile to use the same code to profile.
+
 - Make test_runpy reentrant by fixing _check_module to clear out any module
   being tested.  Was causing an error by __import__ doing a reload on the
   second run and thus suppressing bytecode recreation.
@@ -1391,6 +1441,15 @@
 Build
 -----
 
+- Have the search path for building extensions follow the declared order in
+  $CPPFLAGS and $LDFLAGS when adding directories from those environment
+  variables.
+
+- Bug #1983: Added a check to pyport to verify that sizeof(pid_t) is
+  smaller or equal sizeof(long).
+
+- Bug #1234: Fixed semaphore errors on AIX 5.2
+
 - Issue #1726: Remove Python/atof.c from PCBuild/pythoncore.vcproj
 
 - Removed PCbuild8/ directory and added a new build directory for VS 2005
@@ -1461,6 +1520,16 @@
 C API
 -----
 
+- Unified naming convention for free lists and their limits. All free lists
+  in Object/ are named ``free_list``, the counter ``numfree`` and the upper
+  limit is a macro ``PyName_MAXFREELIST`` inside an #ifndef block.
+
+- ``PySet_Add()`` can now modify a newly created frozenset.  Similarly to
+  ``PyTuple_SetItem``, it can be used to populate a brand new frozenset; but 
+  it does not steal a reference to the added item.
+
+- Added ``PySet_Check()`` and ``PyFrozenSet_Check()`` to the set API. 
+
 - Backport of PyUnicode_FromString(), _FromStringAndSize(), _Format and
   _FormatV from Python 3.0. Made PyLong_AsSsize_t and PyLong_FromSsize_t
   public functions.
@@ -1512,6 +1581,10 @@
 Windows
 -------
 
+- Patch #1706: Drop support for Win9x, WinME and NT4. Python now requires 
+  Windows 2000 or greater. The _WINVER and NTDDI_VERSION macros are set to
+  Win2k for x86/32bit builds and WinXP for AMD64 builds.
+
 - Conditionalize definition of _CRT_SECURE_NO_DEPRECATE
   and _CRT_NONSTDC_NO_DEPRECATE.
 

Modified: python/branches/trunk-math/Misc/build.sh
==============================================================================
--- python/branches/trunk-math/Misc/build.sh	(original)
+++ python/branches/trunk-math/Misc/build.sh	Tue Feb 12 06:36:19 2008
@@ -67,7 +67,7 @@
 # Note: test_XXX (none currently) 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_(cmd_line|popen2|socket|urllib2_localnet)"
+LEAKY_TESTS="test_(asynchat|cmd_line|popen2|socket|sys|threadsignals|urllib2_localnet)"
 
 # Skip these tests altogether when looking for leaks.  These tests
 # do not need to be stored above in LEAKY_TESTS too.
@@ -97,7 +97,17 @@
         if [ "$FAILURE_CC" != "" ]; then
             dest="$dest -c $FAILURE_CC"
         fi
-        mutt -s "$FAILURE_SUBJECT $1 ($NUM_FAILURES)" $dest < $2
+	if [ "x$3" != "x" ] ; then
+	    (echo "More important issues:"
+	     echo "----------------------"
+	     egrep -v "$3" < $2
+	     echo ""
+	     echo "Less important issues:"
+	     echo "----------------------"
+	     egrep "$3" < $2)
+        else
+	    cat $2
+	fi | mutt -s "$FAILURE_SUBJECT $1 ($NUM_FAILURES)" $dest
     fi
 }
 
@@ -192,9 +202,10 @@
             ## ensure that the reflog exists so the grep doesn't fail
             touch $REFLOG
             $PYTHON $REGRTEST_ARGS -R 4:3:$REFLOG -u network $LEAKY_SKIPS >& build/$F
-            NUM_FAILURES=`egrep -vc "($LEAKY_TESTS|sum=0)" $REFLOG`
+	    LEAK_PAT="($LEAKY_TESTS|sum=0)"
+            NUM_FAILURES=`egrep -vc "$LEAK_PAT" $REFLOG`
             update_status "Testing refleaks ($NUM_FAILURES failures)" "$F" $start
-            mail_on_failure "refleak" $REFLOG
+            mail_on_failure "refleak" $REFLOG "$LEAK_PAT"
 
             ## now try to run all the tests
             F=make-testall.out

Modified: python/branches/trunk-math/Misc/python-mode.el
==============================================================================
--- python/branches/trunk-math/Misc/python-mode.el	(original)
+++ python/branches/trunk-math/Misc/python-mode.el	Tue Feb 12 06:36:19 2008
@@ -2,7 +2,8 @@
 
 ;; Copyright (C) 1992,1993,1994  Tim Peters
 
-;; Author: 1995-2002 Barry A. Warsaw
+;; Author: 2003-2007 http://sf.net/projects/python-mode
+;;         1995-2002 Barry A. Warsaw
 ;;         1992-1994 Tim Peters
 ;; Maintainer: python-mode at python.org
 ;; Created:    Feb 1992
@@ -19,19 +20,38 @@
 
 ;;; Commentary:
 
-;; This is a major mode for editing Python programs.  It was developed
-;; by Tim Peters after an original idea by Michael A. Guravage.  Tim
-;; subsequently left the net; in 1995, Barry Warsaw inherited the mode
-;; and is the current maintainer.  Tim's now back but disavows all
-;; responsibility for the mode.  Smart Tim :-)
+;; This is a major mode for editing Python programs.  It was developed by Tim
+;; Peters after an original idea by Michael A. Guravage.  Tim subsequently
+;; left the net and in 1995, Barry Warsaw inherited the mode.  Tim's now back
+;; but disavows all responsibility for the mode.  In fact, we suspect he
+;; doesn't even use Emacs any more.  In 2003, python-mode.el was moved to its
+;; own SourceForge project apart from the Python project, and now is
+;; maintained by the volunteers at the python-mode at python.org mailing list.
 
-;; pdbtrack support contributed by Ken Manheimer, April 2001.
+;; pdbtrack support contributed by Ken Manheimer, April 2001.  Skip Montanaro
+;; has also contributed significantly to python-mode's development.
 
 ;; Please use the SourceForge Python project to submit bugs or
 ;; patches:
 ;;
 ;;     http://sourceforge.net/projects/python
 
+;; INSTALLATION:
+
+;; To install, just drop this file into a directory on your load-path and
+;; byte-compile it.  To set up Emacs to automatically edit files ending in
+;; ".py" using python-mode add the following to your ~/.emacs file (GNU
+;; Emacs) or ~/.xemacs/init.el file (XEmacs):
+;;    (setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
+;;    (setq interpreter-mode-alist (cons '("python" . python-mode)
+;;                                       interpreter-mode-alist))
+;;    (autoload 'python-mode "python-mode" "Python editing mode." t)
+;;
+;; In XEmacs syntax highlighting should be enabled automatically.  In GNU
+;; Emacs you may have to add these lines to your ~/.emacs file:
+;;    (global-font-lock-mode t)
+;;    (setq font-lock-maximum-decoration t)
+
 ;; FOR MORE INFORMATION:
 
 ;; There is some information on python-mode.el at
@@ -60,6 +80,7 @@
 (require 'custom)
 (require 'cl)
 (require 'compile)
+(require 'ansi-color)
 
 
 ;; user definable variables
@@ -70,34 +91,41 @@
   :group 'languages
   :prefix "py-")
 
+(defcustom py-tab-always-indent t
+  "*Non-nil means TAB in Python mode should always reindent the current line,
+regardless of where in the line point is when the TAB command is used."
+  :type 'boolean
+  :group 'python)
+
 (defcustom py-python-command "python"
   "*Shell command used to start Python interpreter."
   :type 'string
   :group 'python)
 
-(defcustom py-jpython-command "jpython"
-  "*Shell command used to start the JPython interpreter."
+(make-obsolete-variable 'py-jpython-command 'py-jython-command)
+(defcustom py-jython-command "jython"
+  "*Shell command used to start the Jython interpreter."
   :type 'string
   :group 'python
-  :tag "JPython Command")
+  :tag "Jython Command")
 
 (defcustom py-default-interpreter 'cpython
   "*Which Python interpreter is used by default.
-The value for this variable can be either `cpython' or `jpython'.
+The value for this variable can be either `cpython' or `jython'.
 
 When the value is `cpython', the variables `py-python-command' and
 `py-python-command-args' are consulted to determine the interpreter
 and arguments to use.
 
-When the value is `jpython', the variables `py-jpython-command' and
-`py-jpython-command-args' are consulted to determine the interpreter
+When the value is `jython', the variables `py-jython-command' and
+`py-jython-command-args' are consulted to determine the interpreter
 and arguments to use.
 
 Note that this variable is consulted only the first time that a Python
 mode buffer is visited during an Emacs session.  After that, use
 \\[py-toggle-shells] to change the interpreter shell."
   :type '(choice (const :tag "Python (a.k.a. CPython)" cpython)
-		 (const :tag "JPython" jpython))
+		 (const :tag "Jython" jython))
   :group 'python)
 
 (defcustom py-python-command-args '("-i")
@@ -105,11 +133,12 @@
   :type '(repeat string)
   :group 'python)
 
-(defcustom py-jpython-command-args '("-i")
-  "*List of string arguments to be used when starting a JPython shell."
+(make-obsolete-variable 'py-jpython-command-args 'py-jython-command-args)
+(defcustom py-jython-command-args '("-i")
+  "*List of string arguments to be used when starting a Jython shell."
   :type '(repeat string)
   :group 'python
-  :tag "JPython Command Args")
+  :tag "Jython Command Args")
 
 (defcustom py-indent-offset 4
   "*Amount of offset per level of indentation.
@@ -248,7 +277,7 @@
   :type 'function
   :group 'python)
 
-(defcustom py-imenu-show-method-args-p nil 
+(defcustom py-imenu-show-method-args-p nil
   "*Controls echoing of arguments of functions & methods in the Imenu buffer.
 When non-nil, arguments are printed."
   :type 'boolean
@@ -275,19 +304,20 @@
   20000
   "Maximum number of characters to search for a Java-ish import statement.
 When `python-mode' tries to calculate the shell to use (either a
-CPython or a JPython shell), it looks at the so-called `shebang' line
+CPython or a Jython shell), it looks at the so-called `shebang' line
 -- i.e. #! line.  If that's not available, it looks at some of the
 file heading imports to see if they look Java-like."
   :type 'integer
   :group 'python
   )
 
-(defcustom py-jpython-packages
+(make-obsolete-variable 'py-jpython-packages 'py-jython-packages)
+(defcustom py-jython-packages
   '("java" "javax" "org" "com")
-  "Imported packages that imply `jpython-mode'."
+  "Imported packages that imply `jython-mode'."
   :type '(repeat string)
   :group 'python)
-  
+
 ;; Not customizable
 (defvar py-master-file nil
   "If non-nil, execute the named file instead of the buffer's file.
@@ -317,16 +347,39 @@
   :tag "Pychecker Command Args")
 
 (defvar py-shell-alist
-  '(("jpython" . 'jpython)
-    ("jython" . 'jpython)
+  '(("jython" . 'jython)
     ("python" . 'cpython))
   "*Alist of interpreters and python shells. Used by `py-choose-shell'
 to select the appropriate python interpreter mode for a file.")
 
+(defcustom py-shell-input-prompt-1-regexp "^>>> "
+  "*A regular expression to match the input prompt of the shell."
+  :type 'string
+  :group 'python)
+
+(defcustom py-shell-input-prompt-2-regexp "^[.][.][.] "
+  "*A regular expression to match the input prompt of the shell after the
+  first line of input."
+  :type 'string
+  :group 'python)
+
+(defcustom py-shell-switch-buffers-on-execute t
+  "*Controls switching to the Python buffer where commands are
+  executed.  When non-nil the buffer switches to the Python buffer, if
+  not no switching occurs."
+  :type 'boolean
+  :group 'python)
+
 
 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT
 
+(defvar py-line-number-offset 0
+  "When an exception occurs as a result of py-execute-region, a
+subsequent py-up-exception needs the line number where the region
+started, in order to jump to the correct file line.  This variable is
+set in py-execute-region and used in py-jump-to-exception.")
+
 (defconst py-emacs-features
   (let (features)
    features)
@@ -339,9 +392,31 @@
   "Face for pseudo keywords in Python mode, like self, True, False, Ellipsis.")
 (make-face 'py-pseudo-keyword-face)
 
+;; PEP 318 decorators
+(defvar py-decorators-face 'py-decorators-face
+  "Face method decorators.")
+(make-face 'py-decorators-face)
+
+;; Face for builtins
+(defvar py-builtins-face 'py-builtins-face
+  "Face for builtins like TypeError, object, open, and exec.")
+(make-face 'py-builtins-face)
+
+;; XXX, TODO, and FIXME comments and such
+(defvar py-XXX-tag-face 'py-XXX-tag-face
+  "Face for XXX, TODO, and FIXME tags")
+(make-face 'py-XXX-tag-face)
+
 (defun py-font-lock-mode-hook ()
   (or (face-differs-from-default-p 'py-pseudo-keyword-face)
-      (copy-face 'font-lock-keyword-face 'py-pseudo-keyword-face)))
+      (copy-face 'font-lock-keyword-face 'py-pseudo-keyword-face))
+  (or (face-differs-from-default-p 'py-builtins-face)
+      (copy-face 'font-lock-keyword-face 'py-builtins-face))
+  (or (face-differs-from-default-p 'py-decorators-face)
+      (copy-face 'py-pseudo-keyword-face 'py-decorators-face))
+  (or (face-differs-from-default-p 'py-XXX-tag-face)
+      (copy-face 'font-lock-comment-face 'py-XXX-tag-face))
+  )
 (add-hook 'font-lock-mode-hook 'py-font-lock-mode-hook)
 
 (defvar python-font-lock-keywords
@@ -352,30 +427,17 @@
 			  "from"     "global"   "if"      "import"
 			  "in"       "is"       "lambda"  "not"
 			  "or"       "pass"     "print"   "raise"
-			  "return"   "while"    "yield"
+			  "return"   "while"    "with"    "yield"
 			  )
 			"\\|"))
 	(kw2 (mapconcat 'identity
 			'("else:" "except:" "finally:" "try:")
 			"\\|"))
 	(kw3 (mapconcat 'identity
-			'("ArithmeticError" "AssertionError"
-			  "AttributeError" "DeprecationWarning" "EOFError"
-			  "Ellipsis" "EnvironmentError" "Exception" "False"
-			  "FloatingPointError" "FutureWarning" "IOError"
-			  "ImportError" "IndentationError" "IndexError"
-			  "KeyError" "KeyboardInterrupt" "LookupError"
-			  "MemoryError" "NameError" "None" "NotImplemented"
-			  "NotImplementedError" "OSError" "OverflowError"
-			  "OverflowWarning" "PendingDeprecationWarning"
-			  "ReferenceError" "RuntimeError" "RuntimeWarning"
-			  "StandardError" "StopIteration" "SyntaxError"
-			  "SyntaxWarning" "SystemError" "SystemExit"
-			  "TabError" "True" "TypeError" "UnboundLocalError"
-			  "UnicodeDecodeError" "UnicodeEncodeError"
-			  "UnicodeError" "UnicodeTranslateError"
-			  "UserWarning" "ValueError" "Warning"
-			  "ZeroDivisionError" "__debug__"
+			;; Don't include True, False, None, or
+			;; Ellipsis in this list, since they are
+			;; already defined as pseudo keywords.
+			'("__debug__"
 			  "__import__" "__name__" "abs" "apply" "basestring"
 			  "bool" "buffer" "callable" "chr" "classmethod"
 			  "cmp" "coerce" "compile" "complex" "copyright"
@@ -391,26 +453,52 @@
 			  "super" "tuple" "type" "unichr" "unicode" "vars"
 			  "xrange" "zip")
 			"\\|"))
+	(kw4 (mapconcat 'identity
+			;; Exceptions and warnings
+			'("ArithmeticError" "AssertionError"
+			  "AttributeError" "DeprecationWarning" "EOFError"
+			  "EnvironmentError" "Exception"
+			  "FloatingPointError" "FutureWarning" "IOError"
+			  "ImportError" "IndentationError" "IndexError"
+			  "KeyError" "KeyboardInterrupt" "LookupError"
+			  "MemoryError" "NameError" "NotImplemented"
+			  "NotImplementedError" "OSError" "OverflowError"
+			  "OverflowWarning" "PendingDeprecationWarning"
+			  "ReferenceError" "RuntimeError" "RuntimeWarning"
+			  "StandardError" "StopIteration" "SyntaxError"
+			  "SyntaxWarning" "SystemError" "SystemExit"
+			  "TabError" "TypeError" "UnboundLocalError"
+			  "UnicodeDecodeError" "UnicodeEncodeError"
+			  "UnicodeError" "UnicodeTranslateError"
+			  "UserWarning" "ValueError" "Warning"
+			  "ZeroDivisionError")
+			"\\|"))
 	)
     (list
+     '("^[ \t]*\\(@.+\\)" 1 'py-decorators-face)
      ;; keywords
-     (cons (concat "\\b\\(" kw1 "\\)\\b[ \n\t(]") 1)
+     (cons (concat "\\<\\(" kw1 "\\)\\>[ \n\t(]") 1)
      ;; builtins when they don't appear as object attributes
-     (cons (concat "\\(\\b\\|[.]\\)\\(" kw3 "\\)\\b[ \n\t(]") 2)
+     (list (concat "\\([^. \t]\\|^\\)[ \t]*\\<\\(" kw3 "\\)\\>[ \n\t(]") 2
+	   'py-builtins-face)
      ;; block introducing keywords with immediately following colons.
      ;; Yes "except" is in both lists.
-     (cons (concat "\\b\\(" kw2 "\\)[ \n\t(]") 1)
-     ;; `as' but only in "import foo as bar"
-     '("[ \t]*\\(\\bfrom\\b.*\\)?\\bimport\\b.*\\b\\(as\\)\\b" . 2)
+     (cons (concat "\\<\\(" kw2 "\\)[ \n\t(]") 1)
+     ;; Exceptions
+     (list (concat "\\<\\(" kw4 "\\)[ \n\t:,(]") 1 'py-builtins-face)
+     ;; `as' but only in "import foo as bar" or "with foo as bar"
+     '("[ \t]*\\(\\<from\\>.*\\)?\\<import\\>.*\\<\\(as\\)\\>" . 2)
+     '("[ \t]*\\<with\\>.*\\<\\(as\\)\\>" . 1)
      ;; classes
-     '("\\bclass[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
-       1 font-lock-type-face)
+     '("\\<class[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" 1 font-lock-type-face)
      ;; functions
-     '("\\bdef[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
+     '("\\<def[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
        1 font-lock-function-name-face)
      ;; pseudo-keywords
-     '("\\b\\(self\\|None\\|True\\|False\\|Ellipsis\\)\\b"
+     '("\\<\\(self\\|None\\|True\\|False\\|Ellipsis\\)\\>"
        1 py-pseudo-keyword-face)
+     ;; XXX, TODO, and FIXME tags
+     '("XXX\\|TODO\\|FIXME" 0 py-XXX-tag-face t)
      ))
   "Additional expressions to highlight in Python mode.")
 (put 'python-mode 'font-lock-defaults '(python-font-lock-keywords))
@@ -421,13 +509,7 @@
 Currently-active file is at the head of the list.")
 
 (defvar py-pdbtrack-is-tracking-p nil)
-(defvar py-pdbtrack-last-grubbed-buffer nil
-  "Record of the last buffer used when the source path was invalid.
 
-This buffer is consulted before the buffer-list history for satisfying
-`py-pdbtrack-grub-for-buffer', since it's the most often the likely
-prospect as debugging continues.")
-(make-variable-buffer-local 'py-pdbtrack-last-grubbed-buffer)
 (defvar py-pychecker-history nil)
 
 
@@ -461,7 +543,7 @@
    "\\(" "[^#'\"\n\\]" "\\|" py-stringlit-re "\\)*"
    "\\\\$")
   "Regular expression matching Python backslash continuation lines.")
-  
+
 (defconst py-blank-or-comment-re "[ \t]*\\($\\|#\\)"
   "Regular expression matching a blank or comment line.")
 
@@ -474,7 +556,7 @@
 			   "\\|")
 	  "\\)")
   "Regular expression matching statements to be dedented one level.")
-  
+
 (defconst py-block-closing-keywords-re
   "\\(return\\|raise\\|break\\|continue\\|pass\\)"
   "Regular expression matching keywords which typically close a block.")
@@ -495,30 +577,17 @@
 	  "\\)")
   "Regular expression matching lines not to dedent after.")
 
-(defconst py-defun-start-re
-  "^\\([ \t]*\\)def[ \t]+\\([a-zA-Z_0-9]+\\)\\|\\(^[a-zA-Z_0-9]+\\)[ \t]*="
-  ;; If you change this, you probably have to change py-current-defun
-  ;; as well.  This is only used by py-current-defun to find the name
-  ;; for add-log.el.
-  "Regular expression matching a function, method, or variable assignment.")
-
-(defconst py-class-start-re "^class[ \t]*\\([a-zA-Z_0-9]+\\)"
-  ;; If you change this, you probably have to change py-current-defun
-  ;; as well.  This is only used by py-current-defun to find the name
-  ;; for add-log.el.
-  "Regular expression for finding a class name.")
-
-(defconst py-traceback-line-re
+(defvar py-traceback-line-re
   "[ \t]+File \"\\([^\"]+\\)\", line \\([0-9]+\\)"
   "Regular expression that describes tracebacks.")
 
-;; pdbtrack contants
+;; pdbtrack constants
 (defconst py-pdbtrack-stack-entry-regexp
 ;  "^> \\([^(]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_]+\\)()"
   "^> \\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_]+\\)()"
   "Regular expression pdbtrack uses to find a stack trace entry.")
 
-(defconst py-pdbtrack-input-prompt "\n[(<]*pdb[>)]+ "
+(defconst py-pdbtrack-input-prompt "\n[(<]*[Pp]db[>)]+ "
   "Regular expression pdbtrack uses to recognize a pdb prompt.")
 
 (defconst py-pdbtrack-track-range 10000
@@ -536,8 +605,9 @@
 (defvar python-mode-hook nil
   "*Hook called by `python-mode'.")
 
-(defvar jpython-mode-hook nil
-  "*Hook called by `jpython-mode'. `jpython-mode' also calls
+(make-obsolete-variable 'jpython-mode-hook 'jython-mode-hook)
+(defvar jython-mode-hook nil
+  "*Hook called by `jython-mode'. `jython-mode' also calls
 `python-mode-hook'.")
 
 (defvar py-shell-hook nil
@@ -560,8 +630,6 @@
   (define-key py-mode-map "\C-c\C-r"  'py-shift-region-right)
   (define-key py-mode-map "\C-c<"     'py-shift-region-left)
   (define-key py-mode-map "\C-c>"     'py-shift-region-right)
-  ;; paragraph and string filling
-  (define-key py-mode-map "\eq"       'py-fill-paragraph)
   ;; subprocess commands
   (define-key py-mode-map "\C-c\C-c"  'py-execute-buffer)
   (define-key py-mode-map "\C-c\C-m"  'py-execute-import-or-reload)
@@ -624,7 +692,7 @@
   ;; expect RET to do a `py-newline-and-indent' and any Emacsers who
   ;; dislike this are probably knowledgeable enough to do a rebind.
   ;; However, we do *not* change C-j since many Emacsers have already
-  ;; swapped RET and C-j and they don't want C-j bound to `newline' to 
+  ;; swapped RET and C-j and they don't want C-j bound to `newline' to
   ;; change.
   (define-key py-mode-map "\C-m" 'py-newline-and-indent)
   )
@@ -742,8 +810,8 @@
     (cond
      ((eq position 'bol) (beginning-of-line))
      ((eq position 'eol) (end-of-line))
-     ((eq position 'bod) (py-beginning-of-def-or-class))
-     ((eq position 'eod) (py-end-of-def-or-class))
+     ((eq position 'bod) (py-beginning-of-def-or-class 'either))
+     ((eq position 'eod) (py-end-of-def-or-class 'either))
      ;; Kind of funny, I know, but useful for py-up-exception.
      ((eq position 'bob) (beginning-of-buffer))
      ((eq position 'eob) (end-of-buffer))
@@ -851,7 +919,7 @@
 
 (defvar py-imenu-method-regexp
   (concat                               ; <<methods and functions>>
-   "\\("                                ; 
+   "\\("                                ;
    "^[ \t]*"                            ; new line and maybe whitespace
    "\\(def[ \t]+"                       ; function definitions start with def
    "\\([a-zA-Z0-9_]+\\)"                ;   name is here
@@ -887,7 +955,7 @@
 ;; it.
 (defvar py-imenu-generic-expression
   (cons
-   (concat 
+   (concat
     py-imenu-class-regexp
     "\\|"				; or...
     py-imenu-method-regexp
@@ -956,7 +1024,7 @@
 	looking-p
 	def-name prev-name
 	cur-indent def-pos
-	(class-paren (first  py-imenu-generic-parens)) 
+	(class-paren (first  py-imenu-generic-parens))
 	(def-paren   (second py-imenu-generic-parens)))
     (setq looking-p
 	  (re-search-forward py-imenu-generic-regexp (point-max) t))
@@ -1011,7 +1079,7 @@
 			  (cons save-elmt sub-method-alist))
 		    index-alist))))
        ;; found less indented expression, we're done.
-       (t 
+       (t
 	(setq looking-p nil)
 	(re-search-backward py-imenu-generic-regexp (point-min) t)))
       ;; end-cond
@@ -1025,7 +1093,7 @@
 
 
 (defun py-choose-shell-by-shebang ()
-  "Choose CPython or JPython mode by looking at #! on the first line.
+  "Choose CPython or Jython mode by looking at #! on the first line.
 Returns the appropriate mode function.
 Used by `py-choose-shell', and similar to but distinct from
 `set-auto-mode', though it uses `auto-mode-interpreter-regexp' (if available)."
@@ -1049,10 +1117,10 @@
 
 
 (defun py-choose-shell-by-import ()
-  "Choose CPython or JPython mode based imports.
-If a file imports any packages in `py-jpython-packages', within
+  "Choose CPython or Jython mode based imports.
+If a file imports any packages in `py-jython-packages', within
 `py-import-check-point-max' characters from the start of the file,
-return `jpython', otherwise return nil."
+return `jython', otherwise return nil."
   (let (mode)
     (save-excursion
       (goto-char (point-min))
@@ -1060,14 +1128,14 @@
 		  (search-forward-regexp
 		   "^\\(\\(from\\)\\|\\(import\\)\\) \\([^ \t\n.]+\\)"
 		   py-import-check-point-max t))
-	(setq mode (and (member (match-string 4) py-jpython-packages)
-			'jpython
+	(setq mode (and (member (match-string 4) py-jython-packages)
+			'jython
 			))))
     mode))
 
 
 (defun py-choose-shell ()
-  "Choose CPython or JPython mode. Returns the appropriate mode function.
+  "Choose CPython or Jython mode. Returns the appropriate mode function.
 This does the following:
  - look for an interpreter with `py-choose-shell-by-shebang'
  - examine imports using `py-choose-shell-by-import'
@@ -1116,6 +1184,7 @@
   (make-local-variable 'indent-region-function)
   (make-local-variable 'indent-line-function)
   (make-local-variable 'add-log-current-defun-function)
+  (make-local-variable 'fill-paragraph-function)
   ;;
   (set-syntax-table py-mode-syntax-table)
   (setq major-mode              'python-mode
@@ -1134,6 +1203,8 @@
 	indent-line-function    'py-indent-line
 	;; tell add-log.el how to find the current function/method/variable
 	add-log-current-defun-function 'py-current-defun
+
+	fill-paragraph-function 'py-fill-paragraph
 	)
   (use-local-map py-mode-map)
   ;; add the menu
@@ -1173,17 +1244,18 @@
     (py-toggle-shells (py-choose-shell))))
 
 
-(defun jpython-mode ()
-  "Major mode for editing JPython/Jython files.
+(make-obsolete 'jpython-mode 'jython-mode)
+(defun jython-mode ()
+  "Major mode for editing Jython/Jython files.
 This is a simple wrapper around `python-mode'.
-It runs `jpython-mode-hook' then calls `python-mode.'
+It runs `jython-mode-hook' then calls `python-mode.'
 It is added to `interpreter-mode-alist' and `py-choose-shell'.
 "
   (interactive)
   (python-mode)
-  (py-toggle-shells 'jpython)
-  (when jpython-mode-hook
-      (run-hooks 'jpython-mode-hook)))
+  (py-toggle-shells 'jython)
+  (when jython-mode-hook
+      (run-hooks 'jython-mode-hook)))
 
 
 ;; It's handy to add recognition of Python files to the
@@ -1191,16 +1263,16 @@
 ;; can specify different `derived-modes' based on the #! line, but
 ;; with the latter, we can't.  So we just won't add them if they're
 ;; already added.
-(let ((modes '(("jpython" . jpython-mode)
-	       ("jython" . jpython-mode)
+;;;###autoload
+(let ((modes '(("jython" . jython-mode)
 	       ("python" . python-mode))))
   (while modes
     (when (not (assoc (car modes) interpreter-mode-alist))
       (push (car modes) interpreter-mode-alist))
     (setq modes (cdr modes))))
-
+;;;###autoload
 (when (not (or (rassq 'python-mode auto-mode-alist)
-	       (rassq 'jpython-mode auto-mode-alist)))
+	       (rassq 'jython-mode auto-mode-alist)))
   (push '("\\.py$" . python-mode) auto-mode-alist))
 
 
@@ -1272,7 +1344,8 @@
 	(procbuf (process-buffer proc))
 ;	(comint-scroll-to-bottom-on-output t)
 	(msg (format "## working on region in file %s...\n" filename))
-	(cmd (format "execfile(r'%s')\n" filename)))
+        ;; add some comment, so that we can filter it out of history
+	(cmd (format "execfile(r'%s') # PYTHON-MODE\n" filename)))
     (unwind-protect
 	(save-excursion
 	  (set-buffer procbuf)
@@ -1285,12 +1358,13 @@
 (defun py-comint-output-filter-function (string)
   "Watch output for Python prompt and exec next file waiting in queue.
 This function is appropriate for `comint-output-filter-functions'."
-  ;; TBD: this should probably use split-string
-  (when (and (or (string-equal string ">>> ")
-		 (and (>= (length string) 5)
-		      (string-equal (substring string -5) "\n>>> ")))
-	     py-file-queue)
-    (pop-to-buffer (current-buffer))
+  ;;remove ansi terminal escape sequences from string, not sure why they are
+  ;;still around...
+  (setq string (ansi-color-filter-apply string))
+  (when (and (string-match py-shell-input-prompt-1-regexp string)
+                   py-file-queue)
+    (if py-shell-switch-buffers-on-execute
+      (pop-to-buffer (current-buffer)))
     (py-safe (delete-file (car py-file-queue)))
     (setq py-file-queue (cdr py-file-queue))
     (if py-file-queue
@@ -1346,7 +1420,7 @@
                                            (- procmark
                                               py-pdbtrack-track-range))
                                       procmark))
-             target target_fname target_lineno)
+             target target_fname target_lineno target_buffer)
 
         (if (not (string-match (concat py-pdbtrack-input-prompt "$") block))
             (py-pdbtrack-overlay-arrow nil)
@@ -1374,8 +1448,7 @@
 We look first to visit the file indicated in the trace.
 
 Failing that, we look for the most recently visited python-mode buffer
-with the same name or having 
-having the named function.
+with the same name or having the named function.
 
 If we're unable find the source code we return a string describing the
 problem as best as we can determine."
@@ -1419,11 +1492,10 @@
 (defun py-pdbtrack-grub-for-buffer (funcname lineno)
   "Find most recent buffer itself named or having function funcname.
 
-We first check the last buffer this function found, if any, then walk
-throught the buffer-list history for python-mode buffers that are
+We walk the buffer-list history for python-mode buffers that are
 named for funcname or define a function funcname."
   (let ((buffers (buffer-list))
-        curbuf
+        buf
         got)
     (while (and buffers (not got))
       (setq buf (car buffers)
@@ -1438,7 +1510,7 @@
                                    (buffer-substring (point-min)
                                                      (point-max))))))
           (setq got buf)))
-    (setq py-pdbtrack-last-grubbed-buffer got)))
+    got))
 
 (defun py-postprocess-output-buffer (buf)
   "Highlight exceptions found in BUF.
@@ -1468,7 +1540,7 @@
 (defconst py-output-buffer "*Python Output*")
 (make-variable-buffer-local 'py-output-buffer)
 
-;; for toggling between CPython and JPython
+;; for toggling between CPython and Jython
 (defvar py-which-shell nil)
 (defvar py-which-args  py-python-command-args)
 (defvar py-which-bufname "Python")
@@ -1477,14 +1549,14 @@
 (make-variable-buffer-local 'py-which-bufname)
 
 (defun py-toggle-shells (arg)
-  "Toggles between the CPython and JPython shells.
+  "Toggles between the CPython and Jython shells.
 
 With positive argument ARG (interactively \\[universal-argument]),
-uses the CPython shell, with negative ARG uses the JPython shell, and
+uses the CPython shell, with negative ARG uses the Jython shell, and
 with a zero argument, toggles the shell.
 
 Programmatically, ARG can also be one of the symbols `cpython' or
-`jpython', equivalent to positive arg and negative arg respectively."
+`jython', equivalent to positive arg and negative arg respectively."
   (interactive "P")
   ;; default is to toggle
   (if (null arg)
@@ -1497,7 +1569,7 @@
 	(setq arg -1)
       (setq arg 1)))
    ((equal arg 'cpython) (setq arg 1))
-   ((equal arg 'jpython) (setq arg -1)))
+   ((equal arg 'jython) (setq arg -1)))
   (let (msg)
     (cond
      ((< 0 arg)
@@ -1505,14 +1577,16 @@
       (setq py-which-shell py-python-command
 	    py-which-args py-python-command-args
 	    py-which-bufname "Python"
-	    msg "CPython"
-	    mode-name "Python"))
+	    msg "CPython")
+      (if (string-equal py-which-bufname "Jython")
+	  (setq mode-name "Python")))
      ((> 0 arg)
-      (setq py-which-shell py-jpython-command
-	    py-which-args py-jpython-command-args
-	    py-which-bufname "JPython"
-	    msg "JPython"
-	    mode-name "JPython"))
+      (setq py-which-shell py-jython-command
+	    py-which-args py-jython-command-args
+	    py-which-bufname "Jython"
+	    msg "Jython")
+      (if (string-equal py-which-bufname "Python")
+	  (setq mode-name "Jython")))
      )
     (message "Using the %s shell" msg)
     (setq py-output-buffer (format "*%s Output*" py-which-bufname))))
@@ -1534,9 +1608,9 @@
 programmatically, or when running in Emacs 19.34 or older.
 
 Note: You can toggle between using the CPython interpreter and the
-JPython interpreter by hitting \\[py-toggle-shells].  This toggles
+Jython interpreter by hitting \\[py-toggle-shells].  This toggles
 buffer local variables which control whether all your subshell
-interactions happen to the `*JPython*' or `*Python*' buffers (the
+interactions happen to the `*Jython*' or `*Python*' buffers (the
 latter is the name used for the CPython buffer).
 
 Warning: Don't use an interactive Python if you change sys.ps1 or
@@ -1570,10 +1644,14 @@
 			       (concat
 				(mapconcat 'identity py-which-args " ") " ")
 			       ))))
-    (switch-to-buffer-other-window
-     (apply 'make-comint py-which-bufname py-which-shell nil args))
+    (if (not (equal (buffer-name) "*Python*"))
+        (switch-to-buffer-other-window
+         (apply 'make-comint py-which-bufname py-which-shell nil args))
+      (apply 'make-comint py-which-bufname py-which-shell nil args))
     (make-local-variable 'comint-prompt-regexp)
-    (setq comint-prompt-regexp "^>>> \\|^[.][.][.] \\|^(pdb) ")
+    (setq comint-prompt-regexp (concat py-shell-input-prompt-1-regexp "\\|"
+                                       py-shell-input-prompt-2-regexp "\\|"
+                                       "^([Pp]db) "))
     (add-hook 'comint-output-filter-functions
 	      'py-comint-output-filter-function)
     ;; pdbtrack
@@ -1644,11 +1722,13 @@
       (setq start (point))
       (or (< start end)
 	  (error "Region is empty"))
+      (setq py-line-number-offset (count-lines 1 start))
       (let ((needs-if (/= (py-point 'bol) (py-point 'boi))))
 	(set-buffer buf)
 	(python-mode)
 	(when needs-if
-	  (insert "if 1:\n"))
+	  (insert "if 1:\n")
+	  (setq py-line-number-offset (- py-line-number-offset 1)))
 	(insert-buffer-substring cur start end)
 	;; Set the shell either to the #! line command, or to the
 	;; py-which-shell buffer local variable.
@@ -1685,8 +1765,9 @@
       (setq py-exception-buffer (cons file (current-buffer))))
      (t
       ;; TBD: a horrible hack, but why create new Custom variables?
-      (let ((cmd (concat shell (if (string-equal py-which-bufname "JPython")
-				   " -" ""))))
+      (let ((cmd (concat py-which-shell (if (string-equal py-which-bufname
+							  "Jython")
+					    " -" ""))))
 	;; otherwise either run it synchronously in a subprocess
 	(save-excursion
 	  (set-buffer buf)
@@ -1720,12 +1801,14 @@
 See the `\\[py-execute-region]' docs for an account of some
 subtleties, including the use of the optional ASYNC argument."
   (interactive "P")
-  (if py-master-file
-      (let* ((filename (expand-file-name py-master-file))
-	     (buffer (or (get-file-buffer filename)
-			 (find-file-noselect filename))))
-	(set-buffer buffer)))
-  (py-execute-region (point-min) (point-max) async))
+  (let ((old-buffer (current-buffer)))
+    (if py-master-file
+        (let* ((filename (expand-file-name py-master-file))
+               (buffer (or (get-file-buffer filename)
+                           (find-file-noselect filename))))
+          (set-buffer buffer)))
+    (py-execute-region (point-min) (point-max) async)
+       (pop-to-buffer old-buffer)))
 
 (defun py-execute-import-or-reload (&optional async)
   "Import the current buffer's file in a Python interpreter.
@@ -1821,6 +1904,9 @@
 		      (t (find-file (read-file-name "Exception file: "
 						    nil
 						    file t))))))
+    ;; Fiddle about with line number
+    (setq line (+ py-line-number-offset line))
+
     (pop-to-buffer buffer)
     ;; Force Python mode
     (if (not (eq major-mode 'python-mode))
@@ -2001,16 +2087,29 @@
   (interactive "P")
   (let* ((ci (current-indentation))
 	 (move-to-indentation-p (<= (current-column) ci))
-	 (need (py-compute-indentation (not arg))))
-    ;; see if we need to dedent
-    (if (py-outdent-p)
-	(setq need (- need py-indent-offset)))
-    (if (/= ci need)
-	(save-excursion
-	  (beginning-of-line)
-	  (delete-horizontal-space)
-	  (indent-to need)))
-    (if move-to-indentation-p (back-to-indentation))))
+	 (need (py-compute-indentation (not arg)))
+         (cc (current-column)))
+    ;; dedent out a level if previous command was the same unless we're in
+    ;; column 1
+    (if (and (equal last-command this-command)
+             (/= cc 0))
+        (progn
+          (beginning-of-line)
+          (delete-horizontal-space)
+          (indent-to (* (/ (- cc 1) py-indent-offset) py-indent-offset)))
+      (progn
+	;; see if we need to dedent
+	(if (py-outdent-p)
+	    (setq need (- need py-indent-offset)))
+	(if (or py-tab-always-indent
+		move-to-indentation-p)
+	    (progn (if (/= ci need)
+		       (save-excursion
+		       (beginning-of-line)
+		       (delete-horizontal-space)
+		       (indent-to need)))
+		   (if move-to-indentation-p (back-to-indentation)))
+	    (insert-tab))))))
 
 (defun py-newline-and-indent ()
   "Strives to act like the Emacs `newline-and-indent'.
@@ -2054,39 +2153,23 @@
        ((py-continuation-line-p)
 	(let ((startpos (point))
 	      (open-bracket-pos (py-nesting-level))
-	      endpos searching found state)
+	      endpos searching found state cind cline)
 	  (if open-bracket-pos
 	      (progn
-		;; align with first item in list; else a normal
-		;; indent beyond the line with the open bracket
-		(goto-char (1+ open-bracket-pos)) ; just beyond bracket
-		;; is the first list item on the same line?
-		(skip-chars-forward " \t")
-		(if (null (memq (following-char) '(?\n ?# ?\\)))
-					; yes, so line up with it
-		    (current-column)
-		  ;; first list item on another line, or doesn't exist yet
-		  (forward-line 1)
-		  (while (and (< (point) startpos)
-			      (looking-at "[ \t]*[#\n\\\\]")) ; skip noise
-		    (forward-line 1))
-		  (if (and (< (point) startpos)
-			   (/= startpos
-			       (save-excursion
-				 (goto-char (1+ open-bracket-pos))
-				 (forward-comment (point-max))
-				 (point))))
-		      ;; again mimic the first list item
-		      (current-indentation)
-		    ;; else they're about to enter the first item
-		    (goto-char open-bracket-pos)
-		    (setq placeholder (point))
-		    (py-goto-initial-line)
-		    (py-goto-beginning-of-tqs
-		     (save-excursion (nth 3 (parse-partial-sexp
-					     placeholder (point)))))
-		    (+ (current-indentation) py-indent-offset))))
-
+		(setq endpos (py-point 'bol))
+		(py-goto-initial-line)
+		(setq cind (current-indentation))
+		(setq cline cind)
+		(dolist (bp 
+			 (nth 9 (save-excursion
+				  (parse-partial-sexp (point) endpos)))
+			 cind)
+		  (if (search-forward "\n" bp t) (setq cline cind))
+		  (goto-char (1+ bp))
+		  (skip-chars-forward " \t")
+		  (setq cind (if (memq (following-char) '(?\n ?# ?\\))
+				 (+ cline py-indent-offset)
+			       (current-column)))))
 	    ;; else on backslash continuation line
 	    (forward-line -1)
 	    (if (py-continuation-line-p) ; on at least 3rd line in block
@@ -2834,7 +2917,7 @@
 ;; ripped from cc-mode
 (defun py-forward-into-nomenclature (&optional arg)
   "Move forward to end of a nomenclature section or word.
-With \\[universal-argument] (programmatically, optional argument ARG), 
+With \\[universal-argument] (programmatically, optional argument ARG),
 do it that many times.
 
 A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores."
@@ -2888,6 +2971,11 @@
 
 
 ;; Pychecker
+
+;; hack for FSF Emacs
+(unless (fboundp 'read-shell-command)
+  (defalias 'read-shell-command 'read-string))
+
 (defun py-pychecker-run (command)
   "*Run pychecker (default on the file currently visited)."
   (interactive
@@ -3412,7 +3500,7 @@
 
 (defun py-statement-opens-block-p ()
   "Return t iff the current statement opens a block.
-I.e., iff it ends with a colon that is not in a comment.  Point should 
+I.e., iff it ends with a colon that is not in a comment.  Point should
 be at the start of a statement."
   (save-excursion
     (let ((start (point))
@@ -3496,8 +3584,8 @@
 KEY is a regular expression describing a Python keyword.  Skip blank
 lines and non-indenting comments.  If the statement found starts with
 KEY, then stop, otherwise go back to first enclosing block starting
-with KEY.  If successful, leave point at the start of the KEY line and 
-return t.  Otherwise, leav point at an undefined place and return nil."
+with KEY.  If successful, leave point at the start of the KEY line and
+return t.  Otherwise, leave point at an undefined place and return nil."
   ;; skip blanks and non-indenting #
   (py-goto-initial-line)
   (while (and
@@ -3505,7 +3593,7 @@
 	  (zerop (forward-line -1)))	; go back
     nil)
   (py-goto-initial-line)
-  (let* ((re (concat "[ \t]*" key "\\b"))
+  (let* ((re (concat "[ \t]*" key "\\>"))
 	 (case-fold-search nil)		; let* so looking-at sees this
 	 (found (looking-at re))
 	 (dead nil))
@@ -3531,7 +3619,7 @@
 `Keyword' is defined (essentially) as the regular expression
 ([a-z]+).  Returns nil if none was found."
   (let ((case-fold-search nil))
-    (if (looking-at "[ \t]*\\([a-z]+\\)\\b")
+    (if (looking-at "[ \t]*\\([a-z]+\\)\\>")
 	(intern (buffer-substring (match-beginning 1) (match-end 1)))
       nil)))
 
@@ -3539,14 +3627,49 @@
   "Python value for `add-log-current-defun-function'.
 This tells add-log.el how to find the current function/method/variable."
   (save-excursion
-    (if (re-search-backward py-defun-start-re nil t)
-	(or (match-string 3)
-	    (let ((method (match-string 2)))
-	      (if (and (not (zerop (length (match-string 1))))
-		       (re-search-backward py-class-start-re nil t))
-		  (concat (match-string 1) "." method)
-		method)))
-      nil)))
+
+    ;; Move back to start of the current statement.
+
+    (py-goto-initial-line)
+    (back-to-indentation)
+    (while (and (or (looking-at py-blank-or-comment-re)
+		    (py-in-literal))
+		(not (bobp)))
+      (backward-to-indentation 1))
+    (py-goto-initial-line)
+
+    (let ((scopes "")
+	  (sep "")
+	  dead assignment)
+
+      ;; Check for an assignment.  If this assignment exists inside a
+      ;; def, it will be overwritten inside the while loop.  If it
+      ;; exists at top lever or inside a class, it will be preserved.
+
+      (when (looking-at "[ \t]*\\([a-zA-Z0-9_]+\\)[ \t]*=")
+	(setq scopes (buffer-substring (match-beginning 1) (match-end 1)))
+	(setq assignment t)
+	(setq sep "."))
+
+      ;; Prepend the name of each outer socpe (def or class).
+
+      (while (not dead)
+	(if (and (py-go-up-tree-to-keyword "\\(class\\|def\\)")
+		 (looking-at
+		  "[ \t]*\\(class\\|def\\)[ \t]*\\([a-zA-Z0-9_]+\\)[ \t]*"))
+	    (let ((name (buffer-substring (match-beginning 2) (match-end 2))))
+	      (if (and assignment (looking-at "[ \t]*def"))
+		  (setq scopes name)
+		(setq scopes (concat name sep scopes))
+		(setq sep "."))))
+	(setq assignment nil)
+	(condition-case nil		; Terminate nicely at top level.
+	    (py-goto-block-up 'no-mark)
+	  (error (setq dead t))))
+      (if (string= scopes "")
+	  nil
+	scopes))))
+
 
 
 (defconst py-help-address "python-mode at python.org"
@@ -3588,7 +3711,7 @@
      "Dear Barry,")			;salutation
     (if enhancement-p nil
       (set-mark (point))
-      (insert 
+      (insert
 "Please replace this text with a sufficiently large code sample\n\
 and an exact recipe so that I can reproduce your problem.  Failure\n\
 to do so may mean a greater delay in fixing your bug.\n\n")
@@ -3608,7 +3731,7 @@
 (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file)
 
 ;; Add a designator to the minor mode strings
-(or (assq 'py-pdbtrack-minor-mode-string minor-mode-alist)
+(or (assq 'py-pdbtrack-is-tracking-p minor-mode-alist)
     (push '(py-pdbtrack-is-tracking-p py-pdbtrack-minor-mode-string)
 	  minor-mode-alist))
 
@@ -3747,20 +3870,35 @@
 If point is inside a string, narrow to that string and fill.
 "
   (interactive "P")
-  (let* ((bod (py-point 'bod))
-	 (pps (parse-partial-sexp bod (point))))
-    (cond
-     ;; are we inside a comment or on a line with only whitespace before
-     ;; the comment start?
-     ((or (nth 4 pps)
-	  (save-excursion (beginning-of-line) (looking-at "[ \t]*#")))
-      (py-fill-comment justify))
-     ;; are we inside a string?
-     ((nth 3 pps)
-      (py-fill-string (nth 8 pps)))
-     ;; otherwise use the default
-     (t
-      (fill-paragraph justify)))))
+  ;; fill-paragraph will narrow incorrectly
+  (save-restriction
+    (widen)
+    (let* ((bod (py-point 'bod))
+	   (pps (parse-partial-sexp bod (point))))
+      (cond
+       ;; are we inside a comment or on a line with only whitespace before
+       ;; the comment start?
+       ((or (nth 4 pps)
+	    (save-excursion (beginning-of-line) (looking-at "[ \t]*#")))
+	(py-fill-comment justify))
+       ;; are we inside a string?
+       ((nth 3 pps)
+	(py-fill-string (nth 8 pps)))
+       ;; are we at the opening quote of a string, or in the indentation?
+       ((save-excursion
+	  (forward-word 1)
+	  (eq (py-in-literal) 'string))
+	(save-excursion
+	  (py-fill-string (py-point 'boi))))
+       ;; are we at or after the closing quote of a string?
+       ((save-excursion
+	  (backward-word 1)
+	  (eq (py-in-literal) 'string))
+	(save-excursion
+	  (py-fill-string (py-point 'boi))))
+       ;; otherwise use the default
+       (t
+	(fill-paragraph justify))))))
 
 
 

Modified: python/branches/trunk-math/Modules/_bsddb.c
==============================================================================
--- python/branches/trunk-math/Modules/_bsddb.c	(original)
+++ python/branches/trunk-math/Modules/_bsddb.c	Tue Feb 12 06:36:19 2008
@@ -824,7 +824,6 @@
     }
 
     if (self->dbc != NULL) {
-        MYDB_BEGIN_ALLOW_THREADS;
 	/* If the underlying database has been closed, we don't
 	   need to do anything. If the environment has been closed
 	   we need to leak, as BerkeleyDB will crash trying to access
@@ -833,9 +832,14 @@
 	   a database open. */
 	if (self->mydb->db && self->mydb->myenvobj &&
 	    !self->mydb->myenvobj->closed)
+        /* test for: open db + no environment or non-closed environment */
+	if (self->mydb->db && (!self->mydb->myenvobj || (self->mydb->myenvobj &&
+	    !self->mydb->myenvobj->closed))) {
+            MYDB_BEGIN_ALLOW_THREADS;
             err = self->dbc->c_close(self->dbc);
+            MYDB_END_ALLOW_THREADS;
+        }
         self->dbc = NULL;
-        MYDB_END_ALLOW_THREADS;
     }
     Py_XDECREF( self->mydb );
     PyObject_Del(self);

Modified: python/branches/trunk-math/Modules/_collectionsmodule.c
==============================================================================
--- python/branches/trunk-math/Modules/_collectionsmodule.c	(original)
+++ python/branches/trunk-math/Modules/_collectionsmodule.c	Tue Feb 12 06:36:19 2008
@@ -1186,13 +1186,23 @@
 {
 	/* This calls the object's class.  That only works for subclasses
 	   whose class constructor has the same signature.  Subclasses that
-	   define a different constructor signature must override copy().
+	   define a different constructor signature must override __copy__().
 	*/
 	return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
 					    dd->default_factory, dd, NULL);
 }
 
 static PyObject *
+defdict_copy_method(defdictobject *dd)
+{
+	if (Py_Py3kWarningFlag &&
+	    PyErr_Warn(PyExc_DeprecationWarning, 
+		       "defaultdict.copy() not supported in 3.x") < 0)
+		return NULL;
+	return defdict_copy(dd);
+}
+
+static PyObject *
 defdict_reduce(defdictobject *dd)
 {
 	/* __reduce__ must return a 5-tuple as follows:
@@ -1241,7 +1251,7 @@
 static PyMethodDef defdict_methods[] = {
 	{"__missing__", (PyCFunction)defdict_missing, METH_O,
 	 defdict_missing_doc},
-	{"copy", (PyCFunction)defdict_copy, METH_NOARGS,
+	{"copy", (PyCFunction)defdict_copy_method, METH_NOARGS,
 	 defdict_copy_doc},
 	{"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,
 	 defdict_copy_doc},
@@ -1300,7 +1310,17 @@
 	if (dd->default_factory == NULL)
 		defrepr = PyString_FromString("None");
 	else
-		defrepr = PyObject_Repr(dd->default_factory);
+	{
+		int status = Py_ReprEnter(dd->default_factory);
+		if (status != 0) {
+			if (status < 0)
+				return NULL;
+			defrepr = PyString_FromString("...");
+		}
+		else
+			defrepr = PyObject_Repr(dd->default_factory);
+		Py_ReprLeave(dd->default_factory);
+	}
 	if (defrepr == NULL) {
 		Py_DECREF(baserepr);
 		return NULL;

Modified: python/branches/trunk-math/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/branches/trunk-math/Modules/_ctypes/_ctypes.c	(original)
+++ python/branches/trunk-math/Modules/_ctypes/_ctypes.c	Tue Feb 12 06:36:19 2008
@@ -4956,16 +4956,19 @@
 	PyObject *s;
 	int status;
 
+	if (dict == NULL)
+		return -1;
+
 	while (methods->ml_name) {
 		/* get a wrapper for the built-in function */
 		PyObject *func = PyCFunction_New(methods, NULL);
 		PyObject *meth;
 		if (func == NULL)
-			return -1;
+			goto error;
 		meth = PyMethod_New(func, NULL, ComError);
 		Py_DECREF(func);
 		if (meth == NULL)
-			return -1;
+			goto error;
 		PyDict_SetItemString(dict, methods->ml_name, meth);
 		Py_DECREF(meth);
 		++methods;
@@ -4973,21 +4976,22 @@
 
 	s = PyString_FromString(comerror_doc);
 	if (s == NULL)
-		return -1;
+		goto error;
 	status = PyDict_SetItemString(dict, "__doc__", s);
 	Py_DECREF(s);
-	if (status == -1) {
-		Py_DECREF(dict);
-		return -1;
-	}
+	if (status == -1)
+		goto error;
 
 	ComError = PyErr_NewException("_ctypes.COMError",
 				      NULL,
 				      dict);
 	if (ComError == NULL)
-		return -1;
+		goto error;
 
 	return 0;
+  error:
+	Py_DECREF(dict);
+	return -1;
 }
 
 #endif

Modified: python/branches/trunk-math/Modules/_ctypes/libffi/src/x86/ffi_darwin.c
==============================================================================
--- python/branches/trunk-math/Modules/_ctypes/libffi/src/x86/ffi_darwin.c	(original)
+++ python/branches/trunk-math/Modules/_ctypes/libffi/src/x86/ffi_darwin.c	Tue Feb 12 06:36:19 2008
@@ -146,7 +146,9 @@
     case FFI_TYPE_SINT64:
     case FFI_TYPE_FLOAT:
     case FFI_TYPE_DOUBLE:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
     case FFI_TYPE_LONGDOUBLE:
+#endif
       cif->flags = (unsigned) cif->rtype->type;
       break;
 

Modified: python/branches/trunk-math/Modules/cjkcodecs/_codecs_hk.c
==============================================================================
--- python/branches/trunk-math/Modules/cjkcodecs/_codecs_hk.c	(original)
+++ python/branches/trunk-math/Modules/cjkcodecs/_codecs_hk.c	Tue Feb 12 06:36:19 2008
@@ -26,6 +26,16 @@
 	return 0;
 }
 
+/*
+ * There are four possible pair unicode -> big5hkscs maps as in HKSCS 2004:
+ *  U+00CA U+0304 -> 8862  (U+00CA alone is mapped to 8866)
+ *  U+00CA U+030C -> 8864
+ *  U+00EA U+0304 -> 88a3  (U+00EA alone is mapped to 88a7)
+ *  U+00EA U+030C -> 88a5
+ * These are handled by not mapping tables but a hand-written code.
+ */
+static const DBCHAR big5hkscs_pairenc_table[4] = {0x8862, 0x8864, 0x88a3, 0x88a5};
+
 ENCODER(big5hkscs)
 {
 	while (inleft > 0) {
@@ -46,7 +56,27 @@
 		REQUIRE_OUTBUF(2)
 
 		if (c < 0x10000) {
-			TRYMAP_ENC(big5hkscs_bmp, code, c);
+			TRYMAP_ENC(big5hkscs_bmp, code, c) {
+				if (code == MULTIC) {
+					if (inleft >= 2 &&
+					    ((c & 0xffdf) == 0x00ca) &&
+					    (((*inbuf)[1] & 0xfff7) == 0x0304)) {
+						code = big5hkscs_pairenc_table[
+							((c >> 4) |
+							 ((*inbuf)[1] >> 3)) & 3];
+						insize = 2;
+					}
+					else if (inleft < 2 &&
+						 !(flags & MBENC_FLUSH))
+						return MBERR_TOOFEW;
+					else {
+						if (c == 0xca)
+							code = 0x8866;
+						else /* c == 0xea */
+							code = 0x88a7;
+					}
+				}
+			}
 			else TRYMAP_ENC(big5, code, c);
 			else return 1;
 		}
@@ -67,7 +97,7 @@
 	return 0;
 }
 
-#define BH2S(c1, c2) (((c1) - 0x88) * (0xfe - 0x40 + 1) + ((c2) - 0x40))
+#define BH2S(c1, c2) (((c1) - 0x87) * (0xfe - 0x40 + 1) + ((c2) - 0x40))
 
 DECODER(big5hkscs)
 {
@@ -96,19 +126,19 @@
 			int s = BH2S(c, IN2);
 			const unsigned char *hintbase;
 
-			assert(0x88 <= c && c <= 0xfe);
+			assert(0x87 <= c && c <= 0xfe);
 			assert(0x40 <= IN2 && IN2 <= 0xfe);
 
-			if (BH2S(0x88, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
+			if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
 				hintbase = big5hkscs_phint_0;
-				s -= BH2S(0x88, 0x40);
+				s -= BH2S(0x87, 0x40);
 			}
 			else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){
-				hintbase = big5hkscs_phint_11939;
+				hintbase = big5hkscs_phint_12130;
 				s -= BH2S(0xc6, 0xa1);
 			}
 			else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){
-				hintbase = big5hkscs_phint_21733;
+				hintbase = big5hkscs_phint_21924;
 				s -= BH2S(0xf9, 0xd6);
 			}
 			else
@@ -123,7 +153,17 @@
 				NEXT(2, 1)
 			}
 		}
-		else return 2;
+		else {
+			switch ((c << 8) | IN2) {
+			case 0x8862: WRITE2(0x00ca, 0x0304); break;
+			case 0x8864: WRITE2(0x00ca, 0x030c); break;
+			case 0x88a3: WRITE2(0x00ea, 0x0304); break;
+			case 0x88a5: WRITE2(0x00ea, 0x030c); break;
+			default: return 2;
+			}
+
+			NEXT(2, 2) /* all decoded codepoints are pairs, above. */
+		}
 	}
 
 	return 0;

Modified: python/branches/trunk-math/Modules/cjkcodecs/mappings_hk.h
==============================================================================
--- python/branches/trunk-math/Modules/cjkcodecs/mappings_hk.h	(original)
+++ python/branches/trunk-math/Modules/cjkcodecs/mappings_hk.h	Tue Feb 12 06:36:19 2008
@@ -1,262 +1,271 @@
-static const ucs2_t __big5hkscs_decmap[6095] = {
-62211,62212,62213,62214,62215,268,62217,209,205,62220,62221,203,8168,62224,
-202,62226,62227,62228,62229,270,62231,62232,256,193,461,192,274,201,282,200,
-332,211,465,210,62245,7870,62247,7872,202,257,225,462,224,593,275,233,283,232,
-299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,476,252,62276,7871,62278,
-7873,234,609,62282,62283,41897,4421,U,25866,U,U,20029,28381,40270,37343,U,U,
-30517,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,
-21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,
-24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,
-32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29713,31996,
-32205,26950,31433,21031,U,U,U,U,37260,30904,37214,32956,U,36107,33014,2535,U,
-U,32927,40647,19661,40393,40460,19518,40438,28686,40458,41267,13761,U,28314,
-33342,29977,U,18705,39532,39567,40857,31111,33900,7626,1488,10982,20004,20097,
-20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,
-20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,
-13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,
-21795,21800,13720,21823,13733,13759,21975,13765,32132,21797,U,3138,3349,20779,
-21904,11462,14828,833,36422,19896,38117,16467,32958,30586,11320,14900,18389,
-33117,27122,19946,25821,3452,4020,3285,4340,25741,36478,3734,3083,3940,11433,
-33366,17619,U,3398,39501,33001,18420,20135,11458,39602,14951,38388,16365,
-13574,21191,38868,30920,11588,40302,38933,U,17369,24741,25780,21731,11596,
-11210,4215,14843,4207,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,26330,26390,31136,25834,20562,3139,36456,8609,35660,1841,U,18443,
-425,16378,22643,11661,U,17864,1276,24727,3916,3478,21881,16571,17338,U,19124,
-10854,4253,33194,39157,3484,25465,14846,10101,36288,22177,25724,15939,U,42497,
-3593,10959,11465,U,4296,14786,14738,14854,33435,13688,24137,8391,22098,3889,
-11442,38688,13500,27709,20027,U,U,30068,11915,8712,42587,36045,3706,3124,
-26652,32659,4303,10243,10553,13819,20963,3724,3981,3754,16275,3888,3399,4431,
-3660,U,3755,2985,3400,4288,4413,16377,9878,25650,4013,13300,30265,11214,3454,
-3455,11345,11349,14872,3736,4295,3886,42546,27472,36050,36249,36042,38314,
-21708,33476,21945,U,40643,39974,39606,30558,11758,28992,33133,33004,23580,
-25970,33076,14231,21343,32957,37302,3834,3599,3703,3835,13789,19947,13833,
-3286,22191,10165,4297,3600,3704,4216,4424,33287,5205,3705,20048,11684,23124,
-4125,4126,4341,4342,22428,3601,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,30356,33485,4021,3707,20862,14083,4022,4480,21208,41661,
-18906,6202,16759,33404,22681,21096,13850,22333,31666,23400,18432,19244,40743,
-18919,39967,39821,23412,12605,22011,13810,22153,20008,22786,7105,63608,38737,
-134,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,
-28780,29227,20012,29357,18665,32594,31035,31993,32595,25194,13505,U,25419,
-32770,32896,26130,26961,21341,34916,35265,30898,35744,36125,38021,38264,38271,
-38376,36367,38886,39029,39118,39134,39267,38928,40060,40479,40644,27503,63751,
-20023,135,38429,25143,38050,20539,28158,40051,62842,15817,34959,16718,28791,
-23797,19232,20941,13657,23856,24866,35378,36775,37366,29073,26393,29626,12929,
-41223,15499,6528,19216,30948,29698,20910,34575,16393,27235,41658,16931,34319,
-U,31274,39239,35562,38741,28749,21284,8318,37876,30425,35299,62884,30685,
-20131,20464,20668,20015,20247,62891,21556,32139,22674,22736,7606,24210,24217,
-24514,10002,25995,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,13305,26905,27203,15459,27903,U,29184,17669,29580,16091,18963,23317,
-29881,35715,23716,22165,31379,31724,31939,32364,33528,34199,62924,34960,62926,
-36537,62928,36815,34143,39392,37409,62933,36281,5183,16497,17058,23066,U,U,U,
-39016,26475,17014,22333,U,34262,18811,33471,28941,19585,28020,23931,27413,
-28606,62956,62957,23446,62959,U,32347,23870,23880,23894,15868,14351,23972,
-23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,
-23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,14851,25570,
-25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,
-15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,
-26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,
-15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,
-27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,35264,28347,
-28386,28378,40831,28392,28393,28452,28468,15686,16193,28545,28606,15722,15733,
-29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,805,17345,13809,
-3800,16087,22462,28371,28990,22496,13902,27042,35817,23412,31305,22753,38105,
-31333,31357,22956,31419,31408,31426,31427,29137,25741,16842,31450,31453,31466,
-16879,21682,23553,31499,31573,31529,21262,23806,31650,31599,33692,23476,27775,
-31696,33825,31634,U,23840,15789,23653,33938,31738,U,31797,23745,31812,31875,
-18562,31910,26237,17784,31945,31943,31974,31860,31987,31989,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,32359,17693,28228,32093,
-28374,29837,32137,32171,28981,32179,U,16471,24617,32228,15635,32245,6137,
-32229,33645,U,24865,24922,32366,32402,17195,37996,32295,32576,32577,32583,
-31030,25296,39393,32663,25425,32675,5729,104,17756,14182,17667,33594,32762,
-25737,U,32776,32797,U,32815,41095,27843,32827,32828,32865,10004,18825,26150,
-15843,26344,26405,32935,35400,33031,33050,22704,9974,27775,25752,20408,25831,
-5258,33304,6238,27219,19045,19093,17530,33321,2829,27218,15742,20473,5373,
-34018,33634,27402,18855,13616,6003,15864,33450,26907,63892,16859,34123,33488,
-33562,3606,6068,14017,12669,13658,33403,33506,33560,16011,28067,27397,27543,
-13774,15807,33565,21996,33669,17675,28069,33708,U,33747,13438,28372,27223,
-34138,13462,28226,12015,33880,23524,33905,15827,17636,27303,33866,15541,31064,
-U,27542,28279,28227,34014,U,33681,17568,33939,34020,23697,16960,23744,17731,
-34100,23282,28313,17703,34163,17686,26559,34326,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34341,34363,34241,28808,34306,5506,
-28877,63922,17770,34344,13896,6306,21495,29594,34430,34673,41208,34798,11303,
-34737,34778,34831,22113,34412,26710,17935,34885,34886,30176,15801,30180,34910,
-34972,18011,34996,34997,25537,35013,30583,30479,35207,35210,U,U,35239,35260,
-35365,35303,31012,31421,35484,30611,37374,35472,31321,31465,31546,16271,18195,
-31544,29052,35596,35615,21552,21861,35647,35660,35661,35497,19066,35728,35739,
-35503,5855,17941,34895,35995,32084,32143,63956,14117,32083,36054,32152,32189,
-36114,36099,6416,36059,28764,36113,19657,16080,36265,32770,4116,18826,15228,
-33212,28940,31463,36525,36534,36547,37588,36633,36653,33637,33810,36773,37635,
-41631,2640,36787,18730,35294,34109,15803,24312,12898,36857,40980,34492,34049,
-8997,14720,28375,36919,34108,31422,36961,34156,34315,37032,34579,37060,34534,
-37038,U,37223,15088,37289,37316,31916,35123,7817,37390,27807,37441,37474,
-21945,U,35526,15515,35596,21979,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,3377,37676,37739,35553,35819,28815,23235,35554,35557,
-18789,37444,35820,35897,35839,37747,37979,36540,38277,38310,37926,38304,28662,
-17081,9850,34520,4732,15918,18911,27676,38523,38550,16748,38563,28373,25050,
-38582,30965,35552,38589,21452,18849,27832,628,25616,37039,37093,19153,6421,
-13066,38705,34370,38710,18959,17725,17797,19177,28789,23361,38683,U,37333,
-38743,23370,37355,38751,37925,20688,12471,12476,38793,38815,38833,38846,38848,
-38866,38880,21612,38894,29724,37939,U,38901,37917,31098,19153,38964,38963,
-38987,39014,15118,29045,15697,1584,16732,22278,39114,39095,39112,39111,19199,
-27943,5843,21936,39137,39142,39148,37752,39225,18985,19314,38999,39173,39413,
-39436,39483,39440,39512,22309,14020,37041,39893,39648,39650,39685,39668,19470,
-39700,39725,34304,20532,39732,27048,14531,12413,39760,39744,40254,23109,6243,
-39822,16971,39938,39935,39948,40552,40404,40887,41362,41387,41185,41251,41439,
-40318,40323,41268,40462,26760,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,40388,8539,41363,41504,6459,41523,40249,41145,41652,40592,
-40597,40606,40610,19764,40618,40623,17252,40641,15200,14821,15645,20274,14270,
-35883,40706,40712,19350,37924,28066,40727,U,40761,22175,22154,40773,39352,
-37003,38898,33919,40802,40809,31452,40846,29206,19390,18805,18875,29047,18936,
-17224,19025,29598,35802,6394,31135,35198,36406,37737,37875,35396,37612,37761,
-37835,35180,17593,29207,16107,30578,31299,28880,17523,17400,29054,6127,28835,
-6334,13721,16071,6277,21551,6136,14114,5883,6201,14049,6004,6353,24395,14115,
-5824,22363,18981,5118,4776,5062,5302,34051,13990,U,33877,18836,29029,15921,
-21852,16123,28754,17652,14062,39325,28454,26617,14131,15381,15847,22636,6434,
-26640,16471,14143,16609,16523,16655,27681,21707,22174,26289,22162,4063,2984,
-3597,37830,35603,37788,20216,20779,14361,17462,20156,1125,895,20299,20362,
-22097,23144,427,971,14745,778,1044,13365,20265,704,36531,629,35546,524,20120,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,20685,
-20749,20386,20227,18958,16010,20290,20526,20588,20609,20428,20453,20568,20732,
-U,U,U,U,28278,13717,15929,16063,28018,6276,16009,20904,20931,1504,17629,1187,
-1170,1169,36218,35484,1806,21081,21156,2163,21217,U,18042,29068,17292,3104,
-18860,4324,27089,3613,U,16094,29849,29716,29782,29592,19342,19132,16525,21456,
-13700,29199,16585,21940,837,21709,3014,22301,37469,38644,37734,22493,22413,
-22399,13886,22731,23193,35398,5882,5999,5904,23084,22968,37519,23166,23247,
-23058,22854,6643,6241,17045,14069,27909,29763,23073,24195,23169,35799,1043,
-37856,29836,4867,28933,18802,37896,35323,37821,14240,23582,23710,24158,24136,
-6550,6524,15086,24269,23375,6403,6404,14081,6304,14045,5886,14035,33066,35399,
-7610,13426,35240,24332,24334,6439,6059,23147,5947,23364,34324,30205,34912,
-24702,10336,9771,24539,16056,9647,9662,37000,28531,25024,62,70,9755,24985,
-24984,24693,11419,11527,18132,37197,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,25713,18021,11114,14889,11042,13392,39146,11896,
-25399,42075,25782,25393,25553,18915,11623,25252,11425,25659,25963,26994,15348,
-12430,12973,18825,12971,21773,13024,6361,37951,26318,12937,12723,15072,16784,
-21892,35618,21903,5884,21851,21541,30958,12547,6186,12852,13412,12815,12674,
-17097,26254,27940,26219,19347,26160,30832,7659,26211,13010,13025,26142,22642,
-14545,14394,14268,15257,14242,13310,29904,15254,26511,17962,26806,26654,15300,
-27326,14435,14293,17543,27187,27218,27337,27397,6418,25873,26776,27212,15319,
-27258,27479,16320,15514,37792,37618,35818,35531,37513,32798,35292,37991,28069,
-28427,18924,U,16255,15759,28164,16444,23101,28170,22599,27940,30786,28987,
-17178,17014,28913,29264,29319,29332,18319,18213,20857,19108,1515,29818,16120,
-13919,19018,18711,24545,16134,16049,19167,35875,16181,24743,16115,29900,29756,
-37767,29751,17567,28138,17745,30083,16227,19673,19718,16216,30037,30323,42438,
-15129,29800,35532,18859,18830,15099,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,15821,19022,16127,18885,18675,37370,22322,37698,
-35555,6244,20703,21025,20967,30584,12850,30478,30479,30587,18071,14209,14942,
-18672,29752,29851,16063,19130,19143,16584,19094,25006,37639,21889,30750,30861,
-30856,30930,29648,31065,30529,22243,16654,U,33942,31141,27181,16122,31290,
-31220,16750,5862,16690,37429,31217,3404,18828,665,15802,5998,13719,21867,
-13680,13994,468,3085,31458,23129,9973,23215,23196,23053,603,30960,23082,23494,
-31486,16889,31837,31853,16913,23475,24252,24230,31949,18937,6064,31886,31868,
-31918,27314,32220,32263,32211,32590,25185,24924,31560,32151,24194,17002,27509,
-2326,26582,78,13775,22468,25618,25592,18786,32733,31527,2092,23273,23875,
-31500,24078,39398,34373,39523,27164,13375,14818,18935,26029,39455,26016,33920,
-28967,27857,17642,33079,17410,32966,33033,33090,26548,39107,27202,33378,33381,
-27217,33875,28071,34320,29211,23174,16767,6208,23339,6305,23268,6360,34464,
-63932,15759,34861,29730,23042,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,34926,20293,34951,35007,35046,35173,35149,22147,35156,
-30597,30596,35829,35801,35740,35321,16045,33955,18165,18127,14322,35389,35356,
-37960,24397,37419,17028,26068,28969,28868,6213,40301,35999,36073,32220,22938,
-30659,23024,17262,14036,36394,36519,19465,36656,36682,17140,27736,28603,8993,
-18587,28537,28299,6106,39913,14005,18735,37051,U,21873,18694,37307,37892,
-35403,16482,35580,37927,35869,35899,34021,35371,38297,38311,38295,38294,36148,
-29765,16066,18687,19010,17386,16103,12837,38543,36583,36454,36453,16076,18925,
-19064,16366,29714,29803,16124,38721,37040,26695,18973,37011,22495,U,37736,
-35209,35878,35631,25534,37562,23313,35689,18748,29689,16923,38811,38769,39224,
-3878,24001,35781,19122,38943,38106,37622,38359,37349,17600,35664,19047,35684,
-39132,35397,16128,37418,18725,33812,39227,39245,31494,15869,39323,19311,39338,
-39516,35685,22728,27279,39457,23294,39471,39153,19344,39240,39356,19389,19351,
-37757,22642,4866,22562,18872,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,5352,30788,10015,15800,26821,15741,37976,14631,24912,
-10113,10603,24839,40015,40019,40059,39989,39952,39807,39887,40493,39839,41461,
-41214,40225,19630,16644,40472,19632,40204,41396,41197,41203,39215,40357,33981,
-28178,28639,27522,34300,17715,28068,28292,28144,33824,34286,28160,14295,24676,
-31202,13724,13888,18733,18910,15714,37851,37566,37704,703,30905,37495,37965,
-20452,13376,36964,21853,30781,30804,30902,30795,5975,12745,18753,13978,20338,
-28634,28633,U,28702,21524,16821,22459,22771,22410,40214,22487,28980,13487,
-16812,29163,27712,20375,U,6069,35401,24844,23246,23051,17084,17544,14124,
-19323,35324,37819,37816,6358,3869,33906,27840,5139,17146,11302,17345,22932,
-15799,26433,32168,24923,24740,18873,18827,35322,37605,29666,16105,29876,35683,
-6303,16097,19123,27352,29683,29691,16086,19006,19092,6105,19046,935,5156,
-18917,29768,18710,28837,18806,37508,29670,37727,1278,37681,35534,35350,37766,
-35815,21973,18741,35458,29035,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,18755,3327,22180,1562,3051,3256,21762,31172,6138,32254,
-5826,19024,6226,17710,37889,14090,35520,18861,22960,6335,6275,29828,23201,
-14050,15707,14000,37471,23161,35457,6242,37748,15565,2740,19094,14730,20724,
-15721,15692,5020,29045,17147,33304,28175,37092,17643,27991,32335,28775,27823,
-15574,16365,15917,28162,28428,15727,1013,30033,14012,13512,18048,16090,18545,
-22980,37486,18750,36673,35868,27584,22546,22472,14038,5202,28926,17250,19057,
-12259,4784,9149,26809,26983,5016,13541,31732,14047,35459,14294,13306,19615,
-27162,13997,27831,33854,17631,17614,27942,27985,27778,28638,28439,28937,33597,
-5946,33773,27776,28755,6107,22921,23170,6067,23137,23153,6405,16892,14125,
-23023,5948,14023,29070,37776,26266,17061,23150,23083,17043,27179,16121,30518,
-17499,17098,28957,16985,35297,20400,27944,23746,17614,32333,17341,27148,16982,
-4868,28838,28979,17385,15781,27871,63525,19023,32357,23019,23855,15859,24412,
-19037,6111,32164,33830,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,21637,15098,13056,532,22398,2261,1561,16357,8094,41654,28675,
-37211,23920,29583,31955,35417,37920,20424,32743,29389,29456,31476,29496,29497,
-22262,29505,29512,16041,31512,36972,29173,18674,29665,33270,16074,30476,16081,
-27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,
-30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,20316,
-29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,
-23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,
-21813,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,
-16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,
-16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,3279,32207,32212,
-32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,
-22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,
-33110,33113,33114,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,
-33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,
-33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,
-34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,
-35143,35217,31079,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,
-36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,
-36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,
-37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,
-18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,
-18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,
-39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,
-39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,
-7106,40265,39994,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,
-40637,40646,38108,40674,40689,40696,31432,40772,148,695,928,26906,38083,22956,
-1239,22592,38081,14265,1493,1557,1654,5818,22359,29043,2754,2765,3007,21610,
-63547,3019,21662,3067,3131,3155,3173,3196,24807,3213,22138,3253,3293,3309,
-3439,3506,3528,26965,39983,34725,3588,3598,3799,3984,3885,3699,23584,4028,
-24075,4188,4175,4214,26398,4219,4232,4246,13895,4287,4307,4399,4411,21348,
-33965,4835,4981,4918,35713,5495,5657,6083,6087,20088,28859,6189,6506,6701,
-6725,7210,7280,7340,7880,25283,7893,7957,29080,26709,8261,27113,14024,8828,
-9175,9210,10026,10353,10575,33533,10599,10643,10965,35237,10984,36768,11022,
-38840,11071,38983,39613,11340,U,11400,11447,23528,11528,11538,11703,11669,
-11842,12148,12236,12339,12390,13087,13278,24497,26184,26303,31353,13671,13811,
-U,18874,U,13850,14102,U,838,22709,26382,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26904,15015,30295,24546,15889,16057,30206,8346,
-18640,19128,16665,35482,17134,17165,16443,17204,17302,19013,1482,20946,1553,
-22943,7848,15294,15615,17412,17622,22408,18036,14747,18223,34280,39369,14178,
-8643,35678,35662,U,18450,18683,18965,29193,19136,3192,22885,20133,20358,1913,
-36570,20524,21135,22335,29041,21145,21529,16202,19111,21948,21574,21614,27474,
-U,13427,21823,30258,21854,18200,21858,21862,22471,18751,22621,20582,13563,
-13260,U,22787,18300,35144,23214,23433,23558,7568,22433,29009,U,24834,31762,
-36950,25010,20378,35682,25602,25674,23899,27639,U,25732,6428,35562,18934,
-25736,16367,25874,19392,26047,26293,10011,37989,22497,24981,23079,63693,U,
-22201,17697,26364,20074,18740,38486,28047,27837,13848,35191,26521,26734,25617,
-26718,U,26823,31554,37056,2577,26918,U,26937,31301,U,27130,39462,27181,13919,
-25705,33,31107,27188,27483,23852,13593,U,27549,18128,27812,30011,34917,28078,
-22710,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-14108,9613,28747,29133,15444,29312,29317,37505,8570,29323,37680,29414,18896,
-27705,38047,29776,3832,34855,35061,10534,33907,6065,28344,18986,6176,14756,
-14009,U,U,17727,26294,40109,39076,35139,30668,30808,22230,16607,5642,14753,
-14127,33000,5061,29101,33638,31197,37288,U,19639,28847,35243,31229,31242,
-31499,32102,16762,31555,31102,32777,28597,41695,27139,33560,21410,28167,37823,
-26678,38749,33135,32803,27061,5101,12847,32840,23941,35888,32899,22293,38947,
-35145,23979,18824,26046,27093,21458,19109,16257,15377,26422,32912,33012,33070,
-8097,33103,33161,33199,33306,33542,33583,33674,13770,33896,34474,18682,25574,
-35158,30728,37461,35256,17394,35303,17375,35304,35654,35796,23032,35849,U,
-36805,37100,U,37136,37180,15863,37214,19146,36816,29327,22155,38119,38377,
+static const ucs2_t __big5hkscs_decmap[6219] = {
+17392,19506,17923,17830,17784,29287,19831,17843,31921,19682,31941,15253,18230,
+18244,19527,19520,17087,13847,29522,28299,28882,19543,41809,18255,17882,19589,
+31852,19719,19108,18081,27427,29221,23124,6755,15878,16225,26189,22267,U,
+32149,22813,35769,15860,38708,31727,23515,7518,23204,13861,40624,23249,23479,
+23804,26478,34195,39237,29793,29853,12736,12737,12738,12739,12740,268,12741,
+209,205,12742,12743,203,8168,12744,202,12745,12746,12747,12748,270,12749,
+12750,256,193,461,192,274,201,282,200,332,211,465,210,U,7870,U,7872,202,257,
+225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,
+249,470,472,474,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,476,252,U,7871,U,7873,234,609,9178,9179,41897,4421,U,25866,U,U,20029,
+28381,40270,37343,U,U,30517,25745,20250,20264,20392,20822,20852,20892,20964,
+21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,
+23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,
+32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,
+36710,36711,36718,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,29713,31996,32205,26950,31433,21031,U,U,U,U,37260,30904,37214,32956,U,
+36107,33014,2535,U,U,32927,40647,19661,40393,40460,19518,40438,28686,40458,
+41267,13761,U,28314,33342,29977,U,18705,39532,39567,40857,31111,33900,7626,
+1488,10982,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,
+20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,
+13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,
+21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,32132,
+21797,U,3138,3349,20779,21904,11462,14828,833,36422,19896,38117,16467,32958,
+30586,11320,14900,18389,33117,27122,19946,25821,3452,4020,3285,4340,25741,
+36478,3734,3083,3940,11433,33366,17619,U,3398,39501,33001,18420,20135,11458,
+39602,14951,38388,16365,13574,21191,38868,30920,11588,40302,38933,U,17369,
+24741,25780,21731,11596,11210,4215,14843,4207,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26330,26390,31136,25834,20562,3139,36456,
+8609,35660,1841,U,18443,425,16378,22643,11661,U,17864,1276,24727,3916,3478,
+21881,16571,17338,U,19124,10854,4253,33194,39157,3484,25465,14846,10101,36288,
+22177,25724,15939,U,42497,3593,10959,11465,U,4296,14786,14738,14854,33435,
+13688,24137,8391,22098,3889,11442,38688,13500,27709,20027,U,U,30068,11915,
+8712,42587,36045,3706,3124,26652,32659,4303,10243,10553,13819,20963,3724,3981,
+3754,16275,3888,3399,4431,3660,U,3755,2985,3400,4288,4413,16377,9878,25650,
+4013,13300,30265,11214,3454,3455,11345,11349,14872,3736,4295,3886,42546,27472,
+36050,36249,36042,38314,21708,33476,21945,U,40643,39974,39606,30558,11758,
+28992,33133,33004,23580,25970,33076,14231,21343,32957,37302,3834,3599,3703,
+3835,13789,19947,13833,3286,22191,10165,4297,3600,3704,4216,4424,33287,5205,
+3705,20048,11684,23124,4125,4126,4341,4342,22428,3601,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30356,33485,4021,3707,20862,14083,
+4022,4480,21208,41661,18906,6202,16759,33404,22681,21096,13850,22333,31666,
+23400,18432,19244,40743,18919,39967,39821,23412,12605,22011,13810,22153,20008,
+22786,7105,63608,38737,134,20059,20155,13630,23587,24401,24516,14586,25164,
+25909,27514,27701,27706,28780,29227,20012,29357,18665,32594,31035,31993,32595,
+25194,13505,U,25419,32770,32896,26130,26961,21341,34916,35265,30898,35744,
+36125,38021,38264,38271,38376,36367,38886,39029,39118,39134,39267,38928,40060,
+40479,40644,27503,63751,20023,135,38429,25143,38050,20539,28158,40051,40870,
+15817,34959,16718,28791,23797,19232,20941,13657,23856,24866,35378,36775,37366,
+29073,26393,29626,12929,41223,15499,6528,19216,30948,29698,20910,34575,16393,
+27235,41658,16931,34319,2671,31274,39239,35562,38741,28749,21284,8318,37876,
+30425,35299,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,
+22736,7606,24210,24217,24514,10002,25995,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,13305,26905,27203,15459,27903,U,29184,17669,
+29580,16091,18963,23317,29881,35715,23716,22165,31379,31724,31939,32364,33528,
+34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,36281,5183,
+16497,17058,23066,U,U,U,39016,26475,17014,22333,U,34262,18811,33471,28941,
+19585,28020,23931,27413,28606,40877,40878,23446,40879,26343,32347,28247,31178,
+15752,17603,12886,10134,17306,17718,U,23765,15130,35577,23672,15634,13649,
+23928,40882,29015,17752,16620,7715,19575,14712,13386,420,27713,35532,20404,
+569,22975,33132,38998,39162,24379,2975,U,8641,35181,16642,18107,36985,16135,
+40883,41397,16632,14294,18167,27718,16764,34482,29695,17773,14548,21658,17761,
+17691,19849,19579,19830,17898,16328,19215,13921,17630,17597,16877,23870,23880,
+23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,
+14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,
+25368,14840,22193,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,
+25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,
+26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,
+27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,
+27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,
+28201,28294,35264,28347,28386,28378,40831,28392,28393,28452,28468,15686,16193,
+28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,
+28809,805,17345,13809,3800,16087,22462,28371,28990,22496,13902,27042,35817,
+23412,31305,22753,38105,31333,31357,22956,31419,31408,31426,31427,29137,25741,
+16842,31450,31453,31466,16879,21682,23553,31499,31573,31529,21262,23806,31650,
+31599,33692,23476,27775,31696,33825,31634,U,23840,15789,23653,33938,31738,U,
+31797,23745,31812,31875,18562,31910,26237,17784,31945,31943,31974,31860,31987,
+31989,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+32359,17693,28228,32093,28374,29837,32137,32171,28981,32179,U,16471,24617,
+32228,15635,32245,6137,32229,33645,U,24865,24922,32366,32402,17195,37996,
+32295,32576,32577,32583,31030,25296,39393,32663,25425,32675,5729,104,17756,
+14182,17667,33594,32762,25737,U,32776,32797,U,32815,41095,27843,32827,32828,
+32865,10004,18825,26150,15843,26344,26405,32935,35400,33031,33050,22704,9974,
+27775,25752,20408,25831,5258,33304,6238,27219,19045,19093,17530,33321,2829,
+27218,15742,20473,5373,34018,33634,27402,18855,13616,6003,15864,33450,26907,
+63892,16859,34123,33488,33562,3606,6068,14017,12669,13658,33403,33506,33560,
+16011,28067,27397,27543,13774,15807,33565,21996,33669,17675,28069,33708,U,
+33747,13438,28372,27223,34138,13462,28226,12015,33880,23524,33905,15827,17636,
+27303,33866,15541,31064,U,27542,28279,28227,34014,U,33681,17568,33939,34020,
+23697,16960,23744,17731,34100,23282,28313,17703,34163,17686,26559,34326,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34341,34363,
+34241,28808,34306,5506,28877,63922,17770,34344,13896,6306,21495,29594,34430,
+34673,41208,34798,11303,34737,34778,34831,22113,34412,26710,17935,34885,34886,
+30176,15801,30180,34910,34972,18011,34996,34997,25537,35013,30583,30479,35207,
+35210,U,U,35239,35260,35365,35303,31012,31421,35484,30611,37374,35472,31321,
+31465,31546,16271,18195,31544,29052,35596,35615,21552,21861,35647,35660,35661,
+35497,19066,35728,35739,35503,5855,17941,34895,35995,32084,32143,63956,14117,
+32083,36054,32152,32189,36114,36099,6416,36059,28764,36113,19657,16080,36265,
+32770,4116,18826,15228,33212,28940,31463,36525,36534,36547,37588,36633,36653,
+33637,33810,36773,37635,41631,2640,36787,18730,35294,34109,15803,24312,12898,
+36857,40980,34492,34049,8997,14720,28375,36919,34108,31422,36961,34156,34315,
+37032,34579,37060,34534,37038,U,37223,15088,37289,37316,31916,35123,7817,
+37390,27807,37441,37474,21945,U,35526,15515,35596,21979,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,3377,37676,37739,35553,35819,
+28815,23235,35554,35557,18789,37444,35820,35897,35839,37747,37979,36540,38277,
+38310,37926,38304,28662,17081,9850,34520,4732,15918,18911,27676,38523,38550,
+16748,38563,28373,25050,38582,30965,35552,38589,21452,18849,27832,628,25616,
+37039,37093,19153,6421,13066,38705,34370,38710,18959,17725,17797,19177,28789,
+23361,38683,U,37333,38743,23370,37355,38751,37925,20688,12471,12476,38793,
+38815,38833,38846,38848,38866,38880,21612,38894,29724,37939,U,38901,37917,
+31098,19153,38964,38963,38987,39014,15118,29045,15697,1584,16732,22278,39114,
+39095,39112,39111,19199,27943,5843,21936,39137,39142,39148,37752,39225,18985,
+19314,38999,39173,39413,39436,39483,39440,39512,22309,14020,37041,39893,39648,
+39650,39685,39668,19470,39700,39725,34304,20532,39732,27048,14531,12413,39760,
+39744,40254,23109,6243,39822,16971,39938,39935,39948,40552,40404,40887,41362,
+41387,41185,41251,41439,40318,40323,41268,40462,26760,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40388,8539,41363,41504,6459,41523,
+40249,41145,41652,40592,40597,40606,40610,19764,40618,40623,17252,40641,15200,
+14821,15645,20274,14270,35883,40706,40712,19350,37924,28066,40727,U,40761,
+22175,22154,40773,39352,37003,38898,33919,40802,40809,31452,40846,29206,19390,
+18805,18875,29047,18936,17224,19025,29598,35802,6394,31135,35198,36406,37737,
+37875,35396,37612,37761,37835,35180,17593,29207,16107,30578,31299,28880,17523,
+17400,29054,6127,28835,6334,13721,16071,6277,21551,6136,14114,5883,6201,14049,
+6004,6353,24395,14115,5824,22363,18981,5118,4776,5062,5302,34051,13990,U,
+33877,18836,29029,15921,21852,16123,28754,17652,14062,39325,28454,26617,14131,
+15381,15847,22636,6434,26640,16471,14143,16609,16523,16655,27681,21707,22174,
+26289,22162,4063,2984,3597,37830,35603,37788,20216,20779,14361,17462,20156,
+1125,895,20299,20362,22097,23144,427,971,14745,778,1044,13365,20265,704,36531,
+629,35546,524,20120,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,20685,20749,20386,20227,18958,16010,20290,20526,20588,20609,20428,
+20453,20568,20732,U,U,U,U,28278,13717,15929,16063,28018,6276,16009,20904,
+20931,1504,17629,1187,1170,1169,36218,35484,1806,21081,21156,2163,21217,U,
+18042,29068,17292,3104,18860,4324,27089,3613,U,16094,29849,29716,29782,29592,
+19342,19132,16525,21456,13700,29199,16585,21940,837,21709,3014,22301,37469,
+38644,37734,22493,22413,22399,13886,22731,23193,35398,5882,5999,5904,23084,
+22968,37519,23166,23247,23058,22854,6643,6241,17045,14069,27909,29763,23073,
+24195,23169,35799,1043,37856,29836,4867,28933,18802,37896,35323,37821,14240,
+23582,23710,24158,24136,6550,6524,15086,24269,23375,6403,6404,14081,6304,
+14045,5886,14035,33066,35399,7610,13426,35240,24332,24334,6439,6059,23147,
+5947,23364,34324,30205,34912,24702,10336,9771,24539,16056,9647,9662,37000,
+28531,25024,62,70,9755,24985,24984,24693,11419,11527,18132,37197,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25713,18021,11114,
+14889,11042,13392,39146,11896,25399,42075,25782,25393,25553,18915,11623,25252,
+11425,25659,25963,26994,15348,12430,12973,18825,12971,21773,13024,6361,37951,
+26318,12937,12723,15072,16784,21892,35618,21903,5884,21851,21541,30958,12547,
+6186,12852,13412,12815,12674,17097,26254,27940,26219,19347,26160,30832,7659,
+26211,13010,13025,26142,22642,14545,14394,14268,15257,14242,13310,29904,15254,
+26511,17962,26806,26654,15300,27326,14435,14293,17543,27187,27218,27337,27397,
+6418,25873,26776,27212,15319,27258,27479,16320,15514,37792,37618,35818,35531,
+37513,32798,35292,37991,28069,28427,18924,U,16255,15759,28164,16444,23101,
+28170,22599,27940,30786,28987,17178,17014,28913,29264,29319,29332,18319,18213,
+20857,19108,1515,29818,16120,13919,19018,18711,24545,16134,16049,19167,35875,
+16181,24743,16115,29900,29756,37767,29751,17567,28138,17745,30083,16227,19673,
+19718,16216,30037,30323,42438,15129,29800,35532,18859,18830,15099,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,15821,19022,16127,
+18885,18675,37370,22322,37698,35555,6244,20703,21025,20967,30584,12850,30478,
+30479,30587,18071,14209,14942,18672,29752,29851,16063,19130,19143,16584,19094,
+25006,37639,21889,30750,30861,30856,30930,29648,31065,30529,22243,16654,U,
+33942,31141,27181,16122,31290,31220,16750,5862,16690,37429,31217,3404,18828,
+665,15802,5998,13719,21867,13680,13994,468,3085,31458,23129,9973,23215,23196,
+23053,603,30960,23082,23494,31486,16889,31837,31853,16913,23475,24252,24230,
+31949,18937,6064,31886,31868,31918,27314,32220,32263,32211,32590,25185,24924,
+31560,32151,24194,17002,27509,2326,26582,78,13775,22468,25618,25592,18786,
+32733,31527,2092,23273,23875,31500,24078,39398,34373,39523,27164,13375,14818,
+18935,26029,39455,26016,33920,28967,27857,17642,33079,17410,32966,33033,33090,
+26548,39107,27202,33378,33381,27217,33875,28071,34320,29211,23174,16767,6208,
+23339,6305,23268,6360,34464,63932,15759,34861,29730,23042,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34926,20293,34951,35007,35046,
+35173,35149,22147,35156,30597,30596,35829,35801,35740,35321,16045,33955,18165,
+18127,14322,35389,35356,37960,24397,37419,17028,26068,28969,28868,6213,40301,
+35999,36073,32220,22938,30659,23024,17262,14036,36394,36519,19465,36656,36682,
+17140,27736,28603,8993,18587,28537,28299,6106,39913,14005,18735,37051,U,21873,
+18694,37307,37892,35403,16482,35580,37927,35869,35899,34021,35371,38297,38311,
+38295,38294,36148,29765,16066,18687,19010,17386,16103,12837,38543,36583,36454,
+36453,16076,18925,19064,16366,29714,29803,16124,38721,37040,26695,18973,37011,
+22495,U,37736,35209,35878,35631,25534,37562,23313,35689,18748,29689,16923,
+38811,38769,39224,3878,24001,35781,19122,38943,38106,37622,38359,37349,17600,
+35664,19047,35684,39132,35397,16128,37418,18725,33812,39227,39245,31494,15869,
+39323,19311,39338,39516,35685,22728,27279,39457,23294,39471,39153,19344,39240,
+39356,19389,19351,37757,22642,4866,22562,18872,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,5352,30788,10015,15800,26821,15741,
+37976,14631,24912,10113,10603,24839,40015,40019,40059,39989,39952,39807,39887,
+40493,39839,41461,41214,40225,19630,16644,40472,19632,40204,41396,41197,41203,
+39215,40357,33981,28178,28639,27522,34300,17715,28068,28292,28144,33824,34286,
+28160,14295,24676,31202,13724,13888,18733,18910,15714,37851,37566,37704,703,
+30905,37495,37965,20452,13376,36964,21853,30781,30804,30902,30795,5975,12745,
+18753,13978,20338,28634,28633,U,28702,21524,16821,22459,22771,22410,40214,
+22487,28980,13487,16812,29163,27712,20375,U,6069,35401,24844,23246,23051,
+17084,17544,14124,19323,35324,37819,37816,6358,3869,33906,27840,5139,17146,
+11302,17345,22932,15799,26433,32168,24923,24740,18873,18827,35322,37605,29666,
+16105,29876,35683,6303,16097,19123,27352,29683,29691,16086,19006,19092,6105,
+19046,935,5156,18917,29768,18710,28837,18806,37508,29670,37727,1278,37681,
+35534,35350,37766,35815,21973,18741,35458,29035,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,18755,3327,22180,1562,3051,3256,21762,
+31172,6138,32254,5826,19024,6226,17710,37889,14090,35520,18861,22960,6335,
+6275,29828,23201,14050,15707,14000,37471,23161,35457,6242,37748,15565,2740,
+19094,14730,20724,15721,15692,5020,29045,17147,33304,28175,37092,17643,27991,
+32335,28775,27823,15574,16365,15917,28162,28428,15727,1013,30033,14012,13512,
+18048,16090,18545,22980,37486,18750,36673,35868,27584,22546,22472,14038,5202,
+28926,17250,19057,12259,4784,9149,26809,26983,5016,13541,31732,14047,35459,
+14294,13306,19615,27162,13997,27831,33854,17631,17614,27942,27985,27778,28638,
+28439,28937,33597,5946,33773,27776,28755,6107,22921,23170,6067,23137,23153,
+6405,16892,14125,23023,5948,14023,29070,37776,26266,17061,23150,23083,17043,
+27179,16121,30518,17499,17098,28957,16985,35297,20400,27944,23746,17614,32333,
+17341,27148,16982,4868,28838,28979,17385,15781,27871,63525,19023,32357,23019,
+23855,15859,24412,19037,6111,32164,33830,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21637,15098,13056,532,22398,2261,1561,16357,
+8094,41654,28675,37211,23920,29583,31955,35417,37920,20424,32743,29389,29456,
+31476,29496,29497,22262,29505,29512,16041,31512,36972,29173,18674,29665,33270,
+16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,
+16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,
+16348,30330,20316,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,
+30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,
+30801,30822,33864,21813,31027,26627,31026,16643,16649,31121,31129,36795,31238,
+36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,
+31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,
+3279,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,
+32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,
+33044,17409,15161,33110,33113,33114,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,17427,22586,33148,33156,17445,33171,17453,33189,
+22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,
+27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,
+17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,
+34990,35071,35108,35143,35217,31079,35369,35384,35476,35508,35921,36052,36082,
+36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,
+36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,
+37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,
+37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,
+38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,
+22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,
+39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,
+19565,39968,14191,7106,40265,39994,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,40702,22096,40339,40381,40384,40444,38134,36790,
+40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,148,695,928,
+26906,38083,22956,1239,22592,38081,14265,1493,1557,1654,5818,22359,29043,2754,
+2765,3007,21610,63547,3019,21662,3067,3131,3155,3173,3196,24807,3213,22138,
+3253,3293,3309,3439,3506,3528,26965,39983,34725,3588,3598,3799,3984,3885,3699,
+23584,4028,24075,4188,4175,4214,26398,4219,4232,4246,13895,4287,4307,4399,
+4411,21348,33965,4835,4981,4918,35713,5495,5657,6083,6087,20088,28859,6189,
+6506,6701,6725,7210,7280,7340,7880,25283,7893,7957,29080,26709,8261,27113,
+14024,8828,9175,9210,10026,10353,10575,33533,10599,10643,10965,35237,10984,
+36768,11022,38840,11071,38983,39613,11340,U,11400,11447,23528,11528,11538,
+11703,11669,11842,12148,12236,12339,12390,13087,13278,24497,26184,26303,31353,
+13671,13811,U,18874,U,13850,14102,U,838,22709,26382,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26904,15015,30295,24546,15889,16057,
+30206,8346,18640,19128,16665,35482,17134,17165,16443,17204,17302,19013,1482,
+20946,1553,22943,7848,15294,15615,17412,17622,22408,18036,14747,18223,34280,
+39369,14178,8643,35678,35662,U,18450,18683,18965,29193,19136,3192,22885,20133,
+20358,1913,36570,20524,21135,22335,29041,21145,21529,16202,19111,21948,21574,
+21614,27474,U,13427,21823,30258,21854,18200,21858,21862,22471,18751,22621,
+20582,13563,13260,U,22787,18300,35144,23214,23433,23558,7568,22433,29009,U,
+24834,31762,36950,25010,20378,35682,25602,25674,23899,27639,U,25732,6428,
+35562,18934,25736,16367,25874,19392,26047,26293,10011,37989,22497,24981,23079,
+63693,U,22201,17697,26364,20074,18740,38486,28047,27837,13848,35191,26521,
+26734,25617,26718,U,26823,31554,37056,2577,26918,U,26937,31301,U,27130,39462,
+27181,13919,25705,33,31107,27188,27483,23852,13593,U,27549,18128,27812,30011,
+34917,28078,22710,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,14108,9613,28747,29133,15444,29312,29317,37505,8570,29323,37680,29414,
+18896,27705,38047,29776,3832,34855,35061,10534,33907,6065,28344,18986,6176,
+14756,14009,U,U,17727,26294,40109,39076,35139,30668,30808,22230,16607,5642,
+14753,14127,33000,5061,29101,33638,31197,37288,U,19639,28847,35243,31229,
+31242,31499,32102,16762,31555,31102,32777,28597,41695,27139,33560,21410,28167,
+37823,26678,38749,33135,32803,27061,5101,12847,32840,23941,35888,32899,22293,
+38947,35145,23979,18824,26046,27093,21458,19109,16257,15377,26422,32912,33012,
+33070,8097,33103,33161,33199,33306,33542,33583,33674,13770,33896,34474,18682,
+25574,35158,30728,37461,35256,17394,35303,17375,35304,35654,35796,23032,35849,
+U,36805,37100,U,37136,37180,15863,37214,19146,36816,29327,22155,38119,38377,
 38320,38328,38706,39121,39241,39274,39363,39464,39694,40282,40347,32415,40696,
 40739,19620,38215,41619,29090,41727,19857,36882,42443,19868,3228,36798,21953,
 U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,36794,
@@ -277,7 +286,7 @@
 19972,13687,23309,27826,21351,13996,14812,21373,13989,17944,22682,19310,33325,
 21579,22442,23189,2425,U,14930,9317,29556,40620,19721,39917,15614,40752,19547,
 20393,38302,40926,33884,15798,29362,26547,14112,25390,32037,16119,15916,14890,
-36872,21196,15988,13946,17897,1166,30272,23280,3766,30842,18358,22695,16575,
+36872,21196,15988,13946,17897,1166,30272,23280,3766,30842,32558,22695,16575,
 22140,39819,23924,30292,42036,40581,19681,U,14331,24857,12506,17394,U,22109,
 4777,22439,18787,40454,21044,28846,13741,U,40316,31830,39737,22494,5996,23635,
 25811,38096,25397,29028,34477,3368,27938,19170,3441,U,20990,7951,23950,38659,
@@ -327,9 +336,9 @@
 1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,
 1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,
 1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,
-1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,63461,204,20058,138,20994,
-63466,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
-63467,20872,63469,30215,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,204,20058,138,20994,
+17553,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+40880,20872,40881,30215,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
 U,U,U,U,U,U,U,U,U,U,U,U,U,65506,65508,65287,65282,12849,8470,8481,12443,12444,
 11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,
 11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,
@@ -417,67 +426,68 @@
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
-},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
-0,0},{__big5hkscs_decmap+0,64,170},{__big5hkscs_decmap+107,64,254},{
-__big5hkscs_decmap+298,64,254},{__big5hkscs_decmap+489,64,253},{
-__big5hkscs_decmap+679,64,220},{__big5hkscs_decmap+836,96,254},{
-__big5hkscs_decmap+995,64,254},{__big5hkscs_decmap+1186,64,253},{
-__big5hkscs_decmap+1376,64,254},{__big5hkscs_decmap+1567,64,254},{
-__big5hkscs_decmap+1758,64,254},{__big5hkscs_decmap+1949,64,254},{
-__big5hkscs_decmap+2140,64,254},{__big5hkscs_decmap+2331,64,254},{
-__big5hkscs_decmap+2522,64,254},{__big5hkscs_decmap+2713,64,254},{
-__big5hkscs_decmap+2904,64,254},{__big5hkscs_decmap+3095,64,254},{
-__big5hkscs_decmap+3286,64,254},{__big5hkscs_decmap+3477,64,254},{
-__big5hkscs_decmap+3668,64,254},{__big5hkscs_decmap+3859,64,254},{
-__big5hkscs_decmap+4050,64,254},{__big5hkscs_decmap+4241,64,254},{
-__big5hkscs_decmap+4432,64,254},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
-},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+__big5hkscs_decmap+0,64,121},{__big5hkscs_decmap+58,64,170},{
+__big5hkscs_decmap+165,64,254},{__big5hkscs_decmap+356,64,254},{
+__big5hkscs_decmap+547,64,253},{__big5hkscs_decmap+737,64,254},{
+__big5hkscs_decmap+928,64,254},{__big5hkscs_decmap+1119,64,254},{
+__big5hkscs_decmap+1310,64,253},{__big5hkscs_decmap+1500,64,254},{
+__big5hkscs_decmap+1691,64,254},{__big5hkscs_decmap+1882,64,254},{
+__big5hkscs_decmap+2073,64,254},{__big5hkscs_decmap+2264,64,254},{
+__big5hkscs_decmap+2455,64,254},{__big5hkscs_decmap+2646,64,254},{
+__big5hkscs_decmap+2837,64,254},{__big5hkscs_decmap+3028,64,254},{
+__big5hkscs_decmap+3219,64,254},{__big5hkscs_decmap+3410,64,254},{
+__big5hkscs_decmap+3601,64,254},{__big5hkscs_decmap+3792,64,254},{
+__big5hkscs_decmap+3983,64,254},{__big5hkscs_decmap+4174,64,254},{
+__big5hkscs_decmap+4365,64,254},{__big5hkscs_decmap+4556,64,254},{0,0,0},{0,0,
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
-},{0,0,0},{0,0,0},{__big5hkscs_decmap+4623,161,254},{__big5hkscs_decmap+4717,
-64,254},{__big5hkscs_decmap+4908,64,254},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,
-0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_decmap+4747,
+161,254},{__big5hkscs_decmap+4841,64,254},{__big5hkscs_decmap+5032,64,254},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
-0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_decmap+5099,214,254},{
-__big5hkscs_decmap+5140,64,254},{__big5hkscs_decmap+5331,64,254},{
-__big5hkscs_decmap+5522,64,254},{__big5hkscs_decmap+5713,64,254},{
-__big5hkscs_decmap+5904,64,254},{0,0,0},
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+__big5hkscs_decmap+5223,214,254},{__big5hkscs_decmap+5264,64,254},{
+__big5hkscs_decmap+5455,64,254},{__big5hkscs_decmap+5646,64,254},{
+__big5hkscs_decmap+5837,64,254},{__big5hkscs_decmap+6028,64,254},{0,0,0},
 };
 
 static const unsigned char big5hkscs_phint_0[] = {
-160,89,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,1,8,0,0,0,0,0,0,0,0,0,0,
-0,0,2,44,0,30,0,0,0,0,0,64,174,86,238,249,221,228,33,23,0,0,0,128,219,73,31,
-76,130,55,237,228,223,189,247,245,239,31,100,136,94,253,223,11,0,0,0,192,247,
-143,0,131,5,0,8,201,8,4,129,64,68,5,11,9,35,1,32,2,0,0,0,32,145,24,0,96,0,168,
-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,128,0,64,86,50,65,32,198,
-80,72,2,0,0,0,0,160,192,168,1,164,85,48,58,209,106,46,159,176,241,65,136,5,57,
-80,4,0,0,0,0,172,163,20,192,1,2,13,45,134,136,107,34,110,192,204,245,218,10,
-24,122,0,0,0,0,50,115,0,15,68,252,3,33,49,32,25,232,96,160,65,19,82,42,250,9,
-0,0,0,0,190,1,129,16,16,96,183,137,193,218,237,250,242,59,200,167,11,77,155,
-11,0,0,0,0,24,0,220,116,19,94,192,168,0,60,240,208,68,224,172,60,75,230,29,15,
-0,0,0,128,189,88,120,55,191,187,216,218,8,134,192,108,148,192,176,125,14,136,
-145,3,0,0,0,64,99,139,197,22,24,68,124,152,75,112,3,92,219,185,208,26,40,149,
-106,1,0,0,0,0,232,7,36,34,32,136,4,106,32,215,29,50,15,162,149,11,4,67,65,1,0,
-0,0,104,48,64,19,207,57,183,16,8,7,4,180,33,217,183,15,11,127,69,91,0,0,0,0,
-236,116,236,196,4,41,49,2,48,250,252,27,175,78,38,164,183,110,50,24,0,0,0,0,
-220,22,67,34,1,0,0,128,0,0,0,4,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,
-0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,28,241,220,190,126,252,186,123,238,249,55,249,
-93,165,255,31,215,2,0,0,0,128,63,255,213,117,117,187,120,231,62,245,177,173,
-189,75,150,188,46,181,85,2,0,0,0,192,109,51,55,176,233,204,159,42,126,83,204,
-255,77,234,218,198,255,55,165,0,0,0,0,160,192,252,222,50,83,161,28,0,0,33,176,
-71,0,74,32,32,233,215,235,0,0,0,0,160,183,1,64,49,101,247,12,36,64,48,45,144,
-123,18,0,0,2,0,0,0,0,0,0,0,8,80,144,69,0,4,0,0,32,64,4,161,128,96,2,0,32,0,8,
-0,0,0,0,148,8,2,32,40,0,0,1,8,254,251,73,
+32,5,95,68,15,82,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,44,4,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,4,0,0,0,0,0,0,0,0,0,0,0,0,1,22,0,15,0,0,0,0,0,
+32,87,43,247,252,110,242,144,11,0,0,0,192,237,164,15,38,193,155,118,242,239,
+222,251,250,247,15,50,68,175,254,239,5,0,0,0,224,251,71,128,193,2,0,132,100,4,
+130,64,32,162,130,133,164,145,0,16,1,0,0,0,144,72,12,0,48,0,84,3,48,68,24,19,
+53,137,38,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,32,43,153,32,16,99,40,36,
+1,0,0,0,0,80,96,212,0,210,42,24,157,104,53,151,79,216,248,32,196,130,28,40,2,
+0,0,0,0,214,81,10,224,0,129,134,22,67,196,53,17,55,96,230,122,109,5,12,61,0,0,
+0,0,153,57,128,7,34,254,129,144,24,144,12,116,48,208,160,9,41,21,253,4,0,0,0,
+0,223,128,64,8,8,176,219,196,96,237,118,125,249,29,228,211,133,166,205,5,0,0,
+0,0,12,0,110,186,9,47,96,84,0,30,120,104,34,112,86,158,37,243,142,7,0,0,0,192,
+94,44,188,155,223,93,108,109,4,67,96,54,74,96,216,62,7,196,200,1,0,0,0,160,
+177,197,98,11,12,34,62,204,37,184,1,174,237,92,104,13,148,74,181,0,0,0,0,0,
+244,3,18,17,16,68,2,53,144,235,14,153,7,209,202,5,130,161,160,0,0,0,0,52,24,
+160,137,231,156,91,8,132,3,2,218,144,236,219,135,133,191,162,45,0,0,0,0,118,
+58,118,98,130,148,24,1,24,125,254,141,87,39,19,210,91,55,25,12,0,0,0,0,110,
+139,33,145,0,0,0,64,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,142,120,110,95,63,126,221,61,247,252,155,252,174,
+210,255,143,107,1,0,0,0,192,159,255,234,186,186,93,188,115,159,250,216,214,
+222,37,75,94,151,218,42,1,0,0,0,224,182,153,27,216,116,230,79,21,191,41,230,
+255,38,117,109,227,255,155,82,0,0,0,0,80,96,126,111,153,169,80,14,0,128,16,
+216,35,0,37,16,144,244,235,117,0,0,0,0,208,219,0,160,152,178,123,6,82,32,152,
+22,200,61,9,0,0,1,0,0,0,0,0,0,0,4,40,200,34,0,2,0,0,16,32,130,80,64,48,1,0,16,
+0,4,0,0,0,0,74,4,1,16,20,0,128,0,4,255,253,36,
 };
 
-static const unsigned char big5hkscs_phint_11939[] = {
+static const unsigned char big5hkscs_phint_12130[] = {
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,128,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,
 };
 
-static const unsigned char big5hkscs_phint_21733[] = {
+static const unsigned char big5hkscs_phint_21924[] = {
 0,0,0,0,0,26,172,248,250,90,192,250,51,0,0,0,0,0,129,0,160,156,130,144,9,1,
 180,192,176,3,86,2,160,66,45,136,1,0,0,0,0,146,119,139,96,5,201,33,6,70,56,96,
 72,192,180,36,222,132,224,192,36,0,0,0,0,205,80,197,52,192,40,162,173,124,153,
@@ -485,33 +495,33 @@
 5,72,8,22,230,28,165,0,8,0,0,0,192,45,22,20,128,24,58,212,25,136,28,138,4,
 };
 
-static const DBCHAR __big5hkscs_bmp_encmap[26537] = {
+static const DBCHAR __big5hkscs_bmp_encmap[26401] = {
 50904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34905,34903,N,N,N,N,N,N,
-34909,34907,34918,N,N,N,N,N,N,N,34913,34911,N,N,N,N,N,N,N,N,N,N,N,N,34922,
-34920,N,N,N,N,N,N,34927,34925,34983,N,34931,34929,N,N,N,N,34935,34933,N,N,N,N,
-51451,34939,34937,N,34978,34902,34919,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34906,
-34924,N,N,N,N,N,N,34908,34926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34928,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51452,34910,34932,N,N,N,N,N,
-51450,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34936,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,34904,34921,N,34930,34912,34934,N,34938,N,34940,N,34941,N,
-34942,N,34977,51446,34923,N,N,51448,N,N,N,N,N,N,51447,N,N,N,N,N,34984,N,N,N,N,
-N,N,N,N,51454,N,N,N,N,N,N,N,N,N,N,51449,N,N,N,N,N,N,N,N,N,N,N,N,N,51445,N,N,N,
-N,N,N,51453,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50905,51193,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,51187,51188,51189,51190,51191,51192,51194,51195,51196,51197,
-51198,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,
-51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,
-51289,51290,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,
-51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,
-51316,51317,N,51291,34915,34980,34917,34982,51410,N,N,N,N,N,N,N,N,N,N,51411,N,
+34909,34907,M,N,N,N,N,N,N,N,34913,34911,N,N,N,N,N,N,N,N,N,N,N,N,34922,34920,N,
+N,N,N,N,N,34927,34925,M,N,34931,34929,N,N,N,N,34935,34933,N,N,N,N,51451,34939,
+34937,N,34978,34902,34919,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34906,34924,N,N,N,N,
+N,N,34908,34926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34928,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51452,34910,34932,N,N,N,N,N,51450,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34936,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,34904,34921,N,34930,34912,34934,N,34938,N,34940,N,34941,N,34942,N,34977,
+51446,34923,N,N,51448,N,N,N,N,N,N,51447,N,N,N,N,N,34984,N,N,N,N,N,N,N,N,51454,
+N,N,N,N,N,N,N,N,N,N,51449,N,N,N,N,N,N,N,N,N,N,N,N,N,51445,N,N,N,N,N,N,51453,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50905,51193,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+51187,51188,51189,51190,51191,51192,51194,51195,51196,51197,51198,51264,51265,
+51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,
+51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51292,
+51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,
+51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,N,
+51291,34915,34980,34917,34982,51410,N,N,N,N,N,N,N,N,N,N,51411,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50869,50870,
+50871,50872,50873,50874,50875,50876,50877,50878,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,51319,51320,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51318,50849,50850,50851,
+N,N,N,N,N,N,N,N,51319,51320,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51318,34985,34986,50849,50850,50851,
 50852,50853,50854,50855,50856,50857,50858,N,N,N,N,N,N,N,N,N,N,50859,50860,
 50861,50862,50863,50864,50865,50866,50867,50868,63993,63992,63974,63983,63965,
 63976,63985,63967,63980,63989,63971,63982,63991,63973,63977,63986,63968,63979,
@@ -536,231 +546,235 @@
 51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,
 51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,
 51179,51180,51181,51182,51183,51184,51185,51186,N,N,N,N,N,50915,50906,50907,
-51409,37495,N,N,N,N,N,N,N,N,N,N,38623,N,N,N,N,N,N,N,N,N,N,N,35285,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37837,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39903,N,N,
-N,N,N,N,64104,N,N,35290,36697,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35291,N,
-N,36701,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35292,N,N,N,N,N,N,N,N,N,38647,N,N,N,N,N,N,
-N,N,N,N,N,N,35546,N,N,N,N,35804,N,N,N,N,N,N,38875,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40531,N,N,N,N,40362,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,39914,35438,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35784,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,35304,N,35306,N,N,N,N,N,35915,N,N,N,N,N,N,N,64368,N,N,N,N,N,N,N,N,N,
-N,N,35309,N,N,38109,N,35310,N,N,N,N,40628,35539,N,N,N,N,N,N,N,N,N,N,N,37595,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38107,35321,N,N,N,N,N,N,N,N,64378,N,N,N,
-35323,N,N,N,N,N,N,N,40700,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35324,N,35263,N,N,
-N,35326,N,35302,N,N,40262,N,N,N,40430,N,N,N,41086,N,N,N,41064,N,N,N,N,39145,N,
-35688,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36349,35774,40921,N,N,N,N,N,N,N,
-35563,N,N,40919,35690,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40028,N,35761,N,N,N,N,N,N,N,
-N,64350,N,N,N,N,N,N,N,N,N,40435,N,N,N,N,N,N,N,41168,N,N,N,64614,N,N,N,N,37609,
-N,N,N,N,N,N,N,N,39660,36779,64072,N,N,N,N,36421,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,40047,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40670,N,N,N,N,N,N,
-35311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38633,N,N,N,N,N,N,N,N,N,
-N,40635,N,N,N,N,38110,N,40632,N,N,N,38842,64357,N,N,N,38358,N,N,N,40123,N,N,
-38874,N,N,N,N,36677,N,64381,37208,65124,N,38998,39757,N,N,N,N,N,N,N,N,N,N,
-37723,38343,N,38887,N,N,N,N,N,N,37721,N,N,N,37365,38840,N,N,64930,64438,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,37626,37719,N,35750,N,N,N,N,64441,N,38832,N,N,64964,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,40097,N,N,N,N,N,37362,37369,N,36849,N,N,N,N,N,N,38725,
-38995,N,N,65144,N,64449,37457,N,N,N,N,N,N,40365,N,N,N,N,N,64876,N,N,64107,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39874,N,N,N,N,N,N,N,N,
-N,N,N,N,39547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,35680,N,N,N,N,N,N,N,N,37707,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39613,N,N,N,N,37303,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38324,N,N,N,N,N,65221,
-N,N,40688,36196,N,N,N,N,N,N,N,N,N,37481,N,N,N,N,N,N,36199,N,N,N,N,N,N,N,N,N,N,
-N,N,64490,N,N,N,N,N,N,N,N,64495,N,36200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37867,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,64578,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,37222,N,N,N,N,N,N,N,N,64205,N,N,N,N,37853,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35788,36205,N,N,N,N,N,
-N,N,N,N,N,N,36206,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38568,N,N,N,N,N,N,N,N,N,
-N,64678,N,N,N,N,N,N,N,N,N,N,N,N,36207,N,N,N,N,N,N,N,N,N,N,N,N,N,36208,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64612,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,36960,N,N,N,N,N,N,N,N,36212,38851,N,N,N,N,N,N,N,35536,N,N,N,
-N,N,N,37492,N,39870,N,N,N,N,N,40136,N,N,40122,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,40633,N,N,N,N,N,38234,N,N,37300,N,N,N,N,N,N,35400,N,N,N,N,N,N,N,N,N,N,N,
-36221,N,N,35453,N,N,35522,64842,N,36257,N,N,35537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64692,35655,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37796,40666,N,N,N,N,N,N,N,N,N,
-35409,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36262,N,N,N,N,N,N,40645,N,N,
-N,N,64708,N,N,N,N,41080,N,38069,N,N,N,N,N,N,N,64706,35435,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36267,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36269,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64585,N,37825,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36975,N,36272,N,N,N,N,N,N,N,N,
-38014,37114,N,N,N,N,N,N,N,N,N,N,38009,N,N,N,N,N,N,N,N,36274,N,N,N,N,N,N,N,N,
-64750,N,N,N,N,N,N,N,N,N,N,N,N,N,39291,N,N,N,N,N,N,N,N,36276,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,36279,N,N,N,N,N,N,N,37299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,36283,36282,N,N,N,N,N,N,N,N,36284,36932,N,N,N,64844,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37860,N,N,37856,N,N,N,N,N,N,N,64851,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36291,N,39864,N,N,N,64496,N,37865,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,37878,N,N,N,N,N,36293,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36298,
-N,N,N,N,N,36300,64861,37813,64865,N,N,N,40184,N,N,N,37458,N,N,41192,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35926,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36310,N,38848,N,N,N,41182,N,N,N,N,
-38866,N,N,N,N,N,64165,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64931,N,N,N,36315,36527,N,N,
-N,N,N,N,N,N,N,37301,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64841,N,N,N,N,N,N,
-N,N,64977,N,N,N,N,N,N,N,N,N,N,36331,N,N,N,N,N,38854,N,64974,N,N,37116,N,N,N,N,
-N,N,N,N,N,N,N,N,N,64601,N,N,38614,N,N,N,N,N,N,38853,36335,N,N,N,N,38871,N,N,N,
-N,N,36336,N,N,N,N,N,N,N,38566,N,N,N,N,N,N,N,64447,N,N,N,N,36339,N,N,N,N,37961,
-N,36341,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39026,N,N,N,N,N,N,N,36459,N,N,N,
-N,N,N,64253,N,N,N,N,N,N,N,N,N,N,36688,N,N,N,N,N,N,40396,64613,N,35908,N,N,
-39278,38049,N,N,N,N,N,36707,N,N,N,N,N,N,N,41178,N,N,N,N,N,N,N,N,N,N,N,37459,
-65001,N,N,40373,N,N,N,N,N,N,N,39033,N,N,N,40285,N,N,N,N,36195,38505,40816,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64618,N,N,35527,N,N,N,N,35287,N,N,N,N,N,N,N,N,
-N,N,N,N,65101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40669,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65275,39100,64204,N,N,38320,N,N,N,37988,N,N,N,N,
-N,N,37743,N,N,N,N,N,N,38073,N,N,38380,N,N,N,N,37358,N,N,39107,N,38390,N,N,N,
-36861,39109,N,N,N,N,38758,65134,N,N,38877,36010,N,N,37586,N,N,38753,39115,N,N,
-N,N,38384,N,38749,N,37347,N,N,N,N,39116,N,N,37993,39117,N,N,N,N,N,39118,N,
-38396,N,N,38051,38498,N,N,N,65206,N,37987,N,N,N,N,N,N,N,39120,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39121,N,N,N,N,38005,64224,N,N,N,N,N,
-N,N,N,N,38002,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39126,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35568,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39129,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,39131,N,N,N,N,39133,N,N,N,N,N,N,N,N,39080,N,N,N,N,N,N,N,
-35437,N,N,N,N,N,N,N,N,N,N,N,35579,35502,64457,N,N,N,N,35933,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,39140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,39142,N,N,N,N,N,N,N,N,N,N,N,39144,N,N,N,N,N,N,N,N,N,N,N,N,N,35405,N,N,N,
-37463,N,N,N,N,N,N,N,N,N,N,38367,N,N,41132,N,N,N,N,39147,N,N,N,N,39148,N,36035,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39156,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35512,
-N,N,N,40679,N,N,N,N,N,N,N,N,38076,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64721,N,N,N,N,
-N,N,40134,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40574,39166,
-65000,N,N,N,N,39232,N,N,N,N,38089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,38099,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39238,N,N,N,N,37056,
-N,38097,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37826,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39240,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39243,N,N,N,N,N,36437,N,N,N,N,39246,N,N,N,N,
-N,N,N,N,N,N,N,36606,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36441,N,N,N,N,N,N,N,
-N,N,38124,38127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35936,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36724,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39253,N,N,N,N,N,N,N,N,N,38212,N,N,N,N,N,N,N,N,N,N,N,
-36043,N,N,N,39254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39257,N,N,N,N,N,N,N,39259,
-N,N,N,N,N,N,N,N,N,N,N,N,N,36036,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64069,N,N,
-N,37047,N,N,38723,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38349,N,N,N,N,N,N,38857,
-64848,36537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38342,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35513,N,N,N,N,N,N,36348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35446,N,
-N,N,N,N,40273,N,N,N,N,N,N,N,N,N,N,N,N,N,39283,N,N,N,N,40271,39290,38244,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,39329,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39333,N,N,N,
-N,N,N,N,39335,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+34880,34881,34882,34883,34884,34886,34889,34890,34893,34895,34896,34897,34898,
+34900,34901,51321,51409,37495,N,N,N,N,N,N,N,N,N,N,38623,N,N,N,N,N,N,N,N,N,
+36084,N,35285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37837,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,39903,N,N,N,N,N,N,64104,N,N,35290,36697,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,35291,N,N,36701,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35292,N,N,N,N,N,
+N,N,N,N,38647,N,N,N,N,N,N,N,N,N,N,N,N,35546,N,N,N,N,35804,N,N,N,N,N,N,38875,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40531,N,N,N,N,40362,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,39914,35438,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35784,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35304,N,35306,N,N,N,N,N,35915,N,N,N,N,N,N,
+N,64368,N,N,N,N,N,N,N,N,N,N,N,35309,N,N,38109,N,35310,N,N,N,N,40628,35539,N,N,
+N,N,N,N,N,N,N,N,N,37595,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38107,35321,N,N,N,
+N,N,N,N,N,64378,N,N,N,35323,N,N,N,N,N,N,N,40700,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,35324,N,35263,N,N,N,35326,N,35302,N,N,40262,N,N,N,40430,N,N,N,41086,N,N,N,
+41064,N,N,N,N,39145,N,35688,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36349,35774,
+40921,N,N,N,N,N,N,N,35563,N,N,40919,35690,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40028,N,
+35761,N,N,N,N,N,N,N,N,64350,N,34672,N,N,N,N,N,N,N,40435,N,N,N,N,N,N,N,41168,N,
+N,N,64614,N,N,N,N,37609,N,N,N,N,N,N,N,N,39660,36779,64072,N,N,N,N,36421,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40047,N,36188,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40670,N,N,N,N,N,N,35311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38633,N,N,N,N,N,N,N,N,N,N,40635,N,N,N,N,38110,N,40632,N,N,N,38842,64357,N,
+N,N,38358,N,N,N,40123,N,N,38874,N,N,N,N,36677,N,64381,37208,65124,N,38998,
+39757,N,N,N,N,N,N,N,N,N,N,37723,38343,N,38887,N,N,N,N,N,N,37721,N,N,N,37365,
+38840,N,N,64930,64438,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37626,37719,N,35750,N,N,N,N,
+64441,N,38832,N,N,64964,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40097,N,N,N,N,N,37362,
+37369,N,36849,N,N,N,N,N,N,38725,38995,N,N,65144,N,64449,37457,N,N,N,N,N,N,
+40365,N,N,N,N,N,64876,N,N,64107,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,39874,N,N,N,N,N,N,N,N,N,N,N,N,39547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35680,N,N,N,N,N,N,N,N,37707,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39613,N,N,N,N,37303,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36171,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38324,N,N,N,N,N,65221,N,N,40688,36196,N,N,N,N,N,N,N,N,N,
+37481,N,N,N,N,N,N,36199,N,N,N,N,N,N,N,N,N,N,N,N,64490,N,N,N,N,N,N,N,N,64495,N,
+36200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,37867,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64578,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37222,N,N,N,N,N,N,N,N,
+64205,N,N,N,N,37853,N,N,36178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35788,36205,N,N,N,N,N,N,N,N,N,N,N,36206,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,38568,N,N,N,N,N,N,N,N,N,N,64678,N,N,N,N,N,N,N,N,N,N,N,
+N,36207,N,N,N,N,N,N,N,N,N,N,N,N,N,36208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,64612,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36083,N,N,N,N,N,N,N,36960,N,
+N,N,N,N,N,N,N,36212,38851,N,N,N,N,N,N,N,35536,N,N,N,N,N,N,37492,N,39870,N,N,N,
+N,N,40136,N,N,40122,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36216,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40633,N,N,N,N,N,38234,
+N,N,37300,N,N,N,N,N,N,35400,N,N,N,N,N,N,N,N,N,N,N,36221,N,N,35453,N,N,35522,
+64842,N,36257,N,N,35537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64692,35655,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37796,40666,N,N,N,N,N,N,N,N,N,35409,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36262,N,N,N,N,N,N,40645,N,N,N,N,64708,N,N,N,N,41080,N,
+38069,N,N,N,N,N,N,N,64706,35435,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36267,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36269,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64585,N,37825,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36975,N,36272,N,N,N,N,N,N,N,N,38014,37114,N,N,N,N,N,N,N,N,N,N,
+38009,N,N,N,N,N,N,N,N,36274,N,N,N,N,N,N,N,N,64750,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39291,N,N,N,N,N,N,N,N,36276,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36279,N,
+N,N,N,N,N,N,37299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36283,36282,N,N,N,N,N,N,N,N,
+36284,36932,N,N,N,64844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34635,37860,N,
+N,37856,N,N,N,N,N,N,N,64851,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,36291,N,39864,N,N,N,64496,N,37865,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37878,
+N,N,N,N,N,36293,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36298,N,N,N,N,N,36300,64861,37813,
+64865,N,N,N,40184,N,N,N,37458,N,N,41192,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,36310,N,38848,N,N,N,41182,N,N,N,N,38866,N,N,N,N,N,64165,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64931,N,N,N,36315,36074,36527,N,N,N,N,N,N,N,N,N,37301,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64841,N,N,N,N,N,N,N,N,64977,N,N,N,N,N,N,N,
+N,N,N,36331,N,N,N,N,N,38854,N,64974,N,N,37116,N,N,N,N,N,N,N,N,N,N,N,N,N,64601,
+N,N,38614,N,N,N,N,N,N,38853,36335,N,N,N,N,38871,N,N,N,N,N,36336,N,N,N,N,N,N,N,
+38566,N,N,N,N,N,N,N,64447,N,N,36063,N,36339,N,N,N,N,37961,N,36341,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,39026,N,N,N,N,N,N,N,36459,N,N,N,N,N,N,64253,N,N,N,N,
+N,N,N,N,N,N,36688,N,N,N,N,N,N,40396,64613,N,35908,N,N,39278,38049,N,N,N,N,N,
+36707,N,N,N,N,N,N,N,41178,N,N,N,N,N,N,N,N,N,N,N,37459,65001,N,N,40373,N,N,N,N,
+N,N,N,39033,34666,N,N,40285,N,N,N,N,36195,38505,40816,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64618,N,N,35527,N,N,N,N,35287,N,N,N,N,N,N,N,N,N,N,N,N,65101,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40669,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,65275,39100,64204,N,N,38320,N,N,N,37988,N,N,N,N,N,N,37743,N,N,N,N,N,N,
+38073,N,N,38380,N,N,N,N,37358,N,N,39107,N,38390,N,N,N,36861,39109,N,N,N,N,
+38758,65134,N,N,38877,36010,N,N,37586,N,N,38753,39115,N,N,N,N,38384,N,38749,N,
+37347,N,N,N,N,39116,N,N,37993,39117,N,N,N,N,N,39118,N,38396,N,N,38051,38498,N,
+N,N,65206,N,37987,36167,N,N,N,N,N,N,39120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39121,N,N,N,N,38005,64224,N,N,N,N,N,N,N,N,N,38002,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39126,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,35568,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39129,N,N,N,N,N,N,N,36186,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,39131,N,N,N,N,39133,N,N,N,N,N,N,N,N,39080,N,N,N,N,N,N,N,35437,N,N,N,N,N,
+N,N,N,N,N,N,35579,35502,64457,N,N,N,N,35933,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,39140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39142,N,N,N,N,
+N,N,N,N,N,N,N,39144,N,N,N,N,N,N,N,N,N,N,N,N,N,35405,N,N,N,37463,N,N,N,N,N,N,N,
+N,N,N,38367,N,N,41132,N,N,N,N,39147,N,N,N,N,39148,N,36035,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39156,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35512,N,N,N,40679,N,N,N,N,
+N,N,N,N,38076,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64721,N,N,N,N,N,N,40134,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36170,N,40574,36164,39166,65000,N,N,N,N,
+39232,N,N,N,N,38089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,38099,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39238,N,N,N,N,37056,N,38097,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36174,N,N,38259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37826,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39240,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,39243,N,N,N,N,N,36437,N,N,N,N,39246,N,N,N,N,N,N,N,N,N,
+N,N,36606,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36191,N,36441,N,N,N,N,N,N,N,N,N,
+38124,38127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35936,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36724,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,39253,N,N,N,N,N,N,N,N,N,38212,N,N,N,N,N,N,N,N,N,N,N,36043,
+N,N,N,39254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39257,N,N,N,N,N,N,N,39259,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36036,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64069,N,N,N,
+37047,N,N,38723,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38349,N,N,N,N,N,N,38857,64848,
+36537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38342,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39271,N,N,
+36067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35513,N,N,
+N,N,N,N,36348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35446,N,N,N,N,N,
+40273,N,N,N,N,N,N,N,N,N,N,N,N,N,39283,N,N,34624,N,40271,39290,38244,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39329,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39333,N,N,N,N,N,
+N,N,39335,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36589,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39341,N,N,N,N,N,N,N,N,
+N,N,N,36589,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39341,N,51326,N,N,N,N,N,N,
 N,N,N,N,N,N,N,37998,36720,N,64208,N,N,N,N,N,N,N,N,N,N,N,N,N,39347,N,N,N,N,N,N,
-41043,N,N,N,N,N,N,N,N,38492,N,N,N,N,64890,N,N,N,N,N,N,N,N,38910,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,37565,N,38909,N,N,N,N,36708,N,N,N,N,64759,38242,38861,40548,N,N,
-N,N,N,N,N,37452,36553,39356,N,N,N,N,40357,N,36692,N,N,N,N,N,N,N,N,N,N,36732,N,
-N,N,N,N,N,36514,N,N,N,N,N,N,N,N,N,36730,N,N,N,N,N,N,38830,N,N,N,N,38600,N,N,N,
-N,N,N,N,39363,N,37078,N,40126,N,N,N,36726,N,N,N,N,N,N,N,N,N,N,N,N,N,38000,
-64331,N,N,64970,N,N,N,N,N,N,36551,N,N,N,N,N,41209,N,N,N,N,N,N,N,36777,N,N,N,N,
-N,N,N,N,N,N,N,N,39367,N,N,N,N,N,N,N,N,N,N,N,N,N,37079,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40671,39374,N,N,N,N,N,N,N,N,36794,N,N,N,N,N,36843,N,39375,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36802,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37577,N,N,N,N,N,38876,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38323,40057,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38322,
-36827,N,N,N,N,39907,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40570,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39918,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39390,N,N,N,N,N,N,N,N,N,N,N,N,
-N,64250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40677,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,35410,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39393,N,N,N,N,N,N,35431,35765,N,N,N,N,N,N,N,N,N,N,35500,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39401,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64458,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38878,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38353,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39413,64586,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39849,N,N,N,N,N,N,N,N,N,N,N,N,64476,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65110,N,
-N,N,N,N,40612,N,N,N,N,N,N,40265,38363,N,N,N,N,N,N,N,N,N,N,35269,N,N,N,N,N,N,N,
-N,N,N,N,N,39416,N,N,N,N,N,N,38500,N,N,N,N,36949,N,N,38612,N,N,N,N,N,N,N,38780,
-N,N,N,N,N,N,38477,N,38881,N,N,N,N,N,N,39496,N,N,N,N,N,N,N,N,N,N,N,39497,N,
-65149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37034,N,N,N,N,39504,N,N,N,N,N,N,N,
-37703,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36568,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37065,N,N,N,N,N,39509,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37052,N,N,N,N,N,39512,N,35768,37077,N,N,N,N,N,N,N,N,N,N,N,N,N,38465,N,N,N,N,N,
-N,39514,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39516,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,38850,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35515,N,N,
-N,39850,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37109,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,39520,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37189,35928,N,N,N,N,N,N,N,N,39523,N,N,N,N,N,N,35913,N,N,N,N,N,N,N,N,N,N,N,
-35766,N,N,N,N,N,N,N,N,N,N,64719,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38507,39534,N,
-37199,N,N,N,N,N,N,N,N,38726,N,N,41190,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37591,N,
-38517,N,N,37844,N,N,37307,38521,N,N,N,N,N,39536,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38520,37325,N,40010,41071,N,N,41066,N,N,N,N,N,
-N,37215,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40869,N,N,35258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,40653,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39545,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40398,N,N,N,36050,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40307,N,N,N,N,N,N,N,N,N,38585,N,38588,N,N,N,N,N,N,40145,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35255,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,40686,N,N,N,N,N,N,N,N,N,N,N,64323,40649,N,N,N,N,N,N,64467,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37294,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40312,N,N,N,N,N,N,N,N,N,N,40315,40627,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,40626,N,40406,N,N,N,N,39247,N,N,35278,N,N,N,35776,N,40900,N,35796,
-N,N,35954,N,N,N,N,N,N,50879,35833,N,N,N,N,N,35142,N,50880,N,N,N,N,N,N,N,N,N,
-64229,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51323,35782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40023,N,N,N,N,N,N,N,N,N,N,N,N,N,39675,N,N,N,N,N,N,N,35280,35279,N,N,N,50881,N,
-35281,N,35298,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37502,N,40378,N,N,N,N,N,50882,N,N,
-35951,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64504,N,N,N,35783,37483,N,N,35282,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,40911,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40361,35283,N,N,39394,N,N,N,N,N,N,N,N,N,37479,37540,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35955,N,N,35150,N,N,N,N,N,N,N,N,N,N,N,N,N,35151,37496,N,
-N,N,N,N,N,N,N,37302,N,N,N,N,35284,N,40914,N,N,N,N,N,N,N,N,37543,N,N,38306,N,N,
-N,N,N,37486,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,38634,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37487,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37539,N,N,N,N,N,35152,N,N,64087,N,N,N,N,
-39014,N,N,N,N,N,N,N,N,N,N,N,N,35286,N,N,N,N,N,N,N,N,N,N,39090,N,N,N,37547,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38622,37548,N,N,N,N,N,N,N,N,N,N,
-35952,N,40814,N,N,N,N,N,N,36594,N,N,N,40812,35288,N,N,N,N,64089,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37544,N,N,N,N,N,
-37219,N,N,N,N,N,N,35904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40819,N,37549,N,N,N,N,N,N,N,N,N,N,N,N,N,39913,N,N,N,N,N,37545,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37546,N,N,N,N,N,N,35289,N,N,N,N,N,N,N,64854,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40872,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,35953,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37537,N,N,37091,N,N,N,N,N,N,N,N,41126,
-N,N,N,N,N,38059,N,64626,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38852,N,N,N,N,N,N,
-N,37550,64103,N,N,N,N,N,N,N,N,N,N,N,37538,64105,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37480,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35153,N,N,N,N,N,N,N,N,N,64111,N,N,N,N,N,
-N,N,N,N,64113,N,N,N,N,N,N,N,N,N,35154,N,N,N,N,37978,N,N,N,N,N,N,N,N,50883,N,N,
-N,35293,N,51362,N,N,N,N,N,N,N,N,N,N,N,N,N,50884,N,N,N,40530,N,35155,N,N,N,N,N,
-N,N,N,N,N,40533,37562,N,N,50885,N,N,35931,N,N,N,64125,64168,39528,64071,N,N,
-64126,N,N,N,N,N,N,N,N,N,N,37563,N,N,N,64950,N,64162,N,N,N,N,N,64163,N,64164,
-39860,64166,N,N,N,N,N,N,N,35295,N,N,N,64987,N,N,64169,N,35156,N,N,N,N,N,N,N,N,
-64171,N,N,N,N,N,N,64634,N,N,N,N,N,N,N,35296,N,40783,51325,N,N,35297,N,N,N,N,N,
-64176,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40909,41191,N,N,N,N,N,64177,35238,
-N,N,N,N,N,N,N,N,N,N,N,N,40698,N,N,N,N,N,N,N,64178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,64180,N,37572,N,N,N,N,N,N,40815,N,N,N,N,N,N,N,35760,N,
-N,N,N,N,N,N,N,N,N,40876,N,N,N,N,N,35299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39891,35300,N,N,N,64181,N,N,N,N,N,40917,N,N,N,N,N,N,35157,N,N,37573,N,N,N,
-35158,N,N,N,N,N,N,N,N,N,N,N,N,64179,N,N,N,64182,N,N,N,N,N,N,N,N,N,N,N,64183,N,
-N,N,N,N,N,40668,N,N,N,64452,40817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64186,37575,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50886,39500,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35944,N,N,35301,N,N,N,N,40829,N,N,
-N,N,N,41129,64196,N,N,N,N,50887,N,N,35159,N,N,N,N,N,N,64170,N,N,N,N,N,N,N,N,N,
-N,N,35160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35811,N,35681,N,N,N,N,39665,N,N,40631,N,
+41043,N,N,N,N,N,36190,N,N,38492,N,N,36064,N,64890,N,N,N,N,N,N,N,N,38910,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37565,36189,38909,N,N,N,N,36708,N,N,N,N,64759,38242,
+38861,40548,N,N,N,N,N,N,N,37452,36553,39356,N,N,N,N,40357,N,36692,N,N,N,N,N,N,
+N,N,N,N,36732,N,N,N,N,36181,N,36514,N,N,N,N,N,N,N,N,N,36730,N,N,N,N,N,N,38830,
+N,N,N,N,38600,N,N,36068,N,N,N,N,39363,N,37078,N,40126,N,N,N,36726,N,N,N,N,N,N,
+N,N,N,N,N,N,N,38000,64331,N,N,64970,N,N,36079,N,N,N,36551,N,N,N,N,36180,41209,
+N,N,N,N,N,N,N,36777,N,N,36177,N,N,N,N,N,N,N,N,N,39367,34628,N,N,N,N,N,N,N,N,N,
+N,N,N,37079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+34627,N,N,N,N,N,N,N,N,N,N,N,N,34631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34648,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40671,
+36185,34626,N,N,39374,N,N,N,N,N,N,N,N,36794,N,N,N,N,N,36843,N,39375,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36802,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37577,N,N,N,N,N,38876,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34653,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36165,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38323,40057,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38322,N,
+36172,36827,N,N,N,N,39907,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,34636,N,N,N,N,N,N,N,N,N,N,N,N,N,34637,N,N,N,N,N,N,N,N,N,40570,34647,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,39918,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39390,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35410,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,39393,N,N,N,N,N,N,35431,35765,N,N,N,N,N,N,N,N,N,N,35500,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39401,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64458,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38878,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38353,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39413,64586,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39849,N,N,N,N,N,N,N,N,N,N,N,N,64476,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,65110,N,N,N,N,N,40612,N,N,N,N,N,N,40265,38363,N,N,N,N,N,N,N,N,N,N,35269,
+N,N,N,N,N,N,N,N,N,N,N,N,39416,N,N,N,N,N,N,38500,N,N,N,N,36949,N,N,38612,N,N,N,
+N,N,N,N,38780,N,N,N,N,N,N,38477,N,38881,N,N,N,N,N,N,39496,N,N,N,N,N,N,N,N,N,N,
+N,39497,N,65149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37034,N,N,N,N,39504,N,N,N,N,
+N,N,N,37703,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36568,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37065,N,N,N,N,N,39509,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37052,N,N,N,N,N,39512,N,35768,37077,N,N,N,N,N,N,N,N,N,N,N,N,N,38465,N,N,
+N,N,N,N,39514,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39516,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,38850,N,N,N,N,N,N,N,N,N,N,N,N,N,34652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35515,N,N,N,39850,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37109,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39520,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,37189,35928,N,N,N,N,N,N,N,N,39523,N,N,N,N,N,N,35913,N,N,N,N,N,N,N,N,
+N,N,N,35766,N,N,N,N,N,N,N,N,N,N,64719,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38507,
+39534,N,37199,N,N,N,N,N,N,N,N,38726,N,N,41190,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37591,N,38517,N,N,37844,N,N,37307,38521,N,N,N,N,N,39536,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38520,37325,N,40010,41071,N,N,41066,N,
+N,N,N,N,N,37215,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,34625,N,N,N,N,N,N,N,N,40869,N,N,35258,N,34639,N,N,N,N,N,N,34638,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,34645,N,N,N,40653,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39545,N,N,N,N,N,N,N,N,N,36082,N,N,N,36183,N,40398,N,N,N,36050,N,N,N,34649,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40307,N,N,N,N,N,N,N,N,
+N,38585,N,38588,N,N,N,N,N,N,40145,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35255,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40686,34633,N,N,N,N,N,N,N,N,N,N,
+64323,34651,N,40649,N,N,N,N,N,N,64467,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37294,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,36184,34630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36182,N,N,N,N,N,N,N,
+40312,N,N,N,N,N,N,N,N,N,N,40315,40627,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40626,N,40406,N,N,N,N,39247,N,N,35278,N,N,N,35776,N,40900,N,35796,N,N,35954,
+N,N,N,N,N,N,50879,35833,N,N,N,N,N,35142,N,50880,N,N,N,N,N,N,N,N,N,64229,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,51323,35782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40023,N,N,N,
+N,N,N,N,N,N,N,N,N,N,39675,N,N,N,N,N,N,N,35280,35279,N,N,N,50881,N,35281,N,
+35298,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37502,N,40378,N,N,N,N,N,50882,N,N,35951,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64504,N,N,N,35783,37483,N,N,35282,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,40911,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40361,35283,N,N,39394,N,N,N,N,N,N,N,N,N,37479,37540,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35955,N,N,35150,N,N,N,N,N,N,N,N,N,N,N,N,N,35151,37496,N,N,N,N,N,N,
+N,N,37302,N,N,N,N,35284,N,40914,N,N,N,N,N,N,N,N,37543,N,N,38306,N,N,N,N,N,
+37486,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38634,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37487,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37539,N,N,N,N,N,35152,N,N,64087,N,N,N,N,39014,N,
+N,N,36088,N,N,N,N,N,N,N,N,35286,N,N,N,N,N,N,N,N,N,N,39090,N,N,N,37547,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38622,37548,N,N,N,N,N,N,N,N,N,N,35952,N,
+40814,N,N,N,N,N,N,36594,N,N,N,40812,35288,N,N,N,N,64089,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37544,N,N,N,N,N,37219,N,N,
+N,N,N,N,35904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40819,N,
+37549,N,N,N,N,N,N,N,N,N,N,N,N,N,39913,N,N,N,N,N,37545,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,37546,N,N,N,N,N,N,35289,N,N,N,N,N,N,N,64854,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,40872,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35953,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37537,N,N,37091,N,N,N,N,N,N,N,N,41126,N,N,N,N,
+N,38059,N,64626,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38852,N,N,N,N,N,N,N,37550,
+64103,N,N,N,N,N,N,N,N,N,N,N,37538,64105,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37480,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35153,N,N,N,N,N,N,N,N,N,64111,N,N,N,N,N,N,N,N,N,
+64113,N,N,N,N,N,N,N,N,N,35154,N,N,N,N,37978,N,N,N,N,N,N,N,N,50883,N,N,N,35293,
+N,51362,N,N,N,N,N,N,N,N,N,N,N,N,N,50884,N,N,N,40530,N,35155,N,N,N,N,N,N,N,N,N,
+N,40533,37562,N,N,50885,N,N,35931,N,N,N,64125,64168,39528,64071,N,N,64126,N,N,
+N,N,N,N,N,N,N,N,37563,N,N,N,64950,N,64162,N,N,N,N,N,64163,N,64164,39860,64166,
+N,N,N,N,N,N,N,35295,N,N,N,64987,N,N,64169,N,35156,N,N,N,N,N,N,N,N,64171,N,N,N,
+N,N,N,64634,N,N,N,N,N,N,N,35296,N,40783,51325,N,N,35297,N,N,N,N,N,64176,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40909,41191,N,N,N,N,N,64177,35238,N,N,N,N,N,N,
+N,N,N,N,N,N,40698,N,N,N,N,N,N,N,64178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64180,N,37572,N,N,N,N,N,N,40815,N,N,N,N,N,N,N,35760,N,N,N,N,N,N,N,
+N,N,N,40876,N,N,N,N,N,35299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39891,
+35300,N,N,N,64181,N,N,N,N,N,40917,N,N,N,N,N,N,35157,N,N,37573,N,N,N,35158,N,N,
+N,N,N,N,N,N,N,N,N,N,64179,N,N,N,64182,N,N,N,N,N,N,N,N,N,N,N,64183,N,N,N,N,N,N,
+40668,N,N,N,64452,40817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64186,37575,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50886,39500,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35944,N,N,35301,N,N,N,N,40829,N,N,N,N,N,
+41129,64196,N,N,N,N,50887,N,N,35159,N,N,N,N,N,N,64170,N,N,N,N,N,N,N,N,N,N,N,
+35160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35811,N,35681,N,N,N,N,39665,N,N,40631,N,
 50888,N,N,N,64209,N,N,N,N,N,N,64210,N,N,N,N,N,N,N,N,40634,64212,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,64217,N,N,N,N,N,N,N,N,N,N,N,N,64219,N,40160,N,N,N,
 64503,N,64506,35303,41082,64220,N,N,64221,N,35305,N,N,N,N,N,50889,N,N,N,N,N,N,
@@ -790,17 +804,17 @@
 N,N,N,N,N,N,37472,N,N,N,N,N,N,N,N,N,N,N,37470,37313,N,35525,N,N,38819,N,N,N,N,
 N,N,N,N,N,N,35692,N,36222,N,N,N,N,N,N,N,40020,N,N,N,N,N,40381,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,40133,N,N,N,N,N,N,N,N,N,N,N,35163,N,N,N,N,N,N,N,N,
-N,N,64348,N,64347,N,64343,N,N,N,N,N,N,N,N,N,N,N,39111,64346,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40174,N,N,N,N,N,N,N,37602,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,38055,N,N,N,N,N,N,N,N,N,N,36044,N,39892,N,N,64356,64374,N,N,64352,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39397,N,N,39618,N,N,N,37371,N,N,N,41075,N,N,N,N,N,N,N,
-40818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40908,N,N,N,39077,37608,N,N,N,N,N,N,
-N,N,39868,N,38643,N,N,37607,N,N,64615,N,N,N,N,N,N,N,N,N,N,N,35709,N,N,N,N,
-39924,N,N,N,N,N,40695,N,N,40641,N,N,N,N,N,N,N,N,N,39279,N,N,N,N,N,N,38641,N,N,
-36417,N,N,N,N,N,38218,N,N,N,38886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38645,N,N,N,N,N,
-37606,40770,N,N,N,N,N,N,N,64359,N,N,N,N,N,N,N,N,39337,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64230,64361,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38885,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,38525,N,N,N,64364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39330,N,N,N,N,N,
+N,N,64348,N,64347,N,64343,N,N,N,N,N,N,N,N,N,34661,N,39111,64346,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40174,N,N,N,N,N,N,N,37602,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,38055,N,N,N,N,N,N,N,N,N,N,36044,N,39892,N,N,64356,64374,N,N,
+64352,N,N,N,N,N,N,N,N,N,N,N,N,N,39397,N,N,39618,N,N,N,37371,N,N,N,41075,N,N,N,
+N,N,N,N,40818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40908,N,N,N,39077,37608,N,N,
+N,N,N,N,N,N,39868,N,38643,N,N,37607,N,N,64615,N,N,N,N,N,N,N,N,N,N,N,35709,N,N,
+N,N,39924,N,N,N,N,N,40695,N,N,40641,N,N,N,N,N,N,N,N,N,39279,N,N,N,N,N,N,38641,
+N,N,36417,N,N,N,N,N,38218,N,N,N,38886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38645,N,N,N,
+N,N,37606,40770,N,N,N,N,N,N,N,64359,N,N,N,N,N,N,N,N,39337,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,64230,64361,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38885,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,38525,N,N,N,64364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39330,N,N,N,N,N,
 39611,N,N,N,39525,N,N,37966,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64366,N,N,
 39391,N,N,N,N,N,N,N,N,N,39139,N,N,37460,N,N,N,N,N,38523,35503,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35959,N,N,N,N,N,N,35759,40637,N,N,
@@ -808,405 +822,407 @@
 N,63961,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37610,N,N,N,N,35960,N,N,N,N,N,N,N,N,N,N,
 N,64370,N,N,N,64369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35164,N,39152,38642,N,N,N,N,
 N,N,N,64372,35777,N,35165,35294,N,35166,N,N,50890,N,N,N,N,N,N,65090,N,N,N,N,N,
-N,N,N,N,N,N,N,N,64379,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35167,N,35168,N,N,N,
+N,N,N,N,N,N,34664,N,64379,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35167,N,35168,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39885,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40403,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38988,N,N,N,N,N,N,N,N,N,N,38738,N,N,N,N,N,38339,N,N,N,N,39862,N,
-N,N,N,N,N,N,N,N,N,N,N,39609,N,N,N,38835,N,N,N,N,N,N,40820,37617,N,N,N,N,N,N,N,
-N,N,N,N,38879,N,N,N,N,64422,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64427,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,39031,N,N,N,38996,38341,N,N,N,N,N,N,N,40277,64434,38270,N,
-N,N,N,N,N,N,N,38722,N,38118,N,N,N,N,37621,N,N,N,N,N,N,N,36037,N,N,N,N,N,N,
-37629,N,N,64418,N,N,40017,N,N,38121,39004,37616,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,37964,N,N,N,N,N,N,N,37227,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35704,N,N,N,N,38114,N,
-N,N,N,N,N,N,38991,N,64437,N,N,N,N,37489,N,N,37733,N,N,39003,N,N,38992,N,N,N,N,
-N,N,N,38844,N,N,N,N,37619,N,N,37696,38989,N,N,N,38258,N,65007,N,N,N,N,N,N,N,N,
-64961,N,N,N,N,64442,N,N,37611,N,N,N,N,N,N,64627,38839,N,N,N,N,N,N,N,N,N,64436,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37031,N,N,N,N,N,N,N,N,N,N,38721,
-37620,N,N,N,64444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38263,N,N,N,N,N,N,N,N,N,N,N,
-40674,N,36728,N,N,N,N,N,N,N,63964,N,N,N,38514,40629,N,N,N,38475,N,N,N,36012,N,
-N,N,N,N,N,N,N,N,41210,N,N,N,N,N,N,N,N,N,N,N,38261,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,37082,N,N,37735,N,65188,N,N,N,37087,N,N,N,N,37716,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35169,N,35764,N,N,N,N,40384,N,N,N,N,N,N,36424,N,
-64453,N,N,N,N,N,64455,N,N,N,50891,N,64121,N,N,N,N,N,N,N,N,N,N,N,N,N,40551,N,N,
-N,N,N,36057,N,N,N,N,N,N,64466,35170,35171,N,N,N,N,N,N,N,N,N,N,64637,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40811,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64460,N,65198,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64465,N,N,
-N,N,N,N,N,N,N,N,N,64373,64468,N,N,N,N,N,N,N,N,N,N,N,N,N,64470,64472,N,N,N,N,N,
-N,N,35677,N,37708,N,39650,N,N,35785,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64475,40905,N,N,N,N,N,N,N,N,40772,N,N,N,N,N,N,
-N,N,N,N,39149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,64477,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36338,35172,N,65010,N,
-37709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64487,N,N,N,N,N,N,
-41202,39016,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40792,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36211,N,N,N,64478,N,N,N,N,N,64479,N,N,N,N,N,35912,64483,N,N,N,N,36264,N,
-N,64484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40053,N,N,39032,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,36192,N,N,N,N,N,N,N,64485,N,36193,N,N,N,N,N,N,N,N,N,N,N,N,N,36194,
-41121,N,N,N,40000,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39085,N,N,N,40682,N,
-N,N,N,N,N,36052,N,N,N,N,N,N,N,N,N,40171,N,N,N,N,N,64480,N,N,40785,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36197,N,N,N,N,N,N,40177,N,N,N,N,N,N,N,N,N,N,
-64600,N,N,36198,N,N,N,N,N,N,N,38484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64488,N,N,N,50892,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40910,
-64508,N,39652,N,N,N,N,N,N,40821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,64497,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36201,N,N,N,N,N,37711,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37710,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,64500,N,N,N,N,50894,N,N,N,64451,N,N,35173,N,N,N,N,N,N,N,N,
-N,N,N,35962,N,N,N,N,N,N,35963,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,36202,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37715,N,N,40443,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64509,N,N,N,
-36953,64576,N,64577,64579,37729,64582,37730,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36203,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64588,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,38328,N,N,50896,35786,N,N,N,N,N,N,N,N,N,N,39034,N,N,N,N,
-50897,N,64593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64596,N,N,N,N,N,N,N,N,64175,N,N,N,N,
-N,N,N,36204,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64097,N,N,64599,N,N,N,N,N,N,N,N,N,39792,N,N,N,N,N,N,N,N,41041,N,N,N,N,N,N,N,
-35964,N,35787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37742,N,N,N,64725,
-64681,N,N,N,N,N,N,N,N,N,N,N,N,N,64609,N,N,N,N,N,N,N,N,N,35174,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,64203,N,N,N,N,N,N,N,63962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37754,N,41184,N,N,N,N,N,N,37739,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64619,N,N,N,N,N,41180,N,N,37992,N,
-N,N,N,N,N,N,N,N,N,N,64621,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,36209,N,N,N,N,N,N,64868,N,N,N,N,39354,N,N,N,39632,39521,
-41189,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41051,38572,N,N,N,N,38720,N,N,N,N,
-N,N,N,N,N,N,N,N,40689,N,N,N,N,N,N,N,N,35917,N,N,N,N,N,N,N,N,N,N,N,N,N,40830,N,
-N,N,N,N,N,N,N,N,N,N,N,36210,N,N,N,N,64630,N,N,N,N,N,N,N,N,N,N,N,N,N,38569,N,N,
-N,N,N,N,N,N,41070,N,N,64682,N,N,N,64461,N,N,N,64628,N,N,N,N,N,N,N,N,N,N,41076,
-N,N,N,N,N,N,N,N,N,N,N,N,N,41073,N,N,N,64633,N,N,N,N,N,64636,N,N,N,N,N,N,N,N,N,
-N,N,N,N,40016,N,N,37753,37752,N,N,41181,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,36213,N,36214,N,N,N,N,N,N,37748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36215,64677,N,N,64674,N,N,N,N,N,N,37059,N,N,N,N,N,N,N,41081,36217,N,N,N,N,N,N,
-N,N,N,N,35836,N,41078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35789,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40948,N,N,40890,N,N,N,N,N,N,N,N,N,N,36218,N,N,N,N,N,N,N,N,N,
-N,N,N,40517,N,N,N,N,N,N,37808,N,41077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39750,N,64686,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64688,N,N,N,N,N,N,
-N,N,N,64081,N,N,N,N,N,36219,36220,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40662,N,N,37804,N,N,N,40795,N,37801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41084,N,N,N,N,N,N,N,64690,N,N,N,
-N,N,N,N,N,N,N,N,N,35521,N,N,N,N,N,40884,N,N,N,N,N,N,N,N,N,N,N,64684,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,40524,N,N,N,N,N,N,N,36805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37805,N,N,N,N,N,N,N,
-N,N,N,N,N,40387,N,N,N,36258,N,N,N,40266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64694,N,N,36259,40523,N,40525,36260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35581,N,N,N,N,N,64693,N,64707,37810,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36261,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37793,N,N,N,N,N,N,N,N,N,N,35526,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,35419,N,N,N,35149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,65236,N,N,N,N,35448,N,37803,N,N,N,N,N,N,N,N,N,36263,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40773,N,N,N,N,N,N,N,N,N,35414,N,N,N,64703,N,N,N,
-64704,N,36582,N,N,35492,35139,N,N,N,N,N,N,37875,N,N,N,N,N,N,N,N,N,N,N,N,64683,
-40610,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40391,N,N,N,50898,35790,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64715,N,
-N,N,N,N,N,N,N,N,N,N,37811,N,64714,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,64713,36268,N,64454,35175,N,35966,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64717,N,N,N,N,N,N,N,N,40179,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,64720,N,N,38331,N,N,N,N,N,N,N,N,N,N,N,64723,N,N,
-64724,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36270,64727,N,N,N,
-N,N,37851,N,N,N,N,65123,N,N,N,N,N,N,N,N,N,N,N,N,37845,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,64730,N,N,N,39793,N,N,64733,N,N,N,N,N,N,N,36271,N,N,N,64242,N,N,
-N,N,N,N,N,N,N,N,N,37848,N,N,N,64735,N,N,N,37843,N,N,N,N,N,N,N,64737,N,N,N,N,N,
-N,N,N,N,36470,N,N,N,N,N,N,N,64610,N,N,N,N,N,N,N,N,37841,N,N,N,36273,N,N,N,N,N,
-N,N,39001,N,N,N,N,N,N,N,N,N,64338,N,N,N,N,N,N,N,N,64339,N,N,N,N,N,64333,N,N,
-40127,N,N,N,N,N,N,N,N,39794,N,N,N,N,N,N,N,N,N,N,N,N,N,64336,37822,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40433,64747,N,N,N,N,N,
-N,N,N,N,41147,N,39806,N,N,N,N,N,N,N,36275,N,N,35922,N,N,N,N,39656,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,39885,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40403,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38988,N,N,N,N,N,N,N,N,N,N,38738,N,N,N,N,N,38339,N,N,N,N,
+39862,N,N,N,N,N,N,N,N,N,N,N,N,39609,N,N,N,38835,N,N,N,N,N,N,40820,37617,N,N,N,
+N,N,N,36090,N,N,N,N,38879,N,N,N,N,64422,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64427,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39031,N,N,N,38996,38341,N,N,N,N,N,N,N,40277,
+64434,38270,N,N,N,N,N,N,N,N,38722,N,38118,N,N,N,N,37621,N,N,N,N,N,N,N,36037,N,
+N,N,N,N,N,37629,N,N,64418,N,N,40017,N,N,38121,39004,37616,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,37964,N,N,N,N,N,N,N,37227,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35704,N,N,N,
+N,38114,N,N,N,N,N,N,N,38991,N,64437,N,N,N,N,37489,N,N,37733,N,N,39003,N,N,
+38992,N,N,N,N,N,N,N,38844,N,N,N,N,37619,N,N,37696,38989,N,N,N,38258,N,65007,N,
+N,N,N,N,N,N,N,64961,N,N,N,N,64442,N,N,37611,N,N,N,N,N,N,64627,38839,N,N,34671,
+N,N,N,N,N,N,64436,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37031,N,N,N,N,
+N,N,N,N,N,N,38721,37620,N,34674,N,64444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38263,
+N,N,N,N,N,N,N,N,N,N,N,40674,N,36728,N,N,N,N,N,N,N,63964,N,N,N,38514,40629,N,N,
+N,38475,N,N,N,36012,N,N,N,N,N,N,N,N,N,41210,N,N,N,N,N,N,N,N,N,N,N,38261,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37082,N,N,37735,N,65188,N,N,N,37087,N,N,N,
+N,37716,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35169,N,35764,N,N,N,N,
+40384,N,N,N,N,N,N,36424,N,64453,N,N,N,N,N,64455,N,N,N,50891,N,64121,N,N,N,N,N,
+N,N,N,N,N,N,N,N,40551,N,N,N,N,N,36057,N,N,N,N,N,N,64466,35170,35171,N,N,N,N,N,
+N,N,N,N,N,64637,N,N,N,N,N,N,N,N,N,N,N,N,34675,N,N,N,N,N,N,N,N,N,N,N,40811,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64460,N,65198,N,N,N,34669,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,64465,N,N,N,N,N,N,N,N,N,N,N,64373,64468,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64470,64472,N,N,N,N,N,N,N,35677,N,37708,N,39650,N,N,35785,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64475,40905,
+N,N,N,N,N,N,N,N,40772,N,N,N,N,N,N,N,N,N,N,39149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36073,N,N,N,N,N,N,N,N,N,N,N,N,64477,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,36338,35172,N,65010,N,37709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64487,N,N,N,N,N,N,41202,39016,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40792,N,N,N,36070,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36211,N,N,N,64478,N,N,N,N,N,
+64479,N,N,N,N,N,35912,N,N,N,N,N,N,34676,64483,N,N,N,N,36264,N,N,64484,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40053,N,N,39032,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36192,N,N,N,N,N,N,N,64485,N,36193,N,N,N,N,N,N,N,N,N,N,N,N,N,36194,41121,N,N,N,
+40000,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39085,N,N,N,40682,N,N,N,36076,N,
+N,36052,N,N,N,N,N,N,N,N,N,40171,N,N,N,N,N,64480,N,N,40785,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36197,N,N,N,N,N,N,40177,N,N,N,N,N,N,N,N,N,N,64600,N,N,
+36198,N,N,N,N,N,N,N,38484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64488,N,N,
+N,50892,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40910,64508,N,39652,
+N,N,N,N,N,N,40821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64497,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36201,N,N,N,N,N,37711,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,37710,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,64500,N,N,N,N,50894,N,N,N,64451,N,N,35173,N,N,N,N,N,N,N,N,N,N,N,35962,N,
+N,N,N,N,N,35963,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,36202,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37715,N,N,40443,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64509,N,N,N,36953,64576,N,
+64577,64579,37729,64582,37730,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36203,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64588,36094,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,38328,N,N,50896,35786,N,N,N,N,N,N,N,N,N,N,39034,N,N,N,N,50897,N,
+64593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64596,N,N,N,N,N,N,N,N,64175,N,N,N,N,N,N,N,
+36204,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64097,N,
+N,64599,N,N,N,N,N,N,N,N,N,39792,N,N,N,N,N,N,N,N,41041,N,N,N,N,N,N,N,35964,N,
+35787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37742,N,N,N,64725,64681,N,N,
+N,N,N,N,N,N,N,N,N,N,N,64609,N,N,N,N,N,N,N,N,N,35174,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64203,N,N,N,N,N,N,N,63962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37754,N,41184,N,N,N,N,N,N,37739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64619,N,N,N,N,N,41180,N,N,37992,N,N,N,N,N,N,
+N,N,N,N,N,64621,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,36209,N,N,N,N,N,N,64868,N,N,N,N,39354,N,N,N,39632,39521,41189,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41051,38572,N,N,N,N,38720,N,N,N,N,N,N,N,N,N,N,N,
+N,40689,N,N,N,N,N,N,N,N,35917,N,N,N,N,N,N,N,N,N,N,N,N,N,40830,N,N,N,N,N,N,N,N,
+N,N,N,N,36210,N,N,N,N,64630,N,N,N,N,N,N,N,N,N,N,N,N,N,38569,N,N,N,N,N,N,N,N,
+41070,N,N,64682,N,N,N,64461,N,N,N,64628,N,N,N,N,N,N,N,N,N,N,41076,N,N,N,N,N,N,
+N,N,N,N,N,N,N,41073,N,N,N,64633,N,N,N,N,N,64636,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40016,N,N,37753,37752,N,N,41181,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,36213,N,36214,N,N,N,N,N,N,37748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36215,64677,
+N,N,64674,N,N,N,N,N,N,37059,N,N,N,N,N,N,N,41081,36217,N,N,N,N,N,N,N,N,N,N,
+35836,N,41078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35789,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40948,N,N,40890,N,N,N,N,N,N,N,N,N,N,36218,N,N,N,N,N,N,N,N,N,N,N,N,
+40517,N,N,N,N,N,N,37808,N,41077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39750,N,64686,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64688,N,N,N,N,N,N,N,N,N,
+64081,N,N,N,N,N,36219,36220,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40662,N,
+N,37804,N,N,N,40795,N,37801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41084,N,N,N,N,N,N,N,64690,N,N,N,N,N,N,N,
+N,N,N,N,N,35521,N,N,N,N,N,40884,N,N,N,N,N,N,N,N,N,N,N,64684,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40524,
+N,N,N,N,N,N,N,36805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37805,N,N,N,N,N,N,N,N,N,N,N,
+N,40387,N,N,N,36258,N,N,N,40266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64694,N,N,
+36259,40523,N,40525,36260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35581,N,N,N,N,N,64693,N,64707,37810,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36261,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37793,N,N,N,N,N,N,N,N,N,N,35526,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,35419,N,N,N,35149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,65236,N,N,N,N,35448,N,37803,N,N,N,N,N,N,N,N,N,36263,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,40773,N,N,N,N,N,N,N,N,N,35414,N,N,N,64703,N,N,N,64704,N,36582,
+N,N,35492,35139,N,N,N,N,N,N,37875,N,N,N,N,N,N,N,N,N,N,N,N,64683,40610,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,40391,N,N,N,50898,35790,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,64709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64715,N,N,N,N,N,N,N,N,
+N,N,N,37811,N,64714,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64713,36268,
+N,64454,35175,N,35966,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,64717,N,N,N,N,N,N,N,N,40179,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64720,N,N,38331,N,N,N,N,N,N,N,N,N,N,N,64723,N,N,64724,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36270,64727,N,N,N,N,N,37851,N,N,N,N,
+65123,N,N,N,N,N,N,N,N,N,N,N,N,37845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64730,N,N,N,39793,N,N,64733,N,34660,N,N,N,N,N,36271,N,N,N,64242,N,N,N,N,N,N,N,
+N,N,N,N,37848,N,N,N,64735,N,N,N,37843,N,N,N,N,N,N,N,64737,N,N,N,N,N,N,N,N,N,
+36470,N,N,N,N,N,N,N,64610,N,N,N,N,N,N,N,N,37841,N,N,N,36273,N,N,N,N,N,N,N,
+39001,N,N,N,N,N,N,N,N,N,64338,N,N,N,N,N,N,N,N,64339,N,N,N,N,N,64333,N,N,40127,
+N,N,N,N,N,N,N,N,39794,N,N,N,N,N,N,N,N,N,N,N,N,N,64336,37822,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36059,N,N,N,N,N,N,N,N,N,40433,64747,N,N,N,N,N,N,
+N,N,N,41147,N,39806,N,N,N,N,N,N,N,36275,N,N,35922,N,N,N,N,39656,N,N,N,N,N,N,
 36572,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40185,N,N,N,N,N,N,N,N,N,N,N,N,N,64080,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39143,64755,N,N,N,N,
-64754,N,N,N,36042,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,37861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39513,N,N,N,36277,N,N,N,N,N,N,
-N,64845,N,N,N,N,64862,N,N,N,N,N,N,N,N,N,N,N,N,N,36733,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,38215,64758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37456,N,N,N,N,35176,36278,64763,41085,39164,35177,N,N,N,N,
-N,N,N,N,65103,N,N,37462,N,N,N,N,N,N,N,N,N,N,64201,N,N,37864,N,N,N,64760,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40163,64937,N,N,N,N,N,N,64580,N,N,N,N,N,N,N,N,
-38464,N,N,36280,N,N,N,N,N,N,N,N,N,N,39754,36793,N,N,N,N,N,N,64766,N,N,N,N,N,N,
-N,35178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36281,N,N,
-N,37246,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37876,N,N,N,N,N,N,N,N,N,N,N,N,N,64380,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37863,N,N,38895,N,N,N,65098,N,N,N,N,N,64837,N,
-38565,N,N,N,N,65248,64840,64839,65266,65130,N,N,N,N,N,36285,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,39841,36002,39607,36604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40865,N,N,N,
-N,N,N,N,N,N,64849,N,N,N,N,N,N,N,64173,N,N,N,N,36286,N,N,35236,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39641,N,N,N,N,N,N,N,N,N,N,N,64846,N,N,36288,N,N,38896,N,N,N,N,N,N,
-N,N,N,N,37812,64836,N,N,N,N,N,N,N,N,N,N,N,N,40871,N,N,N,N,36290,N,N,N,N,39350,
-N,N,N,N,N,N,N,N,N,N,N,N,N,64850,N,N,N,N,N,N,36289,N,N,36422,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,41169,N,N,N,N,N,N,N,N,N,N,N,N,N,40906,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37583,N,N,N,40180,36292,N,N,N,N,N,N,N,N,N,N,64833,N,N,N,N,N,N,N,39756,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,64855,64751,40158,N,N,N,N,N,N,N,64834,39020,N,N,N,N,
-N,N,N,N,N,N,N,N,N,38905,N,38232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39006,65147,38093,
-N,N,N,N,N,37870,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36003,N,64858,N,N,N,N,N,N,37877,
-N,N,N,N,N,37871,36586,N,N,N,36699,N,N,N,N,N,N,N,N,N,N,N,35934,N,36294,N,N,N,N,
-N,N,N,N,N,N,N,36296,N,N,36295,N,N,N,N,N,37879,N,N,N,N,N,N,N,36297,N,N,N,N,N,N,
-N,64498,N,N,N,N,38512,N,N,N,N,N,N,N,N,N,36299,N,N,N,64860,N,N,N,N,N,N,N,N,N,
-36709,N,N,N,36301,N,N,N,N,N,40360,38137,N,N,36302,N,N,N,N,N,N,N,N,37866,N,N,N,
-N,N,N,N,N,N,64863,37872,40886,N,N,N,N,N,N,N,N,N,36303,N,N,N,38755,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36304,37873,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,64866,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40923,N,N,N,N,
-37880,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35831,N,N,N,N,64870,N,N,N,
-N,N,35791,N,N,N,N,N,N,36305,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64754,N,N,N,36042,N,N,34677,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,37861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39513,N,N,N,36277,N,N,N,N,
+N,N,N,64845,N,N,N,N,64862,N,N,N,N,N,N,N,N,N,N,N,N,N,36733,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,38215,64758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,37456,N,N,N,N,35176,36278,64763,41085,39164,35177,N,N,
+N,N,N,N,N,N,65103,N,N,37462,N,N,N,N,N,N,N,N,N,N,64201,N,N,37864,N,N,N,64760,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40163,64937,N,N,N,N,N,N,64580,N,N,N,N,N,N,
+N,N,38464,N,N,36280,N,N,N,N,N,N,N,N,N,N,39754,36793,N,N,N,N,N,N,64766,N,N,N,N,
+N,N,N,35178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36281,
+N,N,N,37246,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37876,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64380,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37863,N,N,38895,N,N,N,65098,N,N,N,N,N,
+64837,N,38565,N,N,N,N,65248,64840,64839,65266,65130,N,N,N,N,N,36285,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39841,36002,39607,36604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40865,N,N,N,N,N,N,N,N,N,64849,N,N,N,N,N,N,N,64173,N,N,N,N,36286,N,N,35236,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,39641,N,N,N,N,N,N,N,N,N,N,N,64846,N,N,36288,N,N,38896,
+N,N,N,N,N,N,N,N,N,N,37812,64836,N,N,N,N,N,N,N,N,N,N,N,N,40871,N,N,N,N,36290,N,
+N,N,N,39350,N,N,N,N,N,N,N,N,N,N,N,N,N,64850,N,N,N,N,N,N,36289,N,N,36422,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,41169,N,N,N,N,N,N,N,N,N,N,N,N,N,40906,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,37583,N,N,N,40180,36292,N,N,N,N,N,N,N,N,N,N,64833,N,N,N,N,N,N,
+N,39756,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64855,64751,40158,N,N,N,N,N,N,N,64834,
+39020,N,N,N,N,N,N,N,N,N,N,N,N,N,38905,N,38232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39006,65147,38093,N,N,N,N,N,37870,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36003,N,64858,
+N,N,N,N,N,N,37877,N,N,N,N,N,37871,36586,N,N,N,36699,N,N,N,N,N,N,N,N,N,N,N,
+35934,N,36294,N,N,N,N,N,N,N,N,N,N,N,36296,N,N,36295,N,N,N,N,N,37879,N,N,N,N,N,
+N,N,36297,N,N,N,N,N,N,N,64498,N,N,N,N,38512,N,N,N,N,N,N,N,N,N,36299,N,N,N,
+64860,N,N,N,N,N,N,N,N,N,36709,N,N,N,36301,N,N,N,N,N,40360,38137,N,N,36302,N,N,
+N,N,N,N,N,N,37866,N,N,N,N,N,N,N,N,N,64863,37872,40886,N,N,N,N,N,N,N,N,N,36303,
+N,N,N,38755,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36304,
+37873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64866,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,64869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40923,N,N,N,N,37880,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35831,N,N,N,N,64870,N,N,N,N,N,35791,N,N,N,N,N,N,36305,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,64881,N,N,N,N,64879,N,N,N,N,N,N,N,N,36307,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40935,37053,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40912,N,N,N,35792,N,64882,
+N,40110,35793,N,N,35547,N,N,N,N,N,N,N,N,N,N,N,64228,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,38350,N,64886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64354,N,N,N,N,N,N,36308,
+N,N,N,64888,N,N,N,N,N,36579,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36982,N,N,39110,N,N,N,N,N,N,N,36309,N,N,N,N,38865,N,N,40630,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64199,N,N,41026,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,39027,N,N,N,N,N,N,N,N,N,N,40956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,36005,36311,N,N,37627,36312,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,37967,N,36313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,35179,N,N,N,N,N,N,N,N,38862,N,N,N,64243,64942,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64431,37559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36314,N,N,N,N,N,N,N,N,N,N,N,N,N,40026,N,N,N,N,N,N,64941,N,N,N,N,N,N,N,N,N,N,N,
+N,N,36316,37956,N,N,N,N,N,N,N,N,N,N,N,36317,N,N,N,N,N,N,N,41174,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35905,38869,N,37962,N,N,N,N,N,
+37965,N,N,N,N,38859,N,N,N,N,N,36318,N,N,36319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36320,65273,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,64960,64761,N,N,N,N,N,N,36061,N,64382,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37555,N,N,N,N,N,64943,N,N,N,N,N,N,N,N,N,36321,N,N,N,N,
+38355,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64872,N,N,40119,N,N,36323,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64192,36325,64100,N,35143,N,N,N,N,36324,N,N,N,N,N,36327,
+36328,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64967,64944,N,N,N,N,N,N,37957,38870,N,N,
+N,N,N,N,N,N,N,64710,38980,N,N,N,N,N,N,N,N,N,N,N,N,36329,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,36330,N,N,N,N,N,N,N,N,65104,N,N,N,N,N,N,64972,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40359,N,N,N,N,N,64973,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64975,N,N,N,N,38354,N,N,N,N,N,N,N,36333,N,N,N,N,N,N,N,N,64698,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64965,N,64978,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40156,N,N,N,N,N,38351,N,N,36334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64980,
+N,N,N,N,N,38636,38635,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37046,N,64963,39083,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38638,
+N,N,N,N,N,N,N,N,N,N,N,N,N,36340,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64992,N,35943,N,N,36342,N,N,N,36343,N,N,N,N,N,N,N,36858,N,N,N,N,
+N,N,N,N,N,N,38864,N,N,N,N,35794,N,N,36344,N,N,N,N,N,37081,N,35911,N,64240,N,N,
+N,N,64993,36345,N,64995,N,N,N,N,N,N,N,36346,N,64355,N,N,N,37030,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39280,N,N,37355,N,38768,39023,64994,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39154,N,39676,35180,65021,N,N,39262,N,N,N,38333,N,N,N,N,N,N,N,64996,
+N,N,N,37350,N,N,N,N,64997,64998,N,N,N,N,N,N,N,N,64999,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,37972,N,N,N,39352,N,N,N,N,N,N,N,N,38889,37702,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,39011,N,N,N,N,N,N,N,N,N,N,N,38332,N,65005,65015,N,N,N,
+N,N,N,39024,38646,36521,N,N,N,N,N,37969,N,N,36419,N,35674,N,N,N,N,65006,N,N,N,
+N,65008,N,N,N,N,65012,N,39925,N,N,N,N,N,36078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,38782,N,N,N,N,N,39893,N,39619,N,38856,41179,37328,N,N,40932,N,36829,N,
+37353,N,N,N,N,N,N,N,N,N,39136,N,N,N,37578,N,38999,N,N,35921,N,N,N,N,65003,N,
+39753,N,N,N,N,N,N,N,N,N,40310,40623,N,N,N,N,N,N,N,N,N,40140,N,N,N,N,N,N,65002,
+N,N,36337,N,N,65019,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36435,N,N,N,N,
+N,N,N,N,N,N,N,64207,N,N,N,N,N,N,N,N,N,N,N,N,N,38649,N,N,N,N,N,N,N,N,N,39103,
+40521,36007,N,N,N,N,N,N,N,N,39882,N,N,N,N,65022,37596,N,N,N,N,N,65089,37324,
+37346,N,N,N,N,N,N,N,N,N,N,N,N,65092,34655,N,N,N,N,N,35795,N,N,65095,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,65096,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37973,N,N,N,N,
+65099,N,65100,N,N,N,N,36287,N,N,N,N,N,N,N,N,N,40568,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,65105,N,N,N,N,37974,N,N,N,N,N,N,N,40289,N,N,N,N,
+37975,N,N,N,N,N,N,N,N,N,N,39270,N,N,N,N,N,N,N,N,N,N,N,N,N,35797,N,N,N,N,41065,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39092,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,41033,41036,N,40549,N,N,N,N,N,N,N,N,N,N,N,39093,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65112,N,39285,65107,41061,N,65113,N,N,N,N,
+N,N,N,N,N,39095,39096,N,N,N,N,N,N,N,39098,N,N,N,N,N,N,39099,N,N,N,N,N,N,40892,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41034,N,N,
+40647,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36009,N,N,39086,N,N,N,N,N,
+N,N,N,37590,N,N,N,64225,N,37332,N,N,N,N,N,N,N,N,64222,N,N,65115,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,35923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65118,N,N,N,N,64471,65114,
+38085,N,N,N,N,64202,N,N,N,N,N,N,N,N,N,N,N,39105,38748,N,65140,N,38771,N,N,N,N,
+N,N,N,N,64070,N,N,N,38756,N,N,N,65128,N,38478,N,38757,35930,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,35233,38394,N,37588,65129,N,64325,N,39112,N,N,37103,N,39113,39114,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37997,38071,65132,N,N,37995,N,N,N,
+N,N,N,37628,N,38379,N,65139,38766,65119,N,N,N,N,N,N,N,N,N,64957,N,N,37589,N,N,
+N,N,N,N,65209,N,N,65137,34680,N,N,N,64443,N,N,38010,N,N,38395,65143,N,N,N,N,N,
+N,N,65145,N,65141,N,N,N,37981,N,N,N,N,N,N,N,65148,N,N,N,N,N,N,N,N,N,37700,
+36518,N,N,N,N,N,N,N,N,N,N,N,37587,N,38072,N,34681,N,N,N,N,N,N,64625,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,38750,N,N,N,N,36013,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65191,N,N,
+N,37994,N,N,N,37859,N,N,39119,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41177,N,N,
+N,N,N,N,N,N,41151,41037,41144,N,N,N,N,N,41166,41143,N,N,N,N,N,N,N,N,65193,N,N,
+N,N,N,N,N,N,N,N,35267,N,N,N,N,65195,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40436,35181,N,N,N,N,N,40059,N,N,N,N,N,N,39122,N,N,N,40873,N,N,N,65202,N,N,
+65201,N,N,N,38873,N,41156,N,38006,N,N,N,N,N,N,N,N,N,N,39288,N,N,N,N,N,N,65203,
+N,N,N,N,N,39123,65204,N,N,N,39124,N,N,N,N,N,N,N,40889,N,N,N,N,N,N,N,N,38001,N,
+N,N,N,N,N,N,N,N,39125,65208,N,N,N,50900,N,N,N,N,N,N,N,N,N,N,N,65210,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40540,N,N,65211,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41028,N,
+N,N,N,39127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39128,65212,N,N,N,N,40958,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65213,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40413,N,N,N,N,40673,N,N,N,N,N,N,N,N,N,N,N,N,39130,
+40415,65215,N,65214,N,N,40683,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40537,41052,N,
+N,N,N,N,N,N,65216,N,N,N,38007,39132,N,65217,N,N,N,39134,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,65219,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65224,N,N,N,65225,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65226,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+65227,N,N,N,N,N,N,N,N,N,40898,N,N,35947,39108,N,38064,38065,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,65233,N,N,N,N,N,41153,N,65234,N,N,N,N,41165,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,65235,N,N,39141,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65238,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37348,N,N,N,N,36807,38062,N,
+35407,38066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36820,N,N,N,N,39146,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65240,N,N,N,N,N,N,N,N,N,40416,N,N,
+N,N,39150,N,N,N,N,38340,N,64744,N,N,N,N,N,39151,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,35950,N,N,N,N,N,N,N,N,64216,N,N,N,N,N,N,N,N,N,N,N,N,N,65244,N,N,N,N,N,N,N,
+N,N,41134,40268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39153,N,N,N,39155,N,38081,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39157,N,N,64079,38626,N,N,N,N,
+37968,N,38562,N,N,39158,N,N,N,38629,N,N,N,N,N,39159,N,41030,38627,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40676,N,N,N,
+N,N,N,63958,N,N,N,N,N,N,38083,N,N,N,N,38082,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65249,N,65257,N,N,N,N,38628,N,35244,38619,N,N,
+N,N,N,N,N,N,N,N,N,N,N,65250,N,N,N,N,N,N,N,N,N,N,38084,65251,N,N,N,65255,40955,
+N,N,N,N,N,N,N,N,N,N,N,35929,N,N,N,N,N,N,N,N,N,37833,N,38120,64342,N,N,N,37061,
+41128,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,65253,N,N,N,39165,39163,65256,N,36543,N,N,N,N,35800,65271,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36712,38086,N,N,N,N,N,N,N,N,40426,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,64617,N,N,N,N,N,N,N,N,N,N,N,N,40154,N,65267,N,N,40050,
+N,N,65264,35273,N,N,N,N,N,N,N,N,N,39233,N,N,N,N,N,N,N,39234,N,N,N,65269,N,
+37335,N,N,N,N,N,38092,N,N,N,65272,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,38824,N,65276,N,N,N,36062,N,64959,N,N,N,N,N,N,N,65278,N,N,N,N,N,N,N,N,
+N,N,N,N,N,38609,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38101,N,N,38096,39236,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35939,N,N,41139,N,N,
+N,N,N,N,N,N,N,N,N,N,38095,N,N,N,40954,N,N,N,N,37349,N,40042,N,N,N,36425,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36428,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36429,N,N,N,N,N,39539,N,N,N,N,N,N,N,N,N,N,N,N,N,39239,N,
+36017,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36432,N,N,N,N,N,
+N,N,N,N,N,36431,39241,N,N,N,N,N,36433,36434,N,N,N,N,39602,35237,N,N,N,N,N,
+39244,N,N,N,40952,N,N,N,N,N,N,36438,39245,37322,36439,N,N,N,N,38113,N,N,N,N,
+36935,N,36824,36440,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38123,36444,38227,N,
+N,N,N,N,N,N,40933,N,N,N,N,N,N,N,N,N,N,40790,N,N,N,N,N,N,N,38223,N,36446,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,39274,N,N,N,N,N,N,N,N,40036,40153,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,36445,N,N,N,N,N,N,N,N,N,N,N,N,39248,N,N,N,N,N,N,N,N,N,39249,N,N,
+36450,N,N,N,N,N,N,N,N,N,N,N,39250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36456,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36449,40793,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35763,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40797,36454,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36018,N,N,N,N,N,N,N,N,N,N,N,
+N,N,36462,N,40804,39251,N,N,64184,N,N,N,N,N,39252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36464,N,N,N,N,N,N,N,N,N,N,N,N,40801,N,36466,N,N,N,N,N,N,
+N,N,N,N,N,N,41067,N,N,N,N,40768,N,N,N,N,N,N,38125,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,38126,N,N,40893,N,N,N,36475,N,N,N,N,N,N,39255,38135,N,40799,N,N,N,N,36467,N,
+N,40802,N,N,N,N,N,N,N,38134,N,N,N,N,N,N,N,N,N,N,N,N,N,39256,N,N,N,N,N,N,N,N,N,
+36469,63963,N,N,N,N,36978,N,38136,N,N,N,N,N,N,N,N,N,39258,N,N,N,N,N,N,N,N,N,
+41136,36019,N,N,N,36473,N,36472,N,N,N,38131,N,N,N,N,N,39087,N,N,N,N,N,N,41138,
+N,N,N,N,N,N,N,N,N,N,N,36474,N,N,N,N,N,N,39260,N,N,N,N,N,36476,N,36477,N,N,N,
+35801,N,N,35234,40663,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,41142,N,N,N,N,N,N,N,N,N,N,N,N,40514,N,N,36516,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64881,N,N,N,N,64879,
-N,N,N,N,N,N,N,N,36307,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40935,37053,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40912,N,N,N,35792,N,64882,N,40110,35793,N,N,35547,N,
-N,N,N,N,N,N,N,N,N,N,64228,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38350,N,64886,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,64354,N,N,N,N,N,N,36308,N,N,N,64888,N,N,N,N,N,
-36579,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36982,N,N,
-39110,N,N,N,N,N,N,N,36309,N,N,N,N,38865,N,N,40630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,64199,N,N,41026,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39027,N,N,
-N,N,N,N,N,N,N,N,40956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36005,36311,N,N,
-37627,36312,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37967,N,
-36313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,35179,N,N,N,N,N,N,N,N,38862,N,N,N,64243,64942,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,64431,37559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36314,N,N,N,N,N,N,N,N,N,
-N,N,N,N,40026,N,N,N,N,N,N,64941,N,N,N,N,N,N,N,N,N,N,N,N,N,36316,37956,N,N,N,N,
-N,N,N,N,N,N,N,36317,N,N,N,N,N,N,N,41174,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,35905,38869,N,37962,N,N,N,N,N,37965,N,N,N,N,38859,N,N,N,N,
-N,36318,N,N,36319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36320,65273,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64960,64761,N,N,N,N,N,
-N,N,N,64382,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37555,N,N,
-N,N,N,64943,N,N,N,N,N,N,N,N,N,36321,N,N,N,N,38355,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64872,N,N,40119,N,N,
-36323,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64192,36325,
-64100,N,35143,N,N,N,N,36324,N,N,N,N,N,36327,36328,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64967,64944,N,N,N,N,N,N,37957,38870,N,N,N,N,N,N,N,N,N,64710,38980,N,N,N,N,
-N,N,N,N,N,N,N,N,36329,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36330,N,N,N,N,N,N,N,N,
-65104,N,N,N,N,N,N,64972,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40359,N,N,N,N,N,
-64973,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64975,N,N,N,N,38354,N,N,N,
-N,N,N,N,36333,N,N,N,N,N,N,N,N,64698,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64965,
-N,64978,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40156,N,N,N,N,N,38351,N,N,
-36334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64980,N,N,N,N,N,38636,38635,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37046,N,64963,39083,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38638,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36340,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64992,N,
-35943,N,N,36342,N,N,N,36343,N,N,N,N,N,N,N,36858,N,N,N,N,N,N,N,N,N,N,38864,N,N,
-N,N,35794,N,N,36344,N,N,N,N,N,37081,N,35911,N,64240,N,N,N,N,64993,36345,N,
-64995,N,N,N,N,N,N,N,36346,N,64355,N,N,N,37030,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39280,N,N,37355,N,38768,39023,64994,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39154,N,
-39676,35180,65021,N,N,39262,N,N,N,38333,N,N,N,N,N,N,N,64996,N,N,N,37350,N,N,N,
-N,64997,64998,N,N,N,N,N,N,N,N,64999,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37972,N,
-N,N,39352,N,N,N,N,N,N,N,N,38889,37702,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,39011,N,N,N,N,N,N,N,N,N,N,N,38332,N,65005,65015,N,N,N,N,N,N,39024,38646,
-36521,N,N,N,N,N,37969,N,N,36419,N,35674,N,N,N,N,65006,N,N,N,N,65008,N,N,N,N,
-65012,N,39925,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38782,N,N,N,N,
-N,39893,N,39619,N,38856,41179,37328,N,N,40932,N,36829,N,37353,N,N,N,N,N,N,N,N,
-N,39136,N,N,N,37578,N,38999,N,N,35921,N,N,N,N,65003,N,39753,N,N,N,N,N,N,N,N,N,
-40310,40623,N,N,N,N,N,N,N,N,N,40140,N,N,N,N,N,N,65002,N,N,36337,N,N,65019,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36435,N,N,N,N,N,N,N,N,N,N,N,64207,N,N,
-N,N,N,N,N,N,N,N,N,N,N,38649,N,N,N,N,N,N,N,N,N,39103,40521,36007,N,N,N,N,N,N,N,
-N,39882,N,N,N,N,65022,37596,N,N,N,N,N,65089,37324,37346,N,N,N,N,N,N,N,N,N,N,N,
-N,65092,N,N,N,N,N,N,35795,N,N,65095,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65096,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37973,N,N,N,N,65099,N,65100,N,N,N,N,36287,N,N,N,N,
-N,N,N,N,N,40568,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65105,N,
-N,N,N,37974,N,N,N,N,N,N,N,40289,N,N,N,N,37975,N,N,N,N,N,N,N,N,N,N,39270,N,N,N,
-N,N,N,N,N,N,N,N,N,N,35797,N,N,N,N,41065,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,39092,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41033,41036,N,
-40549,N,N,N,N,N,N,N,N,N,N,N,39093,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,65112,N,39285,65107,41061,N,65113,N,N,N,N,N,N,N,N,N,39095,39096,N,N,N,N,N,N,
-N,39098,N,N,N,N,N,N,39099,N,N,N,N,N,N,40892,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41034,N,N,40647,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,36009,N,N,39086,N,N,N,N,N,N,N,N,37590,N,N,N,64225,N,37332,N,N,
-N,N,N,N,N,N,64222,N,N,65115,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35923,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,65118,N,N,N,N,64471,65114,38085,N,N,N,N,64202,N,N,N,N,N,N,N,N,N,
-N,N,39105,38748,N,65140,N,38771,N,N,N,N,N,N,N,N,64070,N,N,N,38756,N,N,N,65128,
-N,38478,N,38757,35930,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35233,38394,N,37588,65129,N,
-64325,N,39112,N,N,37103,N,39113,39114,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,37997,38071,65132,N,N,37995,N,N,N,N,N,N,37628,N,38379,N,65139,38766,
-65119,N,N,N,N,N,N,N,N,N,64957,N,N,37589,N,N,N,N,N,N,65209,N,N,65137,N,N,N,N,
-64443,N,N,38010,N,N,38395,65143,N,N,N,N,N,N,N,65145,N,65141,N,N,N,37981,N,N,N,
-N,N,N,N,65148,N,N,N,N,N,N,N,N,N,37700,36518,N,N,N,N,N,N,N,N,N,N,N,37587,N,
-38072,N,N,N,N,N,N,N,N,64625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38750,N,N,N,N,36013,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,65191,N,N,N,37994,N,N,N,37859,N,N,39119,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,41177,N,N,N,N,N,N,N,N,41151,41037,41144,N,N,N,N,N,
-41166,41143,N,N,N,N,N,N,N,N,65193,N,N,N,N,N,N,N,N,N,N,35267,N,N,N,N,65195,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40436,35181,N,N,N,N,N,40059,N,N,N,N,N,N,
-39122,N,N,N,40873,N,N,N,65202,N,N,65201,N,N,N,38873,N,41156,N,38006,N,N,N,N,N,
-N,N,N,N,N,39288,N,N,N,N,N,N,65203,N,N,N,N,N,39123,65204,N,N,N,39124,N,N,N,N,N,
-N,N,40889,N,N,N,N,N,N,N,N,38001,N,N,N,N,N,N,N,N,N,39125,65208,N,N,N,50900,N,N,
-N,N,N,N,N,N,N,N,N,65210,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40540,N,N,65211,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,41028,N,N,N,N,39127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,39128,65212,N,N,N,N,40958,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,65213,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40413,N,N,N,N,
-40673,N,N,N,N,N,N,N,N,N,N,N,N,39130,40415,65215,N,65214,N,N,40683,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40537,41052,N,N,N,N,N,N,N,65216,N,N,N,38007,39132,N,
-65217,N,N,N,39134,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65219,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,65224,N,N,N,65225,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65226,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65227,N,N,N,N,N,N,N,N,N,40898,N,N,
-35947,39108,N,38064,38065,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65233,N,N,N,N,N,41153,N,
-65234,N,N,N,N,41165,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65235,N,N,39141,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65238,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,37348,N,N,N,N,36807,38062,N,35407,38066,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,36820,N,N,N,N,39146,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,65240,N,N,N,N,N,N,N,N,N,40416,N,N,N,N,39150,N,N,N,N,38340,N,64744,N,
-N,N,N,N,39151,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35950,N,N,N,N,N,N,N,N,64216,N,
-N,N,N,N,N,N,N,N,N,N,N,N,65244,N,N,N,N,N,N,N,N,N,41134,40268,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39153,N,N,N,39155,N,38081,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39157,N,N,64079,38626,N,N,N,N,37968,N,38562,N,N,39158,N,N,N,38629,
-N,N,N,N,N,39159,N,41030,38627,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39160,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40676,N,N,N,N,N,N,63958,N,N,N,N,N,N,38083,N,N,N,
-N,38082,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-65249,N,65257,N,N,N,N,38628,N,35244,38619,N,N,N,N,N,N,N,N,N,N,N,N,N,65250,N,N,
-N,N,N,N,N,N,N,N,38084,65251,N,N,N,65255,40955,N,N,N,N,N,N,N,N,N,N,N,35929,N,N,
-N,N,N,N,N,N,N,37833,N,38120,64342,N,N,N,37061,41128,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65253,N,N,N,39165,39163,
-65256,N,36543,N,N,N,N,35800,65271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36712,38086,N,N,N,N,N,N,N,N,40426,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64617,
-N,N,N,N,N,N,N,N,N,N,N,N,40154,N,65267,N,N,40050,N,N,65264,35273,N,N,N,N,N,N,N,
-N,N,39233,N,N,N,N,N,N,N,39234,N,N,N,65269,N,37335,N,N,N,N,N,38092,N,N,N,65272,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38824,N,65276,N,N,N,N,N,
-64959,N,N,N,N,N,N,N,65278,N,N,N,N,N,N,N,N,N,N,N,N,N,38609,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,38101,N,N,38096,39236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35939,N,N,41139,N,N,N,N,N,N,N,N,N,N,N,N,38095,N,N,N,
-40954,N,N,N,N,37349,N,40042,N,N,N,36425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,36428,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36429,N,N,
-N,N,N,39539,N,N,N,N,N,N,N,N,N,N,N,N,N,39239,N,36017,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36432,N,N,N,N,N,N,N,N,N,N,36431,39241,N,N,N,N,N,
-36433,36434,N,N,N,N,39602,35237,N,N,N,N,N,39244,N,N,N,40952,N,N,N,N,N,N,36438,
-39245,37322,36439,N,N,N,N,38113,N,N,N,N,36935,N,36824,36440,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,38123,36444,38227,N,N,N,N,N,N,N,40933,N,N,N,N,N,N,N,N,N,N,
-40790,N,N,N,N,N,N,N,38223,N,36446,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39274,N,N,N,N,
-N,N,N,N,40036,40153,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36445,N,N,N,N,N,N,N,N,N,
-N,N,N,39248,N,N,N,N,N,N,N,N,N,39249,N,N,36450,N,N,N,N,N,N,N,N,N,N,N,39250,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36456,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36449,40793,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35763,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,40797,36454,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,36018,N,N,N,N,N,N,N,N,N,N,N,N,N,36462,N,40804,39251,N,N,64184,N,N,
-N,N,N,39252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36464,N,N,N,N,N,
-N,N,N,N,N,N,N,40801,N,36466,N,N,N,N,N,N,N,N,N,N,N,N,41067,N,N,N,N,40768,N,N,N,
-N,N,N,38125,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38126,N,N,40893,N,N,N,36475,N,N,N,N,
-N,N,39255,38135,N,40799,N,N,N,N,36467,N,N,40802,N,N,N,N,N,N,N,38134,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39256,N,N,N,N,N,N,N,N,N,36469,63963,N,N,N,N,36978,N,38136,N,N,
-N,N,N,N,N,N,N,39258,N,N,N,N,N,N,N,N,N,41136,36019,N,N,N,36473,N,36472,N,N,N,
-38131,N,N,N,N,N,39087,N,N,N,N,N,N,41138,N,N,N,N,N,N,N,N,N,N,N,36474,N,N,N,N,N,
-N,39260,N,N,N,N,N,36476,N,36477,N,N,N,35801,N,N,35234,40663,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41142,N,N,N,N,N,N,
-N,N,N,N,N,N,40514,N,N,36516,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36519,N,35958,N,N,N,N,N,N,N,N,N,N,N,38210,
-N,N,N,N,N,N,N,N,N,N,N,N,39037,N,N,N,38741,N,N,36520,N,N,N,N,N,N,N,36522,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35235,N,39264,39266,N,N,38140,
-39265,N,N,N,N,N,N,N,38138,N,N,N,N,N,N,N,36526,36530,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,36528,N,N,N,N,N,N,N,39267,38826,38139,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,36539,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36060,N,N,N,N,N,N,N,N,
-N,39030,N,36513,N,N,N,N,36020,N,36535,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40358,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40624,N,N,N,36536,N,N,N,N,N,N,N,N,N,N,N,N,40304,N,N,
-N,N,35182,N,N,N,N,N,N,N,35183,N,N,N,N,N,N,N,N,N,N,N,N,N,35184,N,N,N,N,N,N,N,N,
-N,N,N,N,35185,N,N,N,N,N,N,N,35186,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35187,35188,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35189,N,N,N,N,N,N,N,N,36540,36541,N,N,N,N,N,36542,N,40401,N,N,
-N,N,38141,N,N,N,35799,35802,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,41186,N,N,N,N,N,N,40937,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64936,N,N,N,35559,N,N,N,36546,N,N,N,N,N,N,N,N,N,N,N,36548,N,N,N,N,N,N,N,N,N,N,
-39268,N,N,N,N,N,39269,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,38222,N,N,N,N,N,N,N,N,N,39091,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,36555,35807,N,N,N,N,N,36558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,36559,N,N,39272,N,N,N,N,39273,N,N,N,N,N,N,N,N,39275,36561,N,39276,N,N,N,N,N,
-N,N,N,N,36564,36565,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39277,N,N,N,
-N,N,N,41150,N,N,N,N,N,36566,41148,41141,N,N,41140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,35253,N,N,N,N,N,N,N,36573,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40541,39281,N,
-N,N,N,35246,40424,N,N,N,N,N,N,N,N,38245,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39282,N,N,35676,N,N,N,N,N,N,N,N,N,35249,41152,N,
-N,N,36575,N,38246,N,N,39284,N,39286,N,N,N,39287,N,39289,N,N,40410,N,N,36576,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37724,N,N,N,N,N,N,N,40422,N,35679,N,N,38243,N,N,N,
-N,N,N,N,N,N,N,38247,N,N,N,N,N,40419,N,N,N,N,N,N,N,N,N,N,N,N,N,39292,N,N,39293,
-39294,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39331,N,N,N,N,N,N,N,39332,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39334,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39336,N,N,N,N,35518,N,N,N,N,N,N,N,N,N,N,N,40545,N,N,N,N,N,N,N,
-N,N,N,39338,N,N,N,N,N,N,41160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,39339,N,N,N,N,N,N,N,N,N,N,65220,N,N,N,N,N,N,39106,36584,N,41146,N,N,N,N,
-N,N,N,N,N,N,N,64887,N,N,36590,N,N,N,40639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39340,N,N,N,N,N,N,N,N,N,N,N,N,
-N,38251,N,N,38252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39343,N,N,39242,35190,36680,
-N,N,N,N,N,N,N,N,N,N,N,64494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,39342,N,N,N,36603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36048,N,N,
-N,N,35666,N,N,N,N,N,39344,N,N,N,N,35191,36673,N,N,N,N,N,N,N,39345,N,N,N,N,N,N,
-N,N,N,36681,N,N,N,N,N,N,N,N,N,N,N,64077,N,N,N,N,N,N,N,N,40420,36021,N,N,N,
-64489,39764,N,39346,40552,N,N,N,N,N,N,N,N,N,N,N,N,36682,N,36674,N,N,36689,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38982,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39348,N,N,N,N,N,N,N,N,N,N,36597,64853,N,N,
-40141,N,N,N,N,N,N,N,N,35192,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36691,N,
-N,N,N,N,N,N,N,N,N,N,36719,N,N,N,N,N,N,N,N,N,N,36451,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,36694,N,N,N,N,N,N,N,N,N,N,N,N,65142,N,N,N,N,40902,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64172,N,N,N,N,N,36696,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38984,39351,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38501,N,64108,N,40423,N,N,N,40546,N,N,
-N,38604,36455,N,N,64629,N,39038,N,N,N,N,N,N,N,64953,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,38908,N,N,N,N,N,N,N,N,N,39161,N,36710,N,N,N,N,N,N,N,N,38254,N,37445,N,N,
-36704,N,N,N,40657,N,N,N,N,N,65229,N,39353,N,N,N,N,N,N,N,N,N,N,N,N,36706,38732,
-N,N,N,N,N,N,N,N,N,N,N,N,37319,38239,N,N,N,N,N,N,N,39355,N,N,N,N,N,N,N,N,N,
-36461,36721,N,N,38091,N,N,N,N,N,N,N,N,N,N,N,N,38321,N,N,N,N,N,N,N,N,N,39666,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,38595,39357,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,41167,N,N,N,36717,N,N,39358,36596,N,36722,38372,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,39359,37442,N,64421,N,N,N,N,N,N,N,N,N,N,39360,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64948,36727,N,N,N,
-39361,N,N,N,N,N,N,N,N,N,64185,N,N,N,N,N,N,N,N,36672,64068,N,N,N,N,N,39362,N,N,
-N,N,N,N,N,36700,N,N,N,N,36029,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39364,39365,N,N,
-36731,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36022,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36046,N,N,N,N,N,N,N,N,
-N,39366,N,N,N,N,N,N,N,N,N,N,N,N,N,38605,N,N,N,N,N,N,N,N,N,N,N,N,N,38599,36773,
-N,N,N,N,N,N,N,N,N,N,64187,N,35937,38256,N,N,N,37736,N,36734,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,36778,N,N,N,N,N,N,41040,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37075,N,N,38230,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,36792,N,N,N,N,N,39368,N,N,N,N,N,N,N,N,N,N,N,36783,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39369,N,N,N,N,N,N,N,N,N,N,N,N,N,38265,N,N,N,N,N,N,N,N,
-N,N,N,N,40777,N,N,N,N,39370,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39371,
-40405,36784,N,N,N,N,N,N,N,N,N,N,N,64122,N,N,N,N,N,N,N,N,40543,N,N,N,N,39373,
-41161,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39643,N,N,N,41158,N,N,N,
-N,N,N,N,36788,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41175,N,N,N,N,N,N,N,N,N,N,N,N,
-41159,N,N,N,N,N,N,N,41027,N,N,N,36789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36786,N,N,N,N,N,N,41057,40542,N,N,N,N,N,N,N,N,N,N,36790,N,N,N,N,N,N,N,N,40936,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,40114,N,N,N,N,N,38268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,40903,N,N,36795,36796,N,N,N,N,N,N,N,N,36844,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36800,N,37738,N,N,N,35812,40060,N,N,N,N,N,N,N,N,38305,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,65260,N,N,38307,N,N,N,N,N,N,N,35909,36024,N,N,N,N,N,N,
-N,N,N,N,N,36801,N,N,N,41042,N,N,N,N,N,N,N,N,N,N,N,N,N,39376,N,N,N,N,N,36803,
-36804,N,N,N,N,N,N,N,N,N,38308,N,N,N,N,N,36806,N,40544,N,N,N,N,N,N,N,63960,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38309,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40115,N,N,N,N,N,N,N,N,N,39377,65265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,39378,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40130,N,N,N,39379,N,N,N,N,N,38311,N,N,N,N,N,N,38313,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,38310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40029,N,N,N,N,N,
-N,N,N,39138,N,N,N,N,N,N,36809,N,41154,36810,N,N,N,N,N,N,39380,N,N,41145,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,39768,N,36813,N,41172,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36814,N,N,N,N,35813,N,N,N,N,35193,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,36816,38326,N,N,N,N,N,N,N,N,N,N,N,N,39382,N,38373,N,
-N,N,N,N,N,N,N,N,N,N,N,39383,N,N,N,N,38325,N,N,N,N,N,N,N,N,N,N,N,41162,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40957,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,41048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36822,N,N,N,
-39384,N,N,N,N,N,N,N,36819,N,N,N,N,N,N,N,N,N,N,N,N,36837,N,N,N,N,N,36841,N,N,N,
-N,39385,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37500,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40005,36830,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36831,N,N,N,N,N,N,N,N,N,N,N,N,N,41035,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,36834,N,N,N,41164,N,N,N,N,N,N,N,N,36835,36836,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39876,N,N,N,39932,N,N,N,N,N,N,38476,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,39670,N,36014,N,N,N,N,N,N,N,N,N,N,N,N,36839,N,N,N,N,N,N,N,N,N,N,36840,
-N,N,N,N,35815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35194,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35195,
-39386,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36519,N,35958,N,N,N,N,N,N,N,N,N,34663,N,38210,N,N,N,N,N,N,N,N,N,N,N,N,39037,N,
+N,N,38741,N,N,36520,N,N,N,N,N,N,N,36522,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35235,N,39264,39266,N,N,38140,39265,N,N,N,N,N,N,N,38138,N,N,N,N,N,
+N,N,36526,36530,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36528,N,N,N,N,N,N,N,39267,38826,
+38139,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36539,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36060,N,N,N,N,N,N,N,N,N,39030,N,36513,N,N,N,N,36020,N,
+36535,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40358,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40624,
+N,N,N,36536,N,N,N,N,N,N,N,N,N,N,N,N,40304,N,N,N,N,35182,N,N,N,N,N,N,N,35183,N,
+N,N,N,N,N,N,N,N,N,N,N,N,35184,N,N,N,N,N,N,N,N,N,N,N,N,35185,N,N,N,N,N,N,N,
+35186,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35187,35188,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35189,N,N,N,
+N,N,N,N,N,36540,36541,N,N,N,N,N,36542,N,40401,N,N,N,N,38141,N,N,N,35799,35802,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41186,N,N,N,N,N,N,
+40937,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64936,N,N,N,35559,N,N,N,
+36546,N,N,N,N,N,N,N,N,N,N,N,36548,N,N,N,N,N,N,N,N,N,N,39268,N,N,N,N,N,39269,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38222,N,N,N,N,N,N,N,N,N,39091,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36555,35807,
+N,N,N,N,N,36558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36559,N,N,39272,N,N,N,
+N,39273,N,N,N,N,N,N,N,N,39275,36561,N,39276,N,N,N,N,N,N,N,N,N,36564,36565,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39277,N,N,N,N,N,N,41150,N,N,N,N,N,
+36566,41148,41141,N,N,41140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35253,N,N,N,
+N,N,N,N,36573,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40541,39281,N,N,N,N,35246,40424,N,N,
+N,N,N,N,N,N,38245,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,39282,N,N,35676,N,N,N,N,N,N,N,N,N,35249,41152,N,N,N,36575,N,38246,N,N,
+39284,N,39286,N,N,N,39287,N,39289,N,N,40410,N,N,36576,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37724,N,N,N,N,N,N,N,40422,N,35679,N,N,38243,N,N,N,N,N,N,N,N,N,N,38247,N,
+N,N,N,N,40419,N,N,N,N,N,N,N,N,N,N,N,N,N,39292,N,N,39293,39294,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,36091,35675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39331,N,N,N,N,N,N,N,
+39332,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39336,N,N,N,N,35518,N,N,N,N,N,N,N,N,N,N,N,40545,N,N,N,N,N,N,N,N,N,N,39338,N,N,
+N,N,N,N,41160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39339,N,N,
+N,N,N,N,N,N,N,N,65220,N,N,N,N,N,N,39106,36584,N,41146,N,N,N,N,N,N,N,N,N,N,N,
+64887,N,N,36590,N,N,N,40639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35266,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39340,N,N,N,N,N,N,N,N,N,N,N,N,N,38251,N,N,38252,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39343,N,N,39242,35190,36680,N,N,N,N,N,N,N,N,N,
+N,N,64494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39342,N,
+N,N,36603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36048,N,N,N,N,35666,N,N,N,N,
+N,39344,N,N,N,N,35191,36673,N,N,N,N,N,N,N,39345,N,N,N,N,N,N,N,N,N,36681,N,N,N,
+N,N,N,N,N,N,N,N,64077,N,N,N,N,N,N,N,N,40420,36021,N,N,N,64489,39764,N,39346,
+40552,N,N,N,N,N,N,N,N,N,N,N,N,36682,N,36674,N,N,36689,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38982,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,39348,N,N,N,N,N,N,N,N,N,N,36597,64853,N,N,40141,N,N,N,N,N,N,N,
+N,35192,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36691,N,N,N,N,N,N,N,N,N,N,N,
+36719,N,N,N,N,N,N,N,N,N,N,36451,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36694,N,N,N,N,N,
+N,N,N,N,N,N,N,65142,N,N,N,N,40902,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64172,N,N,N,N,N,
+36696,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38984,39351,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38501,N,64108,N,40423,N,N,N,40546,N,N,N,38604,36455,N,N,
+64629,N,39038,N,N,N,N,N,N,N,64953,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38908,N,N,N,N,
+N,N,N,N,N,39161,N,36710,N,N,N,N,N,N,N,N,38254,N,37445,N,N,36704,N,N,N,40657,N,
+N,N,N,N,65229,N,39353,N,N,N,N,N,N,N,N,N,N,N,N,36706,38732,N,N,N,N,N,N,N,N,N,N,
+N,N,37319,38239,N,N,N,N,N,N,N,39355,N,N,N,N,N,N,N,N,N,36461,36721,N,N,38091,N,
+N,N,N,N,N,N,N,N,N,N,N,38321,N,N,N,N,N,N,N,N,N,39666,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38595,39357,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41167,N,
+N,N,36717,N,N,39358,36596,N,36722,38372,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39359,37442,N,64421,N,N,N,N,N,N,N,N,N,N,39360,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64948,36727,N,N,N,39361,N,N,N,N,N,N,N,N,N,
+64185,N,N,N,N,N,N,N,N,36672,64068,N,N,N,N,N,39362,N,N,N,N,N,N,N,36700,N,N,N,N,
+36029,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39364,39365,N,N,36731,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34678,N,N,N,36022,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36771,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36046,N,N,N,N,N,N,N,N,N,39366,N,N,N,N,N,N,N,N,
+N,N,N,N,N,38605,N,N,N,N,N,N,N,N,N,N,N,N,N,38599,36773,N,N,N,N,N,N,N,N,N,N,
+64187,N,35937,38256,N,N,N,37736,N,36734,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36778,N,N,N,N,N,N,41040,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37075,N,N,38230,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36845,N,N,N,38336,N,N,N,N,N,N,N,N,N,N,N,N,N,41163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40520,N,N,N,N,N,N,39387,N,36851,N,N,N,N,
-36857,N,N,N,N,N,N,N,N,N,N,N,N,N,38337,N,41038,N,N,N,N,N,N,39388,N,N,N,N,41060,
-36855,N,N,N,N,N,N,N,35248,41032,N,N,N,N,36859,36854,N,N,N,N,N,40412,N,N,N,
-39389,35816,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37569,N,N,N,N,N,N,N,40918,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41170,N,N,36928,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35524,N,N,39392,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40944,40947,N,N,N,N,N,N,N,N,N,N,N,N,40383,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,40950,N,38344,N,N,40538,N,N,N,N,N,N,N,N,N,N,N,N,39395,
-N,N,N,N,N,N,N,N,N,N,N,35402,N,N,N,N,N,N,N,N,40945,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,35495,N,N,N,N,N,N,N,N,39398,N,N,N,40951,N,40941,N,N,N,N,N,
-N,35420,N,40366,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38345,N,N,N,N,N,36936,N,N,39400,N,N,N,N,N,36937,N,N,36026,N,N,
-37041,N,N,N,N,N,N,36938,N,N,N,N,N,N,N,N,N,N,39402,N,N,N,N,N,N,N,N,N,N,N,39889,
-N,N,N,N,N,N,N,39403,N,39404,N,N,N,N,N,N,N,N,39405,N,N,N,N,39406,36940,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36941,N,N,38347,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38882,N,N,N,N,N,N,N,N,38348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40824,N,N,N,N,N,
-N,N,N,N,35196,35197,N,N,N,N,N,N,35198,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39261,N,N,N,N,N,N,N,N,N,N,N,N,39770,N,N,N,N,
-36944,N,35919,N,N,N,N,N,N,N,N,N,N,N,36948,N,50902,39592,39407,65259,40355,
+36792,N,N,N,N,N,39368,N,N,N,N,N,N,N,N,N,N,N,36783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39369,N,N,N,N,N,N,N,N,N,N,N,N,N,38265,N,N,N,N,N,N,N,N,N,N,N,N,40777,
+N,N,N,N,39370,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39371,40405,36784,N,N,
+N,N,N,N,N,N,N,N,N,64122,N,N,N,N,N,N,N,N,40543,N,N,N,N,39373,41161,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39643,N,N,N,41158,N,N,N,N,N,N,N,36788,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,41175,N,N,N,N,N,N,N,N,N,N,N,N,41159,N,N,N,N,N,N,N,
+41027,N,N,N,36789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36786,N,N,N,N,N,N,
+41057,40542,N,N,N,N,N,N,N,N,N,N,36790,N,N,N,N,N,N,N,N,40936,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40114,N,N,N,N,N,38268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40903,
+N,N,36795,36796,N,N,N,N,N,N,N,N,36844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36800,N,
+37738,N,N,N,35812,40060,N,N,N,N,N,N,N,N,38305,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,65260,N,N,38307,N,N,N,N,N,N,N,35909,36024,N,N,N,N,N,N,N,N,N,N,N,
+36801,N,N,N,41042,N,N,N,N,N,N,N,N,N,N,N,N,N,39376,N,N,N,N,N,36803,36804,N,N,N,
+N,N,N,N,N,N,38308,N,N,N,N,N,36806,N,40544,N,N,N,N,N,N,N,63960,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38309,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40115,N,N,N,N,N,
+N,N,N,N,39377,65265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,39378,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40130,N,N,N,39379,N,N,N,N,N,38311,N,N,N,N,N,N,38313,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,38310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40029,N,N,N,N,N,N,N,N,39138,N,N,
+N,N,N,N,36809,N,41154,36810,N,N,N,N,N,N,39380,N,N,41145,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39768,N,36813,N,41172,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36814,N,N,
+N,N,35813,N,N,N,N,35193,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,36816,38326,N,N,N,N,N,N,N,N,N,N,N,N,39382,N,38373,N,N,N,N,N,N,N,N,N,
+N,N,N,39383,N,N,N,N,38325,N,N,N,N,N,N,N,N,N,N,N,41162,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40957,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,41048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36822,N,N,N,39384,N,N,N,N,N,N,N,
+36819,N,N,N,N,N,N,N,N,N,N,N,N,36837,N,N,N,N,N,36841,N,N,N,N,39385,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36087,N,N,N,N,N,N,N,N,N,N,N,N,N,37500,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,40005,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36072,36830,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,36831,N,N,N,N,N,N,N,N,N,N,N,N,N,41035,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36834,N,N,N,41164,N,N,N,N,N,N,N,N,36835,36836,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39876,N,N,N,39932,N,N,N,N,N,N,38476,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,39670,N,36014,N,N,N,N,N,N,N,N,N,N,N,N,36839,N,N,N,N,
+N,N,N,N,N,N,36840,N,N,N,N,35815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35194,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,35195,39386,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36845,N,N,N,38336,N,N,N,N,N,N,N,N,N,N,N,N,N,41163,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40520,N,N,N,N,N,N,39387,N,36851,
+N,N,N,N,36857,N,N,N,N,N,N,N,N,N,N,N,N,N,38337,N,41038,N,N,N,N,N,N,39388,N,N,N,
+N,41060,36855,N,N,N,N,N,N,N,35248,41032,N,N,N,N,36859,36854,N,N,N,N,N,40412,N,
+N,N,39389,35816,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37569,N,N,N,N,N,N,N,40918,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41170,N,N,36928,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35524,N,N,39392,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,40944,40947,N,N,N,N,N,N,N,N,N,N,N,N,40383,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,40950,N,38344,N,N,40538,N,N,N,N,N,N,N,N,N,N,N,N,
+39395,N,N,N,N,N,N,N,N,N,N,N,35402,N,N,N,N,N,N,N,N,40945,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35495,N,N,N,N,N,N,N,N,39398,N,N,N,40951,N,40941,N,N,
+N,N,N,N,35420,N,40366,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,38345,N,N,N,N,N,36936,N,N,39400,N,N,N,N,N,36937,N,N,36026,
+N,N,37041,N,N,N,N,N,N,36938,N,N,N,N,N,N,N,N,N,N,39402,N,N,N,N,N,N,N,N,N,N,N,
+39889,N,N,N,N,N,N,N,39403,N,39404,N,N,N,N,N,N,N,N,39405,N,N,N,N,39406,36940,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36941,N,N,38347,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,38882,N,N,N,N,N,N,N,N,38348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40824,N,N,
+N,N,N,N,N,N,N,35196,35197,N,N,N,N,N,N,35198,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39261,N,N,N,N,N,N,N,N,N,N,N,N,39770,N,N,
+N,N,36944,N,35919,N,N,N,N,N,N,N,N,N,N,N,36948,N,50902,39592,39407,65259,40355,
 40353,39235,39237,N,40317,N,N,39408,N,N,N,N,N,N,N,N,39409,N,39410,N,N,36028,
 40288,N,N,N,N,N,N,N,N,N,41123,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,36955,40667,N,N,N,N,N,N,N,N,N,40313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
@@ -1259,82 +1275,76 @@
 N,N,N,N,37063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37604,40786,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,37083,N,N,N,N,N,41062,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37074,N,N,N,N,37076,N,N,N,N,N,N,N,N,N,39515,38397,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,35780,N,N,N,35942,N,37086,N,N,N,N,N,40164,N,37089,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40518,N,N,N,38481,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64344,N,37094,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38480,N,N,N,37095,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37096,39517,N,40826,N,N,N,39772,N,40828,N,N,64594,37097,N,37098,N,39518,N,
-N,N,N,N,40822,N,N,N,N,N,N,N,N,N,37099,N,N,N,N,N,N,N,N,N,N,N,N,N,37100,N,N,N,N,
-N,35822,N,N,N,N,N,N,N,37102,N,N,N,37318,N,N,37106,64700,35444,N,N,N,N,N,N,N,N,
-N,38487,N,N,N,40175,N,N,N,N,N,N,N,N,N,N,40927,N,N,N,N,37111,37110,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39774,N,N,N,37112,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,37113,N,36041,N,N,N,64106,N,N,N,N,N,N,N,N,35823,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40928,N,N,37186,N,39522,N,N,N,N,N,N,N,N,N,
-38249,N,N,N,37188,37187,N,37185,N,N,N,35824,N,N,N,N,N,N,N,N,N,N,N,N,N,38496,N,
-35825,N,39414,37193,N,N,N,N,37194,N,N,N,N,N,37195,N,N,N,N,39524,N,N,N,35519,
-39526,N,N,N,N,N,N,N,N,N,N,39527,N,N,39529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39530,38482,37197,N,38502,N,N,N,N,40827,N,39531,N,N,N,N,N,N,N,
-41068,N,N,38503,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39532,N,N,N,N,39533,35826,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,38506,N,N,N,N,N,N,N,N,64746,N,N,N,N,N,38508,N,N,N,N,
-N,N,N,N,N,N,N,N,N,37316,N,N,N,38519,N,N,N,N,N,N,N,39412,39535,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,40875,N,N,N,N,N,36030,36545,N,N,N,N,38229,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,37202,37203,N,N,N,37205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38237,N,
-38513,N,N,N,N,40045,N,N,N,N,N,N,N,N,38515,N,N,N,N,N,N,N,N,N,N,N,37204,39537,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37206,N,N,N,38509,N,N,N,N,
-N,N,38231,N,N,N,N,N,N,N,N,35270,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,35434,N,N,N,35671,N,N,N,40929,N,N,39775,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41053,N,N,N,N,N,N,N,N,37211,N,37212,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,37214,N,N,N,N,N,N,N,N,N,N,40796,40791,N,N,N,N,N,N,40805,
-N,N,N,N,N,39538,N,N,N,N,37216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40798,
-N,N,37217,N,N,N,N,N,N,37220,N,N,N,N,40769,N,N,N,N,N,N,37225,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,37224,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39540,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38578,N,39541,N,64933,N,N,N,N,N,N,N,40681,
-N,35770,37229,41056,N,N,N,N,N,N,N,40926,N,N,N,N,N,40899,N,38581,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,41063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,38579,N,N,N,N,N,N,N,N,N,N,N,N,N,39542,N,N,N,N,N,N,N,N,N,N,N,38357,N,N,N,
-40650,N,N,N,39543,N,N,39544,N,N,N,N,N,N,N,N,N,N,37232,37231,N,N,N,N,N,N,N,
-40867,N,37233,N,N,N,38577,N,N,N,N,40803,N,N,N,N,N,40807,N,N,N,35769,39546,N,N,
-N,N,N,35670,N,N,N,N,N,N,N,N,39642,N,N,N,N,N,38576,N,N,N,N,39550,N,N,N,N,N,N,N,
-N,N,N,40414,N,N,N,N,N,N,N,N,N,38573,N,N,N,38574,N,N,N,N,N,N,N,N,N,40609,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40528,N,N,N,N,N,N,N,N,38575,35828,40868,N,N,
-N,N,N,N,N,N,N,38589,N,N,N,N,N,N,N,N,N,38644,N,N,N,N,N,N,N,N,N,N,38584,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,64161,N,N,N,N,37287,N,N,N,N,N,N,N,N,N,N,41054,N,N,
-N,N,39549,N,N,N,N,35144,N,40625,N,N,N,N,N,N,N,N,N,N,N,N,N,40411,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38335,35443,N,N,N,N,N,N,N,N,N,N,N,N,N,40702,N,37242,N,N,N,N,
-37243,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39587,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38594,N,N,N,N,N,40823,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39588,N,N,39589,N,N,N,
-37281,N,N,N,N,35256,N,N,N,N,N,N,N,N,N,N,37235,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39590,35261,N,35257,N,37245,N,N,
-N,N,N,N,N,N,N,38587,N,N,N,40946,N,N,35829,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39593,N,N,
-N,N,N,40788,N,N,40931,40685,N,N,N,N,N,N,N,N,N,N,37290,N,N,N,N,37291,41072,N,
-40813,N,N,N,N,N,37292,N,N,N,37293,N,N,N,41213,N,40930,N,37295,40513,39594,N,N,
-37296,N,39595,N,N,N,N,N,N,N,N,N,N,N,39596,N,39498,N,37298,N,N,35830,N,39597,
-35254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39599,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,39600,N,N,N,N,N,N,39601,N,N,N,N,N,39585,37305,N,N,N,N,N,37306,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41025,35767,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37312,N,N,N,N,N,N,N,N,N,N,39603,37315,N,N,N,N,N,N,
-N,N,N,N,41212,N,N,40942,N,N,N,N,N,N,40809,N,N,N,N,N,N,N,37320,N,N,N,N,N,N,
-37321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36326,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37323,N,N,N,N,N,N,N,N,N,N,35272,N,N,N,N,N,36266,N,N,N,N,N,40925,34880,
-34881,34882,34883,34884,N,34886,N,N,34889,34890,N,N,34893,N,34895,34896,34897,
-34898,N,34900,34901,N,N,N,N,N,N,N,N,N,N,N,N,34914,N,34916,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34979,N,34981,N,N,N,34985,34986,35907,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35949,N,N,N,N,N,N,35956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36023,N,36025,N,36027,N,N,N,N,36032,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,36055,36056,N,36058,51321,N,N,N,N,51326,51361,N,51363,35832,51408,
-N,N,N,N,51407,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50916,N,50917,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37074,N,N,34667,N,37076,N,N,N,N,N,N,N,N,N,39515,38397,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,35780,N,N,N,35942,N,37086,N,N,N,N,N,40164,N,37089,N,N,N,N,N,N,N,N,N,N,N,
+N,N,40518,N,N,N,38481,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64344,N,37094,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38480,N,N,N,37095,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,37096,39517,N,40826,N,N,N,39772,N,40828,N,N,64594,37097,N,37098,N,
+39518,N,N,N,N,N,40822,N,N,N,N,N,N,N,N,N,37099,N,N,N,N,N,N,N,N,N,N,N,N,N,37100,
+N,N,N,N,N,35822,N,N,N,N,N,N,N,37102,N,N,N,37318,N,N,37106,64700,35444,N,N,N,N,
+N,N,N,N,N,38487,N,N,N,40175,N,N,N,N,N,N,N,N,N,N,40927,N,N,N,N,37111,37110,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39774,N,N,N,37112,N,N,N,N,N,N,N,N,N,N,36092,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37113,N,36041,N,N,N,64106,N,N,N,N,N,N,N,N,35823,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40928,N,N,37186,N,39522,N,N,N,N,N,
+N,N,N,N,38249,N,N,N,37188,37187,N,37185,N,N,N,35824,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38496,N,35825,N,39414,37193,N,N,N,N,37194,N,N,N,N,N,37195,N,N,N,N,39524,N,N,N,
+35519,39526,N,N,N,N,N,N,N,N,N,N,39527,N,N,39529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39530,38482,37197,N,38502,N,N,N,N,40827,N,39531,N,N,N,N,
+N,N,N,41068,N,N,38503,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39532,N,N,N,N,39533,35826,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38506,N,N,N,N,N,N,N,N,64746,N,N,N,N,N,38508,N,
+N,N,N,N,N,N,N,N,N,N,N,N,37316,N,N,N,38519,N,N,N,N,N,N,N,39412,39535,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40875,N,N,N,N,N,36030,36545,N,N,N,N,38229,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37202,37203,N,N,N,37205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38237,N,38513,N,N,N,N,40045,N,N,N,N,N,N,N,N,38515,N,N,N,N,N,N,N,N,N,N,N,37204,
+39537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37206,N,N,N,38509,
+N,N,N,N,N,N,38231,N,N,N,N,N,N,N,N,35270,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35434,N,N,N,35671,N,N,N,40929,N,N,39775,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41053,N,N,N,N,N,N,N,N,37211,N,37212,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37214,N,N,N,N,N,N,N,N,N,N,40796,40791,N,N,N,N,N,
+N,40805,N,N,N,N,N,39538,N,N,N,N,37216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40798,N,N,37217,N,N,N,N,N,N,37220,N,N,N,N,40769,N,N,N,N,N,N,37225,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,37224,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38578,N,39541,N,64933,N,N,N,N,
+N,N,N,40681,N,35770,37229,41056,N,N,N,N,N,N,N,40926,N,N,N,N,N,40899,N,38581,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38579,N,N,N,N,N,N,N,N,N,N,N,N,N,39542,N,N,N,N,N,N,N,N,N,N,N,
+38357,N,N,N,40650,N,N,N,39543,N,N,39544,N,N,N,N,N,N,N,N,N,N,37232,37231,N,N,N,
+N,N,N,N,40867,N,37233,N,N,N,38577,N,N,N,N,40803,N,N,N,N,N,40807,N,N,N,35769,
+39546,N,N,N,N,N,35670,N,N,N,N,N,N,N,N,39642,N,N,N,N,N,38576,N,N,N,N,39550,N,N,
+N,N,N,N,N,N,N,N,40414,N,N,N,N,N,N,N,N,N,38573,N,N,N,38574,N,N,N,N,N,N,N,N,N,
+40609,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40528,N,N,N,N,N,N,N,N,38575,
+35828,40868,N,N,N,N,N,N,N,N,N,38589,N,N,N,N,N,N,N,N,N,38644,N,N,N,N,N,N,N,N,N,
+N,38584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64161,N,N,N,N,37287,N,N,N,N,N,N,N,
+N,N,N,41054,N,N,N,N,39549,N,N,N,N,35144,N,40625,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38335,35443,N,N,N,N,N,N,N,N,N,N,N,N,N,40702,
+N,37242,N,N,N,N,37243,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39587,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,38594,N,N,N,N,N,40823,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39588,N,
+N,39589,N,N,N,37281,N,N,N,N,35256,N,N,N,N,N,N,N,N,N,N,37235,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39590,35261,N,
+35257,N,37245,N,N,N,N,N,N,N,N,N,38587,N,N,N,40946,N,N,35829,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,39593,N,N,N,N,N,40788,N,N,40931,40685,N,N,N,N,N,N,N,N,N,N,37290,N,N,N,
+N,37291,41072,N,40813,N,N,N,N,N,37292,N,N,N,37293,N,N,N,41213,N,40930,N,37295,
+40513,39594,N,N,37296,N,39595,N,N,N,N,N,N,N,N,N,N,N,39596,N,39498,N,37298,N,N,
+35830,N,39597,35254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39599,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,39600,N,N,N,N,N,N,39601,N,N,N,N,N,39585,37305,N,N,
+N,N,N,37306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+41025,35767,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37312,N,N,N,N,N,N,N,N,N,N,39603,
+37315,N,N,N,N,N,N,N,N,N,N,41212,N,N,40942,N,N,N,N,N,N,40809,N,N,N,N,N,N,N,
+37320,N,N,N,N,N,N,37321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36326,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37323,N,N,N,N,N,N,N,N,N,N,35272,N,N,N,N,N,36266,N,N,N,N,
+N,40925,35907,35949,35956,36023,36025,36027,36032,36055,36056,36058,51361,
+51363,36077,36168,35832,51408,N,N,N,N,51407,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50916,N,
+50917,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51405,N,
-51406,N,N,N,N,N,N,N,N,63998,
+N,N,N,N,N,N,N,N,N,N,N,51405,N,51406,N,N,N,N,N,N,N,N,63998,
 };
 
 static const struct unim_index big5hkscs_bmp_encmap[256] = {
@@ -1343,65 +1353,66 @@
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+506,190,
-193},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+510,22,231},{0,0,0},{0,0,0},{
-__big5hkscs_bmp_encmap+720,96,125},{__big5hkscs_bmp_encmap+750,80,112},{0,0,0
-},{__big5hkscs_bmp_encmap+783,61,61},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
-0,0,0},{__big5hkscs_bmp_encmap+784,128,227},{__big5hkscs_bmp_encmap+884,51,51
-},{__big5hkscs_bmp_encmap+885,5,254},{0,0,0},{__big5hkscs_bmp_encmap+1135,49,
-49},{0,0,0},{__big5hkscs_bmp_encmap+1136,53,251},{__big5hkscs_bmp_encmap+1335,
-6,254},{__big5hkscs_bmp_encmap+1584,9,245},{__big5hkscs_bmp_encmap+1821,1,251
-},{__big5hkscs_bmp_encmap+2072,15,250},{__big5hkscs_bmp_encmap+2308,8,254},{
-__big5hkscs_bmp_encmap+2555,1,251},{__big5hkscs_bmp_encmap+2806,14,244},{
-__big5hkscs_bmp_encmap+3037,13,239},{__big5hkscs_bmp_encmap+3264,19,253},{
-__big5hkscs_bmp_encmap+3499,6,255},{__big5hkscs_bmp_encmap+3749,0,250},{
-__big5hkscs_bmp_encmap+4000,4,250},{__big5hkscs_bmp_encmap+4247,3,249},{
-__big5hkscs_bmp_encmap+4494,17,252},{__big5hkscs_bmp_encmap+4730,43,242},{
-__big5hkscs_bmp_encmap+4930,1,244},{__big5hkscs_bmp_encmap+5174,3,233},{
-__big5hkscs_bmp_encmap+5405,6,245},{__big5hkscs_bmp_encmap+5645,19,244},{
-__big5hkscs_bmp_encmap+5871,0,250},{__big5hkscs_bmp_encmap+6122,6,231},{
-__big5hkscs_bmp_encmap+6348,15,255},{__big5hkscs_bmp_encmap+6589,16,192},{
-__big5hkscs_bmp_encmap+6766,4,237},{__big5hkscs_bmp_encmap+7000,9,156},{
-__big5hkscs_bmp_encmap+7148,4,248},{__big5hkscs_bmp_encmap+7393,3,253},{
-__big5hkscs_bmp_encmap+7644,3,252},{__big5hkscs_bmp_encmap+7894,1,254},{
-__big5hkscs_bmp_encmap+8148,2,249},{__big5hkscs_bmp_encmap+8396,1,254},{
-__big5hkscs_bmp_encmap+8650,19,239},{__big5hkscs_bmp_encmap+8871,2,251},{
-__big5hkscs_bmp_encmap+9121,5,253},{__big5hkscs_bmp_encmap+9370,0,254},{
-__big5hkscs_bmp_encmap+9625,3,251},{__big5hkscs_bmp_encmap+9874,2,249},{
-__big5hkscs_bmp_encmap+10122,2,254},{__big5hkscs_bmp_encmap+10375,13,255},{
-__big5hkscs_bmp_encmap+10618,5,245},{__big5hkscs_bmp_encmap+10859,16,245},{
-__big5hkscs_bmp_encmap+11089,9,252},{__big5hkscs_bmp_encmap+11333,12,223},{
-__big5hkscs_bmp_encmap+11545,35,253},{__big5hkscs_bmp_encmap+11764,7,226},{
-__big5hkscs_bmp_encmap+11984,44,229},{__big5hkscs_bmp_encmap+12170,24,254},{
-__big5hkscs_bmp_encmap+12401,7,234},{__big5hkscs_bmp_encmap+12629,10,255},{
-__big5hkscs_bmp_encmap+12875,24,241},{__big5hkscs_bmp_encmap+13093,2,254},{
-__big5hkscs_bmp_encmap+13346,0,202},{__big5hkscs_bmp_encmap+13549,0,250},{
-__big5hkscs_bmp_encmap+13800,3,246},{__big5hkscs_bmp_encmap+14044,5,250},{
-__big5hkscs_bmp_encmap+14290,28,255},{__big5hkscs_bmp_encmap+14518,2,254},{
-__big5hkscs_bmp_encmap+14771,2,250},{__big5hkscs_bmp_encmap+15020,4,248},{
-__big5hkscs_bmp_encmap+15265,3,254},{__big5hkscs_bmp_encmap+15517,5,246},{
-__big5hkscs_bmp_encmap+15759,0,226},{__big5hkscs_bmp_encmap+15986,2,251},{
-__big5hkscs_bmp_encmap+16236,2,248},{__big5hkscs_bmp_encmap+16483,5,220},{
-__big5hkscs_bmp_encmap+16699,2,217},{__big5hkscs_bmp_encmap+16915,12,254},{
-__big5hkscs_bmp_encmap+17158,8,245},{__big5hkscs_bmp_encmap+17396,6,244},{
-__big5hkscs_bmp_encmap+17635,6,254},{__big5hkscs_bmp_encmap+17884,11,252},{
-__big5hkscs_bmp_encmap+18126,18,252},{__big5hkscs_bmp_encmap+18361,37,254},{
-__big5hkscs_bmp_encmap+18579,7,223},{__big5hkscs_bmp_encmap+18796,6,250},{
-__big5hkscs_bmp_encmap+19041,2,246},{__big5hkscs_bmp_encmap+19286,3,246},{
-__big5hkscs_bmp_encmap+19530,24,255},{__big5hkscs_bmp_encmap+19762,11,237},{
-__big5hkscs_bmp_encmap+19989,5,248},{__big5hkscs_bmp_encmap+20233,3,252},{
-__big5hkscs_bmp_encmap+20483,2,239},{__big5hkscs_bmp_encmap+20721,112,245},{
-__big5hkscs_bmp_encmap+20855,4,255},{__big5hkscs_bmp_encmap+21107,0,231},{
-__big5hkscs_bmp_encmap+21339,28,234},{__big5hkscs_bmp_encmap+21546,12,226},{
-__big5hkscs_bmp_encmap+21761,81,247},{__big5hkscs_bmp_encmap+21928,3,212},{
-__big5hkscs_bmp_encmap+22138,1,242},{__big5hkscs_bmp_encmap+22380,25,249},{
-__big5hkscs_bmp_encmap+22605,8,196},{__big5hkscs_bmp_encmap+22794,81,254},{
-__big5hkscs_bmp_encmap+22968,8,253},{__big5hkscs_bmp_encmap+23214,3,244},{
-__big5hkscs_bmp_encmap+23456,1,246},{__big5hkscs_bmp_encmap+23702,45,244},{
-__big5hkscs_bmp_encmap+23902,29,244},{__big5hkscs_bmp_encmap+24118,3,245},{
-__big5hkscs_bmp_encmap+24361,20,245},{__big5hkscs_bmp_encmap+24587,14,245},{
-__big5hkscs_bmp_encmap+24819,12,255},{__big5hkscs_bmp_encmap+25063,2,255},{
-__big5hkscs_bmp_encmap+25317,2,124},{__big5hkscs_bmp_encmap+25440,2,252},{
-__big5hkscs_bmp_encmap+25691,10,254},{__big5hkscs_bmp_encmap+25936,2,165},{0,
+193},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+510,22,231},{0,0,0},{
+__big5hkscs_bmp_encmap+720,218,219},{__big5hkscs_bmp_encmap+722,96,125},{
+__big5hkscs_bmp_encmap+752,80,112},{0,0,0},{__big5hkscs_bmp_encmap+785,61,61},
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+786,
+128,227},{__big5hkscs_bmp_encmap+886,51,51},{__big5hkscs_bmp_encmap+887,5,254
+},{__big5hkscs_bmp_encmap+1137,192,207},{__big5hkscs_bmp_encmap+1153,49,49},{
+0,0,0},{__big5hkscs_bmp_encmap+1154,53,251},{__big5hkscs_bmp_encmap+1353,6,254
+},{__big5hkscs_bmp_encmap+1602,9,245},{__big5hkscs_bmp_encmap+1839,1,251},{
+__big5hkscs_bmp_encmap+2090,15,250},{__big5hkscs_bmp_encmap+2326,8,254},{
+__big5hkscs_bmp_encmap+2573,1,251},{__big5hkscs_bmp_encmap+2824,14,244},{
+__big5hkscs_bmp_encmap+3055,13,239},{__big5hkscs_bmp_encmap+3282,18,253},{
+__big5hkscs_bmp_encmap+3518,6,255},{__big5hkscs_bmp_encmap+3768,0,250},{
+__big5hkscs_bmp_encmap+4019,4,250},{__big5hkscs_bmp_encmap+4266,2,249},{
+__big5hkscs_bmp_encmap+4514,17,252},{__big5hkscs_bmp_encmap+4750,43,242},{
+__big5hkscs_bmp_encmap+4950,1,244},{__big5hkscs_bmp_encmap+5194,3,234},{
+__big5hkscs_bmp_encmap+5426,3,247},{__big5hkscs_bmp_encmap+5671,19,244},{
+__big5hkscs_bmp_encmap+5897,0,250},{__big5hkscs_bmp_encmap+6148,6,231},{
+__big5hkscs_bmp_encmap+6374,15,255},{__big5hkscs_bmp_encmap+6615,16,192},{
+__big5hkscs_bmp_encmap+6792,4,237},{__big5hkscs_bmp_encmap+7026,7,156},{
+__big5hkscs_bmp_encmap+7176,4,248},{__big5hkscs_bmp_encmap+7421,3,253},{
+__big5hkscs_bmp_encmap+7672,3,252},{__big5hkscs_bmp_encmap+7922,1,254},{
+__big5hkscs_bmp_encmap+8176,2,249},{__big5hkscs_bmp_encmap+8424,1,254},{
+__big5hkscs_bmp_encmap+8678,19,239},{__big5hkscs_bmp_encmap+8899,2,251},{
+__big5hkscs_bmp_encmap+9149,5,253},{__big5hkscs_bmp_encmap+9398,0,254},{
+__big5hkscs_bmp_encmap+9653,3,251},{__big5hkscs_bmp_encmap+9902,2,249},{
+__big5hkscs_bmp_encmap+10150,2,254},{__big5hkscs_bmp_encmap+10403,13,255},{
+__big5hkscs_bmp_encmap+10646,5,252},{__big5hkscs_bmp_encmap+10894,16,245},{
+__big5hkscs_bmp_encmap+11124,9,252},{__big5hkscs_bmp_encmap+11368,12,223},{
+__big5hkscs_bmp_encmap+11580,35,253},{__big5hkscs_bmp_encmap+11799,7,226},{
+__big5hkscs_bmp_encmap+12019,44,229},{__big5hkscs_bmp_encmap+12205,24,254},{
+__big5hkscs_bmp_encmap+12436,7,234},{__big5hkscs_bmp_encmap+12664,10,255},{
+__big5hkscs_bmp_encmap+12910,24,241},{__big5hkscs_bmp_encmap+13128,2,254},{
+__big5hkscs_bmp_encmap+13381,0,202},{__big5hkscs_bmp_encmap+13584,0,250},{
+__big5hkscs_bmp_encmap+13835,3,246},{__big5hkscs_bmp_encmap+14079,5,250},{
+__big5hkscs_bmp_encmap+14325,28,255},{__big5hkscs_bmp_encmap+14553,2,254},{
+__big5hkscs_bmp_encmap+14806,2,250},{__big5hkscs_bmp_encmap+15055,4,248},{
+__big5hkscs_bmp_encmap+15300,3,254},{__big5hkscs_bmp_encmap+15552,5,246},{
+__big5hkscs_bmp_encmap+15794,0,226},{__big5hkscs_bmp_encmap+16021,2,251},{
+__big5hkscs_bmp_encmap+16271,2,248},{__big5hkscs_bmp_encmap+16518,5,220},{
+__big5hkscs_bmp_encmap+16734,2,217},{__big5hkscs_bmp_encmap+16950,12,254},{
+__big5hkscs_bmp_encmap+17193,8,245},{__big5hkscs_bmp_encmap+17431,6,244},{
+__big5hkscs_bmp_encmap+17670,6,254},{__big5hkscs_bmp_encmap+17919,11,252},{
+__big5hkscs_bmp_encmap+18161,18,252},{__big5hkscs_bmp_encmap+18396,37,254},{
+__big5hkscs_bmp_encmap+18614,7,223},{__big5hkscs_bmp_encmap+18831,6,250},{
+__big5hkscs_bmp_encmap+19076,2,246},{__big5hkscs_bmp_encmap+19321,3,246},{
+__big5hkscs_bmp_encmap+19565,24,255},{__big5hkscs_bmp_encmap+19797,11,237},{
+__big5hkscs_bmp_encmap+20024,5,248},{__big5hkscs_bmp_encmap+20268,3,252},{
+__big5hkscs_bmp_encmap+20518,2,239},{__big5hkscs_bmp_encmap+20756,112,245},{
+__big5hkscs_bmp_encmap+20890,4,255},{__big5hkscs_bmp_encmap+21142,0,231},{
+__big5hkscs_bmp_encmap+21374,28,249},{__big5hkscs_bmp_encmap+21596,12,226},{
+__big5hkscs_bmp_encmap+21811,81,247},{__big5hkscs_bmp_encmap+21978,3,212},{
+__big5hkscs_bmp_encmap+22188,1,242},{__big5hkscs_bmp_encmap+22430,25,249},{
+__big5hkscs_bmp_encmap+22655,8,196},{__big5hkscs_bmp_encmap+22844,81,254},{
+__big5hkscs_bmp_encmap+23018,8,253},{__big5hkscs_bmp_encmap+23264,3,244},{
+__big5hkscs_bmp_encmap+23506,1,246},{__big5hkscs_bmp_encmap+23752,45,244},{
+__big5hkscs_bmp_encmap+23952,29,244},{__big5hkscs_bmp_encmap+24168,3,245},{
+__big5hkscs_bmp_encmap+24411,20,245},{__big5hkscs_bmp_encmap+24637,14,245},{
+__big5hkscs_bmp_encmap+24869,12,255},{__big5hkscs_bmp_encmap+25113,2,255},{
+__big5hkscs_bmp_encmap+25367,2,124},{__big5hkscs_bmp_encmap+25490,2,252},{
+__big5hkscs_bmp_encmap+25741,10,254},{__big5hkscs_bmp_encmap+25986,2,179},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
@@ -1410,13 +1421,12 @@
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
-},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+26100,3,75},
-{0,0,0},{__big5hkscs_bmp_encmap+26173,122,239},{0,0,0},{__big5hkscs_bmp_encmap
-+26291,229,237},{0,0,0},{__big5hkscs_bmp_encmap+26300,7,7},{0,0,0},{0,0,0},{0,
-0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+26301,2,237},
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{__big5hkscs_bmp_encmap+26164,7,7},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{__big5hkscs_bmp_encmap+26165,2,237},
 };
 
-static const DBCHAR __big5hkscs_nonbmp_encmap[28325] = {
+static const DBCHAR __big5hkscs_nonbmp_encmap[29306] = {
 40049,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37749,N,N,N,N,N,
 N,N,37750,N,N,N,N,N,N,N,38216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,36550,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35781,35834,
@@ -1427,34 +1437,34 @@
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35501,N,37490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64583,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38111,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,40913,64459,N,N,N,N,N,N,N,37501,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36085,N,N,N,N,35501,N,37490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,64583,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38111,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40913,64459,N,N,N,N,N,N,N,37501,N,N,N,N,N,N,N,
 39076,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38119,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37067,37499,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38104,N,N,N,N,64607,N,64084,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39605,N,N,N,N,N,N,N,38618,37497,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64116,
-37493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36347,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35401,N,N,N,37599,39804,64099,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,64096,37485,64098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39606,N,N,N,N,N,N,38763,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64874,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64852,N,37491,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38872,N,N,N,N,N,
-N,40891,37698,37494,N,N,N,N,N,N,N,N,N,N,64101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,64110,N,N,N,N,N,N,40672,N,N,37568,37567,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,37566,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39610,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35507,N,38773,64064,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64118,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,64464,N,N,N,N,N,N,N,N,N,N,N,N,N,64123,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,65133,N,N,N,N,N,N,39859,N,N,N,N,N,35276,N,N,N,N,39614,N,N,N,N,N,N,
-N,N,N,64066,37564,N,N,N,N,N,N,N,N,N,N,37980,39861,N,N,N,39615,N,N,N,39079,
+36089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38119,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37067,37499,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38104,N,N,N,N,64607,N,
+64084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39605,N,N,N,N,N,N,N,38618,
+37497,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64116,37493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36347,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35401,N,N,N,37599,39804,64099,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,64096,37485,64098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39606,N,N,N,N,N,N,38763,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64874,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64852,N,37491,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38872,N,N,N,N,
+N,N,40891,37698,37494,N,N,N,N,N,N,N,N,N,N,64101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,64110,N,N,N,N,N,N,40672,N,N,37568,37567,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37566,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39610,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35507,N,38773,64064,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64118,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,64464,N,N,N,N,N,N,N,N,N,N,N,N,N,64123,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,65133,N,N,N,N,N,N,39859,N,N,N,N,N,35276,N,N,N,N,39614,N,N,N,N,N,
+N,N,N,N,64066,37564,N,N,N,N,N,N,N,N,N,N,37980,39861,N,N,N,39615,N,N,N,39079,
 38820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37117,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64635,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39616,37571,N,N,N,N,N,N,N,N,N,N,N,N,N,
@@ -1473,38 +1483,38 @@
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35250,40038,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36947,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,35938,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38849,N,N,N,N,N,N,N,N,N,N,N,N,N,39620,N,N,N,N,N,N,N,N,N,N,39621,36591,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38849,N,N,N,N,N,N,N,N,N,N,N,N,N,39620,N,N,N,N,N,N,N,N,N,N,39621,36591,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,64233,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37474,
-35575,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39622,N,N,N,N,N,N,37601,N,N,N,
-N,39625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64198,N,N,N,N,N,N,N,N,
-38821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39627,N,N,N,64114,35422,N,38112,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37580,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35557,N,
-N,N,N,N,65116,39628,N,N,N,N,N,40441,35395,35494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,64238,39884,N,N,N,39631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39633,N,N,N,N,N,N,N,
-N,40442,N,N,N,N,N,40316,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39635,
-N,N,38822,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39263,N,N,N,64502,40901,
-35417,35691,N,N,N,N,N,N,39636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39637,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,38818,35396,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40778,N,
-N,N,N,N,N,N,N,37025,64932,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35428,35570,
-35576,40408,N,N,38102,64254,64423,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,39638,N,40781,N,N,64246,N,N,N,N,N,N,N,35415,N,35651,35652,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35510,N,N,N,N,N,35520,N,N,N,N,N,N,
-N,N,N,N,40532,N,N,N,N,N,N,N,N,N,N,39639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39640,39644,N,N,N,N,35530,40616,N,N,37475,39645,35685,35695,35710,N,N,N,N,
-36675,N,N,N,N,N,N,37584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35572,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40382,N,N,N,N,N,39649,N,64734,40445,35686,35696,
-35701,35556,35748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35565,N,N,N,N,N,N,N,N,N,
-35421,N,35656,N,N,N,N,40429,N,N,N,N,40512,N,N,N,N,N,N,N,35567,35574,40566,N,N,
-N,N,N,N,N,N,N,40675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,39646,36350,N,N,N,N,64252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,40113,40567,35684,35687,38731,N,N,N,N,N,N,N,N,38483,N,N,N,N,N,N,39648,
+N,N,N,N,N,N,N,N,N,N,64233,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36160,N,N,N,N,N,N,N,N,
+37474,35575,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39622,N,N,N,N,N,N,37601,
+N,N,N,N,39625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64198,N,N,N,N,N,N,N,
+N,38821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39627,N,N,N,64114,35422,N,38112,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37580,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35557,
+N,N,N,N,N,65116,39628,N,N,N,N,N,40441,35395,35494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,39629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,64238,39884,N,N,N,39631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39633,N,N,N,N,N,N,
+N,N,40442,N,N,N,N,N,40316,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39635,N,N,38822,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39263,N,N,N,64502,
+40901,35417,35691,N,N,N,N,N,N,39636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39637,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38818,35396,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40778,N,N,N,N,N,N,N,N,37025,64932,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35428,
+35570,35576,40408,N,N,38102,64254,64423,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,39638,N,40781,N,N,64246,N,N,N,N,N,N,N,35415,N,35651,
+35652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35510,N,N,N,N,N,35520,N,N,N,
+N,N,N,N,N,N,N,40532,N,N,N,N,N,N,N,N,N,N,39639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39640,39644,N,N,N,N,35530,40616,N,N,37475,39645,35685,35695,35710,N,
+N,N,N,36675,N,N,N,N,N,N,37584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35572,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40382,N,N,N,N,N,39649,N,64734,40445,35686,
+35696,35701,35556,35748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35565,N,N,N,N,N,N,N,N,
+N,35421,N,35656,N,N,N,N,40429,N,N,N,N,40512,N,N,N,N,N,N,N,35567,35574,40566,N,
+N,N,N,N,N,N,N,N,40675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,39646,36350,N,N,N,N,64252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,40113,40567,35684,35687,38731,N,N,N,N,N,N,N,N,38483,N,N,N,N,N,N,39648,
 35658,N,35569,35543,N,N,N,N,N,N,N,N,N,41131,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 35509,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35423,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35566,N,N,39647,N,
@@ -1574,151 +1584,152 @@
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64076,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37623,39744,N,N,N,N,N,N,64462,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39745,N,N,N,N,N,65197,64469,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,39745,N,N,N,N,N,65197,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,34657,64469,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35778,39548,39746,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39747,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35778,39548,39746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,40569,N,N,64473,N,N,N,N,N,N,39748,41127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39747,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40569,N,N,64473,N,N,
+N,N,N,N,39748,41127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34670,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35961,N,N,N,37726,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,35275,N,N,N,N,N,N,40787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37847,N,N,N,N,N,N,N,N,N,N,N,N,N,64481,65232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,64482,N,N,N,N,N,64739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,39923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,35961,N,N,N,37726,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35275,N,N,N,N,
+N,N,40787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37847,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64481,65232,N,N,N,N,N,N,36081,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,64482,N,N,N,N,N,64739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36980,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,64486,N,N,N,39863,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,39749,N,N,N,N,N,N,N,N,N,N,N,N,39751,40784,N,N,N,N,N,39752,
+N,N,N,N,N,N,N,N,N,N,36980,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64486,N,N,N,39863,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,39749,N,N,N,N,N,N,N,N,N,N,N,N,39751,40784,N,N,N,N,N,39752,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64603,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,64603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39081,N,N,40189,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,39081,N,N,40189,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34892,39755,N,N,N,64492,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,35945,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39848,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35541,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64115,64857,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37282,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64493,N,N,N,N,N,N,40105,N,
+N,N,N,N,N,N,N,N,N,N,N,N,34892,39755,N,N,N,64492,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35496,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39875,
-35553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35945,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39848,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35541,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64115,64857,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37282,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64493,N,N,N,N,N,N,40105,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35496,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36162,N,39875,35553,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,39758,38352,N,N,N,36959,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39758,38352,N,
+N,N,36959,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,38894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64590,N,N,N,N,N,N,
-39759,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39760,40646,N,N,N,N,N,N,N,N,N,N,N,64592,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,64883,N,N,N,N,N,64935,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40354,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64088,64094,N,
-N,N,N,N,N,N,41049,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64117,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64446,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,37744,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37745,37751,65263,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,37741,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64605,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,35580,N,64321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40555,38115,36578,35965,N,36567,
-N,N,N,N,N,N,40013,N,N,N,38563,N,N,N,N,N,N,N,N,N,N,39761,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35523,N,N,N,N,N,N,N,N,N,N,N,
-38570,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,64616,35693,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,64871,35561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64673,37740,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65136,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,64680,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64745,40116,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,35562,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39763,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39765,N,N,N,38571,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64679,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39766,35516,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35531,N,N,N,N,
-N,39767,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35277,N,39769,39771,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37797,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39773,N,N,N,40527,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37795,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35451,N,N,N,35650,
-38736,36787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35408,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,39776,N,N,N,N,35653,N,N,N,35654,N,N,N,N,N,N,N,N,N,N,N,N,40446,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39778,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37755,N,N,N,N,N,37809,N,N,N,N,N,N,N,35424,N,N,
-N,N,N,N,N,N,35544,N,N,N,N,39779,N,N,N,N,N,N,N,N,N,N,35433,N,N,N,35399,N,N,
-35532,37756,39781,N,N,N,N,N,N,N,N,N,39782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35442,N,N,N,N,N,
-N,N,35450,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37807,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35504,N,N,N,N,
-N,N,N,39784,N,N,N,N,N,N,N,N,N,N,40611,N,N,64236,35703,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,39783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35673,64689,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64699,N,N,N,N,N,
-N,N,N,N,N,N,39785,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37800,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,35552,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36703,39786,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,39787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38892,39788,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65102,N,N,N,N,N,N,64962,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,39789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37223,64716,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37814,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37092,N,N,N,N,37093,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40690,37834,N,N,N,N,N,N,N,N,
+38894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64590,N,N,N,N,N,N,39759,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39760,40646,N,N,N,N,N,
+N,N,N,N,N,N,64592,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64883,N,N,
+N,N,N,64935,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40354,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,35772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64088,64094,N,N,N,N,N,N,N,41049,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64446,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36678,N,N,N,N,37839,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,64731,64732,N,N,N,N,N,N,N,N,N,N,N,N,N,37824,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,64742,38631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64728,64729,64934,37838,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,38385,N,N,N,N,N,N,N,N,N,40169,N,64740,38063,64119,
-37836,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,36954,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,35924,N,N,N,N,N,N,N,37823,64337,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37817,65239,37815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37849,N,N,N,N,N,N,N,N,N,N,N,N,N,37819,
-37850,39075,N,N,N,N,N,N,N,N,N,37073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39790,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64112,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39915,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,39791,N,N,N,N,N,N,N,64764,N,N,N,N,N,N,N,N,N,N,N,N,N,35648,41083,N,N,N,
-36001,38903,N,N,N,37858,64726,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38233,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37798,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,64832,N,N,37727,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38898,40054,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,36600,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,36679,N,N,N,N,N,N,N,N,N,N,N,N,39796,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37556,
-N,N,N,37357,N,N,38610,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64838,36687,38217,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39797,64092,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,64843,N,N,N,38611,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,64856,N,N,N,N,N,37983,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,41205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37443,N,N,N,N,N,N,38906,N,N,N,N,N,N,N,N,N,N,N,N,
+40098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37744,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37745,37751,65263,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37741,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64605,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,37048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35580,N,
+64321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40555,38115,36578,35965,N,36567,N,N,N,N,N,N,
+40013,N,N,N,38563,N,N,N,N,N,N,N,N,N,N,39761,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35523,N,N,N,N,N,N,N,N,N,N,N,38570,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,64616,35693,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64871,35561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64673,37740,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,39762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65136,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,64680,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64745,40116,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,35562,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39763,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39765,N,N,N,38571,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,64679,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39766,35516,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35531,N,N,N,N,N,39767,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35277,N,39769,39771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37797,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39773,N,N,
+N,40527,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37795,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35451,N,N,N,35650,38736,36787,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35408,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39776,N,N,N,N,35653,N,N,N,35654,N,N,N,N,N,N,N,N,N,N,N,N,40446,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39778,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37755,N,N,N,N,N,37809,N,N,N,N,N,N,N,35424,N,N,N,N,N,N,N,
+N,35544,N,N,N,N,39779,N,N,N,N,N,N,N,N,N,N,35433,N,N,N,35399,N,N,35532,37756,
+39781,N,N,N,N,N,N,N,N,N,39782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35442,N,N,N,N,N,N,N,35450,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37807,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35504,N,N,N,N,N,N,N,39784,
+N,N,N,N,N,N,N,N,N,N,40611,N,N,64236,35703,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35673,64689,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64699,N,N,N,N,N,N,N,N,N,N,N,
+39785,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37800,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35552,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,40529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36703,39786,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,39787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38892,39788,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,65102,N,N,N,N,N,N,64962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37223,
+64716,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37814,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37092,N,N,N,N,37093,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40690,37834,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,35772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36678,N,N,
+N,N,37839,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64731,64732,N,N,N,N,N,N,N,N,N,N,N,N,N,37824,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,64742,38631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64728,64729,64934,37838,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38385,N,N,N,N,N,N,N,N,N,40169,N,64740,38063,64119,37836,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36065,N,N,N,N,N,
+N,N,N,N,N,N,36954,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35924,N,N,N,N,N,N,N,37823,64337,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37817,65239,37815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37849,N,N,N,N,N,N,N,N,N,N,N,N,N,37819,37850,
+39075,N,N,N,N,N,N,N,N,N,37073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39790,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64112,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39915,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39791,N,N,N,N,N,N,N,64764,N,N,N,N,N,N,N,N,N,N,N,N,N,35648,41083,N,N,N,36001,
+38903,N,N,N,37858,64726,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38233,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37798,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,64832,N,N,37727,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38898,40054,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,36600,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36075,N,N,N,N,N,N,N,N,36679,N,N,N,N,N,N,N,N,N,N,N,N,39796,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37556,N,
+N,N,37357,N,N,38610,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64838,36687,38217,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39797,64092,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,34641,N,N,39801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64843,N,N,N,38611,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,64856,N,N,N,N,N,37983,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,41205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37443,N,N,N,N,N,N,38906,N,N,N,N,N,N,N,N,N,N,N,N,
 40409,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 38900,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37453,64859,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,39802,N,N,N,N,N,N,N,N,N,40661,N,N,N,N,N,N,N,N,N,N,N,N,64174,N,40137,N,N,N,
@@ -1729,418 +1740,442 @@
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37868,38902,38607,37854,35535,39842,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,64873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37714,N,N,N,N,N,N,
-N,N,N,N,N,39074,64878,36004,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64124,37882,36988,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36711,N,40375,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,41193,64078,64929,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40564,40895,40651,39865,
-40404,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38841,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36593,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38267,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40658,38739,38564,36798,38105,36952,64889,64891,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36570,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36602,39845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40665,38868,37051,64956,64966,37448,N,N,N,N,N,N,N,37557,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40385,
-37561,37542,36683,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39846,N,N,N,N,N,37558,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,36416,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40664,37982,39007,38094,37450,64880,37991,N,N,N,N,N,N,N,N,N,N,N,
-36332,N,N,N,N,N,N,N,N,39896,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37960,64193,40183,64958,
-N,N,N,N,N,N,N,N,N,N,N,N,36826,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,64985,N,N,64638,N,N,N,N,N,N,N,N,37881,N,N,N,N,64067,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64235,
-64195,38867,38393,40008,64984,41176,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64983,64330,39855,37963,64969,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36524,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64946,N,N,N,N,N,37466,
-64701,37593,N,N,N,64981,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37597,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37465,38586,N,N,N,N,N,N,N,N,N,N,37467,N,N,N,N,N,
-N,N,N,N,39851,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,64986,64990,N,N,N,64979,N,N,N,N,N,N,N,N,N,35910,N,N,N,N,N,N,64982,
-64988,64989,N,N,N,N,37118,N,N,65185,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,35757,N,N,40152,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40557,64892,64353,N,N,N,N,N,N,38648,N,N,N,N,N,N,N,N,
-38640,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64756,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,65120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38994,38479,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37230,N,N,N,N,N,N,N,N,N,N,39021,N,N,39012,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37971,65004,64376,N,N,N,N,N,N,
-N,N,N,N,N,38330,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39005,N,37625,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,39002,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65014,N,
-N,N,N,N,N,N,37840,39010,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39853,N,N,N,N,N,N,N,N,N,N,N,38735,39854,N,N,N,N,N,N,N,N,N,N,N,
-N,37970,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39856,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37330,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,38890,64363,37297,65011,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37579,N,N,N,N,N,N,N,N,N,39857,N,N,N,N,N,64748,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39019,N,N,N,38737,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-39025,38383,N,N,N,N,N,N,N,40691,N,N,N,N,N,37352,39866,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64332,
-37482,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-65016,39009,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37351,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,37869,38724,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37345,N,N,64501,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,39017,N,N,N,N,35426,N,N,39867,36008,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40021,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36471,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35506,
-40636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37862,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39074,36071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64878,
+36004,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64124,37882,36988,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36711,N,40375,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41193,
+64078,64929,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40564,40895,40651,39865,40404,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38841,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38267,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40658,38739,38564,36798,38105,36952,64889,64891,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36570,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36602,34658,N,N,N,N,N,N,N,N,N,N,39845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,40665,38868,37051,64956,64966,37448,N,N,N,N,N,N,N,
+37557,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,40385,37561,37542,36683,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39846,N,N,N,N,N,37558,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36416,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,40664,37982,39007,38094,37450,64880,37991,N,N,N,N,N,N,N,
+N,N,N,N,36332,N,N,N,N,N,N,N,N,39896,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,34659,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37960,64193,
+40183,64958,N,N,N,N,N,N,N,N,N,N,N,N,36826,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64985,N,N,64638,N,N,N,N,N,N,N,N,37881,N,N,
+N,N,64067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,64235,64195,38867,38393,40008,64984,41176,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64983,64330,39855,37963,64969,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36524,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64946,N,N,
+N,N,N,37466,64701,37593,N,N,N,64981,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37597,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37465,N,N,N,N,N,N,N,N,N,N,36080,
+38586,N,N,N,N,N,N,N,N,N,N,37467,N,N,N,N,N,N,N,N,N,39851,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64986,64990,N,N,N,64979,N,
+N,N,N,N,N,N,N,N,35910,N,N,N,N,N,N,64982,64988,64989,N,N,N,N,37118,N,N,65185,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35757,N,N,40152,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40557,64892,
+64353,N,N,N,N,N,N,38648,N,N,N,N,N,N,N,N,38640,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64756,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65120,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38994,38479,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37230,N,N,N,
+N,N,N,N,N,N,N,39021,N,N,39012,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,37971,65004,64376,N,N,N,N,N,N,N,N,N,N,N,38330,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,39005,N,37625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39002,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,34640,N,65014,N,N,N,N,N,N,N,37840,39010,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39853,N,N,N,N,N,N,N,
+N,N,N,N,38735,39854,N,N,N,N,N,N,N,N,N,N,N,N,37970,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39856,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37330,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38890,64363,37297,65011,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37579,N,N,N,
+N,N,N,N,N,N,39857,N,N,N,N,N,64748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,39019,N,N,N,38737,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39025,38383,N,N,N,N,N,N,N,40691,N,N,N,N,
+N,37352,39866,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64332,37482,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65016,39009,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,37351,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37869,38724,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,37345,N,N,64501,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39017,N,N,N,N,
+35426,N,N,39867,36008,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40021,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36471,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35506,40636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37862,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37757,40550,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37977,N,N,N,N,N,N,N,N,N,39871,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37976,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40613,39879,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,65108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,35798,N,N,N,N,N,N,38070,64884,39104,38053,N,N,N,N,N,N,N,
+39880,N,N,N,38381,64894,64491,N,N,N,N,N,N,N,N,N,N,64893,N,N,N,N,N,N,N,N,N,
+38767,37985,N,40897,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38359,N,N,N,
+64082,40024,N,N,N,N,N,N,N,N,N,40808,39911,64718,38632,64073,38817,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38221,40696,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,65097,37326,38769,N,N,N,N,36047,N,N,N,64945,N,N,64622,N,N,N,N,N,
+40178,37816,36931,38745,38103,65126,38013,64623,N,N,N,N,37446,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64109,N,N,36599,N,64439,N,38012,37581,38834,N,N,N,N,N,N,N,N,N,
+65125,38526,38744,39799,37327,N,N,N,N,N,N,N,N,N,38052,N,N,N,N,N,N,N,N,N,N,
+40109,N,N,N,N,N,N,N,N,N,35755,N,N,N,38613,64691,N,N,N,37806,N,38765,N,N,N,N,N,
+N,37958,38391,N,N,N,N,N,N,N,N,40006,38235,37329,38132,N,65127,37541,N,N,N,
+65247,36011,N,39881,N,N,N,N,N,N,N,N,N,N,N,64749,65018,64712,65122,37372,65131,
+65017,64711,37198,40120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38759,N,N,N,
+38382,N,N,39858,N,N,N,N,37984,N,N,N,38050,39029,38828,37331,N,N,N,N,N,N,N,N,N,
+N,N,39035,N,N,N,N,N,N,N,36587,38762,38494,N,N,N,N,N,N,N,N,N,38891,N,N,N,N,N,
+40953,38392,65186,36838,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65150,N,N,N,N,N,N,
+40356,38760,36588,38077,N,N,N,N,N,N,N,N,N,N,N,N,N,37979,40182,64167,39897,N,N,
+N,N,N,N,N,N,N,64093,38486,38754,N,N,N,N,N,N,38074,41039,37592,N,N,N,39883,N,N,
+N,N,N,N,38075,N,N,40287,N,N,N,N,N,N,37071,N,N,N,N,N,N,N,N,N,N,N,N,N,37989,N,N,
+40780,N,N,N,N,N,N,37080,36187,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40638,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,64365,38346,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,40386,38904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36860,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38003,
+38004,N,N,N,N,N,N,N,N,N,N,N,N,65207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,37794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,37757,40550,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37977,N,N,N,N,N,N,N,N,N,39871,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35403,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37976,N,N,N,N,
+35413,35689,35548,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35702,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39886,N,35432,41208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39135,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,65205,N,N,N,39887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38651,N,
+N,39931,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40654,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36581,N,
+N,N,N,N,N,N,N,N,40571,39890,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,35493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,65230,35397,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,40444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65231,35749,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35914,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35564,N,N,64736,38061,65237,38060,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40613,39879,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64602,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39894,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35439,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35753,36447,N,N,40395,N,
+64743,39895,N,N,N,N,N,N,N,N,N,N,N,37832,N,N,N,N,N,N,N,N,N,37360,36832,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39899,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37101,N,39900,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36179,41196,N,N,N,
+39162,N,N,N,N,N,N,N,N,N,39904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37831,37449,38625,39906,N,N,N,39908,N,N,36833,39909,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38080,N,N,37827,N,N,N,N,N,N,N,N,N,N,37829,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36985,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38779,N,N,N,N,N,
+36990,N,N,N,N,65254,65094,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40376,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,37488,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38312,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36016,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,38088,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39097,37184,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64702,N,N,N,N,N,N,N,37207,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64223,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,36468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35798,N,N,N,N,N,N,
-38070,64884,39104,38053,N,N,N,N,N,N,N,39880,N,N,N,38381,64894,64491,N,N,N,N,N,
-N,N,N,N,N,64893,N,N,N,N,N,N,N,N,N,38767,37985,N,40897,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,38359,N,N,N,64082,40024,N,N,N,N,N,N,N,N,N,40808,39911,64718,
-38632,64073,38817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38221,40696,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65097,37326,38769,N,N,N,N,36047,N,
-N,N,64945,N,N,64622,N,N,N,N,N,40178,37816,36931,38745,38103,65126,38013,64623,
-N,N,N,N,37446,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64109,N,N,36599,N,64439,N,38012,
-37581,38834,N,N,N,N,N,N,N,N,N,65125,38526,38744,39799,37327,N,N,N,N,N,N,N,N,N,
-38052,N,N,N,N,N,N,N,N,N,N,40109,N,N,N,N,N,N,N,N,N,35755,N,N,N,38613,64691,N,N,
-N,37806,N,38765,N,N,N,N,N,N,37958,38391,N,N,N,N,N,N,N,N,40006,38235,37329,
-38132,N,65127,37541,N,N,N,65247,36011,N,39881,N,N,N,N,N,N,N,N,N,N,N,64749,
-65018,64712,65122,37372,65131,65017,64711,37198,40120,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38759,N,N,N,38382,N,N,39858,N,N,N,N,37984,N,N,N,38050,39029,
-38828,37331,N,N,N,N,N,N,N,N,N,N,N,39035,N,N,N,N,N,N,N,36587,38762,38494,N,N,N,
-N,N,N,N,N,N,38891,N,N,N,N,N,40953,38392,65186,36838,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,65150,N,N,N,N,N,N,40356,38760,36588,38077,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37979,40182,64167,39897,N,N,N,N,N,N,N,N,N,64093,38486,38754,N,N,N,N,N,N,38074,
-41039,37592,N,N,N,39883,N,N,N,N,N,N,38075,N,N,40287,N,N,N,N,N,N,37071,N,N,N,N,
-N,N,N,N,N,N,N,N,N,37989,N,N,40780,N,N,N,N,N,N,37080,40638,N,N,N,N,N,N,N,N,N,N,
+N,39910,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38467,36420,40015,65268,
+N,N,N,N,N,39912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37852,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38511,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36426,39917,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37622,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40377,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,64365,38346,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,36430,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,64463,34656,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40642,
+N,N,N,N,N,N,38117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39920,38116,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,38225,35771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39921,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,38128,36452,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38122,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36705,N,N,N,39780,36443,N,N,N,N,
+39922,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40894,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40393,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36460,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36723,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36015,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,36725,36465,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36448,36458,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,35916,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38226,38228,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40379,38211,37630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,38130,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38129,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41194,40402,41137,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37368,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40386,38904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,36860,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38003,38004,N,N,
-N,N,N,N,N,N,N,N,N,N,65207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37986,39844,
+36525,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40621,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38608,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65262,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,35508,N,N,N,N,N,N,N,N,N,N,N,N,38743,35447,39927,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36533,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41069,
+36534,38742,38208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,41203,38078,N,N,N,39930,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64991,40380,N,N,N,N,N,N,N,
+N,38142,N,N,N,N,N,N,N,N,35803,41214,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,36544,40775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35806,41211,N,N,N,N,
+36547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38473,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,65218,N,N,38220,39933,N,N,N,N,N,N,N,N,N,N,N,N,N,37068,
+40032,38219,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39934,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,40003,N,N,N,40007,36556,N,N,N,36436,N,N,N,N,N,N,N,N,N,N,36580,
+40009,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38238,N,N,N,N,N,N,N,
+N,N,N,N,N,38236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40011,35809,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36569,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40372,N,
+37471,N,N,N,40012,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35489,N,N,N,N,N,N,N,N,N,N,N,N,N,36571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40022,35490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38740,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40030,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40660,38248,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,41155,35558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,41207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40033,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64589,N,40539,N,N,N,N,N,N,N,N,40553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40035,65223,N,N,65222,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40039,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40041,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,37221,N,N,N,N,N,N,N,N,N,N,N,N,40167,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,35412,N,N,N,N,N,N,N,40044,40046,65117,N,N,N,N,N,40051,N,
+N,N,N,N,N,N,N,N,N,N,N,N,38250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38253,36592,36685,N,
+N,N,N,36598,N,N,N,N,N,N,N,N,64188,N,36053,N,N,N,N,N,N,N,N,N,N,N,N,N,34654,N,N,
+N,N,64474,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,35660,64885,39901,64245,N,N,N,N,N,N,N,40052,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,38213,N,N,N,N,N,N,N,N,N,N,N,N,38598,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,36714,36686,N,N,N,N,N,40056,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64085,N,N,N,N,N,N,N,N,N,N,N,N,38884,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40001,37468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38650,36086,N,N,N,N,36173,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64358,36453,38985,
+64424,38978,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40058,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38907,37066,N,N,N,N,40027,N,N,38733,
+N,N,36563,N,N,N,N,N,N,N,N,N,N,N,N,N,38241,40779,40885,37842,64938,38976,37190,
+39015,64090,64425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,38977,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36051,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,64765,64939,37309,36684,38601,36693,64430,38255,N,N,
+N,N,N,N,40061,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,41200,N,N,N,N,N,N,N,N,N,N,N,N,N,37999,64940,N,N,N,N,
+38603,38606,N,N,N,N,41046,N,40161,N,N,N,N,N,N,N,N,N,N,38596,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+36702,36716,36515,64435,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,64595,N,N,N,64947,N,N,N,N,36715,N,N,N,N,N,N,N,N,N,N,
+N,N,38602,N,N,N,N,N,N,34643,N,N,N,N,N,N,N,N,N,N,N,N,N,36729,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,40559,41157,64632,36418,36698,37058,36517,36961,37455,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35403,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35413,
-35689,35548,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35702,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37747,64949,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39886,N,
-35432,41208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,65228,N,64445,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36054,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38979,38597,
+35260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40099,N,N,N,N,N,N,37451,38986,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,39135,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,65205,N,N,N,39887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38651,N,N,39931,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,40654,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36581,N,N,N,N,N,
-N,N,N,N,40571,39890,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,36772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,41201,40699,40146,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36775,N,N,N,N,34644,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64604,38981,N,N,36934,36049,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65274,38240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,65230,35397,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,40444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65231,35749,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,40776,37447,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37115,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35914,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,35564,N,N,64736,38061,65237,38060,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64602,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39894,N,N,N,N,N,N,
+N,40100,38257,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35439,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35753,36447,N,N,40395,N,64743,39895,N,N,
-N,N,N,N,N,N,N,N,N,37832,N,N,N,N,N,N,N,N,N,37360,36832,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,39899,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37101,N,39900,41196,N,N,N,39162,N,N,N,N,N,N,N,N,N,39904,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37831,37449,38625,39906,N,
-N,N,39908,N,N,36833,39909,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38080,N,N,37827,N,N,N,N,N,N,N,N,N,N,37829,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36985,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,38779,N,N,N,N,N,36990,N,N,N,N,65254,65094,N,N,N,N,
+N,N,N,N,34629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40102,N,N,N,N,
+40103,N,N,N,N,N,40106,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,40659,N,N,N,40560,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40108,34642,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,40376,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37488,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36782,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,38312,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36016,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38088,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,39097,37184,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,64702,N,N,N,N,N,N,N,37207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64223,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,36176,38269,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40112,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39910,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,38467,36420,40015,65268,N,N,N,N,N,39912,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37852,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38838,N,41149,35551,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38511,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,36426,39917,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,36797,N,N,N,36799,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37737,
+39847,51364,N,N,N,N,65258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39905,N,N,N,N,N,N,35649,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,40374,41195,39843,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,37622,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40377,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,35745,36808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,35148,39008,N,N,N,N,N,N,N,N,N,N,38087,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,35672,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38315,38314,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36430,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64463,40642,N,N,N,N,N,
-N,38117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39920,38116,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40131,40132,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,40364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35814,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35441,36817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,38225,35771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39921,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38128,36452,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38122,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36705,N,N,N,39780,36443,N,N,N,N,39922,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40393,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36460,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36723,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36015,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36725,
-36465,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36448,36458,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,35916,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38226,38228,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,35540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40379,38211,
-37630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-38130,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38129,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,41194,40402,41137,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37368,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37986,39844,36525,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40621,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38608,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,65262,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35508,N,
-N,N,N,N,N,N,N,N,N,N,N,38743,35447,39927,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,36533,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41069,36534,38742,
-38208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,41203,38078,N,N,N,39930,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64991,40380,N,N,N,N,N,N,N,N,38142,N,N,
-N,N,N,N,N,N,35803,41214,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36544,
-40775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35806,41211,N,N,N,N,36547,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38473,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,65218,N,N,38220,39933,N,N,N,N,N,N,N,N,N,N,N,N,N,37068,40032,
-38219,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39934,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,40003,N,N,N,40007,36556,N,N,N,36436,N,N,N,N,N,N,N,N,N,N,36580,40009,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38238,N,N,N,N,N,N,N,N,N,N,N,N,
-38236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40011,35809,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,36569,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40372,N,37471,N,N,N,
-40012,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35489,N,N,N,N,N,N,N,N,N,N,N,N,N,36571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40022,35490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,38740,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40030,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,40660,38248,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-41155,35558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,41207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40033,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64589,N,40539,N,N,N,N,N,N,N,N,40553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40035,65223,N,
-N,65222,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40039,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,40041,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35810,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,37221,N,N,N,N,N,N,N,N,N,N,N,N,40167,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,35412,N,N,N,N,N,N,N,40044,40046,65117,N,N,N,N,N,40051,N,N,N,N,N,N,N,N,
-N,N,N,N,N,38250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38253,36592,36685,N,N,N,N,36598,N,
-N,N,N,N,N,N,N,64188,N,36053,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64474,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35660,
-64885,39901,64245,N,N,N,N,N,N,N,40052,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,38213,N,N,N,N,N,N,N,N,N,N,N,N,38598,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,36714,36686,N,N,N,N,N,40056,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64085,N,N,N,N,N,N,N,N,N,N,N,N,38884,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40001,37468,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38650,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64358,36453,38985,64424,38978,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40058,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,38907,37066,N,N,N,N,40027,N,N,38733,N,N,36563,N,N,N,N,N,N,N,N,N,
-N,N,N,N,38241,40779,40885,37842,64938,38976,37190,39015,64090,64425,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38977,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36051,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64765,64939,37309,36684,38601,36693,64430,38255,N,N,N,N,N,N,40061,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,39381,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37108,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35491,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-41200,N,N,N,N,N,N,N,N,N,N,N,N,N,37999,64940,N,N,N,N,38603,38606,N,N,N,N,41046,
-N,40161,N,N,N,N,N,N,N,N,N,N,38596,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36702,36716,36515,64435,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64595,N,N,N,64947,N,N,N,N,36715,N,N,N,N,N,N,N,N,N,N,N,N,38602,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,36729,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40559,41157,64632,
-36418,36698,37058,36517,36961,37455,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37747,64949,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65228,N,64445,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36054,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38979,38597,35260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,40099,N,N,N,N,N,N,37451,38986,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36772,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41201,
-40699,40146,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36775,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,64604,38981,N,N,36934,36049,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,65274,38240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40776,37447,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37115,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40100,38257,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40102,N,N,N,N,40103,N,N,N,N,N,40106,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40659,N,N,N,40560,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,40108,36782,38269,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40112,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38838,
-N,41149,35551,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,40618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36797,N,N,N,36799,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37737,39847,
-51364,N,N,N,N,65258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,39905,N,N,N,N,N,N,35649,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,40374,41195,39843,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35745,36808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,35148,39008,N,N,N,N,N,N,N,N,N,N,38087,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,35672,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,38315,38314,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40131,40132,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,37846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35814,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35441,36817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,39381,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37108,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35491,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40142,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40148,40149,N,N,N,64456,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40371,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64624,N,N,N,N,N,36823,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39795,N,N,N,N,N,N,N,N,N,N,64091,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40142,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40148,40149,N,N,N,64456,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40371,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64624,N,N,N,N,N,36823,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39795,N,N,N,N,N,N,N,N,N,N,64091,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,36818,36964,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39094,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36818,36964,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39094,
 38504,N,N,N,N,40150,N,N,N,N,N,N,N,N,N,N,N,N,39101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36828,65270,36825,N,N,N,N,N,N,N,N,N,N,N,N,N,
 38209,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38899,39928,40556,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36850,36846,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,40151,N,N,N,N,N,N,N,N,N,N,N,N,40558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,35392,N,N,N,N,N,N,N,N,N,N,36847,N,N,N,N,N,N,N,N,36852,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36853,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38338,39018,N,38863,40572,36929,N,N,N,
-N,N,N,40155,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37953,N,N,N,N,40166,40368,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40170,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40173,N,N,N,N,N,N,N,N,N,N,N,N,40186,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,35682,35406,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,40138,35430,N,N,N,N,N,N,N,N,N,N,40187,40188,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40190,N,N,N,N,N,N,N,N,N,N,N,
-N,N,35411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40165,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40256,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,40257,N,N,N,N,N,N,N,N,N,N,N,N,36933,35699,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,38858,N,40258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,35758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35538,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40434,40259,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40159,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,40260,N,N,N,N,N,N,N,N,N,N,36554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36942,N,N,N,N,N,N,N,36531,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40949,N,N,N,N,N,N,N,N,N,N,N,N,40261,36943,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,34668,N,N,N,N,38899,39928,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40263,N,N,N,35274,N,N,N,N,N,N,40117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64510,36958,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36963,36951,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36966,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,39872,N,N,N,N,N,N,N,N,N,N,N,64741,37218,N,N,N,N,N,N,N,N,N,N,36967,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36769,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,36770,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,40264,64211,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36957,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,37049,N,N,N,N,N,N,N,N,N,N,N,N,N,36971,35932,N,N,N,
-36969,65111,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,65109,36979,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39919,40176,N,N,
-N,N,N,N,N,N,N,N,N,N,40267,N,N,N,N,N,N,N,N,N,N,N,N,N,65241,N,N,N,65242,N,N,N,
-37344,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37336,N,N,N,N,N,N,N,N,N,N,38470,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37728,N,64083,40147,N,N,
-N,N,N,N,N,N,N,N,N,N,40270,N,N,N,64320,N,N,N,36322,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,37954,N,36950,N,N,39013,N,35948,64074,N,N,40272,
-40274,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38319,38746,37705,38727,41204,N,N,N,N,N,
-N,38776,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36815,N,N,N,64608,N,N,N,N,N,N,N,N,35918,N,
-N,N,64598,N,N,N,N,N,N,N,N,N,N,N,N,N,37340,38497,37612,37725,36574,38654,64847,
-38366,N,N,N,N,N,N,N,N,N,N,N,N,N,39088,41024,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38845,38781,38901,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,39852,64218,37570,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38833,N,N,N,N,N,36987,N,N,N,N,37886,38011,
-N,38775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64190,64835,37062,37028,37032,38057,N,
-37033,N,N,N,N,35941,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38368,36989,N,N,N,N,N,N,
-37477,N,N,N,N,N,N,N,N,N,N,N,N,N,64954,37828,N,N,N,N,N,N,N,N,65261,40363,41187,
-N,38472,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40275,N,N,N,N,N,35497,N,
-39877,N,38493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38751,38495,38510,64349,N,N,
-N,N,N,40369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,65187,N,N,N,N,N,N,N,N,N,40370,N,N,38318,64675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41122,N,N,38485,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,40276,N,N,37697,N,38317,37333,N,N,N,N,N,N,N,N,N,N,N,N,38778,65020,
-36423,37885,37029,37036,N,N,N,N,N,N,N,N,38316,N,N,N,N,N,N,N,N,N,37038,65189,N,
-N,N,N,N,40278,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38883,38370,N,N,N,N,N,37990,
-N,N,38471,N,N,N,N,37304,N,N,N,N,40172,N,N,N,N,N,N,N,N,37037,N,38371,N,N,N,N,N,
+34650,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34632,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34634,40556,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36850,36846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40151,N,N,N,N,N,N,N,N,N,N,N,N,40558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35392,N,
+N,N,N,N,N,N,N,N,N,36847,N,N,N,N,N,N,N,N,36852,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36853,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38338,39018,N,38863,40677,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40572,
+36929,N,N,N,N,N,N,40155,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37953,N,N,N,N,
+40166,40368,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,40170,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40173,N,N,N,N,N,N,N,N,N,N,N,N,
+40186,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,35682,35406,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40138,35430,N,N,N,N,N,N,N,N,N,N,40187,40188,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40190,N,N,N,N,N,
+N,N,N,N,N,N,N,N,35411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40165,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40256,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40257,N,N,N,N,N,N,N,N,N,N,N,N,36933,35699,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38858,N,40258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,35425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,35758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35538,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,35746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40434,
+40259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40159,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,40260,N,N,N,N,N,N,N,N,N,N,36554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36942,N,N,N,N,N,N,N,36531,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,40949,N,N,N,N,N,N,N,N,N,N,N,N,40261,36943,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,40263,N,N,N,35274,N,N,N,N,N,N,40117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64510,
+36958,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36963,36951,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36966,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,39872,N,N,N,N,N,N,N,N,N,N,N,64741,37218,N,N,N,N,N,N,N,N,N,N,36967,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36769,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,36770,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40264,64211,N,N,N,N,N,N,36175,N,N,N,N,N,N,N,N,N,36957,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37049,N,N,N,N,N,N,N,N,N,N,N,N,N,36971,
+35932,N,N,N,36969,65111,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,65109,36979,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39919,40176,N,N,N,N,N,N,N,N,N,N,N,N,40267,N,N,N,N,N,N,N,N,N,N,N,N,N,65241,N,N,
+N,65242,N,N,N,37344,36163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37336,N,N,N,N,N,N,N,
+N,N,N,38470,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37728,
+N,64083,40147,N,N,N,N,N,N,N,N,N,N,N,N,40270,N,N,N,64320,N,N,N,36322,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37954,N,36950,N,N,39013,N,35948,
+64074,N,N,40272,40274,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38319,38746,37705,38727,
+41204,N,N,N,N,N,N,38776,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36815,N,N,N,64608,N,N,N,N,
+N,N,N,N,35918,N,N,N,64598,N,N,N,N,N,N,N,N,N,N,N,N,N,37340,38497,37612,37725,
+36574,38654,64847,38366,N,N,N,N,N,N,N,N,N,N,N,N,N,39088,41024,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38845,38781,38901,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39852,64218,37570,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38833,N,N,N,N,N,36987,N,
+N,N,N,37886,38011,N,38775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64190,64835,37062,
+37028,37032,38057,N,37033,N,N,N,N,35941,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38368,36989,N,N,N,N,N,N,37477,N,N,N,N,N,N,N,N,N,N,N,N,N,64954,37828,N,N,N,N,N,
+N,N,N,65261,40363,41187,N,38472,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40275,N,N,N,N,N,35497,N,39877,N,38493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38751,38495,38510,64349,N,N,N,N,N,40369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65187,N,N,N,N,N,N,N,N,N,40370,N,N,38318,64675,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34665,N,N,N,N,N,N,N,N,
+41122,N,N,38485,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40276,N,N,37697,N,38317,37333,N,N,
+N,N,N,N,N,N,N,N,N,N,38778,65020,36423,37885,37029,37036,N,N,N,N,N,N,N,N,38316,
+N,N,N,N,N,N,N,N,N,37038,65189,N,N,N,N,N,40278,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38883,38370,N,N,N,N,N,37990,N,N,38471,N,N,N,N,37304,N,N,N,N,40172,N,N,N,N,
+N,N,N,N,37037,N,38371,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35663,
+N,N,35555,N,N,N,N,35661,38378,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35663,N,N,35555,N,N,N,N,35661,38378,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35662,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36033,35821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37337,N,N,41124,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38389,38388,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,40883,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65199,N,N,N,N,
-N,65138,37498,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,65196,N,N,N,N,N,N,N,N,N,N,N,N,N,38387,40280,37746,N,N,37317,N,N,N,N,
-N,N,N,38466,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37069,38398,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35662,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36033,
+35821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,37337,N,N,41124,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38389,38388,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40883,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,65199,N,N,N,N,N,65138,37498,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65196,N,N,N,N,N,N,N,N,N,N,N,
+N,N,38387,40280,36166,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37746,N,N,37317,N,N,N,N,N,N,
+N,38466,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37069,38398,
 37209,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40037,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38860,37070,N,N,N,N,N,N,40281,64757,65277,N,N,
 40283,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
@@ -2168,70 +2203,72 @@
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,40129,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,40296,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-37799,N,N,N,N,N,N,38516,41199,N,37201,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35940,38518,40297,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64676,
-N,N,N,N,N,N,N,N,N,N,N,N,40298,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37454,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40299,N,N,N,N,N,39873,
-40300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-35429,37213,N,N,N,N,N,N,N,N,40301,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37799,N,N,N,N,N,N,38516,N,N,N,N,N,N,N,N,36093,41199,N,37201,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38593,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34679,N,35940,38518,40297,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,64676,N,N,N,N,N,N,N,N,N,N,N,N,40298,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37454,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,40299,N,N,N,N,N,39873,40300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,35429,37213,N,N,N,N,N,N,N,N,40301,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37210,35906,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37210,35906,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40128,37226,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,40302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,40614,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40397,N,N,40303,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,40128,37226,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-40302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40614,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40397,N,N,40303,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35259,40697,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38580,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,37234,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,35259,40697,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,38580,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37234,N,
+40648,N,N,N,34673,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35669,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40648,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,35669,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40305,40306,N,N,N,N,
-N,N,N,N,N,N,N,N,40652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,40305,40306,N,N,N,N,N,N,N,N,N,N,N,N,40652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37236,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40656,36956,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,40656,36956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36562,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,37288,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,37239,N,N,N,N,N,N,N,N,N,N,N,38591,N,N,N,N,N,38592,N,N,N,N,
-36785,N,N,N,N,N,38583,35925,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,37240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35262,37244,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,64375,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,36562,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37288,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37239,N,N,N,N,N,N,N,N,N,N,N,
+38591,N,N,N,N,N,38592,N,N,N,N,36785,N,N,N,N,N,38583,35925,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35262,
+37244,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64375,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,37237,37283,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37238,N,N,N,
-N,N,N,N,N,38590,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,37241,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38582,
-37284,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37286,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37237,37283,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,37238,N,N,N,N,N,N,N,N,38590,36169,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37241,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38582,37284,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37286,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40309,N,N,N,N,N,N,N,N,N,N,N,36946,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41029,N,37289,N,39082,N,N,N,35935,N,N,35754,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40157,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40311,34646,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,40309,N,N,N,N,N,N,N,N,N,N,N,36946,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-41029,N,37289,N,39082,N,N,N,35935,N,N,35754,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40157,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,40311,35136,40684,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37802,38008,N,N,N,N,40314,35529,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,35659,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40940,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,35554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,35136,40684,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,37802,38008,N,N,N,N,40314,35529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35659,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40940,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,40565,39028,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,39624,N,N,N,N,41031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35779,N,N,N,N,N,N,N,N,N,
-N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-64631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-N,N,40018,36605,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36776,N,N,N,N,N,N,N,N,N,38266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
-36848,
+N,N,40565,39028,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39624,N,N,N,N,41031,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35779,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,64584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64631,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40018,36605,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36776,N,N,N,N,N,N,N,N,N,
+38266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36848,
 };
 
 static const struct unim_index big5hkscs_nonbmp_encmap[256] = {
@@ -2249,84 +2286,84 @@
 253},{__big5hkscs_nonbmp_encmap+4292,119,150},{__big5hkscs_nonbmp_encmap+4324,
 10,254},{__big5hkscs_nonbmp_encmap+4569,13,252},{__big5hkscs_nonbmp_encmap+
 4809,32,250},{__big5hkscs_nonbmp_encmap+5028,3,243},{__big5hkscs_nonbmp_encmap
-+5269,45,75},{__big5hkscs_nonbmp_encmap+5300,68,194},{
-__big5hkscs_nonbmp_encmap+5427,42,172},{__big5hkscs_nonbmp_encmap+5558,70,249
-},{__big5hkscs_nonbmp_encmap+5738,28,213},{__big5hkscs_nonbmp_encmap+5924,15,
-232},{__big5hkscs_nonbmp_encmap+6142,69,252},{__big5hkscs_nonbmp_encmap+6326,
-42,195},{__big5hkscs_nonbmp_encmap+6480,8,124},{__big5hkscs_nonbmp_encmap+6597
-,33,250},{__big5hkscs_nonbmp_encmap+6815,101,237},{__big5hkscs_nonbmp_encmap+
-6952,19,190},{__big5hkscs_nonbmp_encmap+7124,27,246},{
-__big5hkscs_nonbmp_encmap+7344,18,205},{__big5hkscs_nonbmp_encmap+7532,3,247},
-{__big5hkscs_nonbmp_encmap+7777,38,147},{__big5hkscs_nonbmp_encmap+7887,102,
-232},{__big5hkscs_nonbmp_encmap+8018,14,206},{__big5hkscs_nonbmp_encmap+8211,
-38,201},{__big5hkscs_nonbmp_encmap+8375,7,238},{__big5hkscs_nonbmp_encmap+8607
-,13,239},{__big5hkscs_nonbmp_encmap+8834,116,227},{__big5hkscs_nonbmp_encmap+
-8946,51,218},{__big5hkscs_nonbmp_encmap+9114,3,249},{__big5hkscs_nonbmp_encmap
-+9361,15,225},{__big5hkscs_nonbmp_encmap+9572,0,254},{
-__big5hkscs_nonbmp_encmap+9827,0,229},{__big5hkscs_nonbmp_encmap+10057,25,243
-},{__big5hkscs_nonbmp_encmap+10276,0,238},{__big5hkscs_nonbmp_encmap+10515,3,
-215},{__big5hkscs_nonbmp_encmap+10728,58,58},{__big5hkscs_nonbmp_encmap+10729,
-194,194},{__big5hkscs_nonbmp_encmap+10730,167,250},{__big5hkscs_nonbmp_encmap+
-10814,90,90},{__big5hkscs_nonbmp_encmap+10815,99,255},{
-__big5hkscs_nonbmp_encmap+10972,64,248},{__big5hkscs_nonbmp_encmap+11157,17,
-252},{__big5hkscs_nonbmp_encmap+11393,53,240},{__big5hkscs_nonbmp_encmap+11581
-,17,225},{__big5hkscs_nonbmp_encmap+11790,4,252},{__big5hkscs_nonbmp_encmap+
-12039,27,250},{__big5hkscs_nonbmp_encmap+12263,13,248},{
-__big5hkscs_nonbmp_encmap+12499,4,214},{__big5hkscs_nonbmp_encmap+12710,5,200
-},{__big5hkscs_nonbmp_encmap+12906,24,212},{__big5hkscs_nonbmp_encmap+13095,6,
-224},{__big5hkscs_nonbmp_encmap+13314,18,255},{__big5hkscs_nonbmp_encmap+13552
-,0,251},{__big5hkscs_nonbmp_encmap+13804,14,233},{__big5hkscs_nonbmp_encmap+
-14024,110,245},{__big5hkscs_nonbmp_encmap+14160,9,217},{
-__big5hkscs_nonbmp_encmap+14369,6,235},{__big5hkscs_nonbmp_encmap+14599,59,167
-},{__big5hkscs_nonbmp_encmap+14708,14,194},{__big5hkscs_nonbmp_encmap+14889,
-44,157},{__big5hkscs_nonbmp_encmap+15003,43,231},{__big5hkscs_nonbmp_encmap+
-15192,32,216},{__big5hkscs_nonbmp_encmap+15377,14,19},{
-__big5hkscs_nonbmp_encmap+15383,25,110},{__big5hkscs_nonbmp_encmap+15469,49,
-224},{__big5hkscs_nonbmp_encmap+15645,5,246},{__big5hkscs_nonbmp_encmap+15887,
-6,225},{__big5hkscs_nonbmp_encmap+16107,87,225},{__big5hkscs_nonbmp_encmap+
-16246,3,204},{__big5hkscs_nonbmp_encmap+16448,149,233},{
-__big5hkscs_nonbmp_encmap+16533,116,232},{__big5hkscs_nonbmp_encmap+16650,1,
-254},{__big5hkscs_nonbmp_encmap+16904,32,67},{__big5hkscs_nonbmp_encmap+16940,
-14,216},{__big5hkscs_nonbmp_encmap+17143,26,226},{__big5hkscs_nonbmp_encmap+
-17344,41,165},{__big5hkscs_nonbmp_encmap+17469,2,221},{
-__big5hkscs_nonbmp_encmap+17689,88,208},{__big5hkscs_nonbmp_encmap+17810,53,
-248},{__big5hkscs_nonbmp_encmap+18006,2,152},{__big5hkscs_nonbmp_encmap+18157,
-18,191},{__big5hkscs_nonbmp_encmap+18331,18,252},{__big5hkscs_nonbmp_encmap+
-18566,22,204},{__big5hkscs_nonbmp_encmap+18749,28,199},{
-__big5hkscs_nonbmp_encmap+18921,14,250},{__big5hkscs_nonbmp_encmap+19158,45,82
-},{__big5hkscs_nonbmp_encmap+19196,5,247},{__big5hkscs_nonbmp_encmap+19439,33,
-209},{__big5hkscs_nonbmp_encmap+19616,34,240},{__big5hkscs_nonbmp_encmap+19823
-,0,215},{__big5hkscs_nonbmp_encmap+20039,38,223},{__big5hkscs_nonbmp_encmap+
-20225,14,248},{__big5hkscs_nonbmp_encmap+20460,9,205},{
-__big5hkscs_nonbmp_encmap+20657,27,230},{__big5hkscs_nonbmp_encmap+20861,154,
-154},{__big5hkscs_nonbmp_encmap+20862,34,134},{__big5hkscs_nonbmp_encmap+20963
-,116,254},{__big5hkscs_nonbmp_encmap+21102,7,148},{__big5hkscs_nonbmp_encmap+
-21244,15,204},{__big5hkscs_nonbmp_encmap+21434,88,200},{
-__big5hkscs_nonbmp_encmap+21547,36,253},{__big5hkscs_nonbmp_encmap+21765,10,
-244},{__big5hkscs_nonbmp_encmap+22000,6,244},{__big5hkscs_nonbmp_encmap+22239,
-18,18},{__big5hkscs_nonbmp_encmap+22240,47,220},{__big5hkscs_nonbmp_encmap+
-22414,77,79},{__big5hkscs_nonbmp_encmap+22417,249,249},{
-__big5hkscs_nonbmp_encmap+22418,2,244},{__big5hkscs_nonbmp_encmap+22661,46,188
-},{__big5hkscs_nonbmp_encmap+22804,7,226},{__big5hkscs_nonbmp_encmap+23024,6,
-138},{__big5hkscs_nonbmp_encmap+23157,18,130},{__big5hkscs_nonbmp_encmap+23270
-,1,244},{__big5hkscs_nonbmp_encmap+23514,0,230},{__big5hkscs_nonbmp_encmap+
-23745,15,19},{__big5hkscs_nonbmp_encmap+23750,4,43},{__big5hkscs_nonbmp_encmap
-+23790,51,252},{__big5hkscs_nonbmp_encmap+23992,15,252},{
-__big5hkscs_nonbmp_encmap+24230,12,255},{__big5hkscs_nonbmp_encmap+24474,3,210
-},{__big5hkscs_nonbmp_encmap+24682,52,185},{__big5hkscs_nonbmp_encmap+24816,
-15,231},{__big5hkscs_nonbmp_encmap+25033,197,197},{__big5hkscs_nonbmp_encmap+
-25034,136,237},{__big5hkscs_nonbmp_encmap+25136,13,235},{0,0,0},{0,0,0},{
-__big5hkscs_nonbmp_encmap+25359,29,231},{__big5hkscs_nonbmp_encmap+25562,158,
-244},{0,0,0},{__big5hkscs_nonbmp_encmap+25649,32,212},{
-__big5hkscs_nonbmp_encmap+25830,16,241},{__big5hkscs_nonbmp_encmap+26056,3,201
-},{__big5hkscs_nonbmp_encmap+26255,40,77},{__big5hkscs_nonbmp_encmap+26293,5,
-213},{__big5hkscs_nonbmp_encmap+26502,115,173},{__big5hkscs_nonbmp_encmap+
-26561,62,246},{__big5hkscs_nonbmp_encmap+26746,6,248},{
-__big5hkscs_nonbmp_encmap+26989,35,222},{__big5hkscs_nonbmp_encmap+27177,20,
-254},{__big5hkscs_nonbmp_encmap+27412,7,245},{__big5hkscs_nonbmp_encmap+27651,
-32,255},{__big5hkscs_nonbmp_encmap+27875,169,169},{__big5hkscs_nonbmp_encmap+
-27876,52,91},{__big5hkscs_nonbmp_encmap+27916,198,203},{
-__big5hkscs_nonbmp_encmap+27922,1,169},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
++5269,45,99},{__big5hkscs_nonbmp_encmap+5324,68,194},{
+__big5hkscs_nonbmp_encmap+5451,42,172},{__big5hkscs_nonbmp_encmap+5582,70,249
+},{__big5hkscs_nonbmp_encmap+5762,28,213},{__big5hkscs_nonbmp_encmap+5948,15,
+232},{__big5hkscs_nonbmp_encmap+6166,69,252},{__big5hkscs_nonbmp_encmap+6350,
+42,195},{__big5hkscs_nonbmp_encmap+6504,8,124},{__big5hkscs_nonbmp_encmap+6621
+,33,250},{__big5hkscs_nonbmp_encmap+6839,101,237},{__big5hkscs_nonbmp_encmap+
+6976,19,190},{__big5hkscs_nonbmp_encmap+7148,27,246},{
+__big5hkscs_nonbmp_encmap+7368,18,205},{__big5hkscs_nonbmp_encmap+7556,3,247},
+{__big5hkscs_nonbmp_encmap+7801,38,147},{__big5hkscs_nonbmp_encmap+7911,102,
+232},{__big5hkscs_nonbmp_encmap+8042,14,206},{__big5hkscs_nonbmp_encmap+8235,
+38,201},{__big5hkscs_nonbmp_encmap+8399,7,238},{__big5hkscs_nonbmp_encmap+8631
+,13,239},{__big5hkscs_nonbmp_encmap+8858,116,227},{__big5hkscs_nonbmp_encmap+
+8970,51,218},{__big5hkscs_nonbmp_encmap+9138,3,249},{__big5hkscs_nonbmp_encmap
++9385,15,225},{__big5hkscs_nonbmp_encmap+9596,0,254},{
+__big5hkscs_nonbmp_encmap+9851,0,229},{__big5hkscs_nonbmp_encmap+10081,25,243
+},{__big5hkscs_nonbmp_encmap+10300,0,238},{__big5hkscs_nonbmp_encmap+10539,3,
+215},{__big5hkscs_nonbmp_encmap+10752,58,58},{__big5hkscs_nonbmp_encmap+10753,
+194,194},{__big5hkscs_nonbmp_encmap+10754,167,250},{__big5hkscs_nonbmp_encmap+
+10838,26,90},{__big5hkscs_nonbmp_encmap+10903,99,255},{
+__big5hkscs_nonbmp_encmap+11060,64,248},{__big5hkscs_nonbmp_encmap+11245,6,252
+},{__big5hkscs_nonbmp_encmap+11492,53,240},{__big5hkscs_nonbmp_encmap+11680,
+17,236},{__big5hkscs_nonbmp_encmap+11900,4,252},{__big5hkscs_nonbmp_encmap+
+12149,27,250},{__big5hkscs_nonbmp_encmap+12373,13,248},{
+__big5hkscs_nonbmp_encmap+12609,4,214},{__big5hkscs_nonbmp_encmap+12820,5,200
+},{__big5hkscs_nonbmp_encmap+13016,24,212},{__big5hkscs_nonbmp_encmap+13205,6,
+224},{__big5hkscs_nonbmp_encmap+13424,18,255},{__big5hkscs_nonbmp_encmap+13662
+,0,251},{__big5hkscs_nonbmp_encmap+13914,14,233},{__big5hkscs_nonbmp_encmap+
+14134,15,245},{__big5hkscs_nonbmp_encmap+14365,9,217},{
+__big5hkscs_nonbmp_encmap+14574,6,235},{__big5hkscs_nonbmp_encmap+14804,59,167
+},{__big5hkscs_nonbmp_encmap+14913,14,194},{__big5hkscs_nonbmp_encmap+15094,
+44,157},{__big5hkscs_nonbmp_encmap+15208,43,231},{__big5hkscs_nonbmp_encmap+
+15397,32,216},{__big5hkscs_nonbmp_encmap+15582,14,19},{
+__big5hkscs_nonbmp_encmap+15588,25,154},{__big5hkscs_nonbmp_encmap+15718,49,
+224},{__big5hkscs_nonbmp_encmap+15894,5,246},{__big5hkscs_nonbmp_encmap+16136,
+6,225},{__big5hkscs_nonbmp_encmap+16356,87,225},{__big5hkscs_nonbmp_encmap+
+16495,3,204},{__big5hkscs_nonbmp_encmap+16697,84,233},{
+__big5hkscs_nonbmp_encmap+16847,116,232},{__big5hkscs_nonbmp_encmap+16964,1,
+254},{__big5hkscs_nonbmp_encmap+17218,32,67},{__big5hkscs_nonbmp_encmap+17254,
+14,216},{__big5hkscs_nonbmp_encmap+17457,26,226},{__big5hkscs_nonbmp_encmap+
+17658,41,165},{__big5hkscs_nonbmp_encmap+17783,2,221},{
+__big5hkscs_nonbmp_encmap+18003,88,208},{__big5hkscs_nonbmp_encmap+18124,53,
+248},{__big5hkscs_nonbmp_encmap+18320,2,152},{__big5hkscs_nonbmp_encmap+18471,
+18,191},{__big5hkscs_nonbmp_encmap+18645,18,252},{__big5hkscs_nonbmp_encmap+
+18880,22,204},{__big5hkscs_nonbmp_encmap+19063,28,199},{
+__big5hkscs_nonbmp_encmap+19235,14,250},{__big5hkscs_nonbmp_encmap+19472,45,82
+},{__big5hkscs_nonbmp_encmap+19510,5,247},{__big5hkscs_nonbmp_encmap+19753,33,
+209},{__big5hkscs_nonbmp_encmap+19930,34,240},{__big5hkscs_nonbmp_encmap+20137
+,0,215},{__big5hkscs_nonbmp_encmap+20353,38,223},{__big5hkscs_nonbmp_encmap+
+20539,14,248},{__big5hkscs_nonbmp_encmap+20774,9,205},{
+__big5hkscs_nonbmp_encmap+20971,27,230},{__big5hkscs_nonbmp_encmap+21175,82,
+255},{__big5hkscs_nonbmp_encmap+21349,34,134},{__big5hkscs_nonbmp_encmap+21450
+,116,254},{__big5hkscs_nonbmp_encmap+21589,7,148},{__big5hkscs_nonbmp_encmap+
+21731,15,204},{__big5hkscs_nonbmp_encmap+21921,88,200},{
+__big5hkscs_nonbmp_encmap+22034,36,253},{__big5hkscs_nonbmp_encmap+22252,10,
+244},{__big5hkscs_nonbmp_encmap+22487,6,244},{__big5hkscs_nonbmp_encmap+22726,
+18,197},{__big5hkscs_nonbmp_encmap+22906,47,220},{__big5hkscs_nonbmp_encmap+
+23080,77,79},{__big5hkscs_nonbmp_encmap+23083,46,249},{
+__big5hkscs_nonbmp_encmap+23287,2,244},{__big5hkscs_nonbmp_encmap+23530,46,188
+},{__big5hkscs_nonbmp_encmap+23673,7,226},{__big5hkscs_nonbmp_encmap+23893,6,
+138},{__big5hkscs_nonbmp_encmap+24026,18,130},{__big5hkscs_nonbmp_encmap+24139
+,1,244},{__big5hkscs_nonbmp_encmap+24383,0,230},{__big5hkscs_nonbmp_encmap+
+24614,15,19},{__big5hkscs_nonbmp_encmap+24619,4,43},{__big5hkscs_nonbmp_encmap
++24659,51,252},{__big5hkscs_nonbmp_encmap+24861,15,252},{
+__big5hkscs_nonbmp_encmap+25099,12,255},{__big5hkscs_nonbmp_encmap+25343,3,210
+},{__big5hkscs_nonbmp_encmap+25551,52,185},{__big5hkscs_nonbmp_encmap+25685,
+15,231},{__big5hkscs_nonbmp_encmap+25902,197,197},{__big5hkscs_nonbmp_encmap+
+25903,121,237},{__big5hkscs_nonbmp_encmap+26020,13,235},{0,0,0},{0,0,0},{
+__big5hkscs_nonbmp_encmap+26243,29,231},{__big5hkscs_nonbmp_encmap+26446,158,
+244},{0,0,0},{__big5hkscs_nonbmp_encmap+26533,32,212},{
+__big5hkscs_nonbmp_encmap+26714,16,250},{__big5hkscs_nonbmp_encmap+26949,3,201
+},{__big5hkscs_nonbmp_encmap+27148,40,77},{__big5hkscs_nonbmp_encmap+27186,5,
+213},{__big5hkscs_nonbmp_encmap+27395,115,173},{__big5hkscs_nonbmp_encmap+
+27454,62,246},{__big5hkscs_nonbmp_encmap+27639,6,248},{
+__big5hkscs_nonbmp_encmap+27882,35,222},{__big5hkscs_nonbmp_encmap+28070,20,
+254},{__big5hkscs_nonbmp_encmap+28305,7,245},{__big5hkscs_nonbmp_encmap+28544,
+32,255},{__big5hkscs_nonbmp_encmap+28768,81,169},{__big5hkscs_nonbmp_encmap+
+28857,52,91},{__big5hkscs_nonbmp_encmap+28897,198,203},{
+__big5hkscs_nonbmp_encmap+28903,1,169},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
@@ -2335,6 +2372,7 @@
 0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
 },{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
 0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
-__big5hkscs_nonbmp_encmap+28091,37,205},{__big5hkscs_nonbmp_encmap+28260,148,
+__big5hkscs_nonbmp_encmap+29072,37,205},{__big5hkscs_nonbmp_encmap+29241,148,
 212},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
 };
+

Modified: python/branches/trunk-math/Modules/mathmodule.c
==============================================================================
--- python/branches/trunk-math/Modules/mathmodule.c	(original)
+++ python/branches/trunk-math/Modules/mathmodule.c	Tue Feb 12 06:36:19 2008
@@ -267,6 +267,17 @@
       "tanh(x)\n\nReturn the hyperbolic tangent of x.")
 
 static PyObject *
+math_trunc(PyObject *self, PyObject *number)
+{
+	return PyObject_CallMethod(number, "__trunc__", NULL);
+}
+
+PyDoc_STRVAR(math_trunc_doc,
+"trunc(x:Real) -> Integral\n"
+"\n"
+"Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
+
+static PyObject *
 math_frexp(PyObject *self, PyObject *arg)
 {
 	int i;
@@ -658,6 +669,7 @@
 	{"sqrt",	math_sqrt,	METH_O,		math_sqrt_doc},
 	{"tan",		math_tan,	METH_O,		math_tan_doc},
 	{"tanh",	math_tanh,	METH_O,		math_tanh_doc},
+ 	{"trunc",	math_trunc,	METH_O,		math_trunc_doc},
 	{NULL,		NULL}		/* sentinel */
 };
 

Modified: python/branches/trunk-math/Modules/posixmodule.c
==============================================================================
--- python/branches/trunk-math/Modules/posixmodule.c	(original)
+++ python/branches/trunk-math/Modules/posixmodule.c	Tue Feb 12 06:36:19 2008
@@ -3538,9 +3538,9 @@
 
 	Py_BEGIN_ALLOW_THREADS
 #if defined(PYCC_GCC)
-	spawnval = spawnve(mode, path, argvlist, envlist);
+	spawnval = spawnvpe(mode, path, argvlist, envlist);
 #else
-	spawnval = _spawnve(mode, path, argvlist, envlist);
+	spawnval = _spawnvpe(mode, path, argvlist, envlist);
 #endif
 	Py_END_ALLOW_THREADS
 
@@ -3575,11 +3575,11 @@
 static PyObject *
 posix_fork1(PyObject *self, PyObject *noargs)
 {
-	int pid = fork1();
+	pid_t pid = fork1();
 	if (pid == -1)
 		return posix_error();
 	PyOS_AfterFork();
-	return PyInt_FromLong((long)pid);
+	return PyInt_FromLong(pid);
 }
 #endif
 
@@ -3593,12 +3593,12 @@
 static PyObject *
 posix_fork(PyObject *self, PyObject *noargs)
 {
-	int pid = fork();
+	pid_t pid = fork();
 	if (pid == -1)
 		return posix_error();
 	if (pid == 0)
 		PyOS_AfterFork();
-	return PyInt_FromLong((long)pid);
+	return PyInt_FromLong(pid);
 }
 #endif
 
@@ -3700,14 +3700,15 @@
 static PyObject *
 posix_forkpty(PyObject *self, PyObject *noargs)
 {
-	int master_fd = -1, pid;
+	int master_fd = -1;
+	pid_t pid;
 
 	pid = forkpty(&master_fd, NULL, NULL, NULL);
 	if (pid == -1)
 		return posix_error();
 	if (pid == 0)
 		PyOS_AfterFork();
-	return Py_BuildValue("(ii)", pid, master_fd);
+	return Py_BuildValue("(li)", pid, master_fd);
 }
 #endif
 
@@ -3867,7 +3868,7 @@
 static PyObject *
 posix_getppid(PyObject *self, PyObject *noargs)
 {
-	return PyInt_FromLong((long)getppid());
+	return PyInt_FromLong(getppid());
 }
 #endif
 
@@ -3922,7 +3923,8 @@
 static PyObject *
 posix_kill(PyObject *self, PyObject *args)
 {
-	int pid, sig;
+	pid_t pid;
+	int sig;
 	if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
 		return NULL;
 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
@@ -4266,7 +4268,8 @@
 	struct file_ref stdio[3];
 	struct pipe_ref p_fd[3];
 	FILE *p_s[3];
-	int file_count, i, pipe_err, pipe_pid;
+	int file_count, i, pipe_err;
+	pid_t pipe_pid;
 	char *shell, *sh_name, *opt, *rd_mode, *wr_mode;
 	PyObject *f, *p_f[3];
 
@@ -4594,7 +4597,7 @@
 {
 	int result;
 	int exit_code;
-	int pipe_pid;
+	pid_t pipe_pid;
 	PyObject *procObj, *pidObj, *intObj, *fileObj;
 	int file_count;
 #ifdef WITH_THREAD
@@ -5642,7 +5645,7 @@
 
 #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
 static PyObject *
-wait_helper(int pid, int status, struct rusage *ru)
+wait_helper(pid_t pid, int status, struct rusage *ru)
 {
 	PyObject *result;
    	static PyObject *struct_rusage;
@@ -5708,7 +5711,8 @@
 static PyObject *
 posix_wait3(PyObject *self, PyObject *args)
 {
-	int pid, options;
+	pid_t pid;
+	int options;
 	struct rusage ru;
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
@@ -5732,7 +5736,8 @@
 static PyObject *
 posix_wait4(PyObject *self, PyObject *args)
 {
-	int pid, options;
+	pid_t pid;
+	int options;
 	struct rusage ru;
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
@@ -5756,7 +5761,8 @@
 static PyObject *
 posix_waitpid(PyObject *self, PyObject *args)
 {
-	int pid, options;
+	pid_t pid;
+	int options;
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
 
@@ -5805,7 +5811,7 @@
 static PyObject *
 posix_wait(PyObject *self, PyObject *noargs)
 {
-	int pid;
+	pid_t pid;
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
 
@@ -6006,7 +6012,8 @@
 static PyObject *
 posix_getsid(PyObject *self, PyObject *args)
 {
-	int pid, sid;
+	pid_t pid;
+	int sid;
 	if (!PyArg_ParseTuple(args, "i:getsid", &pid))
 		return NULL;
 	sid = getsid(pid);
@@ -6040,7 +6047,8 @@
 static PyObject *
 posix_setpgid(PyObject *self, PyObject *args)
 {
-	int pid, pgrp;
+	pid_t pid;
+	int pgrp;
 	if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
 		return NULL;
 	if (setpgid(pid, pgrp) < 0)
@@ -6059,7 +6067,8 @@
 static PyObject *
 posix_tcgetpgrp(PyObject *self, PyObject *args)
 {
-	int fd, pgid;
+	int fd;
+	pid_t pgid;
 	if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
 		return NULL;
 	pgid = tcgetpgrp(fd);

Modified: python/branches/trunk-math/Objects/abstract.c
==============================================================================
--- python/branches/trunk-math/Objects/abstract.c	(original)
+++ python/branches/trunk-math/Objects/abstract.c	Tue Feb 12 06:36:19 2008
@@ -1035,12 +1035,64 @@
 
 
 PyObject *
+_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
+{
+	const char *type_name;
+	static PyObject *int_name = NULL;
+	if (int_name == NULL) {
+		int_name = PyString_InternFromString("__int__");
+		if (int_name == NULL)
+			return NULL;
+	}
+
+	if (integral && (!PyInt_Check(integral) &&
+			 !PyLong_Check(integral))) {
+		/* Don't go through tp_as_number->nb_int to avoid
+		   hitting the classic class fallback to __trunc__. */
+		PyObject *int_func = PyObject_GetAttr(integral, int_name);
+		if (int_func == NULL) {
+			PyErr_Clear(); /* Raise a different error. */
+			goto non_integral_error;
+		}
+		Py_DECREF(integral);
+		integral = PyEval_CallObject(int_func, NULL);
+		Py_DECREF(int_func);
+		if (integral && (!PyInt_Check(integral) &&
+				  !PyLong_Check(integral))) {
+			goto non_integral_error;
+		}
+	}
+	return integral;
+
+non_integral_error:
+	if (PyInstance_Check(integral)) {
+		type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
+					       ->in_class->cl_name);
+	}
+	else {
+		type_name = integral->ob_type->tp_name;
+	}
+	PyErr_Format(PyExc_TypeError, error_format, type_name);
+	Py_DECREF(integral);
+	return NULL;
+}
+
+
+PyObject *
 PyNumber_Int(PyObject *o)
 {
 	PyNumberMethods *m;
+	static PyObject *trunc_name = NULL;
+	PyObject *trunc_func;
 	const char *buffer;
 	Py_ssize_t buffer_len;
 
+	if (trunc_name == NULL) {
+		trunc_name = PyString_InternFromString("__trunc__");
+		if (trunc_name == NULL)
+			return NULL;
+	}
+
 	if (o == NULL)
 		return null_error();
 	if (PyInt_CheckExact(o)) {
@@ -1049,6 +1101,7 @@
 	}
 	m = o->ob_type->tp_as_number;
 	if (m && m->nb_int) { /* This should include subclasses of int */
+		/* Classic classes always take this branch. */
 		PyObject *res = m->nb_int(o);
 		if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
 			PyErr_Format(PyExc_TypeError,
@@ -1063,6 +1116,18 @@
 		PyIntObject *io = (PyIntObject*)o;
 		return PyInt_FromLong(io->ob_ival);
 	}
+	trunc_func = PyObject_GetAttr(o, trunc_name);
+	if (trunc_func) {
+		PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
+		Py_DECREF(trunc_func);
+		/* __trunc__ is specified to return an Integral type, but
+		   int() needs to return an int. */
+		return _PyNumber_ConvertIntegralToInt(
+			truncated,
+			"__trunc__ returned non-Integral (type %.200s)");
+	}
+	PyErr_Clear();  /* It's not an error if  o.__trunc__ doesn't exist. */
+
 	if (PyString_Check(o))
 		return int_from_string(PyString_AS_STRING(o),
 				       PyString_GET_SIZE(o));
@@ -1102,13 +1167,22 @@
 PyNumber_Long(PyObject *o)
 {
 	PyNumberMethods *m;
+	static PyObject *trunc_name = NULL;
+	PyObject *trunc_func;
 	const char *buffer;
 	Py_ssize_t buffer_len;
 
+	if (trunc_name == NULL) {
+		trunc_name = PyString_InternFromString("__trunc__");
+		if (trunc_name == NULL)
+			return NULL;
+	}
+
 	if (o == NULL)
 		return null_error();
 	m = o->ob_type->tp_as_number;
 	if (m && m->nb_long) { /* This should include subclasses of long */
+		/* Classic classes always take this branch. */
 		PyObject *res = m->nb_long(o);
 		if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
 			PyErr_Format(PyExc_TypeError,
@@ -1121,6 +1195,26 @@
 	}
 	if (PyLong_Check(o)) /* A long subclass without nb_long */
 		return _PyLong_Copy((PyLongObject *)o);
+	trunc_func = PyObject_GetAttr(o, trunc_name);
+	if (trunc_func) {
+		PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
+		PyObject *int_instance;
+		Py_DECREF(trunc_func);
+		/* __trunc__ is specified to return an Integral type,
+		   but long() needs to return a long. */
+		int_instance = _PyNumber_ConvertIntegralToInt(
+			truncated,
+			"__trunc__ returned non-Integral (type %.200s)");
+		if (int_instance && PyInt_Check(int_instance)) {
+			/* Make sure that long() returns a long instance. */
+			long value = PyInt_AS_LONG(int_instance);
+			Py_DECREF(int_instance);
+			return PyLong_FromLong(value);
+		}
+		return int_instance;
+	}
+	PyErr_Clear();  /* It's not an error if  o.__trunc__ doesn't exist. */
+
 	if (PyString_Check(o))
 		/* need to do extra error checking that PyLong_FromString()
 		 * doesn't do.  In particular long('9.5') must raise an
@@ -1168,6 +1262,25 @@
 	return PyFloat_FromString(o, NULL);
 }
 
+PyObject *
+PyNumber_ToBase(PyObject *n, int base)
+{
+	PyObject *res = NULL;
+	PyObject *index = PyNumber_Index(n);
+
+	if (!index)
+		return NULL;
+	if (PyLong_Check(index))
+		res = _PyLong_Format(index, base, 0, 1);
+	else if (PyInt_Check(index))
+	  	res = _PyInt_Format((PyIntObject*)index, base, 1);
+	else
+		assert("PyNumber_ToBase: not long or int");
+	Py_DECREF(index);
+	return res;
+}
+
+
 /* Operations on sequences */
 
 int

Modified: python/branches/trunk-math/Objects/classobject.c
==============================================================================
--- python/branches/trunk-math/Objects/classobject.c	(original)
+++ python/branches/trunk-math/Objects/classobject.c	Tue Feb 12 06:36:19 2008
@@ -4,10 +4,18 @@
 #include "Python.h"
 #include "structmember.h"
 
+/* Free list for method objects to safe malloc/free overhead
+ * The im_self element is used to chain the elements.
+ */
+static PyMethodObject *free_list;
+static int numfree = 0;
+#ifndef PyMethod_MAXFREELIST
+#define PyMethod_MAXFREELIST 256
+#endif
+
 #define TP_DESCR_GET(t) \
     (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
 
-
 /* Forward */
 static PyObject *class_lookup(PyClassObject *, PyObject *,
 			      PyClassObject **);
@@ -1798,7 +1806,29 @@
 
 
 UNARY(instance_invert, "__invert__")
-UNARY(instance_int, "__int__")
+UNARY(_instance_trunc, "__trunc__")
+
+static PyObject *
+instance_int(PyInstanceObject *self)
+{
+	PyObject *truncated;
+	static PyObject *int_name;
+	if (int_name == NULL) {
+		int_name = PyString_InternFromString("__int__");
+		if (int_name == NULL)
+			return NULL;
+	}
+	if (PyObject_HasAttr((PyObject*)self, int_name))
+		return generic_unary_op(self, int_name);
+
+	truncated = _instance_trunc(self);
+	/* __trunc__ is specified to return an Integral type, but
+	   int() needs to return an int. */
+	return _PyNumber_ConvertIntegralToInt(
+		truncated,
+		"__trunc__ returned non-Integral (type %.200s)");
+}
+
 UNARY_FB(instance_long, "__long__", instance_int)
 UNARY(instance_float, "__float__")
 UNARY(instance_oct, "__oct__")
@@ -2171,8 +2201,6 @@
    In case (b), im_self is NULL
 */
 
-static PyMethodObject *free_list;
-
 PyObject *
 PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
 {
@@ -2185,6 +2213,7 @@
 	if (im != NULL) {
 		free_list = (PyMethodObject *)(im->im_self);
 		PyObject_INIT(im, &PyMethod_Type);
+		numfree--;
 	}
 	else {
 		im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
@@ -2310,8 +2339,14 @@
 	Py_DECREF(im->im_func);
 	Py_XDECREF(im->im_self);
 	Py_XDECREF(im->im_class);
-	im->im_self = (PyObject *)free_list;
-	free_list = im;
+	if (numfree < PyMethod_MAXFREELIST) {
+		im->im_self = (PyObject *)free_list;
+		free_list = im;
+		numfree++;
+	}
+	else {
+		PyObject_GC_Del(im);
+	}
 }
 
 static int
@@ -2598,5 +2633,7 @@
 		PyMethodObject *im = free_list;
 		free_list = (PyMethodObject *)(im->im_self);
 		PyObject_GC_Del(im);
+		numfree--;
 	}
+	assert(numfree == 0);
 }

Modified: python/branches/trunk-math/Objects/dictobject.c
==============================================================================
--- python/branches/trunk-math/Objects/dictobject.c	(original)
+++ python/branches/trunk-math/Objects/dictobject.c	Tue Feb 12 06:36:19 2008
@@ -162,6 +162,22 @@
 }
 #endif
 
+/* Debug statistic to compare allocations with reuse through the free list */
+#undef SHOW_ALLOC_COUNT
+#ifdef SHOW_ALLOC_COUNT
+static size_t count_alloc = 0;
+static size_t count_reuse = 0;
+
+static void
+show_alloc(void)
+{
+	fprintf(stderr, "Dict allocations: %zd\n", count_alloc);
+	fprintf(stderr, "Dict reuse through freelist: %zd\n", count_reuse);
+	fprintf(stderr, "%.2f%% reuse rate\n\n",
+		(100.0*count_reuse/(count_alloc+count_reuse)));
+}
+#endif
+
 /* Initialization macros.
    There are two ways to create a dict:  PyDict_New() is the main C API
    function, and the tp_new slot maps to dict_new().  In the latter case we
@@ -183,9 +199,23 @@
     } while(0)
 
 /* Dictionary reuse scheme to save calls to malloc, free, and memset */
-#define MAXFREEDICTS 80
-static PyDictObject *free_dicts[MAXFREEDICTS];
-static int num_free_dicts = 0;
+#ifndef PyDict_MAXFREELIST
+#define PyDict_MAXFREELIST 80
+#endif
+static PyDictObject *free_list[PyDict_MAXFREELIST];
+static int numfree = 0;
+
+void
+PyDict_Fini(void)
+{
+	PyDictObject *op;
+
+	while (numfree) {
+		op = free_list[--numfree];
+		assert(PyDict_CheckExact(op));
+		PyObject_GC_Del(op);
+	}
+}
 
 PyObject *
 PyDict_New(void)
@@ -198,9 +228,12 @@
 #ifdef SHOW_CONVERSION_COUNTS
 		Py_AtExit(show_counts);
 #endif
+#ifdef SHOW_ALLOC_COUNT
+		Py_AtExit(show_alloc);
+#endif
 	}
-	if (num_free_dicts) {
-		mp = free_dicts[--num_free_dicts];
+	if (numfree) {
+		mp = free_list[--numfree];
 		assert (mp != NULL);
 		assert (Py_TYPE(mp) == &PyDict_Type);
 		_Py_NewReference((PyObject *)mp);
@@ -210,11 +243,17 @@
 		assert (mp->ma_used == 0);
 		assert (mp->ma_table == mp->ma_smalltable);
 		assert (mp->ma_mask == PyDict_MINSIZE - 1);
+#ifdef SHOW_ALLOC_COUNT
+		count_reuse++;
+#endif
 	} else {
 		mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
 		if (mp == NULL)
 			return NULL;
 		EMPTY_TO_MINSIZE(mp);
+#ifdef SHOW_ALLOC_COUNT
+		count_alloc++;
+#endif
 	}
 	mp->ma_lookup = lookdict_string;
 #ifdef SHOW_CONVERSION_COUNTS
@@ -868,8 +907,8 @@
 	}
 	if (mp->ma_table != mp->ma_smalltable)
 		PyMem_DEL(mp->ma_table);
-	if (num_free_dicts < MAXFREEDICTS && Py_TYPE(mp) == &PyDict_Type)
-		free_dicts[num_free_dicts++] = mp;
+	if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
+		free_list[numfree++] = mp;
 	else
 		Py_TYPE(mp)->tp_free((PyObject *)mp);
 	Py_TRASHCAN_SAFE_END(mp)
@@ -1489,6 +1528,10 @@
 static PyObject *
 dict_copy(register PyDictObject *mp)
 {
+	if (Py_Py3kWarningFlag &&
+	    PyErr_Warn(PyExc_DeprecationWarning, 
+		       "dict.copy() not supported in 3.x") < 0)
+		return NULL;
 	return PyDict_Copy((PyObject*)mp);
 }
 

Modified: python/branches/trunk-math/Objects/floatobject.c
==============================================================================
--- python/branches/trunk-math/Objects/floatobject.c	(original)
+++ python/branches/trunk-math/Objects/floatobject.c	Tue Feb 12 06:36:19 2008
@@ -55,7 +55,7 @@
 	return DBL_MIN;
 }
 
-static PyTypeObject FloatInfoType = {0};
+static PyTypeObject FloatInfoType = {0, 0, 0, 0, 0, 0};
 
 PyDoc_STRVAR(floatinfo__doc__,
 "sys.floatinfo\n\
@@ -94,15 +94,9 @@
 PyObject *
 PyFloat_GetInfo(void)
 {
-	static PyObject* floatinfo;
+	PyObject* floatinfo;
 	int pos = 0;
 
-	if (floatinfo != NULL) {
-		Py_INCREF(floatinfo);
-		return floatinfo;
-	}
-	PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
-	
 	floatinfo = PyStructSequence_New(&FloatInfoType);
 	if (floatinfo == NULL) {
 		return NULL;
@@ -131,8 +125,6 @@
 		Py_CLEAR(floatinfo);
 		return NULL;
 	}
-
-	Py_INCREF(floatinfo);
 	return floatinfo;
 }
 
@@ -1159,20 +1151,19 @@
 }
 
 static PyObject *
-float_as_integer_ratio(PyObject *v)
+float_as_integer_ratio(PyObject *v, PyObject *unused)
 {
 	double self;
 	double float_part;
 	int exponent;
-	int is_negative;
-	const int chunk_size = 28;
+	int i;
+
 	PyObject *prev;
-	PyObject *py_chunk = NULL;
 	PyObject *py_exponent = NULL;
 	PyObject *numerator = NULL;
 	PyObject *denominator = NULL;
 	PyObject *result_pair = NULL;
-	PyNumberMethods *long_methods;
+	PyNumberMethods *long_methods = PyLong_Type.tp_as_number;
 
 #define INPLACE_UPDATE(obj, call) \
 	prev = obj; \
@@ -1194,93 +1185,31 @@
 	}
 #endif
 
-	if (self == 0) {
-		numerator = PyInt_FromLong(0);
-		if (numerator == NULL) goto error;
-		denominator = PyInt_FromLong(1);
-		if (denominator == NULL) goto error;
-		result_pair = PyTuple_Pack(2, numerator, denominator);
-		/* Hand ownership over to the tuple. If the tuple
-		   wasn't created successfully, we want to delete the
-		   ints anyway. */
-		Py_DECREF(numerator);
-		Py_DECREF(denominator);
-		return result_pair;
-	}
-
-	/* XXX: Could perhaps handle FLT_RADIX!=2 by using ilogb and
-	   scalbn, but those may not be in C89. */
 	PyFPE_START_PROTECT("as_integer_ratio", goto error);
-	float_part = frexp(self, &exponent);
-	is_negative = 0;
-	if (float_part < 0) {
-		float_part = -float_part;
-		is_negative = 1;
-		/* 0.5 <= float_part < 1.0 */
-	}
+	float_part = frexp(self, &exponent);  	/* self == float_part * 2**exponent exactly */
 	PyFPE_END_PROTECT(float_part);
-	/* abs(self) == float_part * 2**exponent exactly */
+	
+	for (i=0; i<300 && float_part != floor(float_part) ; i++) {
+		float_part *= 2.0;
+		exponent--;
+	}	
+	/* self == float_part * 2**exponent exactly and float_part is integral.
+           If FLT_RADIX != 2, the 300 steps may leave a tiny fractional part
+           to be truncated by PyLong_FromDouble(). */
 
-	/* Suck up chunk_size bits at a time; 28 is enough so that we
-	   suck up all bits in 2 iterations for all known binary
-	   double-precision formats, and small enough to fit in a
-	   long. */
-	numerator = PyLong_FromLong(0);
+	numerator = PyLong_FromDouble(float_part);
 	if (numerator == NULL) goto error;
 
-	long_methods = PyLong_Type.tp_as_number;
-
-	py_chunk = PyLong_FromLong(chunk_size);
-	if (py_chunk == NULL) goto error;
-
-	while (float_part != 0) {
-		/* invariant: abs(self) ==
-		   (numerator + float_part) * 2**exponent exactly */
-		long digit;
-		PyObject *py_digit;
-
-		PyFPE_START_PROTECT("as_integer_ratio", goto error);
-		/* Pull chunk_size bits out of float_part, into digits. */
-		float_part = ldexp(float_part, chunk_size);
-		digit = (long)float_part;
-		float_part -= digit;
-                /* 0 <= float_part < 1 */
-		exponent -= chunk_size;
-		PyFPE_END_PROTECT(float_part);
-
-		/* Shift digits into numerator. */
-		// numerator <<= chunk_size
-		INPLACE_UPDATE(numerator,
-			       long_methods->nb_lshift(numerator, py_chunk));
-		if (numerator == NULL) goto error;
-
-		// numerator |= digit
-		py_digit = PyLong_FromLong(digit);
-		if (py_digit == NULL) goto error;
-		INPLACE_UPDATE(numerator,
-			       long_methods->nb_or(numerator, py_digit));
-		Py_DECREF(py_digit);
-		if (numerator == NULL) goto error;
-	}
-
-	/* Add in the sign bit. */
-	if (is_negative) {
-		INPLACE_UPDATE(numerator,
-			       long_methods->nb_negative(numerator));
-		if (numerator == NULL) goto error;
-	}
-
-	/* now self = numerator * 2**exponent exactly; fold in 2**exponent */
+	/* fold in 2**exponent */
 	denominator = PyLong_FromLong(1);
-	py_exponent = PyLong_FromLong(labs(exponent));
+	py_exponent = PyLong_FromLong(labs((long)exponent));
 	if (py_exponent == NULL) goto error;
 	INPLACE_UPDATE(py_exponent,
 		       long_methods->nb_lshift(denominator, py_exponent));
 	if (py_exponent == NULL) goto error;
 	if (exponent > 0) {
 		INPLACE_UPDATE(numerator,
-			       long_methods->nb_multiply(numerator,
-							 py_exponent));
+			       long_methods->nb_multiply(numerator, py_exponent));
 		if (numerator == NULL) goto error;
 	}
 	else {
@@ -1289,12 +1218,17 @@
 		py_exponent = NULL;
 	}
 
+	/* Returns ints instead of longs where possible */
+	INPLACE_UPDATE(numerator, PyNumber_Int(numerator));
+	if (numerator == NULL) goto error;
+	INPLACE_UPDATE(denominator, PyNumber_Int(denominator));
+	if (denominator == NULL) goto error;
+
 	result_pair = PyTuple_Pack(2, numerator, denominator);
 
 #undef INPLACE_UPDATE
 error:
 	Py_XDECREF(py_exponent);
-	Py_XDECREF(py_chunk);
 	Py_XDECREF(denominator);
 	Py_XDECREF(numerator);
 	return result_pair;
@@ -1303,17 +1237,16 @@
 PyDoc_STRVAR(float_as_integer_ratio_doc,
 "float.as_integer_ratio() -> (int, int)\n"
 "\n"
-"Returns a pair of integers, not necessarily in lowest terms, whose\n"
-"ratio is exactly equal to the original float. This method raises an\n"
-"OverflowError on infinities and a ValueError on nans. The resulting\n"
-"denominator will be positive.\n"
+"Returns a pair of integers, whose ratio is exactly equal to the original\n"
+"float and with a positive denominator.\n"
+"Raises OverflowError on infinities and a ValueError on nans.\n"
 "\n"
 ">>> (10.0).as_integer_ratio()\n"
-"(167772160L, 16777216L)\n"
+"(10, 1)\n"
 ">>> (0.0).as_integer_ratio()\n"
 "(0, 1)\n"
 ">>> (-.25).as_integer_ratio()\n"
-"(-134217728L, 536870912L)");
+"(-1, 4)");
 
 
 static PyObject *
@@ -1667,20 +1600,21 @@
 	/* Initialize floating point repr */
 	_PyFloat_DigitsInit();
 #endif
+	/* Init float info */
+	if (FloatInfoType.tp_name == 0)
+		PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
 }
 
 void
-PyFloat_Fini(void)
+PyFloat_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum)
 {
 	PyFloatObject *p;
 	PyFloatBlock *list, *next;
 	unsigned i;
-	int bc, bf;	/* block count, number of freed blocks */
-	int frem, fsum;	/* remaining unfreed floats per block, total */
+	size_t bc = 0, bf = 0;	/* block count, number of freed blocks */
+	size_t fsum = 0;	/* total unfreed ints */
+	int frem;		/* remaining unfreed ints per block */
 
-	bc = 0;
-	bf = 0;
-	fsum = 0;
 	list = block_list;
 	block_list = NULL;
 	free_list = NULL;
@@ -1715,6 +1649,22 @@
 		fsum += frem;
 		list = next;
 	}
+	*pbc = bc;
+	*pbf = bf;
+	*bsum = fsum;
+}
+
+void
+PyFloat_Fini(void)
+{
+	PyFloatObject *p;
+	PyFloatBlock *list;
+	unsigned i;
+	size_t bc, bf;	/* block count, number of freed blocks */
+	size_t fsum;	/* total unfreed floats per block */
+
+	PyFloat_CompactFreeList(&bc, &bf, &fsum);
+
 	if (!Py_VerboseFlag)
 		return;
 	fprintf(stderr, "# cleanup floats");
@@ -1723,7 +1673,9 @@
 	}
 	else {
 		fprintf(stderr,
-			": %d unfreed float%s in %d out of %d block%s\n",
+			": %" PY_FORMAT_SIZE_T "d unfreed floats%s in %"
+			PY_FORMAT_SIZE_T "d out of %"
+			PY_FORMAT_SIZE_T "d block%s\n",
 			fsum, fsum == 1 ? "" : "s",
 			bc - bf, bc, bc == 1 ? "" : "s");
 	}

Modified: python/branches/trunk-math/Objects/frameobject.c
==============================================================================
--- python/branches/trunk-math/Objects/frameobject.c	(original)
+++ python/branches/trunk-math/Objects/frameobject.c	Tue Feb 12 06:36:19 2008
@@ -393,14 +393,15 @@
    call depth of more than 20 or 30 is probably already exceptional
    unless the program contains run-away recursion.  I hope.
 
-   Later, MAXFREELIST was added to bound the # of frames saved on
+   Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
    free_list.  Else programs creating lots of cyclic trash involving
    frames could provoke free_list into growing without bound.
 */
 
 static PyFrameObject *free_list = NULL;
 static int numfree = 0;		/* number of frames currently in free_list */
-#define MAXFREELIST 200		/* max value for numfree */
+/* max value for numfree */
+#define PyFrame_MAXFREELIST 200	
 
 static void
 frame_dealloc(PyFrameObject *f)
@@ -433,7 +434,7 @@
 	co = f->f_code;
 	if (co->co_zombieframe == NULL)
 		co->co_zombieframe = f;
-	else if (numfree < MAXFREELIST) {
+	else if (numfree < PyFrame_MAXFREELIST) {
 		++numfree;
 		f->f_back = free_list;
 		free_list = f;

Modified: python/branches/trunk-math/Objects/intobject.c
==============================================================================
--- python/branches/trunk-math/Objects/intobject.c	(original)
+++ python/branches/trunk-math/Objects/intobject.c	Tue Feb 12 06:36:19 2008
@@ -437,9 +437,7 @@
 static PyObject *
 int_repr(PyIntObject *v)
 {
-	char buf[64];
-	PyOS_snprintf(buf, sizeof(buf), "%ld", v->ob_ival);
-	return PyString_FromString(buf);
+	return _PyInt_Format(v, 10, 0);
 }
 
 static int
@@ -938,27 +936,13 @@
 static PyObject *
 int_oct(PyIntObject *v)
 {
-	char buf[100];
-	long x = v -> ob_ival;
-	if (x < 0)
-		PyOS_snprintf(buf, sizeof(buf), "-0%lo", -x);
-	else if (x == 0)
-		strcpy(buf, "0");
-	else
-		PyOS_snprintf(buf, sizeof(buf), "0%lo", x);
-	return PyString_FromString(buf);
+	return _PyInt_Format(v, 8, 0);
 }
 
 static PyObject *
 int_hex(PyIntObject *v)
 {
-	char buf[100];
-	long x = v -> ob_ival;
-	if (x < 0)
-		PyOS_snprintf(buf, sizeof(buf), "-0x%lx", -x);
-	else
-		PyOS_snprintf(buf, sizeof(buf), "0x%lx", x);
-	return PyString_FromString(buf);
+	return _PyInt_Format(v, 16, 0);
 }
 
 static PyObject *
@@ -1056,6 +1040,74 @@
 	return PyInt_FromLong((intptr_t)context);
 }
 
+/* Convert an integer to the given base.  Returns a string.
+   If base is 2, 8 or 16, add the proper prefix '0b', '0o' or '0x'.
+   If newstyle is zero, then use the pre-2.6 behavior of octal having
+   a leading "0" */
+PyAPI_FUNC(PyObject*)
+_PyInt_Format(PyIntObject *v, int base, int newstyle)
+{
+	/* There are no doubt many, many ways to optimize this, using code
+	   similar to _PyLong_Format */
+	long n = v->ob_ival;
+	int  negative = n < 0;
+	int is_zero = n == 0;
+
+	/* For the reasoning behind this size, see
+	   http://c-faq.com/misc/hexio.html. Then, add a few bytes for
+	   the possible sign and prefix "0[box]" */
+	char buf[sizeof(n)*CHAR_BIT+6];
+
+	/* Start by pointing to the end of the buffer.  We fill in from
+	   the back forward. */
+	char* p = &buf[sizeof(buf)];
+
+	assert(base >= 2 && base <= 36);
+
+	do {
+		/* I'd use i_divmod, except it doesn't produce the results
+		   I want when n is negative.  So just duplicate the salient
+		   part here. */
+		long div = n / base;
+		long mod = n - div * base;
+
+		/* convert abs(mod) to the right character in [0-9, a-z] */
+		char cdigit = (char)(mod < 0 ? -mod : mod);
+		cdigit += (cdigit < 10) ? '0' : 'a'-10;
+		*--p = cdigit;
+
+		n = div;
+	} while(n);
+
+	if (base == 2) {
+		*--p = 'b';
+		*--p = '0';
+	}
+	else if (base == 8) {
+		if (newstyle) {
+			*--p = 'o';
+			*--p = '0';
+		}
+		else
+			if (!is_zero)
+				*--p = '0';
+	}
+	else if (base == 16) {
+		*--p = 'x';
+		*--p = '0';
+	}
+	else if (base != 10) {
+		*--p = '#';
+		*--p = '0' + base%10;
+		if (base > 10)
+			*--p = '0' + base/10;
+	}
+	if (negative)
+		*--p = '-';
+
+	return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p);
+}
+
 static PyMethodDef int_methods[] = {
 	{"conjugate",	(PyCFunction)int_int,	METH_NOARGS,
 	 "Returns self, the complex conjugate of any int."},
@@ -1202,28 +1254,15 @@
 }
 
 void
-PyInt_Fini(void)
+PyInt_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum)
 {
 	PyIntObject *p;
 	PyIntBlock *list, *next;
-	int i;
 	unsigned int ctr;
-	int bc, bf;	/* block count, number of freed blocks */
-	int irem, isum;	/* remaining unfreed ints per block, total */
-
-#if NSMALLNEGINTS + NSMALLPOSINTS > 0
-        PyIntObject **q;
+	size_t bc = 0, bf = 0;	/* block count, number of freed blocks */
+	size_t isum = 0;	/* total unfreed ints */
+	int irem;		/* remaining unfreed ints per block */
 
-        i = NSMALLNEGINTS + NSMALLPOSINTS;
-        q = small_ints;
-        while (--i >= 0) {
-                Py_XDECREF(*q);
-                *q++ = NULL;
-        }
-#endif
-	bc = 0;
-	bf = 0;
-	isum = 0;
 	list = block_list;
 	block_list = NULL;
 	free_list = NULL;
@@ -1268,6 +1307,33 @@
 		isum += irem;
 		list = next;
 	}
+
+	*pbc = bc;
+	*pbf = bf;
+	*bsum = isum;
+}
+
+void
+PyInt_Fini(void)
+{
+	PyIntObject *p;
+	PyIntBlock *list;
+	unsigned int ctr;
+	size_t bc, bf;	/* block count, number of freed blocks */
+	size_t isum;	/* total unfreed ints per block */
+
+#if NSMALLNEGINTS + NSMALLPOSINTS > 0
+	int i;
+	PyIntObject **q;
+
+	i = NSMALLNEGINTS + NSMALLPOSINTS;
+	q = small_ints;
+	while (--i >= 0) {
+		Py_XDECREF(*q);
+		*q++ = NULL;
+	}
+#endif
+	PyInt_CompactFreeList(&bc, &bf, &isum);
 	if (!Py_VerboseFlag)
 		return;
 	fprintf(stderr, "# cleanup ints");
@@ -1276,7 +1342,9 @@
 	}
 	else {
 		fprintf(stderr,
-			": %d unfreed int%s in %d out of %d block%s\n",
+			": %" PY_FORMAT_SIZE_T "d unfreed ints%s in %"
+			PY_FORMAT_SIZE_T "d out of %"
+			PY_FORMAT_SIZE_T "d block%s\n",
 			isum, isum == 1 ? "" : "s",
 			bc - bf, bc, bc == 1 ? "" : "s");
 	}

Modified: python/branches/trunk-math/Objects/listobject.c
==============================================================================
--- python/branches/trunk-math/Objects/listobject.c	(original)
+++ python/branches/trunk-math/Objects/listobject.c	Tue Feb 12 06:36:19 2008
@@ -63,19 +63,36 @@
 	return 0;
 }
 
+/* Debug statistic to compare allocations with reuse through the free list */
+#undef SHOW_ALLOC_COUNT
+#ifdef SHOW_ALLOC_COUNT
+static size_t count_alloc = 0;
+static size_t count_reuse = 0;
+
+static void
+show_alloc(void)
+{
+	fprintf(stderr, "List allocations: %zd\n", count_alloc);
+	fprintf(stderr, "List reuse through freelist: %zd\n", count_reuse);
+	fprintf(stderr, "%.2f%% reuse rate\n\n",
+		(100.0*count_reuse/(count_alloc+count_reuse)));
+}
+#endif
+
 /* Empty list reuse scheme to save calls to malloc and free */
-#define MAXFREELISTS 80
-static PyListObject *free_lists[MAXFREELISTS];
-static int num_free_lists = 0;
+#ifndef PyList_MAXFREELIST
+#define PyList_MAXFREELIST 80
+#endif
+static PyListObject *free_list[PyList_MAXFREELIST];
+static int numfree = 0;
 
 void
 PyList_Fini(void)
 {
 	PyListObject *op;
 
-	while (num_free_lists) {
-		num_free_lists--;
-		op = free_lists[num_free_lists]; 
+	while (numfree) {
+		op = free_list[--numfree];
 		assert(PyList_CheckExact(op));
 		PyObject_GC_Del(op);
 	}
@@ -86,6 +103,13 @@
 {
 	PyListObject *op;
 	size_t nbytes;
+#ifdef SHOW_ALLOC_COUNT
+	static int initialized = 0;
+	if (!initialized) {
+		Py_AtExit(show_alloc);
+		initialized = 1;
+	}
+#endif
 
 	if (size < 0) {
 		PyErr_BadInternalCall();
@@ -95,14 +119,20 @@
 	/* Check for overflow */
 	if (nbytes / sizeof(PyObject *) != (size_t)size)
 		return PyErr_NoMemory();
-	if (num_free_lists) {
-		num_free_lists--;
-		op = free_lists[num_free_lists];
+	if (numfree) {
+		numfree--;
+		op = free_list[numfree];
 		_Py_NewReference((PyObject *)op);
+#ifdef SHOW_ALLOC_COUNT
+		count_reuse++;
+#endif
 	} else {
 		op = PyObject_GC_New(PyListObject, &PyList_Type);
 		if (op == NULL)
 			return NULL;
+#ifdef SHOW_ALLOC_COUNT
+		count_alloc++;
+#endif
 	}
 	if (size <= 0)
 		op->ob_item = NULL;
@@ -265,8 +295,8 @@
 		}
 		PyMem_FREE(op->ob_item);
 	}
-	if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op))
-		free_lists[num_free_lists++] = op;
+	if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
+		free_list[numfree++] = op;
 	else
 		Py_TYPE(op)->tp_free((PyObject *)op);
 	Py_TRASHCAN_SAFE_END(op)

Modified: python/branches/trunk-math/Objects/longobject.c
==============================================================================
--- python/branches/trunk-math/Objects/longobject.c	(original)
+++ python/branches/trunk-math/Objects/longobject.c	Tue Feb 12 06:36:19 2008
@@ -35,7 +35,6 @@
 static PyLongObject *mul1(PyLongObject *, wdigit);
 static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
 static PyLongObject *divrem1(PyLongObject *, digit, digit *);
-static PyObject *long_format(PyObject *aa, int base, int addL);
 
 #define SIGCHECK(PyTryBlock) \
 	if (--_Py_Ticker < 0) { \
@@ -1140,7 +1139,7 @@
 /* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
    in pout, and returning the remainder.  pin and pout point at the LSD.
    It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
-   long_format, but that should be done with great care since longs are
+   _PyLong_Format, but that should be done with great care since longs are
    immutable. */
 
 static digit
@@ -1178,12 +1177,13 @@
 	return long_normalize(z);
 }
 
-/* Convert a long int object to a string, using a given conversion base.
-   Return a string object.
-   If base is 8 or 16, add the proper prefix '0' or '0x'. */
-
-static PyObject *
-long_format(PyObject *aa, int base, int addL)
+/* Convert the long to a string object with given base,
+   appending a base prefix of 0[box] if base is 2, 8 or 16.
+   Add a trailing "L" if addL is non-zero.
+   If newstyle is zero, then use the pre-2.6 behavior of octal having
+   a leading "0", instead of the prefix "0o" */
+PyAPI_FUNC(PyObject *)
+_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
 {
 	register PyLongObject *a = (PyLongObject *)aa;
 	PyStringObject *str;
@@ -1309,9 +1309,18 @@
 		Py_DECREF(scratch);
 	}
 
-	if (base == 8) {
-		if (size_a != 0)
+	if (base == 2) {
+		*--p = 'b';
+		*--p = '0';
+	}
+	else if (base == 8) {
+ 		if (newstyle) {
+			*--p = 'o';
 			*--p = '0';
+		}
+		else
+			if (size_a != 0)
+				*--p = '0';
 	}
 	else if (base == 16) {
 		*--p = 'x';
@@ -1888,13 +1897,13 @@
 static PyObject *
 long_repr(PyObject *v)
 {
-	return long_format(v, 10, 1);
+	return _PyLong_Format(v, 10, 1, 0);
 }
 
 static PyObject *
 long_str(PyObject *v)
 {
-	return long_format(v, 10, 0);
+	return _PyLong_Format(v, 10, 0, 0);
 }
 
 static int
@@ -3268,13 +3277,13 @@
 static PyObject *
 long_oct(PyObject *v)
 {
-	return long_format(v, 8, 1);
+	return _PyLong_Format(v, 8, 1, 0);
 }
 
 static PyObject *
 long_hex(PyObject *v)
 {
-	return long_format(v, 16, 1);
+	return _PyLong_Format(v, 16, 1, 0);
 }
 
 static PyObject *

Modified: python/branches/trunk-math/Objects/methodobject.c
==============================================================================
--- python/branches/trunk-math/Objects/methodobject.c	(original)
+++ python/branches/trunk-math/Objects/methodobject.c	Tue Feb 12 06:36:19 2008
@@ -4,7 +4,14 @@
 #include "Python.h"
 #include "structmember.h"
 
+/* Free list for method objects to safe malloc/free overhead
+ * The m_self element is used to chain the objects.
+ */
 static PyCFunctionObject *free_list = NULL;
+static int numfree = 0;
+#ifndef PyCFunction_MAXFREELIST
+#define PyCFunction_MAXFREELIST 256
+#endif
 
 PyObject *
 PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
@@ -14,6 +21,7 @@
 	if (op != NULL) {
 		free_list = (PyCFunctionObject *)(op->m_self);
 		PyObject_INIT(op, &PyCFunction_Type);
+		numfree--;
 	}
 	else {
 		op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type);
@@ -125,8 +133,14 @@
 	_PyObject_GC_UNTRACK(m);
 	Py_XDECREF(m->m_self);
 	Py_XDECREF(m->m_module);
-	m->m_self = (PyObject *)free_list;
-	free_list = m;
+	if (numfree < PyCFunction_MAXFREELIST) {
+		m->m_self = (PyObject *)free_list;
+		free_list = m;
+		numfree++;
+	}
+	else {
+		PyObject_GC_Del(m);
+	}
 }
 
 static PyObject *
@@ -346,14 +360,16 @@
 		PyCFunctionObject *v = free_list;
 		free_list = (PyCFunctionObject *)(v->m_self);
 		PyObject_GC_Del(v);
+		numfree--;
 	}
+	assert(numfree == 0);
 }
 
 /* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
    but it's part of the API so we need to keep a function around that
    existing C extensions can call.
 */
-   
+
 #undef PyCFunction_New
 PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *);
 

Modified: python/branches/trunk-math/Objects/rangeobject.c
==============================================================================
--- python/branches/trunk-math/Objects/rangeobject.c	(original)
+++ python/branches/trunk-math/Objects/rangeobject.c	Tue Feb 12 06:36:19 2008
@@ -98,7 +98,7 @@
 				"xrange object index out of range");
 		return NULL;
 	}
-	return PyInt_FromSsize_t(r->start + (i % r->len) * r->step);
+	return PyInt_FromSsize_t(r->start + i * r->step);
 }
 
 static Py_ssize_t

Modified: python/branches/trunk-math/Objects/setobject.c
==============================================================================
--- python/branches/trunk-math/Objects/setobject.c	(original)
+++ python/branches/trunk-math/Objects/setobject.c	Tue Feb 12 06:36:19 2008
@@ -51,9 +51,11 @@
     } while(0)
 
 /* Reuse scheme to save calls to malloc, free, and memset */
-#define MAXFREESETS 80
-static PySetObject *free_sets[MAXFREESETS];
-static int num_free_sets = 0;
+#ifndef PySet_MAXFREELIST
+#define PySet_MAXFREELIST 80
+#endif
+static PySetObject *free_list[PySet_MAXFREELIST];
+static int numfree = 0;
 
 /*
 The basic lookup function used by all operations.
@@ -558,8 +560,8 @@
 	}
 	if (so->table != so->smalltable)
 		PyMem_DEL(so->table);
-	if (num_free_sets < MAXFREESETS && PyAnySet_CheckExact(so))
-		free_sets[num_free_sets++] = so;
+	if (numfree < PySet_MAXFREELIST && PyAnySet_CheckExact(so))
+		free_list[numfree++] = so;
 	else 
 		Py_TYPE(so)->tp_free(so);
 	Py_TRASHCAN_SAFE_END(so)
@@ -983,9 +985,9 @@
 	}
 
 	/* create PySetObject structure */
-	if (num_free_sets && 
+	if (numfree &&
 	    (type == &PySet_Type  ||  type == &PyFrozenSet_Type)) {
-		so = free_sets[--num_free_sets];
+		so = free_list[--numfree];
 		assert (so != NULL && PyAnySet_CheckExact(so));
 		Py_TYPE(so) = type;
 		_Py_NewReference((PyObject *)so);
@@ -1053,9 +1055,9 @@
 {
 	PySetObject *so;
 
-	while (num_free_sets) {
-		num_free_sets--;
-		so = free_sets[num_free_sets];
+	while (numfree) {
+		numfree--;
+		so = free_list[numfree];
 		PyObject_GC_Del(so);
 	}
 	Py_CLEAR(dummy);
@@ -1129,8 +1131,22 @@
 }
 
 static PyObject *
+set_copy_method(PySetObject *so)
+{
+	if (Py_Py3kWarningFlag &&
+	    PyErr_Warn(PyExc_DeprecationWarning, 
+		       "set.copy() not supported in 3.x") < 0)
+		return NULL;
+	return make_new_set(Py_TYPE(so), (PyObject *)so);
+}
+
+static PyObject *
 frozenset_copy(PySetObject *so)
 {
+	if (Py_Py3kWarningFlag &&
+	    PyErr_Warn(PyExc_DeprecationWarning, 
+		       "frozenset.copy() not supported in 3.x") < 0)
+		return NULL;
 	if (PyFrozenSet_CheckExact(so)) {
 		Py_INCREF(so);
 		return (PyObject *)so;
@@ -1909,7 +1925,7 @@
 	 clear_doc},
 	{"__contains__",(PyCFunction)set_direct_contains,	METH_O | METH_COEXIST,
 	 contains_doc},
-	{"copy",	(PyCFunction)set_copy,		METH_NOARGS,
+	{"copy",	(PyCFunction)set_copy_method,	METH_NOARGS,
 	 copy_doc},
 	{"discard",	(PyCFunction)set_discard,	METH_O,
 	 discard_doc},
@@ -2188,7 +2204,8 @@
 int
 PySet_Add(PyObject *anyset, PyObject *key)
 {
-	if (!PyAnySet_Check(anyset)) {
+	if (!PySet_Check(anyset) && 
+	    (!PyFrozenSet_Check(anyset) || Py_REFCNT(anyset) != 1)) {
 		PyErr_BadInternalCall();
 		return -1;
 	}
@@ -2306,6 +2323,10 @@
 	f = PyFrozenSet_New(dup);
 	assertRaises(PySet_Clear(f) == -1, PyExc_SystemError);
 	assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError);
+	assert(PySet_Add(f, elem) == 0);
+	Py_INCREF(f);
+	assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError);
+	Py_DECREF(f);
 	Py_DECREF(f);
 
 	/* Exercise direct iteration */

Modified: python/branches/trunk-math/Objects/tupleobject.c
==============================================================================
--- python/branches/trunk-math/Objects/tupleobject.c	(original)
+++ python/branches/trunk-math/Objects/tupleobject.c	Tue Feb 12 06:36:19 2008
@@ -4,19 +4,19 @@
 #include "Python.h"
 
 /* Speed optimization to avoid frequent malloc/free of small tuples */
-#ifndef MAXSAVESIZE
-#define MAXSAVESIZE	20  /* Largest tuple to save on free list */
+#ifndef PyTuple_MAXSAVESIZE
+#define PyTuple_MAXSAVESIZE	20  /* Largest tuple to save on free list */
 #endif
-#ifndef MAXSAVEDTUPLES 
-#define MAXSAVEDTUPLES  2000  /* Maximum number of tuples of each size to save */
+#ifndef PyTuple_MAXFREELIST 
+#define PyTuple_MAXFREELIST  2000  /* Maximum number of tuples of each size to save */
 #endif
 
-#if MAXSAVESIZE > 0
-/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
+#if PyTuple_MAXSAVESIZE > 0
+/* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
    tuple () of which at most one instance will be allocated.
 */
-static PyTupleObject *free_tuples[MAXSAVESIZE];
-static int num_free_tuples[MAXSAVESIZE];
+static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
+static int numfree[PyTuple_MAXSAVESIZE];
 #endif
 #ifdef COUNT_ALLOCS
 int fast_tuple_allocs;
@@ -32,18 +32,18 @@
 		PyErr_BadInternalCall();
 		return NULL;
 	}
-#if MAXSAVESIZE > 0
-	if (size == 0 && free_tuples[0]) {
-		op = free_tuples[0];
+#if PyTuple_MAXSAVESIZE > 0
+	if (size == 0 && free_list[0]) {
+		op = free_list[0];
 		Py_INCREF(op);
 #ifdef COUNT_ALLOCS
 		tuple_zero_allocs++;
 #endif
 		return (PyObject *) op;
 	}
-	if (size < MAXSAVESIZE && (op = free_tuples[size]) != NULL) {
-		free_tuples[size] = (PyTupleObject *) op->ob_item[0];
-		num_free_tuples[size]--;
+	if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
+		free_list[size] = (PyTupleObject *) op->ob_item[0];
+		numfree[size]--;
 #ifdef COUNT_ALLOCS
 		fast_tuple_allocs++;
 #endif
@@ -71,10 +71,10 @@
 	}
 	for (i=0; i < size; i++)
 		op->ob_item[i] = NULL;
-#if MAXSAVESIZE > 0
+#if PyTuple_MAXSAVESIZE > 0
 	if (size == 0) {
-		free_tuples[0] = op;
-		++num_free_tuples[0];
+		free_list[0] = op;
+		++numfree[0];
 		Py_INCREF(op);	/* extra INCREF so that this is never freed */
 	}
 #endif
@@ -167,14 +167,14 @@
 		i = len;
 		while (--i >= 0)
 			Py_XDECREF(op->ob_item[i]);
-#if MAXSAVESIZE > 0
-		if (len < MAXSAVESIZE &&
-		    num_free_tuples[len] < MAXSAVEDTUPLES &&
+#if PyTuple_MAXSAVESIZE > 0
+		if (len < PyTuple_MAXSAVESIZE &&
+		    numfree[len] < PyTuple_MAXFREELIST &&
 		    Py_TYPE(op) == &PyTuple_Type)
 		{
-			op->ob_item[0] = (PyObject *) free_tuples[len];
-			num_free_tuples[len]++;
-			free_tuples[len] = op;
+			op->ob_item[0] = (PyObject *) free_list[len];
+			numfree[len]++;
+			free_list[len] = op;
 			goto done; /* return */
 		}
 #endif
@@ -455,6 +455,53 @@
 	return (PyObject *) np;
 }
 
+static PyObject *
+tupleindex(PyTupleObject *self, PyObject *args)
+{
+	Py_ssize_t i, start=0, stop=Py_SIZE(self);
+	PyObject *v;
+
+	if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
+	                            _PyEval_SliceIndex, &start,
+	                            _PyEval_SliceIndex, &stop))
+		return NULL;
+	if (start < 0) {
+		start += Py_SIZE(self);
+		if (start < 0)
+			start = 0;
+	}
+	if (stop < 0) {
+		stop += Py_SIZE(self);
+		if (stop < 0)
+			stop = 0;
+	}
+	for (i = start; i < stop && i < Py_SIZE(self); i++) {
+		int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
+		if (cmp > 0)
+			return PyInt_FromSsize_t(i);
+		else if (cmp < 0)
+			return NULL;
+	}
+	PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in list");
+	return NULL;
+}
+
+static PyObject *
+tuplecount(PyTupleObject *self, PyObject *v)
+{
+	Py_ssize_t count = 0;
+	Py_ssize_t i;
+
+	for (i = 0; i < Py_SIZE(self); i++) {
+		int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
+		if (cmp > 0)
+			count++;
+		else if (cmp < 0)
+			return NULL;
+	}
+	return PyInt_FromSsize_t(count);
+}
+
 static int
 tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
 {
@@ -661,8 +708,15 @@
 	
 }
 
+PyDoc_STRVAR(index_doc,
+"T.index(value, [start, [stop]]) -> integer -- return first index of value");
+PyDoc_STRVAR(count_doc,
+"T.count(value) -> integer -- return number of occurrences of value");
+
 static PyMethodDef tuple_methods[] = {
 	{"__getnewargs__",	(PyCFunction)tuple_getnewargs,	METH_NOARGS},
+	{"index",	(PyCFunction)tupleindex,  METH_VARARGS, index_doc},
+	{"count",	(PyCFunction)tuplecount,  METH_O, count_doc},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -781,16 +835,16 @@
 void
 PyTuple_Fini(void)
 {
-#if MAXSAVESIZE > 0
+#if PyTuple_MAXSAVESIZE > 0
 	int i;
 
-	Py_XDECREF(free_tuples[0]);
-	free_tuples[0] = NULL;
+	Py_XDECREF(free_list[0]);
+	free_list[0] = NULL;
 
-	for (i = 1; i < MAXSAVESIZE; i++) {
+	for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
 		PyTupleObject *p, *q;
-		p = free_tuples[i];
-		free_tuples[i] = NULL;
+		p = free_list[i];
+		free_list[i] = NULL;
 		while (p) {
 			q = p;
 			p = (PyTupleObject *)(p->ob_item[0]);

Modified: python/branches/trunk-math/Objects/unicodeobject.c
==============================================================================
--- python/branches/trunk-math/Objects/unicodeobject.c	(original)
+++ python/branches/trunk-math/Objects/unicodeobject.c	Tue Feb 12 06:36:19 2008
@@ -51,7 +51,7 @@
 
 /* Limit for the Unicode object free list */
 
-#define MAX_UNICODE_FREELIST_SIZE       1024
+#define PyUnicode_MAXFREELIST       1024
 
 /* Limit for the Unicode object free list stay alive optimization.
 
@@ -59,7 +59,7 @@
    all objects on the free list having a size less than this
    limit. This reduces malloc() overhead for small Unicode objects.
 
-   At worst this will result in MAX_UNICODE_FREELIST_SIZE *
+   At worst this will result in PyUnicode_MAXFREELIST *
    (sizeof(PyUnicodeObject) + KEEPALIVE_SIZE_LIMIT +
    malloc()-overhead) bytes of unused garbage.
 
@@ -93,8 +93,8 @@
 #endif
 
 /* Free list for Unicode objects */
-static PyUnicodeObject *unicode_freelist;
-static int unicode_freelist_size;
+static PyUnicodeObject *free_list;
+static int numfree;
 
 /* The empty Unicode object is shared to improve performance. */
 static PyUnicodeObject *unicode_empty;
@@ -299,10 +299,10 @@
     }
 
     /* Unicode freelist & memory allocation */
-    if (unicode_freelist) {
-        unicode = unicode_freelist;
-        unicode_freelist = *(PyUnicodeObject **)unicode;
-        unicode_freelist_size--;
+    if (free_list) {
+        unicode = free_list;
+        free_list = *(PyUnicodeObject **)unicode;
+        numfree--;
 	if (unicode->str) {
 	    /* Keep-Alive optimization: we only upsize the buffer,
 	       never downsize it. */
@@ -352,7 +352,7 @@
 void unicode_dealloc(register PyUnicodeObject *unicode)
 {
     if (PyUnicode_CheckExact(unicode) &&
-	unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) {
+	numfree < PyUnicode_MAXFREELIST) {
         /* Keep-Alive optimization */
 	if (unicode->length >= KEEPALIVE_SIZE_LIMIT) {
 	    PyMem_DEL(unicode->str);
@@ -364,9 +364,9 @@
 	    unicode->defenc = NULL;
 	}
 	/* Add to free list */
-        *(PyUnicodeObject **)unicode = unicode_freelist;
-        unicode_freelist = unicode;
-        unicode_freelist_size++;
+        *(PyUnicodeObject **)unicode = free_list;
+        free_list = unicode;
+        numfree++;
     }
     else {
 	PyMem_DEL(unicode->str);
@@ -7704,9 +7704,9 @@
 
 #if 0
 static PyObject*
-unicode_freelistsize(PyUnicodeObject *self)
+free_listsize(PyUnicodeObject *self)
 {
-    return PyInt_FromLong(unicode_freelist_size);
+    return PyInt_FromLong(numfree);
 }
 #endif
 
@@ -7861,7 +7861,7 @@
 
 #if 0
     /* This one is just used for debugging the implementation. */
-    {"freelistsize", (PyCFunction) unicode_freelistsize, METH_NOARGS},
+    {"freelistsize", (PyCFunction) free_listsize, METH_NOARGS},
 #endif
 
     {"__getnewargs__",	(PyCFunction)unicode_getnewargs, METH_NOARGS},
@@ -8831,8 +8831,8 @@
     };
 
     /* Init the implementation */
-    unicode_freelist = NULL;
-    unicode_freelist_size = 0;
+    free_list = NULL;
+    numfree = 0;
     unicode_empty = _PyUnicode_New(0);
     if (!unicode_empty)
 	return;
@@ -8869,7 +8869,7 @@
 	}
     }
 
-    for (u = unicode_freelist; u != NULL;) {
+    for (u = free_list; u != NULL;) {
 	PyUnicodeObject *v = u;
 	u = *(PyUnicodeObject **)u;
 	if (v->str)
@@ -8877,8 +8877,8 @@
 	Py_XDECREF(v->defenc);
 	PyObject_Del(v);
     }
-    unicode_freelist = NULL;
-    unicode_freelist_size = 0;
+    free_list = NULL;
+    numfree = 0;
 }
 
 #ifdef __cplusplus

Modified: python/branches/trunk-math/PC/os2emx/Makefile
==============================================================================
--- python/branches/trunk-math/PC/os2emx/Makefile	(original)
+++ python/branches/trunk-math/PC/os2emx/Makefile	Tue Feb 12 06:36:19 2008
@@ -1,16 +1,16 @@
 #####################==================----------------
 #
-# Top-Level Makefile for Building Python 2.4 for OS/2 using GCC/EMX
+# Top-Level Makefile for Building Python 2.6 for OS/2 using GCC/EMX
 # Originally written by Andrew Zabolotny, <bit at eltech.ru> for Python 1.5.2
-# Modified by Andrew MacIntyre, <andymac at pcug.org.au> for Python 2.5
+# Modified by Andrew MacIntyre, <andymac at pcug.org.au> for Python 2.6
 #
 # This makefile was developed for use with [P]GCC/EMX compiler any
 # version and GNU Make.
 #
-# The output of the build is a largish Python25.DLL containing the
+# The output of the build is a largish Python26.DLL containing the
 # essential modules of Python and a small Python.exe program to start
 # the interpreter. When embedding Python within another program, only
-# Python25.DLL is needed. We also build python_s.a static library (which
+# Python26.DLL is needed. We also build python_s.a static library (which
 # can be converted into OMF (.lib) format using emxomf tool) and both
 # python.a and python.lib import libraries.  Then the optional 
 # extension modules, which are OS/2 DLLs renamed with a PYD file extension.
@@ -64,7 +64,7 @@
 
 # === install locations ===
 # default value of PYTHONHOME
-LIB_DIR=C:/Python25
+LIB_DIR=C:/Python26
 # default is to have everything in or under PYTHONHOME
 EXE_DIR=$(LIB_DIR)
 DLL_DIR=$(EXE_DIR)
@@ -236,8 +236,8 @@
 	@echo STACKSIZE 2097152 >>$@
 
 # Output file names
-PYTHON_VER=	2.5
-PYTHON_LIB=	python25
+PYTHON_VER=	2.6
+PYTHON_LIB=	python26
 PYTHON.LIB=	$(PYTHON_LIB)_s$A
 PYTHON.IMPLIB=	$(PYTHON_LIB)$A
 ifeq ($(EXEOMF),yes)

Modified: python/branches/trunk-math/PC/os2emx/README.os2emx
==============================================================================
--- python/branches/trunk-math/PC/os2emx/README.os2emx	(original)
+++ python/branches/trunk-math/PC/os2emx/README.os2emx	Tue Feb 12 06:36:19 2008
@@ -1,4 +1,4 @@
-This is a port of Python 2.5 to OS/2 using the EMX development tools
+This is a port of Python 2.6 to OS/2 using the EMX development tools
 =========================================================================
 
 What's new since the previous release
@@ -10,11 +10,11 @@
 Licenses and info about Python and EMX
 --------------------------------------
 
-Please read the file README.Python-2.5 included in this package for 
-information about Python 2.5.  This file is the README file from the 
-Python 2.5 source distribution available via http://www.python.org/ 
-and its mirrors.  The file LICENCE.Python-2.5 is the text of the Licence 
-from the Python 2.5 source distribution.
+Please read the file README.Python-2.6 included in this package for 
+information about Python 2.6.  This file is the README file from the 
+Python 2.6 source distribution available via http://www.python.org/ 
+and its mirrors.  The file LICENCE.Python-2.6 is the text of the Licence 
+from the Python 2.6 source distribution.
 
 Note that the EMX package that this package depends on is released under 
 the GNU General Public Licence.  Please refer to the documentation 
@@ -46,7 +46,7 @@
 
 The best known would be that by Jeff Rush, most recently of version 
 1.5.2.  Jeff used IBM's Visual Age C++ (v3) for his ports, and his 
-patches have been included in the Python 2.5 source distribution.
+patches have been included in the Python 2.6 source distribution.
 
 Andy Zabolotny implemented a port of Python v1.5.2 using the EMX 
 development tools.  His patches against the Python v1.5.2 source 
@@ -92,7 +92,7 @@
 to compile & link the executable.  This is so that fork() works (see 
 "YOU HAVE BEEN WARNED" item 1).
 
-Python25.dll is created as a normal OMF DLL, with an OMF import 
+Python26.dll is created as a normal OMF DLL, with an OMF import 
 library and module definition file.  There is also an a.out (.a) import 
 library to support linking the DLL to a.out executables.  The DLL 
 requires the EMX runtime DLLs.
@@ -148,7 +148,7 @@
 
 Upstream source patches:
 
-No updates to the Python 2.5 release have become available.
+No updates to the Python 2.6 release have become available.
 
 Eberhard Mattes' EMXFIX04 update to his EMX 0.9d tools suite includes 
 bug fixes for the BSD DB library.  The bsddb module included in this 
@@ -157,7 +157,7 @@
 Library and other distributed Python code:
 
 The Python standard library lives in the Lib directory.  All the standard 
-library code included with the Python 2.5 source distribution is included 
+library code included with the Python 2.6 source distribution is included 
 in the binary archive, with the exception of the dos-8x3 and tkinter 
 subdirectories which have been omitted to reduce the size of the binary 
 archive - the dos-8x3 components are unnecessary duplicates and Tkinter 
@@ -172,7 +172,7 @@
 also been omitted.
 
 All subdirectories omitted from the binary archive can be reconstituted 
-from the Python 2.5 source distribution, if desired.
+from the Python 2.6 source distribution, if desired.
 
 Support for building Python extensions:
 
@@ -190,15 +190,15 @@
 ---------
 
 This port is packaged as follows:
-- python-2.5-os2emx-bin-03????.zip  (binaries, library modules)
-- python-2.5-os2emx-src-03????      (patches+makefiles for non-Python code)
+- python-2.6-os2emx-bin-03????.zip  (binaries, library modules)
+- python-2.6-os2emx-src-03????      (patches+makefiles for non-Python code)
 
 As all the Python specific patches for the port are now part of the 
 Python release tarball, only the patches and makefiles involved in 
 building external libraries for optional extensions are included in 
 the source archive.
 
-Documentation for the Python language, as well as the Python 2.5 
+Documentation for the Python language, as well as the Python 2.6 
 source distibution, can be obtained from the Python website 
 (http://www.python.org/) or the Python project pages at Sourceforge 
 (http://sf.net/projects/python/).
@@ -213,7 +213,7 @@
 Unpack this archive, preserving the subdirectories, in the root directory 
 of the drive where you want Python to live.
 
-Add the Python directory (eg C:\Python25) to the PATH and LIBPATH 
+Add the Python directory (eg C:\Python26) to the PATH and LIBPATH 
 variables in CONFIG.SYS.
 
 You should then set the PYTHONHOME and PYTHONPATH environment variables 
@@ -223,9 +223,9 @@
 should be set to the semicolon separated list of principal Python library 
 directories.
 I use:
-  SET PYTHONHOME=F:/Python25
-  SET PYTHONPATH=F:/Python25/Lib;F:/Python25/Lib/plat-os2emx;
-                 F:/Python25/Lib/lib-dynload;F:/Python25/Lib/site-packages
+  SET PYTHONHOME=F:/Python26
+  SET PYTHONPATH=F:/Python26/Lib;F:/Python26/Lib/plat-os2emx;
+                 F:/Python26/Lib/lib-dynload;F:/Python26/Lib/site-packages
 
 NOTE!:  the PYTHONPATH setting above is linewrapped for this document - it 
 should all be on one line in CONFIG.SYS!
@@ -238,7 +238,7 @@
 distribution.  This can be used by setting the TERMINFO environment variable 
 to the path of the Terminfo subdirectory below the Python home directory.
 On my system this looks like:
-  SET TERMINFO=F:/Python25/Terminfo
+  SET TERMINFO=F:/Python26/Terminfo
 
 For the TERM environment variable, I would try one of the following:
   SET TERM=ansi
@@ -252,8 +252,8 @@
 you can change into the Python home directory and run the COMPILEALL.CMD 
 batch file.
 
-You can execute the regression tests included with the Python 2.5 source 
-distribution by changing to the Python 2.5 home directory and executing the 
+You can execute the regression tests included with the Python 2.6 source 
+distribution by changing to the Python 2.6 home directory and executing the 
 REGRTEST.CMD batch file.  The following tests are known to fail at this 
 time:
 - test_mhlib (I don't know of any port of MH to OS/2);
@@ -299,7 +299,7 @@
 1. decide if you need to change the location of the Python installation.
    If you wish to do this, set the value of the Makefile variable LIB_DIR 
    to the directory you wish to use for PYTHONHOME 
-   (eg /usr/local/lib/python2.5).
+   (eg /usr/local/lib/python2.6).
 
    If you want Python to find its library without the PYTHONHOME 
    environment variable set, set the value of the Makefile variable 
@@ -309,7 +309,7 @@
    to be installed in a directory other than the PYTHONHOME directory, set 
    the value of the Makefile variable EXE_DIR to the appropriate directory.
 
-3. If you wish the Python core DLL (python25.dll) to be installed in a 
+3. If you wish the Python core DLL (python26.dll) to be installed in a 
    directory other than the directory in which the Python executables are 
    installed (by default, the PYTHONHOME directory), set the value of the 
    Makefile variable DLL_DIR to the appropriate directory.  This DLL must 
@@ -698,4 +698,4 @@
 E-mail: andymac at bullseye.apana.org.au, or andymac at pcug.org.au
 Web:    http://www.andymac.org/
 
-23 July, 2006.
+28 January, 2008.

Deleted: /python/branches/trunk-math/PC/os2emx/python25.def
==============================================================================
--- /python/branches/trunk-math/PC/os2emx/python25.def	Tue Feb 12 06:36:19 2008
+++ (empty file)
@@ -1,1314 +0,0 @@
-LIBRARY python25 INITINSTANCE TERMINSTANCE 
-DESCRIPTION "Python 2.5 Core DLL" 
-PROTMODE 
-DATA MULTIPLE NONSHARED 
-EXPORTS 
-
-; From python25_s.lib(config)
-  "_PyImport_Inittab"
-
-; From python25_s.lib(dlfcn)
-;  "dlopen"
-;  "dlsym"
-;  "dlclose"
-;  "dlerror"
-
-; From python25_s.lib(getpathp)
-  "Py_GetProgramFullPath"
-  "Py_GetPrefix"
-  "Py_GetExecPrefix"
-  "Py_GetPath"
-
-; From python25_s.lib(getbuildinfo)
-  "Py_GetBuildInfo"
-  "_Py_svnversion"
-
-; From python25_s.lib(main)
-  "Py_Main"
-  "Py_GetArgcArgv"
-
-; From python25_s.lib(acceler)
-  "PyGrammar_AddAccelerators"
-  "PyGrammar_RemoveAccelerators"
-
-; From python25_s.lib(grammar1)
-  "PyGrammar_FindDFA"
-  "PyGrammar_LabelRepr"
-
-; From python25_s.lib(listnode)
-  "PyNode_ListTree"
-
-; From python25_s.lib(node)
-  "PyNode_New"
-  "PyNode_AddChild"
-  "PyNode_Free"
-
-; From python25_s.lib(parser)
-  "PyParser_AddToken"
-  "PyParser_New"
-  "PyParser_Delete"
-
-; From python25_s.lib(parsetok)
-  "Py_TabcheckFlag"
-  "PyParser_ParseString"
-  "PyParser_ParseStringFlagsFilename"
-  "PyParser_ParseFile"
-  "PyParser_ParseFileFlags"
-  "PyParser_ParseStringFlags"
-
-; From python25_s.lib(bitset)
-  "_Py_newbitset"
-  "_Py_delbitset"
-  "_Py_addbit"
-  "_Py_samebitset"
-  "_Py_mergebitset"
-
-; From python25_s.lib(metagrammar)
-  "_Py_meta_grammar"
-  "Py_meta_grammar"
-
-; From python25_s.lib(tokenizer)
-  "PyToken_OneChar"
-  "PyToken_TwoChars"
-  "PyToken_ThreeChars"
-  "PyTokenizer_FromString"
-  "PyTokenizer_Free"
-  "PyTokenizer_FromFile"
-  "PyTokenizer_Get"
-  "_PyParser_TokenNames"
-
-; From python25_s.lib(myreadline)
-  "_PyOS_ReadlineTState"
-  "PyOS_ReadlineFunctionPointer"
-  "PyOS_StdioReadline"
-  "PyOS_Readline"
-  "PyOS_InputHook"
-
-; From python25_s.lib(abstract)
-  "_PyObject_LengthHint"
-  "PyMapping_Size"
-  "PyObject_CallMethod"
-  "PyObject_GetItem"
-  "PySequence_GetItem"
-  "PyObject_SetItem"
-  "PySequence_SetItem"
-  "PyObject_DelItem"
-  "PySequence_DelItem"
-  "PyNumber_Multiply"
-  "PyNumber_InPlaceAdd"
-  "PyNumber_InPlaceMultiply"
-  "PyNumber_Int"
-  "PyNumber_Long"
-  "PyNumber_Float"
-  "PySequence_Concat"
-  "PySequence_Repeat"
-  "PySequence_InPlaceConcat"
-  "PySequence_InPlaceRepeat"
-  "PySequence_GetSlice"
-  "PySequence_SetSlice"
-  "PySequence_Tuple"
-  "PyObject_GetIter"
-  "PyIter_Next"
-  "PySequence_Fast"
-  "_PySequence_IterSearch"
-  "PyObject_CallFunction"
-  "_PyObject_CallFunction_SizeT"
-  "_PyObject_CallMethod_SizeT"
-  "PyObject_CallMethodObjArgs"
-  "PyObject_CallFunctionObjArgs"
-  "PyObject_Cmp"
-  "PyObject_Call"
-  "PyObject_CallObject"
-  "PyObject_Type"
-  "PyObject_Size"
-  "PyObject_Length"
-  "PyObject_DelItemString"
-  "PyObject_AsCharBuffer"
-  "PyObject_CheckReadBuffer"
-  "PyObject_AsReadBuffer"
-  "PyObject_AsWriteBuffer"
-  "PyNumber_Check"
-  "PyNumber_Add"
-  "PyNumber_Subtract"
-  "PyNumber_Divide"
-  "PyNumber_FloorDivide"
-  "PyNumber_TrueDivide"
-  "PyNumber_Remainder"
-  "PyNumber_Divmod"
-  "PyNumber_Power"
-  "PyNumber_Negative"
-  "PyNumber_Positive"
-  "PyNumber_Absolute"
-  "PyNumber_Invert"
-  "PyNumber_Lshift"
-  "PyNumber_Rshift"
-  "PyNumber_And"
-  "PyNumber_Xor"
-  "PyNumber_Or"
-  "PyNumber_Index"
-  "PyNumber_InPlaceSubtract"
-  "PyNumber_InPlaceDivide"
-  "PyNumber_InPlaceFloorDivide"
-  "PyNumber_InPlaceTrueDivide"
-  "PyNumber_InPlaceRemainder"
-  "PyNumber_InPlacePower"
-  "PyNumber_InPlaceLshift"
-  "PyNumber_InPlaceRshift"
-  "PyNumber_InPlaceAnd"
-  "PyNumber_InPlaceXor"
-  "PyNumber_InPlaceOr"
-  "PySequence_Check"
-  "PySequence_Size"
-  "PySequence_Length"
-  "PySequence_DelSlice"
-  "PySequence_List"
-  "PySequence_Count"
-  "PySequence_Contains"
-  "PySequence_In"
-  "PySequence_Index"
-  "PyMapping_Check"
-  "PyMapping_Length"
-  "PyMapping_HasKeyString"
-  "PyMapping_HasKey"
-  "PyMapping_GetItemString"
-  "PyMapping_SetItemString"
-  "PyObject_IsInstance"
-  "PyObject_IsSubclass"
-
-; From python25_s.lib(boolobject)
-  "PyBool_FromLong"
-  "PyBool_Type"
-  "_Py_ZeroStruct"
-  "_Py_TrueStruct"
-
-; From python25_s.lib(bufferobject)
-  "PyBuffer_FromObject"
-  "PyBuffer_FromReadWriteObject"
-  "PyBuffer_FromMemory"
-  "PyBuffer_FromReadWriteMemory"
-  "PyBuffer_New"
-  "PyBuffer_Type"
-
-; From python25_s.lib(cellobject)
-  "PyCell_New"
-  "PyCell_Get"
-  "PyCell_Set"
-  "PyCell_Type"
-
-; From python25_s.lib(classobject)
-  "PyClass_New"
-  "PyClass_IsSubclass"
-  "PyInstance_New"
-  "PyInstance_NewRaw"
-  "PyMethod_New"
-  "PyMethod_Function"
-  "PyMethod_Self"
-  "PyMethod_Class"
-  "_PyInstance_Lookup"
-  "PyMethod_Fini"
-  "PyClass_Type"
-  "PyInstance_Type"
-  "PyMethod_Type"
-
-; From python25_s.lib(cobject)
-  "PyCObject_FromVoidPtr"
-  "PyCObject_FromVoidPtrAndDesc"
-  "PyCObject_AsVoidPtr"
-  "PyCObject_GetDesc"
-  "PyCObject_Import"
-  "PyCObject_SetVoidPtr"
-  "PyCObject_Type"
-
-; From python25_s.lib(codeobject)
-  "PyCode_New"
-  "PyCode_Addr2Line"
-  "PyCode_CheckLineNumber"
-  "PyCode_Type"
-
-; From python25_s.lib(complexobject)
-  "_Py_c_pow"
-  "_Py_c_sum"
-  "_Py_c_diff"
-  "_Py_c_neg"
-  "_Py_c_prod"
-  "_Py_c_quot"
-  "PyComplex_FromCComplex"
-  "PyComplex_FromDoubles"
-  "PyComplex_RealAsDouble"
-  "PyComplex_ImagAsDouble"
-  "PyComplex_AsCComplex"
-  "PyComplex_Type"
-
-; From python25_s.lib(descrobject)
-  "PyWrapper_New"
-  "PyDescr_NewMethod"
-  "PyDescr_NewClassMethod"
-  "PyDescr_NewMember"
-  "PyDescr_NewGetSet"
-  "PyDescr_NewWrapper"
-  "PyDictProxy_New"
-  "PyWrapperDescr_Type"
-  "PyProperty_Type"
-
-; From python25_s.lib(dictobject)
-  "PyDict_New"
-  "PyDict_GetItem"
-  "PyDict_SetItem"
-  "PyDict_DelItem"
-  "PyDict_Clear"
-  "PyDict_MergeFromSeq2"
-  "PyDict_Merge"
-  "PyDict_Keys"
-  "PyDict_Values"
-  "PyDict_Contains"
-  "PyDict_Next"
-  "PyDict_Items"
-  "PyDict_Size"
-  "PyDict_Copy"
-  "PyDict_Update"
-  "PyDict_GetItemString"
-  "PyDict_SetItemString"
-  "PyDict_DelItemString"
-  "PyDict_Type"
-  "PyDictIterKey_Type"
-  "PyDictIterValue_Type"
-  "PyDictIterItem_Type"
-
-; From python25_s.lib(enumobject)
-  "PyEnum_Type"
-  "PyReversed_Type"
-
-; From python25_s.lib(fileobject)
-  "PyFile_FromString"
-  "Py_UniversalNewlineFread"
-  "PyFile_GetLine"
-  "PyFile_SoftSpace"
-  "PyFile_WriteObject"
-  "PyFile_WriteString"
-  "PyObject_AsFileDescriptor"
-  "Py_UniversalNewlineFgets"
-  "PyFile_SetBufSize"
-  "PyFile_SetEncoding"
-  "PyFile_FromFile"
-  "PyFile_AsFile"
-  "PyFile_Name"
-  "PyFile_Type"
-
-; From python25_s.lib(floatobject)
-  "PyFloat_FromString"
-  "PyFloat_AsDouble"
-  "PyFloat_Fini"
-  "_PyFloat_Pack4"
-  "_PyFloat_Pack8"
-  "_PyFloat_Unpack4"
-  "_PyFloat_Unpack8"
-  "PyFloat_FromDouble"
-  "PyFloat_AsReprString"
-  "PyFloat_AsString"
-  "_PyFloat_Init"
-  "PyFloat_AsStringEx"
-  "PyFloat_Type"
-
-; From python25_s.lib(frameobject)
-  "PyFrame_New"
-  "PyFrame_FastToLocals"
-  "PyFrame_LocalsToFast"
-  "_PyFrame_Init"
-  "PyFrame_Fini"
-  "PyFrame_BlockSetup"
-  "PyFrame_BlockPop"
-  "PyFrame_Type"
-
-; From python25_s.lib(funcobject)
-  "PyFunction_New"
-  "PyFunction_GetCode"
-  "PyFunction_GetGlobals"
-  "PyFunction_GetModule"
-  "PyFunction_GetDefaults"
-  "PyFunction_SetDefaults"
-  "PyFunction_GetClosure"
-  "PyFunction_SetClosure"
-  "PyClassMethod_New"
-  "PyStaticMethod_New"
-  "PyFunction_Type"
-  "PyClassMethod_Type"
-  "PyStaticMethod_Type"
-
-; From python25_s.lib(genobject)
-  "PyGen_New"
-  "PyGen_NeedsFinalizing"
-  "PyGen_Type"
-
-; From python25_s.lib(intobject)
-  "PyInt_AsLong"
-  "PyInt_AsUnsignedLongMask"
-  "PyInt_AsUnsignedLongLongMask"
-  "PyInt_FromString"
-  "PyInt_AsSsize_t"
-  "PyInt_Fini"
-  "PyInt_FromUnicode"
-  "PyInt_FromLong"
-  "PyInt_FromSize_t"
-  "PyInt_FromSsize_t"
-  "PyInt_GetMax"
-  "_PyInt_Init"
-  "PyInt_Type"
-
-; From python25_s.lib(iterobject)
-  "PySeqIter_New"
-  "PyCallIter_New"
-  "PySeqIter_Type"
-  "PyCallIter_Type"
-
-; From python25_s.lib(listobject)
-  "PyList_New"
-  "PyList_Append"
-  "PyList_Size"
-  "PyList_GetItem"
-  "PyList_SetItem"
-  "PyList_Insert"
-  "PyList_GetSlice"
-  "PyList_SetSlice"
-  "PyList_Sort"
-  "PyList_Reverse"
-  "PyList_AsTuple"
-  "_PyList_Extend"
-  "PyList_Fini"
-  "PyList_Type"
-  "PyListIter_Type"
-  "PyListRevIter_Type"
-
-; From python25_s.lib(longobject)
-  "PyLong_FromDouble"
-  "PyLong_AsLong"
-  "_PyLong_AsSsize_t"
-  "PyLong_AsUnsignedLong"
-  "_PyLong_FromByteArray"
-  "_PyLong_AsByteArray"
-  "PyLong_AsDouble"
-  "PyLong_FromLongLong"
-  "PyLong_AsLongLong"
-  "PyLong_FromString"
-  "PyLong_FromLong"
-  "PyLong_FromUnsignedLong"
-  "PyLong_AsUnsignedLongMask"
-  "_PyLong_FromSize_t"
-  "_PyLong_FromSsize_t"
-  "_PyLong_AsScaledDouble"
-  "PyLong_FromVoidPtr"
-  "PyLong_AsVoidPtr"
-  "PyLong_FromUnsignedLongLong"
-  "PyLong_AsUnsignedLongLong"
-  "PyLong_AsUnsignedLongLongMask"
-  "PyLong_FromUnicode"
-  "_PyLong_Sign"
-  "_PyLong_NumBits"
-  "_PyLong_New"
-  "_PyLong_Copy"
-  "PyLong_Type"
-  "_PyLong_DigitValue"
-
-; From python25_s.lib(methodobject)
-  "PyCFunction_Call"
-  "Py_FindMethodInChain"
-  "PyCFunction_GetFunction"
-  "PyCFunction_GetSelf"
-  "PyCFunction_GetFlags"
-  "Py_FindMethod"
-  "PyCFunction_NewEx"
-  "PyCFunction_Fini"
-  "PyCFunction_New"
-  "PyCFunction_Type"
-
-; From python25_s.lib(moduleobject)
-  "PyModule_New"
-  "_PyModule_Clear"
-  "PyModule_GetDict"
-  "PyModule_GetName"
-  "PyModule_GetFilename"
-  "PyModule_Type"
-
-; From python25_s.lib(object)
-  "Py_DivisionWarningFlag"
-  "PyObject_Str"
-  "PyObject_Repr"
-  "_PyObject_Str"
-  "PyObject_Unicode"
-  "PyObject_GetAttr"
-  "PyObject_IsTrue"
-  "PyNumber_CoerceEx"
-  "PyObject_Compare"
-  "PyObject_RichCompare"
-  "_Py_HashDouble"
-  "PyObject_Hash"
-  "PyObject_SetAttr"
-  "PyObject_GenericGetAttr"
-  "PyObject_GenericSetAttr"
-  "PyCallable_Check"
-  "PyObject_Dir"
-  "PyMem_Malloc"
-  "PyMem_Realloc"
-  "PyMem_Free"
-  "PyObject_Print"
-  "_PyObject_Dump"
-  "PyObject_RichCompareBool"
-  "PyObject_GetAttrString"
-  "PyObject_SetAttrString"
-  "PyObject_HasAttrString"
-  "PyObject_HasAttr"
-  "_PyObject_GetDictPtr"
-  "PyObject_SelfIter"
-  "PyObject_Not"
-  "PyNumber_Coerce"
-  "Py_ReprEnter"
-  "Py_ReprLeave"
-  "_Py_HashPointer"
-  "Py_IncRef"
-  "Py_DecRef"
-  "_PyTrash_deposit_object"
-  "_PyTrash_destroy_chain"
-  "PyObject_Init"
-  "PyObject_InitVar"
-  "_PyObject_New"
-  "_PyObject_NewVar"
-  "_PyObject_Del"
-  "_Py_ReadyTypes"
-  "_Py_SwappedOp"
-  "_Py_NotImplementedStruct"
-  "_Py_NoneStruct"
-  "_Py_cobject_hack"
-  "_Py_abstract_hack"
-  "_PyTrash_delete_nesting"
-  "_PyTrash_delete_later"
-
-; From python25_s.lib(obmalloc)
-  "PyObject_Malloc"
-  "PyObject_Free"
-  "PyObject_Realloc"
-
-; From python25_s.lib(rangeobject)
-  "PyRange_Type"
-
-; From python25_s.lib(setobject)
-  "PySet_Pop"
-  "PySet_New"
-  "PyFrozenSet_New"
-  "PySet_Size"
-  "PySet_Clear"
-  "PySet_Contains"
-  "PySet_Discard"
-  "PySet_Add"
-  "_PySet_Next"
-  "_PySet_Update"
-  "PySet_Fini"
-  "PySet_Type"
-  "PyFrozenSet_Type"
-
-; From python25_s.lib(sliceobject)
-  "_PySlice_FromIndices"
-  "PySlice_GetIndices"
-  "PySlice_GetIndicesEx"
-  "PySlice_New"
-  "_Py_EllipsisObject"
-  "PySlice_Type"
-
-; From python25_s.lib(stringobject)
-  "PyString_FromStringAndSize"
-  "PyString_InternInPlace"
-  "PyString_FromString"
-  "PyString_FromFormatV"
-  "PyString_AsString"
-  "_PyString_Resize"
-  "PyString_FromFormat"
-  "PyString_AsDecodedString"
-  "PyString_AsEncodedString"
-  "PyString_DecodeEscape"
-  "PyString_Repr"
-  "PyString_AsStringAndSize"
-  "_PyString_FormatLong"
-  "PyString_Format"
-  "_Py_ReleaseInternedStrings"
-  "PyString_Size"
-  "PyString_Concat"
-  "PyString_ConcatAndDel"
-  "_PyString_Eq"
-  "PyString_InternImmortal"
-  "PyString_InternFromString"
-  "_PyString_Join"
-  "PyString_Decode"
-  "PyString_Encode"
-  "PyString_AsEncodedObject"
-  "PyString_AsDecodedObject"
-  "PyString_Fini"
-  "PyString_Type"
-  "PyBaseString_Type"
-
-; From python25_s.lib(structseq)
-  "PyStructSequence_InitType"
-  "PyStructSequence_New"
-  "PyStructSequence_UnnamedField"
-
-; From python25_s.lib(tupleobject)
-  "PyTuple_New"
-  "PyTuple_Pack"
-  "_PyTuple_Resize"
-  "PyTuple_Size"
-  "PyTuple_GetItem"
-  "PyTuple_SetItem"
-  "PyTuple_GetSlice"
-  "PyTuple_Fini"
-  "PyTuple_Type"
-  "PyTupleIter_Type"
-
-; From python25_s.lib(typeobject)
-  "PyType_IsSubtype"
-  "_PyType_Lookup"
-  "PyType_Ready"
-  "PyType_GenericAlloc"
-  "_PyObject_SlotCompare"
-  "PyType_GenericNew"
-  "PyType_Type"
-  "PyBaseObject_Type"
-  "PySuper_Type"
-
-; From python25_s.lib(unicodeobject)
-  "PyUnicodeUCS2_Resize"
-  "PyUnicodeUCS2_FromOrdinal"
-  "PyUnicodeUCS2_FromObject"
-  "PyUnicodeUCS2_FromEncodedObject"
-  "PyUnicodeUCS2_Decode"
-  "PyUnicodeUCS2_GetDefaultEncoding"
-  "PyUnicodeUCS2_DecodeUTF8"
-  "PyUnicodeUCS2_DecodeLatin1"
-  "PyUnicodeUCS2_DecodeASCII"
-  "PyUnicodeUCS2_AsEncodedString"
-  "PyUnicodeUCS2_AsUTF8String"
-  "PyUnicodeUCS2_AsLatin1String"
-  "PyUnicodeUCS2_AsASCIIString"
-  "PyUnicode_DecodeUTF7"
-  "PyUnicode_EncodeUTF7"
-  "PyUnicodeUCS2_DecodeUTF8Stateful"
-  "PyUnicodeUCS2_EncodeUTF8"
-  "PyUnicodeUCS2_DecodeUTF16Stateful"
-  "PyUnicodeUCS2_AsUTF16String"
-  "PyUnicodeUCS2_DecodeUnicodeEscape"
-  "PyUnicodeUCS2_DecodeRawUnicodeEscape"
-  "PyUnicodeUCS2_EncodeRawUnicodeEscape"
-  "_PyUnicode_DecodeUnicodeInternal"
-  "PyUnicodeUCS2_DecodeCharmap"
-  "PyUnicode_BuildEncodingMap"
-  "PyUnicodeUCS2_EncodeCharmap"
-  "PyUnicodeUCS2_TranslateCharmap"
-  "PyUnicodeUCS2_EncodeDecimal"
-  "PyUnicodeUCS2_Count"
-  "PyUnicodeUCS2_Find"
-  "PyUnicodeUCS2_Join"
-  "PyUnicodeUCS2_Splitlines"
-  "PyUnicodeUCS2_Compare"
-  "PyUnicodeUCS2_Contains"
-  "PyUnicodeUCS2_Concat"
-  "_PyUnicode_XStrip"
-  "PyUnicodeUCS2_Replace"
-  "PyUnicodeUCS2_Split"
-  "PyUnicodeUCS2_RSplit"
-  "PyUnicodeUCS2_Format"
-  "_PyUnicodeUCS2_Init"
-  "_PyUnicodeUCS2_Fini"
-  "PyUnicodeUCS2_FromUnicode"
-  "PyUnicodeUCS2_AsUnicode"
-  "PyUnicodeUCS2_GetSize"
-  "PyUnicodeUCS2_GetMax"
-  "_PyUnicodeUCS2_AsDefaultEncodedString"
-  "PyUnicodeUCS2_SetDefaultEncoding"
-  "PyUnicodeUCS2_Encode"
-  "PyUnicodeUCS2_AsEncodedObject"
-  "PyUnicodeUCS2_DecodeUTF16"
-  "PyUnicodeUCS2_EncodeUTF16"
-  "PyUnicodeUCS2_AsUnicodeEscapeString"
-  "PyUnicodeUCS2_EncodeUnicodeEscape"
-  "PyUnicodeUCS2_AsRawUnicodeEscapeString"
-  "PyUnicodeUCS2_EncodeLatin1"
-  "PyUnicodeUCS2_EncodeASCII"
-  "PyUnicodeUCS2_AsCharmapString"
-  "PyUnicodeUCS2_Partition"
-  "PyUnicodeUCS2_RPartition"
-  "PyUnicodeUCS2_Translate"
-  "PyUnicodeUCS2_Tailmatch"
-  "PyUnicode_AsDecodedObject"
-  "PyUnicode_Type"
-
-; From python25_s.lib(unicodectype)
-  "_PyUnicode_TypeRecords"
-  "_PyUnicodeUCS2_ToNumeric"
-  "_PyUnicodeUCS2_IsLowercase"
-  "_PyUnicodeUCS2_IsUppercase"
-  "_PyUnicodeUCS2_IsTitlecase"
-  "_PyUnicodeUCS2_IsWhitespace"
-  "_PyUnicodeUCS2_IsLinebreak"
-  "_PyUnicodeUCS2_ToLowercase"
-  "_PyUnicodeUCS2_ToUppercase"
-  "_PyUnicodeUCS2_ToTitlecase"
-  "_PyUnicodeUCS2_ToDecimalDigit"
-  "_PyUnicodeUCS2_ToDigit"
-  "_PyUnicodeUCS2_IsDecimalDigit"
-  "_PyUnicodeUCS2_IsDigit"
-  "_PyUnicodeUCS2_IsNumeric"
-  "_PyUnicodeUCS2_IsAlpha"
-
-; From python25_s.lib(weakrefobject)
-  "PyWeakref_NewRef"
-  "PyWeakref_NewProxy"
-  "PyObject_ClearWeakRefs"
-  "PyWeakref_GetObject"
-  "_PyWeakref_GetWeakrefCount"
-  "_PyWeakref_ClearRef"
-  "_PyWeakref_RefType"
-  "_PyWeakref_ProxyType"
-  "_PyWeakref_CallableProxyType"
-
-; From python25_s.lib(Python-ast)
-;  "init_ast"
-  "Module"
-  "Interactive"
-  "Expression"
-  "Suite"
-  "FunctionDef"
-  "ClassDef"
-  "Return"
-  "Delete"
-  "Assign"
-  "AugAssign"
-  "Print"
-  "For"
-  "While"
-  "If"
-  "With"
-  "Raise"
-  "TryExcept"
-  "TryFinally"
-  "Assert"
-  "Import"
-  "ImportFrom"
-  "Exec"
-  "Global"
-  "Expr"
-  "Pass"
-  "Break"
-  "Continue"
-  "BoolOp"
-  "BinOp"
-  "UnaryOp"
-  "Lambda"
-  "IfExp"
-  "Dict"
-  "ListComp"
-  "GeneratorExp"
-  "Yield"
-  "Compare"
-  "Call"
-  "Repr"
-  "Num"
-  "Str"
-  "Attribute"
-  "Subscript"
-  "Name"
-  "List"
-  "Tuple"
-  "Ellipsis"
-  "Slice"
-  "ExtSlice"
-  "Index"
-  "comprehension"
-  "excepthandler"
-  "arguments"
-  "keyword"
-  "alias"
-  "PyAST_mod2obj"
-
-; From python25_s.lib(asdl)
-  "asdl_seq_new"
-  "asdl_int_seq_new"
-
-; From python25_s.lib(ast)
-  "PyAST_FromNode"
-
-; From python25_s.lib(bltinmodule)
-  "_PyBuiltin_Init"
-  "Py_FileSystemDefaultEncoding"
-
-; From python25_s.lib(exceptions)
-  "PyUnicodeEncodeError_GetStart"
-  "PyUnicodeDecodeError_GetStart"
-  "PyUnicodeEncodeError_GetEnd"
-  "PyUnicodeDecodeError_GetEnd"
-  "_PyExc_Init"
-  "PyUnicodeDecodeError_Create"
-  "PyUnicodeEncodeError_Create"
-  "PyUnicodeTranslateError_Create"
-  "PyUnicodeEncodeError_GetEncoding"
-  "PyUnicodeDecodeError_GetEncoding"
-  "PyUnicodeEncodeError_GetObject"
-  "PyUnicodeDecodeError_GetObject"
-  "PyUnicodeTranslateError_GetObject"
-  "PyUnicodeTranslateError_GetStart"
-  "PyUnicodeEncodeError_SetStart"
-  "PyUnicodeDecodeError_SetStart"
-  "PyUnicodeTranslateError_SetStart"
-  "PyUnicodeTranslateError_GetEnd"
-  "PyUnicodeEncodeError_SetEnd"
-  "PyUnicodeDecodeError_SetEnd"
-  "PyUnicodeTranslateError_SetEnd"
-  "PyUnicodeEncodeError_GetReason"
-  "PyUnicodeDecodeError_GetReason"
-  "PyUnicodeTranslateError_GetReason"
-  "PyUnicodeEncodeError_SetReason"
-  "PyUnicodeDecodeError_SetReason"
-  "PyUnicodeTranslateError_SetReason"
-  "_PyExc_Fini"
-  "PyExc_BaseException"
-  "PyExc_Exception"
-  "PyExc_StandardError"
-  "PyExc_TypeError"
-  "PyExc_StopIteration"
-  "PyExc_GeneratorExit"
-  "PyExc_SystemExit"
-  "PyExc_KeyboardInterrupt"
-  "PyExc_ImportError"
-  "PyExc_EnvironmentError"
-  "PyExc_IOError"
-  "PyExc_OSError"
-  "PyExc_EOFError"
-  "PyExc_RuntimeError"
-  "PyExc_NotImplementedError"
-  "PyExc_NameError"
-  "PyExc_UnboundLocalError"
-  "PyExc_AttributeError"
-  "PyExc_IndexError"
-  "PyExc_SyntaxError"
-  "PyExc_IndentationError"
-  "PyExc_TabError"
-  "PyExc_LookupError"
-  "PyExc_KeyError"
-  "PyExc_ValueError"
-  "PyExc_UnicodeError"
-  "PyExc_UnicodeEncodeError"
-  "PyExc_UnicodeDecodeError"
-  "PyExc_UnicodeTranslateError"
-  "PyExc_AssertionError"
-  "PyExc_ArithmeticError"
-  "PyExc_FloatingPointError"
-  "PyExc_OverflowError"
-  "PyExc_ZeroDivisionError"
-  "PyExc_SystemError"
-  "PyExc_ReferenceError"
-  "PyExc_MemoryError"
-  "PyExc_Warning"
-  "PyExc_UserWarning"
-  "PyExc_DeprecationWarning"
-  "PyExc_PendingDeprecationWarning"
-  "PyExc_SyntaxWarning"
-  "PyExc_RuntimeWarning"
-  "PyExc_FutureWarning"
-  "PyExc_ImportWarning"
-  "PyExc_MemoryErrorInst"
-
-; From python25_s.lib(ceval)
-  "PyEval_EvalFrameEx"
-  "PyEval_CallObjectWithKeywords"
-  "PyEval_EvalCodeEx"
-  "PyEval_GetFrame"
-  "PyEval_CallObject"
-  "PyEval_SetProfile"
-  "PyEval_SetTrace"
-  "PyEval_GetBuiltins"
-  "PyEval_GetGlobals"
-  "PyEval_GetLocals"
-  "PyEval_GetRestricted"
-  "PyEval_MergeCompilerFlags"
-  "Py_FlushLine"
-  "Py_AddPendingCall"
-  "Py_MakePendingCalls"
-  "Py_SetRecursionLimit"
-  "Py_GetRecursionLimit"
-  "_Py_CheckRecursiveCall"
-  "PyEval_GetFuncName"
-  "PyEval_GetFuncDesc"
-  "PyEval_GetCallStats"
-  "PyEval_EvalFrame"
-  "PyEval_SaveThread"
-  "PyEval_RestoreThread"
-  "PyEval_ThreadsInitialized"
-  "PyEval_InitThreads"
-  "PyEval_AcquireLock"
-  "PyEval_ReleaseLock"
-  "PyEval_AcquireThread"
-  "PyEval_ReleaseThread"
-  "PyEval_ReInitThreads"
-  "_PyEval_SliceIndex"
-  "PyEval_EvalCode"
-  "_PyEval_CallTracing"
-  "_Py_CheckRecursionLimit"
-  "_Py_CheckInterval"
-  "_Py_Ticker"
-
-; From python25_s.lib(compile)
-  "_Py_Mangle"
-  "PyAST_Compile"
-  "PyNode_Compile"
-  "Py_OptimizeFlag"
-
-; From python25_s.lib(codecs)
-  "_PyCodec_Lookup"
-  "PyCodec_Encode"
-  "PyCodec_Decode"
-  "PyCodec_IgnoreErrors"
-  "PyCodec_ReplaceErrors"
-  "PyCodec_XMLCharRefReplaceErrors"
-  "PyCodec_BackslashReplaceErrors"
-  "PyCodec_Register"
-  "PyCodec_Encoder"
-  "PyCodec_Decoder"
-  "PyCodec_IncrementalEncoder"
-  "PyCodec_IncrementalDecoder"
-  "PyCodec_StreamReader"
-  "PyCodec_StreamWriter"
-  "PyCodec_RegisterError"
-  "PyCodec_LookupError"
-  "PyCodec_StrictErrors"
-
-; From python25_s.lib(errors)
-  "PyErr_SetNone"
-  "PyErr_SetString"
-  "PyErr_GivenExceptionMatches"
-  "PyErr_NormalizeException"
-  "PyErr_Fetch"
-  "PyErr_Clear"
-  "PyErr_NoMemory"
-  "PyErr_SetFromErrnoWithFilenameObject"
-  "PyErr_Format"
-  "PyErr_NewException"
-  "PyErr_WriteUnraisable"
-  "PyErr_SyntaxLocation"
-  "PyErr_ProgramText"
-  "PyErr_SetObject"
-  "PyErr_Occurred"
-  "PyErr_Restore"
-  "PyErr_ExceptionMatches"
-  "PyErr_BadArgument"
-  "PyErr_SetFromErrno"
-  "PyErr_SetFromErrnoWithFilename"
-  "PyErr_BadInternalCall"
-  "_PyErr_BadInternalCall"
-  "PyErr_Warn"
-  "PyErr_WarnExplicit"
-
-; From python25_s.lib(frozen)
-  "PyImport_FrozenModules"
-
-; From python25_s.lib(frozenmain)
-  "Py_FrozenMain"
-
-; From python25_s.lib(future)
-  "PyFuture_FromAST"
-
-; From python25_s.lib(getargs)
-  "PyArg_Parse"
-  "_PyArg_Parse_SizeT"
-  "PyArg_ParseTuple"
-  "_PyArg_ParseTuple_SizeT"
-  "PyArg_ParseTupleAndKeywords"
-  "_PyArg_ParseTupleAndKeywords_SizeT"
-  "PyArg_UnpackTuple"
-  "_PyArg_NoKeywords"
-  "PyArg_VaParse"
-  "PyArg_VaParseTupleAndKeywords"
-  "_PyArg_VaParse_SizeT"
-  "_PyArg_VaParseTupleAndKeywords_SizeT"
-
-; From python25_s.lib(getcompiler)
-  "Py_GetCompiler"
-
-; From python25_s.lib(getcopyright)
-  "Py_GetCopyright"
-
-; From python25_s.lib(getmtime)
-  "PyOS_GetLastModificationTime"
-
-; From python25_s.lib(getplatform)
-  "Py_GetPlatform"
-
-; From python25_s.lib(getversion)
-  "Py_GetVersion"
-
-; From python25_s.lib(graminit)
-  "_PyParser_Grammar"
-
-; From python25_s.lib(import)
-  "_PyImport_Init"
-  "_PyImportHooks_Init"
-  "PyImport_ImportModule"
-  "PyImport_Cleanup"
-  "_PyImport_FixupExtension"
-  "PyImport_AddModule"
-  "PyImport_ExecCodeModuleEx"
-  "PyImport_ImportFrozenModule"
-  "PyImport_ImportModuleEx"
-  "PyImport_ImportModuleLevel"
-  "PyImport_ReloadModule"
-  "PyImport_Import"
-;  "initimp"
-  "_PyImport_Fini"
-  "PyImport_GetMagicNumber"
-  "PyImport_ExecCodeModule"
-  "PyImport_GetModuleDict"
-  "_PyImport_FindModule"
-  "_PyImport_IsScript"
-  "_PyImport_ReInitLock"
-  "_PyImport_FindExtension"
-  "PyImport_AppendInittab"
-  "PyImport_ExtendInittab"
-  "PyImport_Inittab"
-  "_PyImport_Filetab"
-
-; From python25_s.lib(importdl)
-  "_PyImport_LoadDynamicModule"
-
-; From python25_s.lib(marshal)
-  "PyMarshal_ReadLongFromFile"
-  "PyMarshal_WriteObjectToString"
-  "PyMarshal_WriteLongToFile"
-  "PyMarshal_WriteObjectToFile"
-  "PyMarshal_ReadShortFromFile"
-  "PyMarshal_ReadObjectFromFile"
-  "PyMarshal_ReadLastObjectFromFile"
-  "PyMarshal_ReadObjectFromString"
-  "PyMarshal_Init"
-
-; From python25_s.lib(modsupport)
-  "Py_InitModule4"
-  "Py_BuildValue"
-  "_Py_BuildValue_SizeT"
-  "PyEval_CallFunction"
-  "PyEval_CallMethod"
-  "_Py_VaBuildValue_SizeT"
-  "Py_VaBuildValue"
-  "PyModule_AddObject"
-  "PyModule_AddIntConstant"
-  "PyModule_AddStringConstant"
-  "_Py_PackageContext"
-
-; From python25_s.lib(mysnprintf)
-  "PyOS_snprintf"
-  "PyOS_vsnprintf"
-
-; From python25_s.lib(mystrtoul)
-  "PyOS_strtoul"
-  "PyOS_strtol"
-
-; From python25_s.lib(pyarena)
-  "PyArena_New"
-  "PyArena_Free"
-  "PyArena_Malloc"
-  "PyArena_AddPyObject"
-
-; From python25_s.lib(pyfpe)
-  "PyFPE_dummy"
-
-; From python25_s.lib(pystate)
-  "PyInterpreterState_Clear"
-  "PyThreadState_Clear"
-  "_PyThread_CurrentFrames"
-  "PyGILState_Ensure"
-  "PyGILState_Release"
-  "PyInterpreterState_New"
-  "PyInterpreterState_Delete"
-  "PyThreadState_Delete"
-  "PyThreadState_New"
-  "PyThreadState_DeleteCurrent"
-  "PyThreadState_Get"
-  "PyThreadState_Swap"
-  "PyThreadState_GetDict"
-  "PyThreadState_SetAsyncExc"
-  "PyGILState_GetThisThreadState"
-  "PyInterpreterState_Head"
-  "PyInterpreterState_Next"
-  "PyInterpreterState_ThreadHead"
-  "PyThreadState_Next"
-  "_PyGILState_Init"
-  "_PyGILState_Fini"
-  "_PyThreadState_Current"
-  "_PyThreadState_GetFrame"
-
-; From python25_s.lib(pystrtod)
-  "PyOS_ascii_strtod"
-  "PyOS_ascii_formatd"
-  "PyOS_ascii_atof"
-
-; From python25_s.lib(pythonrun)
-  "Py_IgnoreEnvironmentFlag"
-  "Py_DebugFlag"
-  "Py_VerboseFlag"
-  "Py_NoSiteFlag"
-  "Py_InteractiveFlag"
-  "Py_FrozenFlag"
-  "Py_InitializeEx"
-  "Py_FatalError"
-  "Py_NewInterpreter"
-  "PyErr_Print"
-  "PyRun_InteractiveOneFlags"
-  "PyParser_ASTFromFile"
-  "PyRun_SimpleFileExFlags"
-  "PyRun_FileExFlags"
-  "Py_Exit"
-  "PyErr_PrintEx"
-  "PyErr_Display"
-  "Py_SetProgramName"
-  "Py_GetProgramName"
-  "Py_SetPythonHome"
-  "Py_GetPythonHome"
-  "Py_Initialize"
-  "Py_Finalize"
-  "Py_IsInitialized"
-  "Py_EndInterpreter"
-  "PyRun_AnyFileFlags"
-  "Py_FdIsInteractive"
-  "PyRun_InteractiveLoopFlags"
-  "PyRun_AnyFileExFlags"
-  "PyRun_SimpleStringFlags"
-  "PyRun_StringFlags"
-  "PyParser_ASTFromString"
-  "PyParser_SimpleParseStringFlags"
-  "PyParser_SimpleParseFileFlags"
-  "Py_CompileStringFlags"
-  "Py_SymtableString"
-  "Py_AtExit"
-  "PyOS_getsig"
-  "PyOS_setsig"
-  "PyParser_SetError"
-  "PyModule_GetWarningsModule"
-  "PyParser_SimpleParseStringFlagsFilename"
-  "PyParser_SimpleParseStringFilename"
-  "PyParser_SimpleParseFile"
-  "PyParser_SimpleParseString"
-  "PyRun_AnyFile"
-  "PyRun_AnyFileEx"
-  "PyRun_File"
-  "PyRun_FileEx"
-  "PyRun_FileFlags"
-  "PyRun_SimpleFile"
-  "PyRun_SimpleFileEx"
-  "PyRun_String"
-  "PyRun_SimpleString"
-  "Py_CompileString"
-  "PyRun_InteractiveOne"
-  "PyRun_InteractiveLoop"
-  "Py_UseClassExceptionsFlag"
-  "Py_UnicodeFlag"
-  "_Py_QnewFlag"
-
-; From python25_s.lib(structmember)
-  "PyMember_Get"
-  "PyMember_GetOne"
-  "PyMember_SetOne"
-  "PyMember_Set"
-
-; From python25_s.lib(symtable)
-  "PySymtable_Build"
-  "PySymtable_Free"
-  "PyST_GetScope"
-  "PySymtable_Lookup"
-  "PySTEntry_Type"
-
-; From python25_s.lib(sysmodule)
-  "_PySys_Init"
-  "PySys_WriteStderr"
-  "PySys_SetPath"
-  "PySys_SetArgv"
-  "PySys_WriteStdout"
-  "Py_SubversionRevision"
-  "Py_SubversionShortBranch"
-  "PySys_GetObject"
-  "PySys_SetObject"
-  "PySys_GetFile"
-  "PySys_ResetWarnOptions"
-  "PySys_AddWarnOption"
-
-; From python25_s.lib(traceback)
-  "PyTraceBack_Here"
-  "PyTraceBack_Print"
-  "PyTraceBack_Type"
-
-; From python25_s.lib(getopt)
-  "_PyOS_GetOpt"
-  "_PyOS_opterr"
-  "_PyOS_optind"
-  "_PyOS_optarg"
-
-; From python25_s.lib(dynload_shlib)
-  "_PyImport_DynLoadFiletab"
-  "_PyImport_GetDynLoadFunc"
-
-; From python25_s.lib(thread)
-  "PyThread_delete_key_value"
-  "PyThread_init_thread"
-  "PyThread_start_new_thread"
-  "PyThread_exit_thread"
-  "PyThread_get_thread_ident"
-  "PyThread_allocate_lock"
-  "PyThread_free_lock"
-  "PyThread_acquire_lock"
-  "PyThread_release_lock"
-  "PyThread_get_stacksize"
-  "PyThread_set_stacksize"
-  "PyThread_create_key"
-  "PyThread_delete_key"
-  "PyThread_set_key_value"
-  "PyThread_get_key_value"
-  "PyThread__exit_thread"
-
-; From python25_s.lib(gcmodule)
-;  "initgc"
-  "_PyObject_GC_New"
-  "_PyObject_GC_NewVar"
-  "PyGC_Collect"
-  "_PyObject_GC_Resize"
-  "_PyObject_GC_Malloc"
-  "PyObject_GC_Track"
-  "PyObject_GC_UnTrack"
-  "PyObject_GC_Del"
-  "_PyGC_Dump"
-  "_PyObject_GC_Track"
-  "_PyObject_GC_UnTrack"
-  "_PyObject_GC_Del"
-  "_PyGC_generation0"
-
-; From python25_s.lib(signalmodule)
-;  "initsignal"
-  "PyErr_CheckSignals"
-  "PyErr_SetInterrupt"
-  "PyOS_FiniInterrupts"
-  "PyOS_InterruptOccurred"
-  "PyOS_InitInterrupts"
-  "PyOS_AfterFork"
-
-; From python25_s.lib(posixmodule)
-;  "initos2"
-
-; From python25_s.lib(threadmodule)
-;  "initthread"
-
-; From python25_s.lib(arraymodule)
-;  "initarray"
-;  "array_methods"
-
-; From python25_s.lib(binascii)
-;  "initbinascii"
-
-; From python25_s.lib(cmathmodule)
-;  "initcmath"
-
-; From python25_s.lib(_codecsmodule)
-;  "init_codecs"
-
-; From python25_s.lib(collectionsmodule)
-;  "initcollections"
-  "dequeiter_type"
-  "dequereviter_type"
-
-; From python25_s.lib(cPickle)
-;  "initcPickle"
-;  "fast_save_leave"
-
-; From python25_s.lib(cStringIO)
-;  "initcStringIO"
-
-; From python25_s.lib(_csv)
-;  "init_csv"
-
-; From python25_s.lib(datetimemodule)
-;  "initdatetime"
-
-; From python25_s.lib(dlmodule)
-;  "initdl"
-
-; From python25_s.lib(errnomodule)
-;  "initerrno"
-
-; From python25_s.lib(fcntlmodule)
-;  "initfcntl"
-
-; From python25_s.lib(_functoolsmodule)
-;  "init_functools"
-
-; From python25_s.lib(_heapqmodule)
-;  "init_heapq"
-
-; From python25_s.lib(imageop)
-;  "initimageop"
-
-; From python25_s.lib(itertoolsmodule)
-;  "inititertools"
-
-; From python25_s.lib(_localemodule)
-;  "init_locale"
-
-; From python25_s.lib(mathmodule)
-;  "initmath"
-
-; From python25_s.lib(md5)
-  "md5_finish"
-  "md5_init"
-  "md5_append"
-
-; From python25_s.lib(md5module)
-;  "init_md5"
-
-; From python25_s.lib(operator)
-;  "initoperator"
-
-; From python25_s.lib(_randommodule)
-;  "init_random"
-
-; From python25_s.lib(rgbimgmodule)
-;  "initrgbimg"
-
-; From python25_s.lib(shamodule)
-;  "init_sha"
-
-; From python25_s.lib(sha256module)
-;  "init_sha256"
-
-; From python25_s.lib(sha512module)
-;  "init_sha512"
-
-; From python25_s.lib(_sre)
-;  "init_sre"
-
-; From python25_s.lib(stropmodule)
-;  "initstrop"
-
-; From python25_s.lib(_struct)
-;  "init_struct"
-
-; From python25_s.lib(symtablemodule)
-;  "init_symtable"
-
-; From python25_s.lib(termios)
-;  "inittermios"
-
-; From python25_s.lib(timemodule)
-;  "inittime"
-  "_PyTime_DoubleToTimet"
-;  "inittimezone"
-
-; From python25_s.lib(timingmodule)
-;  "inittiming"
-
-; From python25_s.lib(_weakref)
-;  "init_weakref"
-
-; From python25_s.lib(xxsubtype)
-;  "initxxsubtype"
-
-; From python25_s.lib(zipimport)
-;  "initzipimport"

Modified: python/branches/trunk-math/PC/pyconfig.h
==============================================================================
--- python/branches/trunk-math/PC/pyconfig.h	(original)
+++ python/branches/trunk-math/PC/pyconfig.h	Tue Feb 12 06:36:19 2008
@@ -158,10 +158,12 @@
 /* set the version macros for the windows headers */
 #ifdef MS_WINX64
 /* 64 bit only runs on XP or greater */
-#define Py_WINVER 0x0501
+#define Py_WINVER _WIN32_WINNT_WINXP
+#define Py_NTDDI NTDDI_WINXP
 #else
-/* NT 4.0 or greater required otherwise */
-#define Py_WINVER 0x0400
+/* Python 2.6+ requires Windows 2000 or greater */
+#define Py_WINVER _WIN32_WINNT_WIN2K
+#define Py_NTDDI NTDDI_WIN2KSP4
 #endif
 
 /* We only set these values when building Python - we don't want to force
@@ -171,7 +173,10 @@
    structures etc so it can optionally use new Windows features if it
    determines at runtime they are available.
 */
-#ifdef Py_BUILD_CORE
+#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_MODULE)
+#ifndef NTDDI_VERSION
+#define NTDDI_VERSION Py_NTDDI
+#endif
 #ifndef WINVER
 #define WINVER Py_WINVER
 #endif

Modified: python/branches/trunk-math/PC/readme.txt
==============================================================================
--- python/branches/trunk-math/PC/readme.txt	(original)
+++ python/branches/trunk-math/PC/readme.txt	Tue Feb 12 06:36:19 2008
@@ -1,11 +1,6 @@
 Welcome to the "PC" subdirectory of the Python distribution
 ***********************************************************
 
-*** Note: the project files for MS VC++ 7.1 are now in the
-*** PCbuild directory.  See the file readme.txt there for build
-*** instructions.  There is some information below that might
-*** still be relevant.
-
 This "PC" subdirectory contains complete project files to make
 several older PC ports of Python, as well as all the PC-specific
 Python source files.  It should be located in the root of the
@@ -79,18 +74,23 @@
 example_nt     A subdirectory showing how to build an extension as a
                DLL.
 
-Visual Studio 6.0
-=================
-The subdirectory VC6 contains Visual Studio 6 project files. These
-were originally located in the PCBuild directory, but are no longer
-maintained.
+Legacy support for older versions of Visual Studio
+==================================================
+The subdirectories VC6, VS7.1 and VS8.0 contain legacy support older
+versions of Microsoft Visual Studio. See PCbuild/readme.txt.
+
+EMX development tools for OS/2
+==============================
 
+See os2emx/readme.txt. This platform is maintained by Andrew MacIntyre.
 
 IBM VisualAge C/C++ for OS/2
 ============================
 
 See os2vacpp/readme.txt.  This platform is supported by Jeff Rush.
 
+NOTE: Support for os2vacpp may be dropped in the near future. Please move
+      to EMX.
 
 Note for Windows 3.x and DOS users
 ==================================

Modified: python/branches/trunk-math/PCbuild/_bsddb.vcproj
==============================================================================
--- python/branches/trunk-math/PCbuild/_bsddb.vcproj	(original)
+++ python/branches/trunk-math/PCbuild/_bsddb.vcproj	Tue Feb 12 06:36:19 2008
@@ -52,7 +52,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug\libdb44sd.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Debug /project db_static&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug\libdb44sd.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Debug|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -115,7 +115,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug_AMD64\libdb44sd.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Debug AMD64&quot; /project db_static /useenv&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Debug_AMD64\libdb44sd.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Debug AMD64|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -178,7 +178,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -242,7 +242,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -305,7 +305,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -369,7 +369,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -433,7 +433,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build Release /project db_static&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"
@@ -497,7 +497,7 @@
 			/>
 			<Tool
 				Name="VCPreLinkEventTool"
-				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;devenv Berkeley_DB.sln /build &quot;Release AMD64&quot; /project db_static /useenv&#x0D;&#x0A;"
+				CommandLine="cd $(bsddbDir)&#x0D;&#x0A;if exist Release_AMD64\libdb44s.lib exit 0&#x0D;&#x0A;vcbuild /useenv db_static.vcproj &quot;Release AMD64|Win32&quot;&#x0D;&#x0A;"
 			/>
 			<Tool
 				Name="VCLinkerTool"

Modified: python/branches/trunk-math/PCbuild/build.bat
==============================================================================
--- python/branches/trunk-math/PCbuild/build.bat	(original)
+++ python/branches/trunk-math/PCbuild/build.bat	Tue Feb 12 06:36:19 2008
@@ -5,13 +5,14 @@
 setlocal
 set platf=Win32
 set conf=Release
-set build=/build
+set build=
 
 :CheckOpts
-if "%1"=="-c" (set conf=%2)     & shift & shift & goto CheckOpts
+if "%1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts
 if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts
-if "%1"=="-r" (set build=/rebuild)    & shift & goto CheckOpts
+if "%1"=="-r" (set build=/rebuild) & shift & goto CheckOpts
+if "%1"=="-d" (set conf=Debug) & shift & goto CheckOpts
 
-set cmd=devenv pcbuild.sln %build% "%conf%|%platf%"
+set cmd=vcbuild /useenv pcbuild.sln %build% "%conf%|%platf%"
 echo %cmd%
 %cmd%

Modified: python/branches/trunk-math/PCbuild/pyd.vsprops
==============================================================================
--- python/branches/trunk-math/PCbuild/pyd.vsprops	(original)
+++ python/branches/trunk-math/PCbuild/pyd.vsprops	Tue Feb 12 06:36:19 2008
@@ -7,6 +7,7 @@
 	>
 	<Tool
 		Name="VCCLCompilerTool"
+		PreprocessorDefinitions="Py_BUILD_CORE_MODULE"
 		RuntimeLibrary="2"
 	/>
 	<Tool

Modified: python/branches/trunk-math/PCbuild/pyd_d.vsprops
==============================================================================
--- python/branches/trunk-math/PCbuild/pyd_d.vsprops	(original)
+++ python/branches/trunk-math/PCbuild/pyd_d.vsprops	Tue Feb 12 06:36:19 2008
@@ -10,6 +10,7 @@
 		Optimization="0"
 		InlineFunctionExpansion="0"
 		EnableIntrinsicFunctions="false"
+		PreprocessorDefinitions="Py_BUILD_CORE_MODULE"
 		RuntimeLibrary="3"
 	/>
 	<Tool

Modified: python/branches/trunk-math/PCbuild/readme.txt
==============================================================================
--- python/branches/trunk-math/PCbuild/readme.txt	(original)
+++ python/branches/trunk-math/PCbuild/readme.txt	Tue Feb 12 06:36:19 2008
@@ -19,11 +19,10 @@
 won't stop you from building Python.
 
 The solution is configured to build the projects in the correct order. "Build
-Solution" or F6 takes care of dependencies except for x64 builds. To make
+Solution" or F7 takes care of dependencies except for x64 builds. To make
 cross compiling x64 builds on a 32bit OS possible the x64 builds require a 
 32bit version of Python.
 
-
 NOTE:
    You probably don't want to build most of the other subprojects, unless
    you're building an entire Python distribution from scratch, or
@@ -31,7 +30,8 @@
    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:  python30_d.dll, python_d.exe, parser_d.pyd, and so on.
+their name:  python30_d.dll, python_d.exe, parser_d.pyd, and so on. Both
+the build and rt batch files accept a -d option for debug builds.
 
 The 32bit builds end up in the solution folder PCbuild while the x64 builds
 land in the amd64 subfolder. The PGI and PGO builds for profile guided
@@ -123,6 +123,8 @@
 
     Use x64 instead of Win32 for the x64 platform.
     
+    NOTE: Tcl/Tk 8.4 doesn't compile for x64.
+    
     Build Tcl first 
     ---------------
     Use "Start -> All Programs -> Microsoft Visual Studio 2008
@@ -192,10 +194,11 @@
       svn export http://svn.python.org/projects/external/db-4.4.20
 
     Next open the solution file db-4.4.20\build_win32\Berkeley_DB.sln with
-    Visual Studio and convert the projects to the new format. The standard
-    and professional version of VS 2008 builds the necessary libraries
-    in a pre-link step of _bsddb. However the express edition is missing
-    some pieces and you have to build the libs yourself.
+    Visual Studio and convert the projects to the new format. VS 2008 
+    builds the necessary libraries in a pre-link step of _bsddb. You
+    have to add "$(VCInstallDir)vcpackages" to the search path first
+    (Tools -> Options -> Projects and Solutions -> VC++ Directories,
+     Platform: Win32, Show directories for: Executable files).
     
     The _bsddb subprojects depends only on the db_static project of 
     Berkeley DB. You have to choose either "Release", "Release AMD64", "Debug"
@@ -285,7 +288,7 @@
 
 NOTE:
 Official support for Itanium builds have been dropped from the build. Please
-contact as and provide patches if you are interested in Itanium builds.
+contact us and provide patches if you are interested in Itanium builds.
 
 The project files support a ReleaseItanium configuration which creates
 Win64/Itanium binaries. For this to work, you need to install the Platform

Modified: python/branches/trunk-math/Python/bltinmodule.c
==============================================================================
--- python/branches/trunk-math/Python/bltinmodule.c	(original)
+++ python/branches/trunk-math/Python/bltinmodule.c	Tue Feb 12 06:36:19 2008
@@ -2044,20 +2044,6 @@
 Without arguments, equivalent to locals().\n\
 With an argument, equivalent to object.__dict__.");
 
-static PyObject *
-builtin_trunc(PyObject *self, PyObject *number)
-{
-        /* XXX: The py3k branch gets better errors for this by using
-           _PyType_Lookup(), but since float's mro isn't set in py2.6,
-           we just use PyObject_CallMethod here. */
-	return PyObject_CallMethod(number, "__trunc__", NULL);
-}
-
-PyDoc_STRVAR(trunc_doc,
-"trunc(Real) -> Integral\n\
-\n\
-returns the integral closest to x between 0 and x.");
-
 
 static PyObject*
 builtin_sum(PyObject *self, PyObject *args)
@@ -2406,7 +2392,6 @@
  	{"unichr",	builtin_unichr,     METH_VARARGS, unichr_doc},
 #endif
  	{"vars",	builtin_vars,       METH_VARARGS, vars_doc},
- 	{"trunc",	builtin_trunc,      METH_O, trunc_doc},
   	{"zip",         builtin_zip,        METH_VARARGS, zip_doc},
 	{NULL,		NULL},
 };

Modified: python/branches/trunk-math/Python/compile.c
==============================================================================
--- python/branches/trunk-math/Python/compile.c	(original)
+++ python/branches/trunk-math/Python/compile.c	Tue Feb 12 06:36:19 2008
@@ -392,9 +392,9 @@
 {
 	basicblock *block;
 	for (block = u->u_blocks; block != NULL; block = block->b_list) {
-		assert(block != (void *)0xcbcbcbcb);
-		assert(block != (void *)0xfbfbfbfb);
-		assert(block != (void *)0xdbdbdbdb);
+		assert((void *)block != (void *)0xcbcbcbcb);
+		assert((void *)block != (void *)0xfbfbfbfb);
+		assert((void *)block != (void *)0xdbdbdbdb);
 		if (block->b_instr != NULL) {
 			assert(block->b_ialloc > 0);
 			assert(block->b_iused > 0);
@@ -638,11 +638,16 @@
 	return b->b_iused++;
 }
 
-/* Set the i_lineno member of the instruction at offse off if the
-   line number for the current expression/statement (?) has not
+/* Set the i_lineno member of the instruction at offset off if the
+   line number for the current expression/statement has not
    already been set.  If it has been set, the call has no effect.
 
-   Every time a new node is b
+   The line number is reset in the following cases:
+   - when entering a new scope
+   - on each statement
+   - on each expression that start a new line
+   - before the "except" clause
+   - before the "for" and "while" expressions
 */
 
 static void
@@ -907,24 +912,59 @@
 {
 	PyObject *t, *v;
 	Py_ssize_t arg;
+	unsigned char *p, *q;
+	Py_complex z;
+	double d;
+	int real_part_zero, imag_part_zero;
 
 	/* necessary to make sure types aren't coerced (e.g., int and long) */
         /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
         if (PyFloat_Check(o)) {
-            double d = PyFloat_AS_DOUBLE(o);
-            unsigned char* p = (unsigned char*) &d;
-            /* all we need is to make the tuple different in either the 0.0
-             * or -0.0 case from all others, just to avoid the "coercion".
-             */
-            if (*p==0 && p[sizeof(double)-1]==0)
-                t = PyTuple_Pack(3, o, o->ob_type, Py_None);
-            else
-	        t = PyTuple_Pack(2, o, o->ob_type);
-        } else {
-	    t = PyTuple_Pack(2, o, o->ob_type);
+		d = PyFloat_AS_DOUBLE(o);
+		p = (unsigned char*) &d;
+		/* all we need is to make the tuple different in either the 0.0
+		 * or -0.0 case from all others, just to avoid the "coercion".
+		 */
+		if (*p==0 && p[sizeof(double)-1]==0)
+			t = PyTuple_Pack(3, o, o->ob_type, Py_None);
+		else
+			t = PyTuple_Pack(2, o, o->ob_type);
+	}
+	else if (PyComplex_Check(o)) {
+		/* complex case is even messier: we need to make complex(x,
+		   0.) different from complex(x, -0.) and complex(0., y)
+		   different from complex(-0., y), for any x and y.  In
+		   particular, all four complex zeros should be
+		   distinguished.*/
+		z = PyComplex_AsCComplex(o);
+		p = (unsigned char*) &(z.real);
+		q = (unsigned char*) &(z.imag);
+		/* all that matters here is that on IEEE platforms
+		   real_part_zero will be true if z.real == 0., and false if
+		   z.real == -0.  In fact, real_part_zero will also be true
+		   for some other rarely occurring nonzero floats, but this
+		   doesn't matter. Similar comments apply to
+		   imag_part_zero. */
+		real_part_zero = *p==0 && p[sizeof(double)-1]==0;
+		imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
+		if (real_part_zero && imag_part_zero) {
+			t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
+		}
+		else if (real_part_zero && !imag_part_zero) {
+			t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
+		}
+		else if (!real_part_zero && imag_part_zero) {
+			t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
+		}
+		else {
+			t = PyTuple_Pack(2, o, o->ob_type);
+		}
+        }
+	else {
+		t = PyTuple_Pack(2, o, o->ob_type);
         }
 	if (t == NULL)
-	    return -1;
+		return -1;
 
 	v = PyDict_GetItem(dict, t);
 	if (!v) {
@@ -1576,9 +1616,8 @@
 	VISIT(c, expr, s->v.For.iter);
 	ADDOP(c, GET_ITER);
 	compiler_use_next_block(c, start);
-	/* XXX(nnorwitz): is there a better way to handle this?
-	   for loops are special, we want to be able to trace them
-	   each time around, so we need to set an extra line number. */
+	/* for expressions must be traced on each iteration,
+	   so we need to set an extra line number. */
 	c->u->u_lineno_set = false;
 	ADDOP_JREL(c, FOR_ITER, cleanup);
 	VISIT(c, expr, s->v.For.target);
@@ -1625,6 +1664,9 @@
 	if (!compiler_push_fblock(c, LOOP, loop))
 		return 0;
 	if (constant == -1) {
+		/* while expressions must be traced on each iteration,
+		   so we need to set an extra line number. */
+		c->u->u_lineno_set = false;
 		VISIT(c, expr, s->v.While.test);
 		ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
 		ADDOP(c, POP_TOP);
@@ -1805,8 +1847,8 @@
 						s->v.TryExcept.handlers, i);
 		if (!handler->type && i < n-1)
 		    return compiler_error(c, "default 'except:' must be last");
-	c->u->u_lineno_set = false;
-	c->u->u_lineno = handler->lineno;
+		c->u->u_lineno_set = false;
+		c->u->u_lineno = handler->lineno;
 		except = compiler_new_block(c);
 		if (except == NULL)
 			return 0;
@@ -3518,10 +3560,7 @@
 	assert(d_bytecode >= 0);
 	assert(d_lineno >= 0);
 
-	/* XXX(nnorwitz): is there a better way to handle this?
-	   for loops are special, we want to be able to trace them
-	   each time around, so we need to set an extra line number. */
-	if (d_lineno == 0 && i->i_opcode != FOR_ITER)
+	if(d_bytecode == 0 && d_lineno == 0)
 		return 1;
 
 	if (d_bytecode > 255) {

Modified: python/branches/trunk-math/Python/import.c
==============================================================================
--- python/branches/trunk-math/Python/import.c	(original)
+++ python/branches/trunk-math/Python/import.c	Tue Feb 12 06:36:19 2008
@@ -370,6 +370,8 @@
 	"exc_type", "exc_value", "exc_traceback",
 	"last_type", "last_value", "last_traceback",
 	"path_hooks", "path_importer_cache", "meta_path",
+	/* misc stuff */
+	"flags", "float_info",
 	NULL
 };
 

Modified: python/branches/trunk-math/Python/marshal.c
==============================================================================
--- python/branches/trunk-math/Python/marshal.c	(original)
+++ python/branches/trunk-math/Python/marshal.c	Tue Feb 12 06:36:19 2008
@@ -881,6 +881,7 @@
                                 v = NULL;
                                 break;
                         }
+                        Py_DECREF(v2);
 		}
 		retval = v;
 		break;

Modified: python/branches/trunk-math/Python/pythonrun.c
==============================================================================
--- python/branches/trunk-math/Python/pythonrun.c	(original)
+++ python/branches/trunk-math/Python/pythonrun.c	Tue Feb 12 06:36:19 2008
@@ -473,6 +473,7 @@
 	PyString_Fini();
 	PyInt_Fini();
 	PyFloat_Fini();
+	PyDict_Fini();
 
 #ifdef Py_USING_UNICODE
 	/* Cleanup Unicode implementation */

Modified: python/branches/trunk-math/Python/strtod.c
==============================================================================
--- python/branches/trunk-math/Python/strtod.c	(original)
+++ python/branches/trunk-math/Python/strtod.c	Tue Feb 12 06:36:19 2008
@@ -44,11 +44,11 @@
     I do know about <values.h>, but the whole point of this file is that
     we can't always trust that stuff to be there or to be correct.
 */
-static	int	MDMINEXPT	= {-323};
+static	int	MDMINEXPT	= -323;
 static	char	MDMINFRAC[]	= "494065645841246544";
 static	double	ZERO		= 0.0;
 
-static	int	MDMAXEXPT	= { 309};
+static	int	MDMAXEXPT	= 309;
 static	char	MDMAXFRAC[]	= "17976931348623157";
 static	double	HUGE		= 1.7976931348623157e308;
 

Modified: python/branches/trunk-math/Python/sysmodule.c
==============================================================================
--- python/branches/trunk-math/Python/sysmodule.c	(original)
+++ python/branches/trunk-math/Python/sysmodule.c	Tue Feb 12 06:36:19 2008
@@ -754,17 +754,6 @@
 10. Number of stack pops performed by call_function()"
 );
 
-static PyObject *
-sys_cleartypecache(PyObject* self, PyObject* args)
-{
-	PyType_ClearCache();
-	Py_RETURN_NONE;
-}
-
-PyDoc_STRVAR(cleartypecache_doc,
-"_cleartypecache() -> None\n\
-Clear the internal type lookup cache.");
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -783,12 +772,44 @@
 }
 #endif
 
+static PyObject *
+sys_clear_type_cache(PyObject* self, PyObject* args)
+{
+	PyType_ClearCache();
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(sys_clear_type_cache__doc__,
+"_clear_type_cache() -> None\n\
+Clear the internal type lookup cache.");
+
+
+static PyObject *
+sys_compact_freelists(PyObject* self, PyObject* args)
+{
+	size_t isum, ibc, ibf;
+	size_t fsum, fbc, fbf;
+
+	PyInt_CompactFreeList(&ibc, &ibf, &isum);
+	PyFloat_CompactFreeList(&fbc, &fbf, &fsum);
+
+	return Py_BuildValue("(kkk)(kkk)", isum, ibc, ibf,
+					   fsum, fbc, fbf);
+
+}
+
+PyDoc_STRVAR(sys_compact_freelists__doc__,
+"_compact_freelists() -> ((remaing_objects, total_blocks, freed_blocks), ...)\n\
+Compact the free lists of ints and floats.");
+
 static PyMethodDef sys_methods[] = {
 	/* Might as well keep this in alphabetic order */
 	{"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
 	 callstats_doc},
-	{"_cleartypecache", sys_cleartypecache, METH_NOARGS,
-	 cleartypecache_doc},
+	{"_clear_type_cache",	sys_clear_type_cache,	  METH_NOARGS,
+	 sys_clear_type_cache__doc__},
+	{"_compact_freelists",	sys_compact_freelists,	  METH_NOARGS,
+	 sys_compact_freelists__doc__},
 	{"_current_frames", sys_current_frames, METH_NOARGS,
 	 current_frames_doc},
 	{"displayhook",	sys_displayhook, METH_O, displayhook_doc},
@@ -1107,7 +1128,7 @@
 \n\
 Flags provided through command line arguments or environment vars.");
 
-static PyTypeObject FlagsType;
+static PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0};
 
 static PyStructSequence_Field flags_fields[] = {
 	{"debug",		"-d"},
@@ -1180,8 +1201,6 @@
 	if (PyErr_Occurred()) {
 		return NULL;
 	}
-
-	Py_INCREF(seq);
 	return seq;
 }
 
@@ -1199,6 +1218,11 @@
 	if (m == NULL)
 		return NULL;
 	sysdict = PyModule_GetDict(m);
+#define SET_SYS_FROM_STRING(key, value)			\
+	v = value;					\
+	if (v != NULL)					\
+		PyDict_SetItemString(sysdict, key, v);	\
+	Py_XDECREF(v)
 
 	{
 		/* XXX: does this work on Win/Win64? (see posix_fstat) */
@@ -1258,19 +1282,17 @@
 	Py_XDECREF(sysin);
 	Py_XDECREF(sysout);
 	Py_XDECREF(syserr);
-	PyDict_SetItemString(sysdict, "version",
-			     v = PyString_FromString(Py_GetVersion()));
-	Py_XDECREF(v);
-	PyDict_SetItemString(sysdict, "hexversion",
-			     v = PyInt_FromLong(PY_VERSION_HEX));
-	Py_XDECREF(v);
+
+	SET_SYS_FROM_STRING("version",
+			     PyString_FromString(Py_GetVersion()));
+	SET_SYS_FROM_STRING("hexversion",
+			     PyInt_FromLong(PY_VERSION_HEX));
 	svnversion_init();
-	v = Py_BuildValue("(ssz)", "CPython", branch, svn_revision);
-	PyDict_SetItemString(sysdict, "subversion", v);
-	Py_XDECREF(v);
-	PyDict_SetItemString(sysdict, "dont_write_bytecode",
-			     v = PyBool_FromLong(Py_DontWriteBytecodeFlag));
-	Py_XDECREF(v);
+	SET_SYS_FROM_STRING("subversion",
+			    Py_BuildValue("(ssz)", "CPython", branch,
+					  svn_revision));
+	SET_SYS_FROM_STRING("dont_write_bytecode",
+			    PyBool_FromLong(Py_DontWriteBytecodeFlag));
 	/*
 	 * These release level checks are mutually exclusive and cover
 	 * the field, so don't get too fancy with the pre-processor!
@@ -1285,12 +1307,6 @@
 	s = "final";
 #endif
 
-#define SET_SYS_FROM_STRING(key, value)			\
-	v = value;					\
-	if (v != NULL)					\
-		PyDict_SetItemString(sysdict, key, v);	\
-	Py_XDECREF(v)
-
 	SET_SYS_FROM_STRING("version_info",
 			    Py_BuildValue("iiisi", PY_MAJOR_VERSION,
 					       PY_MINOR_VERSION,
@@ -1340,7 +1356,6 @@
 	SET_SYS_FROM_STRING("winver",
 			    PyString_FromString(PyWin_DLLVersionString));
 #endif
-#undef SET_SYS_FROM_STRING
 	if (warnoptions == NULL) {
 		warnoptions = PyList_New(0);
 	}
@@ -1351,12 +1366,14 @@
 		PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
 	}
 
-	PyStructSequence_InitType(&FlagsType, &flags_desc);
-	PyDict_SetItemString(sysdict, "flags", make_flags());
+	if (FlagsType.tp_name == 0)
+		PyStructSequence_InitType(&FlagsType, &flags_desc);
+	SET_SYS_FROM_STRING("flags", make_flags());
 	/* prevent user from creating new instances */
 	FlagsType.tp_init = NULL;
 	FlagsType.tp_new = NULL;
 
+#undef SET_SYS_FROM_STRING
 	if (PyErr_Occurred())
 		return NULL;
 	return m;

Modified: python/branches/trunk-math/README
==============================================================================
--- python/branches/trunk-math/README	(original)
+++ python/branches/trunk-math/README	Tue Feb 12 06:36:19 2008
@@ -1245,7 +1245,7 @@
 comments.
 
 Demo/           Demonstration scripts, modules and programs
-Doc/            Documentation sources (LaTeX)
+Doc/            Documentation sources (reStructuredText)
 Grammar/        Input for the parser generator
 Include/        Public header files
 LICENSE         Licensing information

Modified: python/branches/trunk-math/configure
==============================================================================
--- python/branches/trunk-math/configure	(original)
+++ python/branches/trunk-math/configure	Tue Feb 12 06:36:19 2008
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 59819 .
+# From configure.in Revision: 60484 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for python 2.6.
 #
@@ -1313,7 +1313,7 @@
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-universalsdk[SDKDIR]
-                          Build agains Mac OS X 10.4u SDK (ppc/i386)
+                          Build against Mac OS X 10.4u SDK (ppc/i386)
   --enable-framework[=INSTALLDIR]
                           Build (MacOSX|Darwin) framework
   --enable-shared         disable/enable building shared python library
@@ -10160,6 +10160,411 @@
 _ACEOF
 
 
+{ echo "$as_me:$LINENO: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_pid_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef pid_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_pid_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_type_pid_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of pid_t" >&5
+echo $ECHO_N "checking size of pid_t... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_pid_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_lo=`expr $ac_mid + 1`
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_hi=`expr '(' $ac_mid ')' - 1`
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_pid_t=$ac_lo;;
+'') if test "$ac_cv_type_pid_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (pid_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (pid_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_pid_t=0
+   fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef pid_t ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+	return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_pid_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_pid_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (pid_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (pid_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_pid_t=0
+   fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_pid_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_pid_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_PID_T $ac_cv_sizeof_pid_t
+_ACEOF
+
+
 
 { echo "$as_me:$LINENO: checking for long long support" >&5
 echo $ECHO_N "checking for long long support... $ECHO_C" >&6; }
@@ -14391,6 +14796,12 @@
 _ACEOF
 
 		       ;;
+      AIX/5)
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BROKEN_POSIX_SEMAPHORES 1
+_ACEOF
+
+		       ;;
       esac
 
       { echo "$as_me:$LINENO: checking if PTHREAD_SCOPE_SYSTEM is supported" >&5

Modified: python/branches/trunk-math/configure.in
==============================================================================
--- python/branches/trunk-math/configure.in	(original)
+++ python/branches/trunk-math/configure.in	Tue Feb 12 06:36:19 2008
@@ -61,7 +61,7 @@
 CONFIG_ARGS="$ac_configure_args"
 
 AC_ARG_ENABLE(universalsdk,
-	AC_HELP_STRING(--enable-universalsdk@<:@SDKDIR@:>@, Build agains Mac OS X 10.4u SDK (ppc/i386)),
+	AC_HELP_STRING(--enable-universalsdk@<:@SDKDIR@:>@, Build against Mac OS X 10.4u SDK (ppc/i386)),
 [
 	case $enableval in
 	yes)
@@ -1202,7 +1202,7 @@
 AC_TYPE_SIGNAL
 AC_TYPE_SIZE_T
 AC_TYPE_UID_T
-AC_CHECK_TYPE(ssize_t, 
+AC_CHECK_TYPE(ssize_t,
   AC_DEFINE(HAVE_SSIZE_T, 1, Define if your compiler provides ssize_t),,)
 
 # Sizes of various common basic types
@@ -1215,6 +1215,7 @@
 AC_CHECK_SIZEOF(double, 8)
 AC_CHECK_SIZEOF(fpos_t, 4)
 AC_CHECK_SIZEOF(size_t, 4)
+AC_CHECK_SIZEOF(pid_t, 4)
 
 AC_MSG_CHECKING(for long long support)
 have_long_long=no
@@ -1993,6 +1994,9 @@
       SunOS/5.8) AC_DEFINE(HAVE_BROKEN_POSIX_SEMAPHORES, 1,
 		       Define if the Posix semaphores do not work on your system)
 		       ;;
+      AIX/5) AC_DEFINE(HAVE_BROKEN_POSIX_SEMAPHORES, 1,
+		       Define if the Posix semaphores do not work on your system)
+		       ;;
       esac
 
       AC_MSG_CHECKING(if PTHREAD_SCOPE_SYSTEM is supported)

Modified: python/branches/trunk-math/pyconfig.h.in
==============================================================================
--- python/branches/trunk-math/pyconfig.h.in	(original)
+++ python/branches/trunk-math/pyconfig.h.in	Tue Feb 12 06:36:19 2008
@@ -881,6 +881,9 @@
 /* The number of bytes in an off_t. */
 #undef SIZEOF_OFF_T
 
+/* The size of `pid_t', as computed by sizeof. */
+#undef SIZEOF_PID_T
+
 /* The number of bytes in a pthread_t. */
 #undef SIZEOF_PTHREAD_T
 

Modified: python/branches/trunk-math/setup.py
==============================================================================
--- python/branches/trunk-math/setup.py	(original)
+++ python/branches/trunk-math/setup.py	Tue Feb 12 06:36:19 2008
@@ -327,7 +327,7 @@
                 parser.add_option(arg_name, dest="dirs", action="append")
                 options = parser.parse_args(env_val.split())[0]
                 if options.dirs:
-                    for directory in options.dirs:
+                    for directory in reversed(options.dirs):
                         add_dir_to_list(dir_list, directory)
 
         if os.path.normpath(sys.prefix) != '/usr':
@@ -727,10 +727,10 @@
         for dn in inc_dirs:
             std_variants.append(os.path.join(dn, 'db3'))
             std_variants.append(os.path.join(dn, 'db4'))
-            for x in (0,1,2,3,4,5,6):
+            for x in range(max_db_ver[1]+1):
                 std_variants.append(os.path.join(dn, "db4%d"%x))
                 std_variants.append(os.path.join(dn, "db4.%d"%x))
-            for x in (2,3):
+            for x in (3,):
                 std_variants.append(os.path.join(dn, "db3%d"%x))
                 std_variants.append(os.path.join(dn, "db3.%d"%x))
 


More information about the Python-checkins mailing list