[pypy-commit] pypy arm-backend-2: merge up to d05a7437ee20

bivab noreply at buildbot.pypy.org
Fri Jul 1 16:15:58 CEST 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r45230:04530d3561b1
Date: 2011-07-01 15:16 +0200
http://bitbucket.org/pypy/pypy/changeset/04530d3561b1/

Log:	merge up to d05a7437ee20

diff --git a/lib-python/conftest.py b/lib-python/conftest.py
--- a/lib-python/conftest.py
+++ b/lib-python/conftest.py
@@ -61,7 +61,7 @@
                                  usemodules = '',
                                  skip=None): 
         self.basename = basename 
-        self._usemodules = usemodules.split()
+        self._usemodules = usemodules.split() + ['signal']
         self._compiler = compiler 
         self.core = core
         self.skip = skip
@@ -154,17 +154,17 @@
     RegrTest('test_cmd.py'),
     RegrTest('test_cmd_line_script.py'),
     RegrTest('test_codeccallbacks.py', core=True),
-    RegrTest('test_codecencodings_cn.py', skip="encodings not available"),
-    RegrTest('test_codecencodings_hk.py', skip="encodings not available"),
-    RegrTest('test_codecencodings_jp.py', skip="encodings not available"),
-    RegrTest('test_codecencodings_kr.py', skip="encodings not available"),
-    RegrTest('test_codecencodings_tw.py', skip="encodings not available"),
+    RegrTest('test_codecencodings_cn.py'),
+    RegrTest('test_codecencodings_hk.py'),
+    RegrTest('test_codecencodings_jp.py'),
+    RegrTest('test_codecencodings_kr.py'),
+    RegrTest('test_codecencodings_tw.py'),
 
-    RegrTest('test_codecmaps_cn.py', skip="encodings not available"),
-    RegrTest('test_codecmaps_hk.py', skip="encodings not available"),
-    RegrTest('test_codecmaps_jp.py', skip="encodings not available"),
-    RegrTest('test_codecmaps_kr.py', skip="encodings not available"),
-    RegrTest('test_codecmaps_tw.py', skip="encodings not available"),
+    RegrTest('test_codecmaps_cn.py'),
+    RegrTest('test_codecmaps_hk.py'),
+    RegrTest('test_codecmaps_jp.py'),
+    RegrTest('test_codecmaps_kr.py'),
+    RegrTest('test_codecmaps_tw.py'),
     RegrTest('test_codecs.py', core=True),
     RegrTest('test_codeop.py', core=True),
     RegrTest('test_coercion.py', core=True),
@@ -314,7 +314,7 @@
     RegrTest('test_mmap.py'),
     RegrTest('test_module.py', core=True),
     RegrTest('test_modulefinder.py'),
-    RegrTest('test_multibytecodec.py', skip="unsupported codecs"),
+    RegrTest('test_multibytecodec.py'),
     RegrTest('test_multibytecodec_support.py', skip="not a test"),
     RegrTest('test_multifile.py'),
     RegrTest('test_multiprocessing.py', skip='FIXME leaves subprocesses'),
@@ -400,7 +400,7 @@
 
     RegrTest('test_softspace.py', core=True),
     RegrTest('test_sort.py', core=True),
-    RegrTest('test_ssl.py'),
+    RegrTest('test_ssl.py', usemodules='_ssl _socket select'),
     RegrTest('test_str.py', core=True),
 
     RegrTest('test_strftime.py'),
diff --git a/lib-python/modified-2.7/site.py b/lib-python/modified-2.7/site.py
--- a/lib-python/modified-2.7/site.py
+++ b/lib-python/modified-2.7/site.py
@@ -454,10 +454,10 @@
     __builtin__.copyright = _Printer("copyright", sys.copyright)
     __builtin__.credits = _Printer(
         "credits",
-        "PyPy is maintained by the PyPy developers: http://codespeak.net/pypy")
+        "PyPy is maintained by the PyPy developers: http://pypy.org/")
     __builtin__.license = _Printer(
         "license",
-        "See http://codespeak.net/svn/pypy/dist/LICENSE")
+        "See https://bitbucket.org/pypy/pypy/src/default/LICENSE")
 
 
 
diff --git a/lib-python/modified-2.7/test/test_codecs.py b/lib-python/modified-2.7/test/test_codecs.py
deleted file mode 100644
--- a/lib-python/modified-2.7/test/test_codecs.py
+++ /dev/null
@@ -1,1615 +0,0 @@
-from test import test_support
-import unittest
-import codecs
-import sys, StringIO, _testcapi
-
-class Queue(object):
-    """
-    queue: write bytes at one end, read bytes from the other end
-    """
-    def __init__(self):
-        self._buffer = ""
-
-    def write(self, chars):
-        self._buffer += chars
-
-    def read(self, size=-1):
-        if size<0:
-            s = self._buffer
-            self._buffer = ""
-            return s
-        else:
-            s = self._buffer[:size]
-            self._buffer = self._buffer[size:]
-            return s
-
-class ReadTest(unittest.TestCase):
-    def check_partial(self, input, partialresults):
-        # get a StreamReader for the encoding and feed the bytestring version
-        # of input to the reader byte by byte. Read everything available from
-        # the StreamReader and check that the results equal the appropriate
-        # entries from partialresults.
-        q = Queue()
-        r = codecs.getreader(self.encoding)(q)
-        result = u""
-        for (c, partialresult) in zip(input.encode(self.encoding), partialresults):
-            q.write(c)
-            result += r.read()
-            self.assertEqual(result, partialresult)
-        # check that there's nothing left in the buffers
-        self.assertEqual(r.read(), u"")
-        self.assertEqual(r.bytebuffer, "")
-        self.assertEqual(r.charbuffer, u"")
-
-        # do the check again, this time using a incremental decoder
-        d = codecs.getincrementaldecoder(self.encoding)()
-        result = u""
-        for (c, partialresult) in zip(input.encode(self.encoding), partialresults):
-            result += d.decode(c)
-            self.assertEqual(result, partialresult)
-        # check that there's nothing left in the buffers
-        self.assertEqual(d.decode("", True), u"")
-        self.assertEqual(d.buffer, "")
-
-        # Check whether the reset method works properly
-        d.reset()
-        result = u""
-        for (c, partialresult) in zip(input.encode(self.encoding), partialresults):
-            result += d.decode(c)
-            self.assertEqual(result, partialresult)
-        # check that there's nothing left in the buffers
-        self.assertEqual(d.decode("", True), u"")
-        self.assertEqual(d.buffer, "")
-
-        # check iterdecode()
-        encoded = input.encode(self.encoding)
-        self.assertEqual(
-            input,
-            u"".join(codecs.iterdecode(encoded, self.encoding))
-        )
-
-    def test_readline(self):
-        def getreader(input):
-            stream = StringIO.StringIO(input.encode(self.encoding))
-            return codecs.getreader(self.encoding)(stream)
-
-        def readalllines(input, keepends=True, size=None):
-            reader = getreader(input)
-            lines = []
-            while True:
-                line = reader.readline(size=size, keepends=keepends)
-                if not line:
-                    break
-                lines.append(line)
-            return "|".join(lines)
-
-        s = u"foo\nbar\r\nbaz\rspam\u2028eggs"
-        sexpected = u"foo\n|bar\r\n|baz\r|spam\u2028|eggs"
-        sexpectednoends = u"foo|bar|baz|spam|eggs"
-        self.assertEqual(readalllines(s, True), sexpected)
-        self.assertEqual(readalllines(s, False), sexpectednoends)
-        self.assertEqual(readalllines(s, True, 10), sexpected)
-        self.assertEqual(readalllines(s, False, 10), sexpectednoends)
-
-        # Test long lines (multiple calls to read() in readline())
-        vw = []
-        vwo = []
-        for (i, lineend) in enumerate(u"\n \r\n \r \u2028".split()):
-            vw.append((i*200)*u"\3042" + lineend)
-            vwo.append((i*200)*u"\3042")
-        self.assertEqual(readalllines("".join(vw), True), "".join(vw))
-        self.assertEqual(readalllines("".join(vw), False),"".join(vwo))
-
-        # Test lines where the first read might end with \r, so the
-        # reader has to look ahead whether this is a lone \r or a \r\n
-        for size in xrange(80):
-            for lineend in u"\n \r\n \r \u2028".split():
-                s = 10*(size*u"a" + lineend + u"xxx\n")
-                reader = getreader(s)
-                for i in xrange(10):
-                    self.assertEqual(
-                        reader.readline(keepends=True),
-                        size*u"a" + lineend,
-                    )
-                reader = getreader(s)
-                for i in xrange(10):
-                    self.assertEqual(
-                        reader.readline(keepends=False),
-                        size*u"a",
-                    )
-
-    def test_bug1175396(self):
-        s = [
-            '<%!--===================================================\r\n',
-            '    BLOG index page: show recent articles,\r\n',
-            '    today\'s articles, or articles of a specific date.\r\n',
-            '========================================================--%>\r\n',
-            '<%@inputencoding="ISO-8859-1"%>\r\n',
-            '<%@pagetemplate=TEMPLATE.y%>\r\n',
-            '<%@import=import frog.util, frog%>\r\n',
-            '<%@import=import frog.objects%>\r\n',
-            '<%@import=from frog.storageerrors import StorageError%>\r\n',
-            '<%\r\n',
-            '\r\n',
-            'import logging\r\n',
-            'log=logging.getLogger("Snakelets.logger")\r\n',
-            '\r\n',
-            '\r\n',
-            'user=self.SessionCtx.user\r\n',
-            'storageEngine=self.SessionCtx.storageEngine\r\n',
-            '\r\n',
-            '\r\n',
-            'def readArticlesFromDate(date, count=None):\r\n',
-            '    entryids=storageEngine.listBlogEntries(date)\r\n',
-            '    entryids.reverse() # descending\r\n',
-            '    if count:\r\n',
-            '        entryids=entryids[:count]\r\n',
-            '    try:\r\n',
-            '        return [ frog.objects.BlogEntry.load(storageEngine, date, Id) for Id in entryids ]\r\n',
-            '    except StorageError,x:\r\n',
-            '        log.error("Error loading articles: "+str(x))\r\n',
-            '        self.abort("cannot load articles")\r\n',
-            '\r\n',
-            'showdate=None\r\n',
-            '\r\n',
-            'arg=self.Request.getArg()\r\n',
-            'if arg=="today":\r\n',
-            '    #-------------------- TODAY\'S ARTICLES\r\n',
-            '    self.write("<h2>Today\'s articles</h2>")\r\n',
-            '    showdate = frog.util.isodatestr() \r\n',
-            '    entries = readArticlesFromDate(showdate)\r\n',
-            'elif arg=="active":\r\n',
-            '    #-------------------- ACTIVE ARTICLES redirect\r\n',
-            '    self.Yredirect("active.y")\r\n',
-            'elif arg=="login":\r\n',
-            '    #-------------------- LOGIN PAGE redirect\r\n',
-            '    self.Yredirect("login.y")\r\n',
-            'elif arg=="date":\r\n',
-            '    #-------------------- ARTICLES OF A SPECIFIC DATE\r\n',
-            '    showdate = self.Request.getParameter("date")\r\n',
-            '    self.write("<h2>Articles written on %s</h2>"% frog.util.mediumdatestr(showdate))\r\n',
-            '    entries = readArticlesFromDate(showdate)\r\n',
-            'else:\r\n',
-            '    #-------------------- RECENT ARTICLES\r\n',
-            '    self.write("<h2>Recent articles</h2>")\r\n',
-            '    dates=storageEngine.listBlogEntryDates()\r\n',
-            '    if dates:\r\n',
-            '        entries=[]\r\n',
-            '        SHOWAMOUNT=10\r\n',
-            '        for showdate in dates:\r\n',
-            '            entries.extend( readArticlesFromDate(showdate, SHOWAMOUNT-len(entries)) )\r\n',
-            '            if len(entries)>=SHOWAMOUNT:\r\n',
-            '                break\r\n',
-            '                \r\n',
-        ]
-        stream = StringIO.StringIO("".join(s).encode(self.encoding))
-        reader = codecs.getreader(self.encoding)(stream)
-        for (i, line) in enumerate(reader):
-            self.assertEqual(line, s[i])
-
-    def test_readlinequeue(self):
-        q = Queue()
-        writer = codecs.getwriter(self.encoding)(q)
-        reader = codecs.getreader(self.encoding)(q)
-
-        # No lineends
-        writer.write(u"foo\r")
-        self.assertEqual(reader.readline(keepends=False), u"foo")
-        writer.write(u"\nbar\r")
-        self.assertEqual(reader.readline(keepends=False), u"")
-        self.assertEqual(reader.readline(keepends=False), u"bar")
-        writer.write(u"baz")
-        self.assertEqual(reader.readline(keepends=False), u"baz")
-        self.assertEqual(reader.readline(keepends=False), u"")
-
-        # Lineends
-        writer.write(u"foo\r")
-        self.assertEqual(reader.readline(keepends=True), u"foo\r")
-        writer.write(u"\nbar\r")
-        self.assertEqual(reader.readline(keepends=True), u"\n")
-        self.assertEqual(reader.readline(keepends=True), u"bar\r")
-        writer.write(u"baz")
-        self.assertEqual(reader.readline(keepends=True), u"baz")
-        self.assertEqual(reader.readline(keepends=True), u"")
-        writer.write(u"foo\r\n")
-        self.assertEqual(reader.readline(keepends=True), u"foo\r\n")
-
-    def test_bug1098990_a(self):
-        s1 = u"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\r\n"
-        s2 = u"offending line: ladfj askldfj klasdj fskla dfzaskdj fasklfj laskd fjasklfzzzzaa%whereisthis!!!\r\n"
-        s3 = u"next line.\r\n"
-
-        s = (s1+s2+s3).encode(self.encoding)
-        stream = StringIO.StringIO(s)
-        reader = codecs.getreader(self.encoding)(stream)
-        self.assertEqual(reader.readline(), s1)
-        self.assertEqual(reader.readline(), s2)
-        self.assertEqual(reader.readline(), s3)
-        self.assertEqual(reader.readline(), u"")
-
-    def test_bug1098990_b(self):
-        s1 = u"aaaaaaaaaaaaaaaaaaaaaaaa\r\n"
-        s2 = u"bbbbbbbbbbbbbbbbbbbbbbbb\r\n"
-        s3 = u"stillokay:bbbbxx\r\n"
-        s4 = u"broken!!!!badbad\r\n"
-        s5 = u"againokay.\r\n"
-
-        s = (s1+s2+s3+s4+s5).encode(self.encoding)
-        stream = StringIO.StringIO(s)
-        reader = codecs.getreader(self.encoding)(stream)
-        self.assertEqual(reader.readline(), s1)
-        self.assertEqual(reader.readline(), s2)
-        self.assertEqual(reader.readline(), s3)
-        self.assertEqual(reader.readline(), s4)
-        self.assertEqual(reader.readline(), s5)
-        self.assertEqual(reader.readline(), u"")
-
-class UTF32Test(ReadTest):
-    encoding = "utf-32"
-
-    spamle = ('\xff\xfe\x00\x00'
-              's\x00\x00\x00p\x00\x00\x00a\x00\x00\x00m\x00\x00\x00'
-              's\x00\x00\x00p\x00\x00\x00a\x00\x00\x00m\x00\x00\x00')
-    spambe = ('\x00\x00\xfe\xff'
-              '\x00\x00\x00s\x00\x00\x00p\x00\x00\x00a\x00\x00\x00m'
-              '\x00\x00\x00s\x00\x00\x00p\x00\x00\x00a\x00\x00\x00m')
-
-    def test_only_one_bom(self):
-        _,_,reader,writer = codecs.lookup(self.encoding)
-        # encode some stream
-        s = StringIO.StringIO()
-        f = writer(s)
-        f.write(u"spam")
-        f.write(u"spam")
-        d = s.getvalue()
-        # check whether there is exactly one BOM in it
-        self.assertTrue(d == self.spamle or d == self.spambe)
-        # try to read it back
-        s = StringIO.StringIO(d)
-        f = reader(s)
-        self.assertEqual(f.read(), u"spamspam")
-
-    def test_badbom(self):
-        s = StringIO.StringIO(4*"\xff")
-        f = codecs.getreader(self.encoding)(s)
-        self.assertRaises(UnicodeError, f.read)
-
-        s = StringIO.StringIO(8*"\xff")
-        f = codecs.getreader(self.encoding)(s)
-        self.assertRaises(UnicodeError, f.read)
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"", # first byte of BOM read
-                u"", # second byte of BOM read
-                u"", # third byte of BOM read
-                u"", # fourth byte of BOM read => byteorder known
-                u"",
-                u"",
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_handlers(self):
-        self.assertEqual((u'\ufffd', 1),
-                         codecs.utf_32_decode('\x01', 'replace', True))
-        self.assertEqual((u'', 1),
-                         codecs.utf_32_decode('\x01', 'ignore', True))
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_32_decode,
-                          "\xff", "strict", True)
-
-    def test_issue8941(self):
-        # Issue #8941: insufficient result allocation when decoding into
-        # surrogate pairs on UCS-2 builds.
-        encoded_le = '\xff\xfe\x00\x00' + '\x00\x00\x01\x00' * 1024
-        self.assertEqual(u'\U00010000' * 1024,
-                         codecs.utf_32_decode(encoded_le)[0])
-        encoded_be = '\x00\x00\xfe\xff' + '\x00\x01\x00\x00' * 1024
-        self.assertEqual(u'\U00010000' * 1024,
-                         codecs.utf_32_decode(encoded_be)[0])
-
-class UTF32LETest(ReadTest):
-    encoding = "utf-32-le"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"",
-                u"",
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_simple(self):
-        self.assertEqual(u"\U00010203".encode(self.encoding), "\x03\x02\x01\x00")
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_32_le_decode,
-                          "\xff", "strict", True)
-
-    def test_issue8941(self):
-        # Issue #8941: insufficient result allocation when decoding into
-        # surrogate pairs on UCS-2 builds.
-        encoded = '\x00\x00\x01\x00' * 1024
-        self.assertEqual(u'\U00010000' * 1024,
-                         codecs.utf_32_le_decode(encoded)[0])
-
-class UTF32BETest(ReadTest):
-    encoding = "utf-32-be"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"",
-                u"",
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_simple(self):
-        self.assertEqual(u"\U00010203".encode(self.encoding), "\x00\x01\x02\x03")
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_32_be_decode,
-                          "\xff", "strict", True)
-
-    def test_issue8941(self):
-        # Issue #8941: insufficient result allocation when decoding into
-        # surrogate pairs on UCS-2 builds.
-        encoded = '\x00\x01\x00\x00' * 1024
-        self.assertEqual(u'\U00010000' * 1024,
-                         codecs.utf_32_be_decode(encoded)[0])
-
-
-class UTF16Test(ReadTest):
-    encoding = "utf-16"
-
-    spamle = '\xff\xfes\x00p\x00a\x00m\x00s\x00p\x00a\x00m\x00'
-    spambe = '\xfe\xff\x00s\x00p\x00a\x00m\x00s\x00p\x00a\x00m'
-
-    def test_only_one_bom(self):
-        _,_,reader,writer = codecs.lookup(self.encoding)
-        # encode some stream
-        s = StringIO.StringIO()
-        f = writer(s)
-        f.write(u"spam")
-        f.write(u"spam")
-        d = s.getvalue()
-        # check whether there is exactly one BOM in it
-        self.assertTrue(d == self.spamle or d == self.spambe)
-        # try to read it back
-        s = StringIO.StringIO(d)
-        f = reader(s)
-        self.assertEqual(f.read(), u"spamspam")
-
-    def test_badbom(self):
-        s = StringIO.StringIO("\xff\xff")
-        f = codecs.getreader(self.encoding)(s)
-        self.assertRaises(UnicodeError, f.read)
-
-        s = StringIO.StringIO("\xff\xff\xff\xff")
-        f = codecs.getreader(self.encoding)(s)
-        self.assertRaises(UnicodeError, f.read)
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"", # first byte of BOM read
-                u"", # second byte of BOM read => byteorder known
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_handlers(self):
-        self.assertEqual((u'\ufffd', 1),
-                         codecs.utf_16_decode('\x01', 'replace', True))
-        self.assertEqual((u'', 1),
-                         codecs.utf_16_decode('\x01', 'ignore', True))
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_16_decode, "\xff", "strict", True)
-
-    def test_bug691291(self):
-        # Files are always opened in binary mode, even if no binary mode was
-        # specified.  This means that no automatic conversion of '\n' is done
-        # on reading and writing.
-        s1 = u'Hello\r\nworld\r\n'
-
-        s = s1.encode(self.encoding)
-        try:
-            with open(test_support.TESTFN, 'wb') as fp:
-                fp.write(s)
-            with codecs.open(test_support.TESTFN, 'U', encoding=self.encoding) as reader:
-                self.assertEqual(reader.read(), s1)
-        finally:
-            test_support.unlink(test_support.TESTFN)
-
-class UTF16LETest(ReadTest):
-    encoding = "utf-16-le"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_16_le_decode, "\xff", "strict", True)
-
-class UTF16BETest(ReadTest):
-    encoding = "utf-16-be"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u0100\uffff",
-            [
-                u"",
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100",
-                u"\x00\xff\u0100\uffff",
-            ]
-        )
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_16_be_decode, "\xff", "strict", True)
-
-class UTF8Test(ReadTest):
-    encoding = "utf-8"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\x00\xff\u07ff\u0800\uffff",
-            [
-                u"\x00",
-                u"\x00",
-                u"\x00\xff",
-                u"\x00\xff",
-                u"\x00\xff\u07ff",
-                u"\x00\xff\u07ff",
-                u"\x00\xff\u07ff",
-                u"\x00\xff\u07ff\u0800",
-                u"\x00\xff\u07ff\u0800",
-                u"\x00\xff\u07ff\u0800",
-                u"\x00\xff\u07ff\u0800\uffff",
-            ]
-        )
-
-class UTF7Test(ReadTest):
-    encoding = "utf-7"
-
-    def test_partial(self):
-        self.check_partial(
-            u"a+-b",
-            [
-                u"a",
-                u"a",
-                u"a+",
-                u"a+-",
-                u"a+-b",
-            ]
-        )
-
-class UTF16ExTest(unittest.TestCase):
-
-    def test_errors(self):
-        self.assertRaises(UnicodeDecodeError, codecs.utf_16_ex_decode, "\xff", "strict", 0, True)
-
-    def test_bad_args(self):
-        self.assertRaises(TypeError, codecs.utf_16_ex_decode)
-
-class ReadBufferTest(unittest.TestCase):
-
-    def test_array(self):
-        import array
-        self.assertEqual(
-            codecs.readbuffer_encode(array.array("c", "spam")),
-            ("spam", 4)
-        )
-
-    def test_empty(self):
-        self.assertEqual(codecs.readbuffer_encode(""), ("", 0))
-
-    def test_bad_args(self):
-        self.assertRaises(TypeError, codecs.readbuffer_encode)
-        self.assertRaises(TypeError, codecs.readbuffer_encode, 42)
-
-class CharBufferTest(unittest.TestCase):
-
-    def test_string(self):
-        self.assertEqual(codecs.charbuffer_encode("spam"), ("spam", 4))
-
-    def test_empty(self):
-        self.assertEqual(codecs.charbuffer_encode(""), ("", 0))
-
-    def test_bad_args(self):
-        self.assertRaises(TypeError, codecs.charbuffer_encode)
-        self.assertRaises(TypeError, codecs.charbuffer_encode, 42)
-
-class UTF8SigTest(ReadTest):
-    encoding = "utf-8-sig"
-
-    def test_partial(self):
-        self.check_partial(
-            u"\ufeff\x00\xff\u07ff\u0800\uffff",
-            [
-                u"",
-                u"",
-                u"", # First BOM has been read and skipped
-                u"",
-                u"",
-                u"\ufeff", # Second BOM has been read and emitted
-                u"\ufeff\x00", # "\x00" read and emitted
-                u"\ufeff\x00", # First byte of encoded u"\xff" read
-                u"\ufeff\x00\xff", # Second byte of encoded u"\xff" read
-                u"\ufeff\x00\xff", # First byte of encoded u"\u07ff" read
-                u"\ufeff\x00\xff\u07ff", # Second byte of encoded u"\u07ff" read
-                u"\ufeff\x00\xff\u07ff",
-                u"\ufeff\x00\xff\u07ff",
-                u"\ufeff\x00\xff\u07ff\u0800",
-                u"\ufeff\x00\xff\u07ff\u0800",
-                u"\ufeff\x00\xff\u07ff\u0800",
-                u"\ufeff\x00\xff\u07ff\u0800\uffff",
-            ]
-        )
-
-    def test_bug1601501(self):
-        # SF bug #1601501: check that the codec works with a buffer
-        unicode("\xef\xbb\xbf", "utf-8-sig")
-
-    def test_bom(self):
-        d = codecs.getincrementaldecoder("utf-8-sig")()
-        s = u"spam"
-        self.assertEqual(d.decode(s.encode("utf-8-sig")), s)
-
-    def test_stream_bom(self):
-        unistring = u"ABC\u00A1\u2200XYZ"
-        bytestring = codecs.BOM_UTF8 + "ABC\xC2\xA1\xE2\x88\x80XYZ"
-
-        reader = codecs.getreader("utf-8-sig")
-        for sizehint in [None] + range(1, 11) + \
-                        [64, 128, 256, 512, 1024]:
-            istream = reader(StringIO.StringIO(bytestring))
-            ostream = StringIO.StringIO()
-            while 1:
-                if sizehint is not None:
-                    data = istream.read(sizehint)
-                else:
-                    data = istream.read()
-
-                if not data:
-                    break
-                ostream.write(data)
-
-            got = ostream.getvalue()
-            self.assertEqual(got, unistring)
-
-    def test_stream_bare(self):
-        unistring = u"ABC\u00A1\u2200XYZ"
-        bytestring = "ABC\xC2\xA1\xE2\x88\x80XYZ"
-
-        reader = codecs.getreader("utf-8-sig")
-        for sizehint in [None] + range(1, 11) + \
-                        [64, 128, 256, 512, 1024]:
-            istream = reader(StringIO.StringIO(bytestring))
-            ostream = StringIO.StringIO()
-            while 1:
-                if sizehint is not None:
-                    data = istream.read(sizehint)
-                else:
-                    data = istream.read()
-
-                if not data:
-                    break
-                ostream.write(data)
-
-            got = ostream.getvalue()
-            self.assertEqual(got, unistring)
-
-class EscapeDecodeTest(unittest.TestCase):
-    def test_empty(self):
-        self.assertEqual(codecs.escape_decode(""), ("", 0))
-
-class RecodingTest(unittest.TestCase):
-    def test_recoding(self):
-        f = StringIO.StringIO()
-        f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
-        f2.write(u"a")
-        f2.close()
-        # Python used to crash on this at exit because of a refcount
-        # bug in _codecsmodule.c
-
-# From RFC 3492
-punycode_testcases = [
-    # A Arabic (Egyptian):
-    (u"\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644"
-     u"\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F",
-     "egbpdaj6bu4bxfgehfvwxn"),
-    # B Chinese (simplified):
-    (u"\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587",
-     "ihqwcrb4cv8a8dqg056pqjye"),
-    # C Chinese (traditional):
-    (u"\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587",
-     "ihqwctvzc91f659drss3x8bo0yb"),
-    # D Czech: Pro<ccaron>prost<ecaron>nemluv<iacute><ccaron>esky
-    (u"\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074"
-     u"\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D"
-     u"\u0065\u0073\u006B\u0079",
-     "Proprostnemluvesky-uyb24dma41a"),
-    # E Hebrew:
-    (u"\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8"
-     u"\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2"
-     u"\u05D1\u05E8\u05D9\u05EA",
-     "4dbcagdahymbxekheh6e0a7fei0b"),
-    # F Hindi (Devanagari):
-    (u"\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D"
-    u"\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939"
-    u"\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947"
-    u"\u0939\u0948\u0902",
-    "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd"),
-
-    #(G) Japanese (kanji and hiragana):
-    (u"\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092"
-    u"\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B",
-     "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa"),
-
-    # (H) Korean (Hangul syllables):
-    (u"\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774"
-     u"\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74"
-     u"\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C",
-     "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j"
-     "psd879ccm6fea98c"),
-
-    # (I) Russian (Cyrillic):
-    (u"\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E"
-     u"\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440"
-     u"\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A"
-     u"\u0438",
-     "b1abfaaepdrnnbgefbaDotcwatmq2g4l"),
-
-    # (J) Spanish: Porqu<eacute>nopuedensimplementehablarenEspa<ntilde>ol
-    (u"\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070"
-     u"\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070"
-     u"\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061"
-     u"\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070"
-     u"\u0061\u00F1\u006F\u006C",
-     "PorqunopuedensimplementehablarenEspaol-fmd56a"),
-
-    # (K) Vietnamese:
-    #  T<adotbelow>isaoh<odotbelow>kh<ocirc>ngth<ecirchookabove>ch\
-    #   <ihookabove>n<oacute>iti<ecircacute>ngVi<ecircdotbelow>t
-    (u"\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B"
-     u"\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068"
-     u"\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067"
-     u"\u0056\u0069\u1EC7\u0074",
-     "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g"),
-
-    #(L) 3<nen>B<gumi><kinpachi><sensei>
-    (u"\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F",
-     "3B-ww4c5e180e575a65lsy2b"),
-
-    # (M) <amuro><namie>-with-SUPER-MONKEYS
-    (u"\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074"
-     u"\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D"
-     u"\u004F\u004E\u004B\u0045\u0059\u0053",
-     "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n"),
-
-    # (N) Hello-Another-Way-<sorezore><no><basho>
-    (u"\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F"
-     u"\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D"
-     u"\u305D\u308C\u305E\u308C\u306E\u5834\u6240",
-     "Hello-Another-Way--fc4qua05auwb3674vfr0b"),
-
-    # (O) <hitotsu><yane><no><shita>2
-    (u"\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032",
-     "2-u9tlzr9756bt3uc0v"),
-
-    # (P) Maji<de>Koi<suru>5<byou><mae>
-    (u"\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059"
-     u"\u308B\u0035\u79D2\u524D",
-     "MajiKoi5-783gue6qz075azm5e"),
-
-     # (Q) <pafii>de<runba>
-    (u"\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0",
-     "de-jg4avhby1noc0d"),
-
-    # (R) <sono><supiido><de>
-    (u"\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067",
-     "d9juau41awczczp"),
-
-    # (S) -> $1.00 <-
-    (u"\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020"
-     u"\u003C\u002D",
-     "-> $1.00 <--")
-    ]
-
-for i in punycode_testcases:
-    if len(i)!=2:
-        print repr(i)
-
-class PunycodeTest(unittest.TestCase):
-    def test_encode(self):
-        for uni, puny in punycode_testcases:
-            # Need to convert both strings to lower case, since
-            # some of the extended encodings use upper case, but our
-            # code produces only lower case. Converting just puny to
-            # lower is also insufficient, since some of the input characters
-            # are upper case.
-            self.assertEqual(uni.encode("punycode").lower(), puny.lower())
-
-    def test_decode(self):
-        for uni, puny in punycode_testcases:
-            self.assertEqual(uni, puny.decode("punycode"))
-
-class UnicodeInternalTest(unittest.TestCase):
-    def test_bug1251300(self):
-        # Decoding with unicode_internal used to not correctly handle "code
-        # points" above 0x10ffff on UCS-4 builds.
-        if sys.maxunicode > 0xffff:
-            ok = [
-                ("\x00\x10\xff\xff", u"\U0010ffff"),
-                ("\x00\x00\x01\x01", u"\U00000101"),
-                ("", u""),
-            ]
-            not_ok = [
-                "\x7f\xff\xff\xff",
-                "\x80\x00\x00\x00",
-                "\x81\x00\x00\x00",
-                "\x00",
-                "\x00\x00\x00\x00\x00",
-            ]
-            for internal, uni in ok:
-                if sys.byteorder == "little":
-                    internal = "".join(reversed(internal))
-                self.assertEqual(uni, internal.decode("unicode_internal"))
-            for internal in not_ok:
-                if sys.byteorder == "little":
-                    internal = "".join(reversed(internal))
-                self.assertRaises(UnicodeDecodeError, internal.decode,
-                    "unicode_internal")
-
-    def test_decode_error_attributes(self):
-        if sys.maxunicode > 0xffff:
-            try:
-                "\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal")
-            except UnicodeDecodeError, ex:
-                self.assertEqual("unicode_internal", ex.encoding)
-                self.assertEqual("\x00\x00\x00\x00\x00\x11\x11\x00", ex.object)
-                self.assertEqual(4, ex.start)
-                self.assertEqual(8, ex.end)
-            else:
-                self.fail()
-
-    def test_decode_callback(self):
-        if sys.maxunicode > 0xffff:
-            codecs.register_error("UnicodeInternalTest", codecs.ignore_errors)
-            decoder = codecs.getdecoder("unicode_internal")
-            ab = u"ab".encode("unicode_internal")
-            ignored = decoder("%s\x22\x22\x22\x22%s" % (ab[:4], ab[4:]),
-                "UnicodeInternalTest")
-            self.assertEqual((u"ab", 12), ignored)
-
-    def test_encode_length(self):
-        # Issue 3739
-        encoder = codecs.getencoder("unicode_internal")
-        self.assertEqual(encoder(u"a")[1], 1)
-        self.assertEqual(encoder(u"\xe9\u0142")[1], 2)
-
-        encoder = codecs.getencoder("string-escape")
-        self.assertEqual(encoder(r'\x00')[1], 4)
-
-# From http://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html
-nameprep_tests = [
-    # 3.1 Map to nothing.
-    ('foo\xc2\xad\xcd\x8f\xe1\xa0\x86\xe1\xa0\x8bbar'
-     '\xe2\x80\x8b\xe2\x81\xa0baz\xef\xb8\x80\xef\xb8\x88\xef'
-     '\xb8\x8f\xef\xbb\xbf',
-     'foobarbaz'),
-    # 3.2 Case folding ASCII U+0043 U+0041 U+0046 U+0045.
-    ('CAFE',
-     'cafe'),
-    # 3.3 Case folding 8bit U+00DF (german sharp s).
-    # The original test case is bogus; it says \xc3\xdf
-    ('\xc3\x9f',
-     'ss'),
-    # 3.4 Case folding U+0130 (turkish capital I with dot).
-    ('\xc4\xb0',
-     'i\xcc\x87'),
-    # 3.5 Case folding multibyte U+0143 U+037A.
-    ('\xc5\x83\xcd\xba',
-     '\xc5\x84 \xce\xb9'),
-    # 3.6 Case folding U+2121 U+33C6 U+1D7BB.
-    # XXX: skip this as it fails in UCS-2 mode
-    #('\xe2\x84\xa1\xe3\x8f\x86\xf0\x9d\x9e\xbb',
-    # 'telc\xe2\x88\x95kg\xcf\x83'),
-    (None, None),
-    # 3.7 Normalization of U+006a U+030c U+00A0 U+00AA.
-    ('j\xcc\x8c\xc2\xa0\xc2\xaa',
-     '\xc7\xb0 a'),
-    # 3.8 Case folding U+1FB7 and normalization.
-    ('\xe1\xbe\xb7',
-     '\xe1\xbe\xb6\xce\xb9'),
-    # 3.9 Self-reverting case folding U+01F0 and normalization.
-    # The original test case is bogus, it says `\xc7\xf0'
-    ('\xc7\xb0',
-     '\xc7\xb0'),
-    # 3.10 Self-reverting case folding U+0390 and normalization.
-    ('\xce\x90',
-     '\xce\x90'),
-    # 3.11 Self-reverting case folding U+03B0 and normalization.
-    ('\xce\xb0',
-     '\xce\xb0'),
-    # 3.12 Self-reverting case folding U+1E96 and normalization.
-    ('\xe1\xba\x96',
-     '\xe1\xba\x96'),
-    # 3.13 Self-reverting case folding U+1F56 and normalization.
-    ('\xe1\xbd\x96',
-     '\xe1\xbd\x96'),
-    # 3.14 ASCII space character U+0020.
-    (' ',
-     ' '),
-    # 3.15 Non-ASCII 8bit space character U+00A0.
-    ('\xc2\xa0',
-     ' '),
-    # 3.16 Non-ASCII multibyte space character U+1680.
-    ('\xe1\x9a\x80',
-     None),
-    # 3.17 Non-ASCII multibyte space character U+2000.
-    ('\xe2\x80\x80',
-     ' '),
-    # 3.18 Zero Width Space U+200b.
-    ('\xe2\x80\x8b',
-     ''),
-    # 3.19 Non-ASCII multibyte space character U+3000.
-    ('\xe3\x80\x80',
-     ' '),
-    # 3.20 ASCII control characters U+0010 U+007F.
-    ('\x10\x7f',
-     '\x10\x7f'),
-    # 3.21 Non-ASCII 8bit control character U+0085.
-    ('\xc2\x85',
-     None),
-    # 3.22 Non-ASCII multibyte control character U+180E.
-    ('\xe1\xa0\x8e',
-     None),
-    # 3.23 Zero Width No-Break Space U+FEFF.
-    ('\xef\xbb\xbf',
-     ''),
-    # 3.24 Non-ASCII control character U+1D175.
-    ('\xf0\x9d\x85\xb5',
-     None),
-    # 3.25 Plane 0 private use character U+F123.
-    ('\xef\x84\xa3',
-     None),
-    # 3.26 Plane 15 private use character U+F1234.
-    ('\xf3\xb1\x88\xb4',
-     None),
-    # 3.27 Plane 16 private use character U+10F234.
-    ('\xf4\x8f\x88\xb4',
-     None),
-    # 3.28 Non-character code point U+8FFFE.
-    ('\xf2\x8f\xbf\xbe',
-     None),
-    # 3.29 Non-character code point U+10FFFF.
-    ('\xf4\x8f\xbf\xbf',
-     None),
-    # 3.30 Surrogate code U+DF42.
-    ('\xed\xbd\x82',
-     None),
-    # 3.31 Non-plain text character U+FFFD.
-    ('\xef\xbf\xbd',
-     None),
-    # 3.32 Ideographic description character U+2FF5.
-    ('\xe2\xbf\xb5',
-     None),
-    # 3.33 Display property character U+0341.
-    ('\xcd\x81',
-     '\xcc\x81'),
-    # 3.34 Left-to-right mark U+200E.
-    ('\xe2\x80\x8e',
-     None),
-    # 3.35 Deprecated U+202A.
-    ('\xe2\x80\xaa',
-     None),
-    # 3.36 Language tagging character U+E0001.
-    ('\xf3\xa0\x80\x81',
-     None),
-    # 3.37 Language tagging character U+E0042.
-    ('\xf3\xa0\x81\x82',
-     None),
-    # 3.38 Bidi: RandALCat character U+05BE and LCat characters.
-    ('foo\xd6\xbebar',
-     None),
-    # 3.39 Bidi: RandALCat character U+FD50 and LCat characters.
-    ('foo\xef\xb5\x90bar',
-     None),
-    # 3.40 Bidi: RandALCat character U+FB38 and LCat characters.
-    ('foo\xef\xb9\xb6bar',
-     'foo \xd9\x8ebar'),
-    # 3.41 Bidi: RandALCat without trailing RandALCat U+0627 U+0031.
-    ('\xd8\xa71',
-     None),
-    # 3.42 Bidi: RandALCat character U+0627 U+0031 U+0628.
-    ('\xd8\xa71\xd8\xa8',
-     '\xd8\xa71\xd8\xa8'),
-    # 3.43 Unassigned code point U+E0002.
-    # Skip this test as we allow unassigned
-    #('\xf3\xa0\x80\x82',
-    # None),
-    (None, None),
-    # 3.44 Larger test (shrinking).
-    # Original test case reads \xc3\xdf
-    ('X\xc2\xad\xc3\x9f\xc4\xb0\xe2\x84\xa1j\xcc\x8c\xc2\xa0\xc2'
-     '\xaa\xce\xb0\xe2\x80\x80',
-     'xssi\xcc\x87tel\xc7\xb0 a\xce\xb0 '),
-    # 3.45 Larger test (expanding).
-    # Original test case reads \xc3\x9f
-    ('X\xc3\x9f\xe3\x8c\x96\xc4\xb0\xe2\x84\xa1\xe2\x92\x9f\xe3\x8c'
-     '\x80',
-     'xss\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3'
-     '\x83\x88\xe3\x83\xabi\xcc\x87tel\x28d\x29\xe3\x82'
-     '\xa2\xe3\x83\x91\xe3\x83\xbc\xe3\x83\x88')
-    ]
-
-
-class NameprepTest(unittest.TestCase):
-    def test_nameprep(self):
-        from encodings.idna import nameprep
-        for pos, (orig, prepped) in enumerate(nameprep_tests):
-            if orig is None:
-                # Skipped
-                continue
-            # The Unicode strings are given in UTF-8
-            orig = unicode(orig, "utf-8")
-            if prepped is None:
-                # Input contains prohibited characters
-                self.assertRaises(UnicodeError, nameprep, orig)
-            else:
-                prepped = unicode(prepped, "utf-8")
-                try:
-                    self.assertEqual(nameprep(orig), prepped)
-                except Exception,e:
-                    raise test_support.TestFailed("Test 3.%d: %s" % (pos+1, str(e)))
-
-class IDNACodecTest(unittest.TestCase):
-    def test_builtin_decode(self):
-        self.assertEqual(unicode("python.org", "idna"), u"python.org")
-        self.assertEqual(unicode("python.org.", "idna"), u"python.org.")
-        self.assertEqual(unicode("xn--pythn-mua.org", "idna"), u"pyth\xf6n.org")
-        self.assertEqual(unicode("xn--pythn-mua.org.", "idna"), u"pyth\xf6n.org.")
-
-    def test_builtin_encode(self):
-        self.assertEqual(u"python.org".encode("idna"), "python.org")
-        self.assertEqual("python.org.".encode("idna"), "python.org.")
-        self.assertEqual(u"pyth\xf6n.org".encode("idna"), "xn--pythn-mua.org")
-        self.assertEqual(u"pyth\xf6n.org.".encode("idna"), "xn--pythn-mua.org.")
-
-    def test_stream(self):
-        import StringIO
-        r = codecs.getreader("idna")(StringIO.StringIO("abc"))
-        r.read(3)
-        self.assertEqual(r.read(), u"")
-
-    def test_incremental_decode(self):
-        self.assertEqual(
-            "".join(codecs.iterdecode("python.org", "idna")),
-            u"python.org"
-        )
-        self.assertEqual(
-            "".join(codecs.iterdecode("python.org.", "idna")),
-            u"python.org."
-        )
-        self.assertEqual(
-            "".join(codecs.iterdecode("xn--pythn-mua.org.", "idna")),
-            u"pyth\xf6n.org."
-        )
-        self.assertEqual(
-            "".join(codecs.iterdecode("xn--pythn-mua.org.", "idna")),
-            u"pyth\xf6n.org."
-        )
-
-        decoder = codecs.getincrementaldecoder("idna")()
-        self.assertEqual(decoder.decode("xn--xam", ), u"")
-        self.assertEqual(decoder.decode("ple-9ta.o", ), u"\xe4xample.")
-        self.assertEqual(decoder.decode(u"rg"), u"")
-        self.assertEqual(decoder.decode(u"", True), u"org")
-
-        decoder.reset()
-        self.assertEqual(decoder.decode("xn--xam", ), u"")
-        self.assertEqual(decoder.decode("ple-9ta.o", ), u"\xe4xample.")
-        self.assertEqual(decoder.decode("rg."), u"org.")
-        self.assertEqual(decoder.decode("", True), u"")
-
-    def test_incremental_encode(self):
-        self.assertEqual(
-            "".join(codecs.iterencode(u"python.org", "idna")),
-            "python.org"
-        )
-        self.assertEqual(
-            "".join(codecs.iterencode(u"python.org.", "idna")),
-            "python.org."
-        )
-        self.assertEqual(
-            "".join(codecs.iterencode(u"pyth\xf6n.org.", "idna")),
-            "xn--pythn-mua.org."
-        )
-        self.assertEqual(
-            "".join(codecs.iterencode(u"pyth\xf6n.org.", "idna")),
-            "xn--pythn-mua.org."
-        )
-
-        encoder = codecs.getincrementalencoder("idna")()
-        self.assertEqual(encoder.encode(u"\xe4x"), "")
-        self.assertEqual(encoder.encode(u"ample.org"), "xn--xample-9ta.")
-        self.assertEqual(encoder.encode(u"", True), "org")
-
-        encoder.reset()
-        self.assertEqual(encoder.encode(u"\xe4x"), "")
-        self.assertEqual(encoder.encode(u"ample.org."), "xn--xample-9ta.org.")
-        self.assertEqual(encoder.encode(u"", True), "")
-
-class CodecsModuleTest(unittest.TestCase):
-
-    def test_decode(self):
-        self.assertEqual(codecs.decode('\xe4\xf6\xfc', 'latin-1'),
-                          u'\xe4\xf6\xfc')
-        self.assertRaises(TypeError, codecs.decode)
-        self.assertEqual(codecs.decode('abc'), u'abc')
-        self.assertRaises(UnicodeDecodeError, codecs.decode, '\xff', 'ascii')
-
-    def test_encode(self):
-        self.assertEqual(codecs.encode(u'\xe4\xf6\xfc', 'latin-1'),
-                          '\xe4\xf6\xfc')
-        self.assertRaises(TypeError, codecs.encode)
-        self.assertRaises(LookupError, codecs.encode, "foo", "__spam__")
-        self.assertEqual(codecs.encode(u'abc'), 'abc')
-        self.assertRaises(UnicodeEncodeError, codecs.encode, u'\xffff', 'ascii')
-
-    def test_register(self):
-        self.assertRaises(TypeError, codecs.register)
-        self.assertRaises(TypeError, codecs.register, 42)
-
-    def test_lookup(self):
-        self.assertRaises(TypeError, codecs.lookup)
-        self.assertRaises(LookupError, codecs.lookup, "__spam__")
-        self.assertRaises(LookupError, codecs.lookup, " ")
-
-    def test_getencoder(self):
-        self.assertRaises(TypeError, codecs.getencoder)
-        self.assertRaises(LookupError, codecs.getencoder, "__spam__")
-
-    def test_getdecoder(self):
-        self.assertRaises(TypeError, codecs.getdecoder)
-        self.assertRaises(LookupError, codecs.getdecoder, "__spam__")
-
-    def test_getreader(self):
-        self.assertRaises(TypeError, codecs.getreader)
-        self.assertRaises(LookupError, codecs.getreader, "__spam__")
-
-    def test_getwriter(self):
-        self.assertRaises(TypeError, codecs.getwriter)
-        self.assertRaises(LookupError, codecs.getwriter, "__spam__")
-
-class StreamReaderTest(unittest.TestCase):
-
-    def setUp(self):
-        self.reader = codecs.getreader('utf-8')
-        self.stream = StringIO.StringIO('\xed\x95\x9c\n\xea\xb8\x80')
-
-    def test_readlines(self):
-        f = self.reader(self.stream)
-        self.assertEqual(f.readlines(), [u'\ud55c\n', u'\uae00'])
-
-class EncodedFileTest(unittest.TestCase):
-
-    def test_basic(self):
-        f = StringIO.StringIO('\xed\x95\x9c\n\xea\xb8\x80')
-        ef = codecs.EncodedFile(f, 'utf-16-le', 'utf-8')
-        self.assertEqual(ef.read(), '\\\xd5\n\x00\x00\xae')
-
-        f = StringIO.StringIO()
-        ef = codecs.EncodedFile(f, 'utf-8', 'latin1')
-        ef.write('\xc3\xbc')
-        self.assertEqual(f.getvalue(), '\xfc')
-
-class Str2StrTest(unittest.TestCase):
-
-    def test_read(self):
-        sin = "\x80".encode("base64_codec")
-        reader = codecs.getreader("base64_codec")(StringIO.StringIO(sin))
-        sout = reader.read()
-        self.assertEqual(sout, "\x80")
-        self.assertIsInstance(sout, str)
-
-    def test_readline(self):
-        sin = "\x80".encode("base64_codec")
-        reader = codecs.getreader("base64_codec")(StringIO.StringIO(sin))
-        sout = reader.readline()
-        self.assertEqual(sout, "\x80")
-        self.assertIsInstance(sout, str)
-
-all_unicode_encodings = [
-    "ascii",
-    "base64_codec",
-    ## "big5",
-    ## "big5hkscs",
-    "charmap",
-    "cp037",
-    "cp1006",
-    "cp1026",
-    "cp1140",
-    "cp1250",
-    "cp1251",
-    "cp1252",
-    "cp1253",
-    "cp1254",
-    "cp1255",
-    "cp1256",
-    "cp1257",
-    "cp1258",
-    "cp424",
-    "cp437",
-    "cp500",
-    "cp720",
-    "cp737",
-    "cp775",
-    "cp850",
-    "cp852",
-    "cp855",
-    "cp856",
-    "cp857",
-    "cp858",
-    "cp860",
-    "cp861",
-    "cp862",
-    "cp863",
-    "cp864",
-    "cp865",
-    "cp866",
-    "cp869",
-    "cp874",
-    "cp875",
-    ## "cp932",
-    ## "cp949",
-    ## "cp950",
-    ## "euc_jis_2004",
-    ## "euc_jisx0213",
-    ## "euc_jp",
-    ## "euc_kr",
-    ## "gb18030",
-    ## "gb2312",
-    ## "gbk",
-    "hex_codec",
-    "hp_roman8",
-    ## "hz",
-    "idna",
-    ## "iso2022_jp",
-    ## "iso2022_jp_1",
-    ## "iso2022_jp_2",
-    ## "iso2022_jp_2004",
-    ## "iso2022_jp_3",
-    ## "iso2022_jp_ext",
-    ## "iso2022_kr",
-    "iso8859_1",
-    "iso8859_10",
-    "iso8859_11",
-    "iso8859_13",
-    "iso8859_14",
-    "iso8859_15",
-    "iso8859_16",
-    "iso8859_2",
-    "iso8859_3",
-    "iso8859_4",
-    "iso8859_5",
-    "iso8859_6",
-    "iso8859_7",
-    "iso8859_8",
-    "iso8859_9",
-    ## "johab",
-    "koi8_r",
-    "koi8_u",
-    "latin_1",
-    "mac_cyrillic",
-    "mac_greek",
-    "mac_iceland",
-    "mac_latin2",
-    "mac_roman",
-    "mac_turkish",
-    "palmos",
-    "ptcp154",
-    "punycode",
-    "raw_unicode_escape",
-    "rot_13",
-    ## "shift_jis",
-    ## "shift_jis_2004",
-    ## "shift_jisx0213",
-    "tis_620",
-    "unicode_escape",
-    "unicode_internal",
-    "utf_16",
-    "utf_16_be",
-    "utf_16_le",
-    "utf_7",
-    "utf_8",
-]
-
-if hasattr(codecs, "mbcs_encode"):
-    all_unicode_encodings.append("mbcs")
-
-# The following encodings work only with str, not unicode
-all_string_encodings = [
-    "quopri_codec",
-    "string_escape",
-    "uu_codec",
-]
-
-# The following encoding is not tested, because it's not supposed
-# to work:
-#    "undefined"
-
-# The following encodings don't work in stateful mode
-broken_unicode_with_streams = [
-    "base64_codec",
-    "hex_codec",
-    "punycode",
-    "unicode_internal"
-]
-broken_incremental_coders = broken_unicode_with_streams[:]
-
-# The following encodings only support "strict" mode
-only_strict_mode = [
-    "idna",
-    "zlib_codec",
-    "bz2_codec",
-]
-
-try:
-    import bz2
-except ImportError:
-    pass
-else:
-    all_unicode_encodings.append("bz2_codec")
-    broken_unicode_with_streams.append("bz2_codec")
-
-try:
-    import zlib
-except ImportError:
-    pass
-else:
-    all_unicode_encodings.append("zlib_codec")
-    broken_unicode_with_streams.append("zlib_codec")
-
-class BasicUnicodeTest(unittest.TestCase):
-    def test_basics(self):
-        s = u"abc123" # all codecs should be able to encode these
-        for encoding in all_unicode_encodings:
-            name = codecs.lookup(encoding).name
-            if encoding.endswith("_codec"):
-                name += "_codec"
-            elif encoding == "latin_1":
-                name = "latin_1"
-            self.assertEqual(encoding.replace("_", "-"), name.replace("_", "-"))
-            (bytes, size) = codecs.getencoder(encoding)(s)
-            self.assertEqual(size, len(s), "%r != %r (encoding=%r)" % (size, len(s), encoding))
-            (chars, size) = codecs.getdecoder(encoding)(bytes)
-            self.assertEqual(chars, s, "%r != %r (encoding=%r)" % (chars, s, encoding))
-
-            if encoding not in broken_unicode_with_streams:
-                # check stream reader/writer
-                q = Queue()
-                writer = codecs.getwriter(encoding)(q)
-                encodedresult = ""
-                for c in s:
-                    writer.write(c)
-                    encodedresult += q.read()
-                q = Queue()
-                reader = codecs.getreader(encoding)(q)
-                decodedresult = u""
-                for c in encodedresult:
-                    q.write(c)
-                    decodedresult += reader.read()
-                self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
-
-            if encoding not in broken_incremental_coders:
-                # check incremental decoder/encoder (fetched via the Python
-                # and C API) and iterencode()/iterdecode()
-                try:
-                    encoder = codecs.getincrementalencoder(encoding)()
-                    cencoder = _testcapi.codec_incrementalencoder(encoding)
-                except LookupError: # no IncrementalEncoder
-                    pass
-                else:
-                    # check incremental decoder/encoder
-                    encodedresult = ""
-                    for c in s:
-                        encodedresult += encoder.encode(c)
-                    encodedresult += encoder.encode(u"", True)
-                    decoder = codecs.getincrementaldecoder(encoding)()
-                    decodedresult = u""
-                    for c in encodedresult:
-                        decodedresult += decoder.decode(c)
-                    decodedresult += decoder.decode("", True)
-                    self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
-
-                    # check C API
-                    encodedresult = ""
-                    for c in s:
-                        encodedresult += cencoder.encode(c)
-                    encodedresult += cencoder.encode(u"", True)
-                    cdecoder = _testcapi.codec_incrementaldecoder(encoding)
-                    decodedresult = u""
-                    for c in encodedresult:
-                        decodedresult += cdecoder.decode(c)
-                    decodedresult += cdecoder.decode("", True)
-                    self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
-
-                    # check iterencode()/iterdecode()
-                    result = u"".join(codecs.iterdecode(codecs.iterencode(s, encoding), encoding))
-                    self.assertEqual(result, s, "%r != %r (encoding=%r)" % (result, s, encoding))
-
-                    # check iterencode()/iterdecode() with empty string
-                    result = u"".join(codecs.iterdecode(codecs.iterencode(u"", encoding), encoding))
-                    self.assertEqual(result, u"")
-
-                if encoding not in only_strict_mode:
-                    # check incremental decoder/encoder with errors argument
-                    try:
-                        encoder = codecs.getincrementalencoder(encoding)("ignore")
-                        cencoder = _testcapi.codec_incrementalencoder(encoding, "ignore")
-                    except LookupError: # no IncrementalEncoder
-                        pass
-                    else:
-                        encodedresult = "".join(encoder.encode(c) for c in s)
-                        decoder = codecs.getincrementaldecoder(encoding)("ignore")
-                        decodedresult = u"".join(decoder.decode(c) for c in encodedresult)
-                        self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
-
-                        encodedresult = "".join(cencoder.encode(c) for c in s)
-                        cdecoder = _testcapi.codec_incrementaldecoder(encoding, "ignore")
-                        decodedresult = u"".join(cdecoder.decode(c) for c in encodedresult)
-                        self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
-
-    def test_seek(self):
-        # all codecs should be able to encode these
-        s = u"%s\n%s\n" % (100*u"abc123", 100*u"def456")
-        for encoding in all_unicode_encodings:
-            if encoding == "idna": # FIXME: See SF bug #1163178
-                continue
-            if encoding in broken_unicode_with_streams:
-                continue
-            reader = codecs.getreader(encoding)(StringIO.StringIO(s.encode(encoding)))
-            for t in xrange(5):
-                # Test that calling seek resets the internal codec state and buffers
-                reader.seek(0, 0)
-                line = reader.readline()
-                self.assertEqual(s[:len(line)], line)
-
-    def test_bad_decode_args(self):
-        for encoding in all_unicode_encodings:
-            decoder = codecs.getdecoder(encoding)
-            self.assertRaises(TypeError, decoder)
-            if encoding not in ("idna", "punycode"):
-                self.assertRaises(TypeError, decoder, 42)
-
-    def test_bad_encode_args(self):
-        for encoding in all_unicode_encodings:
-            encoder = codecs.getencoder(encoding)
-            self.assertRaises(TypeError, encoder)
-
-    def test_encoding_map_type_initialized(self):
-        from encodings import cp1140
-        # This used to crash, we are only verifying there's no crash.
-        table_type = type(cp1140.encoding_table)
-        self.assertEqual(table_type, table_type)
-
-class BasicStrTest(unittest.TestCase):
-    def test_basics(self):
-        s = "abc123"
-        for encoding in all_string_encodings:
-            (bytes, size) = codecs.getencoder(encoding)(s)
-            self.assertEqual(size, len(s))
-            (chars, size) = codecs.getdecoder(encoding)(bytes)
-            self.assertEqual(chars, s, "%r != %r (encoding=%r)" % (chars, s, encoding))
-
-class CharmapTest(unittest.TestCase):
-    def test_decode_with_string_map(self):
-        self.assertEqual(
-            codecs.charmap_decode("\x00\x01\x02", "strict", u"abc"),
-            (u"abc", 3)
-        )
-
-        self.assertEqual(
-            codecs.charmap_decode("\x00\x01\x02", "replace", u"ab"),
-            (u"ab\ufffd", 3)
-        )
-
-        self.assertEqual(
-            codecs.charmap_decode("\x00\x01\x02", "replace", u"ab\ufffe"),
-            (u"ab\ufffd", 3)
-        )
-
-        self.assertEqual(
-            codecs.charmap_decode("\x00\x01\x02", "ignore", u"ab"),
-            (u"ab", 3)
-        )
-
-        self.assertEqual(
-            codecs.charmap_decode("\x00\x01\x02", "ignore", u"ab\ufffe"),
-            (u"ab", 3)
-        )
-
-        allbytes = "".join(chr(i) for i in xrange(256))
-        self.assertEqual(
-            codecs.charmap_decode(allbytes, "ignore", u""),
-            (u"", len(allbytes))
-        )
-
-class WithStmtTest(unittest.TestCase):
-    def test_encodedfile(self):
-        f = StringIO.StringIO("\xc3\xbc")
-        with codecs.EncodedFile(f, "latin-1", "utf-8") as ef:
-            self.assertEqual(ef.read(), "\xfc")
-
-    def test_streamreaderwriter(self):
-        f = StringIO.StringIO("\xc3\xbc")
-        info = codecs.lookup("utf-8")
-        with codecs.StreamReaderWriter(f, info.streamreader,
-                                       info.streamwriter, 'strict') as srw:
-            self.assertEqual(srw.read(), u"\xfc")
-
-
-class BomTest(unittest.TestCase):
-    def test_seek0(self):
-        data = u"1234567890"
-        tests = ("utf-16",
-                 "utf-16-le",
-                 "utf-16-be",
-                 "utf-32",
-                 "utf-32-le",
-                 "utf-32-be")
-        for encoding in tests:
-            # Check if the BOM is written only once
-            with codecs.open(test_support.TESTFN, 'w+', encoding=encoding) as f:
-                f.write(data)
-                f.write(data)
-                f.seek(0)
-                self.assertEqual(f.read(), data * 2)
-                f.seek(0)
-                self.assertEqual(f.read(), data * 2)
-
-            # Check that the BOM is written after a seek(0)
-            with codecs.open(test_support.TESTFN, 'w+', encoding=encoding) as f:
-                f.write(data[0])
-                self.assertNotEqual(f.tell(), 0)
-                f.seek(0)
-                f.write(data)
-                f.seek(0)
-                self.assertEqual(f.read(), data)
-
-            # (StreamWriter) Check that the BOM is written after a seek(0)
-            with codecs.open(test_support.TESTFN, 'w+', encoding=encoding) as f:
-                f.writer.write(data[0])
-                self.assertNotEqual(f.writer.tell(), 0)
-                f.writer.seek(0)
-                f.writer.write(data)
-                f.seek(0)
-                self.assertEqual(f.read(), data)
-
-            # Check that the BOM is not written after a seek() at a position
-            # different than the start
-            with codecs.open(test_support.TESTFN, 'w+', encoding=encoding) as f:
-                f.write(data)
-                f.seek(f.tell())
-                f.write(data)
-                f.seek(0)
-                self.assertEqual(f.read(), data * 2)
-
-            # (StreamWriter) Check that the BOM is not written after a seek()
-            # at a position different than the start
-            with codecs.open(test_support.TESTFN, 'w+', encoding=encoding) as f:
-                f.writer.write(data)
-                f.writer.seek(f.writer.tell())
-                f.writer.write(data)
-                f.seek(0)
-                self.assertEqual(f.read(), data * 2)
-
-
-def test_main():
-    test_support.run_unittest(
-        UTF32Test,
-        UTF32LETest,
-        UTF32BETest,
-        UTF16Test,
-        UTF16LETest,
-        UTF16BETest,
-        UTF8Test,
-        UTF8SigTest,
-        UTF7Test,
-        UTF16ExTest,
-        ReadBufferTest,
-        CharBufferTest,
-        EscapeDecodeTest,
-        RecodingTest,
-        PunycodeTest,
-        UnicodeInternalTest,
-        NameprepTest,
-        IDNACodecTest,
-        CodecsModuleTest,
-        StreamReaderTest,
-        EncodedFileTest,
-        Str2StrTest,
-        BasicUnicodeTest,
-        BasicStrTest,
-        CharmapTest,
-        WithStmtTest,
-        BomTest,
-    )
-
-
-if __name__ == "__main__":
-    test_main()
diff --git a/lib-python/modified-2.7/test/test_ssl.py b/lib-python/modified-2.7/test/test_ssl.py
--- a/lib-python/modified-2.7/test/test_ssl.py
+++ b/lib-python/modified-2.7/test/test_ssl.py
@@ -105,7 +105,6 @@
             print "didn't raise TypeError"
         ssl.RAND_add("this is a random string", 75.0)
 
-    @test_support.impl_detail("obscure test")
     def test_parse_cert(self):
         # note that this uses an 'unofficial' function in _ssl.c,
         # provided solely for this test, to exercise the certificate
@@ -840,6 +839,8 @@
                 c = socket.socket()
                 c.connect((HOST, port))
                 listener_gone.wait()
+                # XXX why is it necessary?
+                test_support.gc_collect()
                 try:
                     ssl_sock = ssl.wrap_socket(c)
                 except IOError:
diff --git a/lib-python/2.7/uuid.py b/lib-python/modified-2.7/uuid.py
copy from lib-python/2.7/uuid.py
copy to lib-python/modified-2.7/uuid.py
--- a/lib-python/2.7/uuid.py
+++ b/lib-python/modified-2.7/uuid.py
@@ -406,8 +406,12 @@
             continue
         if hasattr(lib, 'uuid_generate_random'):
             _uuid_generate_random = lib.uuid_generate_random
+            _uuid_generate_random.argtypes = [ctypes.c_char * 16]
+            _uuid_generate_random.restype = None
         if hasattr(lib, 'uuid_generate_time'):
             _uuid_generate_time = lib.uuid_generate_time
+            _uuid_generate_time.argtypes = [ctypes.c_char * 16]
+            _uuid_generate_time.restype = None
 
     # The uuid_generate_* functions are broken on MacOS X 10.5, as noted
     # in issue #8621 the function generates the same sequence of values
@@ -436,6 +440,9 @@
         lib = None
     _UuidCreate = getattr(lib, 'UuidCreateSequential',
                           getattr(lib, 'UuidCreate', None))
+    if _UuidCreate is not None:
+        _UuidCreate.argtypes = [ctypes.c_char * 16]
+        _UuidCreate.restype = ctypes.c_int
 except:
     pass
 
diff --git a/lib_pypy/_codecs_cn.py b/lib_pypy/_codecs_cn.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_cn.py
@@ -0,0 +1,7 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#     'gb2312', 'gbk', 'gb18030', 'hz'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_codecs_hk.py b/lib_pypy/_codecs_hk.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_hk.py
@@ -0,0 +1,7 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#    'big5hkscs'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_codecs_iso2022.py b/lib_pypy/_codecs_iso2022.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_iso2022.py
@@ -0,0 +1,8 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#    'iso2022_kr', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+#    'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_codecs_jp.py b/lib_pypy/_codecs_jp.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_jp.py
@@ -0,0 +1,8 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#    'shift_jis', 'cp932', 'euc_jp', 'shift_jis_2004',
+#    'euc_jis_2004', 'euc_jisx0213', 'shift_jisx0213'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_codecs_kr.py b/lib_pypy/_codecs_kr.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_kr.py
@@ -0,0 +1,7 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#    'euc_kr', 'cp949', 'johab'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_codecs_tw.py b/lib_pypy/_codecs_tw.py
new file mode 100644
--- /dev/null
+++ b/lib_pypy/_codecs_tw.py
@@ -0,0 +1,7 @@
+# this getcodec() function supports any multibyte codec, although
+# for compatibility with CPython it should only be used for the
+# codecs from this module, i.e.:
+#
+#    'big5', 'cp950'
+
+from _multibytecodec import __getcodec as getcodec
diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -180,9 +180,17 @@
 sqlite.sqlite3_libversion.argtypes = []
 sqlite.sqlite3_libversion.restype = c_char_p
 sqlite.sqlite3_open.argtypes = [c_char_p, c_void_p]
+sqlite.sqlite3_open.restype = c_int
 sqlite.sqlite3_prepare_v2.argtypes = [c_void_p, c_char_p, c_int, c_void_p, POINTER(c_char_p)]
+sqlite.sqlite3_prepare_v2.restype = c_int
 sqlite.sqlite3_column_decltype.argtypes = [c_void_p, c_int]
 sqlite.sqlite3_column_decltype.restype = c_char_p
+sqlite.sqlite3_step.argtypes = [c_void_p]
+sqlite.sqlite3_step.restype = c_int
+sqlite.sqlite3_reset.argtypes = [c_void_p]
+sqlite.sqlite3_reset.restype = c_int
+sqlite.sqlite3_column_count.argtypes = [c_void_p]
+sqlite.sqlite3_column_count.restype = c_int
 
 sqlite.sqlite3_result_blob.argtypes = [c_void_p, c_char_p, c_int, c_void_p]
 sqlite.sqlite3_result_int64.argtypes = [c_void_p, c_int64]
@@ -491,7 +499,7 @@
                 return callback(text1, text2)
 
             c_collation_callback = COLLATION(collation_callback)
-            self._collations[name] = collation_callback
+            self._collations[name] = c_collation_callback
 
 
         ret = sqlite.sqlite3_create_collation(self.db, name,
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -33,7 +33,7 @@
      "struct", "_hashlib", "_md5", "_sha", "_minimal_curses", "cStringIO",
      "thread", "itertools", "pyexpat", "_ssl", "cpyext", "array",
      "_bisect", "binascii", "_multiprocessing", '_warnings',
-     "_collections"]
+     "_collections", "_multibytecodec"]
 ))
 
 translation_modules = default_modules.copy()
diff --git a/pypy/config/support.py b/pypy/config/support.py
--- a/pypy/config/support.py
+++ b/pypy/config/support.py
@@ -2,13 +2,15 @@
 """ Some support code
 """
 
-import re, sys, os
+import re, sys, os, subprocess
 
 def detect_number_of_processors(filename_or_file='/proc/cpuinfo'):
-    if sys.platform != 'linux2':
-        return 1    # implement me
     if os.environ.get('MAKEFLAGS'):
         return 1    # don't override MAKEFLAGS.  This will call 'make' without any '-j' option
+    if sys.platform == 'darwin':
+        return darwin_get_cpu_count()
+    elif sys.platform != 'linux2':
+        return 1    # implement me
     try:
         if isinstance(filename_or_file, str):
             f = open(filename_or_file, "r")
@@ -23,3 +25,12 @@
             return count
     except:
         return 1 # we really don't want to explode here, at worst we have 1
+
+def darwin_get_cpu_count(cmd = "/usr/sbin/sysctl hw.ncpu"):
+    try:
+        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
+        # 'hw.ncpu: 20'
+        count = proc.communicate()[0].rstrip()[8:]
+        return int(count)
+    except (OSError, ValueError):
+        return 1
diff --git a/pypy/config/test/test_support.py b/pypy/config/test/test_support.py
--- a/pypy/config/test/test_support.py
+++ b/pypy/config/test/test_support.py
@@ -1,6 +1,6 @@
 
 from cStringIO import StringIO
-from pypy.config.support import detect_number_of_processors
+from pypy.config import support
 import os, sys, py
 
 cpuinfo = """
@@ -39,15 +39,38 @@
         assert varname == 'MAKEFLAGS'
         return self._value
 
-def test_cpuinfo():
+def test_cpuinfo_linux():
     if sys.platform != 'linux2':
         py.test.skip("linux only")
     saved = os.environ
     try:
         os.environ = FakeEnviron(None)
-        assert detect_number_of_processors(StringIO(cpuinfo)) == 3
-        assert detect_number_of_processors('random crap that does not exist') == 1
+        assert support.detect_number_of_processors(StringIO(cpuinfo)) == 3
+        assert support.detect_number_of_processors('random crap that does not exist') == 1
         os.environ = FakeEnviron('-j2')
-        assert detect_number_of_processors(StringIO(cpuinfo)) == 1
+        assert support.detect_number_of_processors(StringIO(cpuinfo)) == 1
     finally:
         os.environ = saved
+
+def test_cpuinfo_darwin():
+    if sys.platform != 'darwin':
+        py.test.skip('mac only')
+    saved_func = support.darwin_get_cpu_count
+    saved = os.environ
+    def count():
+        return 42
+    try:
+        support.darwin_get_cpu_count = count
+        os.environ = FakeEnviron(None)
+        assert support.detect_number_of_processors() == 42
+        os.environ = FakeEnviron('-j2')
+        assert support.detect_number_of_processors() == 1
+    finally:
+        os.environ = saved
+        support.darwin_get_cpu_count = saved_func
+
+def test_darwin_get_cpu_count():
+    if sys.platform != 'darwin':
+        py.test.skip('mac only')
+    assert support.darwin_get_cpu_count() > 0 # hopefully
+    assert support.darwin_get_cpu_count("false") == 1
diff --git a/pypy/config/translationoption.py b/pypy/config/translationoption.py
--- a/pypy/config/translationoption.py
+++ b/pypy/config/translationoption.py
@@ -164,9 +164,6 @@
                cmdline="--cflags"),
     StrOption("linkerflags", "Specify flags for the linker (C backend only)",
                cmdline="--ldflags"),
-    BoolOption("force_make", "Force execution of makefile instead of"
-               " calling platform", cmdline="--force-make",
-               default=False, negation=False),
     IntOption("make_jobs", "Specify -j argument to make for compilation"
               " (C backend only)",
               cmdline="--make-jobs", default=detect_number_of_processors()),
diff --git a/pypy/doc/coding-guide.rst b/pypy/doc/coding-guide.rst
--- a/pypy/doc/coding-guide.rst
+++ b/pypy/doc/coding-guide.rst
@@ -560,12 +560,6 @@
 match an exception, as this will miss exceptions that are
 instances of subclasses.
 
-We are thinking about replacing ``OperationError`` with a
-family of common exception classes (e.g. ``AppKeyError``,
-``AppIndexError``...) so that we can more easily catch them.
-The generic ``AppError`` would stand for all other
-application-level classes.
-
 
 .. _`modules`:
 
diff --git a/pypy/doc/config/objspace.usemodules._multibytecodec.txt b/pypy/doc/config/objspace.usemodules._multibytecodec.txt
new file mode 100644
--- /dev/null
+++ b/pypy/doc/config/objspace.usemodules._multibytecodec.txt
@@ -0,0 +1,6 @@
+Use the '_multibytecodec' module.
+Used by the standard library to provide codecs for 'gb2312', 'gbk', 'gb18030',
+'hz', 'big5hkscs', 'iso2022_kr', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'shift_jis', 'cp932',
+'euc_jp', 'shift_jis_2004', 'euc_jis_2004', 'euc_jisx0213', 'shift_jisx0213',
+'euc_kr', 'cp949', 'johab', 'big5', 'cp950'.
diff --git a/pypy/doc/config/translation.force_make.txt b/pypy/doc/config/translation.force_make.txt
deleted file mode 100644
--- a/pypy/doc/config/translation.force_make.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-Force executing makefile instead of using platform.
diff --git a/pypy/doc/eventhistory.rst b/pypy/doc/eventhistory.rst
--- a/pypy/doc/eventhistory.rst
+++ b/pypy/doc/eventhistory.rst
@@ -267,7 +267,7 @@
 .. _`day 1`: http://codespeak.net/pipermail/pypy-dev/2005q2/002169.html
 .. _`day 2`: http://codespeak.net/pipermail/pypy-dev/2005q2/002171.html
 .. _`day 3`: http://codespeak.net/pipermail/pypy-dev/2005q2/002172.html
-.. _`pypy-dev`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`pypy-dev`: http://python.org/mailman/listinfo/pypy-dev
 
 .. _EuroPython: http://europython.org 
 .. _`translation`: translation.html 
diff --git a/pypy/doc/extradoc.rst b/pypy/doc/extradoc.rst
--- a/pypy/doc/extradoc.rst
+++ b/pypy/doc/extradoc.rst
@@ -67,7 +67,7 @@
 .. _bibtex: https://bitbucket.org/pypy/extradoc/raw/tip/talk/bibtex.bib
 .. _`Allocation Removal by Partial Evaluation in a Tracing JIT`: http://codespeak.net/svn/pypy/extradoc/talk/pepm2011/bolz-allocation-removal.pdf
 .. _`Towards a Jitting VM for Prolog Execution`: http://www.stups.uni-duesseldorf.de/publications/bolz-prolog-jit.pdf
-.. _`High performance implementation of Python for CLI/.NET with JIT compiler generation for dynamic languages`: http://codespeak.net/svn/user/antocuni/phd/thesis/thesis.pdf
+.. _`High performance implementation of Python for CLI/.NET with JIT compiler generation for dynamic languages`: http://buildbot.pypy.org/misc/antocuni-thesis.pdf
 .. _`How to *not* write Virtual Machines for Dynamic Languages`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/dyla2007/dyla.pdf
 .. _`Tracing the Meta-Level: PyPy's Tracing JIT Compiler`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009/bolz-tracing-jit.pdf
 .. _`Faster than C#: Efficient Implementation of Dynamic Languages on .NET`: https://bitbucket.org/pypy/extradoc/raw/tip/talk/icooolps2009-dotnet/cli-jit.pdf
@@ -335,7 +335,7 @@
   Microsoft's Common Language Runtime (CLR) Intermediate Language (IL).
 
 * Tunes_ is not entirely unrelated.  The web site changed a lot, but a
-  snapshot of the `old Tunes Wiki`_ is available on codespeak; browsing
+  snapshot of the `old Tunes Wiki`_ is available; browsing
   through it is a lot of fun.
 
 .. _TraceMonkey: https://wiki.mozilla.org/JavaScript:TraceMonkey
@@ -355,4 +355,4 @@
 .. _`Dynamic Native Optimization of Native Interpreters`: http://people.csail.mit.edu/gregs/dynamorio.html
 .. _JikesRVM: http://jikesrvm.org/
 .. _Tunes: http://tunes.org
-.. _`old Tunes Wiki`: http://codespeak.net/cliki.tunes.org/
+.. _`old Tunes Wiki`: http://buildbot.pypy.org/misc/cliki.tunes.org/
diff --git a/pypy/doc/faq.rst b/pypy/doc/faq.rst
--- a/pypy/doc/faq.rst
+++ b/pypy/doc/faq.rst
@@ -162,7 +162,7 @@
 discussions.
 
 .. _`contact us`: index.html
-.. _`mailing list`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`mailing list`: http://python.org/mailman/listinfo/pypy-dev
 
 -------------------------------------------------------------
 OSError: ... cannot restore segment prot after reloc... Help?
diff --git a/pypy/doc/getting-started-dev.rst b/pypy/doc/getting-started-dev.rst
--- a/pypy/doc/getting-started-dev.rst
+++ b/pypy/doc/getting-started-dev.rst
@@ -369,7 +369,7 @@
 
 .. _`full Python interpreter`: getting-started-python.html
 .. _`the blog`: http://morepypy.blogspot.com
-.. _`pypy-dev mailing list`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`pypy-dev mailing list`: http://python.org/mailman/listinfo/pypy-dev
 .. _`contact possibilities`: index.html
 
 .. _`py library`: http://pylib.org
diff --git a/pypy/doc/getting-started-python.rst b/pypy/doc/getting-started-python.rst
--- a/pypy/doc/getting-started-python.rst
+++ b/pypy/doc/getting-started-python.rst
@@ -217,23 +217,29 @@
 is "similar enough": some details of the system on which the translation
 occurred might be hard-coded in the executable.
 
-For installation purposes, note that the executable needs to be able to
-find its version of the Python standard library in the following three
-directories: ``lib-python/2.7``, ``lib-python/modified-2.7`` and
-``lib_pypy``.  They are located by "looking around" starting from the
-directory in which the executable resides.  The current logic is to try
-to find a ``PREFIX`` from which the directories
-``PREFIX/lib-python/2.7`` and ``PREFIX/lib-python/modified.2.7`` and
-``PREFIX/lib_pypy`` can all be found.  The prefixes that are tried are::
+PyPy dynamically finds the location of its libraries depending on the location
+of the executable.  The directory hierarchy of a typical PyPy installation
+looks like this::
 
-    .
-    ./lib/pypy1.5
-    ..
-    ../lib/pypy1.5
-    ../..
-    ../../lib/pypy-1.5
-    ../../..
-    etc.
+   ./bin/pypy
+   ./include/
+   ./lib_pypy/
+   ./lib-python/2.7
+   ./lib-python/modified-2.7
+   ./site-packages/
+
+The hierarchy shown above is relative to a PREFIX directory.  PREFIX is
+computed by starting from the directory where the executable resides, and
+"walking up" the filesystem until we find a directory containing ``lib_pypy``,
+``lib-python/2.7`` and ``lib-python/2.7.1``.
+
+The archives (.tar.bz2 or .zip) containing PyPy releases already contain the
+correct hierarchy, so to run PyPy it's enough to unpack the archive, and run
+the ``bin/pypy`` executable.
+
+To install PyPy system wide on unix-like systems, it is recommended to put the
+whole hierarchy alone (e.g. in ``/opt/pypy1.5``) and put a symlink to the
+``pypy`` executable into ``/usr/bin`` or ``/usr/local/bin``
 
 If the executable fails to find suitable libraries, it will report
 ``debug: WARNING: library path not found, using compiled-in sys.path``
diff --git a/pypy/doc/index-report.rst b/pypy/doc/index-report.rst
--- a/pypy/doc/index-report.rst
+++ b/pypy/doc/index-report.rst
@@ -99,7 +99,7 @@
 .. _`py-lib`: http://pylib.org/
 .. _`py.test`: http://pytest.org/
 .. _codespeak: http://codespeak.net/
-.. _`pypy-dev`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`pypy-dev`: http://python.org/mailman/listinfo/pypy-dev
 
 
 Reports of 2006
diff --git a/pypy/doc/index.rst b/pypy/doc/index.rst
--- a/pypy/doc/index.rst
+++ b/pypy/doc/index.rst
@@ -52,8 +52,6 @@
 * `Mercurial commit mailing list`_: updates to code and
   documentation. 
 
-* `Sprint mailing list`_: mailing list for organizing upcoming sprints. 
-
 * `Development bug/feature tracker`_: filing bugs and feature requests. 
 
 * **IRC channel #pypy on freenode**: Many of the core developers are hanging out 
@@ -76,9 +74,8 @@
 .. _`PyPy blog`: http://morepypy.blogspot.com/
 .. _`development bug/feature tracker`: https://codespeak.net/issue/pypy-dev/ 
 .. _here: http://tismerysoft.de/pypy/irc-logs/pypy
-.. _`sprint mailing list`: http://codespeak.net/mailman/listinfo/pypy-sprint 
-.. _`Mercurial commit mailing list`: http://codespeak.net/mailman/listinfo/pypy-svn
-.. _`development mailing list`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`Mercurial commit mailing list`: http://python.org/mailman/listinfo/pypy-commit
+.. _`development mailing list`: http://python.org/mailman/listinfo/pypy-dev
 .. _`FAQ`: faq.html
 .. _`Getting Started`: getting-started.html
 .. _`Papers`: extradoc.html
diff --git a/pypy/doc/statistic/index.rst b/pypy/doc/statistic/index.rst
--- a/pypy/doc/statistic/index.rst
+++ b/pypy/doc/statistic/index.rst
@@ -63,5 +63,5 @@
 
 .. image:: webaccess.png
 
-.. _`pypy-dev`: http://codespeak.net/mailman/listinfo/pypy-svn
-.. _`pypy-svn`: http://codespeak.net/mailman/listinfo/pypy-dev
+.. _`pypy-dev`: http://python.org/mailman/listinfo/pypy-commit
+.. _`pypy-svn`: http://python.org/mailman/listinfo/pypy-dev
diff --git a/pypy/doc/translation.rst b/pypy/doc/translation.rst
--- a/pypy/doc/translation.rst
+++ b/pypy/doc/translation.rst
@@ -684,7 +684,7 @@
 .. _`Common Language Infrastructure`: http://www.ecma-international.org/publications/standards/Ecma-335.htm
 .. _`.NET`: http://www.microsoft.com/net/
 .. _Mono: http://www.mono-project.com/
-.. _`Master's thesis`: http://codespeak.net/~antocuni/Implementing%20Python%20in%20.NET.pdf
+.. _`Master's thesis`: http://buildbot.pypy.org/misc/Implementing%20Python%20in%20.NET.pdf
 .. _GenCLI: cli-backend.html
 
 GenJVM
diff --git a/pypy/doc/video-index.rst b/pypy/doc/video-index.rst
--- a/pypy/doc/video-index.rst
+++ b/pypy/doc/video-index.rst
@@ -42,11 +42,11 @@
 Trailer: PyPy at the PyCon 2006
 -------------------------------
 
-130mb: http://wyvern.cs.uni-duesseldorf.de/torrent/pycon-trailer.avi.torrent
+130mb: http://buildbot.pypy.org/misc/torrent/pycon-trailer.avi.torrent
 
-71mb: http://wyvern.cs.uni-duesseldorf.de/torrent/pycon-trailer-medium.avi.torrent
+71mb: http://buildbot.pypy.org/misc/torrent/pycon-trailer-medium.avi.torrent
 
-50mb: http://wyvern.cs.uni-duesseldorf.de/torrent/pycon-trailer-320x240.avi.torrent
+50mb: http://buildbot.pypy.org/misc/torrent/pycon-trailer-320x240.avi.torrent
 
 .. image:: image/pycon-trailer.jpg
    :scale: 100
@@ -62,9 +62,9 @@
 Interview with Tim Peters
 -------------------------
 
-440mb: http://wyvern.cs.uni-duesseldorf.de/torrent/interview-timpeters-v2.avi.torrent
+440mb: http://buildbot.pypy.org/misc/torrent/interview-timpeters-v2.avi.torrent
 
-138mb: http://wyvern.cs.uni-duesseldorf.de/torrent/interview-timpeters-320x240.avi.torrent
+138mb: http://buildbot.pypy.org/misc/torrent/interview-timpeters-320x240.avi.torrent
 
 .. image:: image/interview-timpeters.jpg
    :scale: 100
@@ -82,9 +82,9 @@
 Interview with Bob Ippolito
 ---------------------------
 
-155mb: http://wyvern.cs.uni-duesseldorf.de/torrent/interview-bobippolito-v2.avi.torrent
+155mb: http://buildbot.pypy.org/misc/torrent/interview-bobippolito-v2.avi.torrent
 
-50mb: http://wyvern.cs.uni-duesseldorf.de/torrent/interview-bobippolito-320x240.avi.torrent
+50mb: http://buildbot.pypy.org/misc/torrent/interview-bobippolito-320x240.avi.torrent
 
 .. image:: image/interview-bobippolito.jpg
    :scale: 100
@@ -102,9 +102,9 @@
 Introductory talk on PyPy
 -------------------------
 
-430mb: http://wyvern.cs.uni-duesseldorf.de/torrent/introductory-talk-pycon-v1.avi.torrent
+430mb: http://buildbot.pypy.org/misc/torrent/introductory-talk-pycon-v1.avi.torrent
 
-166mb: http://wyvern.cs.uni-duesseldorf.de/torrent/introductory-talk-pycon-320x240.avi.torrent
+166mb: http://buildbot.pypy.org/misc/torrent/introductory-talk-pycon-320x240.avi.torrent
 
 .. image:: image/introductory-talk-pycon.jpg
    :scale: 100
@@ -125,9 +125,9 @@
 Talk on Agile Open Source Methods in the PyPy project
 -----------------------------------------------------
 
-395mb: http://wyvern.cs.uni-duesseldorf.de/torrent/agile-talk-v1.avi.torrent
+395mb: http://buildbot.pypy.org/misc/torrent/agile-talk-v1.avi.torrent
 
-153mb: http://wyvern.cs.uni-duesseldorf.de/torrent/agile-talk-320x240.avi.torrent
+153mb: http://buildbot.pypy.org/misc/torrent/agile-talk-320x240.avi.torrent
 
 .. image:: image/agile-talk.jpg
    :scale: 100
@@ -148,9 +148,9 @@
 PyPy Architecture session
 -------------------------
 
-744mb: http://wyvern.cs.uni-duesseldorf.de/torrent/architecture-session-v1.avi.torrent
+744mb: http://buildbot.pypy.org/misc/torrent/architecture-session-v1.avi.torrent
 
-288mb: http://wyvern.cs.uni-duesseldorf.de/torrent/architecture-session-320x240.avi.torrent
+288mb: http://buildbot.pypy.org/misc/torrent/architecture-session-320x240.avi.torrent
 
 .. image:: image/architecture-session.jpg
    :scale: 100
@@ -171,9 +171,9 @@
 Sprint tutorial
 ---------------
 
-680mb: http://wyvern.cs.uni-duesseldorf.de/torrent/sprint-tutorial-v2.avi.torrent
+680mb: http://buildbot.pypy.org/misc/torrent/sprint-tutorial-v2.avi.torrent
 
-263mb: http://wyvern.cs.uni-duesseldorf.de/torrent/sprint-tutorial-320x240.avi.torrent
+263mb: http://buildbot.pypy.org/misc/torrent/sprint-tutorial-320x240.avi.torrent
 
 .. image:: image/sprint-tutorial.jpg
    :scale: 100
@@ -190,9 +190,9 @@
 Scripting .NET with IronPython by Jim Hugunin
 ---------------------------------------------
 
-372mb: http://wyvern.cs.uni-duesseldorf.de/torrent/ironpython-talk-v2.avi.torrent
+372mb: http://buildbot.pypy.org/misc/torrent/ironpython-talk-v2.avi.torrent
 
-270mb: http://wyvern.cs.uni-duesseldorf.de/torrent/ironpython-talk-320x240.avi.torrent
+270mb: http://buildbot.pypy.org/misc/torrent/ironpython-talk-320x240.avi.torrent
 
 .. image:: image/ironpython.jpg
    :scale: 100
@@ -209,9 +209,9 @@
 Bram Cohen, founder and developer of BitTorrent
 -----------------------------------------------
 
-509mb: http://wyvern.cs.uni-duesseldorf.de/torrent/bram-cohen-interview-v1.avi.torrent
+509mb: http://buildbot.pypy.org/misc/torrent/bram-cohen-interview-v1.avi.torrent
 
-370mb: http://wyvern.cs.uni-duesseldorf.de/torrent/bram-cohen-interview-320x240.avi.torrent
+370mb: http://buildbot.pypy.org/misc/torrent/bram-cohen-interview-320x240.avi.torrent
 
 .. image:: image/bram.jpg
    :scale: 100
@@ -226,9 +226,9 @@
 Keynote speech by Guido van Rossum on the new Python 2.5 features
 -----------------------------------------------------------------
 
-695mb: http://wyvern.cs.uni-duesseldorf.de/torrent/keynote-speech_guido-van-rossum_v1.avi.torrent
+695mb: http://buildbot.pypy.org/misc/torrent/keynote-speech_guido-van-rossum_v1.avi.torrent
 
-430mb: http://wyvern.cs.uni-duesseldorf.de/torrent/keynote-speech_guido-van-rossum_320x240.avi.torrent
+430mb: http://buildbot.pypy.org/misc/torrent/keynote-speech_guido-van-rossum_320x240.avi.torrent
 
 .. image:: image/guido.jpg
    :scale: 100
@@ -243,11 +243,11 @@
 Trailer: PyPy sprint at the University of Palma de Mallorca
 -----------------------------------------------------------
 
-166mb: http://wyvern.cs.uni-duesseldorf.de/torrent/mallorca-trailer-v1.avi.torrent
+166mb: http://buildbot.pypy.org/misc/torrent/mallorca-trailer-v1.avi.torrent
 
-88mb: http://wyvern.cs.uni-duesseldorf.de/torrent/mallorca-trailer-medium.avi.torrent
+88mb: http://buildbot.pypy.org/misc/torrent/mallorca-trailer-medium.avi.torrent
 
-64mb: http://wyvern.cs.uni-duesseldorf.de/torrent/mallorca-trailer-320x240.avi.torrent
+64mb: http://buildbot.pypy.org/misc/torrent/mallorca-trailer-320x240.avi.torrent
 
 .. image:: image/mallorca-trailer.jpg
    :scale: 100
@@ -262,9 +262,9 @@
 Coding discussion of core developers Armin Rigo and Samuele Pedroni
 -------------------------------------------------------------------
 
-620mb: http://wyvern.cs.uni-duesseldorf.de/torrent/coding-discussion-v1.avi.torrent
+620mb: http://buildbot.pypy.org/misc/torrent/coding-discussion-v1.avi.torrent
 
-240mb: http://wyvern.cs.uni-duesseldorf.de/torrent/coding-discussion-320x240.avi.torrent
+240mb: http://buildbot.pypy.org/misc/torrent/coding-discussion-320x240.avi.torrent
 
 .. image:: image/coding-discussion.jpg
    :scale: 100
@@ -279,9 +279,9 @@
 PyPy technical talk at the University of Palma de Mallorca
 ----------------------------------------------------------
 
-865mb: http://wyvern.cs.uni-duesseldorf.de/torrent/introductory-student-talk-v2.avi.torrent
+865mb: http://buildbot.pypy.org/misc/torrent/introductory-student-talk-v2.avi.torrent
 
-437mb: http://wyvern.cs.uni-duesseldorf.de/torrent/introductory-student-talk-320x240.avi.torrent
+437mb: http://buildbot.pypy.org/misc/torrent/introductory-student-talk-320x240.avi.torrent
 
 .. image:: image/introductory-student-talk.jpg
    :scale: 100
diff --git a/pypy/interpreter/argument.py b/pypy/interpreter/argument.py
--- a/pypy/interpreter/argument.py
+++ b/pypy/interpreter/argument.py
@@ -615,33 +615,42 @@
         self.num_kwds = nkwds
 
     def getmsg(self, fnname):
-        args = None
-        #args_w, kwds_w = args.unpack()
-        nargs = self.num_args + self.num_kwds
         n = self.expected_nargs
         if n == 0:
-            msg = "%s() takes no argument (%d given)" % (
+            msg = "%s() takes no arguments (%d given)" % (
                 fnname,
-                nargs)
+                self.num_args + self.num_kwds)
         else:
             defcount = self.num_defaults
+            has_kwarg = self.has_kwarg
+            num_args = self.num_args
+            num_kwds = self.num_kwds
             if defcount == 0 and not self.has_vararg:
                 msg1 = "exactly"
+                if not has_kwarg:
+                    num_args += num_kwds
+                    num_kwds = 0
             elif not self.missing_args:
                 msg1 = "at most"
             else:
                 msg1 = "at least"
+                has_kwarg = False
                 n -= defcount
             if n == 1:
                 plural = ""
             else:
                 plural = "s"
-            msg = "%s() takes %s %d argument%s (%d given)" % (
+            if has_kwarg or num_kwds > 0:
+                msg2 = " non-keyword"
+            else:
+                msg2 = ""
+            msg = "%s() takes %s %d%s argument%s (%d given)" % (
                 fnname,
                 msg1,
                 n,
+                msg2,
                 plural,
-                nargs)
+                num_args)
         return msg
 
 class ArgErrMultipleValues(ArgErr):
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -890,8 +890,7 @@
         try:
             w_res = self.call_args(w_func, args)
         except OperationError, e:
-            w_value = e.get_w_value(self)
-            ec.c_exception_trace(frame, w_value)
+            ec.c_exception_trace(frame, w_func)
             raise
         ec.c_return_trace(frame, w_func, args)
         return w_res
diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -56,10 +56,10 @@
         frame.f_backref = self.topframeref
         self.topframeref = jit.virtual_ref(frame)
 
-    def leave(self, frame):
+    def leave(self, frame, w_exitvalue):
         try:
             if self.profilefunc:
-                self._trace(frame, 'leaveframe', self.space.w_None)
+                self._trace(frame, 'leaveframe', w_exitvalue)
         finally:
             self.topframeref = frame.f_backref
             jit.virtual_ref_finish(frame)
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -138,6 +138,7 @@
                 not self.space.config.translating)
         executioncontext = self.space.getexecutioncontext()
         executioncontext.enter(self)
+        w_exitvalue = self.space.w_None
         try:
             executioncontext.call_trace(self)
             #
@@ -166,7 +167,7 @@
             # allocating exception objects in some cases
             self.last_exception = None
         finally:
-            executioncontext.leave(self)
+            executioncontext.leave(self, w_exitvalue)
         return w_exitvalue
     execute_frame.insert_stack_check_here = True
 
diff --git a/pypy/interpreter/test/test_argument.py b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -512,25 +512,34 @@
         # defaults_w, missing_args
         err = ArgErrCount(1, 0, 0, False, False, None, 0)
         s = err.getmsg('foo')
-        assert s == "foo() takes no argument (1 given)"
+        assert s == "foo() takes no arguments (1 given)"
         err = ArgErrCount(0, 0, 1, False, False, [], 1)
         s = err.getmsg('foo')
         assert s == "foo() takes exactly 1 argument (0 given)"
         err = ArgErrCount(3, 0, 2, False, False, [], 0)
         s = err.getmsg('foo')
         assert s == "foo() takes exactly 2 arguments (3 given)"
+        err = ArgErrCount(3, 0, 2, False, False, ['a'], 0)
+        s = err.getmsg('foo')
+        assert s == "foo() takes at most 2 arguments (3 given)"
         err = ArgErrCount(1, 0, 2, True, False, [], 1)
         s = err.getmsg('foo')
         assert s == "foo() takes at least 2 arguments (1 given)"
-        err = ArgErrCount(3, 0, 2, True, False, ['a'], 0)
-        s = err.getmsg('foo')
-        assert s == "foo() takes at most 2 arguments (3 given)"
         err = ArgErrCount(0, 1, 2, True, False, ['a'], 1)
         s = err.getmsg('foo')
-        assert s == "foo() takes at least 1 argument (1 given)"
+        assert s == "foo() takes at least 1 non-keyword argument (0 given)"
         err = ArgErrCount(2, 1, 1, False, True, [], 0)
         s = err.getmsg('foo')
-        assert s == "foo() takes exactly 1 argument (3 given)"
+        assert s == "foo() takes exactly 1 non-keyword argument (2 given)"
+        err = ArgErrCount(0, 1, 1, False, True, [], 1)
+        s = err.getmsg('foo')
+        assert s == "foo() takes exactly 1 non-keyword argument (0 given)"
+        err = ArgErrCount(0, 1, 1, True, True, [], 1)
+        s = err.getmsg('foo')
+        assert s == "foo() takes at least 1 non-keyword argument (0 given)"
+        err = ArgErrCount(2, 1, 1, False, True, ['a'], 0)
+        s = err.getmsg('foo')
+        assert s == "foo() takes at most 1 non-keyword argument (2 given)"
 
     def test_bad_type_for_star(self):
         space = self.space
@@ -565,15 +574,23 @@
 class AppTestArgument:
     def test_error_message(self):
         exc = raises(TypeError, (lambda a, b=2: 0), b=3)
-        assert exc.value.message == "<lambda>() takes at least 1 argument (1 given)"
+        assert exc.value.message == "<lambda>() takes at least 1 non-keyword argument (0 given)"
         exc = raises(TypeError, (lambda: 0), b=3)
-        assert exc.value.message == "<lambda>() takes no argument (1 given)"
+        assert exc.value.message == "<lambda>() takes no arguments (1 given)"
         exc = raises(TypeError, (lambda a, b: 0), 1, 2, 3, a=1)
         assert exc.value.message == "<lambda>() takes exactly 2 arguments (4 given)"
         exc = raises(TypeError, (lambda a, b=1: 0), 1, 2, 3, a=1)
-        assert exc.value.message == "<lambda>() takes at most 2 arguments (4 given)"
+        assert exc.value.message == "<lambda>() takes at most 2 non-keyword arguments (3 given)"
         exc = raises(TypeError, (lambda a, b=1, **kw: 0), 1, 2, 3)
-        assert exc.value.message == "<lambda>() takes at most 2 arguments (3 given)"
+        assert exc.value.message == "<lambda>() takes at most 2 non-keyword arguments (3 given)"
+        exc = raises(TypeError, (lambda a, b, c=3, **kw: 0), 1)
+        assert exc.value.message == "<lambda>() takes at least 2 arguments (1 given)"
+        exc = raises(TypeError, (lambda a, b, **kw: 0), 1)
+        assert exc.value.message == "<lambda>() takes exactly 2 non-keyword arguments (1 given)"
+        exc = raises(TypeError, (lambda a, b, c=3, **kw: 0), a=1)
+        assert exc.value.message == "<lambda>() takes at least 2 non-keyword arguments (0 given)"
+        exc = raises(TypeError, (lambda a, b, **kw: 0), a=1)
+        assert exc.value.message == "<lambda>() takes exactly 2 non-keyword arguments (0 given)"
 
 def make_arguments_for_translation(space, args_w, keywords_w={},
                                    w_stararg=None, w_starstararg=None):
diff --git a/pypy/interpreter/test/test_executioncontext.py b/pypy/interpreter/test/test_executioncontext.py
--- a/pypy/interpreter/test/test_executioncontext.py
+++ b/pypy/interpreter/test/test_executioncontext.py
@@ -324,3 +324,70 @@
         g.close()
         assert 'Called 1' in data
         assert 'Called 2' in data
+
+
+class AppTestProfile:
+
+    def test_return(self):
+        import sys
+        l = []
+        def profile(frame, event, arg):
+            l.append((event, arg))
+
+        def bar(x):
+            return 40 + x
+
+        sys.setprofile(profile)
+        bar(2)
+        sys.setprofile(None)
+        assert l == [('call', None),
+                     ('return', 42),
+                     ('c_call', sys.setprofile)], repr(l)
+
+    def test_c_return(self):
+        import sys
+        l = []
+        def profile(frame, event, arg):
+            l.append((event, arg))
+
+        sys.setprofile(profile)
+        max(2, 42)
+        sys.setprofile(None)
+        assert l == [('c_call', max),
+                     ('c_return', max),
+                     ('c_call', sys.setprofile)], repr(l)
+
+    def test_exception(self):
+        import sys
+        l = []
+        def profile(frame, event, arg):
+            l.append((event, arg))
+
+        def f():
+            raise ValueError("foo")
+
+        sys.setprofile(profile)
+        try:
+            f()
+        except ValueError:
+            pass
+        sys.setprofile(None)
+        assert l == [('call', None),
+                     ('return', None),
+                     ('c_call', sys.setprofile)], repr(l)
+
+    def test_c_exception(self):
+        import sys
+        l = []
+        def profile(frame, event, arg):
+            l.append((event, arg))
+
+        sys.setprofile(profile)
+        try:
+            divmod(5, 0)
+        except ZeroDivisionError:
+            pass
+        sys.setprofile(None)
+        assert l == [('c_call', divmod),
+                     ('c_exception', divmod),
+                     ('c_call', sys.setprofile)], repr(l)
diff --git a/pypy/interpreter/test/test_function.py b/pypy/interpreter/test/test_function.py
--- a/pypy/interpreter/test/test_function.py
+++ b/pypy/interpreter/test/test_function.py
@@ -98,6 +98,14 @@
             raises(TypeError, "dir.func_code = f.func_code")
             raises(TypeError, "list.append.im_func.func_code = f.func_code")
 
+    def test_set_module_to_name_eagerly(self):
+        skip("fails on PyPy but works on CPython.  Unsure we want to care")
+        exec '''if 1:
+            __name__ = "foo"
+            def f(): pass
+            __name__ = "bar"
+            assert f.__module__ == "foo"''' in {}
+
 
 class AppTestFunction:
     def test_simple_call(self):
diff --git a/pypy/jit/backend/arm/test/test_gc_integration.py b/pypy/jit/backend/arm/test/test_gc_integration.py
--- a/pypy/jit/backend/arm/test/test_gc_integration.py
+++ b/pypy/jit/backend/arm/test/test_gc_integration.py
@@ -69,6 +69,7 @@
         self.gcrefs.initialize()
         self.single_gcref_descr = GcPtrFieldDescr('', 0)
         
+    replace_constptrs_with_getfield_raw = GcLLDescr_framework.replace_constptrs_with_getfield_raw.im_func
     rewrite_assembler = GcLLDescr_framework.rewrite_assembler.im_func
 
 class TestRegallocDirectGcIntegration(object):
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -35,7 +35,7 @@
     def do_write_barrier(self, gcref_struct, gcref_newptr):
         pass
     def rewrite_assembler(self, cpu, operations):
-        pass
+        return operations
     def can_inline_malloc(self, descr):
         return False
     def can_inline_malloc_varsize(self, descr, num_elem):
@@ -772,6 +772,31 @@
             funcptr(llmemory.cast_ptr_to_adr(gcref_struct),
                     llmemory.cast_ptr_to_adr(gcref_newptr))
 
+    def replace_constptrs_with_getfield_raw(self, cpu, newops, op):
+        # xxx some performance issue here
+        newargs = [None] * op.numargs()
+        needs_copy = False
+        for i in range(op.numargs()):
+            v = op.getarg(i)
+            newargs[i] = v
+            if isinstance(v, ConstPtr) and bool(v.value):
+                addr = self.gcrefs.get_address_of_gcref(v.value)
+                # ^^^even for non-movable objects, to record their presence
+                if rgc.can_move(v.value):
+                    box = BoxPtr(v.value)
+                    addr = cpu.cast_adr_to_int(addr)
+                    newops.append(ResOperation(rop.GETFIELD_RAW,
+                                               [ConstInt(addr)], box,
+                                               self.single_gcref_descr))
+                    newargs[i] = box
+                    needs_copy = True
+        #
+        if needs_copy:
+            return op.copy_and_change(op.getopnum(), args=newargs)
+        else:
+            return op
+
+
     def rewrite_assembler(self, cpu, operations):
         # Perform two kinds of rewrites in parallel:
         #
@@ -794,19 +819,7 @@
             if op.getopnum() == rop.DEBUG_MERGE_POINT:
                 continue
             # ---------- replace ConstPtrs with GETFIELD_RAW ----------
-            # xxx some performance issue here
-            for i in range(op.numargs()):
-                v = op.getarg(i)
-                if isinstance(v, ConstPtr) and bool(v.value):
-                    addr = self.gcrefs.get_address_of_gcref(v.value)
-                    # ^^^even for non-movable objects, to record their presence
-                    if rgc.can_move(v.value):
-                        box = BoxPtr(v.value)
-                        addr = cpu.cast_adr_to_int(addr)
-                        newops.append(ResOperation(rop.GETFIELD_RAW,
-                                                   [ConstInt(addr)], box,
-                                                   self.single_gcref_descr))
-                        op.setarg(i, box)
+            op = self.replace_constptrs_with_getfield_raw(cpu, newops, op)
             if op.is_malloc():
                 last_malloc = op.result
             elif op.can_malloc():
@@ -835,8 +848,7 @@
                         op = op.copy_and_change(rop.SETARRAYITEM_RAW)
             # ----------
             newops.append(op)
-        del operations[:]
-        operations.extend(newops)
+        return newops
 
     def _gen_write_barrier(self, newops, v_base, v_value):
         args = [v_base, v_value]
diff --git a/pypy/jit/backend/llsupport/test/test_gc.py b/pypy/jit/backend/llsupport/test/test_gc.py
--- a/pypy/jit/backend/llsupport/test/test_gc.py
+++ b/pypy/jit/backend/llsupport/test/test_gc.py
@@ -6,6 +6,7 @@
 from pypy.jit.backend.llsupport.gc import *
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.metainterp.gc import get_description
+from pypy.jit.metainterp.resoperation import get_deep_immutable_oplist
 from pypy.jit.tool.oparser import parse
 from pypy.rpython.lltypesystem.rclass import OBJECT, OBJECT_VTABLE
 from pypy.jit.metainterp.test.test_optimizeopt import equaloplists
@@ -413,7 +414,7 @@
             ResOperation(rop.DEBUG_MERGE_POINT, ['dummy', 2], None),
             ]
         gc_ll_descr = self.gc_ll_descr
-        gc_ll_descr.rewrite_assembler(None, operations)
+        operations = gc_ll_descr.rewrite_assembler(None, operations)
         assert len(operations) == 0
 
     def test_rewrite_assembler_1(self):
@@ -437,7 +438,8 @@
             ]
         gc_ll_descr = self.gc_ll_descr
         gc_ll_descr.gcrefs = MyFakeGCRefList()
-        gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
+        operations = get_deep_immutable_oplist(operations)
+        operations = gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
         assert len(operations) == 2
         assert operations[0].getopnum() == rop.GETFIELD_RAW
         assert operations[0].getarg(0) == ConstInt(43)
@@ -472,9 +474,10 @@
         gc_ll_descr = self.gc_ll_descr
         gc_ll_descr.gcrefs = MyFakeGCRefList()
         old_can_move = rgc.can_move
+        operations = get_deep_immutable_oplist(operations)
         try:
             rgc.can_move = lambda s: False
-            gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
+            operations = gc_ll_descr.rewrite_assembler(MyFakeCPU(), operations)
         finally:
             rgc.can_move = old_can_move
         assert len(operations) == 1
@@ -496,7 +499,8 @@
                          descr=field_descr),
             ]
         gc_ll_descr = self.gc_ll_descr
-        gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
+        operations = get_deep_immutable_oplist(operations)
+        operations = gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
         assert len(operations) == 2
         #
         assert operations[0].getopnum() == rop.COND_CALL_GC_WB
@@ -520,7 +524,8 @@
                          descr=array_descr),
             ]
         gc_ll_descr = self.gc_ll_descr
-        gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
+        operations = get_deep_immutable_oplist(operations)
+        operations = gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
         assert len(operations) == 2
         #
         assert operations[0].getopnum() == rop.COND_CALL_GC_WB
@@ -552,8 +557,9 @@
         setfield_gc(p0, p1, descr=xdescr)
         jump()
         """, namespace=locals())
-        self.gc_ll_descr.rewrite_assembler(self.fake_cpu, ops.operations)
-        equaloplists(ops.operations, expected.operations)
+        operations = get_deep_immutable_oplist(ops.operations)
+        operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
+        equaloplists(operations, expected.operations)
 
     def test_rewrite_assembler_initialization_store_2(self):
         S = lltype.GcStruct('S', ('parent', OBJECT),
@@ -576,8 +582,9 @@
         setfield_raw(p0, p1, descr=xdescr)
         jump()
         """, namespace=locals())
-        self.gc_ll_descr.rewrite_assembler(self.fake_cpu, ops.operations)
-        equaloplists(ops.operations, expected.operations)
+        operations = get_deep_immutable_oplist(ops.operations)
+        operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
+        equaloplists(operations, expected.operations)
 
     def test_rewrite_assembler_initialization_store_3(self):
         A = lltype.GcArray(lltype.Ptr(lltype.GcStruct('S')))
@@ -594,8 +601,9 @@
         setarrayitem_gc(p0, 0, p1, descr=arraydescr)
         jump()
         """, namespace=locals())
-        self.gc_ll_descr.rewrite_assembler(self.fake_cpu, ops.operations)
-        equaloplists(ops.operations, expected.operations)
+        operations = get_deep_immutable_oplist(ops.operations)
+        operations = self.gc_ll_descr.rewrite_assembler(self.fake_cpu, operations)
+        equaloplists(operations, expected.operations)
 
 class TestFrameworkMiniMark(TestFramework):
     gc = 'minimark'
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -58,12 +58,19 @@
         """Called once by the front-end when the program stops."""
         pass
 
-
     def compile_loop(self, inputargs, operations, looptoken, log=True):
         """Assemble the given loop.
         Should create and attach a fresh CompiledLoopToken to
         looptoken.compiled_loop_token and stick extra attributes
         on it to point to the compiled loop in assembler.
+
+        Optionally, return a ``ops_offset`` dictionary, which maps each operation
+        to its offset in the compiled code.  The ``ops_offset`` dictionary is then
+        used by the operation logger to print the offsets in the log.  The
+        offset representing the end of the last operation is stored in
+        ``ops_offset[None]``: note that this might not coincide with the end of
+        the loop, because usually in the loop footer there is code which does
+        not belong to any particular operation.
         """
         raise NotImplementedError
 
@@ -71,9 +78,16 @@
                        original_loop_token, log=True):
         """Assemble the bridge.
         The FailDescr is the descr of the original guard that failed.
+
+        Optionally, return a ``ops_offset`` dictionary.  See the docstring of
+        ``compiled_loop`` for more informations about it.
         """
         raise NotImplementedError
 
+    def dump_loop_token(self, looptoken):
+        """Print a disassembled version of looptoken to stdout"""
+        raise NotImplementedError
+
     def execute_token(self, looptoken):
         """Execute the generated code referenced by the looptoken.
         Returns the descr of the last executed operation: either the one
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -189,6 +189,8 @@
         wr_i1 = weakref.ref(i1)
         wr_guard = weakref.ref(operations[2])
         self.cpu.compile_loop(inputargs, operations, looptoken)
+        if hasattr(looptoken, '_x86_ops_offset'):
+            del looptoken._x86_ops_offset # else it's kept alive
         del i0, i1, i2
         del inputargs
         del operations
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -334,7 +334,7 @@
             operations = self._inject_debugging_code(looptoken, operations)
 
         regalloc = RegAlloc(self, self.cpu.translate_support_code)
-        arglocs = regalloc.prepare_loop(inputargs, operations, looptoken)
+        arglocs, operations = regalloc.prepare_loop(inputargs, operations, looptoken)
         looptoken._x86_arglocs = arglocs
 
         bootstrappos = self.mc.get_relative_pos()
@@ -361,6 +361,13 @@
                                 frame_depth + param_depth)
         self.patch_pending_failure_recoveries(rawstart)
         #
+        ops_offset = self.mc.ops_offset
+        if not we_are_translated():
+            # used only by looptoken.dump() -- useful in tests
+            looptoken._x86_rawstart = rawstart
+            looptoken._x86_fullsize = fullsize
+            looptoken._x86_ops_offset = ops_offset
+
         looptoken._x86_bootstrap_code = rawstart + bootstrappos
         looptoken._x86_loop_code = rawstart + self.looppos
         looptoken._x86_direct_bootstrap_code = rawstart + directbootstrappos
@@ -370,6 +377,7 @@
             name = "Loop # %s: %s" % (looptoken.number, funcname)
             self.cpu.profile_agent.native_code_written(name,
                                                        rawstart, fullsize)
+        return ops_offset
 
     def assemble_bridge(self, faildescr, inputargs, operations,
                         original_loop_token, log):
@@ -397,8 +405,8 @@
                     [loc.assembler() for loc in faildescr._x86_debug_faillocs])
         regalloc = RegAlloc(self, self.cpu.translate_support_code)
         fail_depths = faildescr._x86_current_depths
-        regalloc.prepare_bridge(fail_depths, inputargs, arglocs,
-                                operations)
+        operations = regalloc.prepare_bridge(fail_depths, inputargs, arglocs,
+                                             operations)
 
         stackadjustpos = self._patchable_stackadjust()
         frame_depth, param_depth = self._assemble(regalloc, operations)
@@ -419,12 +427,14 @@
             faildescr._x86_bridge_param_depth = param_depth
         # patch the jump from original guard
         self.patch_jump_for_descr(faildescr, rawstart)
+        ops_offset = self.mc.ops_offset
         self.teardown()
         # oprofile support
         if self.cpu.profile_agent is not None:
             name = "Bridge # %s: %s" % (descr_number, funcname)
             self.cpu.profile_agent.native_code_written(name,
                                                        rawstart, fullsize)
+        return ops_offset
 
     def write_pending_failure_recoveries(self):
         # for each pending guard, generate the code of the recovery stub
diff --git a/pypy/jit/backend/x86/codebuf.py b/pypy/jit/backend/x86/codebuf.py
--- a/pypy/jit/backend/x86/codebuf.py
+++ b/pypy/jit/backend/x86/codebuf.py
@@ -1,5 +1,7 @@
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rlib.rarithmetic import intmask
+from pypy.rlib.debug import debug_start, debug_print, debug_stop
+from pypy.rlib.debug import have_debug_prints
 from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
 from pypy.jit.backend.x86.rx86 import X86_32_CodeBuilder, X86_64_CodeBuilder
 from pypy.jit.backend.x86.regloc import LocationCodeBuilder
@@ -25,10 +27,19 @@
         # at [p-4:p] encode an absolute address that will need to be
         # made relative.
         self.relocations = []
+        #
+        # ResOperation --> offset in the assembly.
+        # ops_offset[None] represents the beginning of the code after the last op
+        # (i.e., the tail of the loop)
+        self.ops_offset = {}
 
     def add_pending_relocation(self):
         self.relocations.append(self.get_relative_pos())
 
+    def mark_op(self, op):
+        pos = self.get_relative_pos()
+        self.ops_offset[op] = pos
+
     def copy_to_raw_memory(self, addr):
         self._copy_to_raw_memory(addr)
         for reloc in self.relocations:
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -161,7 +161,7 @@
         self.fm = X86FrameManager()
         self.param_depth = 0
         cpu = self.assembler.cpu
-        cpu.gc_ll_descr.rewrite_assembler(cpu, operations)
+        operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations)
         # compute longevity of variables
         longevity = compute_vars_longevity(inputargs, operations)
         self.longevity = longevity
@@ -170,20 +170,22 @@
                                   assembler = self.assembler)
         self.xrm = xmm_reg_mgr_cls(longevity, frame_manager = self.fm,
                                    assembler = self.assembler)
+        return operations
 
     def prepare_loop(self, inputargs, operations, looptoken):
-        self._prepare(inputargs, operations)
+        operations = self._prepare(inputargs, operations)
         jump = operations[-1]
         loop_consts = compute_loop_consts(inputargs, jump, looptoken)
         self.loop_consts = loop_consts
-        return self._process_inputargs(inputargs)
+        return self._process_inputargs(inputargs), operations
 
     def prepare_bridge(self, prev_depths, inputargs, arglocs, operations):
-        self._prepare(inputargs, operations)
+        operations = self._prepare(inputargs, operations)
         self.loop_consts = {}
         self._update_bindings(arglocs, inputargs)
         self.fm.frame_depth = prev_depths[0]
         self.param_depth = prev_depths[1]
+        return operations
 
     def reserve_param(self, n):
         self.param_depth = max(self.param_depth, n)
@@ -402,6 +404,7 @@
         #self.operations = operations
         while i < len(operations):
             op = operations[i]
+            self.assembler.mc.mark_op(op)
             self.rm.position = i
             self.xrm.position = i
             if op.has_no_side_effect() and op.result not in self.longevity:
@@ -422,6 +425,7 @@
             i += 1
         assert not self.rm.reg_bindings
         assert not self.xrm.reg_bindings
+        self.assembler.mc.mark_op(None) # end of the loop
 
 
     def loc(self, v):
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -60,16 +60,33 @@
         self.assembler.finish_once()
         self.profile_agent.shutdown()
 
+    def dump_loop_token(self, looptoken):
+        """
+        NOT_RPYTHON
+        """
+        from pypy.jit.backend.x86.tool.viewcode import machine_code_dump
+        data = []
+        label_list = [(offset, name) for name, offset in
+                      looptoken._x86_ops_offset.iteritems()]
+        label_list.sort()
+        addr = looptoken._x86_rawstart
+        src = rffi.cast(rffi.CCHARP, addr)
+        for p in range(looptoken._x86_fullsize):
+            data.append(src[p])
+        data = ''.join(data)
+        lines = machine_code_dump(data, addr, self.backend_name, label_list)
+        print ''.join(lines)
+
     def compile_loop(self, inputargs, operations, looptoken, log=True):
-        self.assembler.assemble_loop(inputargs, operations, looptoken,
-                                     log=log)
+        return self.assembler.assemble_loop(inputargs, operations, looptoken,
+                                            log=log)
 
     def compile_bridge(self, faildescr, inputargs, operations,
                        original_loop_token, log=True):
         clt = original_loop_token.compiled_loop_token
         clt.compiling_a_bridge()
-        self.assembler.assemble_bridge(faildescr, inputargs, operations,
-                                       original_loop_token, log=log)
+        return self.assembler.assemble_bridge(faildescr, inputargs, operations,
+                                              original_loop_token, log=log)
 
     def set_future_value_int(self, index, intvalue):
         self.assembler.fail_boxes_int.setitem(index, intvalue)
@@ -164,7 +181,9 @@
         # positions invalidated
         looptoken.compiled_loop_token.invalidate_positions = []
 
+
 class CPU386(AbstractX86CPU):
+    backend_name = 'x86'
     WORD = 4
     NUM_REGS = 8
     CALLEE_SAVE_REGISTERS = [regloc.ebx, regloc.esi, regloc.edi]
@@ -180,6 +199,7 @@
     supports_longlong = False
 
 class CPU_X86_64(AbstractX86CPU):
+    backend_name = 'x86_64'
     WORD = 8
     NUM_REGS = 16
     CALLEE_SAVE_REGISTERS = [regloc.ebx, regloc.r12, regloc.r13, regloc.r14, regloc.r15]
diff --git a/pypy/jit/backend/x86/test/test_gc_integration.py b/pypy/jit/backend/x86/test/test_gc_integration.py
--- a/pypy/jit/backend/x86/test/test_gc_integration.py
+++ b/pypy/jit/backend/x86/test/test_gc_integration.py
@@ -54,7 +54,8 @@
         self.gcrefs = GcRefList()
         self.gcrefs.initialize()
         self.single_gcref_descr = GcPtrFieldDescr('', 0)
-        
+
+    replace_constptrs_with_getfield_raw = GcLLDescr_framework.replace_constptrs_with_getfield_raw.im_func
     rewrite_assembler = GcLLDescr_framework.rewrite_assembler.im_func
 
 class TestRegallocDirectGcIntegration(object):
diff --git a/pypy/jit/backend/x86/test/test_runner.py b/pypy/jit/backend/x86/test/test_runner.py
--- a/pypy/jit/backend/x86/test/test_runner.py
+++ b/pypy/jit/backend/x86/test/test_runner.py
@@ -390,6 +390,29 @@
         res = self.cpu.get_latest_value_int(0)
         assert res == 20
 
+    def test_ops_offset(self):
+        from pypy.rlib import debug
+        i0 = BoxInt()
+        i1 = BoxInt()
+        i2 = BoxInt()
+        looptoken = LoopToken()
+        operations = [
+            ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
+            ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
+            ResOperation(rop.JUMP, [i1], None, descr=looptoken),
+            ]
+        inputargs = [i0]
+        debug._log = dlog = debug.DebugLog()
+        ops_offset = self.cpu.compile_loop(inputargs, operations, looptoken)
+        debug._log = None
+        #
+        assert ops_offset is looptoken._x86_ops_offset
+        # getfield_raw/int_add/setfield_raw + ops + None
+        assert len(ops_offset) == 3 + len(operations) + 1
+        assert (ops_offset[operations[0]] <=
+                ops_offset[operations[1]] <=
+                ops_offset[operations[2]] <=
+                ops_offset[None])
 
 class TestDebuggingAssembler(object):
     def setup_method(self, meth):
diff --git a/pypy/jit/backend/x86/tool/__init__.py b/pypy/jit/backend/x86/tool/__init__.py
new file mode 100644
diff --git a/pypy/jit/backend/x86/tool/test/test_viewcode.py b/pypy/jit/backend/x86/tool/test/test_viewcode.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/backend/x86/tool/test/test_viewcode.py
@@ -0,0 +1,55 @@
+from cStringIO import StringIO
+from pypy.jit.backend.x86.tool.viewcode import format_code_dump_with_labels
+
+def test_format_code_dump_with_labels():
+    lines = StringIO("""
+aa00 <.data>:
+aa00: one
+aa01: two
+aa03: three
+aa04: for
+aa05: five
+aa06: six
+aa0c: seven
+aa12: eight
+""".strip()).readlines()
+    #
+    label_list = [(0x00, 'AAA'), (0x03, 'BBB'), (0x0c, 'CCC')]
+    lines = format_code_dump_with_labels(0xAA00, lines, label_list)
+    out = ''.join(lines)
+    assert out == """
+aa00 <.data>:
+
+AAA
+aa00: one
+aa01: two
+
+BBB
+aa03: three
+aa04: for
+aa05: five
+aa06: six
+
+CCC
+aa0c: seven
+aa12: eight
+""".strip()
+
+
+def test_format_code_dump_with_labels_no_labels():
+    input = """
+aa00 <.data>:
+aa00: one
+aa01: two
+aa03: three
+aa04: for
+aa05: five
+aa06: six
+aa0c: seven
+aa12: eight
+""".strip()
+    lines = StringIO(input).readlines()
+    #
+    lines = format_code_dump_with_labels(0xAA00, lines, label_list=None)
+    out = ''.join(lines)
+    assert out.strip() == input
diff --git a/pypy/jit/backend/x86/tool/viewcode.py b/pypy/jit/backend/x86/tool/viewcode.py
--- a/pypy/jit/backend/x86/tool/viewcode.py
+++ b/pypy/jit/backend/x86/tool/viewcode.py
@@ -31,13 +31,14 @@
 if sys.platform == "win32":
     XXX   # lots more in Psyco
 
-def machine_code_dump(data, originaddr, backend_name):
+def machine_code_dump(data, originaddr, backend_name, label_list=None):
     objdump_backend_option = {
         'x86': 'i386',
         'x86_64': 'x86-64',
         'i386': 'i386',
     }
     objdump = ('objdump -M %(backend)s -b binary -m i386 '
+               '--disassembler-options=intel-mnemonics '
                '--adjust-vma=%(origin)d -D %(file)s')
     #
     f = open(tmpfile, 'wb')
@@ -50,7 +51,32 @@
     }, 'r')
     result = g.readlines()
     g.close()
-    return result[6:]   # drop some objdump cruft
+    lines = result[6:]   # drop some objdump cruft
+    return format_code_dump_with_labels(originaddr, lines, label_list)
+
+def format_code_dump_with_labels(originaddr, lines, label_list):
+    from pypy.rlib.rarithmetic import r_uint
+    if not label_list:
+        label_list = []
+    originaddr = r_uint(originaddr)
+    itlines = iter(lines)
+    yield itlines.next() # don't process the first line
+    for lbl_start, lbl_name in label_list:
+        for line in itlines:
+            addr, _ = line.split(':', 1)
+            addr = int(addr, 16)
+            if addr >= originaddr+lbl_start:
+                yield '\n'
+                if lbl_name is None:
+                    yield '--end of the loop--\n'
+                else:
+                    yield str(lbl_name) + '\n'
+                yield line
+                break
+            yield line
+    # yield all the remaining lines
+    for line in itlines:
+        yield line
 
 def load_symbols(filename):
     # the program that lists symbols, and the output it gives
@@ -134,6 +160,7 @@
     def disassemble(self):
         if not hasattr(self, 'text'):
             lines = machine_code_dump(self.data, self.addr, self.world.backend_name)
+            lines = list(lines)
             # instead of adding symbol names in the dumps we could
             # also make the 0xNNNNNNNN addresses be red and show the
             # symbol name when the mouse is over them
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -7,7 +7,7 @@
 from pypy.conftest import option
 from pypy.tool.sourcetools import func_with_new_name
 
-from pypy.jit.metainterp.resoperation import ResOperation, rop
+from pypy.jit.metainterp.resoperation import ResOperation, rop, get_deep_immutable_oplist
 from pypy.jit.metainterp.history import TreeLoop, Box, History, LoopToken
 from pypy.jit.metainterp.history import AbstractFailDescr, BoxInt
 from pypy.jit.metainterp.history import BoxPtr, BoxObj, BoxFloat, Const
@@ -73,7 +73,7 @@
             # test_memgr.py)
             if descr is not looptoken:
                 looptoken.record_jump_to(descr)
-            op.setdescr(None)    # clear reference, mostly for tests
+            op._descr = None    # clear reference, mostly for tests
             if not we_are_translated():
                 op._jumptarget_number = descr.number
     # record this looptoken on the QuasiImmut used in the code
@@ -156,20 +156,16 @@
     loop_token.number = n = globaldata.loopnumbering
     globaldata.loopnumbering += 1
 
-    metainterp_sd.logger_ops.log_loop(loop.inputargs, loop.operations, n, type)
-    short = loop.token.short_preamble
-    if short:
-        metainterp_sd.logger_ops.log_short_preamble(short[-1].inputargs,
-                                                    short[-1].operations)
-
     if not we_are_translated():
         show_loop(metainterp_sd, loop)
         loop.check_consistency()
+
+    operations = get_deep_immutable_oplist(loop.operations)
     metainterp_sd.profiler.start_backend()
     debug_start("jit-backend")
     try:
-        metainterp_sd.cpu.compile_loop(loop.inputargs, loop.operations,
-                                       loop.token)
+        ops_offset = metainterp_sd.cpu.compile_loop(loop.inputargs, operations,
+                                                    loop.token)
     finally:
         debug_stop("jit-backend")
     metainterp_sd.profiler.end_backend()
@@ -180,27 +176,37 @@
         else:
             loop._ignore_during_counting = True
     metainterp_sd.log("compiled new " + type)
+    #
+    metainterp_sd.logger_ops.log_loop(loop.inputargs, loop.operations, n, type, ops_offset)
+    short = loop.token.short_preamble
+    if short:
+        metainterp_sd.logger_ops.log_short_preamble(short[-1].inputargs,
+                                                    short[-1].operations)
+    #
     if metainterp_sd.warmrunnerdesc is not None:    # for tests
         metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(loop.token)
 
 def send_bridge_to_backend(metainterp_sd, faildescr, inputargs, operations,
                            original_loop_token):
-    n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
-    metainterp_sd.logger_ops.log_bridge(inputargs, operations, n)
     if not we_are_translated():
         show_loop(metainterp_sd)
         TreeLoop.check_consistency_of(inputargs, operations)
     metainterp_sd.profiler.start_backend()
+    operations = get_deep_immutable_oplist(operations)
     debug_start("jit-backend")
     try:
-        metainterp_sd.cpu.compile_bridge(faildescr, inputargs, operations,
-                                         original_loop_token)
+        ops_offset = metainterp_sd.cpu.compile_bridge(faildescr, inputargs, operations,
+                                                      original_loop_token)
     finally:
         debug_stop("jit-backend")
     metainterp_sd.profiler.end_backend()
     if not we_are_translated():
         metainterp_sd.stats.compiled()
     metainterp_sd.log("compiled new bridge")
+    #
+    n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
+    metainterp_sd.logger_ops.log_bridge(inputargs, operations, n, ops_offset)
+    #
     if metainterp_sd.warmrunnerdesc is not None:    # for tests
         metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(
             original_loop_token)
@@ -685,6 +691,7 @@
         ResOperation(rop.FINISH, finishargs, None, descr=jd.portal_finishtoken)
         ]
     operations[1].setfailargs([])
+    operations = get_deep_immutable_oplist(operations)
     cpu.compile_loop(inputargs, operations, loop_token, log=False)
     if memory_manager is not None:    # for tests
         memory_manager.keep_loop_alive(loop_token)
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -785,6 +785,8 @@
     def repr_of_descr(self):
         return '<Loop%d>' % self.number
 
+    def dump(self):
+        self.compiled_loop_token.cpu.dump_loop_token(self)
 
 class TreeLoop(object):
     inputargs = None
diff --git a/pypy/jit/metainterp/logger.py b/pypy/jit/metainterp/logger.py
--- a/pypy/jit/metainterp/logger.py
+++ b/pypy/jit/metainterp/logger.py
@@ -14,33 +14,33 @@
         self.ts = metainterp_sd.cpu.ts
         self.guard_number = guard_number
 
-    def log_loop(self, inputargs, operations, number=0, type=None):
+    def log_loop(self, inputargs, operations, number=0, type=None, ops_offset=None):
         if type is None:
             debug_start("jit-log-noopt-loop")
-            self._log_operations(inputargs, operations)
+            self._log_operations(inputargs, operations, ops_offset)
             debug_stop("jit-log-noopt-loop")
         else:
             debug_start("jit-log-opt-loop")
             debug_print("# Loop", number, ":", type,
                         "with", len(operations), "ops")
-            self._log_operations(inputargs, operations)
+            self._log_operations(inputargs, operations, ops_offset)
             debug_stop("jit-log-opt-loop")
 
-    def log_bridge(self, inputargs, operations, number=-1):
+    def log_bridge(self, inputargs, operations, number=-1, ops_offset=None):
         if number == -1:
             debug_start("jit-log-noopt-bridge")
-            self._log_operations(inputargs, operations)
+            self._log_operations(inputargs, operations, ops_offset)
             debug_stop("jit-log-noopt-bridge")
         else:
             debug_start("jit-log-opt-bridge")
             debug_print("# bridge out of Guard", number,
                         "with", len(operations), "ops")
-            self._log_operations(inputargs, operations)
+            self._log_operations(inputargs, operations, ops_offset)
             debug_stop("jit-log-opt-bridge")
 
     def log_short_preamble(self, inputargs, operations):
         debug_start("jit-log-short-preamble")
-        self._log_operations(inputargs, operations)
+        self._log_operations(inputargs, operations, ops_offset=None)
         debug_stop("jit-log-short-preamble")            
 
     def repr_of_descr(self, descr):
@@ -75,9 +75,11 @@
         else:
             return '?'
 
-    def _log_operations(self, inputargs, operations):
+    def _log_operations(self, inputargs, operations, ops_offset):
         if not have_debug_prints():
             return
+        if ops_offset is None:
+            ops_offset = {}
         memo = {}
         if inputargs is not None:
             args = ", ".join([self.repr_of_arg(memo, arg) for arg in inputargs])
@@ -89,6 +91,11 @@
                 reclev = op.getarg(1).getint()
                 debug_print("debug_merge_point('%s', %s)" % (loc, reclev))
                 continue
+            offset = ops_offset.get(op, -1)
+            if offset == -1:
+                s_offset = ""
+            else:
+                s_offset = "+%d: " % offset
             args = ", ".join([self.repr_of_arg(memo, op.getarg(i)) for i in range(op.numargs())])
             if op.result is not None:
                 res = self.repr_of_arg(memo, op.result) + " = "
@@ -108,8 +115,11 @@
                                               for arg in op.getfailargs()]) + ']'
             else:
                 fail_args = ''
-            debug_print(res + op.getopname() +
+            debug_print(s_offset + res + op.getopname() +
                         '(' + args + ')' + fail_args)
+        if ops_offset and None in ops_offset:
+            offset = ops_offset[None]
+            debug_print("+%d: --end of the loop--" % offset)
 
 
 def int_could_be_an_address(x):
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -15,7 +15,7 @@
 
     def reconstruct_for_next_iteration(self, optimizer, valuemap):
         return self
-    
+
     def propagate_forward(self, op):
         args = self.optimizer.make_args_key(op)
         if self.find_rewritable_bool(op, args):
@@ -40,7 +40,7 @@
                     return False
         return self.is_emittable(op)
 
-        
+
     def try_boolinvers(self, op, targs):
         oldop = self.optimizer.pure_operations.get(targs, None)
         if oldop is not None and oldop.getdescr() is op.getdescr():
@@ -69,7 +69,7 @@
         try:
             oldopnum = opboolreflex[op.getopnum()] # FIXME: add INT_ADD, INT_MUL
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
-                                                              None))            
+                                                              None))
             oldop = self.optimizer.pure_operations.get(targs, None)
             if oldop is not None and oldop.getdescr() is op.getdescr():
                 self.make_equal_to(op.result, self.getvalue(oldop.result))
@@ -80,7 +80,7 @@
         try:
             oldopnum = opboolinvers[opboolreflex[op.getopnum()]]
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
-                                                              None))            
+                                                              None))
             if self.try_boolinvers(op, targs):
                 return True
         except KeyError:
@@ -157,6 +157,15 @@
 
             self.emit_operation(op)
 
+    def optimize_UINT_FLOORDIV(self, op):
+        v1 = self.getvalue(op.getarg(0))
+        v2 = self.getvalue(op.getarg(1))
+
+        if v2.is_constant() and v2.box.getint() == 1:
+            self.make_equal_to(op.result, v1)
+        else:
+            self.emit_operation(op)
+
     def optimize_INT_LSHIFT(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
@@ -322,7 +331,7 @@
         self.emit_operation(op)
         resvalue = self.getvalue(op.result)
         self.optimizer.loop_invariant_results[key] = resvalue
-    
+
     def _optimize_nullness(self, op, box, expect_nonnull):
         value = self.getvalue(box)
         if value.is_nonnull():
@@ -381,7 +390,7 @@
 ##        if realclassbox is not None:
 ##            checkclassbox = self.optimizer.cpu.typedescr2classbox(op.descr)
 ##            result = self.optimizer.cpu.ts.subclassOf(self.optimizer.cpu,
-##                                                      realclassbox, 
+##                                                      realclassbox,
 ##                                                      checkclassbox)
 ##            self.make_constant_int(op.result, result)
 ##            return
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -626,3 +626,25 @@
     rop.PTR_EQ: rop.PTR_EQ,
     rop.PTR_NE: rop.PTR_NE,
     }
+
+
+def get_deep_immutable_oplist(operations):
+    """
+    When not we_are_translated(), turns ``operations`` into a frozenlist and
+    monkey-patch its items to make sure they are not mutated.
+
+    When we_are_translated(), do nothing and just return the old list.
+    """
+    from pypy.tool.frozenlist import frozenlist
+    if we_are_translated():
+        return operations
+    #
+    def setarg(*args):
+        assert False, "operations cannot change at this point"
+    def setdescr(*args):
+        assert False, "operations cannot change at this point"
+    newops = frozenlist(operations)
+    for op in newops:
+        op.setarg = setarg
+        op.setdescr = setdescr
+    return newops
diff --git a/pypy/jit/metainterp/test/test_compile.py b/pypy/jit/metainterp/test/test_compile.py
--- a/pypy/jit/metainterp/test/test_compile.py
+++ b/pypy/jit/metainterp/test/test_compile.py
@@ -34,7 +34,7 @@
         self.seen.append((inputargs, operations, token))
 
 class FakeLogger(object):
-    def log_loop(self, inputargs, operations, number=0, type=None):
+    def log_loop(self, inputargs, operations, number=0, type=None, ops_offset=None):
         pass
 
 class FakeState(object):
diff --git a/pypy/jit/metainterp/test/test_logger.py b/pypy/jit/metainterp/test/test_logger.py
--- a/pypy/jit/metainterp/test/test_logger.py
+++ b/pypy/jit/metainterp/test/test_logger.py
@@ -31,10 +31,10 @@
     return log_stream.getvalue()
 
 class Logger(logger.Logger):
-    def log_loop(self, loop, namespace={}):
+    def log_loop(self, loop, namespace={}, ops_offset=None):
         self.namespace = namespace
         return capturing(logger.Logger.log_loop, self,
-                         loop.inputargs, loop.operations)
+                         loop.inputargs, loop.operations, ops_offset=ops_offset)
 
     def repr_of_descr(self, descr):
         for k, v in self.namespace.items():
@@ -178,3 +178,27 @@
         output = capturing(bare_logger.log_bridge, [], [], 3)
         assert output.splitlines()[0] == "# bridge out of Guard 3 with 0 ops"
         pure_parse(output)
+
+    def test_ops_offset(self):
+        inp = '''
+        [i0]
+        i1 = int_add(i0, 1)
+        i2 = int_mul(i1, 2)
+        jump(i2)
+        '''
+        loop = pure_parse(inp)
+        ops = loop.operations
+        ops_offset = {
+            ops[0]: 10,
+            ops[2]: 30,
+            None: 40
+            }
+        logger = Logger(self.make_metainterp_sd())
+        output = logger.log_loop(loop, ops_offset=ops_offset)
+        assert output.strip() == """
+[i0]
++10: i2 = int_add(i0, 1)
+i4 = int_mul(i2, 2)
++30: jump(i4)
++40: --end of the loop--
+""".strip()
diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -2843,6 +2843,18 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_fold_partially_constant_uint_floordiv(self):
+        ops = """
+        [i0]
+        i1 = uint_floordiv(i0, 1)
+        jump(i1)
+        """
+        expected = """
+        [i0]
+        jump(i0)
+        """
+        self.optimize_loop(ops, expected)
+
     # ----------
 
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
@@ -5746,7 +5758,7 @@
         """
         expected = """
         []
-        guard_not_invalidated() []        
+        guard_not_invalidated() []
         escape(-4247)
         jump()
         """
diff --git a/pypy/jit/metainterp/test/test_resoperation.py b/pypy/jit/metainterp/test/test_resoperation.py
--- a/pypy/jit/metainterp/test/test_resoperation.py
+++ b/pypy/jit/metainterp/test/test_resoperation.py
@@ -68,3 +68,11 @@
     call = rop.ResOperation(rop.rop.CALL, ['a', 'b'], 'c', descr=mydescr)
     assert call.can_malloc()
     assert not rop.ResOperation(rop.rop.INT_ADD, ['a', 'b'], 'c').can_malloc()
+
+def test_get_deep_immutable_oplist():
+    ops = [rop.ResOperation(rop.rop.INT_ADD, ['a', 'b'], 'c')]
+    newops = rop.get_deep_immutable_oplist(ops)
+    py.test.raises(AttributeError, "newops.append('foobar')")
+    py.test.raises(TypeError, "newops[0] = 'foobar'")
+    py.test.raises(AssertionError, "newops[0].setarg(0, 'd')")
+    py.test.raises(AssertionError, "newops[0].setdescr('foobar')")
diff --git a/pypy/jit/metainterp/test/test_warmstate.py b/pypy/jit/metainterp/test/test_warmstate.py
--- a/pypy/jit/metainterp/test/test_warmstate.py
+++ b/pypy/jit/metainterp/test/test_warmstate.py
@@ -18,6 +18,7 @@
 
 def test_unwrap():
     S = lltype.GcStruct('S')
+    RS = lltype.Struct('S')
     p = lltype.malloc(S)
     po = lltype.cast_opaque_ptr(llmemory.GCREF, p)
     assert unwrap(lltype.Void, BoxInt(42)) is None
@@ -25,6 +26,7 @@
     assert unwrap(lltype.Char, BoxInt(42)) == chr(42)
     assert unwrap(lltype.Float, boxfloat(42.5)) == 42.5
     assert unwrap(lltype.Ptr(S), BoxPtr(po)) == p
+    assert unwrap(lltype.Ptr(RS), BoxInt(0)) == lltype.nullptr(RS)
 
 def test_wrap():
     def _is(box1, box2):
diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -54,7 +54,10 @@
     if TYPE is lltype.Void:
         return None
     if isinstance(TYPE, lltype.Ptr):
-        return box.getref(TYPE)
+        if TYPE.TO._gckind == "gc":
+            return box.getref(TYPE)
+        else:
+            return llmemory.cast_adr_to_ptr(box.getaddr(), TYPE)
     if isinstance(TYPE, ootype.OOType):
         return box.getref(TYPE)
     if TYPE == lltype.Float:
@@ -578,7 +581,7 @@
                 cell.set_entry_loop_token(entry_loop_token)
             return entry_loop_token
         self.get_assembler_token = get_assembler_token
-        
+
         #
         get_location_ptr = self.jitdriver_sd._get_printable_location_ptr
         if get_location_ptr is None:
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -335,7 +335,7 @@
                 continue  # a comment or empty line
             newlines.append(line)
         base_indent, inpargs, newlines = self.parse_inpargs(newlines)
-        num, ops = self.parse_ops(base_indent, newlines, 0)
+        num, ops, last_offset = self.parse_ops(base_indent, newlines, 0)
         if num < len(newlines):
             raise ParseError("unexpected dedent at line: %s" % newlines[num])
         loop = ExtendedTreeLoop("loop")
@@ -343,11 +343,13 @@
         loop.token = self.looptoken
         loop.operations = ops
         loop.inputargs = inpargs
+        loop.last_offset = last_offset
         return loop
 
     def parse_ops(self, indent, lines, start):
         num = start
         ops = []
+        last_offset = None
         while num < len(lines):
             line = lines[num]
             if not line.startswith(" " * indent):
@@ -356,9 +358,25 @@
             elif line.startswith(" "*(indent + 1)):
                 raise ParseError("indentation not valid any more")
             else:
-                ops.append(self.parse_next_op(lines[num].strip()))
+                line = line.strip()
+                offset, line = self.parse_offset(line)
+                if line == '--end of the loop--':
+                    last_offset = offset
+                else:
+                    op = self.parse_next_op(line)
+                    if offset:
+                        op.offset = offset
+                    ops.append(op)
                 num += 1
-        return num, ops
+        return num, ops, last_offset
+
+    def parse_offset(self, line):
+        if line.startswith('+'):
+            # it begins with an offset, like: "+10: i1 = int_add(...)"
+            offset, _, line = line.partition(':')
+            offset = int(offset)
+            return offset, line.strip()
+        return None, line
 
     def parse_inpargs(self, lines):
         line = lines[0]
diff --git a/pypy/jit/tool/test/test_oparser.py b/pypy/jit/tool/test/test_oparser.py
--- a/pypy/jit/tool/test/test_oparser.py
+++ b/pypy/jit/tool/test/test_oparser.py
@@ -1,7 +1,7 @@
-
+import py
 from pypy.rpython.lltypesystem import lltype, llmemory
 
-from pypy.jit.tool.oparser import parse
+from pypy.jit.tool.oparser import parse, ParseError
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.history import AbstractDescr, BoxInt, LoopToken,\
      BoxFloat
@@ -203,3 +203,25 @@
     loop = parse(x, nonstrict=True)
     assert loop.inputargs == []
     assert loop.operations[0].getopname() == 'int_add'
+
+def test_offsets():
+    x = """
+    [i0, i1]
+    +10: i2 = int_add(i0, i1)
+    i3 = int_add(i2, 3)
+    """
+    #    +30: --end of the loop--
+    loop = parse(x)
+    assert loop.operations[0].offset == 10
+    assert not hasattr(loop.operations[1], 'offset')
+
+def test_last_offset():
+    x = """
+    [i0, i1]
+    +10: i2 = int_add(i0, i1)
+    i3 = int_add(i2, 3)
+    +30: --end of the loop--
+    """
+    loop = parse(x)
+    assert len(loop.operations) == 2
+    assert loop.last_offset == 30
diff --git a/pypy/module/_multibytecodec/__init__.py b/pypy/module/_multibytecodec/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/__init__.py
@@ -0,0 +1,21 @@
+from pypy.interpreter.mixedmodule import MixedModule 
+
+
+class Module(MixedModule):
+
+    interpleveldefs = {
+        # for compatibility this name is obscured, and should be called
+        # via the _codecs_*.py modules written in lib_pypy.
+        '__getcodec': 'interp_multibytecodec.getcodec',
+    }
+
+    appleveldefs = {
+        'MultibyteIncrementalEncoder':
+            'app_multibytecodec.MultibyteIncrementalEncoder',
+        'MultibyteIncrementalDecoder':
+            'app_multibytecodec.MultibyteIncrementalDecoder',
+        'MultibyteStreamReader':
+            'app_multibytecodec.MultibyteStreamReader',
+        'MultibyteStreamWriter':
+            'app_multibytecodec.MultibyteStreamWriter',
+    }
diff --git a/pypy/module/_multibytecodec/app_multibytecodec.py b/pypy/module/_multibytecodec/app_multibytecodec.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/app_multibytecodec.py
@@ -0,0 +1,34 @@
+# NOT_RPYTHON
+#
+# These classes are not supported so far.
+#
+# My theory is that they are not widely used on CPython either, because
+# I found two bugs just by looking at their .c source: they always call
+# encreset() after a piece of data, even though I think it's wrong ---
+# it should be called only once at the end; and mbiencoder_reset() calls
+# decreset() instead of encreset().
+#
+
+class MultibyteIncrementalEncoder(object):
+    def __init__(self, *args, **kwds):
+        raise LookupError(
+            "MultibyteIncrementalEncoder not implemented; "
+            "see pypy/module/_multibytecodec/app_multibytecodec.py")
+
+class MultibyteIncrementalDecoder(object):
+    def __init__(self, *args, **kwds):
+        raise LookupError(
+            "MultibyteIncrementalDecoder not implemented; "
+            "see pypy/module/_multibytecodec/app_multibytecodec.py")
+
+class MultibyteStreamReader(object):
+    def __init__(self, *args, **kwds):
+        raise LookupError(
+            "MultibyteStreamReader not implemented; "
+            "see pypy/module/_multibytecodec/app_multibytecodec.py")
+
+class MultibyteStreamWriter(object):
+    def __init__(self, *args, **kwds):
+        raise LookupError(
+            "MultibyteStreamWriter not implemented; "
+            "see pypy/module/_multibytecodec/app_multibytecodec.py")
diff --git a/pypy/module/_multibytecodec/c_codecs.py b/pypy/module/_multibytecodec/c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/c_codecs.py
@@ -0,0 +1,212 @@
+import py, sys
+from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+from pypy.tool.autopath import pypydir
+
+
+class EncodeDecodeError(Exception):
+    def __init__(self, start, end, reason):
+        self.start = start
+        self.end = end
+        self.reason = reason
+    def __repr__(self):
+        return 'EncodeDecodeError(%r, %r, %r)' % (self.start, self.end,
+                                                  self.reason)
+
+srcdir = py.path.local(pypydir).join('translator', 'c')
+
+codecs = [
+    # _codecs_cn
+    'gb2312', 'gbk', 'gb18030', 'hz',
+
+    # _codecs_hk
+    'big5hkscs',
+
+    # _codecs_iso2022
+    'iso2022_kr', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+    'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext',
+
+    # _codecs_jp
+    'shift_jis', 'cp932', 'euc_jp', 'shift_jis_2004',
+    'euc_jis_2004', 'euc_jisx0213', 'shift_jisx0213',
+
+    # _codecs_kr
+    'euc_kr', 'cp949', 'johab',
+
+    # _codecs_tw
+    'big5', 'cp950',
+]
+
+eci = ExternalCompilationInfo(
+    separate_module_files = [
+        srcdir.join('src', 'cjkcodecs', '_codecs_cn.c'),
+        srcdir.join('src', 'cjkcodecs', '_codecs_hk.c'),
+        srcdir.join('src', 'cjkcodecs', '_codecs_iso2022.c'),
+        srcdir.join('src', 'cjkcodecs', '_codecs_jp.c'),
+        srcdir.join('src', 'cjkcodecs', '_codecs_kr.c'),
+        srcdir.join('src', 'cjkcodecs', '_codecs_tw.c'),
+        srcdir.join('src', 'cjkcodecs', 'multibytecodec.c'),
+    ],
+    includes = ['src/cjkcodecs/multibytecodec.h'],
+    include_dirs = [str(srcdir)],
+    export_symbols = [
+        "pypy_cjk_dec_init", "pypy_cjk_dec_free", "pypy_cjk_dec_chunk",
+        "pypy_cjk_dec_outbuf", "pypy_cjk_dec_outlen",
+        "pypy_cjk_dec_inbuf_remaining", "pypy_cjk_dec_inbuf_consumed",
+
+        "pypy_cjk_enc_init", "pypy_cjk_enc_free", "pypy_cjk_enc_chunk",
+        "pypy_cjk_enc_reset", "pypy_cjk_enc_outbuf", "pypy_cjk_enc_outlen",
+        "pypy_cjk_enc_inbuf_remaining", "pypy_cjk_enc_inbuf_consumed",
+    ] + ["pypy_cjkcodec_%s" % codec for codec in codecs],
+)
+
+MBERR_TOOSMALL = -1  # insufficient output buffer space
+MBERR_TOOFEW   = -2  # incomplete input buffer
+MBERR_INTERNAL = -3  # internal runtime error
+MBERR_NOMEMORY = -4  # out of memory
+
+MULTIBYTECODEC_P = rffi.COpaquePtr('struct MultibyteCodec_s',
+                                   compilation_info=eci)
+
+def llexternal(*args, **kwds):
+    kwds.setdefault('compilation_info', eci)
+    kwds.setdefault('sandboxsafe', True)
+    kwds.setdefault('_nowrapper', True)
+    return rffi.llexternal(*args, **kwds)
+
+def getter_for(name):
+    return llexternal('pypy_cjkcodec_%s' % name, [], MULTIBYTECODEC_P)
+
+_codecs_getters = dict([(name, getter_for(name)) for name in codecs])
+assert len(_codecs_getters) == len(codecs)
+
+def getcodec(name):
+    getter = _codecs_getters[name]
+    return getter()
+
+# ____________________________________________________________
+# Decoding
+
+DECODEBUF_P = rffi.COpaquePtr('struct pypy_cjk_dec_s', compilation_info=eci)
+pypy_cjk_dec_init = llexternal('pypy_cjk_dec_init',
+                               [MULTIBYTECODEC_P, rffi.CCHARP, rffi.SSIZE_T],
+                               DECODEBUF_P)
+pypy_cjk_dec_free = llexternal('pypy_cjk_dec_free', [DECODEBUF_P],
+                               lltype.Void)
+pypy_cjk_dec_chunk = llexternal('pypy_cjk_dec_chunk', [DECODEBUF_P],
+                                rffi.SSIZE_T)
+pypy_cjk_dec_outbuf = llexternal('pypy_cjk_dec_outbuf', [DECODEBUF_P],
+                                 rffi.CWCHARP)
+pypy_cjk_dec_outlen = llexternal('pypy_cjk_dec_outlen', [DECODEBUF_P],
+                                 rffi.SSIZE_T)
+pypy_cjk_dec_inbuf_remaining = llexternal('pypy_cjk_dec_inbuf_remaining',
+                                          [DECODEBUF_P], rffi.SSIZE_T)
+pypy_cjk_dec_inbuf_consumed = llexternal('pypy_cjk_dec_inbuf_consumed',
+                                         [DECODEBUF_P], rffi.SSIZE_T)
+
+def decode(codec, stringdata):
+    inleft = len(stringdata)
+    inbuf = rffi.get_nonmovingbuffer(stringdata)
+    try:
+        decodebuf = pypy_cjk_dec_init(codec, inbuf, inleft)
+        if not decodebuf:
+            raise MemoryError
+        try:
+            r = pypy_cjk_dec_chunk(decodebuf)
+            if r != 0:
+                multibytecodec_decerror(decodebuf, r)
+                assert False
+            src = pypy_cjk_dec_outbuf(decodebuf)
+            length = pypy_cjk_dec_outlen(decodebuf)
+            return rffi.wcharpsize2unicode(src, length)
+        #
+        finally:
+            pypy_cjk_dec_free(decodebuf)
+    #
+    finally:
+        rffi.free_nonmovingbuffer(stringdata, inbuf)
+
+def multibytecodec_decerror(decodebuf, e):
+    if e > 0:
+        reason = "illegal multibyte sequence"
+        esize = e
+    elif e == MBERR_TOOFEW:
+        reason = "incomplete multibyte sequence"
+        esize = pypy_cjk_dec_inbuf_remaining(decodebuf)
+    elif e == MBERR_NOMEMORY:
+        raise MemoryError
+    else:
+        raise RuntimeError
+    #
+    # if errors == ERROR_REPLACE:...
+    # if errors == ERROR_IGNORE or errors == ERROR_REPLACE:...
+    start = pypy_cjk_dec_inbuf_consumed(decodebuf)
+    end = start + esize
+    if 1:  # errors == ERROR_STRICT:
+        raise EncodeDecodeError(start, end, reason)
+
+# ____________________________________________________________
+# Encoding
+ENCODEBUF_P = rffi.COpaquePtr('struct pypy_cjk_enc_s', compilation_info=eci)
+pypy_cjk_enc_init = llexternal('pypy_cjk_enc_init',
+                               [MULTIBYTECODEC_P, rffi.CWCHARP, rffi.SSIZE_T],
+                               ENCODEBUF_P)
+pypy_cjk_enc_free = llexternal('pypy_cjk_enc_free', [ENCODEBUF_P],
+                               lltype.Void)
+pypy_cjk_enc_chunk = llexternal('pypy_cjk_enc_chunk', [ENCODEBUF_P],
+                                rffi.SSIZE_T)
+pypy_cjk_enc_reset = llexternal('pypy_cjk_enc_reset', [ENCODEBUF_P],
+                                rffi.SSIZE_T)
+pypy_cjk_enc_outbuf = llexternal('pypy_cjk_enc_outbuf', [ENCODEBUF_P],
+                                 rffi.CCHARP)
+pypy_cjk_enc_outlen = llexternal('pypy_cjk_enc_outlen', [ENCODEBUF_P],
+                                 rffi.SSIZE_T)
+pypy_cjk_enc_inbuf_remaining = llexternal('pypy_cjk_enc_inbuf_remaining',
+                                          [ENCODEBUF_P], rffi.SSIZE_T)
+pypy_cjk_enc_inbuf_consumed = llexternal('pypy_cjk_enc_inbuf_consumed',
+                                         [ENCODEBUF_P], rffi.SSIZE_T)
+
+def encode(codec, unicodedata):
+    inleft = len(unicodedata)
+    inbuf = rffi.get_nonmoving_unicodebuffer(unicodedata)
+    try:
+        encodebuf = pypy_cjk_enc_init(codec, inbuf, inleft)
+        if not encodebuf:
+            raise MemoryError
+        try:
+            r = pypy_cjk_enc_chunk(encodebuf)
+            if r != 0:
+                multibytecodec_encerror(encodebuf, r)
+                assert False
+            r = pypy_cjk_enc_reset(encodebuf)
+            if r != 0:
+                multibytecodec_encerror(encodebuf, r)
+                assert False
+            src = pypy_cjk_enc_outbuf(encodebuf)
+            length = pypy_cjk_enc_outlen(encodebuf)
+            return rffi.charpsize2str(src, length)
+        #
+        finally:
+            pypy_cjk_enc_free(encodebuf)
+    #
+    finally:
+        rffi.free_nonmoving_unicodebuffer(unicodedata, inbuf)
+
+def multibytecodec_encerror(encodebuf, e):
+    if e > 0:
+        reason = "illegal multibyte sequence"
+        esize = e
+    elif e == MBERR_TOOFEW:
+        reason = "incomplete multibyte sequence"
+        esize = pypy_cjk_enc_inbuf_remaining(encodebuf)
+    elif e == MBERR_NOMEMORY:
+        raise MemoryError
+    else:
+        raise RuntimeError
+    #
+    # if errors == ERROR_REPLACE:...
+    # if errors == ERROR_IGNORE or errors == ERROR_REPLACE:...
+    start = pypy_cjk_enc_inbuf_consumed(encodebuf)
+    end = start + esize
+    if 1:  # errors == ERROR_STRICT:
+        raise EncodeDecodeError(start, end, reason)
diff --git a/pypy/module/_multibytecodec/interp_multibytecodec.py b/pypy/module/_multibytecodec/interp_multibytecodec.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/interp_multibytecodec.py
@@ -0,0 +1,79 @@
+from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.gateway import ObjSpace, interp2app
+from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.error import OperationError
+from pypy.module._multibytecodec import c_codecs
+
+
+class MultibyteCodec(Wrappable):
+
+    def __init__(self, name, codec):
+        self.name = name
+        self.codec = codec
+
+    def decode(self, space, input, errors=None):
+        if errors is not None and errors != 'strict':
+            raise OperationError(space.w_NotImplementedError,    # XXX
+                                 space.wrap("errors='%s' in _multibytecodec"
+                                            % errors))
+        #
+        try:
+            output = c_codecs.decode(self.codec, input)
+        except c_codecs.EncodeDecodeError, e:
+            raise OperationError(
+                space.w_UnicodeDecodeError,
+                space.newtuple([
+                    space.wrap(self.name),
+                    space.wrap(input),
+                    space.wrap(e.start),
+                    space.wrap(e.end),
+                    space.wrap(e.reason)]))
+        except RuntimeError:
+            raise OperationError(space.w_RuntimeError,
+                                 space.wrap("internal codec error"))
+        return space.newtuple([space.wrap(output),
+                               space.wrap(len(input))])
+    decode.unwrap_spec = ['self', ObjSpace, str, 'str_or_None']
+
+    def encode(self, space, input, errors=None):
+        if errors is not None and errors != 'strict':
+            raise OperationError(space.w_NotImplementedError,    # XXX
+                                 space.wrap("errors='%s' in _multibytecodec"
+                                            % errors))
+        #
+        try:
+            output = c_codecs.encode(self.codec, input)
+        except c_codecs.EncodeDecodeError, e:
+            raise OperationError(
+                space.w_UnicodeEncodeError,
+                space.newtuple([
+                    space.wrap(self.name),
+                    space.wrap(input),
+                    space.wrap(e.start),
+                    space.wrap(e.end),
+                    space.wrap(e.reason)]))
+        except RuntimeError:
+            raise OperationError(space.w_RuntimeError,
+                                 space.wrap("internal codec error"))
+        return space.newtuple([space.wrap(output),
+                               space.wrap(len(input))])
+    encode.unwrap_spec = ['self', ObjSpace, unicode, 'str_or_None']
+
+
+MultibyteCodec.typedef = TypeDef(
+    'MultibyteCodec',
+    __module__ = '_multibytecodec',
+    decode = interp2app(MultibyteCodec.decode),
+    encode = interp2app(MultibyteCodec.encode),
+    )
+MultibyteCodec.typedef.acceptable_as_base_class = False
+
+
+def getcodec(space, name):
+    try:
+        codec = c_codecs.getcodec(name)
+    except KeyError:
+        raise OperationError(space.w_LookupError,
+                             space.wrap("no such codec is supported."))
+    return space.wrap(MultibyteCodec(name, codec))
+getcodec.unwrap_spec = [ObjSpace, str]
diff --git a/pypy/module/_multibytecodec/test/__init__.py b/pypy/module/_multibytecodec/test/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/__init__.py
@@ -0,0 +1,1 @@
+#
diff --git a/pypy/module/_multibytecodec/test/test_app_codecs.py b/pypy/module/_multibytecodec/test/test_app_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/test_app_codecs.py
@@ -0,0 +1,56 @@
+from pypy.conftest import gettestobjspace
+
+
+class AppTestCodecs:
+    def setup_class(cls):
+        cls.space = gettestobjspace(usemodules=['_multibytecodec'])
+
+    def test_missing_codec(self):
+        import _codecs_cn
+        raises(LookupError, _codecs_cn.getcodec, "foobar")
+
+    def test_decode_hz(self):
+        import _codecs_cn
+        codec = _codecs_cn.getcodec("hz")
+        r = codec.decode("~{abc}")
+        assert r == (u'\u5f95\u6cef', 6)
+
+    def test_strict_error(self):
+        import _codecs_cn
+        codec = _codecs_cn.getcodec("hz")
+        r = codec.decode("~{abc}", "strict")
+        assert r == (u'\u5f95\u6cef', 6)
+        assert type(r[0]) is unicode
+
+    def test_decode_hz_error(self):
+        import _codecs_cn
+        codec = _codecs_cn.getcodec("hz")
+        e = raises(UnicodeDecodeError, codec.decode, "~{}").value
+        assert e.args == ('hz', '~{}', 2, 3, 'incomplete multibyte sequence')
+        assert e.encoding == 'hz'
+        assert e.object == '~{}' and type(e.object) is str
+        assert e.start == 2
+        assert e.end == 3
+        assert e.reason == "incomplete multibyte sequence"
+        #
+        e = raises(UnicodeDecodeError, codec.decode, "~{xyz}").value
+        assert e.args == ('hz', '~{xyz}', 2, 4, 'illegal multibyte sequence')
+
+    def test_encode_hz(self):
+        import _codecs_cn
+        codec = _codecs_cn.getcodec("hz")
+        r = codec.encode(u'\u5f95\u6cef')
+        assert r == ('~{abc}~}', 2)
+        assert type(r[0]) is str
+
+    def test_encode_hz_error(self):
+        import _codecs_cn
+        codec = _codecs_cn.getcodec("hz")
+        u = u'abc\u1234def'
+        e = raises(UnicodeEncodeError, codec.encode, u).value
+        assert e.args == ('hz', u, 3, 4, 'illegal multibyte sequence')
+        assert e.encoding == 'hz'
+        assert e.object == u and type(e.object) is unicode
+        assert e.start == 3
+        assert e.end == 4
+        assert e.reason == 'illegal multibyte sequence'
diff --git a/pypy/module/_multibytecodec/test/test_c_codecs.py b/pypy/module/_multibytecodec/test/test_c_codecs.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/test_c_codecs.py
@@ -0,0 +1,57 @@
+import py
+from pypy.module._multibytecodec.c_codecs import getcodec, codecs
+from pypy.module._multibytecodec.c_codecs import decode, encode
+from pypy.module._multibytecodec.c_codecs import EncodeDecodeError
+
+
+def test_codecs_existence():
+    for name in codecs:
+        c = getcodec(name)
+        assert c
+    py.test.raises(KeyError, getcodec, "foobar")
+
+def test_decode_gbk():
+    c = getcodec("gbk")
+    u = decode(c, "\xA1\xAA")
+    assert u == unichr(0x2014)
+    u = decode(c, "foobar")
+    assert u == u"foobar"
+
+def test_decode_hz():
+    # stateful
+    c = getcodec("hz")
+    u = decode(c, "~{abc}")
+    assert u == u'\u5f95\u6cef'
+
+def test_decode_hz_error():
+    # error
+    c = getcodec("hz")
+    e = py.test.raises(EncodeDecodeError, decode, c, "~{}").value
+    assert e.start == 2
+    assert e.end == 3
+    assert e.reason == "incomplete multibyte sequence"
+    #
+    e = py.test.raises(EncodeDecodeError, decode, c, "~{xyz}").value
+    assert e.start == 2
+    assert e.end == 4
+    assert e.reason == "illegal multibyte sequence"
+
+def test_encode_hz():
+    c = getcodec("hz")
+    s = encode(c, u'foobar')
+    assert s == 'foobar' and type(s) is str
+    s = encode(c, u'\u5f95\u6cef')
+    assert s == '~{abc}~}'
+
+def test_encode_hz_error():
+    # error
+    c = getcodec("hz")
+    e = py.test.raises(EncodeDecodeError, encode, c, u'abc\u1234def').value
+    assert e.start == 3
+    assert e.end == 4
+    assert e.reason == "illegal multibyte sequence"
+
+def test_encode_jisx0208():
+    c = getcodec('iso2022_jp')
+    s = encode(c, u'\u83ca\u5730\u6642\u592b')
+    assert s == '\x1b$B5FCO;~IW\x1b(B' and type(s) is str
diff --git a/pypy/module/_multibytecodec/test/test_translation.py b/pypy/module/_multibytecodec/test/test_translation.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/_multibytecodec/test/test_translation.py
@@ -0,0 +1,20 @@
+from pypy.module._multibytecodec import c_codecs
+from pypy.translator.c.test import test_standalone
+
+
+class TestTranslation(test_standalone.StandaloneTests):
+
+    def test_translation(self):
+        #
+        def entry_point(argv):
+            codecname, string = argv[1], argv[2]
+            c = c_codecs.getcodec(codecname)
+            u = c_codecs.decode(c, string)
+            r = c_codecs.encode(c, u)
+            print r
+            return 0
+        #
+        t, cbuilder = self.compile(entry_point)
+        cmd = 'hz "~{abc}"'
+        data = cbuilder.cmdexec(cmd)
+        assert data == '~{abc}~}\n'
diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py
--- a/pypy/module/_socket/test/test_sock_app.py
+++ b/pypy/module/_socket/test/test_sock_app.py
@@ -372,11 +372,12 @@
     def test_socket_connect(self):
         import _socket, os
         s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0)
-        # XXX temporarily we use codespeak to test, will have more robust tests in
-        # the absence of a network connection later when more parts of the socket
-        # API are implemented. currently skip the test if there is no connection.
+        # XXX temporarily we use python.org to test, will have more robust tests
+        # in the absence of a network connection later when more parts of the
+        # socket API are implemented.  Currently skip the test if there is no
+        # connection.
         try:
-            s.connect(("codespeak.net", 80))
+            s.connect(("www.python.org", 80))
         except _socket.gaierror, ex:
             skip("GAIError - probably no connection: %s" % str(ex.args))
         name = s.getpeername() # Will raise socket.error if not connected
@@ -506,11 +507,12 @@
         # Test that send/sendall/sendto accept a buffer or a unicode as arg
         import _socket, os
         s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM, 0)
-        # XXX temporarily we use codespeak to test, will have more robust tests in
-        # the absence of a network connection later when more parts of the socket
-        # API are implemented. currently skip the test if there is no connection.
+        # XXX temporarily we use python.org to test, will have more robust tests
+        # in the absence of a network connection later when more parts of the
+        # socket API are implemented.  Currently skip the test if there is no
+        # connection.
         try:
-            s.connect(("codespeak.net", 80))
+            s.connect(("www.python.org", 80))
         except _socket.gaierror, ex:
             skip("GAIError - probably no connection: %s" % str(ex.args))
         s.send(buffer(''))
diff --git a/pypy/module/_ssl/__init__.py b/pypy/module/_ssl/__init__.py
--- a/pypy/module/_ssl/__init__.py
+++ b/pypy/module/_ssl/__init__.py
@@ -7,6 +7,7 @@
     interpleveldefs = {
         'sslwrap': 'interp_ssl.sslwrap',
         'SSLError': 'interp_ssl.get_error(space)',
+        '_test_decode_cert': 'interp_ssl._test_decode_cert',
     }
 
     appleveldefs = {
@@ -30,3 +31,5 @@
     def startup(self, space):
         from pypy.rlib.ropenssl import init_ssl
         init_ssl()
+        from pypy.module._ssl.interp_ssl import setup_ssl_threads
+        setup_ssl_threads()
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -4,6 +4,7 @@
 from pypy.interpreter.typedef import TypeDef
 from pypy.interpreter.gateway import interp2app, unwrap_spec
 
+from pypy.rlib.rarithmetic import intmask
 from pypy.rlib import rpoll, rsocket
 from pypy.rlib.ropenssl import *
 
@@ -68,11 +69,8 @@
 
 def ssl_error(space, msg, errno=0):
     w_exception_class = get_error(space)
-    if errno:
-        w_exception = space.call_function(w_exception_class,
-                                          space.wrap(errno), space.wrap(msg))
-    else:
-        w_exception = space.call_function(w_exception_class, space.wrap(msg))
+    w_exception = space.call_function(w_exception_class,
+                                      space.wrap(errno), space.wrap(msg))
     return OperationError(w_exception_class, w_exception)
 
 if HAVE_OPENSSL_RAND:
@@ -169,10 +167,10 @@
         num_bytes = 0
         while True:
             err = 0
-            
+
             num_bytes = libssl_SSL_write(self.ssl, data, len(data))
             err = libssl_SSL_get_error(self.ssl, num_bytes)
-        
+
             if err == SSL_ERROR_WANT_READ:
                 sockstate = check_socket_and_wait_for_timeout(self.space,
                     self.w_socket, False)
@@ -181,24 +179,34 @@
                     self.w_socket, True)
             else:
                 sockstate = SOCKET_OPERATION_OK
-        
+
             if sockstate == SOCKET_HAS_TIMED_OUT:
                 raise ssl_error(self.space, "The write operation timed out")
             elif sockstate == SOCKET_HAS_BEEN_CLOSED:
                 raise ssl_error(self.space, "Underlying socket has been closed.")
             elif sockstate == SOCKET_IS_NONBLOCKING:
                 break
-        
+
             if err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE:
                 continue
             else:
                 break
-        
+
         if num_bytes > 0:
             return self.space.wrap(num_bytes)
         else:
             raise _ssl_seterror(self.space, self, num_bytes)
 
+    def pending(self):
+        """pending() -> count
+
+        Returns the number of already decrypted bytes available for read,
+        pending on the connection."""
+        count = libssl_SSL_pending(self.ssl)
+        if count < 0:
+            raise _ssl_seterror(self.space, self, count)
+        return self.space.wrap(count)
+
     @unwrap_spec(num_bytes=int)
     def read(self, num_bytes=1024):
         """read([len]) -> string
@@ -369,18 +377,263 @@
 
         return self.w_socket
 
+    def cipher(self, space):
+        if not self.ssl:
+            return space.w_None
+        current = libssl_SSL_get_current_cipher(self.ssl)
+        if not current:
+            return space.w_None
+
+        name = libssl_SSL_CIPHER_get_name(current)
+        if name:
+            w_name = space.wrap(rffi.charp2str(name))
+        else:
+            w_name = space.w_None
+
+        proto = libssl_SSL_CIPHER_get_version(current)
+        if proto:
+            w_proto = space.wrap(rffi.charp2str(name))
+        else:
+            w_proto = space.w_None
+
+        bits = libssl_SSL_CIPHER_get_bits(current, 
+                                          lltype.nullptr(rffi.INTP.TO))
+        w_bits = space.newint(bits)
+
+        return space.newtuple([w_name, w_proto, w_bits])
+
+    @unwrap_spec(der=bool)
+    def peer_certificate(self, der=False):
+        """peer_certificate([der=False]) -> certificate
+
+        Returns the certificate for the peer.  If no certificate was provided,
+        returns None.  If a certificate was provided, but not validated, returns
+        an empty dictionary.  Otherwise returns a dict containing information
+        about the peer certificate.
+
+        If the optional argument is True, returns a DER-encoded copy of the
+        peer certificate, or None if no certificate was provided.  This will
+        return the certificate even if it wasn't validated."""
+        if not self.peer_cert:
+            return self.space.w_None
+
+        if der:
+            # return cert in DER-encoded format
+            with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as buf_ptr:
+                buf_ptr[0] = lltype.nullptr(rffi.CCHARP.TO)
+                length = libssl_i2d_X509(self.peer_cert, buf_ptr)
+                if length < 0:
+                    raise _ssl_seterror(self.space, self, length)
+                try:
+                    # this is actually an immutable bytes sequence
+                    return self.space.wrap(rffi.charp2str(buf_ptr[0]))
+                finally:
+                    libssl_OPENSSL_free(buf_ptr[0])
+        else:
+            verification = libssl_SSL_CTX_get_verify_mode(
+                libssl_SSL_get_SSL_CTX(self.ssl))
+            if not verification & SSL_VERIFY_PEER:
+                return self.space.newdict()
+            else:
+                return _decode_certificate(self.space, self.peer_cert)
+
+def _decode_certificate(space, certificate, verbose=False):
+    w_retval = space.newdict()
+
+    w_peer = _create_tuple_for_X509_NAME(
+        space, libssl_X509_get_subject_name(certificate))
+    space.setitem(w_retval, space.wrap("subject"), w_peer)
+
+    if verbose:
+        w_issuer = _create_tuple_for_X509_NAME(
+            space, libssl_X509_get_issuer_name(certificate))
+        space.setitem(w_retval, space.wrap("issuer"), w_issuer)
+
+        space.setitem(w_retval, space.wrap("version"),
+                      space.wrap(libssl_X509_get_version(certificate)))
+
+    biobuf = libssl_BIO_new(libssl_BIO_s_mem())
+    try:
+
+        if verbose:
+            libssl_BIO_reset(biobuf)
+            serialNumber = libssl_X509_get_serialNumber(certificate)
+            libssl_i2a_ASN1_INTEGER(biobuf, serialNumber)
+            # should not exceed 20 octets, 160 bits, so buf is big enough
+            with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf:
+                length = libssl_BIO_gets(biobuf, buf, 99)
+                if length < 0:
+                    raise _ssl_seterror(space, None, length)
+
+                w_serial = space.wrap(rffi.charpsize2str(buf, length))
+            space.setitem(w_retval, space.wrap("serialNumber"), w_serial)
+
+            libssl_BIO_reset(biobuf)
+            notBefore = libssl_X509_get_notBefore(certificate)
+            libssl_ASN1_TIME_print(biobuf, notBefore)
+            with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf:
+                length = libssl_BIO_gets(biobuf, buf, 99)
+                if length < 0:
+                    raise _ssl_seterror(space, None, length)
+                w_date = space.wrap(rffi.charpsize2str(buf, length))
+            space.setitem(w_retval, space.wrap("notBefore"), w_date)
+
+        libssl_BIO_reset(biobuf)
+        notAfter = libssl_X509_get_notAfter(certificate)
+        libssl_ASN1_TIME_print(biobuf, notAfter)
+        with lltype.scoped_alloc(rffi.CCHARP.TO, 100) as buf:
+            length = libssl_BIO_gets(biobuf, buf, 99)
+            if length < 0:
+                raise _ssl_seterror(space, None, length)
+            w_date = space.wrap(rffi.charpsize2str(buf, length))
+        space.setitem(w_retval, space.wrap("notAfter"), w_date)
+    finally:
+        libssl_BIO_free(biobuf)
+
+    # Now look for subjectAltName
+    w_alt_names = _get_peer_alt_names(space, certificate)
+    if w_alt_names is not space.w_None:
+        space.setitem(w_retval, space.wrap("subjectAltName"), w_alt_names)
+
+    return w_retval
+
+def _create_tuple_for_X509_NAME(space, xname):
+    entry_count = libssl_X509_NAME_entry_count(xname)
+    dn_w = []
+    rdn_w = []
+    rdn_level = -1
+    for index in range(entry_count):
+        entry = libssl_X509_NAME_get_entry(xname, index)
+        # check to see if we've gotten to a new RDN
+        entry_level = intmask(entry[0].c_set)
+        if rdn_level >= 0:
+            if rdn_level != entry_level:
+                # yes, new RDN
+                # add old RDN to DN
+                dn_w.append(space.newtuple(list(rdn_w)))
+                rdn_w = []
+        rdn_level = entry_level
+
+        # Now add this attribute to the current RDN
+        name = libssl_X509_NAME_ENTRY_get_object(entry)
+        value = libssl_X509_NAME_ENTRY_get_data(entry)
+        attr = _create_tuple_for_attribute(space, name, value)
+        rdn_w.append(attr)
+
+    # Now, there is typically a dangling RDN
+    if rdn_w:
+        dn_w.append(space.newtuple(list(rdn_w)))
+    return space.newtuple(list(dn_w))
+
+def _get_peer_alt_names(space, certificate):
+    # this code follows the procedure outlined in
+    # OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
+    # function to extract the STACK_OF(GENERAL_NAME),
+    # then iterates through the stack to add the
+    # names.
+
+    if not certificate:
+        return space.w_None
+
+    # get a memory buffer
+    biobuf = libssl_BIO_new(libssl_BIO_s_mem())
+
+    try:
+        alt_names_w = []
+        i = 0
+        while True:
+            i = libssl_X509_get_ext_by_NID(
+                certificate, NID_subject_alt_name, i)
+            if i < 0:
+                break
+
+            # now decode the altName
+            ext = libssl_X509_get_ext(certificate, i)
+            method = libssl_X509V3_EXT_get(ext)
+            if not method:
+                raise ssl_error(space, 
+                                "No method for internalizing subjectAltName!'")
+
+            with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as p_ptr:
+                p_ptr[0] = ext[0].c_value.c_data
+                length = intmask(ext[0].c_value.c_length)
+                null = lltype.nullptr(rffi.VOIDP.TO)
+                if method[0].c_it:
+                    names = rffi.cast(GENERAL_NAMES, libssl_ASN1_item_d2i(
+                            null, p_ptr, length,
+                            libssl_ASN1_ITEM_ptr(method[0].c_it)))
+                else:
+                    names = rffi.cast(GENERAL_NAMES, method[0].c_d2i(
+                            null, p_ptr, length))
+
+            for j in range(libssl_sk_GENERAL_NAME_num(names)):
+                # Get a rendering of each name in the set of names
+
+                name = libssl_sk_GENERAL_NAME_value(names, j)
+                if intmask(name[0].c_type) == GEN_DIRNAME:
+
+                    # we special-case DirName as a tuple of tuples of attributes
+                    dirname = libssl_pypy_GENERAL_NAME_dirn(name)
+                    w_t = space.newtuple([
+                            space.wrap("DirName"),
+                            _create_tuple_for_X509_NAME(space, dirname)
+                            ])
+                else:
+
+                    # for everything else, we use the OpenSSL print form
+
+                    libssl_BIO_reset(biobuf)
+                    libssl_GENERAL_NAME_print(biobuf, name)
+                    with lltype.scoped_alloc(rffi.CCHARP.TO, 2048) as buf:
+                        length = libssl_BIO_gets(biobuf, buf, 2047)
+                        if length < 0:
+                            raise _ssl_seterror(space, None, 0)
+
+                        v = rffi.charpsize2str(buf, length)
+                    v1, v2 = v.split(':', 1)
+                    w_t = space.newtuple([space.wrap(v1),
+                                          space.wrap(v2)])
+
+                alt_names_w.append(w_t)
+    finally:
+        libssl_BIO_free(biobuf)
+
+    if alt_names_w:
+        return space.newtuple(list(alt_names_w))
+    else:
+        return space.w_None
+
+def _create_tuple_for_attribute(space, name, value):
+    with lltype.scoped_alloc(rffi.CCHARP.TO, X509_NAME_MAXLEN) as buf:
+        length = libssl_OBJ_obj2txt(buf, X509_NAME_MAXLEN, name, 0)
+        if length < 0:
+            raise _ssl_seterror(space, None, 0)
+        w_name = space.wrap(rffi.charpsize2str(buf, length))
+
+    with lltype.scoped_alloc(rffi.CCHARPP.TO, 1) as buf_ptr:
+        length = libssl_ASN1_STRING_to_UTF8(buf_ptr, value)
+        if length < 0:
+            raise _ssl_seterror(space, None, 0)
+        w_value = space.wrap(rffi.charpsize2str(buf_ptr[0], length))
+        w_value = space.call_method(w_value, "decode", space.wrap("utf-8"))
+
+    return space.newtuple([w_name, w_value])
 
 SSLObject.typedef = TypeDef("SSLObject",
     server = interp2app(SSLObject.server),
     issuer = interp2app(SSLObject.issuer),
     write = interp2app(SSLObject.write),
+    pending = interp2app(SSLObject.pending),
     read = interp2app(SSLObject.read),
-    do_handshake=interp2app(SSLObject.do_handshake),
-    shutdown=interp2app(SSLObject.shutdown),
+    do_handshake = interp2app(SSLObject.do_handshake),
+    shutdown = interp2app(SSLObject.shutdown),
+    cipher = interp2app(SSLObject.cipher),
+    peer_certificate = interp2app(SSLObject.peer_certificate),
 )
 
 
-def new_sslobject(space, w_sock, side, w_key_file, w_cert_file):
+def new_sslobject(space, w_sock, side, w_key_file, w_cert_file,
+                  cert_mode, protocol, w_cacerts_file, w_ciphers):
     ss = SSLObject(space)
 
     sock_fd = space.int_w(space.call_method(w_sock, "fileno"))
@@ -397,18 +650,47 @@
         cert_file = None
     else:
         cert_file = space.str_w(w_cert_file)
+    if space.is_w(w_cacerts_file, space.w_None):
+        cacerts_file = None
+    else:
+        cacerts_file = space.str_w(w_cacerts_file)
+    if space.is_w(w_ciphers, space.w_None):
+        ciphers = None
+    else:
+        ciphers = space.str_w(w_ciphers)
 
     if side == PY_SSL_SERVER and (not key_file or not cert_file):
         raise ssl_error(space, "Both the key & certificate files "
                         "must be specified for server-side operation")
 
-    ss.ctx = libssl_SSL_CTX_new(libssl_SSLv23_method()) # set up context
+    # set up context
+    if protocol == PY_SSL_VERSION_TLS1:
+        method = libssl_TLSv1_method()
+    elif protocol == PY_SSL_VERSION_SSL3:
+        method = libssl_SSLv3_method()
+    elif protocol == PY_SSL_VERSION_SSL2:
+        method = libssl_SSLv2_method()
+    elif protocol == PY_SSL_VERSION_SSL23:
+        method = libssl_SSLv23_method()
+    else:
+        raise ssl_error(space, "Invalid SSL protocol variant specified")
+    ss.ctx = libssl_SSL_CTX_new(method)
     if not ss.ctx:
-        raise ssl_error(space, "Invalid SSL protocol variant specified")
+        raise ssl_error(space, "Could not create SSL context")
 
-    # XXX SSL_CTX_set_cipher_list?
+    if ciphers:
+        ret = libssl_SSL_CTX_set_cipher_list(ss.ctx, ciphers)
+        if ret == 0:
+            raise ssl_error(space, "No cipher can be selected.")
 
-    # XXX SSL_CTX_load_verify_locations?
+    if cert_mode != PY_SSL_CERT_NONE:
+        if not cacerts_file:
+            raise ssl_error(space,
+                            "No root certificates specified for "
+                            "verification of other-side certificates.")
+        ret = libssl_SSL_CTX_load_verify_locations(ss.ctx, cacerts_file, None)
+        if ret != 1:
+            raise _ssl_seterror(space, None, 0)
 
     if key_file:
         ret = libssl_SSL_CTX_use_PrivateKey_file(ss.ctx, key_file,
@@ -423,7 +705,12 @@
     # ssl compatibility
     libssl_SSL_CTX_set_options(ss.ctx, SSL_OP_ALL)
 
-    libssl_SSL_CTX_set_verify(ss.ctx, SSL_VERIFY_NONE, None) # set verify level
+    verification_mode = SSL_VERIFY_NONE
+    if cert_mode == PY_SSL_CERT_OPTIONAL:
+        verification_mode = SSL_VERIFY_PEER
+    elif cert_mode == PY_SSL_CERT_REQUIRED:
+        verification_mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT
+    libssl_SSL_CTX_set_verify(ss.ctx, verification_mode, None)
     ss.ssl = libssl_SSL_new(ss.ctx) # new ssl struct
     libssl_SSL_set_fd(ss.ssl, sock_fd) # set the socket for SSL
     libssl_SSL_set_mode(ss.ssl, SSL_MODE_AUTO_RETRY)
@@ -432,8 +719,8 @@
     # to non-blocking mode (blocking is the default)
     if has_timeout:
         # Set both the read and write BIO's to non-blocking mode
-        libssl_BIO_ctrl(libssl_SSL_get_rbio(ss.ssl), BIO_C_SET_NBIO, 1, None)
-        libssl_BIO_ctrl(libssl_SSL_get_wbio(ss.ssl), BIO_C_SET_NBIO, 1, None)
+        libssl_BIO_set_nbio(libssl_SSL_get_rbio(ss.ssl), 1)
+        libssl_BIO_set_nbio(libssl_SSL_get_wbio(ss.ssl), 1)
     libssl_SSL_set_connect_state(ss.ssl)
 
     if side == PY_SSL_CLIENT:
@@ -494,7 +781,10 @@
 def _ssl_seterror(space, ss, ret):
     assert ret <= 0
 
-    err = libssl_SSL_get_error(ss.ssl, ret)
+    if ss and ss.ssl:
+        err = libssl_SSL_get_error(ss.ssl, ret)
+    else:
+        err = SSL_ERROR_SSL
     errstr = ""
     errval = 0
 
@@ -546,10 +836,12 @@
 @unwrap_spec(side=int, cert_mode=int, protocol=int)
 def sslwrap(space, w_socket, side, w_key_file=None, w_cert_file=None,
             cert_mode=PY_SSL_CERT_NONE, protocol=PY_SSL_VERSION_SSL23,
-            w_cacerts_file=None, w_cipher=None):
+            w_cacerts_file=None, w_ciphers=None):
     """sslwrap(socket, side, [keyfile, certfile]) -> sslobject"""
     return space.wrap(new_sslobject(
-        space, w_socket, side, w_key_file, w_cert_file))
+        space, w_socket, side, w_key_file, w_cert_file,
+        cert_mode, protocol,
+        w_cacerts_file, w_ciphers))
 
 class Cache:
     def __init__(self, space):
@@ -559,3 +851,59 @@
 
 def get_error(space):
     return space.fromcache(Cache).w_error
+
+ at unwrap_spec(filename=str, verbose=bool)
+def _test_decode_cert(space, filename, verbose=True):
+    cert = libssl_BIO_new(libssl_BIO_s_file())
+    if not cert:
+        raise ssl_error(space, "Can't malloc memory to read file")
+    
+    try:
+        if libssl_BIO_read_filename(cert, filename) <= 0:
+            raise ssl_error(space, "Can't open file")
+
+        x = libssl_PEM_read_bio_X509_AUX(cert, None, None, None)
+        if not x:
+            raise ssl_error(space, "Error decoding PEM-encoded file")
+
+        try:
+            return _decode_certificate(space, x, verbose)
+        finally:
+            libssl_X509_free(x)
+    finally:
+        libssl_BIO_free(cert)
+    
+# this function is needed to perform locking on shared data
+# structures. (Note that OpenSSL uses a number of global data
+# structures that will be implicitly shared whenever multiple threads
+# use OpenSSL.) Multi-threaded applications will crash at random if
+# it is not set.
+#
+# locking_function() must be able to handle up to CRYPTO_num_locks()
+# different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
+# releases it otherwise.
+#
+# filename and line are the file number of the function setting the
+# lock. They can be useful for debugging.
+_ssl_locks = []
+
+def _ssl_thread_locking_function(mode, n, filename, line):
+    n = intmask(n)
+    if n < 0 or n >= len(_ssl_locks):
+        return
+
+    if intmask(mode) & CRYPTO_LOCK:
+        _ssl_locks[n].acquire(True)
+    else:
+        _ssl_locks[n].release()
+
+def _ssl_thread_id_function():
+    from pypy.module.thread import ll_thread
+    return rffi.cast(rffi.INT, ll_thread.get_ident())
+
+def setup_ssl_threads():
+    from pypy.module.thread import ll_thread
+    for i in range(libssl_CRYPTO_num_locks()):
+        _ssl_locks.append(ll_thread.allocate_lock())
+    libssl_CRYPTO_set_locking_callback(_ssl_thread_locking_function)
+    libssl_CRYPTO_set_id_callback(_ssl_thread_id_function)
diff --git a/pypy/module/_ssl/test/test_ssl.py b/pypy/module/_ssl/test/test_ssl.py
--- a/pypy/module/_ssl/test/test_ssl.py
+++ b/pypy/module/_ssl/test/test_ssl.py
@@ -81,7 +81,7 @@
         ss = _ssl.sslwrap(s, 0)
         s.close()
         exc = raises(_ssl.SSLError, ss.write, "data")
-        assert exc.value.message == "Underlying socket has been closed."
+        assert exc.value.strerror == "Underlying socket has been closed."
 
 
 class AppTestConnectedSSL:
@@ -90,8 +90,8 @@
         cls.space = space
 
     def setup_method(self, method):
-        # https://codespeak.net/
-        ADDR = "codespeak.net", 443
+        # https://www.verisign.net/
+        ADDR = "www.verisign.net", 443
 
         self.w_s = self.space.appexec([self.space.wrap(ADDR)], """(ADDR):
             import socket
@@ -146,6 +146,7 @@
         data = ss.read(10)
         assert isinstance(data, str)
         assert len(data) == 10
+        assert ss.pending() > 50 # many more bytes to read
         self.s.close()
 
     def test_shutdown(self):
diff --git a/pypy/module/cpyext/__init__.py b/pypy/module/cpyext/__init__.py
--- a/pypy/module/cpyext/__init__.py
+++ b/pypy/module/cpyext/__init__.py
@@ -12,9 +12,21 @@
     appleveldefs = {
     }
 
+    atexit_funcs = []
+
     def startup(self, space):
         space.fromcache(State).startup(space)
 
+    def register_atexit(self, function):
+        if len(self.atexit_funcs) >= 32:
+            raise ValueError("cannot register more than 32 atexit functions")
+        self.atexit_funcs.append(function)
+
+    def shutdown(self, space):
+        for func in self.atexit_funcs:
+            func()
+
+
 # import these modules to register api functions by side-effect
 import pypy.module.cpyext.thread
 import pypy.module.cpyext.pyobject
diff --git a/pypy/module/cpyext/import_.py b/pypy/module/cpyext/import_.py
--- a/pypy/module/cpyext/import_.py
+++ b/pypy/module/cpyext/import_.py
@@ -73,3 +73,10 @@
         w_mod = Module(space, space.wrap(modulename))
     return borrow_from(None, w_mod)
 
+ at cpython_api([], PyObject)
+def PyImport_GetModuleDict(space):
+    """Return the dictionary used for the module administration (a.k.a.
+    sys.modules).  Note that this is a per-interpreter variable."""
+    w_modulesDict = space.sys.get('modules')
+    return borrow_from(None, w_modulesDict)
+
diff --git a/pypy/module/cpyext/number.py b/pypy/module/cpyext/number.py
--- a/pypy/module/cpyext/number.py
+++ b/pypy/module/cpyext/number.py
@@ -40,8 +40,7 @@
 @cpython_api([PyObject], PyObject)
 def PyNumber_Int(space, w_obj):
     """Returns the o converted to an integer object on success, or NULL on failure.
-    If the argument is outside the integer range a long object will be returned
-    instead. This is the equivalent of the Python expression int(o)."""
+    This is the equivalent of the Python expression int(o)."""
     return space.int(w_obj)
 
 @cpython_api([PyObject], PyObject)
diff --git a/pypy/module/cpyext/pyfile.py b/pypy/module/cpyext/pyfile.py
--- a/pypy/module/cpyext/pyfile.py
+++ b/pypy/module/cpyext/pyfile.py
@@ -1,8 +1,7 @@
 from pypy.rpython.lltypesystem import rffi, lltype
 from pypy.module.cpyext.api import (
     cpython_api, CONST_STRING, FILEP, build_type_checkers)
-from pypy.module.cpyext.pyobject import (
-    PyObject)
+from pypy.module.cpyext.pyobject import PyObject, borrow_from
 from pypy.interpreter.error import OperationError
 from pypy.module._file.interp_file import W_File
 
@@ -66,3 +65,7 @@
     space.call_method(w_p, "write", w_s)
     return 0
 
+ at cpython_api([PyObject], PyObject)
+def PyFile_Name(space, w_p):
+    """Return the name of the file specified by p as a string object."""
+    return borrow_from(w_p, space.getattr(w_p, space.wrap("name")))
\ No newline at end of file
diff --git a/pypy/module/cpyext/pythonrun.py b/pypy/module/cpyext/pythonrun.py
--- a/pypy/module/cpyext/pythonrun.py
+++ b/pypy/module/cpyext/pythonrun.py
@@ -14,3 +14,21 @@
     value."""
     return space.fromcache(State).get_programname()
 
+ at cpython_api([lltype.Ptr(lltype.FuncType([], lltype.Void))], rffi.INT_real, error=-1)
+def Py_AtExit(space, func_ptr):
+    """Register a cleanup function to be called by Py_Finalize().  The cleanup
+    function will be called with no arguments and should return no value.  At
+    most 32 cleanup functions can be registered.  When the registration is
+    successful, Py_AtExit() returns 0; on failure, it returns -1.  The cleanup
+    function registered last is called first. Each cleanup function will be
+    called at most once.  Since Python's internal finalization will have
+    completed before the cleanup function, no Python APIs should be called by
+    func."""
+    from pypy.module import cpyext
+    w_module = space.getbuiltinmodule('cpyext')
+    module = space.interp_w(cpyext.Module, w_module)
+    try:
+        module.register_atexit(func_ptr)
+    except ValueError:
+        return -1
+    return 0
diff --git a/pypy/module/cpyext/sequence.py b/pypy/module/cpyext/sequence.py
--- a/pypy/module/cpyext/sequence.py
+++ b/pypy/module/cpyext/sequence.py
@@ -36,7 +36,6 @@
 def PySequence_Length(space, w_obj):
     return space.len_w(w_obj)
 
-
 @cpython_api([PyObject, CONST_STRING], PyObject)
 def PySequence_Fast(space, w_obj, m):
     """Returns the sequence o as a tuple, unless it is already a tuple or list, in
@@ -96,10 +95,21 @@
     return 0
 
 @cpython_api([PyObject, Py_ssize_t], PyObject)
+def PySequence_ITEM(space, w_obj, i):
+    """Return the ith element of o or NULL on failure. Macro form of
+    PySequence_GetItem() but without checking that
+    PySequence_Check(o)() is true and without adjustment for negative
+    indices.
+
+    This function used an int type for i. This might require
+    changes in your code for properly supporting 64-bit systems."""
+    return space.getitem(w_obj, space.wrap(i))
+
+ at cpython_api([PyObject, Py_ssize_t], PyObject)
 def PySequence_GetItem(space, w_obj, i):
     """Return the ith element of o, or NULL on failure. This is the equivalent of
     the Python expression o[i]."""
-    return space.getitem(w_obj, space.wrap(i))
+    return PySequence_ITEM(space, w_obj, i)
 
 @cpython_api([PyObject], PyObject)
 def PySequence_List(space, w_obj):
@@ -154,3 +164,27 @@
     equivalent of the Python statement del o[i]."""
     space.delitem(w_o, space.wrap(i))
     return 0
+
+ at cpython_api([PyObject, PyObject], Py_ssize_t, error=-1)
+def PySequence_Index(space, w_seq, w_obj):
+    """Return the first index i for which o[i] == value.  On error, return
+    -1.    This is equivalent to the Python expression o.index(value).
+
+    This function returned an int type. This might require changes
+    in your code for properly supporting 64-bit systems."""
+
+    w_iter = space.iter(w_seq)
+    idx = 0
+    while True:
+        try:
+            w_next = space.next(w_iter)
+        except OperationError, e:
+            if e.match(space, space.w_StopIteration):
+                break
+            raise
+        if space.is_true(space.eq(w_next, w_obj)):
+            return idx
+        idx += 1
+
+    raise OperationError(space.w_ValueError, space.wrap(
+        "sequence.index(x): x not in sequence"))
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -47,7 +47,7 @@
     allows for complicated memory sharing possibilities, but some caller may
     not be able to handle all the complexity but may want to see if the
     exporter will let them take a simpler view to its memory.
-    
+
     Some exporters may not be able to share memory in every possible way and
     may need to raise errors to signal to some consumers that something is
     just not possible. These errors should be a BufferError unless
@@ -55,17 +55,17 @@
     exporter can use flags information to simplify how much of the
     Py_buffer structure is filled in with non-default values and/or
     raise an error if the object can't support a simpler view of its memory.
-    
+
     0 is returned on success and -1 on error.
-    
+
     The following table gives possible values to the flags arguments.
-    
+
     Flag
-    
+
     Description
-    
+
     PyBUF_SIMPLE
-    
+
     This is the default flag state.  The returned
     buffer may or may not have writable memory.  The
     format of the data will be assumed to be unsigned
@@ -73,14 +73,14 @@
     never needs to be '|'d to the others. The exporter
     will raise an error if it cannot provide such a
     contiguous buffer of bytes.
-    
+
     PyBUF_WRITABLE
-    
+
     The returned buffer must be writable.  If it is
     not writable, then raise an error.
-    
+
     PyBUF_STRIDES
-    
+
     This implies PyBUF_ND. The returned
     buffer must provide strides information (i.e. the
     strides cannot be NULL). This would be used when
@@ -89,20 +89,20 @@
     you can handle shape.  The exporter can raise an
     error if a strided representation of the data is
     not possible (i.e. without the suboffsets).
-    
+
     PyBUF_ND
-    
+
     The returned buffer must provide shape
     information. The memory will be assumed C-style
     contiguous (last dimension varies the
     fastest). The exporter may raise an error if it
     cannot provide this kind of contiguous buffer. If
     this is not given then shape will be NULL.
-    
+
     PyBUF_C_CONTIGUOUS
     PyBUF_F_CONTIGUOUS
     PyBUF_ANY_CONTIGUOUS
-    
+
     These flags indicate that the contiguity returned
     buffer must be respectively, C-contiguous (last
     dimension varies the fastest), Fortran contiguous
@@ -111,18 +111,18 @@
     PyBUF_STRIDES and guarantee that the
     strides buffer info structure will be filled in
     correctly.
-    
+
     PyBUF_INDIRECT
-    
+
     This flag indicates the returned buffer must have
     suboffsets information (which can be NULL if no
     suboffsets are needed).  This can be used when
     the consumer can handle indirect array
     referencing implied by these suboffsets. This
     implies PyBUF_STRIDES.
-    
+
     PyBUF_FORMAT
-    
+
     The returned buffer must have true format
     information if this flag is provided. This would
     be used when the consumer is going to be checking
@@ -132,43 +132,43 @@
     explicitly requested then the format must be
     returned as NULL (which means 'B', or
     unsigned bytes)
-    
+
     PyBUF_STRIDED
-    
+
     This is equivalent to (PyBUF_STRIDES |
     PyBUF_WRITABLE).
-    
+
     PyBUF_STRIDED_RO
-    
+
     This is equivalent to (PyBUF_STRIDES).
-    
+
     PyBUF_RECORDS
-    
+
     This is equivalent to (PyBUF_STRIDES |
     PyBUF_FORMAT | PyBUF_WRITABLE).
-    
+
     PyBUF_RECORDS_RO
-    
+
     This is equivalent to (PyBUF_STRIDES |
     PyBUF_FORMAT).
-    
+
     PyBUF_FULL
-    
+
     This is equivalent to (PyBUF_INDIRECT |
     PyBUF_FORMAT | PyBUF_WRITABLE).
-    
+
     PyBUF_FULL_RO
-    
+
     This is equivalent to (PyBUF_INDIRECT |
     PyBUF_FORMAT).
-    
+
     PyBUF_CONTIG
-    
+
     This is equivalent to (PyBUF_ND |
     PyBUF_WRITABLE).
-    
+
     PyBUF_CONTIG_RO
-    
+
     This is equivalent to (PyBUF_ND)."""
     raise NotImplementedError
 
@@ -251,7 +251,7 @@
 def PyByteArray_FromObject(space, o):
     """Return a new bytearray object from any object, o, that implements the
     buffer protocol.
-    
+
     XXX expand about the buffer protocol, at least somewhere"""
     raise NotImplementedError
 
@@ -354,7 +354,7 @@
 @cpython_api([PyObject], rffi.INT_real, error=-1)
 def PyCodec_Register(space, search_function):
     """Register a new codec search function.
-    
+
     As side effect, this tries to load the encodings package, if not yet
     done, to make sure that it is always first in the list of search functions."""
     raise NotImplementedError
@@ -362,7 +362,7 @@
 @cpython_api([PyObject, rffi.CCHARP, rffi.CCHARP], PyObject)
 def PyCodec_Encode(space, object, encoding, errors):
     """Generic codec based encoding API.
-    
+
     object is passed through the encoder function found for the given
     encoding using the error handling method defined by errors.  errors may
     be NULL to use the default method defined for the codec.  Raises a
@@ -372,7 +372,7 @@
 @cpython_api([PyObject, rffi.CCHARP, rffi.CCHARP], PyObject)
 def PyCodec_Decode(space, object, encoding, errors):
     """Generic codec based decoding API.
-    
+
     object is passed through the decoder function found for the given
     encoding using the error handling method defined by errors.  errors may
     be NULL to use the default method defined for the codec.  Raises a
@@ -405,7 +405,7 @@
     This callback function will be called by a codec when it encounters
     unencodable characters/undecodable bytes and name is specified as the error
     parameter in the call to the encode/decode function.
-    
+
     The callback gets a single argument, an instance of
     UnicodeEncodeError, UnicodeDecodeError or
     UnicodeTranslateError that holds information about the problematic
@@ -415,7 +415,7 @@
     containing the replacement for the problematic sequence, and an integer
     giving the offset in the original string at which encoding/decoding should be
     resumed.
-    
+
     Return 0 on success, -1 on error."""
     raise NotImplementedError
 
@@ -500,18 +500,18 @@
     the set of strings accepted by Python's float() constructor,
     except that s must not have leading or trailing whitespace.
     The conversion is independent of the current locale.
-    
+
     If endptr is NULL, convert the whole string.  Raise
     ValueError and return -1.0 if the string is not a valid
     representation of a floating-point number.
-    
+
     If endptr is not NULL, convert as much of the string as
     possible and set *endptr to point to the first unconverted
     character.  If no initial segment of the string is the valid
     representation of a floating-point number, set *endptr to point
     to the beginning of the string, raise ValueError, and return
     -1.0.
-    
+
     If s represents a value that is too large to store in a float
     (for example, "1e500" is such a string on many platforms) then
     if overflow_exception is NULL return Py_HUGE_VAL (with
@@ -519,7 +519,7 @@
     overflow_exception must point to a Python exception object;
     raise that exception and return -1.0.  In both cases, set
     *endptr to point to the first character after the converted value.
-    
+
     If any other error occurs during the conversion (for example an
     out-of-memory error), set the appropriate Python exception and
     return -1.0.
@@ -531,12 +531,12 @@
     """Convert a string to a double. This function behaves like the Standard C
     function strtod() does in the C locale. It does this without changing the
     current locale, since that would not be thread-safe.
-    
+
     PyOS_ascii_strtod() should typically be used for reading configuration
     files or other non-user input that should be locale independent.
-    
+
     See the Unix man page strtod(2) for details.
-    
+
     Use PyOS_string_to_double() instead."""
     raise NotImplementedError
 
@@ -546,10 +546,10 @@
     separator. format is a printf()-style format string specifying the
     number format. Allowed conversion characters are 'e', 'E', 'f',
     'F', 'g' and 'G'.
-    
+
     The return value is a pointer to buffer with the converted string or NULL if
     the conversion failed.
-    
+
     This function is removed in Python 2.7 and 3.1.  Use PyOS_double_to_string()
     instead."""
     raise NotImplementedError
@@ -558,29 +558,29 @@
 def PyOS_double_to_string(space, val, format_code, precision, flags, ptype):
     """Convert a double val to a string using supplied
     format_code, precision, and flags.
-    
+
     format_code must be one of 'e', 'E', 'f', 'F',
     'g', 'G' or 'r'.  For 'r', the supplied precision
     must be 0 and is ignored.  The 'r' format code specifies the
     standard repr() format.
-    
+
     flags can be zero or more of the values Py_DTSF_SIGN,
     Py_DTSF_ADD_DOT_0, or Py_DTSF_ALT, or-ed together:
-    
+
     Py_DTSF_SIGN means to always precede the returned string with a sign
     character, even if val is non-negative.
-    
+
     Py_DTSF_ADD_DOT_0 means to ensure that the returned string will not look
     like an integer.
-    
+
     Py_DTSF_ALT means to apply "alternate" formatting rules.  See the
     documentation for the PyOS_snprintf() '#' specifier for
     details.
-    
+
     If ptype is non-NULL, then the value it points to will be set to one of
     Py_DTST_FINITE, Py_DTST_INFINITE, or Py_DTST_NAN, signifying that
     val is a finite number, an infinite number, or not a number, respectively.
-    
+
     The return value is a pointer to buffer with the converted string or
     NULL if the conversion failed. The caller is responsible for freeing the
     returned string by calling PyMem_Free().
@@ -590,9 +590,9 @@
 @cpython_api([rffi.CCHARP], rffi.DOUBLE, error=CANNOT_FAIL)
 def PyOS_ascii_atof(space, nptr):
     """Convert a string to a double in a locale-independent way.
-    
+
     See the Unix man page atof(2) for details.
-    
+
     Use PyOS_string_to_double() instead."""
     raise NotImplementedError
 
@@ -683,7 +683,7 @@
     override is true, else the first wins. Return 0 on success or -1
     if an exception was raised. Equivalent Python (except for the return
     value):
-    
+
     def PyDict_MergeFromSeq2(a, seq2, override):
         for key, value in seq2:
             if override or key not in a:
@@ -708,7 +708,7 @@
 def PyErr_SetExcFromWindowsErr(space, type, ierr):
     """Similar to PyErr_SetFromWindowsErr(), with an additional parameter
     specifying the exception type to be raised. Availability: Windows.
-    
+
     Return value: always NULL."""
     raise NotImplementedError
 
@@ -724,7 +724,7 @@
 def PyErr_SetExcFromWindowsErrWithFilename(space, type, ierr, filename):
     """Similar to PyErr_SetFromWindowsErrWithFilename(), with an additional
     parameter specifying the exception type to be raised. Availability: Windows.
-    
+
     Return value: always NULL."""
     raise NotImplementedError
 
@@ -815,15 +815,15 @@
 @cpython_api([rffi.CCHARP], rffi.INT_real, error=1)
 def Py_EnterRecursiveCall(space, where):
     """Marks a point where a recursive C-level call is about to be performed.
-    
+
     If USE_STACKCHECK is defined, this function checks if the the OS
     stack overflowed using PyOS_CheckStack().  In this is the case, it
     sets a MemoryError and returns a nonzero value.
-    
+
     The function then checks if the recursion limit is reached.  If this is the
     case, a RuntimeError is set and a nonzero value is returned.
     Otherwise, zero is returned.
-    
+
     where should be a string such as " in instance check" to be
     concatenated to the RuntimeError message caused by the recursion depth
     limit."""
@@ -843,12 +843,12 @@
     Callers of this must call PyFile_DecUseCount() when they are
     finished with the FILE*.  Otherwise the file object will
     never be closed by Python.
-    
+
     The GIL must be held while calling this function.
-    
+
     The suggested use is to call this after PyFile_AsFile() and before
     you release the GIL:
-    
+
     FILE *fp = PyFile_AsFile(p);
     PyFile_IncUseCount(p);
     /* ... */
@@ -865,18 +865,12 @@
     """Decrements the PyFileObject's internal unlocked_count member to
     indicate that the caller is done with its own use of the FILE*.
     This may only be called to undo a prior call to PyFile_IncUseCount().
-    
+
     The GIL must be held while calling this function (see the example
     above).
     """
     raise NotImplementedError
 
- at cpython_api([PyObject], PyObject)
-def PyFile_Name(space, p):
-    """Return the name of the file specified by p as a string object."""
-    borrow_from()
-    raise NotImplementedError
-
 @cpython_api([PyFileObject, rffi.CCHARP], rffi.INT_real, error=0)
 def PyFile_SetEncoding(space, p, enc):
     """Set the file's encoding for Unicode output to enc. Return 1 on success and 0
@@ -944,10 +938,10 @@
 def PyFloat_AsString(space, buf, v):
     """Convert the argument v to a string, using the same rules as
     str(). The length of buf should be at least 100.
-    
+
     This function is unsafe to call because it writes to a buffer whose
     length it does not know.
-    
+
     Use PyObject_Str() or PyOS_double_to_string() instead."""
     raise NotImplementedError
 
@@ -955,10 +949,10 @@
 def PyFloat_AsReprString(space, buf, v):
     """Same as PyFloat_AsString, except uses the same rules as
     repr().  The length of buf should be at least 100.
-    
+
     This function is unsafe to call because it writes to a buffer whose
     length it does not know.
-    
+
     Use PyObject_Repr() or PyOS_double_to_string() instead."""
     raise NotImplementedError
 
@@ -966,7 +960,7 @@
 def PyFunction_New(space, code, globals):
     """Return a new function object associated with the code object code. globals
     must be a dictionary with the global variables accessible to the function.
-    
+
     The function's docstring, name and __module__ are retrieved from the code
     object, the argument defaults and closure are set to NULL."""
     raise NotImplementedError
@@ -1002,7 +996,7 @@
 def PyFunction_SetDefaults(space, op, defaults):
     """Set the argument default values for the function object op. defaults must be
     Py_None or a tuple.
-    
+
     Raises SystemError and returns -1 on failure."""
     raise NotImplementedError
 
@@ -1017,7 +1011,7 @@
 def PyFunction_SetClosure(space, op, closure):
     """Set the closure associated with the function object op. closure must be
     Py_None or a tuple of cell objects.
-    
+
     Raises SystemError and returns -1 on failure."""
     raise NotImplementedError
 
@@ -1025,7 +1019,7 @@
 def PyObject_GC_NewVar(space, type, size):
     """Analogous to PyObject_NewVar() but for container objects with the
     Py_TPFLAGS_HAVE_GC flag set.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -1034,7 +1028,7 @@
 def PyObject_GC_Resize(space, op, newsize):
     """Resize an object allocated by PyObject_NewVar().  Returns the
     resized object or NULL on failure.
-    
+
     This function used an int type for newsize. This might
     require changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -1074,15 +1068,15 @@
     """Import a module.  This is best described by referring to the built-in
     Python function __import__(), as the standard __import__() function calls
     this function directly.
-    
+
     The return value is a new reference to the imported module or top-level package,
     or NULL with an exception set on failure (before Python 2.4, the module may
     still be created in this case).  Like for __import__(), the return value
     when a submodule of a package was requested is normally the top-level package,
     unless a non-empty fromlist was given.
-    
+
     Failing imports remove incomplete module objects.
-    
+
     The function is an alias for PyImport_ImportModuleLevel() with
     -1 as level, meaning relative import."""
     raise NotImplementedError
@@ -1092,7 +1086,7 @@
     """Import a module.  This is best described by referring to the built-in Python
     function __import__(), as the standard __import__() function calls
     this function directly.
-    
+
     The return value is a new reference to the imported module or top-level package,
     or NULL with an exception set on failure.  Like for __import__(),
     the return value when a submodule of a package was requested is normally the
@@ -1120,16 +1114,16 @@
     incompletely initialized modules in sys.modules is dangerous, as imports of
     such modules have no way to know that the module object is an unknown (and
     probably damaged with respect to the module author's intents) state.
-    
+
     The module's __file__ attribute will be set to the code object's
     co_filename.
-    
+
     This function will reload the module if it was already imported.  See
     PyImport_ReloadModule() for the intended way to reload a module.
-    
+
     If name points to a dotted name of the form package.module, any package
     structures not already created will still not be created.
-    
+
     name is removed from sys.modules in error cases."""
     raise NotImplementedError
 
@@ -1250,7 +1244,7 @@
     allocated by the Python interpreter.  This is a no-op when called for a second
     time (without calling Py_Initialize() again first).  There is no return
     value; errors during finalization are ignored.
-    
+
     This function is provided for a number of reasons.  An embedding application
     might want to restart Python without having to restart the application itself.
     An application that has loaded the Python interpreter from a dynamically
@@ -1258,7 +1252,7 @@
     before unloading the DLL. During a hunt for memory leaks in an application a
     developer might want to free all memory allocated by Python before exiting from
     the application.
-    
+
     Bugs and caveats: The destruction of modules and objects in modules is done
     in random order; this may cause destructors (__del__() methods) to fail
     when they depend on other objects (even functions) or modules.  Dynamically
@@ -1308,13 +1302,13 @@
     variable in the top-level Makefile and the --exec-prefix
     argument to the configure script at build  time.  The value is
     available to Python code as sys.exec_prefix.  It is only useful on Unix.
-    
+
     Background: The exec-prefix differs from the prefix when platform dependent
     files (such as executables and shared libraries) are installed in a different
     directory tree.  In a typical installation, platform dependent files may be
     installed in the /usr/local/plat subtree while platform independent may
     be installed in /usr/local.
-    
+
     Generally speaking, a platform is a combination of hardware and software
     families, e.g.  Sparc machines running the Solaris 2.x operating system are
     considered the same platform, but Intel machines running Solaris 2.x are another
@@ -1325,7 +1319,7 @@
     meaningless, and set to the empty string. Note that compiled Python bytecode
     files are platform independent (but not independent from the Python version by
     which they were compiled!).
-    
+
     System administrators will know how to configure the mount or
     automount programs to share /usr/local between platforms
     while having /usr/local/plat be a different filesystem for each
@@ -1351,7 +1345,7 @@
     storage; the caller should not modify its value.  The list sys.path is
     initialized with this value on interpreter startup; it can be (and usually
     is) modified later to change the search path for loading modules.
-    
+
     XXX should give the exact rules"""
     raise NotImplementedError
 
@@ -1359,9 +1353,9 @@
 def Py_GetVersion(space):
     """Return the version of this Python interpreter.  This is a string that looks
     something like
-    
+
     "1.5 (\#67, Dec 31 1997, 22:34:28) [GCC 2.7.2.2]"
-    
+
     The first word (up to the first space character) is the current Python version;
     the first three characters are the major and minor version separated by a
     period.  The returned string points into static storage; the caller should not
@@ -1382,9 +1376,9 @@
 @cpython_api([], rffi.CCHARP)
 def Py_GetCopyright(space):
     """Return the official copyright string for the current Python version, for example
-    
+
     'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'
-    
+
     The returned string points into static storage; the caller should not modify its
     value.  The value is available to Python code as sys.copyright."""
     raise NotImplementedError
@@ -1393,9 +1387,9 @@
 def Py_GetCompiler(space):
     """Return an indication of the compiler used to build the current Python version,
     in square brackets, for example:
-    
+
     "[GCC 2.7.2.2]"
-    
+
     The returned string points into static storage; the caller should not modify its
     value.  The value is available to Python code as part of the variable
     sys.version."""
@@ -1405,9 +1399,9 @@
 def Py_GetBuildInfo(space):
     """Return information about the sequence number and build date and time  of the
     current Python interpreter instance, for example
-    
+
     "\#67, Aug  1 1997, 22:34:28"
-    
+
     The returned string points into static storage; the caller should not modify its
     value.  The value is available to Python code as part of the variable
     sys.version."""
@@ -1422,31 +1416,31 @@
     will be run, the first entry in argv can be an empty string.  If this
     function fails to initialize sys.argv, a fatal condition is signalled using
     Py_FatalError().
-    
+
     If updatepath is zero, this is all the function does.  If updatepath
     is non-zero, the function also modifies sys.path according to the
     following algorithm:
-    
+
     If the name of an existing script is passed in argv[0], the absolute
     path of the directory where the script is located is prepended to
     sys.path.
-    
+
     Otherwise (that is, if argc is 0 or argv[0] doesn't point
     to an existing file name), an empty string is prepended to
     sys.path, which is the same as prepending the current working
     directory (".").
-    
+
     It is recommended that applications embedding the Python interpreter
     for purposes other than executing a single script pass 0 as updatepath,
     and update sys.path themselves if desired.
     See CVE-2008-5983.
-    
+
     On versions before 2.6.6, you can achieve the same effect by manually
     popping the first sys.path element after having called
     PySys_SetArgv(), for example using:
-    
+
     PyRun_SimpleString("import sys; sys.path.pop(0)\n");
-    
+
     XXX impl. doesn't seem consistent in allowing 0/NULL for the params;
     check w/ Guido."""
     raise NotImplementedError
@@ -1461,7 +1455,7 @@
     """Set the default "home" directory, that is, the location of the standard
     Python libraries.  See PYTHONHOME for the meaning of the
     argument string.
-    
+
     The argument should point to a zero-terminated character string in static
     storage whose contents will not change for the duration of the program's
     execution.  No code in the Python interpreter will change the contents of
@@ -1509,7 +1503,7 @@
     the dictionary.  It is okay to call this function when no current thread state
     is available. If this function returns NULL, no exception has been raised and
     the caller should assume no current thread state is available.
-    
+
     Previously this could only be called when a current thread is active, and NULL
     meant that an exception was raised."""
     borrow_from()
@@ -1531,7 +1525,7 @@
 def PyEval_AcquireLock(space):
     """Acquire the global interpreter lock.  The lock must have been created earlier.
     If this thread already has the lock, a deadlock ensues.
-    
+
     This function does not change the current thread state.  Please use
     PyEval_RestoreThread() or PyEval_AcquireThread()
     instead."""
@@ -1540,7 +1534,7 @@
 @cpython_api([], lltype.Void)
 def PyEval_ReleaseLock(space):
     """Release the global interpreter lock.  The lock must have been created earlier.
-    
+
     This function does not change the current thread state.  Please use
     PyEval_SaveThread() or PyEval_ReleaseThread()
     instead."""
@@ -1556,7 +1550,7 @@
     separate.  The new environment has no sys.argv variable.  It has new standard
     I/O stream file objects sys.stdin, sys.stdout and sys.stderr (however these
     refer to the same underlying file descriptors).
-    
+
     The return value points to the first thread state created in the new
     sub-interpreter.  This thread state is made in the current thread state.
     Note that no actual thread is created; see the discussion of thread states
@@ -1567,7 +1561,7 @@
     calling this function and is still held when it returns; however, unlike most
     other Python/C API functions, there needn't be a current thread state on
     entry.)
-    
+
     Extension modules are shared between (sub-)interpreters as follows: the first
     time a particular extension is imported, it is initialized normally, and a
     (shallow) copy of its module's dictionary is squirreled away.  When the same
@@ -1601,11 +1595,11 @@
     asynchronous notification recursively, but it can still be interrupted to
     switch threads if the global interpreter lock is released, for example, if it
     calls back into Python code.
-    
+
     This function returns 0 on success in which case the notification has been
     scheduled.  Otherwise, for example if the notification buffer is full, it
     returns -1 without setting any exception.
-    
+
     This function can be called on any thread, be it a Python thread or some
     other system thread.  If it is a Python thread, it doesn't matter if it holds
     the global interpreter lock or not.
@@ -1633,62 +1627,62 @@
 def PyEval_GetCallStats(space, self):
     """Return a tuple of function call counts.  There are constants defined for the
     positions within the tuple:
-    
+
     Name
-    
+
     Value
-    
+
     PCALL_ALL
-    
+
     0
-    
+
     PCALL_FUNCTION
-    
+
     1
-    
+
     PCALL_FAST_FUNCTION
-    
+
     2
-    
+
     PCALL_FASTER_FUNCTION
-    
+
     3
-    
+
     PCALL_METHOD
-    
+
     4
-    
+
     PCALL_BOUND_METHOD
-    
+
     5
-    
+
     PCALL_CFUNCTION
-    
+
     6
-    
+
     PCALL_TYPE
-    
+
     7
-    
+
     PCALL_GENERATOR
-    
+
     8
-    
+
     PCALL_OTHER
-    
+
     9
-    
+
     PCALL_POP
-    
+
     10
-    
+
     PCALL_FAST_FUNCTION means no argument tuple needs to be created.
     PCALL_FASTER_FUNCTION means that the fast-path frame setup code is used.
-    
+
     If there is a method call where the call can be optimized by changing
     the argument tuple and calling the function directly, it gets recorded
     twice.
-    
+
     This function is only present if Python is compiled with CALL_PROFILE
     defined."""
     raise NotImplementedError
@@ -1747,7 +1741,7 @@
     and high.  Return NULL and set an exception if unsuccessful.  Analogous
     to list[low:high].  Negative indices, as when slicing from Python, are not
     supported.
-    
+
     This function used an int for low and high. This might
     require changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -1773,7 +1767,7 @@
     gives the number of characters, and base is the radix for the conversion.  The
     radix must be in the range [2, 36]; if it is out of range, ValueError
     will be raised.
-    
+
     This function used an int for length. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -1803,21 +1797,21 @@
     """Marshal a long integer, value, to file.  This will only write
     the least-significant 32 bits of value; regardless of the size of the
     native long type.
-    
+
     version indicates the file format."""
     raise NotImplementedError
 
 @cpython_api([PyObject, FILE, rffi.INT_real], lltype.Void)
 def PyMarshal_WriteObjectToFile(space, value, file, version):
     """Marshal a Python object, value, to file.
-    
+
     version indicates the file format."""
     raise NotImplementedError
 
 @cpython_api([PyObject, rffi.INT_real], PyObject)
 def PyMarshal_WriteObjectToString(space, value, version):
     """Return a string object containing the marshalled representation of value.
-    
+
     version indicates the file format."""
     raise NotImplementedError
 
@@ -1860,7 +1854,7 @@
     containing len bytes pointed to by string.  On error, sets the
     appropriate exception (EOFError or TypeError) and returns
     NULL.
-    
+
     This function used an int type for len. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2012,7 +2006,7 @@
     """Return the result of repeating sequence object o count times, or NULL on
     failure.  The operation is done in-place when o supports it.  This is the
     equivalent of the Python expression o *= count.
-    
+
     This function used an int type for count. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2022,16 +2016,7 @@
     """Return the number of occurrences of value in o, that is, return the number
     of keys for which o[key] == value.  On failure, return -1.  This is
     equivalent to the Python expression o.count(value).
-    
-    This function returned an int type. This might require changes
-    in your code for properly supporting 64-bit systems."""
-    raise NotImplementedError
-
- at cpython_api([PyObject, PyObject], Py_ssize_t, error=-1)
-def PySequence_Index(space, o, value):
-    """Return the first index i for which o[i] == value.  On error, return
-    -1.    This is equivalent to the Python expression o.index(value).
-    
+
     This function returned an int type. This might require changes
     in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2040,24 +2025,13 @@
 def PySequence_Fast_ITEMS(space, o):
     """Return the underlying array of PyObject pointers.  Assumes that o was returned
     by PySequence_Fast() and o is not NULL.
-    
+
     Note, if a list gets resized, the reallocation may relocate the items array.
     So, only use the underlying array pointer in contexts where the sequence
     cannot change.
     """
     raise NotImplementedError
 
- at cpython_api([PyObject, Py_ssize_t], PyObject)
-def PySequence_ITEM(space, o, i):
-    """Return the ith element of o or NULL on failure. Macro form of
-    PySequence_GetItem() but without checking that
-    PySequence_Check(o)() is true and without adjustment for negative
-    indices.
-    
-    This function used an int type for i. This might require
-    changes in your code for properly supporting 64-bit systems."""
-    raise NotImplementedError
-
 @cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
 def PySet_Check(space, p):
     """Return true if p is a set object or an instance of a subtype.
@@ -2104,7 +2078,7 @@
     The iterable may be NULL to create a new empty frozenset.  Return the new
     set on success or NULL on failure.  Raise TypeError if iterable is
     not actually iterable.
-    
+
     Now guaranteed to return a brand-new frozenset.  Formerly,
     frozensets of zero-length were a singleton.  This got in the way of
     building-up new frozensets with PySet_Add()."""
@@ -2115,7 +2089,7 @@
     """Return the length of a set or frozenset object. Equivalent to
     len(anyset).  Raises a PyExc_SystemError if anyset is not a set, frozenset,
     or an instance of a subtype.
-    
+
     This function returned an int. This might require changes in
     your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2141,7 +2115,7 @@
     the key is unhashable. Raise a MemoryError if there is no room to grow.
     Raise a SystemError if set is an not an instance of set or its
     subtype.
-    
+
     Now works with instances of frozenset or its subtypes.
     Like PyTuple_SetItem() in that it can be used to fill-in the
     values of brand new frozensets before they are exposed to other code."""
@@ -2181,7 +2155,7 @@
     though there is a lot of talk about reference counts, think of this function as
     reference-count-neutral; you own the object after the call if and only if you
     owned it before the call.)
-    
+
     This function is not available in 3.x and does not have a PyBytes alias."""
     raise NotImplementedError
 
@@ -2192,9 +2166,9 @@
     as the parameters of the same name in the unicode() built-in function.
     The codec to be used is looked up using the Python codec registry.  Return
     NULL if an exception was raised by the codec.
-    
+
     This function is not available in 3.x and does not have a PyBytes alias.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2206,7 +2180,7 @@
     meaning as the parameters of the same name in the string encode() method.
     The codec to be used is looked up using the Python codec registry. Return NULL
     if an exception was raised by the codec.
-    
+
     This function is not available in 3.x and does not have a PyBytes alias."""
     raise NotImplementedError
 
@@ -2217,9 +2191,9 @@
     have the same meaning as the parameters of the same name in the string
     encode() method. The codec to be used is looked up using the Python codec
     registry.  Return NULL if an exception was raised by the codec.
-    
+
     This function is not available in 3.x and does not have a PyBytes alias.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2280,23 +2254,11 @@
     standard C library function exit(status)."""
     raise NotImplementedError
 
- at cpython_api([rffi.VOIDP], rffi.INT_real, error=-1)
-def Py_AtExit(space, func):
-    """Register a cleanup function to be called by Py_Finalize().  The cleanup
-    function will be called with no arguments and should return no value.  At
-    most 32 cleanup functions can be registered.  When the registration is
-    successful, Py_AtExit() returns 0; on failure, it returns -1.  The cleanup
-    function registered last is called first. Each cleanup function will be
-    called at most once.  Since Python's internal finalization will have
-    completed before the cleanup function, no Python APIs should be called by
-    func."""
-    raise NotImplementedError
-
 @cpython_api([PyObject, Py_ssize_t, Py_ssize_t], PyObject)
 def PyTuple_GetSlice(space, p, low, high):
     """Take a slice of the tuple pointed to by p from low to high and return it
     as a new tuple.
-    
+
     This function used an int type for low and high. This might
     require changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2384,93 +2346,93 @@
     a string with the values formatted into it.  The variable arguments must be C
     types and must correspond exactly to the format characters in the format
     string.  The following format characters are allowed:
-    
+
     Format Characters
-    
+
     Type
-    
+
     Comment
-    
+
     %%
-    
+
     n/a
-    
+
     The literal % character.
-    
+
     %c
-    
+
     int
-    
+
     A single character,
     represented as an C int.
-    
+
     %d
-    
+
     int
-    
+
     Exactly equivalent to
     printf("%d").
-    
+
     %u
-    
+
     unsigned int
-    
+
     Exactly equivalent to
     printf("%u").
-    
+
     %ld
-    
+
     long
-    
+
     Exactly equivalent to
     printf("%ld").
-    
+
     %lu
-    
+
     unsigned long
-    
+
     Exactly equivalent to
     printf("%lu").
-    
+
     %zd
-    
+
     Py_ssize_t
-    
+
     Exactly equivalent to
     printf("%zd").
-    
+
     %zu
-    
+
     size_t
-    
+
     Exactly equivalent to
     printf("%zu").
-    
+
     %i
-    
+
     int
-    
+
     Exactly equivalent to
     printf("%i").
-    
+
     %x
-    
+
     int
-    
+
     Exactly equivalent to
     printf("%x").
-    
+
     %s
-    
+
     char*
-    
+
     A null-terminated C character
     array.
-    
+
     %p
-    
+
     void*
-    
+
     The hex representation of a C
     pointer. Mostly equivalent to
     printf("%p") except that
@@ -2478,38 +2440,38 @@
     the literal 0x regardless
     of what the platform's
     printf yields.
-    
+
     %U
-    
+
     PyObject*
-    
+
     A unicode object.
-    
+
     %V
-    
+
     PyObject*, char *
-    
+
     A unicode object (which may be
     NULL) and a null-terminated
     C character array as a second
     parameter (which will be used,
     if the first parameter is
     NULL).
-    
+
     %S
-    
+
     PyObject*
-    
+
     The result of calling
     PyObject_Unicode().
-    
+
     %R
-    
+
     PyObject*
-    
+
     The result of calling
     PyObject_Repr().
-    
+
     An unrecognized format character causes all the rest of the format string to be
     copied as-is to the result string, and any extra arguments discarded.
     """
@@ -2529,7 +2491,7 @@
     of the same name in the Unicode encode() method.  The codec to be used is
     looked up using the Python codec registry.  Return NULL if an exception was
     raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2540,7 +2502,7 @@
     consumed is not NULL, trailing incomplete UTF-8 byte sequences will not be
     treated as an error. Those bytes will not be decoded and the number of bytes
     that have been decoded will be stored in consumed.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2549,7 +2511,7 @@
 def PyUnicode_EncodeUTF8(space, s, size, errors):
     """Encode the Py_UNICODE buffer of the given size using UTF-8 and return a
     Python string object.  Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2559,26 +2521,26 @@
     """Decode length bytes from a UTF-32 encoded buffer string and return the
     corresponding Unicode object.  errors (if non-NULL) defines the error
     handling. It defaults to "strict".
-    
+
     If byteorder is non-NULL, the decoder starts decoding using the given byte
     order:
-    
+
     *byteorder == -1: little endian
     *byteorder == 0:  native order
     *byteorder == 1:  big endian
-    
+
     If *byteorder is zero, and the first four bytes of the input data are a
     byte order mark (BOM), the decoder switches to this byte order and the BOM is
     not copied into the resulting Unicode string.  If *byteorder is -1 or
     1, any byte order mark is copied to the output.
-    
+
     After completion, *byteorder is set to the current byte order at the end
     of input data.
-    
+
     In a narrow build codepoints outside the BMP will be decoded as surrogate pairs.
-    
+
     If byteorder is NULL, the codec starts in native order mode.
-    
+
     Return NULL if an exception was raised by the codec.
     """
     raise NotImplementedError
@@ -2597,17 +2559,17 @@
 def PyUnicode_EncodeUTF32(space, s, size, errors, byteorder):
     """Return a Python bytes object holding the UTF-32 encoded value of the Unicode
     data in s.  Output is written according to the following byte order:
-    
+
     byteorder == -1: little endian
     byteorder == 0:  native byte order (writes a BOM mark)
     byteorder == 1:  big endian
-    
+
     If byteorder is 0, the output string will always start with the Unicode BOM
     mark (U+FEFF). In the other two modes, no BOM mark is prepended.
-    
+
     If Py_UNICODE_WIDE is not defined, surrogate pairs will be output
     as a single codepoint.
-    
+
     Return NULL if an exception was raised by the codec.
     """
     raise NotImplementedError
@@ -2627,7 +2589,7 @@
     trailing incomplete UTF-16 byte sequences (such as an odd number of bytes or a
     split surrogate pair) as an error. Those bytes will not be decoded and the
     number of bytes that have been decoded will be stored in consumed.
-    
+
     This function used an int type for size and an int *
     type for consumed. This might require changes in your code for
     properly supporting 64-bit systems."""
@@ -2637,20 +2599,20 @@
 def PyUnicode_EncodeUTF16(space, s, size, errors, byteorder):
     """Return a Python string object holding the UTF-16 encoded value of the Unicode
     data in s.  Output is written according to the following byte order:
-    
+
     byteorder == -1: little endian
     byteorder == 0:  native byte order (writes a BOM mark)
     byteorder == 1:  big endian
-    
+
     If byteorder is 0, the output string will always start with the Unicode BOM
     mark (U+FEFF). In the other two modes, no BOM mark is prepended.
-    
+
     If Py_UNICODE_WIDE is defined, a single Py_UNICODE value may get
     represented as a surrogate pair. If it is not defined, each Py_UNICODE
     values is interpreted as an UCS-2 character.
-    
+
     Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2681,7 +2643,7 @@
     """Encode the Py_UNICODE buffer of the given size using UTF-7 and
     return a Python bytes object.  Return NULL if an exception was raised by
     the codec.
-    
+
     If base64SetO is nonzero, "Set O" (punctuation that has no otherwise
     special meaning) will be encoded in base-64.  If base64WhiteSpace is
     nonzero, whitespace will be encoded in base-64.  Both are set to zero for the
@@ -2692,7 +2654,7 @@
 def PyUnicode_DecodeUnicodeEscape(space, s, size, errors):
     """Create a Unicode object by decoding size bytes of the Unicode-Escape encoded
     string s.  Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2702,7 +2664,7 @@
     """Encode the Py_UNICODE buffer of the given size using Unicode-Escape and
     return a Python string object.  Return NULL if an exception was raised by the
     codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2711,7 +2673,7 @@
 def PyUnicode_DecodeRawUnicodeEscape(space, s, size, errors):
     """Create a Unicode object by decoding size bytes of the Raw-Unicode-Escape
     encoded string s.  Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2721,7 +2683,7 @@
     """Encode the Py_UNICODE buffer of the given size using Raw-Unicode-Escape
     and return a Python string object.  Return NULL if an exception was raised by
     the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2737,7 +2699,7 @@
 def PyUnicode_DecodeLatin1(space, s, size, errors):
     """Create a Unicode object by decoding size bytes of the Latin-1 encoded string
     s.  Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2746,7 +2708,7 @@
 def PyUnicode_EncodeLatin1(space, s, size, errors):
     """Encode the Py_UNICODE buffer of the given size using Latin-1 and return
     a Python string object.  Return NULL if an exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2766,9 +2728,9 @@
     dictionary mapping byte or a unicode string, which is treated as a lookup table.
     Byte values greater that the length of the string and U+FFFE "characters" are
     treated as "undefined mapping".
-    
+
     Allowed unicode string as mapping argument.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2778,7 +2740,7 @@
     """Encode the Py_UNICODE buffer of the given size using the given
     mapping object and return a Python string object. Return NULL if an
     exception was raised by the codec.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2795,14 +2757,14 @@
     """Translate a Py_UNICODE buffer of the given length by applying a
     character mapping table to it and return the resulting Unicode object.  Return
     NULL when an exception was raised by the codec.
-    
+
     The mapping table must map Unicode ordinal integers to Unicode ordinal
     integers or None (causing deletion of the character).
-    
+
     Mapping tables need only provide the __getitem__() interface; dictionaries
     and sequences work well.  Unmapped character ordinals (ones which cause a
     LookupError) are left untouched and are copied as-is.
-    
+
     This function used an int type for size. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2834,7 +2796,7 @@
     will be done at all whitespace substrings.  Otherwise, splits occur at the given
     separator.  At most maxsplit splits will be done.  If negative, no limit is
     set.  Separators are not included in the resulting list.
-    
+
     This function used an int type for maxsplit. This might require
     changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2850,14 +2812,14 @@
 def PyUnicode_Translate(space, str, table, errors):
     """Translate a string by applying a character mapping table to it and return the
     resulting Unicode object.
-    
+
     The mapping table must map Unicode ordinal integers to Unicode ordinal integers
     or None (causing deletion of the character).
-    
+
     Mapping tables need only provide the __getitem__() interface; dictionaries
     and sequences work well.  Unmapped character ordinals (ones which cause a
     LookupError) are left untouched and are copied as-is.
-    
+
     errors has the usual meaning for codecs. It may be NULL which indicates to
     use the default error handling."""
     raise NotImplementedError
@@ -2873,7 +2835,7 @@
     """Return 1 if substr matches str*[*start:end] at the given tail end
     (direction == -1 means to do a prefix match, direction == 1 a suffix match),
     0 otherwise. Return -1 if an error occurred.
-    
+
     This function used an int type for start and end. This
     might require changes in your code for properly supporting 64-bit
     systems."""
@@ -2886,7 +2848,7 @@
     backward search).  The return value is the index of the first match; a value of
     -1 indicates that no match was found, and -2 indicates that an error
     occurred and an exception has been set.
-    
+
     This function used an int type for start and end. This
     might require changes in your code for properly supporting 64-bit
     systems."""
@@ -2896,7 +2858,7 @@
 def PyUnicode_Count(space, str, substr, start, end):
     """Return the number of non-overlapping occurrences of substr in
     str[start:end].  Return -1 if an error occurred.
-    
+
     This function returned an int type and used an int
     type for start and end. This might require changes in your code for
     properly supporting 64-bit systems."""
@@ -2907,7 +2869,7 @@
     """Replace at most maxcount occurrences of substr in str with replstr and
     return the resulting Unicode object. maxcount == -1 means replace all
     occurrences.
-    
+
     This function used an int type for maxcount. This might
     require changes in your code for properly supporting 64-bit systems."""
     raise NotImplementedError
@@ -2915,17 +2877,17 @@
 @cpython_api([PyObject, PyObject, rffi.INT_real], PyObject)
 def PyUnicode_RichCompare(space, left, right, op):
     """Rich compare two unicode strings and return one of the following:
-    
+
     NULL in case an exception was raised
-    
+
     Py_True or Py_False for successful comparisons
-    
+
     Py_NotImplemented in case the type combination is unknown
-    
+
     Note that Py_EQ and Py_NE comparisons can cause a
     UnicodeWarning in case the conversion of the arguments to Unicode fails
     with a UnicodeDecodeError.
-    
+
     Possible values for op are Py_GT, Py_GE, Py_EQ,
     Py_NE, Py_LT, and Py_LE."""
     raise NotImplementedError
@@ -2940,7 +2902,7 @@
 def PyUnicode_Contains(space, container, element):
     """Check whether element is contained in container and return true or false
     accordingly.
-    
+
     element has to coerce to a one element Unicode string. -1 is returned if
     there was an error."""
     raise NotImplementedError
@@ -2955,7 +2917,7 @@
     value will be the integer passed to the sys.exit() function, 1 if the
     interpreter exits due to an exception, or 2 if the parameter list does not
     represent a valid Python command line.
-    
+
     Note that if an otherwise unhandled SystemError is raised, this
     function will not return 1, but exit the process, as long as
     Py_InspectFlag is not set."""
@@ -2995,7 +2957,7 @@
     is created.  Returns 0 on success or -1 if an exception was raised.  If
     there was an error, there is no way to get the exception information. For the
     meaning of flags, see below.
-    
+
     Note that if an otherwise unhandled SystemError is raised, this
     function will not return -1, but exit the process, as long as
     Py_InspectFlag is not set."""
@@ -3097,7 +3059,7 @@
     dictionaries globals and locals with the compiler flags specified by
     flags.  The parameter start specifies the start token that should be used to
     parse the source code.
-    
+
     Returns the result of executing the code as a Python object, or NULL if an
     exception was raised."""
     raise NotImplementedError
diff --git a/pypy/module/cpyext/test/test_eval.py b/pypy/module/cpyext/test/test_eval.py
--- a/pypy/module/cpyext/test/test_eval.py
+++ b/pypy/module/cpyext/test/test_eval.py
@@ -166,6 +166,15 @@
 
         lltype.free(pi, flavor='raw')
 
+    def test_atexit(self, space, api):
+        lst = []
+        def func():
+            lst.append(42)
+        api.Py_AtExit(func)
+        cpyext = space.getbuiltinmodule('cpyext')
+        cpyext.shutdown(space) # simulate shutdown
+        assert lst == [42]
+
 class AppTestCall(AppTestCpythonExtensionBase):
     def test_CallFunction(self):
         module = self.import_extension('foo', [
diff --git a/pypy/module/cpyext/test/test_import.py b/pypy/module/cpyext/test/test_import.py
--- a/pypy/module/cpyext/test/test_import.py
+++ b/pypy/module/cpyext/test/test_import.py
@@ -18,6 +18,19 @@
         assert space.str_w(space.getattr(w_foobar,
                                          space.wrap('__name__'))) == 'foobar'
 
+    def test_getmoduledict(self, space, api):
+        testmod = "binascii"
+        w_pre_dict = api.PyImport_GetModuleDict()
+        assert not space.is_true(space.contains(w_pre_dict, space.wrap(testmod)))
+
+        with rffi.scoped_str2charp(testmod) as modname:
+            w_module = api.PyImport_ImportModule(modname)
+            print w_module
+            assert w_module
+
+        w_dict = api.PyImport_GetModuleDict()
+        assert space.is_true(space.contains(w_dict, space.wrap(testmod)))
+
     def test_reload(self, space, api):
         pdb = api.PyImport_Import(space.wrap("pdb"))
         space.delattr(pdb, space.wrap("set_trace"))
diff --git a/pypy/module/cpyext/test/test_number.py b/pypy/module/cpyext/test/test_number.py
--- a/pypy/module/cpyext/test/test_number.py
+++ b/pypy/module/cpyext/test/test_number.py
@@ -23,6 +23,8 @@
     def test_number_int(self, space, api):
         w_l = api.PyNumber_Int(space.wrap(123L))
         assert api.PyInt_CheckExact(w_l)
+        w_l = api.PyNumber_Int(space.wrap(2 << 65))
+        assert api.PyLong_CheckExact(w_l)
 
     def test_numbermethods(self, space, api):
         assert "ab" == space.unwrap(
diff --git a/pypy/module/cpyext/test/test_pyfile.py b/pypy/module/cpyext/test/test_pyfile.py
--- a/pypy/module/cpyext/test/test_pyfile.py
+++ b/pypy/module/cpyext/test/test_pyfile.py
@@ -52,6 +52,13 @@
 
         space.call_method(w_file, "close")
 
+    def test_file_name(self, space, api):
+        name = str(udir / "_test_file")
+        with rffi.scoped_str2charp(name) as filename:
+            with rffi.scoped_str2charp("wb") as mode:
+                w_file = api.PyFile_FromString(filename, mode)
+        assert space.str_w(api.PyFile_Name(w_file)) == name
+
     @pytest.mark.xfail
     def test_file_fromfile(self, space, api):
         api.PyFile_Fromfile()
diff --git a/pypy/module/cpyext/test/test_sequence.py b/pypy/module/cpyext/test/test_sequence.py
--- a/pypy/module/cpyext/test/test_sequence.py
+++ b/pypy/module/cpyext/test/test_sequence.py
@@ -105,3 +105,34 @@
 
         self.raises(space, api, IndexError, api.PySequence_DelItem,
                     w_l, 3)
+
+    def test_getitem(self, space, api):
+        thelist = [8, 7, 6, 5, 4, 3, 2, 1]
+        w_l = space.wrap(thelist)
+
+        result = api.PySequence_GetItem(w_l, 4)
+        assert space.is_true(space.eq(result, space.wrap(4)))
+
+        result = api.PySequence_ITEM(w_l, 4)
+        assert space.is_true(space.eq(result, space.wrap(4)))
+
+        self.raises(space, api, IndexError, api.PySequence_GetItem, w_l, 9000)
+
+    def test_index(self, space, api):
+        thelist = [9, 8, 7, 6, 5, 4, 3, 2, 1]
+        w_l = space.wrap(thelist)
+        w_tofind = space.wrap(5)
+
+        result = api.PySequence_Index(w_l, w_tofind)
+        assert result == thelist.index(5)
+
+        w_tofind = space.wrap(9001)
+        result = api.PySequence_Index(w_l, w_tofind)
+        assert result == -1
+        assert api.PyErr_Occurred() is space.w_ValueError
+        api.PyErr_Clear()
+
+        gen = (x ** 2 for x in range(40))
+        w_tofind = space.wrap(16)
+        result = api.PySequence_Index(space.wrap(gen), w_tofind)
+        assert result == 4
diff --git a/pypy/module/pypyjit/policy.py b/pypy/module/pypyjit/policy.py
--- a/pypy/module/pypyjit/policy.py
+++ b/pypy/module/pypyjit/policy.py
@@ -14,7 +14,7 @@
             modname, _ = modname.split('.', 1)
         if modname in ['pypyjit', 'signal', 'micronumpy', 'math', 'exceptions',
                        'imp', 'sys', 'array', '_ffi', 'itertools', 'operator',
-                       '_socket', '_sre', '_lsprof']:
+                       'posix', '_socket', '_sre', '_lsprof']:
             return True
         return False
 
diff --git a/pypy/module/pypyjit/test/test_policy.py b/pypy/module/pypyjit/test/test_policy.py
--- a/pypy/module/pypyjit/test/test_policy.py
+++ b/pypy/module/pypyjit/test/test_policy.py
@@ -39,7 +39,7 @@
 def test_pypy_module():
     from pypy.module._random.interp_random import W_Random
     assert not pypypolicy.look_inside_function(W_Random.random)
-    assert not pypypolicy.look_inside_pypy_module('posix.interp_expat')
+    assert not pypypolicy.look_inside_pypy_module('select.interp_epoll')
     assert pypypolicy.look_inside_pypy_module('__builtin__.operation')
     assert pypypolicy.look_inside_pypy_module('__builtin__.abstractinst')
     assert pypypolicy.look_inside_pypy_module('__builtin__.functional')
diff --git a/pypy/module/pypyjit/test_pypy_c/test_pypy_c_new.py b/pypy/module/pypyjit/test_pypy_c/test_pypy_c_new.py
--- a/pypy/module/pypyjit/test_pypy_c/test_pypy_c_new.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_pypy_c_new.py
@@ -1031,7 +1031,6 @@
         """)
 
     def test_func_defaults(self):
-        py.test.skip("until we fix defaults")
         def main(n):
             i = 1
             while i < n:
@@ -1044,20 +1043,10 @@
         assert loop.match("""
             i10 = int_lt(i5, i6)
             guard_true(i10, descr=<Guard3>)
-            # This can be improved if the JIT realized the lookup of i5 produces
-            # a constant and thus can be removed entirely
             i120 = int_add(i5, 1)
-            i140 = int_lt(0, i120)
-            guard_true(i140, descr=<Guard4>)
-            i13 = uint_floordiv(i5, i7)
-            i15 = int_add(i13, 1)
-            i17 = int_lt(i15, 0)
-            guard_false(i17, descr=<Guard5>)
-            i20 = int_sub(i15, i5)
-            i21 = int_add_ovf(i5, i20)
-            guard_no_overflow(descr=<Guard6>)
+            guard_not_invalidated(descr=<Guard4>)
             --TICK--
-            jump(p0, p1, p2, p3, p4, i21, i6, i7, p8, p9, descr=<Loop0>)
+            jump(..., descr=<Loop0>)
         """)
 
     def test_unpack_iterable_non_list_tuple(self):
@@ -1092,7 +1081,7 @@
             --TICK--
             jump(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, i28, i25, i19, i13, p14, p15, descr=<Loop0>)
         """)
-        
+
     def test_mutate_class(self):
         def fn(n):
             class A(object):
@@ -1497,7 +1486,7 @@
         def main():
             i=0
             sa=0
-            while i < 300: 
+            while i < 300:
                 sa+=min(max(i, 3000), 4000)
                 i+=1
             return sa
@@ -1534,7 +1523,7 @@
             p76 = call_may_force(ConstClass(min_max_loop__max), _, _, descr=...)
             ...
         """)
-        
+
     def test_iter_max(self):
         def main():
             i = 2
@@ -1552,7 +1541,7 @@
         assert len(guards) < 20
         assert loop.match_by_id('max',"""
             ...
-            p76 = call_may_force(ConstClass(min_max_loop__max), _, _, descr=...)            
+            p76 = call_may_force(ConstClass(min_max_loop__max), _, _, descr=...)
             ...
         """)
 
diff --git a/pypy/module/thread/ll_thread.py b/pypy/module/thread/ll_thread.py
--- a/pypy/module/thread/ll_thread.py
+++ b/pypy/module/thread/ll_thread.py
@@ -114,6 +114,8 @@
             c_thread_releaselock(self._lock)
 
     def __del__(self):
+        if free_ll_lock is None:  # happens when tests are shutting down
+            return
         free_ll_lock(self._lock)
 
     def __enter__(self):
diff --git a/pypy/objspace/std/stringobject.py b/pypy/objspace/std/stringobject.py
--- a/pypy/objspace/std/stringobject.py
+++ b/pypy/objspace/std/stringobject.py
@@ -52,12 +52,16 @@
         c = v[0]
         return space.newbool(fun(c))
     else:
-        for idx in range(len(v)):
-            if not fun(v[idx]):
-                return space.w_False
-        return space.w_True
+        return _is_generic_loop(space, v, fun)
 _is_generic._annspecialcase_ = "specialize:arg(2)"
 
+def _is_generic_loop(space, v, fun):
+    for idx in range(len(v)):
+        if not fun(v[idx]):
+            return space.w_False
+    return space.w_True
+_is_generic_loop._annspecialcase_ = "specialize:arg(2)"
+
 def _upper(ch):
     if ch.islower():
         o = ord(ch) - 32
diff --git a/pypy/objspace/trace.py b/pypy/objspace/trace.py
--- a/pypy/objspace/trace.py
+++ b/pypy/objspace/trace.py
@@ -110,10 +110,10 @@
         self.result.append(EnterFrame(frame))
         self.ec.enter(frame)
 
-    def leave(self, frame):
+    def leave(self, frame, w_exitvalue):
         """ called just after evaluating of a frame is suspended/finished. """
         self.result.append(LeaveFrame(frame))
-        self.ec.leave(frame)
+        self.ec.leave(frame, w_exitvalue)
 
     def bytecode_trace(self, frame):
         """ called just before execution of a bytecode. """
diff --git a/pypy/rlib/_rsocket_rffi.py b/pypy/rlib/_rsocket_rffi.py
--- a/pypy/rlib/_rsocket_rffi.py
+++ b/pypy/rlib/_rsocket_rffi.py
@@ -90,35 +90,10 @@
     COND_HEADER = ''
 constants = {}
 
-sources = ["""
-    void pypy_macro_wrapper_FD_SET(int fd, fd_set *set)
-    {
-        FD_SET(fd, set);
-    }
-    void pypy_macro_wrapper_FD_ZERO(fd_set *set)
-    {
-        FD_ZERO(set);
-    }
-    void pypy_macro_wrapper_FD_CLR(int fd, fd_set *set)
-    {
-        FD_CLR(fd, set);
-    }
-    int pypy_macro_wrapper_FD_ISSET(int fd, fd_set *set)
-    {
-        return FD_ISSET(fd, set);
-    }
-    """]
-
 eci = ExternalCompilationInfo(
     post_include_bits = [HEADER, COND_HEADER],
     includes = includes,
     libraries = libraries,
-    separate_module_sources = sources,
-    export_symbols = ['pypy_macro_wrapper_FD_ZERO',
-                      'pypy_macro_wrapper_FD_SET',
-                      'pypy_macro_wrapper_FD_CLR',
-                      'pypy_macro_wrapper_FD_ISSET',
-                      ],
 )
 
 class CConfig:
@@ -484,9 +459,9 @@
     return rffi.llexternal(name, args, result, compilation_info=eci,
                            calling_conv=calling_conv)
 
-def external_c(name, args, result):
+def external_c(name, args, result, **kwargs):
     return rffi.llexternal(name, args, result, compilation_info=eci,
-                           calling_conv='c')
+                           calling_conv='c', **kwargs)
 
 if _POSIX:
     dup = external('dup', [socketfd_type], socketfd_type)
@@ -583,10 +558,10 @@
                    fd_set, lltype.Ptr(timeval)],
                   rffi.INT)
 
-FD_CLR = external_c('pypy_macro_wrapper_FD_CLR', [rffi.INT, fd_set], lltype.Void)
-FD_ISSET = external_c('pypy_macro_wrapper_FD_ISSET', [rffi.INT, fd_set], rffi.INT)
-FD_SET = external_c('pypy_macro_wrapper_FD_SET', [rffi.INT, fd_set], lltype.Void)
-FD_ZERO = external_c('pypy_macro_wrapper_FD_ZERO', [fd_set], lltype.Void)
+FD_CLR = external_c('FD_CLR', [rffi.INT, fd_set], lltype.Void, macro=True)
+FD_ISSET = external_c('FD_ISSET', [rffi.INT, fd_set], rffi.INT, macro=True)
+FD_SET = external_c('FD_SET', [rffi.INT, fd_set], lltype.Void, macro=True)
+FD_ZERO = external_c('FD_ZERO', [fd_set], lltype.Void, macro=True)
 
 if _POSIX:
     pollfdarray = rffi.CArray(pollfd)
diff --git a/pypy/rlib/ropenssl.py b/pypy/rlib/ropenssl.py
--- a/pypy/rlib/ropenssl.py
+++ b/pypy/rlib/ropenssl.py
@@ -15,19 +15,27 @@
         'winsock2.h',
         # wincrypt.h defines X509_NAME, include it here
         # so that openssl/ssl.h can repair this nonsense.
-        'wincrypt.h',
-        'openssl/ssl.h',
-        'openssl/err.h',
-        'openssl/evp.h']
+        'wincrypt.h']
 else:
     libraries = ['ssl', 'crypto']
-    includes = ['openssl/ssl.h', 'openssl/err.h',
-                'openssl/evp.h']
+    includes = []
+
+includes += [
+    'openssl/ssl.h', 
+    'openssl/err.h',
+    'openssl/rand.h',
+    'openssl/evp.h',
+    'openssl/x509v3.h']
 
 eci = ExternalCompilationInfo(
     libraries = libraries,
     includes = includes,
     export_symbols = [],
+    post_include_bits = [
+        # Unnamed structures are not supported by rffi_platform.
+        # So we replace an attribute access with a macro call.
+        '#define pypy_GENERAL_NAME_dirn(name) (name->d.dirn)',
+        ],
     )
 
 eci = rffi_platform.configure_external_library(
@@ -43,6 +51,10 @@
 else:
     from pypy.rlib._rsocket_rffi import FD_SETSIZE as MAX_FD_SIZE
 
+ASN1_STRING = lltype.Ptr(lltype.ForwardReference())
+ASN1_ITEM = rffi.COpaquePtr('ASN1_ITEM')
+X509_NAME = rffi.COpaquePtr('X509_NAME')
+
 class CConfig:
     _compilation_info_ = eci
 
@@ -53,6 +65,8 @@
     SSL_FILETYPE_PEM = rffi_platform.ConstantInteger("SSL_FILETYPE_PEM")
     SSL_OP_ALL = rffi_platform.ConstantInteger("SSL_OP_ALL")
     SSL_VERIFY_NONE = rffi_platform.ConstantInteger("SSL_VERIFY_NONE")
+    SSL_VERIFY_PEER = rffi_platform.ConstantInteger("SSL_VERIFY_PEER")
+    SSL_VERIFY_FAIL_IF_NO_PEER_CERT = rffi_platform.ConstantInteger("SSL_VERIFY_FAIL_IF_NO_PEER_CERT")
     SSL_ERROR_WANT_READ = rffi_platform.ConstantInteger(
         "SSL_ERROR_WANT_READ")
     SSL_ERROR_WANT_WRITE = rffi_platform.ConstantInteger(
@@ -67,21 +81,54 @@
     SSL_ERROR_SSL = rffi_platform.ConstantInteger("SSL_ERROR_SSL")
     SSL_RECEIVED_SHUTDOWN = rffi_platform.ConstantInteger(
         "SSL_RECEIVED_SHUTDOWN")
-    SSL_CTRL_OPTIONS = rffi_platform.ConstantInteger("SSL_CTRL_OPTIONS")
-    SSL_CTRL_MODE = rffi_platform.ConstantInteger("SSL_CTRL_MODE")
-    BIO_C_SET_NBIO = rffi_platform.ConstantInteger("BIO_C_SET_NBIO")
     SSL_MODE_AUTO_RETRY = rffi_platform.ConstantInteger("SSL_MODE_AUTO_RETRY")
 
+    NID_subject_alt_name = rffi_platform.ConstantInteger("NID_subject_alt_name")
+    GEN_DIRNAME = rffi_platform.ConstantInteger("GEN_DIRNAME")
+
+    CRYPTO_LOCK = rffi_platform.ConstantInteger("CRYPTO_LOCK")
+
+    # Some structures, with only the fields used in the _ssl module
+    X509_name_entry_st = rffi_platform.Struct('struct X509_name_entry_st',
+                                              [('set', rffi.INT)])
+    asn1_string_st = rffi_platform.Struct('struct asn1_string_st',
+                                          [('length', rffi.INT),
+                                           ('data', rffi.CCHARP)])
+    X509_extension_st = rffi_platform.Struct(
+        'struct X509_extension_st',
+        [('value', ASN1_STRING)])
+    ASN1_ITEM_EXP = lltype.FuncType([], ASN1_ITEM)
+    X509V3_EXT_D2I = lltype.FuncType([rffi.VOIDP, rffi.CCHARPP, rffi.LONG], 
+                                     rffi.VOIDP)
+    v3_ext_method = rffi_platform.Struct(
+        'struct v3_ext_method',
+        [('it', lltype.Ptr(ASN1_ITEM_EXP)),
+         ('d2i', lltype.Ptr(X509V3_EXT_D2I))])
+    GENERAL_NAME_st = rffi_platform.Struct(
+        'struct GENERAL_NAME_st',
+        [('type', rffi.INT),
+         ]) 
+
+
 for k, v in rffi_platform.configure(CConfig).items():
     globals()[k] = v
 
 # opaque structures
 SSL_METHOD = rffi.COpaquePtr('SSL_METHOD')
 SSL_CTX = rffi.COpaquePtr('SSL_CTX')
+SSL_CIPHER = rffi.COpaquePtr('SSL_CIPHER')
 SSL = rffi.COpaquePtr('SSL')
 BIO = rffi.COpaquePtr('BIO')
 X509 = rffi.COpaquePtr('X509')
-X509_NAME = rffi.COpaquePtr('X509_NAME')
+X509_NAME_ENTRY = rffi.CArrayPtr(X509_name_entry_st)
+X509_EXTENSION = rffi.CArrayPtr(X509_extension_st)
+X509V3_EXT_METHOD = rffi.CArrayPtr(v3_ext_method)
+ASN1_OBJECT = rffi.COpaquePtr('ASN1_OBJECT')
+ASN1_STRING.TO.become(asn1_string_st)
+ASN1_TIME = rffi.COpaquePtr('ASN1_TIME')
+ASN1_INTEGER = rffi.COpaquePtr('ASN1_INTEGER')
+GENERAL_NAMES = rffi.COpaquePtr('GENERAL_NAMES')
+GENERAL_NAME = rffi.CArrayPtr(GENERAL_NAME_st)
 
 HAVE_OPENSSL_RAND = OPENSSL_VERSION_NUMBER >= 0x0090500f
 
@@ -97,18 +144,36 @@
 
 ssl_external('SSL_load_error_strings', [], lltype.Void)
 ssl_external('SSL_library_init', [], rffi.INT)
+ssl_external('CRYPTO_num_locks', [], rffi.INT)
+ssl_external('CRYPTO_set_locking_callback',
+             [lltype.Ptr(lltype.FuncType(
+                [rffi.INT, rffi.INT, rffi.CCHARP, rffi.INT], lltype.Void))],
+             lltype.Void)
+ssl_external('CRYPTO_set_id_callback',
+             [lltype.Ptr(lltype.FuncType([], rffi.INT))],
+             lltype.Void)
+             
 if HAVE_OPENSSL_RAND:
     ssl_external('RAND_add', [rffi.CCHARP, rffi.INT, rffi.DOUBLE], lltype.Void)
     ssl_external('RAND_status', [], rffi.INT)
     ssl_external('RAND_egd', [rffi.CCHARP], rffi.INT)
 ssl_external('SSL_CTX_new', [SSL_METHOD], SSL_CTX)
+ssl_external('SSL_get_SSL_CTX', [SSL], SSL_CTX)
+ssl_external('TLSv1_method', [], SSL_METHOD)
+ssl_external('SSLv2_method', [], SSL_METHOD)
+ssl_external('SSLv3_method', [], SSL_METHOD)
 ssl_external('SSLv23_method', [], SSL_METHOD)
 ssl_external('SSL_CTX_use_PrivateKey_file', [SSL_CTX, rffi.CCHARP, rffi.INT], rffi.INT)
 ssl_external('SSL_CTX_use_certificate_chain_file', [SSL_CTX, rffi.CCHARP], rffi.INT)
+ssl_external('SSL_CTX_set_options', [SSL_CTX, rffi.INT], rffi.INT, macro=True)
 ssl_external('SSL_CTX_ctrl', [SSL_CTX, rffi.INT, rffi.INT, rffi.VOIDP], rffi.INT)
 ssl_external('SSL_CTX_set_verify', [SSL_CTX, rffi.INT, rffi.VOIDP], lltype.Void)
+ssl_external('SSL_CTX_get_verify_mode', [SSL_CTX], rffi.INT)
+ssl_external('SSL_CTX_set_cipher_list', [SSL_CTX, rffi.CCHARP], rffi.INT)
+ssl_external('SSL_CTX_load_verify_locations', [SSL_CTX, rffi.CCHARP, rffi.CCHARP], rffi.INT)
 ssl_external('SSL_new', [SSL_CTX], SSL)
 ssl_external('SSL_set_fd', [SSL, rffi.INT], rffi.INT)
+ssl_external('SSL_set_mode', [SSL, rffi.INT], rffi.INT, macro=True)
 ssl_external('SSL_ctrl', [SSL, rffi.INT, rffi.INT, rffi.VOIDP], rffi.INT)
 ssl_external('BIO_ctrl', [BIO, rffi.INT, rffi.INT, rffi.VOIDP], rffi.INT)
 ssl_external('SSL_get_rbio', [SSL], BIO)
@@ -122,20 +187,70 @@
 ssl_external('SSL_get_shutdown', [SSL], rffi.INT)
 ssl_external('SSL_set_read_ahead', [SSL, rffi.INT], lltype.Void)
 
-ssl_external('ERR_get_error', [], rffi.INT)
-ssl_external('ERR_error_string', [rffi.ULONG, rffi.CCHARP], rffi.CCHARP)
 ssl_external('SSL_get_peer_certificate', [SSL], X509)
 ssl_external('X509_get_subject_name', [X509], X509_NAME)
 ssl_external('X509_get_issuer_name', [X509], X509_NAME)
 ssl_external('X509_NAME_oneline', [X509_NAME, rffi.CCHARP, rffi.INT], rffi.CCHARP)
+ssl_external('X509_NAME_entry_count', [X509_NAME], rffi.INT)
+ssl_external('X509_NAME_get_entry', [X509_NAME, rffi.INT], X509_NAME_ENTRY)
+ssl_external('X509_NAME_ENTRY_get_object', [X509_NAME_ENTRY], ASN1_OBJECT)
+ssl_external('X509_NAME_ENTRY_get_data', [X509_NAME_ENTRY], ASN1_STRING)
+ssl_external('i2d_X509', [X509, rffi.CCHARPP], rffi.INT)
 ssl_external('X509_free', [X509], lltype.Void)
+ssl_external('X509_get_notBefore', [X509], ASN1_TIME, macro=True)
+ssl_external('X509_get_notAfter', [X509], ASN1_TIME, macro=True)
+ssl_external('X509_get_serialNumber', [X509], ASN1_INTEGER)
+ssl_external('X509_get_version', [X509], rffi.INT, macro=True)
+ssl_external('X509_get_ext_by_NID', [X509, rffi.INT, rffi.INT], rffi.INT)
+ssl_external('X509_get_ext', [X509, rffi.INT], X509_EXTENSION)
+ssl_external('X509V3_EXT_get', [X509_EXTENSION], X509V3_EXT_METHOD)
+
+
+ssl_external('OBJ_obj2txt',
+             [rffi.CCHARP, rffi.INT, ASN1_OBJECT, rffi.INT], rffi.INT)
+ssl_external('ASN1_STRING_to_UTF8', [rffi.CCHARPP, ASN1_STRING], rffi.INT)
+ssl_external('ASN1_TIME_print', [BIO, ASN1_TIME], rffi.INT)
+ssl_external('i2a_ASN1_INTEGER', [BIO, ASN1_INTEGER], rffi.INT)
+ssl_external('ASN1_item_d2i', 
+             [rffi.VOIDP, rffi.CCHARPP, rffi.LONG, ASN1_ITEM], rffi.VOIDP)
+ssl_external('ASN1_ITEM_ptr', [rffi.VOIDP], ASN1_ITEM, macro=True)
+
+ssl_external('sk_GENERAL_NAME_num', [GENERAL_NAMES], rffi.INT,
+             macro=True)
+ssl_external('sk_GENERAL_NAME_value', [GENERAL_NAMES, rffi.INT], GENERAL_NAME,
+             macro=True)
+ssl_external('GENERAL_NAME_print', [BIO, GENERAL_NAME], rffi.INT)
+ssl_external('pypy_GENERAL_NAME_dirn', [GENERAL_NAME], X509_NAME,
+             macro=True)
+
+ssl_external('SSL_get_current_cipher', [SSL], SSL_CIPHER)
+ssl_external('SSL_CIPHER_get_name', [SSL_CIPHER], rffi.CCHARP)
+ssl_external('SSL_CIPHER_get_version', [SSL_CIPHER], rffi.CCHARP)
+ssl_external('SSL_CIPHER_get_bits', [SSL_CIPHER, rffi.INTP], rffi.INT)
+
+ssl_external('ERR_get_error', [], rffi.INT)
+ssl_external('ERR_error_string', [rffi.ULONG, rffi.CCHARP], rffi.CCHARP)
+
 ssl_external('SSL_free', [SSL], lltype.Void)
 ssl_external('SSL_CTX_free', [SSL_CTX], lltype.Void)
+ssl_external('CRYPTO_free', [rffi.VOIDP], lltype.Void)
+libssl_OPENSSL_free = libssl_CRYPTO_free
+
 ssl_external('SSL_write', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
 ssl_external('SSL_pending', [SSL], rffi.INT)
 ssl_external('SSL_read', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
 
-ssl_external('SSL_read', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
+BIO_METHOD = rffi.COpaquePtr('BIO_METHOD')
+ssl_external('BIO_s_mem', [], BIO_METHOD)
+ssl_external('BIO_s_file', [], BIO_METHOD)
+ssl_external('BIO_new', [BIO_METHOD], BIO)
+ssl_external('BIO_set_nbio', [BIO, rffi.INT], rffi.INT, macro=True)
+ssl_external('BIO_free', [BIO], rffi.INT)
+ssl_external('BIO_reset', [BIO], rffi.INT, macro=True)
+ssl_external('BIO_read_filename', [BIO, rffi.CCHARP], rffi.INT, macro=True)
+ssl_external('BIO_gets', [BIO, rffi.CCHARP, rffi.INT], rffi.INT)
+ssl_external('PEM_read_bio_X509_AUX',
+             [BIO, rffi.VOIDP, rffi.VOIDP, rffi.VOIDP], X509)
 
 EVP_MD_CTX = rffi.COpaquePtr('EVP_MD_CTX', compilation_info=eci)
 EVP_MD     = rffi.COpaquePtr('EVP_MD')
@@ -159,13 +274,6 @@
 EVP_MD_CTX_cleanup = external(
     'EVP_MD_CTX_cleanup', [EVP_MD_CTX], rffi.INT)
 
-def libssl_SSL_set_mode(ssl, op):
-    return libssl_SSL_ctrl(ssl, SSL_CTRL_MODE, op, None)
-def libssl_SSL_CTX_set_options(ctx, op):
-    return libssl_SSL_CTX_ctrl(ctx, SSL_CTRL_OPTIONS, op, None)
-def libssl_BIO_set_nbio(bio, nonblocking):
-    return libssl_BIO_ctrl(bio, BIO_C_SET_NBIO, nonblocking, None)
-
 def init_ssl():
     libssl_SSL_load_error_strings()
     libssl_SSL_library_init()
diff --git a/pypy/rlib/test/test_rsocket.py b/pypy/rlib/test/test_rsocket.py
--- a/pypy/rlib/test/test_rsocket.py
+++ b/pypy/rlib/test/test_rsocket.py
@@ -297,24 +297,25 @@
     e = py.test.raises(GAIError, getaddrinfo, 'www.very-invalidaddress.com', None)
     assert isinstance(e.value.get_msg(), str)
 
-def test_getaddrinfo_codespeak():
-    lst = getaddrinfo('codespeak.net', None)
+def test_getaddrinfo_pydotorg():
+    lst = getaddrinfo('python.org', None)
     assert isinstance(lst, list)
     found = False
     for family, socktype, protocol, canonname, addr in lst:
-        if addr.get_host() == '88.198.193.90':
+        if addr.get_host() == '82.94.164.162':
             found = True
     assert found, lst
 
 def test_getaddrinfo_no_reverse_lookup():
     # It seems that getaddrinfo never runs a reverse lookup on Linux.
     # Python2.3 on Windows returns the hostname.
-    lst = getaddrinfo('213.239.226.252', None, flags=AI_NUMERICHOST)
+    lst = getaddrinfo('82.94.164.162', None, flags=AI_NUMERICHOST)
     assert isinstance(lst, list)
     found = False
+    print lst
     for family, socktype, protocol, canonname, addr in lst:
-        assert canonname != 'codespeak.net'
-        if addr.get_host() == '213.239.226.252':
+        assert 'python.org' not in canonname
+        if addr.get_host() == '82.94.164.162':
             found = True
     assert found, lst
 
diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py b/pypy/rpython/lltypesystem/ll2ctypes.py
--- a/pypy/rpython/lltypesystem/ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/ll2ctypes.py
@@ -616,7 +616,7 @@
             container = llobj._obj.container
             T = lltype.Ptr(lltype.typeOf(container))
             # otherwise it came from integer and we want a c_void_p with
-            # the same valu
+            # the same value
             if getattr(container, 'llopaque', None):
                 no = len(_opaque_objs)
                 _opaque_objs.append(container)
@@ -774,7 +774,7 @@
             # CFunctionType.__nonzero__ is broken before Python 2.6
             return lltype.nullptr(T.TO)
         if isinstance(T.TO, lltype.Struct):
-            if ptrval & 1: # a tagged pointer
+            if T.TO._gckind == 'gc' and ptrval & 1: # a tagged pointer
                 gcref = _opaque_objs[ptrval // 2].hide()
                 return lltype.cast_opaque_ptr(T, gcref)
             REAL_TYPE = T.TO
@@ -973,13 +973,13 @@
     if funcname == 'mmap':
         funcname = 'mmap64'
     if hasattr(old_eci, '_with_ctypes'):
-        eci = old_eci._with_ctypes
-    else:
-        try:
-            eci = _eci_cache[old_eci]
-        except KeyError:
-            eci = old_eci.compile_shared_lib()
-            _eci_cache[old_eci] = eci
+        old_eci = old_eci._with_ctypes
+
+    try:
+        eci = _eci_cache[old_eci]
+    except KeyError:
+        eci = old_eci.compile_shared_lib()
+        _eci_cache[old_eci] = eci
 
     libraries = eci.testonly_libraries + eci.libraries + eci.frameworks
 
diff --git a/pypy/rpython/lltypesystem/rbuilder.py b/pypy/rpython/lltypesystem/rbuilder.py
--- a/pypy/rpython/lltypesystem/rbuilder.py
+++ b/pypy/rpython/lltypesystem/rbuilder.py
@@ -6,6 +6,7 @@
 from pypy.rpython.annlowlevel import llstr
 from pypy.rlib import rgc
 from pypy.rlib.rarithmetic import ovfcheck
+from pypy.rlib.objectmodel import enforceargs
 from pypy.rpython.lltypesystem.lltype import staticAdtMethod
 from pypy.tool.sourcetools import func_with_new_name
 
@@ -15,6 +16,7 @@
 GROW_FAST_UNTIL = 100*1024*1024      # 100 MB
 
 def new_grow_func(name, mallocfn, copycontentsfn):
+    @enforceargs(None, int)
     def stringbuilder_grow(ll_builder, needed):
         allocated = ll_builder.allocated
         #if allocated < GROW_FAST_UNTIL:
diff --git a/pypy/rpython/lltypesystem/rffi.py b/pypy/rpython/lltypesystem/rffi.py
--- a/pypy/rpython/lltypesystem/rffi.py
+++ b/pypy/rpython/lltypesystem/rffi.py
@@ -15,6 +15,7 @@
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.rstring import StringBuilder, UnicodeBuilder
 from pypy.rpython.lltypesystem import llmemory
 import os, sys
 
@@ -54,7 +55,8 @@
                compilation_info=ExternalCompilationInfo(),
                sandboxsafe=False, threadsafe='auto',
                _nowrapper=False, calling_conv='c',
-               oo_primitive=None, pure_function=False):
+               oo_primitive=None, pure_function=False,
+               macro=None):
     """Build an external function that will invoke the C function 'name'
     with the given 'args' types and 'result' type.
 
@@ -78,7 +80,13 @@
         assert callable(_callable)
     ext_type = lltype.FuncType(args, result)
     if _callable is None:
-        _callable = ll2ctypes.LL2CtypesCallable(ext_type, calling_conv)
+        if macro is not None:
+            if macro is True:
+                macro = name
+            _callable = generate_macro_wrapper(
+                name, macro, ext_type, compilation_info)
+        else:
+            _callable = ll2ctypes.LL2CtypesCallable(ext_type, calling_conv)
     if pure_function:
         _callable._pure_function_ = True
     kwds = {}
@@ -314,6 +322,41 @@
                       compilation_info=eci, sandboxsafe=True, _nowrapper=True,
                       _callable=lambda: None)
 
+def generate_macro_wrapper(name, macro, functype, eci):
+    """Wraps a function-like macro inside a real function, and expose
+    it with llexternal."""
+
+    # Generate the function call
+    from pypy.translator.c.database import LowLevelDatabase
+    from pypy.translator.c.support import cdecl
+    wrapper_name = 'pypy_macro_wrapper_%s' % (name,)
+    argnames = ['arg%d' % (i,) for i in range(len(functype.ARGS))]
+    db = LowLevelDatabase()
+    implementationtypename = db.gettype(functype, argnames=argnames)
+    if functype.RESULT is lltype.Void:
+        pattern = '%s { %s(%s); }'
+    else:
+        pattern = '%s { return %s(%s); }'
+    source = pattern % (
+        cdecl(implementationtypename, wrapper_name),
+        macro, ', '.join(argnames))
+
+    # Now stuff this source into a "companion" eci that will be used
+    # by ll2ctypes.  We replace eci._with_ctypes, so that only one
+    # shared library is actually compiled (when ll2ctypes calls the
+    # first function)
+    ctypes_eci = eci.merge(ExternalCompilationInfo(
+            separate_module_sources=[source],
+            export_symbols=[wrapper_name],
+            ))
+    if hasattr(eci, '_with_ctypes'):
+        ctypes_eci = eci._with_ctypes.merge(ctypes_eci)
+    eci._with_ctypes = ctypes_eci
+    func = llexternal(wrapper_name, functype.ARGS, functype.RESULT,
+                      compilation_info=eci, _nowrapper=True)
+    # _nowrapper=True returns a pointer which is not hashable
+    return lambda *args: func(*args)
+
 # ____________________________________________________________
 # Few helpers for keeping callback arguments alive
 # this makes passing opaque objects possible (they don't even pass
@@ -496,7 +539,7 @@
             val = rffi_platform.sizeof(name, compilation_info)
             cache[name] = val
             return val
-    
+
     hints['getsize'] = lazy_getsize
     return lltype.OpaqueType(name, hints)
 
@@ -594,24 +637,24 @@
 # conversions between str and char*
 # conversions between unicode and wchar_t*
 def make_string_mappings(strtype):
-    
+
     if strtype is str:
         from pypy.rpython.lltypesystem.rstr import STR as STRTYPE
         from pypy.rpython.annlowlevel import llstr as llstrtype
         from pypy.rpython.annlowlevel import hlstr as hlstrtype
         TYPEP = CCHARP
         ll_char_type = lltype.Char
-        emptystr = ''
         lastchar = '\x00'
+        builder_class = StringBuilder
     else:
         from pypy.rpython.lltypesystem.rstr import UNICODE as STRTYPE
         from pypy.rpython.annlowlevel import llunicode as llstrtype
         from pypy.rpython.annlowlevel import hlunicode as hlstrtype
         TYPEP = CWCHARP
         ll_char_type = lltype.UniChar
-        emptystr = u''
         lastchar = u'\x00'
-        
+        builder_class = UnicodeBuilder
+
     # str -> char*
     def str2charp(s):
         """ str -> char*
@@ -632,12 +675,12 @@
     # char* -> str
     # doesn't free char*
     def charp2str(cp):
-        l = []
+        b = builder_class()
         i = 0
         while cp[i] != lastchar:
-            l.append(cp[i])
+            b.append(cp[i])
             i += 1
-        return emptystr.join(l)
+        return b.build()
 
     # str -> char*
     def get_nonmovingbuffer(data):
@@ -735,17 +778,19 @@
 
     # char* -> str, with an upper bound on the length in case there is no \x00
     def charp2strn(cp, maxlen):
-        l = []
+        b = builder_class(maxlen)
         i = 0
         while i < maxlen and cp[i] != lastchar:
-            l.append(cp[i])
+            b.append(cp[i])
             i += 1
-        return emptystr.join(l)
+        return b.build()
 
     # char* and size -> str (which can contain null bytes)
     def charpsize2str(cp, size):
-        l = [cp[i] for i in range(size)]
-        return emptystr.join(l)
+        b = builder_class(size)
+        for i in xrange(size):
+            b.append(cp[i])
+        return b.build()
     charpsize2str._annenforceargs_ = [None, int]
 
     return (str2charp, free_charp, charp2str,
diff --git a/pypy/rpython/lltypesystem/test/test_ll2ctypes.py b/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
--- a/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
@@ -787,6 +787,19 @@
         res = fn()
         assert res == 42
 
+    def test_llexternal_macro(self):
+        eci = ExternalCompilationInfo(
+            post_include_bits = ["#define fn(x) (42 + x)"],
+        )
+        fn1 = rffi.llexternal('fn', [rffi.INT], rffi.INT, 
+                              compilation_info=eci, macro=True)
+        fn2 = rffi.llexternal('fn2', [rffi.DOUBLE], rffi.DOUBLE, 
+                              compilation_info=eci, macro='fn')
+        res = fn1(10)
+        assert res == 52
+        res = fn2(10.5)
+        assert res == 52.5
+
     def test_prebuilt_constant(self):
         header = py.code.Source("""
         #ifndef _SOME_H
@@ -1318,7 +1331,6 @@
 class TestPlatform(object):
     def test_lib_on_libpaths(self):
         from pypy.translator.platform import platform
-        from pypy.translator.tool.cbuild import ExternalCompilationInfo
 
         tmpdir = udir.join('lib_on_libppaths')
         tmpdir.ensure(dir=1)
@@ -1340,7 +1352,6 @@
             py.test.skip("Not supported")
 
         from pypy.translator.platform import platform
-        from pypy.translator.tool.cbuild import ExternalCompilationInfo
 
         tmpdir = udir.join('lib_on_libppaths_prefix')
         tmpdir.ensure(dir=1)
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -714,8 +714,7 @@
                     malloc_ptr = self.malloc_varsize_clear_ptr
                 args = [self.c_const_gc, c_type_id, v_length, c_size,
                         c_varitemsize, c_ofstolength, c_can_collect]
-        keep_current_args = flags.get('keep_current_args', False)
-        livevars = self.push_roots(hop, keep_current_args=keep_current_args)
+        livevars = self.push_roots(hop)
         v_result = hop.genop("direct_call", [malloc_ptr] + args,
                              resulttype=llmemory.GCREF)
         self.pop_roots(hop, livevars)
diff --git a/pypy/rpython/memory/test/test_gctypelayout.py b/pypy/rpython/memory/test/test_gctypelayout.py
--- a/pypy/rpython/memory/test/test_gctypelayout.py
+++ b/pypy/rpython/memory/test/test_gctypelayout.py
@@ -4,6 +4,7 @@
 from pypy.rpython.memory.gctypelayout import gc_pointers_inside
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass
 from pypy.rpython.test.test_llinterp import get_interpreter
+from pypy.rpython.rclass import IR_IMMUTABLE
 from pypy.objspace.flow.model import Constant
 
 class FakeGC:
@@ -101,7 +102,7 @@
     accessor = rclass.FieldListAccessor()
     S3 = lltype.GcStruct('S', ('x', PT), ('y', PT),
                          hints={'immutable_fields': accessor})
-    accessor.initialize(S3, {'x': ''})
+    accessor.initialize(S3, {'x': IR_IMMUTABLE})
     #
     s1 = lltype.malloc(S1)
     adr = llmemory.cast_ptr_to_adr(s1)
diff --git a/pypy/rpython/test/test_rfloat.py b/pypy/rpython/test/test_rfloat.py
--- a/pypy/rpython/test/test_rfloat.py
+++ b/pypy/rpython/test/test_rfloat.py
@@ -177,7 +177,11 @@
             n1 = x * x
             n2 = y * y * y
             return rfloat.isnan(n1 / n2)
-        assert self.interpret(fn, [1e200, 1e200])   # nan
+        if self.__class__.__name__ != 'TestCliFloat':
+            # the next line currently fails on mono 2.6.7 (ubuntu 11.04), see:
+            # https://bugzilla.novell.com/show_bug.cgi?id=692493
+            assert self.interpret(fn, [1e200, 1e200])   # nan
+        #
         assert not self.interpret(fn, [1e200, 1.0])   # +inf
         assert not self.interpret(fn, [1e200, -1.0])  # -inf
         assert not self.interpret(fn, [42.5, 2.3])    # +finite
@@ -205,7 +209,11 @@
         assert self.interpret(fn, [42.5, -2.3])       # -finite
         assert not self.interpret(fn, [1e200, 1.0])   # +inf
         assert not self.interpret(fn, [1e200, -1.0])  # -inf
-        assert not self.interpret(fn, [1e200, 1e200]) # nan
+        #
+        if self.__class__.__name__ != 'TestCliFloat':
+            # the next line currently fails on mono 2.6.7 (ubuntu 11.04), see:
+            # https://bugzilla.novell.com/show_bug.cgi?id=692493
+            assert not self.interpret(fn, [1e200, 1e200]) # nan
 
 
 class TestLLtype(BaseTestRfloat, LLRtypeMixin):
diff --git a/pypy/tool/clean_old_branches.py b/pypy/tool/clean_old_branches.py
new file mode 100644
--- /dev/null
+++ b/pypy/tool/clean_old_branches.py
@@ -0,0 +1,72 @@
+"""
+For branches that have been closed but still have a dangling head
+in 'hg heads --topo --closed', force them to join with the branch
+called 'closed-branch'.  It reduces the number of heads.
+"""
+
+import os, sys
+
+if not os.listdir('.hg'):
+    print 'Must run this script from the top-level directory.'
+    sys.exit(1)
+
+def heads(args):
+    g = os.popen(r"hg heads --topo %s --template '{branches} {node|short}\n'"
+                 % args, 'r')
+    result = g.read()
+    g.close()
+    result = result.splitlines(False)
+    result = [s for s in result
+                if not s.startswith(' ')
+                   and not s.startswith('closed-branches ')]
+    return result
+
+all_heads = heads("--closed")
+opened_heads = heads("")
+
+closed_heads = [s for s in all_heads if s not in opened_heads]
+
+if not closed_heads:
+    print >> sys.stderr, 'no dangling closed heads.'
+    sys.exit()
+
+# ____________________________________________________________
+
+closed_heads.reverse()
+
+for branch_head in closed_heads:
+    branch, head = branch_head.split()
+    print '\t', branch
+print
+print 'The branches listed above will be merged to "closed-branches".'
+print 'You need to run this script in a clean working copy where you'
+print 'don''t mind all files being removed.'
+print
+if raw_input('Continue? [y/n] ').upper() != 'Y':
+    sys.exit(1)
+
+# ____________________________________________________________
+
+def do(cmd):
+    print cmd
+    err = os.system(cmd)
+    if err != 0:
+        print '*** error %r' % (err,)
+        sys.exit(1)
+
+for branch_head in closed_heads:
+    branch, head = branch_head.split()
+    print
+    print '***** %s ***** %s *****' % (branch, head)
+    do("hg up --clean closed-branches")
+    do("hg --config extensions.purge= purge --all")
+    do("hg merge -y %s" % head)
+    for fn in os.listdir('.'):
+        if fn.lower() != '.hg':
+            do("rm -fr -- '%s'" % fn)
+            do("hg rm --after -- '%s' || true" % fn)
+    do("hg ci -m'Merge closed head %s on branch %s'" % (head, branch))
+
+print
+do("hg ci --close-branch -m're-close this branch'")
+do("hg up default")
diff --git a/pypy/tool/frozenlist.py b/pypy/tool/frozenlist.py
new file mode 100644
--- /dev/null
+++ b/pypy/tool/frozenlist.py
@@ -0,0 +1,19 @@
+from pypy.tool.sourcetools import func_with_new_name
+
+def forbid(*args):
+    raise TypeError, "cannot mutate a frozenlist"
+
+class frozenlist(list):
+    __setitem__  = func_with_new_name(forbid, '__setitem__')
+    __delitem__  = func_with_new_name(forbid, '__delitem__')
+    __setslice__ = func_with_new_name(forbid, '__setslice__')
+    __delslice__ = func_with_new_name(forbid, '__delslice__')
+    __iadd__     = func_with_new_name(forbid, '__iadd__')
+    __imul__     = func_with_new_name(forbid, '__imul__')
+    append       = func_with_new_name(forbid, 'append')
+    insert       = func_with_new_name(forbid, 'insert')
+    pop          = func_with_new_name(forbid, 'pop')
+    remove       = func_with_new_name(forbid, 'remove')
+    reverse      = func_with_new_name(forbid, 'reverse')
+    sort         = func_with_new_name(forbid, 'sort')
+    extend       = func_with_new_name(forbid, 'extend')
diff --git a/pypy/tool/runsubprocess.py b/pypy/tool/runsubprocess.py
--- a/pypy/tool/runsubprocess.py
+++ b/pypy/tool/runsubprocess.py
@@ -3,7 +3,7 @@
 if the current process already grew very large.
 """
 
-import sys
+import sys, gc
 import os
 from subprocess import PIPE, Popen
 
@@ -21,6 +21,11 @@
         else:
             args = [str(executable)] + args
         shell = False
+    # Just before spawning the subprocess, do a gc.collect().  This
+    # should help if we are running on top of PyPy, if the subprocess
+    # is going to need a lot of RAM and we are using a lot too.
+    gc.collect()
+    #
     pipe = Popen(args, stdout=PIPE, stderr=PIPE, shell=shell, env=env, cwd=cwd)
     stdout, stderr = pipe.communicate()
     return pipe.returncode, stdout, stderr
diff --git a/pypy/tool/test/test_frozenlist.py b/pypy/tool/test/test_frozenlist.py
new file mode 100644
--- /dev/null
+++ b/pypy/tool/test/test_frozenlist.py
@@ -0,0 +1,21 @@
+import py
+from pypy.tool.frozenlist import frozenlist
+
+def test_frozenlist():
+    l = frozenlist([1, 2, 3])
+    assert l[0] == 1
+    assert l[:2] == [1, 2]
+    assert l.index(2) == 1
+    py.test.raises(TypeError, "l[0] = 1")
+    py.test.raises(TypeError, "del l[0]")
+    py.test.raises(TypeError, "l[:] = []")
+    py.test.raises(TypeError, "del l[:]")
+    py.test.raises(TypeError, "l += []")
+    py.test.raises(TypeError, "l *= 2")
+    py.test.raises(TypeError, "l.append(1)")
+    py.test.raises(TypeError, "l.insert(0, 0)")
+    py.test.raises(TypeError, "l.pop()")
+    py.test.raises(TypeError, "l.remove(1)")
+    py.test.raises(TypeError, "l.reverse()")
+    py.test.raises(TypeError, "l.sort()")
+    py.test.raises(TypeError, "l.extend([])")
diff --git a/pypy/translator/backendopt/test/test_constfold.py b/pypy/translator/backendopt/test/test_constfold.py
--- a/pypy/translator/backendopt/test/test_constfold.py
+++ b/pypy/translator/backendopt/test/test_constfold.py
@@ -49,7 +49,7 @@
     accessor = rclass.FieldListAccessor()
     S2 = lltype.GcStruct('S2', ('x', lltype.Signed),
                          hints={'immutable_fields': accessor})
-    accessor.initialize(S2, {'x': ''})
+    accessor.initialize(S2, {'x': rclass.IR_IMMUTABLE})
     test_simple(S2)
 
 
diff --git a/pypy/translator/c/funcgen.py b/pypy/translator/c/funcgen.py
--- a/pypy/translator/c/funcgen.py
+++ b/pypy/translator/c/funcgen.py
@@ -843,6 +843,9 @@
         return '%s = %s; /* JIT_FORCE_VIRTUAL */' % (self.expr(op.result),
                                                      self.expr(op.args[0]))
 
+    def OP_JIT_FORCE_QUASI_IMMUTABLE(self, op):
+        return '/* JIT_FORCE_QUASI_IMMUTABLE %s */' % op
+
     def OP_GET_GROUP_MEMBER(self, op):
         typename = self.db.gettype(op.result.concretetype)
         return '%s = (%s)_OP_GET_GROUP_MEMBER(%s, %s);' % (
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -508,27 +508,15 @@
 
         shared = self.config.translation.shared
 
-        if (self.config.translation.gcrootfinder == "asmgcc" or
-            self.config.translation.force_make):
-            extra_opts = []
-            if self.config.translation.make_jobs != 1:
-                extra_opts += ['-j', str(self.config.translation.make_jobs)]
-            self.translator.platform.execute_makefile(self.targetdir,
-                                                      extra_opts)
-            if shared:
-                self.shared_library_name = self.executable_name.new(
-                    purebasename='lib' + self.executable_name.purebasename,
-                    ext=self.translator.platform.so_ext)
-        else:
-            compiler = CCompilerDriver(self.translator.platform,
-                                       [self.c_source_filename] + self.extrafiles,
-                                       self.eci, profbased=self.getprofbased(),
-                                       outputfilename=exe_name)
-            self.executable_name = compiler.build(shared=shared)
-            if shared:
-                self.executable_name = self.build_main_for_shared(
-                    self.executable_name, "pypy_main_startup", exe_name)
-            assert self.executable_name
+        extra_opts = []
+        if self.config.translation.make_jobs != 1:
+            extra_opts += ['-j', str(self.config.translation.make_jobs)]
+        self.translator.platform.execute_makefile(self.targetdir,
+                                                  extra_opts)
+        if shared:
+            self.shared_library_name = self.executable_name.new(
+                purebasename='lib' + self.executable_name.purebasename,
+                ext=self.translator.platform.so_ext)
         self._compiled = True
         return self.executable_name
 
diff --git a/pypy/translator/c/src/cjkcodecs/README b/pypy/translator/c/src/cjkcodecs/README
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/README
@@ -0,0 +1,86 @@
+Source
+------
+The .c and .h files come directly from CPython, with the exception of
+cjkcodecs.h and multibytecodec.h, which have been ripped of their
+CPython dependencies.
+
+
+To generate or modify mapping headers
+-------------------------------------
+Mapping headers are imported from CJKCodecs as pre-generated form.
+If you need to tweak or add something on it, please look at tools/
+subdirectory of CJKCodecs' distribution.
+
+
+
+Notes on implmentation characteristics of each codecs
+-----------------------------------------------------
+
+1) Big5 codec
+
+  The big5 codec maps the following characters as cp950 does rather
+  than conforming Unicode.org's that maps to 0xFFFD.
+
+    BIG5        Unicode     Description
+
+    0xA15A      0x2574      SPACING UNDERSCORE
+    0xA1C3      0xFFE3      SPACING HEAVY OVERSCORE
+    0xA1C5      0x02CD      SPACING HEAVY UNDERSCORE
+    0xA1FE      0xFF0F      LT DIAG UP RIGHT TO LOW LEFT
+    0xA240      0xFF3C      LT DIAG UP LEFT TO LOW RIGHT
+    0xA2CC      0x5341      HANGZHOU NUMERAL TEN
+    0xA2CE      0x5345      HANGZHOU NUMERAL THIRTY
+
+  Because unicode 0x5341, 0x5345, 0xFF0F, 0xFF3C is mapped to another
+  big5 codes already, a roundtrip compatibility is not guaranteed for
+  them.
+
+
+2) cp932 codec
+
+  To conform to Windows's real mapping, cp932 codec maps the following
+  codepoints in addition of the official cp932 mapping.
+
+    CP932     Unicode     Description
+
+    0x80      0x80        UNDEFINED
+    0xA0      0xF8F0      UNDEFINED
+    0xFD      0xF8F1      UNDEFINED
+    0xFE      0xF8F2      UNDEFINED
+    0xFF      0xF8F3      UNDEFINED
+
+
+3) euc-jisx0213 codec
+
+  The euc-jisx0213 codec maps JIS X 0213 Plane 1 code 0x2140 into
+  unicode U+FF3C instead of U+005C as on unicode.org's mapping.
+  Because euc-jisx0213 has REVERSE SOLIDUS on 0x5c already and A140
+  is shown as a full width character, mapping to U+FF3C can make
+  more sense.
+
+  The euc-jisx0213 codec is enabled to decode JIS X 0212 codes on
+  codeset 2. Because JIS X 0212 and JIS X 0213 Plane 2 don't have
+  overlapped by each other, it doesn't bother standard conformations
+  (and JIS X 0213 Plane 2 is intended to use so.) On encoding
+  sessions, the codec will try to encode kanji characters in this
+  order:
+
+    JIS X 0213 Plane 1 -> JIS X 0213 Plane 2 -> JIS X 0212
+
+
+4) euc-jp codec
+
+  The euc-jp codec is a compatibility instance on these points:
+   - U+FF3C FULLWIDTH REVERSE SOLIDUS is mapped to EUC-JP A1C0 (vice versa)
+   - U+00A5 YEN SIGN is mapped to EUC-JP 0x5c. (one way)
+   - U+203E OVERLINE is mapped to EUC-JP 0x7e. (one way)
+
+
+5) shift-jis codec
+
+  The shift-jis codec is mapping 0x20-0x7e area to U+20-U+7E directly
+  instead of using JIS X 0201 for compatibility. The differences are:
+   - U+005C REVERSE SOLIDUS is mapped to SHIFT-JIS 0x5c.
+   - U+007E TILDE is mapped to SHIFT-JIS 0x7e.
+   - U+FF3C FULL-WIDTH REVERSE SOLIDUS is mapped to SHIFT-JIS 815f.
+
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_cn.c b/pypy/translator/c/src/cjkcodecs/_codecs_cn.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_cn.c
@@ -0,0 +1,444 @@
+/*
+ * _codecs_cn.c: Codecs collection for Mainland Chinese encodings
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/mappings_cn.h"
+
+/**
+ * hz is predefined as 100 on AIX. So we undefine it to avoid
+ * conflict against hz codec's.
+ */
+#ifdef _AIX
+#undef hz
+#endif
+
+/* GBK and GB2312 map differently in few codepoints that are listed below:
+ *
+ *              gb2312                          gbk
+ * A1A4         U+30FB KATAKANA MIDDLE DOT      U+00B7 MIDDLE DOT
+ * A1AA         U+2015 HORIZONTAL BAR           U+2014 EM DASH
+ * A844         undefined                       U+2015 HORIZONTAL BAR
+ */
+
+#define GBK_DECODE(dc1, dc2, assi) \
+    if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \
+    else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \
+    else if ((dc1) == 0xa1 && (dc2) == 0xa4) (assi) = 0x00b7; \
+    else TRYMAP_DEC(gb2312, assi, dc1 ^ 0x80, dc2 ^ 0x80); \
+    else TRYMAP_DEC(gbkext, assi, dc1, dc2);
+
+#define GBK_ENCODE(code, assi) \
+    if ((code) == 0x2014) (assi) = 0xa1aa; \
+    else if ((code) == 0x2015) (assi) = 0xa844; \
+    else if ((code) == 0x00b7) (assi) = 0xa1a4; \
+    else if ((code) != 0x30fb && TRYMAP_ENC_COND(gbcommon, assi, code));
+
+/*
+ * GB2312 codec
+ */
+
+ENCODER(gb2312)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+        TRYMAP_ENC(gbcommon, code, c);
+        else return 1;
+
+        if (code & 0x8000) /* MSB set: GBK */
+            return 1;
+
+        OUT1((code >> 8) | 0x80)
+        OUT2((code & 0xFF) | 0x80)
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(gb2312)
+{
+    while (inleft > 0) {
+        unsigned char c = **inbuf;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+        TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
+            NEXT(2, 1)
+        }
+        else return 2;
+    }
+
+    return 0;
+}
+
+
+/*
+ * GBK codec
+ */
+
+ENCODER(gbk)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+
+        GBK_ENCODE(c, code)
+        else return 1;
+
+        OUT1((code >> 8) | 0x80)
+        if (code & 0x8000)
+            OUT2((code & 0xFF)) /* MSB set: GBK */
+        else
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(gbk)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+
+        GBK_DECODE(c, IN2, **outbuf)
+        else return 2;
+
+        NEXT(2, 1)
+    }
+
+    return 0;
+}
+
+
+/*
+ * GB18030 codec
+ */
+
+ENCODER(gb18030)
+{
+    while (inleft > 0) {
+        ucs4_t c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        DECODE_SURROGATE(c)
+        if (c > 0x10FFFF)
+#if Py_UNICODE_SIZE == 2
+            return 2; /* surrogates pair */
+#else
+            return 1;
+#endif
+        else if (c >= 0x10000) {
+            ucs4_t tc = c - 0x10000;
+
+            REQUIRE_OUTBUF(4)
+
+            OUT4((unsigned char)(tc % 10) + 0x30)
+            tc /= 10;
+            OUT3((unsigned char)(tc % 126) + 0x81)
+            tc /= 126;
+            OUT2((unsigned char)(tc % 10) + 0x30)
+            tc /= 10;
+            OUT1((unsigned char)(tc + 0x90))
+
+#if Py_UNICODE_SIZE == 2
+            NEXT(2, 4) /* surrogates pair */
+#else
+            NEXT(1, 4)
+#endif
+            continue;
+        }
+
+        REQUIRE_OUTBUF(2)
+
+        GBK_ENCODE(c, code)
+        else TRYMAP_ENC(gb18030ext, code, c);
+        else {
+            const struct _gb18030_to_unibmp_ranges *utrrange;
+
+            REQUIRE_OUTBUF(4)
+
+            for (utrrange = gb18030_to_unibmp_ranges;
+                 utrrange->first != 0;
+                 utrrange++)
+                if (utrrange->first <= c &&
+                    c <= utrrange->last) {
+                    Py_UNICODE tc;
+
+                    tc = c - utrrange->first +
+                         utrrange->base;
+
+                    OUT4((unsigned char)(tc % 10) + 0x30)
+                    tc /= 10;
+                    OUT3((unsigned char)(tc % 126) + 0x81)
+                    tc /= 126;
+                    OUT2((unsigned char)(tc % 10) + 0x30)
+                    tc /= 10;
+                    OUT1((unsigned char)tc + 0x81)
+
+                    NEXT(1, 4)
+                    break;
+                }
+
+            if (utrrange->first == 0)
+                return 1;
+            continue;
+        }
+
+        OUT1((code >> 8) | 0x80)
+        if (code & 0x8000)
+            OUT2((code & 0xFF)) /* MSB set: GBK or GB18030ext */
+        else
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */
+
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(gb18030)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1, c2;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+
+        c2 = IN2;
+        if (c2 >= 0x30 && c2 <= 0x39) { /* 4 bytes seq */
+            const struct _gb18030_to_unibmp_ranges *utr;
+            unsigned char c3, c4;
+            ucs4_t lseq;
+
+            REQUIRE_INBUF(4)
+            c3 = IN3;
+            c4 = IN4;
+            if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)
+                return 4;
+            c -= 0x81;  c2 -= 0x30;
+            c3 -= 0x81; c4 -= 0x30;
+
+            if (c < 4) { /* U+0080 - U+FFFF */
+                lseq = ((ucs4_t)c * 10 + c2) * 1260 +
+                    (ucs4_t)c3 * 10 + c4;
+                if (lseq < 39420) {
+                    for (utr = gb18030_to_unibmp_ranges;
+                         lseq >= (utr + 1)->base;
+                         utr++) ;
+                    OUT1(utr->first - utr->base + lseq)
+                    NEXT(4, 1)
+                    continue;
+                }
+            }
+            else if (c >= 15) { /* U+10000 - U+10FFFF */
+                lseq = 0x10000 + (((ucs4_t)c-15) * 10 + c2)
+                    * 1260 + (ucs4_t)c3 * 10 + c4;
+                if (lseq <= 0x10FFFF) {
+                    WRITEUCS4(lseq);
+                    NEXT_IN(4)
+                    continue;
+                }
+            }
+            return 4;
+        }
+
+        GBK_DECODE(c, c2, **outbuf)
+        else TRYMAP_DEC(gb18030ext, **outbuf, c, c2);
+        else return 2;
+
+        NEXT(2, 1)
+    }
+
+    return 0;
+}
+
+
+/*
+ * HZ codec
+ */
+
+ENCODER_INIT(hz)
+{
+    state->i = 0;
+    return 0;
+}
+
+ENCODER_RESET(hz)
+{
+    if (state->i != 0) {
+        WRITE2('~', '}')
+        state->i = 0;
+        NEXT_OUT(2)
+    }
+    return 0;
+}
+
+ENCODER(hz)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            if (state->i == 0) {
+                WRITE1((unsigned char)c)
+                NEXT(1, 1)
+            }
+            else {
+                WRITE3('~', '}', (unsigned char)c)
+                NEXT(1, 3)
+                state->i = 0;
+            }
+            continue;
+        }
+
+        UCS4INVALID(c)
+
+        TRYMAP_ENC(gbcommon, code, c);
+        else return 1;
+
+        if (code & 0x8000) /* MSB set: GBK */
+            return 1;
+
+        if (state->i == 0) {
+            WRITE4('~', '{', code >> 8, code & 0xff)
+            NEXT(1, 4)
+            state->i = 1;
+        }
+        else {
+            WRITE2(code >> 8, code & 0xff)
+            NEXT(1, 2)
+        }
+    }
+
+    return 0;
+}
+
+DECODER_INIT(hz)
+{
+    state->i = 0;
+    return 0;
+}
+
+DECODER_RESET(hz)
+{
+    state->i = 0;
+    return 0;
+}
+
+DECODER(hz)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        if (c == '~') {
+            unsigned char c2 = IN2;
+
+            REQUIRE_INBUF(2)
+            if (c2 == '~') {
+                WRITE1('~')
+                NEXT(2, 1)
+                continue;
+            }
+            else if (c2 == '{' && state->i == 0)
+                state->i = 1; /* set GB */
+            else if (c2 == '}' && state->i == 1)
+                state->i = 0; /* set ASCII */
+            else if (c2 == '\n')
+                ; /* line-continuation */
+            else
+                return 2;
+            NEXT(2, 0);
+            continue;
+        }
+
+        if (c & 0x80)
+            return 1;
+
+        if (state->i == 0) { /* ASCII mode */
+            WRITE1(c)
+            NEXT(1, 1)
+        }
+        else { /* GB mode */
+            REQUIRE_INBUF(2)
+            REQUIRE_OUTBUF(1)
+            TRYMAP_DEC(gb2312, **outbuf, c, IN2) {
+                NEXT(2, 1)
+            }
+            else
+                return 2;
+        }
+    }
+
+    return 0;
+}
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_DECONLY(gb2312)
+  MAPPING_DECONLY(gbkext)
+  MAPPING_ENCONLY(gbcommon)
+  MAPPING_ENCDEC(gb18030ext)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS(gb2312)
+  CODEC_STATELESS(gbk)
+  CODEC_STATELESS(gb18030)
+  CODEC_STATEFUL(hz)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(cn)
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_hk.c b/pypy/translator/c/src/cjkcodecs/_codecs_hk.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_hk.c
@@ -0,0 +1,180 @@
+/*
+ * _codecs_hk.c: Codecs collection for encodings from Hong Kong
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#define USING_IMPORTED_MAPS
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/mappings_hk.h"
+
+/*
+ * BIG5HKSCS codec
+ */
+
+USING_IMPORTED_MAP(big5);
+static const encode_map *big5_encmap = NULL;
+static const decode_map *big5_decmap = NULL;
+
+CODEC_INIT(big5hkscs)
+{
+  IMPORT_MAP(tw, big5, &big5_encmap, &big5_decmap);
+  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) {
+        ucs4_t c = **inbuf;
+        DBCHAR code;
+        Py_ssize_t insize;
+
+        if (c < 0x80) {
+            REQUIRE_OUTBUF(1)
+            **outbuf = (unsigned char)c;
+            NEXT(1, 1)
+            continue;
+        }
+
+        DECODE_SURROGATE(c)
+        insize = GET_INSIZE(c);
+
+        REQUIRE_OUTBUF(2)
+
+        if (c < 0x10000) {
+            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;
+        }
+        else if (c < 0x20000)
+            return insize;
+        else if (c < 0x30000) {
+            TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff);
+            else return insize;
+        }
+        else
+            return insize;
+
+        OUT1(code >> 8)
+        OUT2(code & 0xFF)
+        NEXT(insize, 2)
+    }
+
+    return 0;
+}
+
+#define BH2S(c1, c2) (((c1) - 0x87) * (0xfe - 0x40 + 1) + ((c2) - 0x40))
+
+DECODER(big5hkscs)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+        ucs4_t decoded;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+
+        if (0xc6 <= c && c <= 0xc8 && (c >= 0xc7 || IN2 >= 0xa1))
+            goto hkscsdec;
+
+        TRYMAP_DEC(big5, **outbuf, c, IN2) {
+            NEXT(2, 1)
+        }
+        else
+hkscsdec:       TRYMAP_DEC(big5hkscs, decoded, c, IN2) {
+                        int s = BH2S(c, IN2);
+                        const unsigned char *hintbase;
+
+                        assert(0x87 <= c && c <= 0xfe);
+                        assert(0x40 <= IN2 && IN2 <= 0xfe);
+
+                        if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {
+                                hintbase = big5hkscs_phint_0;
+                                s -= BH2S(0x87, 0x40);
+                        }
+                        else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){
+                                hintbase = big5hkscs_phint_12130;
+                                s -= BH2S(0xc6, 0xa1);
+                        }
+                        else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){
+                                hintbase = big5hkscs_phint_21924;
+                                s -= BH2S(0xf9, 0xd6);
+                        }
+                        else
+                                return MBERR_INTERNAL;
+
+                        if (hintbase[s >> 3] & (1 << (s & 7))) {
+                                WRITEUCS4(decoded | 0x20000)
+                                NEXT_IN(2)
+                        }
+                        else {
+                                OUT1(decoded)
+                                NEXT(2, 1)
+                        }
+                }
+                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;
+}
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_DECONLY(big5hkscs)
+  MAPPING_ENCONLY(big5hkscs_bmp)
+  MAPPING_ENCONLY(big5hkscs_nonbmp)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS_WINIT(big5hkscs)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(hk)
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_iso2022.c b/pypy/translator/c/src/cjkcodecs/_codecs_iso2022.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_iso2022.c
@@ -0,0 +1,1112 @@
+/*
+ * _codecs_iso2022.c: Codecs collection for ISO-2022 encodings.
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#define USING_IMPORTED_MAPS
+#define USING_BINARY_PAIR_SEARCH
+#define EXTERN_JISX0213_PAIR
+#define EMULATE_JISX0213_2000_ENCODE_INVALID MAP_UNMAPPABLE
+#define EMULATE_JISX0213_2000_DECODE_INVALID MAP_UNMAPPABLE
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/alg_jisx0201.h"
+#include "src/cjkcodecs/emu_jisx0213_2000.h"
+#include "src/cjkcodecs/mappings_jisx0213_pair.h"
+
+/* STATE
+
+   state->c[0-3]
+
+    00000000
+    ||^^^^^|
+    |+-----+----  G0-3 Character Set
+    +-----------  Is G0-3 double byte?
+
+   state->c[4]
+
+    00000000
+          ||
+          |+----  Locked-Shift?
+          +-----  ESC Throughout
+*/
+
+#define ESC                     0x1B
+#define SO                      0x0E
+#define SI                      0x0F
+#define LF                      0x0A
+
+#define MAX_ESCSEQLEN           16
+
+#define CHARSET_ISO8859_1       'A'
+#define CHARSET_ASCII           'B'
+#define CHARSET_ISO8859_7       'F'
+#define CHARSET_JISX0201_K      'I'
+#define CHARSET_JISX0201_R      'J'
+
+#define CHARSET_GB2312          ('A'|CHARSET_DBCS)
+#define CHARSET_JISX0208        ('B'|CHARSET_DBCS)
+#define CHARSET_KSX1001         ('C'|CHARSET_DBCS)
+#define CHARSET_JISX0212        ('D'|CHARSET_DBCS)
+#define CHARSET_GB2312_8565     ('E'|CHARSET_DBCS)
+#define CHARSET_CNS11643_1      ('G'|CHARSET_DBCS)
+#define CHARSET_CNS11643_2      ('H'|CHARSET_DBCS)
+#define CHARSET_JISX0213_2000_1 ('O'|CHARSET_DBCS)
+#define CHARSET_JISX0213_2      ('P'|CHARSET_DBCS)
+#define CHARSET_JISX0213_2004_1 ('Q'|CHARSET_DBCS)
+#define CHARSET_JISX0208_O      ('@'|CHARSET_DBCS)
+
+#define CHARSET_DBCS            0x80
+#define ESCMARK(mark)           ((mark) & 0x7f)
+
+#define IS_ESCEND(c)    (((c) >= 'A' && (c) <= 'Z') || (c) == '@')
+#define IS_ISO2022ESC(c2) \
+        ((c2) == '(' || (c2) == ')' || (c2) == '$' || \
+         (c2) == '.' || (c2) == '&')
+    /* this is not a complete list of ISO-2022 escape sequence headers.
+     * but, it's enough to implement CJK instances of iso-2022. */
+
+#define MAP_UNMAPPABLE          0xFFFF
+#define MAP_MULTIPLE_AVAIL      0xFFFE /* for JIS X 0213 */
+
+#define F_SHIFTED               0x01
+#define F_ESCTHROUGHOUT         0x02
+
+#define STATE_SETG(dn, v)       ((state)->c[dn]) = (v);
+#define STATE_GETG(dn)          ((state)->c[dn])
+
+#define STATE_G0                STATE_GETG(0)
+#define STATE_G1                STATE_GETG(1)
+#define STATE_G2                STATE_GETG(2)
+#define STATE_G3                STATE_GETG(3)
+#define STATE_SETG0(v)          STATE_SETG(0, v)
+#define STATE_SETG1(v)          STATE_SETG(1, v)
+#define STATE_SETG2(v)          STATE_SETG(2, v)
+#define STATE_SETG3(v)          STATE_SETG(3, v)
+
+#define STATE_SETFLAG(f)        ((state)->c[4]) |= (f);
+#define STATE_GETFLAG(f)        ((state)->c[4] & (f))
+#define STATE_CLEARFLAG(f)      ((state)->c[4]) &= ~(f);
+#define STATE_CLEARFLAGS()      ((state)->c[4]) = 0;
+
+#define ISO2022_CONFIG          ((const struct iso2022_config *)config)
+#define CONFIG_ISSET(flag)      (ISO2022_CONFIG->flags & (flag))
+#define CONFIG_DESIGNATIONS     (ISO2022_CONFIG->designations)
+
+/* iso2022_config.flags */
+#define NO_SHIFT                0x01
+#define USE_G2                  0x02
+#define USE_JISX0208_EXT        0x04
+
+/*-*- internal data structures -*-*/
+
+typedef int (*iso2022_init_func)(void);
+typedef ucs4_t (*iso2022_decode_func)(const unsigned char *data);
+typedef DBCHAR (*iso2022_encode_func)(const ucs4_t *data, Py_ssize_t *length);
+
+struct iso2022_designation {
+    unsigned char mark;
+    unsigned char plane;
+    unsigned char width;
+    iso2022_init_func initializer;
+    iso2022_decode_func decoder;
+    iso2022_encode_func encoder;
+};
+
+struct iso2022_config {
+    int flags;
+    const struct iso2022_designation *designations; /* non-ascii desigs */
+};
+
+/*-*- iso-2022 codec implementation -*-*/
+
+CODEC_INIT(iso2022)
+{
+    const struct iso2022_designation *desig = CONFIG_DESIGNATIONS;
+    for (desig = CONFIG_DESIGNATIONS; desig->mark; desig++)
+        if (desig->initializer != NULL && desig->initializer() != 0)
+            return -1;
+    return 0;
+}
+
+ENCODER_INIT(iso2022)
+{
+    STATE_CLEARFLAGS()
+    STATE_SETG0(CHARSET_ASCII)
+    STATE_SETG1(CHARSET_ASCII)
+    return 0;
+}
+
+ENCODER_RESET(iso2022)
+{
+    if (STATE_GETFLAG(F_SHIFTED)) {
+        WRITE1(SI)
+        NEXT_OUT(1)
+        STATE_CLEARFLAG(F_SHIFTED)
+    }
+    if (STATE_G0 != CHARSET_ASCII) {
+        WRITE3(ESC, '(', 'B')
+        NEXT_OUT(3)
+        STATE_SETG0(CHARSET_ASCII)
+    }
+    return 0;
+}
+
+ENCODER(iso2022)
+{
+    while (inleft > 0) {
+        const struct iso2022_designation *dsg;
+        DBCHAR encoded;
+        ucs4_t c = **inbuf;
+        Py_ssize_t insize;
+
+        if (c < 0x80) {
+            if (STATE_G0 != CHARSET_ASCII) {
+                WRITE3(ESC, '(', 'B')
+                STATE_SETG0(CHARSET_ASCII)
+                NEXT_OUT(3)
+            }
+            if (STATE_GETFLAG(F_SHIFTED)) {
+                WRITE1(SI)
+                STATE_CLEARFLAG(F_SHIFTED)
+                NEXT_OUT(1)
+            }
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        DECODE_SURROGATE(c)
+        insize = GET_INSIZE(c);
+
+        encoded = MAP_UNMAPPABLE;
+        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
+            Py_ssize_t length = 1;
+            encoded = dsg->encoder(&c, &length);
+            if (encoded == MAP_MULTIPLE_AVAIL) {
+                /* this implementation won't work for pair
+                 * of non-bmp characters. */
+                if (inleft < 2) {
+                    if (!(flags & MBENC_FLUSH))
+                        return MBERR_TOOFEW;
+                    length = -1;
+                }
+                else
+                    length = 2;
+#if Py_UNICODE_SIZE == 2
+                if (length == 2) {
+                    ucs4_t u4in[2];
+                    u4in[0] = (ucs4_t)IN1;
+                    u4in[1] = (ucs4_t)IN2;
+                    encoded = dsg->encoder(u4in, &length);
+                } else
+                    encoded = dsg->encoder(&c, &length);
+#else
+                encoded = dsg->encoder(&c, &length);
+#endif
+                if (encoded != MAP_UNMAPPABLE) {
+                    insize = length;
+                    break;
+                }
+            }
+            else if (encoded != MAP_UNMAPPABLE)
+                break;
+        }
+
+        if (!dsg->mark)
+            return 1;
+        assert(dsg->width == 1 || dsg->width == 2);
+
+        switch (dsg->plane) {
+        case 0: /* G0 */
+            if (STATE_GETFLAG(F_SHIFTED)) {
+                WRITE1(SI)
+                STATE_CLEARFLAG(F_SHIFTED)
+                NEXT_OUT(1)
+            }
+            if (STATE_G0 != dsg->mark) {
+                if (dsg->width == 1) {
+                    WRITE3(ESC, '(', ESCMARK(dsg->mark))
+                    STATE_SETG0(dsg->mark)
+                    NEXT_OUT(3)
+                }
+                else if (dsg->mark == CHARSET_JISX0208) {
+                    WRITE3(ESC, '$', ESCMARK(dsg->mark))
+                    STATE_SETG0(dsg->mark)
+                    NEXT_OUT(3)
+                }
+                else {
+                    WRITE4(ESC, '$', '(',
+                        ESCMARK(dsg->mark))
+                    STATE_SETG0(dsg->mark)
+                    NEXT_OUT(4)
+                }
+            }
+            break;
+        case 1: /* G1 */
+            if (STATE_G1 != dsg->mark) {
+                if (dsg->width == 1) {
+                    WRITE3(ESC, ')', ESCMARK(dsg->mark))
+                    STATE_SETG1(dsg->mark)
+                    NEXT_OUT(3)
+                }
+                else {
+                    WRITE4(ESC, '$', ')',
+                        ESCMARK(dsg->mark))
+                    STATE_SETG1(dsg->mark)
+                    NEXT_OUT(4)
+                }
+            }
+            if (!STATE_GETFLAG(F_SHIFTED)) {
+                WRITE1(SO)
+                STATE_SETFLAG(F_SHIFTED)
+                NEXT_OUT(1)
+            }
+            break;
+        default: /* G2 and G3 is not supported: no encoding in
+                  * CJKCodecs are using them yet */
+            return MBERR_INTERNAL;
+        }
+
+        if (dsg->width == 1) {
+            WRITE1((unsigned char)encoded)
+            NEXT_OUT(1)
+        }
+        else {
+            WRITE2(encoded >> 8, encoded & 0xff)
+            NEXT_OUT(2)
+        }
+        NEXT_IN(insize)
+    }
+
+    return 0;
+}
+
+DECODER_INIT(iso2022)
+{
+    STATE_CLEARFLAGS()
+    STATE_SETG0(CHARSET_ASCII)
+    STATE_SETG1(CHARSET_ASCII)
+    STATE_SETG2(CHARSET_ASCII)
+    return 0;
+}
+
+DECODER_RESET(iso2022)
+{
+    STATE_SETG0(CHARSET_ASCII)
+    STATE_CLEARFLAG(F_SHIFTED)
+    return 0;
+}
+
+static Py_ssize_t
+iso2022processesc(const void *config, MultibyteCodec_State *state,
+                  const unsigned char **inbuf, Py_ssize_t *inleft)
+{
+    unsigned char charset, designation;
+    Py_ssize_t i, esclen;
+
+    for (i = 1;i < MAX_ESCSEQLEN;i++) {
+        if (i >= *inleft)
+            return MBERR_TOOFEW;
+        if (IS_ESCEND((*inbuf)[i])) {
+            esclen = i + 1;
+            break;
+        }
+        else if (CONFIG_ISSET(USE_JISX0208_EXT) && i+1 < *inleft &&
+                 (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@')
+            i += 2;
+    }
+
+    if (i >= MAX_ESCSEQLEN)
+        return 1; /* unterminated escape sequence */
+
+    switch (esclen) {
+    case 3:
+        if (IN2 == '$') {
+            charset = IN3 | CHARSET_DBCS;
+            designation = 0;
+        }
+        else {
+            charset = IN3;
+            if (IN2 == '(') designation = 0;
+            else if (IN2 == ')') designation = 1;
+            else if (CONFIG_ISSET(USE_G2) && IN2 == '.')
+                designation = 2;
+            else return 3;
+        }
+        break;
+    case 4:
+        if (IN2 != '$')
+            return 4;
+
+        charset = IN4 | CHARSET_DBCS;
+        if (IN3 == '(') designation = 0;
+        else if (IN3 == ')') designation = 1;
+        else return 4;
+        break;
+    case 6: /* designation with prefix */
+        if (CONFIG_ISSET(USE_JISX0208_EXT) &&
+            (*inbuf)[3] == ESC && (*inbuf)[4] == '$' &&
+            (*inbuf)[5] == 'B') {
+            charset = 'B' | CHARSET_DBCS;
+            designation = 0;
+        }
+        else
+            return 6;
+        break;
+    default:
+        return esclen;
+    }
+
+    /* raise error when the charset is not designated for this encoding */
+    if (charset != CHARSET_ASCII) {
+        const struct iso2022_designation *dsg;
+
+        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++)
+            if (dsg->mark == charset)
+                break;
+        if (!dsg->mark)
+            return esclen;
+    }
+
+    STATE_SETG(designation, charset)
+    *inleft -= esclen;
+    (*inbuf) += esclen;
+    return 0;
+}
+
+#define ISO8859_7_DECODE(c, assi)                                       \
+    if ((c) < 0xa0) (assi) = (c);                                       \
+    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0))))          \
+        (assi) = (c);                                                   \
+    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||              \
+             (0xbffffd77L & (1L << ((c)-0xb4)))))                       \
+        (assi) = 0x02d0 + (c);                                          \
+    else if ((c) == 0xa1) (assi) = 0x2018;                              \
+    else if ((c) == 0xa2) (assi) = 0x2019;                              \
+    else if ((c) == 0xaf) (assi) = 0x2015;
+
+static Py_ssize_t
+iso2022processg2(const void *config, MultibyteCodec_State *state,
+                 const unsigned char **inbuf, Py_ssize_t *inleft,
+                 Py_UNICODE **outbuf, Py_ssize_t *outleft)
+{
+    /* not written to use encoder, decoder functions because only few
+     * encodings use G2 designations in CJKCodecs */
+    if (STATE_G2 == CHARSET_ISO8859_1) {
+        if (IN3 < 0x80)
+            OUT1(IN3 + 0x80)
+        else
+            return 3;
+    }
+    else if (STATE_G2 == CHARSET_ISO8859_7) {
+        ISO8859_7_DECODE(IN3 ^ 0x80, **outbuf)
+        else return 3;
+    }
+    else if (STATE_G2 == CHARSET_ASCII) {
+        if (IN3 & 0x80) return 3;
+        else **outbuf = IN3;
+    }
+    else
+        return MBERR_INTERNAL;
+
+    (*inbuf) += 3;
+    *inleft -= 3;
+    (*outbuf) += 1;
+    *outleft -= 1;
+    return 0;
+}
+
+DECODER(iso2022)
+{
+    const struct iso2022_designation *dsgcache = NULL;
+
+    while (inleft > 0) {
+        unsigned char c = IN1;
+        Py_ssize_t err;
+
+        if (STATE_GETFLAG(F_ESCTHROUGHOUT)) {
+            /* ESC throughout mode:
+             * for non-iso2022 escape sequences */
+            WRITE1(c) /* assume as ISO-8859-1 */
+            NEXT(1, 1)
+            if (IS_ESCEND(c)) {
+                STATE_CLEARFLAG(F_ESCTHROUGHOUT)
+            }
+            continue;
+        }
+
+        switch (c) {
+        case ESC:
+            REQUIRE_INBUF(2)
+            if (IS_ISO2022ESC(IN2)) {
+                err = iso2022processesc(config, state,
+                                        inbuf, &inleft);
+                if (err != 0)
+                    return err;
+            }
+            else if (CONFIG_ISSET(USE_G2) && IN2 == 'N') {/* SS2 */
+                REQUIRE_INBUF(3)
+                err = iso2022processg2(config, state,
+                    inbuf, &inleft, outbuf, &outleft);
+                if (err != 0)
+                    return err;
+            }
+            else {
+                WRITE1(ESC)
+                STATE_SETFLAG(F_ESCTHROUGHOUT)
+                NEXT(1, 1)
+            }
+            break;
+        case SI:
+            if (CONFIG_ISSET(NO_SHIFT))
+                goto bypass;
+            STATE_CLEARFLAG(F_SHIFTED)
+            NEXT_IN(1)
+            break;
+        case SO:
+            if (CONFIG_ISSET(NO_SHIFT))
+                goto bypass;
+            STATE_SETFLAG(F_SHIFTED)
+            NEXT_IN(1)
+            break;
+        case LF:
+            STATE_CLEARFLAG(F_SHIFTED)
+            WRITE1(LF)
+            NEXT(1, 1)
+            break;
+        default:
+            if (c < 0x20) /* C0 */
+                goto bypass;
+            else if (c >= 0x80)
+                return 1;
+            else {
+                const struct iso2022_designation *dsg;
+                unsigned char charset;
+                ucs4_t decoded;
+
+                if (STATE_GETFLAG(F_SHIFTED))
+                    charset = STATE_G1;
+                else
+                    charset = STATE_G0;
+
+                if (charset == CHARSET_ASCII) {
+bypass:                                 WRITE1(c)
+                                        NEXT(1, 1)
+                                        break;
+                                }
+
+                                if (dsgcache != NULL &&
+                                    dsgcache->mark == charset)
+                                        dsg = dsgcache;
+                                else {
+                                        for (dsg = CONFIG_DESIGNATIONS;
+                                             dsg->mark != charset
+#ifdef Py_DEBUG
+                                                && dsg->mark != '\0'
+#endif
+                                             ;dsg++)
+                                                /* noop */;
+                                        assert(dsg->mark != '\0');
+                                        dsgcache = dsg;
+                                }
+
+                                REQUIRE_INBUF(dsg->width)
+                                decoded = dsg->decoder(*inbuf);
+                                if (decoded == MAP_UNMAPPABLE)
+                                        return dsg->width;
+
+                                if (decoded < 0x10000) {
+                                        WRITE1(decoded)
+                                        NEXT_OUT(1)
+                                }
+                                else if (decoded < 0x30000) {
+                                        WRITEUCS4(decoded)
+                                }
+                                else { /* JIS X 0213 pairs */
+                    WRITE2(decoded >> 16, decoded & 0xffff)
+                    NEXT_OUT(2)
+                }
+                NEXT_IN(dsg->width)
+            }
+            break;
+        }
+    }
+    return 0;
+}
+
+/*-*- mapping table holders -*-*/
+
+USING_IMPORTED_MAP(cp949)
+USING_IMPORTED_MAP(ksx1001)
+USING_IMPORTED_MAP(jisxcommon)
+USING_IMPORTED_MAP(jisx0208)
+USING_IMPORTED_MAP(jisx0212)
+USING_IMPORTED_MAP(jisx0213_bmp)
+USING_IMPORTED_MAP(jisx0213_1_bmp)
+USING_IMPORTED_MAP(jisx0213_2_bmp)
+USING_IMPORTED_MAP(jisx0213_emp)
+USING_IMPORTED_MAP(jisx0213_1_emp)
+USING_IMPORTED_MAP(jisx0213_2_emp)
+USING_IMPORTED_MAP(jisx0213_pair)
+USING_IMPORTED_MAP(gbcommon)
+USING_IMPORTED_MAP(gb2312)
+
+#define ENCMAP(enc) static const encode_map *enc##_encmap = NULL;
+#define DECMAP(enc) static const decode_map *enc##_decmap = NULL;
+
+/* kr */
+ENCMAP(cp949)
+DECMAP(ksx1001)
+
+/* jp */
+ENCMAP(jisxcommon)
+DECMAP(jisx0208)
+DECMAP(jisx0212)
+ENCMAP(jisx0213_bmp)
+DECMAP(jisx0213_1_bmp)
+DECMAP(jisx0213_2_bmp)
+ENCMAP(jisx0213_emp)
+DECMAP(jisx0213_1_emp)
+DECMAP(jisx0213_2_emp)
+
+/* cn */
+ENCMAP(gbcommon)
+DECMAP(gb2312)
+
+/* tw */
+
+/*-*- mapping access functions -*-*/
+
+static int
+ksx1001_init(void)
+{
+  IMPORT_MAP(kr, cp949, &cp949_encmap, NULL);
+  IMPORT_MAP(kr, ksx1001, NULL, &ksx1001_decmap);
+  return 0;
+}
+
+static ucs4_t
+ksx1001_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    TRYMAP_DEC(ksx1001, u, data[0], data[1])
+        return u;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+ksx1001_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    assert(*length == 1);
+    if (*data < 0x10000) {
+        TRYMAP_ENC(cp949, coded, *data)
+            if (!(coded & 0x8000))
+                return coded;
+    }
+    return MAP_UNMAPPABLE;
+}
+
+static int
+jisx0208_init(void)
+{
+  IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL);
+  IMPORT_MAP(jp, jisx0208, NULL, &jisx0208_decmap);
+  return 0;
+}
+
+static ucs4_t
+jisx0208_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
+        return 0xff3c;
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1])
+        return u;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+jisx0208_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    assert(*length == 1);
+    if (*data < 0x10000) {
+        if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
+            return 0x2140;
+        else TRYMAP_ENC(jisxcommon, coded, *data) {
+            if (!(coded & 0x8000))
+                return coded;
+        }
+    }
+    return MAP_UNMAPPABLE;
+}
+
+static int
+jisx0212_init(void)
+{
+  IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL);
+  IMPORT_MAP(jp, jisx0212, NULL, &jisx0212_decmap);
+  return 0;
+}
+
+static ucs4_t
+jisx0212_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    TRYMAP_DEC(jisx0212, u, data[0], data[1])
+        return u;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+jisx0212_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    assert(*length == 1);
+    if (*data < 0x10000) {
+        TRYMAP_ENC(jisxcommon, coded, *data) {
+            if (coded & 0x8000)
+                return coded & 0x7fff;
+        }
+    }
+    return MAP_UNMAPPABLE;
+}
+
+static int
+jisx0213_init(void)
+{
+  jisx0208_init();
+  IMPORT_MAP(jp, jisx0213_bmp, &jisx0213_bmp_encmap, NULL);
+  IMPORT_MAP(jp, jisx0213_1_bmp, NULL, &jisx0213_1_bmp_decmap);
+  IMPORT_MAP(jp, jisx0213_2_bmp, NULL, &jisx0213_2_bmp_decmap);
+  IMPORT_MAP(jp, jisx0213_emp, &jisx0213_emp_encmap, NULL);
+  IMPORT_MAP(jp, jisx0213_1_emp, NULL, &jisx0213_1_emp_decmap);
+  IMPORT_MAP(jp, jisx0213_2_emp, NULL, &jisx0213_2_emp_decmap);
+  IMPORT_MAP(jp, jisx0213_pair, &jisx0213_pair_encmap, &jisx0213_pair_decmap);
+  return 0;
+}
+
+#define config ((void *)2000)
+static ucs4_t
+jisx0213_2000_1_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
+    else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
+        return 0xff3c;
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])
+        u |= 0x20000;
+    else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);
+    else
+        return MAP_UNMAPPABLE;
+    return u;
+}
+
+static ucs4_t
+jisx0213_2000_2_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    EMULATE_JISX0213_2000_DECODE_PLANE2(u, data[0], data[1])
+    TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])
+        u |= 0x20000;
+    else
+        return MAP_UNMAPPABLE;
+    return u;
+}
+#undef config
+
+static ucs4_t
+jisx0213_2004_1_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
+        return 0xff3c;
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])
+        u |= 0x20000;
+    else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);
+    else
+        return MAP_UNMAPPABLE;
+    return u;
+}
+
+static ucs4_t
+jisx0213_2004_2_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);
+    else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])
+        u |= 0x20000;
+    else
+        return MAP_UNMAPPABLE;
+    return u;
+}
+
+static DBCHAR
+jisx0213_encoder(const ucs4_t *data, Py_ssize_t *length, void *config)
+{
+    DBCHAR coded;
+
+    switch (*length) {
+    case 1: /* first character */
+        if (*data >= 0x10000) {
+            if ((*data) >> 16 == 0x20000 >> 16) {
+                EMULATE_JISX0213_2000_ENCODE_EMP(coded, *data)
+                else TRYMAP_ENC(jisx0213_emp, coded,
+                                (*data) & 0xffff)
+                    return coded;
+            }
+            return MAP_UNMAPPABLE;
+        }
+
+        EMULATE_JISX0213_2000_ENCODE_BMP(coded, *data)
+        else TRYMAP_ENC(jisx0213_bmp, coded, *data) {
+            if (coded == MULTIC)
+                return MAP_MULTIPLE_AVAIL;
+        }
+        else TRYMAP_ENC(jisxcommon, coded, *data) {
+            if (coded & 0x8000)
+                return MAP_UNMAPPABLE;
+        }
+        else
+            return MAP_UNMAPPABLE;
+        return coded;
+    case 2: /* second character of unicode pair */
+        coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1],
+                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);
+        if (coded == DBCINV) {
+            *length = 1;
+            coded = find_pairencmap((ucs2_t)data[0], 0,
+                      jisx0213_pair_encmap, JISX0213_ENCPAIRS);
+            if (coded == DBCINV)
+                return MAP_UNMAPPABLE;
+        }
+        else
+            return coded;
+    case -1: /* flush unterminated */
+        *length = 1;
+        coded = find_pairencmap((ucs2_t)data[0], 0,
+                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);
+        if (coded == DBCINV)
+            return MAP_UNMAPPABLE;
+        else
+            return coded;
+    default:
+        return MAP_UNMAPPABLE;
+    }
+}
+
+static DBCHAR
+jisx0213_2000_1_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
+        return coded;
+    else if (coded & 0x8000)
+        return MAP_UNMAPPABLE;
+    else
+        return coded;
+}
+
+static DBCHAR
+jisx0213_2000_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    Py_ssize_t ilength = *length;
+
+    coded = jisx0213_encoder(data, length, (void *)2000);
+    switch (ilength) {
+    case 1:
+        if (coded == MAP_MULTIPLE_AVAIL)
+            return MAP_MULTIPLE_AVAIL;
+        else
+            return MAP_UNMAPPABLE;
+    case 2:
+        if (*length != 2)
+            return MAP_UNMAPPABLE;
+        else
+            return coded;
+    default:
+        return MAP_UNMAPPABLE;
+    }
+}
+
+static DBCHAR
+jisx0213_2000_2_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
+        return coded;
+    else if (coded & 0x8000)
+        return coded & 0x7fff;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+jisx0213_2004_1_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded = jisx0213_encoder(data, length, NULL);
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
+        return coded;
+    else if (coded & 0x8000)
+        return MAP_UNMAPPABLE;
+    else
+        return coded;
+}
+
+static DBCHAR
+jisx0213_2004_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    Py_ssize_t ilength = *length;
+
+    coded = jisx0213_encoder(data, length, NULL);
+    switch (ilength) {
+    case 1:
+        if (coded == MAP_MULTIPLE_AVAIL)
+            return MAP_MULTIPLE_AVAIL;
+        else
+            return MAP_UNMAPPABLE;
+    case 2:
+        if (*length != 2)
+            return MAP_UNMAPPABLE;
+        else
+            return coded;
+    default:
+        return MAP_UNMAPPABLE;
+    }
+}
+
+static DBCHAR
+jisx0213_2004_2_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded = jisx0213_encoder(data, length, NULL);
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
+        return coded;
+    else if (coded & 0x8000)
+        return coded & 0x7fff;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static ucs4_t
+jisx0201_r_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    JISX0201_R_DECODE(*data, u)
+    else return MAP_UNMAPPABLE;
+    return u;
+}
+
+static DBCHAR
+jisx0201_r_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    JISX0201_R_ENCODE(*data, coded)
+    else return MAP_UNMAPPABLE;
+    return coded;
+}
+
+static ucs4_t
+jisx0201_k_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    JISX0201_K_DECODE(*data ^ 0x80, u)
+    else return MAP_UNMAPPABLE;
+    return u;
+}
+
+static DBCHAR
+jisx0201_k_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    JISX0201_K_ENCODE(*data, coded)
+    else return MAP_UNMAPPABLE;
+    return coded - 0x80;
+}
+
+static int
+gb2312_init(void)
+{
+  IMPORT_MAP(cn, gbcommon, &gbcommon_encmap, NULL);
+  IMPORT_MAP(cn, gb2312, NULL, &gb2312_decmap);
+  return 0;
+}
+
+static ucs4_t
+gb2312_decoder(const unsigned char *data)
+{
+    ucs4_t u;
+    TRYMAP_DEC(gb2312, u, data[0], data[1])
+        return u;
+    else
+        return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+gb2312_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    DBCHAR coded;
+    assert(*length == 1);
+    if (*data < 0x10000) {
+        TRYMAP_ENC(gbcommon, coded, *data) {
+            if (!(coded & 0x8000))
+                return coded;
+        }
+    }
+    return MAP_UNMAPPABLE;
+}
+
+
+static ucs4_t
+dummy_decoder(const unsigned char *data)
+{
+    return MAP_UNMAPPABLE;
+}
+
+static DBCHAR
+dummy_encoder(const ucs4_t *data, Py_ssize_t *length)
+{
+    return MAP_UNMAPPABLE;
+}
+
+/*-*- registry tables -*-*/
+
+#define REGISTRY_KSX1001_G0     { CHARSET_KSX1001, 0, 2,                \
+                  ksx1001_init,                                         \
+                  ksx1001_decoder, ksx1001_encoder }
+#define REGISTRY_KSX1001_G1     { CHARSET_KSX1001, 1, 2,                \
+                  ksx1001_init,                                         \
+                  ksx1001_decoder, ksx1001_encoder }
+#define REGISTRY_JISX0201_R     { CHARSET_JISX0201_R, 0, 1,             \
+                  NULL,                                                 \
+                  jisx0201_r_decoder, jisx0201_r_encoder }
+#define REGISTRY_JISX0201_K     { CHARSET_JISX0201_K, 0, 1,             \
+                  NULL,                                                 \
+                  jisx0201_k_decoder, jisx0201_k_encoder }
+#define REGISTRY_JISX0208       { CHARSET_JISX0208, 0, 2,               \
+                  jisx0208_init,                                        \
+                  jisx0208_decoder, jisx0208_encoder }
+#define REGISTRY_JISX0208_O     { CHARSET_JISX0208_O, 0, 2,             \
+                  jisx0208_init,                                        \
+                  jisx0208_decoder, jisx0208_encoder }
+#define REGISTRY_JISX0212       { CHARSET_JISX0212, 0, 2,               \
+                  jisx0212_init,                                        \
+                  jisx0212_decoder, jisx0212_encoder }
+#define REGISTRY_JISX0213_2000_1 { CHARSET_JISX0213_2000_1, 0, 2,       \
+                  jisx0213_init,                                        \
+                  jisx0213_2000_1_decoder,                              \
+                  jisx0213_2000_1_encoder }
+#define REGISTRY_JISX0213_2000_1_PAIRONLY { CHARSET_JISX0213_2000_1, 0, 2, \
+                  jisx0213_init,                                        \
+                  jisx0213_2000_1_decoder,                              \
+                  jisx0213_2000_1_encoder_paironly }
+#define REGISTRY_JISX0213_2000_2 { CHARSET_JISX0213_2, 0, 2,            \
+                  jisx0213_init,                                        \
+                  jisx0213_2000_2_decoder,                              \
+                  jisx0213_2000_2_encoder }
+#define REGISTRY_JISX0213_2004_1 { CHARSET_JISX0213_2004_1, 0, 2,       \
+                  jisx0213_init,                                        \
+                  jisx0213_2004_1_decoder,                              \
+                  jisx0213_2004_1_encoder }
+#define REGISTRY_JISX0213_2004_1_PAIRONLY { CHARSET_JISX0213_2004_1, 0, 2, \
+                  jisx0213_init,                                        \
+                  jisx0213_2004_1_decoder,                              \
+                  jisx0213_2004_1_encoder_paironly }
+#define REGISTRY_JISX0213_2004_2 { CHARSET_JISX0213_2, 0, 2,            \
+                  jisx0213_init,                                        \
+                  jisx0213_2004_2_decoder,                              \
+                  jisx0213_2004_2_encoder }
+#define REGISTRY_GB2312         { CHARSET_GB2312, 0, 2,                 \
+                  gb2312_init,                                          \
+                  gb2312_decoder, gb2312_encoder }
+#define REGISTRY_CNS11643_1     { CHARSET_CNS11643_1, 1, 2,             \
+                  cns11643_init,                                        \
+                  cns11643_1_decoder, cns11643_1_encoder }
+#define REGISTRY_CNS11643_2     { CHARSET_CNS11643_2, 2, 2,             \
+                  cns11643_init,                                        \
+                  cns11643_2_decoder, cns11643_2_encoder }
+#define REGISTRY_ISO8859_1      { CHARSET_ISO8859_1, 2, 1,              \
+                  NULL, dummy_decoder, dummy_encoder }
+#define REGISTRY_ISO8859_7      { CHARSET_ISO8859_7, 2, 1,              \
+                  NULL, dummy_decoder, dummy_encoder }
+#define REGISTRY_SENTINEL       { 0, }
+#define CONFIGDEF(var, attrs)                                           \
+    static const struct iso2022_config iso2022_##var##_config = {       \
+        attrs, iso2022_##var##_designations                             \
+    };
+
+static const struct iso2022_designation iso2022_kr_designations[] = {
+    REGISTRY_KSX1001_G1, REGISTRY_SENTINEL
+};
+CONFIGDEF(kr, 0)
+
+static const struct iso2022_designation iso2022_jp_designations[] = {
+    REGISTRY_JISX0208, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,
+    REGISTRY_SENTINEL
+};
+CONFIGDEF(jp, NO_SHIFT | USE_JISX0208_EXT)
+
+static const struct iso2022_designation iso2022_jp_1_designations[] = {
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,
+    REGISTRY_JISX0208_O, REGISTRY_SENTINEL
+};
+CONFIGDEF(jp_1, NO_SHIFT | USE_JISX0208_EXT)
+
+static const struct iso2022_designation iso2022_jp_2_designations[] = {
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_KSX1001_G0,
+    REGISTRY_GB2312, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,
+    REGISTRY_ISO8859_1, REGISTRY_ISO8859_7, REGISTRY_SENTINEL
+};
+CONFIGDEF(jp_2, NO_SHIFT | USE_G2 | USE_JISX0208_EXT)
+
+static const struct iso2022_designation iso2022_jp_2004_designations[] = {
+    REGISTRY_JISX0213_2004_1_PAIRONLY, REGISTRY_JISX0208,
+    REGISTRY_JISX0213_2004_1, REGISTRY_JISX0213_2004_2, REGISTRY_SENTINEL
+};
+CONFIGDEF(jp_2004, NO_SHIFT | USE_JISX0208_EXT)
+
+static const struct iso2022_designation iso2022_jp_3_designations[] = {
+    REGISTRY_JISX0213_2000_1_PAIRONLY, REGISTRY_JISX0208,
+    REGISTRY_JISX0213_2000_1, REGISTRY_JISX0213_2000_2, REGISTRY_SENTINEL
+};
+CONFIGDEF(jp_3, NO_SHIFT | USE_JISX0208_EXT)
+
+static const struct iso2022_designation iso2022_jp_ext_designations[] = {
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,
+    REGISTRY_JISX0201_K, REGISTRY_JISX0208_O, REGISTRY_SENTINEL
+};
+CONFIGDEF(jp_ext, NO_SHIFT | USE_JISX0208_EXT)
+
+
+BEGIN_MAPPINGS_LIST
+  /* no mapping table here */
+END_MAPPINGS_LIST
+
+#define ISO2022_CODEC(variation)                        \
+  CODEC_STATEFUL_CONFIG(iso2022,                        \
+                        variation,                      \
+                        &iso2022_##variation##_config)
+
+BEGIN_CODECS_LIST
+  ISO2022_CODEC(kr)
+  ISO2022_CODEC(jp)
+  ISO2022_CODEC(jp_1)
+  ISO2022_CODEC(jp_2)
+  ISO2022_CODEC(jp_2004)
+  ISO2022_CODEC(jp_3)
+  ISO2022_CODEC(jp_ext)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(iso2022)
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_jp.c b/pypy/translator/c/src/cjkcodecs/_codecs_jp.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_jp.c
@@ -0,0 +1,731 @@
+/*
+ * _codecs_jp.c: Codecs collection for Japanese encodings
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#define USING_BINARY_PAIR_SEARCH
+#define EMPBASE 0x20000
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/mappings_jp.h"
+#include "src/cjkcodecs/mappings_jisx0213_pair.h"
+#include "src/cjkcodecs/alg_jisx0201.h"
+#include "src/cjkcodecs/emu_jisx0213_2000.h"
+
+/*
+ * CP932 codec
+ */
+
+ENCODER(cp932)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+        unsigned char c1, c2;
+
+        if (c <= 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        else if (c >= 0xff61 && c <= 0xff9f) {
+            WRITE1(c - 0xfec0)
+            NEXT(1, 1)
+            continue;
+        }
+        else if (c >= 0xf8f0 && c <= 0xf8f3) {
+            /* Windows compatibility */
+            REQUIRE_OUTBUF(1)
+            if (c == 0xf8f0)
+                OUT1(0xa0)
+            else
+                OUT1(c - 0xfef1 + 0xfd)
+            NEXT(1, 1)
+            continue;
+        }
+
+        UCS4INVALID(c)
+        REQUIRE_OUTBUF(2)
+
+        TRYMAP_ENC(cp932ext, code, c) {
+            OUT1(code >> 8)
+            OUT2(code & 0xff)
+        }
+        else TRYMAP_ENC(jisxcommon, code, c) {
+            if (code & 0x8000) /* MSB set: JIS X 0212 */
+                return 1;
+
+            /* JIS X 0208 */
+            c1 = code >> 8;
+            c2 = code & 0xff;
+            c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
+            c1 = (c1 - 0x21) >> 1;
+            OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
+            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+        }
+        else if (c >= 0xe000 && c < 0xe758) {
+            /* User-defined area */
+            c1 = (Py_UNICODE)(c - 0xe000) / 188;
+            c2 = (Py_UNICODE)(c - 0xe000) % 188;
+            OUT1(c1 + 0xf0)
+            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+        }
+        else
+            return 1;
+
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(cp932)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1, c2;
+
+        REQUIRE_OUTBUF(1)
+        if (c <= 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+        else if (c >= 0xa0 && c <= 0xdf) {
+            if (c == 0xa0)
+                OUT1(0xf8f0) /* half-width katakana */
+            else
+                OUT1(0xfec0 + c)
+            NEXT(1, 1)
+            continue;
+        }
+        else if (c >= 0xfd/* && c <= 0xff*/) {
+            /* Windows compatibility */
+            OUT1(0xf8f1 - 0xfd + c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+        c2 = IN2;
+
+        TRYMAP_DEC(cp932ext, **outbuf, c, c2);
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
+                return 2;
+
+            c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
+            c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
+
+            TRYMAP_DEC(jisx0208, **outbuf, c, c2);
+            else return 2;
+        }
+        else if (c >= 0xf0 && c <= 0xf9) {
+            if ((c2 >= 0x40 && c2 <= 0x7e) ||
+                (c2 >= 0x80 && c2 <= 0xfc))
+                OUT1(0xe000 + 188 * (c - 0xf0) +
+                     (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))
+            else
+                return 2;
+        }
+        else
+            return 2;
+
+        NEXT(2, 1)
+    }
+
+    return 0;
+}
+
+
+/*
+ * EUC-JIS-2004 codec
+ */
+
+ENCODER(euc_jis_2004)
+{
+    while (inleft > 0) {
+        ucs4_t c = IN1;
+        DBCHAR code;
+        Py_ssize_t insize;
+
+        if (c < 0x80) {
+            WRITE1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        DECODE_SURROGATE(c)
+        insize = GET_INSIZE(c);
+
+        if (c <= 0xFFFF) {
+            EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
+            else TRYMAP_ENC(jisx0213_bmp, code, c) {
+                if (code == MULTIC) {
+                    if (inleft < 2) {
+                        if (flags & MBENC_FLUSH) {
+                            code = find_pairencmap(
+                                (ucs2_t)c, 0,
+                              jisx0213_pair_encmap,
+                                JISX0213_ENCPAIRS);
+                            if (code == DBCINV)
+                                return 1;
+                        }
+                        else
+                            return MBERR_TOOFEW;
+                    }
+                    else {
+                        code = find_pairencmap(
+                            (ucs2_t)c, (*inbuf)[1],
+                            jisx0213_pair_encmap,
+                            JISX0213_ENCPAIRS);
+                        if (code == DBCINV) {
+                            code = find_pairencmap(
+                                (ucs2_t)c, 0,
+                              jisx0213_pair_encmap,
+                                JISX0213_ENCPAIRS);
+                            if (code == DBCINV)
+                                return 1;
+                        } else
+                            insize = 2;
+                    }
+                }
+            }
+            else TRYMAP_ENC(jisxcommon, code, c);
+            else if (c >= 0xff61 && c <= 0xff9f) {
+                /* JIS X 0201 half-width katakana */
+                WRITE2(0x8e, c - 0xfec0)
+                NEXT(1, 2)
+                continue;
+            }
+            else if (c == 0xff3c)
+                /* F/W REVERSE SOLIDUS (see NOTES) */
+                code = 0x2140;
+            else if (c == 0xff5e)
+                /* F/W TILDE (see NOTES) */
+                code = 0x2232;
+            else
+                return 1;
+        }
+        else if (c >> 16 == EMPBASE >> 16) {
+            EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
+            else TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
+            else return insize;
+        }
+        else
+            return insize;
+
+        if (code & 0x8000) {
+            /* Codeset 2 */
+            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
+            NEXT(insize, 3)
+        } else {
+            /* Codeset 1 */
+            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
+            NEXT(insize, 2)
+        }
+    }
+
+    return 0;
+}
+
+DECODER(euc_jis_2004)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+        ucs4_t code;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        if (c == 0x8e) {
+            /* JIS X 0201 half-width katakana */
+            unsigned char c2;
+
+            REQUIRE_INBUF(2)
+            c2 = IN2;
+            if (c2 >= 0xa1 && c2 <= 0xdf) {
+                OUT1(0xfec0 + c2)
+                NEXT(2, 1)
+            }
+            else
+                return 2;
+        }
+        else if (c == 0x8f) {
+            unsigned char c2, c3;
+
+            REQUIRE_INBUF(3)
+            c2 = IN2 ^ 0x80;
+            c3 = IN3 ^ 0x80;
+
+            /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
+            EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf, c2, c3)
+            else TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c2, c3) ;
+            else TRYMAP_DEC(jisx0213_2_emp, code, c2, c3) {
+                WRITEUCS4(EMPBASE | code)
+                NEXT_IN(3)
+                continue;
+            }
+            else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;
+            else return 3;
+            NEXT(3, 1)
+        }
+        else {
+            unsigned char c2;
+
+            REQUIRE_INBUF(2)
+            c ^= 0x80;
+            c2 = IN2 ^ 0x80;
+
+            /* JIS X 0213 Plane 1 */
+            EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf, c, c2)
+            else if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;
+            else if (c == 0x22 && c2 == 0x32) **outbuf = 0xff5e;
+            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
+            else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);
+            else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {
+                WRITEUCS4(EMPBASE | code)
+                NEXT_IN(2)
+                continue;
+            }
+            else TRYMAP_DEC(jisx0213_pair, code, c, c2) {
+                WRITE2(code >> 16, code & 0xffff)
+                NEXT(2, 2)
+                continue;
+            }
+            else return 2;
+            NEXT(2, 1)
+        }
+    }
+
+    return 0;
+}
+
+
+/*
+ * EUC-JP codec
+ */
+
+ENCODER(euc_jp)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        UCS4INVALID(c)
+
+        TRYMAP_ENC(jisxcommon, code, c);
+        else if (c >= 0xff61 && c <= 0xff9f) {
+            /* JIS X 0201 half-width katakana */
+            WRITE2(0x8e, c - 0xfec0)
+            NEXT(1, 2)
+            continue;
+        }
+#ifndef STRICT_BUILD
+        else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
+            code = 0x2140;
+        else if (c == 0xa5) { /* YEN SIGN */
+            WRITE1(0x5c);
+            NEXT(1, 1)
+            continue;
+        } else if (c == 0x203e) { /* OVERLINE */
+            WRITE1(0x7e);
+            NEXT(1, 1)
+            continue;
+        }
+#endif
+        else
+            return 1;
+
+        if (code & 0x8000) {
+            /* JIS X 0212 */
+            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
+            NEXT(1, 3)
+        } else {
+            /* JIS X 0208 */
+            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
+            NEXT(1, 2)
+        }
+    }
+
+    return 0;
+}
+
+DECODER(euc_jp)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+            if (c < 0x80) {
+                OUT1(c)
+                NEXT(1, 1)
+                continue;
+            }
+
+        if (c == 0x8e) {
+            /* JIS X 0201 half-width katakana */
+            unsigned char c2;
+
+            REQUIRE_INBUF(2)
+            c2 = IN2;
+            if (c2 >= 0xa1 && c2 <= 0xdf) {
+                OUT1(0xfec0 + c2)
+                NEXT(2, 1)
+            }
+            else
+                return 2;
+        }
+        else if (c == 0x8f) {
+            unsigned char c2, c3;
+
+            REQUIRE_INBUF(3)
+            c2 = IN2;
+            c3 = IN3;
+            /* JIS X 0212 */
+            TRYMAP_DEC(jisx0212, **outbuf, c2 ^ 0x80, c3 ^ 0x80) {
+                NEXT(3, 1)
+            }
+            else
+                return 3;
+        }
+        else {
+            unsigned char c2;
+
+            REQUIRE_INBUF(2)
+            c2 = IN2;
+            /* JIS X 0208 */
+#ifndef STRICT_BUILD
+            if (c == 0xa1 && c2 == 0xc0)
+                /* FULL-WIDTH REVERSE SOLIDUS */
+                **outbuf = 0xff3c;
+            else
+#endif
+                TRYMAP_DEC(jisx0208, **outbuf,
+                           c ^ 0x80, c2 ^ 0x80) ;
+            else return 2;
+            NEXT(2, 1)
+        }
+    }
+
+    return 0;
+}
+
+
+/*
+ * SHIFT_JIS codec
+ */
+
+ENCODER(shift_jis)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+        unsigned char c1, c2;
+
+#ifdef STRICT_BUILD
+        JISX0201_R_ENCODE(c, code)
+#else
+        if (c < 0x80) code = c;
+        else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */
+        else if (c == 0x203e) code = 0x7e; /* OVERLINE */
+#endif
+        else JISX0201_K_ENCODE(c, code)
+        else UCS4INVALID(c)
+        else code = NOCHAR;
+
+        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
+            REQUIRE_OUTBUF(1)
+
+            OUT1((unsigned char)code)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_OUTBUF(2)
+
+        if (code == NOCHAR) {
+            TRYMAP_ENC(jisxcommon, code, c);
+#ifndef STRICT_BUILD
+            else if (c == 0xff3c)
+                code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
+#endif
+            else
+                return 1;
+
+            if (code & 0x8000) /* MSB set: JIS X 0212 */
+                return 1;
+        }
+
+        c1 = code >> 8;
+        c2 = code & 0xff;
+        c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
+        c1 = (c1 - 0x21) >> 1;
+        OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
+        OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(shift_jis)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+#ifdef STRICT_BUILD
+        JISX0201_R_DECODE(c, **outbuf)
+#else
+        if (c < 0x80) **outbuf = c;
+#endif
+        else JISX0201_K_DECODE(c, **outbuf)
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
+            unsigned char c1, c2;
+
+            REQUIRE_INBUF(2)
+            c2 = IN2;
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
+                return 2;
+
+            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
+            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
+
+#ifndef STRICT_BUILD
+            if (c1 == 0x21 && c2 == 0x40) {
+                /* FULL-WIDTH REVERSE SOLIDUS */
+                OUT1(0xff3c)
+                NEXT(2, 1)
+                continue;
+            }
+#endif
+            TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
+                NEXT(2, 1)
+                continue;
+            }
+            else
+                return 2;
+        }
+        else
+            return 2;
+
+        NEXT(1, 1) /* JIS X 0201 */
+    }
+
+    return 0;
+}
+
+
+/*
+ * SHIFT_JIS-2004 codec
+ */
+
+ENCODER(shift_jis_2004)
+{
+    while (inleft > 0) {
+        ucs4_t c = IN1;
+        DBCHAR code = NOCHAR;
+        int c1, c2;
+        Py_ssize_t insize;
+
+        JISX0201_ENCODE(c, code)
+        else DECODE_SURROGATE(c)
+
+        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
+            WRITE1((unsigned char)code)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_OUTBUF(2)
+        insize = GET_INSIZE(c);
+
+        if (code == NOCHAR) {
+            if (c <= 0xffff) {
+                EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
+                else TRYMAP_ENC(jisx0213_bmp, code, c) {
+                    if (code == MULTIC) {
+                        if (inleft < 2) {
+                            if (flags & MBENC_FLUSH) {
+                            code = find_pairencmap
+                                ((ucs2_t)c, 0,
+                              jisx0213_pair_encmap,
+                                JISX0213_ENCPAIRS);
+                            if (code == DBCINV)
+                                return 1;
+                            }
+                            else
+                                return MBERR_TOOFEW;
+                        }
+                        else {
+                            code = find_pairencmap(
+                                (ucs2_t)c, IN2,
+                              jisx0213_pair_encmap,
+                                JISX0213_ENCPAIRS);
+                            if (code == DBCINV) {
+                            code = find_pairencmap(
+                                (ucs2_t)c, 0,
+                              jisx0213_pair_encmap,
+                                JISX0213_ENCPAIRS);
+                            if (code == DBCINV)
+                                return 1;
+                            }
+                            else
+                                insize = 2;
+                        }
+                    }
+                }
+                else TRYMAP_ENC(jisxcommon, code, c) {
+                    /* abandon JIS X 0212 codes */
+                    if (code & 0x8000)
+                        return 1;
+                }
+                else return 1;
+            }
+            else if (c >> 16 == EMPBASE >> 16) {
+                EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
+                else TRYMAP_ENC(jisx0213_emp, code, c&0xffff);
+                else return insize;
+            }
+            else
+                return insize;
+        }
+
+        c1 = code >> 8;
+        c2 = (code & 0xff) - 0x21;
+
+        if (c1 & 0x80) { /* Plane 2 */
+            if (c1 >= 0xee) c1 -= 0x87;
+            else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;
+            else c1 -= 0x43;
+        }
+        else /* Plane 1 */
+            c1 -= 0x21;
+
+        if (c1 & 1) c2 += 0x5e;
+        c1 >>= 1;
+        OUT1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
+        OUT2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
+
+        NEXT(insize, 2)
+    }
+
+    return 0;
+}
+
+DECODER(shift_jis_2004)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+        JISX0201_DECODE(c, **outbuf)
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
+            unsigned char c1, c2;
+            ucs4_t code;
+
+            REQUIRE_INBUF(2)
+            c2 = IN2;
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
+                return 2;
+
+            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
+            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
+
+            if (c1 < 0x5e) { /* Plane 1 */
+                c1 += 0x21;
+                EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf,
+                                c1, c2)
+                else TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
+                    NEXT_OUT(1)
+                }
+                else TRYMAP_DEC(jisx0213_1_bmp, **outbuf,
+                                c1, c2) {
+                    NEXT_OUT(1)
+                }
+                else TRYMAP_DEC(jisx0213_1_emp, code, c1, c2) {
+                    WRITEUCS4(EMPBASE | code)
+                }
+                else TRYMAP_DEC(jisx0213_pair, code, c1, c2) {
+                    WRITE2(code >> 16, code & 0xffff)
+                    NEXT_OUT(2)
+                }
+                else
+                    return 2;
+                NEXT_IN(2)
+            }
+            else { /* Plane 2 */
+                if (c1 >= 0x67) c1 += 0x07;
+                else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
+                else c1 -= 0x3d;
+
+                EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf,
+                                c1, c2)
+                else TRYMAP_DEC(jisx0213_2_bmp, **outbuf,
+                                c1, c2) ;
+                else TRYMAP_DEC(jisx0213_2_emp, code, c1, c2) {
+                    WRITEUCS4(EMPBASE | code)
+                    NEXT_IN(2)
+                    continue;
+                }
+                else
+                    return 2;
+                NEXT(2, 1)
+            }
+            continue;
+        }
+        else
+            return 2;
+
+        NEXT(1, 1) /* JIS X 0201 */
+    }
+
+    return 0;
+}
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_DECONLY(jisx0208)
+  MAPPING_DECONLY(jisx0212)
+  MAPPING_ENCONLY(jisxcommon)
+  MAPPING_DECONLY(jisx0213_1_bmp)
+  MAPPING_DECONLY(jisx0213_2_bmp)
+  MAPPING_ENCONLY(jisx0213_bmp)
+  MAPPING_DECONLY(jisx0213_1_emp)
+  MAPPING_DECONLY(jisx0213_2_emp)
+  MAPPING_ENCONLY(jisx0213_emp)
+  MAPPING_ENCDEC(jisx0213_pair)
+  MAPPING_ENCDEC(cp932ext)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS(shift_jis)
+  CODEC_STATELESS(cp932)
+  CODEC_STATELESS(euc_jp)
+  CODEC_STATELESS(shift_jis_2004)
+  CODEC_STATELESS(euc_jis_2004)
+  CODEC_STATELESS_CONFIG(euc_jisx0213,   (void *)2000, euc_jis_2004)
+  CODEC_STATELESS_CONFIG(shift_jisx0213, (void *)2000, shift_jis_2004)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(jp)
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_kr.c b/pypy/translator/c/src/cjkcodecs/_codecs_kr.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_kr.c
@@ -0,0 +1,452 @@
+/*
+ * _codecs_kr.c: Codecs collection for Korean encodings
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/mappings_kr.h"
+
+/*
+ * EUC-KR codec
+ */
+
+#define EUCKR_JAMO_FIRSTBYTE    0xA4
+#define EUCKR_JAMO_FILLER       0xD4
+
+static const unsigned char u2cgk_choseong[19] = {
+    0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xa9, 0xb1, 0xb2,
+    0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
+    0xbc, 0xbd, 0xbe
+};
+static const unsigned char u2cgk_jungseong[21] = {
+    0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+    0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
+    0xcf, 0xd0, 0xd1, 0xd2, 0xd3
+};
+static const unsigned char u2cgk_jongseong[28] = {
+    0xd4, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+    0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0,
+    0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xba,
+    0xbb, 0xbc, 0xbd, 0xbe
+};
+
+ENCODER(euc_kr)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+        TRYMAP_ENC(cp949, code, c);
+        else return 1;
+
+        if ((code & 0x8000) == 0) {
+            /* KS X 1001 coded character */
+            OUT1((code >> 8) | 0x80)
+            OUT2((code & 0xFF) | 0x80)
+            NEXT(1, 2)
+        }
+        else {          /* Mapping is found in CP949 extension,
+                 * but we encode it in KS X 1001:1998 Annex 3,
+                 * make-up sequence for EUC-KR. */
+
+            REQUIRE_OUTBUF(8)
+
+            /* syllable composition precedence */
+            OUT1(EUCKR_JAMO_FIRSTBYTE)
+            OUT2(EUCKR_JAMO_FILLER)
+
+            /* All codepoints in CP949 extension are in unicode
+             * Hangul Syllable area. */
+            assert(0xac00 <= c && c <= 0xd7a3);
+            c -= 0xac00;
+
+            OUT3(EUCKR_JAMO_FIRSTBYTE)
+            OUT4(u2cgk_choseong[c / 588])
+            NEXT_OUT(4)
+
+            OUT1(EUCKR_JAMO_FIRSTBYTE)
+            OUT2(u2cgk_jungseong[(c / 28) % 21])
+            OUT3(EUCKR_JAMO_FIRSTBYTE)
+            OUT4(u2cgk_jongseong[c % 28])
+            NEXT(1, 4)
+        }
+    }
+
+    return 0;
+}
+
+#define NONE    127
+
+static const unsigned char cgk2u_choseong[] = { /* [A1, BE] */
+       0,    1, NONE,    2, NONE, NONE,    3,    4,
+       5, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+       6,    7,    8, NONE,    9,   10,   11,   12,
+      13,   14,   15,   16,   17,   18
+};
+static const unsigned char cgk2u_jongseong[] = { /* [A1, BE] */
+       1,    2,    3,    4,    5,    6,    7, NONE,
+       8,    9,   10,   11,   12,   13,   14,   15,
+      16,   17, NONE,   18,   19,   20,   21,   22,
+    NONE,   23,   24,   25,   26,   27
+};
+
+DECODER(euc_kr)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+
+        if (c == EUCKR_JAMO_FIRSTBYTE &&
+            IN2 == EUCKR_JAMO_FILLER) {
+            /* KS X 1001:1998 Annex 3 make-up sequence */
+            DBCHAR cho, jung, jong;
+
+            REQUIRE_INBUF(8)
+            if ((*inbuf)[2] != EUCKR_JAMO_FIRSTBYTE ||
+                (*inbuf)[4] != EUCKR_JAMO_FIRSTBYTE ||
+                (*inbuf)[6] != EUCKR_JAMO_FIRSTBYTE)
+                return 8;
+
+            c = (*inbuf)[3];
+            if (0xa1 <= c && c <= 0xbe)
+                cho = cgk2u_choseong[c - 0xa1];
+            else
+                cho = NONE;
+
+            c = (*inbuf)[5];
+            jung = (0xbf <= c && c <= 0xd3) ? c - 0xbf : NONE;
+
+            c = (*inbuf)[7];
+            if (c == EUCKR_JAMO_FILLER)
+                jong = 0;
+            else if (0xa1 <= c && c <= 0xbe)
+                jong = cgk2u_jongseong[c - 0xa1];
+            else
+                jong = NONE;
+
+            if (cho == NONE || jung == NONE || jong == NONE)
+                return 8;
+
+            OUT1(0xac00 + cho*588 + jung*28 + jong);
+            NEXT(8, 1)
+        }
+        else TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
+            NEXT(2, 1)
+        }
+        else
+            return 2;
+    }
+
+    return 0;
+}
+#undef NONE
+
+
+/*
+ * CP949 codec
+ */
+
+ENCODER(cp949)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+        TRYMAP_ENC(cp949, code, c);
+        else return 1;
+
+        OUT1((code >> 8) | 0x80)
+        if (code & 0x8000)
+            OUT2(code & 0xFF) /* MSB set: CP949 */
+        else
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(cp949)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+        TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80);
+        else TRYMAP_DEC(cp949ext, **outbuf, c, IN2);
+        else return 2;
+
+        NEXT(2, 1)
+    }
+
+    return 0;
+}
+
+
+/*
+ * JOHAB codec
+ */
+
+static const unsigned char u2johabidx_choseong[32] = {
+                0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+    0x10, 0x11, 0x12, 0x13, 0x14,
+};
+static const unsigned char u2johabidx_jungseong[32] = {
+                      0x03, 0x04, 0x05, 0x06, 0x07,
+                0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+                0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+                0x1a, 0x1b, 0x1c, 0x1d,
+};
+static const unsigned char u2johabidx_jongseong[32] = {
+          0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+    0x10, 0x11,       0x13, 0x14, 0x15, 0x16, 0x17,
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+};
+static const DBCHAR u2johabjamo[] = {
+            0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441,
+    0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,
+    0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441,
+    0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461,
+    0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1,
+    0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,
+    0x8741, 0x8761, 0x8781, 0x87a1,
+};
+
+ENCODER(johab)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+
+        if (c >= 0xac00 && c <= 0xd7a3) {
+            c -= 0xac00;
+            code = 0x8000 |
+                (u2johabidx_choseong[c / 588] << 10) |
+                (u2johabidx_jungseong[(c / 28) % 21] << 5) |
+                u2johabidx_jongseong[c % 28];
+        }
+        else if (c >= 0x3131 && c <= 0x3163)
+            code = u2johabjamo[c - 0x3131];
+        else TRYMAP_ENC(cp949, code, c) {
+            unsigned char c1, c2, t2;
+            unsigned short t1;
+
+            assert((code & 0x8000) == 0);
+            c1 = code >> 8;
+            c2 = code & 0xff;
+            if (((c1 >= 0x21 && c1 <= 0x2c) ||
+                (c1 >= 0x4a && c1 <= 0x7d)) &&
+                (c2 >= 0x21 && c2 <= 0x7e)) {
+                t1 = (c1 < 0x4a ? (c1 - 0x21 + 0x1b2) :
+                          (c1 - 0x21 + 0x197));
+                t2 = ((t1 & 1) ? 0x5e : 0) + (c2 - 0x21);
+                OUT1(t1 >> 1)
+                OUT2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)
+                NEXT(1, 2)
+                continue;
+            }
+            else
+                return 1;
+        }
+        else
+            return 1;
+
+        OUT1(code >> 8)
+        OUT2(code & 0xff)
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+#define FILL 0xfd
+#define NONE 0xff
+
+static const unsigned char johabidx_choseong[32] = {
+    NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+    0x0e, 0x0f, 0x10, 0x11, 0x12, NONE, NONE, NONE,
+    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+};
+static const unsigned char johabidx_jungseong[32] = {
+    NONE, NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04,
+    NONE, NONE, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+    NONE, NONE, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
+    NONE, NONE, 0x11, 0x12, 0x13, 0x14, NONE, NONE,
+};
+static const unsigned char johabidx_jongseong[32] = {
+    NONE, FILL, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+    0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
+    0x0f, 0x10, NONE, 0x11, 0x12, 0x13, 0x14, 0x15,
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, NONE, NONE,
+};
+
+static const unsigned char johabjamo_choseong[32] = {
+    NONE, FILL, 0x31, 0x32, 0x34, 0x37, 0x38, 0x39,
+    0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49,
+    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE, NONE,
+    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
+};
+static const unsigned char johabjamo_jungseong[32] = {
+    NONE, NONE, FILL, 0x4f, 0x50, 0x51, 0x52, 0x53,
+    NONE, NONE, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+    NONE, NONE, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+    NONE, NONE, 0x60, 0x61, 0x62, 0x63, NONE, NONE,
+};
+static const unsigned char johabjamo_jongseong[32] = {
+    NONE, FILL, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
+    0x37, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+    0x40, 0x41, NONE, 0x42, 0x44, 0x45, 0x46, 0x47,
+    0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE,
+};
+
+DECODER(johab)
+{
+    while (inleft > 0) {
+        unsigned char    c = IN1, c2;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+        c2 = IN2;
+
+        if (c < 0xd8) {
+            /* johab hangul */
+            unsigned char c_cho, c_jung, c_jong;
+            unsigned char i_cho, i_jung, i_jong;
+
+            c_cho = (c >> 2) & 0x1f;
+            c_jung = ((c << 3) | c2 >> 5) & 0x1f;
+            c_jong = c2 & 0x1f;
+
+            i_cho = johabidx_choseong[c_cho];
+            i_jung = johabidx_jungseong[c_jung];
+            i_jong = johabidx_jongseong[c_jong];
+
+            if (i_cho == NONE || i_jung == NONE || i_jong == NONE)
+                return 2;
+
+            /* we don't use U+1100 hangul jamo yet. */
+            if (i_cho == FILL) {
+                if (i_jung == FILL) {
+                    if (i_jong == FILL)
+                        OUT1(0x3000)
+                    else
+                        OUT1(0x3100 |
+                          johabjamo_jongseong[c_jong])
+                }
+                else {
+                    if (i_jong == FILL)
+                        OUT1(0x3100 |
+                          johabjamo_jungseong[c_jung])
+                    else
+                        return 2;
+                }
+            } else {
+                if (i_jung == FILL) {
+                    if (i_jong == FILL)
+                        OUT1(0x3100 |
+                          johabjamo_choseong[c_cho])
+                    else
+                        return 2;
+                }
+                else
+                    OUT1(0xac00 +
+                         i_cho * 588 +
+                         i_jung * 28 +
+                         (i_jong == FILL ? 0 : i_jong))
+            }
+            NEXT(2, 1)
+        } else {
+            /* KS X 1001 except hangul jamos and syllables */
+            if (c == 0xdf || c > 0xf9 ||
+                c2 < 0x31 || (c2 >= 0x80 && c2 < 0x91) ||
+                (c2 & 0x7f) == 0x7f ||
+                (c == 0xda && (c2 >= 0xa1 && c2 <= 0xd3)))
+                return 2;
+            else {
+                unsigned char t1, t2;
+
+                t1 = (c < 0xe0 ? 2 * (c - 0xd9) :
+                         2 * c - 0x197);
+                t2 = (c2 < 0x91 ? c2 - 0x31 : c2 - 0x43);
+                t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;
+                t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;
+
+                TRYMAP_DEC(ksx1001, **outbuf, t1, t2);
+                else return 2;
+                NEXT(2, 1)
+            }
+        }
+    }
+
+    return 0;
+}
+#undef NONE
+#undef FILL
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_DECONLY(ksx1001)
+  MAPPING_ENCONLY(cp949)
+  MAPPING_DECONLY(cp949ext)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS(euc_kr)
+  CODEC_STATELESS(cp949)
+  CODEC_STATELESS(johab)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(kr)
diff --git a/pypy/translator/c/src/cjkcodecs/_codecs_tw.c b/pypy/translator/c/src/cjkcodecs/_codecs_tw.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/_codecs_tw.c
@@ -0,0 +1,132 @@
+/*
+ * _codecs_tw.c: Codecs collection for Taiwan's encodings
+ *
+ * Written by Hye-Shik Chang <perky at FreeBSD.org>
+ */
+
+#include "src/cjkcodecs/cjkcodecs.h"
+#include "src/cjkcodecs/mappings_tw.h"
+
+/*
+ * BIG5 codec
+ */
+
+ENCODER(big5)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = **inbuf;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            REQUIRE_OUTBUF(1)
+            **outbuf = (unsigned char)c;
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+
+        TRYMAP_ENC(big5, code, c);
+        else return 1;
+
+        OUT1(code >> 8)
+        OUT2(code & 0xFF)
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(big5)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+        TRYMAP_DEC(big5, **outbuf, c, IN2) {
+            NEXT(2, 1)
+        }
+        else return 2;
+    }
+
+    return 0;
+}
+
+
+/*
+ * CP950 codec
+ */
+
+ENCODER(cp950)
+{
+    while (inleft > 0) {
+        Py_UNICODE c = IN1;
+        DBCHAR code;
+
+        if (c < 0x80) {
+            WRITE1((unsigned char)c)
+            NEXT(1, 1)
+            continue;
+        }
+        UCS4INVALID(c)
+
+        REQUIRE_OUTBUF(2)
+        TRYMAP_ENC(cp950ext, code, c);
+        else TRYMAP_ENC(big5, code, c);
+        else return 1;
+
+        OUT1(code >> 8)
+        OUT2(code & 0xFF)
+        NEXT(1, 2)
+    }
+
+    return 0;
+}
+
+DECODER(cp950)
+{
+    while (inleft > 0) {
+        unsigned char c = IN1;
+
+        REQUIRE_OUTBUF(1)
+
+        if (c < 0x80) {
+            OUT1(c)
+            NEXT(1, 1)
+            continue;
+        }
+
+        REQUIRE_INBUF(2)
+
+        TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
+        else TRYMAP_DEC(big5, **outbuf, c, IN2);
+        else return 2;
+
+        NEXT(2, 1)
+    }
+
+    return 0;
+}
+
+
+
+BEGIN_MAPPINGS_LIST
+  MAPPING_ENCDEC(big5)
+  MAPPING_ENCDEC(cp950ext)
+END_MAPPINGS_LIST
+
+BEGIN_CODECS_LIST
+  CODEC_STATELESS(big5)
+  CODEC_STATELESS(cp950)
+END_CODECS_LIST
+
+I_AM_A_MODULE_FOR(tw)
diff --git a/pypy/translator/c/src/cjkcodecs/alg_jisx0201.h b/pypy/translator/c/src/cjkcodecs/alg_jisx0201.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/alg_jisx0201.h
@@ -0,0 +1,24 @@
+#define JISX0201_R_ENCODE(c, assi)                      \
+    if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e)       \
+        (assi) = (c);                                   \
+    else if ((c) == 0x00a5) (assi) = 0x5c;              \
+    else if ((c) == 0x203e) (assi) = 0x7e;
+#define JISX0201_K_ENCODE(c, assi)                      \
+    if ((c) >= 0xff61 && (c) <= 0xff9f)                 \
+        (assi) = (c) - 0xfec0;
+#define JISX0201_ENCODE(c, assi)                        \
+    JISX0201_R_ENCODE(c, assi)                          \
+    else JISX0201_K_ENCODE(c, assi)
+
+#define JISX0201_R_DECODE(c, assi)                      \
+    if ((c) < 0x5c) (assi) = (c);                       \
+    else if ((c) == 0x5c) (assi) = 0x00a5;              \
+    else if ((c) < 0x7e) (assi) = (c);                  \
+    else if ((c) == 0x7e) (assi) = 0x203e;              \
+    else if ((c) == 0x7f) (assi) = 0x7f;
+#define JISX0201_K_DECODE(c, assi)                      \
+    if ((c) >= 0xa1 && (c) <= 0xdf)                     \
+    (assi) = 0xfec0 + (c);
+#define JISX0201_DECODE(c, assi)                        \
+    JISX0201_R_DECODE(c, assi)                          \
+    else JISX0201_K_DECODE(c, assi)
diff --git a/pypy/translator/c/src/cjkcodecs/cjkcodecs.h b/pypy/translator/c/src/cjkcodecs/cjkcodecs.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/cjkcodecs.h
@@ -0,0 +1,309 @@
+/*
+ * cjkcodecs.h is inspired by the file of the same name from CPython,
+ * but was heavily modified to suit PyPy.
+ *
+ * Original author: Hye-Shik Chang <perky at FreeBSD.org>
+ * Modified by: Armin Rigo <arigo at tunes.org>
+ */
+
+#ifndef _CJKCODECS_H_
+#define _CJKCODECS_H_
+
+#include "src/cjkcodecs/multibytecodec.h"
+
+
+/* a unicode "undefined" codepoint */
+#define UNIINV  0xFFFE
+
+/* internal-use DBCS codepoints which aren't used by any charsets */
+#define NOCHAR  0xFFFF
+#define MULTIC  0xFFFE
+#define DBCINV  0xFFFD
+
+/* shorter macros to save source size of mapping tables */
+#define U UNIINV
+#define N NOCHAR
+#define M MULTIC
+#define D DBCINV
+
+struct dbcs_index {
+    const ucs2_t *map;
+    unsigned char bottom, top;
+};
+typedef struct dbcs_index decode_map;
+
+struct widedbcs_index {
+    const ucs4_t *map;
+    unsigned char bottom, top;
+};
+typedef struct widedbcs_index widedecode_map;
+
+struct unim_index {
+    const DBCHAR *map;
+    unsigned char bottom, top;
+};
+typedef struct unim_index encode_map;
+
+struct unim_index_bytebased {
+    const unsigned char *map;
+    unsigned char bottom, top;
+};
+
+struct dbcs_map {
+    const char *charset;
+    const struct unim_index *encmap;
+    const struct dbcs_index *decmap;
+};
+
+struct pair_encodemap {
+    ucs4_t uniseq;
+    DBCHAR code;
+};
+
+#define CODEC_INIT(encoding)                                            \
+    static int encoding##_codec_init(const void *config)
+
+#define ENCODER_INIT(encoding)                                          \
+    static int encoding##_encode_init(                                  \
+        MultibyteCodec_State *state, const void *config)
+#define ENCODER(encoding)                                               \
+    static Py_ssize_t encoding##_encode(                                \
+        MultibyteCodec_State *state, const void *config,                \
+        const Py_UNICODE **inbuf, Py_ssize_t inleft,                    \
+        unsigned char **outbuf, Py_ssize_t outleft, int flags)
+#define ENCODER_RESET(encoding)                                         \
+    static Py_ssize_t encoding##_encode_reset(                          \
+        MultibyteCodec_State *state, const void *config,                \
+        unsigned char **outbuf, Py_ssize_t outleft)
+
+#define DECODER_INIT(encoding)                                          \
+    static int encoding##_decode_init(                                  \
+        MultibyteCodec_State *state, const void *config)
+#define DECODER(encoding)                                               \
+    static Py_ssize_t encoding##_decode(                                \
+        MultibyteCodec_State *state, const void *config,                \
+        const unsigned char **inbuf, Py_ssize_t inleft,                 \
+        Py_UNICODE **outbuf, Py_ssize_t outleft)
+#define DECODER_RESET(encoding)                                         \
+    static Py_ssize_t encoding##_decode_reset(                          \
+        MultibyteCodec_State *state, const void *config)
+
+#if Py_UNICODE_SIZE == 4
+#define UCS4INVALID(code)       \
+    if ((code) > 0xFFFF)        \
+    return 1;
+#else
+#define UCS4INVALID(code)       \
+    if (0) ;
+#endif
+
+#define NEXT_IN(i)                              \
+    (*inbuf) += (i);                            \
+    (inleft) -= (i);
+#define NEXT_OUT(o)                             \
+    (*outbuf) += (o);                           \
+    (outleft) -= (o);
+#define NEXT(i, o)                              \
+    NEXT_IN(i) NEXT_OUT(o)
+
+#define REQUIRE_INBUF(n)                        \
+    if (inleft < (n))                           \
+        return MBERR_TOOFEW;
+#define REQUIRE_OUTBUF(n)                       \
+    if (outleft < (n))                          \
+        return MBERR_TOOSMALL;
+
+#define IN1 ((*inbuf)[0])
+#define IN2 ((*inbuf)[1])
+#define IN3 ((*inbuf)[2])
+#define IN4 ((*inbuf)[3])
+
+#define OUT1(c) ((*outbuf)[0]) = (c);
+#define OUT2(c) ((*outbuf)[1]) = (c);
+#define OUT3(c) ((*outbuf)[2]) = (c);
+#define OUT4(c) ((*outbuf)[3]) = (c);
+
+#define WRITE1(c1)              \
+    REQUIRE_OUTBUF(1)           \
+    (*outbuf)[0] = (c1);
+#define WRITE2(c1, c2)          \
+    REQUIRE_OUTBUF(2)           \
+    (*outbuf)[0] = (c1);        \
+    (*outbuf)[1] = (c2);
+#define WRITE3(c1, c2, c3)      \
+    REQUIRE_OUTBUF(3)           \
+    (*outbuf)[0] = (c1);        \
+    (*outbuf)[1] = (c2);        \
+    (*outbuf)[2] = (c3);
+#define WRITE4(c1, c2, c3, c4)  \
+    REQUIRE_OUTBUF(4)           \
+    (*outbuf)[0] = (c1);        \
+    (*outbuf)[1] = (c2);        \
+    (*outbuf)[2] = (c3);        \
+    (*outbuf)[3] = (c4);
+
+#if Py_UNICODE_SIZE == 2
+# define WRITEUCS4(c)                                           \
+    REQUIRE_OUTBUF(2)                                           \
+    (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10);            \
+    (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff);          \
+    NEXT_OUT(2)
+#else
+# define WRITEUCS4(c)                                           \
+    REQUIRE_OUTBUF(1)                                           \
+    **outbuf = (Py_UNICODE)(c);                                 \
+    NEXT_OUT(1)
+#endif
+
+#define _TRYMAP_ENC(m, assi, val)                               \
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \
+        (val)<= (m)->top && ((assi) = (m)->map[(val) -          \
+        (m)->bottom]) != NOCHAR)
+#define TRYMAP_ENC_COND(charset, assi, uni)                     \
+    _TRYMAP_ENC(&charset##_encmap[(uni) >> 8], assi, (uni) & 0xff)
+#define TRYMAP_ENC(charset, assi, uni)                          \
+    if TRYMAP_ENC_COND(charset, assi, uni)
+
+#define _TRYMAP_DEC(m, assi, val)                               \
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \
+        (val)<= (m)->top && ((assi) = (m)->map[(val) -          \
+        (m)->bottom]) != UNIINV)
+#define TRYMAP_DEC(charset, assi, c1, c2)                       \
+    if _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)
+
+#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val)      \
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \
+        (val)<= (m)->top &&                                     \
+        ((assplane) = (m)->map[((val) - (m)->bottom)*3]) != 0 && \
+        (((asshi) = (m)->map[((val) - (m)->bottom)*3 + 1]), 1) && \
+        (((asslo) = (m)->map[((val) - (m)->bottom)*3 + 2]), 1))
+#define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \
+    if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \
+                       assplane, asshi, asslo, (uni) & 0xff)
+#define TRYMAP_DEC_MPLANE(charset, assi, plane, c1, c2)         \
+    if _TRYMAP_DEC(&charset##_decmap[plane][c1], assi, c2)
+
+#if Py_UNICODE_SIZE == 2
+#define DECODE_SURROGATE(c)                                     \
+    if (c >> 10 == 0xd800 >> 10) { /* high surrogate */         \
+        REQUIRE_INBUF(2)                                        \
+        if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \
+            c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) + \
+            ((ucs4_t)(IN2) - 0xdc00);                           \
+        }                                                       \
+    }
+#define GET_INSIZE(c)   ((c) > 0xffff ? 2 : 1)
+#else
+#define DECODE_SURROGATE(c) {;}
+#define GET_INSIZE(c)   1
+#endif
+
+#define BEGIN_MAPPINGS_LIST /* empty */
+#define MAPPING_ENCONLY(enc)                                            \
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, NULL};
+#define MAPPING_DECONLY(enc)                                            \
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, NULL, (void*)enc##_decmap};
+#define MAPPING_ENCDEC(enc)                                             \
+  const struct dbcs_map pypy_cjkmap_##enc = {#enc, (void*)enc##_encmap, \
+                                             (void*)enc##_decmap};
+#define END_MAPPINGS_LIST /* empty */
+
+#define BEGIN_CODECS_LIST /* empty */
+#define _CODEC(name)                                                    \
+  static const MultibyteCodec _pypy_cjkcodec_##name;                    \
+  const MultibyteCodec *pypy_cjkcodec_##name(void) {                    \
+    if (_pypy_cjkcodec_##name.codecinit != NULL) {                      \
+      int r = _pypy_cjkcodec_##name.codecinit(_pypy_cjkcodec_##name.config); \
+      assert(r == 0);                                                   \
+    }                                                                   \
+    return &_pypy_cjkcodec_##name;                                      \
+  }                                                                     \
+  static const MultibyteCodec _pypy_cjkcodec_##name
+#define _STATEFUL_METHODS(enc)          \
+    enc##_encode,                       \
+    enc##_encode_init,                  \
+    enc##_encode_reset,                 \
+    enc##_decode,                       \
+    enc##_decode_init,                  \
+    enc##_decode_reset,
+#define _STATELESS_METHODS(enc)         \
+    enc##_encode, NULL, NULL,           \
+    enc##_decode, NULL, NULL,
+#define CODEC_STATEFUL(enc) _CODEC(enc) = {     \
+    #enc, NULL, NULL,                           \
+    _STATEFUL_METHODS(enc)                      \
+  };
+#define CODEC_STATELESS(enc) _CODEC(enc) = {    \
+    #enc, NULL, NULL,                           \
+    _STATELESS_METHODS(enc)                     \
+  };
+#define CODEC_STATELESS_WINIT(enc) _CODEC(enc) = {      \
+    #enc, NULL,                                         \
+    enc##_codec_init,                                   \
+    _STATELESS_METHODS(enc)                             \
+  };
+#define CODEC_STATELESS_CONFIG(enc, config, baseenc) _CODEC(enc) = {    \
+    #enc, config, NULL,                                                 \
+    _STATELESS_METHODS(baseenc)                                         \
+  };
+#define CODEC_STATEFUL_CONFIG(enc, variation, config)   \
+  _CODEC(enc##_##variation) = {                         \
+    #enc "_" #variation,                                \
+    config,                                             \
+    enc##_codec_init,                                   \
+    _STATEFUL_METHODS(enc)                              \
+  };
+#define END_CODECS_LIST /* empty */
+
+
+#ifdef USING_BINARY_PAIR_SEARCH
+static DBCHAR
+find_pairencmap(ucs2_t body, ucs2_t modifier,
+                const struct pair_encodemap *haystack, int haystacksize)
+{
+    int pos, min, max;
+    ucs4_t value = body << 16 | modifier;
+
+    min = 0;
+    max = haystacksize;
+
+    for (pos = haystacksize >> 1; min != max; pos = (min + max) >> 1)
+        if (value < haystack[pos].uniseq) {
+            if (max == pos) break;
+            else max = pos;
+        }
+        else if (value > haystack[pos].uniseq) {
+            if (min == pos) break;
+            else min = pos;
+        }
+        else
+            break;
+
+        if (value == haystack[pos].uniseq)
+            return haystack[pos].code;
+        else
+            return DBCINV;
+}
+#endif
+
+
+#ifdef USING_IMPORTED_MAPS
+#define USING_IMPORTED_MAP(charset) \
+  extern const struct dbcs_map pypy_cjkmap_##charset;
+
+#define IMPORT_MAP(locale, charset, encmap, decmap)                     \
+  importmap(&pypy_cjkmap_##charset, encmap, decmap)
+
+static void importmap(const struct dbcs_map *src, void *encmp,
+                      void *decmp)
+{
+  if (encmp) *(const encode_map **)encmp = src->encmap;
+  if (decmp) *(const decode_map **)decmp = src->decmap;
+}
+#endif
+
+
+#define I_AM_A_MODULE_FOR(loc) /* empty */
+
+
+#endif
diff --git a/pypy/translator/c/src/cjkcodecs/emu_jisx0213_2000.h b/pypy/translator/c/src/cjkcodecs/emu_jisx0213_2000.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/emu_jisx0213_2000.h
@@ -0,0 +1,43 @@
+/* These routines may be quite inefficient, but it's used only to emulate old
+ * standards. */
+
+#ifndef EMULATE_JISX0213_2000_ENCODE_INVALID
+#define EMULATE_JISX0213_2000_ENCODE_INVALID 1
+#endif
+
+#define EMULATE_JISX0213_2000_ENCODE_BMP(assi, c)                       \
+    if (config == (void *)2000 && (                                     \
+                    (c) == 0x9B1C || (c) == 0x4FF1 ||                   \
+                    (c) == 0x525D || (c) == 0x541E ||                   \
+                    (c) == 0x5653 || (c) == 0x59F8 ||                   \
+                    (c) == 0x5C5B || (c) == 0x5E77 ||                   \
+                    (c) == 0x7626 || (c) == 0x7E6B))                    \
+        return EMULATE_JISX0213_2000_ENCODE_INVALID;                    \
+    else if (config == (void *)2000 && (c) == 0x9B1D)                   \
+        (assi) = 0x8000 | 0x7d3b;                                       \
+
+#define EMULATE_JISX0213_2000_ENCODE_EMP(assi, c)                       \
+    if (config == (void *)2000 && (c) == 0x20B9F)                       \
+        return EMULATE_JISX0213_2000_ENCODE_INVALID;
+
+#ifndef EMULATE_JISX0213_2000_DECODE_INVALID
+#define EMULATE_JISX0213_2000_DECODE_INVALID 2
+#endif
+
+#define EMULATE_JISX0213_2000_DECODE_PLANE1(assi, c1, c2)               \
+    if (config == (void *)2000 &&                                       \
+                    (((c1) == 0x2E && (c2) == 0x21) ||                  \
+                     ((c1) == 0x2F && (c2) == 0x7E) ||                  \
+                     ((c1) == 0x4F && (c2) == 0x54) ||                  \
+                     ((c1) == 0x4F && (c2) == 0x7E) ||                  \
+                     ((c1) == 0x74 && (c2) == 0x27) ||                  \
+                     ((c1) == 0x7E && (c2) == 0x7A) ||                  \
+                     ((c1) == 0x7E && (c2) == 0x7B) ||                  \
+                     ((c1) == 0x7E && (c2) == 0x7C) ||                  \
+                     ((c1) == 0x7E && (c2) == 0x7D) ||                  \
+                     ((c1) == 0x7E && (c2) == 0x7E)))                   \
+        return EMULATE_JISX0213_2000_DECODE_INVALID;
+
+#define EMULATE_JISX0213_2000_DECODE_PLANE2(assi, c1, c2)               \
+    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B)         \
+        (assi) = 0x9B1D;
diff --git a/pypy/translator/c/src/cjkcodecs/mappings_cn.h b/pypy/translator/c/src/cjkcodecs/mappings_cn.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/mappings_cn.h
@@ -0,0 +1,4103 @@
+static const ucs2_t __gb2312_decmap[7482] = {
+12288,12289,12290,12539,713,711,168,12291,12293,8213,65374,8214,8230,8216,
+8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,
+12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,
+8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,
+8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,
+65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,
+9650,8251,8594,8592,8593,8595,12307,9352,9353,9354,9355,9356,9357,9358,9359,
+9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,
+9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,
+9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,U,U,12832,12833,
+12834,12835,12836,12837,12838,12839,12840,12841,U,U,8544,8545,8546,8547,8548,
+8549,8550,8551,8552,8553,8554,8555,65281,65282,65283,65509,65285,65286,65287,
+65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,
+65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,
+65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,
+65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,
+65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,
+65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,
+65366,65367,65368,65369,65370,65371,65372,65373,65507,12353,12354,12355,12356,
+12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,
+12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,
+12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,
+12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,
+12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,
+12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,
+12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,
+12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,
+12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,
+12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,
+12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,
+12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,
+12526,12527,12528,12529,12530,12531,12532,12533,12534,913,914,915,916,917,918,
+919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,U,U,U,
+U,U,U,U,U,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,
+963,964,965,966,967,968,969,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,
+1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,
+1064,1065,1066,1067,1068,1069,1070,1071,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,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,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,
+250,468,249,470,472,474,476,252,234,U,U,U,U,U,U,U,U,U,U,12549,12550,12551,
+12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,
+12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,
+12578,12579,12580,12581,12582,12583,12584,12585,9472,9473,9474,9475,9476,9477,
+9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,
+9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,
+9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,
+9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,
+9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,21834,38463,22467,25384,
+21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,
+23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,
+32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,
+30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,
+30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,
+29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,
+32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,34180,
+38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,
+24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,
+22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,
+37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,
+25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,
+20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,
+21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,
+39292,28851,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,
+38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,
+34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,
+36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,
+28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,
+20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,
+23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,
+20135,38416,39076,26124,29462,22330,23581,24120,38271,20607,32928,21378,25950,
+30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,
+25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,
+36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,
+25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,
+40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,
+37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,
+27249,21416,36487,38148,38607,28353,38500,26970,30784,20648,30679,25616,35302,
+22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,
+38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,
+34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,
+36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,
+36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,
+23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,
+21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,24608,32829,
+25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,
+34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,
+21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,
+20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,
+24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,
+20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,
+38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,
+21472,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,
+33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,
+36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,
+32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,
+23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,
+22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,
+39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,
+23572,39285,27953,20108,36144,21457,32602,31567,20240,20047,38400,27861,29648,
+34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,
+36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,
+32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,
+36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,
+24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,
+20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,
+36752,24133,27679,31526,20239,20440,26381,28014,28074,31119,34993,24343,29995,
+25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,
+22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,
+22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,
+32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,
+28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,
+27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,
+38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,22466,32831,26775,
+24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,
+36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,
+21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,
+39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,
+20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,
+29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,
+36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,
+39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,
+23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,
+22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,
+21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,
+36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,
+34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,
+29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,
+29392,31946,28246,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,
+29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,
+26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,
+24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,
+28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,
+36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,
+28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,
+22522,26426,30072,31293,31215,31637,32908,39269,36857,28608,35749,40481,23020,
+32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,
+23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,
+24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,
+26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,
+26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,
+22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,
+33616,27099,37492,36341,36145,35265,38190,31661,20214,20581,33328,21073,39279,
+28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,
+35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,
+23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,
+25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,
+21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,
+33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,
+35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,23613,
+21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,
+35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,
+28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,
+26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,
+23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,
+20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,
+25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,
+21531,23803,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,
+26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,
+25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,
+31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,
+22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,
+33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,
+23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,
+31397,33909,22862,39745,20608,39304,24871,28291,22372,26118,25414,22256,25324,
+25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,
+34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,
+28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,
+20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,
+22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,
+29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,
+21385,21169,30782,21382,21033,20616,20363,20432,30178,31435,31890,27813,38582,
+21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,
+33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,
+26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,
+38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,
+37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,
+32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,
+30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,38534,22404,
+25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,
+25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,
+38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,
+29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,
+20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,
+33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,
+22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,
+28459,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,
+38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,
+29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,
+20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,
+36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,
+20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,
+22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,
+21517,21629,35884,25720,25721,34321,27169,33180,30952,25705,39764,25273,26411,
+33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,
+22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,
+21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,
+38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,
+38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,
+30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,
+38221,28037,24744,26592,29406,20957,23425,25319,27870,29275,25197,38062,32445,
+33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,
+31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,
+24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,
+30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,
+34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,
+30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,
+25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,21860,33086,30130,
+30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,
+31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,
+20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,
+25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,
+26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,
+26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,
+20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,
+24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,
+38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,
+33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,
+20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,
+38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,
+27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,
+31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,
+23624,39537,28192,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,
+20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,
+38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,
+25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,
+32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,
+20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,
+35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,
+33134,40131,22622,36187,19977,21441,20254,25955,26705,21971,20007,25620,39578,
+25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,
+20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,
+38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,
+19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,
+32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,
+30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,
+32958,24910,28183,22768,29983,29989,29298,21319,32499,30465,30427,21097,32988,
+22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,
+20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,
+22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,
+20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,
+23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,
+33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,
+40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,24661,
+21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,
+30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,
+24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,
+26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,
+37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,
+31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,
+25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,
+22905,22612,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,
+24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,
+22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,
+21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,
+36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,
+38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,
+28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,
+38081,24086,21381,21548,28867,27712,24311,20572,20141,24237,25402,33351,36890,
+26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,
+25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,
+20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,
+25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,
+27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,
+23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,
+26505,32593,24448,26106,26395,24536,22916,23041,24013,24494,21361,38886,36829,
+26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,
+32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,
+21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,
+29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,
+20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,
+21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,
+26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,31232,24687,
+24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,
+20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,
+36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,
+40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,
+29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,
+31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,
+20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,
+26195,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,
+21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,
+27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,
+26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,
+24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,
+21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,
+33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,
+23459,24748,26059,29572,36873,30307,30505,32474,38772,34203,23398,31348,38634,
+34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,
+36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,
+28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,
+34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,
+33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,
+22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,
+20859,26679,28478,36992,33136,22934,29814,25671,23591,36965,31377,35875,23002,
+21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,
+25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,
+20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,
+26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,
+24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,
+35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,
+38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,21360,33521,27185,
+23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,
+39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,
+27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,
+38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,
+36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,
+28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,
+22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,
+28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,
+25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,
+26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,
+21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,
+21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,
+36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,
+29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,
+28195,26413,36711,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,
+25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,
+23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,
+24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,
+25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,
+32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,
+20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,
+20105,24596,25972,25327,27491,25919,24103,30151,37073,35777,33437,26525,25903,
+21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,
+20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,
+33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,
+31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,
+21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,
+29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,
+22065,20027,33879,26609,21161,34496,36142,38136,31569,20303,27880,31069,39547,
+25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,
+25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,
+21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,
+28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,
+36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,
+31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,
+24038,20304,26590,20570,20316,22352,24231,20109,19980,20800,19984,24319,21317,
+19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,
+21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,
+20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,
+21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,
+21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,
+32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,
+20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,20319,20311,20274,
+20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,
+20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,
+20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,
+20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,
+20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,
+39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,
+34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,
+20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,
+35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,
+35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,
+35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,
+35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,
+38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,
+38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,
+37043,37046,37050,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,
+37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,
+37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,
+21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,
+22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,
+22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,
+22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,
+22456,22516,22511,22520,22500,22493,22539,22541,22525,22509,22528,22558,22553,
+22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,
+33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,
+33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,
+33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,
+33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,
+33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,
+33631,33600,33559,33632,33581,33594,33587,33638,33637,33640,33563,33641,33644,
+33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,
+33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,
+33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,
+33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,
+33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,
+33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,
+33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,34134,
+34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,
+34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,
+34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,
+22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,
+25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,
+25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,
+25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,
+25709,25750,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,
+25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,
+21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,
+21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,
+21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,
+21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,
+21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,
+21825,21845,21823,21840,21820,21815,21846,21877,21878,21879,21811,21808,21852,
+21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,
+21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,
+21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,
+22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,
+22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,
+22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,
+22300,24079,24089,24084,24081,24113,24123,24124,24119,24132,24148,24155,24158,
+24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,
+23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,
+23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,
+23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,
+23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,
+24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,
+29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,29435,29463,
+29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,
+29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,
+39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,
+39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,
+24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,
+24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,
+24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,
+24642,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,
+24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,
+24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,
+38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,
+38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,
+27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,
+27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,
+27825,27859,27887,27902,27961,27943,27916,27971,27976,27911,27908,27929,27918,
+27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,
+27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,
+28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,
+28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,
+28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,
+28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,
+28557,28556,28536,28530,28540,28538,28625,28617,28583,28601,28598,28610,28641,
+28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,
+23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,
+36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,
+36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,
+36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,
+24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,
+33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,22935,22986,22955,
+22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,
+23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,
+23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,
+23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,
+23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,
+39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,
+39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,
+32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,
+32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,
+32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,
+32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,
+32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,
+29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,
+39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,
+29744,29742,29740,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,
+29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,
+38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,
+26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,
+26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,
+26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,
+26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,
+26818,26990,26876,26911,26912,26873,26916,26864,26891,26881,26967,26851,26896,
+26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,
+27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,
+27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,
+27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,
+27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,
+27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,
+36729,36730,36732,36734,36737,36738,36740,36743,36747,36749,36750,36751,36760,
+36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,
+29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,
+26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,
+26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,
+26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,
+36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,
+29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,25663,
+25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,
+27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,
+29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,
+32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,
+33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,
+33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,
+33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,
+33226,33211,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,
+39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,
+26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,
+28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,
+29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,
+29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,
+31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,
+31130,31143,31155,24529,24528,24636,24669,24666,24679,24641,24665,24675,24747,
+24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,
+30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,
+30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,
+30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,
+30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,
+40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,
+30517,30520,30544,30545,30535,30531,30554,30568,30562,30565,30591,30605,30589,
+30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,
+30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,
+32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,
+38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,
+38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,
+38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,
+38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,38121,38123,
+38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,
+38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,
+38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,
+38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,
+38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,
+38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,
+38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,
+31252,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,
+29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,
+40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,
+40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,
+40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,
+30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,
+30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,
+30245,30232,30229,30233,30235,30268,30242,30240,30272,30253,30256,30271,30261,
+30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,
+31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,
+34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,
+35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,
+35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,
+32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,
+32850,32873,32881,35203,39032,39040,39043,39049,39052,39053,39055,39060,39066,
+39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,
+34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,
+34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,
+34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,
+34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,
+34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,
+34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,34758,34696,34693,
+34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,
+34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,
+32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,
+31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,
+31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,
+31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,
+31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,
+31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,
+33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,
+33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,
+32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,
+31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,
+32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,
+40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,
+37198,37199,37220,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,
+37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,
+37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,
+36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,
+36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,
+36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,
+36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,
+35988,26011,35286,35294,35290,35292,35301,35307,35311,35390,35622,38739,38633,
+38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,
+40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,
+38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,
+40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,
+40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,
+40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,
+40123,40124,40125,40132,40133,40134,40135,40138,40139,40140,40141,40142,40143,
+40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,
+38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,
+39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,
+39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,
+39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,
+40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,
+40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,
+};
+
+static const struct dbcs_index gb2312_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb2312_decmap+0,33,126},{__gb2312_decmap+94,
+49,124},{__gb2312_decmap+170,33,126},{__gb2312_decmap+264,33,115},{
+__gb2312_decmap+347,33,118},{__gb2312_decmap+433,33,88},{__gb2312_decmap+489,
+33,113},{__gb2312_decmap+570,33,105},{__gb2312_decmap+643,36,111},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb2312_decmap+719,33,126},{
+__gb2312_decmap+813,33,126},{__gb2312_decmap+907,33,126},{__gb2312_decmap+1001
+,33,126},{__gb2312_decmap+1095,33,126},{__gb2312_decmap+1189,33,126},{
+__gb2312_decmap+1283,33,126},{__gb2312_decmap+1377,33,126},{__gb2312_decmap+
+1471,33,126},{__gb2312_decmap+1565,33,126},{__gb2312_decmap+1659,33,126},{
+__gb2312_decmap+1753,33,126},{__gb2312_decmap+1847,33,126},{__gb2312_decmap+
+1941,33,126},{__gb2312_decmap+2035,33,126},{__gb2312_decmap+2129,33,126},{
+__gb2312_decmap+2223,33,126},{__gb2312_decmap+2317,33,126},{__gb2312_decmap+
+2411,33,126},{__gb2312_decmap+2505,33,126},{__gb2312_decmap+2599,33,126},{
+__gb2312_decmap+2693,33,126},{__gb2312_decmap+2787,33,126},{__gb2312_decmap+
+2881,33,126},{__gb2312_decmap+2975,33,126},{__gb2312_decmap+3069,33,126},{
+__gb2312_decmap+3163,33,126},{__gb2312_decmap+3257,33,126},{__gb2312_decmap+
+3351,33,126},{__gb2312_decmap+3445,33,126},{__gb2312_decmap+3539,33,126},{
+__gb2312_decmap+3633,33,126},{__gb2312_decmap+3727,33,126},{__gb2312_decmap+
+3821,33,126},{__gb2312_decmap+3915,33,126},{__gb2312_decmap+4009,33,126},{
+__gb2312_decmap+4103,33,126},{__gb2312_decmap+4197,33,126},{__gb2312_decmap+
+4291,33,126},{__gb2312_decmap+4385,33,121},{__gb2312_decmap+4474,33,126},{
+__gb2312_decmap+4568,33,126},{__gb2312_decmap+4662,33,126},{__gb2312_decmap+
+4756,33,126},{__gb2312_decmap+4850,33,126},{__gb2312_decmap+4944,33,126},{
+__gb2312_decmap+5038,33,126},{__gb2312_decmap+5132,33,126},{__gb2312_decmap+
+5226,33,126},{__gb2312_decmap+5320,33,126},{__gb2312_decmap+5414,33,126},{
+__gb2312_decmap+5508,33,126},{__gb2312_decmap+5602,33,126},{__gb2312_decmap+
+5696,33,126},{__gb2312_decmap+5790,33,126},{__gb2312_decmap+5884,33,126},{
+__gb2312_decmap+5978,33,126},{__gb2312_decmap+6072,33,126},{__gb2312_decmap+
+6166,33,126},{__gb2312_decmap+6260,33,126},{__gb2312_decmap+6354,33,126},{
+__gb2312_decmap+6448,33,126},{__gb2312_decmap+6542,33,126},{__gb2312_decmap+
+6636,33,126},{__gb2312_decmap+6730,33,126},{__gb2312_decmap+6824,33,126},{
+__gb2312_decmap+6918,33,126},{__gb2312_decmap+7012,33,126},{__gb2312_decmap+
+7106,33,126},{__gb2312_decmap+7200,33,126},{__gb2312_decmap+7294,33,126},{
+__gb2312_decmap+7388,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+};
+
+static const ucs2_t __gbkext_decmap[14531] = {
+19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,
+20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,
+20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,
+20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,
+20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,U,20112,
+20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,
+20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,
+20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,
+20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,
+20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,
+20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,
+20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,
+20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,
+20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,
+20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,
+20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,
+20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,
+20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,
+20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,
+20484,20485,20486,20487,20488,20489,20490,U,20491,20494,20496,20497,20499,
+20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,
+20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,
+20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,
+20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,
+20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,
+20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,
+20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,
+20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,
+20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,
+20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,
+20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,
+20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,
+20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,
+20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,
+20740,20741,20744,U,20745,20746,20748,20749,20750,20751,20752,20753,20755,
+20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,
+20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,
+20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,
+20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,
+20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,
+20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,
+20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,
+20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,
+20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,
+20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,
+20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,
+21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,
+21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,
+21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,U,
+21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,
+21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,
+21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,
+21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,
+21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,
+21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,
+21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,
+21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,
+21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,
+21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,
+21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,
+21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,
+21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,
+21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,
+21376,21377,21379,21383,21384,21386,21390,21391,U,21392,21393,21394,21395,
+21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,
+21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,
+21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,
+21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,
+21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,
+21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,
+21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,
+21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,
+21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,
+21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,
+21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,
+21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,
+21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,
+21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,
+21791,21793,21797,21798,U,21800,21801,21803,21805,21810,21812,21813,21814,
+21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,
+21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,
+21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,
+21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,
+21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,
+21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,
+21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,
+21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,
+21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,
+22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,
+22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,
+22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,
+22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,
+22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,
+U,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,
+22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,
+22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,
+22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,
+22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,
+22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,
+22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,
+22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,
+22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,
+22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,
+22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,
+22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,
+22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,
+22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,
+22388,22389,22392,22393,22394,22397,22398,22399,22400,U,22401,22407,22408,
+22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,
+22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,
+22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,
+22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,
+22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,
+22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,
+22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,
+22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,
+22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,
+22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,
+22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,
+22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,
+22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,
+22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,
+22663,22664,22666,22667,22668,U,22669,22670,22671,22672,22673,22676,22677,
+22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,
+22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,
+22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,
+22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,
+22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,
+22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,
+22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,
+22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,
+22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,
+22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,
+22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,
+22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,
+22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,
+22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,
+22950,U,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,
+22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,
+22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,
+23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,
+23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,
+23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,
+23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,
+23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,
+23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,
+23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,
+23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,
+23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,
+23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,
+23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,
+23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,U,23213,23214,
+23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,
+23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,
+23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,
+23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,
+23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,
+23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,
+23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,
+23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,
+23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,
+23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,
+23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,
+23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,
+23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,
+23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,
+23497,23498,23499,23501,23502,23503,U,23505,23508,23509,23510,23511,23512,
+23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,
+23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,
+23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,
+23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,
+23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,
+23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,
+23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,
+23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,
+23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,
+23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,
+23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,
+23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,
+23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,
+23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,
+23807,23808,U,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,
+23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,
+23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,
+23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,
+23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,
+23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,
+23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,
+23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,
+23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,
+23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,
+23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,
+23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,
+23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,
+24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,
+24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,U,24048,
+24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,
+24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,
+24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,
+24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,
+24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,
+24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,
+24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,
+24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,
+24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,
+24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,
+24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,
+24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,
+24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,
+24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,
+24348,24349,24350,24353,24354,24355,24356,U,24360,24363,24364,24366,24368,
+24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,
+24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,
+24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,
+24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,
+24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,
+24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,
+24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,
+24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,
+24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,
+24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,
+24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,
+24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,
+24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,
+24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,
+24695,24702,24704,U,24705,24706,24709,24710,24711,24712,24714,24715,24718,
+24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,
+24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,
+24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,
+24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,
+24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,
+24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,
+24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,
+24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,
+24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,
+24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,
+24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,
+24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,
+24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,
+24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,U,
+24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,
+24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,
+25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,
+25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,
+25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,
+25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,
+25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,
+25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,
+25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,
+25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,
+25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,
+25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,
+25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,
+25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,
+25268,25270,25271,25272,25274,25278,25280,25281,U,25283,25291,25295,25297,
+25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,
+25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,
+25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,
+25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,
+25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,
+25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,
+25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,
+25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,
+25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,
+25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,
+25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,
+25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,
+25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,
+25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,
+25631,25634,25635,25636,U,25637,25639,25640,25641,25643,25646,25647,25648,
+25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,
+25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,
+25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,
+25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,
+25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,
+25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,
+25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,
+25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,
+25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,
+25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,
+25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,
+25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,
+25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,
+25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,
+U,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,
+25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,
+25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,
+25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,
+25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,
+25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,
+26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,
+26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,
+26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,
+26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,
+26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,
+26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,
+26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,
+26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,
+26183,26184,26185,26186,26189,26190,26192,26193,26200,U,26201,26203,26204,
+26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,
+26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,
+26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,
+26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,
+26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,
+26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,
+26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,
+26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,
+26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,
+26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,
+26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,
+26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,
+26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,
+26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,
+26476,26478,26481,26484,26486,U,26488,26489,26490,26491,26493,26496,26498,
+26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,
+26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,
+26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,
+26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,
+26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,
+26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,
+26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,
+26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,
+26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,
+26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,
+26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,
+26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,
+26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,
+26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,
+26808,U,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,
+26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,
+26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,
+26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,
+26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,
+26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,
+26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,
+26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,
+26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,
+26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,
+26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,
+26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,
+27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,
+27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,
+27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,U,27070,27071,
+27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,
+27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,
+27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,
+27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,
+27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,
+27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,
+27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,
+27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,
+27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,
+27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,
+27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,
+27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,
+27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,
+27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,
+27297,27298,27299,27300,27301,27302,U,27303,27304,27306,27309,27310,27311,
+27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,
+27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,
+27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,
+27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,
+27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,
+27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,
+27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,
+27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,
+27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,
+27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,
+27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,
+27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,
+27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,
+27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,
+27525,27528,U,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,
+27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,
+27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,
+27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,
+27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,
+27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,
+27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,
+27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,
+27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,
+27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,
+27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,
+27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,
+27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,
+27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,
+27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,U,27865,
+27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,
+27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,
+27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,
+27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,
+27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,
+28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,
+28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,
+28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,
+28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,
+28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,
+28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,
+28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,
+28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,
+28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,
+28202,28204,28206,28208,28209,28211,28213,U,28214,28215,28217,28219,28220,
+28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,
+28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,
+28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,
+28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,
+28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,
+28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,
+28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,
+28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,
+28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,
+28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,
+28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,
+28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,
+28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,
+28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,
+28480,28481,28482,U,28483,28484,28485,28488,28489,28490,28492,28494,28495,
+28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,
+28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,
+28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,
+28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,
+28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,
+28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,
+28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,
+28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,
+28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,
+28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,
+28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,
+28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,
+28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,
+28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,U,
+28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,
+28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,
+28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,
+28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,
+28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,
+28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,
+28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,
+28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,
+28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,
+28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,
+28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,
+28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,
+28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,
+28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,
+28970,28971,28972,28973,28974,28978,28979,28980,U,28981,28983,28984,28985,
+28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,
+29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,
+29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,
+29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,
+29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,
+29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,
+29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,
+29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,
+29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,
+29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,
+29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,
+29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,
+29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,
+29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,
+29207,29208,29209,29210,U,29211,29212,29214,29215,29216,29217,29218,29219,
+29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,
+29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,
+29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,
+29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,
+29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,
+29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,
+29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,
+29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,
+29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,
+29402,29403,183,U,U,U,U,U,8212,8560,8561,8562,8563,8564,8565,8566,8567,8568,
+8569,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,
+U,U,65083,65084,65079,65080,65073,U,65075,65076,714,715,729,8211,8213,8229,
+8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,
+9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,
+9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,U,9608,9609,9610,
+9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,
+8853,12306,12317,12318,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,593,U,324,328,U,609,12321,12322,12323,12324,12325,12326,
+12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,
+13266,13269,65072,65506,65508,U,8481,12849,U,8208,U,U,U,12540,12443,12444,
+12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,
+65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,
+65120,65121,U,65122,65123,65124,65125,65126,65128,65129,65130,65131,U,U,U,U,U,
+U,U,U,U,U,U,U,U,12295,29404,29405,29407,29410,29411,29412,29413,29414,29415,
+29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,
+29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,
+29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,
+29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,
+29511,29512,U,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,
+29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,
+29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,29554,29555,29556,
+29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,
+29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,
+29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,
+29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,
+29630,29631,29633,29635,29636,29637,29638,29639,U,29643,29644,29646,29650,
+29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,
+29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,
+29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,
+29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,
+29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,
+29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,
+29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,
+29773,U,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,
+29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,
+29807,29809,29810,29811,29812,29813,29816,29817,29818,29819,29820,29821,29823,
+29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,
+29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,
+29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,
+29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,
+29889,29890,29891,29892,29893,29894,29895,U,29896,29897,29898,29899,29900,
+29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,
+29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,
+29937,29938,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,
+29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,
+29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,
+29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,
+30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,
+U,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,
+30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,
+30077,30078,30080,30081,30082,30084,30085,30087,30088,30089,30090,30092,30093,
+30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,
+30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,
+30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,
+30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,
+30205,30206,30210,30212,30214,30215,U,30216,30217,30219,30221,30222,30223,
+30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,
+30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,
+30276,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,
+30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,
+30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,
+30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,
+30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,U,
+30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,
+30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,
+30395,30396,30397,30398,30400,30401,30403,30404,30407,30409,30411,30412,30419,
+30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,
+30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,
+30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,
+30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,
+30500,30501,30503,30506,30507,U,30508,30510,30512,30513,30514,30515,30516,
+30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,
+30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,
+30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,
+30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,
+30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,
+30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,
+30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,U,30652,
+30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,
+30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,
+30685,30686,30687,30688,30689,30692,30694,30696,30698,30703,30704,30705,30706,
+30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,
+30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,
+30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,
+30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,
+30804,30808,30809,30810,U,30811,30812,30814,30815,30816,30817,30818,30819,
+30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,
+30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,30852,
+30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,
+30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,
+30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,
+30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,
+30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,U,30948,30949,
+30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,
+30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,
+30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30996,30997,
+30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,
+31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,
+31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,
+31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,
+31065,31073,31075,U,31076,31078,31081,31082,31083,31084,31086,31088,31089,
+31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,
+31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,31123,31124,
+31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,
+31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,
+31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,
+31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,
+31196,31197,31198,31200,31201,31202,31205,31208,31210,U,31212,31214,31217,
+31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,
+31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,
+31256,31257,31259,31260,31261,31263,31265,31266,31268,31269,31270,31271,31272,
+31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,
+31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,
+31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,
+31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,
+31335,31336,U,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,
+31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,
+31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,31395,31396,31399,
+31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,
+31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,
+31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,
+31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,
+31466,31467,31468,31470,31472,31473,31474,31475,U,31476,31477,31478,31479,
+31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,
+31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,
+31527,31529,31533,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,
+31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,
+31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,
+31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,
+31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,
+31631,U,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,
+31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,
+31675,31676,31677,31678,31679,31680,31682,31683,31684,31685,31688,31689,31690,
+31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,
+31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,
+31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,
+31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,
+31762,31763,31764,31765,31767,31768,31769,U,31770,31771,31772,31773,31774,
+31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,
+31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,
+31806,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,
+31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,
+31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,
+31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,
+31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,
+U,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,
+31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,
+31920,31924,31925,31926,31927,31928,31930,31931,31935,31936,31938,31939,31940,
+31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,
+31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,
+31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,
+31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,
+32011,32012,32013,32014,32015,32016,U,32017,32018,32019,32020,32021,32022,
+32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,
+32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,
+32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,
+32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,
+32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,
+32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,
+32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,U,
+32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,
+32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,
+32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,
+32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,
+32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,
+32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,
+32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,
+32213,32214,32215,32216,32217,U,32218,32219,32220,32221,32222,32223,32224,
+32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,
+32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,
+32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,
+32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,
+32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,
+32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,
+32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,U,32314,
+32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,
+32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,
+32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,
+32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,
+32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,
+32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,
+32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,
+32410,32412,32413,32414,U,32430,32436,32443,32444,32470,32484,32492,32505,
+32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,
+32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,32598,
+32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,
+32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,
+32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,
+32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,
+32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,U,32691,32692,
+32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,
+32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,
+32732,32733,32734,32738,32739,32740,32743,32744,32746,32747,32748,32749,32751,
+32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,
+32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,
+32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,
+32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,
+32853,32854,32855,U,32857,32859,32860,32861,32862,32863,32864,32865,32866,
+32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,
+32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32897,
+32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,
+32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,
+32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,
+32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,
+33023,33024,33025,33027,33028,33029,33031,33032,33035,U,33036,33045,33047,
+33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,
+33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,
+33083,33084,33085,33087,33088,33089,33090,33091,33092,33093,33095,33097,33101,
+33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,
+33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,
+33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,
+33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,
+33188,33189,U,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,
+33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,
+33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,
+33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,
+33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,
+33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,
+33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,
+33319,33321,33326,33330,33338,33340,33341,33343,U,33344,33345,33346,33347,
+33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,
+33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,
+33382,33383,33385,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,
+33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,
+33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,
+33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,
+33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,
+33528,U,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,
+33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,
+33574,33577,33578,33582,33584,33586,33591,33595,33597,33598,33599,33601,33602,
+33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,
+33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,
+33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,
+33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,
+33700,33701,33702,33703,33708,33709,33710,U,33711,33717,33723,33726,33727,
+33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,
+33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,
+33772,33773,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,
+33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,
+33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,
+33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,
+33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,
+U,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,
+33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,
+33903,33904,33906,33908,33911,33913,33915,33916,33917,33918,33919,33920,33921,
+33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,
+33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,
+33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,
+33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,
+33998,33999,34002,34004,34005,34007,U,34008,34009,34010,34011,34012,34014,
+34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,
+34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,
+34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,
+34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,
+34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,
+34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,
+34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,U,
+34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,
+34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,
+34167,34168,34172,34173,34175,34176,34177,34178,34179,34182,34184,34185,34186,
+34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,
+34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,
+34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,
+34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,
+34252,34253,34254,34257,34258,U,34260,34262,34263,34264,34265,34266,34267,
+34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,
+34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,
+34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,
+34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,
+34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,
+34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,
+34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,U,34369,
+34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,
+34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,
+34405,34406,34407,34408,34409,34410,34413,34415,34416,34418,34419,34420,34421,
+34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,
+34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,
+34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,
+34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,
+34518,34519,34522,34524,U,34525,34528,34529,34530,34531,34533,34534,34535,
+34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,
+34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,34585,
+34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,
+34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,
+34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,
+34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,
+34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,U,34679,34680,
+34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,
+34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,
+34720,34721,34722,34723,34724,34725,34726,34727,34729,34730,34734,34736,34737,
+34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,
+34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,
+34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,
+34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,
+34806,34807,34808,U,34810,34811,34812,34813,34815,34816,34817,34818,34820,
+34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,
+34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,34852,34853,
+34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,
+34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,
+34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,
+34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,
+34927,34929,34931,34932,34933,34934,34936,34937,34938,U,34939,34940,34944,
+34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,
+34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,
+34983,34984,34985,34986,34988,34990,34991,34992,34994,34995,34996,34997,34998,
+35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,
+35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,
+35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,
+35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,
+35079,35080,U,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,
+35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,
+35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,35128,35129,35130,
+35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,
+35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,
+35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,
+35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,
+35188,35189,35190,35191,35192,35193,35194,35196,U,35197,35198,35200,35202,
+35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,
+35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,
+35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,
+35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,
+35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,
+35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,
+35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,
+35322,U,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,
+35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,
+35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,
+35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,
+35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,
+35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,
+35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,
+35416,35417,35418,35419,35420,35421,35422,U,35423,35424,35425,35426,35427,
+35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,
+35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,
+35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,
+35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,
+35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,
+35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,
+35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,
+U,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,
+35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,
+35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,
+35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,
+35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,
+35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,
+35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,
+35614,35615,35616,35617,35618,35619,U,35620,35621,35623,35624,35625,35626,
+35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,
+35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,
+35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,
+35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,
+35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,
+35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,
+35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,U,
+35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,
+35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,
+35761,35771,35783,35792,35818,35849,35870,35896,35897,35898,35899,35900,35901,
+35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,
+35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,
+35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,
+35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,
+35969,35971,35972,35974,35975,U,35976,35979,35981,35982,35983,35984,35985,
+35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,
+36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,
+36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,
+36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,
+36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,
+36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,
+36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,U,36077,
+36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,
+36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,
+36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,
+36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,
+36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,
+36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,
+36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,
+36253,36254,36256,36257,U,36258,36260,36261,36262,36263,36264,36265,36266,
+36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,
+36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,36309,
+36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,
+36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,
+36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,
+36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,
+36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,U,36415,36419,
+36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,
+36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,
+36456,36458,36459,36462,36465,36467,36469,36471,36472,36473,36474,36475,36477,
+36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,
+36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,
+36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,
+36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,
+36544,36545,36546,U,36547,36548,36549,36550,36551,36552,36553,36554,36555,
+36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,
+36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,
+36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,
+36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,
+36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,
+36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,
+36635,36636,36637,36638,36639,36640,36641,36642,36643,U,36644,36645,36646,
+36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,
+36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,
+36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,
+36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,
+36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,
+36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,
+36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,
+36803,36806,U,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,
+36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,
+36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,36889,36892,36899,
+36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,
+36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,
+36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,
+36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,
+36983,36984,36985,36986,36987,36988,36990,36993,U,36996,36997,36998,36999,
+37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,
+37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,
+37053,37055,37056,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,
+37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,
+37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,
+37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,
+37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,
+37148,U,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,
+37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,
+37179,37180,37181,37182,37183,37184,37185,37186,37188,37189,37191,37192,37201,
+37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,
+37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,
+37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,
+37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,
+37298,37299,37302,37303,37304,37305,37307,U,37308,37309,37310,37311,37312,
+37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,
+37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,
+37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,
+37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,
+37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,
+37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,
+37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,
+U,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,
+37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,
+37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,
+37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,
+37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,
+37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,
+37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,
+37504,37505,37506,37507,37508,37509,U,37510,37511,37512,37513,37514,37515,
+37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,
+37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,
+37543,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,
+37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,
+37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,
+37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,
+37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,U,
+37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,
+37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,
+37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,
+37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,
+37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,
+37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,
+37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,
+37701,37702,37703,37704,37705,U,37706,37707,37708,37709,37710,37711,37712,
+37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,
+37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,
+37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,
+37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,
+37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,
+37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,
+37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,U,37804,
+37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,
+37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,
+37831,37832,37833,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,
+37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,
+37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,
+37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,
+37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,
+37898,37899,37900,37901,U,37902,37903,37904,37905,37906,37907,37908,37909,
+37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,
+37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,
+37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,
+37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,
+37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,
+37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,
+37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,U,38000,38001,
+38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,
+38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,
+38106,38118,38139,38172,38176,38183,38195,38205,38211,38216,38219,38229,38234,
+38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,
+38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,
+38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,
+38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,
+38312,38313,38314,U,38315,38316,38317,38318,38319,38320,38321,38322,38323,
+38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,
+38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,
+38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,
+38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,
+38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,
+38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,
+38467,38474,38478,38479,38481,38482,38483,38486,38487,U,38488,38489,38490,
+38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,
+38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,
+38532,38535,38537,38538,38540,38542,38545,38546,38547,38549,38550,38554,38555,
+38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,
+38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,
+38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,
+38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,
+38631,38635,U,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,
+38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,
+38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,38689,38690,38691,
+38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,
+38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,
+38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,
+38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,
+38762,38763,38764,38765,38766,38767,38768,38769,U,38770,38773,38775,38776,
+38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,
+38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,
+38811,38812,38813,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,
+38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,
+38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,
+38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,
+38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,
+38883,U,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,
+38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,
+38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,
+38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,
+38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,
+38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,
+38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,
+38983,38984,38985,38986,38987,38988,38989,U,38990,38991,38992,38993,38994,
+38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,
+39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,
+39021,39022,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,
+39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,
+39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,
+39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,
+39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,
+U,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,
+39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,
+39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,
+39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,
+39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,
+39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,
+39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,
+39236,39237,39238,39239,39240,39241,U,39242,39243,39244,39245,39246,39247,
+39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,
+39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,
+39305,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,
+39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,
+39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,
+39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,
+39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,U,
+39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,
+39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,
+39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,
+39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,
+39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,
+39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,
+39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,
+39476,39477,39478,39479,39480,U,39481,39482,39483,39484,39485,39486,39487,
+39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,
+39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,
+39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,
+39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,
+39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,
+39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,
+39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,U,39645,
+39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,
+39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,
+39680,39681,39682,39684,39685,39686,39687,39689,39690,39691,39692,39693,39694,
+39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,
+39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,
+39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,
+39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,
+39767,39768,39769,39770,U,39771,39772,39773,39774,39775,39776,39777,39778,
+39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,
+39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,
+39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,
+39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,
+39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,
+39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,
+39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,U,39867,39868,
+39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,
+39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,
+39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,
+39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,
+39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,
+39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,
+39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,
+39960,39961,39962,U,39963,39964,39965,39966,39967,39968,39969,39970,39971,
+39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,
+39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,
+39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,
+40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,
+40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,
+40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,
+40050,40051,40052,40053,40054,40055,40056,40057,40058,U,40059,40061,40062,
+40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,
+40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,
+40154,40155,40160,40161,40163,40164,40165,40166,40167,40168,40169,40170,40171,
+40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,
+40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,
+40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,
+40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,
+40224,40225,U,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,
+40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,
+40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,
+40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,
+40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,
+40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,
+40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,
+40314,40315,40316,40317,40318,40319,40320,40321,U,40322,40323,40324,40325,
+40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,
+40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,
+40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,
+40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,
+40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,
+40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,
+40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,
+40417,U,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,
+40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,
+40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,
+40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,
+40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,
+40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,
+40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,
+40568,40569,40570,40571,40572,40573,40576,U,40577,40579,40580,40581,40582,
+40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,
+40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,
+40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,
+40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,
+40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,
+40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,
+40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,
+U,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,
+40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,
+40744,40745,40746,40747,40749,40750,40752,40753,40754,40755,40756,40757,40758,
+40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,
+40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,
+40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,
+40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,
+40819,40820,40821,40822,40823,40824,U,40825,40826,40827,40828,40829,40830,
+40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,
+40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,
+63985,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,
+64036,64039,64040,64041,
+};
+
+static const struct dbcs_index gbkext_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{__gbkext_decmap+0,64,254},{__gbkext_decmap+191,64,
+254},{__gbkext_decmap+382,64,254},{__gbkext_decmap+573,64,254},{
+__gbkext_decmap+764,64,254},{__gbkext_decmap+955,64,254},{__gbkext_decmap+1146
+,64,254},{__gbkext_decmap+1337,64,254},{__gbkext_decmap+1528,64,254},{
+__gbkext_decmap+1719,64,254},{__gbkext_decmap+1910,64,254},{__gbkext_decmap+
+2101,64,254},{__gbkext_decmap+2292,64,254},{__gbkext_decmap+2483,64,254},{
+__gbkext_decmap+2674,64,254},{__gbkext_decmap+2865,64,254},{__gbkext_decmap+
+3056,64,254},{__gbkext_decmap+3247,64,254},{__gbkext_decmap+3438,64,254},{
+__gbkext_decmap+3629,64,254},{__gbkext_decmap+3820,64,254},{__gbkext_decmap+
+4011,64,254},{__gbkext_decmap+4202,64,254},{__gbkext_decmap+4393,64,254},{
+__gbkext_decmap+4584,64,254},{__gbkext_decmap+4775,64,254},{__gbkext_decmap+
+4966,64,254},{__gbkext_decmap+5157,64,254},{__gbkext_decmap+5348,64,254},{
+__gbkext_decmap+5539,64,254},{__gbkext_decmap+5730,64,254},{__gbkext_decmap+
+5921,64,254},{__gbkext_decmap+6112,164,170},{__gbkext_decmap+6119,161,170},{0,
+0,0},{0,0,0},{0,0,0},{__gbkext_decmap+6129,224,245},{0,0,0},{__gbkext_decmap+
+6151,64,192},{__gbkext_decmap+6280,64,150},{__gbkext_decmap+6367,64,160},{
+__gbkext_decmap+6464,64,160},{__gbkext_decmap+6561,64,160},{__gbkext_decmap+
+6658,64,160},{__gbkext_decmap+6755,64,160},{__gbkext_decmap+6852,64,160},{
+__gbkext_decmap+6949,64,160},{__gbkext_decmap+7046,64,160},{__gbkext_decmap+
+7143,64,160},{__gbkext_decmap+7240,64,160},{__gbkext_decmap+7337,64,160},{
+__gbkext_decmap+7434,64,160},{__gbkext_decmap+7531,64,160},{__gbkext_decmap+
+7628,64,160},{__gbkext_decmap+7725,64,160},{__gbkext_decmap+7822,64,160},{
+__gbkext_decmap+7919,64,160},{__gbkext_decmap+8016,64,160},{__gbkext_decmap+
+8113,64,160},{__gbkext_decmap+8210,64,160},{__gbkext_decmap+8307,64,160},{
+__gbkext_decmap+8404,64,160},{__gbkext_decmap+8501,64,160},{__gbkext_decmap+
+8598,64,160},{__gbkext_decmap+8695,64,160},{__gbkext_decmap+8792,64,160},{
+__gbkext_decmap+8889,64,160},{__gbkext_decmap+8986,64,160},{__gbkext_decmap+
+9083,64,160},{__gbkext_decmap+9180,64,160},{__gbkext_decmap+9277,64,160},{
+__gbkext_decmap+9374,64,160},{__gbkext_decmap+9471,64,160},{__gbkext_decmap+
+9568,64,160},{__gbkext_decmap+9665,64,160},{__gbkext_decmap+9762,64,160},{
+__gbkext_decmap+9859,64,160},{__gbkext_decmap+9956,64,160},{__gbkext_decmap+
+10053,64,160},{__gbkext_decmap+10150,64,160},{__gbkext_decmap+10247,64,160},{
+__gbkext_decmap+10344,64,160},{__gbkext_decmap+10441,64,160},{__gbkext_decmap+
+10538,64,160},{__gbkext_decmap+10635,64,160},{__gbkext_decmap+10732,64,160},{
+__gbkext_decmap+10829,64,160},{__gbkext_decmap+10926,64,160},{__gbkext_decmap+
+11023,64,160},{__gbkext_decmap+11120,64,160},{__gbkext_decmap+11217,64,160},{
+__gbkext_decmap+11314,64,160},{__gbkext_decmap+11411,64,160},{__gbkext_decmap+
+11508,64,160},{__gbkext_decmap+11605,64,160},{__gbkext_decmap+11702,64,160},{
+__gbkext_decmap+11799,64,160},{__gbkext_decmap+11896,64,160},{__gbkext_decmap+
+11993,64,160},{__gbkext_decmap+12090,64,160},{__gbkext_decmap+12187,64,160},{
+__gbkext_decmap+12284,64,160},{__gbkext_decmap+12381,64,160},{__gbkext_decmap+
+12478,64,160},{__gbkext_decmap+12575,64,160},{__gbkext_decmap+12672,64,160},{
+__gbkext_decmap+12769,64,160},{__gbkext_decmap+12866,64,160},{__gbkext_decmap+
+12963,64,160},{__gbkext_decmap+13060,64,160},{__gbkext_decmap+13157,64,160},{
+__gbkext_decmap+13254,64,160},{__gbkext_decmap+13351,64,160},{__gbkext_decmap+
+13448,64,160},{__gbkext_decmap+13545,64,160},{__gbkext_decmap+13642,64,160},{
+__gbkext_decmap+13739,64,160},{__gbkext_decmap+13836,64,160},{__gbkext_decmap+
+13933,64,160},{__gbkext_decmap+14030,64,160},{__gbkext_decmap+14127,64,160},{
+__gbkext_decmap+14224,64,160},{__gbkext_decmap+14321,64,160},{__gbkext_decmap+
+14418,64,160},{__gbkext_decmap+14515,64,79},{0,0,0},
+};
+
+static const DBCHAR __gbcommon_encmap[23231] = {
+8552,N,N,8556,8487,N,N,N,N,N,N,N,8547,8512,N,N,N,N,N,41380,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8513,N,N,N,N,N,N,N,N,10276,10274,
+N,N,N,N,N,N,10280,10278,10298,N,10284,10282,N,N,N,N,10288,10286,N,N,N,8514,N,
+10292,10290,N,10297,10273,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10277,N,N,N,N,N,N,
+N,10279,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10281,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,43197,N,N,N,43198,N,N,N,N,10285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,10289,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10275,
+N,10283,N,10287,N,10291,N,10293,N,10294,N,10295,N,10296,43195,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,43200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8486,N,8485,
+43072,43073,N,N,N,N,N,N,N,N,N,N,N,N,N,43074,9761,9762,9763,9764,9765,9766,
+9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,N,9778,9779,9780,9781,
+9782,9783,9784,N,N,N,N,N,N,N,9793,9794,9795,9796,9797,9798,9799,9800,9801,
+9802,9803,9804,9805,9806,9807,9808,9809,N,9810,9811,9812,9813,9814,9815,9816,
+10023,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10017,10018,10019,10020,10021,10022,10024,
+10025,10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037,
+10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049,10065,
+10066,10067,10068,10069,10070,10072,10073,10074,10075,10076,10077,10078,10079,
+10080,10081,10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,
+10093,10094,10095,10096,10097,N,10071,43356,N,N,43075,41386,8490,8492,N,8494,
+8495,N,N,8496,8497,N,N,N,N,N,N,N,43077,8493,N,N,N,N,N,N,N,N,N,8555,N,8548,
+8549,N,43078,N,N,N,N,N,8569,8550,N,43079,N,N,N,43080,N,N,N,N,N,N,N,N,N,N,N,N,
+8557,N,N,N,N,N,N,N,N,N,N,43353,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,N,N,N,N,41633,
+41634,41635,41636,41637,41638,41639,41640,41641,41642,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,8571,8572,8570,8573,N,N,43081,43082,43083,43084,8522,N,N,
+N,N,N,N,8519,N,8518,N,N,N,43085,N,N,N,N,8524,N,N,8536,8542,43086,8527,N,N,
+43087,N,8526,N,8516,8517,8521,8520,8530,N,N,8531,N,N,N,N,N,8544,8543,8515,
+8523,N,N,N,N,N,8535,N,N,N,N,N,N,N,N,N,N,8534,N,N,N,8533,N,N,N,N,N,43088,N,N,N,
+N,N,N,N,N,N,N,N,N,N,8537,8532,N,N,8540,8541,43089,43090,N,N,N,N,N,N,8538,8539,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+43154,N,N,N,8529,N,N,N,N,N,N,N,N,N,N,N,8525,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,43091,8528,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,
+N,N,N,N,N,N,N,N,N,N,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,
+8784,8785,8786,8787,8788,8789,8790,8791,8792,8753,8754,8755,8756,8757,8758,
+8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,10532,
+10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,
+10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,
+10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,
+10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,
+10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,
+10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,N,N,N,N,43092,
+43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,
+43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,
+43119,43120,43121,43122,43123,43124,43125,43126,43127,N,N,N,N,N,N,N,N,N,N,N,N,
+N,43128,43129,43130,43131,43132,43133,43134,43136,43137,43138,43139,43140,
+43141,43142,43143,N,N,N,43144,43145,43146,N,N,N,N,N,N,N,N,N,N,8566,8565,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,8568,8567,N,N,N,N,N,N,N,N,43147,43148,N,N,N,N,N,N,N,
+N,8564,8563,N,N,N,8560,N,N,8562,8561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+43149,43150,43151,43152,8559,8558,N,N,43153,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+8546,N,8545,8481,8482,8483,8488,N,8489,43365,43414,8500,8501,8502,8503,8504,
+8505,8506,8507,8510,8511,43155,8574,8498,8499,8508,8509,N,N,N,N,N,43156,43157,
+N,N,43328,43329,43330,43331,43332,43333,43334,43335,43336,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,
+9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,
+9274,9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,
+9289,9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,
+9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,
+9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,N,N,N,N,N,N,
+N,43361,43362,43366,43367,N,N,9505,9506,9507,9508,9509,9510,9511,9512,9513,
+9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,
+9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,
+9544,9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,
+9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,
+9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,
+9589,9590,N,N,N,N,8484,43360,43363,43364,10309,10310,10311,10312,10313,10314,
+10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,
+10328,10329,10330,10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,
+10341,10342,10343,10344,10345,8805,8806,8807,8808,8809,8810,8811,8812,8813,
+8814,N,N,N,N,N,N,N,43354,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,43337,43338,43339,N,N,N,N,N,N,N,N,N,N,N,N,43340,43341,43342,
+N,N,43343,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+43344,N,N,N,N,N,N,N,N,N,43345,N,N,43346,43347,N,N,43348,21051,13857,33088,
+18015,33089,33090,33091,19826,21833,18557,18767,20290,22562,12859,21355,33092,
+22564,13171,33093,22312,18258,22567,19008,33094,18288,12667,21045,13396,13867,
+19263,22569,33095,33096,33097,13866,33098,16701,20815,33099,18725,22573,33100,
+14454,20798,25436,22096,33101,33102,14177,33103,13358,33104,16729,33105,22588,
+33106,19816,13604,20010,22135,33107,16502,15961,22575,33108,33109,33110,17483,
+33111,15939,33112,22577,17204,21093,33113,22062,20058,21799,14965,14118,16470,
+33114,17977,17746,18247,33115,14676,33116,13131,21074,33117,33118,22591,15941,
+18034,21042,20272,20327,33119,33120,33121,33122,19049,33123,33124,22592,33125,
+33126,33127,33128,33129,33130,17010,16978,33131,18537,33132,33133,33134,33135,
+33136,33137,33138,33139,33140,33141,18220,33142,33143,33144,33145,33146,33147,
+33148,16715,33149,21352,21881,33150,19010,13950,22561,21338,16247,33152,21574,
+15141,22593,20069,15918,33153,33154,22568,33155,20807,20521,33156,33157,33158,
+22589,22895,19830,16186,33159,15675,14885,21088,12922,14944,17462,33160,20333,
+15913,19748,16705,33161,33162,33163,18263,22897,33164,22900,33165,33166,33167,
+33168,18507,22633,33169,33170,33171,21082,18994,18506,22636,22634,22598,15734,
+17997,13168,33172,22635,15729,15721,33173,18516,13395,33174,33175,16984,33176,
+12886,22352,19019,19323,21836,14390,20297,33177,33178,33179,22874,22640,18218,
+33180,22638,33181,13434,16750,21076,33182,33183,22637,33184,21063,22639,17223,
+33185,33186,33187,20854,33188,22105,22642,33189,22645,15486,15451,33190,33191,
+33192,18510,33193,14173,33194,14146,33195,18035,33196,33197,33198,33199,33200,
+33201,33202,22648,21057,33203,33204,20073,15423,14204,14117,20573,33205,33206,
+33207,33208,33209,22106,21317,15215,15201,22641,33210,33211,18721,20016,13355,
+33212,22643,33213,18763,22646,16983,22647,33214,33215,20017,22649,33216,33217,
+33218,12846,14656,33219,22819,33220,12393,33221,16742,33222,18796,33223,19269,
+33224,19270,22820,33225,33226,33227,33228,33229,13672,33230,33231,13611,33232,
+33233,33234,33235,33236,33237,20027,13645,22305,22388,21331,33238,19557,33239,
+14926,33240,22818,22876,21344,22653,14192,22391,22654,22650,22817,17507,33241,
+33242,21302,22644,22877,33243,22651,33244,17765,33245,33246,16464,33247,33248,
+20848,12379,33249,33250,15441,22822,33251,22821,33252,33253,33254,33255,22828,
+22830,33256,22827,19001,33257,33258,33259,22825,22070,33260,33261,33262,13150,
+22824,33263,16509,33264,19020,33265,22826,33266,22823,33267,33268,22832,33269,
+33270,13873,33271,33272,33273,14633,33274,21056,33275,33276,20288,33277,33278,
+16962,33344,15684,21868,12896,18248,16235,22829,33345,22831,33346,20074,14958,
+33347,33348,33349,33350,33351,18262,33352,33353,33354,33355,33356,33357,33358,
+33359,33360,12643,33361,33362,33363,13401,13933,22836,33364,33365,33366,33367,
+16161,33368,33369,33370,22878,18254,16510,22840,33371,33372,33373,33374,33375,
+19287,14205,33376,22837,33377,22839,12579,21345,22841,33378,20549,33379,22838,
+33380,33381,22833,33382,22834,16681,22835,33383,33384,15475,20574,14377,33385,
+15971,33386,22845,33387,33388,33389,33390,22842,33391,12339,33392,33393,33394,
+22850,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,
+33408,22852,12598,33409,22847,33410,33411,13625,33412,15987,33413,33414,33415,
+19528,14962,21072,33416,22851,33417,33418,15720,33419,13099,33420,33421,33422,
+22853,15979,33423,22854,22843,17503,33424,22846,22849,22848,33425,33426,33427,
+33428,33429,33430,33431,33432,33433,33434,33435,21806,33436,22069,33437,18275,
+33438,33439,33440,33441,22856,33442,33443,33444,15449,22858,33445,33446,33447,
+22844,33448,22859,17963,33449,33450,33451,33452,33453,22857,33454,33455,33456,
+33457,22390,33458,19747,33459,33460,33461,33462,33463,33464,33465,33466,15649,
+33467,33468,33469,33470,33471,33472,22860,33473,33474,33475,33476,33477,33478,
+33479,33480,33481,17724,19765,33482,33483,33484,22861,33485,33486,22855,13093,
+16254,33487,33488,33489,33490,14389,33491,33492,16508,33493,33494,33495,33496,
+12408,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,
+33509,33510,33511,33512,33513,33514,33515,33516,33517,13430,33518,22862,33519,
+22863,13346,22864,33520,33521,13407,33522,33523,33524,33525,33526,12353,33527,
+33528,33529,33530,33531,33532,33533,22865,18741,33534,33600,33601,33602,33603,
+33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,
+33617,20337,33618,33619,33620,33621,33622,33623,22866,33624,33625,33626,16709,
+33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,22870,18734,
+33638,33639,33640,33641,22869,22868,22871,33642,33643,33644,33645,19291,33646,
+15657,33647,33648,33649,33650,33651,17959,33652,33653,33654,33655,33656,33657,
+33658,33659,33660,33661,22867,22872,33662,33664,33665,22873,33666,33667,33668,
+33669,33670,33671,18533,33672,33673,33674,33675,33676,33677,33678,33679,33680,
+33681,33682,33683,33684,33685,16476,33686,33687,33688,33689,33690,33691,33692,
+33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,
+33706,33707,33708,33709,33710,33711,33712,33713,33714,13945,22563,21578,33715,
+21546,20566,13156,21847,33716,20296,14690,33717,16203,33718,17250,33719,33720,
+33721,13906,33722,33723,19779,22894,22896,33724,33725,33726,13619,33727,13877,
+33728,33729,33730,33731,33732,15908,33733,33734,18539,33735,33736,18475,33737,
+33738,12363,14635,16761,22882,33739,16444,14642,33740,14680,20555,12664,18020,
+15967,13668,22344,33741,20856,15462,19038,33742,33743,15421,22886,22631,33744,
+33745,17498,33746,33747,14420,18493,33748,33749,12897,21593,33750,33751,33752,
+33753,17200,33754,33755,17249,23074,18527,33756,20532,33757,15996,17705,33758,
+33759,33760,14682,33761,23075,33762,21545,23076,33763,33764,33765,33766,33767,
+22907,13868,33768,33769,14187,12665,22908,13157,15990,33770,16246,21041,16484,
+33771,33772,33773,13875,22910,22909,33774,33775,15931,33776,33777,33778,18016,
+33779,22332,23073,33780,16697,33781,13682,16744,33782,33783,15477,33784,13397,
+33785,33786,33787,33788,33789,33790,33856,33857,33858,16733,33859,17533,33860,
+33861,15416,14130,33862,33863,14191,33864,33865,33866,33867,33868,33869,22892,
+33870,17982,33871,16173,15179,33872,33873,13642,33874,23369,20567,33875,19769,
+12348,13174,15223,23370,14895,33876,21604,13622,13683,22614,18512,33877,33878,
+14166,18256,22615,33879,16175,33880,33881,23355,22616,33882,33883,20556,15150,
+33884,33885,33886,27454,16720,16757,21618,14421,13364,33887,13173,33888,33889,
+18750,33890,33891,33892,17744,33893,33894,33895,17753,16507,33896,12656,33897,
+22617,14670,33898,13629,33899,33900,22618,33901,33902,22086,19234,18479,18738,
+13388,16204,33903,14708,33904,22619,22620,13927,15425,19562,33905,33906,33907,
+33908,33909,33910,20343,33911,22621,18224,33912,33913,14672,15651,33914,33915,
+19550,33916,17994,33917,33918,33920,33921,33922,22624,33923,22622,33924,33925,
+22623,33926,33927,33928,12414,33929,15975,33930,18979,15476,33931,33932,33933,
+33934,14385,33935,33936,14446,33937,33938,33939,33940,33941,33942,33943,33944,
+33945,33946,22626,33947,15691,33948,22628,22627,33949,33950,33951,33952,33953,
+17788,33954,33955,33956,33957,33958,33959,33960,22629,33961,33962,22630,33963,
+33964,33965,33966,33967,33968,33969,16678,33970,18480,12396,14630,15443,20081,
+23357,16723,33971,33972,33973,33974,13871,22138,17708,15705,23358,23359,33975,
+33976,33977,16504,15906,16461,33978,33979,33980,33981,33982,33983,33984,33985,
+33986,33987,23360,19014,33988,33989,33990,12842,33991,33992,33993,21314,33994,
+17251,33995,20779,33996,33997,33998,33999,23362,34000,16469,34001,34002,34003,
+23363,34004,16177,34005,34006,34007,34008,34009,34010,17468,34011,34012,34013,
+34014,18266,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,
+23364,34026,34027,34028,34029,34030,34031,34032,34033,22888,18775,34034,34035,
+34036,14644,20080,21576,34037,34038,34039,34040,12412,13394,34041,20569,34042,
+34043,34044,34045,22889,34046,24139,22891,34112,34113,34114,34115,22576,15151,
+12593,34116,13143,22606,34117,34118,21585,34119,34120,15667,16239,34121,20283,
+34122,34123,22608,34124,34125,34126,14155,34127,34128,34129,22609,34130,34131,
+34132,34133,34134,34135,34136,34137,34138,34139,17957,18296,21053,34140,34141,
+22610,17508,34142,18990,34143,18215,34144,22566,34145,18813,20071,15196,12395,
+34146,34147,34148,15146,20525,34149,12592,22372,22335,34150,13605,17012,17487,
+34151,34152,12841,34153,12855,34154,12645,24370,21820,16168,16940,22613,16945,
+34155,22612,20052,34156,23136,34157,20032,34158,34159,22580,17198,21281,20003,
+34160,15412,18484,16977,34161,15981,20534,34162,23137,34163,34164,34165,34166,
+18276,34167,34168,13095,34169,13938,19580,16506,34170,34171,16503,34172,20793,
+20833,22599,34173,34174,34176,34177,34178,34179,34180,12894,34181,34182,16485,
+34183,14961,34184,34185,22600,34186,21549,34187,34188,20321,22601,34189,22602,
+20291,34190,13176,15943,34191,34192,34193,34194,22603,34195,34196,34197,34198,
+34199,34200,34201,23372,34202,34203,34204,34205,18469,34206,34207,34208,20312,
+34209,18558,12878,34210,34211,34212,34213,34214,21334,12902,15408,21329,19243,
+14132,34215,34216,34217,14114,34218,34219,19045,34220,18465,19036,12644,20592,
+34221,17745,34222,34223,34224,23365,13694,34225,34226,16218,14661,15972,16749,
+34227,24374,24373,22075,15696,21849,12360,13859,16201,19496,24371,18999,21330,
+34228,22607,21046,14917,19262,19518,34229,24375,13680,24372,34230,34231,34232,
+21365,34233,13140,14455,34234,24378,34235,14927,15402,13685,34236,19756,17275,
+14963,16500,19778,20338,24376,20293,34237,16960,24377,17008,34238,34239,34240,
+15997,34241,16735,19788,21111,14157,24385,34242,24388,34243,34244,14193,12361,
+13910,14164,34245,14892,19581,16212,19249,18036,34246,22056,24389,34247,20066,
+13107,34248,34249,20092,13365,34250,20039,14960,34251,20065,34252,20797,34253,
+34254,24384,34255,34256,13428,34257,13130,34258,14438,24379,34259,34260,34261,
+34262,17477,34263,24380,24381,24382,17723,24383,24386,21553,24387,34264,18234,
+20056,34265,34266,34267,34268,34269,17496,34270,24394,34271,24399,34272,22108,
+34273,34274,34275,34276,34277,34278,34279,34280,24393,24410,20022,34281,14919,
+24398,24392,17758,34282,34283,18795,14964,17276,34284,34285,15959,34286,24390,
+34287,24397,34288,17752,34289,34290,34291,34292,21798,14925,34293,15948,21309,
+14400,34294,22116,34295,24391,14654,16167,34296,34297,16764,24395,24396,34298,
+24400,34299,34300,34301,34302,34368,24411,24421,34369,24407,24406,22345,24419,
+24420,25963,21031,24402,34370,16169,34371,21595,34372,16200,24404,34373,34374,
+34375,20300,34376,34377,24413,34378,20810,34379,24414,12327,17975,24403,34380,
+14949,34381,13919,19803,14718,21589,34382,34383,24415,20332,12325,24423,24401,
+20806,24405,24408,24409,24412,34384,15145,34385,24416,24417,34386,24418,24422,
+24424,21300,34387,34388,34389,34390,34391,14439,17718,24426,18778,16680,17476,
+34392,34393,16222,20344,34394,34395,34396,21852,24430,34397,34398,34399,34400,
+34401,34402,12856,34403,14943,24428,34404,23361,34405,20836,34406,34407,34408,
+34409,19316,13373,34410,12326,34411,34412,34413,34414,34415,24433,19526,24434,
+34416,34417,24429,34418,34419,34420,34421,34422,34423,24425,34424,34425,34426,
+34427,24427,34428,24431,24432,15165,34429,34430,24435,34432,34433,24436,34434,
+15139,34435,19035,20008,24615,13098,34436,24614,34437,34438,34439,24609,34440,
+34441,34442,34443,24446,34444,19801,24444,34445,24442,34446,16208,22340,34447,
+18764,34448,34449,24440,12321,34450,34451,34452,34453,34454,24445,34455,34456,
+34457,34458,24443,24610,34459,34460,34461,34462,34463,24616,34464,34465,34466,
+34467,14152,34468,34469,17953,18742,16434,24437,34470,34471,17726,34472,22596,
+24441,17526,34473,34474,34475,34476,34477,34478,24611,24612,24613,20517,34479,
+34480,24628,19556,34481,24625,34482,16166,24623,20025,24619,18758,34483,34484,
+16430,24622,14957,14896,24617,34485,34486,34487,24438,34488,24627,34489,34490,
+24632,34491,34492,34493,13357,24633,34494,34495,20274,14920,34496,24624,34497,
+34498,34499,34500,34501,34502,34503,20602,34504,34505,34506,34507,34508,34509,
+34510,34511,34512,24620,34513,21627,34514,24439,34515,17767,34516,24621,34517,
+21367,34518,24630,24631,34519,34520,34521,34522,34523,24644,20577,34524,34525,
+34526,24636,34527,34528,24649,24650,34529,34530,34531,24638,24618,18724,24641,
+34532,24626,34533,34534,34535,34536,34537,19016,24643,34538,24629,34539,20043,
+34540,19267,24653,24646,24642,34541,24651,34542,24634,24639,24640,34543,34544,
+24645,34545,34546,24647,24648,34547,24652,34548,24635,34549,34550,34551,34552,
+34553,19284,24661,34554,24662,24658,34555,34556,34557,34558,34624,34625,24656,
+15438,34626,34627,24657,34628,14402,22597,34629,34630,34631,34632,34633,34634,
+34635,34636,20586,34637,34638,17007,34639,34640,24655,24637,34641,34642,34643,
+24660,24659,34644,34645,24663,34646,34647,34648,34649,24668,24664,34650,34651,
+34652,22134,13104,34653,22380,34654,19259,34655,34656,24666,34657,20091,34658,
+34659,34660,14937,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,
+34671,34672,24673,24669,21037,34673,34674,34675,34676,34677,24674,34678,34679,
+24667,24665,24671,34680,34681,24672,34682,34683,34684,34685,34686,24670,34688,
+24676,34689,34690,34691,18039,22572,21611,24678,19017,34692,34693,34694,34695,
+24677,34696,34697,34698,34699,14401,34700,34701,34702,34703,24679,24680,34704,
+34705,34706,34707,34708,34709,34710,34711,24681,24675,34712,34713,34714,34715,
+34716,34717,34718,14911,19559,34719,34720,34721,24682,34722,34723,34724,34725,
+34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,20345,34737,
+34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,24683,34748,34749,
+34750,34751,34752,34753,34754,18498,34755,34756,34757,34758,15680,34759,34760,
+34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,17490,34772,
+34773,34774,34775,34776,34777,34778,34779,34780,24684,34781,34782,24685,34783,
+34784,18292,19268,34785,24686,15192,22582,21106,24687,19781,34786,13914,34787,
+34788,34789,34790,34791,34792,24689,34793,21552,34794,34795,16423,13393,34796,
+34797,20007,24688,34798,34799,34800,24690,14668,34801,34802,14714,19772,24691,
+34803,34804,34805,18004,24692,34806,21554,34807,18470,24694,24693,34808,34809,
+34810,34811,34812,34813,34814,34880,34881,34882,34883,34884,34885,34886,34887,
+34888,34889,24695,34890,34891,19777,34892,34893,34894,18981,34895,34896,34897,
+34898,21594,23383,23385,34899,23384,14695,23388,23389,13656,34900,34901,23386,
+34902,34903,34904,34905,34906,23387,13089,23391,34907,34908,15224,34909,22071,
+34910,23392,34911,34912,34913,34914,15993,34915,34916,14139,34917,23376,19502,
+16178,15157,22392,16211,34918,34919,34920,34921,34922,16233,34923,34924,15457,
+19507,23390,12371,20075,14168,22329,17986,34925,34926,16420,34927,19513,34928,
+23399,23393,17978,23395,34929,23400,34930,17783,34931,34932,34933,23402,34934,
+34935,23401,16192,34936,34937,34938,23398,23397,34939,34940,34941,34942,34944,
+13369,16428,16930,23394,23396,34945,34946,34947,34948,20557,23405,34949,34950,
+34951,34952,34953,16477,23410,34954,34955,34956,34957,34958,34959,34960,13922,
+34961,34962,34963,34964,23411,23378,14648,21547,23404,34965,16209,23408,34966,
+23377,34967,13670,34968,23403,16229,34969,34970,34971,23406,34972,23409,34973,
+34974,34975,23417,34976,34977,34978,34979,34980,34981,34982,34983,34984,14625,
+12323,34985,34986,34987,34988,34989,34990,34991,17009,34992,34993,13127,23407,
+34994,34995,23416,34996,18002,23412,34997,34998,23413,23415,23414,34999,35000,
+23422,35001,21362,12858,35002,35003,35004,23421,35005,35006,35007,35008,35009,
+35010,35011,35012,23588,35013,23419,35014,35015,35016,35017,23418,35018,35019,
+35020,23420,17760,15225,35021,35022,23587,35023,35024,23589,35025,19523,35026,
+35027,35028,13905,23872,35029,35030,35031,23585,35032,23586,35033,35034,35035,
+18229,35036,35037,35038,13929,35039,35040,35041,23591,35042,35043,35044,35045,
+23590,35046,23593,12580,35047,35048,13644,35049,35050,35051,35052,35053,16176,
+35054,35055,35056,35057,35058,20831,35059,35060,35061,35062,13890,35063,35064,
+35065,35066,35067,35068,35069,35070,35136,35137,35138,35139,35140,35141,23592,
+35142,35143,35144,35145,35146,35147,35148,19322,27507,35149,35150,35151,19292,
+35152,35153,19326,35154,35155,35156,19521,35157,35158,35159,35160,35161,18555,
+35162,35163,35164,35165,35166,35167,23594,35168,35169,35170,35171,35172,19566,
+23595,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,
+35185,35186,35187,35188,35189,23379,35190,23599,23596,35191,15923,35192,19067,
+35193,35194,35195,23597,35196,35197,35198,35200,35201,35202,35203,35204,18762,
+17465,35205,35206,35207,35208,35209,18237,23598,35210,35211,35212,21622,20582,
+35213,35214,35215,35216,35217,35218,35219,35220,17451,13909,35221,35222,35223,
+35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,
+35237,35238,23380,35239,35240,35241,35242,12634,35243,35244,35245,23381,35246,
+35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,23382,35257,35258,
+35259,14910,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,
+35271,35272,35273,18496,35274,35275,35276,35277,35278,35279,19007,18505,35280,
+22323,35281,18809,35282,35283,16199,35284,35285,14968,35286,35287,21052,35288,
+35289,35290,35291,35292,35293,35294,35295,25146,35296,13350,35297,35298,12600,
+35299,35300,35301,35302,35303,14388,35304,20292,35305,35306,35307,35308,22887,
+20262,19810,35309,35310,22893,13920,35311,21049,35312,35313,14651,35314,35315,
+35316,35317,25145,25143,35318,13427,35319,19564,19499,14194,35320,22578,20843,
+14907,35321,18983,35322,35323,19767,35324,35325,21060,16228,15440,13921,35326,
+24133,35392,35393,35394,35395,24134,23356,35396,20825,35397,35398,18022,17486,
+14190,35399,14172,35400,35401,16252,22368,35402,18037,35403,35404,12604,24136,
+15665,19543,24138,35405,24137,35406,35407,35408,35409,35410,13676,35411,18781,
+35412,35413,12354,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,
+35424,35425,35426,17710,17707,35427,17484,35428,15465,19325,35429,35430,35431,
+14915,35432,35433,35434,25977,18535,25978,19837,35435,22321,14398,17000,35436,
+18513,35437,35438,25979,35439,35440,35441,35442,13898,15435,35443,35444,20861,
+26145,35445,17262,35446,35447,35448,35449,26148,35450,35451,35452,35453,25982,
+26149,19799,35454,35456,14145,25980,25981,26147,35457,35458,17501,26152,35459,
+35460,26151,35461,35462,35463,35464,35465,35466,17219,35467,18014,35468,35469,
+26154,35470,35471,35472,35473,35474,35475,35476,17463,35477,35478,35479,26146,
+19004,35480,35481,35482,35483,15715,14659,26150,20565,20015,35484,35485,26153,
+26160,35486,21030,35487,15658,26157,35488,35489,35490,35491,35492,26159,35493,
+16465,35494,35495,21068,35496,35497,35498,15399,35499,35500,35501,35502,35503,
+35504,35505,35506,35507,35508,35509,35510,26161,35511,21110,35512,35513,35514,
+22347,35515,19838,35516,19806,16934,26155,26156,15679,26158,26163,35517,35518,
+26162,35519,35520,35521,35522,26166,35523,26168,35524,35525,35526,35527,17519,
+35528,35529,35530,17480,35531,35532,15978,18799,35533,35534,26167,35535,13936,
+35536,35537,35538,17252,35539,35540,35541,35542,35543,35544,35545,21353,26164,
+35546,26165,35547,18466,35548,35549,35550,35551,35552,26173,35553,35554,35555,
+26169,35556,35557,35558,35559,35560,17989,35561,35562,19825,26171,35563,35564,
+35565,35566,35567,35568,35569,35570,35571,35572,26172,35573,35574,35575,35576,
+15209,35577,35578,35579,35580,35581,35582,35648,26174,35649,35650,35651,35652,
+26170,35653,35654,16439,35655,35656,35657,35658,35659,35660,35661,35662,35663,
+21284,26175,18804,26179,35664,35665,26180,35666,35667,35668,35669,20598,35670,
+35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,
+35684,35685,35686,35687,17213,35688,35689,35690,35691,35692,35693,35694,17220,
+26178,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,
+35707,35708,26177,35709,35710,35712,35713,35714,35715,35716,26183,20273,35717,
+27508,35718,35719,26186,35720,35721,35722,35723,35724,26181,35725,35726,15454,
+18729,35727,35728,35729,35730,35731,35732,15413,35733,35734,20307,35735,35736,
+35737,35738,35739,26184,35740,26185,35741,26190,35742,26192,35743,35744,35745,
+26193,35746,35747,35748,26187,13653,35749,26188,35750,35751,26191,35752,35753,
+17499,35754,26182,35755,35756,35757,35758,35759,26189,35760,35761,35762,35763,
+35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,
+35777,35778,35779,35780,35781,35782,26194,35783,35784,35785,35786,35787,35788,
+35789,35790,35791,35792,35793,35794,26196,26195,35795,35796,35797,35798,35799,
+35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,
+35813,35814,35815,35816,35817,35818,35819,35820,26197,35821,22904,35822,35823,
+26198,35824,35825,35826,35827,35828,35829,35830,35831,26199,35832,35833,35834,
+35835,35836,35837,35838,35904,35905,35906,35907,35908,35909,35910,35911,22355,
+26205,35912,26206,16215,21584,35913,22358,13414,19311,26202,22595,22350,20514,
+35914,17231,35915,35916,26207,15422,14658,26203,20775,35917,35918,14882,16975,
+35919,22571,35920,35921,35922,19051,25966,35923,26204,35924,14197,35925,35926,
+35927,35928,18534,35929,35930,17525,35931,35932,25906,17534,35933,19324,25907,
+21804,35934,21358,19032,12338,35935,19278,19818,35936,35937,14954,35938,35939,
+35940,25909,35941,25908,35942,22362,14681,22118,13864,19824,21067,12582,18997,
+35943,13160,18803,16205,20603,19026,25910,15170,35944,35945,35946,20316,14636,
+35947,35948,35949,35950,21591,35951,35952,14886,20839,20348,15442,35953,25911,
+18525,35954,35955,35956,16237,12662,19294,35957,35958,15429,35959,15428,21114,
+17244,16220,35960,35961,35962,35963,14395,35964,35965,35966,17218,35968,14894,
+21538,35969,35970,35971,35972,35973,35974,35975,35976,35977,18270,17455,12908,
+35978,14673,35979,35980,25915,16712,35981,35982,21807,35983,35984,35985,35986,
+35987,25916,35988,25918,35989,35990,35991,35992,35993,35994,35995,13415,13908,
+19266,20784,13628,35996,35997,19033,35998,14178,35999,36000,18788,36001,15659,
+36002,36003,20030,22384,36004,36005,36006,36007,20513,36008,18777,36009,36010,
+13947,26200,15458,36011,13118,36012,18768,36013,26201,13090,36014,36015,36016,
+36017,24140,36018,21320,24141,36019,21026,36020,36021,36022,36023,24142,36024,
+36025,36026,36027,15949,36028,36029,24143,36030,36031,36032,18988,21116,13151,
+25962,17505,15905,20018,17522,15958,17960,12899,36033,36034,15955,36035,36036,
+18300,19563,15724,20061,36037,36038,19002,17985,25964,20540,36039,36040,36041,
+21817,36042,36043,36044,25965,36045,36046,36047,36048,19060,36049,19776,16965,
+36050,25967,36051,16964,25968,36052,36053,36054,36055,36056,36057,36058,25976,
+19789,36059,18749,36060,36061,36062,36063,36064,36065,36066,21081,24872,36067,
+36068,36069,36070,21356,36071,19306,18033,36072,36073,36074,36075,36076,24876,
+36077,36078,36079,24871,24873,36080,36081,24874,24879,36082,36083,12909,36084,
+24875,14426,24877,24878,24880,13626,24881,36085,36086,36087,36088,36089,24883,
+24888,36090,36091,36092,36093,36094,20818,36160,24886,24885,16747,36161,36162,
+36163,24887,36164,21568,36165,24882,36166,24890,12342,36167,36168,36169,36170,
+24884,36171,16249,36172,24889,36173,36174,24891,36175,36176,36177,36178,36179,
+36180,24894,36181,36182,36183,36184,36185,36186,24892,36187,36188,36189,36190,
+36191,36192,22085,36193,36194,36195,36196,36197,36198,36199,20287,36200,36201,
+24893,24895,16973,36202,13931,36203,21368,36204,36205,18253,36206,36207,14181,
+36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,15998,36218,36219,
+36220,36221,36222,36224,24896,24897,36225,36226,24903,13159,36227,36228,36229,
+36230,36231,36232,18025,36233,36234,36235,36236,36237,13406,36238,20802,36239,
+36240,36241,36242,24904,36243,36244,24902,36245,36246,36247,36248,36249,24901,
+36250,24899,24898,36251,12608,36252,36253,36254,21816,24900,36255,36256,36257,
+36258,36259,24907,36260,36261,36262,36263,36264,36265,36266,36267,24908,24906,
+36268,36269,36270,36271,36272,36273,36274,36275,28538,36276,36277,24915,24914,
+18230,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,24905,
+36289,36290,24910,36291,24912,36292,36293,36294,36295,36296,36297,36298,36299,
+36300,36301,36302,24916,36303,24913,24909,36304,36305,24911,36306,36307,36308,
+36309,24917,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,
+36321,36322,24918,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,
+36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,24919,
+36345,36346,36347,24920,36348,36349,36350,36416,36417,36418,36419,36420,36421,
+36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,
+36435,36436,36437,24922,36438,36439,36440,36441,36442,36443,36444,36445,36446,
+36447,36448,36449,36450,24923,36451,36452,36453,36454,36455,36456,36457,20001,
+36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,
+26461,36471,13352,22109,36472,36473,20786,13106,36474,36475,14628,22387,18249,
+15966,14638,36476,20055,36477,36478,12910,23375,36480,15418,21073,19272,12365,
+36481,36482,20335,36483,36484,36485,36486,36487,22883,15725,36488,36489,12626,
+19024,12860,36490,19239,14123,36491,18982,36492,36493,36494,20259,36495,36496,
+24696,21834,24699,36497,36498,24698,17729,19579,36499,16689,24697,22115,12847,
+22084,13659,36500,36501,36502,36503,36504,36505,36506,36507,13432,22049,36508,
+36509,36510,36511,36512,20271,12399,36513,36514,24700,36515,36516,36517,36518,
+36519,24865,13091,36520,36521,24701,24702,17201,36522,36523,36524,36525,17245,
+36526,24866,14201,36527,36528,36529,36530,36531,36532,15183,36533,36534,36535,
+36536,36537,36538,36539,24867,17467,36540,36541,36542,36543,36544,24868,36545,
+36546,24869,36547,36548,24870,13361,36549,36550,36551,36552,36553,36554,36555,
+36556,36557,36558,36559,36560,36561,36562,36563,14409,17981,17514,36564,12834,
+36565,20562,36566,26459,15171,21335,21316,36567,14691,25167,36568,36569,36570,
+22319,36571,18284,12627,36572,36573,13362,25169,36574,36575,36576,20594,16942,
+25168,36577,16226,21286,13655,25170,13674,36578,17261,14461,36579,14382,36580,
+17747,14159,25172,36581,36582,36583,36584,25171,13896,22393,36585,36586,36587,
+36588,36589,19749,36590,36591,36592,36593,36594,25176,36595,25174,19068,16181,
+21305,25173,36596,36597,36598,36599,25175,36600,36601,36602,36603,36604,36605,
+36606,36672,36673,36674,16686,16456,36675,36676,36677,36678,36679,36680,25179,
+25178,16426,36681,36682,16718,36683,36684,36685,36686,25180,36687,36688,36689,
+36690,36691,36692,36693,36694,36695,36696,36697,36698,25181,36699,25182,36700,
+36701,36702,36703,36704,36705,36706,36707,36708,23368,36709,20819,19746,36710,
+36711,15656,36712,36713,36714,24131,22565,16170,23373,21100,18042,17706,36715,
+36716,36717,24132,36718,12631,24366,36719,36720,36721,19005,36722,24369,36723,
+14637,36724,21117,36725,14373,14955,36726,36727,13146,36728,36729,36730,13660,
+21829,36731,36732,36733,36734,17238,20306,15137,36736,25971,25970,36737,36738,
+25972,36739,19812,36740,18549,36741,36742,36743,36744,36745,36746,36747,13615,
+18239,36748,25974,36749,36750,36751,27696,36752,36753,36754,36755,36756,36757,
+36758,36759,36760,36761,36762,36763,36764,36765,36766,25958,36767,14697,13617,
+36768,16956,25960,25959,25961,36769,36770,36771,36772,21069,36773,36774,36775,
+24938,20558,36776,19758,36777,20837,36778,36779,12874,12651,36780,12658,17773,
+36781,36782,21827,21296,36783,24924,36784,36785,36786,24925,36787,21083,36788,
+13113,12619,36789,36790,36791,19833,21879,24926,36792,15926,13437,36793,24927,
+14940,24928,15154,16969,24929,36794,36795,36796,20588,36797,19773,36798,36799,
+24930,36800,13635,17735,24931,36801,36802,24932,36803,36804,36805,36806,21369,
+36807,36808,36809,36810,36811,36812,24933,36813,20781,36814,36815,24934,20002,
+36816,36817,36818,36819,36820,36821,24935,36822,13634,36823,36824,36825,36826,
+24936,15189,36827,36828,36829,36830,36831,20548,25184,12632,21092,36832,36833,
+25185,36834,36835,15433,18508,36836,25187,27774,27773,24367,36837,36838,36839,
+25186,22078,19836,17190,36840,36841,36842,25411,36843,36844,22098,25191,36845,
+36846,25192,36847,36848,21319,36849,36850,25196,16236,36851,25197,25189,36852,
+36853,13120,36854,36855,36856,17518,36857,36858,25198,36859,36860,20547,36861,
+14966,25193,14174,15155,19500,19275,25188,25190,25194,25195,36862,36928,36929,
+25207,36930,36931,25204,21621,25203,36932,36933,17709,36934,21882,17730,12864,
+36935,36936,25199,36937,25202,16687,19260,36938,36939,13601,25209,36940,36941,
+36942,15409,25201,20564,21561,25205,14678,25206,36943,36944,36945,18259,36946,
+36947,36948,36949,36950,25200,36951,36952,36953,36954,36955,22364,27937,36956,
+36957,25208,36958,27941,25214,19025,36959,36960,36961,36962,36963,36964,36965,
+16693,36966,15184,36967,36968,16214,36969,14947,36970,36971,19233,36972,36973,
+36974,27942,27939,36975,36976,27938,36977,36978,36979,36980,15190,27943,20596,
+36981,36982,27940,14942,13943,25377,13874,19569,14631,36983,20258,18209,36984,
+36985,16210,36986,36987,13937,36988,25210,25211,25213,25212,17493,25378,36989,
+21313,36990,36992,36993,25383,18244,36994,36995,36996,36997,20260,36998,36999,
+25385,14903,37000,37001,37002,37003,25384,37004,15194,37005,25379,37006,37007,
+37008,25380,25386,37009,25382,37010,20082,21318,37011,37012,15164,37013,37014,
+21571,37015,17530,37016,37017,27944,20604,25381,37018,17269,37019,25389,12591,
+37020,25394,37021,37022,37023,15426,37024,37025,25388,13631,37026,37027,37028,
+37029,37030,37031,37032,37033,18281,25392,37034,37035,37036,15914,19823,37037,
+37038,37039,37040,37041,15219,37042,37043,37044,19560,37045,37046,25391,37047,
+25393,37048,20263,25390,37049,20009,15197,37050,37051,37052,37053,37054,13675,
+15973,12882,13133,37055,12601,25387,12881,13612,14687,13928,37056,37057,20331,
+25399,37058,15180,37059,37060,18503,20554,37061,37062,37063,37064,37065,25400,
+13166,37066,37067,37068,37069,27945,37070,21370,21348,37071,37072,37073,27946,
+25401,21090,37074,37075,37076,37077,37078,25397,37079,37080,37081,37082,21342,
+37083,37084,37085,37086,14416,25395,37087,37088,25398,14175,37089,25396,16418,
+37090,37091,37092,25402,37093,37094,37095,37096,37097,37098,37099,37100,37101,
+37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,21560,37112,37113,
+37114,37115,37116,37117,37118,37184,13384,37185,25403,37186,15173,37187,18807,
+37188,37189,18789,37190,37191,37192,17469,37193,37194,37195,37196,37197,37198,
+37199,27947,37200,37201,37202,37203,17021,37204,37205,37206,37207,15195,16174,
+37208,37209,37210,37211,37212,37213,37214,20031,37215,37216,37217,37218,25404,
+37219,16182,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,
+37231,37232,37233,37234,37235,37236,37237,37238,12655,37239,37240,21623,37241,
+37242,37243,37244,37245,25406,37246,37248,37249,37250,37251,37252,37253,37254,
+27949,37255,37256,37257,37258,37259,37260,37261,37262,37263,25407,14889,27948,
+37264,37265,25405,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,
+25408,37276,37277,37278,37279,37280,37281,14902,37282,37283,37284,13870,37285,
+37286,37287,37288,37289,20536,37290,12355,27950,37291,37292,37293,37294,37295,
+27951,16449,37296,25409,37297,37298,37299,37300,37301,37302,37303,37304,37305,
+37306,37307,37308,37309,37310,37311,37312,37313,17715,37314,37315,37316,37317,
+37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,25410,37328,37329,
+37330,37331,37332,37333,37334,37335,37336,23602,37337,37338,37339,37340,37341,
+37342,27952,37343,14442,37344,20076,27175,20583,19065,18518,20279,13129,20050,
+15716,37345,37346,25438,15218,27176,21821,37347,18013,27177,37348,37349,37350,
+27178,37351,27180,27179,37352,27182,27181,37353,37354,37355,37356,15704,37357,
+27183,37358,16958,37359,37360,37361,37362,13377,13431,37363,37364,15143,37365,
+37366,37367,37368,37369,27750,27749,14143,19321,12642,37370,27751,37371,37372,
+37373,18760,27752,27753,37374,19030,24144,12869,21626,37440,37441,17995,12359,
+13426,18515,37442,37443,37444,19792,37445,37446,16184,37447,37448,37449,37450,
+37451,37452,37453,16219,37454,37455,18212,22068,37456,16425,24145,18728,20847,
+17700,12391,13110,18501,37457,37458,12386,37459,37460,14198,37461,37462,17786,
+37463,37464,13939,37465,21842,13136,15420,37466,37467,37468,13101,37469,37470,
+37471,37472,15985,12369,37473,37474,37475,37476,37477,37478,21078,19043,22309,
+37479,19766,13878,16185,21851,37480,14375,17751,37481,37482,37483,24146,16217,
+16981,18240,37484,15140,12584,37485,37486,17770,37487,37488,17787,19495,37489,
+37490,37491,37492,12583,37493,37494,37495,13654,37496,37497,37498,17448,37499,
+24147,20794,13161,37500,17266,37501,37502,14199,37504,22132,13603,12912,17460,
+17513,16429,24148,37505,12392,17732,16736,37506,14677,37507,15964,19800,12366,
+37508,19791,24150,15952,22334,24149,21840,12381,37509,37510,17506,37511,37512,
+16931,15472,37513,21301,16441,17697,12838,21617,37514,37515,16424,19011,24151,
+21884,37516,14640,37517,18477,19241,37518,24153,16189,37519,37520,37521,37522,
+17972,22311,18992,17475,37523,13142,14674,37524,37525,37526,37527,22072,27260,
+12340,37528,37529,37530,37531,16230,37532,37533,19572,37534,37535,37536,37537,
+19802,37538,37539,37540,22079,16974,37541,20046,19490,20526,17491,13618,24152,
+21877,15415,15187,37542,37543,12324,37544,17714,13420,37545,37546,37547,21873,
+37548,37549,27261,37550,37551,37552,37553,37554,37555,24154,19750,37556,37557,
+19820,37558,37559,37560,37561,20070,24156,37562,19761,16422,37563,37564,22333,
+37565,24155,12358,14900,18771,17523,15976,37566,37567,37568,37569,12854,37570,
+37571,37572,37573,37574,37575,37576,37577,16460,19312,37578,15473,15163,13623,
+37579,37580,37581,17781,37582,24166,37583,37584,37585,24163,15965,37586,37587,
+24159,37588,37589,37590,37591,13367,15709,37592,37593,24160,17517,37594,37595,
+37596,37597,20294,37598,13664,37599,37600,37601,37602,13918,19034,13684,24165,
+37603,21830,37604,24161,19533,18046,37605,17733,37606,37607,37608,21044,37609,
+15986,37610,37611,37612,37613,37614,37615,37616,16979,37617,19517,13112,37618,
+15699,37619,16216,19782,20826,13419,37620,24164,24157,24167,37621,27262,37622,
+37623,16944,24162,37624,37625,22080,13607,37626,12916,37627,24168,37628,24178,
+37629,37630,37696,37697,37698,24173,37699,24177,37700,37701,18528,37702,37703,
+37704,22369,24175,17256,19553,37705,12901,37706,37707,37708,21054,37709,37710,
+37711,37712,37713,37714,37715,24174,37716,24171,20053,37717,13351,37718,37719,
+37720,37721,37722,16171,15934,37723,37724,15698,37725,37726,37727,37728,24169,
+37729,21550,37730,24158,37731,24170,37732,37733,37734,37735,16447,37736,24172,
+12915,14441,16935,37737,37738,15681,37739,37740,37741,37742,37743,24181,24184,
+37744,37745,12843,13348,37746,37747,13418,18726,37748,37749,37750,37751,37752,
+37753,24182,19281,37754,14435,37755,24183,24186,37756,37757,37758,37760,24185,
+37761,37762,37763,19522,37764,12385,13422,37765,37766,37767,37768,37769,37770,
+25914,37771,37772,37773,37774,37775,20527,37776,37777,12907,37778,27425,37779,
+24180,37780,37781,18787,24179,12378,21025,12663,37782,19503,37783,37784,37785,
+37786,37787,37788,37789,24176,37790,19236,37791,37792,37793,21802,37794,37795,
+37796,37797,37798,24187,37799,37800,37801,37802,37803,37804,37805,37806,13405,
+37807,17446,37808,37809,37810,24189,37811,37812,37813,37814,37815,37816,37817,
+37818,37819,37820,17278,17441,24353,37821,37822,37823,37824,37825,37826,37827,
+16716,37828,24188,15983,37829,17970,37830,37831,37832,37833,37834,37835,37836,
+37837,37838,13125,18550,37839,37840,19258,24190,37841,37842,24356,37843,37844,
+37845,37846,22322,37847,37848,37849,37850,37851,13111,37852,37853,37854,37855,
+16707,37856,37857,18251,12837,13417,37858,22315,37859,37860,37861,37862,17516,
+37863,24354,24355,37864,24357,37865,14899,37866,37867,37868,24358,37869,16478,
+37870,37871,18755,37872,37873,37874,37875,37876,37877,37878,12889,18278,37879,
+24359,37880,18268,37881,37882,37883,37884,24360,27426,37885,37886,37952,37953,
+37954,19283,37955,37956,37957,24362,37958,24361,37959,12865,37960,37961,37962,
+37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,
+37976,37977,37978,37979,37980,37981,37982,37983,37984,17738,37985,37986,37987,
+37988,37989,37990,37991,37992,24363,37993,37994,37995,37996,37997,37998,37999,
+38000,21596,38001,38002,38003,38004,38005,18497,38006,38007,38008,38009,38010,
+38011,38012,38013,38014,38016,38017,38018,24364,38019,38020,38021,38022,38023,
+15984,38024,38025,24365,22055,38026,38027,38028,38029,27191,27446,19029,38030,
+22652,14404,38031,14629,38032,38033,14149,21886,38034,38035,38036,38037,38038,
+14666,38039,38040,20519,29773,38041,38042,13648,38043,38044,17268,38045,15944,
+38046,38047,38048,27447,12349,38049,38050,15692,38051,16690,38052,12630,13096,
+38053,38054,38055,14418,18722,38056,38057,13912,38058,38059,38060,38061,27448,
+15924,38062,38063,38064,19069,38065,18243,38066,21883,38067,38068,14195,38069,
+38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,
+38083,20036,38084,38085,38086,21803,12659,38087,38088,38089,27699,12383,38090,
+27701,38091,38092,38093,13879,38094,16719,38095,30074,20529,38096,38097,21861,
+38098,20051,38099,38100,15727,13154,38101,14379,38102,21814,38103,27965,38104,
+13903,38105,19257,20546,38106,38107,38108,38109,38110,38111,38112,38113,14141,
+38114,38115,27702,18985,38116,38117,38118,17748,38119,27705,27704,16963,27703,
+38120,38121,38122,38123,20605,27706,38124,27707,22373,38125,38126,27708,38127,
+38128,38129,27709,18028,38130,38131,38132,38133,38134,38135,38136,38137,20062,
+38138,15432,38139,38140,18517,13609,15945,22076,21607,38141,38142,20782,20593,
+27192,27193,27194,14901,38208,38209,38210,38211,18993,16245,38212,38213,19834,
+38214,38215,38216,38217,38218,27200,38219,12346,27198,38220,38221,16421,38222,
+38223,38224,27195,38225,12925,38226,17271,15208,38227,38228,38229,21079,20084,
+27199,38230,38231,38232,27196,38233,38234,38235,27203,38236,20551,21299,38237,
+38238,38239,38240,13370,38241,17217,22386,38242,38243,38244,38245,21841,38246,
+19015,38247,27205,38248,38249,27204,27207,27206,38250,38251,38252,38253,38254,
+22119,38255,20308,38256,38257,27211,38258,15182,38259,38260,38261,38262,38263,
+38264,38265,15738,18766,38266,38267,27212,38268,38269,18745,20350,27210,21582,
+27213,27215,38270,38272,19821,38273,38274,38275,38276,27209,38277,27214,38278,
+38279,20078,38280,15198,38281,13119,38282,38283,38284,38285,38286,18005,15920,
+20090,38287,38288,38289,18279,38290,15911,27216,38291,38292,22087,38293,38294,
+38295,16704,38296,38297,38298,21597,38299,27217,38300,38301,20286,38302,38303,
+38304,38305,27218,38306,38307,38308,38309,19054,38310,38311,38312,38313,17711,
+12341,38314,38315,38316,38317,38318,27220,38319,38320,38321,38322,38323,38324,
+38325,38326,38327,27219,29791,38328,38329,38330,38331,38332,17466,38333,38334,
+38335,38336,38337,12585,38338,38339,38340,38341,25951,38342,38343,38344,38345,
+27221,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,
+38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,
+38371,19055,38372,27222,27223,18008,38373,38374,38375,38376,38377,38378,38379,
+38380,27224,38381,38382,27225,38383,38384,38385,38386,38387,38388,21563,38389,
+18298,21047,14460,38390,38391,27202,38392,12892,38393,38394,17020,38395,21624,
+19558,22382,38396,38397,38398,38464,38465,38466,38467,21570,21328,27459,17779,
+38468,14206,38469,38470,27476,38471,38472,38473,19255,27486,38474,16458,38475,
+38476,38477,19835,38478,13103,38479,18010,38480,38481,38482,38483,38484,38485,
+27516,38486,17470,38487,20020,17449,12606,21629,38488,19061,38489,22124,38490,
+38491,18003,13924,38492,38493,38494,38495,15226,38496,38497,20576,38498,38499,
+18737,38500,21587,18472,38501,38502,14411,38503,26686,18748,38504,38505,26683,
+38506,16494,20563,12868,13413,38507,26684,38508,38509,21832,38510,38511,38512,
+38513,38514,13893,38515,26685,19064,14428,19573,38516,38517,38518,16436,38519,
+38520,20846,26687,26690,38521,38522,14908,38523,12589,15708,38524,27197,26691,
+38525,26694,38526,26699,38528,38529,38530,38531,26700,38532,19273,12389,38533,
+15403,38534,38535,14649,38536,38537,26689,38538,19831,38539,26698,38540,38541,
+38542,38543,20086,38544,38545,38546,38547,21869,38548,16726,26692,38549,17206,
+38550,14715,22054,26696,38551,38552,38553,19040,21606,38554,26688,38555,26693,
+26695,38556,18233,14179,38557,26697,38558,16221,26706,38559,38560,26711,38561,
+26709,15452,15439,26715,38562,38563,38564,38565,38566,38567,38568,38569,26718,
+38570,26714,12666,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,
+12376,17459,14412,18018,18494,18529,38581,38582,38583,26703,26708,26710,38584,
+14705,26712,22389,38585,17531,38586,26716,38587,38588,12905,38589,38590,38591,
+26705,38592,38593,15469,38594,38595,16194,26701,22137,38596,16760,12913,38597,
+38598,38599,38600,38601,38602,38603,38604,26719,38605,19009,26713,38606,38607,
+38608,38609,21796,38610,12650,21819,26702,26704,13872,26707,38611,26717,16440,
+38612,19063,38613,19240,38614,38615,18012,16501,38616,38617,38618,38619,38620,
+26729,38621,38622,38623,20515,38624,38625,38626,38627,38628,38629,38630,26738,
+22122,38631,38632,38633,38634,38635,38636,38637,26720,26721,38638,38639,38640,
+20857,14923,14457,38641,38642,14449,21588,26735,38643,26734,26732,14704,19538,
+26726,20006,16242,38644,12344,26737,26736,38645,22336,38646,26724,38647,19753,
+18723,38648,15160,15707,26730,38649,38650,38651,38652,38653,38654,38720,38721,
+38722,38723,26722,26723,26725,13621,26727,18245,26731,26733,15664,22318,38724,
+26744,38725,38726,38727,38728,38729,38730,38731,38732,26741,38733,19760,26742,
+38734,38735,38736,38737,38738,38739,38740,38741,38742,16698,38743,26728,38744,
+17207,12400,38745,38746,38747,38748,38749,38750,38751,38752,26740,38753,38754,
+38755,26743,38756,38757,38758,14627,38759,38760,38761,38762,38763,38764,38765,
+38766,38767,38768,18770,38769,38770,38771,17230,20064,16486,38772,38773,38774,
+38775,19315,38776,19549,20533,38777,38778,19041,38779,26739,38780,38781,38782,
+38784,38785,38786,38787,38788,38789,38790,15468,38791,26745,38792,38793,38794,
+38795,38796,38797,17246,38798,18021,38799,14711,38800,38801,38802,38803,12404,
+38804,38805,22360,38806,38807,15404,38808,17775,38809,38810,38811,38812,38813,
+19524,38814,38815,26918,38816,38817,38818,38819,38820,38821,38822,38823,38824,
+38825,18733,38826,26914,16482,38827,38828,38829,16195,38830,38831,38832,26750,
+14679,38833,26747,38834,38835,38836,38837,26916,38838,38839,38840,21070,38841,
+38842,38843,38844,38845,26915,38846,22066,22325,38847,26919,38848,15671,38849,
+38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,26748,26749,
+38861,38862,38863,26913,38864,38865,38866,38867,38868,38869,38870,38871,19798,
+38872,38873,21036,38874,38875,38876,26930,38877,38878,38879,38880,26921,38881,
+38882,38883,13354,38884,13371,38885,38886,26923,38887,38888,38889,38890,38891,
+38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,20520,
+38904,38905,26917,38906,38907,13182,38908,38909,26924,16483,38910,26922,38976,
+38977,26937,38978,38979,26936,38980,38981,38982,38983,26926,38984,38985,26746,
+38986,38987,26920,38988,38989,38990,38991,38992,16172,26929,26938,38993,38994,
+16933,38995,38996,38997,26927,38998,14405,38999,26925,39000,21340,26932,26933,
+26935,39001,39002,39003,26951,39004,39005,39006,39007,39008,39009,16454,26949,
+39010,39011,26928,39012,39013,26939,12401,39014,39015,39016,39017,39018,39019,
+39020,39021,39022,39023,26940,21797,39024,39025,26942,39026,26943,39027,39028,
+39029,26945,39030,39031,16753,39032,39033,18486,39034,39035,39036,26941,39037,
+39038,39040,39041,39042,26946,39043,39044,39045,39046,39047,39048,39049,39050,
+26947,39051,26931,39052,26934,39053,15153,39054,39055,39056,26944,39057,39058,
+39059,39060,39061,39062,15479,39063,39064,39065,26948,26950,39066,39067,39068,
+39069,39070,39071,39072,39073,39074,39075,39076,39077,26954,39078,39079,39080,
+39081,26958,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,12891,
+39092,26952,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,14126,
+39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,26955,
+26956,39115,39116,39117,39118,39119,39120,21825,39121,17443,39122,39123,39124,
+39125,39126,39127,26968,39128,14945,39129,39130,39131,39132,26953,39133,21283,
+39134,39135,39136,26964,39137,39138,39139,39140,39141,39142,39143,26967,26960,
+39144,39145,39146,39147,39148,26959,39149,39150,18241,39151,39152,39153,39154,
+39155,39156,39157,39158,26962,39159,39160,39161,39162,39163,39164,39165,26969,
+13128,39166,26963,39232,39233,39234,39235,39236,20336,39237,39238,39239,26957,
+39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,13175,39251,
+39252,39253,39254,39255,39256,39257,26966,39258,39259,26970,39260,39261,39262,
+19508,39263,39264,39265,20269,39266,39267,39268,39269,39270,39271,39272,39273,
+39274,26965,39275,26972,26971,39276,39277,39278,39279,39280,26974,39281,39282,
+39283,39284,39285,39286,39287,39288,26961,39289,39290,39291,39292,39293,39294,
+39296,39297,26973,39298,26975,17226,39299,39300,39301,39302,39303,39304,39305,
+39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,
+39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,
+39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,
+39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,
+39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,
+39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,
+39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,
+39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,
+39410,39411,39412,39413,18231,13390,15158,20544,27683,39414,39415,17719,39416,
+39417,39418,39419,39420,39421,39422,39488,39489,39490,21371,39491,39492,39493,
+39494,27684,39495,27685,18011,39496,39497,39498,16238,39499,39500,39501,39502,
+27686,39503,39504,27687,20522,39505,18232,39506,39507,14440,39508,39509,39510,
+39511,39512,39513,39514,39515,39516,39517,39518,39519,27688,39520,39521,39522,
+39523,39524,39525,39526,39527,22073,21885,13387,12861,20068,18023,39528,39529,
+19809,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,
+39542,39543,13429,39544,19264,15455,39545,39546,39547,39548,26978,26979,20842,
+26981,39549,13433,26980,39550,20787,19042,12880,39552,26984,39553,39554,39555,
+39556,26982,26983,39557,39558,22067,39559,39560,39561,26985,26986,39562,39563,
+39564,39565,39566,26987,39567,39568,39569,39570,39571,39572,39573,39574,26988,
+39575,39576,39577,39578,39579,39580,39581,39582,27695,17721,13902,39583,21107,
+39584,39585,39586,39587,39588,39589,39590,13678,39591,15193,27697,39592,39593,
+21091,39594,39595,39596,39597,39598,20067,39599,17464,39600,17215,39601,39602,
+13886,22585,12616,12623,12625,17790,39603,12624,39604,17195,39605,39606,39607,
+39608,39609,21809,39610,39611,39612,39613,39614,39615,39616,39617,27428,14913,
+39618,39619,39620,19514,39621,39622,39623,27429,39624,27431,39625,39626,39627,
+27432,39628,39629,39630,27430,39631,39632,39633,39634,39635,39636,39637,27433,
+27435,27434,39638,39639,39640,39641,39642,27436,39643,19023,22581,17265,39644,
+17189,18040,27437,17482,39645,27438,27439,27440,14165,39646,39647,39648,14202,
+39649,27441,18274,39650,27443,39651,14884,20853,12337,27442,27444,39652,39653,
+39654,13610,16968,18280,39655,27445,39656,19246,25439,39657,39658,21312,39659,
+39660,39661,39662,22875,39663,39664,19745,22061,18291,39665,39666,39667,22880,
+15203,39668,14906,25442,39669,39670,39671,39672,39673,20267,39674,39675,39676,
+25440,18759,39677,14905,39678,39744,39745,20788,25441,18538,14639,15661,13144,
+20059,39746,39747,19520,39748,39749,39750,25448,25449,19828,39751,39752,39753,
+39754,39755,19501,39756,15411,39757,25450,39758,25451,39759,39760,20570,39761,
+39762,39763,18043,14170,39764,39765,18271,21066,20054,39766,25444,25452,39767,
+18802,13121,39768,39769,25447,39770,39771,18019,25445,39772,39773,27955,25446,
+39774,39775,39776,39777,18739,39778,17766,39779,39780,39781,14645,39782,17211,
+39783,25443,17725,16676,16985,12887,39784,25453,15142,17453,39785,25456,15962,
+39786,39787,25467,25461,14931,39788,39789,39790,39791,14160,21325,39792,22094,
+21843,14657,21812,20824,39793,39794,39795,39796,20537,18294,39797,39798,39799,
+18474,12852,39800,17242,39801,39802,39803,25454,39804,39805,25468,25455,14120,
+25463,25460,39806,39808,39809,14138,39810,39811,17698,39812,25462,17757,12840,
+18044,39813,17504,39814,39815,22306,39816,16481,25465,39817,39818,25466,25469,
+19497,25459,39819,21310,39820,12611,27956,25457,25458,39821,25464,20538,17987,
+21619,25470,39822,39823,15712,39824,39825,25639,39826,39827,25638,39828,39829,
+39830,20851,25635,39831,25641,39832,39833,39834,18551,39835,39836,39837,39838,
+20276,39839,25640,25646,16997,39840,39841,13876,39842,39843,39844,39845,39846,
+39847,15730,39848,25634,39849,39850,14953,25642,39851,39852,25644,39853,39854,
+13949,22110,25650,39855,25645,39856,39857,39858,25633,39859,15214,19805,18210,
+17737,39860,39861,16759,39862,25636,39863,18227,15660,15677,25637,39864,22343,
+12898,39865,25643,15427,25647,39866,15211,25648,17704,25649,39867,39868,39869,
+39870,21859,16163,39871,25658,39872,25655,39873,25659,39874,39875,25661,39876,
+39877,18006,39878,39879,14918,16459,39880,39881,39882,14369,25652,39883,39884,
+39885,39886,21537,39887,39888,14883,15742,39889,39890,39891,25660,39892,39893,
+39894,39895,39896,19775,39897,39898,17529,39899,39900,20347,18790,39901,39902,
+21311,39903,20305,39904,39905,25651,39906,25656,25657,19561,39907,39908,39909,
+39910,39911,19534,39912,16468,25653,16688,25654,20048,39913,15169,13651,39914,
+18547,15655,21831,18732,14370,25674,39915,39916,25676,20804,39917,39918,21050,
+39919,39920,14893,39921,39922,14932,39923,39924,39925,39926,39927,39928,25667,
+13677,39929,39930,39931,22349,25664,20349,25663,39932,39933,39934,16732,19530,
+40000,40001,40002,40003,19047,40004,40005,40006,40007,17495,40008,19540,25672,
+40009,40010,40011,25671,25665,40012,25668,13613,40013,40014,21337,40015,25670,
+40016,40017,40018,40019,21113,13411,40020,15156,40021,40022,18798,40023,13374,
+40024,40025,40026,15212,40027,20813,40028,19565,27957,40029,40030,40031,40032,
+40033,40034,40035,40036,18277,40037,40038,40039,40040,21544,40041,25675,22357,
+25666,40042,15653,25669,40043,40044,21350,40045,25673,18808,40046,40047,25662,
+40048,40049,21349,40050,40051,18302,13897,40052,21628,12851,25687,40053,40054,
+40055,20034,40056,25677,40057,20028,40058,14427,40059,40060,25686,40061,16202,
+40062,40064,40065,21326,40066,17260,40067,40068,40069,40070,40071,40072,40073,
+40074,17736,25688,40075,40076,40077,40078,40079,40080,40081,40082,19780,25679,
+40083,40084,40085,40086,25684,25685,40087,14974,40088,20326,40089,40090,21823,
+40091,40092,40093,25682,40094,40095,40096,40097,40098,40099,40100,40101,40102,
+40103,40104,25680,40105,40106,25678,40107,40108,40109,40110,40111,40112,40113,
+40114,40115,40116,40117,40118,40119,40120,40121,19813,18986,40122,40123,40124,
+16419,40125,15654,25683,40126,40127,14408,40128,40129,40130,40131,40132,25703,
+21556,40133,40134,40135,40136,40137,40138,40139,25691,40140,40141,40142,16751,
+40143,40144,25705,40145,40146,21095,40147,40148,25695,40149,25696,40150,40151,
+20266,40152,40153,40154,40155,19293,40156,25690,25681,40157,25701,40158,18524,
+25699,40159,40160,17511,25698,40161,25697,40162,40163,40164,13180,25704,40165,
+40166,40167,40168,13665,40169,40170,40171,22348,40172,40173,40174,25702,40175,
+15148,40176,22354,19535,27512,40177,25700,40178,40179,14710,40180,40181,40182,
+22093,25689,25692,17018,25694,40183,16971,16452,16976,40184,12661,19506,40185,
+40186,40187,40188,40189,40190,40256,40257,40258,40259,13646,40260,40261,40262,
+40263,25711,40264,40265,40266,40267,40268,40269,40270,40271,17967,40272,40273,
+40274,18017,40275,40276,25717,40277,40278,40279,40280,40281,16937,40282,40283,
+40284,16492,20829,25710,40285,40286,40287,40288,40289,40290,40291,40292,40293,
+40294,17454,40295,40296,40297,25709,40298,40299,40300,40301,25718,25716,17022,
+40302,25693,40303,25712,40304,19070,40305,21828,40306,40307,25713,40308,40309,
+40310,40311,40312,40313,40314,20858,40315,40316,40317,40318,40320,40321,40322,
+25707,25708,40323,40324,40325,25714,40326,20011,40327,40328,40329,40330,40331,
+40332,40333,40334,40335,40336,17739,40337,40338,40339,18225,40340,16954,40341,
+40342,40343,25706,40344,40345,40346,16714,40347,40348,40349,40350,40351,40352,
+19510,13105,40353,40354,40355,25723,40356,25715,40357,40358,40359,25722,40360,
+25725,40361,25724,40362,40363,40364,40365,40366,40367,40368,13134,40369,40370,
+40371,13114,25719,40372,40373,25721,25720,17772,40374,40375,40376,40377,40378,
+40379,40380,40381,40382,40383,40384,40385,40386,16445,40387,40388,40389,40390,
+21608,40391,40392,40393,40394,40395,25890,40396,40397,40398,40399,40400,40401,
+40402,40403,40404,40405,40406,12356,40407,40408,25892,40409,40410,25891,40411,
+40412,40413,40414,40415,40416,15396,40417,25893,40418,40419,40420,40421,40422,
+40423,25889,40424,40425,40426,40427,40428,40429,40430,25726,12660,40431,40432,
+40433,40434,40435,40436,40437,40438,40439,40440,40441,25896,40442,25897,25894,
+40443,40444,40445,40446,40512,40513,40514,40515,40516,40517,40518,40519,25895,
+25898,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,
+40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,
+40545,40546,40547,40548,40549,40550,40551,40552,18009,40553,40554,40555,40556,
+40557,40558,40559,40560,25899,25901,40561,40562,40563,40564,40565,40566,40567,
+25900,40568,40569,40570,40571,40572,40573,40574,40576,40577,40578,40579,40580,
+40581,40582,40583,40584,40585,25903,40586,40587,40588,25902,40589,40590,40591,
+40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,
+40605,40606,14688,40607,40608,25904,40609,40610,40611,40612,40613,40614,40615,
+40616,40617,40618,40619,40620,40621,40622,25905,40623,40624,40625,40626,40627,
+40628,40629,40630,40631,40632,40633,40634,15216,27745,17264,40635,13638,15186,
+40636,40637,40638,40639,16745,21614,40640,15940,40641,40642,40643,22342,40644,
+21590,12883,27710,40645,40646,40647,40648,27201,40649,40650,40651,16943,13366,
+40652,40653,40654,20823,40655,40656,40657,13108,40658,18482,16187,27712,40659,
+40660,22091,40661,40662,27711,27713,40663,40664,40665,40666,40667,40668,40669,
+40670,40671,40672,40673,40674,40675,27717,15974,19519,17754,15932,40676,27718,
+40677,12670,40678,40679,40680,27716,21800,13667,40681,27714,16694,13155,40682,
+40683,27715,19256,16451,19582,40684,40685,40686,40687,16722,40688,27720,40689,
+40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,14950,
+16467,40702,22130,40768,40769,40770,20812,40771,40772,40773,40774,16190,40775,
+14131,18773,27719,15202,40776,19532,15741,18504,40777,20265,40778,40779,40780,
+40781,40782,40783,40784,19817,40785,17771,40786,40787,40788,14185,40789,40790,
+40791,40792,40793,40794,40795,40796,40797,40798,40799,20809,14904,40800,40801,
+40802,40803,40804,27721,40805,40806,27722,40807,15168,27723,40808,27746,12602,
+14169,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,15673,
+40820,40821,40822,40823,40824,40825,40826,40827,27724,20838,27725,40828,40829,
+40830,40832,18491,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,
+40843,40844,40845,40846,27729,40847,40848,40849,40850,27731,40851,15181,40852,
+15461,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,
+40865,27727,40866,18743,40867,40868,40869,40870,40871,17210,40872,27747,21845,
+27728,40873,40874,40875,40876,40877,22131,40878,40879,40880,27730,27726,40881,
+40882,40883,40884,27732,40885,27733,40886,40887,18751,40888,40889,40890,40891,
+40892,40893,20264,40894,40895,40896,40897,40898,20572,40899,40900,40901,40902,
+20780,40903,40904,40905,40906,18523,40907,40908,40909,27734,20085,40910,40911,
+40912,40913,40914,19052,27738,40915,40916,40917,40918,40919,40920,40921,27737,
+40922,40923,40924,12350,40925,40926,40927,40928,40929,40930,27735,40931,27736,
+40932,40933,40934,27748,40935,40936,40937,40938,40939,40940,40941,40942,40943,
+18492,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,16711,40954,
+40955,40956,40957,40958,27740,20832,41024,41025,41026,41027,41028,41029,41030,
+41031,41032,41033,27739,41034,41035,41036,41037,21615,41038,27741,41039,41040,
+41041,41042,41043,41044,23366,41045,41046,41047,41048,41049,41050,41051,41052,
+41053,41054,27742,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,
+41065,41066,12588,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,
+41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41088,41089,27743,
+41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,27744,41100,22310,
+41101,17728,41102,41103,41104,27452,12334,41105,41106,41107,15988,14392,21039,
+12374,13689,41108,22579,41109,19244,41110,25437,41111,41112,41113,41114,41115,
+41116,41117,17964,12390,41118,41119,41120,17734,27449,41121,41122,41123,41124,
+27450,41125,41126,41127,27451,41128,41129,20800,41130,17699,41131,27250,41132,
+17458,41133,17461,16462,41134,41135,41136,27251,17473,41137,20079,41138,41139,
+41140,41141,27248,27252,41142,41143,18812,41144,41145,18211,41146,41147,41148,
+19544,20094,41149,41150,41151,27253,27254,20268,16487,41152,41153,27255,41154,
+41155,41156,41157,41158,13887,27256,41159,27257,41160,27258,41161,41162,27259,
+41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,27249,
+41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,18478,
+24939,41187,14136,24940,41188,41189,41190,24941,41191,22324,24942,24943,21324,
+41192,41193,41194,41195,41196,41197,41198,24945,16241,24944,13650,41199,41200,
+41201,12599,41202,41203,41204,41205,24947,24946,41206,14972,41207,24948,41208,
+41209,41210,41211,14647,41212,15953,41213,41214,43584,43585,17532,43586,14941,
+15686,43587,43588,43589,43590,43591,43592,24949,24951,43593,43594,13888,20289,
+18984,24950,21880,21372,24952,24956,24953,43595,43596,24954,16490,43597,24958,
+25121,16455,43598,43599,43600,43601,24955,43602,24957,43603,43604,43605,43606,
+43607,43608,25125,43609,43610,43611,16724,43612,43613,43614,43615,25123,43616,
+25128,12926,25122,43617,43618,43619,17229,12866,25127,25126,43620,43621,25124,
+25129,43622,43623,25131,43624,43625,43626,20553,22125,17192,25132,43627,20311,
+43628,43629,25134,43630,43631,14959,43632,43633,26976,25133,25130,43634,43635,
+43636,43637,15147,21555,43638,43639,43640,43641,43642,43643,43644,43645,43646,
+43648,43649,43650,43651,25136,43652,43653,25135,43654,26977,43655,43656,43657,
+43658,25137,43659,43660,43661,43662,43663,43664,43665,43666,25138,43667,43668,
+43669,43670,43671,43672,43673,43674,43675,43676,43677,25139,19489,43678,25140,
+43679,43680,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,
+43851,25141,43852,43853,43854,43855,43856,20606,43857,43858,16970,43859,21361,
+43860,19829,43861,43862,26464,43863,43864,26465,43865,43866,43867,43868,15937,
+43869,43870,43871,43872,17002,43873,43874,43875,26468,43876,43877,26467,43878,
+43879,43880,43881,43882,43883,19814,43884,17205,43885,43886,26466,15159,20310,
+43887,16737,26473,43888,43889,43890,26472,43891,43892,26484,12835,43893,43894,
+43895,43896,26474,43897,26470,43898,43899,43900,43901,43902,26476,26475,18746,
+43904,43905,21860,43906,26469,14121,26471,43907,43908,43909,43910,43911,43912,
+43913,26478,43914,43915,43916,43917,26483,43918,22121,43919,43920,43921,43922,
+26477,43923,26482,43924,26481,43925,43926,43927,12384,43928,43929,43930,43931,
+26485,43932,43933,43934,43935,43936,44096,44097,44098,44099,44100,44101,44102,
+44103,44104,44105,44106,18290,44107,16453,16493,44108,44109,16752,26480,44110,
+44111,44112,44113,26486,19318,44114,44115,44116,44117,44118,44119,44120,44121,
+44122,26658,26657,44123,44124,44125,44126,44127,44128,22337,44129,44130,26490,
+26489,44131,26491,44132,26487,44133,26494,44134,26493,44135,26492,44136,44137,
+16725,18265,17789,17731,44138,44139,44140,44141,44142,18285,44143,44144,44145,
+44146,26659,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,
+44158,44160,44161,44162,44163,44164,44165,44166,26662,44167,26661,44168,26663,
+14967,26488,26660,44169,18544,18730,44170,44171,44172,44173,44174,44175,44176,
+44177,44178,44179,44180,44181,44182,26665,44183,44184,14693,44185,44186,44187,
+44188,44189,20862,26664,44190,44191,44192,44352,44353,44354,26666,44355,26669,
+26670,44356,16679,44357,44358,44359,26671,44360,44361,44362,26672,44363,44364,
+26668,44365,26676,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,
+44376,26667,44377,26673,44378,44379,44380,44381,44382,44383,44384,44385,26677,
+26674,26675,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,
+44397,44398,44399,44400,44401,26679,44402,44403,44404,44405,44406,44407,44408,
+44409,44410,44411,44412,44413,44414,44416,44417,44418,44419,44420,44421,44422,
+44423,44424,44425,26678,44426,44427,44428,44429,44430,44431,44432,44433,44434,
+14671,44435,28716,44436,28717,44437,17968,12394,18495,44438,19807,44439,44440,
+44441,44442,44443,44444,44445,20045,27185,44446,44447,44448,44608,27186,44609,
+17983,13385,44610,44611,44612,44613,44614,44615,44616,27187,44617,44618,44619,
+44620,21863,44621,44622,44623,44624,44625,44626,44627,44628,23929,44629,27188,
+44630,27189,44631,27190,44632,44633,44634,44635,14410,24368,18805,44636,19568,
+44637,44638,18810,44639,44640,44641,44642,44643,18811,44644,44645,21315,19238,
+44646,14374,28718,12610,44647,25912,19567,21321,15447,18794,44648,13671,44649,
+17488,13673,44650,28206,15149,44651,44652,26462,44653,28207,44654,44655,44656,
+44657,13097,44658,44659,28210,44660,44661,28209,15719,44662,28208,20023,44663,
+44664,44665,44666,17743,44667,44668,44669,44670,16756,23374,28211,20595,44672,
+44673,44674,44675,44676,44677,44678,44679,16980,18024,44680,44681,44682,14124,
+44683,44684,44685,44686,44687,44688,44689,28212,44690,13163,44691,44692,44693,
+15227,28213,44694,44695,44696,44697,44698,26460,44699,44700,44701,28214,44702,
+44703,15662,44704,44864,44865,44866,29026,44867,44868,44869,19048,44870,21065,
+28762,44871,28763,44872,28764,16710,44873,14445,15950,44874,44875,28766,44876,
+17713,28765,20849,44877,28768,12364,15722,44878,44879,44880,44881,44882,21087,
+28767,44883,13359,14184,28774,28773,17955,28769,28770,13379,44884,44885,28771,
+21870,44886,44887,19547,15954,15410,44888,44889,44890,28776,28775,28772,12833,
+44891,22050,21304,15927,18476,44892,44893,28778,44894,44895,44896,44897,20855,
+44898,22092,14939,28777,44899,13883,44900,44901,19764,44902,44903,17958,44904,
+44905,44906,16673,28779,28782,44907,28781,28784,28780,44908,15166,28783,44909,
+44910,44911,44912,19509,28786,44913,44914,13141,44915,44916,44917,44918,12628,
+44919,44920,28787,44921,44922,28788,28790,13409,44923,28785,44924,28791,44925,
+44926,44928,44929,28794,44930,28792,44931,44932,44933,28789,44934,44935,44936,
+44937,28797,44938,28793,28796,28798,44939,28961,44940,44941,44942,20033,28964,
+44943,28963,44944,16758,28795,19037,44945,44946,13425,12657,19505,44947,28966,
+44948,44949,28967,44950,44951,28972,21838,28969,44952,44953,18483,44954,44955,
+44956,28962,44957,28971,28968,28965,44958,44959,28970,44960,45120,45121,45122,
+45123,45124,45125,45126,12329,28973,45127,45128,45129,45130,45131,45132,28975,
+45133,28977,45134,45135,45136,45137,45138,28976,45139,28974,45140,45141,45142,
+45143,20770,45144,45145,45146,45147,45148,45149,45150,28978,45151,45152,45153,
+28979,45154,45155,45156,45157,45158,45159,45160,45161,14703,45162,45163,13639,
+45164,12375,12377,45165,45166,45167,21613,45168,13636,45169,15700,15178,28711,
+45170,45171,14430,45172,45173,28712,45174,45175,12328,45176,28713,45177,45178,
+19822,45179,45180,28714,45181,45182,45184,45185,45186,45187,45188,45189,45190,
+45191,28715,45192,45193,45194,45195,45196,45197,45198,45199,45200,17956,45201,
+45202,22117,29028,45203,29029,45204,45205,45206,45207,45208,45209,45210,45211,
+45212,45213,17267,45214,45215,21339,45216,45376,22097,17768,45377,21295,45378,
+21094,45379,45380,28225,12347,21813,20814,15456,14928,45381,16248,45382,14407,
+13633,17740,45383,45384,18978,45385,45386,45387,17227,45388,45389,45390,45391,
+45392,28226,45393,45394,45395,45396,45397,45398,45399,45400,17471,13858,45401,
+28012,17188,45402,22065,45403,45404,45405,20320,28015,45406,45407,17742,45408,
+13916,45409,45410,18977,45411,45412,28013,45413,45414,28016,28017,17212,45415,
+16180,45416,28014,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,
+45427,28020,28018,45428,45429,45430,45431,21862,17247,45432,28019,45433,45434,
+45435,28022,45436,21795,20771,45437,45438,45440,28021,45441,17232,45442,45443,
+45444,45445,45446,28023,16244,15980,28024,45447,19575,45448,20827,45449,45450,
+45451,22341,21878,45452,28028,45453,45454,45455,28027,45456,45457,45458,45459,
+45460,45461,45462,45463,28025,28026,45464,45465,45466,45467,45468,45469,45470,
+45471,28029,15910,45472,45632,45633,45634,45635,19247,28193,13885,45636,28194,
+17472,45637,28030,45638,45639,15710,12871,45640,45641,45642,45643,45644,45645,
+45646,45647,45648,45649,45650,45651,13891,45652,45653,45654,28197,22586,28195,
+28198,45655,45656,45657,17257,13170,45658,45659,45660,45661,45662,45663,28199,
+28196,20281,45664,45665,28200,17015,45666,45667,45668,45669,45670,45671,45672,
+45673,45674,45675,45676,45677,28201,28202,45678,24107,45679,45680,17971,45681,
+18246,45682,22133,13641,45683,19250,45684,45685,45686,28203,45687,45688,19755,
+45689,28204,45690,45691,45692,45693,45694,21808,45696,28205,45697,30276,45698,
+45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,23367,
+45711,45712,45713,45714,45715,45716,45717,45718,45719,13347,45720,45721,45722,
+17196,29030,45723,45724,45725,45726,45727,19000,21075,45728,22058,45888,28530,
+45889,15960,45890,15683,28531,13900,12331,45891,45892,45893,45894,18991,45895,
+45896,27958,45897,27959,45898,45899,45900,45901,20089,14127,16243,27960,17003,
+18736,45902,45903,45904,45905,45906,45907,27961,45908,45909,18038,16179,45910,
+45911,45912,27964,17784,45913,20816,45914,22313,27962,27963,45915,20834,45916,
+27967,27968,45917,27972,45918,45919,45920,27976,45921,27974,27982,21864,45922,
+27977,45923,45924,27975,27966,45925,45926,17769,45927,45928,45929,17990,45930,
+45931,18793,21586,27969,27970,27971,27973,45932,16505,45933,13345,45934,45935,
+45936,45937,14696,45938,27984,45939,45940,45941,45942,27985,45943,27978,45944,
+27983,45945,20088,45946,45947,19254,27980,27981,45948,45949,45950,45952,45953,
+20341,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,
+27986,16754,21298,27979,18487,45966,45967,45968,45969,45970,45971,45972,45973,
+15471,45974,45975,45976,45977,17776,45978,45979,45980,45981,45982,45983,45984,
+46144,46145,46146,27990,46147,13679,46148,46149,16949,12333,19305,46150,46151,
+12590,46152,27988,46153,46154,46155,19819,13666,46156,27989,27987,27991,46157,
+46158,13690,46159,27992,46160,27993,46161,27996,46162,12620,46163,46164,46165,
+46166,46167,46168,46169,46170,17782,15470,27994,19516,12906,46171,46172,46173,
+46174,27995,46175,46176,46177,46178,17515,46179,46180,13381,46181,46182,46183,
+12405,46184,46185,46186,27999,16474,13416,46187,46188,46189,46190,17741,46191,
+46192,46193,27997,16196,46194,46195,46196,27998,46197,46198,46199,46200,46201,
+46202,46203,46204,46205,46206,46208,46209,46210,46211,17445,46212,46213,46214,
+28000,46215,46216,46217,46218,46219,28001,46220,28003,46221,46222,16727,46223,
+46224,15175,46225,46226,46227,46228,46229,46230,15672,46231,46232,46233,28002,
+46234,46235,46236,46237,46238,46239,46240,46400,46401,46402,46403,46404,46405,
+28004,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,28006,46416,
+46417,46418,46419,46420,28005,46421,46422,46423,46424,46425,46426,46427,46428,
+46429,46430,46431,46432,46433,46434,46435,28007,46436,46437,46438,46439,46440,
+19006,27754,16497,46441,18791,46442,27755,18030,46443,46444,46445,46446,27756,
+46447,18029,27757,46448,46449,46450,46451,46452,46453,46454,46455,46456,27760,
+46457,46458,22374,27763,46459,46460,27761,27758,27759,22307,18801,19310,27764,
+46461,27762,46462,46464,20329,46465,27766,17969,46466,46467,46468,46469,15424,
+46470,27765,46471,46472,46473,46474,46475,46476,46477,13627,15222,46478,27767,
+46479,46480,46481,46482,46483,22903,15739,46484,46485,16955,27768,46486,46487,
+46488,46489,27769,46490,46491,46492,46493,14371,46494,46495,46496,46656,46657,
+46658,46659,46660,46661,46662,27770,46663,46664,46665,46666,46667,46668,46669,
+46670,46671,46672,46673,46674,27771,46675,46676,46677,46678,46679,46680,46681,
+46682,46683,46684,46685,27772,46686,46687,46688,46689,46690,21357,22574,16491,
+46691,18269,14924,46692,20579,19261,46693,19770,46694,46695,14417,46696,46697,
+12668,46698,18287,46699,22102,46700,46701,46702,16198,17259,46703,46704,28533,
+46705,46706,17240,46707,46708,46709,46710,46711,46712,22370,46713,46714,46715,
+28535,13139,46716,18264,20845,46717,22088,46718,28536,46720,28534,46721,15229,
+13126,46722,46723,46724,46725,46726,46727,46728,15701,46729,46730,21062,46731,
+15200,46732,46733,20257,46734,28540,28539,46735,46736,28537,46737,46738,46739,
+46740,13132,46741,18772,19248,46742,46743,46744,46745,46746,28542,46747,46748,
+12382,46749,46750,22089,46751,46752,46912,28541,46913,13165,46914,46915,30293,
+46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,
+46929,46930,20040,46931,46932,46933,28706,46934,28705,46935,13630,15450,15228,
+46936,14437,46937,46938,46939,46940,46941,46942,17474,46943,46944,46945,46946,
+46947,46948,46949,46950,46951,46952,28707,46953,46954,46955,46956,46957,19307,
+46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,
+46971,46972,46973,46974,46976,46977,46978,46979,46980,46981,46982,28710,46983,
+46984,46985,20776,46986,15935,18286,28982,28983,16213,46987,46988,46989,46990,
+13353,28984,19771,46991,18260,21805,46992,28985,46993,28986,46994,46995,46996,
+46997,18255,46998,46999,47000,21028,22095,47001,47002,28987,15697,13360,15933,
+47003,47004,47005,13404,20049,47006,16223,28989,47007,47008,47168,47169,16250,
+28988,47170,28991,47171,47172,47173,28990,28992,47174,47175,47176,47177,47178,
+28993,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,16766,
+47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,16674,47201,
+47202,47203,47204,47205,47206,47207,47208,47209,47210,19066,47211,47212,21822,
+47213,47214,47215,47216,15930,15929,21826,47217,47218,16162,47219,19759,28981,
+47220,47221,47222,47223,47224,47225,15711,47226,13899,47227,47228,47229,47230,
+47232,47233,47234,47235,47236,22129,29507,47237,47238,29508,47239,14413,47240,
+47241,47242,29510,29511,47243,12362,47244,29509,47245,29513,19313,47246,47247,
+47248,29515,47249,20518,47250,47251,12618,29512,47252,47253,47254,29519,47255,
+13649,47256,47257,29527,47258,29522,47259,47260,47261,29524,29523,14203,47262,
+12607,47263,29518,29514,13658,47264,29520,47424,47425,29521,47426,29525,47427,
+47428,47429,47430,29517,47431,15459,47432,16765,47433,29526,47434,47435,47436,
+47437,47438,47439,29530,47440,29516,47441,13640,47442,15726,29532,47443,47444,
+14116,16240,22142,19762,47445,13424,47446,12895,47447,29528,47448,29529,18744,
+47449,29533,47450,47451,29534,47452,29537,47453,47454,47455,47456,47457,47458,
+47459,47460,47461,47462,47463,29535,47464,47465,29539,29538,47466,47467,29531,
+47468,16234,47469,13167,47470,29536,47471,47472,18217,47473,15474,47474,47475,
+47476,47477,29547,47478,47479,47480,47481,47482,47483,47484,14655,47485,47486,
+29540,47488,47489,47490,12845,15230,47491,19299,47492,47493,47494,47495,29549,
+29545,47496,47497,47498,14684,29550,47499,47500,47501,29541,29542,29546,16993,
+29548,29551,29544,15485,47502,47503,47504,20324,47505,47506,29552,47507,47508,
+47509,29543,47510,47511,47512,47513,47514,47515,47516,47517,29554,47518,47519,
+47520,47680,22317,17962,47681,47682,47683,47684,29555,47685,47686,47687,47688,
+29553,47689,16936,47690,47691,47692,47693,47694,14429,29557,47695,47696,29556,
+47697,47698,47699,13403,47700,47701,47702,29558,29559,47703,47704,47705,29560,
+47706,47707,47708,16442,47709,47710,16489,47711,47712,47713,47714,47715,17777,
+47716,47717,47718,47719,29563,47720,29562,47721,47722,47723,47724,47725,47726,
+47727,47728,13400,47729,47730,47731,29566,29561,47732,47733,29564,47734,47735,
+47736,47737,47738,47739,29565,47740,47741,47742,47744,47745,47746,47747,47748,
+29729,47749,47750,47751,47752,47753,47754,29731,15177,47755,47756,29730,47757,
+47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,29732,
+47770,47771,47772,47773,47774,47775,12862,29734,29733,47776,47936,47937,47938,
+47939,47940,47941,47942,47943,47944,47945,15406,47946,47947,47948,47949,47950,
+47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,
+47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,
+47977,47978,47979,47980,47981,47982,17239,22881,47983,47984,47985,47986,47987,
+47988,16480,29772,22353,47989,47990,47991,47992,47993,47994,47995,47996,47997,
+47998,48000,14171,48001,48002,48003,48004,48005,48006,48007,29774,16675,48008,
+48009,17993,48010,13398,21811,48011,48012,48013,29776,29775,29777,19290,48014,
+48015,29778,48016,21569,22112,48017,48018,48019,48020,14176,48021,48022,48023,
+16696,48024,48025,16699,29779,15916,48026,48027,48028,48029,48030,13410,48031,
+48032,29780,29781,15915,48192,48193,29782,48194,48195,48196,29787,48197,29783,
+29786,48198,14973,48199,29784,29785,48200,48201,48202,48203,48204,48205,48206,
+14434,19527,29788,48207,12890,48208,48209,17235,48210,48211,21603,16183,48212,
+48213,48214,48215,48216,48217,48218,29789,48219,48220,48221,48222,48223,48224,
+17716,48225,48226,48227,48228,48229,48230,48231,48232,29801,48233,48234,20277,
+48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,
+48248,20041,48249,48250,48251,48252,48253,48254,48256,48257,48258,48259,48260,
+48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,19288,48271,19319,
+48272,48273,48274,48275,15732,48276,48277,48278,22351,48279,48280,48281,16475,
+48282,48283,48284,48285,48286,48287,48288,48448,48449,48450,48451,48452,48453,
+48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,
+48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,
+48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,
+48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,20597,48503,48504,
+48505,48506,48507,48508,48509,48510,29802,48512,48513,48514,48515,48516,48517,
+48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,
+48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,
+48544,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,
+48716,29803,48717,48718,48719,48720,48721,48722,48723,29804,48724,48725,48726,
+48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,
+48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,
+48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,
+48766,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,
+48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,
+48793,48794,48795,48796,48797,48798,48799,48800,48960,48961,48962,48963,48964,
+48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,
+48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,
+48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,
+49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,
+49017,49018,49019,49020,49021,49022,49024,30563,49025,49026,49027,49028,49029,
+14129,49030,49031,49032,49033,49034,29805,49035,49036,49037,49038,49039,49040,
+49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,
+49054,49055,49056,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,
+49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,
+49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,
+22379,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,
+49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,29806,
+49276,49277,49278,26233,15936,26234,14956,26235,20299,26236,21564,15414,26237,
+26238,15437,18514,20019,26401,49280,13375,26402,18740,14425,17481,49281,22365,
+16986,14167,22077,20038,14148,49282,49283,17702,26403,20319,26404,26405,26406,
+16695,22377,18800,20280,22063,22101,26407,12397,26408,26409,18780,21103,15917,
+26410,12403,18526,15713,26411,18502,49284,26412,15206,14456,20772,26413,16999,
+15992,15690,19763,26414,26415,15982,20581,49285,19303,19536,15436,26416,15400,
+20599,26417,49286,20600,26418,26419,13378,26420,26421,18814,20012,17248,26423,
+12609,13169,49287,26424,26425,22363,21824,26426,16972,22330,26427,26428,26429,
+15466,17253,16450,26430,26431,15401,49288,26432,26433,26422,13904,26434,49289,
+26435,26436,15162,13662,16966,12640,26437,21557,26438,14399,26440,26439,14188,
+49290,26441,12920,26442,26443,26444,26445,26446,26447,26448,21287,19317,26449,
+26450,26451,26452,18761,26453,26454,26455,26456,26457,15689,26458,29502,49291,
+14423,49292,18481,49293,49294,49295,49296,49297,49298,49299,29503,49300,29504,
+29505,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,14686,19832,
+49311,49312,22632,14897,49472,16990,28215,49473,14115,49474,49475,49476,49477,
+28217,49478,28216,12373,49479,49480,49481,49482,49483,28219,21846,22383,49484,
+49485,49486,22083,49487,49488,28221,19056,49489,28220,49490,49491,49492,49493,
+28222,49494,49495,49496,49497,28224,49498,49499,28223,49500,49501,49502,49503,
+49504,49505,49506,49507,20850,49508,18236,49509,17216,49510,49511,49512,49513,
+49514,14433,49515,49516,49517,49518,49519,16743,49520,49521,29766,20575,29767,
+49522,20315,49523,49524,18490,49525,49526,29768,49527,49528,49529,49530,49531,
+49532,49533,29769,29770,49534,29771,49536,49537,49538,49539,49540,22906,14462,
+49541,49542,25969,21360,49543,29792,49544,20044,49545,49546,49547,13153,49548,
+49549,49550,49551,28980,49552,21102,49553,29793,49554,49555,49556,49557,49558,
+20328,29794,49559,49560,18252,49561,49562,49563,49564,49565,49566,13652,13412,
+29796,49567,49568,49728,29795,29797,49729,49730,29798,49731,49732,49733,49734,
+29799,49735,14898,12351,49736,29800,49737,49738,49739,49740,49741,49742,49743,
+14125,21101,49744,49745,49746,21035,16463,49747,16188,27427,21855,27208,49748,
+49749,49750,49751,29043,13944,19235,49752,49753,17485,49754,29031,49755,29032,
+14459,29033,14916,21573,12370,49756,49757,29034,49758,49759,49760,29035,49761,
+29036,49762,49763,29037,29038,29039,29041,29040,17749,49764,49765,49766,49767,
+49768,49769,29042,49770,13946,49771,29044,21038,24135,19274,49772,49773,13148,
+49774,13602,49775,14626,49776,49777,17524,29045,49778,49779,29046,49780,49781,
+49782,16708,16763,22064,29047,49783,49784,49785,49786,29048,49787,16682,49788,
+49789,49790,17976,49792,15963,49793,49794,49795,49796,49797,49798,49799,49800,
+49801,49802,49803,49804,49805,49806,29049,13391,49807,49808,49809,49810,49811,
+49812,29050,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,
+49824,49984,27954,27953,49985,49986,19296,21086,49987,19265,21848,49988,18530,
+49989,16479,15393,49990,49991,49992,49993,49994,49995,27457,49996,49997,20516,
+49998,22114,49999,13895,14424,27456,14414,50000,27455,13094,14665,22059,50001,
+14196,14154,50002,50003,50004,15463,14142,27462,50005,27463,12345,16207,50006,
+27461,21373,50007,27464,50008,50009,27465,50010,50011,14158,50012,27458,27460,
+18806,22103,21837,20530,27471,20024,27472,50013,13608,50014,50015,50016,50017,
+50018,12595,27474,19493,50019,50020,50021,50022,50023,50024,50025,17750,27475,
+50026,27473,17759,27470,18980,27477,12411,50027,50028,14970,50029,50030,22583,
+29027,50031,27466,27467,27468,27469,27478,26176,27481,50032,16232,21064,27479,
+27484,14444,27480,50033,15674,50034,20568,50035,12343,50036,27485,17500,50037,
+50038,50039,50040,22060,50041,50042,50043,13408,50044,50045,17014,15417,50046,
+50048,27482,27483,21600,18026,17492,27487,17703,22901,50049,12849,50050,27492,
+50051,15685,50052,50053,50054,27490,50055,50056,50057,50058,50059,50060,50061,
+50062,50063,50064,50065,50066,50067,27491,50068,50069,14380,50070,19793,27493,
+50071,50072,50073,27489,50074,16691,50075,50076,50077,50078,50079,17954,50080,
+50240,50241,50242,50243,50244,50245,19571,50246,27494,50247,16432,21048,27495,
+50248,50249,50250,14383,14381,50251,27496,18235,19827,50252,50253,50254,27498,
+27499,50255,50256,50257,50258,50259,27501,50260,50261,50262,50263,20552,50264,
+27506,50265,27502,50266,50267,50268,27505,18553,50269,20860,27500,50270,50271,
+27497,50272,50273,50274,50275,14393,20313,17509,27503,27504,19546,19784,12402,
+50276,27510,50277,50278,50279,50280,50281,27509,50282,12850,50283,50284,50285,
+50286,14432,50287,27511,50288,50289,50290,50291,50292,50293,12652,50294,50295,
+19525,17444,20261,50296,50297,50298,50299,50300,27513,50301,50302,27682,50304,
+17778,50305,27514,50306,50307,50308,50309,50310,50311,50312,50313,18757,50314,
+50315,50316,50317,50318,50319,25183,27518,50320,50321,50322,50323,19790,27681,
+12635,21303,50324,50325,21084,50326,50327,50328,27517,50329,27515,50330,50331,
+50332,50333,50334,50335,50336,50496,50497,50498,50499,50500,50501,50502,50503,
+50504,50505,50506,50507,50508,50509,50510,13116,50511,50512,50513,27184,50514,
+50515,22356,50516,29739,13172,50517,50518,50519,50520,50521,22081,22082,50522,
+50523,50524,50525,50526,50527,21865,15946,50528,29735,50529,21032,29736,29737,
+50530,29738,15947,21343,50531,50532,50533,50534,50535,18784,18785,50536,50537,
+29506,50538,19046,50539,19570,50540,50541,50542,50543,50544,50545,25142,19252,
+50546,20072,22107,50547,29741,29742,29743,50548,50549,50550,50551,29746,50552,
+14909,29747,12387,29744,50553,29745,15650,12885,50554,29750,29751,13926,12848,
+20303,29748,13356,50555,29749,50556,50557,29752,50558,50560,50561,50562,50563,
+29753,50564,50565,19751,50566,29754,50567,29755,50568,50569,50570,29756,50571,
+50572,50573,50574,50575,50576,50577,50578,19282,50579,29757,50580,50581,50582,
+50583,29758,50584,50585,50586,50587,50588,50589,50590,50591,29759,50592,50752,
+50753,50754,50755,29790,16700,15464,50756,18731,20830,25973,50757,50758,50759,
+50760,23603,21077,50761,50762,23604,12332,23605,50763,50764,15706,50765,23609,
+50766,50767,50768,22594,50769,23607,21363,50770,18774,23610,23606,50771,23611,
+17186,50772,50773,50774,50775,23612,23621,23613,50776,50777,20063,22053,50778,
+23631,50779,23629,50780,50781,23634,15718,16939,50782,23608,23627,23630,23614,
+14162,12357,23623,20542,23617,15144,50783,14140,23628,50784,50785,23622,23615,
+18267,50786,50787,50788,20799,23616,50789,50790,23626,50791,50792,23632,50793,
+50794,20013,23618,50795,23619,23624,23625,12884,23633,19285,50796,21559,23643,
+23647,19494,23654,50797,17255,23644,50798,50799,16193,23641,50800,12410,14646,
+23653,23635,50801,23620,23638,18548,16224,50802,50803,50804,50805,18747,50806,
+50807,50808,12605,50809,21282,50810,50811,23642,50812,50813,23637,50814,17979,
+50816,23646,50817,50818,50819,50820,50821,22338,17199,14134,18257,17193,23650,
+23640,23659,23636,50822,50823,23645,50824,15909,23639,50825,23648,50826,50827,
+23651,23652,50828,23672,50829,50830,23649,23842,23655,50831,50832,50833,50834,
+50835,50836,50837,50838,50839,50840,15467,13380,50841,50842,17187,12903,23674,
+50843,23666,50844,23663,50845,23676,23662,21104,12904,50846,18519,18531,23675,
+50847,23661,50848,51008,51009,23671,51010,51011,23669,51012,51013,15907,23668,
+51014,12893,51015,51016,51017,51018,51019,23667,15478,23656,15172,51020,16499,
+51021,51022,51023,51024,51025,15444,23657,23658,51026,23665,23670,23673,13620,
+51027,18521,15207,23678,23677,21291,23841,23843,23845,21105,23844,23846,23847,
+21033,51028,51029,51030,51031,51032,51033,51034,14921,23849,51035,51036,23862,
+23857,23860,51037,51038,51039,51040,51041,51042,51043,23856,17998,51044,51045,
+16498,51046,51047,51048,51049,18735,51050,51051,51052,23660,23854,51053,51054,
+51055,51056,23863,51057,51058,23664,23855,51059,23864,51060,23852,51061,51062,
+51063,51064,51065,51066,51067,23865,23859,23853,17450,51068,51069,51070,51072,
+23848,16435,16683,23850,23851,51073,23858,15217,23861,21288,23866,51074,23867,
+17191,51075,51076,23890,23868,51077,51078,51079,23889,51080,14653,51081,51082,
+15957,51083,15994,51084,51085,14922,51086,51087,51088,51089,23882,51090,23877,
+51091,23871,51092,51093,51094,12875,23875,51095,23883,12836,23893,51096,51097,
+51098,23870,51099,51100,51101,18000,23888,51102,51103,51104,51264,51265,23892,
+16738,14150,51266,51267,51268,51269,51270,23886,23887,51271,51272,51273,23876,
+51274,51275,51276,23869,51277,23885,19537,51278,23881,51279,51280,51281,51282,
+23874,17224,17980,20014,23884,51283,23880,51284,51285,51286,51287,51288,51289,
+23873,51290,51291,51292,23878,16988,51293,51294,51295,51296,51297,51298,21289,
+21290,23891,20340,18552,51299,51300,51301,51302,51303,51304,51305,51306,23910,
+51307,51308,51309,51310,51311,51312,23879,51313,51314,51315,23904,16996,51316,
+51317,51318,51319,51320,51321,51322,51323,23905,51324,51325,51326,51328,51329,
+51330,51331,51332,51333,51334,23895,51335,51336,51337,51338,51339,22136,51340,
+23897,23896,14448,23894,51341,51342,51343,51344,17999,51345,13869,51346,51347,
+51348,51349,51350,23906,51351,14969,21601,23911,51352,51353,51354,13392,51355,
+23898,51356,16251,23907,51357,23903,51358,23901,51359,51360,51520,51521,51522,
+51523,51524,13657,51525,51526,51527,51528,23899,23900,23902,51529,15663,23908,
+51530,23909,51531,51532,51533,51534,51535,51536,51537,51538,23925,51539,17225,
+51540,51541,19298,51542,51543,51544,51545,23922,51546,51547,51548,51549,51550,
+51551,51552,51553,51554,51555,51556,51557,51558,22625,51559,51560,18001,51561,
+23924,51562,51563,51564,21876,23923,23920,51565,51566,23916,51567,23919,51568,
+23912,51569,51570,20590,51571,51572,51573,51574,18520,23918,51575,51576,23913,
+51577,51578,23914,19314,51579,23917,51580,51581,12621,51582,51584,51585,51586,
+51587,51588,16438,51589,15419,23921,51590,51591,23927,51592,23926,23915,51593,
+51594,51595,51596,51597,17774,51598,51599,51600,23931,51601,51602,51603,51604,
+51605,51606,51607,51608,51609,51610,51611,24100,51612,51613,24099,51614,51615,
+51616,51776,51777,51778,51779,51780,51781,51782,51783,51784,23928,51785,51786,
+51787,51788,17263,51789,17019,51790,51791,51792,21857,51793,51794,20021,51795,
+51796,51797,51798,23933,51799,12876,51800,51801,51802,51803,51804,51805,51806,
+51807,51808,17512,19039,51809,51810,51811,51812,51813,51814,51815,51816,51817,
+51818,18238,23930,23932,23934,24098,12330,12622,51819,51820,51821,51822,51823,
+24108,51824,51825,51826,51827,24102,15670,18543,51828,51829,51830,51831,51832,
+51833,51834,51835,51836,51837,51838,24097,51840,51841,24101,51842,51843,51844,
+51845,24105,51846,51847,51848,51849,51850,24104,51851,51852,51853,24103,51854,
+51855,51856,51857,51858,51859,51860,51861,51862,24109,51863,21580,51864,51865,
+51866,51867,24115,24106,24110,51868,51869,16473,51870,51871,51872,52032,52033,
+12577,24118,52034,24113,52035,52036,52037,52038,52039,52040,52041,24114,52042,
+52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,20774,24117,52053,
+52054,52055,52056,52057,52058,52059,24111,52060,52061,52062,24112,52063,20541,
+52064,52065,52066,24116,19053,24121,52067,52068,52069,52070,52071,52072,24120,
+52073,24119,52074,52075,52076,52077,52078,52079,52080,24123,52081,52082,52083,
+52084,52085,52086,52087,15717,52088,52089,52090,52091,52092,12888,17258,52093,
+52094,24122,52096,17722,52097,52098,52099,52100,52101,52102,24124,52103,52104,
+52105,52106,52107,52108,52109,19545,52110,52111,52112,52113,14122,52114,52115,
+52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,
+52288,52289,21605,52290,52291,52292,24125,52293,52294,52295,52296,52297,24127,
+52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,17442,52309,
+52310,52311,52312,24129,52313,52314,52315,52316,52317,52318,52319,52320,52321,
+52322,52323,52324,52325,52326,52327,52328,24126,52329,24128,52330,52331,52332,
+52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,21818,52344,
+52345,52346,24130,52347,52348,52349,52350,52352,52353,52354,52355,52356,52357,
+52358,52359,52360,52361,52362,52363,29230,15138,16946,17712,16967,52364,52365,
+29231,52366,52367,52368,52369,52370,20585,52371,52372,52373,21341,52374,52375,
+52376,27453,52377,52378,52379,52380,52381,52382,52383,52384,13158,29232,52544,
+29233,52545,52546,18989,52547,52548,52549,52550,52551,52552,52553,14951,29235,
+29237,29236,19300,20282,29234,18996,21071,17004,52554,52555,52556,52557,52558,
+52559,52560,20035,29240,12406,29239,52561,52562,52563,52564,52565,29246,52566,
+12879,52567,52568,52569,52570,52571,52572,20801,29242,52573,52574,52575,52576,
+52577,29244,21609,52578,52579,29243,29238,29247,29245,52580,29241,52581,52582,
+29255,29252,29254,52583,52584,29258,29250,29248,52585,52586,52587,29253,52588,
+52589,52590,52591,52592,22139,52593,52594,52595,29249,52596,18297,18783,52597,
+29256,14662,13616,52598,52599,29251,29257,29264,29270,52600,52601,15191,52602,
+52603,52604,29269,19804,52605,22123,52606,52608,29266,29268,52609,52610,52611,
+52612,14450,52613,52614,52615,52616,29259,52617,52618,52619,29262,17017,52620,
+21853,29260,29261,29263,29267,52621,52622,52623,29273,21308,52624,52625,52626,
+52627,13930,52628,19057,52629,14180,29271,52630,52631,52632,29272,29274,29277,
+29275,52633,52634,29276,52635,52636,52637,52638,20817,29265,52639,19785,52640,
+20047,22057,52800,29283,52801,17243,52802,29280,52803,52804,16431,29292,29278,
+52805,29281,52806,52807,52808,29288,52809,52810,52811,52812,29282,52813,52814,
+29287,52815,52816,29286,52817,52818,29289,52819,52820,52821,29279,52822,52823,
+29284,29290,52824,52825,52826,52827,52828,52829,52830,21292,29285,12917,52831,
+52832,29298,52833,20523,52834,52835,52836,52837,29301,52838,52839,52840,15176,
+52841,29305,52842,52843,52844,52845,52846,52847,29296,52848,52849,29302,29304,
+29306,52850,52851,52852,52853,52854,52855,52856,52857,29299,52858,29297,52859,
+52860,52861,14971,52862,13691,52864,52865,52866,52867,29295,29303,29293,29294,
+52868,52869,52870,29291,29478,52871,29475,52872,52873,29474,52874,52875,29300,
+52876,18522,52877,52878,52879,52880,52881,29307,52882,52883,52884,29477,52885,
+52886,52887,52888,52889,52890,52891,17272,52892,52893,52894,52895,52896,53056,
+53057,53058,29309,53059,53060,29479,29481,29476,53061,29308,53062,53063,53064,
+29483,53065,29482,53066,53067,53068,53069,16989,53070,53071,29486,53072,53073,
+29488,53074,53075,53076,53077,53078,29473,53079,53080,53081,29489,29484,53082,
+53083,53084,53085,53086,29487,29310,29485,53087,53088,53089,53090,53091,53092,
+53093,29490,53094,53095,53096,53097,29492,53098,53099,53100,53101,29480,53102,
+53103,53104,53105,29491,53106,53107,53108,29493,53109,53110,53111,53112,53113,
+53114,53115,53116,53117,53118,20535,53120,53121,53122,53123,29496,53124,53125,
+53126,53127,22905,53128,53129,53130,53131,53132,53133,29497,53134,53135,53136,
+53137,53138,53139,53140,53141,29495,53142,18532,29494,53143,53144,53145,53146,
+29498,53147,53148,53149,53150,53151,29499,13376,53152,53312,53313,53314,53315,
+53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,28227,53326,53327,
+53328,53329,53330,53331,29500,53332,53333,29501,53334,53335,53336,20778,53337,
+53338,53339,29740,20550,53340,53341,53342,53343,53344,53345,20560,20828,53346,
+53347,53348,53349,53350,53351,20302,53352,53353,15702,53354,20803,53355,53356,
+53357,53358,53359,53360,53361,14946,24937,21058,28994,12857,53362,53363,12653,
+28995,53364,18752,13124,53365,22898,53366,19237,53367,28996,53368,53369,53370,
+53371,22100,53372,53373,53374,53376,53377,28997,29760,28998,53378,21548,28999,
+53379,12352,29761,53380,53381,29762,53382,53383,13436,53384,17755,53385,53386,
+53387,53388,19515,53389,53390,53391,20580,53392,53393,53394,53395,53396,19808,
+53397,53398,53399,53400,53401,29000,53402,22899,53403,53404,53405,53406,53407,
+53408,12603,53568,20270,53569,53570,53571,14372,53572,53573,53574,53575,53576,
+29002,53577,53578,53579,53580,29003,53581,53582,53583,53584,12867,16721,53585,
+53586,22320,29001,53587,53588,29004,53589,53590,53591,53592,29006,53593,53594,
+53595,22902,53596,21089,21539,53597,53598,29763,18489,53599,53600,53601,53602,
+53603,29764,53604,53605,29005,29007,16227,29008,53606,53607,29012,53608,53609,
+53610,53611,53612,53613,53614,29014,29009,53615,18769,17761,53616,53617,53618,
+16995,14716,53619,53620,29011,53621,29013,53622,53623,53624,14675,53625,53626,
+53627,53628,53629,53630,53632,29019,53633,53634,53635,53636,53637,14934,53638,
+12413,29017,53639,53640,53641,53642,53643,29016,29010,29018,53644,53645,53646,
+53647,53648,29015,53649,53650,53651,18540,53652,53653,53654,53655,19786,29021,
+53656,53657,53658,53659,25917,53660,53661,53662,29020,53663,29022,53664,53824,
+53825,53826,53827,53828,53829,53830,53831,53832,29023,53833,53834,20325,53835,
+53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,
+53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,29765,15731,
+53860,53861,53862,53863,53864,53865,29024,53866,53867,53868,53869,53870,53871,
+53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,
+53885,29025,53886,53888,53889,20087,53890,21034,53891,29051,53892,53893,14386,
+53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,
+53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,
+53920,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,
+54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,
+54105,54106,54107,54108,54109,54110,15483,14683,54111,14694,17241,19027,27240,
+16448,15989,27241,27242,27243,54112,27244,27245,27246,27247,15687,54113,54114,
+54115,30075,54116,54117,54118,30077,54119,30078,54120,30076,54121,54122,54123,
+54124,15714,54125,30241,13349,54126,54127,54128,54129,30242,54130,54131,54132,
+30243,54133,54134,54135,27698,54136,54137,54138,54139,54140,54141,54142,54144,
+54145,54146,54147,54148,20820,54149,54150,54151,54152,54153,54154,22890,54155,
+54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,
+54169,54170,54171,54172,54173,54174,54175,54176,54336,54337,54338,54339,54340,
+54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,
+54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,
+54367,30244,54368,54369,54370,54371,54372,54373,54374,54375,54376,28218,54377,
+54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,
+54391,54392,54393,54394,54395,54396,54397,54398,54400,54401,54402,54403,54404,
+54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,
+54418,54419,54420,54421,54422,54423,54424,54425,21810,54426,54427,54428,54429,
+54430,54431,54432,54592,54593,54594,54595,54596,54597,54598,54599,21374,19548,
+54600,54601,54602,54603,54604,54605,54606,54607,19012,54608,54609,54610,54611,
+54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,
+54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,
+54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,
+54651,54652,54653,54654,54656,54657,54658,54659,54660,54661,54662,54663,54664,
+54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,
+54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54848,54849,
+54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,
+54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,
+54876,54877,54878,54879,54880,54881,54882,25920,54883,54884,54885,54886,54887,
+54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,
+54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54912,54913,30245,
+54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,
+54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,
+54940,54941,54942,54943,54944,55104,55105,55106,55107,55108,55109,55110,55111,
+55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,
+55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,15919,55136,
+55137,55138,55139,55140,17961,55141,55142,55143,55144,55145,55146,55147,55148,
+55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,
+55162,55163,55164,55165,55166,55168,55169,55170,55171,55172,55173,55174,55175,
+55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,
+55189,55190,55191,55192,23077,15430,13865,14396,18511,15397,23078,23079,19542,
+18499,23080,18045,55193,20789,21097,20790,15431,55194,15666,15204,23081,23082,
+20808,23083,20589,13935,16987,55195,19279,14189,18792,14147,15991,22052,23084,
+23085,17984,22375,18998,55196,21801,19295,21871,23086,22111,13386,23088,23087,
+55197,21099,23089,23090,23091,19028,23092,18987,23093,23094,13135,22127,23095,
+15152,13614,23096,23097,14702,20783,21096,23098,14403,20330,12911,23099,23100,
+55198,15723,20060,21359,23101,20083,23102,21333,15205,23103,19253,19280,23104,
+18283,22126,23105,17717,13889,23106,14156,16206,23107,23108,19245,23109,13687,
+23110,16706,22331,23111,19512,55199,21098,17457,23112,13693,15185,23113,20531,
+23114,23115,20029,23116,23117,23118,12919,23121,23119,20840,23120,17237,23122,
+55200,23123,23124,23125,20539,21029,12409,23126,18219,23127,15735,17185,23128,
+23129,17277,19511,23130,23131,16446,18007,23132,23133,18228,23134,23135,14664,
+55360,55361,55362,55363,55364,55365,55366,55367,55368,15213,55369,55370,55371,
+55372,13881,29816,55373,29817,55374,55375,19811,55376,55377,55378,55379,55380,
+55381,55382,55383,30009,55384,55385,55386,55387,27488,55388,55389,55390,55391,
+55392,55393,20339,15167,55394,55395,55396,55397,55398,55399,55400,14912,21541,
+55401,55402,55403,55404,55405,55406,55407,24921,55408,55409,55410,55411,30068,
+12586,12914,55412,55413,55414,55415,55416,55417,55418,30069,55419,55420,30071,
+55421,55422,55424,14929,30070,55425,17202,55426,55427,55428,55429,55430,55431,
+55432,30073,55433,55434,55435,30072,55436,55437,55438,55439,55440,55441,55442,
+55443,55444,55445,55446,55447,55448,55449,55450,55451,55452,55453,55454,55455,
+55456,55616,55617,55618,55619,55620,55621,55622,55623,55624,55625,55626,55627,
+55628,55629,55630,55631,55632,55633,55634,55635,55636,55637,55638,55639,55640,
+55641,55642,55643,55644,55645,55646,55647,55648,55649,55650,55651,55652,55653,
+55654,55655,55656,55657,55658,55659,55660,55661,55662,55663,55664,55665,55666,
+55667,55668,55669,55670,55671,55672,55673,55674,55675,55676,55677,55678,55680,
+55681,55682,55683,55684,55685,55686,55687,55688,55689,55690,55691,55692,55693,
+55694,55695,55696,55697,55698,55699,55700,55701,55702,55703,55704,55705,55706,
+55707,55708,55709,55710,55711,55712,55872,55873,55874,55875,55876,55877,55878,
+55879,55880,55881,55882,55883,55884,55885,55886,12596,21866,14394,55887,14641,
+12870,21616,20301,12380,21835,15221,22090,14135,19504,17974,12641,14650,22140,
+14689,14113,15482,27226,27227,19577,14707,27228,13435,17203,14161,14936,27229,
+21620,27230,15446,15199,27231,16734,16952,21599,22346,27232,27233,27236,27234,
+27235,18782,14387,13892,27237,19050,18765,13389,55888,55889,25177,17762,27238,
+16437,55890,22328,27239,22316,18556,22611,22605,21598,55891,21625,18756,21294,
+14419,13152,55892,18786,29814,55893,55894,55895,14933,55896,29815,55897,55898,
+22367,55899,55900,29809,14384,21844,14415,18032,55901,55902,55903,55904,55905,
+55906,55907,55908,55909,13123,55910,55911,29810,13100,55912,55913,55914,55915,
+21565,18295,55916,55917,55918,55919,55920,29812,55921,55922,29811,55923,55924,
+55925,55926,55927,55928,55929,55930,55931,55932,19531,55933,55934,55936,18468,
+55937,55938,55939,55940,55941,55942,55943,55944,55945,55946,55947,55948,55949,
+29813,55950,22371,17727,30016,55951,55952,30011,55953,30019,55954,30018,55955,
+22074,30017,55956,55957,55958,21566,30020,55959,30028,55960,55961,55962,55963,
+12367,13688,55964,30025,30026,55965,17756,55966,55967,55968,56128,30021,30022,
+56129,56130,30023,30027,56131,15968,30024,14458,56132,56133,56134,30032,30035,
+56135,56136,56137,16231,56138,14706,30012,30029,56139,56140,16951,56141,56142,
+56143,19576,56144,15481,56145,30030,30031,30033,13925,30034,56146,30037,56147,
+56148,56149,56150,56151,56152,56153,30013,56154,56155,56156,30036,21307,56157,
+13164,56158,56159,19492,56160,56161,56162,56163,30038,56164,56165,56166,56167,
+56168,56169,56170,56171,30039,15969,30040,56172,56173,19551,30043,56174,56175,
+56176,56177,56178,12872,22361,56179,30041,56180,30042,30044,56181,30050,56182,
+56183,56184,30048,56185,56186,56187,30047,30045,56188,56189,30049,56190,56192,
+30046,30052,30053,56193,19555,56194,56195,25919,13624,30051,30056,19491,56196,
+56197,56198,56199,56200,30054,30055,56201,56202,56203,56204,56205,56206,30014,
+56207,56208,56209,56210,56211,56212,56213,56214,56215,56216,56217,56218,12612,
+56219,56220,30015,56221,56222,13637,12900,56223,30060,30057,56224,13911,56384,
+30061,56385,30058,56386,56387,56388,56389,56390,30059,56391,56392,13402,56393,
+21610,56394,56395,56396,30062,56397,13177,56398,56399,56400,56401,56402,56403,
+56404,30063,30065,56405,56406,56407,30064,56408,56409,56410,56411,56412,56413,
+56414,30066,56415,30067,56416,56417,56418,56419,56420,56421,56422,56423,56424,
+56425,56426,56427,18797,14634,56428,56429,18299,56430,56431,13923,56432,56433,
+56434,56435,56436,56437,56438,19529,56439,56440,56441,56442,56443,56444,56445,
+56446,56448,56449,56450,56451,56452,56453,56454,56455,56456,56457,56458,27174,
+56459,56460,56461,56462,56463,56464,56465,56466,56467,56468,56469,56470,56471,
+56472,56473,56474,56475,56476,56477,56478,56479,56480,56640,56641,56642,56643,
+56644,56645,56646,56647,56648,56649,56650,56651,56652,56653,56654,56655,56656,
+56657,56658,56659,56660,56661,56662,56663,56664,56665,56666,56667,56668,56669,
+56670,56671,56672,56673,56674,56675,56676,56677,56678,56679,56680,56681,56682,
+56683,56684,56685,56686,56687,56688,56689,56690,56691,56692,56693,56694,56695,
+56696,56697,56698,56699,56700,56701,56702,56704,56705,56706,56707,56708,56709,
+56710,56711,56712,56713,56714,56715,56716,56717,56718,56719,56720,56721,56722,
+56723,56724,56725,56726,56727,56728,56729,56730,56731,56732,56733,56734,56735,
+56736,56896,56897,56898,56899,56900,56901,56902,56903,56904,56905,56906,56907,
+56908,56909,56910,56911,56912,56913,56914,56915,56916,56917,56918,56919,56920,
+56921,56922,56923,56924,56925,56926,56927,56928,13109,21630,14700,20601,56929,
+26989,22314,26990,16982,18541,14948,26991,26992,26993,22113,26994,26995,26997,
+26996,26998,26999,18273,27000,21592,27001,15694,56930,27002,27003,15695,27004,
+14376,16702,27005,12594,15188,14709,27006,56931,27169,27170,27171,14200,15405,
+56932,19044,24654,21551,20285,21815,27172,21854,27173,20545,14652,56933,13383,
+12633,56934,56935,56936,16433,56937,56938,56939,56940,12646,12647,56941,12648,
+56942,56943,56944,56945,13117,18536,56946,56947,56948,56949,25921,56950,56951,
+12639,56952,56953,56954,16713,13423,56955,56956,18216,21336,56957,18041,20792,
+56958,14717,17013,56960,56961,56962,56963,56964,21293,56965,21579,15740,56966,
+25922,14133,25923,56967,56968,15161,21858,56969,15736,21558,20005,16684,13145,
+56970,56971,19574,56972,25926,25924,25928,56973,25930,25927,13647,17992,56974,
+13692,25925,56975,19062,56976,56977,25929,56978,56979,56980,17236,12613,15395,
+56981,56982,56983,22327,56984,56985,19787,19277,19018,19539,25932,25931,17510,
+56986,56987,20769,20791,25933,56988,25936,56989,19768,22128,25935,13661,56990,
+19774,56991,25937,13882,56992,57152,19752,14692,57153,19013,13137,19289,21612,
+25938,14186,57154,57155,57156,25934,57157,57158,57159,57160,57161,57162,25941,
+13438,25942,57163,57164,57165,57166,57167,25939,25940,57168,21085,57169,57170,
+16991,12614,57171,21346,57172,57173,13917,19308,57174,25943,57175,57176,21366,
+57177,57178,57179,57180,57181,12649,57182,13940,25946,25944,25945,13632,57183,
+57184,57185,21061,25948,57186,57187,25950,57188,57189,57190,57191,57192,57193,
+25949,18226,57194,21027,57195,57196,25947,57197,57198,57199,57200,21602,21850,
+57201,57202,57203,57204,57205,25952,22385,57206,57207,57208,57209,57210,57211,
+57212,25953,57213,12636,20859,57214,25954,25956,57216,57217,57218,57219,25955,
+57220,57221,25957,57222,57223,57224,57225,57226,21080,57227,13643,57228,26463,
+57229,23157,57230,23160,57231,23158,57232,23159,57233,57234,57235,23162,20559,
+17479,57236,57237,12398,57238,57239,57240,20528,57241,23161,57242,21322,14890,
+23330,18289,57243,23164,23163,18779,23165,57244,23329,22366,23166,16730,57245,
+57246,23333,57247,57248,21364,57408,57409,23335,23332,57410,23336,57411,57412,
+15676,57413,57414,57415,16457,23331,23334,22051,57416,23337,57417,57418,57419,
+23341,57420,57421,57422,23342,23340,14914,57423,57424,57425,16164,23339,57426,
+57427,57428,23338,21575,12863,57429,57430,23343,57431,14713,57432,23344,57433,
+57434,57435,57436,13115,57437,57438,57439,13606,57440,57441,57442,57443,13884,
+23345,57444,57445,57446,13941,57447,23346,57448,57449,57450,57451,57452,57453,
+57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,
+57467,12617,57468,57469,57470,57472,23348,57473,57474,57475,23347,23349,57476,
+57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,23351,57487,23350,
+57488,57489,57490,57491,57492,57493,57494,23352,57495,57496,57497,57498,57499,
+57500,57501,57502,57503,23353,57504,57664,23354,57665,57666,21327,29818,18293,
+22339,17764,29820,29821,29819,57667,15942,57668,57669,57670,57671,20591,57672,
+57673,14163,57674,57675,21581,19498,57676,57677,29986,29985,14888,29822,19286,
+57678,57679,57680,29988,16466,57681,13162,57682,19754,29989,29987,15668,29992,
+57683,29993,15693,17208,16225,19297,29994,57684,57685,57686,29990,29991,17520,
+57687,57688,57689,57690,57691,29996,57692,13372,57693,22381,57694,13399,29995,
+29998,57695,57696,29997,29999,20561,57697,57698,57699,57700,57701,57702,57703,
+17233,18473,57704,57705,57706,57707,57708,57709,30000,30001,57710,57711,57712,
+57713,57714,57715,30002,57716,57717,30003,30004,30005,57718,57719,57720,57721,
+30007,30006,57722,57723,57724,57725,30008,57726,57728,57729,57730,57731,57732,
+57733,57734,57735,57736,57737,57738,12873,57739,21332,19021,57740,16495,22104,
+21040,16703,57741,15728,57742,57743,57744,57745,57746,57747,57748,57749,57750,
+57751,14378,57752,57753,57754,57755,57756,57757,57758,57759,57760,57920,57921,
+57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,
+57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,
+57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,
+57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,
+57974,57975,57976,57977,57978,57979,57980,57981,57982,57984,57985,57986,57987,
+57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,
+58001,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,
+58014,58015,58016,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,
+58186,58187,58188,58189,58190,58191,58192,58193,58194,58195,58196,58197,58198,
+58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,
+58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,15480,58222,58223,
+58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,
+58237,58238,58240,58241,58242,58243,58244,58245,58246,58247,30278,58248,58249,
+58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,
+58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58432,58433,58434,
+58435,58436,58437,30279,58438,58439,58440,58441,58442,58443,58444,58445,58446,
+58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,
+58460,58461,58462,30280,58463,58464,58465,58466,58467,58468,58469,58470,58471,
+58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,
+58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58496,58497,58498,
+58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,
+58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,
+58525,58526,58527,58528,58688,58689,58690,58691,58692,58693,58694,58695,58696,
+58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,
+58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,
+58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,
+58736,58737,58738,58739,30281,58740,58741,58742,58743,58744,58745,58746,58747,
+58748,58749,58750,58752,58753,58754,58755,58756,58757,58758,58759,58760,58761,
+58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,
+58775,58776,58777,58778,58779,58780,58781,58782,58783,30282,58784,58944,58945,
+58946,58947,58948,58949,58950,58951,58952,58953,58954,58955,58956,58957,58958,
+58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,
+58972,58973,58974,58975,58976,58977,58978,30284,58979,58980,58981,58982,58983,
+58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,
+58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59008,59009,59010,
+59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,
+59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,
+59037,30283,59038,59039,59040,59200,59201,59202,59203,59204,59205,59206,59207,
+30569,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,
+59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,
+59233,59234,59235,59236,59237,59238,59239,59240,59241,59242,59243,59244,59245,
+59246,59247,59248,59249,59250,59251,59252,59253,59254,59255,59256,59257,59258,
+59259,59260,59261,59262,59264,59265,59266,59267,59268,59269,59270,59271,59272,
+59273,59274,59275,59276,59277,59278,59279,59280,59281,59282,59283,59284,59285,
+59286,59287,59288,59289,59290,59291,59292,59293,59294,59295,59296,59456,59457,
+59458,59459,59460,59461,59462,59463,59464,59465,59466,59467,59468,59469,59470,
+30285,59471,59472,59473,59474,59475,59476,59477,59478,59479,59480,59481,59482,
+59483,59484,59485,59486,59487,59488,59489,59490,59491,59492,59493,59494,59495,
+59496,59497,59498,59499,59500,59501,59502,59503,59504,59505,59506,59507,59508,
+59509,59510,59511,59512,59513,59514,30286,59515,59516,59517,59518,59520,59521,
+59522,59523,59524,59525,59526,59527,59528,59529,59530,59531,59532,59533,59534,
+59535,59536,59537,59538,59539,59540,28228,28229,28230,21867,13860,28232,28231,
+28233,28234,18213,28235,28236,59541,14128,13686,28237,28239,59542,28238,59543,
+14406,28240,28241,28242,13915,13102,22099,17478,12597,14422,28243,28244,21567,
+18261,15995,20057,14643,28246,28245,28248,28247,17701,28249,28250,18222,28251,
+18223,28252,12839,28253,28254,28255,28256,28257,22378,28258,28259,15448,28260,
+21323,19578,12844,16741,28261,18214,17197,59544,28262,28263,28264,28265,28266,
+28267,28268,59545,28269,28270,28271,59546,59547,28272,28273,28274,28276,28275,
+59548,28277,19757,16961,28278,28279,28280,21793,28281,20275,28282,28283,59549,
+28284,28285,28449,28286,28450,14453,17274,28451,28452,15682,21055,12921,28453,
+28454,28455,21112,28456,22141,28457,17996,59550,28458,28459,16692,28460,20346,
+19320,28462,28461,13178,14712,28463,28464,20578,28465,28466,14182,20543,28467,
+28468,28469,18545,19552,28470,28471,28472,28473,28474,21856,28475,13421,17194,
+28476,59551,28477,28478,28479,59552,20093,28480,16992,13368,22326,15733,59712,
+20295,28483,28481,28482,28484,13863,15484,15970,17228,28485,28486,59713,28487,
+28495,28488,28489,28490,18242,28529,13901,28491,59714,28492,28493,13894,17214,
+28494,59715,28496,28497,28498,21874,59716,28499,17527,59717,28500,17528,28501,
+28502,14436,12407,28503,28504,28505,59718,28506,28507,28508,28509,59719,28510,
+15925,28513,28511,28512,59720,28514,28515,16717,28516,28517,28518,28519,28520,
+28521,28522,28523,28524,16472,59721,28525,16685,28526,28527,28528,59722,59723,
+20322,59724,59725,59726,59727,59728,59729,59730,59731,13092,59732,59733,59734,
+59735,59736,59737,59738,59739,59740,59741,59742,59743,59744,59745,59746,59747,
+59748,59749,59750,59751,59752,59753,59754,59755,59756,59757,59758,59759,59760,
+59761,59762,59763,59764,59765,59766,59767,59768,59769,59770,59771,59772,59773,
+59774,59776,59777,59778,59779,59780,59781,59782,59783,59784,59785,59786,59787,
+59788,59789,59790,59791,59792,59793,59794,59795,59796,59797,59798,59799,59800,
+59801,59802,59803,59804,59805,59806,59807,59808,59968,59969,59970,59971,59972,
+59973,59974,59975,59976,59977,59978,59979,59980,59981,59982,59983,59984,59985,
+59986,59987,59988,59989,59990,59991,59992,59993,59994,59995,17221,25413,18753,
+25414,59996,12629,20042,13363,18546,25415,20304,25416,15460,25417,25418,17222,
+21794,17494,14699,20037,25419,17270,25420,59997,14119,14451,14930,25421,25422,
+21572,25423,59998,25424,20811,25425,25426,25427,25428,20822,25429,12923,16443,
+25430,59999,16427,25431,25432,25433,60000,25434,25435,60001,14391,23138,60002,
+13907,60003,23140,23139,60004,60005,60006,60007,60008,60009,60010,23142,60011,
+60012,60013,18542,60014,60015,23141,14144,20852,21109,21875,15703,60016,60017,
+60018,60019,22376,23144,23143,60020,12322,19795,60021,23145,60022,14397,15434,
+16957,16932,13122,23146,60023,16938,17456,15669,60024,60025,20318,60026,60027,
+60028,23147,18754,60029,60030,60032,60033,60034,12637,60035,60036,60037,23148,
+60038,13880,21562,60039,13181,60040,60041,23149,21577,20309,17763,60042,23150,
+60043,60044,60045,60046,60047,23151,60048,23152,16746,19541,20317,60049,60050,
+60051,60052,60053,60054,60055,60056,60057,60058,60059,60060,60061,21351,16929,
+60062,23153,60063,60064,19301,60224,23154,60225,19302,21118,60226,60227,60228,
+14452,60229,60230,23155,12335,20278,60231,60232,21839,60233,60234,60235,60236,
+60237,60238,60239,60240,60241,60242,19309,60243,60244,60245,60246,60247,60248,
+60249,60250,23156,60251,60252,25412,60253,60254,16677,60255,60256,30271,60257,
+60258,30272,30273,17489,60259,18488,20835,60260,60261,20571,20805,15407,14669,
+60262,28532,60263,60264,13382,21306,30274,13179,60265,60266,30275,60267,60268,
+13681,60269,60270,60271,60272,60273,60274,60275,60276,60277,60278,30277,60279,
+60280,60281,60282,60283,60284,60285,21354,30247,20777,60286,60288,60289,60290,
+30249,60291,60292,60293,30248,60294,60295,16739,16471,60296,12578,60297,60298,
+60299,60300,20077,60301,20584,30251,60302,60303,20342,60304,30250,21872,30252,
+17209,60305,60306,60307,15220,30254,30253,60308,60309,60310,17502,60311,60312,
+16728,60313,60314,60315,60316,60317,19242,60318,20284,60319,60320,60480,60481,
+60482,60483,60484,60485,60486,60487,60488,30255,60489,60490,30256,60491,60492,
+30257,60493,16950,60494,60495,60496,60497,60498,12372,17785,60499,60500,60501,
+60502,30258,60503,60504,60505,60506,60507,60508,60509,60510,60511,60512,60513,
+60514,60515,60516,60517,60518,60519,60520,60521,18272,30246,60522,60523,15928,
+60524,60525,15922,60526,13669,60527,60528,14151,60529,16191,17234,17254,60530,
+60531,22604,60532,60533,60534,14447,60535,60536,60537,60538,60539,60540,60541,
+60542,60544,15737,20773,60545,12368,60546,60547,60548,60549,60550,30512,60551,
+60552,60553,60554,60555,60556,60557,60558,30513,60559,60560,60561,60562,60563,
+20524,60564,12336,60565,60566,60567,30514,30515,60568,30516,60569,60570,60571,
+18250,60572,60573,60574,60575,60576,60736,60737,15951,60738,60739,30519,60740,
+60741,60742,60743,60744,60745,60746,30518,60747,12638,60748,30517,60749,60750,
+30520,60751,30521,60752,60753,60754,60755,60756,60757,60758,60759,60760,60761,
+60762,60763,60764,60765,60766,60767,60768,60769,60770,60771,60772,60773,60774,
+60775,60776,60777,60778,60779,60780,60781,60782,60783,60784,60785,60786,60787,
+60788,60789,60790,60791,60792,60793,60794,60795,60796,60797,60798,60800,60801,
+20004,18509,60802,14891,26680,26681,26682,15938,60803,60804,60805,60806,60807,
+21108,60808,21583,18776,60809,60810,60811,60812,60813,60814,60815,60816,60817,
+60818,60819,60820,60821,60822,60823,60824,60825,60826,60827,60828,60829,60830,
+60831,60832,60992,60993,60994,60995,60996,60997,60998,60999,61000,61001,61002,
+61003,61004,61005,61006,61007,61008,61009,61010,61011,61012,61013,61014,61015,
+61016,61017,61018,61019,61020,61021,61022,61023,61024,61025,61026,61027,61028,
+61029,61030,61031,61032,61033,61034,61035,61036,61037,61038,61039,61040,61041,
+61042,61043,61044,61045,61046,61047,61048,61049,61050,61051,61052,61053,61054,
+61056,61057,61058,61059,61060,61061,61062,61063,61064,61065,61066,61067,61068,
+61069,61070,61071,61072,61073,61074,61075,61076,61077,61078,61079,61080,61081,
+61082,61083,61084,61085,61086,61087,61088,61248,61249,61250,61251,61252,61253,
+21043,13861,18282,29052,20334,19251,20587,26479,19815,14667,13913,29053,12388,
+19276,29054,21540,16941,16748,17988,15921,29217,15445,61254,29218,29219,61255,
+29220,21059,17973,61256,19783,29221,61257,21297,16197,19554,61258,29222,29223,
+20821,13934,29224,29225,13663,29226,29227,61259,12924,29228,29229,18471,61260,
+61261,61262,61263,61264,61265,61266,61267,61268,61269,61270,61271,61272,61273,
+61274,61275,61276,61277,61278,61279,61280,61281,61282,61283,61284,61285,61286,
+61287,61288,61289,61290,61291,61292,61293,61294,61295,61296,61297,14183,61298,
+61299,27689,27690,27691,61300,27692,61301,61302,17966,27693,27694,61303,61304,
+61305,14153,18995,61306,61307,61308,61309,61310,61312,61313,25144,30543,61314,
+61315,61316,61317,61318,61319,61320,61321,61322,61323,61324,61325,61326,61327,
+61328,61329,61330,61331,61332,61333,61334,61335,61336,61337,61338,61339,61340,
+61341,61342,61343,61344,61504,61505,61506,61507,61508,30544,61509,61510,12877,
+61511,61512,61513,61514,61515,61516,61517,61518,61519,61520,61521,61522,61523,
+61524,61525,61526,61527,61528,61529,61530,61531,61532,61533,61534,61535,61536,
+61537,61538,61539,30545,61540,61541,61542,61543,61544,61545,61546,61547,61548,
+61549,61550,61551,61552,61553,61554,61555,61556,61557,61558,61559,61560,61561,
+61562,61563,61564,61565,61566,61568,61569,61570,61571,61572,61573,61574,61575,
+61576,61577,30547,30546,61578,61579,61580,61581,61582,61583,61584,61585,61586,
+61587,61588,61589,61590,25147,61591,15394,61592,25148,25149,25150,25151,25152,
+25153,14137,21115,15652,19022,12581,19271,61593,25154,13948,18500,25155,61594,
+61595,15688,61596,12669,25156,61597,13942,25157,17497,61598,61599,25158,20314,
+14685,25159,16417,61600,25160,12918,61760,25161,61761,16755,25162,25163,17016,
+25164,25165,25166,19031,22584,22885,20323,61762,61763,61764,61765,61766,61767,
+61768,61769,61770,61771,61772,28709,61773,61774,23600,61775,61776,61777,61778,
+61779,61780,61781,61782,61783,61784,61785,61786,61787,61788,61789,61790,61791,
+61792,61793,61794,61795,61796,61797,61798,61799,61800,61801,61802,61803,61804,
+61805,61806,61807,61808,61809,61810,61811,61812,61813,61814,61815,61816,61817,
+61818,61819,61820,61821,61822,61824,61825,61826,61827,61828,61829,61830,61831,
+61832,61833,61834,61835,61836,61837,61838,61839,61840,61841,61842,61843,61844,
+61845,61846,61847,61848,61849,61850,61851,61852,61853,61854,61855,61856,62016,
+62017,62018,62019,62020,62021,62022,62023,62024,62025,62026,62027,62028,62029,
+62030,62031,62032,62033,62034,62035,62036,62037,62038,62039,62040,62041,62042,
+62043,62044,62045,62046,62047,62048,62049,62050,62051,62052,62053,62054,62055,
+62056,62057,62058,62059,62060,62061,62062,62063,62064,62065,62066,62067,62068,
+62069,62070,62071,62072,62073,62074,62075,62076,62077,62078,62080,62081,62082,
+62083,62084,62085,62086,62087,62088,62089,62090,62091,62092,62093,62094,62095,
+62096,62097,62098,62099,62100,62101,62102,62103,62104,62105,62106,62107,62108,
+62109,62110,62111,62112,62272,62273,62274,62275,62276,62277,62278,62279,62280,
+62281,62282,62283,62284,62285,62286,62287,62288,62289,17005,21542,19796,20785,
+13147,18301,62290,12853,16959,26208,19003,26209,26210,15956,26211,22308,19797,
+26213,15453,26212,26214,26215,17006,62291,15678,26216,16998,14887,26217,62292,
+26218,13138,20841,62293,62294,16165,26219,18031,26220,26221,62295,62296,26222,
+17965,26223,62297,18727,26224,26225,26226,25913,26227,26228,16994,26229,26230,
+22120,26231,62298,26232,14663,62299,62300,62301,62302,62303,62304,62305,30523,
+30522,62306,62307,62308,62309,30526,30524,14881,62310,30527,62311,30528,62312,
+62313,62314,30530,30529,30532,62315,62316,30531,62317,62318,62319,62320,62321,
+30533,30534,62322,62323,62324,62325,30535,62326,19304,62327,62328,62329,62330,
+14431,62331,62332,62333,62334,62336,62337,30548,62338,30549,62339,62340,62341,
+62342,30550,62343,62344,62345,62346,30552,62347,30554,62348,30551,62349,62350,
+62351,62352,62353,62354,62355,62356,62357,30555,62358,30553,62359,62360,62361,
+62362,62363,62364,62365,22359,62366,62367,62368,62528,30556,62529,62530,62531,
+62532,62533,62534,30557,62535,62536,62537,30558,62538,62539,62540,62541,62542,
+62543,62544,62545,62546,62547,62548,30559,62549,62550,62551,30560,62552,62553,
+62554,62555,62556,62557,62558,62559,62560,62561,62562,23371,62563,62564,22570,
+62565,62566,62567,62568,62569,62570,62571,62572,25975,14701,62573,62574,62575,
+62576,16253,15210,30537,17991,30536,62577,30538,30540,30539,62578,62579,62580,
+30541,62581,20026,62582,30542,62583,62584,17447,62585,62586,62587,62588,62589,
+62590,62592,62593,62594,62595,62596,62597,62598,62599,62600,62601,62602,62603,
+62604,62605,62606,62607,62608,62609,62610,62611,62612,62613,62614,62615,62616,
+62617,62618,62619,62620,62621,62622,62623,62624,62784,62785,62786,62787,62788,
+62789,62790,62791,62792,62793,62794,62795,62796,62797,62798,62799,62800,62801,
+62802,62803,62804,62805,62806,62807,62808,62809,62810,62811,62812,62813,62814,
+62815,62816,62817,62818,62819,62820,62821,62822,62823,62824,62825,62826,62827,
+62828,62829,62830,62831,62832,62833,62834,62835,62836,62837,62838,62839,62840,
+62841,62842,62843,62844,62845,62846,62848,62849,62850,62851,62852,62853,62854,
+62855,62856,62857,62858,62859,62860,62861,62862,62863,62864,62865,62866,62867,
+62868,62869,62870,62871,62872,62873,62874,62875,62876,62877,62878,62879,62880,
+63040,63041,63042,63043,63044,63045,63046,63047,63048,63049,63050,63051,63052,
+63053,63054,63055,63056,63057,63058,63059,63060,63061,63062,63063,63064,63065,
+63066,63067,63068,63069,63070,63071,63072,63073,63074,63075,63076,63077,63078,
+63079,63080,63081,63082,63083,63084,63085,63086,63087,63088,63089,63090,63091,
+63092,63093,63094,63095,63096,63097,63098,63099,63100,63101,63102,63104,63105,
+63106,63107,63108,63109,63110,63111,63112,63113,63114,63115,63116,63117,63118,
+63119,63120,63121,63122,63123,63124,63125,63126,63127,63128,63129,63130,63131,
+63132,63133,63134,63135,63136,63296,63297,63298,63299,63300,63301,63302,63303,
+63304,63305,63306,63307,63308,63309,63310,63311,63312,63313,63314,63315,63316,
+63317,63318,63319,63320,63321,63322,63323,63324,63325,63326,63327,63328,63329,
+63330,63331,63332,63333,63334,63335,63336,63337,63338,63339,63340,63341,63342,
+63343,63344,63345,63346,63347,63348,63349,63350,63351,63352,63353,63354,63355,
+63356,63357,63358,63360,21347,63361,63362,30287,63363,16947,30288,63364,63365,
+30289,30290,30291,30292,63366,63367,30294,63368,12587,30295,63369,30296,30297,
+30298,63370,30299,30300,63371,63372,63373,63374,30301,30302,20298,63375,30303,
+30304,30305,30306,30307,30308,16496,30309,30310,30311,30312,30313,63376,30314,
+63377,30315,30316,63378,30317,30318,30319,30320,30321,30322,30323,30324,15912,
+63379,30325,30326,30327,30328,63380,63381,63382,63383,63384,18554,30329,30330,
+30331,30332,63385,63386,30333,30334,30497,30498,30499,30500,30501,63387,63388,
+30502,30503,30504,12654,30505,30506,30507,63389,63390,30508,30509,16731,30510,
+63391,63392,30511,63552,63553,63554,63555,63556,63557,63558,63559,63560,63561,
+63562,63563,63564,63565,63566,63567,63568,63569,63570,63571,63572,63573,63574,
+63575,63576,63577,63578,63579,63580,63581,63582,63583,63584,63585,63586,63587,
+63588,63589,63590,63591,63592,63593,63594,63595,63596,63597,63598,63599,63600,
+63601,63602,63603,63604,63605,63606,63607,63608,63609,63610,63611,63612,63613,
+63614,63616,63617,63618,63619,63620,63621,63622,63623,63624,63625,63626,63627,
+63628,63629,63630,63631,63632,63633,63634,63635,63636,63637,63638,63639,63640,
+63641,63642,63643,63644,63645,63646,63647,63648,63808,63809,63810,63811,63812,
+63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,
+63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,
+63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,
+63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,
+63865,63866,63867,63868,63869,63870,63872,63873,63874,63875,63876,63877,63878,
+63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,
+63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,
+64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,
+64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,
+64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,
+64103,64104,64105,64106,64107,64108,64109,64110,64111,64112,64113,64114,64115,
+64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64128,64129,
+64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,
+64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,
+64156,64157,64158,64159,64160,64320,64321,64322,64323,64324,64325,64326,64327,
+64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,
+64341,64342,64343,64344,64345,64346,64347,17521,28719,15398,28720,17273,64348,
+17720,20795,64349,28721,28722,28723,28724,28725,20796,64350,20844,64351,28727,
+28726,21543,64352,19794,28728,28730,28729,28731,28732,64353,64354,14443,28733,
+14952,64355,28734,28735,15977,28736,13932,28737,28738,28739,28740,18485,28741,
+28742,64356,28743,17780,64357,28744,64358,64359,64360,28745,64361,28746,30525,
+64362,28747,28748,28749,64363,28750,64364,64365,64366,64367,28751,14935,64368,
+28752,28753,28754,28755,28756,28757,28758,28760,64369,64370,21285,28759,64371,
+28761,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,30010,16953,
+64382,64384,30564,64385,64386,64387,64388,30565,30566,64389,64390,30567,64391,
+64392,64393,64394,64395,64396,30568,16948,64397,64398,64399,64400,64401,64402,
+64403,64404,64405,30570,64406,30571,64407,64408,64409,64410,64411,64412,17011,
+64413,64414,64415,64416,64576,64577,64578,64579,64580,64581,64582,64583,64584,
+29808,64585,64586,64587,29807,64588,64589,17001,64590,30561,30562,64591,64592,
+64593,64594,64595,15174,64596,64597,64598,64599,22884,64600,64601,64602,19058,
+16488,28708,64603,14938,64604,64605,18221,64606,64607,64608,17452,64609,64610,
+30572,30573,30574,64611,30576,30575,64612,30577,64613,64614,30580,64615,30579,
+64616,30578,30581,64617,64618,64619,64620,30582,64621,64622,64623,64624,64625,
+64626,64627,64628,64629,28009,64630,28010,28011,64631,30268,64632,64633,64634,
+64635,64636,64637,64638,64640,64641,64642,64643,64644,30269,64645,30270,13862,
+64646,22590,64647,64648,14660,64649,64650,64651,22587,64652,23601,64653,64654,
+64655,64656,64657,64658,19059,64659,30583,64660,64661,64662,64663,64664,64665,
+64666,64667,64668,30584,64669,64670,30585,64671,64672,64832,64833,64834,64835,
+64836,30587,64837,30586,64838,12615,64839,30588,30589,64840,64841,64842,64843,
+64844,30590,64845,64846,64847,64848,64849,64850,64851,64852,64853,64854,64855,
+18027,27700,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,
+64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,
+64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,
+64893,64894,64896,64897,64898,64899,64900,64901,13149,30259,64902,64903,30260,
+16740,30261,30262,30263,30264,30265,30266,18467,30267,64904,64905,64906,64907,
+64908,64909,64910,64911,64912,64913,64914,64915,16762,14632,28008,64916,64917,
+64918,14698,22879,64919,64920,64921,64922,64923,64924,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64925,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64927,N,N,N,N,N,N,N,N,N,64928,
+65088,65089,65090,65091,N,65092,N,65093,65094,N,N,N,65095,N,N,N,N,N,N,65096,
+65097,65098,N,65099,65100,N,N,65101,65102,65103,43349,42738,N,42740,42741,
+42720,42721,42736,42737,42722,42723,42734,42735,42726,42727,42724,42725,42728,
+42729,42730,42731,N,N,N,N,43368,43369,43370,43371,43372,43373,43374,43375,
+43376,43377,N,43378,43379,43380,43381,N,43382,43383,43384,43385,43386,43387,
+43388,43389,43390,43392,43393,43394,43395,43396,N,43397,43398,43399,43400,
+8993,8994,8995,8551,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,
+9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,
+9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,
+9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,
+9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,
+9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,
+9083,9084,9085,8491,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8553,8554,43350,9086,43351,8996,
+};
+
+static const struct unim_index gbcommon_encmap[256] = {
+{__gbcommon_encmap+0,164,252},{__gbcommon_encmap+89,1,220},{__gbcommon_encmap+
+309,81,217},{__gbcommon_encmap+446,145,201},{__gbcommon_encmap+503,1,81},{0,0,
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gbcommon_encmap+584,
+16,59},{__gbcommon_encmap+628,3,153},{__gbcommon_encmap+779,8,191},{
+__gbcommon_encmap+963,18,18},{__gbcommon_encmap+964,96,155},{__gbcommon_encmap
++1024,0,229},{__gbcommon_encmap+1254,5,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},{__gbcommon_encmap+1316,0,254},{
+__gbcommon_encmap+1571,5,41},{__gbcommon_encmap+1608,32,163},{
+__gbcommon_encmap+1740,142,213},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{__gbcommon_encmap+1812,0,255},{__gbcommon_encmap+2068,0,255},{
+__gbcommon_encmap+2324,0,255},{__gbcommon_encmap+2580,0,255},{
+__gbcommon_encmap+2836,0,255},{__gbcommon_encmap+3092,0,255},{
+__gbcommon_encmap+3348,0,255},{__gbcommon_encmap+3604,0,255},{
+__gbcommon_encmap+3860,0,255},{__gbcommon_encmap+4116,0,255},{
+__gbcommon_encmap+4372,0,255},{__gbcommon_encmap+4628,0,255},{
+__gbcommon_encmap+4884,0,255},{__gbcommon_encmap+5140,0,255},{
+__gbcommon_encmap+5396,0,255},{__gbcommon_encmap+5652,0,255},{
+__gbcommon_encmap+5908,0,255},{__gbcommon_encmap+6164,0,255},{
+__gbcommon_encmap+6420,0,255},{__gbcommon_encmap+6676,0,255},{
+__gbcommon_encmap+6932,0,255},{__gbcommon_encmap+7188,0,255},{
+__gbcommon_encmap+7444,0,255},{__gbcommon_encmap+7700,0,255},{
+__gbcommon_encmap+7956,0,255},{__gbcommon_encmap+8212,0,255},{
+__gbcommon_encmap+8468,0,255},{__gbcommon_encmap+8724,0,255},{
+__gbcommon_encmap+8980,0,255},{__gbcommon_encmap+9236,0,255},{
+__gbcommon_encmap+9492,0,255},{__gbcommon_encmap+9748,0,255},{
+__gbcommon_encmap+10004,0,255},{__gbcommon_encmap+10260,0,255},{
+__gbcommon_encmap+10516,0,255},{__gbcommon_encmap+10772,0,255},{
+__gbcommon_encmap+11028,0,255},{__gbcommon_encmap+11284,0,255},{
+__gbcommon_encmap+11540,0,255},{__gbcommon_encmap+11796,0,255},{
+__gbcommon_encmap+12052,0,255},{__gbcommon_encmap+12308,0,255},{
+__gbcommon_encmap+12564,0,255},{__gbcommon_encmap+12820,0,255},{
+__gbcommon_encmap+13076,0,255},{__gbcommon_encmap+13332,0,255},{
+__gbcommon_encmap+13588,0,255},{__gbcommon_encmap+13844,0,255},{
+__gbcommon_encmap+14100,0,255},{__gbcommon_encmap+14356,0,255},{
+__gbcommon_encmap+14612,0,255},{__gbcommon_encmap+14868,0,255},{
+__gbcommon_encmap+15124,0,255},{__gbcommon_encmap+15380,0,255},{
+__gbcommon_encmap+15636,0,255},{__gbcommon_encmap+15892,0,255},{
+__gbcommon_encmap+16148,0,255},{__gbcommon_encmap+16404,0,255},{
+__gbcommon_encmap+16660,0,255},{__gbcommon_encmap+16916,0,255},{
+__gbcommon_encmap+17172,0,255},{__gbcommon_encmap+17428,0,255},{
+__gbcommon_encmap+17684,0,255},{__gbcommon_encmap+17940,0,255},{
+__gbcommon_encmap+18196,0,255},{__gbcommon_encmap+18452,0,255},{
+__gbcommon_encmap+18708,0,255},{__gbcommon_encmap+18964,0,255},{
+__gbcommon_encmap+19220,0,255},{__gbcommon_encmap+19476,0,255},{
+__gbcommon_encmap+19732,0,255},{__gbcommon_encmap+19988,0,255},{
+__gbcommon_encmap+20244,0,255},{__gbcommon_encmap+20500,0,255},{
+__gbcommon_encmap+20756,0,255},{__gbcommon_encmap+21012,0,255},{
+__gbcommon_encmap+21268,0,255},{__gbcommon_encmap+21524,0,255},{
+__gbcommon_encmap+21780,0,255},{__gbcommon_encmap+22036,0,255},{
+__gbcommon_encmap+22292,0,255},{__gbcommon_encmap+22548,0,165},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{__gbcommon_encmap+22714,44,241},{__gbcommon_encmap+22912,12,41},{0,0,0},{0,
+0,0},{0,0,0},{__gbcommon_encmap+22942,48,107},{__gbcommon_encmap+23002,1,229},
+};
+
+static const ucs2_t __gb18030ext_decmap[2729] = {
+58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,
+58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,
+58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,
+58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,
+58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,U,58629,
+58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,
+58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,
+58656,58657,58658,58659,58660,58661,58662,58663,58664,58665,58666,58667,58668,
+58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,
+58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,
+58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,
+58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,
+58721,58722,58723,58724,U,58725,58726,58727,58728,58729,58730,58731,58732,
+58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,
+58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,U,U,U,
+U,U,U,U,U,U,U,59238,59239,59240,59241,59242,59243,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,8364,
+59245,U,U,U,U,U,U,U,U,U,U,59246,59247,U,U,U,U,U,U,U,U,U,U,U,U,59248,59249,
+58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,
+58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,
+58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,
+58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,
+58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,U,58821,
+58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,
+58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,
+58848,58849,58850,58851,58852,58853,58854,58855,58856,58857,58858,58859,58860,
+58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,
+58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,
+58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,
+58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,
+58913,58914,58915,58916,U,58917,58918,58919,58920,58921,58922,58923,58924,
+58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,
+58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,
+58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,
+58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,
+58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,
+58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,
+59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,U,59013,59014,
+59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,
+59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,
+59041,59042,59043,59044,59045,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59261,59262,59263,59264,59265,
+59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,
+59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,
+59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,
+59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,
+59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,
+59108,U,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,
+59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,
+59133,59134,59135,59136,59137,59138,59139,59140,59141,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,59269,59270,59271,59272,59273,59274,59275,59276,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59277,59278,59279,59280,59281,59282,
+59283,U,U,U,U,U,U,U,U,U,U,U,U,59284,59285,U,U,U,U,U,59286,U,U,59287,59288,
+59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,
+59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,
+59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,
+59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,
+59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,
+59200,59201,59202,59203,59204,U,59205,59206,59207,59208,59209,59210,59211,
+59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,
+59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59296,59297,
+59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59311,59312,
+59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,59324,59325,
+59326,59327,59328,59329,59330,59331,59332,59333,59334,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59335,U,U,505,U,59337,59338,59339,59340,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59341,59342,
+59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,
+59356,59357,59358,59359,59360,59361,59362,U,U,59363,U,59364,59365,59366,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,
+U,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,
+59392,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,
+59405,59406,59407,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,
+57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,
+57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,
+57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,
+57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,
+57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,
+57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,
+57432,57433,57434,57435,57436,57437,57438,57439,57440,57441,57442,57443,57444,
+57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,
+57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,
+57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,
+57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,
+57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,
+57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,
+57523,57524,57525,57526,57527,57528,57529,57530,57531,57532,57533,57534,57535,
+57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,
+57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,
+57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,
+57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,
+57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,
+57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,
+57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,57626,
+57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,
+57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,
+57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,
+57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,
+57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,
+57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,
+57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,
+57718,57719,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,
+57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,
+57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,
+57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,
+57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,
+57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,
+57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,
+57809,57810,57811,57812,57813,57814,57815,57816,57817,57818,57819,57820,57821,
+57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,
+57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,
+57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,
+57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,
+57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,
+57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,
+57900,57901,57902,57903,57904,57905,57906,57907,59408,59409,59410,59411,59412,
+57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,
+57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,
+57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,
+57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,
+57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,
+57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,
+57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,
+57999,58000,58001,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,
+58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,
+58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,
+58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,
+58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,
+58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,
+58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,
+58090,58091,58092,58093,58094,58095,58096,58097,58098,58099,58100,58101,58102,
+58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,
+58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,
+58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,
+58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,
+58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,
+58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,
+58181,58182,58183,58184,58185,58186,58187,58188,58189,58190,58191,58192,58193,
+58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,
+58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,
+58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,
+58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,
+58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,
+58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,
+58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,58284,
+58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,
+58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,
+58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,
+58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,
+58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,
+58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,
+58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,
+58376,58377,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,
+58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,
+58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,
+58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,
+58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,
+58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,
+58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,
+58467,58468,58469,58470,58471,11905,59414,59415,59416,11908,13427,13383,11912,
+11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,
+14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,
+17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,
+U,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,
+18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,
+19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,
+58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,
+58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,
+58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,
+58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,
+58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,
+58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,
+58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565,
+};
+
+static const struct dbcs_index gb18030ext_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_decmap+0,64,
+160},{__gb18030ext_decmap+97,64,254},{__gb18030ext_decmap+288,64,160},{
+__gb18030ext_decmap+385,64,254},{__gb18030ext_decmap+576,64,254},{
+__gb18030ext_decmap+767,64,254},{__gb18030ext_decmap+958,64,254},{
+__gb18030ext_decmap+1149,150,254},{__gb18030ext_decmap+1254,88,254},{
+__gb18030ext_decmap+1421,161,254},{__gb18030ext_decmap+1515,161,254},{
+__gb18030ext_decmap+1609,161,254},{__gb18030ext_decmap+1703,161,254},{
+__gb18030ext_decmap+1797,161,254},{__gb18030ext_decmap+1891,161,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},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+__gb18030ext_decmap+1985,250,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},{__gb18030ext_decmap
++1990,161,254},{__gb18030ext_decmap+2084,161,254},{__gb18030ext_decmap+2178,
+161,254},{__gb18030ext_decmap+2272,161,254},{__gb18030ext_decmap+2366,161,254
+},{__gb18030ext_decmap+2460,161,254},{__gb18030ext_decmap+2554,80,254},{0,0,0
+},
+};
+
+static const DBCHAR __gb18030ext_encmap[3227] = {
+43199,41699,65104,N,N,65108,N,N,N,65111,N,N,65112,65117,N,N,N,N,N,N,N,N,N,N,
+65118,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65131,N,N,65134,N,N,N,65137,N,N,N,N,65139,
+N,N,65140,65141,N,N,N,65145,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65156,43402,43403,
+43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43401,65110,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,65114,65116,N,N,N,N,N,N,N,N,N,N,N,65115,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65119,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65122,65125,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65123,
+65124,65128,65129,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,65130,65135,65136,65138,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65144,N,N,N,N,65143,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65146,65147,65149,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65148,65152,N,N,N,N,N,65153,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+65154,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65155,65157,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65158,
+N,N,65159,N,N,N,N,65160,65161,N,65162,65163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,65165,N,N,N,65164,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65167,
+65166,65174,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,65171,65172,65173,65175,65170,65176,65177,65178,65179,65180,65181,
+65182,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65183,
+43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,
+43694,43695,43696,43697,43698,43699,43700,43701,43702,43703,43704,43705,43706,
+43707,43708,43709,43710,43711,43712,43713,43714,43715,43716,43717,43718,43719,
+43720,43721,43722,43723,43724,43725,43726,43727,43728,43729,43730,43731,43732,
+43733,43734,43735,43736,43737,43738,43739,43740,43741,43742,43743,43744,43745,
+43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43756,43757,43758,
+43759,43760,43761,43762,43763,43764,43765,43766,43767,43768,43769,43770,43771,
+43772,43773,43774,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,
+43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,
+43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,
+43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,
+43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,
+43999,44000,44001,44002,44003,44004,44005,44006,44007,44008,44009,44010,44011,
+44012,44013,44014,44015,44016,44017,44018,44019,44020,44021,44022,44023,44024,
+44025,44026,44027,44028,44029,44030,44193,44194,44195,44196,44197,44198,44199,
+44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,
+44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,
+44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,
+44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,
+44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,
+44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,
+44278,44279,44280,44281,44282,44283,44284,44285,44286,44449,44450,44451,44452,
+44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,
+44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,
+44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,
+44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,
+44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,
+44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,
+44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44705,
+44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,
+44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,
+44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,
+44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,
+44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,
+44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,
+44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,
+44797,44798,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,
+44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,
+44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,
+44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,
+45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,
+45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,
+45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,
+45050,45051,45052,45053,45054,63649,63650,63651,63652,63653,63654,63655,63656,
+63657,63658,63659,63660,63661,63662,63663,63664,63665,63666,63667,63668,63669,
+63670,63671,63672,63673,63674,63675,63676,63677,63678,63679,63680,63681,63682,
+63683,63684,63685,63686,63687,63688,63689,63690,63691,63692,63693,63694,63695,
+63696,63697,63698,63699,63700,63701,63702,63703,63704,63705,63706,63707,63708,
+63709,63710,63711,63712,63713,63714,63715,63716,63717,63718,63719,63720,63721,
+63722,63723,63724,63725,63726,63727,63728,63729,63730,63731,63732,63733,63734,
+63735,63736,63737,63738,63739,63740,63741,63742,63905,63906,63907,63908,63909,
+63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,
+63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,
+63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,
+63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,
+63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,
+63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,
+63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,64161,64162,
+64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,
+64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,
+64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,
+64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,
+64215,64216,64217,64218,64219,64220,64221,64222,64223,64224,64225,64226,64227,
+64228,64229,64230,64231,64232,64233,64234,64235,64236,64237,64238,64239,64240,
+64241,64242,64243,64244,64245,64246,64247,64248,64249,64250,64251,64252,64253,
+64254,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,
+64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,
+64442,64443,64444,64445,64446,64447,64448,64449,64450,64451,64452,64453,64454,
+64455,64456,64457,64458,64459,64460,64461,64462,64463,64464,64465,64466,64467,
+64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,
+64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,
+64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,
+64507,64508,64509,64510,64673,64674,64675,64676,64677,64678,64679,64680,64681,
+64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,
+64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,
+64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,
+64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,
+64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,
+64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,
+64760,64761,64762,64763,64764,64765,64766,64929,64930,64931,64932,64933,64934,
+64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,
+64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,
+64961,64962,64963,64964,64965,64966,64967,64968,64969,64970,64971,64972,64973,
+64974,64975,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,
+64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,
+65000,65001,65002,65003,65004,65005,65006,65007,65008,65009,65010,65011,65012,
+65013,65014,65015,65016,65017,65018,65019,65020,65021,65022,65185,65186,65187,
+65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,
+65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,
+65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,
+65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,
+65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,
+65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,
+65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65277,65278,
+41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,
+41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,
+41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,
+41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,
+41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41344,41345,
+41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,
+41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,
+41372,41373,41374,41375,41376,41536,41537,41538,41539,41540,41541,41542,41543,
+41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,
+41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,
+41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,
+41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,
+41596,41597,41598,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,
+41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,
+41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41792,41793,41794,
+41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,
+41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,
+41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,
+41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,
+41847,41848,41849,41850,41851,41852,41853,41854,41856,41857,41858,41859,41860,
+41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,
+41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,
+41887,41888,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,
+42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,
+42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,
+42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,
+42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,
+42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,
+42125,42126,42127,42128,42129,42130,42131,42132,42133,42134,42135,42136,42137,
+42138,42139,42140,42141,42142,42143,42144,42304,42305,42306,42307,42308,42309,
+42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,
+42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,
+42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,
+42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,
+42362,42363,42364,42365,42366,42368,42369,42370,42371,42372,42373,42374,42375,
+42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,
+42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42560,
+42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,
+42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,
+42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,
+42600,42601,42602,42603,42604,42605,42606,42607,42608,42609,42610,42611,42612,
+42613,42614,42615,42616,42617,42618,42619,42620,42621,42622,42624,42625,42626,
+42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,
+42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,
+42653,42654,42655,42656,42816,42817,42818,42819,42820,42821,42822,42823,42824,
+42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,
+42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,
+42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,
+42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,
+42877,42878,42880,42881,42882,42883,42884,42885,42886,42887,42888,42889,42890,
+42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,
+42904,42905,42906,42907,42908,42909,42910,42911,42912,41643,41644,41645,41646,
+41647,41648,N,41700,41711,41712,41725,41726,42228,42229,42230,42231,42232,
+42233,42234,42235,42236,42237,42238,42487,42488,42489,42490,42491,42492,42493,
+42494,42681,42682,42683,42684,42685,42686,42687,42688,42713,42714,42715,42716,
+42717,42718,42719,42732,42733,42739,42742,42743,42744,42745,42746,42747,42748,
+42749,42750,42946,42947,42948,42949,42950,42951,42952,42953,42954,42955,42956,
+42957,42958,42959,42960,42994,42995,42996,42997,42998,42999,43000,43001,43002,
+43003,43004,43005,43006,43158,43159,43160,43161,43162,43163,43164,43165,43166,
+43167,43168,43196,N,43201,43202,43203,43204,43242,43243,43244,43245,43246,
+43247,43248,43249,43250,43251,43252,43253,43254,43255,43256,43257,43258,43259,
+43260,43261,43262,43352,43355,43357,43358,43359,N,N,N,N,N,N,N,N,N,N,N,N,N,
+43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,
+43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43514,43515,43516,
+43517,43518,55290,55291,55292,55293,55294,N,65105,65106,65107,N,N,N,N,N,65113,
+N,N,N,N,N,N,N,65121,N,N,N,N,65126,65127,N,N,N,N,65132,65133,N,N,N,N,N,N,N,N,
+65142,N,N,N,N,N,N,N,65150,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65168,65169,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,65184,
+};
+
+static const struct unim_index gb18030ext_encmap[256] = {
+{0,0,0},{__gb18030ext_encmap+0,249,249},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+1,172,172
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+2,129,202},{
+__gb18030ext_encmap+76,240,251},{__gb18030ext_encmap+88,62,62},{0,0,0},{0,0,0
+},{0,0,0},{__gb18030ext_encmap+89,71,115},{__gb18030ext_encmap+134,158,158},{
+__gb18030ext_encmap+135,14,26},{0,0,0},{0,0,0},{__gb18030ext_encmap+148,24,223
+},{__gb18030ext_encmap+348,115,115},{__gb18030ext_encmap+349,78,78},{
+__gb18030ext_encmap+350,110,224},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+
+465,86,86},{__gb18030ext_encmap+466,95,95},{0,0,0},{__gb18030ext_encmap+467,
+55,221},{__gb18030ext_encmap+634,214,214},{0,0,0},{__gb18030ext_encmap+635,76,
+97},{__gb18030ext_encmap+657,35,141},{0,0,0},{__gb18030ext_encmap+764,71,183},
+{0,0,0},{0,0,0},{__gb18030ext_encmap+877,119,163},{__gb18030ext_encmap+922,19,
+174},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{__gb18030ext_encmap+1078,0,255},{__gb18030ext_encmap+1334,0,255
+},{__gb18030ext_encmap+1590,0,255},{__gb18030ext_encmap+1846,0,255},{
+__gb18030ext_encmap+2102,0,255},{__gb18030ext_encmap+2358,0,255},{
+__gb18030ext_encmap+2614,0,255},{__gb18030ext_encmap+2870,0,255},{
+__gb18030ext_encmap+3126,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+};
+
+
+static const struct _gb18030_to_unibmp_ranges {
+    Py_UNICODE   first, last;
+    DBCHAR       base;
+} gb18030_to_unibmp_ranges[] = {
+{128,163,0},{165,166,36},{169,175,38},{178,182,45},{184,214,50},{216,223,81},{
+226,231,89},{235,235,95},{238,241,96},{244,246,100},{248,248,103},{251,251,104
+},{253,256,105},{258,274,109},{276,282,126},{284,298,133},{300,323,148},{325,
+327,172},{329,332,175},{334,362,179},{364,461,208},{463,463,306},{465,465,307
+},{467,467,308},{469,469,309},{471,471,310},{473,473,311},{475,475,312},{477,
+504,313},{506,592,341},{594,608,428},{610,710,443},{712,712,544},{716,728,545
+},{730,912,558},{930,930,741},{938,944,742},{962,962,749},{970,1024,750},{1026
+,1039,805},{1104,1104,819},{1106,8207,820},{8209,8210,7922},{8215,8215,7924},{
+8218,8219,7925},{8222,8228,7927},{8231,8239,7934},{8241,8241,7943},{8244,8244,
+7944},{8246,8250,7945},{8252,8363,7950},{8365,8450,8062},{8452,8452,8148},{
+8454,8456,8149},{8458,8469,8152},{8471,8480,8164},{8482,8543,8174},{8556,8559,
+8236},{8570,8591,8240},{8596,8597,8262},{8602,8711,8264},{8713,8718,8374},{
+8720,8720,8380},{8722,8724,8381},{8726,8729,8384},{8731,8732,8388},{8737,8738,
+8390},{8740,8740,8392},{8742,8742,8393},{8748,8749,8394},{8751,8755,8396},{
+8760,8764,8401},{8766,8775,8406},{8777,8779,8416},{8781,8785,8419},{8787,8799,
+8424},{8802,8803,8437},{8808,8813,8439},{8816,8852,8445},{8854,8856,8482},{
+8858,8868,8485},{8870,8894,8496},{8896,8977,8521},{8979,9311,8603},{9322,9331,
+8936},{9372,9471,8946},{9548,9551,9046},{9588,9600,9050},{9616,9618,9063},{
+9622,9631,9066},{9634,9649,9076},{9652,9659,9092},{9662,9669,9100},{9672,9674,
+9108},{9676,9677,9111},{9680,9697,9113},{9702,9732,9131},{9735,9736,9162},{
+9738,9791,9164},{9793,9793,9218},{9795,11904,9219},{11906,11907,11329},{11909,
+11911,11331},{11913,11914,11334},{11917,11926,11336},{11928,11942,11346},{
+11944,11945,11361},{11947,11949,11363},{11951,11954,11366},{11956,11957,11370
+},{11960,11962,11372},{11964,11977,11375},{11979,12271,11389},{12284,12287,
+11682},{12292,12292,11686},{12312,12316,11687},{12319,12320,11692},{12330,
+12349,11694},{12351,12352,11714},{12436,12442,11716},{12447,12448,11723},{
+12535,12539,11725},{12543,12548,11730},{12586,12831,11736},{12842,12848,11982
+},{12850,12962,11989},{12964,13197,12102},{13200,13211,12336},{13215,13216,
+12348},{13218,13251,12350},{13253,13261,12384},{13263,13264,12393},{13267,
+13268,12395},{13270,13382,12397},{13384,13426,12510},{13428,13725,12553},{
+13727,13837,12851},{13839,13849,12962},{13851,14615,12973},{14617,14701,13738
+},{14703,14798,13823},{14801,14814,13919},{14816,14962,13933},{14964,15181,
+14080},{15183,15469,14298},{15471,15583,14585},{15585,16469,14698},{16471,
+16734,15583},{16736,17206,15847},{17208,17323,16318},{17325,17328,16434},{
+17330,17372,16438},{17374,17621,16481},{17623,17995,16729},{17997,18016,17102
+},{18018,18210,17122},{18212,18216,17315},{18218,18299,17320},{18301,18316,
+17402},{18318,18758,17418},{18760,18809,17859},{18811,18812,17909},{18814,
+18817,17911},{18820,18820,17915},{18823,18842,17916},{18844,18846,17936},{
+18848,18869,17939},{18872,19574,17961},{19576,19614,18664},{19620,19730,18703
+},{19738,19885,18814},{19887,19967,18962},{40870,55295,19043},{59244,59244,
+33469},{59336,59336,33470},{59367,59379,33471},{59413,59413,33484},{59417,
+59421,33485},{59423,59429,33490},{59431,59434,33497},{59437,59440,33501},{
+59443,59450,33505},{59452,59458,33513},{59460,59475,33520},{59478,59491,33536
+},{59493,63787,33550},{63789,63864,37845},{63866,63892,37921},{63894,63974,
+37948},{63976,63984,38029},{63986,64011,38038},{64016,64016,38064},{64018,
+64018,38065},{64021,64023,38066},{64025,64030,38069},{64034,64034,38075},{
+64037,64038,38076},{64042,65071,38078},{65074,65074,39108},{65093,65096,39109
+},{65107,65107,39113},{65112,65112,39114},{65127,65127,39115},{65132,65280,
+39116},{65375,65503,39265},{65510,65535,39394},{0,0,39420}};
diff --git a/pypy/translator/c/src/cjkcodecs/mappings_hk.h b/pypy/translator/c/src/cjkcodecs/mappings_hk.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/mappings_hk.h
@@ -0,0 +1,2378 @@
+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,
+9392,36793,19091,17673,32383,28502,27313,20202,13540,35628,30877,14138,36480,
+6133,32804,35692,35737,31294,26287,15851,30293,15543,22069,22870,20122,24193,
+25176,22207,3693,36366,23405,16008,19614,25566,U,6134,6267,25904,22061,23626,
+21530,21265,15814,40344,19581,22050,22046,32585,24280,22901,15680,34672,19996,
+4074,3401,14010,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,
+33527,22053,33074,33816,32957,21994,31074,22083,21526,3741,13774,22021,22001,
+26353,33506,13869,30004,22000,21946,21655,21874,3137,3222,24272,20808,3702,
+11362,3746,40619,32090,21982,4213,25245,38765,21652,36045,29174,37238,25596,
+25529,25598,21865,11075,40050,11955,20890,13535,3495,20903,21581,21790,21779,
+30310,36397,26762,30129,32950,34820,34694,35015,33206,33820,4289,17644,29444,
+18182,23440,33547,26771,22139,9972,32047,16803,32115,28368,29366,37232,4569,
+37384,15612,42665,3756,3833,29286,7330,18254,20418,32761,4075,16634,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40029,25887,11680,
+18675,18400,40316,4076,3594,U,30115,4077,U,24648,4487,29091,32398,40272,19994,
+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,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,
+7633,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,
+U,31810,31878,39957,31740,39689,U,39963,18750,40794,21875,23491,20477,40600,
+20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,
+39232,38842,21292,24880,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,26924,21466,39946,40194,19515,38465,27008,20646,30022,5997,
+39386,21107,U,37209,38529,37212,U,37201,36503,25471,27939,27338,22033,37262,
+30074,25221,1020,29519,31856,23585,15613,U,18713,30422,39837,20010,3284,33726,
+34882,U,23626,27072,U,22394,21023,24053,20174,27697,498,20281,21660,21722,
+21146,36226,13822,U,13811,U,27474,37244,40869,39831,38958,39092,39610,40616,
+40580,29050,31508,U,27642,34840,32632,U,22048,42570,36471,40787,U,36308,36431,
+40476,36353,25218,33661,36392,36469,31443,19063,31294,30936,27882,35431,30215,
+35418,40742,27854,34774,30147,41650,30803,63552,36108,29410,29553,35629,29442,
+29937,36075,19131,34351,24506,34976,17591,U,6203,28165,U,35454,9499,U,24829,
+30311,39639,40260,37742,39823,34805,U,U,36087,29484,38689,39856,13782,29362,
+19463,31825,39242,24921,24921,19460,40598,24957,U,22367,24943,25254,25145,U,
+14940,25058,21418,13301,25444,26626,13778,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23895,35778,36826,36409,U,20697,7494,30982,
+21298,38456,3899,16485,U,30718,U,31938,24346,31962,31277,32870,32867,32077,
+29957,29938,35220,33306,26380,32866,29830,32859,29936,33027,30500,35209,26572,
+30035,28369,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,
+27058,36262,U,35241,U,28089,34753,16401,29927,15835,29046,24740,24988,15569,U,
+24695,U,32625,35629,U,24809,19326,21024,15384,15559,24279,30294,21809,6468,
+4862,39171,28124,28845,23745,25005,35343,13943,238,26694,20238,17762,23327,
+25420,40784,40614,25195,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,
+9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,
+8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,
+21304,21353,21430,22794,23424,24027,12083,24191,U,24400,24417,25908,U,30098,U,
+36789,U,168,710,12541,12542,12445,12446,U,U,12293,12294,12295,12540,65339,
+65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,
+12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,
+12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,
+12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,
+12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,
+12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12453,12454,12455,
+12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,
+12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,
+12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,
+12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,
+12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,
+12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,
+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,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,
+11998,12003,U,U,U,643,592,603,596,629,339,248,331,650,618,30849,37561,35023,
+22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,
+9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,
+9576,9564,9553,9552,9581,9582,9584,9583,65517,1351,37595,1503,16325,34124,
+17077,29679,20917,13897,18754,35300,37700,6619,33518,15560,30780,26436,25311,
+18739,35242,672,27571,4869,20395,9453,20488,27945,31364,13824,19121,9491,U,
+894,24484,896,839,28379,1055,U,20737,13434,20750,39020,14147,33814,18852,1159,
+20832,13236,20842,3071,8444,741,9520,1422,12851,6531,23426,34685,1459,15513,
+20914,20920,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,40244,20937,20943,20945,15580,20947,19110,20915,20962,21314,20973,33741,
+26942,14125,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,
+21216,34317,27411,U,35550,21833,28377,16256,2388,16364,21299,U,3042,27851,
+5926,26651,29653,24650,16042,14540,5864,29149,17570,21357,21364,34475,21374,U,
+5526,5651,30694,21395,35483,21408,21419,21422,29607,22386,16217,29596,21441,
+21445,27721,20041,22526,21465,15019,2959,21472,16363,11683,21494,3191,21523,
+28793,21803,26199,27995,21613,27475,3444,21853,21647,21668,18342,5901,3805,
+15796,3405,35260,9880,21831,19693,21551,29719,21894,21929,U,6359,16442,17746,
+17461,26291,4276,22071,26317,12938,26276,26285,22093,22095,30961,22257,38791,
+21502,22272,22255,22253,35686,13859,4687,22342,16805,27758,28811,22338,14001,
+27774,22502,5142,22531,5204,17251,22566,19445,22620,22698,13665,22752,22748,
+4668,22779,23551,22339,41296,17016,37843,13729,22815,26790,14019,28249,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,5694,23076,
+21843,5778,34053,22985,3406,27777,27946,6108,23001,6139,6066,28070,28017,6184,
+5845,23033,28229,23211,23139,14054,18857,U,14088,23190,29797,23251,28577,9556,
+15749,6417,14130,5816,24195,21200,23414,25992,23420,31246,16388,18525,516,
+23509,24928,6708,22988,1445,23539,23453,19728,23557,6980,23571,29646,23572,
+7333,27432,23625,18653,23685,23785,23791,23947,7673,7735,23824,23832,23878,
+7844,23738,24023,33532,14381,18689,8265,8563,33415,14390,15298,24110,27274,U,
+24186,17596,3283,21414,20151,U,21416,6001,24073,24308,33922,24313,24315,14496,
+24316,26686,37915,24333,449,63636,15070,18606,4922,24378,26760,9168,U,9329,
+24419,38845,28270,24434,37696,35382,24487,23990,15711,21072,8042,28920,9832,
+37334,670,35369,24625,26245,6263,14691,15815,13881,22416,10164,31089,15936,
+24734,U,24755,18818,18831,31315,29860,20705,23200,24932,33828,24898,63654,
+28370,24961,20980,1622,24967,23466,16311,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,10335,25043,35741,39261,25040,14642,10624,
+10433,24611,24924,25886,25483,280,25285,6000,25301,11789,25452,18911,14871,
+25656,25592,5006,6140,U,28554,11830,38932,16524,22301,25825,25829,38011,14950,
+25658,14935,25933,28438,18984,18979,25989,25965,25951,12414,26037,18752,19255,
+26065,16600,6185,26080,26083,24543,13312,26136,12791,12792,26180,12708,12709,
+26187,3701,26215,20966,26227,U,7741,12849,34292,12744,21267,30661,10487,39332,
+26370,17308,18977,15147,27130,14274,U,26471,26466,16845,37101,26583,17641,
+26658,28240,37436,26625,13286,28064,26717,13423,27105,27147,35551,26995,26819,
+13773,26881,26880,15666,14849,13884,15232,26540,26977,35402,17148,26934,27032,
+15265,969,33635,20624,27129,13913,8490,27205,14083,27293,15347,26545,27336,
+37276,15373,27421,2339,24798,27445,27508,10189,28341,15067,949,6488,14144,
+21537,15194,27617,16124,27612,27703,9355,18673,27473,27738,33318,27769,15804,
+17605,15805,16804,18700,18688,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,15561,14053,15595,3378,39811,12793,9361,32655,26679,27941,
+28065,28139,28054,27996,28284,28420,18815,16517,28274,34099,28532,20935,U,U,
+33838,35617,U,15919,29779,16258,31180,28239,23185,12363,28664,14093,28573,
+15920,28410,5271,16445,17749,37872,28484,28508,15694,28532,37232,15675,28575,
+16708,28627,16529,16725,16441,16368,16308,16703,20959,16726,16727,16704,25053,
+28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,17015,
+28971,28997,23176,29002,U,23708,17253,29007,37730,17089,28972,17498,18983,
+18978,29114,35816,28861,29198,37954,29205,22801,37955,29220,37697,22021,29230,
+29248,18804,26813,29269,29271,15957,12356,26637,28477,29314,U,29483,18467,
+34859,18669,34820,29480,29486,29647,29610,3130,27182,29641,29769,16866,5863,
+18980,26147,14021,18871,18829,18939,29687,29717,26883,18982,29753,1475,16087,
+U,10413,29792,36530,29767,29668,29814,33721,29804,14128,29812,37873,27180,
+29826,18771,19084,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,16735,19065,35727,23366,35843,6302,29896,6536,29966,U,29982,36569,
+6731,23511,36524,37765,30029,30026,30055,30062,20354,16132,19731,30094,29789,
+30110,30132,30210,30252,30289,30287,30319,30326,25589,30352,33263,14328,26897,
+26894,30369,30373,30391,30412,28575,33890,20637,20861,7708,30494,30502,30528,
+25775,21024,30552,12972,30639,35172,35176,5825,30708,U,4982,18962,26826,30895,
+30919,30931,38565,31022,21984,30935,31028,30897,30220,36792,34948,35627,24707,
+9756,31110,35072,26882,31104,22615,31133,31545,31036,31145,28202,28966,16040,
+31174,37133,31188,
+};
+
+static const struct dbcs_index big5hkscs_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{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},{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},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{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[] = {
+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_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_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,
+24,88,18,34,196,66,162,83,142,30,0,0,0,128,52,135,11,21,209,64,250,61,0,4,210,
+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[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,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,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,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,
+63988,63970,63975,63984,63966,63981,63990,63972,63978,63987,63969,63994,63995,
+63997,63996,50918,51414,N,N,N,51415,N,51416,51417,51418,N,51419,N,51420,51421,
+N,N,N,N,N,N,N,51422,N,N,N,N,N,N,51423,51424,N,N,N,N,N,N,N,51425,N,51426,N,N,
+51427,N,51428,N,51429,N,N,N,N,N,N,N,51430,N,N,N,N,N,51431,N,51432,N,N,N,N,N,N,
+N,51433,N,N,N,51434,N,51435,51436,N,51437,N,N,N,N,N,N,51438,51439,N,N,N,N,N,N,
+51440,N,N,N,N,51441,50893,50912,50913,50914,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,
+50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,51008,
+51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,
+51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,
+51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,
+51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,
+51061,51062,51063,51064,51065,51066,N,N,N,N,N,N,N,51412,51413,50908,50909,N,N,
+51067,51068,51069,51070,51105,51106,51107,51108,51109,51110,51111,51112,51113,
+51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,
+51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,
+51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,
+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,
+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,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,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,
+N,N,N,N,64226,35307,N,N,64227,N,N,N,N,N,N,37064,N,N,N,37594,35161,40181,N,N,N,
+N,N,35162,64231,40866,N,N,N,N,N,64234,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64237,36781,N,N,N,N,N,N,64345,64239,38639,N,40428,N,N,N,40394,N,N,N,N,N,N,
+64877,N,35308,N,N,N,N,N,N,N,N,N,N,N,64324,N,N,40418,N,35957,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,40640,N,40534,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,40825,39623,N,N,64244,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,39073,N,N,N,N,N,N,N,N,N,64248,N,N,N,35312,40519,N,N,40439,N,N,N,N,40915,
+N,39626,N,N,N,N,35313,64249,N,N,N,N,N,N,N,N,N,N,N,N,N,36442,N,35314,N,N,N,N,
+35315,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37469,35665,37600,N,N,35316,N,N,N,N,N,
+N,N,N,N,40916,N,N,N,N,N,N,N,N,35449,N,N,N,N,N,N,N,N,N,N,N,35317,38823,N,N,N,N,
+N,N,N,N,N,N,37818,N,N,N,N,N,40536,N,N,N,N,35318,N,N,N,N,N,40535,N,N,N,N,35319,
+N,35393,N,N,35320,N,N,64241,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35322,N,N,N,
+N,N,N,N,64322,N,64191,N,N,N,N,N,N,N,N,N,64419,N,N,N,N,N,N,N,N,N,64247,N,N,N,N,
+N,N,N,N,N,N,N,40526,N,38108,N,N,N,N,N,38362,40440,40810,N,N,N,N,N,35511,N,N,N,
+N,N,N,N,N,N,N,N,N,64326,N,N,N,N,N,N,N,N,N,35398,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,64327,N,N,N,N,N,N,37192,N,N,N,37598,N,N,N,N,35667,40438,N,
+39898,N,N,N,N,40318,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35325,39396,N,N,
+N,N,N,40515,N,N,N,N,N,N,N,N,N,N,N,40425,N,36690,N,N,N,40437,40432,N,N,N,39399,
+N,N,N,N,N,35773,40431,N,N,N,N,N,N,N,N,N,N,N,40887,N,N,N,N,N,N,N,N,N,N,N,N,
+40400,N,40939,36265,40399,39137,N,40421,N,N,N,N,N,N,N,40392,N,N,N,N,N,N,N,N,N,
+64335,N,N,N,N,N,N,N,N,N,N,N,40427,N,N,N,N,N,N,N,N,N,64340,N,64341,39586,N,
+35542,N,39519,N,N,N,N,N,N,N,N,40693,N,N,N,36791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,39634,40554,40680,N,N,N,N,N,N,N,N,N,N,N,N,35775,37314,40290,
+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,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,
+N,N,N,N,N,N,N,N,N,N,40678,N,N,64367,N,N,N,N,N,36577,N,N,N,N,39805,40062,N,N,N,
+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,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,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,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,
+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,
+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,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39411,N,N,N,36962,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,40789,N,N,N,N,N,N,N,N,N,39929,N,N,N,N,N,N,N,N,N,N,36965,N,N,
+38624,N,N,N,N,N,N,N,39102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36968,N,N,N,
+N,N,36972,N,N,N,N,N,N,N,N,N,N,N,N,38360,N,N,N,N,N,N,N,N,36970,40882,N,N,N,N,N,
+N,N,40878,N,N,40880,N,35245,N,N,N,N,N,N,N,N,36974,N,N,N,N,N,N,N,N,40561,N,N,N,
+N,N,40522,N,N,N,N,N,40924,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35243,N,40888,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36976,N,N,N,N,N,N,N,N,N,N,N,N,
+35683,N,N,N,N,38364,N,N,N,N,N,N,N,N,36977,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64606,N,N,N,N,N,N,N,N,35145,N,N,N,N,N,38491,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+35920,N,N,N,38054,N,N,N,36821,40563,N,N,N,N,N,36981,N,N,N,N,39415,N,N,N,N,N,N,
+N,N,N,N,N,N,N,36031,N,N,N,N,N,N,39417,N,38499,38329,N,N,N,N,N,N,N,N,N,38100,N,
+N,N,N,N,N,64762,N,N,N,N,36983,N,N,37035,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40269,
+N,N,39418,N,N,N,N,37603,N,38843,N,N,36984,N,N,N,N,N,N,N,N,39419,N,N,38880,N,N,
+N,N,N,N,N,N,38620,N,N,N,N,N,N,N,N,N,40104,N,N,38770,N,N,N,N,37952,N,N,N,N,N,
+37618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39421,N,N,
+39420,N,N,N,N,N,N,N,63959,38474,N,N,N,38616,39422,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,36939,N,N,N,N,N,N,64065,N,N,N,N,N,N,N,39488,N,38747,N,N,N,N,N,
+39489,37341,N,N,N,N,N,37884,39490,39491,N,38489,N,N,N,N,N,N,39492,36945,N,N,N,
+38079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37026,N,N,N,40107,38774,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64597,65093,38056,39493,
+64075,40417,N,N,38617,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38772,N,N,
+65013,N,N,N,37605,N,38469,37338,N,37027,N,N,41055,N,N,N,N,37039,38847,N,N,N,
+37196,N,N,N,N,38522,N,N,N,37342,N,N,39494,65200,38777,37996,N,N,N,N,N,N,N,N,
+39000,N,N,N,N,N,N,N,N,N,N,N,37478,N,N,N,37883,N,N,N,N,N,N,N,N,N,N,N,N,39495,N,
+N,N,N,N,N,N,N,N,N,38729,N,N,38728,N,37706,N,40162,N,N,N,N,N,N,37476,N,N,N,N,
+37343,N,N,N,N,N,N,N,64377,N,N,N,N,N,N,N,38615,N,N,N,N,37699,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64971,65146,N,37339,35946,38831,N,N,38365,N,N,N,37704,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,39499,N,N,N,64581,N,39501,N,N,N,N,N,N,37308,37090,37044,38369,
+N,N,N,N,N,39502,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39503,N,N,N,65088,65091,N,N,N,
+N,N,N,N,N,N,38621,N,N,N,N,N,N,39505,N,N,N,38567,N,N,37040,N,N,N,N,N,N,N,N,N,
+40014,N,37955,N,N,N,N,36538,N,N,N,N,N,N,N,N,N,N,N,N,39506,N,64705,N,N,N,N,N,N,
+N,N,N,35817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40111,N,N,35837,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39612,N,39608,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39598,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,39591,39507,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,40308,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35818,N,N,N,N,N,N,35819,N,N,N,N,N,37042,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,38377,38376,N,38374,N,N,N,N,N,N,37045,N,39508,N,N,N,
+37043,38375,N,N,35664,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35820,N,N,N,
+N,N,N,N,N,N,N,N,39510,35835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39511,N,
+N,N,N,41130,N,N,N,N,N,N,N,N,40870,N,N,N,39372,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40025,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39349,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,37054,N,N,N,N,N,40879,N,N,N,N,N,N,N,N,N,N,N,N,N,38386,N,N,N,N,N,N,37055,N,
+N,N,N,N,N,N,N,N,N,N,N,37057,N,65252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37060,N,N,
+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,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,51405,N,51406,N,N,N,N,N,N,N,N,63998,
+};
+
+static const struct unim_index big5hkscs_bmp_encmap[256] = {
+{__big5hkscs_bmp_encmap+0,168,252},{__big5hkscs_bmp_encmap+85,0,220},{
+__big5hkscs_bmp_encmap+306,80,198},{0,0,0},{__big5hkscs_bmp_encmap+425,1,81},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{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},{
+__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,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{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[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,
+N,N,51324,N,N,N,N,N,N,N,N,N,39604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34894,34891,
+51322,34888,N,N,N,34887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,41206,34885,N,34899,N,N,N,N,N,N,N,N,N,64685,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,
+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,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35498,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39888,38224,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37574,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+39078,38214,N,N,N,N,N,N,N,N,N,N,N,N,64867,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64194,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40643,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,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,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,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,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35582,N,N,N,N,N,N,35416,
+35747,35751,N,N,N,N,N,39651,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37473,N,N,N,N,N,N,N,N,N,N,40407,40573,40615,40619,36930,N,N,
+N,N,N,N,N,N,35705,35706,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39654,N,N,N,N,N,N,N,N,N,N,N,N,39653,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35454,N,N,N,N,N,40516,39655,35452,35697,N,
+N,39657,N,N,N,N,N,N,N,N,N,N,N,N,39658,N,N,N,N,N,N,N,N,N,N,N,N,N,39659,N,N,N,N,
+N,N,35517,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64334,N,N,N,N,N,N,N,N,N,
+N,39661,35577,40547,N,N,N,N,N,35657,35534,35694,N,N,N,N,N,35560,N,N,N,39662,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37582,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35418,35707,
+35708,39663,N,N,N,N,N,N,N,N,N,N,N,39664,N,35578,N,N,N,N,N,N,N,35137,N,N,35698,
+N,N,N,N,N,N,35571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35752,N,N,N,N,N,N,40622,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40562,64371,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64351,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37050,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37374,40694,
+N,N,N,N,N,N,38893,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39667,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,41198,38524,37701,39022,64086,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39669,N,N,
+N,64587,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39668,65246,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,64695,N,N,N,N,N,N,N,N,N,38897,N,N,N,38855,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40139,
+37440,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,40168,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37373,38734,N,N,64360,N,N,N,N,N,N,N,
+N,N,N,N,N,N,38764,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36034,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38888,N,64362,35700,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,36583,N,N,N,N,N,N,N,N,N,N,N,N,64968,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,37441,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38561,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,36595,39671,N,N,N,N,N,N,N,N,N,N,36774,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,64214,40135,N,N,N,N,N,N,N,N,64215,N,N,N,N,N,39672,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64417,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36549,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+64420,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64450,N,39617,N,N,N,N,N,37370,65243,38827,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37191,N,64433,N,N,N,N,N,N,N,N,N,36842,N,N,N,N,N,N,38098,65121,64206,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,37613,37363,37830,N,37722,64251,N,N,37615,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+38983,37734,38997,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38630,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40771,40874,38106,37614,64687,64507,N,
+36601,37366,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37732,N,N,N,N,38133,40118,64429,
+38990,36676,38653,N,N,N,N,N,N,N,N,N,N,N,N,N,39673,N,N,N,39674,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,38761,38356,38987,64426,N,N,39036,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,37354,N,N,N,N,N,40367,40389,N,37361,36529,38825,64428,64696,40121,N,N,N,N,
+N,N,N,64432,64722,37835,N,N,39677,N,N,N,N,N,N,N,N,N,N,N,37364,35756,41045,N,N,
+N,N,38260,N,N,N,N,38334,N,N,N,N,N,N,N,N,N,N,N,N,38829,N,N,N,N,N,N,N,N,N,N,N,
+36585,N,N,37624,38846,37228,38058,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64611,N,
+N,N,40390,N,N,N,N,N,N,N,38837,37560,37359,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,65190,38752,37720,38262,36780,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,37356,38836,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37367,N,N,N,N,
+38730,64329,38264,37820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,37334,37717,37718,38993,N,N,N,N,N,N,N,N,N,N,36856,64448,37874,N,N,
+37072,N,N,N,N,N,N,40004,N,N,N,N,N,37461,N,N,N,N,37731,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,37285,N,N,N,N,N,N,N,N,41197,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,64875,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,37713,N,N,N,35927,N,N,64120,N,N,N,N,65192,N,N,N,N,N,N,N,N,N,N,N,N,N,37712,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,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,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,N,N,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,N,N,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,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,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,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,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,N,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,N,N,N,N,N,N,N,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,
+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,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,
+N,N,N,N,N,N,N,N,N,N,N,N,37464,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,36552,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,38068,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+37857,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37855,N,N,N,N,N,64752,
+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,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,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,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,
+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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,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,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,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,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,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,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,
+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,N,N,N,N,N,N,N,N,N,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,
+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,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,
+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,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,
+N,N,N,N,N,N,N,40284,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37758,N,N,N,N,N,N,N,N,N,N,
+N,N,N,39084,N,N,40286,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64976,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64864,N,
+N,N,N,N,N,N,N,N,N,N,40143,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37085,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37088,37107,N,N,39089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37104,N,N,N,N,
+N,N,N,N,N,N,N,37821,N,N,N,N,N,N,N,N,38327,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40774,N,N,N,N,N,N,N,N,36427,38488,N,N,N,N,N,N,N,N,N,N,35404,N,40291,40655,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40293,N,N,N,N,N,N,N,40294,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+40292,N,N,N,N,N,N,N,N,N,N,35436,35545,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40295,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,35440,35827,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,37200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,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,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,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,
+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,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,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,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,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,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,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,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] = {
+{__big5hkscs_nonbmp_encmap+0,33,238},{__big5hkscs_nonbmp_encmap+206,12,242},{
+__big5hkscs_nonbmp_encmap+437,4,229},{__big5hkscs_nonbmp_encmap+663,10,252},{
+__big5hkscs_nonbmp_encmap+906,19,254},{__big5hkscs_nonbmp_encmap+1142,71,235},
+{__big5hkscs_nonbmp_encmap+1307,17,118},{__big5hkscs_nonbmp_encmap+1409,14,121
+},{__big5hkscs_nonbmp_encmap+1517,44,213},{__big5hkscs_nonbmp_encmap+1687,22,
+231},{__big5hkscs_nonbmp_encmap+1897,17,205},{__big5hkscs_nonbmp_encmap+2086,
+13,255},{__big5hkscs_nonbmp_encmap+2329,11,255},{__big5hkscs_nonbmp_encmap+
+2574,21,200},{__big5hkscs_nonbmp_encmap+2754,4,251},{__big5hkscs_nonbmp_encmap
++3002,29,237},{__big5hkscs_nonbmp_encmap+3211,20,246},{
+__big5hkscs_nonbmp_encmap+3438,47,217},{__big5hkscs_nonbmp_encmap+3609,60,254
+},{__big5hkscs_nonbmp_encmap+3804,2,254},{__big5hkscs_nonbmp_encmap+4057,19,
+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,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
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{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+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},
+};
+
diff --git a/pypy/translator/c/src/cjkcodecs/mappings_jisx0213_pair.h b/pypy/translator/c/src/cjkcodecs/mappings_jisx0213_pair.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/mappings_jisx0213_pair.h
@@ -0,0 +1,59 @@
+#define JISX0213_ENCPAIRS 46
+#ifdef EXTERN_JISX0213_PAIR
+static const struct widedbcs_index *jisx0213_pair_decmap;
+static const struct pair_encodemap *jisx0213_pair_encmap;
+#else
+static const ucs4_t __jisx0213_pair_decmap[49] = {
+810234010,810365082,810496154,810627226,810758298,816525466,816656538,
+816787610,816918682,817049754,817574042,818163866,818426010,838283418,
+15074048,U,U,U,39060224,39060225,42730240,42730241,39387904,39387905,39453440,
+39453441,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,48825061,48562921,
+};
+
+static const struct widedbcs_index jisx0213_pair_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_pair_decmap
++0,119,123},{__jisx0213_pair_decmap+5,119,126},{__jisx0213_pair_decmap+13,120,
+120},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_pair_decmap+14,68,102},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+};
+
+static const struct pair_encodemap jisx0213_pair_encmap[JISX0213_ENCPAIRS] = {
+{0x00e60000,0x295c},{0x00e60300,0x2b44},{0x02540000,0x2b38},{0x02540300,0x2b48
+},{0x02540301,0x2b49},{0x02590000,0x2b30},{0x02590300,0x2b4c},{0x02590301,
+0x2b4d},{0x025a0000,0x2b43},{0x025a0300,0x2b4e},{0x025a0301,0x2b4f},{
+0x028c0000,0x2b37},{0x028c0300,0x2b4a},{0x028c0301,0x2b4b},{0x02e50000,0x2b60
+},{0x02e502e9,0x2b66},{0x02e90000,0x2b64},{0x02e902e5,0x2b65},{0x304b0000,
+0x242b},{0x304b309a,0x2477},{0x304d0000,0x242d},{0x304d309a,0x2478},{
+0x304f0000,0x242f},{0x304f309a,0x2479},{0x30510000,0x2431},{0x3051309a,0x247a
+},{0x30530000,0x2433},{0x3053309a,0x247b},{0x30ab0000,0x252b},{0x30ab309a,
+0x2577},{0x30ad0000,0x252d},{0x30ad309a,0x2578},{0x30af0000,0x252f},{
+0x30af309a,0x2579},{0x30b10000,0x2531},{0x30b1309a,0x257a},{0x30b30000,0x2533
+},{0x30b3309a,0x257b},{0x30bb0000,0x253b},{0x30bb309a,0x257c},{0x30c40000,
+0x2544},{0x30c4309a,0x257d},{0x30c80000,0x2548},{0x30c8309a,0x257e},{
+0x31f70000,0x2675},{0x31f7309a,0x2678},
+};
+#endif
diff --git a/pypy/translator/c/src/cjkcodecs/mappings_jp.h b/pypy/translator/c/src/cjkcodecs/mappings_jp.h
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/cjkcodecs/mappings_jp.h
@@ -0,0 +1,4765 @@
+static const ucs2_t __jisx0208_decmap[6956] = {
+12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,
+65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,
+12295,12540,8213,8208,65295,92,12316,8214,65372,8230,8229,8216,8217,8220,8221,
+65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,
+12301,12302,12303,12304,12305,65291,8722,177,215,247,65309,8800,65308,65310,
+8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,162,163,65285,
+65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,
+9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,U,U,U,U,U,U,U,U,U,U,U,
+8712,8715,8838,8839,8834,8835,8746,8745,U,U,U,U,U,U,U,U,8743,8744,172,8658,
+8660,8704,8707,U,U,U,U,U,U,U,U,U,U,U,8736,8869,8978,8706,8711,8801,8786,8810,
+8811,8730,8765,8733,8757,8747,8748,U,U,U,U,U,U,U,8491,8240,9839,9837,9834,
+8224,8225,182,U,U,U,U,9711,65296,65297,65298,65299,65300,65301,65302,65303,
+65304,65305,U,U,U,U,U,U,U,65313,65314,65315,65316,65317,65318,65319,65320,
+65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,
+65334,65335,65336,65337,65338,U,U,U,U,U,U,65345,65346,65347,65348,65349,65350,
+65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,
+65364,65365,65366,65367,65368,65369,65370,12353,12354,12355,12356,12357,12358,
+12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,
+12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,
+12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,
+12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,
+12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,
+12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,
+12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,
+12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,
+12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,
+12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,
+12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,
+12528,12529,12530,12531,12532,12533,12534,913,914,915,916,917,918,919,920,921,
+922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,U,U,U,U,U,U,U,U,
+945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,
+965,966,967,968,969,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,
+1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,
+1065,1066,1067,1068,1069,1070,1071,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,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,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,
+9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,
+9509,9528,9538,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,
+33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,
+23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,
+26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,
+23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,
+32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,
+19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,
+23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,
+28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,
+27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,
+39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,
+31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,
+38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,
+28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,
+22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,
+27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,
+33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,
+20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,
+26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,
+33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,
+25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,
+22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,
+26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,
+21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,
+39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,
+25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,
+38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,
+28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,
+21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,
+33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,
+24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,
+25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,
+30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,
+36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,
+24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,
+21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,
+26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,
+31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,
+20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,
+35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,
+40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,
+24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,
+31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,
+36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,
+20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,
+24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,
+37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,
+26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,
+31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,
+21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,
+21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,
+27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,
+34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,
+22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,
+26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,
+35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,
+38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,
+20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,
+25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,
+36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,
+28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,
+22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,
+32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,
+21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,
+35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,
+21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,
+24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,
+26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,
+30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,
+33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,
+38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,
+35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,
+33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,
+23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,
+20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,
+22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,
+25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,
+35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,
+32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,
+31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,
+25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,
+20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,
+35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,
+21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,
+25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,
+31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,
+36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,
+27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,
+27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,
+23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,
+23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,
+35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,
+37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,
+31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,
+22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,
+32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,
+38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,
+37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,
+36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,
+28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,
+26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,
+24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,
+22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,
+25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,
+27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,
+31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,
+35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,
+20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,
+30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,
+32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,
+23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,
+30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,
+38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,
+38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,
+28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,
+23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,
+25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,
+25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,
+22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,
+38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,
+36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,
+38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,
+25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,
+31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,
+37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,
+22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,
+31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,
+21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,
+25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,
+32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,
+38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,
+24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,
+20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,
+21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,
+23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,
+33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,
+38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,
+35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,
+33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,
+22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,
+32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,
+20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,
+39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,
+20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,
+27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,
+24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,
+32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,
+25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,
+37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,
+37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,
+20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,
+25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,
+36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,
+37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,
+28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,
+21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,
+37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,
+20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,
+26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,
+31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,
+37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,
+30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,
+30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,
+33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,
+26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,
+39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,
+36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,
+35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,
+31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,
+35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,
+33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,
+37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,
+34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,
+33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,
+31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,
+39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,
+21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,
+32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,
+30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,
+26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,
+36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,
+40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,
+31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,
+29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,
+34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,
+20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,
+28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,
+25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,
+24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,
+39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,
+25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,
+38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,
+29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,
+37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,
+27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,
+24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,
+33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,
+20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,
+32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,
+22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,
+26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,
+21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,
+26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,
+39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,
+30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,
+21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,
+38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,
+20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,
+32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,
+32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,
+36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,
+28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,
+22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,
+25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,
+33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,
+32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,
+20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,
+29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,
+30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,
+26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,
+30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,
+26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,
+39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,
+38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,
+28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,
+36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,
+31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,
+35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,
+26880,28286,30871,33109,24332,19984,19989,20010,20017,20022,20028,20031,20034,
+20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,
+20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,
+20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,
+20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,
+20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,
+20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,
+20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,
+20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,
+20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,
+20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,
+20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,
+20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,
+21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,
+21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,
+21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,
+21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,
+21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,
+21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,
+26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,
+21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,
+21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,
+21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,
+21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,
+21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,
+21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,
+22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,
+22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,
+22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,
+22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,
+22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,
+22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,
+22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,
+22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,
+22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,
+22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,
+22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,
+22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,
+23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,
+23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,
+23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,
+23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,
+23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,
+23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,
+23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,
+23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,
+23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,
+23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,
+23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,
+24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,
+24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,
+24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,
+24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,
+24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,
+24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,
+24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,
+24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,
+24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,
+24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,
+24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,
+24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,
+24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,
+24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,
+24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,
+32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,
+25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,
+25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,
+25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,
+25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,
+25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,
+25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,
+25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,
+25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,
+25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,
+25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,
+25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,
+25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,
+26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,
+26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,
+26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,
+26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,
+26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,
+26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,
+26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,
+26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,
+26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,
+26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,
+26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,
+26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,
+26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,
+27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,
+27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,
+27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,
+27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,
+27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,
+27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,
+27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,
+27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,
+27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,
+27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,
+27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,
+27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,
+34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,
+27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,
+28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,
+28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,
+28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,
+28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,
+28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,
+28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,
+28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,
+28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,
+28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,
+28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,
+29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,
+29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,
+29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,
+29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,
+29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,
+29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,
+29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,
+29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,
+29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,
+29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,
+29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,
+30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,
+30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,
+30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,
+30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,
+30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,
+30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,
+30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,
+30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,
+30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,
+30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,
+30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,
+30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,
+30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,
+30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,
+31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,
+31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,
+31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,
+31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,
+31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,
+31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,
+31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,
+31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,
+31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,
+31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,
+31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,
+31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,
+31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,
+31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,
+32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,
+32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,
+32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,
+32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,
+32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,
+32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,
+32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,
+32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,
+32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,
+32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,
+32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,
+32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,
+32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,
+33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,
+33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,
+33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,
+33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,
+33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,
+33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,
+33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,
+33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,
+33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,
+33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,
+33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,
+33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,
+33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,
+33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,
+34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,
+34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,
+34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,
+34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,
+34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,
+34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,
+34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,
+34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,
+34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,
+34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,
+34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,
+34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,
+34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,
+34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,
+35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,
+35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,
+35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,
+35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,
+35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,
+35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,
+35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,
+35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,
+35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,
+35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,
+35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,
+35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,
+36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,
+36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,
+36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,
+36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,
+36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,
+36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,
+36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,
+36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,
+36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,
+36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,
+36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,
+36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,
+36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,
+37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,
+37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,
+37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,
+37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,
+37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,
+37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,
+37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,
+37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,
+37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,
+37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,
+38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,
+28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,
+38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,
+38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,
+38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,
+38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,
+38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,
+38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,
+38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,
+38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,
+39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,
+39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,
+39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,
+39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,
+39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,
+39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,
+39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,
+39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,
+39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,
+39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,
+39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,
+39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,
+39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,
+40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,
+40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,
+40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,
+40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,
+40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,
+40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,
+40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,
+40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,
+40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,
+29081,
+};
+
+static const struct dbcs_index jisx0208_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0208_decmap+0,33,126},{__jisx0208_decmap
++94,33,126},{__jisx0208_decmap+188,48,122},{__jisx0208_decmap+263,33,115},{
+__jisx0208_decmap+346,33,118},{__jisx0208_decmap+432,33,88},{__jisx0208_decmap
++488,33,113},{__jisx0208_decmap+569,33,64},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{__jisx0208_decmap+601,33,126},{__jisx0208_decmap+695,33,
+126},{__jisx0208_decmap+789,33,126},{__jisx0208_decmap+883,33,126},{
+__jisx0208_decmap+977,33,126},{__jisx0208_decmap+1071,33,126},{
+__jisx0208_decmap+1165,33,126},{__jisx0208_decmap+1259,33,126},{
+__jisx0208_decmap+1353,33,126},{__jisx0208_decmap+1447,33,126},{
+__jisx0208_decmap+1541,33,126},{__jisx0208_decmap+1635,33,126},{
+__jisx0208_decmap+1729,33,126},{__jisx0208_decmap+1823,33,126},{
+__jisx0208_decmap+1917,33,126},{__jisx0208_decmap+2011,33,126},{
+__jisx0208_decmap+2105,33,126},{__jisx0208_decmap+2199,33,126},{
+__jisx0208_decmap+2293,33,126},{__jisx0208_decmap+2387,33,126},{
+__jisx0208_decmap+2481,33,126},{__jisx0208_decmap+2575,33,126},{
+__jisx0208_decmap+2669,33,126},{__jisx0208_decmap+2763,33,126},{
+__jisx0208_decmap+2857,33,126},{__jisx0208_decmap+2951,33,126},{
+__jisx0208_decmap+3045,33,126},{__jisx0208_decmap+3139,33,126},{
+__jisx0208_decmap+3233,33,126},{__jisx0208_decmap+3327,33,126},{
+__jisx0208_decmap+3421,33,126},{__jisx0208_decmap+3515,33,83},{
+__jisx0208_decmap+3566,33,126},{__jisx0208_decmap+3660,33,126},{
+__jisx0208_decmap+3754,33,126},{__jisx0208_decmap+3848,33,126},{
+__jisx0208_decmap+3942,33,126},{__jisx0208_decmap+4036,33,126},{
+__jisx0208_decmap+4130,33,126},{__jisx0208_decmap+4224,33,126},{
+__jisx0208_decmap+4318,33,126},{__jisx0208_decmap+4412,33,126},{
+__jisx0208_decmap+4506,33,126},{__jisx0208_decmap+4600,33,126},{
+__jisx0208_decmap+4694,33,126},{__jisx0208_decmap+4788,33,126},{
+__jisx0208_decmap+4882,33,126},{__jisx0208_decmap+4976,33,126},{
+__jisx0208_decmap+5070,33,126},{__jisx0208_decmap+5164,33,126},{
+__jisx0208_decmap+5258,33,126},{__jisx0208_decmap+5352,33,126},{
+__jisx0208_decmap+5446,33,126},{__jisx0208_decmap+5540,33,126},{
+__jisx0208_decmap+5634,33,126},{__jisx0208_decmap+5728,33,126},{
+__jisx0208_decmap+5822,33,126},{__jisx0208_decmap+5916,33,126},{
+__jisx0208_decmap+6010,33,126},{__jisx0208_decmap+6104,33,126},{
+__jisx0208_decmap+6198,33,126},{__jisx0208_decmap+6292,33,126},{
+__jisx0208_decmap+6386,33,126},{__jisx0208_decmap+6480,33,126},{
+__jisx0208_decmap+6574,33,126},{__jisx0208_decmap+6668,33,126},{
+__jisx0208_decmap+6762,33,126},{__jisx0208_decmap+6856,33,126},{
+__jisx0208_decmap+6950,33,38},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+};
+
+static const ucs2_t __jisx0212_decmap[6179] = {
+728,711,184,729,733,175,731,730,126,900,901,U,U,U,U,U,U,U,U,161,166,191,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,186,170,
+169,174,8482,164,8470,902,904,905,906,938,U,908,U,910,939,U,911,U,U,U,U,940,
+941,942,943,970,912,972,962,973,971,944,974,1026,1027,1028,1029,1030,1031,
+1032,1033,1034,1035,1036,1038,1039,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,
+1116,1118,1119,198,272,U,294,U,306,U,321,319,U,330,216,338,U,358,222,U,U,U,U,
+U,U,U,U,U,U,U,U,U,U,U,U,230,273,240,295,305,307,312,322,320,329,331,248,339,
+223,359,254,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,
+201,200,203,202,282,278,274,280,U,284,286,290,288,292,205,204,207,206,463,304,
+298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,
+213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,
+366,360,471,475,473,469,372,221,376,374,377,381,379,225,224,228,226,259,462,
+257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,
+285,287,U,289,293,237,236,239,238,464,U,299,303,297,309,311,314,318,316,324,
+328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,
+355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,
+375,378,382,380,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,
+20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,
+20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,
+20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,
+20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,
+20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,
+20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,
+20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,
+20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,
+20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,
+20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,
+20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,
+20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,
+20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,
+20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,
+20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,
+20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,
+20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,
+20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,
+20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,
+20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,
+20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,
+20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,
+20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,
+21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,
+21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,
+21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,
+21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,
+21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,
+21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,
+21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,
+21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,
+21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,
+21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,
+21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,
+21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,
+21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,
+21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,
+21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,
+21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,
+21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,
+21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,
+21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,
+21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,
+21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,
+22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,
+22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,
+22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,
+22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,
+22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,
+22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,
+22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,
+22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,
+22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,
+22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,
+22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,
+22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,
+22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,
+22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,
+22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,
+22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,
+22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,
+22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,
+22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,
+22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,
+22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,
+22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,
+22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,
+23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,
+23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,
+23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,
+23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,
+23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,
+23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,
+23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,
+23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,
+23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,
+23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,
+23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,
+23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,
+23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,
+23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,
+23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,
+23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,
+23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,
+23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,
+23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,
+24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,
+24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,
+24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,
+24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,
+24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,
+24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,
+24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,
+24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,
+24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,
+24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,
+24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,
+24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,
+24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,
+24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,
+24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,
+24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,
+24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,
+24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,
+24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,
+24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,
+24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,
+25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,
+25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,
+25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,
+25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,
+25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,
+25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,
+25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,
+25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,
+25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,
+25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,
+25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,
+25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,
+25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,
+25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,
+25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,
+25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,
+25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,
+25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,
+25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,
+25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,
+26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,
+26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,
+26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,
+26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,
+26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,
+26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,
+26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,
+26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,
+26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,
+26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,
+26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,
+26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,
+26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,
+26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,
+26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,
+26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,
+26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,
+26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,
+26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,
+26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,
+26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,
+27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,
+27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,
+27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,
+27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,
+27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,
+27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,
+27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,
+27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,
+27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,
+27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,
+27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,
+27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,
+27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,
+27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,
+27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,
+27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,
+27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,
+27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,
+27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,
+27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,
+28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,
+28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,
+28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,
+28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,
+28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,
+28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,
+28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,
+28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,
+28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,
+28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,
+28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,
+28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,
+28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,
+28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,
+28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,
+28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,
+28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,
+28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,
+28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,
+29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,
+29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,
+29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,
+29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,
+29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,
+29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,
+29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,
+29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,
+29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,
+29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,
+29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,
+29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,
+29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,
+29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,
+29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,
+29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,
+29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,
+29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,
+29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,
+29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,
+29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,
+29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,
+29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,
+30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,
+30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,
+30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,
+30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,
+30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,
+30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,
+30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,
+30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,
+30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,
+30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,
+30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,
+30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,
+30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,
+30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,
+30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,
+30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,
+30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,
+30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,
+30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,
+30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,
+30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,
+30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,
+30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,
+31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,
+31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,
+31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,
+31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,
+31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,
+31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,
+31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,
+31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,
+31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,
+31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,
+31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,
+31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,
+31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,
+31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,
+31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,
+31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,
+31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,
+31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,
+31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,
+31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,
+31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,
+31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,
+31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,
+32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,
+32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,
+32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,
+32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,
+32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,
+32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,
+32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,
+32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,
+32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,
+32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,
+32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,
+32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,
+32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,
+32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,
+32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,
+32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,
+32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,
+32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,
+33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,
+33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,
+33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,
+33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,
+33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,
+33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,
+33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,
+33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,
+33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,
+33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,
+33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,
+33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,
+33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,
+33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,
+33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,
+33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,
+33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,
+33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,
+33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,
+33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,
+33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,
+33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,
+34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,
+34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,
+34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,
+34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,
+34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,
+34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,
+34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,
+34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,
+34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,
+34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,
+34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,
+34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,
+34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,
+34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,
+34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,
+34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,
+34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,
+34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,
+34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,
+34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,
+34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,
+34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,
+34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,
+34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,
+35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,
+35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,
+35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,
+35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,
+35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,
+35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,
+35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,
+35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,
+35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,
+35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,
+35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,
+35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,
+35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,
+35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,
+35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,
+35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,
+35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,
+35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,
+35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,
+35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,
+36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,
+36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,
+36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,
+36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,
+36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,
+36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,
+36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,
+36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,
+36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,
+36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,
+36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,
+36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,
+36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,
+36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,
+36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,
+36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,
+36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,
+36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,
+36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,
+37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,
+37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,
+37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,
+37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,
+37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,
+37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,
+37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,
+37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,
+37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,
+37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,
+37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,
+37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,
+37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,
+37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,
+37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,
+37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,
+37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,
+37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,
+37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,
+37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,
+37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,
+37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,
+37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,
+37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,
+37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,
+37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,
+37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,
+37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,
+37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,
+37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,
+37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,
+38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,
+38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,
+38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,
+38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,
+38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,
+38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,
+38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,
+38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,
+38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,
+38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,
+38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,
+38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,
+38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,
+38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,
+38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,
+38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,
+39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,
+39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,
+39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,
+39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,
+39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,
+39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,
+39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,
+39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,
+39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,
+39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,
+39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,
+39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,
+39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,
+39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,
+39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,
+39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,
+39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,
+39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,
+39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,
+39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,
+39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,
+39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,
+40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,
+40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,
+40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,
+40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,
+40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,
+40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,
+40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,
+40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,
+40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,
+40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,
+40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,
+40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,
+40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,
+40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,
+40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,
+40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,
+40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,
+40855,40862,40865,40866,40867,40869,
+};
+
+static const struct dbcs_index jisx0212_decmap[256] = {
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0212_decmap+0,47,113},{0,0,0},{
+0,0,0},{0,0,0},{__jisx0212_decmap+67,97,124},{__jisx0212_decmap+95,66,126},{0,
+0,0},{__jisx0212_decmap+156,33,80},{__jisx0212_decmap+204,33,119},{
+__jisx0212_decmap+291,33,119},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+__jisx0212_decmap+378,33,126},{__jisx0212_decmap+472,33,126},{
+__jisx0212_decmap+566,33,126},{__jisx0212_decmap+660,33,126},{
+__jisx0212_decmap+754,33,126},{__jisx0212_decmap+848,33,126},{
+__jisx0212_decmap+942,33,126},{__jisx0212_decmap+1036,33,126},{
+__jisx0212_decmap+1130,33,126},{__jisx0212_decmap+1224,33,126},{
+__jisx0212_decmap+1318,33,126},{__jisx0212_decmap+1412,33,126},{
+__jisx0212_decmap+1506,33,126},{__jisx0212_decmap+1600,33,126},{
+__jisx0212_decmap+1694,33,126},{__jisx0212_decmap+1788,33,126},{
+__jisx0212_decmap+1882,33,126},{__jisx0212_decmap+1976,33,126},{
+__jisx0212_decmap+2070,33,126},{__jisx0212_decmap+2164,33,126},{
+__jisx0212_decmap+2258,33,126},{__jisx0212_decmap+2352,33,126},{
+__jisx0212_decmap+2446,33,126},{__jisx0212_decmap+2540,33,126},{
+__jisx0212_decmap+2634,33,126},{__jisx0212_decmap+2728,33,126},{
+__jisx0212_decmap+2822,33,126},{__jisx0212_decmap+2916,33,126},{
+__jisx0212_decmap+3010,33,126},{__jisx0212_decmap+3104,33,126},{
+__jisx0212_decmap+3198,33,126},{__jisx0212_decmap+3292,33,126},{
+__jisx0212_decmap+3386,33,126},{__jisx0212_decmap+3480,33,126},{
+__jisx0212_decmap+3574,33,126},{__jisx0212_decmap+3668,33,126},{
+__jisx0212_decmap+3762,33,126},{__jisx0212_decmap+3856,33,126},{
+__jisx0212_decmap+3950,33,126},{__jisx0212_decmap+4044,33,126},{
+__jisx0212_decmap+4138,33,126},{__jisx0212_decmap+4232,33,126},{
+__jisx0212_decmap+4326,33,126},{__jisx0212_decmap+4420,33,126},{
+__jisx0212_decmap+4514,33,126},{__jisx0212_decmap+4608,33,126},{
+__jisx0212_decmap+4702,33,126},{__jisx0212_decmap+4796,33,126},{
+__jisx0212_decmap+4890,33,126},{__jisx0212_decmap+4984,33,126},{
+__jisx0212_decmap+5078,33,126},{__jisx0212_decmap+5172,33,126},{
+__jisx0212_decmap+5266,33,126},{__jisx0212_decmap+5360,33,126},{
+__jisx0212_decmap+5454,33,126},{__jisx0212_decmap+5548,33,126},{
+__jisx0212_decmap+5642,33,126},{__jisx0212_decmap+5736,33,126},{
+__jisx0212_decmap+5830,33,126},{__jisx0212_decmap+5924,33,126},{
+__jisx0212_decmap+6018,33,126},{__jisx0212_decmap+6112,33,99},{0,0,0},{0,0,0},
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
+};
+
+static const DBCHAR __jisxcommon_encmap[22016] = {
+8512,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41527,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41538,
+8561,8562,41584,N,41539,8568,8495,41581,41580,N,8780,N,41582,41524,8555,8542,
+N,N,8493,N,8825,N,41521,N,41579,N,N,N,N,41540,43554,43553,43556,43562,43555,
+43561,43297,43566,43570,43569,43572,43571,43584,43583,43586,43585,N,43600,
+43602,43601,43604,43608,43603,8543,43308,43619,43618,43621,43620,43634,43312,
+43342,43810,43809,43812,43818,43811,43817,43329,43822,43826,43825,43828,43827,
+43840,43839,43842,43841,43331,43856,43858,43857,43860,43864,43859,8544,43340,
+43875,43874,43877,43876,43890,43344,43891,43559,43815,43557,43813,43560,43816,
+43563,43819,43564,43820,43567,43823,43565,43821,43568,43824,43298,43330,43575,
+43831,N,N,43574,43830,43576,43832,43573,43829,43578,43834,43579,43835,43581,
+43837,43580,N,43582,43838,43300,43332,43591,43847,43589,43845,N,N,43590,43846,
+43588,43333,43302,43334,43592,43848,43593,43849,43335,43594,43850,43596,43852,
+43595,43851,43305,43337,43304,43336,43597,43853,43599,43855,43598,43854,43338,
+43307,43339,43607,43863,N,N,43606,43862,43309,43341,43609,43865,43611,43867,
+43610,43866,43612,43868,43613,43869,43615,43871,43614,43870,43617,43873,43616,
+43872,43311,43343,43628,43884,43625,43881,43622,43878,43627,43883,43624,43880,
+43626,43882,43633,43889,43636,43892,43635,43637,43893,43639,43895,43638,43894,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+43558,43814,43587,43843,43605,43861,43623,43879,43632,43888,43629,43885,43631,
+43887,43630,43886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43833,41520,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41519,41522,41526,41525,N,41523,41528,41529,
+42593,N,42594,42595,42596,N,42599,N,42601,42604,42614,9761,9762,9763,9764,
+9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,N,9778,9779,
+9780,9781,9782,9783,9784,42597,42602,42609,42610,42611,42612,42619,9793,9794,
+9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,
+42616,9810,9811,9812,9813,9814,9815,9816,42613,42618,42615,42617,42620,10023,
+42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,N,42829,
+42830,10017,10018,10019,10020,10021,10022,10024,10025,10026,10027,10028,10029,
+10030,10031,10032,10033,10034,10035,10036,10037,10038,10039,10040,10041,10042,
+10043,10044,10045,10046,10047,10048,10049,10065,10066,10067,10068,10069,10070,
+10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,
+10085,10086,10087,10088,10089,10090,10091,10092,10093,10094,10095,10096,10097,
+N,10071,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,N,
+42877,42878,8510,N,N,N,N,8509,8514,N,8518,8519,N,N,8520,8521,N,N,8823,8824,N,
+N,N,8517,8516,N,N,N,N,N,N,N,N,N,8819,N,8556,8557,N,N,N,N,N,N,N,8744,8558,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41585,N,N,N,N,N,N,N,N,N,N,N,41583,N,N,N,N,N,N,
+N,N,8818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8747,8748,8746,8749,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8781,N,8782,8783,N,8799,8784,N,N,N,
+8800,8762,N,N,8763,N,N,N,N,N,N,8541,N,N,N,N,N,N,N,8805,N,N,8807,8551,N,8796,N,
+N,N,N,N,N,8778,8779,8769,8768,8809,8810,N,N,N,N,N,N,N,8552,8808,N,N,N,N,N,N,N,
+8806,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8802,N,N,N,N,N,N,N,N,N,N,N,N,N,
+8546,8801,N,N,N,N,8549,8550,N,N,8803,8804,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,8766,8767,N,N,8764,8765,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,8797,8798,10273,10284,10274,10285,N,N,N,N,N,N,N,N,10275,N,N,10286,
+10276,N,N,10287,10278,N,N,10289,10277,N,N,10288,10279,10300,N,N,10295,N,N,
+10290,10281,10302,N,N,10297,N,N,10292,10280,N,N,10296,10301,N,N,10291,10282,N,
+N,10298,10303,N,N,10293,10283,N,N,10299,N,N,10304,N,N,N,N,N,N,N,N,10294,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,8739,8738,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8741,8740,N,N,N,N,N,N,N,N,
+8743,8742,N,N,N,N,N,N,N,N,8737,8574,N,N,N,8571,N,N,8573,8572,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8830,8570,8569,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,8554,N,8553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8822,N,N,8821,N,8820,8481,8482,8483,8503,N,
+8505,8506,8507,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8745,8750,
+8524,8525,N,N,N,N,N,N,8513,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,
+9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,
+9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,
+9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,
+9305,9306,9307,9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,
+9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,N,N,N,N,N,N,N,
+8491,8492,8501,8502,N,N,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,
+9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,
+9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,
+9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,
+9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,
+9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,
+9590,N,N,N,N,8486,8508,8499,8500,12396,17274,45089,15415,45090,45091,N,19324,
+15974,15152,15973,12860,45092,18772,19775,N,20514,12591,45093,N,13166,20515,
+16420,21058,13654,19002,N,N,N,N,15975,45094,N,20030,N,45095,45096,N,19010,N,
+45097,N,20516,45098,N,17254,45099,45100,45101,20517,13946,N,N,45102,20518,N,
+13405,17200,N,15463,20519,N,N,20520,45103,45104,20521,18229,45105,13655,N,
+45106,N,N,N,18231,N,18019,14403,19251,N,45107,N,N,N,26953,20522,15976,20523,
+12853,45108,N,45109,13925,14448,19561,N,N,22054,45110,N,N,N,N,45111,45112,N,N,
+N,N,N,N,N,19824,N,18045,45113,45114,N,N,N,45115,N,N,N,N,13349,45116,13621,N,
+20524,N,N,20525,20027,N,19773,16744,20527,15222,18035,45117,20530,N,N,12606,
+14431,N,14430,12390,45118,45119,20299,20298,N,14899,12321,45120,20531,20532,
+20533,19252,20534,N,14450,12391,19314,N,13692,N,N,13693,13694,17506,20028,
+45121,20535,N,N,20536,N,N,20537,N,N,45122,16205,N,N,N,N,N,15674,16206,20542,
+45123,20540,N,20541,13656,N,N,14883,12912,N,20539,20538,18985,45124,N,N,N,
+15174,15173,16958,20543,18773,16487,45125,45126,N,8504,20544,20546,45127,
+45128,45129,16997,20065,12362,N,N,45130,N,N,N,N,20545,12862,45131,13892,45132,
+17255,45133,N,45134,14191,20547,N,N,N,18212,N,45135,45136,45137,45138,13419,
+45139,45140,N,N,N,N,45141,20548,12363,45142,45143,14432,13420,18810,18482,
+13657,45144,N,N,45145,45146,45147,N,45148,12913,N,20583,17729,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,45149,18284,20550,45150,N,45152,18492,45153,20066,45154,16173,
+45155,15175,45156,15223,12864,45157,N,45158,N,45159,17489,N,N,17186,20554,
+45160,45161,N,45162,45163,12364,17507,15675,14900,19748,45164,16974,45165,
+12863,45166,20553,45167,19774,20549,20551,14958,20552,21796,45168,45151,N,N,
+45169,N,N,N,N,N,20560,45170,N,45171,N,45172,20563,20561,45173,N,12866,N,19003,
+20555,45174,45175,45176,45177,20559,14451,45178,45179,15176,N,45180,45181,
+13350,45182,45345,20564,N,20556,45346,45347,20067,45348,15224,45349,20557,
+45350,20562,45351,45352,45353,N,20565,45354,20558,45355,45356,13857,N,12365,
+45357,45358,13858,12865,N,N,N,N,N,N,N,N,N,21797,N,19321,18798,14452,N,N,45359,
+N,N,16175,20023,45360,N,45361,N,45362,45363,45364,45365,19032,45366,45367,
+14136,16933,12900,45368,45369,N,45370,45371,15699,45372,45373,45374,20569,
+45375,20574,20572,45376,N,20567,N,N,16943,20570,N,20573,20571,45377,19037,N,
+20568,45378,16174,45379,19315,20575,20576,N,N,N,N,N,N,N,N,15652,20589,45380,N,
+45381,18256,N,18742,20584,N,19056,N,12854,N,45382,45383,20588,45384,45385,
+45386,N,N,45387,20582,20591,45388,N,16722,45389,14404,45390,18268,45391,24647,
+45392,20590,17757,45393,20579,N,14454,45394,45395,14453,20577,45396,45397,
+45398,45399,15450,N,20585,45400,19055,17229,20581,14193,45401,20578,20586,
+20580,20049,20587,20289,45402,N,45403,N,45404,45405,N,45406,13926,N,N,14192,N,
+45430,N,N,N,N,45407,45408,45409,20592,N,45410,45411,20593,20597,12366,45412,N,
+45413,N,45414,19024,20596,45415,45416,45417,N,20595,20599,45418,N,45419,20598,
+N,17508,N,N,45420,45421,N,45422,45423,N,14194,45424,45425,N,N,45426,N,20600,
+45427,N,N,45428,45429,15429,N,16934,17509,13942,N,20601,N,N,N,N,13622,N,N,
+20602,45431,N,45432,45433,20604,45434,N,N,N,45435,N,N,19253,45436,45437,45438,
+14182,45601,45602,45603,N,45604,N,15153,18551,20603,45605,45606,N,45607,45608,
+45609,45610,45611,N,N,N,N,N,N,N,45612,N,14917,19779,N,45613,45614,N,20606,
+20771,20605,14916,N,15741,N,45615,45616,N,N,45617,14137,N,45618,N,20772,45619,
+45620,13903,N,45621,N,20769,20770,N,45622,17967,45623,16764,45624,13859,N,
+45625,45626,19277,20773,N,45627,N,20029,N,45628,45629,20774,45630,N,N,45631,
+20777,45632,20775,45633,16718,45634,45635,N,N,N,20776,20778,45636,N,45637,
+45649,N,N,20780,45638,N,N,20779,45639,19016,N,N,45640,13623,20782,20783,45641,
+12847,N,45642,45643,45644,20781,N,45645,45646,45647,45648,N,45650,N,15476,N,
+20786,20785,20784,45651,20566,45652,20787,45653,45654,45655,45656,15742,N,
+20788,N,45657,N,N,N,45658,45659,N,19749,N,45660,45661,N,45662,N,45663,19545,
+45664,45665,45666,N,20790,45667,45668,20789,20792,20791,N,N,20793,20794,12404,
+45669,14389,14139,15676,17275,13860,16488,14455,45670,14702,20796,19528,17734,
+45671,15225,N,20795,45672,20797,45673,N,45674,45675,N,17758,N,13173,N,N,45676,
+N,N,20798,N,45677,18046,45678,N,16692,20800,20801,18476,14456,20283,20802,N,N,
+13862,N,N,N,19004,16950,13937,17717,N,N,N,14195,N,45679,N,20803,N,20804,45680,
+45681,18018,12639,N,N,20807,14973,45682,20806,14918,45683,20808,26222,20809,
+19265,20810,N,20811,20812,15977,45684,15436,N,N,N,45685,N,N,13351,45686,20815,
+45687,20813,19517,20814,N,18778,20816,20817,20818,17759,45688,N,N,20822,20820,
+20821,20819,14947,20823,19562,20068,45689,N,45690,N,45691,20824,45692,45693,N,
+N,45694,N,16424,20825,15706,N,45857,20826,N,17276,20031,17760,N,45858,N,45859,
+45860,45861,N,45862,21061,N,45863,N,N,20827,29733,13893,45864,N,20828,19294,
+45865,N,N,45866,15720,17020,N,20830,18020,N,N,20831,45867,N,20832,13102,45868,
+45869,45870,20833,13863,45871,17996,12666,15696,N,N,18465,20834,17761,45872,
+45873,16207,20835,45874,18988,16474,13346,N,13353,20836,N,N,20838,N,N,14138,
+45875,45876,20837,45877,45878,20083,45879,N,N,N,N,15721,N,N,N,N,45880,N,18493,
+19020,N,20839,45881,19832,20840,N,N,N,20841,N,17790,45882,45883,20842,N,45884,
+16425,14974,14196,20843,15177,14703,45885,N,N,N,N,N,N,17510,20845,45886,N,
+16935,N,45887,14959,20846,20847,16688,N,20844,N,N,N,N,20849,45888,19254,45889,
+45890,N,45891,14692,45892,N,20848,45893,45894,45895,N,14197,14942,18285,45896,
+N,N,20852,20850,N,N,N,45897,18811,15978,20859,13156,20853,20851,16719,N,45898,
+45899,45900,N,N,N,20855,N,20854,45901,N,45902,13124,N,45903,N,14176,20860,
+20013,45904,N,45905,20856,N,N,N,20861,20858,45906,20857,45907,45908,45909,
+45910,N,45911,20047,45912,N,N,14457,12867,N,N,20084,45913,45914,45915,45916,N,
+15733,17752,14693,21026,21027,N,45917,45918,20069,N,N,20267,21029,45919,45920,
+45921,14458,45922,45923,21028,45924,13103,N,45925,21030,N,19286,45926,17468,
+45927,19750,45928,19033,N,N,45929,21031,N,45930,N,45931,28757,N,45932,17968,
+45933,21032,13354,19507,N,45934,45935,15905,21033,19047,21037,45936,16426,
+21034,13904,45937,21035,13355,45938,45939,45940,N,45941,N,N,N,45942,45943,
+14126,21038,45944,21039,45945,45946,21040,21041,15451,N,N,N,14459,19550,45947,
+19560,18039,45948,N,19057,21042,N,21043,N,45949,45950,46113,21045,N,21047,
+21046,46114,N,46115,N,21048,12861,19276,46116,14972,21049,46117,46118,16729,
+46119,46120,15906,13865,N,21050,N,46121,N,46122,46123,46124,18523,46125,46126,
+46127,N,21051,46128,21052,46129,21053,N,46130,N,N,21054,18724,13928,12389,
+46131,46132,46133,17983,21055,15677,46134,16489,N,21057,21056,15907,14433,
+21059,18494,46136,46135,21060,N,N,N,18524,16948,17006,13864,N,N,18030,17201,
+46137,18286,46138,19278,N,21062,N,16490,46139,N,46140,N,46141,14133,N,N,21063,
+N,N,46142,46143,21064,12588,12405,13421,46144,16936,13649,19825,N,21067,12855,
+46145,N,21066,N,N,46146,13866,N,N,21068,46147,19569,N,N,46148,46149,N,N,N,N,N,
+46150,N,N,N,N,46151,46152,N,21069,N,20050,46153,14460,N,N,46154,N,14390,21070,
+46155,N,N,46156,21072,21071,N,16223,12601,46157,46158,N,12638,21073,46159,
+21074,N,46160,14391,46161,46162,21075,46163,46164,N,46165,13678,N,46166,N,N,
+46167,N,15154,21076,N,46168,N,N,19316,14901,13658,19751,16720,18495,15485,
+46169,N,N,46170,46171,15687,46172,15464,15477,N,15734,46173,18496,N,46174,
+46175,21079,46176,12611,16721,14461,14405,13927,46177,46178,21083,17185,17022,
+13867,15908,21084,21082,12868,16998,15416,15179,12582,N,46179,13168,14694,
+15178,N,21085,21086,46180,13641,13126,N,N,N,14695,13640,17503,12581,17969,
+19518,14625,19833,17735,14462,N,46181,N,N,N,N,N,N,46182,14127,N,21095,N,13923,
+19274,46183,N,N,N,N,18525,46184,46185,21094,46186,13406,21089,21090,21092,
+46187,N,46188,N,N,46189,46190,21093,N,13659,16225,N,18989,21091,21087,14435,N,
+21088,N,20260,46191,46192,N,19058,46193,17512,14434,14704,N,N,46194,21096,
+46195,N,18013,N,N,N,N,N,N,N,N,N,N,N,N,46196,21100,N,N,46197,N,46198,N,46199,
+46200,15486,46201,15478,46202,N,46203,46204,N,21103,21101,N,19491,46205,21098,
+21107,21102,N,N,N,21105,14406,19519,N,46206,21106,46369,N,46370,21108,46371,
+21110,N,46372,46373,N,14960,20290,46374,21099,21097,21109,46375,21104,N,N,
+46376,46377,N,N,N,N,N,46378,N,N,46379,N,46380,21112,N,21283,21114,46381,46382,
+21118,46383,46384,21281,21115,46385,46386,21310,N,46387,14953,13105,N,N,N,
+46388,21113,46389,46390,46391,21285,12406,21284,46392,12325,18762,21282,N,
+21116,N,46393,21111,21117,14920,46394,N,N,46395,46396,N,N,N,N,N,N,N,N,N,21286,
+N,N,N,N,N,N,N,46397,12407,21295,N,N,21287,21288,N,15909,19305,46398,N,46399,
+21293,21292,46400,N,N,17711,N,N,N,46401,N,N,N,21294,N,46402,21291,46403,46404,
+46405,46406,N,N,12596,46407,14902,16176,46408,46409,N,N,46410,46411,46412,
+21289,17762,N,N,N,21290,46413,12322,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,
+46414,46415,N,N,21300,19747,N,15911,46416,21306,N,46417,46418,N,21305,21296,N,
+46419,46420,46421,16963,N,21297,46422,N,N,17007,21302,15910,46423,N,46424,
+46425,N,21299,46426,N,19556,46427,46428,N,14140,N,N,21303,21304,46429,N,46430,
+46431,21301,21307,46432,N,46433,46434,N,21298,46435,N,46436,N,N,N,N,N,N,N,N,N,
+N,N,N,N,N,N,N,N,N,N,N,21313,21318,N,21314,46437,21309,46438,46439,21319,16689,
+N,46440,21321,46441,14626,21311,17277,N,N,46442,46443,N,46444,46445,46446,
+46447,N,N,46448,21315,21308,13357,N,13422,13157,21316,21312,N,N,N,46449,46450,
+N,N,14198,21322,21320,16723,13642,13868,46451,21317,N,13940,N,46452,N,N,N,
+12612,N,N,N,N,N,N,N,N,46453,N,46454,N,46455,21326,21324,46456,21543,N,46457,N,
+46458,46459,N,46460,N,N,46461,46462,46625,21329,N,N,46626,46627,N,21323,46628,
+21327,N,46629,21325,N,N,46630,15180,21328,N,N,N,N,46631,N,N,N,N,N,N,N,N,N,N,N,
+N,46632,21331,N,21336,N,N,N,21334,21333,46633,46634,17202,N,46635,12869,46636,
+N,N,46637,46638,46639,46640,46641,46642,N,21330,N,21332,15912,12595,46643,N,
+21335,N,N,N,N,N,N,N,N,N,N,N,N,N,12894,N,N,46644,N,N,21346,46645,15996,21342,
+46646,21340,46647,21341,46648,21343,46649,N,46650,46651,46652,N,46653,46654,
+46655,12605,46656,46657,N,46658,N,N,46659,N,46660,16697,46661,21337,46662,
+21338,N,N,N,46663,N,N,N,N,N,N,13178,N,N,46664,N,46665,46666,46667,46668,21345,
+N,46669,N,13423,46670,21348,21344,21347,46671,N,46672,N,46673,46674,N,18990,
+46675,N,N,18005,N,18488,N,N,N,N,N,21350,N,N,N,46676,46677,21349,13125,46678,N,
+21351,46679,46680,N,N,21354,N,N,N,N,21353,46681,N,N,N,46682,46683,N,N,46684,
+46685,46686,21352,N,18233,N,N,21355,46687,46688,46689,46690,N,46691,46692,
+46693,21356,N,N,46694,N,46695,21358,N,21357,46696,N,N,N,N,21360,N,46697,N,
+21363,21361,21359,21362,N,46698,N,N,21364,46699,46700,46701,46704,46705,21365,
+46702,46703,21366,N,21367,N,N,N,21368,20805,46706,15484,15181,46707,46708,
+12915,46709,12408,46710,N,17220,46711,46712,46713,46714,46715,N,N,46717,N,
+46718,21369,N,14884,46716,12367,16222,N,N,46881,46882,N,21370,14407,N,N,14705,
+N,21372,21371,46883,46884,19040,21373,N,N,46885,21537,21374,46886,21538,46887,
+21539,N,14199,N,46888,12640,21540,N,46889,21542,N,21541,N,46890,46891,21544,
+46892,N,17754,46893,N,46894,46895,46896,46897,21545,12341,14943,46898,46899,N,
+46900,14141,46901,46902,17231,N,N,46903,46904,N,N,21546,21547,N,N,21549,N,
+46905,46906,46907,21550,N,14948,N,N,46908,46909,13905,N,N,19255,N,46910,46911,
+21548,21551,14913,14627,46912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21555,46913,N,14885,
+46914,17203,46915,46916,21552,17498,46917,N,46918,46919,46920,46921,46922,N,
+46923,46924,46925,N,46926,N,46927,46928,46929,46930,N,46931,21556,N,46932,
+16226,46933,N,N,N,N,21554,21557,N,14143,46934,N,N,N,N,N,N,21558,46935,46944,N,
+46936,N,46937,46938,N,46939,46940,46941,46942,21559,46943,14628,13120,21561,N,
+N,46945,46946,46947,21562,N,46948,N,N,N,21563,N,N,21560,N,N,N,N,46949,N,N,N,N,
+46950,N,N,21553,N,N,21564,N,N,21565,46951,46952,N,N,19300,46953,N,15979,46954,
+N,N,21567,21568,21566,46955,21570,N,N,N,N,N,18232,46956,46957,12392,18774,
+46974,N,21571,46958,N,46959,46960,N,46961,N,N,N,46962,N,N,46963,N,N,N,15997,
+46964,46965,15417,46966,18269,13424,N,14955,46967,46968,46969,19289,N,17970,
+46970,46971,14200,16975,N,46972,46973,21569,21572,47137,47138,N,N,N,N,N,N,N,
+16964,N,N,N,21573,N,47139,N,21574,47140,47141,47142,21576,N,N,17513,N,47143,
+47144,N,N,13358,N,N,47145,N,29729,12641,19059,47146,N,15980,17736,N,N,N,47147,
+14950,N,N,21582,N,47148,19005,20061,N,N,N,N,N,N,N,47149,12916,21578,47150,
+47151,N,47152,47153,16698,21581,N,17763,47154,N,17737,17764,18489,17485,N,N,N,
+14921,47155,N,47156,21577,N,47157,N,N,47158,47159,12662,N,17718,N,N,N,N,21579,
+N,21575,N,N,16208,N,N,47160,21583,N,N,47161,N,15694,47162,47163,47164,N,13869,
+N,21584,N,47165,47166,47167,47168,N,47169,47170,N,47171,47172,N,N,19048,47173,
+N,47174,16765,N,N,N,N,17478,47175,N,21586,47176,47177,47178,N,N,N,47179,N,
+19279,47180,N,21587,N,N,21592,N,N,47181,47182,18991,N,N,N,N,21591,21585,21588,
+21590,47184,N,14886,N,N,19017,47185,N,47183,21593,N,17221,47186,N,12917,N,
+15981,47187,47188,N,47189,21595,47190,21594,47191,14696,47192,21596,21598,
+21597,47193,N,21600,47194,21589,21602,N,47195,47196,N,21601,21599,N,N,N,47197,
+N,15182,16209,N,16724,21603,16444,12397,18276,47198,N,N,N,17499,N,21605,21604,
+21606,21607,21608,21609,N,N,47199,47200,N,N,19025,21610,47201,47202,N,N,12870,
+21611,N,47203,47204,47205,19772,13104,N,21065,15688,16959,21612,19563,47207,N,
+N,N,47208,19508,47209,47210,21614,N,16999,47211,17719,16960,18775,21615,21616,
+12667,47212,47213,15418,21617,47214,N,47215,47216,12368,21618,N,N,N,N,N,21619,
+47217,N,N,N,47218,12642,N,47219,13425,18016,19060,N,N,N,N,21623,16725,21622,
+14144,47220,47221,19291,21621,N,17765,21625,47222,21624,47223,N,47224,47225,
+47226,21627,47227,21626,47228,N,12668,N,21628,15913,21630,17189,47229,21629,
+47230,18995,47393,N,N,47394,15735,17755,47395,47396,N,21793,47397,N,47398,
+47399,14629,N,N,N,21794,18209,18526,19537,N,N,N,N,N,18213,47400,47401,21803,
+47402,N,N,N,47403,13624,N,47404,19781,47405,N,19503,N,22060,N,21795,N,47406,N,
+N,N,21798,47407,16965,N,47408,19256,N,N,N,17738,47409,47410,47411,47412,N,
+21799,47413,N,N,N,47414,N,19301,47415,14922,47416,N,15914,N,N,47417,N,47418,
+47419,N,21800,N,47420,15184,47421,15183,N,47422,N,N,12345,14408,47423,16427,
+12369,N,N,N,N,21804,21805,N,21802,47424,47425,47426,N,N,N,47427,47428,12600,
+13359,47429,21801,N,19525,18737,N,N,47430,47431,N,47432,47433,N,47434,N,12328,
+47435,N,N,N,12409,N,N,N,15185,47436,12370,N,12323,47437,N,N,N,N,21810,N,N,
+47438,47439,47440,N,N,21808,47441,47442,N,N,N,N,19516,N,21811,N,21809,N,47443,
+21807,16177,N,N,47444,47445,21806,N,47446,47447,19034,47448,N,N,47449,N,14436,
+47450,N,N,N,N,21815,21816,N,N,N,N,N,15915,N,N,N,21812,20268,N,N,47451,47452,
+18252,47453,47454,21814,N,N,47455,N,N,N,47456,N,N,N,N,47457,N,N,N,N,14887,N,N,
+N,47458,N,N,N,21817,47459,N,47460,18776,47461,N,N,21818,N,21813,47462,N,N,N,N,
+N,N,N,N,N,47463,N,N,47464,47465,N,N,47466,19515,N,N,N,N,N,N,N,N,N,N,N,47467,N,
+N,N,N,47468,N,18270,47469,N,N,47470,N,N,47471,21819,18738,47472,N,47473,47474,
+47475,N,47476,N,N,N,N,47477,N,N,N,N,47478,N,N,N,N,47479,47480,47481,N,47482,N,
+N,47483,N,47484,47485,21820,21824,21821,47486,N,12871,21823,N,47649,N,47650,N,
+47651,15419,N,21822,14201,N,N,47652,21836,N,N,N,N,N,21829,21826,N,N,47653,N,
+47654,N,N,N,47655,17252,N,21825,N,47656,21827,N,N,21828,47657,N,N,N,47658,N,N,
+N,N,N,N,47659,47660,N,N,N,21830,21831,N,47661,47662,47663,N,N,N,N,N,N,47664,
+13426,N,21833,21832,N,N,N,N,N,N,N,N,N,21834,47665,N,47667,N,47668,N,47669,N,N,
+N,47670,15982,N,N,47671,N,N,N,N,21837,N,17500,47672,N,N,12613,N,21835,N,47666,
+N,21838,N,47673,N,N,N,N,N,21839,N,21842,47674,N,21840,N,2184