]> git.tdb.fi Git - libs/core.git/commitdiff
Move files around to prepare for assimilation into core strings-master
authorMikko Rasa <tdb@tdb.fi>
Wed, 25 May 2011 07:28:17 +0000 (10:28 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 25 May 2011 07:28:17 +0000 (10:28 +0300)
75 files changed:
Build
source/ascii.cpp [deleted file]
source/ascii.h [deleted file]
source/codec.cpp [deleted file]
source/codec.h [deleted file]
source/codecutils.cpp [deleted file]
source/codecutils.h [deleted file]
source/fmt.cpp [deleted file]
source/fmt.h [deleted file]
source/formatter.cpp [deleted file]
source/formatter.h [deleted file]
source/glob.cpp [deleted file]
source/glob.h [deleted file]
source/iso2022jp.cpp [deleted file]
source/iso2022jp.h [deleted file]
source/iso646fi.cpp [deleted file]
source/iso646fi.h [deleted file]
source/iso88591.cpp [deleted file]
source/iso88591.h [deleted file]
source/iso885915.cpp [deleted file]
source/iso885915.h [deleted file]
source/jisx0201.cpp [deleted file]
source/jisx0201.h [deleted file]
source/jisx0208.cpp [deleted file]
source/jisx0208.h [deleted file]
source/jisx0208.table [deleted file]
source/lexicalcast.cpp [deleted file]
source/lexicalcast.h [deleted file]
source/regex.cpp [deleted file]
source/regex.h [deleted file]
source/regmatch.cpp [deleted file]
source/regmatch.h [deleted file]
source/stringcodec/ascii.cpp [new file with mode: 0644]
source/stringcodec/ascii.h [new file with mode: 0644]
source/stringcodec/codec.cpp [new file with mode: 0644]
source/stringcodec/codec.h [new file with mode: 0644]
source/stringcodec/codecutils.cpp [new file with mode: 0644]
source/stringcodec/codecutils.h [new file with mode: 0644]
source/stringcodec/iso2022jp.cpp [new file with mode: 0644]
source/stringcodec/iso2022jp.h [new file with mode: 0644]
source/stringcodec/iso646fi.cpp [new file with mode: 0644]
source/stringcodec/iso646fi.h [new file with mode: 0644]
source/stringcodec/iso88591.cpp [new file with mode: 0644]
source/stringcodec/iso88591.h [new file with mode: 0644]
source/stringcodec/iso885915.cpp [new file with mode: 0644]
source/stringcodec/iso885915.h [new file with mode: 0644]
source/stringcodec/jisx0201.cpp [new file with mode: 0644]
source/stringcodec/jisx0201.h [new file with mode: 0644]
source/stringcodec/jisx0208.cpp [new file with mode: 0644]
source/stringcodec/jisx0208.h [new file with mode: 0644]
source/stringcodec/jisx0208.table [new file with mode: 0644]
source/stringcodec/utf8.cpp [new file with mode: 0644]
source/stringcodec/utf8.h [new file with mode: 0644]
source/stringcodec/windows1252.cpp [new file with mode: 0644]
source/stringcodec/windows1252.h [new file with mode: 0644]
source/strings/fmt.cpp [new file with mode: 0644]
source/strings/fmt.h [new file with mode: 0644]
source/strings/formatter.cpp [new file with mode: 0644]
source/strings/formatter.h [new file with mode: 0644]
source/strings/glob.cpp [new file with mode: 0644]
source/strings/glob.h [new file with mode: 0644]
source/strings/lexicalcast.cpp [new file with mode: 0644]
source/strings/lexicalcast.h [new file with mode: 0644]
source/strings/regex.cpp [new file with mode: 0644]
source/strings/regex.h [new file with mode: 0644]
source/strings/regmatch.cpp [new file with mode: 0644]
source/strings/regmatch.h [new file with mode: 0644]
source/strings/utils.cpp [new file with mode: 0644]
source/strings/utils.h [new file with mode: 0644]
source/utf8.cpp [deleted file]
source/utf8.h [deleted file]
source/utils.cpp [deleted file]
source/utils.h [deleted file]
source/windows1252.cpp [deleted file]
source/windows1252.h [deleted file]

diff --git a/Build b/Build
index eb16f4b8e9cef640c62008d8749ed8dc8406c0fd..06545dc50a21490049519164b0f194ce3edb1c74 100644 (file)
--- a/Build
+++ b/Build
@@ -9,13 +9,20 @@ package "mspstrings"
 
        headers "msp/strings"
        {
 
        headers "msp/strings"
        {
-               source "source";
+               source "source/strings";
+               install true;
+       };
+
+       headers "msp/stringcodec"
+       {
+               source "source/stringcodec";
                install true;
        };
 
        library "mspstrings"
        {
                install true;
        };
 
        library "mspstrings"
        {
-               source "source";
+               source "source/strings";
+               source "source/stringcodec";
                install true;
        };
 
                install true;
        };
 
@@ -40,6 +47,6 @@ package "mspstrings"
        tarball "@src"
        {
                source "License.txt";
        tarball "@src"
        {
                source "License.txt";
-               source "source/jisx0208.table";
+               source "source/stringcodec/jisx0208.table";
        };
 };
        };
 };
diff --git a/source/ascii.cpp b/source/ascii.cpp
deleted file mode 100644 (file)
index d7da520..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "ascii.h"
-
-using namespace std;
-
-/*namespace {
-
-char translit_latin1[0x60]=
-{
-};
-
-const char *translit_katakana[0x60]=
-{
-       "--", "a", "a", "i", "i", "u", "u", "e", "e", "o", "o",
-       "ka", "ga", "ki", "gi", "ku", "gu", "ke", "ge", "ko", "go",
-       "sa", "za", "si", "zi", "su", "zu", "se", "ze", "so", "zo",
-       "ta", "da", "ti", "di", "tu", "tu", "du", "te", "de", "to", "do",
-};
-
-}*/
-
-namespace Msp {
-namespace Codecs {
-
-void Ascii::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if(ch<0 || ch>0x7F)
-               return error(ch, buf, "Can't express character in ASCII");
-
-       buf += ch;
-}
-
-void Ascii::Encoder::transliterate(UnicodeChar ch, string &buf)
-{
-       if(ch>=0xC0 && ch<=0xC5)
-               buf += 'A';
-       else if(ch==0xC6)
-               buf += "AE";
-       else if(ch==0xC7)
-               buf += 'C';
-       else if(ch>=0xC8 && ch<=0xCB)
-               buf += 'E';
-       else if(ch>=0xCC && ch<=0xCF)
-               buf += 'I';
-       else if(ch==0xD0)
-               buf += 'D';
-       else if(ch==0xD1)
-               buf += 'N';
-       else if((ch>=0xD2 && ch<=0xD7) || ch==0xD9)
-               buf += 'O';
-       else if(ch==0xD8)
-               buf += 'x';
-       else if(ch>=0xDA && ch<=0xDC)
-               buf += 'U';
-       else if(ch==0xDD)
-               buf += 'Y';
-       else if(ch==0xDE)
-               buf += 'T';
-       else if(ch==0xDF)
-               buf += "ss";
-       else if(ch>=0xE0 && ch<=0xE5)
-               buf += 'a';
-       else if(ch==0xE6)
-               buf += "ae";
-       else if(ch==0xE7)
-               buf += 'c';
-       else if(ch>=0xE8 && ch<=0xEB)
-               buf += 'e';
-       else if(ch>=0xEC && ch<=0xEF)
-               buf += 'i';
-       else if(ch==0xF0)
-               buf += 'd';
-       else if(ch==0xF1)
-               buf += 'n';
-       else if((ch>=0xF2 && ch<=0xF7) || ch==0xF9)
-               buf += 'o';
-       else if(ch==0xF8)
-               buf += '/';
-       else if(ch>=0xFA && ch<=0xFC)
-               buf += 'u';
-       else if(ch==0xFD)
-               buf += 'y';
-       else if(ch==0xFE)
-               buf += 't';
-       else if(ch==0xFF)
-               buf += 'y';
-       else
-               buf += '?';
-}
-
-
-UnicodeChar Ascii::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-       else if(*i&0x80)
-       {
-               UnicodeChar result = error("Undefined ASCII character");
-               ++i;
-               return result;
-       }
-       else
-               return *i++;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/ascii.h b/source/ascii.h
deleted file mode 100644 (file)
index 0fee50e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_ASCII_H_
-#define MSP_STRINGS_ASCII_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Ascii: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "ASCII"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/codec.cpp b/source/codec.cpp
deleted file mode 100644 (file)
index 0014847..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "ascii.h"
-#include "codec.h"
-#include "iso2022jp.h"
-#include "iso646fi.h"
-#include "iso88591.h"
-#include "iso885915.h"
-#include "jisx0201.h"
-#include "jisx0208.h"
-#include "utf8.h"
-#include "windows1252.h"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-bool Codec::detect(const string &str) const
-{
-       Decoder *dec = create_decoder();
-       bool result = true;
-       try
-       {
-               for(string::const_iterator i=str.begin(); i!=str.end(); )
-                       dec->decode_char(str, i);
-       }
-       catch(const CodecError &)
-       {
-               result = false;
-       }
-
-       delete dec;
-
-       return result;
-}
-
-void Codec::Encoder::encode(const ustring &str, string &buf)
-{
-       for(ustring::const_iterator i=str.begin(); i!=str.end(); ++i)
-               encode_char(*i, buf);
-}
-
-string Codec::Encoder::encode(const ustring &str)
-{
-       string buf;
-       encode(str, buf);
-       sync(buf);
-       return buf;
-}
-
-void Codec::Encoder::error(UnicodeChar ch, string &buf, const string &msg)
-{
-       switch(err_mode)
-       {
-       case TRANSLITERATE:
-               transliterate(ch, buf);
-       case IGNORE_ERRORS:
-               break;
-       default:
-               throw CodecError(msg);
-       }
-}
-
-
-void Codec::Decoder::decode(const string &str, ustring &buf)
-{
-       for(string::const_iterator i=str.begin(); i!=str.end();)
-       {
-               UnicodeChar c = decode_char(str, i);
-               if(c!=-1)
-                       buf += c;
-       }
-}
-
-ustring Codec::Decoder::decode(const string &str)
-{
-       ustring buf;
-       decode(str, buf);
-       return buf;
-}
-
-UnicodeChar Codec::Decoder::error(const string &msg)
-{
-       switch(err_mode)
-       {
-       case TRANSLITERATE:
-               return 0xFFFE;
-       case IGNORE_ERRORS:
-               return -1;
-       default:
-               throw CodecError(msg);
-       }
-}
-
-Codec *create_codec(const string &n)
-{
-       string name;
-       for(string::const_iterator i=n.begin(); i!=n.end(); ++i)
-       {
-               if(isupper(*i))
-                       name += tolower(*i);
-               else if(islower(*i) || isdigit(*i))
-                       name += *i;
-       }
-
-       if(name=="ascii") return new Ascii;
-       if(name=="iso2022jp") return new Iso2022Jp;
-       if(name=="iso646fi") return new Iso646Fi;
-       if(name=="iso88591" || name=="latin1") return new Iso88591;
-       if(name=="iso885915" || name=="latin9") return new Iso885915;
-       if(name=="jisx0201") return new JisX0201;
-       if(name=="jisx0208") return new JisX0208;
-       if(name=="utf8") return new Utf8;
-       if(name=="windows1252" || name=="cp1252") return new Windows1252;
-       throw InvalidParameterValue("Unknown string codec");
-}
-
-Codec *detect_codec(const string &str)
-{
-       bool is_utf8 = true;
-       bool is_ascii = true;
-       bool is_latin1 = true;
-       unsigned utf8_mb = 0;
-
-       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
-       {
-               unsigned char c = *i;
-               if(c&0x80)
-               {
-                       is_ascii = false;
-                       if((c&0xC0)==0x80)
-                       {
-                               if((c&0xE0)==0x80)
-                                       is_latin1 = false;
-                               if(utf8_mb)
-                                       --utf8_mb;
-                               else
-                                       is_utf8 = false;
-                       }
-                       else if((c&0xC0)==0xC0)
-                       {
-                               if(utf8_mb)
-                               {
-                                       is_utf8 = false;
-                                       utf8_mb = 0;
-                               }
-                               else
-                               {
-                                       for(utf8_mb=1; (c>>(6-utf8_mb))&1; ++utf8_mb) ;
-                               }
-                       }
-               }
-               else if(utf8_mb)
-               {
-                       is_utf8 = false;
-                       utf8_mb = 0;
-               }
-       }
-
-       if(is_ascii)
-               return new Ascii;
-       else if(is_utf8)
-               return new Utf8;
-       else if(is_latin1)
-               return new Iso88591;
-       else
-               return new Windows1252;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/codec.h b/source/codec.h
deleted file mode 100644 (file)
index e04e909..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_CODEC_H_
-#define MSP_STRINGS_CODEC_H_
-
-#include <string>
-#include <msp/core/except.h>
-
-namespace Msp {
-namespace Codecs {
-
-typedef int UnicodeChar;
-
-typedef std::basic_string<UnicodeChar> ustring;
-
-enum ErrorMode
-{
-       THROW_ON_ERROR,
-       IGNORE_ERRORS,
-       TRANSLITERATE
-};
-
-/**
-An exception thrown for all kinds of problems encountered while encoding or
-decoding strings.
-*/
-class CodecError: public Exception
-{
-public:
-       CodecError(const std::string &w_): Exception(w_) { }
-};
-
-/**
-Base class for string codecs.  Use one of the derived classes or the function
-create_codec to create a specific codec.
-
-Unicode strings are represented as ustrings.  An std::string is considered to
-be an encoded sequence of bytes.  A codec is able to determine if an encoded
-string could be decoded with it.
-*/
-class Codec
-{
-public:
-       /**
-       Base class for string encoder.
-
-       Each codec class should contain an Encoder class derived from this.  The
-       encode_char and transliterate functions must be overloaded.  Some encoders
-       may find it useful or necessary to implement some other functions too
-       (particularly sync and reset for stateful codecs).
-       */
-       class Encoder
-       {
-       protected:
-               ErrorMode err_mode;
-
-               Encoder(ErrorMode em): err_mode(em) { }
-       public:
-               virtual ~Encoder() { }
-
-               /** Encodes a single unicode character.  If the character can't be
-               represented in this encoding, error() should be called. */
-               virtual void encode_char(UnicodeChar ch, std::string &buf) = 0;
-
-               /** Encodes a unicode string.  This is equivalent to calling encode_char
-               for each character in the string with the same buffer. */
-               virtual void encode(const ustring &str, std::string &buf);
-
-               std::string encode(const ustring &);
-
-               /** Procuces a sequence of bytes that will bring the encoder back to the
-               initial state. */
-               virtual void sync(std::string &buf) { (void)buf; }
-
-               /** Resets the encoder to the initial state without producing output. */
-               virtual void reset() { }
-
-       protected:
-               /** Handles an error depending on the error mode.
-
-               THROW_ON_ERROR: throws CodecError(msg)
-               IGNORE_ERRORS: does nothing
-               TRANSLITERATE: calls transliterate(ch, buf) */
-               void error(UnicodeChar ch, std::string &buf, const std::string &msg);
-
-               /** Attempts to produce an alternative encoding for a unicode character.
-               Typically this includes dropping accent marks or romanizing letters. */
-               virtual void transliterate(UnicodeChar ch, std::string &buf) = 0;
-       };
-
-       /**
-       Base class for string decoder.
-
-       Each codec class should contain an Decoder class derived from this.
-       */
-       class Decoder
-       {
-       protected:
-               ErrorMode err_mode;
-
-               Decoder(ErrorMode em): err_mode(em) { }
-       public:
-               virtual ~Decoder() { }
-
-               /** Decodes a single character from a string.  The iterator is advanced
-               to the next character.  For stateful codecs, -1 may be returned if a
-               state change sequence was decoded but no character followed it.  If
-               invalid input is encountered, the error() function should be called and
-               the iterator advanced only if it doesn't throw. */
-               virtual UnicodeChar decode_char(const std::string &str, std::string::const_iterator &i) = 0;
-
-               /** Decodes a string. */
-               virtual void decode(const std::string &str, ustring &buf);
-
-               ustring decode(const std::string &);
-
-               /** Resets the decoder to the initial state. */
-               virtual void reset() { }
-
-       protected:
-               /** Handles an error depending on the error mode.  The return value is
-               suitable for returning from decode_char.
-               
-               THROW_ON_ERROR: throws CodecError(msg)
-               IGNORE_ERRORS: returns -1
-               TRANSLITERATE: return 0xFFFE */
-               UnicodeChar error(const std::string &msg);
-       };
-
-protected:
-       Codec() { }
-public:
-       virtual ~Codec() { }
-
-       /** Returns the name of the encoding handled by this codec. */
-       virtual const char *get_name() const = 0;
-
-       /** Creates an encoder for this codec. */
-       virtual Encoder *create_encoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
-
-       /** Creates a decoder for this codec. */
-       virtual Decoder *create_decoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
-
-       /** Determines whether the given string can be successfully decoded with
-       this codec.  Note that this function returning true does not guarantee that
-       the string was actually encoded with this codec.  In particular, many 8-bit
-       encodings are indistinguishable. */
-       virtual bool detect(const std::string &) const;
-};
-
-typedef Codec::Encoder Encoder;
-typedef Codec::Decoder Decoder;
-
-/** Convenience function that decodes a string. */
-template<class C>
-ustring decode(const std::string &s)
-{
-       typename C::Decoder dec;
-       ustring result;
-       dec.decode(s, result);
-       return result;
-}
-
-/** Convenience function that encodes a string. */
-template<class C>
-std::string encode(const ustring &s)
-{
-       typename C::Encoder enc;
-       std::string result;
-       enc.encode(s, result);
-       enc.sync(result);
-       return result;
-}
-
-/** Convenience function that transcodes a string from one codec to another. */
-template<class F, class T>
-std::string transcode(const std::string &s)
-{
-       typename F::Decoder from;
-       typename T::Encoder to;
-       ustring temp;
-       from.decode(s, temp);
-       std::string result;
-       to.encode(temp, result);
-       to.sync(result);
-       return result;
-}
-
-/** Creates a codec for an encoding by name.  The caller is responsible for
-deleting the codec when it's no longer needed. */
-Codec *create_codec(const std::string &);
-
-/** Automatically detects the encoding of a string and creates a codec for it.
-The codec must be deleted when it's no longer needed. */
-Codec *detect_codec(const std::string &);
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/codecutils.cpp b/source/codecutils.cpp
deleted file mode 100644 (file)
index 6afbf95..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "codecutils.h"
-
-namespace Msp {
-namespace Codecs {
-
-int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse)
-{
-       for(unsigned i=0; i<map_size*2; i+=2)
-       {
-               if(mapping[i+reverse]==ch)
-                       return mapping[i+1-reverse];
-               else if(mapping[i+1-reverse]==ch)
-                       return -1;
-       }
-
-       return ch;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/codecutils.h b/source/codecutils.h
deleted file mode 100644 (file)
index 6921d41..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_CODECUTILS_H_
-#define MSP_STRINGS_CODECUTILS_H_
-
-namespace Msp {
-namespace Codecs {
-
-int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse);
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/fmt.cpp b/source/fmt.cpp
deleted file mode 100644 (file)
index e06f71a..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include <msp/core/except.h>
-#include "fmt.h"
-
-using namespace std;
-
-namespace Msp {
-
-void Fmt::parse(const char *f)
-{
-       if(*f=='%') ++f;
-
-       for(; *f; ++f)
-       {
-               if(*f=='#')
-               {
-                       sbase = true;
-                       spoint = true;
-               }
-               else if(*f=='0')
-                       fillc = '0';
-               else if(*f=='-')
-                       align = LEFT;
-               else if(*f=='+')
-                       spos = true;
-               else
-                       break;
-       }
-
-       wd = 0;
-       for(; *f; ++f)
-       {
-               if(*f>='0' && *f<='9')
-                       wd = wd*10+(*f-'0');
-               else
-                       break;
-       }
-
-       if(*f=='.')
-       {
-               ++f;
-               prec = 0;
-               for(; *f; ++f)
-               {
-                       if(*f>='0' && *f<='9')
-                               prec = prec*10+(*f-'0');
-                       else
-                               break;
-               }
-       }
-
-       type = NUM;
-       if(*f=='d' || *f=='u')
-               base = DEC;
-       else if(*f=='x' || *f=='X')
-               base = HEX;
-       else if(*f=='o')
-               base = OCT;
-       else if(*f=='b')
-               base = BIN;
-       else if(*f=='e' || *f=='E')
-               fmode = SCI;
-       else if(*f=='f' || *f=='F')
-               fmode = FIXED;
-       else if(*f=='g' || *f=='G')
-               fmode = AUTOFLT;
-       else if(*f=='p' || *f=='P')
-       {
-               base = HEX;
-               sbase = true;
-       }
-       else if(*f=='c')
-               type = CHAR;
-       else if(*f=='s')
-               type = STR;
-       else if(*f=='i')
-               base = AUTOBASE;
-       else
-               throw InvalidParameterValue("Invalid conversion specifier");
-
-       if(*f=='E' || *f=='F' || *f=='G' || *f=='X' || *f=='P')
-               ucase = true;
-
-       ++f;
-
-       if(*f)
-               throw InvalidParameterValue("Extra characters in conversion specification");
-}
-
-Fmt &Fmt::reset()
-{
-       wd = 0;
-       prec = 6;
-       spos = false;
-       fillc = ' ';
-       base = DEC;
-       sbase = false;
-       fmode = AUTOFLT;
-       spoint = false;
-       align = RIGHT;
-       ucase = false;
-       type = STR;
-
-       return *this;
-}
-
-void Fmt::apply(ostream &out) const
-{
-       out.flags(((base==HEX) ? ios_base::hex : (base==OCT) ? ios_base::oct : ios_base::dec)
-               | ((fmode==SCI) ? ios_base::scientific : (fmode==FIXED) ? ios_base::fixed : ios_base::fmtflags(0))
-               | (fillc=='0' ? ios_base::internal : (align==LEFT) ? ios_base::left : ios_base::right)
-               | (sbase ? ios_base::showbase : ios_base::fmtflags(0))
-               | (spoint ? ios_base::showpoint : ios_base::fmtflags(0))
-               | (spos ? ios_base::showpos : ios_base::fmtflags(0))
-               | (ucase ? ios_base::uppercase : ios_base::fmtflags(0)));
-       out.fill(fillc);
-       out.width(wd);
-       out.precision(prec);
-}
-
-} // namespace Msp
diff --git a/source/fmt.h b/source/fmt.h
deleted file mode 100644 (file)
index ba75958..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_FMT_H_
-#define MSP_STRINGS_FMT_H_
-
-#include <ostream>
-#include <string>
-
-namespace Msp {
-
-/**
-Stores formatting information for converting variables into strings.  Can be
-applied to an std::ostream or fed to lexical_cast.  Also used internally by
-Formatter.
-
-Formats can be constructed from printf-style conversion specifications, by
-chaining calls to the various setter functions, or with a mixture of both.
-
-Since type information for conversions is acquired through templates, the
-meaning of the conversion specifier character is reduced to only specifying
-what the conversion should look like.  Of special note is the s conversion,
-which will result in a default conversion for any data type.  Size modifiers
-are not supported and there is no difference between signed and unsigned
-conversions.
-
-Some new conversions are supported:
-
-  b/B  Binary integer conversion
-  P    Uppercase pointer conversion (like %#X)
-*/
-class Fmt
-{
-public:
-       enum Type
-       {
-               NUM,
-               CHAR,
-               STR
-       };
-
-       enum Base
-       {
-               AUTOBASE = 0,
-               DEC = 10,
-               HEX = 16,
-               OCT = 8,
-               BIN = 2
-       };
-
-       enum FloatMode
-       {
-               FIXED,
-               AUTOFLT,
-               SCI
-       };
-
-       enum Align
-       {
-               LEFT,
-               RIGHT
-       };
-
-private:
-       unsigned wd;
-       unsigned prec;
-       bool spos;
-       wchar_t fillc;
-       Base base;
-       bool sbase;
-       FloatMode fmode;
-       bool spoint;
-       Align align;
-       bool ucase;
-       Type type;
-
-public:
-       Fmt() { reset(); }
-       Fmt(const char *f) { reset(); parse(f); }
-       Fmt(const std::string &f) { reset(); parse(f.c_str()); }
-
-private:
-       void parse(const char *);
-
-public:
-       Fmt &width(unsigned w) { wd = w; return *this; }
-       Fmt &precision(unsigned p) { prec = p; return *this; }
-       Fmt &showpos(bool s=true) { spos = s; return *this; }
-       Fmt &fill(wchar_t f) { fillc = f; return *this; }
-       Fmt &fixed() { fmode = FIXED; return *this; }
-       Fmt &scientific() { fmode = SCI; return *this; }
-       Fmt &showpoint(bool s=true) { spoint = s; return *this; }
-       Fmt &showbase(bool s=true) { sbase = s; return *this; }
-       Fmt &left() { align = LEFT; return *this; }
-       Fmt &right() { align = RIGHT; return *this; }
-       Fmt &dec() { base = DEC; return *this; }
-       Fmt &hex() { base = HEX; return *this; }
-       Fmt &oct() { base = OCT; return *this; }
-       Fmt &bin() { base = BIN; return *this; }
-       Fmt &uppercase(bool u=true) { ucase = u; return *this; }
-       Fmt &numeric() { type = NUM; return *this; }
-       Fmt &character() { type = CHAR; return *this; }
-       Fmt &string() { type = STR; return *this; }
-       Fmt &reset();
-
-       unsigned get_width() const { return wd; }
-       unsigned get_precision() const { return prec; }
-       bool get_showpos() const { return spos; }
-       wchar_t get_fill() const { return fillc; }
-       Base get_base() const { return base; }
-       bool get_showbase() const { return sbase; }
-       FloatMode get_floatmode() const { return fmode; }
-       bool get_showpoint() const { return spoint; }
-       Align get_align() const { return align; }
-       bool get_uppercase() const { return ucase; }
-       Type get_type() const { return type; }
-
-       void apply(std::ostream &) const;
-};
-
-inline std::ostream &operator<<(std::ostream &o, const Fmt &f)
-{ f.apply(o); return o; }
-
-} // namespace Msp
-
-#endif
diff --git a/source/formatter.cpp b/source/formatter.cpp
deleted file mode 100644 (file)
index d9d311d..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "formatter.h"
-
-using namespace std;
-
-namespace Msp {
-
-Formatter::Formatter(const string &f):
-       fmt(f),
-       pos(fmt.begin())
-{
-       advance();
-}
-
-/**
-Returns the result of the formatting operation.  Will throw if not enough
-values have been fed to the formatter.
-*/
-const string &Formatter::str() const
-{
-       if(pos!=fmt.end())
-               throw Exception("Too few arguments for format");
-
-       return result;
-}
-
-/**
-Advances the pos iterator to the next conversion, adding literal characters to
-the result.  The iterator is left at the second character of the conversion
-(i.e. after the %).
-*/
-void Formatter::advance()
-{
-       for(; pos!=fmt.end(); ++pos)
-       {
-               if(*pos=='%')
-               {
-                       ++pos;
-                       if(pos==fmt.end())
-                               throw Exception("Malformed format string");
-                       if(*pos!='%')
-                               break;
-               }
-
-               result += *pos;
-       }
-}
-
-/**
-Reads the next conversion from the format string and returns a corresponding
-Fmt object.
-*/
-Fmt Formatter::get_conversion()
-{
-       if(pos==fmt.end())
-               throw Exception("Too many arguments for format");
-
-       string::iterator i = pos;
-       for(; i!=fmt.end(); ++i)
-               if(isalpha(*i))
-                       break;
-
-       if(i==fmt.end())
-               throw Exception("Malformed format string");
-
-       ++i;
-       string c(pos, i);
-       pos = i;
-
-       return Fmt(c);
-}
-
-} // namespace Msp
diff --git a/source/formatter.h b/source/formatter.h
deleted file mode 100644 (file)
index cde508b..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_FORMATTER_H_
-#define MSP_STRINGS_FORMATTER_H_
-
-#include <string>
-#include "lexicalcast.h"
-
-namespace Msp {
-
-/**
-Printf-like string formatter class.
-*/
-class Formatter
-{
-private:
-       std::string fmt;
-       std::string::iterator pos;
-       std::string result;
-
-public:
-       Formatter(const std::string &);
-
-       /** Extracts the next conversion from the format string and formats the
-       given value with it.  Will throw if no more conversions are found. */
-       template<typename T>
-       Formatter &operator()(const T &a)
-       {
-               result += lexical_cast(a, get_conversion());
-               advance();
-               return *this;
-       }
-
-       const std::string &str() const;
-private:
-       void advance();
-       Fmt get_conversion();
-};
-
-inline Formatter format(const std::string &f)
-{ return Formatter(f); }
-
-template<typename A1>
-inline std::string format(const std::string &f, const A1 &a1)
-{ return Formatter(f)(a1).str(); }
-
-template<typename A1, typename A2>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2)
-{ return Formatter(f)(a1)(a2).str(); }
-
-template<typename A1, typename A2, typename A3>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3)
-{ return Formatter(f)(a1)(a2)(a3).str(); }
-
-template<typename A1, typename A2, typename A3, typename A4>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
-{ return Formatter(f)(a1)(a2)(a3)(a4).str(); }
-
-template<typename A1, typename A2, typename A3, typename A4, typename A5>
-inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
-{ return Formatter(f)(a1)(a2)(a3)(a4)(a5).str(); }
-
-} // namespace Msp
-
-#endif
diff --git a/source/glob.cpp b/source/glob.cpp
deleted file mode 100644 (file)
index 0af6b9b..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "glob.h"
-
-using namespace std;
-
-namespace {
-
-template<bool icase>
-bool cmp(char c, char h);
-
-template<>
-bool cmp<true>(char c, char h)
-{ return tolower(c)==tolower(h); }
-
-template<>
-bool cmp<false>(char c, char h)
-{ return c==h; }
-
-template<bool icase>
-bool globmatch(string::const_iterator pat_i, const string::const_iterator &pat_e, string::const_iterator str_i, const string::const_iterator &str_e)
-{
-       while(pat_i!=pat_e && str_i!=str_e)
-       {
-               if(*pat_i=='?' || cmp<icase>(*str_i, *pat_i))
-               {
-                       ++pat_i;
-                       ++str_i;
-               }
-               else if(*pat_i=='*')
-               {
-                       ++pat_i;
-                       if(pat_i==pat_e)
-                               return true;
-                       
-                       for(; str_i!=str_e; ++str_i)
-                               if(cmp<icase>(*str_i, *pat_i) && globmatch<icase>(pat_i, pat_e, str_i, str_e))
-                                       return true;
-                       
-                       return false;
-               }
-               else
-                       return false;
-       }
-
-       return pat_i==pat_e && str_i==str_e;
-}
-
-}
-
-namespace Msp {
-
-bool globmatch(const string &pat, const string &str)
-{
-       return ::globmatch<false>(pat.begin(), pat.end(), str.begin(), str.end());
-}
-
-bool globcasematch(const string &pat, const string &str)
-{
-       return ::globmatch<true>(pat.begin(), pat.end(), str.begin(), str.end());
-}
-
-} // namespace Msp
diff --git a/source/glob.h b/source/glob.h
deleted file mode 100644 (file)
index 7942073..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_GLOB_H_
-#define MSP_STRINGS_GLOB_H_
-
-#include <string>
-
-namespace Msp {
-
-bool globmatch(const std::string &, const std::string &);
-bool globcasematch(const std::string &, const std::string &);
-
-} // namespace Msp
-
-#endif
diff --git a/source/iso2022jp.cpp b/source/iso2022jp.cpp
deleted file mode 100644 (file)
index d9c7cea..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-#include "ascii.h"
-#include "iso2022jp.h"
-#include "jisx0201.h"
-#include "jisx0208.h"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-void Iso2022Jp::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if(ch>=0 && ch<=0x7F && ch!=0x5C && ch!=0x7E)
-       {
-               if(mode!=ASCII && mode!=JISX0201)
-                       switch_mode(ASCII, buf);
-               buf += ch;
-       }
-       else if(ch==0x5C || ch==0x7E)
-       {
-               if(mode!=ASCII)
-                       switch_mode(ASCII, buf);
-               buf += ch;
-       }
-       else if(ch==0xA5 || ch==0x203E)
-       {
-               if(mode!=JISX0201)
-                       switch_mode(JISX0201, buf);
-               if(ch==0xA5)
-                       buf += 0x5C;
-               else if(ch==0x203E)
-                       buf += 0x7E;
-       }
-       else
-       {
-               Kuten jis = ucs_to_jisx0208(ch);
-               if(!jis)
-                       return error(ch, buf, "Can't express character in ISO-2022-JP");
-
-               if(mode!=JISX0208)
-                       switch_mode(JISX0208, buf);
-
-               char jbuf[2] = {jis.ku+0x20, jis.ten+0x20};
-               buf.append(jbuf, 2);
-       }
-}
-
-void Iso2022Jp::Encoder::sync(string &buf)
-{
-       if(mode!=ASCII)
-               switch_mode(ASCII, buf);
-}
-
-void Iso2022Jp::Encoder::reset()
-{
-       mode = ASCII;
-}
-
-void Iso2022Jp::Encoder::switch_mode(Mode m, string &buf)
-{
-       mode = m;
-       switch(mode)
-       {
-       case ASCII:    buf.append("\033(B", 3); break;
-       case JISX0201: buf.append("\033(J", 3); break;
-       case JISX0208: buf.append("\033$B", 3); break;
-       default: throw CodecError("WTF?  Invalid mode in Iso2022Jp::Encoder::switch_mode");
-       }
-}
-
-void Iso2022Jp::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       if(mode!=ASCII)
-               switch_mode(ASCII, buf);
-       buf += '?';
-}
-
-
-Iso2022Jp::Decoder::Decoder(ErrorMode em):
-       Codec::Decoder(em),
-       mode(ASCII),
-       dec(new Ascii::Decoder)
-{ }
-
-UnicodeChar Iso2022Jp::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       while(i!=str.end())
-       {
-               string::const_iterator j = i;
-
-               UnicodeChar result = -1;
-               if(*j==033)
-               {
-                       unsigned escape = 0;
-                       for(++j; j!=str.end(); ++j)
-                       {
-                               escape = escape<<8 | static_cast<unsigned char>(*j);
-                               if(*j>='@' && *j<='Z')
-                                       break;
-                       }
-
-                       bool ok = true;
-                       switch(escape)
-                       {
-                       case 0x2842: switch_mode(ASCII); break;    // ESC ( B
-                       case 0x284A: switch_mode(JISX0201); break; // ESC ( J
-                       case 0x2440:                               // ESC $ @
-                       case 0x2442: switch_mode(JISX0208); break; // ESC $ B
-                       default: ok = false;
-                       }
-
-                       if(ok)
-                               i = j;
-                       else
-                               result = *i;
-                       ++i;
-               }
-               else if(dec)
-                       return dec->decode_char(str, i);
-               else
-                       throw CodecError("WTF?  No sub-decoder for Iso2022Jp::Decoder");
-
-               if(result>=0)
-                       return result;
-       }
-
-       return -1;
-}
-
-void Iso2022Jp::Decoder::reset()
-{
-       delete dec;
-       mode = ASCII;
-       dec = new Ascii::Decoder;
-}
-
-void Iso2022Jp::Decoder::switch_mode(Mode m)
-{
-       delete dec;
-
-       mode = m;
-       switch(mode)
-       {
-       case ASCII: dec = new Ascii::Decoder; break;
-       case JISX0201: dec = new JisX0201::Decoder; break;
-       case JISX0208: dec = new JisX0208::Decoder; break;
-       }
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/iso2022jp.h b/source/iso2022jp.h
deleted file mode 100644 (file)
index 8a95f9d..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_ISO2022JP_H_
-#define MSP_STRINGS_ISO2022JP_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Iso2022Jp: public Codec
-{
-public:
-       enum Mode
-       {
-               ASCII,
-               JISX0201,
-               JISX0208
-       };
-
-       class Encoder: public Codec::Encoder
-       {
-       private:
-               Mode mode;
-
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em), mode(ASCII) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-               virtual void sync(std::string &);
-               virtual void reset();
-       private:
-               void switch_mode(Mode, std::string &);
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       private:
-               Mode mode;
-               Codec::Decoder *dec;
-
-       public:
-               Decoder(ErrorMode =THROW_ON_ERROR);
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-               virtual void reset();
-       private:
-               void switch_mode(Mode);
-       };
-
-       virtual const char *get_name() const { return "ISO-2022-JP"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/iso646fi.cpp b/source/iso646fi.cpp
deleted file mode 100644 (file)
index 100ce13..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "codecutils.h"
-#include "iso646fi.h"
-
-using namespace std;
-
-namespace {
-
-const unsigned map_size = 9;
-
-const int mapping[map_size*2]=
-{
-       0xC4, 0x5B,
-       0xC5, 0x5D,
-       0xD6, 0x5C,
-       0xDC, 0x5E,
-       0xE4, 0x7B,
-       0xE5, 0x7D,
-       0xE9, 0x60,
-       0xF6, 0x7C,
-       0xFC, 0x7E
-};
-
-}
-
-
-namespace Msp {
-namespace Codecs {
-
-void Iso646Fi::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       int tch = transform_mapping_or_direct(mapping, map_size, ch, false);
-       if(tch<0 || tch>0x7F)
-               error(ch, buf, "Can't express character in ISO-646-FI");
-       else
-               buf += tch;
-}
-
-void Iso646Fi::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf += '?';
-}
-
-
-UnicodeChar Iso646Fi::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       unsigned char ch = *i;
-       int tch = (ch<=0x7F ? transform_mapping_or_direct(mapping, map_size, ch, true) : -1);
-
-       UnicodeChar result;
-       if(tch==-1)
-               result = error("Undefined ISO-646-FI character");
-       else
-               result = tch;
-
-       ++i;
-       return result;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/iso646fi.h b/source/iso646fi.h
deleted file mode 100644 (file)
index 084e57f..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_ISO646FI_H_
-#define MSP_STRINGS_ISO646FI_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Iso646Fi: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "ISO-646-FI"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/iso88591.cpp b/source/iso88591.cpp
deleted file mode 100644 (file)
index 064d4a7..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "iso88591.h"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-void Iso88591::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if(ch<0 || ch>0xFF)
-               return error(ch, buf, "Can't express character in ISO-8859-1");
-
-       buf += ch;
-}
-
-void Iso88591::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf += '?';
-}
-
-
-UnicodeChar Iso88591::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       return static_cast<unsigned char>(*i++);
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/iso88591.h b/source/iso88591.h
deleted file mode 100644 (file)
index 4365c0d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_ISO88591_H_
-#define MSP_STRINGS_ISO88591_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Iso88591: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "ISO-8859-1"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/iso885915.cpp b/source/iso885915.cpp
deleted file mode 100644 (file)
index 3eccbcf..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "codecutils.h"
-#include "iso885915.h"
-
-using namespace std;
-
-namespace {
-
-const unsigned map_size = 8;
-
-const int mapping[map_size*2]=
-{
-       0x0152, 0xBC,
-       0x0153, 0xBD,
-       0x0160, 0xA6,
-       0x0161, 0xA8,
-       0x0178, 0xBE,
-       0x017D, 0xB4,
-       0x017E, 0xB8,
-       0x20AC, 0xA4
-};
-
-}
-
-
-namespace Msp {
-namespace Codecs {
-
-void Iso885915::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       int tch = transform_mapping_or_direct(mapping, map_size, ch, false);
-       if(tch<0 || tch>0xFF)
-               error(ch, buf, "Can't express character in ISO-8859-15");
-       else
-               buf += tch;
-
-}
-
-void Iso885915::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf += '?';
-}
-
-
-UnicodeChar Iso885915::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       unsigned char ch = *i;
-       int tch = transform_mapping_or_direct(mapping, map_size, ch, true);
-
-       UnicodeChar result;
-       if(tch==-1)
-               result = error("Undefined ISO-8859-15 character");
-       else
-               result = tch;
-
-       ++i;
-       return result;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/iso885915.h b/source/iso885915.h
deleted file mode 100644 (file)
index 3237c84..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_ISO885915_H_
-#define MSP_STRINGS_ISO885915_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Iso885915: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "ISO-8859-15"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/jisx0201.cpp b/source/jisx0201.cpp
deleted file mode 100644 (file)
index d3fe635..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "jisx0201.h"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-void JisX0201::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if(ch>=0 && ch<=0x7F && ch!=0x5C && ch!=0x7E)
-               buf += ch;
-       else if(ch==0xA5)
-               buf += 0x5C;
-       else if(ch==0x203E)
-               buf += 0x7E;
-       else if(ch>=0xFF61 && ch<=0xFF9F)
-               buf += ch-0xFEC0;
-       else
-               error(ch, buf, "Can't express character in JIS X 0201");
-}
-
-void JisX0201::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf += '?';
-}
-
-
-UnicodeChar JisX0201::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       unsigned char ch = *i;
-       UnicodeChar result;
-       if(ch==0x5C)
-               result = 0xA5;
-       else if(ch==0x7E)
-               result = 0x203E;
-       else if(ch<=0x7F)
-               result = ch;
-       else if(ch>=0xA1 && ch<=0xDF)
-               result = ch+0xFEC0;
-       else
-               result = error("Undefined JIS X 0201 character");
-
-       ++i;
-       return result;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/jisx0201.h b/source/jisx0201.h
deleted file mode 100644 (file)
index 41332de..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_JISX201_H_
-#define MSP_STRINGS_JISX201_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class JisX0201: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "JIS X 0201"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/jisx0208.cpp b/source/jisx0208.cpp
deleted file mode 100644 (file)
index 6b46b1b..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "jisx0208.h"
-
-#include "jisx0208.table"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-void JisX0208::Encoder::encode_char(UnicodeChar ucs, string &buf)
-{
-       unsigned short jis = ucs_to_jisx0208(ucs);
-       if(jis)
-       {
-               char jbuf[2] = {jis>>8, jis};
-               buf.append(jbuf, 2);
-       }
-       else
-               error(ucs, buf, "Can't express character in JIS X 0208");
-}
-
-void JisX0208::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf.append("!)", 2);
-}
-
-
-UnicodeChar JisX0208::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       string::const_iterator j = i;
-       Kuten jis;
-       jis.ku = *j++-0x20;
-
-       UnicodeChar result;
-       if(j==str.end())
-               result = error("Incomplete JIS X 0208 character");
-       else
-       {
-               jis.ten = *j++-0x20;
-               result = jisx0208_to_ucs(jis);
-               if(result==0)
-                       result = error("Undefined JIS X 0208 character");
-       }
-
-       i = j;
-       return result;
-}
-
-
-UnicodeChar jisx0208_to_ucs(Kuten jis)
-{
-       if(jis.ku==0 || jis.ku>0x5E || jis.ten==0 || jis.ten>0x5E)
-               return 0;
-
-       return jisx0208_to_ucs_table[jis.ku*94 + jis.ten - 95];
-}
-
-Kuten ucs_to_jisx0208(UnicodeChar c)
-{
-       if(c<0 || c>0xFFFF)
-               return Kuten();
-
-       unsigned i = 0;
-       for(unsigned bit=0x1000; bit; bit>>=1)
-       {
-               if(i+bit>=ucs_to_jisx0208_table_size)
-                       continue;
-               if(ucs_to_jisx0208_table[i+bit].ucs<=static_cast<unsigned short>(c))
-                       i += bit;
-       }
-
-       Kuten result;
-       if(ucs_to_jisx0208_table[i].ucs==static_cast<unsigned short>(c))
-       {
-               result.ku = (ucs_to_jisx0208_table[i].jis>>8)+1;
-               result.ten = ucs_to_jisx0208_table[i].jis+1;
-       }
-
-       return result;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/jisx0208.h b/source/jisx0208.h
deleted file mode 100644 (file)
index 0c4c4a6..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_JISX0208_H_
-#define MSP_STRINGS_JISX0208_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-/**
-Codec for the JIS X 0208 encoding.  This is not particularly useful as a
-stand-alone codec, due to lack of a linefeed character among other things,
-but is included as part of some other encodings.
-*/
-class JisX0208: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "JIS X 0208"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-
-struct Kuten
-{
-       unsigned short ku;
-       unsigned short ten;
-
-       Kuten(): ku(0), ten(0) { }
-
-       operator bool() { return ku!=0 && ten!=0; }
-};
-
-extern UnicodeChar jisx0208_to_ucs(Kuten);
-extern Kuten ucs_to_jisx0208(UnicodeChar);
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/jisx0208.table b/source/jisx0208.table
deleted file mode 100644 (file)
index b669cf1..0000000
+++ /dev/null
@@ -1,1917 +0,0 @@
-namespace {
-
-const unsigned short jisx0208_to_ucs_table[94*94] =
-{
-       0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 
-       0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 
-       0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x301C, 0x2016, 0xFF5C, 0x2026, 
-       0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 
-       0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 
-       0x2212, 0x00B1, 0x00D7, 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, 0x2234, 
-       0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 
-       0xFF06, 0xFF0A, 0xFF20, 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 
-       0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 
-       0x2193, 0x3013, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x2220, 
-       0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 
-       0x222B, 0x222C, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x212B, 0x2030, 0x266F, 
-       0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, 0     , 0     , 0     , 0     , 0x25EF, 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 
-       0xFF19, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0xFF21, 0xFF22, 0xFF23, 0xFF24, 
-       0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 
-       0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0     , 0     , 
-       0     , 0     , 0     , 0     , 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 
-       0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 
-       0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0     , 0     , 0     , 0     , 
-       0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 
-       0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 
-       0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 
-       0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 
-       0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 
-       0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 
-       0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 
-       0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 
-       0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 
-       0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 
-       0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 
-       0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 
-       0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 
-       0x30F5, 0x30F6, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 
-       0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x03B1, 0x03B2, 0x03B3, 0x03B4, 
-       0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 
-       0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 
-       0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 
-       0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 
-       0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 
-       0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 
-       0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 
-       0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 
-       0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 
-       0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 
-       0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 
-       0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 
-       0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 
-       0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 
-       0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D, 
-       0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 
-       0x9D5C, 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, 
-       0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 
-       0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, 
-       0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 
-       0x698E, 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, 0x6CBF, 
-       0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 
-       0x9D1B, 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 
-       0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 
-       0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 
-       0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 
-       0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 
-       0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 
-       0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 
-       0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 
-       0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 
-       0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 
-       0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 
-       0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 
-       0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 
-       0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 
-       0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 
-       0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 
-       0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 
-       0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 
-       0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 
-       0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 
-       0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 
-       0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 
-       0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 
-       0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 
-       0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4, 
-       0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 
-       0x8A18, 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 
-       0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 
-       0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, 
-       0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 
-       0x5F13, 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, 0x7B08, 
-       0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 
-       0x865A, 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 
-       0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 
-       0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 
-       0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 
-       0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 
-       0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 
-       0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 
-       0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 
-       0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 
-       0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 
-       0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 
-       0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 
-       0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 
-       0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 
-       0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 
-       0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 
-       0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 
-       0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 
-       0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 
-       0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 
-       0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 
-       0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 
-       0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 
-       0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 
-       0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, 
-       0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 
-       0x5E83, 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 
-       0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 
-       0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, 
-       0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 
-       0x92FC, 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, 
-       0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 
-       0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 
-       0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 
-       0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 
-       0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 
-       0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 
-       0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 
-       0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 
-       0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 
-       0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 
-       0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 
-       0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 
-       0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 
-       0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 
-       0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 
-       0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 
-       0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 
-       0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 
-       0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 
-       0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 
-       0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 
-       0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 
-       0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 
-       0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 
-       0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 
-       0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, 
-       0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 
-       0x81ED, 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, 
-       0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 
-       0x91CD, 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, 
-       0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 
-       0x696F, 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 
-       0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 
-       0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, 
-       0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 
-       0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 
-       0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 
-       0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 
-       0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 
-       0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 
-       0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 
-       0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 
-       0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 
-       0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 
-       0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 
-       0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 
-       0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 
-       0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 
-       0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 
-       0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 
-       0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 
-       0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 
-       0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 
-       0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 
-       0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 
-       0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 
-       0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 
-       0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, 
-       0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 
-       0x9291, 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, 
-       0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 
-       0x79DF, 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, 
-       0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 
-       0x6383, 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 
-       0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 
-       0x88C5, 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, 
-       0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 
-       0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 
-       0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 
-       0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 
-       0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 
-       0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 
-       0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 
-       0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 
-       0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 
-       0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 
-       0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 
-       0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 
-       0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 
-       0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 
-       0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 
-       0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 
-       0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 
-       0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 
-       0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 
-       0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 
-       0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 
-       0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 
-       0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 
-       0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013, 
-       0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 
-       0x93D1, 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, 
-       0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 
-       0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, 
-       0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 
-       0x5012, 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, 0x5D8B, 
-       0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 
-       0x71C8, 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 
-       0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 
-       0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 
-       0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 
-       0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 
-       0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 
-       0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 
-       0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 
-       0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 
-       0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 
-       0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 
-       0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 
-       0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 
-       0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 
-       0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 
-       0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 
-       0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 
-       0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 
-       0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 
-       0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 
-       0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 
-       0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 
-       0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 
-       0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 
-       0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E, 
-       0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 
-       0x7562, 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 
-       0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 
-       0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, 
-       0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 
-       0x6016, 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, 0x8B5C, 
-       0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 
-       0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 
-       0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 
-       0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 
-       0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 
-       0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 
-       0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 
-       0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 
-       0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 
-       0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 
-       0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 
-       0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 
-       0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 
-       0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 
-       0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 
-       0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 
-       0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 
-       0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 
-       0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 
-       0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 
-       0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 
-       0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 
-       0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 
-       0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 
-       0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 
-       0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, 
-       0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 
-       0x6709, 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 
-       0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 
-       0x5996, 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, 
-       0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 
-       0x617E, 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 
-       0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 
-       0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, 
-       0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 
-       0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 
-       0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 
-       0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 
-       0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 
-       0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 
-       0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 
-       0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 
-       0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 
-       0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 
-       0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 
-       0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 
-       0x6E7E, 0x7897, 0x8155, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 
-       0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 
-       0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 
-       0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 
-       0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 
-       0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 
-       0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 
-       0x5048, 0x505A, 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, 
-       0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 
-       0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 
-       0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 
-       0x56D8, 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, 
-       0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 
-       0x8655, 0x51E9, 0x51ED, 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 
-       0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 
-       0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 
-       0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 
-       0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 
-       0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 
-       0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 
-       0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 
-       0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 
-       0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 
-       0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, 
-       0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 
-       0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, 
-       0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 
-       0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, 
-       0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 
-       0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 
-       0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 
-       0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, 
-       0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 
-       0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 
-       0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 
-       0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 
-       0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 
-       0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 
-       0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 
-       0x5955, 0x5950, 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, 
-       0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 
-       0x59DA, 0x5A25, 0x5A1F, 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, 
-       0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 
-       0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, 
-       0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 
-       0x6588, 0x5B7A, 0x5B80, 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 
-       0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 
-       0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 
-       0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 
-       0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 
-       0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 
-       0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 
-       0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 
-       0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 
-       0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 
-       0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 
-       0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 
-       0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 
-       0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 
-       0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 
-       0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 
-       0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 
-       0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 
-       0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, 
-       0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 
-       0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 
-       0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 
-       0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 
-       0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 
-       0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 
-       0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 
-       0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B, 
-       0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 
-       0x6260, 0x6268, 0x627C, 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, 
-       0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 
-       0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, 
-       0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 
-       0x639F, 0x63B5, 0x636B, 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6, 
-       0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 
-       0x646F, 0x6476, 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 
-       0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 
-       0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 
-       0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 
-       0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 
-       0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 
-       0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 
-       0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 
-       0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC, 
-       0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 
-       0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 
-       0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 
-       0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, 
-       0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 
-       0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, 0x68AD, 
-       0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 
-       0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 
-       0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 
-       0x6928, 0x692A, 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 
-       0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 
-       0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 
-       0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 
-       0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 
-       0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 
-       0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3, 
-       0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 
-       0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 
-       0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 
-       0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, 
-       0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 
-       0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55, 
-       0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 
-       0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 
-       0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 
-       0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 
-       0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 
-       0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 
-       0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 
-       0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 
-       0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 
-       0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 
-       0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 
-       0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 
-       0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 
-       0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, 
-       0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 
-       0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 
-       0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 
-       0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 
-       0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 
-       0x723F, 0x7240, 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 
-       0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 
-       0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 
-       0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 
-       0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 
-       0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 
-       0x746A, 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, 
-       0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 
-       0x7505, 0x750C, 0x750E, 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 
-       0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 
-       0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, 
-       0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 
-       0x75DE, 0x75FE, 0x75FF, 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, 
-       0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 
-       0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 
-       0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 
-       0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 
-       0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 
-       0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 
-       0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 
-       0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 
-       0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 
-       0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, 
-       0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 
-       0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 
-       0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 
-       0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, 
-       0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 
-       0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 
-       0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 
-       0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, 
-       0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 
-       0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 
-       0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 
-       0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 
-       0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 
-       0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 
-       0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 
-       0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, 
-       0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 
-       0x7D56, 0x7D4E, 0x7D72, 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 
-       0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 
-       0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, 
-       0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 
-       0x7E39, 0x7E43, 0x7E37, 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 
-       0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 
-       0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 
-       0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 
-       0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 
-       0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 
-       0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 
-       0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 
-       0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 
-       0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 
-       0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, 
-       0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 
-       0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, 
-       0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 
-       0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, 
-       0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 
-       0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 
-       0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 
-       0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, 
-       0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 
-       0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 
-       0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 
-       0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 
-       0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 
-       0x8469, 0x8446, 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 
-       0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 
-       0x8518, 0x852C, 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, 
-       0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 
-       0x859B, 0x85EA, 0x8587, 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, 
-       0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 
-       0x861A, 0x8630, 0x863F, 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, 
-       0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 
-       0x86DE, 0x86E9, 0x86EC, 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 
-       0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 
-       0x8760, 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 
-       0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 
-       0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 
-       0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 
-       0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 
-       0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 
-       0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 
-       0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 
-       0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E, 
-       0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 
-       0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, 
-       0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 
-       0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 
-       0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 
-       0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 
-       0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 
-       0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 
-       0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 
-       0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 
-       0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 
-       0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 
-       0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 
-       0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 
-       0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 
-       0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A, 
-       0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 
-       0x8E72, 0x8E7C, 0x8E81, 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, 
-       0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 
-       0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, 
-       0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 
-       0x8F4E, 0x8F57, 0x8F5C, 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7, 
-       0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 
-       0x9021, 0x900D, 0x901E, 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 
-       0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 
-       0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 
-       0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 
-       0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 
-       0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 
-       0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 
-       0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 
-       0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E, 
-       0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 
-       0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 
-       0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 
-       0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, 
-       0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 
-       0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, 0x95CA, 
-       0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 
-       0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 
-       0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 
-       0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 
-       0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 
-       0x9724, 0x972A, 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 
-       0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 
-       0x9786, 0x978B, 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 
-       0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 
-       0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870, 
-       0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 
-       0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 
-       0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 
-       0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, 
-       0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 
-       0x9A42, 0x9A40, 0x9A43, 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64, 
-       0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 
-       0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 
-       0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 
-       0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 
-       0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 
-       0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 
-       0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 
-       0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 
-       0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 
-       0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 
-       0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 
-       0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 
-       0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 
-       0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 
-       0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 
-       0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 
-       0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 
-       0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 
-       0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
-       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     
-};
-
-struct UcsToJis
-{
-       unsigned short ucs;
-       unsigned short jis;
-};
-const UcsToJis ucs_to_jisx0208_table[] =
-{
-       { 0x005C, 0x0120 }, { 0x00A2, 0x0151 }, { 0x00A3, 0x0152 }, { 0x00A7, 0x0158 }, { 0x00A8, 0x010F }, { 0x00AC, 0x022C }, 
-       { 0x00B0, 0x014B }, { 0x00B1, 0x013E }, { 0x00B4, 0x010D }, { 0x00B6, 0x0259 }, { 0x00D7, 0x013F }, { 0x00F7, 0x0140 }, 
-       { 0x0391, 0x0601 }, { 0x0392, 0x0602 }, { 0x0393, 0x0603 }, { 0x0394, 0x0604 }, { 0x0395, 0x0605 }, { 0x0396, 0x0606 }, 
-       { 0x0397, 0x0607 }, { 0x0398, 0x0608 }, { 0x0399, 0x0609 }, { 0x039A, 0x060A }, { 0x039B, 0x060B }, { 0x039C, 0x060C }, 
-       { 0x039D, 0x060D }, { 0x039E, 0x060E }, { 0x039F, 0x060F }, { 0x03A0, 0x0610 }, { 0x03A1, 0x0611 }, { 0x03A3, 0x0612 }, 
-       { 0x03A4, 0x0613 }, { 0x03A5, 0x0614 }, { 0x03A6, 0x0615 }, { 0x03A7, 0x0616 }, { 0x03A8, 0x0617 }, { 0x03A9, 0x0618 }, 
-       { 0x03B1, 0x0621 }, { 0x03B2, 0x0622 }, { 0x03B3, 0x0623 }, { 0x03B4, 0x0624 }, { 0x03B5, 0x0625 }, { 0x03B6, 0x0626 }, 
-       { 0x03B7, 0x0627 }, { 0x03B8, 0x0628 }, { 0x03B9, 0x0629 }, { 0x03BA, 0x062A }, { 0x03BB, 0x062B }, { 0x03BC, 0x062C }, 
-       { 0x03BD, 0x062D }, { 0x03BE, 0x062E }, { 0x03BF, 0x062F }, { 0x03C0, 0x0630 }, { 0x03C1, 0x0631 }, { 0x03C3, 0x0632 }, 
-       { 0x03C4, 0x0633 }, { 0x03C5, 0x0634 }, { 0x03C6, 0x0635 }, { 0x03C7, 0x0636 }, { 0x03C8, 0x0637 }, { 0x03C9, 0x0638 }, 
-       { 0x0401, 0x0707 }, { 0x0410, 0x0701 }, { 0x0411, 0x0702 }, { 0x0412, 0x0703 }, { 0x0413, 0x0704 }, { 0x0414, 0x0705 }, 
-       { 0x0415, 0x0706 }, { 0x0416, 0x0708 }, { 0x0417, 0x0709 }, { 0x0418, 0x070A }, { 0x0419, 0x070B }, { 0x041A, 0x070C }, 
-       { 0x041B, 0x070D }, { 0x041C, 0x070E }, { 0x041D, 0x070F }, { 0x041E, 0x0710 }, { 0x041F, 0x0711 }, { 0x0420, 0x0712 }, 
-       { 0x0421, 0x0713 }, { 0x0422, 0x0714 }, { 0x0423, 0x0715 }, { 0x0424, 0x0716 }, { 0x0425, 0x0717 }, { 0x0426, 0x0718 }, 
-       { 0x0427, 0x0719 }, { 0x0428, 0x071A }, { 0x0429, 0x071B }, { 0x042A, 0x071C }, { 0x042B, 0x071D }, { 0x042C, 0x071E }, 
-       { 0x042D, 0x071F }, { 0x042E, 0x0720 }, { 0x042F, 0x0721 }, { 0x0430, 0x0731 }, { 0x0431, 0x0732 }, { 0x0432, 0x0733 }, 
-       { 0x0433, 0x0734 }, { 0x0434, 0x0735 }, { 0x0435, 0x0736 }, { 0x0436, 0x0738 }, { 0x0437, 0x0739 }, { 0x0438, 0x073A }, 
-       { 0x0439, 0x073B }, { 0x043A, 0x073C }, { 0x043B, 0x073D }, { 0x043C, 0x073E }, { 0x043D, 0x073F }, { 0x043E, 0x0740 }, 
-       { 0x043F, 0x0741 }, { 0x0440, 0x0742 }, { 0x0441, 0x0743 }, { 0x0442, 0x0744 }, { 0x0443, 0x0745 }, { 0x0444, 0x0746 }, 
-       { 0x0445, 0x0747 }, { 0x0446, 0x0748 }, { 0x0447, 0x0749 }, { 0x0448, 0x074A }, { 0x0449, 0x074B }, { 0x044A, 0x074C }, 
-       { 0x044B, 0x074D }, { 0x044C, 0x074E }, { 0x044D, 0x074F }, { 0x044E, 0x0750 }, { 0x044F, 0x0751 }, { 0x0451, 0x0737 }, 
-       { 0x2010, 0x011E }, { 0x2015, 0x011D }, { 0x2016, 0x0122 }, { 0x2018, 0x0126 }, { 0x2019, 0x0127 }, { 0x201C, 0x0128 }, 
-       { 0x201D, 0x0129 }, { 0x2020, 0x0257 }, { 0x2021, 0x0258 }, { 0x2025, 0x0125 }, { 0x2026, 0x0124 }, { 0x2030, 0x0253 }, 
-       { 0x2032, 0x014C }, { 0x2033, 0x014D }, { 0x203B, 0x0208 }, { 0x2103, 0x014E }, { 0x212B, 0x0252 }, { 0x2190, 0x020B }, 
-       { 0x2191, 0x020C }, { 0x2192, 0x020A }, { 0x2193, 0x020D }, { 0x21D2, 0x022D }, { 0x21D4, 0x022E }, { 0x2200, 0x022F }, 
-       { 0x2202, 0x023F }, { 0x2203, 0x0230 }, { 0x2207, 0x0240 }, { 0x2208, 0x021A }, { 0x220B, 0x021B }, { 0x2212, 0x013D }, 
-       { 0x221A, 0x0245 }, { 0x221D, 0x0247 }, { 0x221E, 0x0147 }, { 0x2220, 0x023C }, { 0x2227, 0x022A }, { 0x2228, 0x022B }, 
-       { 0x2229, 0x0221 }, { 0x222A, 0x0220 }, { 0x222B, 0x0249 }, { 0x222C, 0x024A }, { 0x2234, 0x0148 }, { 0x2235, 0x0248 }, 
-       { 0x223D, 0x0246 }, { 0x2252, 0x0242 }, { 0x2260, 0x0142 }, { 0x2261, 0x0241 }, { 0x2266, 0x0145 }, { 0x2267, 0x0146 }, 
-       { 0x226A, 0x0243 }, { 0x226B, 0x0244 }, { 0x2282, 0x021E }, { 0x2283, 0x021F }, { 0x2286, 0x021C }, { 0x2287, 0x021D }, 
-       { 0x22A5, 0x023D }, { 0x2312, 0x023E }, { 0x2500, 0x0801 }, { 0x2501, 0x080C }, { 0x2502, 0x0802 }, { 0x2503, 0x080D }, 
-       { 0x250C, 0x0803 }, { 0x250F, 0x080E }, { 0x2510, 0x0804 }, { 0x2513, 0x080F }, { 0x2514, 0x0806 }, { 0x2517, 0x0811 }, 
-       { 0x2518, 0x0805 }, { 0x251B, 0x0810 }, { 0x251C, 0x0807 }, { 0x251D, 0x081C }, { 0x2520, 0x0817 }, { 0x2523, 0x0812 }, 
-       { 0x2524, 0x0809 }, { 0x2525, 0x081E }, { 0x2528, 0x0819 }, { 0x252B, 0x0814 }, { 0x252C, 0x0808 }, { 0x252F, 0x0818 }, 
-       { 0x2530, 0x081D }, { 0x2533, 0x0813 }, { 0x2534, 0x080A }, { 0x2537, 0x081A }, { 0x2538, 0x081F }, { 0x253B, 0x0815 }, 
-       { 0x253C, 0x080B }, { 0x253F, 0x081B }, { 0x2542, 0x0820 }, { 0x254B, 0x0816 }, { 0x25A0, 0x0203 }, { 0x25A1, 0x0202 }, 
-       { 0x25B2, 0x0205 }, { 0x25B3, 0x0204 }, { 0x25BC, 0x0207 }, { 0x25BD, 0x0206 }, { 0x25C6, 0x0201 }, { 0x25C7, 0x015E }, 
-       { 0x25CB, 0x015B }, { 0x25CE, 0x015D }, { 0x25CF, 0x015C }, { 0x25EF, 0x025E }, { 0x2605, 0x015A }, { 0x2606, 0x0159 }, 
-       { 0x2640, 0x014A }, { 0x2642, 0x0149 }, { 0x266A, 0x0256 }, { 0x266D, 0x0255 }, { 0x266F, 0x0254 }, { 0x3000, 0x0101 }, 
-       { 0x3001, 0x0102 }, { 0x3002, 0x0103 }, { 0x3003, 0x0117 }, { 0x3005, 0x0119 }, { 0x3006, 0x011A }, { 0x3007, 0x011B }, 
-       { 0x3008, 0x0132 }, { 0x3009, 0x0133 }, { 0x300A, 0x0134 }, { 0x300B, 0x0135 }, { 0x300C, 0x0136 }, { 0x300D, 0x0137 }, 
-       { 0x300E, 0x0138 }, { 0x300F, 0x0139 }, { 0x3010, 0x013A }, { 0x3011, 0x013B }, { 0x3012, 0x0209 }, { 0x3013, 0x020E }, 
-       { 0x3014, 0x012C }, { 0x3015, 0x012D }, { 0x301C, 0x0121 }, { 0x3041, 0x0401 }, { 0x3042, 0x0402 }, { 0x3043, 0x0403 }, 
-       { 0x3044, 0x0404 }, { 0x3045, 0x0405 }, { 0x3046, 0x0406 }, { 0x3047, 0x0407 }, { 0x3048, 0x0408 }, { 0x3049, 0x0409 }, 
-       { 0x304A, 0x040A }, { 0x304B, 0x040B }, { 0x304C, 0x040C }, { 0x304D, 0x040D }, { 0x304E, 0x040E }, { 0x304F, 0x040F }, 
-       { 0x3050, 0x0410 }, { 0x3051, 0x0411 }, { 0x3052, 0x0412 }, { 0x3053, 0x0413 }, { 0x3054, 0x0414 }, { 0x3055, 0x0415 }, 
-       { 0x3056, 0x0416 }, { 0x3057, 0x0417 }, { 0x3058, 0x0418 }, { 0x3059, 0x0419 }, { 0x305A, 0x041A }, { 0x305B, 0x041B }, 
-       { 0x305C, 0x041C }, { 0x305D, 0x041D }, { 0x305E, 0x041E }, { 0x305F, 0x041F }, { 0x3060, 0x0420 }, { 0x3061, 0x0421 }, 
-       { 0x3062, 0x0422 }, { 0x3063, 0x0423 }, { 0x3064, 0x0424 }, { 0x3065, 0x0425 }, { 0x3066, 0x0426 }, { 0x3067, 0x0427 }, 
-       { 0x3068, 0x0428 }, { 0x3069, 0x0429 }, { 0x306A, 0x042A }, { 0x306B, 0x042B }, { 0x306C, 0x042C }, { 0x306D, 0x042D }, 
-       { 0x306E, 0x042E }, { 0x306F, 0x042F }, { 0x3070, 0x0430 }, { 0x3071, 0x0431 }, { 0x3072, 0x0432 }, { 0x3073, 0x0433 }, 
-       { 0x3074, 0x0434 }, { 0x3075, 0x0435 }, { 0x3076, 0x0436 }, { 0x3077, 0x0437 }, { 0x3078, 0x0438 }, { 0x3079, 0x0439 }, 
-       { 0x307A, 0x043A }, { 0x307B, 0x043B }, { 0x307C, 0x043C }, { 0x307D, 0x043D }, { 0x307E, 0x043E }, { 0x307F, 0x043F }, 
-       { 0x3080, 0x0440 }, { 0x3081, 0x0441 }, { 0x3082, 0x0442 }, { 0x3083, 0x0443 }, { 0x3084, 0x0444 }, { 0x3085, 0x0445 }, 
-       { 0x3086, 0x0446 }, { 0x3087, 0x0447 }, { 0x3088, 0x0448 }, { 0x3089, 0x0449 }, { 0x308A, 0x044A }, { 0x308B, 0x044B }, 
-       { 0x308C, 0x044C }, { 0x308D, 0x044D }, { 0x308E, 0x044E }, { 0x308F, 0x044F }, { 0x3090, 0x0450 }, { 0x3091, 0x0451 }, 
-       { 0x3092, 0x0452 }, { 0x3093, 0x0453 }, { 0x309B, 0x010B }, { 0x309C, 0x010C }, { 0x309D, 0x0115 }, { 0x309E, 0x0116 }, 
-       { 0x30A1, 0x0501 }, { 0x30A2, 0x0502 }, { 0x30A3, 0x0503 }, { 0x30A4, 0x0504 }, { 0x30A5, 0x0505 }, { 0x30A6, 0x0506 }, 
-       { 0x30A7, 0x0507 }, { 0x30A8, 0x0508 }, { 0x30A9, 0x0509 }, { 0x30AA, 0x050A }, { 0x30AB, 0x050B }, { 0x30AC, 0x050C }, 
-       { 0x30AD, 0x050D }, { 0x30AE, 0x050E }, { 0x30AF, 0x050F }, { 0x30B0, 0x0510 }, { 0x30B1, 0x0511 }, { 0x30B2, 0x0512 }, 
-       { 0x30B3, 0x0513 }, { 0x30B4, 0x0514 }, { 0x30B5, 0x0515 }, { 0x30B6, 0x0516 }, { 0x30B7, 0x0517 }, { 0x30B8, 0x0518 }, 
-       { 0x30B9, 0x0519 }, { 0x30BA, 0x051A }, { 0x30BB, 0x051B }, { 0x30BC, 0x051C }, { 0x30BD, 0x051D }, { 0x30BE, 0x051E }, 
-       { 0x30BF, 0x051F }, { 0x30C0, 0x0520 }, { 0x30C1, 0x0521 }, { 0x30C2, 0x0522 }, { 0x30C3, 0x0523 }, { 0x30C4, 0x0524 }, 
-       { 0x30C5, 0x0525 }, { 0x30C6, 0x0526 }, { 0x30C7, 0x0527 }, { 0x30C8, 0x0528 }, { 0x30C9, 0x0529 }, { 0x30CA, 0x052A }, 
-       { 0x30CB, 0x052B }, { 0x30CC, 0x052C }, { 0x30CD, 0x052D }, { 0x30CE, 0x052E }, { 0x30CF, 0x052F }, { 0x30D0, 0x0530 }, 
-       { 0x30D1, 0x0531 }, { 0x30D2, 0x0532 }, { 0x30D3, 0x0533 }, { 0x30D4, 0x0534 }, { 0x30D5, 0x0535 }, { 0x30D6, 0x0536 }, 
-       { 0x30D7, 0x0537 }, { 0x30D8, 0x0538 }, { 0x30D9, 0x0539 }, { 0x30DA, 0x053A }, { 0x30DB, 0x053B }, { 0x30DC, 0x053C }, 
-       { 0x30DD, 0x053D }, { 0x30DE, 0x053E }, { 0x30DF, 0x053F }, { 0x30E0, 0x0540 }, { 0x30E1, 0x0541 }, { 0x30E2, 0x0542 }, 
-       { 0x30E3, 0x0543 }, { 0x30E4, 0x0544 }, { 0x30E5, 0x0545 }, { 0x30E6, 0x0546 }, { 0x30E7, 0x0547 }, { 0x30E8, 0x0548 }, 
-       { 0x30E9, 0x0549 }, { 0x30EA, 0x054A }, { 0x30EB, 0x054B }, { 0x30EC, 0x054C }, { 0x30ED, 0x054D }, { 0x30EE, 0x054E }, 
-       { 0x30EF, 0x054F }, { 0x30F0, 0x0550 }, { 0x30F1, 0x0551 }, { 0x30F2, 0x0552 }, { 0x30F3, 0x0553 }, { 0x30F4, 0x0554 }, 
-       { 0x30F5, 0x0555 }, { 0x30F6, 0x0556 }, { 0x30FB, 0x0106 }, { 0x30FC, 0x011C }, { 0x30FD, 0x0113 }, { 0x30FE, 0x0114 }, 
-       { 0x4E00, 0x104C }, { 0x4E01, 0x235A }, { 0x4E03, 0x1C17 }, { 0x4E07, 0x2B5C }, { 0x4E08, 0x1E46 }, { 0x4E09, 0x1B10 }, 
-       { 0x4E0A, 0x1E45 }, { 0x4E0B, 0x121C }, { 0x4E0D, 0x2934 }, { 0x4E0E, 0x2D1F }, { 0x4E10, 0x3002 }, { 0x4E11, 0x110F }, 
-       { 0x4E14, 0x134E }, { 0x4E15, 0x3003 }, { 0x4E16, 0x2004 }, { 0x4E17, 0x3222 }, { 0x4E18, 0x1536 }, { 0x4E19, 0x2A1A }, 
-       { 0x4E1E, 0x1E47 }, { 0x4E21, 0x2E1E }, { 0x4E26, 0x2A22 }, { 0x4E2A, 0x3004 }, { 0x4E2D, 0x2346 }, { 0x4E31, 0x3005 }, 
-       { 0x4E32, 0x165A }, { 0x4E36, 0x3006 }, { 0x4E38, 0x143D }, { 0x4E39, 0x2310 }, { 0x4E3B, 0x1C47 }, { 0x4E3C, 0x3007 }, 
-       { 0x4E3F, 0x3008 }, { 0x4E42, 0x3009 }, { 0x4E43, 0x2715 }, { 0x4E45, 0x1537 }, { 0x4E4B, 0x2717 }, { 0x4E4D, 0x2643 }, 
-       { 0x4E4E, 0x1823 }, { 0x4E4F, 0x2B13 }, { 0x4E55, 0x4929 }, { 0x4E56, 0x300A }, { 0x4E57, 0x1E48 }, { 0x4E58, 0x300B }, 
-       { 0x4E59, 0x1215 }, { 0x4E5D, 0x1645 }, { 0x4E5E, 0x1850 }, { 0x4E5F, 0x2C49 }, { 0x4E62, 0x3606 }, { 0x4E71, 0x2D50 }, 
-       { 0x4E73, 0x265D }, { 0x4E7E, 0x1405 }, { 0x4E80, 0x1515 }, { 0x4E82, 0x300C }, { 0x4E85, 0x300D }, { 0x4E86, 0x2E1B }, 
-       { 0x4E88, 0x2D1D }, { 0x4E89, 0x2148 }, { 0x4E8A, 0x300F }, { 0x4E8B, 0x1B56 }, { 0x4E8C, 0x2653 }, { 0x4E8E, 0x3012 }, 
-       { 0x4E91, 0x111E }, { 0x4E92, 0x183F }, { 0x4E94, 0x183E }, { 0x4E95, 0x1046 }, { 0x4E98, 0x2F2B }, { 0x4E99, 0x2F2A }, 
-       { 0x4E9B, 0x1A13 }, { 0x4E9C, 0x1001 }, { 0x4E9E, 0x3013 }, { 0x4E9F, 0x3014 }, { 0x4EA0, 0x3015 }, { 0x4EA1, 0x2B14 }, 
-       { 0x4EA2, 0x3016 }, { 0x4EA4, 0x1852 }, { 0x4EA5, 0x1047 }, { 0x4EA6, 0x2B52 }, { 0x4EA8, 0x155C }, { 0x4EAB, 0x155D }, 
-       { 0x4EAC, 0x155E }, { 0x4EAD, 0x2442 }, { 0x4EAE, 0x2E1C }, { 0x4EB0, 0x3017 }, { 0x4EB3, 0x3018 }, { 0x4EB6, 0x3019 }, 
-       { 0x4EBA, 0x1F2D }, { 0x4EC0, 0x1D1A }, { 0x4EC1, 0x1F2E }, { 0x4EC2, 0x301E }, { 0x4EC4, 0x301C }, { 0x4EC6, 0x301D }, 
-       { 0x4EC7, 0x1538 }, { 0x4ECA, 0x1A03 }, { 0x4ECB, 0x1250 }, { 0x4ECD, 0x301B }, { 0x4ECE, 0x301A }, { 0x4ECF, 0x2A09 }, 
-       { 0x4ED4, 0x1B26 }, { 0x4ED5, 0x1B25 }, { 0x4ED6, 0x221E }, { 0x4ED7, 0x301F }, { 0x4ED8, 0x2935 }, { 0x4ED9, 0x2047 }, 
-       { 0x4EDD, 0x0118 }, { 0x4EDE, 0x3020 }, { 0x4EDF, 0x3022 }, { 0x4EE3, 0x2245 }, { 0x4EE4, 0x2E41 }, { 0x4EE5, 0x102A }, 
-       { 0x4EED, 0x3021 }, { 0x4EEE, 0x121E }, { 0x4EF0, 0x1624 }, { 0x4EF2, 0x2347 }, { 0x4EF6, 0x174F }, { 0x4EF7, 0x3023 }, 
-       { 0x4EFB, 0x2704 }, { 0x4F01, 0x144B }, { 0x4F09, 0x3024 }, { 0x4F0A, 0x102B }, { 0x4F0D, 0x1840 }, { 0x4F0E, 0x144C }, 
-       { 0x4F0F, 0x295A }, { 0x4F10, 0x2812 }, { 0x4F11, 0x1539 }, { 0x4F1A, 0x1251 }, { 0x4F1C, 0x3047 }, { 0x4F1D, 0x2521 }, 
-       { 0x4F2F, 0x274C }, { 0x4F30, 0x3026 }, { 0x4F34, 0x281C }, { 0x4F36, 0x2E42 }, { 0x4F38, 0x1F0D }, { 0x4F3A, 0x1B27 }, 
-       { 0x4F3C, 0x1B57 }, { 0x4F3D, 0x1220 }, { 0x4F43, 0x2431 }, { 0x4F46, 0x2302 }, { 0x4F47, 0x302A }, { 0x4F4D, 0x102C }, 
-       { 0x4F4E, 0x2443 }, { 0x4F4F, 0x1D1B }, { 0x4F50, 0x1A14 }, { 0x4F51, 0x2D04 }, { 0x4F53, 0x222E }, { 0x4F55, 0x121F }, 
-       { 0x4F57, 0x3029 }, { 0x4F59, 0x2D1E }, { 0x4F5A, 0x3025 }, { 0x4F5B, 0x3027 }, { 0x4F5C, 0x1A4E }, { 0x4F5D, 0x3028 }, 
-       { 0x4F5E, 0x3504 }, { 0x4F69, 0x3030 }, { 0x4F6F, 0x3033 }, { 0x4F70, 0x3031 }, { 0x4F73, 0x1222 }, { 0x4F75, 0x2A1B }, 
-       { 0x4F76, 0x302B }, { 0x4F7B, 0x302F }, { 0x4F7C, 0x1853 }, { 0x4F7F, 0x1B28 }, { 0x4F83, 0x1406 }, { 0x4F86, 0x3034 }, 
-       { 0x4F88, 0x302C }, { 0x4F8B, 0x2E43 }, { 0x4F8D, 0x1B58 }, { 0x4F8F, 0x302D }, { 0x4F91, 0x3032 }, { 0x4F96, 0x3035 }, 
-       { 0x4F98, 0x302E }, { 0x4F9B, 0x1601 }, { 0x4F9D, 0x102D }, { 0x4FA0, 0x1602 }, { 0x4FA1, 0x1221 }, { 0x4FAB, 0x3505 }, 
-       { 0x4FAD, 0x2B59 }, { 0x4FAE, 0x294E }, { 0x4FAF, 0x1854 }, { 0x4FB5, 0x1F0F }, { 0x4FB6, 0x2E17 }, { 0x4FBF, 0x2A38 }, 
-       { 0x4FC2, 0x1718 }, { 0x4FC3, 0x2205 }, { 0x4FC4, 0x1244 }, { 0x4FCA, 0x1D33 }, { 0x4FCE, 0x3039 }, { 0x4FD0, 0x303E }, 
-       { 0x4FD1, 0x303C }, { 0x4FD4, 0x3037 }, { 0x4FD7, 0x220F }, { 0x4FD8, 0x303A }, { 0x4FDA, 0x303D }, { 0x4FDB, 0x303B }, 
-       { 0x4FDD, 0x2A3D }, { 0x4FDF, 0x3038 }, { 0x4FE1, 0x1F0E }, { 0x4FE3, 0x2B53 }, { 0x4FE4, 0x303F }, { 0x4FE5, 0x3040 }, 
-       { 0x4FEE, 0x1D04 }, { 0x4FEF, 0x304D }, { 0x4FF3, 0x2730 }, { 0x4FF5, 0x2916 }, { 0x4FF6, 0x3048 }, { 0x4FF8, 0x2A50 }, 
-       { 0x4FFA, 0x1216 }, { 0x4FFE, 0x304C }, { 0x5005, 0x3046 }, { 0x5006, 0x304F }, { 0x5009, 0x2132 }, { 0x500B, 0x1824 }, 
-       { 0x500D, 0x273C }, { 0x500F, 0x4027 }, { 0x5011, 0x304E }, { 0x5012, 0x253D }, { 0x5014, 0x3043 }, { 0x5016, 0x1856 }, 
-       { 0x5019, 0x1855 }, { 0x501A, 0x3041 }, { 0x501F, 0x1C3A }, { 0x5021, 0x3049 }, { 0x5023, 0x2A4F }, { 0x5024, 0x232D }, 
-       { 0x5025, 0x3045 }, { 0x5026, 0x1751 }, { 0x5028, 0x3042 }, { 0x5029, 0x304A }, { 0x502A, 0x3044 }, { 0x502B, 0x2E31 }, 
-       { 0x502C, 0x304B }, { 0x502D, 0x2F21 }, { 0x5036, 0x1646 }, { 0x5039, 0x1750 }, { 0x5043, 0x3050 }, { 0x5047, 0x3051 }, 
-       { 0x5048, 0x3055 }, { 0x5049, 0x102E }, { 0x504F, 0x2A30 }, { 0x5050, 0x3054 }, { 0x5055, 0x3053 }, { 0x5056, 0x3057 }, 
-       { 0x505A, 0x3056 }, { 0x505C, 0x2444 }, { 0x5065, 0x1752 }, { 0x506C, 0x3058 }, { 0x5072, 0x1C25 }, { 0x5074, 0x2206 }, 
-       { 0x5075, 0x2445 }, { 0x5076, 0x1656 }, { 0x5078, 0x3059 }, { 0x507D, 0x1516 }, { 0x5080, 0x305A }, { 0x5085, 0x305C }, 
-       { 0x508D, 0x2B15 }, { 0x5091, 0x1746 }, { 0x5098, 0x1B11 }, { 0x5099, 0x2857 }, { 0x509A, 0x305B }, { 0x50AC, 0x1A25 }, 
-       { 0x50AD, 0x2D23 }, { 0x50B2, 0x305E }, { 0x50B3, 0x3103 }, { 0x50B4, 0x305D }, { 0x50B5, 0x1A24 }, { 0x50B7, 0x1D5D }, 
-       { 0x50BE, 0x1719 }, { 0x50C2, 0x3104 }, { 0x50C5, 0x162F }, { 0x50C9, 0x3101 }, { 0x50CA, 0x3102 }, { 0x50CD, 0x260F }, 
-       { 0x50CF, 0x215C }, { 0x50D1, 0x1603 }, { 0x50D5, 0x2B2D }, { 0x50D6, 0x3105 }, { 0x50DA, 0x2E1D }, { 0x50DE, 0x3106 }, 
-       { 0x50E3, 0x3109 }, { 0x50E5, 0x3107 }, { 0x50E7, 0x212E }, { 0x50ED, 0x3108 }, { 0x50EE, 0x310A }, { 0x50F5, 0x310C }, 
-       { 0x50F9, 0x310B }, { 0x50FB, 0x2A28 }, { 0x5100, 0x1517 }, { 0x5101, 0x310E }, { 0x5102, 0x310F }, { 0x5104, 0x120F }, 
-       { 0x5109, 0x310D }, { 0x5112, 0x1C54 }, { 0x5114, 0x3112 }, { 0x5115, 0x3111 }, { 0x5116, 0x3110 }, { 0x5118, 0x3036 }, 
-       { 0x511A, 0x3113 }, { 0x511F, 0x1D5E }, { 0x5121, 0x3114 }, { 0x512A, 0x2D05 }, { 0x5132, 0x2C39 }, { 0x5137, 0x3116 }, 
-       { 0x513A, 0x3115 }, { 0x513B, 0x3118 }, { 0x513C, 0x3117 }, { 0x513F, 0x3119 }, { 0x5140, 0x311A }, { 0x5141, 0x1054 }, 
-       { 0x5143, 0x1815 }, { 0x5144, 0x171B }, { 0x5145, 0x1D1C }, { 0x5146, 0x235B }, { 0x5147, 0x1604 }, { 0x5148, 0x2048 }, 
-       { 0x5149, 0x1857 }, { 0x514B, 0x194E }, { 0x514C, 0x311C }, { 0x514D, 0x2C28 }, { 0x514E, 0x2526 }, { 0x5150, 0x1B59 }, 
-       { 0x5152, 0x311B }, { 0x5154, 0x311D }, { 0x515A, 0x253E }, { 0x515C, 0x1355 }, { 0x5162, 0x311E }, { 0x5165, 0x265E }, 
-       { 0x5168, 0x2114 }, { 0x5169, 0x3120 }, { 0x516A, 0x3121 }, { 0x516B, 0x280C }, { 0x516C, 0x1858 }, { 0x516D, 0x2F1B }, 
-       { 0x516E, 0x3122 }, { 0x5171, 0x1606 }, { 0x5175, 0x2A1C }, { 0x5176, 0x2216 }, { 0x5177, 0x1651 }, { 0x5178, 0x2515 }, 
-       { 0x517C, 0x1753 }, { 0x5180, 0x3123 }, { 0x5182, 0x3124 }, { 0x5185, 0x2642 }, { 0x5186, 0x113F }, { 0x5189, 0x3127 }, 
-       { 0x518A, 0x1A5D }, { 0x518C, 0x3126 }, { 0x518D, 0x1A26 }, { 0x518F, 0x3128 }, { 0x5190, 0x464E }, { 0x5191, 0x3129 }, 
-       { 0x5192, 0x2B21 }, { 0x5193, 0x312A }, { 0x5195, 0x312B }, { 0x5196, 0x312C }, { 0x5197, 0x1E49 }, { 0x5199, 0x1C2C }, 
-       { 0x51A0, 0x1407 }, { 0x51A2, 0x312F }, { 0x51A4, 0x312D }, { 0x51A5, 0x2C1D }, { 0x51A6, 0x312E }, { 0x51A8, 0x293A }, 
-       { 0x51A9, 0x3130 }, { 0x51AA, 0x3131 }, { 0x51AB, 0x3132 }, { 0x51AC, 0x253F }, { 0x51B0, 0x3136 }, { 0x51B1, 0x3134 }, 
-       { 0x51B2, 0x3135 }, { 0x51B3, 0x3133 }, { 0x51B4, 0x1A43 }, { 0x51B5, 0x3137 }, { 0x51B6, 0x2C4A }, { 0x51B7, 0x2E44 }, 
-       { 0x51BD, 0x3138 }, { 0x51C4, 0x2008 }, { 0x51C5, 0x3139 }, { 0x51C6, 0x1D3A }, { 0x51C9, 0x313A }, { 0x51CB, 0x235C }, 
-       { 0x51CC, 0x2E1F }, { 0x51CD, 0x2540 }, { 0x51D6, 0x3225 }, { 0x51DB, 0x313B }, { 0x51DC, 0x5405 }, { 0x51DD, 0x1625 }, 
-       { 0x51E0, 0x313C }, { 0x51E1, 0x2B3E }, { 0x51E6, 0x1D48 }, { 0x51E7, 0x225C }, { 0x51E9, 0x313E }, { 0x51EA, 0x2644 }, 
-       { 0x51ED, 0x313F }, { 0x51F0, 0x3140 }, { 0x51F1, 0x130E }, { 0x51F5, 0x3141 }, { 0x51F6, 0x1607 }, { 0x51F8, 0x262C }, 
-       { 0x51F9, 0x115A }, { 0x51FA, 0x1D30 }, { 0x51FD, 0x2801 }, { 0x51FE, 0x3142 }, { 0x5200, 0x2541 }, { 0x5203, 0x1F2F }, 
-       { 0x5204, 0x3143 }, { 0x5206, 0x2A0C }, { 0x5207, 0x203A }, { 0x5208, 0x1402 }, { 0x520A, 0x1409 }, { 0x520B, 0x3144 }, 
-       { 0x520E, 0x3146 }, { 0x5211, 0x171A }, { 0x5214, 0x3145 }, { 0x5217, 0x2E53 }, { 0x521D, 0x1D49 }, { 0x5224, 0x281D }, 
-       { 0x5225, 0x2A2C }, { 0x5227, 0x3147 }, { 0x5229, 0x2D58 }, { 0x522A, 0x3148 }, { 0x522E, 0x3149 }, { 0x5230, 0x255E }, 
-       { 0x5233, 0x314A }, { 0x5236, 0x2009 }, { 0x5237, 0x1A5E }, { 0x5238, 0x1754 }, { 0x5239, 0x314B }, { 0x523A, 0x1B29 }, 
-       { 0x523B, 0x194F }, { 0x5243, 0x2446 }, { 0x5244, 0x314D }, { 0x5247, 0x2207 }, { 0x524A, 0x1A4F }, { 0x524B, 0x314E }, 
-       { 0x524C, 0x314F }, { 0x524D, 0x2110 }, { 0x524F, 0x314C }, { 0x5254, 0x3151 }, { 0x5256, 0x2B16 }, { 0x525B, 0x1944 }, 
-       { 0x525E, 0x3150 }, { 0x5263, 0x1755 }, { 0x5264, 0x1A3E }, { 0x5265, 0x274D }, { 0x5269, 0x3154 }, { 0x526A, 0x3152 }, 
-       { 0x526F, 0x295B }, { 0x5270, 0x1E4A }, { 0x5271, 0x315B }, { 0x5272, 0x1344 }, { 0x5273, 0x3155 }, { 0x5274, 0x3153 }, 
-       { 0x5275, 0x212F }, { 0x527D, 0x3157 }, { 0x527F, 0x3156 }, { 0x5283, 0x1324 }, { 0x5287, 0x1740 }, { 0x5288, 0x315C }, 
-       { 0x5289, 0x2E0D }, { 0x528D, 0x3158 }, { 0x5291, 0x315D }, { 0x5292, 0x315A }, { 0x5294, 0x3159 }, { 0x529B, 0x2E2F }, 
-       { 0x529F, 0x1859 }, { 0x52A0, 0x1223 }, { 0x52A3, 0x2E54 }, { 0x52A9, 0x1D55 }, { 0x52AA, 0x2538 }, { 0x52AB, 0x1945 }, 
-       { 0x52AC, 0x3202 }, { 0x52AD, 0x3203 }, { 0x52B1, 0x2E45 }, { 0x52B4, 0x2F0B }, { 0x52B5, 0x3205 }, { 0x52B9, 0x185A }, 
-       { 0x52BC, 0x3204 }, { 0x52BE, 0x130F }, { 0x52C1, 0x3206 }, { 0x52C3, 0x2B36 }, { 0x52C5, 0x241C }, { 0x52C7, 0x2D06 }, 
-       { 0x52C9, 0x2A39 }, { 0x52CD, 0x3207 }, { 0x52D2, 0x5035 }, { 0x52D5, 0x2610 }, { 0x52D7, 0x3208 }, { 0x52D8, 0x140A }, 
-       { 0x52D9, 0x2C13 }, { 0x52DD, 0x1E01 }, { 0x52DE, 0x3209 }, { 0x52DF, 0x2A47 }, { 0x52E0, 0x320D }, { 0x52E2, 0x200A }, 
-       { 0x52E3, 0x320A }, { 0x52E4, 0x1630 }, { 0x52E6, 0x320B }, { 0x52E7, 0x140B }, { 0x52F2, 0x170E }, { 0x52F3, 0x320E }, 
-       { 0x52F5, 0x320F }, { 0x52F8, 0x3210 }, { 0x52F9, 0x3211 }, { 0x52FA, 0x1C3B }, { 0x52FE, 0x185B }, { 0x52FF, 0x2C3E }, 
-       { 0x5301, 0x2C48 }, { 0x5302, 0x2657 }, { 0x5305, 0x2A51 }, { 0x5306, 0x3212 }, { 0x5308, 0x3213 }, { 0x530D, 0x3215 }, 
-       { 0x530F, 0x3217 }, { 0x5310, 0x3216 }, { 0x5315, 0x3218 }, { 0x5316, 0x121D }, { 0x5317, 0x2B2C }, { 0x5319, 0x1A5C }, 
-       { 0x531A, 0x3219 }, { 0x531D, 0x2139 }, { 0x5320, 0x1E02 }, { 0x5321, 0x1609 }, { 0x5323, 0x321A }, { 0x532A, 0x283B }, 
-       { 0x532F, 0x321B }, { 0x5331, 0x321C }, { 0x5333, 0x321D }, { 0x5338, 0x321E }, { 0x5339, 0x2904 }, { 0x533A, 0x1648 }, 
-       { 0x533B, 0x1045 }, { 0x533F, 0x261F }, { 0x5340, 0x321F }, { 0x5341, 0x1D1D }, { 0x5343, 0x2049 }, { 0x5345, 0x3221 }, 
-       { 0x5346, 0x3220 }, { 0x5347, 0x1E03 }, { 0x5348, 0x1841 }, { 0x5349, 0x3223 }, { 0x534A, 0x281E }, { 0x534D, 0x3224 }, 
-       { 0x5351, 0x283C }, { 0x5352, 0x2214 }, { 0x5353, 0x224E }, { 0x5354, 0x1608 }, { 0x5357, 0x264E }, { 0x5358, 0x2311 }, 
-       { 0x535A, 0x274E }, { 0x535C, 0x2B2E }, { 0x535E, 0x3226 }, { 0x5360, 0x204A }, { 0x5366, 0x1715 }, { 0x5369, 0x3227 }, 
-       { 0x536E, 0x3228 }, { 0x536F, 0x110C }, { 0x5370, 0x1055 }, { 0x5371, 0x144D }, { 0x5373, 0x2208 }, { 0x5374, 0x1531 }, 
-       { 0x5375, 0x2D51 }, { 0x5377, 0x322B }, { 0x5378, 0x1217 }, { 0x537B, 0x322A }, { 0x537F, 0x160A }, { 0x5382, 0x322C }, 
-       { 0x5384, 0x2C51 }, { 0x5396, 0x322D }, { 0x5398, 0x2E32 }, { 0x539A, 0x185C }, { 0x539F, 0x1816 }, { 0x53A0, 0x322E }, 
-       { 0x53A5, 0x3230 }, { 0x53A6, 0x322F }, { 0x53A8, 0x1F3F }, { 0x53A9, 0x1119 }, { 0x53AD, 0x113E }, { 0x53AE, 0x3231 }, 
-       { 0x53B0, 0x3232 }, { 0x53B3, 0x1817 }, { 0x53B6, 0x3233 }, { 0x53BB, 0x154E }, { 0x53C2, 0x1B12 }, { 0x53C3, 0x3234 }, 
-       { 0x53C8, 0x2B54 }, { 0x53C9, 0x1A15 }, { 0x53CA, 0x153A }, { 0x53CB, 0x2D07 }, { 0x53CC, 0x2130 }, { 0x53CD, 0x281F }, 
-       { 0x53CE, 0x1C5D }, { 0x53D4, 0x1D27 }, { 0x53D6, 0x1C48 }, { 0x53D7, 0x1C55 }, { 0x53D9, 0x1D56 }, { 0x53DB, 0x2820 }, 
-       { 0x53DF, 0x3237 }, { 0x53E1, 0x1123 }, { 0x53E2, 0x2131 }, { 0x53E3, 0x185D }, { 0x53E4, 0x1825 }, { 0x53E5, 0x1647 }, 
-       { 0x53E8, 0x323B }, { 0x53E9, 0x2301 }, { 0x53EA, 0x225E }, { 0x53EB, 0x160B }, { 0x53EC, 0x1E04 }, { 0x53ED, 0x323C }, 
-       { 0x53EE, 0x323A }, { 0x53EF, 0x1224 }, { 0x53F0, 0x2246 }, { 0x53F1, 0x1C18 }, { 0x53F2, 0x1B2B }, { 0x53F3, 0x1106 }, 
-       { 0x53F6, 0x1350 }, { 0x53F7, 0x1946 }, { 0x53F8, 0x1B2A }, { 0x53FA, 0x323D }, { 0x5401, 0x323E }, { 0x5403, 0x1529 }, 
-       { 0x5404, 0x1326 }, { 0x5408, 0x1947 }, { 0x5409, 0x1528 }, { 0x540A, 0x243F }, { 0x540B, 0x1105 }, { 0x540C, 0x2611 }, 
-       { 0x540D, 0x2C1E }, { 0x540E, 0x1901 }, { 0x540F, 0x2D59 }, { 0x5410, 0x2527 }, { 0x5411, 0x185E }, { 0x541B, 0x170F }, 
-       { 0x541D, 0x3247 }, { 0x541F, 0x1643 }, { 0x5420, 0x2B2A }, { 0x5426, 0x283D }, { 0x5429, 0x3246 }, { 0x542B, 0x143E }, 
-       { 0x542C, 0x3241 }, { 0x542D, 0x3242 }, { 0x542E, 0x3244 }, { 0x5436, 0x3245 }, { 0x5438, 0x153B }, { 0x5439, 0x1F41 }, 
-       { 0x543B, 0x2A0D }, { 0x543C, 0x3243 }, { 0x543D, 0x323F }, { 0x543E, 0x1843 }, { 0x5440, 0x3240 }, { 0x5442, 0x2F04 }, 
-       { 0x5446, 0x2A52 }, { 0x5448, 0x2448 }, { 0x5449, 0x1842 }, { 0x544A, 0x1950 }, { 0x544E, 0x3248 }, { 0x5451, 0x263D }, 
-       { 0x545F, 0x324C }, { 0x5468, 0x1C5E }, { 0x546A, 0x1C56 }, { 0x5470, 0x324F }, { 0x5471, 0x324D }, { 0x5473, 0x2C03 }, 
-       { 0x5475, 0x324A }, { 0x5476, 0x3253 }, { 0x5477, 0x324E }, { 0x547B, 0x3251 }, { 0x547C, 0x1826 }, { 0x547D, 0x2C1F }, 
-       { 0x5480, 0x3252 }, { 0x5484, 0x3254 }, { 0x5486, 0x3256 }, { 0x548B, 0x1A50 }, { 0x548C, 0x2F22 }, { 0x548E, 0x324B }, 
-       { 0x548F, 0x3249 }, { 0x5490, 0x3255 }, { 0x5492, 0x3250 }, { 0x54A2, 0x3258 }, { 0x54A4, 0x3303 }, { 0x54A5, 0x325A }, 
-       { 0x54A8, 0x325E }, { 0x54AB, 0x3301 }, { 0x54AC, 0x325B }, { 0x54AF, 0x331E }, { 0x54B2, 0x1A49 }, { 0x54B3, 0x1311 }, 
-       { 0x54B8, 0x3259 }, { 0x54BC, 0x3305 }, { 0x54BD, 0x1056 }, { 0x54BE, 0x3304 }, { 0x54C0, 0x1005 }, { 0x54C1, 0x292A }, 
-       { 0x54C2, 0x3302 }, { 0x54C4, 0x325C }, { 0x54C7, 0x3257 }, { 0x54C8, 0x325D }, { 0x54C9, 0x1A28 }, { 0x54D8, 0x3306 }, 
-       { 0x54E1, 0x1057 }, { 0x54E2, 0x330F }, { 0x54E5, 0x3307 }, { 0x54E6, 0x3308 }, { 0x54E8, 0x1E05 }, { 0x54E9, 0x2B49 }, 
-       { 0x54ED, 0x330D }, { 0x54EE, 0x330C }, { 0x54F2, 0x250F }, { 0x54FA, 0x330E }, { 0x54FD, 0x330B }, { 0x5504, 0x1114 }, 
-       { 0x5506, 0x1A16 }, { 0x5507, 0x1F10 }, { 0x550F, 0x3309 }, { 0x5510, 0x2542 }, { 0x5514, 0x330A }, { 0x5516, 0x1002 }, 
-       { 0x552E, 0x3314 }, { 0x552F, 0x2D03 }, { 0x5531, 0x1E07 }, { 0x5533, 0x331A }, { 0x5538, 0x3319 }, { 0x5539, 0x3310 }, 
-       { 0x553E, 0x2223 }, { 0x5540, 0x3311 }, { 0x5544, 0x224F }, { 0x5545, 0x3316 }, { 0x5546, 0x1E06 }, { 0x554C, 0x3313 }, 
-       { 0x554F, 0x2C44 }, { 0x5553, 0x171C }, { 0x5556, 0x3317 }, { 0x5557, 0x3318 }, { 0x555C, 0x3315 }, { 0x555D, 0x331B }, 
-       { 0x5563, 0x3312 }, { 0x557B, 0x3321 }, { 0x557C, 0x3326 }, { 0x557E, 0x3322 }, { 0x5580, 0x331D }, { 0x5583, 0x3327 }, 
-       { 0x5584, 0x2111 }, { 0x5587, 0x3329 }, { 0x5589, 0x1902 }, { 0x558A, 0x331F }, { 0x558B, 0x235D }, { 0x5598, 0x3323 }, 
-       { 0x5599, 0x331C }, { 0x559A, 0x140D }, { 0x559C, 0x144E }, { 0x559D, 0x1345 }, { 0x559E, 0x3324 }, { 0x559F, 0x3320 }, 
-       { 0x55A7, 0x1756 }, { 0x55A8, 0x332A }, { 0x55A9, 0x3328 }, { 0x55AA, 0x2133 }, { 0x55AB, 0x152A }, { 0x55AC, 0x160C }, 
-       { 0x55AE, 0x3325 }, { 0x55B0, 0x1654 }, { 0x55B6, 0x1124 }, { 0x55C4, 0x332E }, { 0x55C5, 0x332C }, { 0x55C7, 0x3407 }, 
-       { 0x55D4, 0x3331 }, { 0x55DA, 0x332B }, { 0x55DC, 0x332F }, { 0x55DF, 0x332D }, { 0x55E3, 0x1B2C }, { 0x55E4, 0x3330 }, 
-       { 0x55F7, 0x3333 }, { 0x55F9, 0x3338 }, { 0x55FD, 0x3336 }, { 0x55FE, 0x3335 }, { 0x5606, 0x2312 }, { 0x5609, 0x1225 }, 
-       { 0x5614, 0x3332 }, { 0x5616, 0x3334 }, { 0x5617, 0x1E08 }, { 0x5618, 0x1113 }, { 0x561B, 0x3337 }, { 0x5629, 0x123E }, 
-       { 0x562F, 0x3342 }, { 0x5631, 0x1E5C }, { 0x5632, 0x333E }, { 0x5634, 0x333C }, { 0x5636, 0x333D }, { 0x5638, 0x333F }, 
-       { 0x5642, 0x111D }, { 0x564C, 0x2119 }, { 0x564E, 0x3339 }, { 0x5650, 0x333A }, { 0x565B, 0x135A }, { 0x5664, 0x3341 }, 
-       { 0x5668, 0x144F }, { 0x566A, 0x3344 }, { 0x566B, 0x3340 }, { 0x566C, 0x3343 }, { 0x5674, 0x2A0E }, { 0x5678, 0x2635 }, 
-       { 0x567A, 0x2818 }, { 0x5680, 0x3346 }, { 0x5686, 0x3345 }, { 0x5687, 0x1325 }, { 0x568A, 0x3347 }, { 0x568F, 0x334A }, 
-       { 0x5694, 0x3349 }, { 0x56A0, 0x3348 }, { 0x56A2, 0x2719 }, { 0x56A5, 0x334B }, { 0x56AE, 0x334C }, { 0x56B4, 0x334E }, 
-       { 0x56B6, 0x334D }, { 0x56BC, 0x3350 }, { 0x56C0, 0x3353 }, { 0x56C1, 0x3351 }, { 0x56C2, 0x334F }, { 0x56C3, 0x3352 }, 
-       { 0x56C8, 0x3354 }, { 0x56CE, 0x3355 }, { 0x56D1, 0x3356 }, { 0x56D3, 0x3357 }, { 0x56D7, 0x3358 }, { 0x56D8, 0x3125 }, 
-       { 0x56DA, 0x1C5C }, { 0x56DB, 0x1B2D }, { 0x56DE, 0x1253 }, { 0x56E0, 0x1058 }, { 0x56E3, 0x2324 }, { 0x56EE, 0x3359 }, 
-       { 0x56F0, 0x1A04 }, { 0x56F2, 0x102F }, { 0x56F3, 0x1F3E }, { 0x56F9, 0x335A }, { 0x56FA, 0x1827 }, { 0x56FD, 0x1951 }, 
-       { 0x56FF, 0x335C }, { 0x5700, 0x335B }, { 0x5703, 0x2A40 }, { 0x5704, 0x335D }, { 0x5708, 0x3401 }, { 0x5709, 0x335E }, 
-       { 0x570B, 0x3402 }, { 0x570D, 0x3403 }, { 0x570F, 0x1757 }, { 0x5712, 0x1140 }, { 0x5713, 0x3404 }, { 0x5716, 0x3406 }, 
-       { 0x5718, 0x3405 }, { 0x571C, 0x3408 }, { 0x571F, 0x253A }, { 0x5726, 0x3409 }, { 0x5727, 0x1015 }, { 0x5728, 0x1A3F }, 
-       { 0x572D, 0x171D }, { 0x5730, 0x232F }, { 0x5737, 0x340A }, { 0x5738, 0x340B }, { 0x573B, 0x340D }, { 0x5740, 0x340E }, 
-       { 0x5742, 0x1A44 }, { 0x5747, 0x1631 }, { 0x574A, 0x2B17 }, { 0x574E, 0x340C }, { 0x574F, 0x340F }, { 0x5750, 0x1A21 }, 
-       { 0x5751, 0x1903 }, { 0x5761, 0x3413 }, { 0x5764, 0x1A05 }, { 0x5766, 0x2313 }, { 0x5769, 0x3410 }, { 0x576A, 0x243A }, 
-       { 0x577F, 0x3414 }, { 0x5782, 0x1F42 }, { 0x5788, 0x3412 }, { 0x5789, 0x3415 }, { 0x578B, 0x171F }, { 0x5793, 0x3416 }, 
-       { 0x57A0, 0x3417 }, { 0x57A2, 0x1904 }, { 0x57A3, 0x1320 }, { 0x57A4, 0x3419 }, { 0x57AA, 0x341A }, { 0x57B0, 0x341B }, 
-       { 0x57B3, 0x3418 }, { 0x57C0, 0x3411 }, { 0x57C3, 0x341C }, { 0x57C6, 0x341D }, { 0x57CB, 0x2B44 }, { 0x57CE, 0x1E4B }, 
-       { 0x57D2, 0x341F }, { 0x57D3, 0x3420 }, { 0x57D4, 0x341E }, { 0x57D6, 0x3422 }, { 0x57DC, 0x2718 }, { 0x57DF, 0x1048 }, 
-       { 0x57E0, 0x2936 }, { 0x57E3, 0x3423 }, { 0x57F4, 0x1E5D }, { 0x57F7, 0x1C19 }, { 0x57F9, 0x273D }, { 0x57FA, 0x1450 }, 
-       { 0x57FC, 0x1A4B }, { 0x5800, 0x2B39 }, { 0x5802, 0x2612 }, { 0x5805, 0x1758 }, { 0x5806, 0x222F }, { 0x580A, 0x3421 }, 
-       { 0x580B, 0x3424 }, { 0x5815, 0x2224 }, { 0x5819, 0x3425 }, { 0x581D, 0x3426 }, { 0x5821, 0x3428 }, { 0x5824, 0x2449 }, 
-       { 0x582A, 0x140E }, { 0x582F, 0x5401 }, { 0x5830, 0x1141 }, { 0x5831, 0x2A53 }, { 0x5834, 0x1E4C }, { 0x5835, 0x2528 }, 
-       { 0x583A, 0x1A46 }, { 0x583D, 0x342E }, { 0x5840, 0x2A1D }, { 0x5841, 0x2E3D }, { 0x584A, 0x1254 }, { 0x584B, 0x342A }, 
-       { 0x5851, 0x211A }, { 0x5852, 0x342D }, { 0x5854, 0x2543 }, { 0x5857, 0x2529 }, { 0x5858, 0x2544 }, { 0x5859, 0x2819 }, 
-       { 0x585A, 0x242D }, { 0x585E, 0x1A29 }, { 0x5862, 0x3429 }, { 0x5869, 0x1156 }, { 0x586B, 0x2516 }, { 0x5870, 0x342B }, 
-       { 0x5872, 0x3427 }, { 0x5875, 0x1F30 }, { 0x5879, 0x342F }, { 0x587E, 0x1D2E }, { 0x5883, 0x160D }, { 0x5885, 0x3430 }, 
-       { 0x5893, 0x2A48 }, { 0x5897, 0x215D }, { 0x589C, 0x2426 }, { 0x589F, 0x3432 }, { 0x58A8, 0x2B2F }, { 0x58AB, 0x3433 }, 
-       { 0x58AE, 0x3438 }, { 0x58B3, 0x2A0F }, { 0x58B8, 0x3437 }, { 0x58B9, 0x3431 }, { 0x58BA, 0x3434 }, { 0x58BB, 0x3436 }, 
-       { 0x58BE, 0x1A06 }, { 0x58C1, 0x2A29 }, { 0x58C5, 0x3439 }, { 0x58C7, 0x2325 }, { 0x58CA, 0x1255 }, { 0x58CC, 0x1E4D }, 
-       { 0x58D1, 0x343B }, { 0x58D3, 0x343A }, { 0x58D5, 0x1948 }, { 0x58D7, 0x343C }, { 0x58D8, 0x343E }, { 0x58D9, 0x343D }, 
-       { 0x58DC, 0x3440 }, { 0x58DE, 0x3435 }, { 0x58DF, 0x3442 }, { 0x58E4, 0x3441 }, { 0x58E5, 0x343F }, { 0x58EB, 0x1B2E }, 
-       { 0x58EC, 0x1F31 }, { 0x58EE, 0x2134 }, { 0x58EF, 0x3443 }, { 0x58F0, 0x201C }, { 0x58F1, 0x104D }, { 0x58F2, 0x2744 }, 
-       { 0x58F7, 0x243B }, { 0x58F9, 0x3445 }, { 0x58FA, 0x3444 }, { 0x58FB, 0x3446 }, { 0x58FC, 0x3447 }, { 0x58FD, 0x3448 }, 
-       { 0x5902, 0x3449 }, { 0x5909, 0x2A31 }, { 0x590A, 0x344A }, { 0x590F, 0x1226 }, { 0x5910, 0x344B }, { 0x5915, 0x2D1C }, 
-       { 0x5916, 0x1310 }, { 0x5918, 0x3229 }, { 0x5919, 0x1D28 }, { 0x591A, 0x221F }, { 0x591B, 0x344C }, { 0x591C, 0x2C4B }, 
-       { 0x5922, 0x2C14 }, { 0x5925, 0x344E }, { 0x5927, 0x2247 }, { 0x5929, 0x2517 }, { 0x592A, 0x2220 }, { 0x592B, 0x2937 }, 
-       { 0x592C, 0x344F }, { 0x592D, 0x3450 }, { 0x592E, 0x115B }, { 0x5931, 0x1C1A }, { 0x5932, 0x3451 }, { 0x5937, 0x1030 }, 
-       { 0x5938, 0x3452 }, { 0x593E, 0x3453 }, { 0x5944, 0x1142 }, { 0x5947, 0x1451 }, { 0x5948, 0x2640 }, { 0x5949, 0x2A54 }, 
-       { 0x594E, 0x3457 }, { 0x594F, 0x2135 }, { 0x5950, 0x3456 }, { 0x5951, 0x1720 }, { 0x5954, 0x2B3B }, { 0x5955, 0x3455 }, 
-       { 0x5957, 0x2545 }, { 0x5958, 0x3459 }, { 0x595A, 0x3458 }, { 0x5960, 0x345B }, { 0x5962, 0x345A }, { 0x5965, 0x115C }, 
-       { 0x5967, 0x345C }, { 0x5968, 0x1E09 }, { 0x5969, 0x345E }, { 0x596A, 0x2305 }, { 0x596C, 0x345D }, { 0x596E, 0x2A13 }, 
-       { 0x5973, 0x1D57 }, { 0x5974, 0x253B }, { 0x5978, 0x3501 }, { 0x597D, 0x1905 }, { 0x5981, 0x3502 }, { 0x5982, 0x2701 }, 
-       { 0x5983, 0x283E }, { 0x5984, 0x2C31 }, { 0x598A, 0x2705 }, { 0x598D, 0x350B }, { 0x5993, 0x1518 }, { 0x5996, 0x2D25 }, 
-       { 0x5999, 0x2C0F }, { 0x599B, 0x360C }, { 0x599D, 0x3503 }, { 0x59A3, 0x3506 }, { 0x59A5, 0x2225 }, { 0x59A8, 0x2B18 }, 
-       { 0x59AC, 0x252A }, { 0x59B2, 0x3507 }, { 0x59B9, 0x2B45 }, { 0x59BB, 0x1A2A }, { 0x59BE, 0x1E0A }, { 0x59C6, 0x3508 }, 
-       { 0x59C9, 0x1B30 }, { 0x59CB, 0x1B2F }, { 0x59D0, 0x1019 }, { 0x59D1, 0x1828 }, { 0x59D3, 0x200B }, { 0x59D4, 0x1031 }, 
-       { 0x59D9, 0x350C }, { 0x59DA, 0x350D }, { 0x59DC, 0x350A }, { 0x59E5, 0x1118 }, { 0x59E6, 0x140F }, { 0x59E8, 0x3509 }, 
-       { 0x59EA, 0x2C25 }, { 0x59EB, 0x2911 }, { 0x59F6, 0x1008 }, { 0x59FB, 0x1059 }, { 0x59FF, 0x1B31 }, { 0x5A01, 0x1032 }, 
-       { 0x5A03, 0x1003 }, { 0x5A09, 0x3512 }, { 0x5A11, 0x3510 }, { 0x5A18, 0x2C1C }, { 0x5A1A, 0x3513 }, { 0x5A1C, 0x3511 }, 
-       { 0x5A1F, 0x350F }, { 0x5A20, 0x1F11 }, { 0x5A25, 0x350E }, { 0x5A29, 0x2A3A }, { 0x5A2F, 0x1844 }, { 0x5A35, 0x3517 }, 
-       { 0x5A36, 0x3518 }, { 0x5A3C, 0x1E0B }, { 0x5A40, 0x3514 }, { 0x5A41, 0x2F0C }, { 0x5A46, 0x272C }, { 0x5A49, 0x3516 }, 
-       { 0x5A5A, 0x1A07 }, { 0x5A62, 0x3519 }, { 0x5A66, 0x2938 }, { 0x5A6A, 0x351A }, { 0x5A6C, 0x3515 }, { 0x5A7F, 0x2C1B }, 
-       { 0x5A92, 0x273E }, { 0x5A9A, 0x351B }, { 0x5A9B, 0x2912 }, { 0x5ABC, 0x351C }, { 0x5ABD, 0x3520 }, { 0x5ABE, 0x351D }, 
-       { 0x5AC1, 0x1227 }, { 0x5AC2, 0x351F }, { 0x5AC9, 0x1C1B }, { 0x5ACB, 0x351E }, { 0x5ACC, 0x1759 }, { 0x5AD0, 0x352C }, 
-       { 0x5AD6, 0x3525 }, { 0x5AD7, 0x3522 }, { 0x5AE1, 0x2344 }, { 0x5AE3, 0x3521 }, { 0x5AE6, 0x3523 }, { 0x5AE9, 0x3524 }, 
-       { 0x5AFA, 0x3526 }, { 0x5AFB, 0x3527 }, { 0x5B09, 0x1452 }, { 0x5B0B, 0x3529 }, { 0x5B0C, 0x3528 }, { 0x5B16, 0x352A }, 
-       { 0x5B22, 0x1E4E }, { 0x5B2A, 0x352D }, { 0x5B2C, 0x243C }, { 0x5B30, 0x1125 }, { 0x5B32, 0x352B }, { 0x5B36, 0x352E }, 
-       { 0x5B3E, 0x352F }, { 0x5B40, 0x3532 }, { 0x5B43, 0x3530 }, { 0x5B45, 0x3531 }, { 0x5B50, 0x1B32 }, { 0x5B51, 0x3533 }, 
-       { 0x5B54, 0x1906 }, { 0x5B55, 0x3534 }, { 0x5B57, 0x1B5A }, { 0x5B58, 0x2218 }, { 0x5B5A, 0x3535 }, { 0x5B5B, 0x3536 }, 
-       { 0x5B5C, 0x1B3A }, { 0x5B5D, 0x1907 }, { 0x5B5F, 0x2C32 }, { 0x5B63, 0x1508 }, { 0x5B64, 0x1829 }, { 0x5B65, 0x3537 }, 
-       { 0x5B66, 0x1338 }, { 0x5B69, 0x3538 }, { 0x5B6B, 0x2219 }, { 0x5B70, 0x3539 }, { 0x5B71, 0x3603 }, { 0x5B73, 0x353A }, 
-       { 0x5B75, 0x353B }, { 0x5B78, 0x353C }, { 0x5B7A, 0x353E }, { 0x5B80, 0x353F }, { 0x5B83, 0x3540 }, { 0x5B85, 0x2250 }, 
-       { 0x5B87, 0x1107 }, { 0x5B88, 0x1C49 }, { 0x5B89, 0x1022 }, { 0x5B8B, 0x2137 }, { 0x5B8C, 0x1410 }, { 0x5B8D, 0x1C15 }, 
-       { 0x5B8F, 0x1908 }, { 0x5B95, 0x2546 }, { 0x5B97, 0x1D01 }, { 0x5B98, 0x1411 }, { 0x5B99, 0x2348 }, { 0x5B9A, 0x244A }, 
-       { 0x5B9B, 0x1018 }, { 0x5B9C, 0x1519 }, { 0x5B9D, 0x2A55 }, { 0x5B9F, 0x1C22 }, { 0x5BA2, 0x1532 }, { 0x5BA3, 0x204B }, 
-       { 0x5BA4, 0x1C1C }, { 0x5BA5, 0x2D08 }, { 0x5BA6, 0x3541 }, { 0x5BAE, 0x153C }, { 0x5BB0, 0x1A2B }, { 0x5BB3, 0x1312 }, 
-       { 0x5BB4, 0x1143 }, { 0x5BB5, 0x1E0C }, { 0x5BB6, 0x1228 }, { 0x5BB8, 0x3542 }, { 0x5BB9, 0x2D26 }, { 0x5BBF, 0x1D29 }, 
-       { 0x5BC2, 0x1C44 }, { 0x5BC3, 0x3543 }, { 0x5BC4, 0x1453 }, { 0x5BC5, 0x2632 }, { 0x5BC6, 0x2C09 }, { 0x5BC7, 0x3544 }, 
-       { 0x5BC9, 0x3545 }, { 0x5BCC, 0x2939 }, { 0x5BD0, 0x3547 }, { 0x5BD2, 0x1408 }, { 0x5BD3, 0x1657 }, { 0x5BD4, 0x3546 }, 
-       { 0x5BDB, 0x1412 }, { 0x5BDD, 0x1F12 }, { 0x5BDE, 0x354B }, { 0x5BDF, 0x1B01 }, { 0x5BE1, 0x1229 }, { 0x5BE2, 0x354A }, 
-       { 0x5BE4, 0x3548 }, { 0x5BE5, 0x354C }, { 0x5BE6, 0x3549 }, { 0x5BE7, 0x270B }, { 0x5BE8, 0x3C2D }, { 0x5BE9, 0x1F13 }, 
-       { 0x5BEB, 0x354D }, { 0x5BEE, 0x2E20 }, { 0x5BF0, 0x354E }, { 0x5BF3, 0x3550 }, { 0x5BF5, 0x235E }, { 0x5BF6, 0x354F }, 
-       { 0x5BF8, 0x2003 }, { 0x5BFA, 0x1B5B }, { 0x5BFE, 0x2230 }, { 0x5BFF, 0x1C57 }, { 0x5C01, 0x2955 }, { 0x5C02, 0x204C }, 
-       { 0x5C04, 0x1C2D }, { 0x5C05, 0x3551 }, { 0x5C06, 0x1E0D }, { 0x5C07, 0x3552 }, { 0x5C08, 0x3553 }, { 0x5C09, 0x1033 }, 
-       { 0x5C0A, 0x221A }, { 0x5C0B, 0x1F32 }, { 0x5C0D, 0x3554 }, { 0x5C0E, 0x2613 }, { 0x5C0F, 0x1E0E }, { 0x5C11, 0x1E0F }, 
-       { 0x5C13, 0x3555 }, { 0x5C16, 0x204D }, { 0x5C1A, 0x1E10 }, { 0x5C20, 0x3556 }, { 0x5C22, 0x3557 }, { 0x5C24, 0x2C40 }, 
-       { 0x5C28, 0x3558 }, { 0x5C2D, 0x1626 }, { 0x5C31, 0x1D02 }, { 0x5C38, 0x3559 }, { 0x5C39, 0x355A }, { 0x5C3A, 0x1C3C }, 
-       { 0x5C3B, 0x1F0C }, { 0x5C3C, 0x2654 }, { 0x5C3D, 0x1F34 }, { 0x5C3E, 0x2858 }, { 0x5C3F, 0x2702 }, { 0x5C40, 0x1629 }, 
-       { 0x5C41, 0x355B }, { 0x5C45, 0x154F }, { 0x5C46, 0x355C }, { 0x5C48, 0x165E }, { 0x5C4A, 0x262F }, { 0x5C4B, 0x1210 }, 
-       { 0x5C4D, 0x1B33 }, { 0x5C4E, 0x355D }, { 0x5C4F, 0x3602 }, { 0x5C50, 0x3601 }, { 0x5C51, 0x165D }, { 0x5C53, 0x355E }, 
-       { 0x5C55, 0x2518 }, { 0x5C5E, 0x2210 }, { 0x5C60, 0x252B }, { 0x5C61, 0x1C28 }, { 0x5C64, 0x2138 }, { 0x5C65, 0x2D5A }, 
-       { 0x5C6C, 0x3604 }, { 0x5C6E, 0x3605 }, { 0x5C6F, 0x2636 }, { 0x5C71, 0x1B13 }, { 0x5C76, 0x3607 }, { 0x5C79, 0x3608 }, 
-       { 0x5C8C, 0x3609 }, { 0x5C90, 0x1454 }, { 0x5C91, 0x360A }, { 0x5C94, 0x360B }, { 0x5CA1, 0x120C }, { 0x5CA8, 0x211B }, 
-       { 0x5CA9, 0x1444 }, { 0x5CAB, 0x360D }, { 0x5CAC, 0x2C08 }, { 0x5CB1, 0x2232 }, { 0x5CB3, 0x1339 }, { 0x5CB6, 0x360F }, 
-       { 0x5CB7, 0x3611 }, { 0x5CB8, 0x143F }, { 0x5CBB, 0x360E }, { 0x5CBC, 0x3610 }, { 0x5CBE, 0x3613 }, { 0x5CC5, 0x3612 }, 
-       { 0x5CC7, 0x3614 }, { 0x5CD9, 0x3615 }, { 0x5CE0, 0x261D }, { 0x5CE1, 0x160E }, { 0x5CE8, 0x1245 }, { 0x5CE9, 0x3616 }, 
-       { 0x5CEA, 0x361B }, { 0x5CED, 0x3619 }, { 0x5CEF, 0x2A57 }, { 0x5CF0, 0x2A56 }, { 0x5CF6, 0x2547 }, { 0x5CFA, 0x3618 }, 
-       { 0x5CFB, 0x1D34 }, { 0x5CFD, 0x3617 }, { 0x5D07, 0x1F52 }, { 0x5D0B, 0x361C }, { 0x5D0E, 0x1A4A }, { 0x5D11, 0x3622 }, 
-       { 0x5D14, 0x3623 }, { 0x5D15, 0x361D }, { 0x5D16, 0x1313 }, { 0x5D17, 0x361E }, { 0x5D18, 0x3627 }, { 0x5D19, 0x3626 }, 
-       { 0x5D1A, 0x3625 }, { 0x5D1B, 0x3621 }, { 0x5D1F, 0x3620 }, { 0x5D22, 0x3624 }, { 0x5D29, 0x2A58 }, { 0x5D4B, 0x362B }, 
-       { 0x5D4C, 0x3628 }, { 0x5D4E, 0x362A }, { 0x5D50, 0x2D52 }, { 0x5D52, 0x3629 }, { 0x5D5C, 0x361F }, { 0x5D69, 0x1F53 }, 
-       { 0x5D6C, 0x362C }, { 0x5D6F, 0x1A17 }, { 0x5D73, 0x362D }, { 0x5D76, 0x362E }, { 0x5D82, 0x3631 }, { 0x5D84, 0x3630 }, 
-       { 0x5D87, 0x362F }, { 0x5D8B, 0x2548 }, { 0x5D8C, 0x361A }, { 0x5D90, 0x3637 }, { 0x5D9D, 0x3633 }, { 0x5DA2, 0x3632 }, 
-       { 0x5DAC, 0x3634 }, { 0x5DAE, 0x3635 }, { 0x5DB7, 0x3638 }, { 0x5DBA, 0x2E46 }, { 0x5DBC, 0x3639 }, { 0x5DBD, 0x3636 }, 
-       { 0x5DC9, 0x363A }, { 0x5DCC, 0x1440 }, { 0x5DCD, 0x363B }, { 0x5DD2, 0x363D }, { 0x5DD3, 0x363C }, { 0x5DD6, 0x363E }, 
-       { 0x5DDB, 0x363F }, { 0x5DDD, 0x204E }, { 0x5DDE, 0x1D03 }, { 0x5DE1, 0x1D44 }, { 0x5DE3, 0x2143 }, { 0x5DE5, 0x1909 }, 
-       { 0x5DE6, 0x1A18 }, { 0x5DE7, 0x190A }, { 0x5DE8, 0x1550 }, { 0x5DEB, 0x3640 }, { 0x5DEE, 0x1A19 }, { 0x5DF1, 0x182A }, 
-       { 0x5DF2, 0x3641 }, { 0x5DF3, 0x2C06 }, { 0x5DF4, 0x2723 }, { 0x5DF5, 0x3642 }, { 0x5DF7, 0x190B }, { 0x5DFB, 0x140C }, 
-       { 0x5DFD, 0x2307 }, { 0x5DFE, 0x1632 }, { 0x5E02, 0x1B34 }, { 0x5E03, 0x293B }, { 0x5E06, 0x2821 }, { 0x5E0B, 0x3643 }, 
-       { 0x5E0C, 0x1455 }, { 0x5E11, 0x3646 }, { 0x5E16, 0x2401 }, { 0x5E19, 0x3645 }, { 0x5E1A, 0x3644 }, { 0x5E1B, 0x3647 }, 
-       { 0x5E1D, 0x244B }, { 0x5E25, 0x1F43 }, { 0x5E2B, 0x1B35 }, { 0x5E2D, 0x202A }, { 0x5E2F, 0x2233 }, { 0x5E30, 0x1502 }, 
-       { 0x5E33, 0x2402 }, { 0x5E36, 0x3648 }, { 0x5E37, 0x3649 }, { 0x5E38, 0x1E4F }, { 0x5E3D, 0x2B19 }, { 0x5E40, 0x364C }, 
-       { 0x5E43, 0x364B }, { 0x5E44, 0x364A }, { 0x5E45, 0x295D }, { 0x5E47, 0x3653 }, { 0x5E4C, 0x2B3A }, { 0x5E4E, 0x364D }, 
-       { 0x5E54, 0x364F }, { 0x5E55, 0x2B4B }, { 0x5E57, 0x364E }, { 0x5E5F, 0x3650 }, { 0x5E61, 0x2808 }, { 0x5E62, 0x3651 }, 
-       { 0x5E63, 0x2A1E }, { 0x5E64, 0x3652 }, { 0x5E72, 0x1413 }, { 0x5E73, 0x2A1F }, { 0x5E74, 0x270F }, { 0x5E75, 0x3654 }, 
-       { 0x5E76, 0x3655 }, { 0x5E78, 0x190C }, { 0x5E79, 0x1414 }, { 0x5E7A, 0x3656 }, { 0x5E7B, 0x1818 }, { 0x5E7C, 0x2D24 }, 
-       { 0x5E7D, 0x2D09 }, { 0x5E7E, 0x1456 }, { 0x5E7F, 0x3658 }, { 0x5E81, 0x2403 }, { 0x5E83, 0x190D }, { 0x5E84, 0x1E11 }, 
-       { 0x5E87, 0x283F }, { 0x5E8A, 0x1E12 }, { 0x5E8F, 0x1D58 }, { 0x5E95, 0x244C }, { 0x5E96, 0x2A59 }, { 0x5E97, 0x2519 }, 
-       { 0x5E9A, 0x190E }, { 0x5E9C, 0x293C }, { 0x5EA0, 0x3659 }, { 0x5EA6, 0x2539 }, { 0x5EA7, 0x1A22 }, { 0x5EAB, 0x182B }, 
-       { 0x5EAD, 0x244D }, { 0x5EB5, 0x1023 }, { 0x5EB6, 0x1D4E }, { 0x5EB7, 0x190F }, { 0x5EB8, 0x2D27 }, { 0x5EC1, 0x365A }, 
-       { 0x5EC2, 0x365B }, { 0x5EC3, 0x2731 }, { 0x5EC8, 0x365C }, { 0x5EC9, 0x2E57 }, { 0x5ECA, 0x2F0D }, { 0x5ECF, 0x365E }, 
-       { 0x5ED0, 0x365D }, { 0x5ED3, 0x1327 }, { 0x5ED6, 0x3701 }, { 0x5EDA, 0x3704 }, { 0x5EDB, 0x3705 }, { 0x5EDD, 0x3703 }, 
-       { 0x5EDF, 0x2920 }, { 0x5EE0, 0x1E13 }, { 0x5EE1, 0x3707 }, { 0x5EE2, 0x3706 }, { 0x5EE3, 0x3702 }, { 0x5EE8, 0x3708 }, 
-       { 0x5EE9, 0x3709 }, { 0x5EEC, 0x370A }, { 0x5EF0, 0x370D }, { 0x5EF1, 0x370B }, { 0x5EF3, 0x370C }, { 0x5EF4, 0x370E }, 
-       { 0x5EF6, 0x1144 }, { 0x5EF7, 0x244E }, { 0x5EF8, 0x370F }, { 0x5EFA, 0x175A }, { 0x5EFB, 0x1256 }, { 0x5EFC, 0x2716 }, 
-       { 0x5EFE, 0x3710 }, { 0x5EFF, 0x265B }, { 0x5F01, 0x2A3B }, { 0x5F03, 0x3711 }, { 0x5F04, 0x2F0E }, { 0x5F09, 0x3712 }, 
-       { 0x5F0A, 0x2A20 }, { 0x5F0B, 0x3715 }, { 0x5F0C, 0x3001 }, { 0x5F0D, 0x3011 }, { 0x5F0F, 0x1C10 }, { 0x5F10, 0x2655 }, 
-       { 0x5F11, 0x3716 }, { 0x5F13, 0x153D }, { 0x5F14, 0x2404 }, { 0x5F15, 0x105A }, { 0x5F16, 0x3717 }, { 0x5F17, 0x2A06 }, 
-       { 0x5F18, 0x1910 }, { 0x5F1B, 0x2330 }, { 0x5F1F, 0x244F }, { 0x5F25, 0x2C4F }, { 0x5F26, 0x1819 }, { 0x5F27, 0x182C }, 
-       { 0x5F29, 0x3718 }, { 0x5F2D, 0x3719 }, { 0x5F2F, 0x371F }, { 0x5F31, 0x1C45 }, { 0x5F35, 0x2405 }, { 0x5F37, 0x160F }, 
-       { 0x5F38, 0x371A }, { 0x5F3C, 0x290B }, { 0x5F3E, 0x2326 }, { 0x5F41, 0x371B }, { 0x5F48, 0x371C }, { 0x5F4A, 0x1610 }, 
-       { 0x5F4C, 0x371D }, { 0x5F4E, 0x371E }, { 0x5F51, 0x3720 }, { 0x5F53, 0x2556 }, { 0x5F56, 0x3721 }, { 0x5F57, 0x3722 }, 
-       { 0x5F59, 0x3723 }, { 0x5F5C, 0x3714 }, { 0x5F5D, 0x3713 }, { 0x5F61, 0x3724 }, { 0x5F62, 0x1721 }, { 0x5F66, 0x2907 }, 
-       { 0x5F69, 0x1A2C }, { 0x5F6A, 0x2917 }, { 0x5F6B, 0x2406 }, { 0x5F6C, 0x292B }, { 0x5F6D, 0x3725 }, { 0x5F70, 0x1E14 }, 
-       { 0x5F71, 0x1126 }, { 0x5F73, 0x3726 }, { 0x5F77, 0x3727 }, { 0x5F79, 0x2C52 }, { 0x5F7C, 0x2840 }, { 0x5F7F, 0x372A }, 
-       { 0x5F80, 0x115D }, { 0x5F81, 0x200C }, { 0x5F82, 0x3729 }, { 0x5F83, 0x3728 }, { 0x5F84, 0x1722 }, { 0x5F85, 0x2234 }, 
-       { 0x5F87, 0x372E }, { 0x5F88, 0x372C }, { 0x5F8A, 0x372B }, { 0x5F8B, 0x2E07 }, { 0x5F8C, 0x1845 }, { 0x5F90, 0x1D59 }, 
-       { 0x5F91, 0x372D }, { 0x5F92, 0x252C }, { 0x5F93, 0x1D1E }, { 0x5F97, 0x2620 }, { 0x5F98, 0x3731 }, { 0x5F99, 0x3730 }, 
-       { 0x5F9E, 0x372F }, { 0x5FA0, 0x3732 }, { 0x5FA1, 0x1846 }, { 0x5FA8, 0x3733 }, { 0x5FA9, 0x295C }, { 0x5FAA, 0x1D3B }, 
-       { 0x5FAD, 0x3734 }, { 0x5FAE, 0x2859 }, { 0x5FB3, 0x2621 }, { 0x5FB4, 0x2407 }, { 0x5FB9, 0x2510 }, { 0x5FBC, 0x3735 }, 
-       { 0x5FBD, 0x150B }, { 0x5FC3, 0x1F14 }, { 0x5FC5, 0x290C }, { 0x5FCC, 0x1457 }, { 0x5FCD, 0x2706 }, { 0x5FD6, 0x3736 }, 
-       { 0x5FD7, 0x1B36 }, { 0x5FD8, 0x2B1A }, { 0x5FD9, 0x2B1B }, { 0x5FDC, 0x115E }, { 0x5FDD, 0x373B }, { 0x5FE0, 0x2349 }, 
-       { 0x5FE4, 0x3738 }, { 0x5FEB, 0x1257 }, { 0x5FF0, 0x380D }, { 0x5FF1, 0x373A }, { 0x5FF5, 0x2710 }, { 0x5FF8, 0x3739 }, 
-       { 0x5FFB, 0x3737 }, { 0x5FFD, 0x195A }, { 0x5FFF, 0x373D }, { 0x600E, 0x3743 }, { 0x600F, 0x3749 }, { 0x6010, 0x3741 }, 
-       { 0x6012, 0x253C }, { 0x6015, 0x3746 }, { 0x6016, 0x293D }, { 0x6019, 0x3740 }, { 0x601B, 0x3745 }, { 0x601C, 0x2E47 }, 
-       { 0x601D, 0x1B37 }, { 0x6020, 0x2235 }, { 0x6021, 0x373E }, { 0x6025, 0x153E }, { 0x6026, 0x3748 }, { 0x6027, 0x200D }, 
-       { 0x6028, 0x1145 }, { 0x6029, 0x3742 }, { 0x602A, 0x1258 }, { 0x602B, 0x3747 }, { 0x602F, 0x1611 }, { 0x6031, 0x3744 }, 
-       { 0x603A, 0x374A }, { 0x6041, 0x374C }, { 0x6042, 0x3756 }, { 0x6043, 0x3754 }, { 0x6046, 0x3751 }, { 0x604A, 0x3750 }, 
-       { 0x604B, 0x2E58 }, { 0x604D, 0x3752 }, { 0x6050, 0x1612 }, { 0x6052, 0x1911 }, { 0x6055, 0x1D5A }, { 0x6059, 0x3759 }, 
-       { 0x605A, 0x374B }, { 0x605F, 0x374F }, { 0x6060, 0x373F }, { 0x6062, 0x125A }, { 0x6063, 0x3753 }, { 0x6064, 0x3755 }, 
-       { 0x6065, 0x2331 }, { 0x6068, 0x1A08 }, { 0x6069, 0x1218 }, { 0x606A, 0x374D }, { 0x606B, 0x3758 }, { 0x606C, 0x3757 }, 
-       { 0x606D, 0x1613 }, { 0x606F, 0x2209 }, { 0x6070, 0x1346 }, { 0x6075, 0x1723 }, { 0x6077, 0x374E }, { 0x6081, 0x375A }, 
-       { 0x6083, 0x375D }, { 0x6084, 0x3801 }, { 0x6089, 0x1C1D }, { 0x608B, 0x3807 }, { 0x608C, 0x2450 }, { 0x608D, 0x375B }, 
-       { 0x6092, 0x3805 }, { 0x6094, 0x1259 }, { 0x6096, 0x3803 }, { 0x6097, 0x3804 }, { 0x609A, 0x375E }, { 0x609B, 0x3802 }, 
-       { 0x609F, 0x1847 }, { 0x60A0, 0x2D0A }, { 0x60A3, 0x1415 }, { 0x60A6, 0x1139 }, { 0x60A7, 0x3806 }, { 0x60A9, 0x271A }, 
-       { 0x60AA, 0x100D }, { 0x60B2, 0x2841 }, { 0x60B3, 0x373C }, { 0x60B4, 0x380C }, { 0x60B5, 0x3810 }, { 0x60B6, 0x2C45 }, 
-       { 0x60B8, 0x3809 }, { 0x60BC, 0x2549 }, { 0x60BD, 0x380E }, { 0x60C5, 0x1E50 }, { 0x60C6, 0x380F }, { 0x60C7, 0x2637 }, 
-       { 0x60D1, 0x2F27 }, { 0x60D3, 0x380B }, { 0x60D8, 0x3811 }, { 0x60DA, 0x195B }, { 0x60DC, 0x202B }, { 0x60DF, 0x1034 }, 
-       { 0x60E0, 0x380A }, { 0x60E1, 0x3808 }, { 0x60E3, 0x213A }, { 0x60E7, 0x375C }, { 0x60E8, 0x1B14 }, { 0x60F0, 0x2226 }, 
-       { 0x60F1, 0x381D }, { 0x60F3, 0x213B }, { 0x60F4, 0x3818 }, { 0x60F6, 0x3815 }, { 0x60F7, 0x3816 }, { 0x60F9, 0x1C46 }, 
-       { 0x60FA, 0x3819 }, { 0x60FB, 0x381C }, { 0x6100, 0x3817 }, { 0x6101, 0x1D05 }, { 0x6103, 0x381A }, { 0x6106, 0x3814 }, 
-       { 0x6108, 0x2C5C }, { 0x6109, 0x2C5B }, { 0x610D, 0x381E }, { 0x610E, 0x381F }, { 0x610F, 0x1035 }, { 0x6115, 0x3813 }, 
-       { 0x611A, 0x1652 }, { 0x611B, 0x1006 }, { 0x611F, 0x1416 }, { 0x6121, 0x381B }, { 0x6127, 0x3823 }, { 0x6128, 0x3822 }, 
-       { 0x612C, 0x3827 }, { 0x6134, 0x3828 }, { 0x613C, 0x3826 }, { 0x613D, 0x3829 }, { 0x613E, 0x3821 }, { 0x613F, 0x3825 }, 
-       { 0x6142, 0x382A }, { 0x6144, 0x382B }, { 0x6147, 0x3820 }, { 0x6148, 0x1B5C }, { 0x614A, 0x3824 }, { 0x614B, 0x2236 }, 
-       { 0x614C, 0x1912 }, { 0x614D, 0x3812 }, { 0x614E, 0x1F15 }, { 0x6153, 0x3838 }, { 0x6155, 0x2A49 }, { 0x6158, 0x382E }, 
-       { 0x6159, 0x382F }, { 0x615A, 0x3830 }, { 0x615D, 0x3837 }, { 0x615F, 0x3836 }, { 0x6162, 0x2B5D }, { 0x6163, 0x1417 }, 
-       { 0x6165, 0x3834 }, { 0x6167, 0x1725 }, { 0x6168, 0x1314 }, { 0x616B, 0x3831 }, { 0x616E, 0x2E18 }, { 0x616F, 0x3833 }, 
-       { 0x6170, 0x1036 }, { 0x6171, 0x3835 }, { 0x6173, 0x382C }, { 0x6174, 0x3832 }, { 0x6175, 0x3839 }, { 0x6176, 0x1724 }, 
-       { 0x6177, 0x382D }, { 0x617E, 0x2D3D }, { 0x6182, 0x2D0B }, { 0x6187, 0x383C }, { 0x618A, 0x3840 }, { 0x618E, 0x215E }, 
-       { 0x6190, 0x2E59 }, { 0x6191, 0x3841 }, { 0x6194, 0x383E }, { 0x6196, 0x383B }, { 0x6199, 0x383A }, { 0x619A, 0x383F }, 
-       { 0x61A4, 0x2A10 }, { 0x61A7, 0x2614 }, { 0x61A9, 0x1726 }, { 0x61AB, 0x3842 }, { 0x61AC, 0x383D }, { 0x61AE, 0x3843 }, 
-       { 0x61B2, 0x175B }, { 0x61B6, 0x1211 }, { 0x61BA, 0x384B }, { 0x61BE, 0x1418 }, { 0x61C3, 0x3849 }, { 0x61C6, 0x384A }, 
-       { 0x61C7, 0x1A09 }, { 0x61C8, 0x3848 }, { 0x61C9, 0x3846 }, { 0x61CA, 0x3845 }, { 0x61CB, 0x384C }, { 0x61CC, 0x3844 }, 
-       { 0x61CD, 0x384E }, { 0x61D0, 0x125B }, { 0x61E3, 0x3850 }, { 0x61E6, 0x384F }, { 0x61F2, 0x2408 }, { 0x61F4, 0x3853 }, 
-       { 0x61F6, 0x3851 }, { 0x61F7, 0x3847 }, { 0x61F8, 0x175C }, { 0x61FA, 0x3852 }, { 0x61FC, 0x3856 }, { 0x61FD, 0x3855 }, 
-       { 0x61FE, 0x3857 }, { 0x61FF, 0x3854 }, { 0x6200, 0x3858 }, { 0x6208, 0x3859 }, { 0x6209, 0x385A }, { 0x620A, 0x2A4A }, 
-       { 0x620C, 0x385C }, { 0x620D, 0x385B }, { 0x620E, 0x1D1F }, { 0x6210, 0x200E }, { 0x6211, 0x1246 }, { 0x6212, 0x125C }, 
-       { 0x6214, 0x385D }, { 0x6216, 0x101F }, { 0x621A, 0x202C }, { 0x621B, 0x385E }, { 0x621D, 0x4C23 }, { 0x621E, 0x3901 }, 
-       { 0x621F, 0x1741 }, { 0x6221, 0x3902 }, { 0x6226, 0x204F }, { 0x622A, 0x3903 }, { 0x622E, 0x3904 }, { 0x622F, 0x151A }, 
-       { 0x6230, 0x3905 }, { 0x6232, 0x3906 }, { 0x6233, 0x3907 }, { 0x6234, 0x2237 }, { 0x6238, 0x182D }, { 0x623B, 0x2C41 }, 
-       { 0x623F, 0x2B1C }, { 0x6240, 0x1D4A }, { 0x6241, 0x3908 }, { 0x6247, 0x2050 }, { 0x6248, 0x4E1D }, { 0x6249, 0x2842 }, 
-       { 0x624B, 0x1C4A }, { 0x624D, 0x1A2D }, { 0x624E, 0x3909 }, { 0x6253, 0x2227 }, { 0x6255, 0x2A07 }, { 0x6258, 0x2251 }, 
-       { 0x625B, 0x390C }, { 0x625E, 0x390A }, { 0x6260, 0x390D }, { 0x6263, 0x390B }, { 0x6268, 0x390E }, { 0x626E, 0x2A11 }, 
-       { 0x6271, 0x1017 }, { 0x6276, 0x293E }, { 0x6279, 0x2843 }, { 0x627C, 0x390F }, { 0x627E, 0x3912 }, { 0x627F, 0x1E15 }, 
-       { 0x6280, 0x151B }, { 0x6282, 0x3910 }, { 0x6283, 0x3917 }, { 0x6284, 0x1E16 }, { 0x6289, 0x3911 }, { 0x628A, 0x2724 }, 
-       { 0x6291, 0x2D3E }, { 0x6292, 0x3913 }, { 0x6293, 0x3914 }, { 0x6294, 0x3918 }, { 0x6295, 0x254A }, { 0x6296, 0x3915 }, 
-       { 0x6297, 0x1913 }, { 0x6298, 0x203E }, { 0x629B, 0x3926 }, { 0x629C, 0x2814 }, { 0x629E, 0x2252 }, { 0x62AB, 0x2844 }, 
-       { 0x62AC, 0x3A0D }, { 0x62B1, 0x2A5A }, { 0x62B5, 0x2451 }, { 0x62B9, 0x2B55 }, { 0x62BB, 0x391B }, { 0x62BC, 0x1201 }, 
-       { 0x62BD, 0x234A }, { 0x62C2, 0x3924 }, { 0x62C5, 0x2314 }, { 0x62C6, 0x391E }, { 0x62C7, 0x3925 }, { 0x62C8, 0x3920 }, 
-       { 0x62C9, 0x3927 }, { 0x62CA, 0x3923 }, { 0x62CC, 0x3922 }, { 0x62CD, 0x274F }, { 0x62CF, 0x391C }, { 0x62D0, 0x125D }, 
-       { 0x62D1, 0x391A }, { 0x62D2, 0x1551 }, { 0x62D3, 0x2253 }, { 0x62D4, 0x3916 }, { 0x62D7, 0x3919 }, { 0x62D8, 0x1914 }, 
-       { 0x62D9, 0x203B }, { 0x62DB, 0x1E17 }, { 0x62DC, 0x3921 }, { 0x62DD, 0x2732 }, { 0x62E0, 0x1552 }, { 0x62E1, 0x1328 }, 
-       { 0x62EC, 0x1347 }, { 0x62ED, 0x1F01 }, { 0x62EE, 0x3929 }, { 0x62EF, 0x392E }, { 0x62F1, 0x392A }, { 0x62F3, 0x175D }, 
-       { 0x62F5, 0x392F }, { 0x62F6, 0x1B02 }, { 0x62F7, 0x1949 }, { 0x62FE, 0x1D06 }, { 0x62FF, 0x391D }, { 0x6301, 0x1B5D }, 
-       { 0x6302, 0x392C }, { 0x6307, 0x1B38 }, { 0x6308, 0x392D }, { 0x6309, 0x1024 }, { 0x630C, 0x3928 }, { 0x6311, 0x2409 }, 
-       { 0x6319, 0x1553 }, { 0x631F, 0x1614 }, { 0x6327, 0x392B }, { 0x6328, 0x1007 }, { 0x632B, 0x1A23 }, { 0x632F, 0x1F16 }, 
-       { 0x633A, 0x2452 }, { 0x633D, 0x2834 }, { 0x633E, 0x3931 }, { 0x633F, 0x213E }, { 0x6349, 0x220A }, { 0x634C, 0x1B0B }, 
-       { 0x634D, 0x3932 }, { 0x634F, 0x3934 }, { 0x6350, 0x3930 }, { 0x6355, 0x2A41 }, { 0x6357, 0x241D }, { 0x635C, 0x213C }, 
-       { 0x6367, 0x2A5B }, { 0x6368, 0x1C2E }, { 0x6369, 0x3940 }, { 0x636B, 0x393F }, { 0x636E, 0x1F58 }, { 0x6372, 0x175E }, 
-       { 0x6376, 0x3939 }, { 0x6377, 0x1E19 }, { 0x637A, 0x2648 }, { 0x637B, 0x2711 }, { 0x6380, 0x3937 }, { 0x6383, 0x213D }, 
-       { 0x6388, 0x1C58 }, { 0x6389, 0x393C }, { 0x638C, 0x1E18 }, { 0x638E, 0x3936 }, { 0x638F, 0x393B }, { 0x6392, 0x2733 }, 
-       { 0x6396, 0x3935 }, { 0x6398, 0x1701 }, { 0x639B, 0x133D }, { 0x639F, 0x393D }, { 0x63A0, 0x2E0B }, { 0x63A1, 0x1A2E }, 
-       { 0x63A2, 0x2315 }, { 0x63A3, 0x393A }, { 0x63A5, 0x203C }, { 0x63A7, 0x1915 }, { 0x63A8, 0x1F44 }, { 0x63A9, 0x1146 }, 
-       { 0x63AA, 0x211C }, { 0x63AB, 0x3938 }, { 0x63AC, 0x1525 }, { 0x63B2, 0x1727 }, { 0x63B4, 0x242F }, { 0x63B5, 0x393E }, 
-       { 0x63BB, 0x213F }, { 0x63BE, 0x3941 }, { 0x63C0, 0x3943 }, { 0x63C3, 0x2217 }, { 0x63C4, 0x3949 }, { 0x63C6, 0x3944 }, 
-       { 0x63C9, 0x3946 }, { 0x63CF, 0x2921 }, { 0x63D0, 0x2453 }, { 0x63D2, 0x3947 }, { 0x63D6, 0x2D0C }, { 0x63DA, 0x2D28 }, 
-       { 0x63DB, 0x1419 }, { 0x63E1, 0x100E }, { 0x63E3, 0x3945 }, { 0x63E9, 0x3942 }, { 0x63EE, 0x1458 }, { 0x63F4, 0x1147 }, 
-       { 0x63F6, 0x3948 }, { 0x63FA, 0x2D29 }, { 0x6406, 0x394C }, { 0x640D, 0x221B }, { 0x640F, 0x3953 }, { 0x6413, 0x394D }, 
-       { 0x6416, 0x394A }, { 0x6417, 0x3951 }, { 0x641C, 0x3933 }, { 0x6426, 0x394E }, { 0x6428, 0x3952 }, { 0x642C, 0x2822 }, 
-       { 0x642D, 0x254B }, { 0x6434, 0x394B }, { 0x6436, 0x394F }, { 0x643A, 0x1728 }, { 0x643E, 0x1A51 }, { 0x6442, 0x203D }, 
-       { 0x644E, 0x3957 }, { 0x6458, 0x2506 }, { 0x6467, 0x3954 }, { 0x6469, 0x2B40 }, { 0x646F, 0x3955 }, { 0x6476, 0x3956 }, 
-       { 0x6478, 0x2C2E }, { 0x647A, 0x2002 }, { 0x6483, 0x1742 }, { 0x6488, 0x395D }, { 0x6492, 0x1B15 }, { 0x6493, 0x395A }, 
-       { 0x6495, 0x3959 }, { 0x649A, 0x2712 }, { 0x649E, 0x2615 }, { 0x64A4, 0x2511 }, { 0x64A5, 0x395B }, { 0x64A9, 0x395C }, 
-       { 0x64AB, 0x294F }, { 0x64AD, 0x2725 }, { 0x64AE, 0x1B03 }, { 0x64B0, 0x2051 }, { 0x64B2, 0x2B30 }, { 0x64B9, 0x1329 }, 
-       { 0x64BB, 0x3A05 }, { 0x64BC, 0x395E }, { 0x64C1, 0x2D2A }, { 0x64C2, 0x3A07 }, { 0x64C5, 0x3A03 }, { 0x64C7, 0x3A04 }, 
-       { 0x64CD, 0x2140 }, { 0x64D2, 0x3A02 }, { 0x64D4, 0x391F }, { 0x64D8, 0x3A06 }, { 0x64DA, 0x3A01 }, { 0x64E0, 0x3A0B }, 
-       { 0x64E1, 0x3A0C }, { 0x64E2, 0x2507 }, { 0x64E3, 0x3A0E }, { 0x64E6, 0x1B04 }, { 0x64E7, 0x3A09 }, { 0x64EC, 0x151C }, 
-       { 0x64EF, 0x3A0F }, { 0x64F1, 0x3A08 }, { 0x64F2, 0x3A13 }, { 0x64F4, 0x3A12 }, { 0x64F6, 0x3A11 }, { 0x64FA, 0x3A14 }, 
-       { 0x64FD, 0x3A16 }, { 0x64FE, 0x1E51 }, { 0x6500, 0x3A15 }, { 0x6505, 0x3A19 }, { 0x6518, 0x3A17 }, { 0x651C, 0x3A18 }, 
-       { 0x651D, 0x3950 }, { 0x6523, 0x3A1B }, { 0x6524, 0x3A1A }, { 0x652A, 0x3958 }, { 0x652B, 0x3A1C }, { 0x652C, 0x3A10 }, 
-       { 0x652F, 0x1B39 }, { 0x6534, 0x3A1D }, { 0x6535, 0x3A1E }, { 0x6536, 0x3A20 }, { 0x6537, 0x3A1F }, { 0x6538, 0x3A21 }, 
-       { 0x6539, 0x125E }, { 0x653B, 0x1916 }, { 0x653E, 0x2A5C }, { 0x653F, 0x200F }, { 0x6545, 0x182E }, { 0x6548, 0x3A23 }, 
-       { 0x654D, 0x3A26 }, { 0x654F, 0x2932 }, { 0x6551, 0x153F }, { 0x6555, 0x3A25 }, { 0x6556, 0x3A24 }, { 0x6557, 0x2734 }, 
-       { 0x6558, 0x3A27 }, { 0x6559, 0x1615 }, { 0x655D, 0x3A29 }, { 0x655E, 0x3A28 }, { 0x6562, 0x141A }, { 0x6563, 0x1B16 }, 
-       { 0x6566, 0x2638 }, { 0x656C, 0x1729 }, { 0x6570, 0x1F54 }, { 0x6572, 0x3A2A }, { 0x6574, 0x2010 }, { 0x6575, 0x2508 }, 
-       { 0x6577, 0x293F }, { 0x6578, 0x3A2B }, { 0x6582, 0x3A2C }, { 0x6583, 0x3A2D }, { 0x6587, 0x2A18 }, { 0x6588, 0x353D }, 
-       { 0x6589, 0x2026 }, { 0x658C, 0x292C }, { 0x658E, 0x1A38 }, { 0x6590, 0x2845 }, { 0x6591, 0x2823 }, { 0x6597, 0x252D }, 
-       { 0x6599, 0x2E21 }, { 0x659B, 0x3A2F }, { 0x659C, 0x1C30 }, { 0x659F, 0x3A30 }, { 0x65A1, 0x1016 }, { 0x65A4, 0x1634 }, 
-       { 0x65A5, 0x202D }, { 0x65A7, 0x2940 }, { 0x65AB, 0x3A31 }, { 0x65AC, 0x1B22 }, { 0x65AD, 0x2327 }, { 0x65AF, 0x1B3B }, 
-       { 0x65B0, 0x1F17 }, { 0x65B7, 0x3A32 }, { 0x65B9, 0x2A5D }, { 0x65BC, 0x1157 }, { 0x65BD, 0x1B3C }, { 0x65C1, 0x3A35 }, 
-       { 0x65C3, 0x3A33 }, { 0x65C4, 0x3A36 }, { 0x65C5, 0x2E19 }, { 0x65C6, 0x3A34 }, { 0x65CB, 0x205B }, { 0x65CC, 0x3A37 }, 
-       { 0x65CF, 0x2212 }, { 0x65D2, 0x3A38 }, { 0x65D7, 0x145A }, { 0x65D9, 0x3A3A }, { 0x65DB, 0x3A39 }, { 0x65E0, 0x3A3B }, 
-       { 0x65E1, 0x3A3C }, { 0x65E2, 0x145B }, { 0x65E5, 0x265C }, { 0x65E6, 0x2316 }, { 0x65E7, 0x154C }, { 0x65E8, 0x1B3D }, 
-       { 0x65E9, 0x2141 }, { 0x65EC, 0x1D3C }, { 0x65ED, 0x1010 }, { 0x65F1, 0x3A3D }, { 0x65FA, 0x1202 }, { 0x65FB, 0x3A41 }, 
-       { 0x6602, 0x1917 }, { 0x6603, 0x3A40 }, { 0x6606, 0x1A0B }, { 0x6607, 0x1E1A }, { 0x660A, 0x3A3F }, { 0x660C, 0x1E1B }, 
-       { 0x660E, 0x2C20 }, { 0x660F, 0x1A0A }, { 0x6613, 0x1037 }, { 0x6614, 0x202E }, { 0x661C, 0x3A46 }, { 0x661F, 0x2011 }, 
-       { 0x6620, 0x1127 }, { 0x6625, 0x1D35 }, { 0x6627, 0x2B46 }, { 0x6628, 0x1A52 }, { 0x662D, 0x1E1C }, { 0x662F, 0x2007 }, 
-       { 0x6634, 0x3A45 }, { 0x6635, 0x3A43 }, { 0x6636, 0x3A44 }, { 0x663C, 0x234B }, { 0x663F, 0x3B06 }, { 0x6641, 0x3A4A }, 
-       { 0x6642, 0x1B5E }, { 0x6643, 0x1918 }, { 0x6644, 0x3A48 }, { 0x6649, 0x3A49 }, { 0x664B, 0x1F18 }, { 0x664F, 0x3A47 }, 
-       { 0x6652, 0x1B0F }, { 0x665D, 0x3A4C }, { 0x665E, 0x3A4B }, { 0x665F, 0x3A50 }, { 0x6662, 0x3A51 }, { 0x6664, 0x3A4D }, 
-       { 0x6666, 0x1302 }, { 0x6667, 0x3A4E }, { 0x6668, 0x3A4F }, { 0x6669, 0x2835 }, { 0x666E, 0x2941 }, { 0x666F, 0x172A }, 
-       { 0x6670, 0x3A52 }, { 0x6674, 0x2012 }, { 0x6676, 0x1E1D }, { 0x667A, 0x2332 }, { 0x6681, 0x1627 }, { 0x6683, 0x3A53 }, 
-       { 0x6684, 0x3A57 }, { 0x6687, 0x122B }, { 0x6688, 0x3A54 }, { 0x6689, 0x3A56 }, { 0x668E, 0x3A55 }, { 0x6691, 0x1D4B }, 
-       { 0x6696, 0x2328 }, { 0x6697, 0x1025 }, { 0x6698, 0x3A58 }, { 0x669D, 0x3A59 }, { 0x66A2, 0x240A }, { 0x66A6, 0x2E51 }, 
-       { 0x66AB, 0x1B23 }, { 0x66AE, 0x2A4B }, { 0x66B4, 0x2B1D }, { 0x66B8, 0x3B02 }, { 0x66B9, 0x3A5B }, { 0x66BC, 0x3A5E }, 
-       { 0x66BE, 0x3A5D }, { 0x66C1, 0x3A5A }, { 0x66C4, 0x3B01 }, { 0x66C7, 0x263E }, { 0x66C9, 0x3A5C }, { 0x66D6, 0x3B03 }, 
-       { 0x66D9, 0x1D4C }, { 0x66DA, 0x3B04 }, { 0x66DC, 0x2D2B }, { 0x66DD, 0x2758 }, { 0x66E0, 0x3B05 }, { 0x66E6, 0x3B07 }, 
-       { 0x66E9, 0x3B08 }, { 0x66F0, 0x3B09 }, { 0x66F2, 0x162A }, { 0x66F3, 0x1128 }, { 0x66F4, 0x1919 }, { 0x66F5, 0x3B0A }, 
-       { 0x66F7, 0x3B0B }, { 0x66F8, 0x1D51 }, { 0x66F9, 0x2142 }, { 0x66FC, 0x3238 }, { 0x66FD, 0x211E }, { 0x66FE, 0x211D }, 
-       { 0x66FF, 0x2238 }, { 0x6700, 0x1A27 }, { 0x6703, 0x3052 }, { 0x6708, 0x174E }, { 0x6709, 0x2D0D }, { 0x670B, 0x2A5E }, 
-       { 0x670D, 0x295E }, { 0x670F, 0x3B0C }, { 0x6714, 0x1A53 }, { 0x6715, 0x241F }, { 0x6716, 0x3B0D }, { 0x6717, 0x2F0F }, 
-       { 0x671B, 0x2B1E }, { 0x671D, 0x240B }, { 0x671E, 0x3B0E }, { 0x671F, 0x145C }, { 0x6726, 0x3B0F }, { 0x6727, 0x3B10 }, 
-       { 0x6728, 0x2C3A }, { 0x672A, 0x2C04 }, { 0x672B, 0x2B56 }, { 0x672C, 0x2B3C }, { 0x672D, 0x1B05 }, { 0x672E, 0x3B12 }, 
-       { 0x6731, 0x1C4B }, { 0x6734, 0x2B31 }, { 0x6736, 0x3B14 }, { 0x6737, 0x3B17 }, { 0x6738, 0x3B16 }, { 0x673A, 0x1459 }, 
-       { 0x673D, 0x1540 }, { 0x673F, 0x3B13 }, { 0x6741, 0x3B15 }, { 0x6746, 0x3B18 }, { 0x6749, 0x1F59 }, { 0x674E, 0x2D5B }, 
-       { 0x674F, 0x1029 }, { 0x6750, 0x1A40 }, { 0x6751, 0x221C }, { 0x6753, 0x1C3D }, { 0x6756, 0x1E53 }, { 0x6759, 0x3B1B }, 
-       { 0x675C, 0x252E }, { 0x675E, 0x3B19 }, { 0x675F, 0x220B }, { 0x6760, 0x3B1A }, { 0x6761, 0x1E52 }, { 0x6762, 0x2C3D }, 
-       { 0x6763, 0x3B1C }, { 0x6764, 0x3B1D }, { 0x6765, 0x2D48 }, { 0x676A, 0x3B22 }, { 0x676D, 0x191A }, { 0x676F, 0x2735 }, 
-       { 0x6770, 0x3B1F }, { 0x6771, 0x254C }, { 0x6772, 0x3A3E }, { 0x6773, 0x3A42 }, { 0x6775, 0x152F }, { 0x6777, 0x2727 }, 
-       { 0x677C, 0x3B21 }, { 0x677E, 0x1E1E }, { 0x677F, 0x2824 }, { 0x6785, 0x3B27 }, { 0x6787, 0x285A }, { 0x6789, 0x3B1E }, 
-       { 0x678B, 0x3B24 }, { 0x678C, 0x3B23 }, { 0x6790, 0x202F }, { 0x6795, 0x2B4D }, { 0x6797, 0x2E33 }, { 0x679A, 0x2B47 }, 
-       { 0x679C, 0x122C }, { 0x679D, 0x1B3E }, { 0x67A0, 0x2F28 }, { 0x67A1, 0x3B26 }, { 0x67A2, 0x1F55 }, { 0x67A6, 0x3B25 }, 
-       { 0x67A9, 0x3B20 }, { 0x67AF, 0x182F }, { 0x67B3, 0x3B2C }, { 0x67B4, 0x3B2A }, { 0x67B6, 0x122D }, { 0x67B7, 0x3B28 }, 
-       { 0x67B8, 0x3B2E }, { 0x67B9, 0x3B34 }, { 0x67C1, 0x2228 }, { 0x67C4, 0x2A21 }, { 0x67C6, 0x3B36 }, { 0x67CA, 0x2902 }, 
-       { 0x67CE, 0x3B35 }, { 0x67CF, 0x2750 }, { 0x67D0, 0x2B1F }, { 0x67D1, 0x141B }, { 0x67D3, 0x2057 }, { 0x67D4, 0x1D20 }, 
-       { 0x67D8, 0x2433 }, { 0x67DA, 0x2D0E }, { 0x67DD, 0x3B31 }, { 0x67DE, 0x3B30 }, { 0x67E2, 0x3B32 }, { 0x67E4, 0x3B2F }, 
-       { 0x67E7, 0x3B37 }, { 0x67E9, 0x3B2D }, { 0x67EC, 0x3B2B }, { 0x67EE, 0x3B33 }, { 0x67EF, 0x3B29 }, { 0x67F1, 0x234C }, 
-       { 0x67F3, 0x2C58 }, { 0x67F4, 0x1C26 }, { 0x67F5, 0x1A54 }, { 0x67FB, 0x1A1A }, { 0x67FE, 0x2B4F }, { 0x67FF, 0x1321 }, 
-       { 0x6802, 0x242E }, { 0x6803, 0x262A }, { 0x6804, 0x1129 }, { 0x6813, 0x2052 }, { 0x6816, 0x2014 }, { 0x6817, 0x170A }, 
-       { 0x681E, 0x3B39 }, { 0x6821, 0x191B }, { 0x6822, 0x135C }, { 0x6829, 0x3B3B }, { 0x682A, 0x1354 }, { 0x682B, 0x3B41 }, 
-       { 0x6832, 0x3B3E }, { 0x6834, 0x2053 }, { 0x6838, 0x132B }, { 0x6839, 0x1A0C }, { 0x683C, 0x132A }, { 0x683D, 0x1A2F }, 
-       { 0x6840, 0x3B3C }, { 0x6841, 0x1745 }, { 0x6842, 0x172B }, { 0x6843, 0x254D }, { 0x6846, 0x3B3A }, { 0x6848, 0x1026 }, 
-       { 0x684D, 0x3B3D }, { 0x684E, 0x3B3F }, { 0x6850, 0x162D }, { 0x6851, 0x170C }, { 0x6853, 0x141C }, { 0x6854, 0x152B }, 
-       { 0x6859, 0x3B42 }, { 0x685C, 0x1A59 }, { 0x685D, 0x2B51 }, { 0x685F, 0x1B17 }, { 0x6863, 0x3B43 }, { 0x6867, 0x2910 }, 
-       { 0x6874, 0x3B4F }, { 0x6876, 0x1213 }, { 0x6877, 0x3B44 }, { 0x687E, 0x3B55 }, { 0x687F, 0x3B45 }, { 0x6881, 0x2E22 }, 
-       { 0x6883, 0x3B4C }, { 0x6885, 0x273F }, { 0x688D, 0x3B54 }, { 0x688F, 0x3B47 }, { 0x6893, 0x1014 }, { 0x6894, 0x3B49 }, 
-       { 0x6897, 0x191C }, { 0x689B, 0x3B4B }, { 0x689D, 0x3B4A }, { 0x689F, 0x3B46 }, { 0x68A0, 0x3B51 }, { 0x68A2, 0x1E1F }, 
-       { 0x68A6, 0x344D }, { 0x68A7, 0x1848 }, { 0x68A8, 0x2D5C }, { 0x68AD, 0x3B48 }, { 0x68AF, 0x2454 }, { 0x68B0, 0x1303 }, 
-       { 0x68B1, 0x1A0D }, { 0x68B3, 0x3B40 }, { 0x68B5, 0x3B50 }, { 0x68B6, 0x1341 }, { 0x68B9, 0x3B4E }, { 0x68BA, 0x3B52 }, 
-       { 0x68BC, 0x254E }, { 0x68C4, 0x145E }, { 0x68C6, 0x3C12 }, { 0x68C9, 0x2C29 }, { 0x68CA, 0x3B57 }, { 0x68CB, 0x145D }, 
-       { 0x68CD, 0x3B5E }, { 0x68D2, 0x2B20 }, { 0x68D4, 0x3C01 }, { 0x68D5, 0x3C03 }, { 0x68D7, 0x3C07 }, { 0x68D8, 0x3B59 }, 
-       { 0x68DA, 0x230A }, { 0x68DF, 0x254F }, { 0x68E0, 0x3C0B }, { 0x68E1, 0x3B5C }, { 0x68E3, 0x3C08 }, { 0x68E7, 0x3C02 }, 
-       { 0x68EE, 0x1F19 }, { 0x68EF, 0x3C0C }, { 0x68F2, 0x2013 }, { 0x68F9, 0x3C0A }, { 0x68FA, 0x141D }, { 0x6900, 0x2F30 }, 
-       { 0x6901, 0x3B56 }, { 0x6904, 0x3C06 }, { 0x6905, 0x1038 }, { 0x6908, 0x3B58 }, { 0x690B, 0x2C1A }, { 0x690C, 0x3B5D }, 
-       { 0x690D, 0x1F02 }, { 0x690E, 0x2427 }, { 0x690F, 0x3B53 }, { 0x6912, 0x3C05 }, { 0x6919, 0x1F5A }, { 0x691A, 0x3C0F }, 
-       { 0x691B, 0x1351 }, { 0x691C, 0x1801 }, { 0x6921, 0x3C11 }, { 0x6922, 0x3B5A }, { 0x6923, 0x3C10 }, { 0x6925, 0x3C09 }, 
-       { 0x6926, 0x3B5B }, { 0x6928, 0x3C0D }, { 0x692A, 0x3C0E }, { 0x6930, 0x3C1F }, { 0x6934, 0x262E }, { 0x6936, 0x3C04 }, 
-       { 0x6939, 0x3C1B }, { 0x693D, 0x3C1D }, { 0x693F, 0x2438 }, { 0x694A, 0x2D2C }, { 0x6953, 0x2956 }, { 0x6954, 0x3C18 }, 
-       { 0x6955, 0x222A }, { 0x6959, 0x3C1E }, { 0x695A, 0x211F }, { 0x695C, 0x3C15 }, { 0x695D, 0x3C22 }, { 0x695E, 0x3C21 }, 
-       { 0x6960, 0x264F }, { 0x6961, 0x3C20 }, { 0x6962, 0x264A }, { 0x696A, 0x3C24 }, { 0x696B, 0x3C17 }, { 0x696D, 0x1628 }, 
-       { 0x696E, 0x3C1A }, { 0x696F, 0x1D3D }, { 0x6973, 0x2740 }, { 0x6974, 0x3C1C }, { 0x6975, 0x162B }, { 0x6977, 0x3C14 }, 
-       { 0x6978, 0x3C16 }, { 0x6979, 0x3C13 }, { 0x697C, 0x2F10 }, { 0x697D, 0x133A }, { 0x697E, 0x3C19 }, { 0x6981, 0x3C23 }, 
-       { 0x6982, 0x1315 }, { 0x698A, 0x1A47 }, { 0x698E, 0x113D }, { 0x6991, 0x3C34 }, { 0x6994, 0x2F11 }, { 0x6995, 0x3C37 }, 
-       { 0x699B, 0x1F1A }, { 0x699C, 0x3C36 }, { 0x69A0, 0x3C35 }, { 0x69A7, 0x3C32 }, { 0x69AE, 0x3C26 }, { 0x69B1, 0x3C43 }, 
-       { 0x69B2, 0x3C25 }, { 0x69B4, 0x3C38 }, { 0x69BB, 0x3C30 }, { 0x69BE, 0x3C2B }, { 0x69BF, 0x3C28 }, { 0x69C1, 0x3C29 }, 
-       { 0x69C3, 0x3C31 }, { 0x69C7, 0x5402 }, { 0x69CA, 0x3C2E }, { 0x69CB, 0x191D }, { 0x69CC, 0x2428 }, { 0x69CD, 0x2144 }, 
-       { 0x69CE, 0x3C2C }, { 0x69D0, 0x3C27 }, { 0x69D3, 0x3C2A }, { 0x69D8, 0x2D2D }, { 0x69D9, 0x2B4A }, { 0x69DD, 0x3C2F }, 
-       { 0x69DE, 0x3C39 }, { 0x69E7, 0x3C41 }, { 0x69E8, 0x3C3A }, { 0x69EB, 0x3C47 }, { 0x69ED, 0x3C45 }, { 0x69F2, 0x3C40 }, 
-       { 0x69F9, 0x3C3F }, { 0x69FB, 0x2430 }, { 0x69FD, 0x2145 }, { 0x69FF, 0x3C3D }, { 0x6A02, 0x3C3B }, { 0x6A05, 0x3C42 }, 
-       { 0x6A0A, 0x3C48 }, { 0x6A0B, 0x2855 }, { 0x6A0C, 0x3C4E }, { 0x6A12, 0x3C49 }, { 0x6A13, 0x3C4C }, { 0x6A14, 0x3C46 }, 
-       { 0x6A17, 0x2354 }, { 0x6A19, 0x2918 }, { 0x6A1B, 0x3C3C }, { 0x6A1E, 0x3C44 }, { 0x6A1F, 0x1E20 }, { 0x6A21, 0x2C2F }, 
-       { 0x6A22, 0x3C58 }, { 0x6A23, 0x3C4B }, { 0x6A29, 0x1802 }, { 0x6A2A, 0x1203 }, { 0x6A2B, 0x133F }, { 0x6A2E, 0x3C33 }, 
-       { 0x6A35, 0x1E21 }, { 0x6A36, 0x3C50 }, { 0x6A38, 0x3C57 }, { 0x6A39, 0x1C59 }, { 0x6A3A, 0x1352 }, { 0x6A3D, 0x230E }, 
-       { 0x6A44, 0x3C4D }, { 0x6A47, 0x3C52 }, { 0x6A48, 0x3C56 }, { 0x6A4B, 0x1616 }, { 0x6A58, 0x152C }, { 0x6A59, 0x3C54 }, 
-       { 0x6A5F, 0x1501 }, { 0x6A61, 0x262B }, { 0x6A62, 0x3C53 }, { 0x6A66, 0x3C55 }, { 0x6A72, 0x3C4F }, { 0x6A78, 0x3C51 }, 
-       { 0x6A7F, 0x1340 }, { 0x6A80, 0x2329 }, { 0x6A84, 0x3C5C }, { 0x6A8D, 0x3C5A }, { 0x6A8E, 0x1849 }, { 0x6A90, 0x3C59 }, 
-       { 0x6A97, 0x3D01 }, { 0x6A9C, 0x3B38 }, { 0x6AA0, 0x3C5B }, { 0x6AA2, 0x3C5D }, { 0x6AA3, 0x3C5E }, { 0x6AAA, 0x3D0C }, 
-       { 0x6AAC, 0x3D08 }, { 0x6AAE, 0x3B4D }, { 0x6AB3, 0x3D07 }, { 0x6AB8, 0x3D06 }, { 0x6ABB, 0x3D03 }, { 0x6AC1, 0x3C4A }, 
-       { 0x6AC2, 0x3D05 }, { 0x6AC3, 0x3D04 }, { 0x6AD1, 0x3D0A }, { 0x6AD3, 0x2F06 }, { 0x6ADA, 0x3D0D }, { 0x6ADB, 0x165B }, 
-       { 0x6ADE, 0x3D09 }, { 0x6ADF, 0x3D0B }, { 0x6AE8, 0x2807 }, { 0x6AEA, 0x3D0E }, { 0x6AFA, 0x3D12 }, { 0x6AFB, 0x3D0F }, 
-       { 0x6B04, 0x2D53 }, { 0x6B05, 0x3D10 }, { 0x6B0A, 0x3C3E }, { 0x6B12, 0x3D13 }, { 0x6B16, 0x3D14 }, { 0x6B1D, 0x1115 }, 
-       { 0x6B1F, 0x3D16 }, { 0x6B20, 0x1747 }, { 0x6B21, 0x1C01 }, { 0x6B23, 0x1635 }, { 0x6B27, 0x1204 }, { 0x6B32, 0x2D3F }, 
-       { 0x6B37, 0x3D18 }, { 0x6B38, 0x3D17 }, { 0x6B39, 0x3D1A }, { 0x6B3A, 0x151D }, { 0x6B3D, 0x1636 }, { 0x6B3E, 0x141E }, 
-       { 0x6B43, 0x3D1D }, { 0x6B47, 0x3D1C }, { 0x6B49, 0x3D1E }, { 0x6B4C, 0x122E }, { 0x6B4E, 0x2317 }, { 0x6B50, 0x3D1F }, 
-       { 0x6B53, 0x141F }, { 0x6B54, 0x3D21 }, { 0x6B59, 0x3D20 }, { 0x6B5B, 0x3D22 }, { 0x6B5F, 0x3D23 }, { 0x6B61, 0x3D24 }, 
-       { 0x6B62, 0x1B3F }, { 0x6B63, 0x2015 }, { 0x6B64, 0x1A01 }, { 0x6B66, 0x2950 }, { 0x6B69, 0x2A42 }, { 0x6B6A, 0x2F24 }, 
-       { 0x6B6F, 0x1B55 }, { 0x6B73, 0x1A30 }, { 0x6B74, 0x2E52 }, { 0x6B78, 0x3D25 }, { 0x6B79, 0x3D26 }, { 0x6B7B, 0x1B40 }, 
-       { 0x6B7F, 0x3D27 }, { 0x6B80, 0x3D28 }, { 0x6B83, 0x3D2A }, { 0x6B84, 0x3D29 }, { 0x6B86, 0x2B38 }, { 0x6B89, 0x1D3E }, 
-       { 0x6B8A, 0x1C4C }, { 0x6B8B, 0x1B24 }, { 0x6B8D, 0x3D2B }, { 0x6B95, 0x3D2D }, { 0x6B96, 0x1F03 }, { 0x6B98, 0x3D2C }, 
-       { 0x6B9E, 0x3D2E }, { 0x6BA4, 0x3D2F }, { 0x6BAA, 0x3D30 }, { 0x6BAB, 0x3D31 }, { 0x6BAF, 0x3D32 }, { 0x6BB1, 0x3D34 }, 
-       { 0x6BB2, 0x3D33 }, { 0x6BB3, 0x3D35 }, { 0x6BB4, 0x1205 }, { 0x6BB5, 0x232A }, { 0x6BB7, 0x3D36 }, { 0x6BBA, 0x1B06 }, 
-       { 0x6BBB, 0x132C }, { 0x6BBC, 0x3D37 }, { 0x6BBF, 0x2522 }, { 0x6BC0, 0x342C }, { 0x6BC5, 0x1503 }, { 0x6BC6, 0x3D38 }, 
-       { 0x6BCB, 0x3D39 }, { 0x6BCD, 0x2A4C }, { 0x6BCE, 0x2B48 }, { 0x6BD2, 0x2627 }, { 0x6BD3, 0x3D3A }, { 0x6BD4, 0x2846 }, 
-       { 0x6BD8, 0x285B }, { 0x6BDB, 0x2C33 }, { 0x6BDF, 0x3D3B }, { 0x6BEB, 0x3D3D }, { 0x6BEC, 0x3D3C }, { 0x6BEF, 0x3D3F }, 
-       { 0x6BF3, 0x3D3E }, { 0x6C08, 0x3D41 }, { 0x6C0F, 0x1B41 }, { 0x6C11, 0x2C11 }, { 0x6C13, 0x3D42 }, { 0x6C14, 0x3D43 }, 
-       { 0x6C17, 0x1504 }, { 0x6C1B, 0x3D44 }, { 0x6C23, 0x3D46 }, { 0x6C24, 0x3D45 }, { 0x6C34, 0x1F45 }, { 0x6C37, 0x2919 }, 
-       { 0x6C38, 0x112A }, { 0x6C3E, 0x2825 }, { 0x6C40, 0x2455 }, { 0x6C41, 0x1D21 }, { 0x6C42, 0x1541 }, { 0x6C4E, 0x2826 }, 
-       { 0x6C50, 0x1C0E }, { 0x6C55, 0x3D48 }, { 0x6C57, 0x1420 }, { 0x6C5A, 0x1158 }, { 0x6C5D, 0x2652 }, { 0x6C5E, 0x3D47 }, 
-       { 0x6C5F, 0x191E }, { 0x6C60, 0x2333 }, { 0x6C62, 0x3D49 }, { 0x6C68, 0x3D51 }, { 0x6C6A, 0x3D4A }, { 0x6C70, 0x2221 }, 
-       { 0x6C72, 0x1542 }, { 0x6C73, 0x3D52 }, { 0x6C7A, 0x1748 }, { 0x6C7D, 0x1505 }, { 0x6C7E, 0x3D50 }, { 0x6C81, 0x3D4E }, 
-       { 0x6C82, 0x3D4B }, { 0x6C83, 0x2D40 }, { 0x6C88, 0x2420 }, { 0x6C8C, 0x2639 }, { 0x6C8D, 0x3D4C }, { 0x6C90, 0x3D54 }, 
-       { 0x6C92, 0x3D53 }, { 0x6C93, 0x1703 }, { 0x6C96, 0x120D }, { 0x6C99, 0x1A1B }, { 0x6C9A, 0x3D4D }, { 0x6C9B, 0x3D4F }, 
-       { 0x6CA1, 0x2B37 }, { 0x6CA2, 0x2254 }, { 0x6CAB, 0x2B57 }, { 0x6CAE, 0x3D5C }, { 0x6CB1, 0x3D5D }, { 0x6CB3, 0x122F }, 
-       { 0x6CB8, 0x2A08 }, { 0x6CB9, 0x2C5D }, { 0x6CBA, 0x3E01 }, { 0x6CBB, 0x1C03 }, { 0x6CBC, 0x1E22 }, { 0x6CBD, 0x3D58 }, 
-       { 0x6CBE, 0x3D5E }, { 0x6CBF, 0x1148 }, { 0x6CC1, 0x1617 }, { 0x6CC4, 0x3D55 }, { 0x6CC5, 0x3D5A }, { 0x6CC9, 0x2054 }, 
-       { 0x6CCA, 0x2751 }, { 0x6CCC, 0x2847 }, { 0x6CD3, 0x3D57 }, { 0x6CD5, 0x2B01 }, { 0x6CD7, 0x3D59 }, { 0x6CD9, 0x3E04 }, 
-       { 0x6CDB, 0x3E02 }, { 0x6CDD, 0x3D5B }, { 0x6CE1, 0x2B02 }, { 0x6CE2, 0x2728 }, { 0x6CE3, 0x1543 }, { 0x6CE5, 0x2505 }, 
-       { 0x6CE8, 0x234D }, { 0x6CEA, 0x3E05 }, { 0x6CEF, 0x3E03 }, { 0x6CF0, 0x2239 }, { 0x6CF1, 0x3D56 }, { 0x6CF3, 0x112B }, 
-       { 0x6D0B, 0x2D2E }, { 0x6D0C, 0x3E10 }, { 0x6D12, 0x3E0F }, { 0x6D17, 0x2056 }, { 0x6D19, 0x3E0C }, { 0x6D1B, 0x2D4C }, 
-       { 0x6D1E, 0x2616 }, { 0x6D1F, 0x3E06 }, { 0x6D25, 0x2425 }, { 0x6D29, 0x112C }, { 0x6D2A, 0x191F }, { 0x6D2B, 0x3E09 }, 
-       { 0x6D32, 0x1D07 }, { 0x6D33, 0x3E0E }, { 0x6D35, 0x3E0D }, { 0x6D36, 0x3E08 }, { 0x6D38, 0x3E0B }, { 0x6D3B, 0x1348 }, 
-       { 0x6D3D, 0x3E0A }, { 0x6D3E, 0x2729 }, { 0x6D41, 0x2E0E }, { 0x6D44, 0x1E54 }, { 0x6D45, 0x2055 }, { 0x6D59, 0x3E16 }, 
-       { 0x6D5A, 0x3E14 }, { 0x6D5C, 0x292D }, { 0x6D63, 0x3E11 }, { 0x6D64, 0x3E13 }, { 0x6D66, 0x111A }, { 0x6D69, 0x1920 }, 
-       { 0x6D6A, 0x2F12 }, { 0x6D6C, 0x131D }, { 0x6D6E, 0x2942 }, { 0x6D74, 0x2D41 }, { 0x6D77, 0x1304 }, { 0x6D78, 0x1F1B }, 
-       { 0x6D79, 0x3E15 }, { 0x6D85, 0x3E1A }, { 0x6D88, 0x1E23 }, { 0x6D8C, 0x2D10 }, { 0x6D8E, 0x3E17 }, { 0x6D93, 0x3E12 }, 
-       { 0x6D95, 0x3E18 }, { 0x6D99, 0x2E3E }, { 0x6D9B, 0x2553 }, { 0x6D9C, 0x2622 }, { 0x6DAF, 0x1316 }, { 0x6DB2, 0x1135 }, 
-       { 0x6DB5, 0x3E1E }, { 0x6DB8, 0x3E21 }, { 0x6DBC, 0x2E23 }, { 0x6DC0, 0x2D44 }, { 0x6DC5, 0x3E28 }, { 0x6DC6, 0x3E22 }, 
-       { 0x6DC7, 0x3E1F }, { 0x6DCB, 0x2E34 }, { 0x6DCC, 0x3E25 }, { 0x6DD1, 0x1D2A }, { 0x6DD2, 0x3E27 }, { 0x6DD5, 0x3E2C }, 
-       { 0x6DD8, 0x2551 }, { 0x6DD9, 0x3E2A }, { 0x6DDE, 0x3E24 }, { 0x6DE1, 0x2318 }, { 0x6DE4, 0x3E2B }, { 0x6DE6, 0x3E20 }, 
-       { 0x6DE8, 0x3E26 }, { 0x6DEA, 0x3E2D }, { 0x6DEB, 0x105C }, { 0x6DEC, 0x3E23 }, { 0x6DEE, 0x3E2E }, { 0x6DF1, 0x1F1C }, 
-       { 0x6DF3, 0x1D3F }, { 0x6DF5, 0x2A05 }, { 0x6DF7, 0x1A0E }, { 0x6DF9, 0x3E1B }, { 0x6DFA, 0x3E29 }, { 0x6DFB, 0x251A }, 
-       { 0x6E05, 0x2016 }, { 0x6E07, 0x1349 }, { 0x6E08, 0x1A31 }, { 0x6E09, 0x1E24 }, { 0x6E0A, 0x3E1D }, { 0x6E0B, 0x1D22 }, 
-       { 0x6E13, 0x172C }, { 0x6E15, 0x3E1C }, { 0x6E19, 0x3E32 }, { 0x6E1A, 0x1D4D }, { 0x6E1B, 0x181A }, { 0x6E1D, 0x3E41 }, 
-       { 0x6E1F, 0x3E3B }, { 0x6E20, 0x1554 }, { 0x6E21, 0x252F }, { 0x6E23, 0x3E36 }, { 0x6E24, 0x3E3F }, { 0x6E25, 0x100F }, 
-       { 0x6E26, 0x1112 }, { 0x6E29, 0x1219 }, { 0x6E2B, 0x3E38 }, { 0x6E2C, 0x220C }, { 0x6E2D, 0x3E2F }, { 0x6E2E, 0x3E31 }, 
-       { 0x6E2F, 0x1921 }, { 0x6E38, 0x3E42 }, { 0x6E3A, 0x3E3D }, { 0x6E3E, 0x3E35 }, { 0x6E43, 0x3E3C }, { 0x6E4A, 0x2C0B }, 
-       { 0x6E4D, 0x3E3A }, { 0x6E4E, 0x3E3E }, { 0x6E56, 0x1830 }, { 0x6E58, 0x1E25 }, { 0x6E5B, 0x2319 }, { 0x6E5F, 0x3E34 }, 
-       { 0x6E67, 0x2D0F }, { 0x6E6B, 0x3E37 }, { 0x6E6E, 0x3E30 }, { 0x6E6F, 0x2552 }, { 0x6E72, 0x3E33 }, { 0x6E76, 0x3E39 }, 
-       { 0x6E7E, 0x2F31 }, { 0x6E7F, 0x1C1E }, { 0x6E80, 0x2B5E }, { 0x6E82, 0x3E43 }, { 0x6E8C, 0x280E }, { 0x6E8F, 0x3E4F }, 
-       { 0x6E90, 0x181B }, { 0x6E96, 0x1D40 }, { 0x6E98, 0x3E45 }, { 0x6E9C, 0x2E0F }, { 0x6E9D, 0x1922 }, { 0x6E9F, 0x3E52 }, 
-       { 0x6EA2, 0x104E }, { 0x6EA5, 0x3E50 }, { 0x6EAA, 0x3E44 }, { 0x6EAF, 0x3E4A }, { 0x6EB2, 0x3E4C }, { 0x6EB6, 0x2D2F }, 
-       { 0x6EB7, 0x3E47 }, { 0x6EBA, 0x250E }, { 0x6EBD, 0x3E49 }, { 0x6EC2, 0x3E51 }, { 0x6EC4, 0x3E4B }, { 0x6EC5, 0x2C27 }, 
-       { 0x6EC9, 0x3E46 }, { 0x6ECB, 0x1C02 }, { 0x6ECC, 0x3E5E }, { 0x6ED1, 0x134A }, { 0x6ED3, 0x3E48 }, { 0x6ED4, 0x3E4D }, 
-       { 0x6ED5, 0x3E4E }, { 0x6EDD, 0x224C }, { 0x6EDE, 0x223A }, { 0x6EEC, 0x3E56 }, { 0x6EEF, 0x3E5C }, { 0x6EF2, 0x3E5A }, 
-       { 0x6EF4, 0x2509 }, { 0x6EF7, 0x3F03 }, { 0x6EF8, 0x3E57 }, { 0x6EFE, 0x3E58 }, { 0x6EFF, 0x3E40 }, { 0x6F01, 0x1559 }, 
-       { 0x6F02, 0x291A }, { 0x6F06, 0x1C1F }, { 0x6F09, 0x1957 }, { 0x6F0F, 0x2F13 }, { 0x6F11, 0x3E54 }, { 0x6F13, 0x3F02 }, 
-       { 0x6F14, 0x1149 }, { 0x6F15, 0x2146 }, { 0x6F20, 0x2759 }, { 0x6F22, 0x1421 }, { 0x6F23, 0x2E5A }, { 0x6F2B, 0x2C01 }, 
-       { 0x6F2C, 0x2432 }, { 0x6F31, 0x3E5B }, { 0x6F32, 0x3E5D }, { 0x6F38, 0x2112 }, { 0x6F3E, 0x3F01 }, { 0x6F3F, 0x3E59 }, 
-       { 0x6F41, 0x3E53 }, { 0x6F45, 0x1423 }, { 0x6F54, 0x1749 }, { 0x6F58, 0x3F0F }, { 0x6F5B, 0x3F0A }, { 0x6F5C, 0x2058 }, 
-       { 0x6F5F, 0x1343 }, { 0x6F64, 0x1D41 }, { 0x6F66, 0x3F13 }, { 0x6F6D, 0x3F0C }, { 0x6F6E, 0x240C }, { 0x6F6F, 0x3F09 }, 
-       { 0x6F70, 0x2439 }, { 0x6F74, 0x3F2C }, { 0x6F78, 0x3F06 }, { 0x6F7A, 0x3F05 }, { 0x6F7C, 0x3F0E }, { 0x6F80, 0x3F08 }, 
-       { 0x6F81, 0x3F07 }, { 0x6F82, 0x3F0D }, { 0x6F84, 0x2001 }, { 0x6F86, 0x3F04 }, { 0x6F8E, 0x3F10 }, { 0x6F91, 0x3F11 }, 
-       { 0x6F97, 0x1422 }, { 0x6FA1, 0x3F16 }, { 0x6FA3, 0x3F15 }, { 0x6FA4, 0x3F17 }, { 0x6FAA, 0x3F1A }, { 0x6FB1, 0x2523 }, 
-       { 0x6FB3, 0x3F14 }, { 0x6FB9, 0x3F18 }, { 0x6FC0, 0x1743 }, { 0x6FC1, 0x2259 }, { 0x6FC2, 0x3F12 }, { 0x6FC3, 0x271B }, 
-       { 0x6FC6, 0x3F19 }, { 0x6FD4, 0x3F1E }, { 0x6FD5, 0x3F1C }, { 0x6FD8, 0x3F1F }, { 0x6FDB, 0x3F22 }, { 0x6FDF, 0x3F1B }, 
-       { 0x6FE0, 0x194A }, { 0x6FE1, 0x2708 }, { 0x6FE4, 0x3E19 }, { 0x6FEB, 0x2D54 }, { 0x6FEC, 0x3F1D }, { 0x6FEE, 0x3F21 }, 
-       { 0x6FEF, 0x2255 }, { 0x6FF1, 0x3F20 }, { 0x6FF3, 0x3F0B }, { 0x6FF6, 0x4F49 }, { 0x6FFA, 0x3F25 }, { 0x6FFE, 0x3F29 }, 
-       { 0x7001, 0x3F27 }, { 0x7009, 0x3F23 }, { 0x700B, 0x3F24 }, { 0x700F, 0x3F28 }, { 0x7011, 0x3F26 }, { 0x7015, 0x292E }, 
-       { 0x7018, 0x3F2E }, { 0x701A, 0x3F2B }, { 0x701B, 0x3F2A }, { 0x701D, 0x3F2D }, { 0x701E, 0x2634 }, { 0x701F, 0x3F2F }, 
-       { 0x7026, 0x2355 }, { 0x7027, 0x224D }, { 0x702C, 0x2005 }, { 0x7030, 0x3F30 }, { 0x7032, 0x3F32 }, { 0x703E, 0x3F31 }, 
-       { 0x704C, 0x3E55 }, { 0x7051, 0x3F33 }, { 0x7058, 0x2647 }, { 0x7063, 0x3F34 }, { 0x706B, 0x1230 }, { 0x706F, 0x2554 }, 
-       { 0x7070, 0x1305 }, { 0x7078, 0x1544 }, { 0x707C, 0x1C3E }, { 0x707D, 0x1A32 }, { 0x7089, 0x2F07 }, { 0x708A, 0x1F46 }, 
-       { 0x708E, 0x114A }, { 0x7092, 0x3F36 }, { 0x7099, 0x3F35 }, { 0x70AC, 0x3F39 }, { 0x70AD, 0x231A }, { 0x70AE, 0x3F3C }, 
-       { 0x70AF, 0x3F37 }, { 0x70B3, 0x3F3B }, { 0x70B8, 0x3F3A }, { 0x70B9, 0x2520 }, { 0x70BA, 0x1039 }, { 0x70C8, 0x2E55 }, 
-       { 0x70CB, 0x3F3E }, { 0x70CF, 0x1108 }, { 0x70D9, 0x3F40 }, { 0x70DD, 0x3F3F }, { 0x70DF, 0x3F3D }, { 0x70F1, 0x3F38 }, 
-       { 0x70F9, 0x2B03 }, { 0x70FD, 0x3F42 }, { 0x7109, 0x3F41 }, { 0x7114, 0x114B }, { 0x7119, 0x3F44 }, { 0x711A, 0x2A12 }, 
-       { 0x711C, 0x3F43 }, { 0x7121, 0x2C15 }, { 0x7126, 0x1E27 }, { 0x7136, 0x2113 }, { 0x713C, 0x1E26 }, { 0x7149, 0x2E5B }, 
-       { 0x714C, 0x3F4A }, { 0x714E, 0x2059 }, { 0x7155, 0x3F46 }, { 0x7156, 0x3F4B }, { 0x7159, 0x114C }, { 0x7162, 0x3F49 }, 
-       { 0x7164, 0x2741 }, { 0x7165, 0x3F45 }, { 0x7166, 0x3F48 }, { 0x7167, 0x1E28 }, { 0x7169, 0x2831 }, { 0x716C, 0x3F4C }, 
-       { 0x716E, 0x1C31 }, { 0x717D, 0x205A }, { 0x7184, 0x3F4F }, { 0x7188, 0x3F47 }, { 0x718A, 0x1707 }, { 0x718F, 0x3F4D }, 
-       { 0x7194, 0x2D30 }, { 0x7195, 0x3F50 }, { 0x7199, 0x5406 }, { 0x719F, 0x1D2F }, { 0x71A8, 0x3F51 }, { 0x71AC, 0x3F52 }, 
-       { 0x71B1, 0x270E }, { 0x71B9, 0x3F54 }, { 0x71BE, 0x3F55 }, { 0x71C3, 0x2713 }, { 0x71C8, 0x2555 }, { 0x71C9, 0x3F57 }, 
-       { 0x71CE, 0x3F59 }, { 0x71D0, 0x2E35 }, { 0x71D2, 0x3F56 }, { 0x71D4, 0x3F58 }, { 0x71D5, 0x114D }, { 0x71D7, 0x3F53 }, 
-       { 0x71DF, 0x333B }, { 0x71E0, 0x3F5A }, { 0x71E5, 0x2147 }, { 0x71E6, 0x1B18 }, { 0x71E7, 0x3F5C }, { 0x71EC, 0x3F5B }, 
-       { 0x71ED, 0x1F04 }, { 0x71EE, 0x3239 }, { 0x71F5, 0x3F5D }, { 0x71F9, 0x4001 }, { 0x71FB, 0x3F4E }, { 0x71FC, 0x3F5E }, 
-       { 0x71FF, 0x4002 }, { 0x7206, 0x275A }, { 0x720D, 0x4003 }, { 0x7210, 0x4004 }, { 0x721B, 0x4005 }, { 0x7228, 0x4006 }, 
-       { 0x722A, 0x243E }, { 0x722C, 0x4008 }, { 0x722D, 0x4007 }, { 0x7230, 0x4009 }, { 0x7232, 0x400A }, { 0x7235, 0x1C3F }, 
-       { 0x7236, 0x2943 }, { 0x723A, 0x2C4C }, { 0x723B, 0x400B }, { 0x723C, 0x400C }, { 0x723D, 0x2136 }, { 0x723E, 0x1C04 }, 
-       { 0x723F, 0x400D }, { 0x7240, 0x400E }, { 0x7246, 0x400F }, { 0x7247, 0x2A32 }, { 0x7248, 0x2827 }, { 0x724B, 0x4010 }, 
-       { 0x724C, 0x2737 }, { 0x7252, 0x240D }, { 0x7258, 0x4011 }, { 0x7259, 0x1247 }, { 0x725B, 0x154D }, { 0x725D, 0x2C26 }, 
-       { 0x725F, 0x2C16 }, { 0x7261, 0x1214 }, { 0x7262, 0x2F14 }, { 0x7267, 0x2B32 }, { 0x7269, 0x2A0A }, { 0x7272, 0x2017 }, 
-       { 0x7274, 0x4012 }, { 0x7279, 0x2623 }, { 0x727D, 0x1803 }, { 0x727E, 0x4013 }, { 0x7280, 0x1A34 }, { 0x7281, 0x4015 }, 
-       { 0x7282, 0x4014 }, { 0x7287, 0x4016 }, { 0x7292, 0x4017 }, { 0x7296, 0x4018 }, { 0x72A0, 0x151E }, { 0x72A2, 0x4019 }, 
-       { 0x72A7, 0x401A }, { 0x72AC, 0x1804 }, { 0x72AF, 0x2828 }, { 0x72B2, 0x401C }, { 0x72B6, 0x1E55 }, { 0x72B9, 0x401B }, 
-       { 0x72C2, 0x1618 }, { 0x72C3, 0x401D }, { 0x72C4, 0x401F }, { 0x72C6, 0x401E }, { 0x72CE, 0x4020 }, { 0x72D0, 0x1831 }, 
-       { 0x72D2, 0x4021 }, { 0x72D7, 0x1649 }, { 0x72D9, 0x2120 }, { 0x72DB, 0x195D }, { 0x72E0, 0x4023 }, { 0x72E1, 0x4024 }, 
-       { 0x72E2, 0x4022 }, { 0x72E9, 0x1C4D }, { 0x72EC, 0x2628 }, { 0x72ED, 0x1619 }, { 0x72F7, 0x4026 }, { 0x72F8, 0x230C }, 
-       { 0x72F9, 0x4025 }, { 0x72FC, 0x2F15 }, { 0x72FD, 0x2742 }, { 0x730A, 0x4029 }, { 0x7316, 0x402B }, { 0x7317, 0x4028 }, 
-       { 0x731B, 0x2C34 }, { 0x731C, 0x402A }, { 0x731D, 0x402C }, { 0x731F, 0x2E24 }, { 0x7325, 0x4030 }, { 0x7329, 0x402F }, 
-       { 0x732A, 0x2356 }, { 0x732B, 0x270D }, { 0x732E, 0x1805 }, { 0x732F, 0x402E }, { 0x7334, 0x402D }, { 0x7336, 0x2D11 }, 
-       { 0x7337, 0x2D12 }, { 0x733E, 0x4031 }, { 0x733F, 0x114E }, { 0x7344, 0x1956 }, { 0x7345, 0x1B42 }, { 0x734E, 0x4032 }, 
-       { 0x734F, 0x4033 }, { 0x7357, 0x4035 }, { 0x7363, 0x1D23 }, { 0x7368, 0x4037 }, { 0x736A, 0x4036 }, { 0x7370, 0x4038 }, 
-       { 0x7372, 0x132D }, { 0x7375, 0x403A }, { 0x7378, 0x4039 }, { 0x737A, 0x403C }, { 0x737B, 0x403B }, { 0x7384, 0x181C }, 
-       { 0x7387, 0x2E08 }, { 0x7389, 0x162C }, { 0x738B, 0x1206 }, { 0x7396, 0x164A }, { 0x73A9, 0x1441 }, { 0x73B2, 0x2E48 }, 
-       { 0x73B3, 0x403E }, { 0x73BB, 0x4040 }, { 0x73C0, 0x4041 }, { 0x73C2, 0x1231 }, { 0x73C8, 0x403D }, { 0x73CA, 0x1B19 }, 
-       { 0x73CD, 0x2421 }, { 0x73CE, 0x403F }, { 0x73DE, 0x4044 }, { 0x73E0, 0x1C4E }, { 0x73E5, 0x4042 }, { 0x73EA, 0x171E }, 
-       { 0x73ED, 0x2829 }, { 0x73EE, 0x4043 }, { 0x73F1, 0x405E }, { 0x73F8, 0x4049 }, { 0x73FE, 0x181D }, { 0x7403, 0x1545 }, 
-       { 0x7405, 0x4046 }, { 0x7406, 0x2D5D }, { 0x7409, 0x2E10 }, { 0x7422, 0x2256 }, { 0x7425, 0x4048 }, { 0x7432, 0x404A }, 
-       { 0x7433, 0x2E36 }, { 0x7434, 0x1637 }, { 0x7435, 0x285C }, { 0x7436, 0x272A }, { 0x743A, 0x404B }, { 0x743F, 0x404D }, 
-       { 0x7441, 0x4050 }, { 0x7455, 0x404C }, { 0x7459, 0x404F }, { 0x745A, 0x184A }, { 0x745B, 0x112D }, { 0x745C, 0x4051 }, 
-       { 0x745E, 0x1F50 }, { 0x745F, 0x404E }, { 0x7460, 0x2E3C }, { 0x7463, 0x4054 }, { 0x7464, 0x5404 }, { 0x7469, 0x4052 }, 
-       { 0x746A, 0x4055 }, { 0x746F, 0x4047 }, { 0x7470, 0x4053 }, { 0x7473, 0x1A1C }, { 0x7476, 0x4056 }, { 0x747E, 0x4057 }, 
-       { 0x7483, 0x2D5E }, { 0x748B, 0x4058 }, { 0x749E, 0x4059 }, { 0x74A2, 0x4045 }, { 0x74A7, 0x405A }, { 0x74B0, 0x1424 }, 
-       { 0x74BD, 0x1C05 }, { 0x74CA, 0x405B }, { 0x74CF, 0x405C }, { 0x74D4, 0x405D }, { 0x74DC, 0x111B }, { 0x74E0, 0x4101 }, 
-       { 0x74E2, 0x291B }, { 0x74E3, 0x4102 }, { 0x74E6, 0x1404 }, { 0x74E7, 0x4103 }, { 0x74E9, 0x4104 }, { 0x74EE, 0x4105 }, 
-       { 0x74F0, 0x4107 }, { 0x74F1, 0x4108 }, { 0x74F2, 0x4106 }, { 0x74F6, 0x2933 }, { 0x74F7, 0x410A }, { 0x74F8, 0x4109 }, 
-       { 0x7503, 0x410C }, { 0x7504, 0x410B }, { 0x7505, 0x410D }, { 0x750C, 0x410E }, { 0x750D, 0x4110 }, { 0x750E, 0x410F }, 
-       { 0x7511, 0x1959 }, { 0x7513, 0x4112 }, { 0x7515, 0x4111 }, { 0x7518, 0x1425 }, { 0x751A, 0x1F33 }, { 0x751C, 0x251C }, 
-       { 0x751E, 0x4113 }, { 0x751F, 0x2018 }, { 0x7523, 0x1B1A }, { 0x7525, 0x1159 }, { 0x7526, 0x4114 }, { 0x7528, 0x2D31 }, 
-       { 0x752B, 0x2A43 }, { 0x752C, 0x4115 }, { 0x7530, 0x2524 }, { 0x7531, 0x2D13 }, { 0x7532, 0x1923 }, { 0x7533, 0x1F1D }, 
-       { 0x7537, 0x232B }, { 0x7538, 0x3214 }, { 0x753A, 0x240E }, { 0x753B, 0x1248 }, { 0x753C, 0x4116 }, { 0x7544, 0x4117 }, 
-       { 0x7546, 0x411C }, { 0x7549, 0x411A }, { 0x754A, 0x4119 }, { 0x754B, 0x3A22 }, { 0x754C, 0x1306 }, { 0x754D, 0x4118 }, 
-       { 0x754F, 0x103A }, { 0x7551, 0x280A }, { 0x7554, 0x282A }, { 0x7559, 0x2E11 }, { 0x755A, 0x411D }, { 0x755B, 0x411B }, 
-       { 0x755C, 0x233C }, { 0x755D, 0x2006 }, { 0x7560, 0x280B }, { 0x7562, 0x290D }, { 0x7564, 0x411F }, { 0x7565, 0x2E0C }, 
-       { 0x7566, 0x172D }, { 0x7567, 0x4120 }, { 0x7569, 0x411E }, { 0x756A, 0x2836 }, { 0x756B, 0x4121 }, { 0x756D, 0x4122 }, 
-       { 0x7570, 0x103B }, { 0x7573, 0x1E56 }, { 0x7574, 0x4127 }, { 0x7576, 0x4124 }, { 0x7577, 0x264D }, { 0x7578, 0x4123 }, 
-       { 0x757F, 0x1506 }, { 0x7582, 0x412A }, { 0x7586, 0x4125 }, { 0x7587, 0x4126 }, { 0x7589, 0x4129 }, { 0x758A, 0x4128 }, 
-       { 0x758B, 0x2905 }, { 0x758E, 0x2122 }, { 0x758F, 0x2121 }, { 0x7591, 0x151F }, { 0x7594, 0x412B }, { 0x759A, 0x412C }, 
-       { 0x759D, 0x412D }, { 0x75A3, 0x412F }, { 0x75A5, 0x412E }, { 0x75AB, 0x1136 }, { 0x75B1, 0x4137 }, { 0x75B2, 0x2848 }, 
-       { 0x75B3, 0x4131 }, { 0x75B5, 0x4133 }, { 0x75B8, 0x4135 }, { 0x75B9, 0x1F1E }, { 0x75BC, 0x4136 }, { 0x75BD, 0x4134 }, 
-       { 0x75BE, 0x1C20 }, { 0x75C2, 0x4130 }, { 0x75C3, 0x4132 }, { 0x75C5, 0x2922 }, { 0x75C7, 0x1E29 }, { 0x75CA, 0x4139 }, 
-       { 0x75CD, 0x4138 }, { 0x75D2, 0x413A }, { 0x75D4, 0x1C06 }, { 0x75D5, 0x1A0F }, { 0x75D8, 0x2557 }, { 0x75D9, 0x413B }, 
-       { 0x75DB, 0x242B }, { 0x75DE, 0x413D }, { 0x75E2, 0x2E01 }, { 0x75E3, 0x413C }, { 0x75E9, 0x2149 }, { 0x75F0, 0x4142 }, 
-       { 0x75F2, 0x4144 }, { 0x75F3, 0x4145 }, { 0x75F4, 0x2334 }, { 0x75FA, 0x4143 }, { 0x75FC, 0x4140 }, { 0x75FE, 0x413E }, 
-       { 0x75FF, 0x413F }, { 0x7601, 0x4141 }, { 0x7609, 0x4148 }, { 0x760B, 0x4146 }, { 0x760D, 0x4147 }, { 0x761F, 0x4149 }, 
-       { 0x7620, 0x414B }, { 0x7621, 0x414C }, { 0x7622, 0x414D }, { 0x7624, 0x414E }, { 0x7627, 0x414A }, { 0x7630, 0x4150 }, 
-       { 0x7634, 0x414F }, { 0x763B, 0x4151 }, { 0x7642, 0x2E25 }, { 0x7646, 0x4154 }, { 0x7647, 0x4152 }, { 0x7648, 0x4153 }, 
-       { 0x764C, 0x1442 }, { 0x7652, 0x2C5E }, { 0x7656, 0x2A2A }, { 0x7658, 0x4156 }, { 0x765C, 0x4155 }, { 0x7661, 0x4157 }, 
-       { 0x7662, 0x4158 }, { 0x7667, 0x415C }, { 0x7668, 0x4159 }, { 0x7669, 0x415A }, { 0x766A, 0x415B }, { 0x766C, 0x415D }, 
-       { 0x7670, 0x415E }, { 0x7672, 0x4201 }, { 0x7676, 0x4202 }, { 0x7678, 0x4203 }, { 0x767A, 0x280F }, { 0x767B, 0x2530 }, 
-       { 0x767C, 0x4204 }, { 0x767D, 0x2752 }, { 0x767E, 0x2914 }, { 0x7680, 0x4205 }, { 0x7683, 0x4206 }, { 0x7684, 0x250A }, 
-       { 0x7686, 0x1307 }, { 0x7687, 0x1924 }, { 0x7688, 0x4207 }, { 0x768B, 0x4208 }, { 0x768E, 0x4209 }, { 0x7690, 0x1B09 }, 
-       { 0x7693, 0x420B }, { 0x7696, 0x420A }, { 0x7699, 0x420C }, { 0x769A, 0x420D }, { 0x76AE, 0x2849 }, { 0x76B0, 0x420E }, 
-       { 0x76B4, 0x420F }, { 0x76B7, 0x5349 }, { 0x76B8, 0x4210 }, { 0x76B9, 0x4211 }, { 0x76BA, 0x4212 }, { 0x76BF, 0x1B0E }, 
-       { 0x76C2, 0x4213 }, { 0x76C3, 0x2736 }, { 0x76C6, 0x2B3F }, { 0x76C8, 0x112E }, { 0x76CA, 0x1137 }, { 0x76CD, 0x4214 }, 
-       { 0x76D2, 0x4216 }, { 0x76D6, 0x4215 }, { 0x76D7, 0x2550 }, { 0x76DB, 0x2019 }, { 0x76DC, 0x3D19 }, { 0x76DE, 0x4217 }, 
-       { 0x76DF, 0x2C21 }, { 0x76E1, 0x4218 }, { 0x76E3, 0x1426 }, { 0x76E4, 0x2837 }, { 0x76E5, 0x4219 }, { 0x76E7, 0x421A }, 
-       { 0x76EA, 0x421B }, { 0x76EE, 0x2C3C }, { 0x76F2, 0x2C35 }, { 0x76F4, 0x241E }, { 0x76F8, 0x214A }, { 0x76FB, 0x421D }, 
-       { 0x76FE, 0x1D42 }, { 0x7701, 0x1E2A }, { 0x7704, 0x4220 }, { 0x7707, 0x421F }, { 0x7708, 0x421E }, { 0x7709, 0x285D }, 
-       { 0x770B, 0x1427 }, { 0x770C, 0x1809 }, { 0x771B, 0x4226 }, { 0x771E, 0x4223 }, { 0x771F, 0x1F1F }, { 0x7720, 0x2C12 }, 
-       { 0x7724, 0x4222 }, { 0x7725, 0x4224 }, { 0x7726, 0x4225 }, { 0x7729, 0x4221 }, { 0x7737, 0x4227 }, { 0x7738, 0x4228 }, 
-       { 0x773A, 0x240F }, { 0x773C, 0x1443 }, { 0x7740, 0x2345 }, { 0x7747, 0x4229 }, { 0x775A, 0x422A }, { 0x775B, 0x422D }, 
-       { 0x7761, 0x1F47 }, { 0x7763, 0x2624 }, { 0x7765, 0x422E }, { 0x7766, 0x2B33 }, { 0x7768, 0x422B }, { 0x776B, 0x422C }, 
-       { 0x7779, 0x4231 }, { 0x777E, 0x4230 }, { 0x777F, 0x422F }, { 0x778B, 0x4233 }, { 0x778E, 0x4232 }, { 0x7791, 0x4234 }, 
-       { 0x779E, 0x4236 }, { 0x77A0, 0x4235 }, { 0x77A5, 0x2A2D }, { 0x77AC, 0x1D36 }, { 0x77AD, 0x2E26 }, { 0x77B0, 0x4237 }, 
-       { 0x77B3, 0x2617 }, { 0x77B6, 0x4238 }, { 0x77B9, 0x4239 }, { 0x77BB, 0x423D }, { 0x77BC, 0x423B }, { 0x77BD, 0x423C }, 
-       { 0x77BF, 0x423A }, { 0x77C7, 0x423E }, { 0x77CD, 0x423F }, { 0x77D7, 0x4240 }, { 0x77DA, 0x4241 }, { 0x77DB, 0x2C17 }, 
-       { 0x77DC, 0x4242 }, { 0x77E2, 0x2C50 }, { 0x77E3, 0x4243 }, { 0x77E5, 0x232E }, { 0x77E7, 0x274A }, { 0x77E9, 0x164B }, 
-       { 0x77ED, 0x231B }, { 0x77EE, 0x4244 }, { 0x77EF, 0x161A }, { 0x77F3, 0x2030 }, { 0x77FC, 0x4245 }, { 0x7802, 0x1A1D }, 
-       { 0x780C, 0x4246 }, { 0x7812, 0x4247 }, { 0x7814, 0x1806 }, { 0x7815, 0x1A35 }, { 0x7820, 0x4249 }, { 0x7825, 0x2536 }, 
-       { 0x7826, 0x1A36 }, { 0x7827, 0x152E }, { 0x7832, 0x2B04 }, { 0x7834, 0x272B }, { 0x783A, 0x2537 }, { 0x783F, 0x193C }, 
-       { 0x7845, 0x424B }, { 0x785D, 0x1E2B }, { 0x786B, 0x2E12 }, { 0x786C, 0x1925 }, { 0x786F, 0x1807 }, { 0x7872, 0x2803 }, 
-       { 0x7874, 0x424D }, { 0x787C, 0x424F }, { 0x7881, 0x184B }, { 0x7886, 0x424E }, { 0x7887, 0x2456 }, { 0x788C, 0x4251 }, 
-       { 0x788D, 0x1317 }, { 0x788E, 0x424C }, { 0x7891, 0x284A }, { 0x7893, 0x1110 }, { 0x7895, 0x1A4C }, { 0x7897, 0x2F32 }, 
-       { 0x789A, 0x4250 }, { 0x78A3, 0x4252 }, { 0x78A7, 0x2A2B }, { 0x78A9, 0x2039 }, { 0x78AA, 0x4254 }, { 0x78AF, 0x4255 }, 
-       { 0x78B5, 0x4253 }, { 0x78BA, 0x132E }, { 0x78BC, 0x425B }, { 0x78BE, 0x425A }, { 0x78C1, 0x1C07 }, { 0x78C5, 0x425C }, 
-       { 0x78C6, 0x4257 }, { 0x78CA, 0x425D }, { 0x78CB, 0x4258 }, { 0x78D0, 0x2838 }, { 0x78D1, 0x4256 }, { 0x78D4, 0x4259 }, 
-       { 0x78DA, 0x4302 }, { 0x78E7, 0x4301 }, { 0x78E8, 0x2B41 }, { 0x78EC, 0x425E }, { 0x78EF, 0x104B }, { 0x78F4, 0x4304 }, 
-       { 0x78FD, 0x4303 }, { 0x7901, 0x1E2C }, { 0x7907, 0x4305 }, { 0x790E, 0x2123 }, { 0x7911, 0x4307 }, { 0x7912, 0x4306 }, 
-       { 0x7919, 0x4308 }, { 0x7926, 0x4248 }, { 0x792A, 0x424A }, { 0x792B, 0x430A }, { 0x792C, 0x4309 }, { 0x793A, 0x1C08 }, 
-       { 0x793C, 0x2E49 }, { 0x793E, 0x1C32 }, { 0x7940, 0x430B }, { 0x7941, 0x1717 }, { 0x7947, 0x1520 }, { 0x7948, 0x1507 }, 
-       { 0x7949, 0x1B43 }, { 0x7950, 0x2D14 }, { 0x7953, 0x4311 }, { 0x7955, 0x4310 }, { 0x7956, 0x2124 }, { 0x7957, 0x430D }, 
-       { 0x795A, 0x430F }, { 0x795D, 0x1D2B }, { 0x795E, 0x1F20 }, { 0x795F, 0x430E }, { 0x7960, 0x430C }, { 0x7962, 0x270A }, 
-       { 0x7965, 0x1E2D }, { 0x7968, 0x291C }, { 0x796D, 0x1A37 }, { 0x7977, 0x2558 }, { 0x797A, 0x4312 }, { 0x797F, 0x4313 }, 
-       { 0x7980, 0x4329 }, { 0x7981, 0x1638 }, { 0x7984, 0x2F1D }, { 0x7985, 0x2115 }, { 0x798A, 0x4314 }, { 0x798D, 0x1232 }, 
-       { 0x798E, 0x2457 }, { 0x798F, 0x2A01 }, { 0x799D, 0x4315 }, { 0x79A6, 0x155A }, { 0x79A7, 0x4316 }, { 0x79AA, 0x4318 }, 
-       { 0x79AE, 0x4319 }, { 0x79B0, 0x2709 }, { 0x79B3, 0x431A }, { 0x79B9, 0x431B }, { 0x79BA, 0x431C }, { 0x79BD, 0x1639 }, 
-       { 0x79BE, 0x1233 }, { 0x79BF, 0x2625 }, { 0x79C0, 0x1D08 }, { 0x79C1, 0x1B44 }, { 0x79C9, 0x431D }, { 0x79CB, 0x1D09 }, 
-       { 0x79D1, 0x122A }, { 0x79D2, 0x2923 }, { 0x79D5, 0x431E }, { 0x79D8, 0x284B }, { 0x79DF, 0x2125 }, { 0x79E1, 0x4321 }, 
-       { 0x79E3, 0x4322 }, { 0x79E4, 0x2749 }, { 0x79E6, 0x1F21 }, { 0x79E7, 0x431F }, { 0x79E9, 0x2341 }, { 0x79EC, 0x4320 }, 
-       { 0x79F0, 0x1E2E }, { 0x79FB, 0x103C }, { 0x7A00, 0x1509 }, { 0x7A08, 0x4323 }, { 0x7A0B, 0x2458 }, { 0x7A0D, 0x4324 }, 
-       { 0x7A0E, 0x2027 }, { 0x7A14, 0x2C0D }, { 0x7A17, 0x2903 }, { 0x7A18, 0x4325 }, { 0x7A19, 0x4326 }, { 0x7A1A, 0x2335 }, 
-       { 0x7A1C, 0x2E27 }, { 0x7A1F, 0x4328 }, { 0x7A20, 0x4327 }, { 0x7A2E, 0x1C4F }, { 0x7A31, 0x432A }, { 0x7A32, 0x1050 }, 
-       { 0x7A37, 0x432D }, { 0x7A3B, 0x432B }, { 0x7A3C, 0x1234 }, { 0x7A3D, 0x172E }, { 0x7A3E, 0x432C }, { 0x7A3F, 0x1926 }, 
-       { 0x7A40, 0x1952 }, { 0x7A42, 0x2A46 }, { 0x7A43, 0x432E }, { 0x7A46, 0x2B34 }, { 0x7A49, 0x4330 }, { 0x7A4D, 0x2031 }, 
-       { 0x7A4E, 0x112F }, { 0x7A4F, 0x121A }, { 0x7A50, 0x100C }, { 0x7A57, 0x432F }, { 0x7A61, 0x4331 }, { 0x7A62, 0x4332 }, 
-       { 0x7A63, 0x1E57 }, { 0x7A69, 0x4333 }, { 0x7A6B, 0x132F }, { 0x7A70, 0x4335 }, { 0x7A74, 0x174A }, { 0x7A76, 0x1546 }, 
-       { 0x7A79, 0x4336 }, { 0x7A7A, 0x1655 }, { 0x7A7D, 0x4337 }, { 0x7A7F, 0x205C }, { 0x7A81, 0x262D }, { 0x7A83, 0x2040 }, 
-       { 0x7A84, 0x1A55 }, { 0x7A88, 0x4338 }, { 0x7A92, 0x2342 }, { 0x7A93, 0x214B }, { 0x7A95, 0x433A }, { 0x7A96, 0x433C }, 
-       { 0x7A97, 0x4339 }, { 0x7A98, 0x433B }, { 0x7A9F, 0x1702 }, { 0x7AA9, 0x433D }, { 0x7AAA, 0x1706 }, { 0x7AAE, 0x1547 }, 
-       { 0x7AAF, 0x2D32 }, { 0x7AB0, 0x433F }, { 0x7AB6, 0x4340 }, { 0x7ABA, 0x110E }, { 0x7ABF, 0x4343 }, { 0x7AC3, 0x1356 }, 
-       { 0x7AC4, 0x4342 }, { 0x7AC5, 0x4341 }, { 0x7AC7, 0x4345 }, { 0x7AC8, 0x433E }, { 0x7ACA, 0x4346 }, { 0x7ACB, 0x2E09 }, 
-       { 0x7ACD, 0x4347 }, { 0x7ACF, 0x4348 }, { 0x7AD2, 0x3454 }, { 0x7AD3, 0x434A }, { 0x7AD5, 0x4349 }, { 0x7AD9, 0x434B }, 
-       { 0x7ADA, 0x434C }, { 0x7ADC, 0x2E15 }, { 0x7ADD, 0x434D }, { 0x7ADF, 0x504F }, { 0x7AE0, 0x1E2F }, { 0x7AE1, 0x434E }, 
-       { 0x7AE2, 0x434F }, { 0x7AE3, 0x1D37 }, { 0x7AE5, 0x2618 }, { 0x7AE6, 0x4350 }, { 0x7AEA, 0x2308 }, { 0x7AED, 0x4351 }, 
-       { 0x7AEF, 0x231C }, { 0x7AF0, 0x4352 }, { 0x7AF6, 0x1605 }, { 0x7AF8, 0x311F }, { 0x7AF9, 0x233D }, { 0x7AFA, 0x1C13 }, 
-       { 0x7AFF, 0x1428 }, { 0x7B02, 0x4353 }, { 0x7B04, 0x4402 }, { 0x7B06, 0x4356 }, { 0x7B08, 0x1548 }, { 0x7B0A, 0x4355 }, 
-       { 0x7B0B, 0x4404 }, { 0x7B0F, 0x4354 }, { 0x7B11, 0x1E30 }, { 0x7B18, 0x4358 }, { 0x7B19, 0x4359 }, { 0x7B1B, 0x250B }, 
-       { 0x7B1E, 0x435A }, { 0x7B20, 0x133E }, { 0x7B25, 0x1F3A }, { 0x7B26, 0x2944 }, { 0x7B28, 0x435C }, { 0x7B2C, 0x2248 }, 
-       { 0x7B33, 0x4357 }, { 0x7B35, 0x435B }, { 0x7B36, 0x435D }, { 0x7B39, 0x1A5B }, { 0x7B45, 0x4406 }, { 0x7B46, 0x290E }, 
-       { 0x7B48, 0x2806 }, { 0x7B49, 0x2559 }, { 0x7B4B, 0x163A }, { 0x7B4C, 0x4405 }, { 0x7B4D, 0x4403 }, { 0x7B4F, 0x2815 }, 
-       { 0x7B50, 0x435E }, { 0x7B51, 0x233E }, { 0x7B52, 0x255B }, { 0x7B54, 0x255A }, { 0x7B56, 0x1A56 }, { 0x7B5D, 0x4418 }, 
-       { 0x7B65, 0x4408 }, { 0x7B67, 0x440A }, { 0x7B6C, 0x440D }, { 0x7B6E, 0x440E }, { 0x7B70, 0x440B }, { 0x7B71, 0x440C }, 
-       { 0x7B74, 0x4409 }, { 0x7B75, 0x4407 }, { 0x7B7A, 0x4401 }, { 0x7B86, 0x2A2F }, { 0x7B87, 0x1235 }, { 0x7B8B, 0x4415 }, 
-       { 0x7B8D, 0x4412 }, { 0x7B8F, 0x4417 }, { 0x7B92, 0x4416 }, { 0x7B94, 0x2753 }, { 0x7B95, 0x2C07 }, { 0x7B97, 0x1B1B }, 
-       { 0x7B98, 0x4410 }, { 0x7B99, 0x4419 }, { 0x7B9A, 0x4414 }, { 0x7B9C, 0x4413 }, { 0x7B9D, 0x440F }, { 0x7B9F, 0x4411 }, 
-       { 0x7BA1, 0x1429 }, { 0x7BAA, 0x231D }, { 0x7BAD, 0x205D }, { 0x7BB1, 0x2802 }, { 0x7BB4, 0x441E }, { 0x7BB8, 0x2804 }, 
-       { 0x7BC0, 0x2041 }, { 0x7BC1, 0x441B }, { 0x7BC4, 0x282F }, { 0x7BC6, 0x441F }, { 0x7BC7, 0x2A33 }, { 0x7BC9, 0x233B }, 
-       { 0x7BCB, 0x441A }, { 0x7BCC, 0x441C }, { 0x7BCF, 0x441D }, { 0x7BDD, 0x4420 }, { 0x7BE0, 0x1C24 }, { 0x7BE4, 0x2626 }, 
-       { 0x7BE5, 0x4425 }, { 0x7BE6, 0x4424 }, { 0x7BE9, 0x4421 }, { 0x7BED, 0x2F16 }, { 0x7BF3, 0x442A }, { 0x7BF6, 0x442E }, 
-       { 0x7BF7, 0x442B }, { 0x7C00, 0x4427 }, { 0x7C07, 0x4428 }, { 0x7C0D, 0x442D }, { 0x7C11, 0x4422 }, { 0x7C12, 0x3235 }, 
-       { 0x7C13, 0x4429 }, { 0x7C14, 0x4423 }, { 0x7C17, 0x442C }, { 0x7C1F, 0x4432 }, { 0x7C21, 0x142A }, { 0x7C23, 0x442F }, 
-       { 0x7C27, 0x4430 }, { 0x7C2A, 0x4431 }, { 0x7C2B, 0x4434 }, { 0x7C37, 0x4433 }, { 0x7C38, 0x2856 }, { 0x7C3D, 0x4435 }, 
-       { 0x7C3E, 0x2E5C }, { 0x7C3F, 0x2A4D }, { 0x7C40, 0x443A }, { 0x7C43, 0x4437 }, { 0x7C4C, 0x4436 }, { 0x7C4D, 0x2032 }, 
-       { 0x7C4F, 0x4439 }, { 0x7C50, 0x443B }, { 0x7C54, 0x4438 }, { 0x7C56, 0x443F }, { 0x7C58, 0x443C }, { 0x7C5F, 0x443D }, 
-       { 0x7C60, 0x4426 }, { 0x7C64, 0x443E }, { 0x7C65, 0x4440 }, { 0x7C6C, 0x4441 }, { 0x7C73, 0x2A26 }, { 0x7C75, 0x4442 }, 
-       { 0x7C7E, 0x2C42 }, { 0x7C81, 0x162E }, { 0x7C82, 0x1709 }, { 0x7C83, 0x4443 }, { 0x7C89, 0x2A14 }, { 0x7C8B, 0x1F48 }, 
-       { 0x7C8D, 0x2C10 }, { 0x7C90, 0x4444 }, { 0x7C92, 0x2E13 }, { 0x7C95, 0x2754 }, { 0x7C97, 0x2126 }, { 0x7C98, 0x2714 }, 
-       { 0x7C9B, 0x1D2D }, { 0x7C9F, 0x1020 }, { 0x7CA1, 0x4449 }, { 0x7CA2, 0x4447 }, { 0x7CA4, 0x4445 }, { 0x7CA5, 0x1401 }, 
-       { 0x7CA7, 0x1E31 }, { 0x7CA8, 0x444A }, { 0x7CAB, 0x4448 }, { 0x7CAD, 0x4446 }, { 0x7CAE, 0x444E }, { 0x7CB1, 0x444D }, 
-       { 0x7CB2, 0x444C }, { 0x7CB3, 0x444B }, { 0x7CB9, 0x444F }, { 0x7CBD, 0x4450 }, { 0x7CBE, 0x201A }, { 0x7CC0, 0x4451 }, 
-       { 0x7CC2, 0x4453 }, { 0x7CC5, 0x4452 }, { 0x7CCA, 0x1832 }, { 0x7CCE, 0x2118 }, { 0x7CD2, 0x4455 }, { 0x7CD6, 0x255C }, 
-       { 0x7CD8, 0x4454 }, { 0x7CDC, 0x4456 }, { 0x7CDE, 0x2A15 }, { 0x7CDF, 0x214C }, { 0x7CE0, 0x1927 }, { 0x7CE2, 0x4457 }, 
-       { 0x7CE7, 0x2E28 }, { 0x7CEF, 0x4459 }, { 0x7CF2, 0x445A }, { 0x7CF4, 0x445B }, { 0x7CF6, 0x445C }, { 0x7CF8, 0x1B45 }, 
-       { 0x7CFA, 0x445D }, { 0x7CFB, 0x172F }, { 0x7CFE, 0x154A }, { 0x7D00, 0x150A }, { 0x7D02, 0x4501 }, { 0x7D04, 0x2C53 }, 
-       { 0x7D05, 0x1928 }, { 0x7D06, 0x445E }, { 0x7D0A, 0x4504 }, { 0x7D0B, 0x2C46 }, { 0x7D0D, 0x271C }, { 0x7D10, 0x2913 }, 
-       { 0x7D14, 0x1D43 }, { 0x7D15, 0x4503 }, { 0x7D17, 0x1C33 }, { 0x7D18, 0x1929 }, { 0x7D19, 0x1B46 }, { 0x7D1A, 0x1549 }, 
-       { 0x7D1B, 0x2A16 }, { 0x7D1C, 0x4502 }, { 0x7D20, 0x2127 }, { 0x7D21, 0x2B22 }, { 0x7D22, 0x1A57 }, { 0x7D2B, 0x1B47 }, 
-       { 0x7D2C, 0x243D }, { 0x7D2E, 0x4507 }, { 0x7D2F, 0x2E3F }, { 0x7D30, 0x1A39 }, { 0x7D32, 0x4508 }, { 0x7D33, 0x1F22 }, 
-       { 0x7D35, 0x450A }, { 0x7D39, 0x1E32 }, { 0x7D3A, 0x1A10 }, { 0x7D3F, 0x4509 }, { 0x7D42, 0x1D0A }, { 0x7D43, 0x181E }, 
-       { 0x7D44, 0x2128 }, { 0x7D45, 0x4505 }, { 0x7D46, 0x450B }, { 0x7D4B, 0x4506 }, { 0x7D4C, 0x1730 }, { 0x7D4E, 0x450E }, 
-       { 0x7D4F, 0x4512 }, { 0x7D50, 0x174B }, { 0x7D56, 0x450D }, { 0x7D5B, 0x4516 }, { 0x7D5E, 0x192A }, { 0x7D61, 0x2D4D }, 
-       { 0x7D62, 0x101C }, { 0x7D63, 0x4513 }, { 0x7D66, 0x154B }, { 0x7D68, 0x4510 }, { 0x7D6E, 0x4511 }, { 0x7D71, 0x255D }, 
-       { 0x7D72, 0x450F }, { 0x7D73, 0x450C }, { 0x7D75, 0x1308 }, { 0x7D76, 0x2044 }, { 0x7D79, 0x1808 }, { 0x7D7D, 0x4518 }, 
-       { 0x7D89, 0x4515 }, { 0x7D8F, 0x4517 }, { 0x7D93, 0x4514 }, { 0x7D99, 0x1731 }, { 0x7D9A, 0x2213 }, { 0x7D9B, 0x4519 }, 
-       { 0x7D9C, 0x214E }, { 0x7D9F, 0x4526 }, { 0x7DA2, 0x4522 }, { 0x7DA3, 0x451C }, { 0x7DAB, 0x4520 }, { 0x7DAC, 0x1C5A }, 
-       { 0x7DAD, 0x103D }, { 0x7DAE, 0x451B }, { 0x7DAF, 0x4523 }, { 0x7DB0, 0x4527 }, { 0x7DB1, 0x192B }, { 0x7DB2, 0x2C36 }, 
-       { 0x7DB4, 0x2436 }, { 0x7DB5, 0x451D }, { 0x7DB8, 0x4525 }, { 0x7DBA, 0x451A }, { 0x7DBB, 0x231E }, { 0x7DBD, 0x451F }, 
-       { 0x7DBE, 0x101D }, { 0x7DBF, 0x2C2A }, { 0x7DC7, 0x451E }, { 0x7DCA, 0x163B }, { 0x7DCB, 0x284C }, { 0x7DCF, 0x214D }, 
-       { 0x7DD1, 0x2E30 }, { 0x7DD2, 0x1D4F }, { 0x7DD5, 0x454E }, { 0x7DD8, 0x4528 }, { 0x7DDA, 0x205E }, { 0x7DDC, 0x4524 }, 
-       { 0x7DDD, 0x4529 }, { 0x7DDE, 0x452B }, { 0x7DE0, 0x2459 }, { 0x7DE1, 0x452E }, { 0x7DE4, 0x452A }, { 0x7DE8, 0x2A34 }, 
-       { 0x7DE9, 0x142B }, { 0x7DEC, 0x2C2B }, { 0x7DEF, 0x103E }, { 0x7DF2, 0x452D }, { 0x7DF4, 0x2E5D }, { 0x7DFB, 0x452C }, 
-       { 0x7E01, 0x114F }, { 0x7E04, 0x264C }, { 0x7E05, 0x452F }, { 0x7E09, 0x4536 }, { 0x7E0A, 0x4530 }, { 0x7E0B, 0x4537 }, 
-       { 0x7E12, 0x4533 }, { 0x7E1B, 0x275B }, { 0x7E1E, 0x1C2A }, { 0x7E1F, 0x4535 }, { 0x7E21, 0x4532 }, { 0x7E22, 0x4538 }, 
-       { 0x7E23, 0x4531 }, { 0x7E26, 0x1D24 }, { 0x7E2B, 0x2B05 }, { 0x7E2E, 0x1D2C }, { 0x7E31, 0x4534 }, { 0x7E32, 0x4540 }, 
-       { 0x7E35, 0x453C }, { 0x7E37, 0x453F }, { 0x7E39, 0x453D }, { 0x7E3A, 0x4541 }, { 0x7E3B, 0x453B }, { 0x7E3D, 0x4521 }, 
-       { 0x7E3E, 0x2033 }, { 0x7E41, 0x282B }, { 0x7E43, 0x453E }, { 0x7E46, 0x4539 }, { 0x7E4A, 0x2101 }, { 0x7E4B, 0x1732 }, 
-       { 0x7E4D, 0x1D0B }, { 0x7E54, 0x1F05 }, { 0x7E55, 0x2116 }, { 0x7E56, 0x4544 }, { 0x7E59, 0x4546 }, { 0x7E5A, 0x4547 }, 
-       { 0x7E5D, 0x4543 }, { 0x7E5E, 0x4545 }, { 0x7E66, 0x453A }, { 0x7E67, 0x4542 }, { 0x7E69, 0x454A }, { 0x7E6A, 0x4549 }, 
-       { 0x7E6D, 0x2B5A }, { 0x7E70, 0x170B }, { 0x7E79, 0x4548 }, { 0x7E7B, 0x454C }, { 0x7E7C, 0x454B }, { 0x7E7D, 0x454F }, 
-       { 0x7E7F, 0x4551 }, { 0x7E82, 0x1B1C }, { 0x7E83, 0x454D }, { 0x7E88, 0x4552 }, { 0x7E89, 0x4553 }, { 0x7E8C, 0x4554 }, 
-       { 0x7E8E, 0x455A }, { 0x7E8F, 0x251B }, { 0x7E90, 0x4556 }, { 0x7E92, 0x4555 }, { 0x7E93, 0x4557 }, { 0x7E94, 0x4558 }, 
-       { 0x7E96, 0x4559 }, { 0x7E9B, 0x455B }, { 0x7E9C, 0x455C }, { 0x7F36, 0x142C }, { 0x7F38, 0x455D }, { 0x7F3A, 0x455E }, 
-       { 0x7F45, 0x4601 }, { 0x7F4C, 0x4602 }, { 0x7F4D, 0x4603 }, { 0x7F4E, 0x4604 }, { 0x7F50, 0x4605 }, { 0x7F51, 0x4606 }, 
-       { 0x7F54, 0x4608 }, { 0x7F55, 0x4607 }, { 0x7F58, 0x4609 }, { 0x7F5F, 0x460A }, { 0x7F60, 0x460B }, { 0x7F67, 0x460E }, 
-       { 0x7F68, 0x460C }, { 0x7F69, 0x460D }, { 0x7F6A, 0x1A41 }, { 0x7F6B, 0x1733 }, { 0x7F6E, 0x2336 }, { 0x7F70, 0x2813 }, 
-       { 0x7F72, 0x1D50 }, { 0x7F75, 0x272D }, { 0x7F77, 0x284D }, { 0x7F78, 0x460F }, { 0x7F79, 0x384D }, { 0x7F82, 0x4610 }, 
-       { 0x7F83, 0x4612 }, { 0x7F85, 0x2D45 }, { 0x7F86, 0x4611 }, { 0x7F87, 0x4614 }, { 0x7F88, 0x4613 }, { 0x7F8A, 0x2D33 }, 
-       { 0x7F8C, 0x4615 }, { 0x7F8E, 0x285E }, { 0x7F94, 0x4616 }, { 0x7F9A, 0x4619 }, { 0x7F9D, 0x4618 }, { 0x7F9E, 0x4617 }, 
-       { 0x7FA3, 0x461A }, { 0x7FA4, 0x1712 }, { 0x7FA8, 0x2102 }, { 0x7FA9, 0x1521 }, { 0x7FAE, 0x461E }, { 0x7FAF, 0x461B }, 
-       { 0x7FB2, 0x461C }, { 0x7FB6, 0x461F }, { 0x7FB8, 0x4620 }, { 0x7FB9, 0x461D }, { 0x7FBD, 0x1109 }, { 0x7FC1, 0x1207 }, 
-       { 0x7FC5, 0x4622 }, { 0x7FC6, 0x4623 }, { 0x7FCA, 0x4624 }, { 0x7FCC, 0x2D42 }, { 0x7FD2, 0x1D0C }, { 0x7FD4, 0x4626 }, 
-       { 0x7FD5, 0x4625 }, { 0x7FE0, 0x1F49 }, { 0x7FE1, 0x4627 }, { 0x7FE6, 0x4628 }, { 0x7FE9, 0x4629 }, { 0x7FEB, 0x1445 }, 
-       { 0x7FF0, 0x142D }, { 0x7FF3, 0x462A }, { 0x7FF9, 0x462B }, { 0x7FFB, 0x2B3D }, { 0x7FFC, 0x2D43 }, { 0x8000, 0x2D34 }, 
-       { 0x8001, 0x2F17 }, { 0x8003, 0x192D }, { 0x8004, 0x462E }, { 0x8005, 0x1C34 }, { 0x8006, 0x462D }, { 0x800B, 0x462F }, 
-       { 0x800C, 0x1C09 }, { 0x8010, 0x2231 }, { 0x8012, 0x4630 }, { 0x8015, 0x192C }, { 0x8017, 0x2C37 }, { 0x8018, 0x4631 }, 
-       { 0x8019, 0x4632 }, { 0x801C, 0x4633 }, { 0x8021, 0x4634 }, { 0x8028, 0x4635 }, { 0x8033, 0x1C0A }, { 0x8036, 0x2C4D }, 
-       { 0x803B, 0x4637 }, { 0x803D, 0x231F }, { 0x803F, 0x4636 }, { 0x8046, 0x4639 }, { 0x804A, 0x4638 }, { 0x8052, 0x463A }, 
-       { 0x8056, 0x201B }, { 0x8058, 0x463B }, { 0x805A, 0x463C }, { 0x805E, 0x2A19 }, { 0x805F, 0x463D }, { 0x8061, 0x214F }, 
-       { 0x8062, 0x463E }, { 0x8068, 0x463F }, { 0x806F, 0x2E5E }, { 0x8070, 0x4642 }, { 0x8072, 0x4641 }, { 0x8073, 0x4640 }, 
-       { 0x8074, 0x2410 }, { 0x8076, 0x4643 }, { 0x8077, 0x1F06 }, { 0x8079, 0x4644 }, { 0x807D, 0x4645 }, { 0x807E, 0x2F18 }, 
-       { 0x807F, 0x4646 }, { 0x8084, 0x4647 }, { 0x8085, 0x4649 }, { 0x8086, 0x4648 }, { 0x8087, 0x2805 }, { 0x8089, 0x2659 }, 
-       { 0x808B, 0x2F1E }, { 0x808C, 0x2809 }, { 0x8093, 0x464B }, { 0x8096, 0x1E33 }, { 0x8098, 0x290A }, { 0x809A, 0x464C }, 
-       { 0x809B, 0x464A }, { 0x809D, 0x142E }, { 0x80A1, 0x1834 }, { 0x80A2, 0x1B48 }, { 0x80A5, 0x284E }, { 0x80A9, 0x180A }, 
-       { 0x80AA, 0x2B23 }, { 0x80AC, 0x464F }, { 0x80AD, 0x464D }, { 0x80AF, 0x192E }, { 0x80B1, 0x192F }, { 0x80B2, 0x1049 }, 
-       { 0x80B4, 0x1A48 }, { 0x80BA, 0x2739 }, { 0x80C3, 0x103F }, { 0x80C4, 0x4654 }, { 0x80C6, 0x2320 }, { 0x80CC, 0x2738 }, 
-       { 0x80CE, 0x223B }, { 0x80D6, 0x4656 }, { 0x80D9, 0x4652 }, { 0x80DA, 0x4655 }, { 0x80DB, 0x4650 }, { 0x80DD, 0x4653 }, 
-       { 0x80DE, 0x2B06 }, { 0x80E1, 0x1835 }, { 0x80E4, 0x105D }, { 0x80E5, 0x4651 }, { 0x80EF, 0x4658 }, { 0x80F1, 0x4659 }, 
-       { 0x80F4, 0x2619 }, { 0x80F8, 0x161B }, { 0x80FC, 0x4706 }, { 0x80FD, 0x271D }, { 0x8102, 0x1B49 }, { 0x8105, 0x161C }, 
-       { 0x8106, 0x2028 }, { 0x8107, 0x2F26 }, { 0x8108, 0x2C0E }, { 0x8109, 0x4657 }, { 0x810A, 0x2034 }, { 0x811A, 0x1533 }, 
-       { 0x811B, 0x465A }, { 0x8123, 0x465C }, { 0x8129, 0x465B }, { 0x812F, 0x465D }, { 0x8131, 0x2306 }, { 0x8133, 0x271E }, 
-       { 0x8139, 0x2411 }, { 0x813E, 0x4703 }, { 0x8146, 0x4702 }, { 0x814B, 0x465E }, { 0x814E, 0x1F35 }, { 0x8150, 0x2945 }, 
-       { 0x8151, 0x4705 }, { 0x8153, 0x4704 }, { 0x8154, 0x1930 }, { 0x8155, 0x2F33 }, { 0x815F, 0x4715 }, { 0x8165, 0x4709 }, 
-       { 0x8166, 0x470A }, { 0x816B, 0x1C50 }, { 0x816E, 0x4708 }, { 0x8170, 0x1958 }, { 0x8171, 0x4707 }, { 0x8174, 0x470B }, 
-       { 0x8178, 0x2412 }, { 0x8179, 0x2A02 }, { 0x817A, 0x2103 }, { 0x817F, 0x223C }, { 0x8180, 0x470F }, { 0x8182, 0x4710 }, 
-       { 0x8183, 0x470C }, { 0x8188, 0x470D }, { 0x818A, 0x470E }, { 0x818F, 0x1931 }, { 0x8193, 0x4716 }, { 0x8195, 0x4712 }, 
-       { 0x819A, 0x2946 }, { 0x819C, 0x2B4C }, { 0x819D, 0x2908 }, { 0x81A0, 0x4711 }, { 0x81A3, 0x4714 }, { 0x81A4, 0x4713 }, 
-       { 0x81A8, 0x2B24 }, { 0x81A9, 0x4717 }, { 0x81B0, 0x4718 }, { 0x81B3, 0x2117 }, { 0x81B5, 0x4719 }, { 0x81B8, 0x471B }, 
-       { 0x81BA, 0x471F }, { 0x81BD, 0x471C }, { 0x81BE, 0x471A }, { 0x81BF, 0x271F }, { 0x81C0, 0x471D }, { 0x81C2, 0x471E }, 
-       { 0x81C6, 0x1212 }, { 0x81C8, 0x4725 }, { 0x81C9, 0x4720 }, { 0x81CD, 0x4721 }, { 0x81D1, 0x4722 }, { 0x81D3, 0x2201 }, 
-       { 0x81D8, 0x4724 }, { 0x81D9, 0x4723 }, { 0x81DA, 0x4726 }, { 0x81DF, 0x4727 }, { 0x81E0, 0x4728 }, { 0x81E3, 0x1F23 }, 
-       { 0x81E5, 0x1249 }, { 0x81E7, 0x4729 }, { 0x81E8, 0x2E37 }, { 0x81EA, 0x1C0B }, { 0x81ED, 0x1D0D }, { 0x81F3, 0x1B4A }, 
-       { 0x81F4, 0x2337 }, { 0x81FA, 0x472A }, { 0x81FB, 0x472B }, { 0x81FC, 0x1111 }, { 0x81FE, 0x472C }, { 0x8201, 0x472D }, 
-       { 0x8202, 0x472E }, { 0x8205, 0x472F }, { 0x8207, 0x4730 }, { 0x8208, 0x161D }, { 0x8209, 0x3A0A }, { 0x820A, 0x4731 }, 
-       { 0x820C, 0x2045 }, { 0x820D, 0x4732 }, { 0x820E, 0x1C2B }, { 0x8210, 0x4733 }, { 0x8212, 0x3010 }, { 0x8216, 0x4734 }, 
-       { 0x8217, 0x2A3E }, { 0x8218, 0x143C }, { 0x821B, 0x2104 }, { 0x821C, 0x1D38 }, { 0x821E, 0x2951 }, { 0x821F, 0x1D0E }, 
-       { 0x8229, 0x4735 }, { 0x822A, 0x1932 }, { 0x822B, 0x4736 }, { 0x822C, 0x282C }, { 0x822E, 0x4744 }, { 0x8233, 0x4738 }, 
-       { 0x8235, 0x2229 }, { 0x8236, 0x2755 }, { 0x8237, 0x181F }, { 0x8238, 0x4737 }, { 0x8239, 0x2105 }, { 0x8240, 0x4739 }, 
-       { 0x8247, 0x245A }, { 0x8258, 0x473B }, { 0x8259, 0x473A }, { 0x825A, 0x473D }, { 0x825D, 0x473C }, { 0x825F, 0x473E }, 
-       { 0x8262, 0x4740 }, { 0x8264, 0x473F }, { 0x8266, 0x142F }, { 0x8268, 0x4741 }, { 0x826A, 0x4742 }, { 0x826B, 0x4743 }, 
-       { 0x826E, 0x1A11 }, { 0x826F, 0x2E29 }, { 0x8271, 0x4745 }, { 0x8272, 0x1F07 }, { 0x8276, 0x1150 }, { 0x8277, 0x4746 }, 
-       { 0x8278, 0x4747 }, { 0x827E, 0x4748 }, { 0x828B, 0x1052 }, { 0x828D, 0x4749 }, { 0x8292, 0x474A }, { 0x8299, 0x2947 }, 
-       { 0x829D, 0x1C27 }, { 0x829F, 0x474C }, { 0x82A5, 0x1309 }, { 0x82A6, 0x1012 }, { 0x82AB, 0x474B }, { 0x82AC, 0x474E }, 
-       { 0x82AD, 0x272E }, { 0x82AF, 0x1F24 }, { 0x82B1, 0x1236 }, { 0x82B3, 0x2B07 }, { 0x82B8, 0x173D }, { 0x82B9, 0x163C }, 
-       { 0x82BB, 0x474D }, { 0x82BD, 0x124A }, { 0x82C5, 0x1403 }, { 0x82D1, 0x1151 }, { 0x82D2, 0x4752 }, { 0x82D3, 0x2E4A }, 
-       { 0x82D4, 0x223D }, { 0x82D7, 0x2924 }, { 0x82D9, 0x475E }, { 0x82DB, 0x1237 }, { 0x82DC, 0x475C }, { 0x82DE, 0x475A }, 
-       { 0x82DF, 0x4751 }, { 0x82E1, 0x474F }, { 0x82E3, 0x4750 }, { 0x82E5, 0x1C43 }, { 0x82E6, 0x164C }, { 0x82E7, 0x2357 }, 
-       { 0x82EB, 0x2631 }, { 0x82F1, 0x1131 }, { 0x82F3, 0x4754 }, { 0x82F4, 0x4753 }, { 0x82F9, 0x4759 }, { 0x82FA, 0x4755 }, 
-       { 0x82FB, 0x4758 }, { 0x8302, 0x2C30 }, { 0x8303, 0x4757 }, { 0x8304, 0x1238 }, { 0x8305, 0x135D }, { 0x8306, 0x475B }, 
-       { 0x8309, 0x475D }, { 0x830E, 0x1734 }, { 0x8316, 0x4803 }, { 0x8317, 0x480C }, { 0x8318, 0x480D }, { 0x831C, 0x100B }, 
-       { 0x8323, 0x4814 }, { 0x8328, 0x1051 }, { 0x832B, 0x480B }, { 0x832F, 0x480A }, { 0x8331, 0x4805 }, { 0x8332, 0x4804 }, 
-       { 0x8334, 0x4802 }, { 0x8335, 0x4801 }, { 0x8336, 0x2343 }, { 0x8338, 0x225B }, { 0x8339, 0x4807 }, { 0x8340, 0x4806 }, 
-       { 0x8345, 0x4809 }, { 0x8349, 0x2150 }, { 0x834A, 0x1735 }, { 0x834F, 0x1121 }, { 0x8350, 0x4808 }, { 0x8352, 0x1933 }, 
-       { 0x8358, 0x2151 }, { 0x8373, 0x481A }, { 0x8375, 0x481B }, { 0x8377, 0x1239 }, { 0x837B, 0x120E }, { 0x837C, 0x4818 }, 
-       { 0x8385, 0x480E }, { 0x8387, 0x4816 }, { 0x8389, 0x481D }, { 0x838A, 0x4817 }, { 0x838E, 0x4815 }, { 0x8393, 0x4756 }, 
-       { 0x8396, 0x4813 }, { 0x839A, 0x480F }, { 0x839E, 0x1430 }, { 0x839F, 0x4811 }, { 0x83A0, 0x481C }, { 0x83A2, 0x4812 }, 
-       { 0x83A8, 0x481E }, { 0x83AA, 0x4810 }, { 0x83AB, 0x275C }, { 0x83B1, 0x2D49 }, { 0x83B5, 0x4819 }, { 0x83BD, 0x482F }, 
-       { 0x83C1, 0x4827 }, { 0x83C5, 0x1F5B }, { 0x83CA, 0x1526 }, { 0x83CC, 0x163D }, { 0x83CE, 0x4822 }, { 0x83D3, 0x123B }, 
-       { 0x83D6, 0x1E34 }, { 0x83D8, 0x4825 }, { 0x83DC, 0x1A3A }, { 0x83DF, 0x2531 }, { 0x83E0, 0x482A }, { 0x83E9, 0x2A4E }, 
-       { 0x83EB, 0x4821 }, { 0x83EF, 0x123A }, { 0x83F0, 0x1836 }, { 0x83F1, 0x2909 }, { 0x83F2, 0x482B }, { 0x83F4, 0x481F }, 
-       { 0x83F7, 0x4828 }, { 0x83FB, 0x4832 }, { 0x83FD, 0x4823 }, { 0x8403, 0x4824 }, { 0x8404, 0x261A }, { 0x8407, 0x4829 }, 
-       { 0x840B, 0x4826 }, { 0x840C, 0x2B08 }, { 0x840D, 0x482C }, { 0x840E, 0x1040 }, { 0x8413, 0x4820 }, { 0x8420, 0x482E }, 
-       { 0x8422, 0x482D }, { 0x8429, 0x274B }, { 0x842A, 0x4834 }, { 0x842C, 0x483F }, { 0x8431, 0x135E }, { 0x8435, 0x4842 }, 
-       { 0x8438, 0x4830 }, { 0x843C, 0x4835 }, { 0x843D, 0x2D4E }, { 0x8446, 0x483E }, { 0x8449, 0x2D35 }, { 0x844E, 0x2E0A }, 
-       { 0x8457, 0x2358 }, { 0x845B, 0x134B }, { 0x8461, 0x2952 }, { 0x8462, 0x4844 }, { 0x8463, 0x2601 }, { 0x8466, 0x1011 }, 
-       { 0x8469, 0x483D }, { 0x846B, 0x4839 }, { 0x846C, 0x2152 }, { 0x846D, 0x4833 }, { 0x846E, 0x483B }, { 0x846F, 0x4840 }, 
-       { 0x8471, 0x270C }, { 0x8475, 0x100A }, { 0x8477, 0x4838 }, { 0x8479, 0x4841 }, { 0x847A, 0x2958 }, { 0x8482, 0x483C }, 
-       { 0x8484, 0x4837 }, { 0x848B, 0x1E35 }, { 0x8490, 0x1D0F }, { 0x8494, 0x1C0C }, { 0x8499, 0x2C38 }, { 0x849C, 0x2927 }, 
-       { 0x849F, 0x4847 }, { 0x84A1, 0x4850 }, { 0x84AD, 0x483A }, { 0x84B2, 0x1357 }, { 0x84B8, 0x1E58 }, { 0x84B9, 0x4845 }, 
-       { 0x84BB, 0x484A }, { 0x84BC, 0x2153 }, { 0x84BF, 0x4846 }, { 0x84C1, 0x484D }, { 0x84C4, 0x233F }, { 0x84C6, 0x484E }, 
-       { 0x84C9, 0x2D36 }, { 0x84CA, 0x4843 }, { 0x84CB, 0x1318 }, { 0x84CD, 0x4849 }, { 0x84D0, 0x484C }, { 0x84D1, 0x2C0C }, 
-       { 0x84D6, 0x484F }, { 0x84D9, 0x4848 }, { 0x84DA, 0x484B }, { 0x84EC, 0x2B09 }, { 0x84EE, 0x2F01 }, { 0x84F4, 0x4853 }, 
-       { 0x84FC, 0x485A }, { 0x84FF, 0x4852 }, { 0x8500, 0x1C23 }, { 0x8506, 0x4831 }, { 0x8511, 0x2A2E }, { 0x8513, 0x2C02 }, 
-       { 0x8514, 0x4859 }, { 0x8515, 0x4858 }, { 0x8517, 0x4854 }, { 0x8518, 0x4855 }, { 0x851A, 0x1116 }, { 0x851F, 0x4857 }, 
-       { 0x8521, 0x4851 }, { 0x8526, 0x2435 }, { 0x852C, 0x4856 }, { 0x852D, 0x105E }, { 0x8535, 0x2202 }, { 0x853D, 0x2A23 }, 
-       { 0x8540, 0x485B }, { 0x8541, 0x4901 }, { 0x8543, 0x2839 }, { 0x8548, 0x485E }, { 0x8549, 0x1E36 }, { 0x854A, 0x1C29 }, 
-       { 0x854B, 0x4903 }, { 0x854E, 0x161E }, { 0x8555, 0x4904 }, { 0x8557, 0x2959 }, { 0x8558, 0x485D }, { 0x855A, 0x4836 }, 
-       { 0x8563, 0x485C }, { 0x8568, 0x2F2F }, { 0x8569, 0x2602 }, { 0x856A, 0x2953 }, { 0x856D, 0x490B }, { 0x8577, 0x4911 }, 
-       { 0x857E, 0x4912 }, { 0x8580, 0x4905 }, { 0x8584, 0x2756 }, { 0x8587, 0x490F }, { 0x8588, 0x4907 }, { 0x858A, 0x4909 }, 
-       { 0x8590, 0x4913 }, { 0x8591, 0x4908 }, { 0x8594, 0x490C }, { 0x8597, 0x1152 }, { 0x8599, 0x2645 }, { 0x859B, 0x490D }, 
-       { 0x859C, 0x4910 }, { 0x85A4, 0x4906 }, { 0x85A6, 0x2106 }, { 0x85A8, 0x490A }, { 0x85A9, 0x1B07 }, { 0x85AA, 0x1F25 }, 
-       { 0x85AB, 0x1710 }, { 0x85AC, 0x2C54 }, { 0x85AE, 0x2C59 }, { 0x85AF, 0x1D52 }, { 0x85B9, 0x4917 }, { 0x85BA, 0x4915 }, 
-       { 0x85C1, 0x2F2E }, { 0x85C9, 0x4914 }, { 0x85CD, 0x2D55 }, { 0x85CF, 0x4916 }, { 0x85D0, 0x4918 }, { 0x85D5, 0x4919 }, 
-       { 0x85DC, 0x491C }, { 0x85DD, 0x491A }, { 0x85E4, 0x2603 }, { 0x85E5, 0x491B }, { 0x85E9, 0x282D }, { 0x85EA, 0x490E }, 
-       { 0x85F7, 0x1D53 }, { 0x85F9, 0x491D }, { 0x85FA, 0x4922 }, { 0x85FB, 0x2154 }, { 0x85FE, 0x4921 }, { 0x8602, 0x4902 }, 
-       { 0x8606, 0x4923 }, { 0x8607, 0x2129 }, { 0x860A, 0x491E }, { 0x860B, 0x4920 }, { 0x8613, 0x491F }, { 0x8616, 0x3D11 }, 
-       { 0x8617, 0x3D02 }, { 0x861A, 0x4925 }, { 0x8622, 0x4924 }, { 0x862D, 0x2D56 }, { 0x862F, 0x421C }, { 0x8630, 0x4926 }, 
-       { 0x863F, 0x4927 }, { 0x864D, 0x4928 }, { 0x864E, 0x1837 }, { 0x8650, 0x1534 }, { 0x8654, 0x492A }, { 0x8655, 0x313D }, 
-       { 0x865A, 0x1555 }, { 0x865C, 0x2E1A }, { 0x865E, 0x1653 }, { 0x865F, 0x492B }, { 0x8667, 0x492C }, { 0x866B, 0x234E }, 
-       { 0x8671, 0x492D }, { 0x8679, 0x265A }, { 0x867B, 0x101A }, { 0x868A, 0x1243 }, { 0x868B, 0x4932 }, { 0x868C, 0x4933 }, 
-       { 0x8693, 0x492E }, { 0x8695, 0x1B1D }, { 0x86A3, 0x492F }, { 0x86A4, 0x2722 }, { 0x86A9, 0x4930 }, { 0x86AA, 0x4931 }, 
-       { 0x86AB, 0x493B }, { 0x86AF, 0x4935 }, { 0x86B0, 0x4938 }, { 0x86B6, 0x4934 }, { 0x86C4, 0x4936 }, { 0x86C6, 0x4937 }, 
-       { 0x86C7, 0x1C38 }, { 0x86C9, 0x4939 }, { 0x86CB, 0x2321 }, { 0x86CD, 0x1736 }, { 0x86CE, 0x1322 }, { 0x86D4, 0x493C }, 
-       { 0x86D9, 0x131F }, { 0x86DB, 0x4941 }, { 0x86DE, 0x493D }, { 0x86DF, 0x4940 }, { 0x86E4, 0x281A }, { 0x86E9, 0x493E }, 
-       { 0x86EC, 0x493F }, { 0x86ED, 0x2928 }, { 0x86EE, 0x283A }, { 0x86EF, 0x4942 }, { 0x86F8, 0x225D }, { 0x86F9, 0x494C }, 
-       { 0x86FB, 0x4948 }, { 0x86FE, 0x124B }, { 0x8700, 0x4946 }, { 0x8702, 0x2B0A }, { 0x8703, 0x4947 }, { 0x8706, 0x4944 }, 
-       { 0x8708, 0x4945 }, { 0x8709, 0x494A }, { 0x870A, 0x494D }, { 0x870D, 0x494B }, { 0x8711, 0x4949 }, { 0x8712, 0x4943 }, 
-       { 0x8718, 0x2338 }, { 0x871A, 0x4954 }, { 0x871C, 0x2C0A }, { 0x8725, 0x4952 }, { 0x8729, 0x4953 }, { 0x8734, 0x494E }, 
-       { 0x8737, 0x4950 }, { 0x873B, 0x4951 }, { 0x873F, 0x494F }, { 0x8749, 0x2046 }, { 0x874B, 0x2F19 }, { 0x874C, 0x4958 }, 
-       { 0x874E, 0x4959 }, { 0x8753, 0x4A01 }, { 0x8755, 0x1F0A }, { 0x8757, 0x495B }, { 0x8759, 0x495E }, { 0x875F, 0x4956 }, 
-       { 0x8760, 0x4955 }, { 0x8763, 0x4A02 }, { 0x8766, 0x123C }, { 0x8768, 0x495C }, { 0x876A, 0x4A03 }, { 0x876E, 0x495D }, 
-       { 0x8774, 0x495A }, { 0x8776, 0x2413 }, { 0x8778, 0x4957 }, { 0x877F, 0x2748 }, { 0x8782, 0x4A07 }, { 0x878D, 0x2D1B }, 
-       { 0x879F, 0x4A06 }, { 0x87A2, 0x4A05 }, { 0x87AB, 0x4A0E }, { 0x87AF, 0x4A08 }, { 0x87B3, 0x4A10 }, { 0x87BA, 0x2D46 }, 
-       { 0x87BB, 0x4A13 }, { 0x87BD, 0x4A0A }, { 0x87C0, 0x4A0B }, { 0x87C4, 0x4A0F }, { 0x87C6, 0x4A12 }, { 0x87C7, 0x4A11 }, 
-       { 0x87CB, 0x4A09 }, { 0x87D0, 0x4A0C }, { 0x87D2, 0x4A1D }, { 0x87E0, 0x4A16 }, { 0x87EF, 0x4A14 }, { 0x87F2, 0x4A15 }, 
-       { 0x87F6, 0x4A1A }, { 0x87F7, 0x4A1B }, { 0x87F9, 0x130A }, { 0x87FB, 0x1522 }, { 0x87FE, 0x4A19 }, { 0x8805, 0x4A04 }, 
-       { 0x880D, 0x4A18 }, { 0x880E, 0x4A1C }, { 0x880F, 0x4A17 }, { 0x8811, 0x4A1E }, { 0x8815, 0x4A20 }, { 0x8816, 0x4A1F }, 
-       { 0x8821, 0x4A22 }, { 0x8822, 0x4A21 }, { 0x8823, 0x493A }, { 0x8827, 0x4A26 }, { 0x8831, 0x4A23 }, { 0x8836, 0x4A24 }, 
-       { 0x8839, 0x4A25 }, { 0x883B, 0x4A27 }, { 0x8840, 0x174C }, { 0x8842, 0x4A29 }, { 0x8844, 0x4A28 }, { 0x8846, 0x1D10 }, 
-       { 0x884C, 0x1934 }, { 0x884D, 0x3E07 }, { 0x8852, 0x4A2A }, { 0x8853, 0x1D31 }, { 0x8857, 0x1319 }, { 0x8859, 0x4A2B }, 
-       { 0x885B, 0x1132 }, { 0x885D, 0x1E37 }, { 0x885E, 0x4A2C }, { 0x8861, 0x1935 }, { 0x8862, 0x4A2D }, { 0x8863, 0x1041 }, 
-       { 0x8868, 0x291D }, { 0x886B, 0x4A2E }, { 0x8870, 0x1F4A }, { 0x8872, 0x4A35 }, { 0x8875, 0x4A32 }, { 0x8877, 0x234F }, 
-       { 0x887D, 0x4A33 }, { 0x887E, 0x4A30 }, { 0x887F, 0x163E }, { 0x8881, 0x4A2F }, { 0x8882, 0x4A36 }, { 0x8888, 0x1716 }, 
-       { 0x888B, 0x223E }, { 0x888D, 0x4A3C }, { 0x8892, 0x4A38 }, { 0x8896, 0x2215 }, { 0x8897, 0x4A37 }, { 0x8899, 0x4A3A }, 
-       { 0x889E, 0x4A31 }, { 0x88A2, 0x4A3B }, { 0x88A4, 0x4A3D }, { 0x88AB, 0x284F }, { 0x88AE, 0x4A39 }, { 0x88B0, 0x4A3E }, 
-       { 0x88B1, 0x4A40 }, { 0x88B4, 0x1833 }, { 0x88B5, 0x4A34 }, { 0x88B7, 0x1021 }, { 0x88BF, 0x4A3F }, { 0x88C1, 0x1A3B }, 
-       { 0x88C2, 0x2E56 }, { 0x88C3, 0x4A41 }, { 0x88C4, 0x4A42 }, { 0x88C5, 0x2155 }, { 0x88CF, 0x2E02 }, { 0x88D4, 0x4A43 }, 
-       { 0x88D5, 0x2D15 }, { 0x88D8, 0x4A44 }, { 0x88D9, 0x4A45 }, { 0x88DC, 0x2A44 }, { 0x88DD, 0x4A46 }, { 0x88DF, 0x1A20 }, 
-       { 0x88E1, 0x2E03 }, { 0x88E8, 0x4A4B }, { 0x88F2, 0x4A4C }, { 0x88F3, 0x1E38 }, { 0x88F4, 0x4A4A }, { 0x88F8, 0x2D47 }, 
-       { 0x88F9, 0x4A47 }, { 0x88FC, 0x4A49 }, { 0x88FD, 0x201D }, { 0x88FE, 0x1F5E }, { 0x8902, 0x4A48 }, { 0x8904, 0x4A4D }, 
-       { 0x8907, 0x2A03 }, { 0x890A, 0x4A4F }, { 0x890C, 0x4A4E }, { 0x8910, 0x134C }, { 0x8912, 0x2B0B }, { 0x8913, 0x4A50 }, 
-       { 0x891D, 0x4A5C }, { 0x891E, 0x4A52 }, { 0x8925, 0x4A53 }, { 0x892A, 0x4A54 }, { 0x892B, 0x4A55 }, { 0x8936, 0x4A59 }, 
-       { 0x8938, 0x4A5A }, { 0x893B, 0x4A58 }, { 0x8941, 0x4A56 }, { 0x8943, 0x4A51 }, { 0x8944, 0x4A57 }, { 0x894C, 0x4A5B }, 
-       { 0x894D, 0x5017 }, { 0x8956, 0x1208 }, { 0x895E, 0x4A5E }, { 0x895F, 0x163F }, { 0x8960, 0x4A5D }, { 0x8964, 0x4B02 }, 
-       { 0x8966, 0x4B01 }, { 0x896A, 0x4B04 }, { 0x896D, 0x4B03 }, { 0x896F, 0x4B05 }, { 0x8972, 0x1D11 }, { 0x8974, 0x4B06 }, 
-       { 0x8977, 0x4B07 }, { 0x897E, 0x4B08 }, { 0x897F, 0x201E }, { 0x8981, 0x2D37 }, { 0x8983, 0x4B09 }, { 0x8986, 0x2A04 }, 
-       { 0x8987, 0x2726 }, { 0x8988, 0x4B0A }, { 0x898A, 0x4B0B }, { 0x898B, 0x180B }, { 0x898F, 0x150C }, { 0x8993, 0x4B0C }, 
-       { 0x8996, 0x1B4B }, { 0x8997, 0x2721 }, { 0x8998, 0x4B0D }, { 0x899A, 0x1330 }, { 0x89A1, 0x4B0E }, { 0x89A6, 0x4B10 }, 
-       { 0x89A7, 0x2D57 }, { 0x89A9, 0x4B0F }, { 0x89AA, 0x1F26 }, { 0x89AC, 0x4B11 }, { 0x89AF, 0x4B12 }, { 0x89B2, 0x4B13 }, 
-       { 0x89B3, 0x1431 }, { 0x89BA, 0x4B14 }, { 0x89BD, 0x4B15 }, { 0x89BF, 0x4B16 }, { 0x89C0, 0x4B17 }, { 0x89D2, 0x1331 }, 
-       { 0x89DA, 0x4B18 }, { 0x89DC, 0x4B19 }, { 0x89DD, 0x4B1A }, { 0x89E3, 0x1252 }, { 0x89E6, 0x1F08 }, { 0x89E7, 0x4B1B }, 
-       { 0x89F4, 0x4B1C }, { 0x89F8, 0x4B1D }, { 0x8A00, 0x1820 }, { 0x8A02, 0x245B }, { 0x8A03, 0x4B1E }, { 0x8A08, 0x1737 }, 
-       { 0x8A0A, 0x1F36 }, { 0x8A0C, 0x4B21 }, { 0x8A0E, 0x2604 }, { 0x8A10, 0x4B20 }, { 0x8A13, 0x1711 }, { 0x8A16, 0x4B1F }, 
-       { 0x8A17, 0x2257 }, { 0x8A18, 0x150D }, { 0x8A1B, 0x4B22 }, { 0x8A1D, 0x4B23 }, { 0x8A1F, 0x1E39 }, { 0x8A23, 0x174D }, 
-       { 0x8A25, 0x4B24 }, { 0x8A2A, 0x2B0C }, { 0x8A2D, 0x203F }, { 0x8A31, 0x1556 }, { 0x8A33, 0x2C55 }, { 0x8A34, 0x212A }, 
-       { 0x8A36, 0x4B25 }, { 0x8A3A, 0x1F27 }, { 0x8A3B, 0x2350 }, { 0x8A3C, 0x1E3A }, { 0x8A41, 0x4B26 }, { 0x8A46, 0x4B29 }, 
-       { 0x8A48, 0x4B2A }, { 0x8A50, 0x1A1E }, { 0x8A51, 0x2222 }, { 0x8A52, 0x4B28 }, { 0x8A54, 0x1E3B }, { 0x8A55, 0x291E }, 
-       { 0x8A5B, 0x4B27 }, { 0x8A5E, 0x1B4C }, { 0x8A60, 0x1133 }, { 0x8A62, 0x4B2E }, { 0x8A63, 0x1738 }, { 0x8A66, 0x1B4E }, 
-       { 0x8A69, 0x1B4D }, { 0x8A6B, 0x2F2D }, { 0x8A6C, 0x4B2D }, { 0x8A6D, 0x4B2C }, { 0x8A6E, 0x2107 }, { 0x8A70, 0x152D }, 
-       { 0x8A71, 0x2F23 }, { 0x8A72, 0x131A }, { 0x8A73, 0x1E3C }, { 0x8A7C, 0x4B2B }, { 0x8A82, 0x4B30 }, { 0x8A84, 0x4B31 }, 
-       { 0x8A85, 0x4B2F }, { 0x8A87, 0x1838 }, { 0x8A89, 0x2D20 }, { 0x8A8C, 0x1B4F }, { 0x8A8D, 0x2707 }, { 0x8A91, 0x4B34 }, 
-       { 0x8A93, 0x2020 }, { 0x8A95, 0x2322 }, { 0x8A98, 0x2D16 }, { 0x8A9A, 0x4B37 }, { 0x8A9E, 0x184C }, { 0x8AA0, 0x201F }, 
-       { 0x8AA1, 0x4B33 }, { 0x8AA3, 0x4B38 }, { 0x8AA4, 0x184D }, { 0x8AA5, 0x4B35 }, { 0x8AA6, 0x4B36 }, { 0x8AA8, 0x4B32 }, 
-       { 0x8AAC, 0x2042 }, { 0x8AAD, 0x2629 }, { 0x8AB0, 0x230F }, { 0x8AB2, 0x123D }, { 0x8AB9, 0x2850 }, { 0x8ABC, 0x1523 }, 
-       { 0x8ABF, 0x2414 }, { 0x8AC2, 0x4B3B }, { 0x8AC4, 0x4B39 }, { 0x8AC7, 0x232C }, { 0x8ACB, 0x2021 }, { 0x8ACC, 0x1432 }, 
-       { 0x8ACD, 0x4B3A }, { 0x8ACF, 0x1F3B }, { 0x8AD2, 0x2E2A }, { 0x8AD6, 0x2F20 }, { 0x8ADA, 0x4B3C }, { 0x8ADB, 0x4B47 }, 
-       { 0x8ADC, 0x2415 }, { 0x8ADE, 0x4B46 }, { 0x8AE0, 0x4B43 }, { 0x8AE1, 0x4B4B }, { 0x8AE2, 0x4B44 }, { 0x8AE4, 0x4B40 }, 
-       { 0x8AE6, 0x245C }, { 0x8AE7, 0x4B3F }, { 0x8AEB, 0x4B3D }, { 0x8AED, 0x2D01 }, { 0x8AEE, 0x1B50 }, { 0x8AF1, 0x4B41 }, 
-       { 0x8AF3, 0x4B3E }, { 0x8AF7, 0x4B45 }, { 0x8AF8, 0x1D54 }, { 0x8AFA, 0x1821 }, { 0x8AFE, 0x225A }, { 0x8B00, 0x2B25 }, 
-       { 0x8B01, 0x113A }, { 0x8B02, 0x1042 }, { 0x8B04, 0x2605 }, { 0x8B07, 0x4B49 }, { 0x8B0C, 0x4B48 }, { 0x8B0E, 0x2646 }, 
-       { 0x8B10, 0x4B4D }, { 0x8B14, 0x4B42 }, { 0x8B16, 0x4B4C }, { 0x8B17, 0x4B4E }, { 0x8B19, 0x180C }, { 0x8B1A, 0x4B4A }, 
-       { 0x8B1B, 0x1936 }, { 0x8B1D, 0x1C35 }, { 0x8B20, 0x4B4F }, { 0x8B21, 0x2D38 }, { 0x8B26, 0x4B52 }, { 0x8B28, 0x4B55 }, 
-       { 0x8B2B, 0x4B53 }, { 0x8B2C, 0x2915 }, { 0x8B33, 0x4B50 }, { 0x8B39, 0x1640 }, { 0x8B3E, 0x4B54 }, { 0x8B41, 0x4B56 }, 
-       { 0x8B49, 0x4B5A }, { 0x8B4C, 0x4B57 }, { 0x8B4E, 0x4B59 }, { 0x8B4F, 0x4B58 }, { 0x8B56, 0x4B5B }, { 0x8B58, 0x1C11 }, 
-       { 0x8B5A, 0x4B5D }, { 0x8B5B, 0x4B5C }, { 0x8B5C, 0x2948 }, { 0x8B5F, 0x4C01 }, { 0x8B66, 0x1739 }, { 0x8B6B, 0x4B5E }, 
-       { 0x8B6C, 0x4C02 }, { 0x8B6F, 0x4C03 }, { 0x8B70, 0x1524 }, { 0x8B71, 0x4621 }, { 0x8B72, 0x1E59 }, { 0x8B74, 0x4C04 }, 
-       { 0x8B77, 0x184E }, { 0x8B7D, 0x4C05 }, { 0x8B80, 0x4C06 }, { 0x8B83, 0x1B1E }, { 0x8B8A, 0x3A2E }, { 0x8B8C, 0x4C07 }, 
-       { 0x8B8E, 0x4C08 }, { 0x8B90, 0x1D12 }, { 0x8B92, 0x4C09 }, { 0x8B93, 0x4C0A }, { 0x8B96, 0x4C0B }, { 0x8B99, 0x4C0C }, 
-       { 0x8B9A, 0x4C0D }, { 0x8C37, 0x230B }, { 0x8C3A, 0x4C0E }, { 0x8C3F, 0x4C10 }, { 0x8C41, 0x4C0F }, { 0x8C46, 0x2606 }, 
-       { 0x8C48, 0x4C11 }, { 0x8C4A, 0x2B0D }, { 0x8C4C, 0x4C12 }, { 0x8C4E, 0x4C13 }, { 0x8C50, 0x4C14 }, { 0x8C55, 0x4C15 }, 
-       { 0x8C5A, 0x263A }, { 0x8C61, 0x1E3D }, { 0x8C62, 0x4C16 }, { 0x8C6A, 0x194B }, { 0x8C6B, 0x300E }, { 0x8C6C, 0x4C17 }, 
-       { 0x8C78, 0x4C18 }, { 0x8C79, 0x291F }, { 0x8C7A, 0x4C19 }, { 0x8C7C, 0x4C21 }, { 0x8C82, 0x4C1A }, { 0x8C85, 0x4C1C }, 
-       { 0x8C89, 0x4C1B }, { 0x8C8A, 0x4C1D }, { 0x8C8C, 0x2B26 }, { 0x8C8D, 0x4C1E }, { 0x8C8E, 0x4C1F }, { 0x8C94, 0x4C20 }, 
-       { 0x8C98, 0x4C22 }, { 0x8C9D, 0x130D }, { 0x8C9E, 0x2447 }, { 0x8CA0, 0x2949 }, { 0x8CA1, 0x1A42 }, { 0x8CA2, 0x1937 }, 
-       { 0x8CA7, 0x292F }, { 0x8CA8, 0x123F }, { 0x8CA9, 0x282E }, { 0x8CAA, 0x4C25 }, { 0x8CAB, 0x1433 }, { 0x8CAC, 0x2035 }, 
-       { 0x8CAD, 0x4C24 }, { 0x8CAE, 0x4C29 }, { 0x8CAF, 0x2359 }, { 0x8CB0, 0x2C43 }, { 0x8CB2, 0x4C27 }, { 0x8CB3, 0x4C28 }, 
-       { 0x8CB4, 0x150E }, { 0x8CB6, 0x4C2A }, { 0x8CB7, 0x2743 }, { 0x8CB8, 0x223F }, { 0x8CBB, 0x2851 }, { 0x8CBC, 0x251D }, 
-       { 0x8CBD, 0x4C26 }, { 0x8CBF, 0x2B27 }, { 0x8CC0, 0x124C }, { 0x8CC1, 0x4C2C }, { 0x8CC2, 0x2F08 }, { 0x8CC3, 0x2422 }, 
-       { 0x8CC4, 0x2F25 }, { 0x8CC7, 0x1B51 }, { 0x8CC8, 0x4C2B }, { 0x8CCA, 0x2211 }, { 0x8CCD, 0x4C3C }, { 0x8CCE, 0x2108 }, 
-       { 0x8CD1, 0x2658 }, { 0x8CD3, 0x2930 }, { 0x8CDA, 0x4C2F }, { 0x8CDB, 0x1B1F }, { 0x8CDC, 0x1B52 }, { 0x8CDE, 0x1E3E }, 
-       { 0x8CE0, 0x2745 }, { 0x8CE2, 0x180D }, { 0x8CE3, 0x4C2E }, { 0x8CE4, 0x4C2D }, { 0x8CE6, 0x294A }, { 0x8CEA, 0x1C21 }, 
-       { 0x8CED, 0x2532 }, { 0x8CFA, 0x4C31 }, { 0x8CFB, 0x4C32 }, { 0x8CFC, 0x1938 }, { 0x8CFD, 0x4C30 }, { 0x8D04, 0x4C33 }, 
-       { 0x8D05, 0x4C34 }, { 0x8D07, 0x4C36 }, { 0x8D08, 0x2203 }, { 0x8D0A, 0x4C35 }, { 0x8D0B, 0x1446 }, { 0x8D0D, 0x4C38 }, 
-       { 0x8D0F, 0x4C37 }, { 0x8D10, 0x4C39 }, { 0x8D13, 0x4C3B }, { 0x8D14, 0x4C3D }, { 0x8D16, 0x4C3E }, { 0x8D64, 0x2036 }, 
-       { 0x8D66, 0x1C2F }, { 0x8D67, 0x4C3F }, { 0x8D6B, 0x1332 }, { 0x8D6D, 0x4C40 }, { 0x8D70, 0x2156 }, { 0x8D71, 0x4C41 }, 
-       { 0x8D73, 0x4C42 }, { 0x8D74, 0x294B }, { 0x8D77, 0x150F }, { 0x8D81, 0x4C43 }, { 0x8D85, 0x2416 }, { 0x8D8A, 0x113B }, 
-       { 0x8D99, 0x4C44 }, { 0x8DA3, 0x1C51 }, { 0x8DA8, 0x1F56 }, { 0x8DB3, 0x220D }, { 0x8DBA, 0x4C47 }, { 0x8DBE, 0x4C46 }, 
-       { 0x8DC2, 0x4C45 }, { 0x8DCB, 0x4C4D }, { 0x8DCC, 0x4C4B }, { 0x8DCF, 0x4C48 }, { 0x8DD6, 0x4C4A }, { 0x8DDA, 0x4C49 }, 
-       { 0x8DDB, 0x4C4C }, { 0x8DDD, 0x1557 }, { 0x8DDF, 0x4C50 }, { 0x8DE1, 0x2037 }, { 0x8DE3, 0x4C51 }, { 0x8DE8, 0x1839 }, 
-       { 0x8DEA, 0x4C4E }, { 0x8DEB, 0x4C4F }, { 0x8DEF, 0x2F09 }, { 0x8DF3, 0x2417 }, { 0x8DF5, 0x2109 }, { 0x8DFC, 0x4C52 }, 
-       { 0x8DFF, 0x4C55 }, { 0x8E08, 0x4C53 }, { 0x8E09, 0x4C54 }, { 0x8E0A, 0x2D39 }, { 0x8E0F, 0x2607 }, { 0x8E10, 0x4C58 }, 
-       { 0x8E1D, 0x4C56 }, { 0x8E1E, 0x4C57 }, { 0x8E1F, 0x4C59 }, { 0x8E2A, 0x4D09 }, { 0x8E30, 0x4C5C }, { 0x8E34, 0x4C5D }, 
-       { 0x8E35, 0x4C5B }, { 0x8E42, 0x4C5A }, { 0x8E44, 0x245D }, { 0x8E47, 0x4D01 }, { 0x8E48, 0x4D05 }, { 0x8E49, 0x4D02 }, 
-       { 0x8E4A, 0x4C5E }, { 0x8E4C, 0x4D03 }, { 0x8E50, 0x4D04 }, { 0x8E55, 0x4D0B }, { 0x8E59, 0x4D06 }, { 0x8E5F, 0x2038 }, 
-       { 0x8E60, 0x4D08 }, { 0x8E63, 0x4D0A }, { 0x8E64, 0x4D07 }, { 0x8E72, 0x4D0D }, { 0x8E74, 0x1D13 }, { 0x8E76, 0x4D0C }, 
-       { 0x8E7C, 0x4D0E }, { 0x8E81, 0x4D0F }, { 0x8E84, 0x4D12 }, { 0x8E85, 0x4D11 }, { 0x8E87, 0x4D10 }, { 0x8E8A, 0x4D14 }, 
-       { 0x8E8B, 0x4D13 }, { 0x8E8D, 0x2C56 }, { 0x8E91, 0x4D16 }, { 0x8E93, 0x4D15 }, { 0x8E94, 0x4D17 }, { 0x8E99, 0x4D18 }, 
-       { 0x8EA1, 0x4D1A }, { 0x8EAA, 0x4D19 }, { 0x8EAB, 0x1F28 }, { 0x8EAC, 0x4D1B }, { 0x8EAF, 0x164D }, { 0x8EB0, 0x4D1C }, 
-       { 0x8EB1, 0x4D1E }, { 0x8EBE, 0x4D1F }, { 0x8EC5, 0x4D20 }, { 0x8EC6, 0x4D1D }, { 0x8EC8, 0x4D21 }, { 0x8ECA, 0x1C36 }, 
-       { 0x8ECB, 0x4D22 }, { 0x8ECC, 0x1510 }, { 0x8ECD, 0x1713 }, { 0x8ED2, 0x180E }, { 0x8EDB, 0x4D23 }, { 0x8EDF, 0x2650 }, 
-       { 0x8EE2, 0x251E }, { 0x8EE3, 0x4D24 }, { 0x8EEB, 0x4D27 }, { 0x8EF8, 0x1C14 }, { 0x8EFB, 0x4D26 }, { 0x8EFC, 0x4D25 }, 
-       { 0x8EFD, 0x173A }, { 0x8EFE, 0x4D28 }, { 0x8F03, 0x1333 }, { 0x8F05, 0x4D2A }, { 0x8F09, 0x1A3C }, { 0x8F0A, 0x4D29 }, 
-       { 0x8F0C, 0x4D32 }, { 0x8F12, 0x4D2C }, { 0x8F13, 0x4D2E }, { 0x8F14, 0x2A45 }, { 0x8F15, 0x4D2B }, { 0x8F19, 0x4D2D }, 
-       { 0x8F1B, 0x4D31 }, { 0x8F1C, 0x4D2F }, { 0x8F1D, 0x1511 }, { 0x8F1F, 0x4D30 }, { 0x8F26, 0x4D33 }, { 0x8F29, 0x273A }, 
-       { 0x8F2A, 0x2E38 }, { 0x8F2F, 0x1D14 }, { 0x8F33, 0x4D34 }, { 0x8F38, 0x2D02 }, { 0x8F39, 0x4D36 }, { 0x8F3B, 0x4D35 }, 
-       { 0x8F3E, 0x4D39 }, { 0x8F3F, 0x2D21 }, { 0x8F42, 0x4D38 }, { 0x8F44, 0x134D }, { 0x8F45, 0x4D37 }, { 0x8F46, 0x4D3C }, 
-       { 0x8F49, 0x4D3B }, { 0x8F4C, 0x4D3A }, { 0x8F4D, 0x2512 }, { 0x8F4E, 0x4D3D }, { 0x8F57, 0x4D3E }, { 0x8F5C, 0x4D3F }, 
-       { 0x8F5F, 0x194C }, { 0x8F61, 0x1705 }, { 0x8F62, 0x4D40 }, { 0x8F63, 0x4D41 }, { 0x8F64, 0x4D42 }, { 0x8F9B, 0x1F29 }, 
-       { 0x8F9C, 0x4D43 }, { 0x8F9E, 0x1C0D }, { 0x8F9F, 0x4D44 }, { 0x8FA3, 0x4D45 }, { 0x8FA7, 0x3201 }, { 0x8FA8, 0x315E }, 
-       { 0x8FAD, 0x4D46 }, { 0x8FAE, 0x4550 }, { 0x8FAF, 0x4D47 }, { 0x8FB0, 0x2304 }, { 0x8FB1, 0x1F0B }, { 0x8FB2, 0x2720 }, 
-       { 0x8FB7, 0x4D48 }, { 0x8FBA, 0x2A35 }, { 0x8FBB, 0x2434 }, { 0x8FBC, 0x195E }, { 0x8FBF, 0x2309 }, { 0x8FC2, 0x110A }, 
-       { 0x8FC4, 0x2B58 }, { 0x8FC5, 0x1F37 }, { 0x8FCE, 0x173E }, { 0x8FD1, 0x1641 }, { 0x8FD4, 0x2A36 }, { 0x8FDA, 0x4D49 }, 
-       { 0x8FE2, 0x4D4B }, { 0x8FE5, 0x4D4A }, { 0x8FE6, 0x1240 }, { 0x8FE9, 0x2656 }, { 0x8FEA, 0x4D4C }, { 0x8FEB, 0x2757 }, 
-       { 0x8FED, 0x2513 }, { 0x8FEF, 0x4D4D }, { 0x8FF0, 0x1D32 }, { 0x8FF4, 0x4D4F }, { 0x8FF7, 0x2C22 }, { 0x8FF8, 0x4D5E }, 
-       { 0x8FF9, 0x4D51 }, { 0x8FFA, 0x4D52 }, { 0x8FFD, 0x2429 }, { 0x9000, 0x2240 }, { 0x9001, 0x2157 }, { 0x9003, 0x2608 }, 
-       { 0x9005, 0x4D50 }, { 0x9006, 0x1535 }, { 0x900B, 0x4D59 }, { 0x900D, 0x4D56 }, { 0x900E, 0x4E05 }, { 0x900F, 0x2609 }, 
-       { 0x9010, 0x2340 }, { 0x9011, 0x4D53 }, { 0x9013, 0x245E }, { 0x9014, 0x2533 }, { 0x9015, 0x4D54 }, { 0x9016, 0x4D58 }, 
-       { 0x9017, 0x1F40 }, { 0x9019, 0x2747 }, { 0x901A, 0x242C }, { 0x901D, 0x2022 }, { 0x901E, 0x4D57 }, { 0x901F, 0x220E }, 
-       { 0x9020, 0x2204 }, { 0x9021, 0x4D55 }, { 0x9022, 0x1009 }, { 0x9023, 0x2F02 }, { 0x9027, 0x4D5A }, { 0x902E, 0x2241 }, 
-       { 0x9031, 0x1D15 }, { 0x9032, 0x1F2A }, { 0x9035, 0x4D5C }, { 0x9036, 0x4D5B }, { 0x9038, 0x104F }, { 0x9039, 0x4D5D }, 
-       { 0x903C, 0x290F }, { 0x903E, 0x4E07 }, { 0x9041, 0x263B }, { 0x9042, 0x1F4B }, { 0x9045, 0x2339 }, { 0x9047, 0x1658 }, 
-       { 0x9049, 0x4E06 }, { 0x904A, 0x2D17 }, { 0x904B, 0x111F }, { 0x904D, 0x2A37 }, { 0x904E, 0x1241 }, { 0x904F, 0x4E01 }, 
-       { 0x9050, 0x4E02 }, { 0x9051, 0x4E03 }, { 0x9052, 0x4E04 }, { 0x9053, 0x261B }, { 0x9054, 0x2303 }, { 0x9055, 0x1043 }, 
-       { 0x9056, 0x4E08 }, { 0x9058, 0x4E09 }, { 0x9059, 0x5403 }, { 0x905C, 0x221D }, { 0x905E, 0x4E0A }, { 0x9060, 0x1153 }, 
-       { 0x9061, 0x212C }, { 0x9063, 0x180F }, { 0x9065, 0x2D3A }, { 0x9068, 0x4E0B }, { 0x9069, 0x250C }, { 0x906D, 0x2158 }, 
-       { 0x906E, 0x1C37 }, { 0x906F, 0x4E0C }, { 0x9072, 0x4E0F }, { 0x9075, 0x1D45 }, { 0x9076, 0x4E0D }, { 0x9077, 0x210B }, 
-       { 0x9078, 0x210A }, { 0x907A, 0x1044 }, { 0x907C, 0x2E2B }, { 0x907D, 0x4E11 }, { 0x907F, 0x2852 }, { 0x9080, 0x4E13 }, 
-       { 0x9081, 0x4E12 }, { 0x9082, 0x4E10 }, { 0x9083, 0x4344 }, { 0x9084, 0x1434 }, { 0x9087, 0x4D4E }, { 0x9089, 0x4E15 }, 
-       { 0x908A, 0x4E14 }, { 0x908F, 0x4E16 }, { 0x9091, 0x2D18 }, { 0x90A3, 0x2641 }, { 0x90A6, 0x2B0E }, { 0x90A8, 0x4E17 }, 
-       { 0x90AA, 0x1C39 }, { 0x90AF, 0x4E18 }, { 0x90B1, 0x4E19 }, { 0x90B5, 0x4E1A }, { 0x90B8, 0x2501 }, { 0x90C1, 0x104A }, 
-       { 0x90CA, 0x1939 }, { 0x90CE, 0x2F1A }, { 0x90DB, 0x4E1E }, { 0x90E1, 0x1714 }, { 0x90E2, 0x4E1B }, { 0x90E4, 0x4E1C }, 
-       { 0x90E8, 0x2954 }, { 0x90ED, 0x1334 }, { 0x90F5, 0x2D19 }, { 0x90F7, 0x161F }, { 0x90FD, 0x2534 }, { 0x9102, 0x4E1F }, 
-       { 0x9112, 0x4E20 }, { 0x9119, 0x4E21 }, { 0x912D, 0x2502 }, { 0x9130, 0x4E23 }, { 0x9132, 0x4E22 }, { 0x9149, 0x2633 }, 
-       { 0x914A, 0x4E24 }, { 0x914B, 0x1D16 }, { 0x914C, 0x1C40 }, { 0x914D, 0x273B }, { 0x914E, 0x2351 }, { 0x9152, 0x1C52 }, 
-       { 0x9154, 0x1F4C }, { 0x9156, 0x4E25 }, { 0x9158, 0x4E26 }, { 0x9162, 0x1F3D }, { 0x9163, 0x4E27 }, { 0x9165, 0x4E28 }, 
-       { 0x9169, 0x4E29 }, { 0x916A, 0x2D4F }, { 0x916C, 0x1D17 }, { 0x9172, 0x4E2B }, { 0x9173, 0x4E2A }, { 0x9175, 0x193A }, 
-       { 0x9177, 0x1953 }, { 0x9178, 0x1B20 }, { 0x9182, 0x4E2E }, { 0x9187, 0x1D46 }, { 0x9189, 0x4E2D }, { 0x918B, 0x4E2C }, 
-       { 0x918D, 0x2249 }, { 0x9190, 0x184F }, { 0x9192, 0x2023 }, { 0x9197, 0x2810 }, { 0x919C, 0x1D19 }, { 0x91A2, 0x4E2F }, 
-       { 0x91A4, 0x1E3F }, { 0x91AA, 0x4E32 }, { 0x91AB, 0x4E30 }, { 0x91AF, 0x4E31 }, { 0x91B4, 0x4E34 }, { 0x91B5, 0x4E33 }, 
-       { 0x91B8, 0x1E5A }, { 0x91BA, 0x4E35 }, { 0x91C0, 0x4E36 }, { 0x91C1, 0x4E37 }, { 0x91C6, 0x2830 }, { 0x91C7, 0x1A33 }, 
-       { 0x91C8, 0x1C41 }, { 0x91C9, 0x4E38 }, { 0x91CB, 0x4E39 }, { 0x91CC, 0x2E04 }, { 0x91CD, 0x1D25 }, { 0x91CE, 0x2C4E }, 
-       { 0x91CF, 0x2E2C }, { 0x91D0, 0x4E3A }, { 0x91D1, 0x1642 }, { 0x91D6, 0x4E3B }, { 0x91D8, 0x2503 }, { 0x91DB, 0x4E3E }, 
-       { 0x91DC, 0x1358 }, { 0x91DD, 0x1F2B }, { 0x91DF, 0x4E3C }, { 0x91E1, 0x4E3D }, { 0x91E3, 0x2440 }, { 0x91E6, 0x2B35 }, 
-       { 0x91E7, 0x165C }, { 0x91F5, 0x4E40 }, { 0x91F6, 0x4E41 }, { 0x91FC, 0x4E3F }, { 0x91FF, 0x4E43 }, { 0x920D, 0x263F }, 
-       { 0x920E, 0x1323 }, { 0x9211, 0x4E47 }, { 0x9214, 0x4E44 }, { 0x9215, 0x4E46 }, { 0x921E, 0x4E42 }, { 0x9229, 0x4F2F }, 
-       { 0x922C, 0x4E45 }, { 0x9234, 0x2E4B }, { 0x9237, 0x183A }, { 0x923F, 0x4E4F }, { 0x9244, 0x2514 }, { 0x9245, 0x4E4A }, 
-       { 0x9248, 0x4E4D }, { 0x9249, 0x4E4B }, { 0x924B, 0x4E50 }, { 0x9250, 0x4E51 }, { 0x9257, 0x4E49 }, { 0x925A, 0x4E56 }, 
-       { 0x925B, 0x1154 }, { 0x925E, 0x4E48 }, { 0x9262, 0x280D }, { 0x9264, 0x4E4C }, { 0x9266, 0x1E40 }, { 0x9271, 0x193B }, 
-       { 0x927E, 0x2B28 }, { 0x9280, 0x1644 }, { 0x9283, 0x1D26 }, { 0x9285, 0x261C }, { 0x9291, 0x210D }, { 0x9293, 0x4E54 }, 
-       { 0x9295, 0x4E4E }, { 0x9296, 0x4E53 }, { 0x9298, 0x2C23 }, { 0x929A, 0x2418 }, { 0x929B, 0x4E55 }, { 0x929C, 0x4E52 }, 
-       { 0x92AD, 0x210C }, { 0x92B7, 0x4E59 }, { 0x92B9, 0x4E58 }, { 0x92CF, 0x4E57 }, { 0x92D2, 0x2B0F }, { 0x92E4, 0x1D5B }, 
-       { 0x92E9, 0x4E5A }, { 0x92EA, 0x2A3F }, { 0x92ED, 0x1134 }, { 0x92F2, 0x2926 }, { 0x92F3, 0x2352 }, { 0x92F8, 0x1558 }, 
-       { 0x92FA, 0x4E5C }, { 0x92FC, 0x193D }, { 0x9306, 0x1B0C }, { 0x930F, 0x4E5B }, { 0x9310, 0x1F4D }, { 0x9318, 0x1F4E }, 
-       { 0x9319, 0x4F01 }, { 0x931A, 0x4F03 }, { 0x9320, 0x1E5B }, { 0x9322, 0x4F02 }, { 0x9323, 0x4F04 }, { 0x9326, 0x1633 }, 
-       { 0x9328, 0x2925 }, { 0x932B, 0x1C42 }, { 0x932C, 0x2F03 }, { 0x932E, 0x4E5E }, { 0x932F, 0x1A58 }, { 0x9332, 0x2F1F }, 
-       { 0x9335, 0x4F06 }, { 0x933A, 0x4F05 }, { 0x933B, 0x4F07 }, { 0x9344, 0x4E5D }, { 0x934B, 0x2649 }, { 0x934D, 0x2535 }, 
-       { 0x9354, 0x2437 }, { 0x9356, 0x4F0C }, { 0x935B, 0x2323 }, { 0x935C, 0x4F08 }, { 0x9360, 0x4F09 }, { 0x936C, 0x170D }, 
-       { 0x936E, 0x4F0B }, { 0x9375, 0x1810 }, { 0x937C, 0x4F0A }, { 0x937E, 0x1E41 }, { 0x938C, 0x1359 }, { 0x9394, 0x4F10 }, 
-       { 0x9396, 0x1A1F }, { 0x9397, 0x2159 }, { 0x939A, 0x242A }, { 0x93A7, 0x131B }, { 0x93AC, 0x4F0E }, { 0x93AD, 0x4F0F }, 
-       { 0x93AE, 0x2423 }, { 0x93B0, 0x4F0D }, { 0x93B9, 0x4F11 }, { 0x93C3, 0x4F17 }, { 0x93C8, 0x4F1A }, { 0x93D0, 0x4F19 }, 
-       { 0x93D1, 0x250D }, { 0x93D6, 0x4F12 }, { 0x93D7, 0x4F13 }, { 0x93D8, 0x4F16 }, { 0x93DD, 0x4F18 }, { 0x93E1, 0x1620 }, 
-       { 0x93E4, 0x4F1B }, { 0x93E5, 0x4F15 }, { 0x93E8, 0x4F14 }, { 0x9403, 0x4F1F }, { 0x9407, 0x4F20 }, { 0x9410, 0x4F21 }, 
-       { 0x9413, 0x4F1E }, { 0x9414, 0x4F1D }, { 0x9418, 0x1E42 }, { 0x9419, 0x260A }, { 0x941A, 0x4F1C }, { 0x9421, 0x4F25 }, 
-       { 0x942B, 0x4F23 }, { 0x9435, 0x4F24 }, { 0x9436, 0x4F22 }, { 0x9438, 0x2258 }, { 0x943A, 0x4F26 }, { 0x9441, 0x4F27 }, 
-       { 0x9444, 0x4F29 }, { 0x9451, 0x1435 }, { 0x9452, 0x4F28 }, { 0x9453, 0x2C5A }, { 0x945A, 0x4F34 }, { 0x945B, 0x4F2A }, 
-       { 0x945E, 0x4F2D }, { 0x9460, 0x4F2B }, { 0x9462, 0x4F2C }, { 0x946A, 0x4F2E }, { 0x9470, 0x4F30 }, { 0x9475, 0x4F31 }, 
-       { 0x9477, 0x4F32 }, { 0x947C, 0x4F35 }, { 0x947D, 0x4F33 }, { 0x947E, 0x4F36 }, { 0x947F, 0x4F38 }, { 0x9481, 0x4F37 }, 
-       { 0x9577, 0x2419 }, { 0x9580, 0x2C47 }, { 0x9582, 0x4F39 }, { 0x9583, 0x210E }, { 0x9587, 0x4F3A }, { 0x9589, 0x2A24 }, 
-       { 0x958A, 0x4F3B }, { 0x958B, 0x130B }, { 0x958F, 0x111C }, { 0x9591, 0x1437 }, { 0x9593, 0x1436 }, { 0x9594, 0x4F3C }, 
-       { 0x9596, 0x4F3D }, { 0x9598, 0x4F3E }, { 0x9599, 0x4F3F }, { 0x95A0, 0x4F40 }, { 0x95A2, 0x1438 }, { 0x95A3, 0x1335 }, 
-       { 0x95A4, 0x193E }, { 0x95A5, 0x2816 }, { 0x95A7, 0x4F42 }, { 0x95A8, 0x4F41 }, { 0x95AD, 0x4F43 }, { 0x95B2, 0x113C }, 
-       { 0x95B9, 0x4F46 }, { 0x95BB, 0x4F45 }, { 0x95BC, 0x4F44 }, { 0x95BE, 0x4F47 }, { 0x95C3, 0x4F4A }, { 0x95C7, 0x1027 }, 
-       { 0x95CA, 0x4F48 }, { 0x95CC, 0x4F4C }, { 0x95CD, 0x4F4B }, { 0x95D4, 0x4F4E }, { 0x95D5, 0x4F4D }, { 0x95D6, 0x4F4F }, 
-       { 0x95D8, 0x260E }, { 0x95DC, 0x4F50 }, { 0x95E1, 0x4F51 }, { 0x95E2, 0x4F53 }, { 0x95E5, 0x4F52 }, { 0x961C, 0x294C }, 
-       { 0x9621, 0x4F54 }, { 0x9628, 0x4F55 }, { 0x962A, 0x1A45 }, { 0x962E, 0x4F56 }, { 0x962F, 0x4F57 }, { 0x9632, 0x2B29 }, 
-       { 0x963B, 0x212B }, { 0x963F, 0x1004 }, { 0x9640, 0x222B }, { 0x9642, 0x4F58 }, { 0x9644, 0x294D }, { 0x964B, 0x4F5B }, 
-       { 0x964C, 0x4F59 }, { 0x964D, 0x193F }, { 0x964F, 0x4F5A }, { 0x9650, 0x1822 }, { 0x965B, 0x2A25 }, { 0x965C, 0x4F5D }, 
-       { 0x965D, 0x5001 }, { 0x965E, 0x4F5E }, { 0x965F, 0x5002 }, { 0x9662, 0x1101 }, { 0x9663, 0x1F38 }, { 0x9664, 0x1D5C }, 
-       { 0x9665, 0x1439 }, { 0x9666, 0x5003 }, { 0x966A, 0x2746 }, { 0x966C, 0x5005 }, { 0x9670, 0x1102 }, { 0x9672, 0x5004 }, 
-       { 0x9673, 0x2424 }, { 0x9675, 0x2E2D }, { 0x9676, 0x260B }, { 0x9677, 0x4F5C }, { 0x9678, 0x2E06 }, { 0x967A, 0x1811 }, 
-       { 0x967D, 0x2D3B }, { 0x9685, 0x1659 }, { 0x9686, 0x2E14 }, { 0x9688, 0x1708 }, { 0x968A, 0x2242 }, { 0x968B, 0x4701 }, 
-       { 0x968D, 0x5006 }, { 0x968E, 0x130C }, { 0x968F, 0x1F4F }, { 0x9694, 0x1336 }, { 0x9695, 0x5008 }, { 0x9697, 0x5009 }, 
-       { 0x9698, 0x5007 }, { 0x9699, 0x1744 }, { 0x969B, 0x1A3D }, { 0x969C, 0x1E43 }, { 0x96A0, 0x1103 }, { 0x96A3, 0x2E39 }, 
-       { 0x96A7, 0x500B }, { 0x96A8, 0x4E0E }, { 0x96AA, 0x500A }, { 0x96B0, 0x500E }, { 0x96B1, 0x500C }, { 0x96B2, 0x500D }, 
-       { 0x96B4, 0x500F }, { 0x96B6, 0x5010 }, { 0x96B7, 0x2E4C }, { 0x96B8, 0x5011 }, { 0x96B9, 0x5012 }, { 0x96BB, 0x2029 }, 
-       { 0x96BC, 0x281B }, { 0x96C0, 0x1F5D }, { 0x96C1, 0x1447 }, { 0x96C4, 0x2D1A }, { 0x96C5, 0x124D }, { 0x96C6, 0x1D18 }, 
-       { 0x96C7, 0x183B }, { 0x96C9, 0x5015 }, { 0x96CB, 0x5014 }, { 0x96CC, 0x1B53 }, { 0x96CD, 0x5016 }, { 0x96CE, 0x5013 }, 
-       { 0x96D1, 0x1B08 }, { 0x96D5, 0x501A }, { 0x96D6, 0x4A0D }, { 0x96D9, 0x3236 }, { 0x96DB, 0x1F57 }, { 0x96DC, 0x5018 }, 
-       { 0x96E2, 0x2E05 }, { 0x96E3, 0x2651 }, { 0x96E8, 0x110B }, { 0x96EA, 0x2043 }, { 0x96EB, 0x1C16 }, { 0x96F0, 0x2A17 }, 
-       { 0x96F2, 0x1120 }, { 0x96F6, 0x2E4D }, { 0x96F7, 0x2D4B }, { 0x96F9, 0x501B }, { 0x96FB, 0x2525 }, { 0x9700, 0x1C5B }, 
-       { 0x9704, 0x501C }, { 0x9706, 0x501D }, { 0x9707, 0x1F2C }, { 0x9708, 0x501E }, { 0x970A, 0x2E4E }, { 0x970D, 0x5019 }, 
-       { 0x970E, 0x5020 }, { 0x970F, 0x5022 }, { 0x9711, 0x5021 }, { 0x9713, 0x501F }, { 0x9716, 0x5023 }, { 0x9719, 0x5024 }, 
-       { 0x971C, 0x215A }, { 0x971E, 0x1242 }, { 0x9724, 0x5025 }, { 0x9727, 0x2C18 }, { 0x972A, 0x5026 }, { 0x9730, 0x5027 }, 
-       { 0x9732, 0x2F0A }, { 0x9738, 0x3B11 }, { 0x9739, 0x5028 }, { 0x973D, 0x5029 }, { 0x973E, 0x502A }, { 0x9742, 0x502E }, 
-       { 0x9744, 0x502B }, { 0x9746, 0x502C }, { 0x9748, 0x502D }, { 0x9749, 0x502F }, { 0x9752, 0x2024 }, { 0x9756, 0x2C57 }, 
-       { 0x9759, 0x2025 }, { 0x975C, 0x5030 }, { 0x975E, 0x2853 }, { 0x9760, 0x5031 }, { 0x9761, 0x5333 }, { 0x9762, 0x2C2C }, 
-       { 0x9764, 0x5032 }, { 0x9766, 0x5033 }, { 0x9768, 0x5034 }, { 0x9769, 0x1337 }, { 0x976B, 0x5036 }, { 0x976D, 0x1F39 }, 
-       { 0x9771, 0x5037 }, { 0x9774, 0x1704 }, { 0x9779, 0x5038 }, { 0x977A, 0x503C }, { 0x977C, 0x503A }, { 0x9781, 0x503B }, 
-       { 0x9784, 0x1353 }, { 0x9785, 0x5039 }, { 0x9786, 0x503D }, { 0x978B, 0x503E }, { 0x978D, 0x1028 }, { 0x978F, 0x503F }, 
-       { 0x9790, 0x5040 }, { 0x9798, 0x1E44 }, { 0x979C, 0x5041 }, { 0x97A0, 0x1527 }, { 0x97A3, 0x5044 }, { 0x97A6, 0x5043 }, 
-       { 0x97A8, 0x5042 }, { 0x97AB, 0x4B51 }, { 0x97AD, 0x2A3C }, { 0x97B3, 0x5045 }, { 0x97B4, 0x5046 }, { 0x97C3, 0x5047 }, 
-       { 0x97C6, 0x5048 }, { 0x97C8, 0x5049 }, { 0x97CB, 0x504A }, { 0x97D3, 0x143A }, { 0x97DC, 0x504B }, { 0x97ED, 0x504C }, 
-       { 0x97EE, 0x2703 }, { 0x97F2, 0x504E }, { 0x97F3, 0x121B }, { 0x97F5, 0x5051 }, { 0x97F6, 0x5050 }, { 0x97FB, 0x1104 }, 
-       { 0x97FF, 0x1621 }, { 0x9801, 0x2A27 }, { 0x9802, 0x241A }, { 0x9803, 0x1A02 }, { 0x9805, 0x1940 }, { 0x9806, 0x1D47 }, 
-       { 0x9808, 0x1F3C }, { 0x980C, 0x5053 }, { 0x980F, 0x5052 }, { 0x9810, 0x2D22 }, { 0x9811, 0x1448 }, { 0x9812, 0x2832 }, 
-       { 0x9813, 0x263C }, { 0x9817, 0x1F5C }, { 0x9818, 0x2E2E }, { 0x981A, 0x173B }, { 0x9821, 0x5056 }, { 0x9824, 0x5055 }, 
-       { 0x982C, 0x2B2B }, { 0x982D, 0x260C }, { 0x9834, 0x1130 }, { 0x9837, 0x5057 }, { 0x9838, 0x5054 }, { 0x983B, 0x2931 }, 
-       { 0x983C, 0x2D4A }, { 0x983D, 0x5058 }, { 0x9846, 0x5059 }, { 0x984B, 0x505B }, { 0x984C, 0x224A }, { 0x984D, 0x133B }, 
-       { 0x984E, 0x133C }, { 0x984F, 0x505A }, { 0x9854, 0x1449 }, { 0x9855, 0x1812 }, { 0x9858, 0x144A }, { 0x985B, 0x251F }, 
-       { 0x985E, 0x2E40 }, { 0x9867, 0x183C }, { 0x986B, 0x505C }, { 0x986F, 0x505D }, { 0x9870, 0x505E }, { 0x9871, 0x5101 }, 
-       { 0x9873, 0x5103 }, { 0x9874, 0x5102 }, { 0x98A8, 0x2957 }, { 0x98AA, 0x5104 }, { 0x98AF, 0x5105 }, { 0x98B1, 0x5106 }, 
-       { 0x98B6, 0x5107 }, { 0x98C3, 0x5109 }, { 0x98C4, 0x5108 }, { 0x98C6, 0x510A }, { 0x98DB, 0x2854 }, { 0x98DC, 0x462C }, 
-       { 0x98DF, 0x1F09 }, { 0x98E2, 0x1512 }, { 0x98E9, 0x510B }, { 0x98EB, 0x510C }, { 0x98ED, 0x320C }, { 0x98EE, 0x3D1B }, 
-       { 0x98EF, 0x2833 }, { 0x98F2, 0x105B }, { 0x98F4, 0x101B }, { 0x98FC, 0x1B54 }, { 0x98FD, 0x2B10 }, { 0x98FE, 0x1E5E }, 
-       { 0x9903, 0x510D }, { 0x9905, 0x2C3F }, { 0x9909, 0x510E }, { 0x990A, 0x2D3C }, { 0x990C, 0x1122 }, { 0x9910, 0x1B21 }, 
-       { 0x9912, 0x510F }, { 0x9913, 0x124E }, { 0x9914, 0x5110 }, { 0x9918, 0x5111 }, { 0x991D, 0x5113 }, { 0x991E, 0x5114 }, 
-       { 0x9920, 0x5116 }, { 0x9921, 0x5112 }, { 0x9924, 0x5115 }, { 0x9928, 0x143B }, { 0x992C, 0x5117 }, { 0x992E, 0x5118 }, 
-       { 0x993D, 0x5119 }, { 0x993E, 0x511A }, { 0x9942, 0x511B }, { 0x9945, 0x511D }, { 0x9949, 0x511C }, { 0x994B, 0x511F }, 
-       { 0x994C, 0x5122 }, { 0x9950, 0x511E }, { 0x9951, 0x5120 }, { 0x9952, 0x5121 }, { 0x9955, 0x5123 }, { 0x9957, 0x1622 }, 
-       { 0x9996, 0x1C53 }, { 0x9997, 0x5124 }, { 0x9998, 0x5125 }, { 0x9999, 0x1941 }, { 0x99A5, 0x5126 }, { 0x99A8, 0x131E }, 
-       { 0x99AC, 0x272F }, { 0x99AD, 0x5127 }, { 0x99AE, 0x5128 }, { 0x99B3, 0x233A }, { 0x99B4, 0x264B }, { 0x99BC, 0x5129 }, 
-       { 0x99C1, 0x275D }, { 0x99C4, 0x222C }, { 0x99C5, 0x1138 }, { 0x99C6, 0x164E }, { 0x99C8, 0x164F }, { 0x99D0, 0x2353 }, 
-       { 0x99D1, 0x512E }, { 0x99D2, 0x1650 }, { 0x99D5, 0x124F }, { 0x99D8, 0x512D }, { 0x99DB, 0x512B }, { 0x99DD, 0x512C }, 
-       { 0x99DF, 0x512A }, { 0x99E2, 0x5138 }, { 0x99ED, 0x512F }, { 0x99EE, 0x5130 }, { 0x99F1, 0x5131 }, { 0x99F2, 0x5132 }, 
-       { 0x99F8, 0x5134 }, { 0x99FB, 0x5133 }, { 0x99FF, 0x1D39 }, { 0x9A01, 0x5135 }, { 0x9A05, 0x5137 }, { 0x9A0E, 0x1513 }, 
-       { 0x9A0F, 0x5136 }, { 0x9A12, 0x215B }, { 0x9A13, 0x1813 }, { 0x9A19, 0x5139 }, { 0x9A28, 0x222D }, { 0x9A2B, 0x513A }, 
-       { 0x9A30, 0x260D }, { 0x9A37, 0x513B }, { 0x9A3E, 0x5140 }, { 0x9A40, 0x513E }, { 0x9A42, 0x513D }, { 0x9A43, 0x513F }, 
-       { 0x9A45, 0x513C }, { 0x9A4D, 0x5142 }, { 0x9A55, 0x5141 }, { 0x9A57, 0x5144 }, { 0x9A5A, 0x1623 }, { 0x9A5B, 0x5143 }, 
-       { 0x9A5F, 0x5145 }, { 0x9A62, 0x5146 }, { 0x9A64, 0x5148 }, { 0x9A65, 0x5147 }, { 0x9A69, 0x5149 }, { 0x9A6A, 0x514B }, 
-       { 0x9A6B, 0x514A }, { 0x9AA8, 0x195C }, { 0x9AAD, 0x514C }, { 0x9AB0, 0x514D }, { 0x9AB8, 0x131C }, { 0x9ABC, 0x514E }, 
-       { 0x9AC0, 0x514F }, { 0x9AC4, 0x1F51 }, { 0x9ACF, 0x5150 }, { 0x9AD1, 0x5151 }, { 0x9AD3, 0x5152 }, { 0x9AD4, 0x5153 }, 
-       { 0x9AD8, 0x1942 }, { 0x9ADE, 0x5154 }, { 0x9ADF, 0x5155 }, { 0x9AE2, 0x5156 }, { 0x9AE3, 0x5157 }, { 0x9AE6, 0x5158 }, 
-       { 0x9AEA, 0x2811 }, { 0x9AEB, 0x515A }, { 0x9AED, 0x2906 }, { 0x9AEE, 0x515B }, { 0x9AEF, 0x5159 }, { 0x9AF1, 0x515D }, 
-       { 0x9AF4, 0x515C }, { 0x9AF7, 0x515E }, { 0x9AFB, 0x5201 }, { 0x9B06, 0x5202 }, { 0x9B18, 0x5203 }, { 0x9B1A, 0x5204 }, 
-       { 0x9B1F, 0x5205 }, { 0x9B22, 0x5206 }, { 0x9B23, 0x5207 }, { 0x9B25, 0x5208 }, { 0x9B27, 0x5209 }, { 0x9B28, 0x520A }, 
-       { 0x9B29, 0x520B }, { 0x9B2A, 0x520C }, { 0x9B2E, 0x520D }, { 0x9B2F, 0x520E }, { 0x9B31, 0x3D15 }, { 0x9B32, 0x520F }, 
-       { 0x9B3B, 0x4458 }, { 0x9B3C, 0x1514 }, { 0x9B41, 0x1301 }, { 0x9B42, 0x1A12 }, { 0x9B43, 0x5211 }, { 0x9B44, 0x5210 }, 
-       { 0x9B45, 0x2C05 }, { 0x9B4D, 0x5213 }, { 0x9B4E, 0x5214 }, { 0x9B4F, 0x5212 }, { 0x9B51, 0x5215 }, { 0x9B54, 0x2B42 }, 
-       { 0x9B58, 0x5216 }, { 0x9B5A, 0x155B }, { 0x9B6F, 0x2F05 }, { 0x9B74, 0x5217 }, { 0x9B83, 0x5219 }, { 0x9B8E, 0x101E }, 
-       { 0x9B91, 0x521A }, { 0x9B92, 0x2A0B }, { 0x9B93, 0x5218 }, { 0x9B96, 0x521B }, { 0x9B97, 0x521C }, { 0x9B9F, 0x521D }, 
-       { 0x9BA0, 0x521E }, { 0x9BA8, 0x521F }, { 0x9BAA, 0x2B4E }, { 0x9BAB, 0x1B0D }, { 0x9BAD, 0x1A5A }, { 0x9BAE, 0x210F }, 
-       { 0x9BB4, 0x5220 }, { 0x9BB9, 0x5223 }, { 0x9BC0, 0x5221 }, { 0x9BC6, 0x5224 }, { 0x9BC9, 0x1851 }, { 0x9BCA, 0x5222 }, 
-       { 0x9BCF, 0x5225 }, { 0x9BD1, 0x5226 }, { 0x9BD2, 0x5227 }, { 0x9BD4, 0x522B }, { 0x9BD6, 0x1B0A }, { 0x9BDB, 0x2244 }, 
-       { 0x9BE1, 0x522C }, { 0x9BE2, 0x5229 }, { 0x9BE3, 0x5228 }, { 0x9BE4, 0x522A }, { 0x9BE8, 0x173F }, { 0x9BF0, 0x5230 }, 
-       { 0x9BF1, 0x522F }, { 0x9BF2, 0x522E }, { 0x9BF5, 0x1013 }, { 0x9C04, 0x523A }, { 0x9C06, 0x5236 }, { 0x9C08, 0x5237 }, 
-       { 0x9C09, 0x5233 }, { 0x9C0A, 0x5239 }, { 0x9C0C, 0x5235 }, { 0x9C0D, 0x1342 }, { 0x9C10, 0x2F2C }, { 0x9C12, 0x5238 }, 
-       { 0x9C13, 0x5234 }, { 0x9C14, 0x5232 }, { 0x9C15, 0x5231 }, { 0x9C1B, 0x523C }, { 0x9C21, 0x523F }, { 0x9C24, 0x523E }, 
-       { 0x9C25, 0x523D }, { 0x9C2D, 0x2929 }, { 0x9C2E, 0x523B }, { 0x9C2F, 0x1053 }, { 0x9C30, 0x5240 }, { 0x9C32, 0x5242 }, 
-       { 0x9C39, 0x134F }, { 0x9C3A, 0x522D }, { 0x9C3B, 0x1117 }, { 0x9C3E, 0x5244 }, { 0x9C46, 0x5243 }, { 0x9C47, 0x5241 }, 
-       { 0x9C48, 0x230D }, { 0x9C52, 0x2B50 }, { 0x9C57, 0x2E3A }, { 0x9C5A, 0x5245 }, { 0x9C60, 0x5246 }, { 0x9C67, 0x5247 }, 
-       { 0x9C76, 0x5248 }, { 0x9C78, 0x5249 }, { 0x9CE5, 0x241B }, { 0x9CE7, 0x524A }, { 0x9CE9, 0x2817 }, { 0x9CEB, 0x524F }, 
-       { 0x9CEC, 0x524B }, { 0x9CF0, 0x524C }, { 0x9CF3, 0x2B11 }, { 0x9CF4, 0x2C24 }, { 0x9CF6, 0x2630 }, { 0x9D03, 0x5250 }, 
-       { 0x9D06, 0x5251 }, { 0x9D07, 0x261E }, { 0x9D08, 0x524E }, { 0x9D09, 0x524D }, { 0x9D0E, 0x120A }, { 0x9D12, 0x5259 }, 
-       { 0x9D15, 0x5258 }, { 0x9D1B, 0x1155 }, { 0x9D1F, 0x5256 }, { 0x9D23, 0x5255 }, { 0x9D26, 0x5253 }, { 0x9D28, 0x135B }, 
-       { 0x9D2A, 0x5252 }, { 0x9D2B, 0x1C12 }, { 0x9D2C, 0x1209 }, { 0x9D3B, 0x1943 }, { 0x9D3E, 0x525C }, { 0x9D3F, 0x525B }, 
-       { 0x9D41, 0x525A }, { 0x9D44, 0x5257 }, { 0x9D46, 0x525D }, { 0x9D48, 0x525E }, { 0x9D50, 0x5305 }, { 0x9D51, 0x5304 }, 
-       { 0x9D59, 0x5306 }, { 0x9D5C, 0x110D }, { 0x9D5D, 0x5301 }, { 0x9D5E, 0x5302 }, { 0x9D60, 0x1954 }, { 0x9D61, 0x2C19 }, 
-       { 0x9D64, 0x5303 }, { 0x9D6C, 0x2B12 }, { 0x9D6F, 0x530B }, { 0x9D72, 0x5307 }, { 0x9D7A, 0x530C }, { 0x9D87, 0x5309 }, 
-       { 0x9D89, 0x5308 }, { 0x9D8F, 0x173C }, { 0x9D9A, 0x530D }, { 0x9DA4, 0x530E }, { 0x9DA9, 0x530F }, { 0x9DAB, 0x530A }, 
-       { 0x9DAF, 0x5254 }, { 0x9DB2, 0x5310 }, { 0x9DB4, 0x2441 }, { 0x9DB8, 0x5314 }, { 0x9DBA, 0x5315 }, { 0x9DBB, 0x5313 }, 
-       { 0x9DC1, 0x5312 }, { 0x9DC2, 0x5318 }, { 0x9DC4, 0x5311 }, { 0x9DC6, 0x5316 }, { 0x9DCF, 0x5317 }, { 0x9DD3, 0x531A }, 
-       { 0x9DD9, 0x5319 }, { 0x9DE6, 0x531C }, { 0x9DED, 0x531D }, { 0x9DEF, 0x531E }, { 0x9DF2, 0x2F29 }, { 0x9DF8, 0x531B }, 
-       { 0x9DF9, 0x224B }, { 0x9DFA, 0x1A4D }, { 0x9DFD, 0x531F }, { 0x9E1A, 0x5320 }, { 0x9E1B, 0x5321 }, { 0x9E1E, 0x5322 }, 
-       { 0x9E75, 0x5323 }, { 0x9E78, 0x1814 }, { 0x9E79, 0x5324 }, { 0x9E7D, 0x5325 }, { 0x9E7F, 0x1C0F }, { 0x9E81, 0x5326 }, 
-       { 0x9E88, 0x5327 }, { 0x9E8B, 0x5328 }, { 0x9E8C, 0x5329 }, { 0x9E91, 0x532C }, { 0x9E92, 0x532A }, { 0x9E93, 0x2F1C }, 
-       { 0x9E95, 0x532B }, { 0x9E97, 0x2E4F }, { 0x9E9D, 0x532D }, { 0x9E9F, 0x2E3B }, { 0x9EA5, 0x532E }, { 0x9EA6, 0x275E }, 
-       { 0x9EA9, 0x532F }, { 0x9EAA, 0x5331 }, { 0x9EAD, 0x5332 }, { 0x9EB8, 0x5330 }, { 0x9EB9, 0x194D }, { 0x9EBA, 0x2C2D }, 
-       { 0x9EBB, 0x2B43 }, { 0x9EBC, 0x3657 }, { 0x9EBE, 0x3D40 }, { 0x9EBF, 0x2B5B }, { 0x9EC4, 0x120B }, { 0x9ECC, 0x5334 }, 
-       { 0x9ECD, 0x1530 }, { 0x9ECE, 0x5335 }, { 0x9ECF, 0x5336 }, { 0x9ED0, 0x5337 }, { 0x9ED2, 0x1955 }, { 0x9ED4, 0x5338 }, 
-       { 0x9ED8, 0x4034 }, { 0x9ED9, 0x2C3B }, { 0x9EDB, 0x2243 }, { 0x9EDC, 0x5339 }, { 0x9EDD, 0x533B }, { 0x9EDE, 0x533A }, 
-       { 0x9EE0, 0x533C }, { 0x9EE5, 0x533D }, { 0x9EE8, 0x533E }, { 0x9EEF, 0x533F }, { 0x9EF4, 0x5340 }, { 0x9EF6, 0x5341 }, 
-       { 0x9EF7, 0x5342 }, { 0x9EF9, 0x5343 }, { 0x9EFB, 0x5344 }, { 0x9EFC, 0x5345 }, { 0x9EFD, 0x5346 }, { 0x9F07, 0x5347 }, 
-       { 0x9F08, 0x5348 }, { 0x9F0E, 0x2504 }, { 0x9F13, 0x183D }, { 0x9F15, 0x534A }, { 0x9F20, 0x212D }, { 0x9F21, 0x534B }, 
-       { 0x9F2C, 0x534C }, { 0x9F3B, 0x2901 }, { 0x9F3E, 0x534D }, { 0x9F4A, 0x534E }, { 0x9F4B, 0x4317 }, { 0x9F4E, 0x4C3A }, 
-       { 0x9F4F, 0x504D }, { 0x9F52, 0x534F }, { 0x9F54, 0x5350 }, { 0x9F5F, 0x5352 }, { 0x9F60, 0x5353 }, { 0x9F61, 0x5354 }, 
-       { 0x9F62, 0x2E50 }, { 0x9F63, 0x5351 }, { 0x9F66, 0x5355 }, { 0x9F67, 0x5356 }, { 0x9F6A, 0x5358 }, { 0x9F6C, 0x5357 }, 
-       { 0x9F72, 0x535A }, { 0x9F76, 0x535B }, { 0x9F77, 0x5359 }, { 0x9F8D, 0x2E16 }, { 0x9F95, 0x535C }, { 0x9F9C, 0x535D }, 
-       { 0x9F9D, 0x4334 }, { 0x9FA0, 0x535E }, { 0xFF01, 0x010A }, { 0xFF03, 0x0154 }, { 0xFF04, 0x0150 }, { 0xFF05, 0x0153 }, 
-       { 0xFF06, 0x0155 }, { 0xFF08, 0x012A }, { 0xFF09, 0x012B }, { 0xFF0A, 0x0156 }, { 0xFF0B, 0x013C }, { 0xFF0C, 0x0104 }, 
-       { 0xFF0E, 0x0105 }, { 0xFF0F, 0x011F }, { 0xFF10, 0x0310 }, { 0xFF11, 0x0311 }, { 0xFF12, 0x0312 }, { 0xFF13, 0x0313 }, 
-       { 0xFF14, 0x0314 }, { 0xFF15, 0x0315 }, { 0xFF16, 0x0316 }, { 0xFF17, 0x0317 }, { 0xFF18, 0x0318 }, { 0xFF19, 0x0319 }, 
-       { 0xFF1A, 0x0107 }, { 0xFF1B, 0x0108 }, { 0xFF1C, 0x0143 }, { 0xFF1D, 0x0141 }, { 0xFF1E, 0x0144 }, { 0xFF1F, 0x0109 }, 
-       { 0xFF20, 0x0157 }, { 0xFF21, 0x0321 }, { 0xFF22, 0x0322 }, { 0xFF23, 0x0323 }, { 0xFF24, 0x0324 }, { 0xFF25, 0x0325 }, 
-       { 0xFF26, 0x0326 }, { 0xFF27, 0x0327 }, { 0xFF28, 0x0328 }, { 0xFF29, 0x0329 }, { 0xFF2A, 0x032A }, { 0xFF2B, 0x032B }, 
-       { 0xFF2C, 0x032C }, { 0xFF2D, 0x032D }, { 0xFF2E, 0x032E }, { 0xFF2F, 0x032F }, { 0xFF30, 0x0330 }, { 0xFF31, 0x0331 }, 
-       { 0xFF32, 0x0332 }, { 0xFF33, 0x0333 }, { 0xFF34, 0x0334 }, { 0xFF35, 0x0335 }, { 0xFF36, 0x0336 }, { 0xFF37, 0x0337 }, 
-       { 0xFF38, 0x0338 }, { 0xFF39, 0x0339 }, { 0xFF3A, 0x033A }, { 0xFF3B, 0x012E }, { 0xFF3D, 0x012F }, { 0xFF3E, 0x0110 }, 
-       { 0xFF3F, 0x0112 }, { 0xFF40, 0x010E }, { 0xFF41, 0x0341 }, { 0xFF42, 0x0342 }, { 0xFF43, 0x0343 }, { 0xFF44, 0x0344 }, 
-       { 0xFF45, 0x0345 }, { 0xFF46, 0x0346 }, { 0xFF47, 0x0347 }, { 0xFF48, 0x0348 }, { 0xFF49, 0x0349 }, { 0xFF4A, 0x034A }, 
-       { 0xFF4B, 0x034B }, { 0xFF4C, 0x034C }, { 0xFF4D, 0x034D }, { 0xFF4E, 0x034E }, { 0xFF4F, 0x034F }, { 0xFF50, 0x0350 }, 
-       { 0xFF51, 0x0351 }, { 0xFF52, 0x0352 }, { 0xFF53, 0x0353 }, { 0xFF54, 0x0354 }, { 0xFF55, 0x0355 }, { 0xFF56, 0x0356 }, 
-       { 0xFF57, 0x0357 }, { 0xFF58, 0x0358 }, { 0xFF59, 0x0359 }, { 0xFF5A, 0x035A }, { 0xFF5B, 0x0130 }, { 0xFF5C, 0x0123 }, 
-       { 0xFF5D, 0x0131 }, { 0xFFE3, 0x0111 }, { 0xFFE5, 0x014F }
-};
-
-unsigned ucs_to_jisx0208_table_size=6879;
-
-}
diff --git a/source/lexicalcast.cpp b/source/lexicalcast.cpp
deleted file mode 100644 (file)
index 5903bb1..0000000
+++ /dev/null
@@ -1,623 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include <cmath>
-#include <limits>
-#include "lexicalcast.h"
-
-using namespace std;
-
-namespace {
-
-using namespace Msp;
-
-template<typename T>
-struct IsSigned
-{ enum { result = !(static_cast<T>(-1)>0) }; };
-
-template<typename T, bool f = (sizeof(T)>sizeof(unsigned long))>
-struct Temporary
-{ typedef unsigned long Type; };
-
-template<typename T>
-struct Temporary<T, true>
-{
-#ifdef WIN32
-       typedef __int64 Type;
-#else
-       typedef unsigned long long Type;
-#endif
-};
-
-/* Helper to avoid warnings about an unsigned type never being < 0 */
-template<typename T, bool f = IsSigned<T>::result>
-struct IsNegative
-{ static bool eval(T v) { return v<0; } };
-
-template<typename T>
-struct IsNegative<T, false>
-{ static bool eval(T) { return false; } };
-
-/* Helper to avoid errors about ambiguous function calls since there are no
-overloads of abs for unsigned types */
-template<typename T, bool f = IsSigned<T>::result>
-struct Absolute
-{ static T eval(T v) { return v<0 ? -v : v; } };
-
-template<typename T>
-struct Absolute<T, false>
-{ static T eval(T v) { return v; } };
-
-
-/*** Integer conversions ***/
-
-const char udigits[] = "0123456789ABCDEF";
-const char ldigits[] = "0123456789abcdef";
-
-template<typename T>
-char *int_to_str(T v, const Fmt &f, char *end)
-{
-       if(f.get_type()==Fmt::CHAR)
-       {
-               *--end = v;
-               return end;
-       }
-
-       char *ptr = end;
-
-       // Find out the base to use
-       unsigned base = f.get_base();
-       if(!base)
-               base = 10;
-
-       // Format the number, starting from the least significant digit
-       const char *digits = (f.get_uppercase() ? udigits : ldigits);
-       if(v)
-       {
-               typename Temporary<T>::Type w = Absolute<T>::eval(v);
-               while(w)
-               {
-                       *--ptr = digits[w%base];
-                       w /= base;
-               }
-       }
-       else
-               *--ptr = digits[0];
-
-       char sign = (IsNegative<T>::eval(v) ? '-' : f.get_showpos() ? '+' : 0);
-       if(f.get_fill()=='0')
-       {
-               /* Zero-fill, taking base/sign size into account.  The expression is a
-               bit ugly, but saves having to write code for creating the prefix both
-               ways. */
-               unsigned pfxsize = ((f.get_showbase() && base!=10) ? base==8 ? 1 : 2 : 0) + (sign!=0);
-               for(unsigned i=(end-ptr)+pfxsize; i<f.get_width(); ++i)
-                       *--ptr = '0';
-       }
-
-       if(f.get_showbase() && v!=0)
-       {
-               // Add base indicator
-               if(base==2)
-                       *--ptr = (f.get_uppercase() ? 'B' : 'b');
-               else if(base==16)
-                       *--ptr = (f.get_uppercase() ? 'X' : 'x');
-               if(base!=10)
-                       *--ptr = '0';
-       }
-
-       if(sign)
-               *--ptr = sign;
-
-       return ptr;
-}
-
-template<typename T>
-string int_to_str(T v, const Fmt &f)
-{
-       unsigned size = max(f.get_width(), max<unsigned>(f.get_precision(), sizeof(T)*8+3));
-       char *buf = new char[size];
-       string result(int_to_str(v, f, buf+size), buf+size);
-       delete[] buf;
-       return result;
-}
-
-template<typename T>
-T str_to_int(const std::string &s, const Fmt &f)
-{
-       if(s.empty())
-               throw LexicalError("Empty input in integer conversion");
-
-       std::string::const_iterator i = s.begin();
-
-       // See if the input starts with a sign
-       bool neg = false;
-       if(*i=='-')
-       {
-               if(!IsSigned<T>::result)
-                       throw LexicalError("Negative sign in unsigned integer conversion");
-               neg = true;
-               ++i;
-       }
-       else if(*i=='+')
-               ++i;
-
-       // Must have some digits to convert
-       if(i==s.end())
-               throw LexicalError("Missing digits in integer conversion");
-
-       T base = f.get_base();
-       if(!base && i!=s.end())
-       {
-               // Automatic base detection requested, figure it out
-               if(*i=='0' && ++i!=s.end())
-               {
-                       if(*i=='x' || *i=='X')
-                       {
-                               base = 16;
-                               ++i;
-                       }
-                       else if(*i=='b' || *i=='B')
-                       {
-                               base = 2;
-                               ++i;
-                       }
-                       else
-                               base = 8;
-               }
-               else
-                       base = 10;
-       }
-
-       // Parse the digits
-       T result = 0;
-       for(; i!=s.end(); ++i)
-       {
-               T digit = base;
-               if(*i>='0' && *i<='9')
-                       digit = *i-'0';
-               else if(*i>='A' && *i<='F')
-                       digit = *i-'A'+10;
-               else if(*i>='a' && *i<='f')
-                       digit = *i-'a'+10;
-               if(digit>=base)
-                       throw LexicalError("Invalid digit in integer conversion");
-               T next = result*base+digit;
-               if(next/base!=result)
-                       throw LexicalError("Overflow in integer conversion");
-               result = next;
-       }
-
-       if(neg)
-               result = -result;
-
-       return result;
-}
-
-
-/*** Boolean conversions ***/
-
-string bool_to_str(bool b, const Fmt &f)
-{
-       if(f.get_type()==Fmt::STR)
-               return b ? "true" : "false";
-       else
-               return b ? "1" : "0";
-}
-
-bool str_to_bool(const string &s)
-{
-       if(s.empty())
-               throw LexicalError("Empty input in boolean conversion");
-
-       if(s=="1" || s=="true" || s=="yes" || s=="on")
-               return true;
-       else if(s=="0" || s=="false" || s=="no" || s=="off")
-               return false;
-
-       throw LexicalError("Invalid input in boolean conversion");
-}
-
-
-/*** Floating-point conversions ***/
-
-template<typename T>
-string flt_to_str(T v, const Fmt &f)
-{
-       if(f.get_type()==Fmt::CHAR)
-               throw LexicalError("Character format in floating-point conversion");
-
-       Fmt::FloatMode mode = f.get_floatmode();
-       long double w = abs(v);
-       char sign = (v<0 ? '-' : f.get_showpos() ? '+' : 0);
-
-       // Handle infinity and not-a-number as special cases
-       if(!(w+w>w) && w!=0)
-       {
-               string result;
-               if(sign)
-                       result += sign;
-               if(!(w>=0))
-                       result += (f.get_uppercase() ? "NAN" : "nan");
-               else
-                       result += (f.get_uppercase() ? "INF" : "inf");
-               if(result.size()<f.get_width())
-                       result = string(f.get_width()-result.size(), ' ')+result;
-               return result;
-       }
-
-       /* Find out the base-10 exponent.  Building up the multiplier / divisor
-       first helps with accuracy in some cases. */
-       int exp = 0;
-       if(w>=10)
-       {
-               long double div = 1;
-               while(div*10<w)
-               {
-                       ++exp;
-                       div *= 10;
-               }
-               w /= div;
-       }
-       else if(mode!=Fmt::FIXED && w<1 && w!=0)
-       {
-               long double mul = 1;
-               while(w*mul<1)
-               {
-                       --exp;
-                       mul *= 10;
-               }
-               w *= mul;
-       }
-
-       // Decide how to format the number
-       unsigned digits;
-       unsigned point = 1;
-       bool showexp = false;
-       if(mode==Fmt::FIXED)
-       {
-               point = exp+1;
-               digits = point+f.get_precision();
-       }
-       else if(mode==Fmt::SCI)
-       {
-               digits = f.get_precision()+1;
-               showexp = true;
-       }
-       else
-       {
-               digits = max(f.get_precision(), 1U);
-               if(exp<-4 || exp>=static_cast<int>(digits))
-               {
-                       point = 1;
-                       showexp = true;
-               }
-               else
-               {
-                       point = max(exp, 0)+1;
-                       if(exp<0)
-                               digits += -exp;
-               }
-       }
-
-       // Apply rounding
-       w += 5.0l/pow(10.0l, static_cast<long double>(digits));
-       if(w>10)
-       {
-               // Rounding bumped us to the next exponent, deal with it
-               w /= 10;
-               if(mode==Fmt::AUTOFLT && exp+1==static_cast<int>(digits))
-               {
-                       point = 1;
-                       showexp = true;
-               }
-               if(!showexp)
-               {
-                       ++digits;
-                       ++point;
-               }
-               else
-                       ++exp;
-       }
-
-       // Create a buffer and start from the end
-       unsigned size = max(f.get_width(), digits+8);
-       char *buf = new char[size];
-       char *end = buf+size;
-       char *ptr = end;
-
-       // Format exponent
-       if(showexp)
-       {
-               ptr = int_to_str(exp, Fmt().showpos().fill('0').width(3), ptr);
-               *--ptr = (f.get_uppercase() ? 'E' : 'e');
-       }
-
-       // Format mantissa left-to-right
-       char *eptr = ptr;
-       ptr -= digits+(point<digits || f.get_showpoint());
-       char *mptr = ptr;
-       for(unsigned i=0; i<digits; ++i)
-       {
-               if(i==point)
-                       *mptr++ = '.';
-               if(showexp || static_cast<int>(i)>=-exp)
-               {
-                       int digit = static_cast<int>(w);
-                       *mptr++ = '0'+digit;
-                       w = (w-digit)*10;
-               }
-               else
-                       *mptr++ = '0';
-       }
-
-       if(f.get_showpoint())
-       {
-               // Radix point requested but not displayed yet, add it
-               if(digits<=point)
-                       *mptr++ = '.';
-       }
-       else if(mode==Fmt::AUTOFLT && digits>point)
-       {
-               // Remove trailing zeroes from fraction and a lone radix point
-               while(mptr[-1]=='0')
-                       --mptr;
-               if(mptr[-1]=='.')
-                       --mptr;
-               if(mptr!=eptr)
-               {
-                       while(mptr!=ptr)
-                               *--eptr = *--mptr;
-                       ptr = eptr;
-               }
-       }
-
-       // Add filling and sign
-       if(f.get_fill()=='0')
-       {
-               unsigned pfxlen = (sign!=0);
-               while(end-ptr+pfxlen<f.get_width())
-                       *--ptr = '0';
-       }
-       if(sign)
-               *--ptr = sign;
-
-       string result(ptr, end);
-       delete[] buf;
-       return result;
-}
-
-template<typename T>
-T str_to_flt(const string &s, const Fmt &)
-{
-       if(s.empty())
-               throw LexicalError("Empty input in floating-point conversion");
-
-       std::string::const_iterator i = s.begin();
-
-       // See if the input starts with a sign
-       bool neg = false;
-       if(*i=='-')
-       {
-               neg = true;
-               ++i;
-       }
-       else if(*i=='+')
-               ++i;
-
-       // Must have some digits to convert
-       if(i==s.end())
-               throw LexicalError("Missing digits in floating-point conversion");
-
-       long double v = 0;
-       int exp = 0;
-
-       // Parse mantissa
-       bool point_seen = false;
-       for(; i!=s.end(); ++i)
-       {
-               if(*i=='.')
-               {
-                       if(point_seen)
-                               throw LexicalError("Extra point in floating-point conversion");
-                       point_seen = true;
-               }
-               else if(*i>='0' && *i<='9')
-               {
-                       v = v*10+(*i-'0');
-                       if(point_seen)
-                               --exp;
-               }
-               else if(*i=='e' || *i=='E')
-               {
-                       // We have an exponent
-                       ++i;
-
-                       exp += str_to_int<int>(string(i, s.end()), Fmt());
-                       // str_to_int has eaten the rest of the input or thrown
-                       break;
-               }
-               else
-                       throw LexicalError("Invalid digit in floating-point conversion");
-       }
-
-       // Scale and negate the result as needed
-       while(exp>0)
-       {
-               v *= 10;
-               --exp;
-       }
-       while(exp<0)
-       {
-               v /= 10;
-               ++exp;
-       }
-
-       if(neg)
-               v = -v;
-
-       return v;
-}
-
-
-/*** String conversions ***/
-
-string str_to_str(const string &s, const Fmt &f)
-{
-       if(f.get_type()==Fmt::NUM)
-               throw LexicalError("Numeric format in string conversion");
-       return s;
-}
-
-}
-
-namespace Msp {
-
-void LexicalConverter::result(const string &s)
-{
-       if(s.size()<fmt.get_width())
-       {
-               if(fmt.get_align()==Fmt::RIGHT)
-                       buf = string(fmt.get_width()-s.size(), fmt.get_fill())+s;
-               else
-                       buf = s+string(fmt.get_width()-s.size(), fmt.get_fill());
-       }
-       else
-               buf = s;
-}
-
-
-/*** operator<< ***/
-
-void operator<<(LexicalConverter &c, char v)
-{
-       Fmt::Type type = c.get_fmt().get_type();
-       if(type==Fmt::NUM)
-               c.result(int_to_str(v, c.get_fmt()));
-       else
-               c.result(string(1, v));
-}
-
-void operator<<(LexicalConverter &c, signed char v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, short v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, int v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, long v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, unsigned char v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, unsigned short v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, unsigned v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, unsigned long v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-#ifdef __GNUC__
-void operator<<(LexicalConverter &c, long long v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, unsigned long long v)
-{ c.result(int_to_str(v, c.get_fmt())); }
-#endif
-
-void operator<<(LexicalConverter &c, bool v)
-{ c.result(bool_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, float v)
-{ c.result(flt_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, double v)
-{ c.result(flt_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, long double v)
-{ c.result(flt_to_str(v, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, const string &s)
-{ c.result(str_to_str(s, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, const char *s)
-{ c.result(str_to_str(s, c.get_fmt())); }
-
-void operator<<(LexicalConverter &c, const void *p)
-{ c.result(int_to_str(reinterpret_cast<unsigned long>(p), c.get_fmt())); }
-
-
-/*** operator>> ***/
-
-void operator>>(const LexicalConverter &c, char &v)
-{
-       if(c.get_fmt().get_type()==Fmt::NUM)
-               v = str_to_int<char>(c.get(), c.get_fmt());
-       else
-       {
-               const std::string &s = c.get();
-               if(s.empty())
-                       throw LexicalError("Empty input in character conversion");
-               if(s.size()>1)
-                       throw LexicalError("Extra input in character conversion");
-               v = s[0];
-       }
-}
-
-void operator>>(const LexicalConverter &c, signed char &v)
-{ v = str_to_int<signed char>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, short &v)
-{ v = str_to_int<short>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, int &v)
-{ v = str_to_int<int>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, long &v)
-{ v = str_to_int<long>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, unsigned char &v)
-{ v = str_to_int<unsigned char>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, unsigned short &v)
-{ v = str_to_int<unsigned short>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, unsigned int &v)
-{ v = str_to_int<unsigned int>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, unsigned long &v)
-{ v = str_to_int<unsigned long>(c.get(), c.get_fmt()); }
-
-#ifdef __GNUC__
-void operator>>(const LexicalConverter &c, long long &v)
-{ v = str_to_int<long long>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, unsigned long long &v)
-{ v = str_to_int<unsigned long long>(c.get(), c.get_fmt()); }
-#endif
-
-void operator>>(const LexicalConverter &c, bool &v)
-{ v = str_to_bool(c.get()); }
-
-void operator>>(const LexicalConverter &c, float &v)
-{ v = str_to_flt<float>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, double &v)
-{ v = str_to_flt<double>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, long double &v)
-{ v = str_to_flt<long double>(c.get(), c.get_fmt()); }
-
-void operator>>(const LexicalConverter &c, string &s)
-{ s = str_to_str(c.get(), c.get_fmt()); }
-
-} // namespace Msp
diff --git a/source/lexicalcast.h b/source/lexicalcast.h
deleted file mode 100644 (file)
index 3bfc342..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_LEXICALCAST_H_
-#define MSP_STRINGS_LEXICALCAST_H_
-
-#include <sstream>
-#include <string>
-#include <msp/core/except.h>
-#include "fmt.h"
-
-namespace Msp {
-
-/**
-Thrown for errors in lexical conversions
-*/
-class LexicalError: public Exception
-{
-public:
-       LexicalError(const std::string &w_): Exception(w_) { }
-};
-
-
-/**
-Helper class for lexical_cast to facilitate operator overloading.
-*/
-class LexicalConverter
-{
-private:
-       Fmt fmt;
-       std::string buf;
-
-public:
-       LexicalConverter(const Fmt &f): fmt(f) { }
-       LexicalConverter(const std::string &s, const Fmt &f): fmt(f), buf(s) { }
-
-       const Fmt &get_fmt() const { return fmt; }
-       const std::string &get() const { return buf; }
-       void result(const std::string &);
-};
-
-
-void operator<<(LexicalConverter &, char);
-void operator<<(LexicalConverter &, signed char);
-void operator<<(LexicalConverter &, short);
-void operator<<(LexicalConverter &, int);
-void operator<<(LexicalConverter &, long);
-void operator<<(LexicalConverter &, unsigned char);
-void operator<<(LexicalConverter &, unsigned short);
-void operator<<(LexicalConverter &, unsigned);
-void operator<<(LexicalConverter &, unsigned long);
-#ifdef __GNUC__
-void operator<<(LexicalConverter &, long long);
-void operator<<(LexicalConverter &, unsigned long long);
-#endif
-void operator<<(LexicalConverter &, bool);
-void operator<<(LexicalConverter &, float);
-void operator<<(LexicalConverter &, double);
-void operator<<(LexicalConverter &, long double);
-void operator<<(LexicalConverter &, const std::string &);
-void operator<<(LexicalConverter &, const char *);
-void operator<<(LexicalConverter &, const void *);
-
-void operator>>(const LexicalConverter &, char &);
-void operator>>(const LexicalConverter &, signed char &);
-void operator>>(const LexicalConverter &, short &);
-void operator>>(const LexicalConverter &, int &);
-void operator>>(const LexicalConverter &, long &);
-void operator>>(const LexicalConverter &, unsigned char &);
-void operator>>(const LexicalConverter &, unsigned short &);
-void operator>>(const LexicalConverter &, unsigned int &);
-void operator>>(const LexicalConverter &, unsigned long &);
-#ifdef __GNUC__
-void operator>>(const LexicalConverter &, long long &);
-void operator>>(const LexicalConverter &, unsigned long long &);
-#endif
-void operator>>(const LexicalConverter &, bool &);
-void operator>>(const LexicalConverter &, float &);
-void operator>>(const LexicalConverter &, double &);
-void operator>>(const LexicalConverter &, long double &);
-void operator>>(const LexicalConverter &, std::string &);
-
-// Generic operators using stringstream
-
-template<typename T>
-void operator<<(LexicalConverter &c, const T &v)
-{
-       std::ostringstream ss;
-       ss<<c.get_fmt()<<v;
-       c.result(ss.str());
-}
-
-template<typename T>
-void operator>>(const LexicalConverter &c, T &v)
-{
-       std::istringstream ss(c.get());
-       ss.setf(std::ios_base::fmtflags(0), std::ios_base::skipws);
-       ss>>v;
-       if(ss.fail() || !ss.eof())
-               throw LexicalError("Conversion failure");
-}
-
-// The main interface to the lexical conversion machinery
-
-template<typename T>
-inline T lexical_cast(const std::string &s, const Fmt &f = Fmt())
-{
-       LexicalConverter conv(s, f);
-       T result;
-       conv>>result;
-       return result;
-}
-
-template<typename T>
-inline std::string lexical_cast(const T &v, const Fmt &f = Fmt())
-{
-       LexicalConverter conv(f);
-       conv<<v;
-       return conv.get();
-}
-
-} // namespace Msp
-
-#endif
diff --git a/source/regex.cpp b/source/regex.cpp
deleted file mode 100644 (file)
index f45c820..0000000
+++ /dev/null
@@ -1,589 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include <stack>
-#include <limits>
-#include <msp/core/except.h>
-#include "formatter.h"
-#include "regex.h"
-
-using namespace std;
-
-namespace {
-
-/** Writes an integer to a Regex code string, in little-endian order. */
-template<typename T>
-void write_int(T n, Msp::Regex::Code &code)
-{
-       for(unsigned i=0; i<sizeof(T); ++i)
-               code += (n>>i*8)&0xFF;
-}
-
-/** Reads an integer from a Regex code stream, in little-endian order. */
-template<typename T>
-T read_int(Msp::Regex::Code::const_iterator &c)
-{
-       T result = 0;
-       for(unsigned i=0; i<sizeof(T); ++i)
-               result += static_cast<unsigned char>(*c++)<<i*8;
-       return result;
-}
-
-}
-
-
-namespace Msp {
-
-Regex::Regex(const string &expr)
-{
-       n_groups = 0;
-       string::const_iterator iter = expr.begin();
-       code = compile(expr, iter, n_groups, false);
-       ++n_groups;
-}
-
-Regex::Code Regex::compile(const string &expr, string::const_iterator &iter, unsigned &group, bool branch)
-{
-       bool has_branches = false;
-       unsigned level = 0;
-       bool escape = false;
-       unsigned bracket = 0;
-       string::const_iterator end;
-       for(end=iter; end!=expr.end(); ++end)
-       {
-               if(escape)
-                       escape = false;
-               else if(bracket)
-               {
-                       if(bracket==3 && *end==']')
-                               bracket = 0;
-                       else if(bracket==1 && *end=='^')
-                               bracket = 2;
-                       else
-                               bracket = 3;
-               }
-               else if(*end=='\\')
-                       escape = true;
-               else if(*end=='(')
-                       ++level;
-               else if(*end==')')
-               {
-                       if(level==0)
-                       {
-                               if(group==0)
-                                       throw InvalidParameterValue("Unexpected )");
-                               else
-                                       break;
-                       }
-                       --level;
-               }
-               else if(*end=='|' && level==0)
-               {
-                       if(branch)
-                               break;
-                       else
-                               has_branches = true;
-               }
-               else if(*end=='[')
-                       bracket = 1;
-       }
-
-       if(level>0)
-               throw InvalidParameterValue("Unmatched (");
-
-       Code result;
-
-       unsigned this_group = group;
-       if(!branch)
-       {
-               result += GROUP_BEGIN;
-               write_int<Index>(this_group, result);
-       }
-
-       const unsigned jump_size = 1+sizeof(Offset);
-
-       if(!has_branches)
-       {
-               for(string::const_iterator i=iter; i!=end;)
-               {
-                       Code atom = parse_atom(expr, i, group);
-
-                       Count repeat_min = 1;
-                       Count repeat_max = 1;
-                       parse_repeat(i, repeat_min, repeat_max);
-
-                       for(unsigned j=0; j<repeat_min; ++j)
-                               result += atom;
-                       if(repeat_max==numeric_limits<Count>::max())
-                       {
-                               if(repeat_min==0)
-                               {
-                                       result += ND_JUMP;
-                                       write_int<Offset>(atom.size()+jump_size, result);
-                                       result += atom;
-                               }
-                               result += ND_JUMP;
-                               write_int<Offset>(-(atom.size()+jump_size), result);
-                       }
-                       else if(repeat_max>repeat_min)
-                       {
-                               for(unsigned j=repeat_min; j<repeat_max; ++j)
-                               {
-                                       result += ND_JUMP;
-                                       write_int<Offset>((repeat_max-j)*(atom.size()+jump_size)-jump_size, result);
-                                       result += atom;
-                               }
-                       }
-               }
-       }
-       else
-       {
-               list<Code> branches;
-               for(string::const_iterator i=iter;;)
-               {
-                       branches.push_back(compile(expr, i, group, true));
-                       if(i==end)
-                               break;
-                       ++i;
-               }
-
-               unsigned n_branches = branches.size();
-
-               Offset offset = (n_branches-1)*jump_size+branches.front().size();
-               for(list<Code>::iterator i=++branches.begin(); i!=branches.end(); ++i)
-               {
-                       result += ND_JUMP;
-                       write_int<Offset>(offset, result);
-                       offset += i->size();
-               }
-
-               for(list<Code>::iterator i=branches.begin(); i!=branches.end();)
-               {
-                       result += *i;
-                       offset -= i->size()+jump_size;
-                       ++i;
-                       if(i!=branches.end())
-                       {
-                               result += JUMP;
-                               write_int<Offset>(offset, result);
-                       }
-               }
-       }
-
-       if(!branch)
-       {
-               result += GROUP_END;
-               write_int<Index>(this_group, result);
-       }
-
-       iter = end;
-
-       return result;
-}
-
-Regex::Code Regex::parse_atom(const string &expr, string::const_iterator &i, unsigned &group)
-{
-       Code result;
-
-       if(i==expr.end())
-               return result;
-
-       bool flag = false;
-       if(*i=='\\')
-       {
-               if(++i==expr.end())
-                       throw InvalidParameterValue("Stray backslash");
-               flag = true;
-       }
-
-       if(!flag)
-       {
-               if(*i=='*' || *i=='{' || *i=='}' || *i=='+' || *i=='?' || *i=='|' || *i==')')
-                       throw InvalidParameterValue("Invalid atom");
-               else if(*i=='[')
-                       return parse_brackets(expr, i);
-               else if(*i=='.')
-                       result += MATCH_ANY;
-               else if(*i=='^')
-                       result += MATCH_BEGIN;
-               else if(*i=='$')
-                       result += MATCH_END;
-               else if(*i=='(')
-               {
-                       ++group;
-                       result = compile(expr, ++i, group, false);
-               }
-               else
-                       flag = true;
-       }
-
-       if(flag)
-       {
-               result += MATCH_CHAR;
-               result += *i;
-       }
-
-       ++i;
-
-       return result;
-}
-
-bool Regex::parse_repeat(string::const_iterator &i, Count &rmin, Count &rmax)
-{
-       if(*i!='*' && *i!='+' && *i!='?' && *i!='{')
-               return false;
-
-       if(*i=='*' || *i=='+')
-               rmax = numeric_limits<Count>::max();
-       if(*i=='*' || *i=='?')
-               rmin = 0;
-       if(*i=='{')
-       {
-               rmin = 0;
-               for(++i; isdigit(*i); ++i)
-                       rmin = rmin*10+(*i-'0');
-
-               if(*i==',')
-               {
-                       ++i;
-                       if(*i!='}')
-                       {
-                               rmax = 0;
-                               for(; isdigit(*i); ++i)
-                                       rmax = rmax*10+(*i-'0');
-                               if(rmax<rmin)
-                                       throw InvalidParameterValue("Invalid bound");
-                       }
-                       else
-                               rmax = numeric_limits<Count>::max();
-               }
-               else
-                       rmax = rmin;
-               if(*i!='}')
-                       throw InvalidParameterValue("Invalid bound");
-       }
-
-       ++i;
-
-       return true;
-}
-
-Regex::Code Regex::parse_brackets(const string &str, string::const_iterator &iter)
-{
-       Code result;
-
-       ++iter;
-       bool neg = false;
-       if(*iter=='^')
-       {
-               neg = true;
-               ++iter;
-       }
-
-       string::const_iterator end = iter;
-       for(; (end!=str.end() && (end==iter || *end!=']')); ++end) ;
-       if(end==str.end())
-               throw InvalidParameterValue("Unmatched '['");
-
-       unsigned char mask[32] = {0};
-       unsigned type = 0;
-       bool range = false;
-       unsigned char first=0, last = 0;
-       for(string::const_iterator i=iter; i!=end; ++i)
-       {
-               unsigned char c = *i;
-               if(range)
-               {
-                       last = c;
-                       for(unsigned j=first; j<=c; ++j)
-                               mask[j>>3] |= 1<<(j&7);
-                       range = false;
-                       if(type<2)
-                               type = 2;
-               }
-               else if(c=='-' && i!=iter && end-i>1)
-                       range = true;
-               else
-               {
-                       first = c;
-                       mask[c>>3] |= 1<<(c&7);
-                       if(type==0)
-                               type = 1;
-                       else
-                               type = 3;
-               }
-       }
-
-       if(neg)
-               result += NEGATE;
-
-       if(type==1)
-       {
-               result += MATCH_CHAR;
-               result += first;
-       }
-       else if(type==2)
-       {
-               result += MATCH_RANGE;
-               result += first;
-               result += last;
-       }
-       else
-       {
-               result += MATCH_MASK;
-               result.append(reinterpret_cast<char *>(mask), 32);
-       }
-
-       iter = end;
-       ++iter;
-
-       return result;
-}
-
-RegMatch Regex::match(const string &str) const
-{
-       RegMatch::GroupArray groups(n_groups);
-
-       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
-               if(run(str, i, groups))
-                       return RegMatch(str, groups);
-
-       return RegMatch();
-}
-
-bool Regex::run(const string &str, const string::const_iterator &begin, RegMatch::GroupArray &groups) const
-{
-       bool result = false;
-       list<RunContext> ctx;
-       ctx.push_back(RunContext());
-       ctx.front().citer = code.begin();
-       ctx.front().groups.resize(groups.size());
-
-       for(string::const_iterator i=begin;;)
-       {
-               int c;
-               if(i!=str.end())
-                       c = static_cast<unsigned char>(*i);
-               else
-                       c = -1;
-
-               for(list<RunContext>::iterator j=ctx.begin(); j!=ctx.end();)
-               {
-                       bool terminate = false;
-                       bool negate_match = false;
-                       for(; j->citer!=code.end();)
-                       {
-                               Instruction instr = static_cast<Instruction>(*j->citer++);
-
-                               if(instr==NEGATE)
-                                       negate_match = true;
-                               else if(instr==JUMP)
-                               {
-                                       Offset offset = read_int<Offset>(j->citer);
-                                       j->citer += offset;
-                               }
-                               else if(instr==ND_JUMP)
-                               {
-                                       Offset offset = read_int<Offset>(j->citer);
-                                       ctx.push_back(*j);
-                                       ctx.back().citer += offset;
-                               }
-                               else if(instr==GROUP_BEGIN)
-                               {
-                                       Index n = read_int<Index>(j->citer);
-                                       if(!j->groups[n].match)
-                                               j->groups[n].begin = i-str.begin();
-                               }
-                               else if(instr==GROUP_END)
-                               {
-                                       Index n = read_int<Index>(j->citer);
-                                       if(!j->groups[n].match)
-                                       {
-                                               j->groups[n].match = true;
-                                               j->groups[n].end = i-str.begin();
-                                               j->groups[n].length = j->groups[n].end-j->groups[n].begin;
-                                       }
-
-                                       if(n==0)
-                                       {
-                                               result = true;
-                                               bool better = false;
-                                               for(unsigned k=0; (k<groups.size() && !better); ++k)
-                                               {
-                                                       better = group_compare(j->groups[k], groups[k]);
-                                                       if(group_compare(groups[k], j->groups[k]))
-                                                               break;
-                                               }
-                                               if(better)
-                                                       groups = j->groups;
-                                       }
-                               }
-                               else
-                               {
-                                       bool match_result = false;
-                                       bool input_consumed = false;
-                                       if(instr==MATCH_BEGIN)
-                                               match_result = (i==str.begin());
-                                       else if(instr==MATCH_END)
-                                               match_result = (i==str.end());
-                                       else if(instr==MATCH_CHAR)
-                                       {
-                                               match_result = (c==*j->citer++);
-                                               input_consumed = true;
-                                       }
-                                       else if(instr==MATCH_RANGE)
-                                       {
-                                               unsigned char first = *j->citer++;
-                                               unsigned char last = *j->citer++;
-                                               match_result = (c>=first && c<=last);
-                                               input_consumed = true;
-                                       }
-                                       else if(instr==MATCH_MASK)
-                                       {
-                                               if(c>=0 && c<=0xFF)
-                                               {
-                                                       unsigned char m = *(j->citer+(c>>3));
-                                                       match_result = m&(1<<(c&7));
-                                               }
-                                               input_consumed = true;
-                                               j->citer += 32;
-                                       }
-                                       else if(instr==MATCH_ANY)
-                                       {
-                                               match_result = true;
-                                               input_consumed = true;
-                                       }
-                                       else
-                                               throw Exception("Invalid instruction");
-
-                                       if(match_result==negate_match)
-                                               terminate = true;
-                                       negate_match = false;
-
-                                       if(input_consumed || terminate)
-                                               break;
-                               }
-                       }
-
-                       if(terminate || j->citer==code.end())
-                               j = ctx.erase(j);
-                       else
-                               ++j;
-               }
-
-               if(i==str.end() || ctx.empty())
-                       break;
-               ++i;
-       }
-
-       return result;
-}
-
-bool Regex::group_compare(const RegMatch::Group &g1, const RegMatch::Group &g2) const
-{
-       if(!g1.match)
-               return false;
-
-       // Any match is better than no match
-       if(!g2.match)
-               return true;
-
-       // Earlier match is better
-       if(g1.begin<g2.begin)
-               return true;
-       if(g2.begin>g2.begin)
-               return false;
-
-       // Longer match at same position is better
-       return g1.end>g2.end;
-}
-
-string Regex::disassemble() const
-{
-       ostringstream ss;
-
-       for(Code::const_iterator i=code.begin(); i!=code.end();)
-       {
-               Code::const_iterator j = i;
-               Offset offset = i-code.begin();
-               string decompiled = disassemble_instruction(i);
-               string bytes;
-               for(; j!=i; ++j)
-                       bytes += format(" %02X", static_cast<int>(*j)&0xFF);
-               ss<<Fmt("%3d")<<offset<<':'<<Fmt("%-9s")<<bytes;
-               if(bytes.size()>9)
-                       ss<<"\n"<<Fmt("%15s");
-               ss<<"  "<<decompiled<<'\n';
-       }
-
-       return ss.str();
-}
-
-string Regex::disassemble_instruction(Code::const_iterator &i) const
-{
-       Instruction instr = static_cast<Instruction>(*i++);
-
-       ostringstream result;
-       switch(instr)
-       {
-       case JUMP:
-               {
-                       Offset offset = read_int<Offset>(i);
-                       result<<"JUMP "<<Fmt("%+d")<<offset<<" ("<<Fmt("%d")<<i-code.begin()+offset<<')';
-               }
-               break;
-       case ND_JUMP:
-               {
-                       Offset offset = read_int<Offset>(i);
-                       result<<"ND_JUMP "<<Fmt("%+d")<<offset<<" ("<<Fmt("%d")<<i-code.begin()+offset<<')';
-               }
-               break;
-       case GROUP_BEGIN:
-               result<<"GROUP_BEGIN "<<read_int<Index>(i);
-               break;
-       case GROUP_END:
-               result<<"GROUP_END "<<read_int<Index>(i);
-               break;
-       case NEGATE:
-               result<<"NEGATE";
-               break;
-       case MATCH_BEGIN:
-               result<<"MATCH_BEGIN";
-               break;
-       case MATCH_END:
-               result<<"MATCH_END";
-               break;
-       case MATCH_CHAR:
-               {
-                       char c = *i++;
-                       result<<"MATCH_CHAR ";
-                       if(c>=0x20 && c<=0x7E)
-                               result<<'\''<<c<<'\'';
-                       else
-                               result<<(static_cast<int>(c)&0xFF);
-               }
-               break;
-       case MATCH_RANGE:
-               result<<"MATCH_RANGE "<<(static_cast<int>(*i++)&0xFF);
-               result<<'-'<<(static_cast<int>(*i++)&0xFF);
-               break;
-       case MATCH_MASK:
-               result<<"MATCH_MASK";
-               for(unsigned j=0; j<32; ++j)
-                       result<<' '<<Fmt("%02X")<<(static_cast<int>(*i++)&0xFF);
-               break;
-       case MATCH_ANY:
-               result<<"MATCH_ANY";
-               break;
-       default:
-               result<<"UNKNOWN "<<instr;
-       }
-
-       return result.str();
-}
-
-} // namespace Msp
diff --git a/source/regex.h b/source/regex.h
deleted file mode 100644 (file)
index 70f9ebb..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-#ifndef MSP_STRINGS_REGEX_H_
-#define MSP_STRINGS_REGEX_H_
-
-#include <string>
-#include "regmatch.h"
-
-namespace Msp {
-
-/**
-This class provides regular expression matching.  It supports a subset of
-POSIX.2 extended regex syntax.  Character classes, equivalence classes and
-collating elements are not supported.  Refer to the regex(7) manpage for more
-details.
-
-A description of the internal workings of the class follows.  You may skip this
-if you are not a developer or otherwise interested.
-
-The core of this class is a virtual machine running a non-deterministic finite
-automaton (NFA).  The state of the automaton is represented by an iterator into
-the code.  Transitions between states are represented by instructions.
-Instructions may take multiple bytes, so a valid code iterator may not be a
-valid NFA state.
-
-The virtual machine may have any number of execution contexts at any one time.
-On every cycle, each context is advanced until an input-consuming instruction
-is encountered, keeping the input positions in sync with each other.  Execution
-continues as long as there's at least one context remaining.
-
-The GROUP_BEGIN and GROUP_END instructions record the begin and end offset of a
-match group, respectively.  The GROUP_END instruction also marks the group as
-successfully matched.  If the target group was already matched, these
-instructions do nothing.
-
-The JUMP instruction causes the execution iterator to be modified by an offset.
-
-The ND_JUMP instruction causes the execution context to be split in two.  One
-continues directly after the instruction and the other continues at an offset.
-
-The NEGATE instruction causes the result of the next match instruction to be
-negated.
-
-Match instructions compare the input against a condition.  If the match
-succeeds, execution continues at the next instruction.  If the match fails,
-execution of that context is terminated.
-
-The MATCH_BEGIN and MATCH_END instructions match the beginning and end of
-the input string, respectively.  They do not consume input.
-
-The MATCH_CHAR instruction consumes the input character and matches it against
-a single character.  Since regexes often match sequences of printable character,
-a match for a non-opcode character may be encoded as the character itself.
-
-The MATCH_RANGE instruction consumes the input character and matches it against
-an inclusive character range.
-
-The MATCH_MASK instruction consumes the input character and matches it against
-a bitmask.
-
-The MATCH_ANY instruction consumes the input character and always succeeds.
-*/
-class Regex
-{
-private:
-       typedef std::string Code;
-       typedef unsigned short Count;
-       typedef short Offset;
-       typedef unsigned short Index;
-
-       enum Instruction
-       {
-               FIRST_INSTRUCTION_ = 0,
-
-               JUMP,
-               ND_JUMP,
-
-               GROUP_BEGIN,
-               GROUP_END,
-
-               NEGATE,
-
-               MATCH_BEGIN,
-               MATCH_END,
-               MATCH_CHAR,
-               MATCH_RANGE,
-               MATCH_MASK,
-               MATCH_ANY,
-
-               LAST_INSTRUCTION_ = 31
-       };
-
-       struct RunContext
-       {
-               Code::const_iterator citer;
-               RegMatch::GroupArray groups;
-       };
-
-       Code code;
-       unsigned n_groups;
-
-public:
-       /** Constructs a new Regex object from a string representation. */
-       Regex(const std::string &expr);
-
-private:
-       /** Compiles a regular expression into NFA bytecode.  , 2011The iterator will be
-       advanced to the first unused character in the string. */
-       Code compile(const std::string &expr, std::string::const_iterator &iter, unsigned &group, bool branch);
-
-       Code parse_atom(const std::string &, std::string::const_iterator &i, unsigned &);
-       Code parse_brackets(const std::string &, std::string::const_iterator &);
-       bool parse_repeat(std::string::const_iterator &, Count &, Count &);
-
-public:
-       /** Matches the regex against a string.  Refer to RegMatch documentation for
-       more information on the resulting object. */
-       RegMatch match(const std::string &str) const;
-
-private:
-       bool run(const std::string &, const std::string::const_iterator &, RegMatch::GroupArray &) const;
-       bool group_compare(const RegMatch::Group &, const RegMatch::Group &) const;
-
-public:
-       /** Returns a disassembled representation of the NFA bytecode.  For debugging
-       purposes. */
-       std::string disassemble() const;
-private:
-       std::string disassemble_instruction(Code::const_iterator &) const;
-};
-
-} // namespace Msp
-
-#endif
diff --git a/source/regmatch.cpp b/source/regmatch.cpp
deleted file mode 100644 (file)
index f81be1a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include <msp/core/except.h>
-#include "regmatch.h"
-
-using namespace std;
-
-namespace Msp {
-
-RegMatch::RegMatch(const string &str, const GroupArray &g):
-       groups(g)
-{
-       for(GroupArray::iterator i=groups.begin(); i!=groups.end(); ++i)
-               if(i->match)
-               {
-                       i->length = i->end-i->begin;
-                       i->str = str.substr(i->begin, i->length);
-               }
-}
-
-const RegMatch::Group &RegMatch::group(unsigned i) const
-{
-       if(i>=groups.size())
-               throw InvalidParameterValue("Group index out of range");
-       return groups[i];
-}
-
-} // namespace Msp
diff --git a/source/regmatch.h b/source/regmatch.h
deleted file mode 100644 (file)
index 19cac11..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_REGMATCH_H_
-#define MSP_STRINGS_REGMATCH_H_
-
-#include <string>
-#include <vector>
-
-namespace Msp {
-
-/**
-This class stores the result of a Regex being matched against a string.  If the
-match was successful, the RegMatch object evaluates to true.
-
-A RegMatch representing a successful match has one or more groups, indicating
-matching parts of the string.  The first group (with index 0) indicates the
-part matched by the whole regex.  Further groups, if present, indicate parts
-matched by subregexes.  These are ordered from left to right, by the opening
-parenthesis of the subregex.
-*/
-class RegMatch
-{
-public:
-       /**
-       A single subregex of the match.
-       */
-       struct Group
-       {
-               bool match;       //< Whether or not this group matched
-               unsigned begin;   //< First offset of the match
-               unsigned end;     //< One-past-last offset
-               unsigned length;  //< Length of the match (end-begin)
-               std::string str;  //< The part of the string that matched
-
-               Group(): match(false) { }
-               operator bool() const { return match; }
-       };
-
-       typedef std::vector<Group> GroupArray;
-
-private:
-       GroupArray groups;
-
-public:
-       /** Constructs a RegMatch representing a non-match. */
-       RegMatch() { }
-
-       /** Constructs a new RegMatch from a string and groups.  The length and str
-       members of each group are computed and need not be set.  Intended to be used
-       by the Regex class. */
-       RegMatch(const std::string &, const std::vector<Group> &);
-
-       /** Returns a reference to a single group in the match. */
-       const Group &group(unsigned) const;
-
-       /** Returns true if the RegMatch object represents a non-match. */
-       bool empty() const { return groups.empty(); }
-
-       /** Returns the number of groups in this match. */
-       unsigned size() const { return groups.size(); }
-
-       /** Returns the begin offset of the whole match. */
-       unsigned begin() const { return groups.empty() ? 0 : groups[0].begin; }
-
-       /** Returns the end offset of the whole match. */
-       unsigned end() const { return groups.empty() ? 0 : groups[0].end; }
-
-       /** Shorthand for the group() function. */
-       const Group &operator[](unsigned i) const { return group(i); }
-
-       operator bool() const { return !empty(); }
-};
-
-} // namespace Msp
-
-#endif
diff --git a/source/stringcodec/ascii.cpp b/source/stringcodec/ascii.cpp
new file mode 100644 (file)
index 0000000..d7da520
--- /dev/null
@@ -0,0 +1,113 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "ascii.h"
+
+using namespace std;
+
+/*namespace {
+
+char translit_latin1[0x60]=
+{
+};
+
+const char *translit_katakana[0x60]=
+{
+       "--", "a", "a", "i", "i", "u", "u", "e", "e", "o", "o",
+       "ka", "ga", "ki", "gi", "ku", "gu", "ke", "ge", "ko", "go",
+       "sa", "za", "si", "zi", "su", "zu", "se", "ze", "so", "zo",
+       "ta", "da", "ti", "di", "tu", "tu", "du", "te", "de", "to", "do",
+};
+
+}*/
+
+namespace Msp {
+namespace Codecs {
+
+void Ascii::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if(ch<0 || ch>0x7F)
+               return error(ch, buf, "Can't express character in ASCII");
+
+       buf += ch;
+}
+
+void Ascii::Encoder::transliterate(UnicodeChar ch, string &buf)
+{
+       if(ch>=0xC0 && ch<=0xC5)
+               buf += 'A';
+       else if(ch==0xC6)
+               buf += "AE";
+       else if(ch==0xC7)
+               buf += 'C';
+       else if(ch>=0xC8 && ch<=0xCB)
+               buf += 'E';
+       else if(ch>=0xCC && ch<=0xCF)
+               buf += 'I';
+       else if(ch==0xD0)
+               buf += 'D';
+       else if(ch==0xD1)
+               buf += 'N';
+       else if((ch>=0xD2 && ch<=0xD7) || ch==0xD9)
+               buf += 'O';
+       else if(ch==0xD8)
+               buf += 'x';
+       else if(ch>=0xDA && ch<=0xDC)
+               buf += 'U';
+       else if(ch==0xDD)
+               buf += 'Y';
+       else if(ch==0xDE)
+               buf += 'T';
+       else if(ch==0xDF)
+               buf += "ss";
+       else if(ch>=0xE0 && ch<=0xE5)
+               buf += 'a';
+       else if(ch==0xE6)
+               buf += "ae";
+       else if(ch==0xE7)
+               buf += 'c';
+       else if(ch>=0xE8 && ch<=0xEB)
+               buf += 'e';
+       else if(ch>=0xEC && ch<=0xEF)
+               buf += 'i';
+       else if(ch==0xF0)
+               buf += 'd';
+       else if(ch==0xF1)
+               buf += 'n';
+       else if((ch>=0xF2 && ch<=0xF7) || ch==0xF9)
+               buf += 'o';
+       else if(ch==0xF8)
+               buf += '/';
+       else if(ch>=0xFA && ch<=0xFC)
+               buf += 'u';
+       else if(ch==0xFD)
+               buf += 'y';
+       else if(ch==0xFE)
+               buf += 't';
+       else if(ch==0xFF)
+               buf += 'y';
+       else
+               buf += '?';
+}
+
+
+UnicodeChar Ascii::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+       else if(*i&0x80)
+       {
+               UnicodeChar result = error("Undefined ASCII character");
+               ++i;
+               return result;
+       }
+       else
+               return *i++;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/ascii.h b/source/stringcodec/ascii.h
new file mode 100644 (file)
index 0000000..0fee50e
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_ASCII_H_
+#define MSP_STRINGS_ASCII_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Ascii: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "ASCII"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/codec.cpp b/source/stringcodec/codec.cpp
new file mode 100644 (file)
index 0000000..0014847
--- /dev/null
@@ -0,0 +1,177 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "ascii.h"
+#include "codec.h"
+#include "iso2022jp.h"
+#include "iso646fi.h"
+#include "iso88591.h"
+#include "iso885915.h"
+#include "jisx0201.h"
+#include "jisx0208.h"
+#include "utf8.h"
+#include "windows1252.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+bool Codec::detect(const string &str) const
+{
+       Decoder *dec = create_decoder();
+       bool result = true;
+       try
+       {
+               for(string::const_iterator i=str.begin(); i!=str.end(); )
+                       dec->decode_char(str, i);
+       }
+       catch(const CodecError &)
+       {
+               result = false;
+       }
+
+       delete dec;
+
+       return result;
+}
+
+void Codec::Encoder::encode(const ustring &str, string &buf)
+{
+       for(ustring::const_iterator i=str.begin(); i!=str.end(); ++i)
+               encode_char(*i, buf);
+}
+
+string Codec::Encoder::encode(const ustring &str)
+{
+       string buf;
+       encode(str, buf);
+       sync(buf);
+       return buf;
+}
+
+void Codec::Encoder::error(UnicodeChar ch, string &buf, const string &msg)
+{
+       switch(err_mode)
+       {
+       case TRANSLITERATE:
+               transliterate(ch, buf);
+       case IGNORE_ERRORS:
+               break;
+       default:
+               throw CodecError(msg);
+       }
+}
+
+
+void Codec::Decoder::decode(const string &str, ustring &buf)
+{
+       for(string::const_iterator i=str.begin(); i!=str.end();)
+       {
+               UnicodeChar c = decode_char(str, i);
+               if(c!=-1)
+                       buf += c;
+       }
+}
+
+ustring Codec::Decoder::decode(const string &str)
+{
+       ustring buf;
+       decode(str, buf);
+       return buf;
+}
+
+UnicodeChar Codec::Decoder::error(const string &msg)
+{
+       switch(err_mode)
+       {
+       case TRANSLITERATE:
+               return 0xFFFE;
+       case IGNORE_ERRORS:
+               return -1;
+       default:
+               throw CodecError(msg);
+       }
+}
+
+Codec *create_codec(const string &n)
+{
+       string name;
+       for(string::const_iterator i=n.begin(); i!=n.end(); ++i)
+       {
+               if(isupper(*i))
+                       name += tolower(*i);
+               else if(islower(*i) || isdigit(*i))
+                       name += *i;
+       }
+
+       if(name=="ascii") return new Ascii;
+       if(name=="iso2022jp") return new Iso2022Jp;
+       if(name=="iso646fi") return new Iso646Fi;
+       if(name=="iso88591" || name=="latin1") return new Iso88591;
+       if(name=="iso885915" || name=="latin9") return new Iso885915;
+       if(name=="jisx0201") return new JisX0201;
+       if(name=="jisx0208") return new JisX0208;
+       if(name=="utf8") return new Utf8;
+       if(name=="windows1252" || name=="cp1252") return new Windows1252;
+       throw InvalidParameterValue("Unknown string codec");
+}
+
+Codec *detect_codec(const string &str)
+{
+       bool is_utf8 = true;
+       bool is_ascii = true;
+       bool is_latin1 = true;
+       unsigned utf8_mb = 0;
+
+       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+       {
+               unsigned char c = *i;
+               if(c&0x80)
+               {
+                       is_ascii = false;
+                       if((c&0xC0)==0x80)
+                       {
+                               if((c&0xE0)==0x80)
+                                       is_latin1 = false;
+                               if(utf8_mb)
+                                       --utf8_mb;
+                               else
+                                       is_utf8 = false;
+                       }
+                       else if((c&0xC0)==0xC0)
+                       {
+                               if(utf8_mb)
+                               {
+                                       is_utf8 = false;
+                                       utf8_mb = 0;
+                               }
+                               else
+                               {
+                                       for(utf8_mb=1; (c>>(6-utf8_mb))&1; ++utf8_mb) ;
+                               }
+                       }
+               }
+               else if(utf8_mb)
+               {
+                       is_utf8 = false;
+                       utf8_mb = 0;
+               }
+       }
+
+       if(is_ascii)
+               return new Ascii;
+       else if(is_utf8)
+               return new Utf8;
+       else if(is_latin1)
+               return new Iso88591;
+       else
+               return new Windows1252;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/codec.h b/source/stringcodec/codec.h
new file mode 100644 (file)
index 0000000..e04e909
--- /dev/null
@@ -0,0 +1,205 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_CODEC_H_
+#define MSP_STRINGS_CODEC_H_
+
+#include <string>
+#include <msp/core/except.h>
+
+namespace Msp {
+namespace Codecs {
+
+typedef int UnicodeChar;
+
+typedef std::basic_string<UnicodeChar> ustring;
+
+enum ErrorMode
+{
+       THROW_ON_ERROR,
+       IGNORE_ERRORS,
+       TRANSLITERATE
+};
+
+/**
+An exception thrown for all kinds of problems encountered while encoding or
+decoding strings.
+*/
+class CodecError: public Exception
+{
+public:
+       CodecError(const std::string &w_): Exception(w_) { }
+};
+
+/**
+Base class for string codecs.  Use one of the derived classes or the function
+create_codec to create a specific codec.
+
+Unicode strings are represented as ustrings.  An std::string is considered to
+be an encoded sequence of bytes.  A codec is able to determine if an encoded
+string could be decoded with it.
+*/
+class Codec
+{
+public:
+       /**
+       Base class for string encoder.
+
+       Each codec class should contain an Encoder class derived from this.  The
+       encode_char and transliterate functions must be overloaded.  Some encoders
+       may find it useful or necessary to implement some other functions too
+       (particularly sync and reset for stateful codecs).
+       */
+       class Encoder
+       {
+       protected:
+               ErrorMode err_mode;
+
+               Encoder(ErrorMode em): err_mode(em) { }
+       public:
+               virtual ~Encoder() { }
+
+               /** Encodes a single unicode character.  If the character can't be
+               represented in this encoding, error() should be called. */
+               virtual void encode_char(UnicodeChar ch, std::string &buf) = 0;
+
+               /** Encodes a unicode string.  This is equivalent to calling encode_char
+               for each character in the string with the same buffer. */
+               virtual void encode(const ustring &str, std::string &buf);
+
+               std::string encode(const ustring &);
+
+               /** Procuces a sequence of bytes that will bring the encoder back to the
+               initial state. */
+               virtual void sync(std::string &buf) { (void)buf; }
+
+               /** Resets the encoder to the initial state without producing output. */
+               virtual void reset() { }
+
+       protected:
+               /** Handles an error depending on the error mode.
+
+               THROW_ON_ERROR: throws CodecError(msg)
+               IGNORE_ERRORS: does nothing
+               TRANSLITERATE: calls transliterate(ch, buf) */
+               void error(UnicodeChar ch, std::string &buf, const std::string &msg);
+
+               /** Attempts to produce an alternative encoding for a unicode character.
+               Typically this includes dropping accent marks or romanizing letters. */
+               virtual void transliterate(UnicodeChar ch, std::string &buf) = 0;
+       };
+
+       /**
+       Base class for string decoder.
+
+       Each codec class should contain an Decoder class derived from this.
+       */
+       class Decoder
+       {
+       protected:
+               ErrorMode err_mode;
+
+               Decoder(ErrorMode em): err_mode(em) { }
+       public:
+               virtual ~Decoder() { }
+
+               /** Decodes a single character from a string.  The iterator is advanced
+               to the next character.  For stateful codecs, -1 may be returned if a
+               state change sequence was decoded but no character followed it.  If
+               invalid input is encountered, the error() function should be called and
+               the iterator advanced only if it doesn't throw. */
+               virtual UnicodeChar decode_char(const std::string &str, std::string::const_iterator &i) = 0;
+
+               /** Decodes a string. */
+               virtual void decode(const std::string &str, ustring &buf);
+
+               ustring decode(const std::string &);
+
+               /** Resets the decoder to the initial state. */
+               virtual void reset() { }
+
+       protected:
+               /** Handles an error depending on the error mode.  The return value is
+               suitable for returning from decode_char.
+               
+               THROW_ON_ERROR: throws CodecError(msg)
+               IGNORE_ERRORS: returns -1
+               TRANSLITERATE: return 0xFFFE */
+               UnicodeChar error(const std::string &msg);
+       };
+
+protected:
+       Codec() { }
+public:
+       virtual ~Codec() { }
+
+       /** Returns the name of the encoding handled by this codec. */
+       virtual const char *get_name() const = 0;
+
+       /** Creates an encoder for this codec. */
+       virtual Encoder *create_encoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
+
+       /** Creates a decoder for this codec. */
+       virtual Decoder *create_decoder(ErrorMode err_mode = THROW_ON_ERROR) const = 0;
+
+       /** Determines whether the given string can be successfully decoded with
+       this codec.  Note that this function returning true does not guarantee that
+       the string was actually encoded with this codec.  In particular, many 8-bit
+       encodings are indistinguishable. */
+       virtual bool detect(const std::string &) const;
+};
+
+typedef Codec::Encoder Encoder;
+typedef Codec::Decoder Decoder;
+
+/** Convenience function that decodes a string. */
+template<class C>
+ustring decode(const std::string &s)
+{
+       typename C::Decoder dec;
+       ustring result;
+       dec.decode(s, result);
+       return result;
+}
+
+/** Convenience function that encodes a string. */
+template<class C>
+std::string encode(const ustring &s)
+{
+       typename C::Encoder enc;
+       std::string result;
+       enc.encode(s, result);
+       enc.sync(result);
+       return result;
+}
+
+/** Convenience function that transcodes a string from one codec to another. */
+template<class F, class T>
+std::string transcode(const std::string &s)
+{
+       typename F::Decoder from;
+       typename T::Encoder to;
+       ustring temp;
+       from.decode(s, temp);
+       std::string result;
+       to.encode(temp, result);
+       to.sync(result);
+       return result;
+}
+
+/** Creates a codec for an encoding by name.  The caller is responsible for
+deleting the codec when it's no longer needed. */
+Codec *create_codec(const std::string &);
+
+/** Automatically detects the encoding of a string and creates a codec for it.
+The codec must be deleted when it's no longer needed. */
+Codec *detect_codec(const std::string &);
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/codecutils.cpp b/source/stringcodec/codecutils.cpp
new file mode 100644 (file)
index 0000000..6afbf95
--- /dev/null
@@ -0,0 +1,27 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "codecutils.h"
+
+namespace Msp {
+namespace Codecs {
+
+int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse)
+{
+       for(unsigned i=0; i<map_size*2; i+=2)
+       {
+               if(mapping[i+reverse]==ch)
+                       return mapping[i+1-reverse];
+               else if(mapping[i+1-reverse]==ch)
+                       return -1;
+       }
+
+       return ch;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/codecutils.h b/source/stringcodec/codecutils.h
new file mode 100644 (file)
index 0000000..6921d41
--- /dev/null
@@ -0,0 +1,19 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_CODECUTILS_H_
+#define MSP_STRINGS_CODECUTILS_H_
+
+namespace Msp {
+namespace Codecs {
+
+int transform_mapping_or_direct(const int *mapping, unsigned map_size, int ch, bool reverse);
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/iso2022jp.cpp b/source/stringcodec/iso2022jp.cpp
new file mode 100644 (file)
index 0000000..d9c7cea
--- /dev/null
@@ -0,0 +1,160 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+#include "ascii.h"
+#include "iso2022jp.h"
+#include "jisx0201.h"
+#include "jisx0208.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void Iso2022Jp::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if(ch>=0 && ch<=0x7F && ch!=0x5C && ch!=0x7E)
+       {
+               if(mode!=ASCII && mode!=JISX0201)
+                       switch_mode(ASCII, buf);
+               buf += ch;
+       }
+       else if(ch==0x5C || ch==0x7E)
+       {
+               if(mode!=ASCII)
+                       switch_mode(ASCII, buf);
+               buf += ch;
+       }
+       else if(ch==0xA5 || ch==0x203E)
+       {
+               if(mode!=JISX0201)
+                       switch_mode(JISX0201, buf);
+               if(ch==0xA5)
+                       buf += 0x5C;
+               else if(ch==0x203E)
+                       buf += 0x7E;
+       }
+       else
+       {
+               Kuten jis = ucs_to_jisx0208(ch);
+               if(!jis)
+                       return error(ch, buf, "Can't express character in ISO-2022-JP");
+
+               if(mode!=JISX0208)
+                       switch_mode(JISX0208, buf);
+
+               char jbuf[2] = {jis.ku+0x20, jis.ten+0x20};
+               buf.append(jbuf, 2);
+       }
+}
+
+void Iso2022Jp::Encoder::sync(string &buf)
+{
+       if(mode!=ASCII)
+               switch_mode(ASCII, buf);
+}
+
+void Iso2022Jp::Encoder::reset()
+{
+       mode = ASCII;
+}
+
+void Iso2022Jp::Encoder::switch_mode(Mode m, string &buf)
+{
+       mode = m;
+       switch(mode)
+       {
+       case ASCII:    buf.append("\033(B", 3); break;
+       case JISX0201: buf.append("\033(J", 3); break;
+       case JISX0208: buf.append("\033$B", 3); break;
+       default: throw CodecError("WTF?  Invalid mode in Iso2022Jp::Encoder::switch_mode");
+       }
+}
+
+void Iso2022Jp::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       if(mode!=ASCII)
+               switch_mode(ASCII, buf);
+       buf += '?';
+}
+
+
+Iso2022Jp::Decoder::Decoder(ErrorMode em):
+       Codec::Decoder(em),
+       mode(ASCII),
+       dec(new Ascii::Decoder)
+{ }
+
+UnicodeChar Iso2022Jp::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       while(i!=str.end())
+       {
+               string::const_iterator j = i;
+
+               UnicodeChar result = -1;
+               if(*j==033)
+               {
+                       unsigned escape = 0;
+                       for(++j; j!=str.end(); ++j)
+                       {
+                               escape = escape<<8 | static_cast<unsigned char>(*j);
+                               if(*j>='@' && *j<='Z')
+                                       break;
+                       }
+
+                       bool ok = true;
+                       switch(escape)
+                       {
+                       case 0x2842: switch_mode(ASCII); break;    // ESC ( B
+                       case 0x284A: switch_mode(JISX0201); break; // ESC ( J
+                       case 0x2440:                               // ESC $ @
+                       case 0x2442: switch_mode(JISX0208); break; // ESC $ B
+                       default: ok = false;
+                       }
+
+                       if(ok)
+                               i = j;
+                       else
+                               result = *i;
+                       ++i;
+               }
+               else if(dec)
+                       return dec->decode_char(str, i);
+               else
+                       throw CodecError("WTF?  No sub-decoder for Iso2022Jp::Decoder");
+
+               if(result>=0)
+                       return result;
+       }
+
+       return -1;
+}
+
+void Iso2022Jp::Decoder::reset()
+{
+       delete dec;
+       mode = ASCII;
+       dec = new Ascii::Decoder;
+}
+
+void Iso2022Jp::Decoder::switch_mode(Mode m)
+{
+       delete dec;
+
+       mode = m;
+       switch(mode)
+       {
+       case ASCII: dec = new Ascii::Decoder; break;
+       case JISX0201: dec = new JisX0201::Decoder; break;
+       case JISX0208: dec = new JisX0208::Decoder; break;
+       }
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/iso2022jp.h b/source/stringcodec/iso2022jp.h
new file mode 100644 (file)
index 0000000..8a95f9d
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_ISO2022JP_H_
+#define MSP_STRINGS_ISO2022JP_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Iso2022Jp: public Codec
+{
+public:
+       enum Mode
+       {
+               ASCII,
+               JISX0201,
+               JISX0208
+       };
+
+       class Encoder: public Codec::Encoder
+       {
+       private:
+               Mode mode;
+
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em), mode(ASCII) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+               virtual void sync(std::string &);
+               virtual void reset();
+       private:
+               void switch_mode(Mode, std::string &);
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       private:
+               Mode mode;
+               Codec::Decoder *dec;
+
+       public:
+               Decoder(ErrorMode =THROW_ON_ERROR);
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+               virtual void reset();
+       private:
+               void switch_mode(Mode);
+       };
+
+       virtual const char *get_name() const { return "ISO-2022-JP"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/iso646fi.cpp b/source/stringcodec/iso646fi.cpp
new file mode 100644 (file)
index 0000000..100ce13
--- /dev/null
@@ -0,0 +1,70 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "codecutils.h"
+#include "iso646fi.h"
+
+using namespace std;
+
+namespace {
+
+const unsigned map_size = 9;
+
+const int mapping[map_size*2]=
+{
+       0xC4, 0x5B,
+       0xC5, 0x5D,
+       0xD6, 0x5C,
+       0xDC, 0x5E,
+       0xE4, 0x7B,
+       0xE5, 0x7D,
+       0xE9, 0x60,
+       0xF6, 0x7C,
+       0xFC, 0x7E
+};
+
+}
+
+
+namespace Msp {
+namespace Codecs {
+
+void Iso646Fi::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       int tch = transform_mapping_or_direct(mapping, map_size, ch, false);
+       if(tch<0 || tch>0x7F)
+               error(ch, buf, "Can't express character in ISO-646-FI");
+       else
+               buf += tch;
+}
+
+void Iso646Fi::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar Iso646Fi::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       unsigned char ch = *i;
+       int tch = (ch<=0x7F ? transform_mapping_or_direct(mapping, map_size, ch, true) : -1);
+
+       UnicodeChar result;
+       if(tch==-1)
+               result = error("Undefined ISO-646-FI character");
+       else
+               result = tch;
+
+       ++i;
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/iso646fi.h b/source/stringcodec/iso646fi.h
new file mode 100644 (file)
index 0000000..084e57f
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_ISO646FI_H_
+#define MSP_STRINGS_ISO646FI_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Iso646Fi: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "ISO-646-FI"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/iso88591.cpp b/source/stringcodec/iso88591.cpp
new file mode 100644 (file)
index 0000000..064d4a7
--- /dev/null
@@ -0,0 +1,38 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "iso88591.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void Iso88591::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if(ch<0 || ch>0xFF)
+               return error(ch, buf, "Can't express character in ISO-8859-1");
+
+       buf += ch;
+}
+
+void Iso88591::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar Iso88591::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       return static_cast<unsigned char>(*i++);
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/iso88591.h b/source/stringcodec/iso88591.h
new file mode 100644 (file)
index 0000000..4365c0d
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_ISO88591_H_
+#define MSP_STRINGS_ISO88591_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Iso88591: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "ISO-8859-1"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/iso885915.cpp b/source/stringcodec/iso885915.cpp
new file mode 100644 (file)
index 0000000..3eccbcf
--- /dev/null
@@ -0,0 +1,70 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "codecutils.h"
+#include "iso885915.h"
+
+using namespace std;
+
+namespace {
+
+const unsigned map_size = 8;
+
+const int mapping[map_size*2]=
+{
+       0x0152, 0xBC,
+       0x0153, 0xBD,
+       0x0160, 0xA6,
+       0x0161, 0xA8,
+       0x0178, 0xBE,
+       0x017D, 0xB4,
+       0x017E, 0xB8,
+       0x20AC, 0xA4
+};
+
+}
+
+
+namespace Msp {
+namespace Codecs {
+
+void Iso885915::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       int tch = transform_mapping_or_direct(mapping, map_size, ch, false);
+       if(tch<0 || tch>0xFF)
+               error(ch, buf, "Can't express character in ISO-8859-15");
+       else
+               buf += tch;
+
+}
+
+void Iso885915::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar Iso885915::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       unsigned char ch = *i;
+       int tch = transform_mapping_or_direct(mapping, map_size, ch, true);
+
+       UnicodeChar result;
+       if(tch==-1)
+               result = error("Undefined ISO-8859-15 character");
+       else
+               result = tch;
+
+       ++i;
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/iso885915.h b/source/stringcodec/iso885915.h
new file mode 100644 (file)
index 0000000..3237c84
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_ISO885915_H_
+#define MSP_STRINGS_ISO885915_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Iso885915: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "ISO-8859-15"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/jisx0201.cpp b/source/stringcodec/jisx0201.cpp
new file mode 100644 (file)
index 0000000..d3fe635
--- /dev/null
@@ -0,0 +1,58 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "jisx0201.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void JisX0201::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if(ch>=0 && ch<=0x7F && ch!=0x5C && ch!=0x7E)
+               buf += ch;
+       else if(ch==0xA5)
+               buf += 0x5C;
+       else if(ch==0x203E)
+               buf += 0x7E;
+       else if(ch>=0xFF61 && ch<=0xFF9F)
+               buf += ch-0xFEC0;
+       else
+               error(ch, buf, "Can't express character in JIS X 0201");
+}
+
+void JisX0201::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar JisX0201::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       unsigned char ch = *i;
+       UnicodeChar result;
+       if(ch==0x5C)
+               result = 0xA5;
+       else if(ch==0x7E)
+               result = 0x203E;
+       else if(ch<=0x7F)
+               result = ch;
+       else if(ch>=0xA1 && ch<=0xDF)
+               result = ch+0xFEC0;
+       else
+               result = error("Undefined JIS X 0201 character");
+
+       ++i;
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/jisx0201.h b/source/stringcodec/jisx0201.h
new file mode 100644 (file)
index 0000000..41332de
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_JISX201_H_
+#define MSP_STRINGS_JISX201_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class JisX0201: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "JIS X 0201"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/jisx0208.cpp b/source/stringcodec/jisx0208.cpp
new file mode 100644 (file)
index 0000000..6b46b1b
--- /dev/null
@@ -0,0 +1,93 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "jisx0208.h"
+
+#include "jisx0208.table"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void JisX0208::Encoder::encode_char(UnicodeChar ucs, string &buf)
+{
+       unsigned short jis = ucs_to_jisx0208(ucs);
+       if(jis)
+       {
+               char jbuf[2] = {jis>>8, jis};
+               buf.append(jbuf, 2);
+       }
+       else
+               error(ucs, buf, "Can't express character in JIS X 0208");
+}
+
+void JisX0208::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf.append("!)", 2);
+}
+
+
+UnicodeChar JisX0208::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       string::const_iterator j = i;
+       Kuten jis;
+       jis.ku = *j++-0x20;
+
+       UnicodeChar result;
+       if(j==str.end())
+               result = error("Incomplete JIS X 0208 character");
+       else
+       {
+               jis.ten = *j++-0x20;
+               result = jisx0208_to_ucs(jis);
+               if(result==0)
+                       result = error("Undefined JIS X 0208 character");
+       }
+
+       i = j;
+       return result;
+}
+
+
+UnicodeChar jisx0208_to_ucs(Kuten jis)
+{
+       if(jis.ku==0 || jis.ku>0x5E || jis.ten==0 || jis.ten>0x5E)
+               return 0;
+
+       return jisx0208_to_ucs_table[jis.ku*94 + jis.ten - 95];
+}
+
+Kuten ucs_to_jisx0208(UnicodeChar c)
+{
+       if(c<0 || c>0xFFFF)
+               return Kuten();
+
+       unsigned i = 0;
+       for(unsigned bit=0x1000; bit; bit>>=1)
+       {
+               if(i+bit>=ucs_to_jisx0208_table_size)
+                       continue;
+               if(ucs_to_jisx0208_table[i+bit].ucs<=static_cast<unsigned short>(c))
+                       i += bit;
+       }
+
+       Kuten result;
+       if(ucs_to_jisx0208_table[i].ucs==static_cast<unsigned short>(c))
+       {
+               result.ku = (ucs_to_jisx0208_table[i].jis>>8)+1;
+               result.ten = ucs_to_jisx0208_table[i].jis+1;
+       }
+
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/jisx0208.h b/source/stringcodec/jisx0208.h
new file mode 100644 (file)
index 0000000..0c4c4a6
--- /dev/null
@@ -0,0 +1,65 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_JISX0208_H_
+#define MSP_STRINGS_JISX0208_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+/**
+Codec for the JIS X 0208 encoding.  This is not particularly useful as a
+stand-alone codec, due to lack of a linefeed character among other things,
+but is included as part of some other encodings.
+*/
+class JisX0208: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "JIS X 0208"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+
+struct Kuten
+{
+       unsigned short ku;
+       unsigned short ten;
+
+       Kuten(): ku(0), ten(0) { }
+
+       operator bool() { return ku!=0 && ten!=0; }
+};
+
+extern UnicodeChar jisx0208_to_ucs(Kuten);
+extern Kuten ucs_to_jisx0208(UnicodeChar);
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/jisx0208.table b/source/stringcodec/jisx0208.table
new file mode 100644 (file)
index 0000000..b669cf1
--- /dev/null
@@ -0,0 +1,1917 @@
+namespace {
+
+const unsigned short jisx0208_to_ucs_table[94*94] =
+{
+       0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 
+       0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 
+       0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x301C, 0x2016, 0xFF5C, 0x2026, 
+       0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 
+       0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 
+       0x2212, 0x00B1, 0x00D7, 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, 0x2234, 
+       0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 
+       0xFF06, 0xFF0A, 0xFF20, 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 
+       0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 
+       0x2193, 0x3013, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x2220, 
+       0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 
+       0x222B, 0x222C, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x212B, 0x2030, 0x266F, 
+       0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, 0     , 0     , 0     , 0     , 0x25EF, 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 
+       0xFF19, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0xFF21, 0xFF22, 0xFF23, 0xFF24, 
+       0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 
+       0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0     , 0     , 
+       0     , 0     , 0     , 0     , 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 
+       0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 
+       0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0     , 0     , 0     , 0     , 
+       0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 
+       0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 
+       0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 
+       0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 
+       0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 
+       0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 
+       0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 
+       0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 
+       0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 
+       0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 
+       0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 
+       0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 
+       0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 
+       0x30F5, 0x30F6, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 
+       0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0x03B1, 0x03B2, 0x03B3, 0x03B4, 
+       0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 
+       0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 
+       0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 
+       0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 
+       0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 
+       0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 
+       0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 
+       0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 
+       0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 
+       0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 
+       0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 
+       0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 
+       0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 
+       0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 
+       0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D, 
+       0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 
+       0x9D5C, 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, 
+       0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 
+       0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, 
+       0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 
+       0x698E, 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, 0x6CBF, 
+       0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 
+       0x9D1B, 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 
+       0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 
+       0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 
+       0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 
+       0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 
+       0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 
+       0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 
+       0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 
+       0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 
+       0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 
+       0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 
+       0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 
+       0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 
+       0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 
+       0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 
+       0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 
+       0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 
+       0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 
+       0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 
+       0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 
+       0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 
+       0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 
+       0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 
+       0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 
+       0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4, 
+       0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 
+       0x8A18, 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 
+       0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 
+       0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, 
+       0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 
+       0x5F13, 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, 0x7B08, 
+       0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 
+       0x865A, 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 
+       0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 
+       0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 
+       0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 
+       0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 
+       0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 
+       0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 
+       0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 
+       0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 
+       0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 
+       0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 
+       0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 
+       0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 
+       0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 
+       0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 
+       0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 
+       0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 
+       0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 
+       0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 
+       0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 
+       0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 
+       0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 
+       0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 
+       0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 
+       0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, 
+       0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 
+       0x5E83, 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 
+       0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 
+       0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, 
+       0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 
+       0x92FC, 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, 
+       0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 
+       0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 
+       0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 
+       0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 
+       0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 
+       0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 
+       0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 
+       0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 
+       0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 
+       0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 
+       0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 
+       0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 
+       0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 
+       0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 
+       0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 
+       0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 
+       0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 
+       0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 
+       0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 
+       0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 
+       0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 
+       0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 
+       0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 
+       0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 
+       0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 
+       0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, 
+       0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 
+       0x81ED, 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, 
+       0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 
+       0x91CD, 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, 
+       0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 
+       0x696F, 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 
+       0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 
+       0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, 
+       0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 
+       0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 
+       0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 
+       0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 
+       0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 
+       0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 
+       0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 
+       0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 
+       0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 
+       0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 
+       0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 
+       0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 
+       0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 
+       0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 
+       0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 
+       0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 
+       0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 
+       0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 
+       0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 
+       0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 
+       0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 
+       0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 
+       0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 
+       0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, 
+       0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 
+       0x9291, 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, 
+       0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 
+       0x79DF, 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, 
+       0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 
+       0x6383, 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 
+       0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 
+       0x88C5, 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, 
+       0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 
+       0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 
+       0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 
+       0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 
+       0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 
+       0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 
+       0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 
+       0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 
+       0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 
+       0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 
+       0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 
+       0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 
+       0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 
+       0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 
+       0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 
+       0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 
+       0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 
+       0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 
+       0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 
+       0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 
+       0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 
+       0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 
+       0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 
+       0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013, 
+       0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 
+       0x93D1, 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, 
+       0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 
+       0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, 
+       0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 
+       0x5012, 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, 0x5D8B, 
+       0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 
+       0x71C8, 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 
+       0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 
+       0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 
+       0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 
+       0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 
+       0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 
+       0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 
+       0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 
+       0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 
+       0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 
+       0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 
+       0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 
+       0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 
+       0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 
+       0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 
+       0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 
+       0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 
+       0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 
+       0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 
+       0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 
+       0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 
+       0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 
+       0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 
+       0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 
+       0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E, 
+       0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 
+       0x7562, 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 
+       0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 
+       0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, 
+       0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 
+       0x6016, 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, 0x8B5C, 
+       0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 
+       0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 
+       0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 
+       0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 
+       0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 
+       0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 
+       0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 
+       0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 
+       0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 
+       0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 
+       0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 
+       0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 
+       0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 
+       0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 
+       0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 
+       0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 
+       0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 
+       0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 
+       0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 
+       0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 
+       0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 
+       0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 
+       0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 
+       0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 
+       0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 
+       0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, 
+       0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 
+       0x6709, 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 
+       0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 
+       0x5996, 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, 
+       0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 
+       0x617E, 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 
+       0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 
+       0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, 
+       0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 
+       0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 
+       0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 
+       0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 
+       0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 
+       0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 
+       0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 
+       0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 
+       0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 
+       0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 
+       0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 
+       0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 
+       0x6E7E, 0x7897, 0x8155, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 
+       0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 
+       0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 
+       0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 
+       0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 
+       0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 
+       0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 
+       0x5048, 0x505A, 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, 
+       0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 
+       0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 
+       0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 
+       0x56D8, 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, 
+       0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 
+       0x8655, 0x51E9, 0x51ED, 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 
+       0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 
+       0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 
+       0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 
+       0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 
+       0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 
+       0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 
+       0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 
+       0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 
+       0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 
+       0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, 
+       0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 
+       0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, 
+       0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 
+       0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, 
+       0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 
+       0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 
+       0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 
+       0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, 
+       0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 
+       0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 
+       0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 
+       0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 
+       0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 
+       0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 
+       0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 
+       0x5955, 0x5950, 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, 
+       0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 
+       0x59DA, 0x5A25, 0x5A1F, 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, 
+       0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 
+       0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, 
+       0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 
+       0x6588, 0x5B7A, 0x5B80, 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 
+       0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 
+       0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 
+       0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 
+       0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 
+       0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 
+       0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 
+       0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 
+       0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 
+       0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 
+       0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 
+       0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 
+       0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 
+       0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 
+       0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 
+       0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 
+       0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 
+       0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 
+       0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, 
+       0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 
+       0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 
+       0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 
+       0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 
+       0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 
+       0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 
+       0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 
+       0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B, 
+       0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 
+       0x6260, 0x6268, 0x627C, 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, 
+       0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 
+       0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, 
+       0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 
+       0x639F, 0x63B5, 0x636B, 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6, 
+       0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 
+       0x646F, 0x6476, 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 
+       0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 
+       0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 
+       0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 
+       0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 
+       0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 
+       0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 
+       0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 
+       0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC, 
+       0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 
+       0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 
+       0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 
+       0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, 
+       0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 
+       0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, 0x68AD, 
+       0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 
+       0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 
+       0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 
+       0x6928, 0x692A, 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 
+       0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 
+       0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 
+       0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 
+       0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 
+       0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 
+       0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3, 
+       0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 
+       0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 
+       0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 
+       0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, 
+       0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 
+       0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55, 
+       0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 
+       0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 
+       0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 
+       0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 
+       0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 
+       0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 
+       0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 
+       0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 
+       0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 
+       0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 
+       0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 
+       0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 
+       0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 
+       0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, 
+       0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 
+       0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 
+       0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 
+       0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 
+       0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 
+       0x723F, 0x7240, 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 
+       0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 
+       0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 
+       0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 
+       0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 
+       0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 
+       0x746A, 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, 
+       0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 
+       0x7505, 0x750C, 0x750E, 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 
+       0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 
+       0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, 
+       0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 
+       0x75DE, 0x75FE, 0x75FF, 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, 
+       0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 
+       0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 
+       0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 
+       0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 
+       0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 
+       0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 
+       0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 
+       0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 
+       0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 
+       0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, 
+       0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 
+       0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 
+       0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 
+       0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, 
+       0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 
+       0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 
+       0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 
+       0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, 
+       0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 
+       0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 
+       0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 
+       0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 
+       0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 
+       0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 
+       0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 
+       0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, 
+       0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 
+       0x7D56, 0x7D4E, 0x7D72, 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 
+       0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 
+       0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, 
+       0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 
+       0x7E39, 0x7E43, 0x7E37, 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 
+       0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 
+       0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 
+       0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 
+       0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 
+       0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 
+       0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 
+       0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 
+       0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 
+       0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 
+       0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, 
+       0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 
+       0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, 
+       0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 
+       0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, 
+       0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 
+       0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 
+       0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 
+       0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, 
+       0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 
+       0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 
+       0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 
+       0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 
+       0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 
+       0x8469, 0x8446, 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 
+       0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 
+       0x8518, 0x852C, 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, 
+       0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 
+       0x859B, 0x85EA, 0x8587, 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, 
+       0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 
+       0x861A, 0x8630, 0x863F, 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, 
+       0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 
+       0x86DE, 0x86E9, 0x86EC, 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 
+       0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 
+       0x8760, 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 
+       0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 
+       0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 
+       0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 
+       0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 
+       0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 
+       0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 
+       0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 
+       0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E, 
+       0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 
+       0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, 
+       0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 
+       0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 
+       0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 
+       0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 
+       0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 
+       0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 
+       0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 
+       0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 
+       0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 
+       0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 
+       0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 
+       0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 
+       0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 
+       0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A, 
+       0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 
+       0x8E72, 0x8E7C, 0x8E81, 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, 
+       0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 
+       0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, 
+       0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 
+       0x8F4E, 0x8F57, 0x8F5C, 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7, 
+       0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 
+       0x9021, 0x900D, 0x901E, 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 
+       0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 
+       0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 
+       0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 
+       0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 
+       0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 
+       0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 
+       0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 
+       0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E, 
+       0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 
+       0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 
+       0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 
+       0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, 
+       0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 
+       0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, 0x95CA, 
+       0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 
+       0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 
+       0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 
+       0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 
+       0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 
+       0x9724, 0x972A, 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 
+       0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 
+       0x9786, 0x978B, 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 
+       0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 
+       0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870, 
+       0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 
+       0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 
+       0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 
+       0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, 
+       0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 
+       0x9A42, 0x9A40, 0x9A43, 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64, 
+       0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 
+       0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 
+       0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 
+       0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 
+       0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 
+       0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 
+       0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 
+       0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 
+       0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 
+       0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 
+       0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 
+       0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 
+       0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 
+       0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 
+       0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 
+       0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 
+       0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 
+       0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 
+       0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 
+       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     
+};
+
+struct UcsToJis
+{
+       unsigned short ucs;
+       unsigned short jis;
+};
+const UcsToJis ucs_to_jisx0208_table[] =
+{
+       { 0x005C, 0x0120 }, { 0x00A2, 0x0151 }, { 0x00A3, 0x0152 }, { 0x00A7, 0x0158 }, { 0x00A8, 0x010F }, { 0x00AC, 0x022C }, 
+       { 0x00B0, 0x014B }, { 0x00B1, 0x013E }, { 0x00B4, 0x010D }, { 0x00B6, 0x0259 }, { 0x00D7, 0x013F }, { 0x00F7, 0x0140 }, 
+       { 0x0391, 0x0601 }, { 0x0392, 0x0602 }, { 0x0393, 0x0603 }, { 0x0394, 0x0604 }, { 0x0395, 0x0605 }, { 0x0396, 0x0606 }, 
+       { 0x0397, 0x0607 }, { 0x0398, 0x0608 }, { 0x0399, 0x0609 }, { 0x039A, 0x060A }, { 0x039B, 0x060B }, { 0x039C, 0x060C }, 
+       { 0x039D, 0x060D }, { 0x039E, 0x060E }, { 0x039F, 0x060F }, { 0x03A0, 0x0610 }, { 0x03A1, 0x0611 }, { 0x03A3, 0x0612 }, 
+       { 0x03A4, 0x0613 }, { 0x03A5, 0x0614 }, { 0x03A6, 0x0615 }, { 0x03A7, 0x0616 }, { 0x03A8, 0x0617 }, { 0x03A9, 0x0618 }, 
+       { 0x03B1, 0x0621 }, { 0x03B2, 0x0622 }, { 0x03B3, 0x0623 }, { 0x03B4, 0x0624 }, { 0x03B5, 0x0625 }, { 0x03B6, 0x0626 }, 
+       { 0x03B7, 0x0627 }, { 0x03B8, 0x0628 }, { 0x03B9, 0x0629 }, { 0x03BA, 0x062A }, { 0x03BB, 0x062B }, { 0x03BC, 0x062C }, 
+       { 0x03BD, 0x062D }, { 0x03BE, 0x062E }, { 0x03BF, 0x062F }, { 0x03C0, 0x0630 }, { 0x03C1, 0x0631 }, { 0x03C3, 0x0632 }, 
+       { 0x03C4, 0x0633 }, { 0x03C5, 0x0634 }, { 0x03C6, 0x0635 }, { 0x03C7, 0x0636 }, { 0x03C8, 0x0637 }, { 0x03C9, 0x0638 }, 
+       { 0x0401, 0x0707 }, { 0x0410, 0x0701 }, { 0x0411, 0x0702 }, { 0x0412, 0x0703 }, { 0x0413, 0x0704 }, { 0x0414, 0x0705 }, 
+       { 0x0415, 0x0706 }, { 0x0416, 0x0708 }, { 0x0417, 0x0709 }, { 0x0418, 0x070A }, { 0x0419, 0x070B }, { 0x041A, 0x070C }, 
+       { 0x041B, 0x070D }, { 0x041C, 0x070E }, { 0x041D, 0x070F }, { 0x041E, 0x0710 }, { 0x041F, 0x0711 }, { 0x0420, 0x0712 }, 
+       { 0x0421, 0x0713 }, { 0x0422, 0x0714 }, { 0x0423, 0x0715 }, { 0x0424, 0x0716 }, { 0x0425, 0x0717 }, { 0x0426, 0x0718 }, 
+       { 0x0427, 0x0719 }, { 0x0428, 0x071A }, { 0x0429, 0x071B }, { 0x042A, 0x071C }, { 0x042B, 0x071D }, { 0x042C, 0x071E }, 
+       { 0x042D, 0x071F }, { 0x042E, 0x0720 }, { 0x042F, 0x0721 }, { 0x0430, 0x0731 }, { 0x0431, 0x0732 }, { 0x0432, 0x0733 }, 
+       { 0x0433, 0x0734 }, { 0x0434, 0x0735 }, { 0x0435, 0x0736 }, { 0x0436, 0x0738 }, { 0x0437, 0x0739 }, { 0x0438, 0x073A }, 
+       { 0x0439, 0x073B }, { 0x043A, 0x073C }, { 0x043B, 0x073D }, { 0x043C, 0x073E }, { 0x043D, 0x073F }, { 0x043E, 0x0740 }, 
+       { 0x043F, 0x0741 }, { 0x0440, 0x0742 }, { 0x0441, 0x0743 }, { 0x0442, 0x0744 }, { 0x0443, 0x0745 }, { 0x0444, 0x0746 }, 
+       { 0x0445, 0x0747 }, { 0x0446, 0x0748 }, { 0x0447, 0x0749 }, { 0x0448, 0x074A }, { 0x0449, 0x074B }, { 0x044A, 0x074C }, 
+       { 0x044B, 0x074D }, { 0x044C, 0x074E }, { 0x044D, 0x074F }, { 0x044E, 0x0750 }, { 0x044F, 0x0751 }, { 0x0451, 0x0737 }, 
+       { 0x2010, 0x011E }, { 0x2015, 0x011D }, { 0x2016, 0x0122 }, { 0x2018, 0x0126 }, { 0x2019, 0x0127 }, { 0x201C, 0x0128 }, 
+       { 0x201D, 0x0129 }, { 0x2020, 0x0257 }, { 0x2021, 0x0258 }, { 0x2025, 0x0125 }, { 0x2026, 0x0124 }, { 0x2030, 0x0253 }, 
+       { 0x2032, 0x014C }, { 0x2033, 0x014D }, { 0x203B, 0x0208 }, { 0x2103, 0x014E }, { 0x212B, 0x0252 }, { 0x2190, 0x020B }, 
+       { 0x2191, 0x020C }, { 0x2192, 0x020A }, { 0x2193, 0x020D }, { 0x21D2, 0x022D }, { 0x21D4, 0x022E }, { 0x2200, 0x022F }, 
+       { 0x2202, 0x023F }, { 0x2203, 0x0230 }, { 0x2207, 0x0240 }, { 0x2208, 0x021A }, { 0x220B, 0x021B }, { 0x2212, 0x013D }, 
+       { 0x221A, 0x0245 }, { 0x221D, 0x0247 }, { 0x221E, 0x0147 }, { 0x2220, 0x023C }, { 0x2227, 0x022A }, { 0x2228, 0x022B }, 
+       { 0x2229, 0x0221 }, { 0x222A, 0x0220 }, { 0x222B, 0x0249 }, { 0x222C, 0x024A }, { 0x2234, 0x0148 }, { 0x2235, 0x0248 }, 
+       { 0x223D, 0x0246 }, { 0x2252, 0x0242 }, { 0x2260, 0x0142 }, { 0x2261, 0x0241 }, { 0x2266, 0x0145 }, { 0x2267, 0x0146 }, 
+       { 0x226A, 0x0243 }, { 0x226B, 0x0244 }, { 0x2282, 0x021E }, { 0x2283, 0x021F }, { 0x2286, 0x021C }, { 0x2287, 0x021D }, 
+       { 0x22A5, 0x023D }, { 0x2312, 0x023E }, { 0x2500, 0x0801 }, { 0x2501, 0x080C }, { 0x2502, 0x0802 }, { 0x2503, 0x080D }, 
+       { 0x250C, 0x0803 }, { 0x250F, 0x080E }, { 0x2510, 0x0804 }, { 0x2513, 0x080F }, { 0x2514, 0x0806 }, { 0x2517, 0x0811 }, 
+       { 0x2518, 0x0805 }, { 0x251B, 0x0810 }, { 0x251C, 0x0807 }, { 0x251D, 0x081C }, { 0x2520, 0x0817 }, { 0x2523, 0x0812 }, 
+       { 0x2524, 0x0809 }, { 0x2525, 0x081E }, { 0x2528, 0x0819 }, { 0x252B, 0x0814 }, { 0x252C, 0x0808 }, { 0x252F, 0x0818 }, 
+       { 0x2530, 0x081D }, { 0x2533, 0x0813 }, { 0x2534, 0x080A }, { 0x2537, 0x081A }, { 0x2538, 0x081F }, { 0x253B, 0x0815 }, 
+       { 0x253C, 0x080B }, { 0x253F, 0x081B }, { 0x2542, 0x0820 }, { 0x254B, 0x0816 }, { 0x25A0, 0x0203 }, { 0x25A1, 0x0202 }, 
+       { 0x25B2, 0x0205 }, { 0x25B3, 0x0204 }, { 0x25BC, 0x0207 }, { 0x25BD, 0x0206 }, { 0x25C6, 0x0201 }, { 0x25C7, 0x015E }, 
+       { 0x25CB, 0x015B }, { 0x25CE, 0x015D }, { 0x25CF, 0x015C }, { 0x25EF, 0x025E }, { 0x2605, 0x015A }, { 0x2606, 0x0159 }, 
+       { 0x2640, 0x014A }, { 0x2642, 0x0149 }, { 0x266A, 0x0256 }, { 0x266D, 0x0255 }, { 0x266F, 0x0254 }, { 0x3000, 0x0101 }, 
+       { 0x3001, 0x0102 }, { 0x3002, 0x0103 }, { 0x3003, 0x0117 }, { 0x3005, 0x0119 }, { 0x3006, 0x011A }, { 0x3007, 0x011B }, 
+       { 0x3008, 0x0132 }, { 0x3009, 0x0133 }, { 0x300A, 0x0134 }, { 0x300B, 0x0135 }, { 0x300C, 0x0136 }, { 0x300D, 0x0137 }, 
+       { 0x300E, 0x0138 }, { 0x300F, 0x0139 }, { 0x3010, 0x013A }, { 0x3011, 0x013B }, { 0x3012, 0x0209 }, { 0x3013, 0x020E }, 
+       { 0x3014, 0x012C }, { 0x3015, 0x012D }, { 0x301C, 0x0121 }, { 0x3041, 0x0401 }, { 0x3042, 0x0402 }, { 0x3043, 0x0403 }, 
+       { 0x3044, 0x0404 }, { 0x3045, 0x0405 }, { 0x3046, 0x0406 }, { 0x3047, 0x0407 }, { 0x3048, 0x0408 }, { 0x3049, 0x0409 }, 
+       { 0x304A, 0x040A }, { 0x304B, 0x040B }, { 0x304C, 0x040C }, { 0x304D, 0x040D }, { 0x304E, 0x040E }, { 0x304F, 0x040F }, 
+       { 0x3050, 0x0410 }, { 0x3051, 0x0411 }, { 0x3052, 0x0412 }, { 0x3053, 0x0413 }, { 0x3054, 0x0414 }, { 0x3055, 0x0415 }, 
+       { 0x3056, 0x0416 }, { 0x3057, 0x0417 }, { 0x3058, 0x0418 }, { 0x3059, 0x0419 }, { 0x305A, 0x041A }, { 0x305B, 0x041B }, 
+       { 0x305C, 0x041C }, { 0x305D, 0x041D }, { 0x305E, 0x041E }, { 0x305F, 0x041F }, { 0x3060, 0x0420 }, { 0x3061, 0x0421 }, 
+       { 0x3062, 0x0422 }, { 0x3063, 0x0423 }, { 0x3064, 0x0424 }, { 0x3065, 0x0425 }, { 0x3066, 0x0426 }, { 0x3067, 0x0427 }, 
+       { 0x3068, 0x0428 }, { 0x3069, 0x0429 }, { 0x306A, 0x042A }, { 0x306B, 0x042B }, { 0x306C, 0x042C }, { 0x306D, 0x042D }, 
+       { 0x306E, 0x042E }, { 0x306F, 0x042F }, { 0x3070, 0x0430 }, { 0x3071, 0x0431 }, { 0x3072, 0x0432 }, { 0x3073, 0x0433 }, 
+       { 0x3074, 0x0434 }, { 0x3075, 0x0435 }, { 0x3076, 0x0436 }, { 0x3077, 0x0437 }, { 0x3078, 0x0438 }, { 0x3079, 0x0439 }, 
+       { 0x307A, 0x043A }, { 0x307B, 0x043B }, { 0x307C, 0x043C }, { 0x307D, 0x043D }, { 0x307E, 0x043E }, { 0x307F, 0x043F }, 
+       { 0x3080, 0x0440 }, { 0x3081, 0x0441 }, { 0x3082, 0x0442 }, { 0x3083, 0x0443 }, { 0x3084, 0x0444 }, { 0x3085, 0x0445 }, 
+       { 0x3086, 0x0446 }, { 0x3087, 0x0447 }, { 0x3088, 0x0448 }, { 0x3089, 0x0449 }, { 0x308A, 0x044A }, { 0x308B, 0x044B }, 
+       { 0x308C, 0x044C }, { 0x308D, 0x044D }, { 0x308E, 0x044E }, { 0x308F, 0x044F }, { 0x3090, 0x0450 }, { 0x3091, 0x0451 }, 
+       { 0x3092, 0x0452 }, { 0x3093, 0x0453 }, { 0x309B, 0x010B }, { 0x309C, 0x010C }, { 0x309D, 0x0115 }, { 0x309E, 0x0116 }, 
+       { 0x30A1, 0x0501 }, { 0x30A2, 0x0502 }, { 0x30A3, 0x0503 }, { 0x30A4, 0x0504 }, { 0x30A5, 0x0505 }, { 0x30A6, 0x0506 }, 
+       { 0x30A7, 0x0507 }, { 0x30A8, 0x0508 }, { 0x30A9, 0x0509 }, { 0x30AA, 0x050A }, { 0x30AB, 0x050B }, { 0x30AC, 0x050C }, 
+       { 0x30AD, 0x050D }, { 0x30AE, 0x050E }, { 0x30AF, 0x050F }, { 0x30B0, 0x0510 }, { 0x30B1, 0x0511 }, { 0x30B2, 0x0512 }, 
+       { 0x30B3, 0x0513 }, { 0x30B4, 0x0514 }, { 0x30B5, 0x0515 }, { 0x30B6, 0x0516 }, { 0x30B7, 0x0517 }, { 0x30B8, 0x0518 }, 
+       { 0x30B9, 0x0519 }, { 0x30BA, 0x051A }, { 0x30BB, 0x051B }, { 0x30BC, 0x051C }, { 0x30BD, 0x051D }, { 0x30BE, 0x051E }, 
+       { 0x30BF, 0x051F }, { 0x30C0, 0x0520 }, { 0x30C1, 0x0521 }, { 0x30C2, 0x0522 }, { 0x30C3, 0x0523 }, { 0x30C4, 0x0524 }, 
+       { 0x30C5, 0x0525 }, { 0x30C6, 0x0526 }, { 0x30C7, 0x0527 }, { 0x30C8, 0x0528 }, { 0x30C9, 0x0529 }, { 0x30CA, 0x052A }, 
+       { 0x30CB, 0x052B }, { 0x30CC, 0x052C }, { 0x30CD, 0x052D }, { 0x30CE, 0x052E }, { 0x30CF, 0x052F }, { 0x30D0, 0x0530 }, 
+       { 0x30D1, 0x0531 }, { 0x30D2, 0x0532 }, { 0x30D3, 0x0533 }, { 0x30D4, 0x0534 }, { 0x30D5, 0x0535 }, { 0x30D6, 0x0536 }, 
+       { 0x30D7, 0x0537 }, { 0x30D8, 0x0538 }, { 0x30D9, 0x0539 }, { 0x30DA, 0x053A }, { 0x30DB, 0x053B }, { 0x30DC, 0x053C }, 
+       { 0x30DD, 0x053D }, { 0x30DE, 0x053E }, { 0x30DF, 0x053F }, { 0x30E0, 0x0540 }, { 0x30E1, 0x0541 }, { 0x30E2, 0x0542 }, 
+       { 0x30E3, 0x0543 }, { 0x30E4, 0x0544 }, { 0x30E5, 0x0545 }, { 0x30E6, 0x0546 }, { 0x30E7, 0x0547 }, { 0x30E8, 0x0548 }, 
+       { 0x30E9, 0x0549 }, { 0x30EA, 0x054A }, { 0x30EB, 0x054B }, { 0x30EC, 0x054C }, { 0x30ED, 0x054D }, { 0x30EE, 0x054E }, 
+       { 0x30EF, 0x054F }, { 0x30F0, 0x0550 }, { 0x30F1, 0x0551 }, { 0x30F2, 0x0552 }, { 0x30F3, 0x0553 }, { 0x30F4, 0x0554 }, 
+       { 0x30F5, 0x0555 }, { 0x30F6, 0x0556 }, { 0x30FB, 0x0106 }, { 0x30FC, 0x011C }, { 0x30FD, 0x0113 }, { 0x30FE, 0x0114 }, 
+       { 0x4E00, 0x104C }, { 0x4E01, 0x235A }, { 0x4E03, 0x1C17 }, { 0x4E07, 0x2B5C }, { 0x4E08, 0x1E46 }, { 0x4E09, 0x1B10 }, 
+       { 0x4E0A, 0x1E45 }, { 0x4E0B, 0x121C }, { 0x4E0D, 0x2934 }, { 0x4E0E, 0x2D1F }, { 0x4E10, 0x3002 }, { 0x4E11, 0x110F }, 
+       { 0x4E14, 0x134E }, { 0x4E15, 0x3003 }, { 0x4E16, 0x2004 }, { 0x4E17, 0x3222 }, { 0x4E18, 0x1536 }, { 0x4E19, 0x2A1A }, 
+       { 0x4E1E, 0x1E47 }, { 0x4E21, 0x2E1E }, { 0x4E26, 0x2A22 }, { 0x4E2A, 0x3004 }, { 0x4E2D, 0x2346 }, { 0x4E31, 0x3005 }, 
+       { 0x4E32, 0x165A }, { 0x4E36, 0x3006 }, { 0x4E38, 0x143D }, { 0x4E39, 0x2310 }, { 0x4E3B, 0x1C47 }, { 0x4E3C, 0x3007 }, 
+       { 0x4E3F, 0x3008 }, { 0x4E42, 0x3009 }, { 0x4E43, 0x2715 }, { 0x4E45, 0x1537 }, { 0x4E4B, 0x2717 }, { 0x4E4D, 0x2643 }, 
+       { 0x4E4E, 0x1823 }, { 0x4E4F, 0x2B13 }, { 0x4E55, 0x4929 }, { 0x4E56, 0x300A }, { 0x4E57, 0x1E48 }, { 0x4E58, 0x300B }, 
+       { 0x4E59, 0x1215 }, { 0x4E5D, 0x1645 }, { 0x4E5E, 0x1850 }, { 0x4E5F, 0x2C49 }, { 0x4E62, 0x3606 }, { 0x4E71, 0x2D50 }, 
+       { 0x4E73, 0x265D }, { 0x4E7E, 0x1405 }, { 0x4E80, 0x1515 }, { 0x4E82, 0x300C }, { 0x4E85, 0x300D }, { 0x4E86, 0x2E1B }, 
+       { 0x4E88, 0x2D1D }, { 0x4E89, 0x2148 }, { 0x4E8A, 0x300F }, { 0x4E8B, 0x1B56 }, { 0x4E8C, 0x2653 }, { 0x4E8E, 0x3012 }, 
+       { 0x4E91, 0x111E }, { 0x4E92, 0x183F }, { 0x4E94, 0x183E }, { 0x4E95, 0x1046 }, { 0x4E98, 0x2F2B }, { 0x4E99, 0x2F2A }, 
+       { 0x4E9B, 0x1A13 }, { 0x4E9C, 0x1001 }, { 0x4E9E, 0x3013 }, { 0x4E9F, 0x3014 }, { 0x4EA0, 0x3015 }, { 0x4EA1, 0x2B14 }, 
+       { 0x4EA2, 0x3016 }, { 0x4EA4, 0x1852 }, { 0x4EA5, 0x1047 }, { 0x4EA6, 0x2B52 }, { 0x4EA8, 0x155C }, { 0x4EAB, 0x155D }, 
+       { 0x4EAC, 0x155E }, { 0x4EAD, 0x2442 }, { 0x4EAE, 0x2E1C }, { 0x4EB0, 0x3017 }, { 0x4EB3, 0x3018 }, { 0x4EB6, 0x3019 }, 
+       { 0x4EBA, 0x1F2D }, { 0x4EC0, 0x1D1A }, { 0x4EC1, 0x1F2E }, { 0x4EC2, 0x301E }, { 0x4EC4, 0x301C }, { 0x4EC6, 0x301D }, 
+       { 0x4EC7, 0x1538 }, { 0x4ECA, 0x1A03 }, { 0x4ECB, 0x1250 }, { 0x4ECD, 0x301B }, { 0x4ECE, 0x301A }, { 0x4ECF, 0x2A09 }, 
+       { 0x4ED4, 0x1B26 }, { 0x4ED5, 0x1B25 }, { 0x4ED6, 0x221E }, { 0x4ED7, 0x301F }, { 0x4ED8, 0x2935 }, { 0x4ED9, 0x2047 }, 
+       { 0x4EDD, 0x0118 }, { 0x4EDE, 0x3020 }, { 0x4EDF, 0x3022 }, { 0x4EE3, 0x2245 }, { 0x4EE4, 0x2E41 }, { 0x4EE5, 0x102A }, 
+       { 0x4EED, 0x3021 }, { 0x4EEE, 0x121E }, { 0x4EF0, 0x1624 }, { 0x4EF2, 0x2347 }, { 0x4EF6, 0x174F }, { 0x4EF7, 0x3023 }, 
+       { 0x4EFB, 0x2704 }, { 0x4F01, 0x144B }, { 0x4F09, 0x3024 }, { 0x4F0A, 0x102B }, { 0x4F0D, 0x1840 }, { 0x4F0E, 0x144C }, 
+       { 0x4F0F, 0x295A }, { 0x4F10, 0x2812 }, { 0x4F11, 0x1539 }, { 0x4F1A, 0x1251 }, { 0x4F1C, 0x3047 }, { 0x4F1D, 0x2521 }, 
+       { 0x4F2F, 0x274C }, { 0x4F30, 0x3026 }, { 0x4F34, 0x281C }, { 0x4F36, 0x2E42 }, { 0x4F38, 0x1F0D }, { 0x4F3A, 0x1B27 }, 
+       { 0x4F3C, 0x1B57 }, { 0x4F3D, 0x1220 }, { 0x4F43, 0x2431 }, { 0x4F46, 0x2302 }, { 0x4F47, 0x302A }, { 0x4F4D, 0x102C }, 
+       { 0x4F4E, 0x2443 }, { 0x4F4F, 0x1D1B }, { 0x4F50, 0x1A14 }, { 0x4F51, 0x2D04 }, { 0x4F53, 0x222E }, { 0x4F55, 0x121F }, 
+       { 0x4F57, 0x3029 }, { 0x4F59, 0x2D1E }, { 0x4F5A, 0x3025 }, { 0x4F5B, 0x3027 }, { 0x4F5C, 0x1A4E }, { 0x4F5D, 0x3028 }, 
+       { 0x4F5E, 0x3504 }, { 0x4F69, 0x3030 }, { 0x4F6F, 0x3033 }, { 0x4F70, 0x3031 }, { 0x4F73, 0x1222 }, { 0x4F75, 0x2A1B }, 
+       { 0x4F76, 0x302B }, { 0x4F7B, 0x302F }, { 0x4F7C, 0x1853 }, { 0x4F7F, 0x1B28 }, { 0x4F83, 0x1406 }, { 0x4F86, 0x3034 }, 
+       { 0x4F88, 0x302C }, { 0x4F8B, 0x2E43 }, { 0x4F8D, 0x1B58 }, { 0x4F8F, 0x302D }, { 0x4F91, 0x3032 }, { 0x4F96, 0x3035 }, 
+       { 0x4F98, 0x302E }, { 0x4F9B, 0x1601 }, { 0x4F9D, 0x102D }, { 0x4FA0, 0x1602 }, { 0x4FA1, 0x1221 }, { 0x4FAB, 0x3505 }, 
+       { 0x4FAD, 0x2B59 }, { 0x4FAE, 0x294E }, { 0x4FAF, 0x1854 }, { 0x4FB5, 0x1F0F }, { 0x4FB6, 0x2E17 }, { 0x4FBF, 0x2A38 }, 
+       { 0x4FC2, 0x1718 }, { 0x4FC3, 0x2205 }, { 0x4FC4, 0x1244 }, { 0x4FCA, 0x1D33 }, { 0x4FCE, 0x3039 }, { 0x4FD0, 0x303E }, 
+       { 0x4FD1, 0x303C }, { 0x4FD4, 0x3037 }, { 0x4FD7, 0x220F }, { 0x4FD8, 0x303A }, { 0x4FDA, 0x303D }, { 0x4FDB, 0x303B }, 
+       { 0x4FDD, 0x2A3D }, { 0x4FDF, 0x3038 }, { 0x4FE1, 0x1F0E }, { 0x4FE3, 0x2B53 }, { 0x4FE4, 0x303F }, { 0x4FE5, 0x3040 }, 
+       { 0x4FEE, 0x1D04 }, { 0x4FEF, 0x304D }, { 0x4FF3, 0x2730 }, { 0x4FF5, 0x2916 }, { 0x4FF6, 0x3048 }, { 0x4FF8, 0x2A50 }, 
+       { 0x4FFA, 0x1216 }, { 0x4FFE, 0x304C }, { 0x5005, 0x3046 }, { 0x5006, 0x304F }, { 0x5009, 0x2132 }, { 0x500B, 0x1824 }, 
+       { 0x500D, 0x273C }, { 0x500F, 0x4027 }, { 0x5011, 0x304E }, { 0x5012, 0x253D }, { 0x5014, 0x3043 }, { 0x5016, 0x1856 }, 
+       { 0x5019, 0x1855 }, { 0x501A, 0x3041 }, { 0x501F, 0x1C3A }, { 0x5021, 0x3049 }, { 0x5023, 0x2A4F }, { 0x5024, 0x232D }, 
+       { 0x5025, 0x3045 }, { 0x5026, 0x1751 }, { 0x5028, 0x3042 }, { 0x5029, 0x304A }, { 0x502A, 0x3044 }, { 0x502B, 0x2E31 }, 
+       { 0x502C, 0x304B }, { 0x502D, 0x2F21 }, { 0x5036, 0x1646 }, { 0x5039, 0x1750 }, { 0x5043, 0x3050 }, { 0x5047, 0x3051 }, 
+       { 0x5048, 0x3055 }, { 0x5049, 0x102E }, { 0x504F, 0x2A30 }, { 0x5050, 0x3054 }, { 0x5055, 0x3053 }, { 0x5056, 0x3057 }, 
+       { 0x505A, 0x3056 }, { 0x505C, 0x2444 }, { 0x5065, 0x1752 }, { 0x506C, 0x3058 }, { 0x5072, 0x1C25 }, { 0x5074, 0x2206 }, 
+       { 0x5075, 0x2445 }, { 0x5076, 0x1656 }, { 0x5078, 0x3059 }, { 0x507D, 0x1516 }, { 0x5080, 0x305A }, { 0x5085, 0x305C }, 
+       { 0x508D, 0x2B15 }, { 0x5091, 0x1746 }, { 0x5098, 0x1B11 }, { 0x5099, 0x2857 }, { 0x509A, 0x305B }, { 0x50AC, 0x1A25 }, 
+       { 0x50AD, 0x2D23 }, { 0x50B2, 0x305E }, { 0x50B3, 0x3103 }, { 0x50B4, 0x305D }, { 0x50B5, 0x1A24 }, { 0x50B7, 0x1D5D }, 
+       { 0x50BE, 0x1719 }, { 0x50C2, 0x3104 }, { 0x50C5, 0x162F }, { 0x50C9, 0x3101 }, { 0x50CA, 0x3102 }, { 0x50CD, 0x260F }, 
+       { 0x50CF, 0x215C }, { 0x50D1, 0x1603 }, { 0x50D5, 0x2B2D }, { 0x50D6, 0x3105 }, { 0x50DA, 0x2E1D }, { 0x50DE, 0x3106 }, 
+       { 0x50E3, 0x3109 }, { 0x50E5, 0x3107 }, { 0x50E7, 0x212E }, { 0x50ED, 0x3108 }, { 0x50EE, 0x310A }, { 0x50F5, 0x310C }, 
+       { 0x50F9, 0x310B }, { 0x50FB, 0x2A28 }, { 0x5100, 0x1517 }, { 0x5101, 0x310E }, { 0x5102, 0x310F }, { 0x5104, 0x120F }, 
+       { 0x5109, 0x310D }, { 0x5112, 0x1C54 }, { 0x5114, 0x3112 }, { 0x5115, 0x3111 }, { 0x5116, 0x3110 }, { 0x5118, 0x3036 }, 
+       { 0x511A, 0x3113 }, { 0x511F, 0x1D5E }, { 0x5121, 0x3114 }, { 0x512A, 0x2D05 }, { 0x5132, 0x2C39 }, { 0x5137, 0x3116 }, 
+       { 0x513A, 0x3115 }, { 0x513B, 0x3118 }, { 0x513C, 0x3117 }, { 0x513F, 0x3119 }, { 0x5140, 0x311A }, { 0x5141, 0x1054 }, 
+       { 0x5143, 0x1815 }, { 0x5144, 0x171B }, { 0x5145, 0x1D1C }, { 0x5146, 0x235B }, { 0x5147, 0x1604 }, { 0x5148, 0x2048 }, 
+       { 0x5149, 0x1857 }, { 0x514B, 0x194E }, { 0x514C, 0x311C }, { 0x514D, 0x2C28 }, { 0x514E, 0x2526 }, { 0x5150, 0x1B59 }, 
+       { 0x5152, 0x311B }, { 0x5154, 0x311D }, { 0x515A, 0x253E }, { 0x515C, 0x1355 }, { 0x5162, 0x311E }, { 0x5165, 0x265E }, 
+       { 0x5168, 0x2114 }, { 0x5169, 0x3120 }, { 0x516A, 0x3121 }, { 0x516B, 0x280C }, { 0x516C, 0x1858 }, { 0x516D, 0x2F1B }, 
+       { 0x516E, 0x3122 }, { 0x5171, 0x1606 }, { 0x5175, 0x2A1C }, { 0x5176, 0x2216 }, { 0x5177, 0x1651 }, { 0x5178, 0x2515 }, 
+       { 0x517C, 0x1753 }, { 0x5180, 0x3123 }, { 0x5182, 0x3124 }, { 0x5185, 0x2642 }, { 0x5186, 0x113F }, { 0x5189, 0x3127 }, 
+       { 0x518A, 0x1A5D }, { 0x518C, 0x3126 }, { 0x518D, 0x1A26 }, { 0x518F, 0x3128 }, { 0x5190, 0x464E }, { 0x5191, 0x3129 }, 
+       { 0x5192, 0x2B21 }, { 0x5193, 0x312A }, { 0x5195, 0x312B }, { 0x5196, 0x312C }, { 0x5197, 0x1E49 }, { 0x5199, 0x1C2C }, 
+       { 0x51A0, 0x1407 }, { 0x51A2, 0x312F }, { 0x51A4, 0x312D }, { 0x51A5, 0x2C1D }, { 0x51A6, 0x312E }, { 0x51A8, 0x293A }, 
+       { 0x51A9, 0x3130 }, { 0x51AA, 0x3131 }, { 0x51AB, 0x3132 }, { 0x51AC, 0x253F }, { 0x51B0, 0x3136 }, { 0x51B1, 0x3134 }, 
+       { 0x51B2, 0x3135 }, { 0x51B3, 0x3133 }, { 0x51B4, 0x1A43 }, { 0x51B5, 0x3137 }, { 0x51B6, 0x2C4A }, { 0x51B7, 0x2E44 }, 
+       { 0x51BD, 0x3138 }, { 0x51C4, 0x2008 }, { 0x51C5, 0x3139 }, { 0x51C6, 0x1D3A }, { 0x51C9, 0x313A }, { 0x51CB, 0x235C }, 
+       { 0x51CC, 0x2E1F }, { 0x51CD, 0x2540 }, { 0x51D6, 0x3225 }, { 0x51DB, 0x313B }, { 0x51DC, 0x5405 }, { 0x51DD, 0x1625 }, 
+       { 0x51E0, 0x313C }, { 0x51E1, 0x2B3E }, { 0x51E6, 0x1D48 }, { 0x51E7, 0x225C }, { 0x51E9, 0x313E }, { 0x51EA, 0x2644 }, 
+       { 0x51ED, 0x313F }, { 0x51F0, 0x3140 }, { 0x51F1, 0x130E }, { 0x51F5, 0x3141 }, { 0x51F6, 0x1607 }, { 0x51F8, 0x262C }, 
+       { 0x51F9, 0x115A }, { 0x51FA, 0x1D30 }, { 0x51FD, 0x2801 }, { 0x51FE, 0x3142 }, { 0x5200, 0x2541 }, { 0x5203, 0x1F2F }, 
+       { 0x5204, 0x3143 }, { 0x5206, 0x2A0C }, { 0x5207, 0x203A }, { 0x5208, 0x1402 }, { 0x520A, 0x1409 }, { 0x520B, 0x3144 }, 
+       { 0x520E, 0x3146 }, { 0x5211, 0x171A }, { 0x5214, 0x3145 }, { 0x5217, 0x2E53 }, { 0x521D, 0x1D49 }, { 0x5224, 0x281D }, 
+       { 0x5225, 0x2A2C }, { 0x5227, 0x3147 }, { 0x5229, 0x2D58 }, { 0x522A, 0x3148 }, { 0x522E, 0x3149 }, { 0x5230, 0x255E }, 
+       { 0x5233, 0x314A }, { 0x5236, 0x2009 }, { 0x5237, 0x1A5E }, { 0x5238, 0x1754 }, { 0x5239, 0x314B }, { 0x523A, 0x1B29 }, 
+       { 0x523B, 0x194F }, { 0x5243, 0x2446 }, { 0x5244, 0x314D }, { 0x5247, 0x2207 }, { 0x524A, 0x1A4F }, { 0x524B, 0x314E }, 
+       { 0x524C, 0x314F }, { 0x524D, 0x2110 }, { 0x524F, 0x314C }, { 0x5254, 0x3151 }, { 0x5256, 0x2B16 }, { 0x525B, 0x1944 }, 
+       { 0x525E, 0x3150 }, { 0x5263, 0x1755 }, { 0x5264, 0x1A3E }, { 0x5265, 0x274D }, { 0x5269, 0x3154 }, { 0x526A, 0x3152 }, 
+       { 0x526F, 0x295B }, { 0x5270, 0x1E4A }, { 0x5271, 0x315B }, { 0x5272, 0x1344 }, { 0x5273, 0x3155 }, { 0x5274, 0x3153 }, 
+       { 0x5275, 0x212F }, { 0x527D, 0x3157 }, { 0x527F, 0x3156 }, { 0x5283, 0x1324 }, { 0x5287, 0x1740 }, { 0x5288, 0x315C }, 
+       { 0x5289, 0x2E0D }, { 0x528D, 0x3158 }, { 0x5291, 0x315D }, { 0x5292, 0x315A }, { 0x5294, 0x3159 }, { 0x529B, 0x2E2F }, 
+       { 0x529F, 0x1859 }, { 0x52A0, 0x1223 }, { 0x52A3, 0x2E54 }, { 0x52A9, 0x1D55 }, { 0x52AA, 0x2538 }, { 0x52AB, 0x1945 }, 
+       { 0x52AC, 0x3202 }, { 0x52AD, 0x3203 }, { 0x52B1, 0x2E45 }, { 0x52B4, 0x2F0B }, { 0x52B5, 0x3205 }, { 0x52B9, 0x185A }, 
+       { 0x52BC, 0x3204 }, { 0x52BE, 0x130F }, { 0x52C1, 0x3206 }, { 0x52C3, 0x2B36 }, { 0x52C5, 0x241C }, { 0x52C7, 0x2D06 }, 
+       { 0x52C9, 0x2A39 }, { 0x52CD, 0x3207 }, { 0x52D2, 0x5035 }, { 0x52D5, 0x2610 }, { 0x52D7, 0x3208 }, { 0x52D8, 0x140A }, 
+       { 0x52D9, 0x2C13 }, { 0x52DD, 0x1E01 }, { 0x52DE, 0x3209 }, { 0x52DF, 0x2A47 }, { 0x52E0, 0x320D }, { 0x52E2, 0x200A }, 
+       { 0x52E3, 0x320A }, { 0x52E4, 0x1630 }, { 0x52E6, 0x320B }, { 0x52E7, 0x140B }, { 0x52F2, 0x170E }, { 0x52F3, 0x320E }, 
+       { 0x52F5, 0x320F }, { 0x52F8, 0x3210 }, { 0x52F9, 0x3211 }, { 0x52FA, 0x1C3B }, { 0x52FE, 0x185B }, { 0x52FF, 0x2C3E }, 
+       { 0x5301, 0x2C48 }, { 0x5302, 0x2657 }, { 0x5305, 0x2A51 }, { 0x5306, 0x3212 }, { 0x5308, 0x3213 }, { 0x530D, 0x3215 }, 
+       { 0x530F, 0x3217 }, { 0x5310, 0x3216 }, { 0x5315, 0x3218 }, { 0x5316, 0x121D }, { 0x5317, 0x2B2C }, { 0x5319, 0x1A5C }, 
+       { 0x531A, 0x3219 }, { 0x531D, 0x2139 }, { 0x5320, 0x1E02 }, { 0x5321, 0x1609 }, { 0x5323, 0x321A }, { 0x532A, 0x283B }, 
+       { 0x532F, 0x321B }, { 0x5331, 0x321C }, { 0x5333, 0x321D }, { 0x5338, 0x321E }, { 0x5339, 0x2904 }, { 0x533A, 0x1648 }, 
+       { 0x533B, 0x1045 }, { 0x533F, 0x261F }, { 0x5340, 0x321F }, { 0x5341, 0x1D1D }, { 0x5343, 0x2049 }, { 0x5345, 0x3221 }, 
+       { 0x5346, 0x3220 }, { 0x5347, 0x1E03 }, { 0x5348, 0x1841 }, { 0x5349, 0x3223 }, { 0x534A, 0x281E }, { 0x534D, 0x3224 }, 
+       { 0x5351, 0x283C }, { 0x5352, 0x2214 }, { 0x5353, 0x224E }, { 0x5354, 0x1608 }, { 0x5357, 0x264E }, { 0x5358, 0x2311 }, 
+       { 0x535A, 0x274E }, { 0x535C, 0x2B2E }, { 0x535E, 0x3226 }, { 0x5360, 0x204A }, { 0x5366, 0x1715 }, { 0x5369, 0x3227 }, 
+       { 0x536E, 0x3228 }, { 0x536F, 0x110C }, { 0x5370, 0x1055 }, { 0x5371, 0x144D }, { 0x5373, 0x2208 }, { 0x5374, 0x1531 }, 
+       { 0x5375, 0x2D51 }, { 0x5377, 0x322B }, { 0x5378, 0x1217 }, { 0x537B, 0x322A }, { 0x537F, 0x160A }, { 0x5382, 0x322C }, 
+       { 0x5384, 0x2C51 }, { 0x5396, 0x322D }, { 0x5398, 0x2E32 }, { 0x539A, 0x185C }, { 0x539F, 0x1816 }, { 0x53A0, 0x322E }, 
+       { 0x53A5, 0x3230 }, { 0x53A6, 0x322F }, { 0x53A8, 0x1F3F }, { 0x53A9, 0x1119 }, { 0x53AD, 0x113E }, { 0x53AE, 0x3231 }, 
+       { 0x53B0, 0x3232 }, { 0x53B3, 0x1817 }, { 0x53B6, 0x3233 }, { 0x53BB, 0x154E }, { 0x53C2, 0x1B12 }, { 0x53C3, 0x3234 }, 
+       { 0x53C8, 0x2B54 }, { 0x53C9, 0x1A15 }, { 0x53CA, 0x153A }, { 0x53CB, 0x2D07 }, { 0x53CC, 0x2130 }, { 0x53CD, 0x281F }, 
+       { 0x53CE, 0x1C5D }, { 0x53D4, 0x1D27 }, { 0x53D6, 0x1C48 }, { 0x53D7, 0x1C55 }, { 0x53D9, 0x1D56 }, { 0x53DB, 0x2820 }, 
+       { 0x53DF, 0x3237 }, { 0x53E1, 0x1123 }, { 0x53E2, 0x2131 }, { 0x53E3, 0x185D }, { 0x53E4, 0x1825 }, { 0x53E5, 0x1647 }, 
+       { 0x53E8, 0x323B }, { 0x53E9, 0x2301 }, { 0x53EA, 0x225E }, { 0x53EB, 0x160B }, { 0x53EC, 0x1E04 }, { 0x53ED, 0x323C }, 
+       { 0x53EE, 0x323A }, { 0x53EF, 0x1224 }, { 0x53F0, 0x2246 }, { 0x53F1, 0x1C18 }, { 0x53F2, 0x1B2B }, { 0x53F3, 0x1106 }, 
+       { 0x53F6, 0x1350 }, { 0x53F7, 0x1946 }, { 0x53F8, 0x1B2A }, { 0x53FA, 0x323D }, { 0x5401, 0x323E }, { 0x5403, 0x1529 }, 
+       { 0x5404, 0x1326 }, { 0x5408, 0x1947 }, { 0x5409, 0x1528 }, { 0x540A, 0x243F }, { 0x540B, 0x1105 }, { 0x540C, 0x2611 }, 
+       { 0x540D, 0x2C1E }, { 0x540E, 0x1901 }, { 0x540F, 0x2D59 }, { 0x5410, 0x2527 }, { 0x5411, 0x185E }, { 0x541B, 0x170F }, 
+       { 0x541D, 0x3247 }, { 0x541F, 0x1643 }, { 0x5420, 0x2B2A }, { 0x5426, 0x283D }, { 0x5429, 0x3246 }, { 0x542B, 0x143E }, 
+       { 0x542C, 0x3241 }, { 0x542D, 0x3242 }, { 0x542E, 0x3244 }, { 0x5436, 0x3245 }, { 0x5438, 0x153B }, { 0x5439, 0x1F41 }, 
+       { 0x543B, 0x2A0D }, { 0x543C, 0x3243 }, { 0x543D, 0x323F }, { 0x543E, 0x1843 }, { 0x5440, 0x3240 }, { 0x5442, 0x2F04 }, 
+       { 0x5446, 0x2A52 }, { 0x5448, 0x2448 }, { 0x5449, 0x1842 }, { 0x544A, 0x1950 }, { 0x544E, 0x3248 }, { 0x5451, 0x263D }, 
+       { 0x545F, 0x324C }, { 0x5468, 0x1C5E }, { 0x546A, 0x1C56 }, { 0x5470, 0x324F }, { 0x5471, 0x324D }, { 0x5473, 0x2C03 }, 
+       { 0x5475, 0x324A }, { 0x5476, 0x3253 }, { 0x5477, 0x324E }, { 0x547B, 0x3251 }, { 0x547C, 0x1826 }, { 0x547D, 0x2C1F }, 
+       { 0x5480, 0x3252 }, { 0x5484, 0x3254 }, { 0x5486, 0x3256 }, { 0x548B, 0x1A50 }, { 0x548C, 0x2F22 }, { 0x548E, 0x324B }, 
+       { 0x548F, 0x3249 }, { 0x5490, 0x3255 }, { 0x5492, 0x3250 }, { 0x54A2, 0x3258 }, { 0x54A4, 0x3303 }, { 0x54A5, 0x325A }, 
+       { 0x54A8, 0x325E }, { 0x54AB, 0x3301 }, { 0x54AC, 0x325B }, { 0x54AF, 0x331E }, { 0x54B2, 0x1A49 }, { 0x54B3, 0x1311 }, 
+       { 0x54B8, 0x3259 }, { 0x54BC, 0x3305 }, { 0x54BD, 0x1056 }, { 0x54BE, 0x3304 }, { 0x54C0, 0x1005 }, { 0x54C1, 0x292A }, 
+       { 0x54C2, 0x3302 }, { 0x54C4, 0x325C }, { 0x54C7, 0x3257 }, { 0x54C8, 0x325D }, { 0x54C9, 0x1A28 }, { 0x54D8, 0x3306 }, 
+       { 0x54E1, 0x1057 }, { 0x54E2, 0x330F }, { 0x54E5, 0x3307 }, { 0x54E6, 0x3308 }, { 0x54E8, 0x1E05 }, { 0x54E9, 0x2B49 }, 
+       { 0x54ED, 0x330D }, { 0x54EE, 0x330C }, { 0x54F2, 0x250F }, { 0x54FA, 0x330E }, { 0x54FD, 0x330B }, { 0x5504, 0x1114 }, 
+       { 0x5506, 0x1A16 }, { 0x5507, 0x1F10 }, { 0x550F, 0x3309 }, { 0x5510, 0x2542 }, { 0x5514, 0x330A }, { 0x5516, 0x1002 }, 
+       { 0x552E, 0x3314 }, { 0x552F, 0x2D03 }, { 0x5531, 0x1E07 }, { 0x5533, 0x331A }, { 0x5538, 0x3319 }, { 0x5539, 0x3310 }, 
+       { 0x553E, 0x2223 }, { 0x5540, 0x3311 }, { 0x5544, 0x224F }, { 0x5545, 0x3316 }, { 0x5546, 0x1E06 }, { 0x554C, 0x3313 }, 
+       { 0x554F, 0x2C44 }, { 0x5553, 0x171C }, { 0x5556, 0x3317 }, { 0x5557, 0x3318 }, { 0x555C, 0x3315 }, { 0x555D, 0x331B }, 
+       { 0x5563, 0x3312 }, { 0x557B, 0x3321 }, { 0x557C, 0x3326 }, { 0x557E, 0x3322 }, { 0x5580, 0x331D }, { 0x5583, 0x3327 }, 
+       { 0x5584, 0x2111 }, { 0x5587, 0x3329 }, { 0x5589, 0x1902 }, { 0x558A, 0x331F }, { 0x558B, 0x235D }, { 0x5598, 0x3323 }, 
+       { 0x5599, 0x331C }, { 0x559A, 0x140D }, { 0x559C, 0x144E }, { 0x559D, 0x1345 }, { 0x559E, 0x3324 }, { 0x559F, 0x3320 }, 
+       { 0x55A7, 0x1756 }, { 0x55A8, 0x332A }, { 0x55A9, 0x3328 }, { 0x55AA, 0x2133 }, { 0x55AB, 0x152A }, { 0x55AC, 0x160C }, 
+       { 0x55AE, 0x3325 }, { 0x55B0, 0x1654 }, { 0x55B6, 0x1124 }, { 0x55C4, 0x332E }, { 0x55C5, 0x332C }, { 0x55C7, 0x3407 }, 
+       { 0x55D4, 0x3331 }, { 0x55DA, 0x332B }, { 0x55DC, 0x332F }, { 0x55DF, 0x332D }, { 0x55E3, 0x1B2C }, { 0x55E4, 0x3330 }, 
+       { 0x55F7, 0x3333 }, { 0x55F9, 0x3338 }, { 0x55FD, 0x3336 }, { 0x55FE, 0x3335 }, { 0x5606, 0x2312 }, { 0x5609, 0x1225 }, 
+       { 0x5614, 0x3332 }, { 0x5616, 0x3334 }, { 0x5617, 0x1E08 }, { 0x5618, 0x1113 }, { 0x561B, 0x3337 }, { 0x5629, 0x123E }, 
+       { 0x562F, 0x3342 }, { 0x5631, 0x1E5C }, { 0x5632, 0x333E }, { 0x5634, 0x333C }, { 0x5636, 0x333D }, { 0x5638, 0x333F }, 
+       { 0x5642, 0x111D }, { 0x564C, 0x2119 }, { 0x564E, 0x3339 }, { 0x5650, 0x333A }, { 0x565B, 0x135A }, { 0x5664, 0x3341 }, 
+       { 0x5668, 0x144F }, { 0x566A, 0x3344 }, { 0x566B, 0x3340 }, { 0x566C, 0x3343 }, { 0x5674, 0x2A0E }, { 0x5678, 0x2635 }, 
+       { 0x567A, 0x2818 }, { 0x5680, 0x3346 }, { 0x5686, 0x3345 }, { 0x5687, 0x1325 }, { 0x568A, 0x3347 }, { 0x568F, 0x334A }, 
+       { 0x5694, 0x3349 }, { 0x56A0, 0x3348 }, { 0x56A2, 0x2719 }, { 0x56A5, 0x334B }, { 0x56AE, 0x334C }, { 0x56B4, 0x334E }, 
+       { 0x56B6, 0x334D }, { 0x56BC, 0x3350 }, { 0x56C0, 0x3353 }, { 0x56C1, 0x3351 }, { 0x56C2, 0x334F }, { 0x56C3, 0x3352 }, 
+       { 0x56C8, 0x3354 }, { 0x56CE, 0x3355 }, { 0x56D1, 0x3356 }, { 0x56D3, 0x3357 }, { 0x56D7, 0x3358 }, { 0x56D8, 0x3125 }, 
+       { 0x56DA, 0x1C5C }, { 0x56DB, 0x1B2D }, { 0x56DE, 0x1253 }, { 0x56E0, 0x1058 }, { 0x56E3, 0x2324 }, { 0x56EE, 0x3359 }, 
+       { 0x56F0, 0x1A04 }, { 0x56F2, 0x102F }, { 0x56F3, 0x1F3E }, { 0x56F9, 0x335A }, { 0x56FA, 0x1827 }, { 0x56FD, 0x1951 }, 
+       { 0x56FF, 0x335C }, { 0x5700, 0x335B }, { 0x5703, 0x2A40 }, { 0x5704, 0x335D }, { 0x5708, 0x3401 }, { 0x5709, 0x335E }, 
+       { 0x570B, 0x3402 }, { 0x570D, 0x3403 }, { 0x570F, 0x1757 }, { 0x5712, 0x1140 }, { 0x5713, 0x3404 }, { 0x5716, 0x3406 }, 
+       { 0x5718, 0x3405 }, { 0x571C, 0x3408 }, { 0x571F, 0x253A }, { 0x5726, 0x3409 }, { 0x5727, 0x1015 }, { 0x5728, 0x1A3F }, 
+       { 0x572D, 0x171D }, { 0x5730, 0x232F }, { 0x5737, 0x340A }, { 0x5738, 0x340B }, { 0x573B, 0x340D }, { 0x5740, 0x340E }, 
+       { 0x5742, 0x1A44 }, { 0x5747, 0x1631 }, { 0x574A, 0x2B17 }, { 0x574E, 0x340C }, { 0x574F, 0x340F }, { 0x5750, 0x1A21 }, 
+       { 0x5751, 0x1903 }, { 0x5761, 0x3413 }, { 0x5764, 0x1A05 }, { 0x5766, 0x2313 }, { 0x5769, 0x3410 }, { 0x576A, 0x243A }, 
+       { 0x577F, 0x3414 }, { 0x5782, 0x1F42 }, { 0x5788, 0x3412 }, { 0x5789, 0x3415 }, { 0x578B, 0x171F }, { 0x5793, 0x3416 }, 
+       { 0x57A0, 0x3417 }, { 0x57A2, 0x1904 }, { 0x57A3, 0x1320 }, { 0x57A4, 0x3419 }, { 0x57AA, 0x341A }, { 0x57B0, 0x341B }, 
+       { 0x57B3, 0x3418 }, { 0x57C0, 0x3411 }, { 0x57C3, 0x341C }, { 0x57C6, 0x341D }, { 0x57CB, 0x2B44 }, { 0x57CE, 0x1E4B }, 
+       { 0x57D2, 0x341F }, { 0x57D3, 0x3420 }, { 0x57D4, 0x341E }, { 0x57D6, 0x3422 }, { 0x57DC, 0x2718 }, { 0x57DF, 0x1048 }, 
+       { 0x57E0, 0x2936 }, { 0x57E3, 0x3423 }, { 0x57F4, 0x1E5D }, { 0x57F7, 0x1C19 }, { 0x57F9, 0x273D }, { 0x57FA, 0x1450 }, 
+       { 0x57FC, 0x1A4B }, { 0x5800, 0x2B39 }, { 0x5802, 0x2612 }, { 0x5805, 0x1758 }, { 0x5806, 0x222F }, { 0x580A, 0x3421 }, 
+       { 0x580B, 0x3424 }, { 0x5815, 0x2224 }, { 0x5819, 0x3425 }, { 0x581D, 0x3426 }, { 0x5821, 0x3428 }, { 0x5824, 0x2449 }, 
+       { 0x582A, 0x140E }, { 0x582F, 0x5401 }, { 0x5830, 0x1141 }, { 0x5831, 0x2A53 }, { 0x5834, 0x1E4C }, { 0x5835, 0x2528 }, 
+       { 0x583A, 0x1A46 }, { 0x583D, 0x342E }, { 0x5840, 0x2A1D }, { 0x5841, 0x2E3D }, { 0x584A, 0x1254 }, { 0x584B, 0x342A }, 
+       { 0x5851, 0x211A }, { 0x5852, 0x342D }, { 0x5854, 0x2543 }, { 0x5857, 0x2529 }, { 0x5858, 0x2544 }, { 0x5859, 0x2819 }, 
+       { 0x585A, 0x242D }, { 0x585E, 0x1A29 }, { 0x5862, 0x3429 }, { 0x5869, 0x1156 }, { 0x586B, 0x2516 }, { 0x5870, 0x342B }, 
+       { 0x5872, 0x3427 }, { 0x5875, 0x1F30 }, { 0x5879, 0x342F }, { 0x587E, 0x1D2E }, { 0x5883, 0x160D }, { 0x5885, 0x3430 }, 
+       { 0x5893, 0x2A48 }, { 0x5897, 0x215D }, { 0x589C, 0x2426 }, { 0x589F, 0x3432 }, { 0x58A8, 0x2B2F }, { 0x58AB, 0x3433 }, 
+       { 0x58AE, 0x3438 }, { 0x58B3, 0x2A0F }, { 0x58B8, 0x3437 }, { 0x58B9, 0x3431 }, { 0x58BA, 0x3434 }, { 0x58BB, 0x3436 }, 
+       { 0x58BE, 0x1A06 }, { 0x58C1, 0x2A29 }, { 0x58C5, 0x3439 }, { 0x58C7, 0x2325 }, { 0x58CA, 0x1255 }, { 0x58CC, 0x1E4D }, 
+       { 0x58D1, 0x343B }, { 0x58D3, 0x343A }, { 0x58D5, 0x1948 }, { 0x58D7, 0x343C }, { 0x58D8, 0x343E }, { 0x58D9, 0x343D }, 
+       { 0x58DC, 0x3440 }, { 0x58DE, 0x3435 }, { 0x58DF, 0x3442 }, { 0x58E4, 0x3441 }, { 0x58E5, 0x343F }, { 0x58EB, 0x1B2E }, 
+       { 0x58EC, 0x1F31 }, { 0x58EE, 0x2134 }, { 0x58EF, 0x3443 }, { 0x58F0, 0x201C }, { 0x58F1, 0x104D }, { 0x58F2, 0x2744 }, 
+       { 0x58F7, 0x243B }, { 0x58F9, 0x3445 }, { 0x58FA, 0x3444 }, { 0x58FB, 0x3446 }, { 0x58FC, 0x3447 }, { 0x58FD, 0x3448 }, 
+       { 0x5902, 0x3449 }, { 0x5909, 0x2A31 }, { 0x590A, 0x344A }, { 0x590F, 0x1226 }, { 0x5910, 0x344B }, { 0x5915, 0x2D1C }, 
+       { 0x5916, 0x1310 }, { 0x5918, 0x3229 }, { 0x5919, 0x1D28 }, { 0x591A, 0x221F }, { 0x591B, 0x344C }, { 0x591C, 0x2C4B }, 
+       { 0x5922, 0x2C14 }, { 0x5925, 0x344E }, { 0x5927, 0x2247 }, { 0x5929, 0x2517 }, { 0x592A, 0x2220 }, { 0x592B, 0x2937 }, 
+       { 0x592C, 0x344F }, { 0x592D, 0x3450 }, { 0x592E, 0x115B }, { 0x5931, 0x1C1A }, { 0x5932, 0x3451 }, { 0x5937, 0x1030 }, 
+       { 0x5938, 0x3452 }, { 0x593E, 0x3453 }, { 0x5944, 0x1142 }, { 0x5947, 0x1451 }, { 0x5948, 0x2640 }, { 0x5949, 0x2A54 }, 
+       { 0x594E, 0x3457 }, { 0x594F, 0x2135 }, { 0x5950, 0x3456 }, { 0x5951, 0x1720 }, { 0x5954, 0x2B3B }, { 0x5955, 0x3455 }, 
+       { 0x5957, 0x2545 }, { 0x5958, 0x3459 }, { 0x595A, 0x3458 }, { 0x5960, 0x345B }, { 0x5962, 0x345A }, { 0x5965, 0x115C }, 
+       { 0x5967, 0x345C }, { 0x5968, 0x1E09 }, { 0x5969, 0x345E }, { 0x596A, 0x2305 }, { 0x596C, 0x345D }, { 0x596E, 0x2A13 }, 
+       { 0x5973, 0x1D57 }, { 0x5974, 0x253B }, { 0x5978, 0x3501 }, { 0x597D, 0x1905 }, { 0x5981, 0x3502 }, { 0x5982, 0x2701 }, 
+       { 0x5983, 0x283E }, { 0x5984, 0x2C31 }, { 0x598A, 0x2705 }, { 0x598D, 0x350B }, { 0x5993, 0x1518 }, { 0x5996, 0x2D25 }, 
+       { 0x5999, 0x2C0F }, { 0x599B, 0x360C }, { 0x599D, 0x3503 }, { 0x59A3, 0x3506 }, { 0x59A5, 0x2225 }, { 0x59A8, 0x2B18 }, 
+       { 0x59AC, 0x252A }, { 0x59B2, 0x3507 }, { 0x59B9, 0x2B45 }, { 0x59BB, 0x1A2A }, { 0x59BE, 0x1E0A }, { 0x59C6, 0x3508 }, 
+       { 0x59C9, 0x1B30 }, { 0x59CB, 0x1B2F }, { 0x59D0, 0x1019 }, { 0x59D1, 0x1828 }, { 0x59D3, 0x200B }, { 0x59D4, 0x1031 }, 
+       { 0x59D9, 0x350C }, { 0x59DA, 0x350D }, { 0x59DC, 0x350A }, { 0x59E5, 0x1118 }, { 0x59E6, 0x140F }, { 0x59E8, 0x3509 }, 
+       { 0x59EA, 0x2C25 }, { 0x59EB, 0x2911 }, { 0x59F6, 0x1008 }, { 0x59FB, 0x1059 }, { 0x59FF, 0x1B31 }, { 0x5A01, 0x1032 }, 
+       { 0x5A03, 0x1003 }, { 0x5A09, 0x3512 }, { 0x5A11, 0x3510 }, { 0x5A18, 0x2C1C }, { 0x5A1A, 0x3513 }, { 0x5A1C, 0x3511 }, 
+       { 0x5A1F, 0x350F }, { 0x5A20, 0x1F11 }, { 0x5A25, 0x350E }, { 0x5A29, 0x2A3A }, { 0x5A2F, 0x1844 }, { 0x5A35, 0x3517 }, 
+       { 0x5A36, 0x3518 }, { 0x5A3C, 0x1E0B }, { 0x5A40, 0x3514 }, { 0x5A41, 0x2F0C }, { 0x5A46, 0x272C }, { 0x5A49, 0x3516 }, 
+       { 0x5A5A, 0x1A07 }, { 0x5A62, 0x3519 }, { 0x5A66, 0x2938 }, { 0x5A6A, 0x351A }, { 0x5A6C, 0x3515 }, { 0x5A7F, 0x2C1B }, 
+       { 0x5A92, 0x273E }, { 0x5A9A, 0x351B }, { 0x5A9B, 0x2912 }, { 0x5ABC, 0x351C }, { 0x5ABD, 0x3520 }, { 0x5ABE, 0x351D }, 
+       { 0x5AC1, 0x1227 }, { 0x5AC2, 0x351F }, { 0x5AC9, 0x1C1B }, { 0x5ACB, 0x351E }, { 0x5ACC, 0x1759 }, { 0x5AD0, 0x352C }, 
+       { 0x5AD6, 0x3525 }, { 0x5AD7, 0x3522 }, { 0x5AE1, 0x2344 }, { 0x5AE3, 0x3521 }, { 0x5AE6, 0x3523 }, { 0x5AE9, 0x3524 }, 
+       { 0x5AFA, 0x3526 }, { 0x5AFB, 0x3527 }, { 0x5B09, 0x1452 }, { 0x5B0B, 0x3529 }, { 0x5B0C, 0x3528 }, { 0x5B16, 0x352A }, 
+       { 0x5B22, 0x1E4E }, { 0x5B2A, 0x352D }, { 0x5B2C, 0x243C }, { 0x5B30, 0x1125 }, { 0x5B32, 0x352B }, { 0x5B36, 0x352E }, 
+       { 0x5B3E, 0x352F }, { 0x5B40, 0x3532 }, { 0x5B43, 0x3530 }, { 0x5B45, 0x3531 }, { 0x5B50, 0x1B32 }, { 0x5B51, 0x3533 }, 
+       { 0x5B54, 0x1906 }, { 0x5B55, 0x3534 }, { 0x5B57, 0x1B5A }, { 0x5B58, 0x2218 }, { 0x5B5A, 0x3535 }, { 0x5B5B, 0x3536 }, 
+       { 0x5B5C, 0x1B3A }, { 0x5B5D, 0x1907 }, { 0x5B5F, 0x2C32 }, { 0x5B63, 0x1508 }, { 0x5B64, 0x1829 }, { 0x5B65, 0x3537 }, 
+       { 0x5B66, 0x1338 }, { 0x5B69, 0x3538 }, { 0x5B6B, 0x2219 }, { 0x5B70, 0x3539 }, { 0x5B71, 0x3603 }, { 0x5B73, 0x353A }, 
+       { 0x5B75, 0x353B }, { 0x5B78, 0x353C }, { 0x5B7A, 0x353E }, { 0x5B80, 0x353F }, { 0x5B83, 0x3540 }, { 0x5B85, 0x2250 }, 
+       { 0x5B87, 0x1107 }, { 0x5B88, 0x1C49 }, { 0x5B89, 0x1022 }, { 0x5B8B, 0x2137 }, { 0x5B8C, 0x1410 }, { 0x5B8D, 0x1C15 }, 
+       { 0x5B8F, 0x1908 }, { 0x5B95, 0x2546 }, { 0x5B97, 0x1D01 }, { 0x5B98, 0x1411 }, { 0x5B99, 0x2348 }, { 0x5B9A, 0x244A }, 
+       { 0x5B9B, 0x1018 }, { 0x5B9C, 0x1519 }, { 0x5B9D, 0x2A55 }, { 0x5B9F, 0x1C22 }, { 0x5BA2, 0x1532 }, { 0x5BA3, 0x204B }, 
+       { 0x5BA4, 0x1C1C }, { 0x5BA5, 0x2D08 }, { 0x5BA6, 0x3541 }, { 0x5BAE, 0x153C }, { 0x5BB0, 0x1A2B }, { 0x5BB3, 0x1312 }, 
+       { 0x5BB4, 0x1143 }, { 0x5BB5, 0x1E0C }, { 0x5BB6, 0x1228 }, { 0x5BB8, 0x3542 }, { 0x5BB9, 0x2D26 }, { 0x5BBF, 0x1D29 }, 
+       { 0x5BC2, 0x1C44 }, { 0x5BC3, 0x3543 }, { 0x5BC4, 0x1453 }, { 0x5BC5, 0x2632 }, { 0x5BC6, 0x2C09 }, { 0x5BC7, 0x3544 }, 
+       { 0x5BC9, 0x3545 }, { 0x5BCC, 0x2939 }, { 0x5BD0, 0x3547 }, { 0x5BD2, 0x1408 }, { 0x5BD3, 0x1657 }, { 0x5BD4, 0x3546 }, 
+       { 0x5BDB, 0x1412 }, { 0x5BDD, 0x1F12 }, { 0x5BDE, 0x354B }, { 0x5BDF, 0x1B01 }, { 0x5BE1, 0x1229 }, { 0x5BE2, 0x354A }, 
+       { 0x5BE4, 0x3548 }, { 0x5BE5, 0x354C }, { 0x5BE6, 0x3549 }, { 0x5BE7, 0x270B }, { 0x5BE8, 0x3C2D }, { 0x5BE9, 0x1F13 }, 
+       { 0x5BEB, 0x354D }, { 0x5BEE, 0x2E20 }, { 0x5BF0, 0x354E }, { 0x5BF3, 0x3550 }, { 0x5BF5, 0x235E }, { 0x5BF6, 0x354F }, 
+       { 0x5BF8, 0x2003 }, { 0x5BFA, 0x1B5B }, { 0x5BFE, 0x2230 }, { 0x5BFF, 0x1C57 }, { 0x5C01, 0x2955 }, { 0x5C02, 0x204C }, 
+       { 0x5C04, 0x1C2D }, { 0x5C05, 0x3551 }, { 0x5C06, 0x1E0D }, { 0x5C07, 0x3552 }, { 0x5C08, 0x3553 }, { 0x5C09, 0x1033 }, 
+       { 0x5C0A, 0x221A }, { 0x5C0B, 0x1F32 }, { 0x5C0D, 0x3554 }, { 0x5C0E, 0x2613 }, { 0x5C0F, 0x1E0E }, { 0x5C11, 0x1E0F }, 
+       { 0x5C13, 0x3555 }, { 0x5C16, 0x204D }, { 0x5C1A, 0x1E10 }, { 0x5C20, 0x3556 }, { 0x5C22, 0x3557 }, { 0x5C24, 0x2C40 }, 
+       { 0x5C28, 0x3558 }, { 0x5C2D, 0x1626 }, { 0x5C31, 0x1D02 }, { 0x5C38, 0x3559 }, { 0x5C39, 0x355A }, { 0x5C3A, 0x1C3C }, 
+       { 0x5C3B, 0x1F0C }, { 0x5C3C, 0x2654 }, { 0x5C3D, 0x1F34 }, { 0x5C3E, 0x2858 }, { 0x5C3F, 0x2702 }, { 0x5C40, 0x1629 }, 
+       { 0x5C41, 0x355B }, { 0x5C45, 0x154F }, { 0x5C46, 0x355C }, { 0x5C48, 0x165E }, { 0x5C4A, 0x262F }, { 0x5C4B, 0x1210 }, 
+       { 0x5C4D, 0x1B33 }, { 0x5C4E, 0x355D }, { 0x5C4F, 0x3602 }, { 0x5C50, 0x3601 }, { 0x5C51, 0x165D }, { 0x5C53, 0x355E }, 
+       { 0x5C55, 0x2518 }, { 0x5C5E, 0x2210 }, { 0x5C60, 0x252B }, { 0x5C61, 0x1C28 }, { 0x5C64, 0x2138 }, { 0x5C65, 0x2D5A }, 
+       { 0x5C6C, 0x3604 }, { 0x5C6E, 0x3605 }, { 0x5C6F, 0x2636 }, { 0x5C71, 0x1B13 }, { 0x5C76, 0x3607 }, { 0x5C79, 0x3608 }, 
+       { 0x5C8C, 0x3609 }, { 0x5C90, 0x1454 }, { 0x5C91, 0x360A }, { 0x5C94, 0x360B }, { 0x5CA1, 0x120C }, { 0x5CA8, 0x211B }, 
+       { 0x5CA9, 0x1444 }, { 0x5CAB, 0x360D }, { 0x5CAC, 0x2C08 }, { 0x5CB1, 0x2232 }, { 0x5CB3, 0x1339 }, { 0x5CB6, 0x360F }, 
+       { 0x5CB7, 0x3611 }, { 0x5CB8, 0x143F }, { 0x5CBB, 0x360E }, { 0x5CBC, 0x3610 }, { 0x5CBE, 0x3613 }, { 0x5CC5, 0x3612 }, 
+       { 0x5CC7, 0x3614 }, { 0x5CD9, 0x3615 }, { 0x5CE0, 0x261D }, { 0x5CE1, 0x160E }, { 0x5CE8, 0x1245 }, { 0x5CE9, 0x3616 }, 
+       { 0x5CEA, 0x361B }, { 0x5CED, 0x3619 }, { 0x5CEF, 0x2A57 }, { 0x5CF0, 0x2A56 }, { 0x5CF6, 0x2547 }, { 0x5CFA, 0x3618 }, 
+       { 0x5CFB, 0x1D34 }, { 0x5CFD, 0x3617 }, { 0x5D07, 0x1F52 }, { 0x5D0B, 0x361C }, { 0x5D0E, 0x1A4A }, { 0x5D11, 0x3622 }, 
+       { 0x5D14, 0x3623 }, { 0x5D15, 0x361D }, { 0x5D16, 0x1313 }, { 0x5D17, 0x361E }, { 0x5D18, 0x3627 }, { 0x5D19, 0x3626 }, 
+       { 0x5D1A, 0x3625 }, { 0x5D1B, 0x3621 }, { 0x5D1F, 0x3620 }, { 0x5D22, 0x3624 }, { 0x5D29, 0x2A58 }, { 0x5D4B, 0x362B }, 
+       { 0x5D4C, 0x3628 }, { 0x5D4E, 0x362A }, { 0x5D50, 0x2D52 }, { 0x5D52, 0x3629 }, { 0x5D5C, 0x361F }, { 0x5D69, 0x1F53 }, 
+       { 0x5D6C, 0x362C }, { 0x5D6F, 0x1A17 }, { 0x5D73, 0x362D }, { 0x5D76, 0x362E }, { 0x5D82, 0x3631 }, { 0x5D84, 0x3630 }, 
+       { 0x5D87, 0x362F }, { 0x5D8B, 0x2548 }, { 0x5D8C, 0x361A }, { 0x5D90, 0x3637 }, { 0x5D9D, 0x3633 }, { 0x5DA2, 0x3632 }, 
+       { 0x5DAC, 0x3634 }, { 0x5DAE, 0x3635 }, { 0x5DB7, 0x3638 }, { 0x5DBA, 0x2E46 }, { 0x5DBC, 0x3639 }, { 0x5DBD, 0x3636 }, 
+       { 0x5DC9, 0x363A }, { 0x5DCC, 0x1440 }, { 0x5DCD, 0x363B }, { 0x5DD2, 0x363D }, { 0x5DD3, 0x363C }, { 0x5DD6, 0x363E }, 
+       { 0x5DDB, 0x363F }, { 0x5DDD, 0x204E }, { 0x5DDE, 0x1D03 }, { 0x5DE1, 0x1D44 }, { 0x5DE3, 0x2143 }, { 0x5DE5, 0x1909 }, 
+       { 0x5DE6, 0x1A18 }, { 0x5DE7, 0x190A }, { 0x5DE8, 0x1550 }, { 0x5DEB, 0x3640 }, { 0x5DEE, 0x1A19 }, { 0x5DF1, 0x182A }, 
+       { 0x5DF2, 0x3641 }, { 0x5DF3, 0x2C06 }, { 0x5DF4, 0x2723 }, { 0x5DF5, 0x3642 }, { 0x5DF7, 0x190B }, { 0x5DFB, 0x140C }, 
+       { 0x5DFD, 0x2307 }, { 0x5DFE, 0x1632 }, { 0x5E02, 0x1B34 }, { 0x5E03, 0x293B }, { 0x5E06, 0x2821 }, { 0x5E0B, 0x3643 }, 
+       { 0x5E0C, 0x1455 }, { 0x5E11, 0x3646 }, { 0x5E16, 0x2401 }, { 0x5E19, 0x3645 }, { 0x5E1A, 0x3644 }, { 0x5E1B, 0x3647 }, 
+       { 0x5E1D, 0x244B }, { 0x5E25, 0x1F43 }, { 0x5E2B, 0x1B35 }, { 0x5E2D, 0x202A }, { 0x5E2F, 0x2233 }, { 0x5E30, 0x1502 }, 
+       { 0x5E33, 0x2402 }, { 0x5E36, 0x3648 }, { 0x5E37, 0x3649 }, { 0x5E38, 0x1E4F }, { 0x5E3D, 0x2B19 }, { 0x5E40, 0x364C }, 
+       { 0x5E43, 0x364B }, { 0x5E44, 0x364A }, { 0x5E45, 0x295D }, { 0x5E47, 0x3653 }, { 0x5E4C, 0x2B3A }, { 0x5E4E, 0x364D }, 
+       { 0x5E54, 0x364F }, { 0x5E55, 0x2B4B }, { 0x5E57, 0x364E }, { 0x5E5F, 0x3650 }, { 0x5E61, 0x2808 }, { 0x5E62, 0x3651 }, 
+       { 0x5E63, 0x2A1E }, { 0x5E64, 0x3652 }, { 0x5E72, 0x1413 }, { 0x5E73, 0x2A1F }, { 0x5E74, 0x270F }, { 0x5E75, 0x3654 }, 
+       { 0x5E76, 0x3655 }, { 0x5E78, 0x190C }, { 0x5E79, 0x1414 }, { 0x5E7A, 0x3656 }, { 0x5E7B, 0x1818 }, { 0x5E7C, 0x2D24 }, 
+       { 0x5E7D, 0x2D09 }, { 0x5E7E, 0x1456 }, { 0x5E7F, 0x3658 }, { 0x5E81, 0x2403 }, { 0x5E83, 0x190D }, { 0x5E84, 0x1E11 }, 
+       { 0x5E87, 0x283F }, { 0x5E8A, 0x1E12 }, { 0x5E8F, 0x1D58 }, { 0x5E95, 0x244C }, { 0x5E96, 0x2A59 }, { 0x5E97, 0x2519 }, 
+       { 0x5E9A, 0x190E }, { 0x5E9C, 0x293C }, { 0x5EA0, 0x3659 }, { 0x5EA6, 0x2539 }, { 0x5EA7, 0x1A22 }, { 0x5EAB, 0x182B }, 
+       { 0x5EAD, 0x244D }, { 0x5EB5, 0x1023 }, { 0x5EB6, 0x1D4E }, { 0x5EB7, 0x190F }, { 0x5EB8, 0x2D27 }, { 0x5EC1, 0x365A }, 
+       { 0x5EC2, 0x365B }, { 0x5EC3, 0x2731 }, { 0x5EC8, 0x365C }, { 0x5EC9, 0x2E57 }, { 0x5ECA, 0x2F0D }, { 0x5ECF, 0x365E }, 
+       { 0x5ED0, 0x365D }, { 0x5ED3, 0x1327 }, { 0x5ED6, 0x3701 }, { 0x5EDA, 0x3704 }, { 0x5EDB, 0x3705 }, { 0x5EDD, 0x3703 }, 
+       { 0x5EDF, 0x2920 }, { 0x5EE0, 0x1E13 }, { 0x5EE1, 0x3707 }, { 0x5EE2, 0x3706 }, { 0x5EE3, 0x3702 }, { 0x5EE8, 0x3708 }, 
+       { 0x5EE9, 0x3709 }, { 0x5EEC, 0x370A }, { 0x5EF0, 0x370D }, { 0x5EF1, 0x370B }, { 0x5EF3, 0x370C }, { 0x5EF4, 0x370E }, 
+       { 0x5EF6, 0x1144 }, { 0x5EF7, 0x244E }, { 0x5EF8, 0x370F }, { 0x5EFA, 0x175A }, { 0x5EFB, 0x1256 }, { 0x5EFC, 0x2716 }, 
+       { 0x5EFE, 0x3710 }, { 0x5EFF, 0x265B }, { 0x5F01, 0x2A3B }, { 0x5F03, 0x3711 }, { 0x5F04, 0x2F0E }, { 0x5F09, 0x3712 }, 
+       { 0x5F0A, 0x2A20 }, { 0x5F0B, 0x3715 }, { 0x5F0C, 0x3001 }, { 0x5F0D, 0x3011 }, { 0x5F0F, 0x1C10 }, { 0x5F10, 0x2655 }, 
+       { 0x5F11, 0x3716 }, { 0x5F13, 0x153D }, { 0x5F14, 0x2404 }, { 0x5F15, 0x105A }, { 0x5F16, 0x3717 }, { 0x5F17, 0x2A06 }, 
+       { 0x5F18, 0x1910 }, { 0x5F1B, 0x2330 }, { 0x5F1F, 0x244F }, { 0x5F25, 0x2C4F }, { 0x5F26, 0x1819 }, { 0x5F27, 0x182C }, 
+       { 0x5F29, 0x3718 }, { 0x5F2D, 0x3719 }, { 0x5F2F, 0x371F }, { 0x5F31, 0x1C45 }, { 0x5F35, 0x2405 }, { 0x5F37, 0x160F }, 
+       { 0x5F38, 0x371A }, { 0x5F3C, 0x290B }, { 0x5F3E, 0x2326 }, { 0x5F41, 0x371B }, { 0x5F48, 0x371C }, { 0x5F4A, 0x1610 }, 
+       { 0x5F4C, 0x371D }, { 0x5F4E, 0x371E }, { 0x5F51, 0x3720 }, { 0x5F53, 0x2556 }, { 0x5F56, 0x3721 }, { 0x5F57, 0x3722 }, 
+       { 0x5F59, 0x3723 }, { 0x5F5C, 0x3714 }, { 0x5F5D, 0x3713 }, { 0x5F61, 0x3724 }, { 0x5F62, 0x1721 }, { 0x5F66, 0x2907 }, 
+       { 0x5F69, 0x1A2C }, { 0x5F6A, 0x2917 }, { 0x5F6B, 0x2406 }, { 0x5F6C, 0x292B }, { 0x5F6D, 0x3725 }, { 0x5F70, 0x1E14 }, 
+       { 0x5F71, 0x1126 }, { 0x5F73, 0x3726 }, { 0x5F77, 0x3727 }, { 0x5F79, 0x2C52 }, { 0x5F7C, 0x2840 }, { 0x5F7F, 0x372A }, 
+       { 0x5F80, 0x115D }, { 0x5F81, 0x200C }, { 0x5F82, 0x3729 }, { 0x5F83, 0x3728 }, { 0x5F84, 0x1722 }, { 0x5F85, 0x2234 }, 
+       { 0x5F87, 0x372E }, { 0x5F88, 0x372C }, { 0x5F8A, 0x372B }, { 0x5F8B, 0x2E07 }, { 0x5F8C, 0x1845 }, { 0x5F90, 0x1D59 }, 
+       { 0x5F91, 0x372D }, { 0x5F92, 0x252C }, { 0x5F93, 0x1D1E }, { 0x5F97, 0x2620 }, { 0x5F98, 0x3731 }, { 0x5F99, 0x3730 }, 
+       { 0x5F9E, 0x372F }, { 0x5FA0, 0x3732 }, { 0x5FA1, 0x1846 }, { 0x5FA8, 0x3733 }, { 0x5FA9, 0x295C }, { 0x5FAA, 0x1D3B }, 
+       { 0x5FAD, 0x3734 }, { 0x5FAE, 0x2859 }, { 0x5FB3, 0x2621 }, { 0x5FB4, 0x2407 }, { 0x5FB9, 0x2510 }, { 0x5FBC, 0x3735 }, 
+       { 0x5FBD, 0x150B }, { 0x5FC3, 0x1F14 }, { 0x5FC5, 0x290C }, { 0x5FCC, 0x1457 }, { 0x5FCD, 0x2706 }, { 0x5FD6, 0x3736 }, 
+       { 0x5FD7, 0x1B36 }, { 0x5FD8, 0x2B1A }, { 0x5FD9, 0x2B1B }, { 0x5FDC, 0x115E }, { 0x5FDD, 0x373B }, { 0x5FE0, 0x2349 }, 
+       { 0x5FE4, 0x3738 }, { 0x5FEB, 0x1257 }, { 0x5FF0, 0x380D }, { 0x5FF1, 0x373A }, { 0x5FF5, 0x2710 }, { 0x5FF8, 0x3739 }, 
+       { 0x5FFB, 0x3737 }, { 0x5FFD, 0x195A }, { 0x5FFF, 0x373D }, { 0x600E, 0x3743 }, { 0x600F, 0x3749 }, { 0x6010, 0x3741 }, 
+       { 0x6012, 0x253C }, { 0x6015, 0x3746 }, { 0x6016, 0x293D }, { 0x6019, 0x3740 }, { 0x601B, 0x3745 }, { 0x601C, 0x2E47 }, 
+       { 0x601D, 0x1B37 }, { 0x6020, 0x2235 }, { 0x6021, 0x373E }, { 0x6025, 0x153E }, { 0x6026, 0x3748 }, { 0x6027, 0x200D }, 
+       { 0x6028, 0x1145 }, { 0x6029, 0x3742 }, { 0x602A, 0x1258 }, { 0x602B, 0x3747 }, { 0x602F, 0x1611 }, { 0x6031, 0x3744 }, 
+       { 0x603A, 0x374A }, { 0x6041, 0x374C }, { 0x6042, 0x3756 }, { 0x6043, 0x3754 }, { 0x6046, 0x3751 }, { 0x604A, 0x3750 }, 
+       { 0x604B, 0x2E58 }, { 0x604D, 0x3752 }, { 0x6050, 0x1612 }, { 0x6052, 0x1911 }, { 0x6055, 0x1D5A }, { 0x6059, 0x3759 }, 
+       { 0x605A, 0x374B }, { 0x605F, 0x374F }, { 0x6060, 0x373F }, { 0x6062, 0x125A }, { 0x6063, 0x3753 }, { 0x6064, 0x3755 }, 
+       { 0x6065, 0x2331 }, { 0x6068, 0x1A08 }, { 0x6069, 0x1218 }, { 0x606A, 0x374D }, { 0x606B, 0x3758 }, { 0x606C, 0x3757 }, 
+       { 0x606D, 0x1613 }, { 0x606F, 0x2209 }, { 0x6070, 0x1346 }, { 0x6075, 0x1723 }, { 0x6077, 0x374E }, { 0x6081, 0x375A }, 
+       { 0x6083, 0x375D }, { 0x6084, 0x3801 }, { 0x6089, 0x1C1D }, { 0x608B, 0x3807 }, { 0x608C, 0x2450 }, { 0x608D, 0x375B }, 
+       { 0x6092, 0x3805 }, { 0x6094, 0x1259 }, { 0x6096, 0x3803 }, { 0x6097, 0x3804 }, { 0x609A, 0x375E }, { 0x609B, 0x3802 }, 
+       { 0x609F, 0x1847 }, { 0x60A0, 0x2D0A }, { 0x60A3, 0x1415 }, { 0x60A6, 0x1139 }, { 0x60A7, 0x3806 }, { 0x60A9, 0x271A }, 
+       { 0x60AA, 0x100D }, { 0x60B2, 0x2841 }, { 0x60B3, 0x373C }, { 0x60B4, 0x380C }, { 0x60B5, 0x3810 }, { 0x60B6, 0x2C45 }, 
+       { 0x60B8, 0x3809 }, { 0x60BC, 0x2549 }, { 0x60BD, 0x380E }, { 0x60C5, 0x1E50 }, { 0x60C6, 0x380F }, { 0x60C7, 0x2637 }, 
+       { 0x60D1, 0x2F27 }, { 0x60D3, 0x380B }, { 0x60D8, 0x3811 }, { 0x60DA, 0x195B }, { 0x60DC, 0x202B }, { 0x60DF, 0x1034 }, 
+       { 0x60E0, 0x380A }, { 0x60E1, 0x3808 }, { 0x60E3, 0x213A }, { 0x60E7, 0x375C }, { 0x60E8, 0x1B14 }, { 0x60F0, 0x2226 }, 
+       { 0x60F1, 0x381D }, { 0x60F3, 0x213B }, { 0x60F4, 0x3818 }, { 0x60F6, 0x3815 }, { 0x60F7, 0x3816 }, { 0x60F9, 0x1C46 }, 
+       { 0x60FA, 0x3819 }, { 0x60FB, 0x381C }, { 0x6100, 0x3817 }, { 0x6101, 0x1D05 }, { 0x6103, 0x381A }, { 0x6106, 0x3814 }, 
+       { 0x6108, 0x2C5C }, { 0x6109, 0x2C5B }, { 0x610D, 0x381E }, { 0x610E, 0x381F }, { 0x610F, 0x1035 }, { 0x6115, 0x3813 }, 
+       { 0x611A, 0x1652 }, { 0x611B, 0x1006 }, { 0x611F, 0x1416 }, { 0x6121, 0x381B }, { 0x6127, 0x3823 }, { 0x6128, 0x3822 }, 
+       { 0x612C, 0x3827 }, { 0x6134, 0x3828 }, { 0x613C, 0x3826 }, { 0x613D, 0x3829 }, { 0x613E, 0x3821 }, { 0x613F, 0x3825 }, 
+       { 0x6142, 0x382A }, { 0x6144, 0x382B }, { 0x6147, 0x3820 }, { 0x6148, 0x1B5C }, { 0x614A, 0x3824 }, { 0x614B, 0x2236 }, 
+       { 0x614C, 0x1912 }, { 0x614D, 0x3812 }, { 0x614E, 0x1F15 }, { 0x6153, 0x3838 }, { 0x6155, 0x2A49 }, { 0x6158, 0x382E }, 
+       { 0x6159, 0x382F }, { 0x615A, 0x3830 }, { 0x615D, 0x3837 }, { 0x615F, 0x3836 }, { 0x6162, 0x2B5D }, { 0x6163, 0x1417 }, 
+       { 0x6165, 0x3834 }, { 0x6167, 0x1725 }, { 0x6168, 0x1314 }, { 0x616B, 0x3831 }, { 0x616E, 0x2E18 }, { 0x616F, 0x3833 }, 
+       { 0x6170, 0x1036 }, { 0x6171, 0x3835 }, { 0x6173, 0x382C }, { 0x6174, 0x3832 }, { 0x6175, 0x3839 }, { 0x6176, 0x1724 }, 
+       { 0x6177, 0x382D }, { 0x617E, 0x2D3D }, { 0x6182, 0x2D0B }, { 0x6187, 0x383C }, { 0x618A, 0x3840 }, { 0x618E, 0x215E }, 
+       { 0x6190, 0x2E59 }, { 0x6191, 0x3841 }, { 0x6194, 0x383E }, { 0x6196, 0x383B }, { 0x6199, 0x383A }, { 0x619A, 0x383F }, 
+       { 0x61A4, 0x2A10 }, { 0x61A7, 0x2614 }, { 0x61A9, 0x1726 }, { 0x61AB, 0x3842 }, { 0x61AC, 0x383D }, { 0x61AE, 0x3843 }, 
+       { 0x61B2, 0x175B }, { 0x61B6, 0x1211 }, { 0x61BA, 0x384B }, { 0x61BE, 0x1418 }, { 0x61C3, 0x3849 }, { 0x61C6, 0x384A }, 
+       { 0x61C7, 0x1A09 }, { 0x61C8, 0x3848 }, { 0x61C9, 0x3846 }, { 0x61CA, 0x3845 }, { 0x61CB, 0x384C }, { 0x61CC, 0x3844 }, 
+       { 0x61CD, 0x384E }, { 0x61D0, 0x125B }, { 0x61E3, 0x3850 }, { 0x61E6, 0x384F }, { 0x61F2, 0x2408 }, { 0x61F4, 0x3853 }, 
+       { 0x61F6, 0x3851 }, { 0x61F7, 0x3847 }, { 0x61F8, 0x175C }, { 0x61FA, 0x3852 }, { 0x61FC, 0x3856 }, { 0x61FD, 0x3855 }, 
+       { 0x61FE, 0x3857 }, { 0x61FF, 0x3854 }, { 0x6200, 0x3858 }, { 0x6208, 0x3859 }, { 0x6209, 0x385A }, { 0x620A, 0x2A4A }, 
+       { 0x620C, 0x385C }, { 0x620D, 0x385B }, { 0x620E, 0x1D1F }, { 0x6210, 0x200E }, { 0x6211, 0x1246 }, { 0x6212, 0x125C }, 
+       { 0x6214, 0x385D }, { 0x6216, 0x101F }, { 0x621A, 0x202C }, { 0x621B, 0x385E }, { 0x621D, 0x4C23 }, { 0x621E, 0x3901 }, 
+       { 0x621F, 0x1741 }, { 0x6221, 0x3902 }, { 0x6226, 0x204F }, { 0x622A, 0x3903 }, { 0x622E, 0x3904 }, { 0x622F, 0x151A }, 
+       { 0x6230, 0x3905 }, { 0x6232, 0x3906 }, { 0x6233, 0x3907 }, { 0x6234, 0x2237 }, { 0x6238, 0x182D }, { 0x623B, 0x2C41 }, 
+       { 0x623F, 0x2B1C }, { 0x6240, 0x1D4A }, { 0x6241, 0x3908 }, { 0x6247, 0x2050 }, { 0x6248, 0x4E1D }, { 0x6249, 0x2842 }, 
+       { 0x624B, 0x1C4A }, { 0x624D, 0x1A2D }, { 0x624E, 0x3909 }, { 0x6253, 0x2227 }, { 0x6255, 0x2A07 }, { 0x6258, 0x2251 }, 
+       { 0x625B, 0x390C }, { 0x625E, 0x390A }, { 0x6260, 0x390D }, { 0x6263, 0x390B }, { 0x6268, 0x390E }, { 0x626E, 0x2A11 }, 
+       { 0x6271, 0x1017 }, { 0x6276, 0x293E }, { 0x6279, 0x2843 }, { 0x627C, 0x390F }, { 0x627E, 0x3912 }, { 0x627F, 0x1E15 }, 
+       { 0x6280, 0x151B }, { 0x6282, 0x3910 }, { 0x6283, 0x3917 }, { 0x6284, 0x1E16 }, { 0x6289, 0x3911 }, { 0x628A, 0x2724 }, 
+       { 0x6291, 0x2D3E }, { 0x6292, 0x3913 }, { 0x6293, 0x3914 }, { 0x6294, 0x3918 }, { 0x6295, 0x254A }, { 0x6296, 0x3915 }, 
+       { 0x6297, 0x1913 }, { 0x6298, 0x203E }, { 0x629B, 0x3926 }, { 0x629C, 0x2814 }, { 0x629E, 0x2252 }, { 0x62AB, 0x2844 }, 
+       { 0x62AC, 0x3A0D }, { 0x62B1, 0x2A5A }, { 0x62B5, 0x2451 }, { 0x62B9, 0x2B55 }, { 0x62BB, 0x391B }, { 0x62BC, 0x1201 }, 
+       { 0x62BD, 0x234A }, { 0x62C2, 0x3924 }, { 0x62C5, 0x2314 }, { 0x62C6, 0x391E }, { 0x62C7, 0x3925 }, { 0x62C8, 0x3920 }, 
+       { 0x62C9, 0x3927 }, { 0x62CA, 0x3923 }, { 0x62CC, 0x3922 }, { 0x62CD, 0x274F }, { 0x62CF, 0x391C }, { 0x62D0, 0x125D }, 
+       { 0x62D1, 0x391A }, { 0x62D2, 0x1551 }, { 0x62D3, 0x2253 }, { 0x62D4, 0x3916 }, { 0x62D7, 0x3919 }, { 0x62D8, 0x1914 }, 
+       { 0x62D9, 0x203B }, { 0x62DB, 0x1E17 }, { 0x62DC, 0x3921 }, { 0x62DD, 0x2732 }, { 0x62E0, 0x1552 }, { 0x62E1, 0x1328 }, 
+       { 0x62EC, 0x1347 }, { 0x62ED, 0x1F01 }, { 0x62EE, 0x3929 }, { 0x62EF, 0x392E }, { 0x62F1, 0x392A }, { 0x62F3, 0x175D }, 
+       { 0x62F5, 0x392F }, { 0x62F6, 0x1B02 }, { 0x62F7, 0x1949 }, { 0x62FE, 0x1D06 }, { 0x62FF, 0x391D }, { 0x6301, 0x1B5D }, 
+       { 0x6302, 0x392C }, { 0x6307, 0x1B38 }, { 0x6308, 0x392D }, { 0x6309, 0x1024 }, { 0x630C, 0x3928 }, { 0x6311, 0x2409 }, 
+       { 0x6319, 0x1553 }, { 0x631F, 0x1614 }, { 0x6327, 0x392B }, { 0x6328, 0x1007 }, { 0x632B, 0x1A23 }, { 0x632F, 0x1F16 }, 
+       { 0x633A, 0x2452 }, { 0x633D, 0x2834 }, { 0x633E, 0x3931 }, { 0x633F, 0x213E }, { 0x6349, 0x220A }, { 0x634C, 0x1B0B }, 
+       { 0x634D, 0x3932 }, { 0x634F, 0x3934 }, { 0x6350, 0x3930 }, { 0x6355, 0x2A41 }, { 0x6357, 0x241D }, { 0x635C, 0x213C }, 
+       { 0x6367, 0x2A5B }, { 0x6368, 0x1C2E }, { 0x6369, 0x3940 }, { 0x636B, 0x393F }, { 0x636E, 0x1F58 }, { 0x6372, 0x175E }, 
+       { 0x6376, 0x3939 }, { 0x6377, 0x1E19 }, { 0x637A, 0x2648 }, { 0x637B, 0x2711 }, { 0x6380, 0x3937 }, { 0x6383, 0x213D }, 
+       { 0x6388, 0x1C58 }, { 0x6389, 0x393C }, { 0x638C, 0x1E18 }, { 0x638E, 0x3936 }, { 0x638F, 0x393B }, { 0x6392, 0x2733 }, 
+       { 0x6396, 0x3935 }, { 0x6398, 0x1701 }, { 0x639B, 0x133D }, { 0x639F, 0x393D }, { 0x63A0, 0x2E0B }, { 0x63A1, 0x1A2E }, 
+       { 0x63A2, 0x2315 }, { 0x63A3, 0x393A }, { 0x63A5, 0x203C }, { 0x63A7, 0x1915 }, { 0x63A8, 0x1F44 }, { 0x63A9, 0x1146 }, 
+       { 0x63AA, 0x211C }, { 0x63AB, 0x3938 }, { 0x63AC, 0x1525 }, { 0x63B2, 0x1727 }, { 0x63B4, 0x242F }, { 0x63B5, 0x393E }, 
+       { 0x63BB, 0x213F }, { 0x63BE, 0x3941 }, { 0x63C0, 0x3943 }, { 0x63C3, 0x2217 }, { 0x63C4, 0x3949 }, { 0x63C6, 0x3944 }, 
+       { 0x63C9, 0x3946 }, { 0x63CF, 0x2921 }, { 0x63D0, 0x2453 }, { 0x63D2, 0x3947 }, { 0x63D6, 0x2D0C }, { 0x63DA, 0x2D28 }, 
+       { 0x63DB, 0x1419 }, { 0x63E1, 0x100E }, { 0x63E3, 0x3945 }, { 0x63E9, 0x3942 }, { 0x63EE, 0x1458 }, { 0x63F4, 0x1147 }, 
+       { 0x63F6, 0x3948 }, { 0x63FA, 0x2D29 }, { 0x6406, 0x394C }, { 0x640D, 0x221B }, { 0x640F, 0x3953 }, { 0x6413, 0x394D }, 
+       { 0x6416, 0x394A }, { 0x6417, 0x3951 }, { 0x641C, 0x3933 }, { 0x6426, 0x394E }, { 0x6428, 0x3952 }, { 0x642C, 0x2822 }, 
+       { 0x642D, 0x254B }, { 0x6434, 0x394B }, { 0x6436, 0x394F }, { 0x643A, 0x1728 }, { 0x643E, 0x1A51 }, { 0x6442, 0x203D }, 
+       { 0x644E, 0x3957 }, { 0x6458, 0x2506 }, { 0x6467, 0x3954 }, { 0x6469, 0x2B40 }, { 0x646F, 0x3955 }, { 0x6476, 0x3956 }, 
+       { 0x6478, 0x2C2E }, { 0x647A, 0x2002 }, { 0x6483, 0x1742 }, { 0x6488, 0x395D }, { 0x6492, 0x1B15 }, { 0x6493, 0x395A }, 
+       { 0x6495, 0x3959 }, { 0x649A, 0x2712 }, { 0x649E, 0x2615 }, { 0x64A4, 0x2511 }, { 0x64A5, 0x395B }, { 0x64A9, 0x395C }, 
+       { 0x64AB, 0x294F }, { 0x64AD, 0x2725 }, { 0x64AE, 0x1B03 }, { 0x64B0, 0x2051 }, { 0x64B2, 0x2B30 }, { 0x64B9, 0x1329 }, 
+       { 0x64BB, 0x3A05 }, { 0x64BC, 0x395E }, { 0x64C1, 0x2D2A }, { 0x64C2, 0x3A07 }, { 0x64C5, 0x3A03 }, { 0x64C7, 0x3A04 }, 
+       { 0x64CD, 0x2140 }, { 0x64D2, 0x3A02 }, { 0x64D4, 0x391F }, { 0x64D8, 0x3A06 }, { 0x64DA, 0x3A01 }, { 0x64E0, 0x3A0B }, 
+       { 0x64E1, 0x3A0C }, { 0x64E2, 0x2507 }, { 0x64E3, 0x3A0E }, { 0x64E6, 0x1B04 }, { 0x64E7, 0x3A09 }, { 0x64EC, 0x151C }, 
+       { 0x64EF, 0x3A0F }, { 0x64F1, 0x3A08 }, { 0x64F2, 0x3A13 }, { 0x64F4, 0x3A12 }, { 0x64F6, 0x3A11 }, { 0x64FA, 0x3A14 }, 
+       { 0x64FD, 0x3A16 }, { 0x64FE, 0x1E51 }, { 0x6500, 0x3A15 }, { 0x6505, 0x3A19 }, { 0x6518, 0x3A17 }, { 0x651C, 0x3A18 }, 
+       { 0x651D, 0x3950 }, { 0x6523, 0x3A1B }, { 0x6524, 0x3A1A }, { 0x652A, 0x3958 }, { 0x652B, 0x3A1C }, { 0x652C, 0x3A10 }, 
+       { 0x652F, 0x1B39 }, { 0x6534, 0x3A1D }, { 0x6535, 0x3A1E }, { 0x6536, 0x3A20 }, { 0x6537, 0x3A1F }, { 0x6538, 0x3A21 }, 
+       { 0x6539, 0x125E }, { 0x653B, 0x1916 }, { 0x653E, 0x2A5C }, { 0x653F, 0x200F }, { 0x6545, 0x182E }, { 0x6548, 0x3A23 }, 
+       { 0x654D, 0x3A26 }, { 0x654F, 0x2932 }, { 0x6551, 0x153F }, { 0x6555, 0x3A25 }, { 0x6556, 0x3A24 }, { 0x6557, 0x2734 }, 
+       { 0x6558, 0x3A27 }, { 0x6559, 0x1615 }, { 0x655D, 0x3A29 }, { 0x655E, 0x3A28 }, { 0x6562, 0x141A }, { 0x6563, 0x1B16 }, 
+       { 0x6566, 0x2638 }, { 0x656C, 0x1729 }, { 0x6570, 0x1F54 }, { 0x6572, 0x3A2A }, { 0x6574, 0x2010 }, { 0x6575, 0x2508 }, 
+       { 0x6577, 0x293F }, { 0x6578, 0x3A2B }, { 0x6582, 0x3A2C }, { 0x6583, 0x3A2D }, { 0x6587, 0x2A18 }, { 0x6588, 0x353D }, 
+       { 0x6589, 0x2026 }, { 0x658C, 0x292C }, { 0x658E, 0x1A38 }, { 0x6590, 0x2845 }, { 0x6591, 0x2823 }, { 0x6597, 0x252D }, 
+       { 0x6599, 0x2E21 }, { 0x659B, 0x3A2F }, { 0x659C, 0x1C30 }, { 0x659F, 0x3A30 }, { 0x65A1, 0x1016 }, { 0x65A4, 0x1634 }, 
+       { 0x65A5, 0x202D }, { 0x65A7, 0x2940 }, { 0x65AB, 0x3A31 }, { 0x65AC, 0x1B22 }, { 0x65AD, 0x2327 }, { 0x65AF, 0x1B3B }, 
+       { 0x65B0, 0x1F17 }, { 0x65B7, 0x3A32 }, { 0x65B9, 0x2A5D }, { 0x65BC, 0x1157 }, { 0x65BD, 0x1B3C }, { 0x65C1, 0x3A35 }, 
+       { 0x65C3, 0x3A33 }, { 0x65C4, 0x3A36 }, { 0x65C5, 0x2E19 }, { 0x65C6, 0x3A34 }, { 0x65CB, 0x205B }, { 0x65CC, 0x3A37 }, 
+       { 0x65CF, 0x2212 }, { 0x65D2, 0x3A38 }, { 0x65D7, 0x145A }, { 0x65D9, 0x3A3A }, { 0x65DB, 0x3A39 }, { 0x65E0, 0x3A3B }, 
+       { 0x65E1, 0x3A3C }, { 0x65E2, 0x145B }, { 0x65E5, 0x265C }, { 0x65E6, 0x2316 }, { 0x65E7, 0x154C }, { 0x65E8, 0x1B3D }, 
+       { 0x65E9, 0x2141 }, { 0x65EC, 0x1D3C }, { 0x65ED, 0x1010 }, { 0x65F1, 0x3A3D }, { 0x65FA, 0x1202 }, { 0x65FB, 0x3A41 }, 
+       { 0x6602, 0x1917 }, { 0x6603, 0x3A40 }, { 0x6606, 0x1A0B }, { 0x6607, 0x1E1A }, { 0x660A, 0x3A3F }, { 0x660C, 0x1E1B }, 
+       { 0x660E, 0x2C20 }, { 0x660F, 0x1A0A }, { 0x6613, 0x1037 }, { 0x6614, 0x202E }, { 0x661C, 0x3A46 }, { 0x661F, 0x2011 }, 
+       { 0x6620, 0x1127 }, { 0x6625, 0x1D35 }, { 0x6627, 0x2B46 }, { 0x6628, 0x1A52 }, { 0x662D, 0x1E1C }, { 0x662F, 0x2007 }, 
+       { 0x6634, 0x3A45 }, { 0x6635, 0x3A43 }, { 0x6636, 0x3A44 }, { 0x663C, 0x234B }, { 0x663F, 0x3B06 }, { 0x6641, 0x3A4A }, 
+       { 0x6642, 0x1B5E }, { 0x6643, 0x1918 }, { 0x6644, 0x3A48 }, { 0x6649, 0x3A49 }, { 0x664B, 0x1F18 }, { 0x664F, 0x3A47 }, 
+       { 0x6652, 0x1B0F }, { 0x665D, 0x3A4C }, { 0x665E, 0x3A4B }, { 0x665F, 0x3A50 }, { 0x6662, 0x3A51 }, { 0x6664, 0x3A4D }, 
+       { 0x6666, 0x1302 }, { 0x6667, 0x3A4E }, { 0x6668, 0x3A4F }, { 0x6669, 0x2835 }, { 0x666E, 0x2941 }, { 0x666F, 0x172A }, 
+       { 0x6670, 0x3A52 }, { 0x6674, 0x2012 }, { 0x6676, 0x1E1D }, { 0x667A, 0x2332 }, { 0x6681, 0x1627 }, { 0x6683, 0x3A53 }, 
+       { 0x6684, 0x3A57 }, { 0x6687, 0x122B }, { 0x6688, 0x3A54 }, { 0x6689, 0x3A56 }, { 0x668E, 0x3A55 }, { 0x6691, 0x1D4B }, 
+       { 0x6696, 0x2328 }, { 0x6697, 0x1025 }, { 0x6698, 0x3A58 }, { 0x669D, 0x3A59 }, { 0x66A2, 0x240A }, { 0x66A6, 0x2E51 }, 
+       { 0x66AB, 0x1B23 }, { 0x66AE, 0x2A4B }, { 0x66B4, 0x2B1D }, { 0x66B8, 0x3B02 }, { 0x66B9, 0x3A5B }, { 0x66BC, 0x3A5E }, 
+       { 0x66BE, 0x3A5D }, { 0x66C1, 0x3A5A }, { 0x66C4, 0x3B01 }, { 0x66C7, 0x263E }, { 0x66C9, 0x3A5C }, { 0x66D6, 0x3B03 }, 
+       { 0x66D9, 0x1D4C }, { 0x66DA, 0x3B04 }, { 0x66DC, 0x2D2B }, { 0x66DD, 0x2758 }, { 0x66E0, 0x3B05 }, { 0x66E6, 0x3B07 }, 
+       { 0x66E9, 0x3B08 }, { 0x66F0, 0x3B09 }, { 0x66F2, 0x162A }, { 0x66F3, 0x1128 }, { 0x66F4, 0x1919 }, { 0x66F5, 0x3B0A }, 
+       { 0x66F7, 0x3B0B }, { 0x66F8, 0x1D51 }, { 0x66F9, 0x2142 }, { 0x66FC, 0x3238 }, { 0x66FD, 0x211E }, { 0x66FE, 0x211D }, 
+       { 0x66FF, 0x2238 }, { 0x6700, 0x1A27 }, { 0x6703, 0x3052 }, { 0x6708, 0x174E }, { 0x6709, 0x2D0D }, { 0x670B, 0x2A5E }, 
+       { 0x670D, 0x295E }, { 0x670F, 0x3B0C }, { 0x6714, 0x1A53 }, { 0x6715, 0x241F }, { 0x6716, 0x3B0D }, { 0x6717, 0x2F0F }, 
+       { 0x671B, 0x2B1E }, { 0x671D, 0x240B }, { 0x671E, 0x3B0E }, { 0x671F, 0x145C }, { 0x6726, 0x3B0F }, { 0x6727, 0x3B10 }, 
+       { 0x6728, 0x2C3A }, { 0x672A, 0x2C04 }, { 0x672B, 0x2B56 }, { 0x672C, 0x2B3C }, { 0x672D, 0x1B05 }, { 0x672E, 0x3B12 }, 
+       { 0x6731, 0x1C4B }, { 0x6734, 0x2B31 }, { 0x6736, 0x3B14 }, { 0x6737, 0x3B17 }, { 0x6738, 0x3B16 }, { 0x673A, 0x1459 }, 
+       { 0x673D, 0x1540 }, { 0x673F, 0x3B13 }, { 0x6741, 0x3B15 }, { 0x6746, 0x3B18 }, { 0x6749, 0x1F59 }, { 0x674E, 0x2D5B }, 
+       { 0x674F, 0x1029 }, { 0x6750, 0x1A40 }, { 0x6751, 0x221C }, { 0x6753, 0x1C3D }, { 0x6756, 0x1E53 }, { 0x6759, 0x3B1B }, 
+       { 0x675C, 0x252E }, { 0x675E, 0x3B19 }, { 0x675F, 0x220B }, { 0x6760, 0x3B1A }, { 0x6761, 0x1E52 }, { 0x6762, 0x2C3D }, 
+       { 0x6763, 0x3B1C }, { 0x6764, 0x3B1D }, { 0x6765, 0x2D48 }, { 0x676A, 0x3B22 }, { 0x676D, 0x191A }, { 0x676F, 0x2735 }, 
+       { 0x6770, 0x3B1F }, { 0x6771, 0x254C }, { 0x6772, 0x3A3E }, { 0x6773, 0x3A42 }, { 0x6775, 0x152F }, { 0x6777, 0x2727 }, 
+       { 0x677C, 0x3B21 }, { 0x677E, 0x1E1E }, { 0x677F, 0x2824 }, { 0x6785, 0x3B27 }, { 0x6787, 0x285A }, { 0x6789, 0x3B1E }, 
+       { 0x678B, 0x3B24 }, { 0x678C, 0x3B23 }, { 0x6790, 0x202F }, { 0x6795, 0x2B4D }, { 0x6797, 0x2E33 }, { 0x679A, 0x2B47 }, 
+       { 0x679C, 0x122C }, { 0x679D, 0x1B3E }, { 0x67A0, 0x2F28 }, { 0x67A1, 0x3B26 }, { 0x67A2, 0x1F55 }, { 0x67A6, 0x3B25 }, 
+       { 0x67A9, 0x3B20 }, { 0x67AF, 0x182F }, { 0x67B3, 0x3B2C }, { 0x67B4, 0x3B2A }, { 0x67B6, 0x122D }, { 0x67B7, 0x3B28 }, 
+       { 0x67B8, 0x3B2E }, { 0x67B9, 0x3B34 }, { 0x67C1, 0x2228 }, { 0x67C4, 0x2A21 }, { 0x67C6, 0x3B36 }, { 0x67CA, 0x2902 }, 
+       { 0x67CE, 0x3B35 }, { 0x67CF, 0x2750 }, { 0x67D0, 0x2B1F }, { 0x67D1, 0x141B }, { 0x67D3, 0x2057 }, { 0x67D4, 0x1D20 }, 
+       { 0x67D8, 0x2433 }, { 0x67DA, 0x2D0E }, { 0x67DD, 0x3B31 }, { 0x67DE, 0x3B30 }, { 0x67E2, 0x3B32 }, { 0x67E4, 0x3B2F }, 
+       { 0x67E7, 0x3B37 }, { 0x67E9, 0x3B2D }, { 0x67EC, 0x3B2B }, { 0x67EE, 0x3B33 }, { 0x67EF, 0x3B29 }, { 0x67F1, 0x234C }, 
+       { 0x67F3, 0x2C58 }, { 0x67F4, 0x1C26 }, { 0x67F5, 0x1A54 }, { 0x67FB, 0x1A1A }, { 0x67FE, 0x2B4F }, { 0x67FF, 0x1321 }, 
+       { 0x6802, 0x242E }, { 0x6803, 0x262A }, { 0x6804, 0x1129 }, { 0x6813, 0x2052 }, { 0x6816, 0x2014 }, { 0x6817, 0x170A }, 
+       { 0x681E, 0x3B39 }, { 0x6821, 0x191B }, { 0x6822, 0x135C }, { 0x6829, 0x3B3B }, { 0x682A, 0x1354 }, { 0x682B, 0x3B41 }, 
+       { 0x6832, 0x3B3E }, { 0x6834, 0x2053 }, { 0x6838, 0x132B }, { 0x6839, 0x1A0C }, { 0x683C, 0x132A }, { 0x683D, 0x1A2F }, 
+       { 0x6840, 0x3B3C }, { 0x6841, 0x1745 }, { 0x6842, 0x172B }, { 0x6843, 0x254D }, { 0x6846, 0x3B3A }, { 0x6848, 0x1026 }, 
+       { 0x684D, 0x3B3D }, { 0x684E, 0x3B3F }, { 0x6850, 0x162D }, { 0x6851, 0x170C }, { 0x6853, 0x141C }, { 0x6854, 0x152B }, 
+       { 0x6859, 0x3B42 }, { 0x685C, 0x1A59 }, { 0x685D, 0x2B51 }, { 0x685F, 0x1B17 }, { 0x6863, 0x3B43 }, { 0x6867, 0x2910 }, 
+       { 0x6874, 0x3B4F }, { 0x6876, 0x1213 }, { 0x6877, 0x3B44 }, { 0x687E, 0x3B55 }, { 0x687F, 0x3B45 }, { 0x6881, 0x2E22 }, 
+       { 0x6883, 0x3B4C }, { 0x6885, 0x273F }, { 0x688D, 0x3B54 }, { 0x688F, 0x3B47 }, { 0x6893, 0x1014 }, { 0x6894, 0x3B49 }, 
+       { 0x6897, 0x191C }, { 0x689B, 0x3B4B }, { 0x689D, 0x3B4A }, { 0x689F, 0x3B46 }, { 0x68A0, 0x3B51 }, { 0x68A2, 0x1E1F }, 
+       { 0x68A6, 0x344D }, { 0x68A7, 0x1848 }, { 0x68A8, 0x2D5C }, { 0x68AD, 0x3B48 }, { 0x68AF, 0x2454 }, { 0x68B0, 0x1303 }, 
+       { 0x68B1, 0x1A0D }, { 0x68B3, 0x3B40 }, { 0x68B5, 0x3B50 }, { 0x68B6, 0x1341 }, { 0x68B9, 0x3B4E }, { 0x68BA, 0x3B52 }, 
+       { 0x68BC, 0x254E }, { 0x68C4, 0x145E }, { 0x68C6, 0x3C12 }, { 0x68C9, 0x2C29 }, { 0x68CA, 0x3B57 }, { 0x68CB, 0x145D }, 
+       { 0x68CD, 0x3B5E }, { 0x68D2, 0x2B20 }, { 0x68D4, 0x3C01 }, { 0x68D5, 0x3C03 }, { 0x68D7, 0x3C07 }, { 0x68D8, 0x3B59 }, 
+       { 0x68DA, 0x230A }, { 0x68DF, 0x254F }, { 0x68E0, 0x3C0B }, { 0x68E1, 0x3B5C }, { 0x68E3, 0x3C08 }, { 0x68E7, 0x3C02 }, 
+       { 0x68EE, 0x1F19 }, { 0x68EF, 0x3C0C }, { 0x68F2, 0x2013 }, { 0x68F9, 0x3C0A }, { 0x68FA, 0x141D }, { 0x6900, 0x2F30 }, 
+       { 0x6901, 0x3B56 }, { 0x6904, 0x3C06 }, { 0x6905, 0x1038 }, { 0x6908, 0x3B58 }, { 0x690B, 0x2C1A }, { 0x690C, 0x3B5D }, 
+       { 0x690D, 0x1F02 }, { 0x690E, 0x2427 }, { 0x690F, 0x3B53 }, { 0x6912, 0x3C05 }, { 0x6919, 0x1F5A }, { 0x691A, 0x3C0F }, 
+       { 0x691B, 0x1351 }, { 0x691C, 0x1801 }, { 0x6921, 0x3C11 }, { 0x6922, 0x3B5A }, { 0x6923, 0x3C10 }, { 0x6925, 0x3C09 }, 
+       { 0x6926, 0x3B5B }, { 0x6928, 0x3C0D }, { 0x692A, 0x3C0E }, { 0x6930, 0x3C1F }, { 0x6934, 0x262E }, { 0x6936, 0x3C04 }, 
+       { 0x6939, 0x3C1B }, { 0x693D, 0x3C1D }, { 0x693F, 0x2438 }, { 0x694A, 0x2D2C }, { 0x6953, 0x2956 }, { 0x6954, 0x3C18 }, 
+       { 0x6955, 0x222A }, { 0x6959, 0x3C1E }, { 0x695A, 0x211F }, { 0x695C, 0x3C15 }, { 0x695D, 0x3C22 }, { 0x695E, 0x3C21 }, 
+       { 0x6960, 0x264F }, { 0x6961, 0x3C20 }, { 0x6962, 0x264A }, { 0x696A, 0x3C24 }, { 0x696B, 0x3C17 }, { 0x696D, 0x1628 }, 
+       { 0x696E, 0x3C1A }, { 0x696F, 0x1D3D }, { 0x6973, 0x2740 }, { 0x6974, 0x3C1C }, { 0x6975, 0x162B }, { 0x6977, 0x3C14 }, 
+       { 0x6978, 0x3C16 }, { 0x6979, 0x3C13 }, { 0x697C, 0x2F10 }, { 0x697D, 0x133A }, { 0x697E, 0x3C19 }, { 0x6981, 0x3C23 }, 
+       { 0x6982, 0x1315 }, { 0x698A, 0x1A47 }, { 0x698E, 0x113D }, { 0x6991, 0x3C34 }, { 0x6994, 0x2F11 }, { 0x6995, 0x3C37 }, 
+       { 0x699B, 0x1F1A }, { 0x699C, 0x3C36 }, { 0x69A0, 0x3C35 }, { 0x69A7, 0x3C32 }, { 0x69AE, 0x3C26 }, { 0x69B1, 0x3C43 }, 
+       { 0x69B2, 0x3C25 }, { 0x69B4, 0x3C38 }, { 0x69BB, 0x3C30 }, { 0x69BE, 0x3C2B }, { 0x69BF, 0x3C28 }, { 0x69C1, 0x3C29 }, 
+       { 0x69C3, 0x3C31 }, { 0x69C7, 0x5402 }, { 0x69CA, 0x3C2E }, { 0x69CB, 0x191D }, { 0x69CC, 0x2428 }, { 0x69CD, 0x2144 }, 
+       { 0x69CE, 0x3C2C }, { 0x69D0, 0x3C27 }, { 0x69D3, 0x3C2A }, { 0x69D8, 0x2D2D }, { 0x69D9, 0x2B4A }, { 0x69DD, 0x3C2F }, 
+       { 0x69DE, 0x3C39 }, { 0x69E7, 0x3C41 }, { 0x69E8, 0x3C3A }, { 0x69EB, 0x3C47 }, { 0x69ED, 0x3C45 }, { 0x69F2, 0x3C40 }, 
+       { 0x69F9, 0x3C3F }, { 0x69FB, 0x2430 }, { 0x69FD, 0x2145 }, { 0x69FF, 0x3C3D }, { 0x6A02, 0x3C3B }, { 0x6A05, 0x3C42 }, 
+       { 0x6A0A, 0x3C48 }, { 0x6A0B, 0x2855 }, { 0x6A0C, 0x3C4E }, { 0x6A12, 0x3C49 }, { 0x6A13, 0x3C4C }, { 0x6A14, 0x3C46 }, 
+       { 0x6A17, 0x2354 }, { 0x6A19, 0x2918 }, { 0x6A1B, 0x3C3C }, { 0x6A1E, 0x3C44 }, { 0x6A1F, 0x1E20 }, { 0x6A21, 0x2C2F }, 
+       { 0x6A22, 0x3C58 }, { 0x6A23, 0x3C4B }, { 0x6A29, 0x1802 }, { 0x6A2A, 0x1203 }, { 0x6A2B, 0x133F }, { 0x6A2E, 0x3C33 }, 
+       { 0x6A35, 0x1E21 }, { 0x6A36, 0x3C50 }, { 0x6A38, 0x3C57 }, { 0x6A39, 0x1C59 }, { 0x6A3A, 0x1352 }, { 0x6A3D, 0x230E }, 
+       { 0x6A44, 0x3C4D }, { 0x6A47, 0x3C52 }, { 0x6A48, 0x3C56 }, { 0x6A4B, 0x1616 }, { 0x6A58, 0x152C }, { 0x6A59, 0x3C54 }, 
+       { 0x6A5F, 0x1501 }, { 0x6A61, 0x262B }, { 0x6A62, 0x3C53 }, { 0x6A66, 0x3C55 }, { 0x6A72, 0x3C4F }, { 0x6A78, 0x3C51 }, 
+       { 0x6A7F, 0x1340 }, { 0x6A80, 0x2329 }, { 0x6A84, 0x3C5C }, { 0x6A8D, 0x3C5A }, { 0x6A8E, 0x1849 }, { 0x6A90, 0x3C59 }, 
+       { 0x6A97, 0x3D01 }, { 0x6A9C, 0x3B38 }, { 0x6AA0, 0x3C5B }, { 0x6AA2, 0x3C5D }, { 0x6AA3, 0x3C5E }, { 0x6AAA, 0x3D0C }, 
+       { 0x6AAC, 0x3D08 }, { 0x6AAE, 0x3B4D }, { 0x6AB3, 0x3D07 }, { 0x6AB8, 0x3D06 }, { 0x6ABB, 0x3D03 }, { 0x6AC1, 0x3C4A }, 
+       { 0x6AC2, 0x3D05 }, { 0x6AC3, 0x3D04 }, { 0x6AD1, 0x3D0A }, { 0x6AD3, 0x2F06 }, { 0x6ADA, 0x3D0D }, { 0x6ADB, 0x165B }, 
+       { 0x6ADE, 0x3D09 }, { 0x6ADF, 0x3D0B }, { 0x6AE8, 0x2807 }, { 0x6AEA, 0x3D0E }, { 0x6AFA, 0x3D12 }, { 0x6AFB, 0x3D0F }, 
+       { 0x6B04, 0x2D53 }, { 0x6B05, 0x3D10 }, { 0x6B0A, 0x3C3E }, { 0x6B12, 0x3D13 }, { 0x6B16, 0x3D14 }, { 0x6B1D, 0x1115 }, 
+       { 0x6B1F, 0x3D16 }, { 0x6B20, 0x1747 }, { 0x6B21, 0x1C01 }, { 0x6B23, 0x1635 }, { 0x6B27, 0x1204 }, { 0x6B32, 0x2D3F }, 
+       { 0x6B37, 0x3D18 }, { 0x6B38, 0x3D17 }, { 0x6B39, 0x3D1A }, { 0x6B3A, 0x151D }, { 0x6B3D, 0x1636 }, { 0x6B3E, 0x141E }, 
+       { 0x6B43, 0x3D1D }, { 0x6B47, 0x3D1C }, { 0x6B49, 0x3D1E }, { 0x6B4C, 0x122E }, { 0x6B4E, 0x2317 }, { 0x6B50, 0x3D1F }, 
+       { 0x6B53, 0x141F }, { 0x6B54, 0x3D21 }, { 0x6B59, 0x3D20 }, { 0x6B5B, 0x3D22 }, { 0x6B5F, 0x3D23 }, { 0x6B61, 0x3D24 }, 
+       { 0x6B62, 0x1B3F }, { 0x6B63, 0x2015 }, { 0x6B64, 0x1A01 }, { 0x6B66, 0x2950 }, { 0x6B69, 0x2A42 }, { 0x6B6A, 0x2F24 }, 
+       { 0x6B6F, 0x1B55 }, { 0x6B73, 0x1A30 }, { 0x6B74, 0x2E52 }, { 0x6B78, 0x3D25 }, { 0x6B79, 0x3D26 }, { 0x6B7B, 0x1B40 }, 
+       { 0x6B7F, 0x3D27 }, { 0x6B80, 0x3D28 }, { 0x6B83, 0x3D2A }, { 0x6B84, 0x3D29 }, { 0x6B86, 0x2B38 }, { 0x6B89, 0x1D3E }, 
+       { 0x6B8A, 0x1C4C }, { 0x6B8B, 0x1B24 }, { 0x6B8D, 0x3D2B }, { 0x6B95, 0x3D2D }, { 0x6B96, 0x1F03 }, { 0x6B98, 0x3D2C }, 
+       { 0x6B9E, 0x3D2E }, { 0x6BA4, 0x3D2F }, { 0x6BAA, 0x3D30 }, { 0x6BAB, 0x3D31 }, { 0x6BAF, 0x3D32 }, { 0x6BB1, 0x3D34 }, 
+       { 0x6BB2, 0x3D33 }, { 0x6BB3, 0x3D35 }, { 0x6BB4, 0x1205 }, { 0x6BB5, 0x232A }, { 0x6BB7, 0x3D36 }, { 0x6BBA, 0x1B06 }, 
+       { 0x6BBB, 0x132C }, { 0x6BBC, 0x3D37 }, { 0x6BBF, 0x2522 }, { 0x6BC0, 0x342C }, { 0x6BC5, 0x1503 }, { 0x6BC6, 0x3D38 }, 
+       { 0x6BCB, 0x3D39 }, { 0x6BCD, 0x2A4C }, { 0x6BCE, 0x2B48 }, { 0x6BD2, 0x2627 }, { 0x6BD3, 0x3D3A }, { 0x6BD4, 0x2846 }, 
+       { 0x6BD8, 0x285B }, { 0x6BDB, 0x2C33 }, { 0x6BDF, 0x3D3B }, { 0x6BEB, 0x3D3D }, { 0x6BEC, 0x3D3C }, { 0x6BEF, 0x3D3F }, 
+       { 0x6BF3, 0x3D3E }, { 0x6C08, 0x3D41 }, { 0x6C0F, 0x1B41 }, { 0x6C11, 0x2C11 }, { 0x6C13, 0x3D42 }, { 0x6C14, 0x3D43 }, 
+       { 0x6C17, 0x1504 }, { 0x6C1B, 0x3D44 }, { 0x6C23, 0x3D46 }, { 0x6C24, 0x3D45 }, { 0x6C34, 0x1F45 }, { 0x6C37, 0x2919 }, 
+       { 0x6C38, 0x112A }, { 0x6C3E, 0x2825 }, { 0x6C40, 0x2455 }, { 0x6C41, 0x1D21 }, { 0x6C42, 0x1541 }, { 0x6C4E, 0x2826 }, 
+       { 0x6C50, 0x1C0E }, { 0x6C55, 0x3D48 }, { 0x6C57, 0x1420 }, { 0x6C5A, 0x1158 }, { 0x6C5D, 0x2652 }, { 0x6C5E, 0x3D47 }, 
+       { 0x6C5F, 0x191E }, { 0x6C60, 0x2333 }, { 0x6C62, 0x3D49 }, { 0x6C68, 0x3D51 }, { 0x6C6A, 0x3D4A }, { 0x6C70, 0x2221 }, 
+       { 0x6C72, 0x1542 }, { 0x6C73, 0x3D52 }, { 0x6C7A, 0x1748 }, { 0x6C7D, 0x1505 }, { 0x6C7E, 0x3D50 }, { 0x6C81, 0x3D4E }, 
+       { 0x6C82, 0x3D4B }, { 0x6C83, 0x2D40 }, { 0x6C88, 0x2420 }, { 0x6C8C, 0x2639 }, { 0x6C8D, 0x3D4C }, { 0x6C90, 0x3D54 }, 
+       { 0x6C92, 0x3D53 }, { 0x6C93, 0x1703 }, { 0x6C96, 0x120D }, { 0x6C99, 0x1A1B }, { 0x6C9A, 0x3D4D }, { 0x6C9B, 0x3D4F }, 
+       { 0x6CA1, 0x2B37 }, { 0x6CA2, 0x2254 }, { 0x6CAB, 0x2B57 }, { 0x6CAE, 0x3D5C }, { 0x6CB1, 0x3D5D }, { 0x6CB3, 0x122F }, 
+       { 0x6CB8, 0x2A08 }, { 0x6CB9, 0x2C5D }, { 0x6CBA, 0x3E01 }, { 0x6CBB, 0x1C03 }, { 0x6CBC, 0x1E22 }, { 0x6CBD, 0x3D58 }, 
+       { 0x6CBE, 0x3D5E }, { 0x6CBF, 0x1148 }, { 0x6CC1, 0x1617 }, { 0x6CC4, 0x3D55 }, { 0x6CC5, 0x3D5A }, { 0x6CC9, 0x2054 }, 
+       { 0x6CCA, 0x2751 }, { 0x6CCC, 0x2847 }, { 0x6CD3, 0x3D57 }, { 0x6CD5, 0x2B01 }, { 0x6CD7, 0x3D59 }, { 0x6CD9, 0x3E04 }, 
+       { 0x6CDB, 0x3E02 }, { 0x6CDD, 0x3D5B }, { 0x6CE1, 0x2B02 }, { 0x6CE2, 0x2728 }, { 0x6CE3, 0x1543 }, { 0x6CE5, 0x2505 }, 
+       { 0x6CE8, 0x234D }, { 0x6CEA, 0x3E05 }, { 0x6CEF, 0x3E03 }, { 0x6CF0, 0x2239 }, { 0x6CF1, 0x3D56 }, { 0x6CF3, 0x112B }, 
+       { 0x6D0B, 0x2D2E }, { 0x6D0C, 0x3E10 }, { 0x6D12, 0x3E0F }, { 0x6D17, 0x2056 }, { 0x6D19, 0x3E0C }, { 0x6D1B, 0x2D4C }, 
+       { 0x6D1E, 0x2616 }, { 0x6D1F, 0x3E06 }, { 0x6D25, 0x2425 }, { 0x6D29, 0x112C }, { 0x6D2A, 0x191F }, { 0x6D2B, 0x3E09 }, 
+       { 0x6D32, 0x1D07 }, { 0x6D33, 0x3E0E }, { 0x6D35, 0x3E0D }, { 0x6D36, 0x3E08 }, { 0x6D38, 0x3E0B }, { 0x6D3B, 0x1348 }, 
+       { 0x6D3D, 0x3E0A }, { 0x6D3E, 0x2729 }, { 0x6D41, 0x2E0E }, { 0x6D44, 0x1E54 }, { 0x6D45, 0x2055 }, { 0x6D59, 0x3E16 }, 
+       { 0x6D5A, 0x3E14 }, { 0x6D5C, 0x292D }, { 0x6D63, 0x3E11 }, { 0x6D64, 0x3E13 }, { 0x6D66, 0x111A }, { 0x6D69, 0x1920 }, 
+       { 0x6D6A, 0x2F12 }, { 0x6D6C, 0x131D }, { 0x6D6E, 0x2942 }, { 0x6D74, 0x2D41 }, { 0x6D77, 0x1304 }, { 0x6D78, 0x1F1B }, 
+       { 0x6D79, 0x3E15 }, { 0x6D85, 0x3E1A }, { 0x6D88, 0x1E23 }, { 0x6D8C, 0x2D10 }, { 0x6D8E, 0x3E17 }, { 0x6D93, 0x3E12 }, 
+       { 0x6D95, 0x3E18 }, { 0x6D99, 0x2E3E }, { 0x6D9B, 0x2553 }, { 0x6D9C, 0x2622 }, { 0x6DAF, 0x1316 }, { 0x6DB2, 0x1135 }, 
+       { 0x6DB5, 0x3E1E }, { 0x6DB8, 0x3E21 }, { 0x6DBC, 0x2E23 }, { 0x6DC0, 0x2D44 }, { 0x6DC5, 0x3E28 }, { 0x6DC6, 0x3E22 }, 
+       { 0x6DC7, 0x3E1F }, { 0x6DCB, 0x2E34 }, { 0x6DCC, 0x3E25 }, { 0x6DD1, 0x1D2A }, { 0x6DD2, 0x3E27 }, { 0x6DD5, 0x3E2C }, 
+       { 0x6DD8, 0x2551 }, { 0x6DD9, 0x3E2A }, { 0x6DDE, 0x3E24 }, { 0x6DE1, 0x2318 }, { 0x6DE4, 0x3E2B }, { 0x6DE6, 0x3E20 }, 
+       { 0x6DE8, 0x3E26 }, { 0x6DEA, 0x3E2D }, { 0x6DEB, 0x105C }, { 0x6DEC, 0x3E23 }, { 0x6DEE, 0x3E2E }, { 0x6DF1, 0x1F1C }, 
+       { 0x6DF3, 0x1D3F }, { 0x6DF5, 0x2A05 }, { 0x6DF7, 0x1A0E }, { 0x6DF9, 0x3E1B }, { 0x6DFA, 0x3E29 }, { 0x6DFB, 0x251A }, 
+       { 0x6E05, 0x2016 }, { 0x6E07, 0x1349 }, { 0x6E08, 0x1A31 }, { 0x6E09, 0x1E24 }, { 0x6E0A, 0x3E1D }, { 0x6E0B, 0x1D22 }, 
+       { 0x6E13, 0x172C }, { 0x6E15, 0x3E1C }, { 0x6E19, 0x3E32 }, { 0x6E1A, 0x1D4D }, { 0x6E1B, 0x181A }, { 0x6E1D, 0x3E41 }, 
+       { 0x6E1F, 0x3E3B }, { 0x6E20, 0x1554 }, { 0x6E21, 0x252F }, { 0x6E23, 0x3E36 }, { 0x6E24, 0x3E3F }, { 0x6E25, 0x100F }, 
+       { 0x6E26, 0x1112 }, { 0x6E29, 0x1219 }, { 0x6E2B, 0x3E38 }, { 0x6E2C, 0x220C }, { 0x6E2D, 0x3E2F }, { 0x6E2E, 0x3E31 }, 
+       { 0x6E2F, 0x1921 }, { 0x6E38, 0x3E42 }, { 0x6E3A, 0x3E3D }, { 0x6E3E, 0x3E35 }, { 0x6E43, 0x3E3C }, { 0x6E4A, 0x2C0B }, 
+       { 0x6E4D, 0x3E3A }, { 0x6E4E, 0x3E3E }, { 0x6E56, 0x1830 }, { 0x6E58, 0x1E25 }, { 0x6E5B, 0x2319 }, { 0x6E5F, 0x3E34 }, 
+       { 0x6E67, 0x2D0F }, { 0x6E6B, 0x3E37 }, { 0x6E6E, 0x3E30 }, { 0x6E6F, 0x2552 }, { 0x6E72, 0x3E33 }, { 0x6E76, 0x3E39 }, 
+       { 0x6E7E, 0x2F31 }, { 0x6E7F, 0x1C1E }, { 0x6E80, 0x2B5E }, { 0x6E82, 0x3E43 }, { 0x6E8C, 0x280E }, { 0x6E8F, 0x3E4F }, 
+       { 0x6E90, 0x181B }, { 0x6E96, 0x1D40 }, { 0x6E98, 0x3E45 }, { 0x6E9C, 0x2E0F }, { 0x6E9D, 0x1922 }, { 0x6E9F, 0x3E52 }, 
+       { 0x6EA2, 0x104E }, { 0x6EA5, 0x3E50 }, { 0x6EAA, 0x3E44 }, { 0x6EAF, 0x3E4A }, { 0x6EB2, 0x3E4C }, { 0x6EB6, 0x2D2F }, 
+       { 0x6EB7, 0x3E47 }, { 0x6EBA, 0x250E }, { 0x6EBD, 0x3E49 }, { 0x6EC2, 0x3E51 }, { 0x6EC4, 0x3E4B }, { 0x6EC5, 0x2C27 }, 
+       { 0x6EC9, 0x3E46 }, { 0x6ECB, 0x1C02 }, { 0x6ECC, 0x3E5E }, { 0x6ED1, 0x134A }, { 0x6ED3, 0x3E48 }, { 0x6ED4, 0x3E4D }, 
+       { 0x6ED5, 0x3E4E }, { 0x6EDD, 0x224C }, { 0x6EDE, 0x223A }, { 0x6EEC, 0x3E56 }, { 0x6EEF, 0x3E5C }, { 0x6EF2, 0x3E5A }, 
+       { 0x6EF4, 0x2509 }, { 0x6EF7, 0x3F03 }, { 0x6EF8, 0x3E57 }, { 0x6EFE, 0x3E58 }, { 0x6EFF, 0x3E40 }, { 0x6F01, 0x1559 }, 
+       { 0x6F02, 0x291A }, { 0x6F06, 0x1C1F }, { 0x6F09, 0x1957 }, { 0x6F0F, 0x2F13 }, { 0x6F11, 0x3E54 }, { 0x6F13, 0x3F02 }, 
+       { 0x6F14, 0x1149 }, { 0x6F15, 0x2146 }, { 0x6F20, 0x2759 }, { 0x6F22, 0x1421 }, { 0x6F23, 0x2E5A }, { 0x6F2B, 0x2C01 }, 
+       { 0x6F2C, 0x2432 }, { 0x6F31, 0x3E5B }, { 0x6F32, 0x3E5D }, { 0x6F38, 0x2112 }, { 0x6F3E, 0x3F01 }, { 0x6F3F, 0x3E59 }, 
+       { 0x6F41, 0x3E53 }, { 0x6F45, 0x1423 }, { 0x6F54, 0x1749 }, { 0x6F58, 0x3F0F }, { 0x6F5B, 0x3F0A }, { 0x6F5C, 0x2058 }, 
+       { 0x6F5F, 0x1343 }, { 0x6F64, 0x1D41 }, { 0x6F66, 0x3F13 }, { 0x6F6D, 0x3F0C }, { 0x6F6E, 0x240C }, { 0x6F6F, 0x3F09 }, 
+       { 0x6F70, 0x2439 }, { 0x6F74, 0x3F2C }, { 0x6F78, 0x3F06 }, { 0x6F7A, 0x3F05 }, { 0x6F7C, 0x3F0E }, { 0x6F80, 0x3F08 }, 
+       { 0x6F81, 0x3F07 }, { 0x6F82, 0x3F0D }, { 0x6F84, 0x2001 }, { 0x6F86, 0x3F04 }, { 0x6F8E, 0x3F10 }, { 0x6F91, 0x3F11 }, 
+       { 0x6F97, 0x1422 }, { 0x6FA1, 0x3F16 }, { 0x6FA3, 0x3F15 }, { 0x6FA4, 0x3F17 }, { 0x6FAA, 0x3F1A }, { 0x6FB1, 0x2523 }, 
+       { 0x6FB3, 0x3F14 }, { 0x6FB9, 0x3F18 }, { 0x6FC0, 0x1743 }, { 0x6FC1, 0x2259 }, { 0x6FC2, 0x3F12 }, { 0x6FC3, 0x271B }, 
+       { 0x6FC6, 0x3F19 }, { 0x6FD4, 0x3F1E }, { 0x6FD5, 0x3F1C }, { 0x6FD8, 0x3F1F }, { 0x6FDB, 0x3F22 }, { 0x6FDF, 0x3F1B }, 
+       { 0x6FE0, 0x194A }, { 0x6FE1, 0x2708 }, { 0x6FE4, 0x3E19 }, { 0x6FEB, 0x2D54 }, { 0x6FEC, 0x3F1D }, { 0x6FEE, 0x3F21 }, 
+       { 0x6FEF, 0x2255 }, { 0x6FF1, 0x3F20 }, { 0x6FF3, 0x3F0B }, { 0x6FF6, 0x4F49 }, { 0x6FFA, 0x3F25 }, { 0x6FFE, 0x3F29 }, 
+       { 0x7001, 0x3F27 }, { 0x7009, 0x3F23 }, { 0x700B, 0x3F24 }, { 0x700F, 0x3F28 }, { 0x7011, 0x3F26 }, { 0x7015, 0x292E }, 
+       { 0x7018, 0x3F2E }, { 0x701A, 0x3F2B }, { 0x701B, 0x3F2A }, { 0x701D, 0x3F2D }, { 0x701E, 0x2634 }, { 0x701F, 0x3F2F }, 
+       { 0x7026, 0x2355 }, { 0x7027, 0x224D }, { 0x702C, 0x2005 }, { 0x7030, 0x3F30 }, { 0x7032, 0x3F32 }, { 0x703E, 0x3F31 }, 
+       { 0x704C, 0x3E55 }, { 0x7051, 0x3F33 }, { 0x7058, 0x2647 }, { 0x7063, 0x3F34 }, { 0x706B, 0x1230 }, { 0x706F, 0x2554 }, 
+       { 0x7070, 0x1305 }, { 0x7078, 0x1544 }, { 0x707C, 0x1C3E }, { 0x707D, 0x1A32 }, { 0x7089, 0x2F07 }, { 0x708A, 0x1F46 }, 
+       { 0x708E, 0x114A }, { 0x7092, 0x3F36 }, { 0x7099, 0x3F35 }, { 0x70AC, 0x3F39 }, { 0x70AD, 0x231A }, { 0x70AE, 0x3F3C }, 
+       { 0x70AF, 0x3F37 }, { 0x70B3, 0x3F3B }, { 0x70B8, 0x3F3A }, { 0x70B9, 0x2520 }, { 0x70BA, 0x1039 }, { 0x70C8, 0x2E55 }, 
+       { 0x70CB, 0x3F3E }, { 0x70CF, 0x1108 }, { 0x70D9, 0x3F40 }, { 0x70DD, 0x3F3F }, { 0x70DF, 0x3F3D }, { 0x70F1, 0x3F38 }, 
+       { 0x70F9, 0x2B03 }, { 0x70FD, 0x3F42 }, { 0x7109, 0x3F41 }, { 0x7114, 0x114B }, { 0x7119, 0x3F44 }, { 0x711A, 0x2A12 }, 
+       { 0x711C, 0x3F43 }, { 0x7121, 0x2C15 }, { 0x7126, 0x1E27 }, { 0x7136, 0x2113 }, { 0x713C, 0x1E26 }, { 0x7149, 0x2E5B }, 
+       { 0x714C, 0x3F4A }, { 0x714E, 0x2059 }, { 0x7155, 0x3F46 }, { 0x7156, 0x3F4B }, { 0x7159, 0x114C }, { 0x7162, 0x3F49 }, 
+       { 0x7164, 0x2741 }, { 0x7165, 0x3F45 }, { 0x7166, 0x3F48 }, { 0x7167, 0x1E28 }, { 0x7169, 0x2831 }, { 0x716C, 0x3F4C }, 
+       { 0x716E, 0x1C31 }, { 0x717D, 0x205A }, { 0x7184, 0x3F4F }, { 0x7188, 0x3F47 }, { 0x718A, 0x1707 }, { 0x718F, 0x3F4D }, 
+       { 0x7194, 0x2D30 }, { 0x7195, 0x3F50 }, { 0x7199, 0x5406 }, { 0x719F, 0x1D2F }, { 0x71A8, 0x3F51 }, { 0x71AC, 0x3F52 }, 
+       { 0x71B1, 0x270E }, { 0x71B9, 0x3F54 }, { 0x71BE, 0x3F55 }, { 0x71C3, 0x2713 }, { 0x71C8, 0x2555 }, { 0x71C9, 0x3F57 }, 
+       { 0x71CE, 0x3F59 }, { 0x71D0, 0x2E35 }, { 0x71D2, 0x3F56 }, { 0x71D4, 0x3F58 }, { 0x71D5, 0x114D }, { 0x71D7, 0x3F53 }, 
+       { 0x71DF, 0x333B }, { 0x71E0, 0x3F5A }, { 0x71E5, 0x2147 }, { 0x71E6, 0x1B18 }, { 0x71E7, 0x3F5C }, { 0x71EC, 0x3F5B }, 
+       { 0x71ED, 0x1F04 }, { 0x71EE, 0x3239 }, { 0x71F5, 0x3F5D }, { 0x71F9, 0x4001 }, { 0x71FB, 0x3F4E }, { 0x71FC, 0x3F5E }, 
+       { 0x71FF, 0x4002 }, { 0x7206, 0x275A }, { 0x720D, 0x4003 }, { 0x7210, 0x4004 }, { 0x721B, 0x4005 }, { 0x7228, 0x4006 }, 
+       { 0x722A, 0x243E }, { 0x722C, 0x4008 }, { 0x722D, 0x4007 }, { 0x7230, 0x4009 }, { 0x7232, 0x400A }, { 0x7235, 0x1C3F }, 
+       { 0x7236, 0x2943 }, { 0x723A, 0x2C4C }, { 0x723B, 0x400B }, { 0x723C, 0x400C }, { 0x723D, 0x2136 }, { 0x723E, 0x1C04 }, 
+       { 0x723F, 0x400D }, { 0x7240, 0x400E }, { 0x7246, 0x400F }, { 0x7247, 0x2A32 }, { 0x7248, 0x2827 }, { 0x724B, 0x4010 }, 
+       { 0x724C, 0x2737 }, { 0x7252, 0x240D }, { 0x7258, 0x4011 }, { 0x7259, 0x1247 }, { 0x725B, 0x154D }, { 0x725D, 0x2C26 }, 
+       { 0x725F, 0x2C16 }, { 0x7261, 0x1214 }, { 0x7262, 0x2F14 }, { 0x7267, 0x2B32 }, { 0x7269, 0x2A0A }, { 0x7272, 0x2017 }, 
+       { 0x7274, 0x4012 }, { 0x7279, 0x2623 }, { 0x727D, 0x1803 }, { 0x727E, 0x4013 }, { 0x7280, 0x1A34 }, { 0x7281, 0x4015 }, 
+       { 0x7282, 0x4014 }, { 0x7287, 0x4016 }, { 0x7292, 0x4017 }, { 0x7296, 0x4018 }, { 0x72A0, 0x151E }, { 0x72A2, 0x4019 }, 
+       { 0x72A7, 0x401A }, { 0x72AC, 0x1804 }, { 0x72AF, 0x2828 }, { 0x72B2, 0x401C }, { 0x72B6, 0x1E55 }, { 0x72B9, 0x401B }, 
+       { 0x72C2, 0x1618 }, { 0x72C3, 0x401D }, { 0x72C4, 0x401F }, { 0x72C6, 0x401E }, { 0x72CE, 0x4020 }, { 0x72D0, 0x1831 }, 
+       { 0x72D2, 0x4021 }, { 0x72D7, 0x1649 }, { 0x72D9, 0x2120 }, { 0x72DB, 0x195D }, { 0x72E0, 0x4023 }, { 0x72E1, 0x4024 }, 
+       { 0x72E2, 0x4022 }, { 0x72E9, 0x1C4D }, { 0x72EC, 0x2628 }, { 0x72ED, 0x1619 }, { 0x72F7, 0x4026 }, { 0x72F8, 0x230C }, 
+       { 0x72F9, 0x4025 }, { 0x72FC, 0x2F15 }, { 0x72FD, 0x2742 }, { 0x730A, 0x4029 }, { 0x7316, 0x402B }, { 0x7317, 0x4028 }, 
+       { 0x731B, 0x2C34 }, { 0x731C, 0x402A }, { 0x731D, 0x402C }, { 0x731F, 0x2E24 }, { 0x7325, 0x4030 }, { 0x7329, 0x402F }, 
+       { 0x732A, 0x2356 }, { 0x732B, 0x270D }, { 0x732E, 0x1805 }, { 0x732F, 0x402E }, { 0x7334, 0x402D }, { 0x7336, 0x2D11 }, 
+       { 0x7337, 0x2D12 }, { 0x733E, 0x4031 }, { 0x733F, 0x114E }, { 0x7344, 0x1956 }, { 0x7345, 0x1B42 }, { 0x734E, 0x4032 }, 
+       { 0x734F, 0x4033 }, { 0x7357, 0x4035 }, { 0x7363, 0x1D23 }, { 0x7368, 0x4037 }, { 0x736A, 0x4036 }, { 0x7370, 0x4038 }, 
+       { 0x7372, 0x132D }, { 0x7375, 0x403A }, { 0x7378, 0x4039 }, { 0x737A, 0x403C }, { 0x737B, 0x403B }, { 0x7384, 0x181C }, 
+       { 0x7387, 0x2E08 }, { 0x7389, 0x162C }, { 0x738B, 0x1206 }, { 0x7396, 0x164A }, { 0x73A9, 0x1441 }, { 0x73B2, 0x2E48 }, 
+       { 0x73B3, 0x403E }, { 0x73BB, 0x4040 }, { 0x73C0, 0x4041 }, { 0x73C2, 0x1231 }, { 0x73C8, 0x403D }, { 0x73CA, 0x1B19 }, 
+       { 0x73CD, 0x2421 }, { 0x73CE, 0x403F }, { 0x73DE, 0x4044 }, { 0x73E0, 0x1C4E }, { 0x73E5, 0x4042 }, { 0x73EA, 0x171E }, 
+       { 0x73ED, 0x2829 }, { 0x73EE, 0x4043 }, { 0x73F1, 0x405E }, { 0x73F8, 0x4049 }, { 0x73FE, 0x181D }, { 0x7403, 0x1545 }, 
+       { 0x7405, 0x4046 }, { 0x7406, 0x2D5D }, { 0x7409, 0x2E10 }, { 0x7422, 0x2256 }, { 0x7425, 0x4048 }, { 0x7432, 0x404A }, 
+       { 0x7433, 0x2E36 }, { 0x7434, 0x1637 }, { 0x7435, 0x285C }, { 0x7436, 0x272A }, { 0x743A, 0x404B }, { 0x743F, 0x404D }, 
+       { 0x7441, 0x4050 }, { 0x7455, 0x404C }, { 0x7459, 0x404F }, { 0x745A, 0x184A }, { 0x745B, 0x112D }, { 0x745C, 0x4051 }, 
+       { 0x745E, 0x1F50 }, { 0x745F, 0x404E }, { 0x7460, 0x2E3C }, { 0x7463, 0x4054 }, { 0x7464, 0x5404 }, { 0x7469, 0x4052 }, 
+       { 0x746A, 0x4055 }, { 0x746F, 0x4047 }, { 0x7470, 0x4053 }, { 0x7473, 0x1A1C }, { 0x7476, 0x4056 }, { 0x747E, 0x4057 }, 
+       { 0x7483, 0x2D5E }, { 0x748B, 0x4058 }, { 0x749E, 0x4059 }, { 0x74A2, 0x4045 }, { 0x74A7, 0x405A }, { 0x74B0, 0x1424 }, 
+       { 0x74BD, 0x1C05 }, { 0x74CA, 0x405B }, { 0x74CF, 0x405C }, { 0x74D4, 0x405D }, { 0x74DC, 0x111B }, { 0x74E0, 0x4101 }, 
+       { 0x74E2, 0x291B }, { 0x74E3, 0x4102 }, { 0x74E6, 0x1404 }, { 0x74E7, 0x4103 }, { 0x74E9, 0x4104 }, { 0x74EE, 0x4105 }, 
+       { 0x74F0, 0x4107 }, { 0x74F1, 0x4108 }, { 0x74F2, 0x4106 }, { 0x74F6, 0x2933 }, { 0x74F7, 0x410A }, { 0x74F8, 0x4109 }, 
+       { 0x7503, 0x410C }, { 0x7504, 0x410B }, { 0x7505, 0x410D }, { 0x750C, 0x410E }, { 0x750D, 0x4110 }, { 0x750E, 0x410F }, 
+       { 0x7511, 0x1959 }, { 0x7513, 0x4112 }, { 0x7515, 0x4111 }, { 0x7518, 0x1425 }, { 0x751A, 0x1F33 }, { 0x751C, 0x251C }, 
+       { 0x751E, 0x4113 }, { 0x751F, 0x2018 }, { 0x7523, 0x1B1A }, { 0x7525, 0x1159 }, { 0x7526, 0x4114 }, { 0x7528, 0x2D31 }, 
+       { 0x752B, 0x2A43 }, { 0x752C, 0x4115 }, { 0x7530, 0x2524 }, { 0x7531, 0x2D13 }, { 0x7532, 0x1923 }, { 0x7533, 0x1F1D }, 
+       { 0x7537, 0x232B }, { 0x7538, 0x3214 }, { 0x753A, 0x240E }, { 0x753B, 0x1248 }, { 0x753C, 0x4116 }, { 0x7544, 0x4117 }, 
+       { 0x7546, 0x411C }, { 0x7549, 0x411A }, { 0x754A, 0x4119 }, { 0x754B, 0x3A22 }, { 0x754C, 0x1306 }, { 0x754D, 0x4118 }, 
+       { 0x754F, 0x103A }, { 0x7551, 0x280A }, { 0x7554, 0x282A }, { 0x7559, 0x2E11 }, { 0x755A, 0x411D }, { 0x755B, 0x411B }, 
+       { 0x755C, 0x233C }, { 0x755D, 0x2006 }, { 0x7560, 0x280B }, { 0x7562, 0x290D }, { 0x7564, 0x411F }, { 0x7565, 0x2E0C }, 
+       { 0x7566, 0x172D }, { 0x7567, 0x4120 }, { 0x7569, 0x411E }, { 0x756A, 0x2836 }, { 0x756B, 0x4121 }, { 0x756D, 0x4122 }, 
+       { 0x7570, 0x103B }, { 0x7573, 0x1E56 }, { 0x7574, 0x4127 }, { 0x7576, 0x4124 }, { 0x7577, 0x264D }, { 0x7578, 0x4123 }, 
+       { 0x757F, 0x1506 }, { 0x7582, 0x412A }, { 0x7586, 0x4125 }, { 0x7587, 0x4126 }, { 0x7589, 0x4129 }, { 0x758A, 0x4128 }, 
+       { 0x758B, 0x2905 }, { 0x758E, 0x2122 }, { 0x758F, 0x2121 }, { 0x7591, 0x151F }, { 0x7594, 0x412B }, { 0x759A, 0x412C }, 
+       { 0x759D, 0x412D }, { 0x75A3, 0x412F }, { 0x75A5, 0x412E }, { 0x75AB, 0x1136 }, { 0x75B1, 0x4137 }, { 0x75B2, 0x2848 }, 
+       { 0x75B3, 0x4131 }, { 0x75B5, 0x4133 }, { 0x75B8, 0x4135 }, { 0x75B9, 0x1F1E }, { 0x75BC, 0x4136 }, { 0x75BD, 0x4134 }, 
+       { 0x75BE, 0x1C20 }, { 0x75C2, 0x4130 }, { 0x75C3, 0x4132 }, { 0x75C5, 0x2922 }, { 0x75C7, 0x1E29 }, { 0x75CA, 0x4139 }, 
+       { 0x75CD, 0x4138 }, { 0x75D2, 0x413A }, { 0x75D4, 0x1C06 }, { 0x75D5, 0x1A0F }, { 0x75D8, 0x2557 }, { 0x75D9, 0x413B }, 
+       { 0x75DB, 0x242B }, { 0x75DE, 0x413D }, { 0x75E2, 0x2E01 }, { 0x75E3, 0x413C }, { 0x75E9, 0x2149 }, { 0x75F0, 0x4142 }, 
+       { 0x75F2, 0x4144 }, { 0x75F3, 0x4145 }, { 0x75F4, 0x2334 }, { 0x75FA, 0x4143 }, { 0x75FC, 0x4140 }, { 0x75FE, 0x413E }, 
+       { 0x75FF, 0x413F }, { 0x7601, 0x4141 }, { 0x7609, 0x4148 }, { 0x760B, 0x4146 }, { 0x760D, 0x4147 }, { 0x761F, 0x4149 }, 
+       { 0x7620, 0x414B }, { 0x7621, 0x414C }, { 0x7622, 0x414D }, { 0x7624, 0x414E }, { 0x7627, 0x414A }, { 0x7630, 0x4150 }, 
+       { 0x7634, 0x414F }, { 0x763B, 0x4151 }, { 0x7642, 0x2E25 }, { 0x7646, 0x4154 }, { 0x7647, 0x4152 }, { 0x7648, 0x4153 }, 
+       { 0x764C, 0x1442 }, { 0x7652, 0x2C5E }, { 0x7656, 0x2A2A }, { 0x7658, 0x4156 }, { 0x765C, 0x4155 }, { 0x7661, 0x4157 }, 
+       { 0x7662, 0x4158 }, { 0x7667, 0x415C }, { 0x7668, 0x4159 }, { 0x7669, 0x415A }, { 0x766A, 0x415B }, { 0x766C, 0x415D }, 
+       { 0x7670, 0x415E }, { 0x7672, 0x4201 }, { 0x7676, 0x4202 }, { 0x7678, 0x4203 }, { 0x767A, 0x280F }, { 0x767B, 0x2530 }, 
+       { 0x767C, 0x4204 }, { 0x767D, 0x2752 }, { 0x767E, 0x2914 }, { 0x7680, 0x4205 }, { 0x7683, 0x4206 }, { 0x7684, 0x250A }, 
+       { 0x7686, 0x1307 }, { 0x7687, 0x1924 }, { 0x7688, 0x4207 }, { 0x768B, 0x4208 }, { 0x768E, 0x4209 }, { 0x7690, 0x1B09 }, 
+       { 0x7693, 0x420B }, { 0x7696, 0x420A }, { 0x7699, 0x420C }, { 0x769A, 0x420D }, { 0x76AE, 0x2849 }, { 0x76B0, 0x420E }, 
+       { 0x76B4, 0x420F }, { 0x76B7, 0x5349 }, { 0x76B8, 0x4210 }, { 0x76B9, 0x4211 }, { 0x76BA, 0x4212 }, { 0x76BF, 0x1B0E }, 
+       { 0x76C2, 0x4213 }, { 0x76C3, 0x2736 }, { 0x76C6, 0x2B3F }, { 0x76C8, 0x112E }, { 0x76CA, 0x1137 }, { 0x76CD, 0x4214 }, 
+       { 0x76D2, 0x4216 }, { 0x76D6, 0x4215 }, { 0x76D7, 0x2550 }, { 0x76DB, 0x2019 }, { 0x76DC, 0x3D19 }, { 0x76DE, 0x4217 }, 
+       { 0x76DF, 0x2C21 }, { 0x76E1, 0x4218 }, { 0x76E3, 0x1426 }, { 0x76E4, 0x2837 }, { 0x76E5, 0x4219 }, { 0x76E7, 0x421A }, 
+       { 0x76EA, 0x421B }, { 0x76EE, 0x2C3C }, { 0x76F2, 0x2C35 }, { 0x76F4, 0x241E }, { 0x76F8, 0x214A }, { 0x76FB, 0x421D }, 
+       { 0x76FE, 0x1D42 }, { 0x7701, 0x1E2A }, { 0x7704, 0x4220 }, { 0x7707, 0x421F }, { 0x7708, 0x421E }, { 0x7709, 0x285D }, 
+       { 0x770B, 0x1427 }, { 0x770C, 0x1809 }, { 0x771B, 0x4226 }, { 0x771E, 0x4223 }, { 0x771F, 0x1F1F }, { 0x7720, 0x2C12 }, 
+       { 0x7724, 0x4222 }, { 0x7725, 0x4224 }, { 0x7726, 0x4225 }, { 0x7729, 0x4221 }, { 0x7737, 0x4227 }, { 0x7738, 0x4228 }, 
+       { 0x773A, 0x240F }, { 0x773C, 0x1443 }, { 0x7740, 0x2345 }, { 0x7747, 0x4229 }, { 0x775A, 0x422A }, { 0x775B, 0x422D }, 
+       { 0x7761, 0x1F47 }, { 0x7763, 0x2624 }, { 0x7765, 0x422E }, { 0x7766, 0x2B33 }, { 0x7768, 0x422B }, { 0x776B, 0x422C }, 
+       { 0x7779, 0x4231 }, { 0x777E, 0x4230 }, { 0x777F, 0x422F }, { 0x778B, 0x4233 }, { 0x778E, 0x4232 }, { 0x7791, 0x4234 }, 
+       { 0x779E, 0x4236 }, { 0x77A0, 0x4235 }, { 0x77A5, 0x2A2D }, { 0x77AC, 0x1D36 }, { 0x77AD, 0x2E26 }, { 0x77B0, 0x4237 }, 
+       { 0x77B3, 0x2617 }, { 0x77B6, 0x4238 }, { 0x77B9, 0x4239 }, { 0x77BB, 0x423D }, { 0x77BC, 0x423B }, { 0x77BD, 0x423C }, 
+       { 0x77BF, 0x423A }, { 0x77C7, 0x423E }, { 0x77CD, 0x423F }, { 0x77D7, 0x4240 }, { 0x77DA, 0x4241 }, { 0x77DB, 0x2C17 }, 
+       { 0x77DC, 0x4242 }, { 0x77E2, 0x2C50 }, { 0x77E3, 0x4243 }, { 0x77E5, 0x232E }, { 0x77E7, 0x274A }, { 0x77E9, 0x164B }, 
+       { 0x77ED, 0x231B }, { 0x77EE, 0x4244 }, { 0x77EF, 0x161A }, { 0x77F3, 0x2030 }, { 0x77FC, 0x4245 }, { 0x7802, 0x1A1D }, 
+       { 0x780C, 0x4246 }, { 0x7812, 0x4247 }, { 0x7814, 0x1806 }, { 0x7815, 0x1A35 }, { 0x7820, 0x4249 }, { 0x7825, 0x2536 }, 
+       { 0x7826, 0x1A36 }, { 0x7827, 0x152E }, { 0x7832, 0x2B04 }, { 0x7834, 0x272B }, { 0x783A, 0x2537 }, { 0x783F, 0x193C }, 
+       { 0x7845, 0x424B }, { 0x785D, 0x1E2B }, { 0x786B, 0x2E12 }, { 0x786C, 0x1925 }, { 0x786F, 0x1807 }, { 0x7872, 0x2803 }, 
+       { 0x7874, 0x424D }, { 0x787C, 0x424F }, { 0x7881, 0x184B }, { 0x7886, 0x424E }, { 0x7887, 0x2456 }, { 0x788C, 0x4251 }, 
+       { 0x788D, 0x1317 }, { 0x788E, 0x424C }, { 0x7891, 0x284A }, { 0x7893, 0x1110 }, { 0x7895, 0x1A4C }, { 0x7897, 0x2F32 }, 
+       { 0x789A, 0x4250 }, { 0x78A3, 0x4252 }, { 0x78A7, 0x2A2B }, { 0x78A9, 0x2039 }, { 0x78AA, 0x4254 }, { 0x78AF, 0x4255 }, 
+       { 0x78B5, 0x4253 }, { 0x78BA, 0x132E }, { 0x78BC, 0x425B }, { 0x78BE, 0x425A }, { 0x78C1, 0x1C07 }, { 0x78C5, 0x425C }, 
+       { 0x78C6, 0x4257 }, { 0x78CA, 0x425D }, { 0x78CB, 0x4258 }, { 0x78D0, 0x2838 }, { 0x78D1, 0x4256 }, { 0x78D4, 0x4259 }, 
+       { 0x78DA, 0x4302 }, { 0x78E7, 0x4301 }, { 0x78E8, 0x2B41 }, { 0x78EC, 0x425E }, { 0x78EF, 0x104B }, { 0x78F4, 0x4304 }, 
+       { 0x78FD, 0x4303 }, { 0x7901, 0x1E2C }, { 0x7907, 0x4305 }, { 0x790E, 0x2123 }, { 0x7911, 0x4307 }, { 0x7912, 0x4306 }, 
+       { 0x7919, 0x4308 }, { 0x7926, 0x4248 }, { 0x792A, 0x424A }, { 0x792B, 0x430A }, { 0x792C, 0x4309 }, { 0x793A, 0x1C08 }, 
+       { 0x793C, 0x2E49 }, { 0x793E, 0x1C32 }, { 0x7940, 0x430B }, { 0x7941, 0x1717 }, { 0x7947, 0x1520 }, { 0x7948, 0x1507 }, 
+       { 0x7949, 0x1B43 }, { 0x7950, 0x2D14 }, { 0x7953, 0x4311 }, { 0x7955, 0x4310 }, { 0x7956, 0x2124 }, { 0x7957, 0x430D }, 
+       { 0x795A, 0x430F }, { 0x795D, 0x1D2B }, { 0x795E, 0x1F20 }, { 0x795F, 0x430E }, { 0x7960, 0x430C }, { 0x7962, 0x270A }, 
+       { 0x7965, 0x1E2D }, { 0x7968, 0x291C }, { 0x796D, 0x1A37 }, { 0x7977, 0x2558 }, { 0x797A, 0x4312 }, { 0x797F, 0x4313 }, 
+       { 0x7980, 0x4329 }, { 0x7981, 0x1638 }, { 0x7984, 0x2F1D }, { 0x7985, 0x2115 }, { 0x798A, 0x4314 }, { 0x798D, 0x1232 }, 
+       { 0x798E, 0x2457 }, { 0x798F, 0x2A01 }, { 0x799D, 0x4315 }, { 0x79A6, 0x155A }, { 0x79A7, 0x4316 }, { 0x79AA, 0x4318 }, 
+       { 0x79AE, 0x4319 }, { 0x79B0, 0x2709 }, { 0x79B3, 0x431A }, { 0x79B9, 0x431B }, { 0x79BA, 0x431C }, { 0x79BD, 0x1639 }, 
+       { 0x79BE, 0x1233 }, { 0x79BF, 0x2625 }, { 0x79C0, 0x1D08 }, { 0x79C1, 0x1B44 }, { 0x79C9, 0x431D }, { 0x79CB, 0x1D09 }, 
+       { 0x79D1, 0x122A }, { 0x79D2, 0x2923 }, { 0x79D5, 0x431E }, { 0x79D8, 0x284B }, { 0x79DF, 0x2125 }, { 0x79E1, 0x4321 }, 
+       { 0x79E3, 0x4322 }, { 0x79E4, 0x2749 }, { 0x79E6, 0x1F21 }, { 0x79E7, 0x431F }, { 0x79E9, 0x2341 }, { 0x79EC, 0x4320 }, 
+       { 0x79F0, 0x1E2E }, { 0x79FB, 0x103C }, { 0x7A00, 0x1509 }, { 0x7A08, 0x4323 }, { 0x7A0B, 0x2458 }, { 0x7A0D, 0x4324 }, 
+       { 0x7A0E, 0x2027 }, { 0x7A14, 0x2C0D }, { 0x7A17, 0x2903 }, { 0x7A18, 0x4325 }, { 0x7A19, 0x4326 }, { 0x7A1A, 0x2335 }, 
+       { 0x7A1C, 0x2E27 }, { 0x7A1F, 0x4328 }, { 0x7A20, 0x4327 }, { 0x7A2E, 0x1C4F }, { 0x7A31, 0x432A }, { 0x7A32, 0x1050 }, 
+       { 0x7A37, 0x432D }, { 0x7A3B, 0x432B }, { 0x7A3C, 0x1234 }, { 0x7A3D, 0x172E }, { 0x7A3E, 0x432C }, { 0x7A3F, 0x1926 }, 
+       { 0x7A40, 0x1952 }, { 0x7A42, 0x2A46 }, { 0x7A43, 0x432E }, { 0x7A46, 0x2B34 }, { 0x7A49, 0x4330 }, { 0x7A4D, 0x2031 }, 
+       { 0x7A4E, 0x112F }, { 0x7A4F, 0x121A }, { 0x7A50, 0x100C }, { 0x7A57, 0x432F }, { 0x7A61, 0x4331 }, { 0x7A62, 0x4332 }, 
+       { 0x7A63, 0x1E57 }, { 0x7A69, 0x4333 }, { 0x7A6B, 0x132F }, { 0x7A70, 0x4335 }, { 0x7A74, 0x174A }, { 0x7A76, 0x1546 }, 
+       { 0x7A79, 0x4336 }, { 0x7A7A, 0x1655 }, { 0x7A7D, 0x4337 }, { 0x7A7F, 0x205C }, { 0x7A81, 0x262D }, { 0x7A83, 0x2040 }, 
+       { 0x7A84, 0x1A55 }, { 0x7A88, 0x4338 }, { 0x7A92, 0x2342 }, { 0x7A93, 0x214B }, { 0x7A95, 0x433A }, { 0x7A96, 0x433C }, 
+       { 0x7A97, 0x4339 }, { 0x7A98, 0x433B }, { 0x7A9F, 0x1702 }, { 0x7AA9, 0x433D }, { 0x7AAA, 0x1706 }, { 0x7AAE, 0x1547 }, 
+       { 0x7AAF, 0x2D32 }, { 0x7AB0, 0x433F }, { 0x7AB6, 0x4340 }, { 0x7ABA, 0x110E }, { 0x7ABF, 0x4343 }, { 0x7AC3, 0x1356 }, 
+       { 0x7AC4, 0x4342 }, { 0x7AC5, 0x4341 }, { 0x7AC7, 0x4345 }, { 0x7AC8, 0x433E }, { 0x7ACA, 0x4346 }, { 0x7ACB, 0x2E09 }, 
+       { 0x7ACD, 0x4347 }, { 0x7ACF, 0x4348 }, { 0x7AD2, 0x3454 }, { 0x7AD3, 0x434A }, { 0x7AD5, 0x4349 }, { 0x7AD9, 0x434B }, 
+       { 0x7ADA, 0x434C }, { 0x7ADC, 0x2E15 }, { 0x7ADD, 0x434D }, { 0x7ADF, 0x504F }, { 0x7AE0, 0x1E2F }, { 0x7AE1, 0x434E }, 
+       { 0x7AE2, 0x434F }, { 0x7AE3, 0x1D37 }, { 0x7AE5, 0x2618 }, { 0x7AE6, 0x4350 }, { 0x7AEA, 0x2308 }, { 0x7AED, 0x4351 }, 
+       { 0x7AEF, 0x231C }, { 0x7AF0, 0x4352 }, { 0x7AF6, 0x1605 }, { 0x7AF8, 0x311F }, { 0x7AF9, 0x233D }, { 0x7AFA, 0x1C13 }, 
+       { 0x7AFF, 0x1428 }, { 0x7B02, 0x4353 }, { 0x7B04, 0x4402 }, { 0x7B06, 0x4356 }, { 0x7B08, 0x1548 }, { 0x7B0A, 0x4355 }, 
+       { 0x7B0B, 0x4404 }, { 0x7B0F, 0x4354 }, { 0x7B11, 0x1E30 }, { 0x7B18, 0x4358 }, { 0x7B19, 0x4359 }, { 0x7B1B, 0x250B }, 
+       { 0x7B1E, 0x435A }, { 0x7B20, 0x133E }, { 0x7B25, 0x1F3A }, { 0x7B26, 0x2944 }, { 0x7B28, 0x435C }, { 0x7B2C, 0x2248 }, 
+       { 0x7B33, 0x4357 }, { 0x7B35, 0x435B }, { 0x7B36, 0x435D }, { 0x7B39, 0x1A5B }, { 0x7B45, 0x4406 }, { 0x7B46, 0x290E }, 
+       { 0x7B48, 0x2806 }, { 0x7B49, 0x2559 }, { 0x7B4B, 0x163A }, { 0x7B4C, 0x4405 }, { 0x7B4D, 0x4403 }, { 0x7B4F, 0x2815 }, 
+       { 0x7B50, 0x435E }, { 0x7B51, 0x233E }, { 0x7B52, 0x255B }, { 0x7B54, 0x255A }, { 0x7B56, 0x1A56 }, { 0x7B5D, 0x4418 }, 
+       { 0x7B65, 0x4408 }, { 0x7B67, 0x440A }, { 0x7B6C, 0x440D }, { 0x7B6E, 0x440E }, { 0x7B70, 0x440B }, { 0x7B71, 0x440C }, 
+       { 0x7B74, 0x4409 }, { 0x7B75, 0x4407 }, { 0x7B7A, 0x4401 }, { 0x7B86, 0x2A2F }, { 0x7B87, 0x1235 }, { 0x7B8B, 0x4415 }, 
+       { 0x7B8D, 0x4412 }, { 0x7B8F, 0x4417 }, { 0x7B92, 0x4416 }, { 0x7B94, 0x2753 }, { 0x7B95, 0x2C07 }, { 0x7B97, 0x1B1B }, 
+       { 0x7B98, 0x4410 }, { 0x7B99, 0x4419 }, { 0x7B9A, 0x4414 }, { 0x7B9C, 0x4413 }, { 0x7B9D, 0x440F }, { 0x7B9F, 0x4411 }, 
+       { 0x7BA1, 0x1429 }, { 0x7BAA, 0x231D }, { 0x7BAD, 0x205D }, { 0x7BB1, 0x2802 }, { 0x7BB4, 0x441E }, { 0x7BB8, 0x2804 }, 
+       { 0x7BC0, 0x2041 }, { 0x7BC1, 0x441B }, { 0x7BC4, 0x282F }, { 0x7BC6, 0x441F }, { 0x7BC7, 0x2A33 }, { 0x7BC9, 0x233B }, 
+       { 0x7BCB, 0x441A }, { 0x7BCC, 0x441C }, { 0x7BCF, 0x441D }, { 0x7BDD, 0x4420 }, { 0x7BE0, 0x1C24 }, { 0x7BE4, 0x2626 }, 
+       { 0x7BE5, 0x4425 }, { 0x7BE6, 0x4424 }, { 0x7BE9, 0x4421 }, { 0x7BED, 0x2F16 }, { 0x7BF3, 0x442A }, { 0x7BF6, 0x442E }, 
+       { 0x7BF7, 0x442B }, { 0x7C00, 0x4427 }, { 0x7C07, 0x4428 }, { 0x7C0D, 0x442D }, { 0x7C11, 0x4422 }, { 0x7C12, 0x3235 }, 
+       { 0x7C13, 0x4429 }, { 0x7C14, 0x4423 }, { 0x7C17, 0x442C }, { 0x7C1F, 0x4432 }, { 0x7C21, 0x142A }, { 0x7C23, 0x442F }, 
+       { 0x7C27, 0x4430 }, { 0x7C2A, 0x4431 }, { 0x7C2B, 0x4434 }, { 0x7C37, 0x4433 }, { 0x7C38, 0x2856 }, { 0x7C3D, 0x4435 }, 
+       { 0x7C3E, 0x2E5C }, { 0x7C3F, 0x2A4D }, { 0x7C40, 0x443A }, { 0x7C43, 0x4437 }, { 0x7C4C, 0x4436 }, { 0x7C4D, 0x2032 }, 
+       { 0x7C4F, 0x4439 }, { 0x7C50, 0x443B }, { 0x7C54, 0x4438 }, { 0x7C56, 0x443F }, { 0x7C58, 0x443C }, { 0x7C5F, 0x443D }, 
+       { 0x7C60, 0x4426 }, { 0x7C64, 0x443E }, { 0x7C65, 0x4440 }, { 0x7C6C, 0x4441 }, { 0x7C73, 0x2A26 }, { 0x7C75, 0x4442 }, 
+       { 0x7C7E, 0x2C42 }, { 0x7C81, 0x162E }, { 0x7C82, 0x1709 }, { 0x7C83, 0x4443 }, { 0x7C89, 0x2A14 }, { 0x7C8B, 0x1F48 }, 
+       { 0x7C8D, 0x2C10 }, { 0x7C90, 0x4444 }, { 0x7C92, 0x2E13 }, { 0x7C95, 0x2754 }, { 0x7C97, 0x2126 }, { 0x7C98, 0x2714 }, 
+       { 0x7C9B, 0x1D2D }, { 0x7C9F, 0x1020 }, { 0x7CA1, 0x4449 }, { 0x7CA2, 0x4447 }, { 0x7CA4, 0x4445 }, { 0x7CA5, 0x1401 }, 
+       { 0x7CA7, 0x1E31 }, { 0x7CA8, 0x444A }, { 0x7CAB, 0x4448 }, { 0x7CAD, 0x4446 }, { 0x7CAE, 0x444E }, { 0x7CB1, 0x444D }, 
+       { 0x7CB2, 0x444C }, { 0x7CB3, 0x444B }, { 0x7CB9, 0x444F }, { 0x7CBD, 0x4450 }, { 0x7CBE, 0x201A }, { 0x7CC0, 0x4451 }, 
+       { 0x7CC2, 0x4453 }, { 0x7CC5, 0x4452 }, { 0x7CCA, 0x1832 }, { 0x7CCE, 0x2118 }, { 0x7CD2, 0x4455 }, { 0x7CD6, 0x255C }, 
+       { 0x7CD8, 0x4454 }, { 0x7CDC, 0x4456 }, { 0x7CDE, 0x2A15 }, { 0x7CDF, 0x214C }, { 0x7CE0, 0x1927 }, { 0x7CE2, 0x4457 }, 
+       { 0x7CE7, 0x2E28 }, { 0x7CEF, 0x4459 }, { 0x7CF2, 0x445A }, { 0x7CF4, 0x445B }, { 0x7CF6, 0x445C }, { 0x7CF8, 0x1B45 }, 
+       { 0x7CFA, 0x445D }, { 0x7CFB, 0x172F }, { 0x7CFE, 0x154A }, { 0x7D00, 0x150A }, { 0x7D02, 0x4501 }, { 0x7D04, 0x2C53 }, 
+       { 0x7D05, 0x1928 }, { 0x7D06, 0x445E }, { 0x7D0A, 0x4504 }, { 0x7D0B, 0x2C46 }, { 0x7D0D, 0x271C }, { 0x7D10, 0x2913 }, 
+       { 0x7D14, 0x1D43 }, { 0x7D15, 0x4503 }, { 0x7D17, 0x1C33 }, { 0x7D18, 0x1929 }, { 0x7D19, 0x1B46 }, { 0x7D1A, 0x1549 }, 
+       { 0x7D1B, 0x2A16 }, { 0x7D1C, 0x4502 }, { 0x7D20, 0x2127 }, { 0x7D21, 0x2B22 }, { 0x7D22, 0x1A57 }, { 0x7D2B, 0x1B47 }, 
+       { 0x7D2C, 0x243D }, { 0x7D2E, 0x4507 }, { 0x7D2F, 0x2E3F }, { 0x7D30, 0x1A39 }, { 0x7D32, 0x4508 }, { 0x7D33, 0x1F22 }, 
+       { 0x7D35, 0x450A }, { 0x7D39, 0x1E32 }, { 0x7D3A, 0x1A10 }, { 0x7D3F, 0x4509 }, { 0x7D42, 0x1D0A }, { 0x7D43, 0x181E }, 
+       { 0x7D44, 0x2128 }, { 0x7D45, 0x4505 }, { 0x7D46, 0x450B }, { 0x7D4B, 0x4506 }, { 0x7D4C, 0x1730 }, { 0x7D4E, 0x450E }, 
+       { 0x7D4F, 0x4512 }, { 0x7D50, 0x174B }, { 0x7D56, 0x450D }, { 0x7D5B, 0x4516 }, { 0x7D5E, 0x192A }, { 0x7D61, 0x2D4D }, 
+       { 0x7D62, 0x101C }, { 0x7D63, 0x4513 }, { 0x7D66, 0x154B }, { 0x7D68, 0x4510 }, { 0x7D6E, 0x4511 }, { 0x7D71, 0x255D }, 
+       { 0x7D72, 0x450F }, { 0x7D73, 0x450C }, { 0x7D75, 0x1308 }, { 0x7D76, 0x2044 }, { 0x7D79, 0x1808 }, { 0x7D7D, 0x4518 }, 
+       { 0x7D89, 0x4515 }, { 0x7D8F, 0x4517 }, { 0x7D93, 0x4514 }, { 0x7D99, 0x1731 }, { 0x7D9A, 0x2213 }, { 0x7D9B, 0x4519 }, 
+       { 0x7D9C, 0x214E }, { 0x7D9F, 0x4526 }, { 0x7DA2, 0x4522 }, { 0x7DA3, 0x451C }, { 0x7DAB, 0x4520 }, { 0x7DAC, 0x1C5A }, 
+       { 0x7DAD, 0x103D }, { 0x7DAE, 0x451B }, { 0x7DAF, 0x4523 }, { 0x7DB0, 0x4527 }, { 0x7DB1, 0x192B }, { 0x7DB2, 0x2C36 }, 
+       { 0x7DB4, 0x2436 }, { 0x7DB5, 0x451D }, { 0x7DB8, 0x4525 }, { 0x7DBA, 0x451A }, { 0x7DBB, 0x231E }, { 0x7DBD, 0x451F }, 
+       { 0x7DBE, 0x101D }, { 0x7DBF, 0x2C2A }, { 0x7DC7, 0x451E }, { 0x7DCA, 0x163B }, { 0x7DCB, 0x284C }, { 0x7DCF, 0x214D }, 
+       { 0x7DD1, 0x2E30 }, { 0x7DD2, 0x1D4F }, { 0x7DD5, 0x454E }, { 0x7DD8, 0x4528 }, { 0x7DDA, 0x205E }, { 0x7DDC, 0x4524 }, 
+       { 0x7DDD, 0x4529 }, { 0x7DDE, 0x452B }, { 0x7DE0, 0x2459 }, { 0x7DE1, 0x452E }, { 0x7DE4, 0x452A }, { 0x7DE8, 0x2A34 }, 
+       { 0x7DE9, 0x142B }, { 0x7DEC, 0x2C2B }, { 0x7DEF, 0x103E }, { 0x7DF2, 0x452D }, { 0x7DF4, 0x2E5D }, { 0x7DFB, 0x452C }, 
+       { 0x7E01, 0x114F }, { 0x7E04, 0x264C }, { 0x7E05, 0x452F }, { 0x7E09, 0x4536 }, { 0x7E0A, 0x4530 }, { 0x7E0B, 0x4537 }, 
+       { 0x7E12, 0x4533 }, { 0x7E1B, 0x275B }, { 0x7E1E, 0x1C2A }, { 0x7E1F, 0x4535 }, { 0x7E21, 0x4532 }, { 0x7E22, 0x4538 }, 
+       { 0x7E23, 0x4531 }, { 0x7E26, 0x1D24 }, { 0x7E2B, 0x2B05 }, { 0x7E2E, 0x1D2C }, { 0x7E31, 0x4534 }, { 0x7E32, 0x4540 }, 
+       { 0x7E35, 0x453C }, { 0x7E37, 0x453F }, { 0x7E39, 0x453D }, { 0x7E3A, 0x4541 }, { 0x7E3B, 0x453B }, { 0x7E3D, 0x4521 }, 
+       { 0x7E3E, 0x2033 }, { 0x7E41, 0x282B }, { 0x7E43, 0x453E }, { 0x7E46, 0x4539 }, { 0x7E4A, 0x2101 }, { 0x7E4B, 0x1732 }, 
+       { 0x7E4D, 0x1D0B }, { 0x7E54, 0x1F05 }, { 0x7E55, 0x2116 }, { 0x7E56, 0x4544 }, { 0x7E59, 0x4546 }, { 0x7E5A, 0x4547 }, 
+       { 0x7E5D, 0x4543 }, { 0x7E5E, 0x4545 }, { 0x7E66, 0x453A }, { 0x7E67, 0x4542 }, { 0x7E69, 0x454A }, { 0x7E6A, 0x4549 }, 
+       { 0x7E6D, 0x2B5A }, { 0x7E70, 0x170B }, { 0x7E79, 0x4548 }, { 0x7E7B, 0x454C }, { 0x7E7C, 0x454B }, { 0x7E7D, 0x454F }, 
+       { 0x7E7F, 0x4551 }, { 0x7E82, 0x1B1C }, { 0x7E83, 0x454D }, { 0x7E88, 0x4552 }, { 0x7E89, 0x4553 }, { 0x7E8C, 0x4554 }, 
+       { 0x7E8E, 0x455A }, { 0x7E8F, 0x251B }, { 0x7E90, 0x4556 }, { 0x7E92, 0x4555 }, { 0x7E93, 0x4557 }, { 0x7E94, 0x4558 }, 
+       { 0x7E96, 0x4559 }, { 0x7E9B, 0x455B }, { 0x7E9C, 0x455C }, { 0x7F36, 0x142C }, { 0x7F38, 0x455D }, { 0x7F3A, 0x455E }, 
+       { 0x7F45, 0x4601 }, { 0x7F4C, 0x4602 }, { 0x7F4D, 0x4603 }, { 0x7F4E, 0x4604 }, { 0x7F50, 0x4605 }, { 0x7F51, 0x4606 }, 
+       { 0x7F54, 0x4608 }, { 0x7F55, 0x4607 }, { 0x7F58, 0x4609 }, { 0x7F5F, 0x460A }, { 0x7F60, 0x460B }, { 0x7F67, 0x460E }, 
+       { 0x7F68, 0x460C }, { 0x7F69, 0x460D }, { 0x7F6A, 0x1A41 }, { 0x7F6B, 0x1733 }, { 0x7F6E, 0x2336 }, { 0x7F70, 0x2813 }, 
+       { 0x7F72, 0x1D50 }, { 0x7F75, 0x272D }, { 0x7F77, 0x284D }, { 0x7F78, 0x460F }, { 0x7F79, 0x384D }, { 0x7F82, 0x4610 }, 
+       { 0x7F83, 0x4612 }, { 0x7F85, 0x2D45 }, { 0x7F86, 0x4611 }, { 0x7F87, 0x4614 }, { 0x7F88, 0x4613 }, { 0x7F8A, 0x2D33 }, 
+       { 0x7F8C, 0x4615 }, { 0x7F8E, 0x285E }, { 0x7F94, 0x4616 }, { 0x7F9A, 0x4619 }, { 0x7F9D, 0x4618 }, { 0x7F9E, 0x4617 }, 
+       { 0x7FA3, 0x461A }, { 0x7FA4, 0x1712 }, { 0x7FA8, 0x2102 }, { 0x7FA9, 0x1521 }, { 0x7FAE, 0x461E }, { 0x7FAF, 0x461B }, 
+       { 0x7FB2, 0x461C }, { 0x7FB6, 0x461F }, { 0x7FB8, 0x4620 }, { 0x7FB9, 0x461D }, { 0x7FBD, 0x1109 }, { 0x7FC1, 0x1207 }, 
+       { 0x7FC5, 0x4622 }, { 0x7FC6, 0x4623 }, { 0x7FCA, 0x4624 }, { 0x7FCC, 0x2D42 }, { 0x7FD2, 0x1D0C }, { 0x7FD4, 0x4626 }, 
+       { 0x7FD5, 0x4625 }, { 0x7FE0, 0x1F49 }, { 0x7FE1, 0x4627 }, { 0x7FE6, 0x4628 }, { 0x7FE9, 0x4629 }, { 0x7FEB, 0x1445 }, 
+       { 0x7FF0, 0x142D }, { 0x7FF3, 0x462A }, { 0x7FF9, 0x462B }, { 0x7FFB, 0x2B3D }, { 0x7FFC, 0x2D43 }, { 0x8000, 0x2D34 }, 
+       { 0x8001, 0x2F17 }, { 0x8003, 0x192D }, { 0x8004, 0x462E }, { 0x8005, 0x1C34 }, { 0x8006, 0x462D }, { 0x800B, 0x462F }, 
+       { 0x800C, 0x1C09 }, { 0x8010, 0x2231 }, { 0x8012, 0x4630 }, { 0x8015, 0x192C }, { 0x8017, 0x2C37 }, { 0x8018, 0x4631 }, 
+       { 0x8019, 0x4632 }, { 0x801C, 0x4633 }, { 0x8021, 0x4634 }, { 0x8028, 0x4635 }, { 0x8033, 0x1C0A }, { 0x8036, 0x2C4D }, 
+       { 0x803B, 0x4637 }, { 0x803D, 0x231F }, { 0x803F, 0x4636 }, { 0x8046, 0x4639 }, { 0x804A, 0x4638 }, { 0x8052, 0x463A }, 
+       { 0x8056, 0x201B }, { 0x8058, 0x463B }, { 0x805A, 0x463C }, { 0x805E, 0x2A19 }, { 0x805F, 0x463D }, { 0x8061, 0x214F }, 
+       { 0x8062, 0x463E }, { 0x8068, 0x463F }, { 0x806F, 0x2E5E }, { 0x8070, 0x4642 }, { 0x8072, 0x4641 }, { 0x8073, 0x4640 }, 
+       { 0x8074, 0x2410 }, { 0x8076, 0x4643 }, { 0x8077, 0x1F06 }, { 0x8079, 0x4644 }, { 0x807D, 0x4645 }, { 0x807E, 0x2F18 }, 
+       { 0x807F, 0x4646 }, { 0x8084, 0x4647 }, { 0x8085, 0x4649 }, { 0x8086, 0x4648 }, { 0x8087, 0x2805 }, { 0x8089, 0x2659 }, 
+       { 0x808B, 0x2F1E }, { 0x808C, 0x2809 }, { 0x8093, 0x464B }, { 0x8096, 0x1E33 }, { 0x8098, 0x290A }, { 0x809A, 0x464C }, 
+       { 0x809B, 0x464A }, { 0x809D, 0x142E }, { 0x80A1, 0x1834 }, { 0x80A2, 0x1B48 }, { 0x80A5, 0x284E }, { 0x80A9, 0x180A }, 
+       { 0x80AA, 0x2B23 }, { 0x80AC, 0x464F }, { 0x80AD, 0x464D }, { 0x80AF, 0x192E }, { 0x80B1, 0x192F }, { 0x80B2, 0x1049 }, 
+       { 0x80B4, 0x1A48 }, { 0x80BA, 0x2739 }, { 0x80C3, 0x103F }, { 0x80C4, 0x4654 }, { 0x80C6, 0x2320 }, { 0x80CC, 0x2738 }, 
+       { 0x80CE, 0x223B }, { 0x80D6, 0x4656 }, { 0x80D9, 0x4652 }, { 0x80DA, 0x4655 }, { 0x80DB, 0x4650 }, { 0x80DD, 0x4653 }, 
+       { 0x80DE, 0x2B06 }, { 0x80E1, 0x1835 }, { 0x80E4, 0x105D }, { 0x80E5, 0x4651 }, { 0x80EF, 0x4658 }, { 0x80F1, 0x4659 }, 
+       { 0x80F4, 0x2619 }, { 0x80F8, 0x161B }, { 0x80FC, 0x4706 }, { 0x80FD, 0x271D }, { 0x8102, 0x1B49 }, { 0x8105, 0x161C }, 
+       { 0x8106, 0x2028 }, { 0x8107, 0x2F26 }, { 0x8108, 0x2C0E }, { 0x8109, 0x4657 }, { 0x810A, 0x2034 }, { 0x811A, 0x1533 }, 
+       { 0x811B, 0x465A }, { 0x8123, 0x465C }, { 0x8129, 0x465B }, { 0x812F, 0x465D }, { 0x8131, 0x2306 }, { 0x8133, 0x271E }, 
+       { 0x8139, 0x2411 }, { 0x813E, 0x4703 }, { 0x8146, 0x4702 }, { 0x814B, 0x465E }, { 0x814E, 0x1F35 }, { 0x8150, 0x2945 }, 
+       { 0x8151, 0x4705 }, { 0x8153, 0x4704 }, { 0x8154, 0x1930 }, { 0x8155, 0x2F33 }, { 0x815F, 0x4715 }, { 0x8165, 0x4709 }, 
+       { 0x8166, 0x470A }, { 0x816B, 0x1C50 }, { 0x816E, 0x4708 }, { 0x8170, 0x1958 }, { 0x8171, 0x4707 }, { 0x8174, 0x470B }, 
+       { 0x8178, 0x2412 }, { 0x8179, 0x2A02 }, { 0x817A, 0x2103 }, { 0x817F, 0x223C }, { 0x8180, 0x470F }, { 0x8182, 0x4710 }, 
+       { 0x8183, 0x470C }, { 0x8188, 0x470D }, { 0x818A, 0x470E }, { 0x818F, 0x1931 }, { 0x8193, 0x4716 }, { 0x8195, 0x4712 }, 
+       { 0x819A, 0x2946 }, { 0x819C, 0x2B4C }, { 0x819D, 0x2908 }, { 0x81A0, 0x4711 }, { 0x81A3, 0x4714 }, { 0x81A4, 0x4713 }, 
+       { 0x81A8, 0x2B24 }, { 0x81A9, 0x4717 }, { 0x81B0, 0x4718 }, { 0x81B3, 0x2117 }, { 0x81B5, 0x4719 }, { 0x81B8, 0x471B }, 
+       { 0x81BA, 0x471F }, { 0x81BD, 0x471C }, { 0x81BE, 0x471A }, { 0x81BF, 0x271F }, { 0x81C0, 0x471D }, { 0x81C2, 0x471E }, 
+       { 0x81C6, 0x1212 }, { 0x81C8, 0x4725 }, { 0x81C9, 0x4720 }, { 0x81CD, 0x4721 }, { 0x81D1, 0x4722 }, { 0x81D3, 0x2201 }, 
+       { 0x81D8, 0x4724 }, { 0x81D9, 0x4723 }, { 0x81DA, 0x4726 }, { 0x81DF, 0x4727 }, { 0x81E0, 0x4728 }, { 0x81E3, 0x1F23 }, 
+       { 0x81E5, 0x1249 }, { 0x81E7, 0x4729 }, { 0x81E8, 0x2E37 }, { 0x81EA, 0x1C0B }, { 0x81ED, 0x1D0D }, { 0x81F3, 0x1B4A }, 
+       { 0x81F4, 0x2337 }, { 0x81FA, 0x472A }, { 0x81FB, 0x472B }, { 0x81FC, 0x1111 }, { 0x81FE, 0x472C }, { 0x8201, 0x472D }, 
+       { 0x8202, 0x472E }, { 0x8205, 0x472F }, { 0x8207, 0x4730 }, { 0x8208, 0x161D }, { 0x8209, 0x3A0A }, { 0x820A, 0x4731 }, 
+       { 0x820C, 0x2045 }, { 0x820D, 0x4732 }, { 0x820E, 0x1C2B }, { 0x8210, 0x4733 }, { 0x8212, 0x3010 }, { 0x8216, 0x4734 }, 
+       { 0x8217, 0x2A3E }, { 0x8218, 0x143C }, { 0x821B, 0x2104 }, { 0x821C, 0x1D38 }, { 0x821E, 0x2951 }, { 0x821F, 0x1D0E }, 
+       { 0x8229, 0x4735 }, { 0x822A, 0x1932 }, { 0x822B, 0x4736 }, { 0x822C, 0x282C }, { 0x822E, 0x4744 }, { 0x8233, 0x4738 }, 
+       { 0x8235, 0x2229 }, { 0x8236, 0x2755 }, { 0x8237, 0x181F }, { 0x8238, 0x4737 }, { 0x8239, 0x2105 }, { 0x8240, 0x4739 }, 
+       { 0x8247, 0x245A }, { 0x8258, 0x473B }, { 0x8259, 0x473A }, { 0x825A, 0x473D }, { 0x825D, 0x473C }, { 0x825F, 0x473E }, 
+       { 0x8262, 0x4740 }, { 0x8264, 0x473F }, { 0x8266, 0x142F }, { 0x8268, 0x4741 }, { 0x826A, 0x4742 }, { 0x826B, 0x4743 }, 
+       { 0x826E, 0x1A11 }, { 0x826F, 0x2E29 }, { 0x8271, 0x4745 }, { 0x8272, 0x1F07 }, { 0x8276, 0x1150 }, { 0x8277, 0x4746 }, 
+       { 0x8278, 0x4747 }, { 0x827E, 0x4748 }, { 0x828B, 0x1052 }, { 0x828D, 0x4749 }, { 0x8292, 0x474A }, { 0x8299, 0x2947 }, 
+       { 0x829D, 0x1C27 }, { 0x829F, 0x474C }, { 0x82A5, 0x1309 }, { 0x82A6, 0x1012 }, { 0x82AB, 0x474B }, { 0x82AC, 0x474E }, 
+       { 0x82AD, 0x272E }, { 0x82AF, 0x1F24 }, { 0x82B1, 0x1236 }, { 0x82B3, 0x2B07 }, { 0x82B8, 0x173D }, { 0x82B9, 0x163C }, 
+       { 0x82BB, 0x474D }, { 0x82BD, 0x124A }, { 0x82C5, 0x1403 }, { 0x82D1, 0x1151 }, { 0x82D2, 0x4752 }, { 0x82D3, 0x2E4A }, 
+       { 0x82D4, 0x223D }, { 0x82D7, 0x2924 }, { 0x82D9, 0x475E }, { 0x82DB, 0x1237 }, { 0x82DC, 0x475C }, { 0x82DE, 0x475A }, 
+       { 0x82DF, 0x4751 }, { 0x82E1, 0x474F }, { 0x82E3, 0x4750 }, { 0x82E5, 0x1C43 }, { 0x82E6, 0x164C }, { 0x82E7, 0x2357 }, 
+       { 0x82EB, 0x2631 }, { 0x82F1, 0x1131 }, { 0x82F3, 0x4754 }, { 0x82F4, 0x4753 }, { 0x82F9, 0x4759 }, { 0x82FA, 0x4755 }, 
+       { 0x82FB, 0x4758 }, { 0x8302, 0x2C30 }, { 0x8303, 0x4757 }, { 0x8304, 0x1238 }, { 0x8305, 0x135D }, { 0x8306, 0x475B }, 
+       { 0x8309, 0x475D }, { 0x830E, 0x1734 }, { 0x8316, 0x4803 }, { 0x8317, 0x480C }, { 0x8318, 0x480D }, { 0x831C, 0x100B }, 
+       { 0x8323, 0x4814 }, { 0x8328, 0x1051 }, { 0x832B, 0x480B }, { 0x832F, 0x480A }, { 0x8331, 0x4805 }, { 0x8332, 0x4804 }, 
+       { 0x8334, 0x4802 }, { 0x8335, 0x4801 }, { 0x8336, 0x2343 }, { 0x8338, 0x225B }, { 0x8339, 0x4807 }, { 0x8340, 0x4806 }, 
+       { 0x8345, 0x4809 }, { 0x8349, 0x2150 }, { 0x834A, 0x1735 }, { 0x834F, 0x1121 }, { 0x8350, 0x4808 }, { 0x8352, 0x1933 }, 
+       { 0x8358, 0x2151 }, { 0x8373, 0x481A }, { 0x8375, 0x481B }, { 0x8377, 0x1239 }, { 0x837B, 0x120E }, { 0x837C, 0x4818 }, 
+       { 0x8385, 0x480E }, { 0x8387, 0x4816 }, { 0x8389, 0x481D }, { 0x838A, 0x4817 }, { 0x838E, 0x4815 }, { 0x8393, 0x4756 }, 
+       { 0x8396, 0x4813 }, { 0x839A, 0x480F }, { 0x839E, 0x1430 }, { 0x839F, 0x4811 }, { 0x83A0, 0x481C }, { 0x83A2, 0x4812 }, 
+       { 0x83A8, 0x481E }, { 0x83AA, 0x4810 }, { 0x83AB, 0x275C }, { 0x83B1, 0x2D49 }, { 0x83B5, 0x4819 }, { 0x83BD, 0x482F }, 
+       { 0x83C1, 0x4827 }, { 0x83C5, 0x1F5B }, { 0x83CA, 0x1526 }, { 0x83CC, 0x163D }, { 0x83CE, 0x4822 }, { 0x83D3, 0x123B }, 
+       { 0x83D6, 0x1E34 }, { 0x83D8, 0x4825 }, { 0x83DC, 0x1A3A }, { 0x83DF, 0x2531 }, { 0x83E0, 0x482A }, { 0x83E9, 0x2A4E }, 
+       { 0x83EB, 0x4821 }, { 0x83EF, 0x123A }, { 0x83F0, 0x1836 }, { 0x83F1, 0x2909 }, { 0x83F2, 0x482B }, { 0x83F4, 0x481F }, 
+       { 0x83F7, 0x4828 }, { 0x83FB, 0x4832 }, { 0x83FD, 0x4823 }, { 0x8403, 0x4824 }, { 0x8404, 0x261A }, { 0x8407, 0x4829 }, 
+       { 0x840B, 0x4826 }, { 0x840C, 0x2B08 }, { 0x840D, 0x482C }, { 0x840E, 0x1040 }, { 0x8413, 0x4820 }, { 0x8420, 0x482E }, 
+       { 0x8422, 0x482D }, { 0x8429, 0x274B }, { 0x842A, 0x4834 }, { 0x842C, 0x483F }, { 0x8431, 0x135E }, { 0x8435, 0x4842 }, 
+       { 0x8438, 0x4830 }, { 0x843C, 0x4835 }, { 0x843D, 0x2D4E }, { 0x8446, 0x483E }, { 0x8449, 0x2D35 }, { 0x844E, 0x2E0A }, 
+       { 0x8457, 0x2358 }, { 0x845B, 0x134B }, { 0x8461, 0x2952 }, { 0x8462, 0x4844 }, { 0x8463, 0x2601 }, { 0x8466, 0x1011 }, 
+       { 0x8469, 0x483D }, { 0x846B, 0x4839 }, { 0x846C, 0x2152 }, { 0x846D, 0x4833 }, { 0x846E, 0x483B }, { 0x846F, 0x4840 }, 
+       { 0x8471, 0x270C }, { 0x8475, 0x100A }, { 0x8477, 0x4838 }, { 0x8479, 0x4841 }, { 0x847A, 0x2958 }, { 0x8482, 0x483C }, 
+       { 0x8484, 0x4837 }, { 0x848B, 0x1E35 }, { 0x8490, 0x1D0F }, { 0x8494, 0x1C0C }, { 0x8499, 0x2C38 }, { 0x849C, 0x2927 }, 
+       { 0x849F, 0x4847 }, { 0x84A1, 0x4850 }, { 0x84AD, 0x483A }, { 0x84B2, 0x1357 }, { 0x84B8, 0x1E58 }, { 0x84B9, 0x4845 }, 
+       { 0x84BB, 0x484A }, { 0x84BC, 0x2153 }, { 0x84BF, 0x4846 }, { 0x84C1, 0x484D }, { 0x84C4, 0x233F }, { 0x84C6, 0x484E }, 
+       { 0x84C9, 0x2D36 }, { 0x84CA, 0x4843 }, { 0x84CB, 0x1318 }, { 0x84CD, 0x4849 }, { 0x84D0, 0x484C }, { 0x84D1, 0x2C0C }, 
+       { 0x84D6, 0x484F }, { 0x84D9, 0x4848 }, { 0x84DA, 0x484B }, { 0x84EC, 0x2B09 }, { 0x84EE, 0x2F01 }, { 0x84F4, 0x4853 }, 
+       { 0x84FC, 0x485A }, { 0x84FF, 0x4852 }, { 0x8500, 0x1C23 }, { 0x8506, 0x4831 }, { 0x8511, 0x2A2E }, { 0x8513, 0x2C02 }, 
+       { 0x8514, 0x4859 }, { 0x8515, 0x4858 }, { 0x8517, 0x4854 }, { 0x8518, 0x4855 }, { 0x851A, 0x1116 }, { 0x851F, 0x4857 }, 
+       { 0x8521, 0x4851 }, { 0x8526, 0x2435 }, { 0x852C, 0x4856 }, { 0x852D, 0x105E }, { 0x8535, 0x2202 }, { 0x853D, 0x2A23 }, 
+       { 0x8540, 0x485B }, { 0x8541, 0x4901 }, { 0x8543, 0x2839 }, { 0x8548, 0x485E }, { 0x8549, 0x1E36 }, { 0x854A, 0x1C29 }, 
+       { 0x854B, 0x4903 }, { 0x854E, 0x161E }, { 0x8555, 0x4904 }, { 0x8557, 0x2959 }, { 0x8558, 0x485D }, { 0x855A, 0x4836 }, 
+       { 0x8563, 0x485C }, { 0x8568, 0x2F2F }, { 0x8569, 0x2602 }, { 0x856A, 0x2953 }, { 0x856D, 0x490B }, { 0x8577, 0x4911 }, 
+       { 0x857E, 0x4912 }, { 0x8580, 0x4905 }, { 0x8584, 0x2756 }, { 0x8587, 0x490F }, { 0x8588, 0x4907 }, { 0x858A, 0x4909 }, 
+       { 0x8590, 0x4913 }, { 0x8591, 0x4908 }, { 0x8594, 0x490C }, { 0x8597, 0x1152 }, { 0x8599, 0x2645 }, { 0x859B, 0x490D }, 
+       { 0x859C, 0x4910 }, { 0x85A4, 0x4906 }, { 0x85A6, 0x2106 }, { 0x85A8, 0x490A }, { 0x85A9, 0x1B07 }, { 0x85AA, 0x1F25 }, 
+       { 0x85AB, 0x1710 }, { 0x85AC, 0x2C54 }, { 0x85AE, 0x2C59 }, { 0x85AF, 0x1D52 }, { 0x85B9, 0x4917 }, { 0x85BA, 0x4915 }, 
+       { 0x85C1, 0x2F2E }, { 0x85C9, 0x4914 }, { 0x85CD, 0x2D55 }, { 0x85CF, 0x4916 }, { 0x85D0, 0x4918 }, { 0x85D5, 0x4919 }, 
+       { 0x85DC, 0x491C }, { 0x85DD, 0x491A }, { 0x85E4, 0x2603 }, { 0x85E5, 0x491B }, { 0x85E9, 0x282D }, { 0x85EA, 0x490E }, 
+       { 0x85F7, 0x1D53 }, { 0x85F9, 0x491D }, { 0x85FA, 0x4922 }, { 0x85FB, 0x2154 }, { 0x85FE, 0x4921 }, { 0x8602, 0x4902 }, 
+       { 0x8606, 0x4923 }, { 0x8607, 0x2129 }, { 0x860A, 0x491E }, { 0x860B, 0x4920 }, { 0x8613, 0x491F }, { 0x8616, 0x3D11 }, 
+       { 0x8617, 0x3D02 }, { 0x861A, 0x4925 }, { 0x8622, 0x4924 }, { 0x862D, 0x2D56 }, { 0x862F, 0x421C }, { 0x8630, 0x4926 }, 
+       { 0x863F, 0x4927 }, { 0x864D, 0x4928 }, { 0x864E, 0x1837 }, { 0x8650, 0x1534 }, { 0x8654, 0x492A }, { 0x8655, 0x313D }, 
+       { 0x865A, 0x1555 }, { 0x865C, 0x2E1A }, { 0x865E, 0x1653 }, { 0x865F, 0x492B }, { 0x8667, 0x492C }, { 0x866B, 0x234E }, 
+       { 0x8671, 0x492D }, { 0x8679, 0x265A }, { 0x867B, 0x101A }, { 0x868A, 0x1243 }, { 0x868B, 0x4932 }, { 0x868C, 0x4933 }, 
+       { 0x8693, 0x492E }, { 0x8695, 0x1B1D }, { 0x86A3, 0x492F }, { 0x86A4, 0x2722 }, { 0x86A9, 0x4930 }, { 0x86AA, 0x4931 }, 
+       { 0x86AB, 0x493B }, { 0x86AF, 0x4935 }, { 0x86B0, 0x4938 }, { 0x86B6, 0x4934 }, { 0x86C4, 0x4936 }, { 0x86C6, 0x4937 }, 
+       { 0x86C7, 0x1C38 }, { 0x86C9, 0x4939 }, { 0x86CB, 0x2321 }, { 0x86CD, 0x1736 }, { 0x86CE, 0x1322 }, { 0x86D4, 0x493C }, 
+       { 0x86D9, 0x131F }, { 0x86DB, 0x4941 }, { 0x86DE, 0x493D }, { 0x86DF, 0x4940 }, { 0x86E4, 0x281A }, { 0x86E9, 0x493E }, 
+       { 0x86EC, 0x493F }, { 0x86ED, 0x2928 }, { 0x86EE, 0x283A }, { 0x86EF, 0x4942 }, { 0x86F8, 0x225D }, { 0x86F9, 0x494C }, 
+       { 0x86FB, 0x4948 }, { 0x86FE, 0x124B }, { 0x8700, 0x4946 }, { 0x8702, 0x2B0A }, { 0x8703, 0x4947 }, { 0x8706, 0x4944 }, 
+       { 0x8708, 0x4945 }, { 0x8709, 0x494A }, { 0x870A, 0x494D }, { 0x870D, 0x494B }, { 0x8711, 0x4949 }, { 0x8712, 0x4943 }, 
+       { 0x8718, 0x2338 }, { 0x871A, 0x4954 }, { 0x871C, 0x2C0A }, { 0x8725, 0x4952 }, { 0x8729, 0x4953 }, { 0x8734, 0x494E }, 
+       { 0x8737, 0x4950 }, { 0x873B, 0x4951 }, { 0x873F, 0x494F }, { 0x8749, 0x2046 }, { 0x874B, 0x2F19 }, { 0x874C, 0x4958 }, 
+       { 0x874E, 0x4959 }, { 0x8753, 0x4A01 }, { 0x8755, 0x1F0A }, { 0x8757, 0x495B }, { 0x8759, 0x495E }, { 0x875F, 0x4956 }, 
+       { 0x8760, 0x4955 }, { 0x8763, 0x4A02 }, { 0x8766, 0x123C }, { 0x8768, 0x495C }, { 0x876A, 0x4A03 }, { 0x876E, 0x495D }, 
+       { 0x8774, 0x495A }, { 0x8776, 0x2413 }, { 0x8778, 0x4957 }, { 0x877F, 0x2748 }, { 0x8782, 0x4A07 }, { 0x878D, 0x2D1B }, 
+       { 0x879F, 0x4A06 }, { 0x87A2, 0x4A05 }, { 0x87AB, 0x4A0E }, { 0x87AF, 0x4A08 }, { 0x87B3, 0x4A10 }, { 0x87BA, 0x2D46 }, 
+       { 0x87BB, 0x4A13 }, { 0x87BD, 0x4A0A }, { 0x87C0, 0x4A0B }, { 0x87C4, 0x4A0F }, { 0x87C6, 0x4A12 }, { 0x87C7, 0x4A11 }, 
+       { 0x87CB, 0x4A09 }, { 0x87D0, 0x4A0C }, { 0x87D2, 0x4A1D }, { 0x87E0, 0x4A16 }, { 0x87EF, 0x4A14 }, { 0x87F2, 0x4A15 }, 
+       { 0x87F6, 0x4A1A }, { 0x87F7, 0x4A1B }, { 0x87F9, 0x130A }, { 0x87FB, 0x1522 }, { 0x87FE, 0x4A19 }, { 0x8805, 0x4A04 }, 
+       { 0x880D, 0x4A18 }, { 0x880E, 0x4A1C }, { 0x880F, 0x4A17 }, { 0x8811, 0x4A1E }, { 0x8815, 0x4A20 }, { 0x8816, 0x4A1F }, 
+       { 0x8821, 0x4A22 }, { 0x8822, 0x4A21 }, { 0x8823, 0x493A }, { 0x8827, 0x4A26 }, { 0x8831, 0x4A23 }, { 0x8836, 0x4A24 }, 
+       { 0x8839, 0x4A25 }, { 0x883B, 0x4A27 }, { 0x8840, 0x174C }, { 0x8842, 0x4A29 }, { 0x8844, 0x4A28 }, { 0x8846, 0x1D10 }, 
+       { 0x884C, 0x1934 }, { 0x884D, 0x3E07 }, { 0x8852, 0x4A2A }, { 0x8853, 0x1D31 }, { 0x8857, 0x1319 }, { 0x8859, 0x4A2B }, 
+       { 0x885B, 0x1132 }, { 0x885D, 0x1E37 }, { 0x885E, 0x4A2C }, { 0x8861, 0x1935 }, { 0x8862, 0x4A2D }, { 0x8863, 0x1041 }, 
+       { 0x8868, 0x291D }, { 0x886B, 0x4A2E }, { 0x8870, 0x1F4A }, { 0x8872, 0x4A35 }, { 0x8875, 0x4A32 }, { 0x8877, 0x234F }, 
+       { 0x887D, 0x4A33 }, { 0x887E, 0x4A30 }, { 0x887F, 0x163E }, { 0x8881, 0x4A2F }, { 0x8882, 0x4A36 }, { 0x8888, 0x1716 }, 
+       { 0x888B, 0x223E }, { 0x888D, 0x4A3C }, { 0x8892, 0x4A38 }, { 0x8896, 0x2215 }, { 0x8897, 0x4A37 }, { 0x8899, 0x4A3A }, 
+       { 0x889E, 0x4A31 }, { 0x88A2, 0x4A3B }, { 0x88A4, 0x4A3D }, { 0x88AB, 0x284F }, { 0x88AE, 0x4A39 }, { 0x88B0, 0x4A3E }, 
+       { 0x88B1, 0x4A40 }, { 0x88B4, 0x1833 }, { 0x88B5, 0x4A34 }, { 0x88B7, 0x1021 }, { 0x88BF, 0x4A3F }, { 0x88C1, 0x1A3B }, 
+       { 0x88C2, 0x2E56 }, { 0x88C3, 0x4A41 }, { 0x88C4, 0x4A42 }, { 0x88C5, 0x2155 }, { 0x88CF, 0x2E02 }, { 0x88D4, 0x4A43 }, 
+       { 0x88D5, 0x2D15 }, { 0x88D8, 0x4A44 }, { 0x88D9, 0x4A45 }, { 0x88DC, 0x2A44 }, { 0x88DD, 0x4A46 }, { 0x88DF, 0x1A20 }, 
+       { 0x88E1, 0x2E03 }, { 0x88E8, 0x4A4B }, { 0x88F2, 0x4A4C }, { 0x88F3, 0x1E38 }, { 0x88F4, 0x4A4A }, { 0x88F8, 0x2D47 }, 
+       { 0x88F9, 0x4A47 }, { 0x88FC, 0x4A49 }, { 0x88FD, 0x201D }, { 0x88FE, 0x1F5E }, { 0x8902, 0x4A48 }, { 0x8904, 0x4A4D }, 
+       { 0x8907, 0x2A03 }, { 0x890A, 0x4A4F }, { 0x890C, 0x4A4E }, { 0x8910, 0x134C }, { 0x8912, 0x2B0B }, { 0x8913, 0x4A50 }, 
+       { 0x891D, 0x4A5C }, { 0x891E, 0x4A52 }, { 0x8925, 0x4A53 }, { 0x892A, 0x4A54 }, { 0x892B, 0x4A55 }, { 0x8936, 0x4A59 }, 
+       { 0x8938, 0x4A5A }, { 0x893B, 0x4A58 }, { 0x8941, 0x4A56 }, { 0x8943, 0x4A51 }, { 0x8944, 0x4A57 }, { 0x894C, 0x4A5B }, 
+       { 0x894D, 0x5017 }, { 0x8956, 0x1208 }, { 0x895E, 0x4A5E }, { 0x895F, 0x163F }, { 0x8960, 0x4A5D }, { 0x8964, 0x4B02 }, 
+       { 0x8966, 0x4B01 }, { 0x896A, 0x4B04 }, { 0x896D, 0x4B03 }, { 0x896F, 0x4B05 }, { 0x8972, 0x1D11 }, { 0x8974, 0x4B06 }, 
+       { 0x8977, 0x4B07 }, { 0x897E, 0x4B08 }, { 0x897F, 0x201E }, { 0x8981, 0x2D37 }, { 0x8983, 0x4B09 }, { 0x8986, 0x2A04 }, 
+       { 0x8987, 0x2726 }, { 0x8988, 0x4B0A }, { 0x898A, 0x4B0B }, { 0x898B, 0x180B }, { 0x898F, 0x150C }, { 0x8993, 0x4B0C }, 
+       { 0x8996, 0x1B4B }, { 0x8997, 0x2721 }, { 0x8998, 0x4B0D }, { 0x899A, 0x1330 }, { 0x89A1, 0x4B0E }, { 0x89A6, 0x4B10 }, 
+       { 0x89A7, 0x2D57 }, { 0x89A9, 0x4B0F }, { 0x89AA, 0x1F26 }, { 0x89AC, 0x4B11 }, { 0x89AF, 0x4B12 }, { 0x89B2, 0x4B13 }, 
+       { 0x89B3, 0x1431 }, { 0x89BA, 0x4B14 }, { 0x89BD, 0x4B15 }, { 0x89BF, 0x4B16 }, { 0x89C0, 0x4B17 }, { 0x89D2, 0x1331 }, 
+       { 0x89DA, 0x4B18 }, { 0x89DC, 0x4B19 }, { 0x89DD, 0x4B1A }, { 0x89E3, 0x1252 }, { 0x89E6, 0x1F08 }, { 0x89E7, 0x4B1B }, 
+       { 0x89F4, 0x4B1C }, { 0x89F8, 0x4B1D }, { 0x8A00, 0x1820 }, { 0x8A02, 0x245B }, { 0x8A03, 0x4B1E }, { 0x8A08, 0x1737 }, 
+       { 0x8A0A, 0x1F36 }, { 0x8A0C, 0x4B21 }, { 0x8A0E, 0x2604 }, { 0x8A10, 0x4B20 }, { 0x8A13, 0x1711 }, { 0x8A16, 0x4B1F }, 
+       { 0x8A17, 0x2257 }, { 0x8A18, 0x150D }, { 0x8A1B, 0x4B22 }, { 0x8A1D, 0x4B23 }, { 0x8A1F, 0x1E39 }, { 0x8A23, 0x174D }, 
+       { 0x8A25, 0x4B24 }, { 0x8A2A, 0x2B0C }, { 0x8A2D, 0x203F }, { 0x8A31, 0x1556 }, { 0x8A33, 0x2C55 }, { 0x8A34, 0x212A }, 
+       { 0x8A36, 0x4B25 }, { 0x8A3A, 0x1F27 }, { 0x8A3B, 0x2350 }, { 0x8A3C, 0x1E3A }, { 0x8A41, 0x4B26 }, { 0x8A46, 0x4B29 }, 
+       { 0x8A48, 0x4B2A }, { 0x8A50, 0x1A1E }, { 0x8A51, 0x2222 }, { 0x8A52, 0x4B28 }, { 0x8A54, 0x1E3B }, { 0x8A55, 0x291E }, 
+       { 0x8A5B, 0x4B27 }, { 0x8A5E, 0x1B4C }, { 0x8A60, 0x1133 }, { 0x8A62, 0x4B2E }, { 0x8A63, 0x1738 }, { 0x8A66, 0x1B4E }, 
+       { 0x8A69, 0x1B4D }, { 0x8A6B, 0x2F2D }, { 0x8A6C, 0x4B2D }, { 0x8A6D, 0x4B2C }, { 0x8A6E, 0x2107 }, { 0x8A70, 0x152D }, 
+       { 0x8A71, 0x2F23 }, { 0x8A72, 0x131A }, { 0x8A73, 0x1E3C }, { 0x8A7C, 0x4B2B }, { 0x8A82, 0x4B30 }, { 0x8A84, 0x4B31 }, 
+       { 0x8A85, 0x4B2F }, { 0x8A87, 0x1838 }, { 0x8A89, 0x2D20 }, { 0x8A8C, 0x1B4F }, { 0x8A8D, 0x2707 }, { 0x8A91, 0x4B34 }, 
+       { 0x8A93, 0x2020 }, { 0x8A95, 0x2322 }, { 0x8A98, 0x2D16 }, { 0x8A9A, 0x4B37 }, { 0x8A9E, 0x184C }, { 0x8AA0, 0x201F }, 
+       { 0x8AA1, 0x4B33 }, { 0x8AA3, 0x4B38 }, { 0x8AA4, 0x184D }, { 0x8AA5, 0x4B35 }, { 0x8AA6, 0x4B36 }, { 0x8AA8, 0x4B32 }, 
+       { 0x8AAC, 0x2042 }, { 0x8AAD, 0x2629 }, { 0x8AB0, 0x230F }, { 0x8AB2, 0x123D }, { 0x8AB9, 0x2850 }, { 0x8ABC, 0x1523 }, 
+       { 0x8ABF, 0x2414 }, { 0x8AC2, 0x4B3B }, { 0x8AC4, 0x4B39 }, { 0x8AC7, 0x232C }, { 0x8ACB, 0x2021 }, { 0x8ACC, 0x1432 }, 
+       { 0x8ACD, 0x4B3A }, { 0x8ACF, 0x1F3B }, { 0x8AD2, 0x2E2A }, { 0x8AD6, 0x2F20 }, { 0x8ADA, 0x4B3C }, { 0x8ADB, 0x4B47 }, 
+       { 0x8ADC, 0x2415 }, { 0x8ADE, 0x4B46 }, { 0x8AE0, 0x4B43 }, { 0x8AE1, 0x4B4B }, { 0x8AE2, 0x4B44 }, { 0x8AE4, 0x4B40 }, 
+       { 0x8AE6, 0x245C }, { 0x8AE7, 0x4B3F }, { 0x8AEB, 0x4B3D }, { 0x8AED, 0x2D01 }, { 0x8AEE, 0x1B50 }, { 0x8AF1, 0x4B41 }, 
+       { 0x8AF3, 0x4B3E }, { 0x8AF7, 0x4B45 }, { 0x8AF8, 0x1D54 }, { 0x8AFA, 0x1821 }, { 0x8AFE, 0x225A }, { 0x8B00, 0x2B25 }, 
+       { 0x8B01, 0x113A }, { 0x8B02, 0x1042 }, { 0x8B04, 0x2605 }, { 0x8B07, 0x4B49 }, { 0x8B0C, 0x4B48 }, { 0x8B0E, 0x2646 }, 
+       { 0x8B10, 0x4B4D }, { 0x8B14, 0x4B42 }, { 0x8B16, 0x4B4C }, { 0x8B17, 0x4B4E }, { 0x8B19, 0x180C }, { 0x8B1A, 0x4B4A }, 
+       { 0x8B1B, 0x1936 }, { 0x8B1D, 0x1C35 }, { 0x8B20, 0x4B4F }, { 0x8B21, 0x2D38 }, { 0x8B26, 0x4B52 }, { 0x8B28, 0x4B55 }, 
+       { 0x8B2B, 0x4B53 }, { 0x8B2C, 0x2915 }, { 0x8B33, 0x4B50 }, { 0x8B39, 0x1640 }, { 0x8B3E, 0x4B54 }, { 0x8B41, 0x4B56 }, 
+       { 0x8B49, 0x4B5A }, { 0x8B4C, 0x4B57 }, { 0x8B4E, 0x4B59 }, { 0x8B4F, 0x4B58 }, { 0x8B56, 0x4B5B }, { 0x8B58, 0x1C11 }, 
+       { 0x8B5A, 0x4B5D }, { 0x8B5B, 0x4B5C }, { 0x8B5C, 0x2948 }, { 0x8B5F, 0x4C01 }, { 0x8B66, 0x1739 }, { 0x8B6B, 0x4B5E }, 
+       { 0x8B6C, 0x4C02 }, { 0x8B6F, 0x4C03 }, { 0x8B70, 0x1524 }, { 0x8B71, 0x4621 }, { 0x8B72, 0x1E59 }, { 0x8B74, 0x4C04 }, 
+       { 0x8B77, 0x184E }, { 0x8B7D, 0x4C05 }, { 0x8B80, 0x4C06 }, { 0x8B83, 0x1B1E }, { 0x8B8A, 0x3A2E }, { 0x8B8C, 0x4C07 }, 
+       { 0x8B8E, 0x4C08 }, { 0x8B90, 0x1D12 }, { 0x8B92, 0x4C09 }, { 0x8B93, 0x4C0A }, { 0x8B96, 0x4C0B }, { 0x8B99, 0x4C0C }, 
+       { 0x8B9A, 0x4C0D }, { 0x8C37, 0x230B }, { 0x8C3A, 0x4C0E }, { 0x8C3F, 0x4C10 }, { 0x8C41, 0x4C0F }, { 0x8C46, 0x2606 }, 
+       { 0x8C48, 0x4C11 }, { 0x8C4A, 0x2B0D }, { 0x8C4C, 0x4C12 }, { 0x8C4E, 0x4C13 }, { 0x8C50, 0x4C14 }, { 0x8C55, 0x4C15 }, 
+       { 0x8C5A, 0x263A }, { 0x8C61, 0x1E3D }, { 0x8C62, 0x4C16 }, { 0x8C6A, 0x194B }, { 0x8C6B, 0x300E }, { 0x8C6C, 0x4C17 }, 
+       { 0x8C78, 0x4C18 }, { 0x8C79, 0x291F }, { 0x8C7A, 0x4C19 }, { 0x8C7C, 0x4C21 }, { 0x8C82, 0x4C1A }, { 0x8C85, 0x4C1C }, 
+       { 0x8C89, 0x4C1B }, { 0x8C8A, 0x4C1D }, { 0x8C8C, 0x2B26 }, { 0x8C8D, 0x4C1E }, { 0x8C8E, 0x4C1F }, { 0x8C94, 0x4C20 }, 
+       { 0x8C98, 0x4C22 }, { 0x8C9D, 0x130D }, { 0x8C9E, 0x2447 }, { 0x8CA0, 0x2949 }, { 0x8CA1, 0x1A42 }, { 0x8CA2, 0x1937 }, 
+       { 0x8CA7, 0x292F }, { 0x8CA8, 0x123F }, { 0x8CA9, 0x282E }, { 0x8CAA, 0x4C25 }, { 0x8CAB, 0x1433 }, { 0x8CAC, 0x2035 }, 
+       { 0x8CAD, 0x4C24 }, { 0x8CAE, 0x4C29 }, { 0x8CAF, 0x2359 }, { 0x8CB0, 0x2C43 }, { 0x8CB2, 0x4C27 }, { 0x8CB3, 0x4C28 }, 
+       { 0x8CB4, 0x150E }, { 0x8CB6, 0x4C2A }, { 0x8CB7, 0x2743 }, { 0x8CB8, 0x223F }, { 0x8CBB, 0x2851 }, { 0x8CBC, 0x251D }, 
+       { 0x8CBD, 0x4C26 }, { 0x8CBF, 0x2B27 }, { 0x8CC0, 0x124C }, { 0x8CC1, 0x4C2C }, { 0x8CC2, 0x2F08 }, { 0x8CC3, 0x2422 }, 
+       { 0x8CC4, 0x2F25 }, { 0x8CC7, 0x1B51 }, { 0x8CC8, 0x4C2B }, { 0x8CCA, 0x2211 }, { 0x8CCD, 0x4C3C }, { 0x8CCE, 0x2108 }, 
+       { 0x8CD1, 0x2658 }, { 0x8CD3, 0x2930 }, { 0x8CDA, 0x4C2F }, { 0x8CDB, 0x1B1F }, { 0x8CDC, 0x1B52 }, { 0x8CDE, 0x1E3E }, 
+       { 0x8CE0, 0x2745 }, { 0x8CE2, 0x180D }, { 0x8CE3, 0x4C2E }, { 0x8CE4, 0x4C2D }, { 0x8CE6, 0x294A }, { 0x8CEA, 0x1C21 }, 
+       { 0x8CED, 0x2532 }, { 0x8CFA, 0x4C31 }, { 0x8CFB, 0x4C32 }, { 0x8CFC, 0x1938 }, { 0x8CFD, 0x4C30 }, { 0x8D04, 0x4C33 }, 
+       { 0x8D05, 0x4C34 }, { 0x8D07, 0x4C36 }, { 0x8D08, 0x2203 }, { 0x8D0A, 0x4C35 }, { 0x8D0B, 0x1446 }, { 0x8D0D, 0x4C38 }, 
+       { 0x8D0F, 0x4C37 }, { 0x8D10, 0x4C39 }, { 0x8D13, 0x4C3B }, { 0x8D14, 0x4C3D }, { 0x8D16, 0x4C3E }, { 0x8D64, 0x2036 }, 
+       { 0x8D66, 0x1C2F }, { 0x8D67, 0x4C3F }, { 0x8D6B, 0x1332 }, { 0x8D6D, 0x4C40 }, { 0x8D70, 0x2156 }, { 0x8D71, 0x4C41 }, 
+       { 0x8D73, 0x4C42 }, { 0x8D74, 0x294B }, { 0x8D77, 0x150F }, { 0x8D81, 0x4C43 }, { 0x8D85, 0x2416 }, { 0x8D8A, 0x113B }, 
+       { 0x8D99, 0x4C44 }, { 0x8DA3, 0x1C51 }, { 0x8DA8, 0x1F56 }, { 0x8DB3, 0x220D }, { 0x8DBA, 0x4C47 }, { 0x8DBE, 0x4C46 }, 
+       { 0x8DC2, 0x4C45 }, { 0x8DCB, 0x4C4D }, { 0x8DCC, 0x4C4B }, { 0x8DCF, 0x4C48 }, { 0x8DD6, 0x4C4A }, { 0x8DDA, 0x4C49 }, 
+       { 0x8DDB, 0x4C4C }, { 0x8DDD, 0x1557 }, { 0x8DDF, 0x4C50 }, { 0x8DE1, 0x2037 }, { 0x8DE3, 0x4C51 }, { 0x8DE8, 0x1839 }, 
+       { 0x8DEA, 0x4C4E }, { 0x8DEB, 0x4C4F }, { 0x8DEF, 0x2F09 }, { 0x8DF3, 0x2417 }, { 0x8DF5, 0x2109 }, { 0x8DFC, 0x4C52 }, 
+       { 0x8DFF, 0x4C55 }, { 0x8E08, 0x4C53 }, { 0x8E09, 0x4C54 }, { 0x8E0A, 0x2D39 }, { 0x8E0F, 0x2607 }, { 0x8E10, 0x4C58 }, 
+       { 0x8E1D, 0x4C56 }, { 0x8E1E, 0x4C57 }, { 0x8E1F, 0x4C59 }, { 0x8E2A, 0x4D09 }, { 0x8E30, 0x4C5C }, { 0x8E34, 0x4C5D }, 
+       { 0x8E35, 0x4C5B }, { 0x8E42, 0x4C5A }, { 0x8E44, 0x245D }, { 0x8E47, 0x4D01 }, { 0x8E48, 0x4D05 }, { 0x8E49, 0x4D02 }, 
+       { 0x8E4A, 0x4C5E }, { 0x8E4C, 0x4D03 }, { 0x8E50, 0x4D04 }, { 0x8E55, 0x4D0B }, { 0x8E59, 0x4D06 }, { 0x8E5F, 0x2038 }, 
+       { 0x8E60, 0x4D08 }, { 0x8E63, 0x4D0A }, { 0x8E64, 0x4D07 }, { 0x8E72, 0x4D0D }, { 0x8E74, 0x1D13 }, { 0x8E76, 0x4D0C }, 
+       { 0x8E7C, 0x4D0E }, { 0x8E81, 0x4D0F }, { 0x8E84, 0x4D12 }, { 0x8E85, 0x4D11 }, { 0x8E87, 0x4D10 }, { 0x8E8A, 0x4D14 }, 
+       { 0x8E8B, 0x4D13 }, { 0x8E8D, 0x2C56 }, { 0x8E91, 0x4D16 }, { 0x8E93, 0x4D15 }, { 0x8E94, 0x4D17 }, { 0x8E99, 0x4D18 }, 
+       { 0x8EA1, 0x4D1A }, { 0x8EAA, 0x4D19 }, { 0x8EAB, 0x1F28 }, { 0x8EAC, 0x4D1B }, { 0x8EAF, 0x164D }, { 0x8EB0, 0x4D1C }, 
+       { 0x8EB1, 0x4D1E }, { 0x8EBE, 0x4D1F }, { 0x8EC5, 0x4D20 }, { 0x8EC6, 0x4D1D }, { 0x8EC8, 0x4D21 }, { 0x8ECA, 0x1C36 }, 
+       { 0x8ECB, 0x4D22 }, { 0x8ECC, 0x1510 }, { 0x8ECD, 0x1713 }, { 0x8ED2, 0x180E }, { 0x8EDB, 0x4D23 }, { 0x8EDF, 0x2650 }, 
+       { 0x8EE2, 0x251E }, { 0x8EE3, 0x4D24 }, { 0x8EEB, 0x4D27 }, { 0x8EF8, 0x1C14 }, { 0x8EFB, 0x4D26 }, { 0x8EFC, 0x4D25 }, 
+       { 0x8EFD, 0x173A }, { 0x8EFE, 0x4D28 }, { 0x8F03, 0x1333 }, { 0x8F05, 0x4D2A }, { 0x8F09, 0x1A3C }, { 0x8F0A, 0x4D29 }, 
+       { 0x8F0C, 0x4D32 }, { 0x8F12, 0x4D2C }, { 0x8F13, 0x4D2E }, { 0x8F14, 0x2A45 }, { 0x8F15, 0x4D2B }, { 0x8F19, 0x4D2D }, 
+       { 0x8F1B, 0x4D31 }, { 0x8F1C, 0x4D2F }, { 0x8F1D, 0x1511 }, { 0x8F1F, 0x4D30 }, { 0x8F26, 0x4D33 }, { 0x8F29, 0x273A }, 
+       { 0x8F2A, 0x2E38 }, { 0x8F2F, 0x1D14 }, { 0x8F33, 0x4D34 }, { 0x8F38, 0x2D02 }, { 0x8F39, 0x4D36 }, { 0x8F3B, 0x4D35 }, 
+       { 0x8F3E, 0x4D39 }, { 0x8F3F, 0x2D21 }, { 0x8F42, 0x4D38 }, { 0x8F44, 0x134D }, { 0x8F45, 0x4D37 }, { 0x8F46, 0x4D3C }, 
+       { 0x8F49, 0x4D3B }, { 0x8F4C, 0x4D3A }, { 0x8F4D, 0x2512 }, { 0x8F4E, 0x4D3D }, { 0x8F57, 0x4D3E }, { 0x8F5C, 0x4D3F }, 
+       { 0x8F5F, 0x194C }, { 0x8F61, 0x1705 }, { 0x8F62, 0x4D40 }, { 0x8F63, 0x4D41 }, { 0x8F64, 0x4D42 }, { 0x8F9B, 0x1F29 }, 
+       { 0x8F9C, 0x4D43 }, { 0x8F9E, 0x1C0D }, { 0x8F9F, 0x4D44 }, { 0x8FA3, 0x4D45 }, { 0x8FA7, 0x3201 }, { 0x8FA8, 0x315E }, 
+       { 0x8FAD, 0x4D46 }, { 0x8FAE, 0x4550 }, { 0x8FAF, 0x4D47 }, { 0x8FB0, 0x2304 }, { 0x8FB1, 0x1F0B }, { 0x8FB2, 0x2720 }, 
+       { 0x8FB7, 0x4D48 }, { 0x8FBA, 0x2A35 }, { 0x8FBB, 0x2434 }, { 0x8FBC, 0x195E }, { 0x8FBF, 0x2309 }, { 0x8FC2, 0x110A }, 
+       { 0x8FC4, 0x2B58 }, { 0x8FC5, 0x1F37 }, { 0x8FCE, 0x173E }, { 0x8FD1, 0x1641 }, { 0x8FD4, 0x2A36 }, { 0x8FDA, 0x4D49 }, 
+       { 0x8FE2, 0x4D4B }, { 0x8FE5, 0x4D4A }, { 0x8FE6, 0x1240 }, { 0x8FE9, 0x2656 }, { 0x8FEA, 0x4D4C }, { 0x8FEB, 0x2757 }, 
+       { 0x8FED, 0x2513 }, { 0x8FEF, 0x4D4D }, { 0x8FF0, 0x1D32 }, { 0x8FF4, 0x4D4F }, { 0x8FF7, 0x2C22 }, { 0x8FF8, 0x4D5E }, 
+       { 0x8FF9, 0x4D51 }, { 0x8FFA, 0x4D52 }, { 0x8FFD, 0x2429 }, { 0x9000, 0x2240 }, { 0x9001, 0x2157 }, { 0x9003, 0x2608 }, 
+       { 0x9005, 0x4D50 }, { 0x9006, 0x1535 }, { 0x900B, 0x4D59 }, { 0x900D, 0x4D56 }, { 0x900E, 0x4E05 }, { 0x900F, 0x2609 }, 
+       { 0x9010, 0x2340 }, { 0x9011, 0x4D53 }, { 0x9013, 0x245E }, { 0x9014, 0x2533 }, { 0x9015, 0x4D54 }, { 0x9016, 0x4D58 }, 
+       { 0x9017, 0x1F40 }, { 0x9019, 0x2747 }, { 0x901A, 0x242C }, { 0x901D, 0x2022 }, { 0x901E, 0x4D57 }, { 0x901F, 0x220E }, 
+       { 0x9020, 0x2204 }, { 0x9021, 0x4D55 }, { 0x9022, 0x1009 }, { 0x9023, 0x2F02 }, { 0x9027, 0x4D5A }, { 0x902E, 0x2241 }, 
+       { 0x9031, 0x1D15 }, { 0x9032, 0x1F2A }, { 0x9035, 0x4D5C }, { 0x9036, 0x4D5B }, { 0x9038, 0x104F }, { 0x9039, 0x4D5D }, 
+       { 0x903C, 0x290F }, { 0x903E, 0x4E07 }, { 0x9041, 0x263B }, { 0x9042, 0x1F4B }, { 0x9045, 0x2339 }, { 0x9047, 0x1658 }, 
+       { 0x9049, 0x4E06 }, { 0x904A, 0x2D17 }, { 0x904B, 0x111F }, { 0x904D, 0x2A37 }, { 0x904E, 0x1241 }, { 0x904F, 0x4E01 }, 
+       { 0x9050, 0x4E02 }, { 0x9051, 0x4E03 }, { 0x9052, 0x4E04 }, { 0x9053, 0x261B }, { 0x9054, 0x2303 }, { 0x9055, 0x1043 }, 
+       { 0x9056, 0x4E08 }, { 0x9058, 0x4E09 }, { 0x9059, 0x5403 }, { 0x905C, 0x221D }, { 0x905E, 0x4E0A }, { 0x9060, 0x1153 }, 
+       { 0x9061, 0x212C }, { 0x9063, 0x180F }, { 0x9065, 0x2D3A }, { 0x9068, 0x4E0B }, { 0x9069, 0x250C }, { 0x906D, 0x2158 }, 
+       { 0x906E, 0x1C37 }, { 0x906F, 0x4E0C }, { 0x9072, 0x4E0F }, { 0x9075, 0x1D45 }, { 0x9076, 0x4E0D }, { 0x9077, 0x210B }, 
+       { 0x9078, 0x210A }, { 0x907A, 0x1044 }, { 0x907C, 0x2E2B }, { 0x907D, 0x4E11 }, { 0x907F, 0x2852 }, { 0x9080, 0x4E13 }, 
+       { 0x9081, 0x4E12 }, { 0x9082, 0x4E10 }, { 0x9083, 0x4344 }, { 0x9084, 0x1434 }, { 0x9087, 0x4D4E }, { 0x9089, 0x4E15 }, 
+       { 0x908A, 0x4E14 }, { 0x908F, 0x4E16 }, { 0x9091, 0x2D18 }, { 0x90A3, 0x2641 }, { 0x90A6, 0x2B0E }, { 0x90A8, 0x4E17 }, 
+       { 0x90AA, 0x1C39 }, { 0x90AF, 0x4E18 }, { 0x90B1, 0x4E19 }, { 0x90B5, 0x4E1A }, { 0x90B8, 0x2501 }, { 0x90C1, 0x104A }, 
+       { 0x90CA, 0x1939 }, { 0x90CE, 0x2F1A }, { 0x90DB, 0x4E1E }, { 0x90E1, 0x1714 }, { 0x90E2, 0x4E1B }, { 0x90E4, 0x4E1C }, 
+       { 0x90E8, 0x2954 }, { 0x90ED, 0x1334 }, { 0x90F5, 0x2D19 }, { 0x90F7, 0x161F }, { 0x90FD, 0x2534 }, { 0x9102, 0x4E1F }, 
+       { 0x9112, 0x4E20 }, { 0x9119, 0x4E21 }, { 0x912D, 0x2502 }, { 0x9130, 0x4E23 }, { 0x9132, 0x4E22 }, { 0x9149, 0x2633 }, 
+       { 0x914A, 0x4E24 }, { 0x914B, 0x1D16 }, { 0x914C, 0x1C40 }, { 0x914D, 0x273B }, { 0x914E, 0x2351 }, { 0x9152, 0x1C52 }, 
+       { 0x9154, 0x1F4C }, { 0x9156, 0x4E25 }, { 0x9158, 0x4E26 }, { 0x9162, 0x1F3D }, { 0x9163, 0x4E27 }, { 0x9165, 0x4E28 }, 
+       { 0x9169, 0x4E29 }, { 0x916A, 0x2D4F }, { 0x916C, 0x1D17 }, { 0x9172, 0x4E2B }, { 0x9173, 0x4E2A }, { 0x9175, 0x193A }, 
+       { 0x9177, 0x1953 }, { 0x9178, 0x1B20 }, { 0x9182, 0x4E2E }, { 0x9187, 0x1D46 }, { 0x9189, 0x4E2D }, { 0x918B, 0x4E2C }, 
+       { 0x918D, 0x2249 }, { 0x9190, 0x184F }, { 0x9192, 0x2023 }, { 0x9197, 0x2810 }, { 0x919C, 0x1D19 }, { 0x91A2, 0x4E2F }, 
+       { 0x91A4, 0x1E3F }, { 0x91AA, 0x4E32 }, { 0x91AB, 0x4E30 }, { 0x91AF, 0x4E31 }, { 0x91B4, 0x4E34 }, { 0x91B5, 0x4E33 }, 
+       { 0x91B8, 0x1E5A }, { 0x91BA, 0x4E35 }, { 0x91C0, 0x4E36 }, { 0x91C1, 0x4E37 }, { 0x91C6, 0x2830 }, { 0x91C7, 0x1A33 }, 
+       { 0x91C8, 0x1C41 }, { 0x91C9, 0x4E38 }, { 0x91CB, 0x4E39 }, { 0x91CC, 0x2E04 }, { 0x91CD, 0x1D25 }, { 0x91CE, 0x2C4E }, 
+       { 0x91CF, 0x2E2C }, { 0x91D0, 0x4E3A }, { 0x91D1, 0x1642 }, { 0x91D6, 0x4E3B }, { 0x91D8, 0x2503 }, { 0x91DB, 0x4E3E }, 
+       { 0x91DC, 0x1358 }, { 0x91DD, 0x1F2B }, { 0x91DF, 0x4E3C }, { 0x91E1, 0x4E3D }, { 0x91E3, 0x2440 }, { 0x91E6, 0x2B35 }, 
+       { 0x91E7, 0x165C }, { 0x91F5, 0x4E40 }, { 0x91F6, 0x4E41 }, { 0x91FC, 0x4E3F }, { 0x91FF, 0x4E43 }, { 0x920D, 0x263F }, 
+       { 0x920E, 0x1323 }, { 0x9211, 0x4E47 }, { 0x9214, 0x4E44 }, { 0x9215, 0x4E46 }, { 0x921E, 0x4E42 }, { 0x9229, 0x4F2F }, 
+       { 0x922C, 0x4E45 }, { 0x9234, 0x2E4B }, { 0x9237, 0x183A }, { 0x923F, 0x4E4F }, { 0x9244, 0x2514 }, { 0x9245, 0x4E4A }, 
+       { 0x9248, 0x4E4D }, { 0x9249, 0x4E4B }, { 0x924B, 0x4E50 }, { 0x9250, 0x4E51 }, { 0x9257, 0x4E49 }, { 0x925A, 0x4E56 }, 
+       { 0x925B, 0x1154 }, { 0x925E, 0x4E48 }, { 0x9262, 0x280D }, { 0x9264, 0x4E4C }, { 0x9266, 0x1E40 }, { 0x9271, 0x193B }, 
+       { 0x927E, 0x2B28 }, { 0x9280, 0x1644 }, { 0x9283, 0x1D26 }, { 0x9285, 0x261C }, { 0x9291, 0x210D }, { 0x9293, 0x4E54 }, 
+       { 0x9295, 0x4E4E }, { 0x9296, 0x4E53 }, { 0x9298, 0x2C23 }, { 0x929A, 0x2418 }, { 0x929B, 0x4E55 }, { 0x929C, 0x4E52 }, 
+       { 0x92AD, 0x210C }, { 0x92B7, 0x4E59 }, { 0x92B9, 0x4E58 }, { 0x92CF, 0x4E57 }, { 0x92D2, 0x2B0F }, { 0x92E4, 0x1D5B }, 
+       { 0x92E9, 0x4E5A }, { 0x92EA, 0x2A3F }, { 0x92ED, 0x1134 }, { 0x92F2, 0x2926 }, { 0x92F3, 0x2352 }, { 0x92F8, 0x1558 }, 
+       { 0x92FA, 0x4E5C }, { 0x92FC, 0x193D }, { 0x9306, 0x1B0C }, { 0x930F, 0x4E5B }, { 0x9310, 0x1F4D }, { 0x9318, 0x1F4E }, 
+       { 0x9319, 0x4F01 }, { 0x931A, 0x4F03 }, { 0x9320, 0x1E5B }, { 0x9322, 0x4F02 }, { 0x9323, 0x4F04 }, { 0x9326, 0x1633 }, 
+       { 0x9328, 0x2925 }, { 0x932B, 0x1C42 }, { 0x932C, 0x2F03 }, { 0x932E, 0x4E5E }, { 0x932F, 0x1A58 }, { 0x9332, 0x2F1F }, 
+       { 0x9335, 0x4F06 }, { 0x933A, 0x4F05 }, { 0x933B, 0x4F07 }, { 0x9344, 0x4E5D }, { 0x934B, 0x2649 }, { 0x934D, 0x2535 }, 
+       { 0x9354, 0x2437 }, { 0x9356, 0x4F0C }, { 0x935B, 0x2323 }, { 0x935C, 0x4F08 }, { 0x9360, 0x4F09 }, { 0x936C, 0x170D }, 
+       { 0x936E, 0x4F0B }, { 0x9375, 0x1810 }, { 0x937C, 0x4F0A }, { 0x937E, 0x1E41 }, { 0x938C, 0x1359 }, { 0x9394, 0x4F10 }, 
+       { 0x9396, 0x1A1F }, { 0x9397, 0x2159 }, { 0x939A, 0x242A }, { 0x93A7, 0x131B }, { 0x93AC, 0x4F0E }, { 0x93AD, 0x4F0F }, 
+       { 0x93AE, 0x2423 }, { 0x93B0, 0x4F0D }, { 0x93B9, 0x4F11 }, { 0x93C3, 0x4F17 }, { 0x93C8, 0x4F1A }, { 0x93D0, 0x4F19 }, 
+       { 0x93D1, 0x250D }, { 0x93D6, 0x4F12 }, { 0x93D7, 0x4F13 }, { 0x93D8, 0x4F16 }, { 0x93DD, 0x4F18 }, { 0x93E1, 0x1620 }, 
+       { 0x93E4, 0x4F1B }, { 0x93E5, 0x4F15 }, { 0x93E8, 0x4F14 }, { 0x9403, 0x4F1F }, { 0x9407, 0x4F20 }, { 0x9410, 0x4F21 }, 
+       { 0x9413, 0x4F1E }, { 0x9414, 0x4F1D }, { 0x9418, 0x1E42 }, { 0x9419, 0x260A }, { 0x941A, 0x4F1C }, { 0x9421, 0x4F25 }, 
+       { 0x942B, 0x4F23 }, { 0x9435, 0x4F24 }, { 0x9436, 0x4F22 }, { 0x9438, 0x2258 }, { 0x943A, 0x4F26 }, { 0x9441, 0x4F27 }, 
+       { 0x9444, 0x4F29 }, { 0x9451, 0x1435 }, { 0x9452, 0x4F28 }, { 0x9453, 0x2C5A }, { 0x945A, 0x4F34 }, { 0x945B, 0x4F2A }, 
+       { 0x945E, 0x4F2D }, { 0x9460, 0x4F2B }, { 0x9462, 0x4F2C }, { 0x946A, 0x4F2E }, { 0x9470, 0x4F30 }, { 0x9475, 0x4F31 }, 
+       { 0x9477, 0x4F32 }, { 0x947C, 0x4F35 }, { 0x947D, 0x4F33 }, { 0x947E, 0x4F36 }, { 0x947F, 0x4F38 }, { 0x9481, 0x4F37 }, 
+       { 0x9577, 0x2419 }, { 0x9580, 0x2C47 }, { 0x9582, 0x4F39 }, { 0x9583, 0x210E }, { 0x9587, 0x4F3A }, { 0x9589, 0x2A24 }, 
+       { 0x958A, 0x4F3B }, { 0x958B, 0x130B }, { 0x958F, 0x111C }, { 0x9591, 0x1437 }, { 0x9593, 0x1436 }, { 0x9594, 0x4F3C }, 
+       { 0x9596, 0x4F3D }, { 0x9598, 0x4F3E }, { 0x9599, 0x4F3F }, { 0x95A0, 0x4F40 }, { 0x95A2, 0x1438 }, { 0x95A3, 0x1335 }, 
+       { 0x95A4, 0x193E }, { 0x95A5, 0x2816 }, { 0x95A7, 0x4F42 }, { 0x95A8, 0x4F41 }, { 0x95AD, 0x4F43 }, { 0x95B2, 0x113C }, 
+       { 0x95B9, 0x4F46 }, { 0x95BB, 0x4F45 }, { 0x95BC, 0x4F44 }, { 0x95BE, 0x4F47 }, { 0x95C3, 0x4F4A }, { 0x95C7, 0x1027 }, 
+       { 0x95CA, 0x4F48 }, { 0x95CC, 0x4F4C }, { 0x95CD, 0x4F4B }, { 0x95D4, 0x4F4E }, { 0x95D5, 0x4F4D }, { 0x95D6, 0x4F4F }, 
+       { 0x95D8, 0x260E }, { 0x95DC, 0x4F50 }, { 0x95E1, 0x4F51 }, { 0x95E2, 0x4F53 }, { 0x95E5, 0x4F52 }, { 0x961C, 0x294C }, 
+       { 0x9621, 0x4F54 }, { 0x9628, 0x4F55 }, { 0x962A, 0x1A45 }, { 0x962E, 0x4F56 }, { 0x962F, 0x4F57 }, { 0x9632, 0x2B29 }, 
+       { 0x963B, 0x212B }, { 0x963F, 0x1004 }, { 0x9640, 0x222B }, { 0x9642, 0x4F58 }, { 0x9644, 0x294D }, { 0x964B, 0x4F5B }, 
+       { 0x964C, 0x4F59 }, { 0x964D, 0x193F }, { 0x964F, 0x4F5A }, { 0x9650, 0x1822 }, { 0x965B, 0x2A25 }, { 0x965C, 0x4F5D }, 
+       { 0x965D, 0x5001 }, { 0x965E, 0x4F5E }, { 0x965F, 0x5002 }, { 0x9662, 0x1101 }, { 0x9663, 0x1F38 }, { 0x9664, 0x1D5C }, 
+       { 0x9665, 0x1439 }, { 0x9666, 0x5003 }, { 0x966A, 0x2746 }, { 0x966C, 0x5005 }, { 0x9670, 0x1102 }, { 0x9672, 0x5004 }, 
+       { 0x9673, 0x2424 }, { 0x9675, 0x2E2D }, { 0x9676, 0x260B }, { 0x9677, 0x4F5C }, { 0x9678, 0x2E06 }, { 0x967A, 0x1811 }, 
+       { 0x967D, 0x2D3B }, { 0x9685, 0x1659 }, { 0x9686, 0x2E14 }, { 0x9688, 0x1708 }, { 0x968A, 0x2242 }, { 0x968B, 0x4701 }, 
+       { 0x968D, 0x5006 }, { 0x968E, 0x130C }, { 0x968F, 0x1F4F }, { 0x9694, 0x1336 }, { 0x9695, 0x5008 }, { 0x9697, 0x5009 }, 
+       { 0x9698, 0x5007 }, { 0x9699, 0x1744 }, { 0x969B, 0x1A3D }, { 0x969C, 0x1E43 }, { 0x96A0, 0x1103 }, { 0x96A3, 0x2E39 }, 
+       { 0x96A7, 0x500B }, { 0x96A8, 0x4E0E }, { 0x96AA, 0x500A }, { 0x96B0, 0x500E }, { 0x96B1, 0x500C }, { 0x96B2, 0x500D }, 
+       { 0x96B4, 0x500F }, { 0x96B6, 0x5010 }, { 0x96B7, 0x2E4C }, { 0x96B8, 0x5011 }, { 0x96B9, 0x5012 }, { 0x96BB, 0x2029 }, 
+       { 0x96BC, 0x281B }, { 0x96C0, 0x1F5D }, { 0x96C1, 0x1447 }, { 0x96C4, 0x2D1A }, { 0x96C5, 0x124D }, { 0x96C6, 0x1D18 }, 
+       { 0x96C7, 0x183B }, { 0x96C9, 0x5015 }, { 0x96CB, 0x5014 }, { 0x96CC, 0x1B53 }, { 0x96CD, 0x5016 }, { 0x96CE, 0x5013 }, 
+       { 0x96D1, 0x1B08 }, { 0x96D5, 0x501A }, { 0x96D6, 0x4A0D }, { 0x96D9, 0x3236 }, { 0x96DB, 0x1F57 }, { 0x96DC, 0x5018 }, 
+       { 0x96E2, 0x2E05 }, { 0x96E3, 0x2651 }, { 0x96E8, 0x110B }, { 0x96EA, 0x2043 }, { 0x96EB, 0x1C16 }, { 0x96F0, 0x2A17 }, 
+       { 0x96F2, 0x1120 }, { 0x96F6, 0x2E4D }, { 0x96F7, 0x2D4B }, { 0x96F9, 0x501B }, { 0x96FB, 0x2525 }, { 0x9700, 0x1C5B }, 
+       { 0x9704, 0x501C }, { 0x9706, 0x501D }, { 0x9707, 0x1F2C }, { 0x9708, 0x501E }, { 0x970A, 0x2E4E }, { 0x970D, 0x5019 }, 
+       { 0x970E, 0x5020 }, { 0x970F, 0x5022 }, { 0x9711, 0x5021 }, { 0x9713, 0x501F }, { 0x9716, 0x5023 }, { 0x9719, 0x5024 }, 
+       { 0x971C, 0x215A }, { 0x971E, 0x1242 }, { 0x9724, 0x5025 }, { 0x9727, 0x2C18 }, { 0x972A, 0x5026 }, { 0x9730, 0x5027 }, 
+       { 0x9732, 0x2F0A }, { 0x9738, 0x3B11 }, { 0x9739, 0x5028 }, { 0x973D, 0x5029 }, { 0x973E, 0x502A }, { 0x9742, 0x502E }, 
+       { 0x9744, 0x502B }, { 0x9746, 0x502C }, { 0x9748, 0x502D }, { 0x9749, 0x502F }, { 0x9752, 0x2024 }, { 0x9756, 0x2C57 }, 
+       { 0x9759, 0x2025 }, { 0x975C, 0x5030 }, { 0x975E, 0x2853 }, { 0x9760, 0x5031 }, { 0x9761, 0x5333 }, { 0x9762, 0x2C2C }, 
+       { 0x9764, 0x5032 }, { 0x9766, 0x5033 }, { 0x9768, 0x5034 }, { 0x9769, 0x1337 }, { 0x976B, 0x5036 }, { 0x976D, 0x1F39 }, 
+       { 0x9771, 0x5037 }, { 0x9774, 0x1704 }, { 0x9779, 0x5038 }, { 0x977A, 0x503C }, { 0x977C, 0x503A }, { 0x9781, 0x503B }, 
+       { 0x9784, 0x1353 }, { 0x9785, 0x5039 }, { 0x9786, 0x503D }, { 0x978B, 0x503E }, { 0x978D, 0x1028 }, { 0x978F, 0x503F }, 
+       { 0x9790, 0x5040 }, { 0x9798, 0x1E44 }, { 0x979C, 0x5041 }, { 0x97A0, 0x1527 }, { 0x97A3, 0x5044 }, { 0x97A6, 0x5043 }, 
+       { 0x97A8, 0x5042 }, { 0x97AB, 0x4B51 }, { 0x97AD, 0x2A3C }, { 0x97B3, 0x5045 }, { 0x97B4, 0x5046 }, { 0x97C3, 0x5047 }, 
+       { 0x97C6, 0x5048 }, { 0x97C8, 0x5049 }, { 0x97CB, 0x504A }, { 0x97D3, 0x143A }, { 0x97DC, 0x504B }, { 0x97ED, 0x504C }, 
+       { 0x97EE, 0x2703 }, { 0x97F2, 0x504E }, { 0x97F3, 0x121B }, { 0x97F5, 0x5051 }, { 0x97F6, 0x5050 }, { 0x97FB, 0x1104 }, 
+       { 0x97FF, 0x1621 }, { 0x9801, 0x2A27 }, { 0x9802, 0x241A }, { 0x9803, 0x1A02 }, { 0x9805, 0x1940 }, { 0x9806, 0x1D47 }, 
+       { 0x9808, 0x1F3C }, { 0x980C, 0x5053 }, { 0x980F, 0x5052 }, { 0x9810, 0x2D22 }, { 0x9811, 0x1448 }, { 0x9812, 0x2832 }, 
+       { 0x9813, 0x263C }, { 0x9817, 0x1F5C }, { 0x9818, 0x2E2E }, { 0x981A, 0x173B }, { 0x9821, 0x5056 }, { 0x9824, 0x5055 }, 
+       { 0x982C, 0x2B2B }, { 0x982D, 0x260C }, { 0x9834, 0x1130 }, { 0x9837, 0x5057 }, { 0x9838, 0x5054 }, { 0x983B, 0x2931 }, 
+       { 0x983C, 0x2D4A }, { 0x983D, 0x5058 }, { 0x9846, 0x5059 }, { 0x984B, 0x505B }, { 0x984C, 0x224A }, { 0x984D, 0x133B }, 
+       { 0x984E, 0x133C }, { 0x984F, 0x505A }, { 0x9854, 0x1449 }, { 0x9855, 0x1812 }, { 0x9858, 0x144A }, { 0x985B, 0x251F }, 
+       { 0x985E, 0x2E40 }, { 0x9867, 0x183C }, { 0x986B, 0x505C }, { 0x986F, 0x505D }, { 0x9870, 0x505E }, { 0x9871, 0x5101 }, 
+       { 0x9873, 0x5103 }, { 0x9874, 0x5102 }, { 0x98A8, 0x2957 }, { 0x98AA, 0x5104 }, { 0x98AF, 0x5105 }, { 0x98B1, 0x5106 }, 
+       { 0x98B6, 0x5107 }, { 0x98C3, 0x5109 }, { 0x98C4, 0x5108 }, { 0x98C6, 0x510A }, { 0x98DB, 0x2854 }, { 0x98DC, 0x462C }, 
+       { 0x98DF, 0x1F09 }, { 0x98E2, 0x1512 }, { 0x98E9, 0x510B }, { 0x98EB, 0x510C }, { 0x98ED, 0x320C }, { 0x98EE, 0x3D1B }, 
+       { 0x98EF, 0x2833 }, { 0x98F2, 0x105B }, { 0x98F4, 0x101B }, { 0x98FC, 0x1B54 }, { 0x98FD, 0x2B10 }, { 0x98FE, 0x1E5E }, 
+       { 0x9903, 0x510D }, { 0x9905, 0x2C3F }, { 0x9909, 0x510E }, { 0x990A, 0x2D3C }, { 0x990C, 0x1122 }, { 0x9910, 0x1B21 }, 
+       { 0x9912, 0x510F }, { 0x9913, 0x124E }, { 0x9914, 0x5110 }, { 0x9918, 0x5111 }, { 0x991D, 0x5113 }, { 0x991E, 0x5114 }, 
+       { 0x9920, 0x5116 }, { 0x9921, 0x5112 }, { 0x9924, 0x5115 }, { 0x9928, 0x143B }, { 0x992C, 0x5117 }, { 0x992E, 0x5118 }, 
+       { 0x993D, 0x5119 }, { 0x993E, 0x511A }, { 0x9942, 0x511B }, { 0x9945, 0x511D }, { 0x9949, 0x511C }, { 0x994B, 0x511F }, 
+       { 0x994C, 0x5122 }, { 0x9950, 0x511E }, { 0x9951, 0x5120 }, { 0x9952, 0x5121 }, { 0x9955, 0x5123 }, { 0x9957, 0x1622 }, 
+       { 0x9996, 0x1C53 }, { 0x9997, 0x5124 }, { 0x9998, 0x5125 }, { 0x9999, 0x1941 }, { 0x99A5, 0x5126 }, { 0x99A8, 0x131E }, 
+       { 0x99AC, 0x272F }, { 0x99AD, 0x5127 }, { 0x99AE, 0x5128 }, { 0x99B3, 0x233A }, { 0x99B4, 0x264B }, { 0x99BC, 0x5129 }, 
+       { 0x99C1, 0x275D }, { 0x99C4, 0x222C }, { 0x99C5, 0x1138 }, { 0x99C6, 0x164E }, { 0x99C8, 0x164F }, { 0x99D0, 0x2353 }, 
+       { 0x99D1, 0x512E }, { 0x99D2, 0x1650 }, { 0x99D5, 0x124F }, { 0x99D8, 0x512D }, { 0x99DB, 0x512B }, { 0x99DD, 0x512C }, 
+       { 0x99DF, 0x512A }, { 0x99E2, 0x5138 }, { 0x99ED, 0x512F }, { 0x99EE, 0x5130 }, { 0x99F1, 0x5131 }, { 0x99F2, 0x5132 }, 
+       { 0x99F8, 0x5134 }, { 0x99FB, 0x5133 }, { 0x99FF, 0x1D39 }, { 0x9A01, 0x5135 }, { 0x9A05, 0x5137 }, { 0x9A0E, 0x1513 }, 
+       { 0x9A0F, 0x5136 }, { 0x9A12, 0x215B }, { 0x9A13, 0x1813 }, { 0x9A19, 0x5139 }, { 0x9A28, 0x222D }, { 0x9A2B, 0x513A }, 
+       { 0x9A30, 0x260D }, { 0x9A37, 0x513B }, { 0x9A3E, 0x5140 }, { 0x9A40, 0x513E }, { 0x9A42, 0x513D }, { 0x9A43, 0x513F }, 
+       { 0x9A45, 0x513C }, { 0x9A4D, 0x5142 }, { 0x9A55, 0x5141 }, { 0x9A57, 0x5144 }, { 0x9A5A, 0x1623 }, { 0x9A5B, 0x5143 }, 
+       { 0x9A5F, 0x5145 }, { 0x9A62, 0x5146 }, { 0x9A64, 0x5148 }, { 0x9A65, 0x5147 }, { 0x9A69, 0x5149 }, { 0x9A6A, 0x514B }, 
+       { 0x9A6B, 0x514A }, { 0x9AA8, 0x195C }, { 0x9AAD, 0x514C }, { 0x9AB0, 0x514D }, { 0x9AB8, 0x131C }, { 0x9ABC, 0x514E }, 
+       { 0x9AC0, 0x514F }, { 0x9AC4, 0x1F51 }, { 0x9ACF, 0x5150 }, { 0x9AD1, 0x5151 }, { 0x9AD3, 0x5152 }, { 0x9AD4, 0x5153 }, 
+       { 0x9AD8, 0x1942 }, { 0x9ADE, 0x5154 }, { 0x9ADF, 0x5155 }, { 0x9AE2, 0x5156 }, { 0x9AE3, 0x5157 }, { 0x9AE6, 0x5158 }, 
+       { 0x9AEA, 0x2811 }, { 0x9AEB, 0x515A }, { 0x9AED, 0x2906 }, { 0x9AEE, 0x515B }, { 0x9AEF, 0x5159 }, { 0x9AF1, 0x515D }, 
+       { 0x9AF4, 0x515C }, { 0x9AF7, 0x515E }, { 0x9AFB, 0x5201 }, { 0x9B06, 0x5202 }, { 0x9B18, 0x5203 }, { 0x9B1A, 0x5204 }, 
+       { 0x9B1F, 0x5205 }, { 0x9B22, 0x5206 }, { 0x9B23, 0x5207 }, { 0x9B25, 0x5208 }, { 0x9B27, 0x5209 }, { 0x9B28, 0x520A }, 
+       { 0x9B29, 0x520B }, { 0x9B2A, 0x520C }, { 0x9B2E, 0x520D }, { 0x9B2F, 0x520E }, { 0x9B31, 0x3D15 }, { 0x9B32, 0x520F }, 
+       { 0x9B3B, 0x4458 }, { 0x9B3C, 0x1514 }, { 0x9B41, 0x1301 }, { 0x9B42, 0x1A12 }, { 0x9B43, 0x5211 }, { 0x9B44, 0x5210 }, 
+       { 0x9B45, 0x2C05 }, { 0x9B4D, 0x5213 }, { 0x9B4E, 0x5214 }, { 0x9B4F, 0x5212 }, { 0x9B51, 0x5215 }, { 0x9B54, 0x2B42 }, 
+       { 0x9B58, 0x5216 }, { 0x9B5A, 0x155B }, { 0x9B6F, 0x2F05 }, { 0x9B74, 0x5217 }, { 0x9B83, 0x5219 }, { 0x9B8E, 0x101E }, 
+       { 0x9B91, 0x521A }, { 0x9B92, 0x2A0B }, { 0x9B93, 0x5218 }, { 0x9B96, 0x521B }, { 0x9B97, 0x521C }, { 0x9B9F, 0x521D }, 
+       { 0x9BA0, 0x521E }, { 0x9BA8, 0x521F }, { 0x9BAA, 0x2B4E }, { 0x9BAB, 0x1B0D }, { 0x9BAD, 0x1A5A }, { 0x9BAE, 0x210F }, 
+       { 0x9BB4, 0x5220 }, { 0x9BB9, 0x5223 }, { 0x9BC0, 0x5221 }, { 0x9BC6, 0x5224 }, { 0x9BC9, 0x1851 }, { 0x9BCA, 0x5222 }, 
+       { 0x9BCF, 0x5225 }, { 0x9BD1, 0x5226 }, { 0x9BD2, 0x5227 }, { 0x9BD4, 0x522B }, { 0x9BD6, 0x1B0A }, { 0x9BDB, 0x2244 }, 
+       { 0x9BE1, 0x522C }, { 0x9BE2, 0x5229 }, { 0x9BE3, 0x5228 }, { 0x9BE4, 0x522A }, { 0x9BE8, 0x173F }, { 0x9BF0, 0x5230 }, 
+       { 0x9BF1, 0x522F }, { 0x9BF2, 0x522E }, { 0x9BF5, 0x1013 }, { 0x9C04, 0x523A }, { 0x9C06, 0x5236 }, { 0x9C08, 0x5237 }, 
+       { 0x9C09, 0x5233 }, { 0x9C0A, 0x5239 }, { 0x9C0C, 0x5235 }, { 0x9C0D, 0x1342 }, { 0x9C10, 0x2F2C }, { 0x9C12, 0x5238 }, 
+       { 0x9C13, 0x5234 }, { 0x9C14, 0x5232 }, { 0x9C15, 0x5231 }, { 0x9C1B, 0x523C }, { 0x9C21, 0x523F }, { 0x9C24, 0x523E }, 
+       { 0x9C25, 0x523D }, { 0x9C2D, 0x2929 }, { 0x9C2E, 0x523B }, { 0x9C2F, 0x1053 }, { 0x9C30, 0x5240 }, { 0x9C32, 0x5242 }, 
+       { 0x9C39, 0x134F }, { 0x9C3A, 0x522D }, { 0x9C3B, 0x1117 }, { 0x9C3E, 0x5244 }, { 0x9C46, 0x5243 }, { 0x9C47, 0x5241 }, 
+       { 0x9C48, 0x230D }, { 0x9C52, 0x2B50 }, { 0x9C57, 0x2E3A }, { 0x9C5A, 0x5245 }, { 0x9C60, 0x5246 }, { 0x9C67, 0x5247 }, 
+       { 0x9C76, 0x5248 }, { 0x9C78, 0x5249 }, { 0x9CE5, 0x241B }, { 0x9CE7, 0x524A }, { 0x9CE9, 0x2817 }, { 0x9CEB, 0x524F }, 
+       { 0x9CEC, 0x524B }, { 0x9CF0, 0x524C }, { 0x9CF3, 0x2B11 }, { 0x9CF4, 0x2C24 }, { 0x9CF6, 0x2630 }, { 0x9D03, 0x5250 }, 
+       { 0x9D06, 0x5251 }, { 0x9D07, 0x261E }, { 0x9D08, 0x524E }, { 0x9D09, 0x524D }, { 0x9D0E, 0x120A }, { 0x9D12, 0x5259 }, 
+       { 0x9D15, 0x5258 }, { 0x9D1B, 0x1155 }, { 0x9D1F, 0x5256 }, { 0x9D23, 0x5255 }, { 0x9D26, 0x5253 }, { 0x9D28, 0x135B }, 
+       { 0x9D2A, 0x5252 }, { 0x9D2B, 0x1C12 }, { 0x9D2C, 0x1209 }, { 0x9D3B, 0x1943 }, { 0x9D3E, 0x525C }, { 0x9D3F, 0x525B }, 
+       { 0x9D41, 0x525A }, { 0x9D44, 0x5257 }, { 0x9D46, 0x525D }, { 0x9D48, 0x525E }, { 0x9D50, 0x5305 }, { 0x9D51, 0x5304 }, 
+       { 0x9D59, 0x5306 }, { 0x9D5C, 0x110D }, { 0x9D5D, 0x5301 }, { 0x9D5E, 0x5302 }, { 0x9D60, 0x1954 }, { 0x9D61, 0x2C19 }, 
+       { 0x9D64, 0x5303 }, { 0x9D6C, 0x2B12 }, { 0x9D6F, 0x530B }, { 0x9D72, 0x5307 }, { 0x9D7A, 0x530C }, { 0x9D87, 0x5309 }, 
+       { 0x9D89, 0x5308 }, { 0x9D8F, 0x173C }, { 0x9D9A, 0x530D }, { 0x9DA4, 0x530E }, { 0x9DA9, 0x530F }, { 0x9DAB, 0x530A }, 
+       { 0x9DAF, 0x5254 }, { 0x9DB2, 0x5310 }, { 0x9DB4, 0x2441 }, { 0x9DB8, 0x5314 }, { 0x9DBA, 0x5315 }, { 0x9DBB, 0x5313 }, 
+       { 0x9DC1, 0x5312 }, { 0x9DC2, 0x5318 }, { 0x9DC4, 0x5311 }, { 0x9DC6, 0x5316 }, { 0x9DCF, 0x5317 }, { 0x9DD3, 0x531A }, 
+       { 0x9DD9, 0x5319 }, { 0x9DE6, 0x531C }, { 0x9DED, 0x531D }, { 0x9DEF, 0x531E }, { 0x9DF2, 0x2F29 }, { 0x9DF8, 0x531B }, 
+       { 0x9DF9, 0x224B }, { 0x9DFA, 0x1A4D }, { 0x9DFD, 0x531F }, { 0x9E1A, 0x5320 }, { 0x9E1B, 0x5321 }, { 0x9E1E, 0x5322 }, 
+       { 0x9E75, 0x5323 }, { 0x9E78, 0x1814 }, { 0x9E79, 0x5324 }, { 0x9E7D, 0x5325 }, { 0x9E7F, 0x1C0F }, { 0x9E81, 0x5326 }, 
+       { 0x9E88, 0x5327 }, { 0x9E8B, 0x5328 }, { 0x9E8C, 0x5329 }, { 0x9E91, 0x532C }, { 0x9E92, 0x532A }, { 0x9E93, 0x2F1C }, 
+       { 0x9E95, 0x532B }, { 0x9E97, 0x2E4F }, { 0x9E9D, 0x532D }, { 0x9E9F, 0x2E3B }, { 0x9EA5, 0x532E }, { 0x9EA6, 0x275E }, 
+       { 0x9EA9, 0x532F }, { 0x9EAA, 0x5331 }, { 0x9EAD, 0x5332 }, { 0x9EB8, 0x5330 }, { 0x9EB9, 0x194D }, { 0x9EBA, 0x2C2D }, 
+       { 0x9EBB, 0x2B43 }, { 0x9EBC, 0x3657 }, { 0x9EBE, 0x3D40 }, { 0x9EBF, 0x2B5B }, { 0x9EC4, 0x120B }, { 0x9ECC, 0x5334 }, 
+       { 0x9ECD, 0x1530 }, { 0x9ECE, 0x5335 }, { 0x9ECF, 0x5336 }, { 0x9ED0, 0x5337 }, { 0x9ED2, 0x1955 }, { 0x9ED4, 0x5338 }, 
+       { 0x9ED8, 0x4034 }, { 0x9ED9, 0x2C3B }, { 0x9EDB, 0x2243 }, { 0x9EDC, 0x5339 }, { 0x9EDD, 0x533B }, { 0x9EDE, 0x533A }, 
+       { 0x9EE0, 0x533C }, { 0x9EE5, 0x533D }, { 0x9EE8, 0x533E }, { 0x9EEF, 0x533F }, { 0x9EF4, 0x5340 }, { 0x9EF6, 0x5341 }, 
+       { 0x9EF7, 0x5342 }, { 0x9EF9, 0x5343 }, { 0x9EFB, 0x5344 }, { 0x9EFC, 0x5345 }, { 0x9EFD, 0x5346 }, { 0x9F07, 0x5347 }, 
+       { 0x9F08, 0x5348 }, { 0x9F0E, 0x2504 }, { 0x9F13, 0x183D }, { 0x9F15, 0x534A }, { 0x9F20, 0x212D }, { 0x9F21, 0x534B }, 
+       { 0x9F2C, 0x534C }, { 0x9F3B, 0x2901 }, { 0x9F3E, 0x534D }, { 0x9F4A, 0x534E }, { 0x9F4B, 0x4317 }, { 0x9F4E, 0x4C3A }, 
+       { 0x9F4F, 0x504D }, { 0x9F52, 0x534F }, { 0x9F54, 0x5350 }, { 0x9F5F, 0x5352 }, { 0x9F60, 0x5353 }, { 0x9F61, 0x5354 }, 
+       { 0x9F62, 0x2E50 }, { 0x9F63, 0x5351 }, { 0x9F66, 0x5355 }, { 0x9F67, 0x5356 }, { 0x9F6A, 0x5358 }, { 0x9F6C, 0x5357 }, 
+       { 0x9F72, 0x535A }, { 0x9F76, 0x535B }, { 0x9F77, 0x5359 }, { 0x9F8D, 0x2E16 }, { 0x9F95, 0x535C }, { 0x9F9C, 0x535D }, 
+       { 0x9F9D, 0x4334 }, { 0x9FA0, 0x535E }, { 0xFF01, 0x010A }, { 0xFF03, 0x0154 }, { 0xFF04, 0x0150 }, { 0xFF05, 0x0153 }, 
+       { 0xFF06, 0x0155 }, { 0xFF08, 0x012A }, { 0xFF09, 0x012B }, { 0xFF0A, 0x0156 }, { 0xFF0B, 0x013C }, { 0xFF0C, 0x0104 }, 
+       { 0xFF0E, 0x0105 }, { 0xFF0F, 0x011F }, { 0xFF10, 0x0310 }, { 0xFF11, 0x0311 }, { 0xFF12, 0x0312 }, { 0xFF13, 0x0313 }, 
+       { 0xFF14, 0x0314 }, { 0xFF15, 0x0315 }, { 0xFF16, 0x0316 }, { 0xFF17, 0x0317 }, { 0xFF18, 0x0318 }, { 0xFF19, 0x0319 }, 
+       { 0xFF1A, 0x0107 }, { 0xFF1B, 0x0108 }, { 0xFF1C, 0x0143 }, { 0xFF1D, 0x0141 }, { 0xFF1E, 0x0144 }, { 0xFF1F, 0x0109 }, 
+       { 0xFF20, 0x0157 }, { 0xFF21, 0x0321 }, { 0xFF22, 0x0322 }, { 0xFF23, 0x0323 }, { 0xFF24, 0x0324 }, { 0xFF25, 0x0325 }, 
+       { 0xFF26, 0x0326 }, { 0xFF27, 0x0327 }, { 0xFF28, 0x0328 }, { 0xFF29, 0x0329 }, { 0xFF2A, 0x032A }, { 0xFF2B, 0x032B }, 
+       { 0xFF2C, 0x032C }, { 0xFF2D, 0x032D }, { 0xFF2E, 0x032E }, { 0xFF2F, 0x032F }, { 0xFF30, 0x0330 }, { 0xFF31, 0x0331 }, 
+       { 0xFF32, 0x0332 }, { 0xFF33, 0x0333 }, { 0xFF34, 0x0334 }, { 0xFF35, 0x0335 }, { 0xFF36, 0x0336 }, { 0xFF37, 0x0337 }, 
+       { 0xFF38, 0x0338 }, { 0xFF39, 0x0339 }, { 0xFF3A, 0x033A }, { 0xFF3B, 0x012E }, { 0xFF3D, 0x012F }, { 0xFF3E, 0x0110 }, 
+       { 0xFF3F, 0x0112 }, { 0xFF40, 0x010E }, { 0xFF41, 0x0341 }, { 0xFF42, 0x0342 }, { 0xFF43, 0x0343 }, { 0xFF44, 0x0344 }, 
+       { 0xFF45, 0x0345 }, { 0xFF46, 0x0346 }, { 0xFF47, 0x0347 }, { 0xFF48, 0x0348 }, { 0xFF49, 0x0349 }, { 0xFF4A, 0x034A }, 
+       { 0xFF4B, 0x034B }, { 0xFF4C, 0x034C }, { 0xFF4D, 0x034D }, { 0xFF4E, 0x034E }, { 0xFF4F, 0x034F }, { 0xFF50, 0x0350 }, 
+       { 0xFF51, 0x0351 }, { 0xFF52, 0x0352 }, { 0xFF53, 0x0353 }, { 0xFF54, 0x0354 }, { 0xFF55, 0x0355 }, { 0xFF56, 0x0356 }, 
+       { 0xFF57, 0x0357 }, { 0xFF58, 0x0358 }, { 0xFF59, 0x0359 }, { 0xFF5A, 0x035A }, { 0xFF5B, 0x0130 }, { 0xFF5C, 0x0123 }, 
+       { 0xFF5D, 0x0131 }, { 0xFFE3, 0x0111 }, { 0xFFE5, 0x014F }
+};
+
+unsigned ucs_to_jisx0208_table_size=6879;
+
+}
diff --git a/source/stringcodec/utf8.cpp b/source/stringcodec/utf8.cpp
new file mode 100644 (file)
index 0000000..c7e1705
--- /dev/null
@@ -0,0 +1,92 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "utf8.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Codecs {
+
+void Utf8::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if(ch<0 || ch>0x10FFFF)
+               return error(ch, buf, "Can't express character in UTF-8");
+
+       unsigned bytes = 1;
+       if(ch>0xFFFF)
+               bytes = 4;
+       else if(ch>0x7FF)
+               bytes = 3;
+       else if(ch>0x7F)
+               bytes = 2;
+
+       if(bytes==1)
+               buf += ch;
+       else
+       {
+               char utf[4];
+
+               utf[0] = 0xFF<<(8-bytes) | ch>>(bytes*6-6);
+               for(unsigned j=bytes-1; j>0; --j)
+               {
+                       utf[j] = 0x80 | (ch&0x3F);
+                       ch >>= 6;
+               }
+
+               buf.append(utf, bytes);
+       }
+}
+
+void Utf8::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf.append("\357\277\275", 3);  // � U+FFFE Replacement Character
+}
+
+
+UnicodeChar Utf8::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       if((*i&0xC0)==0x80)
+       {
+               UnicodeChar result = error("UTF-8 tail byte found when expecting head");
+               ++i;
+               return result;
+       }
+       else if(*i&0x80)
+       {
+               unsigned bytes = 2;
+               unsigned mask = 0x20;
+               for(; *i&mask; mask>>=1)
+                       ++bytes;
+
+               string::const_iterator j = i;
+
+               UnicodeChar result = (*j++)&(mask-1);
+
+               unsigned k;
+               for(k=1; (k<bytes && j!=str.end() && (*j&0xC0)==0x80); ++k)
+                       result = (result<<6) | ((*j++)&0x3F);
+
+               if(k<bytes)
+                       result = error("Incomplete UTF-8 character");
+               else if(!(result>>(bytes*5-4)) || !(result>>7))
+                       result = error("Denormalized UTF-8 multibyte sequence");
+               else if(result>0x10FFFF || (result>=0xD800 && result<=0xDFFF))
+                       result = error("Invalid Unicode code point");
+
+               i = j;
+               return result;
+       }
+       else
+               return *i++;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/utf8.h b/source/stringcodec/utf8.h
new file mode 100644 (file)
index 0000000..0281b31
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_UTF8_H_
+#define MSP_STRINGS_UTF8_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Utf8: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "UTF-8"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/stringcodec/windows1252.cpp b/source/stringcodec/windows1252.cpp
new file mode 100644 (file)
index 0000000..bbd6753
--- /dev/null
@@ -0,0 +1,72 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "windows1252.h"
+
+using namespace std;
+
+namespace {
+
+unsigned short table[32]=
+{
+       0x20AC, 0,      0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+       0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0,      0x017D, 0,
+       0,      0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+       0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0,      0x017E, 0x0178
+};
+
+}
+
+
+namespace Msp {
+namespace Codecs {
+
+void Windows1252::Encoder::encode_char(UnicodeChar ch, string &buf)
+{
+       if((ch>=0 && ch<=0x7F) || (ch>=0xA0 && ch<=0xFF))
+               buf += ch;
+       else
+       {
+               for(unsigned i=0; i<32; ++i)
+                       if(table[i]==ch)
+                       {
+                               buf += ch;
+                               return;
+                       }
+
+               error(ch, buf, "Can't express character in Windows-1252");
+       }
+}
+
+void Windows1252::Encoder::transliterate(UnicodeChar, string &buf)
+{
+       buf += '?';
+}
+
+
+UnicodeChar Windows1252::Decoder::decode_char(const string &str, string::const_iterator &i)
+{
+       if(i==str.end())
+               return error("No input");
+
+       int ch = static_cast<unsigned char>(*i);
+       UnicodeChar result;
+       if(ch>=0x80 && ch<=0x9F)
+       {
+               result = table[ch-0x80];
+               if(result==0)
+                       result = error("Undefined Windows-1252 character");
+       }
+       else
+               result = ch;
+
+       ++i;
+       return result;
+}
+
+} // namespace Codecs
+} // namespace Msp
diff --git a/source/stringcodec/windows1252.h b/source/stringcodec/windows1252.h
new file mode 100644 (file)
index 0000000..47b2cf0
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_WINDOWS1252_H_
+#define MSP_STRINGS_WINDOWS1252_H_
+
+#include "codec.h"
+
+namespace Msp {
+namespace Codecs {
+
+class Windows1252: public Codec
+{
+public:
+       class Encoder: public Codec::Encoder
+       {
+       public:
+               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
+
+               virtual void encode_char(UnicodeChar, std::string &);
+       private:
+               virtual void transliterate(UnicodeChar, std::string &);
+       };
+
+       class Decoder: public Codec::Decoder
+       {
+       public:
+               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
+
+               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
+       };
+
+       virtual const char *get_name() const { return "Windows-1252"; }
+
+       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
+       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
+};
+
+} // namespace Codecs
+} // namespace Msp
+
+#endif
diff --git a/source/strings/fmt.cpp b/source/strings/fmt.cpp
new file mode 100644 (file)
index 0000000..e06f71a
--- /dev/null
@@ -0,0 +1,127 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <msp/core/except.h>
+#include "fmt.h"
+
+using namespace std;
+
+namespace Msp {
+
+void Fmt::parse(const char *f)
+{
+       if(*f=='%') ++f;
+
+       for(; *f; ++f)
+       {
+               if(*f=='#')
+               {
+                       sbase = true;
+                       spoint = true;
+               }
+               else if(*f=='0')
+                       fillc = '0';
+               else if(*f=='-')
+                       align = LEFT;
+               else if(*f=='+')
+                       spos = true;
+               else
+                       break;
+       }
+
+       wd = 0;
+       for(; *f; ++f)
+       {
+               if(*f>='0' && *f<='9')
+                       wd = wd*10+(*f-'0');
+               else
+                       break;
+       }
+
+       if(*f=='.')
+       {
+               ++f;
+               prec = 0;
+               for(; *f; ++f)
+               {
+                       if(*f>='0' && *f<='9')
+                               prec = prec*10+(*f-'0');
+                       else
+                               break;
+               }
+       }
+
+       type = NUM;
+       if(*f=='d' || *f=='u')
+               base = DEC;
+       else if(*f=='x' || *f=='X')
+               base = HEX;
+       else if(*f=='o')
+               base = OCT;
+       else if(*f=='b')
+               base = BIN;
+       else if(*f=='e' || *f=='E')
+               fmode = SCI;
+       else if(*f=='f' || *f=='F')
+               fmode = FIXED;
+       else if(*f=='g' || *f=='G')
+               fmode = AUTOFLT;
+       else if(*f=='p' || *f=='P')
+       {
+               base = HEX;
+               sbase = true;
+       }
+       else if(*f=='c')
+               type = CHAR;
+       else if(*f=='s')
+               type = STR;
+       else if(*f=='i')
+               base = AUTOBASE;
+       else
+               throw InvalidParameterValue("Invalid conversion specifier");
+
+       if(*f=='E' || *f=='F' || *f=='G' || *f=='X' || *f=='P')
+               ucase = true;
+
+       ++f;
+
+       if(*f)
+               throw InvalidParameterValue("Extra characters in conversion specification");
+}
+
+Fmt &Fmt::reset()
+{
+       wd = 0;
+       prec = 6;
+       spos = false;
+       fillc = ' ';
+       base = DEC;
+       sbase = false;
+       fmode = AUTOFLT;
+       spoint = false;
+       align = RIGHT;
+       ucase = false;
+       type = STR;
+
+       return *this;
+}
+
+void Fmt::apply(ostream &out) const
+{
+       out.flags(((base==HEX) ? ios_base::hex : (base==OCT) ? ios_base::oct : ios_base::dec)
+               | ((fmode==SCI) ? ios_base::scientific : (fmode==FIXED) ? ios_base::fixed : ios_base::fmtflags(0))
+               | (fillc=='0' ? ios_base::internal : (align==LEFT) ? ios_base::left : ios_base::right)
+               | (sbase ? ios_base::showbase : ios_base::fmtflags(0))
+               | (spoint ? ios_base::showpoint : ios_base::fmtflags(0))
+               | (spos ? ios_base::showpos : ios_base::fmtflags(0))
+               | (ucase ? ios_base::uppercase : ios_base::fmtflags(0)));
+       out.fill(fillc);
+       out.width(wd);
+       out.precision(prec);
+}
+
+} // namespace Msp
diff --git a/source/strings/fmt.h b/source/strings/fmt.h
new file mode 100644 (file)
index 0000000..ba75958
--- /dev/null
@@ -0,0 +1,130 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_FMT_H_
+#define MSP_STRINGS_FMT_H_
+
+#include <ostream>
+#include <string>
+
+namespace Msp {
+
+/**
+Stores formatting information for converting variables into strings.  Can be
+applied to an std::ostream or fed to lexical_cast.  Also used internally by
+Formatter.
+
+Formats can be constructed from printf-style conversion specifications, by
+chaining calls to the various setter functions, or with a mixture of both.
+
+Since type information for conversions is acquired through templates, the
+meaning of the conversion specifier character is reduced to only specifying
+what the conversion should look like.  Of special note is the s conversion,
+which will result in a default conversion for any data type.  Size modifiers
+are not supported and there is no difference between signed and unsigned
+conversions.
+
+Some new conversions are supported:
+
+  b/B  Binary integer conversion
+  P    Uppercase pointer conversion (like %#X)
+*/
+class Fmt
+{
+public:
+       enum Type
+       {
+               NUM,
+               CHAR,
+               STR
+       };
+
+       enum Base
+       {
+               AUTOBASE = 0,
+               DEC = 10,
+               HEX = 16,
+               OCT = 8,
+               BIN = 2
+       };
+
+       enum FloatMode
+       {
+               FIXED,
+               AUTOFLT,
+               SCI
+       };
+
+       enum Align
+       {
+               LEFT,
+               RIGHT
+       };
+
+private:
+       unsigned wd;
+       unsigned prec;
+       bool spos;
+       wchar_t fillc;
+       Base base;
+       bool sbase;
+       FloatMode fmode;
+       bool spoint;
+       Align align;
+       bool ucase;
+       Type type;
+
+public:
+       Fmt() { reset(); }
+       Fmt(const char *f) { reset(); parse(f); }
+       Fmt(const std::string &f) { reset(); parse(f.c_str()); }
+
+private:
+       void parse(const char *);
+
+public:
+       Fmt &width(unsigned w) { wd = w; return *this; }
+       Fmt &precision(unsigned p) { prec = p; return *this; }
+       Fmt &showpos(bool s=true) { spos = s; return *this; }
+       Fmt &fill(wchar_t f) { fillc = f; return *this; }
+       Fmt &fixed() { fmode = FIXED; return *this; }
+       Fmt &scientific() { fmode = SCI; return *this; }
+       Fmt &showpoint(bool s=true) { spoint = s; return *this; }
+       Fmt &showbase(bool s=true) { sbase = s; return *this; }
+       Fmt &left() { align = LEFT; return *this; }
+       Fmt &right() { align = RIGHT; return *this; }
+       Fmt &dec() { base = DEC; return *this; }
+       Fmt &hex() { base = HEX; return *this; }
+       Fmt &oct() { base = OCT; return *this; }
+       Fmt &bin() { base = BIN; return *this; }
+       Fmt &uppercase(bool u=true) { ucase = u; return *this; }
+       Fmt &numeric() { type = NUM; return *this; }
+       Fmt &character() { type = CHAR; return *this; }
+       Fmt &string() { type = STR; return *this; }
+       Fmt &reset();
+
+       unsigned get_width() const { return wd; }
+       unsigned get_precision() const { return prec; }
+       bool get_showpos() const { return spos; }
+       wchar_t get_fill() const { return fillc; }
+       Base get_base() const { return base; }
+       bool get_showbase() const { return sbase; }
+       FloatMode get_floatmode() const { return fmode; }
+       bool get_showpoint() const { return spoint; }
+       Align get_align() const { return align; }
+       bool get_uppercase() const { return ucase; }
+       Type get_type() const { return type; }
+
+       void apply(std::ostream &) const;
+};
+
+inline std::ostream &operator<<(std::ostream &o, const Fmt &f)
+{ f.apply(o); return o; }
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/formatter.cpp b/source/strings/formatter.cpp
new file mode 100644 (file)
index 0000000..d9d311d
--- /dev/null
@@ -0,0 +1,79 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "formatter.h"
+
+using namespace std;
+
+namespace Msp {
+
+Formatter::Formatter(const string &f):
+       fmt(f),
+       pos(fmt.begin())
+{
+       advance();
+}
+
+/**
+Returns the result of the formatting operation.  Will throw if not enough
+values have been fed to the formatter.
+*/
+const string &Formatter::str() const
+{
+       if(pos!=fmt.end())
+               throw Exception("Too few arguments for format");
+
+       return result;
+}
+
+/**
+Advances the pos iterator to the next conversion, adding literal characters to
+the result.  The iterator is left at the second character of the conversion
+(i.e. after the %).
+*/
+void Formatter::advance()
+{
+       for(; pos!=fmt.end(); ++pos)
+       {
+               if(*pos=='%')
+               {
+                       ++pos;
+                       if(pos==fmt.end())
+                               throw Exception("Malformed format string");
+                       if(*pos!='%')
+                               break;
+               }
+
+               result += *pos;
+       }
+}
+
+/**
+Reads the next conversion from the format string and returns a corresponding
+Fmt object.
+*/
+Fmt Formatter::get_conversion()
+{
+       if(pos==fmt.end())
+               throw Exception("Too many arguments for format");
+
+       string::iterator i = pos;
+       for(; i!=fmt.end(); ++i)
+               if(isalpha(*i))
+                       break;
+
+       if(i==fmt.end())
+               throw Exception("Malformed format string");
+
+       ++i;
+       string c(pos, i);
+       pos = i;
+
+       return Fmt(c);
+}
+
+} // namespace Msp
diff --git a/source/strings/formatter.h b/source/strings/formatter.h
new file mode 100644 (file)
index 0000000..cde508b
--- /dev/null
@@ -0,0 +1,70 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_FORMATTER_H_
+#define MSP_STRINGS_FORMATTER_H_
+
+#include <string>
+#include "lexicalcast.h"
+
+namespace Msp {
+
+/**
+Printf-like string formatter class.
+*/
+class Formatter
+{
+private:
+       std::string fmt;
+       std::string::iterator pos;
+       std::string result;
+
+public:
+       Formatter(const std::string &);
+
+       /** Extracts the next conversion from the format string and formats the
+       given value with it.  Will throw if no more conversions are found. */
+       template<typename T>
+       Formatter &operator()(const T &a)
+       {
+               result += lexical_cast(a, get_conversion());
+               advance();
+               return *this;
+       }
+
+       const std::string &str() const;
+private:
+       void advance();
+       Fmt get_conversion();
+};
+
+inline Formatter format(const std::string &f)
+{ return Formatter(f); }
+
+template<typename A1>
+inline std::string format(const std::string &f, const A1 &a1)
+{ return Formatter(f)(a1).str(); }
+
+template<typename A1, typename A2>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2)
+{ return Formatter(f)(a1)(a2).str(); }
+
+template<typename A1, typename A2, typename A3>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3)
+{ return Formatter(f)(a1)(a2)(a3).str(); }
+
+template<typename A1, typename A2, typename A3, typename A4>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
+{ return Formatter(f)(a1)(a2)(a3)(a4).str(); }
+
+template<typename A1, typename A2, typename A3, typename A4, typename A5>
+inline std::string format(const std::string &f, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
+{ return Formatter(f)(a1)(a2)(a3)(a4)(a5).str(); }
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/glob.cpp b/source/strings/glob.cpp
new file mode 100644 (file)
index 0000000..0af6b9b
--- /dev/null
@@ -0,0 +1,68 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include "glob.h"
+
+using namespace std;
+
+namespace {
+
+template<bool icase>
+bool cmp(char c, char h);
+
+template<>
+bool cmp<true>(char c, char h)
+{ return tolower(c)==tolower(h); }
+
+template<>
+bool cmp<false>(char c, char h)
+{ return c==h; }
+
+template<bool icase>
+bool globmatch(string::const_iterator pat_i, const string::const_iterator &pat_e, string::const_iterator str_i, const string::const_iterator &str_e)
+{
+       while(pat_i!=pat_e && str_i!=str_e)
+       {
+               if(*pat_i=='?' || cmp<icase>(*str_i, *pat_i))
+               {
+                       ++pat_i;
+                       ++str_i;
+               }
+               else if(*pat_i=='*')
+               {
+                       ++pat_i;
+                       if(pat_i==pat_e)
+                               return true;
+                       
+                       for(; str_i!=str_e; ++str_i)
+                               if(cmp<icase>(*str_i, *pat_i) && globmatch<icase>(pat_i, pat_e, str_i, str_e))
+                                       return true;
+                       
+                       return false;
+               }
+               else
+                       return false;
+       }
+
+       return pat_i==pat_e && str_i==str_e;
+}
+
+}
+
+namespace Msp {
+
+bool globmatch(const string &pat, const string &str)
+{
+       return ::globmatch<false>(pat.begin(), pat.end(), str.begin(), str.end());
+}
+
+bool globcasematch(const string &pat, const string &str)
+{
+       return ::globmatch<true>(pat.begin(), pat.end(), str.begin(), str.end());
+}
+
+} // namespace Msp
diff --git a/source/strings/glob.h b/source/strings/glob.h
new file mode 100644 (file)
index 0000000..7942073
--- /dev/null
@@ -0,0 +1,20 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_GLOB_H_
+#define MSP_STRINGS_GLOB_H_
+
+#include <string>
+
+namespace Msp {
+
+bool globmatch(const std::string &, const std::string &);
+bool globcasematch(const std::string &, const std::string &);
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/lexicalcast.cpp b/source/strings/lexicalcast.cpp
new file mode 100644 (file)
index 0000000..5903bb1
--- /dev/null
@@ -0,0 +1,623 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <cmath>
+#include <limits>
+#include "lexicalcast.h"
+
+using namespace std;
+
+namespace {
+
+using namespace Msp;
+
+template<typename T>
+struct IsSigned
+{ enum { result = !(static_cast<T>(-1)>0) }; };
+
+template<typename T, bool f = (sizeof(T)>sizeof(unsigned long))>
+struct Temporary
+{ typedef unsigned long Type; };
+
+template<typename T>
+struct Temporary<T, true>
+{
+#ifdef WIN32
+       typedef __int64 Type;
+#else
+       typedef unsigned long long Type;
+#endif
+};
+
+/* Helper to avoid warnings about an unsigned type never being < 0 */
+template<typename T, bool f = IsSigned<T>::result>
+struct IsNegative
+{ static bool eval(T v) { return v<0; } };
+
+template<typename T>
+struct IsNegative<T, false>
+{ static bool eval(T) { return false; } };
+
+/* Helper to avoid errors about ambiguous function calls since there are no
+overloads of abs for unsigned types */
+template<typename T, bool f = IsSigned<T>::result>
+struct Absolute
+{ static T eval(T v) { return v<0 ? -v : v; } };
+
+template<typename T>
+struct Absolute<T, false>
+{ static T eval(T v) { return v; } };
+
+
+/*** Integer conversions ***/
+
+const char udigits[] = "0123456789ABCDEF";
+const char ldigits[] = "0123456789abcdef";
+
+template<typename T>
+char *int_to_str(T v, const Fmt &f, char *end)
+{
+       if(f.get_type()==Fmt::CHAR)
+       {
+               *--end = v;
+               return end;
+       }
+
+       char *ptr = end;
+
+       // Find out the base to use
+       unsigned base = f.get_base();
+       if(!base)
+               base = 10;
+
+       // Format the number, starting from the least significant digit
+       const char *digits = (f.get_uppercase() ? udigits : ldigits);
+       if(v)
+       {
+               typename Temporary<T>::Type w = Absolute<T>::eval(v);
+               while(w)
+               {
+                       *--ptr = digits[w%base];
+                       w /= base;
+               }
+       }
+       else
+               *--ptr = digits[0];
+
+       char sign = (IsNegative<T>::eval(v) ? '-' : f.get_showpos() ? '+' : 0);
+       if(f.get_fill()=='0')
+       {
+               /* Zero-fill, taking base/sign size into account.  The expression is a
+               bit ugly, but saves having to write code for creating the prefix both
+               ways. */
+               unsigned pfxsize = ((f.get_showbase() && base!=10) ? base==8 ? 1 : 2 : 0) + (sign!=0);
+               for(unsigned i=(end-ptr)+pfxsize; i<f.get_width(); ++i)
+                       *--ptr = '0';
+       }
+
+       if(f.get_showbase() && v!=0)
+       {
+               // Add base indicator
+               if(base==2)
+                       *--ptr = (f.get_uppercase() ? 'B' : 'b');
+               else if(base==16)
+                       *--ptr = (f.get_uppercase() ? 'X' : 'x');
+               if(base!=10)
+                       *--ptr = '0';
+       }
+
+       if(sign)
+               *--ptr = sign;
+
+       return ptr;
+}
+
+template<typename T>
+string int_to_str(T v, const Fmt &f)
+{
+       unsigned size = max(f.get_width(), max<unsigned>(f.get_precision(), sizeof(T)*8+3));
+       char *buf = new char[size];
+       string result(int_to_str(v, f, buf+size), buf+size);
+       delete[] buf;
+       return result;
+}
+
+template<typename T>
+T str_to_int(const std::string &s, const Fmt &f)
+{
+       if(s.empty())
+               throw LexicalError("Empty input in integer conversion");
+
+       std::string::const_iterator i = s.begin();
+
+       // See if the input starts with a sign
+       bool neg = false;
+       if(*i=='-')
+       {
+               if(!IsSigned<T>::result)
+                       throw LexicalError("Negative sign in unsigned integer conversion");
+               neg = true;
+               ++i;
+       }
+       else if(*i=='+')
+               ++i;
+
+       // Must have some digits to convert
+       if(i==s.end())
+               throw LexicalError("Missing digits in integer conversion");
+
+       T base = f.get_base();
+       if(!base && i!=s.end())
+       {
+               // Automatic base detection requested, figure it out
+               if(*i=='0' && ++i!=s.end())
+               {
+                       if(*i=='x' || *i=='X')
+                       {
+                               base = 16;
+                               ++i;
+                       }
+                       else if(*i=='b' || *i=='B')
+                       {
+                               base = 2;
+                               ++i;
+                       }
+                       else
+                               base = 8;
+               }
+               else
+                       base = 10;
+       }
+
+       // Parse the digits
+       T result = 0;
+       for(; i!=s.end(); ++i)
+       {
+               T digit = base;
+               if(*i>='0' && *i<='9')
+                       digit = *i-'0';
+               else if(*i>='A' && *i<='F')
+                       digit = *i-'A'+10;
+               else if(*i>='a' && *i<='f')
+                       digit = *i-'a'+10;
+               if(digit>=base)
+                       throw LexicalError("Invalid digit in integer conversion");
+               T next = result*base+digit;
+               if(next/base!=result)
+                       throw LexicalError("Overflow in integer conversion");
+               result = next;
+       }
+
+       if(neg)
+               result = -result;
+
+       return result;
+}
+
+
+/*** Boolean conversions ***/
+
+string bool_to_str(bool b, const Fmt &f)
+{
+       if(f.get_type()==Fmt::STR)
+               return b ? "true" : "false";
+       else
+               return b ? "1" : "0";
+}
+
+bool str_to_bool(const string &s)
+{
+       if(s.empty())
+               throw LexicalError("Empty input in boolean conversion");
+
+       if(s=="1" || s=="true" || s=="yes" || s=="on")
+               return true;
+       else if(s=="0" || s=="false" || s=="no" || s=="off")
+               return false;
+
+       throw LexicalError("Invalid input in boolean conversion");
+}
+
+
+/*** Floating-point conversions ***/
+
+template<typename T>
+string flt_to_str(T v, const Fmt &f)
+{
+       if(f.get_type()==Fmt::CHAR)
+               throw LexicalError("Character format in floating-point conversion");
+
+       Fmt::FloatMode mode = f.get_floatmode();
+       long double w = abs(v);
+       char sign = (v<0 ? '-' : f.get_showpos() ? '+' : 0);
+
+       // Handle infinity and not-a-number as special cases
+       if(!(w+w>w) && w!=0)
+       {
+               string result;
+               if(sign)
+                       result += sign;
+               if(!(w>=0))
+                       result += (f.get_uppercase() ? "NAN" : "nan");
+               else
+                       result += (f.get_uppercase() ? "INF" : "inf");
+               if(result.size()<f.get_width())
+                       result = string(f.get_width()-result.size(), ' ')+result;
+               return result;
+       }
+
+       /* Find out the base-10 exponent.  Building up the multiplier / divisor
+       first helps with accuracy in some cases. */
+       int exp = 0;
+       if(w>=10)
+       {
+               long double div = 1;
+               while(div*10<w)
+               {
+                       ++exp;
+                       div *= 10;
+               }
+               w /= div;
+       }
+       else if(mode!=Fmt::FIXED && w<1 && w!=0)
+       {
+               long double mul = 1;
+               while(w*mul<1)
+               {
+                       --exp;
+                       mul *= 10;
+               }
+               w *= mul;
+       }
+
+       // Decide how to format the number
+       unsigned digits;
+       unsigned point = 1;
+       bool showexp = false;
+       if(mode==Fmt::FIXED)
+       {
+               point = exp+1;
+               digits = point+f.get_precision();
+       }
+       else if(mode==Fmt::SCI)
+       {
+               digits = f.get_precision()+1;
+               showexp = true;
+       }
+       else
+       {
+               digits = max(f.get_precision(), 1U);
+               if(exp<-4 || exp>=static_cast<int>(digits))
+               {
+                       point = 1;
+                       showexp = true;
+               }
+               else
+               {
+                       point = max(exp, 0)+1;
+                       if(exp<0)
+                               digits += -exp;
+               }
+       }
+
+       // Apply rounding
+       w += 5.0l/pow(10.0l, static_cast<long double>(digits));
+       if(w>10)
+       {
+               // Rounding bumped us to the next exponent, deal with it
+               w /= 10;
+               if(mode==Fmt::AUTOFLT && exp+1==static_cast<int>(digits))
+               {
+                       point = 1;
+                       showexp = true;
+               }
+               if(!showexp)
+               {
+                       ++digits;
+                       ++point;
+               }
+               else
+                       ++exp;
+       }
+
+       // Create a buffer and start from the end
+       unsigned size = max(f.get_width(), digits+8);
+       char *buf = new char[size];
+       char *end = buf+size;
+       char *ptr = end;
+
+       // Format exponent
+       if(showexp)
+       {
+               ptr = int_to_str(exp, Fmt().showpos().fill('0').width(3), ptr);
+               *--ptr = (f.get_uppercase() ? 'E' : 'e');
+       }
+
+       // Format mantissa left-to-right
+       char *eptr = ptr;
+       ptr -= digits+(point<digits || f.get_showpoint());
+       char *mptr = ptr;
+       for(unsigned i=0; i<digits; ++i)
+       {
+               if(i==point)
+                       *mptr++ = '.';
+               if(showexp || static_cast<int>(i)>=-exp)
+               {
+                       int digit = static_cast<int>(w);
+                       *mptr++ = '0'+digit;
+                       w = (w-digit)*10;
+               }
+               else
+                       *mptr++ = '0';
+       }
+
+       if(f.get_showpoint())
+       {
+               // Radix point requested but not displayed yet, add it
+               if(digits<=point)
+                       *mptr++ = '.';
+       }
+       else if(mode==Fmt::AUTOFLT && digits>point)
+       {
+               // Remove trailing zeroes from fraction and a lone radix point
+               while(mptr[-1]=='0')
+                       --mptr;
+               if(mptr[-1]=='.')
+                       --mptr;
+               if(mptr!=eptr)
+               {
+                       while(mptr!=ptr)
+                               *--eptr = *--mptr;
+                       ptr = eptr;
+               }
+       }
+
+       // Add filling and sign
+       if(f.get_fill()=='0')
+       {
+               unsigned pfxlen = (sign!=0);
+               while(end-ptr+pfxlen<f.get_width())
+                       *--ptr = '0';
+       }
+       if(sign)
+               *--ptr = sign;
+
+       string result(ptr, end);
+       delete[] buf;
+       return result;
+}
+
+template<typename T>
+T str_to_flt(const string &s, const Fmt &)
+{
+       if(s.empty())
+               throw LexicalError("Empty input in floating-point conversion");
+
+       std::string::const_iterator i = s.begin();
+
+       // See if the input starts with a sign
+       bool neg = false;
+       if(*i=='-')
+       {
+               neg = true;
+               ++i;
+       }
+       else if(*i=='+')
+               ++i;
+
+       // Must have some digits to convert
+       if(i==s.end())
+               throw LexicalError("Missing digits in floating-point conversion");
+
+       long double v = 0;
+       int exp = 0;
+
+       // Parse mantissa
+       bool point_seen = false;
+       for(; i!=s.end(); ++i)
+       {
+               if(*i=='.')
+               {
+                       if(point_seen)
+                               throw LexicalError("Extra point in floating-point conversion");
+                       point_seen = true;
+               }
+               else if(*i>='0' && *i<='9')
+               {
+                       v = v*10+(*i-'0');
+                       if(point_seen)
+                               --exp;
+               }
+               else if(*i=='e' || *i=='E')
+               {
+                       // We have an exponent
+                       ++i;
+
+                       exp += str_to_int<int>(string(i, s.end()), Fmt());
+                       // str_to_int has eaten the rest of the input or thrown
+                       break;
+               }
+               else
+                       throw LexicalError("Invalid digit in floating-point conversion");
+       }
+
+       // Scale and negate the result as needed
+       while(exp>0)
+       {
+               v *= 10;
+               --exp;
+       }
+       while(exp<0)
+       {
+               v /= 10;
+               ++exp;
+       }
+
+       if(neg)
+               v = -v;
+
+       return v;
+}
+
+
+/*** String conversions ***/
+
+string str_to_str(const string &s, const Fmt &f)
+{
+       if(f.get_type()==Fmt::NUM)
+               throw LexicalError("Numeric format in string conversion");
+       return s;
+}
+
+}
+
+namespace Msp {
+
+void LexicalConverter::result(const string &s)
+{
+       if(s.size()<fmt.get_width())
+       {
+               if(fmt.get_align()==Fmt::RIGHT)
+                       buf = string(fmt.get_width()-s.size(), fmt.get_fill())+s;
+               else
+                       buf = s+string(fmt.get_width()-s.size(), fmt.get_fill());
+       }
+       else
+               buf = s;
+}
+
+
+/*** operator<< ***/
+
+void operator<<(LexicalConverter &c, char v)
+{
+       Fmt::Type type = c.get_fmt().get_type();
+       if(type==Fmt::NUM)
+               c.result(int_to_str(v, c.get_fmt()));
+       else
+               c.result(string(1, v));
+}
+
+void operator<<(LexicalConverter &c, signed char v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, short v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, int v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, long v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, unsigned char v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, unsigned short v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, unsigned v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, unsigned long v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+#ifdef __GNUC__
+void operator<<(LexicalConverter &c, long long v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, unsigned long long v)
+{ c.result(int_to_str(v, c.get_fmt())); }
+#endif
+
+void operator<<(LexicalConverter &c, bool v)
+{ c.result(bool_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, float v)
+{ c.result(flt_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, double v)
+{ c.result(flt_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, long double v)
+{ c.result(flt_to_str(v, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, const string &s)
+{ c.result(str_to_str(s, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, const char *s)
+{ c.result(str_to_str(s, c.get_fmt())); }
+
+void operator<<(LexicalConverter &c, const void *p)
+{ c.result(int_to_str(reinterpret_cast<unsigned long>(p), c.get_fmt())); }
+
+
+/*** operator>> ***/
+
+void operator>>(const LexicalConverter &c, char &v)
+{
+       if(c.get_fmt().get_type()==Fmt::NUM)
+               v = str_to_int<char>(c.get(), c.get_fmt());
+       else
+       {
+               const std::string &s = c.get();
+               if(s.empty())
+                       throw LexicalError("Empty input in character conversion");
+               if(s.size()>1)
+                       throw LexicalError("Extra input in character conversion");
+               v = s[0];
+       }
+}
+
+void operator>>(const LexicalConverter &c, signed char &v)
+{ v = str_to_int<signed char>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, short &v)
+{ v = str_to_int<short>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, int &v)
+{ v = str_to_int<int>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, long &v)
+{ v = str_to_int<long>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, unsigned char &v)
+{ v = str_to_int<unsigned char>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, unsigned short &v)
+{ v = str_to_int<unsigned short>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, unsigned int &v)
+{ v = str_to_int<unsigned int>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, unsigned long &v)
+{ v = str_to_int<unsigned long>(c.get(), c.get_fmt()); }
+
+#ifdef __GNUC__
+void operator>>(const LexicalConverter &c, long long &v)
+{ v = str_to_int<long long>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, unsigned long long &v)
+{ v = str_to_int<unsigned long long>(c.get(), c.get_fmt()); }
+#endif
+
+void operator>>(const LexicalConverter &c, bool &v)
+{ v = str_to_bool(c.get()); }
+
+void operator>>(const LexicalConverter &c, float &v)
+{ v = str_to_flt<float>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, double &v)
+{ v = str_to_flt<double>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, long double &v)
+{ v = str_to_flt<long double>(c.get(), c.get_fmt()); }
+
+void operator>>(const LexicalConverter &c, string &s)
+{ s = str_to_str(c.get(), c.get_fmt()); }
+
+} // namespace Msp
diff --git a/source/strings/lexicalcast.h b/source/strings/lexicalcast.h
new file mode 100644 (file)
index 0000000..3bfc342
--- /dev/null
@@ -0,0 +1,128 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_LEXICALCAST_H_
+#define MSP_STRINGS_LEXICALCAST_H_
+
+#include <sstream>
+#include <string>
+#include <msp/core/except.h>
+#include "fmt.h"
+
+namespace Msp {
+
+/**
+Thrown for errors in lexical conversions
+*/
+class LexicalError: public Exception
+{
+public:
+       LexicalError(const std::string &w_): Exception(w_) { }
+};
+
+
+/**
+Helper class for lexical_cast to facilitate operator overloading.
+*/
+class LexicalConverter
+{
+private:
+       Fmt fmt;
+       std::string buf;
+
+public:
+       LexicalConverter(const Fmt &f): fmt(f) { }
+       LexicalConverter(const std::string &s, const Fmt &f): fmt(f), buf(s) { }
+
+       const Fmt &get_fmt() const { return fmt; }
+       const std::string &get() const { return buf; }
+       void result(const std::string &);
+};
+
+
+void operator<<(LexicalConverter &, char);
+void operator<<(LexicalConverter &, signed char);
+void operator<<(LexicalConverter &, short);
+void operator<<(LexicalConverter &, int);
+void operator<<(LexicalConverter &, long);
+void operator<<(LexicalConverter &, unsigned char);
+void operator<<(LexicalConverter &, unsigned short);
+void operator<<(LexicalConverter &, unsigned);
+void operator<<(LexicalConverter &, unsigned long);
+#ifdef __GNUC__
+void operator<<(LexicalConverter &, long long);
+void operator<<(LexicalConverter &, unsigned long long);
+#endif
+void operator<<(LexicalConverter &, bool);
+void operator<<(LexicalConverter &, float);
+void operator<<(LexicalConverter &, double);
+void operator<<(LexicalConverter &, long double);
+void operator<<(LexicalConverter &, const std::string &);
+void operator<<(LexicalConverter &, const char *);
+void operator<<(LexicalConverter &, const void *);
+
+void operator>>(const LexicalConverter &, char &);
+void operator>>(const LexicalConverter &, signed char &);
+void operator>>(const LexicalConverter &, short &);
+void operator>>(const LexicalConverter &, int &);
+void operator>>(const LexicalConverter &, long &);
+void operator>>(const LexicalConverter &, unsigned char &);
+void operator>>(const LexicalConverter &, unsigned short &);
+void operator>>(const LexicalConverter &, unsigned int &);
+void operator>>(const LexicalConverter &, unsigned long &);
+#ifdef __GNUC__
+void operator>>(const LexicalConverter &, long long &);
+void operator>>(const LexicalConverter &, unsigned long long &);
+#endif
+void operator>>(const LexicalConverter &, bool &);
+void operator>>(const LexicalConverter &, float &);
+void operator>>(const LexicalConverter &, double &);
+void operator>>(const LexicalConverter &, long double &);
+void operator>>(const LexicalConverter &, std::string &);
+
+// Generic operators using stringstream
+
+template<typename T>
+void operator<<(LexicalConverter &c, const T &v)
+{
+       std::ostringstream ss;
+       ss<<c.get_fmt()<<v;
+       c.result(ss.str());
+}
+
+template<typename T>
+void operator>>(const LexicalConverter &c, T &v)
+{
+       std::istringstream ss(c.get());
+       ss.setf(std::ios_base::fmtflags(0), std::ios_base::skipws);
+       ss>>v;
+       if(ss.fail() || !ss.eof())
+               throw LexicalError("Conversion failure");
+}
+
+// The main interface to the lexical conversion machinery
+
+template<typename T>
+inline T lexical_cast(const std::string &s, const Fmt &f = Fmt())
+{
+       LexicalConverter conv(s, f);
+       T result;
+       conv>>result;
+       return result;
+}
+
+template<typename T>
+inline std::string lexical_cast(const T &v, const Fmt &f = Fmt())
+{
+       LexicalConverter conv(f);
+       conv<<v;
+       return conv.get();
+}
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/regex.cpp b/source/strings/regex.cpp
new file mode 100644 (file)
index 0000000..f45c820
--- /dev/null
@@ -0,0 +1,589 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <stack>
+#include <limits>
+#include <msp/core/except.h>
+#include "formatter.h"
+#include "regex.h"
+
+using namespace std;
+
+namespace {
+
+/** Writes an integer to a Regex code string, in little-endian order. */
+template<typename T>
+void write_int(T n, Msp::Regex::Code &code)
+{
+       for(unsigned i=0; i<sizeof(T); ++i)
+               code += (n>>i*8)&0xFF;
+}
+
+/** Reads an integer from a Regex code stream, in little-endian order. */
+template<typename T>
+T read_int(Msp::Regex::Code::const_iterator &c)
+{
+       T result = 0;
+       for(unsigned i=0; i<sizeof(T); ++i)
+               result += static_cast<unsigned char>(*c++)<<i*8;
+       return result;
+}
+
+}
+
+
+namespace Msp {
+
+Regex::Regex(const string &expr)
+{
+       n_groups = 0;
+       string::const_iterator iter = expr.begin();
+       code = compile(expr, iter, n_groups, false);
+       ++n_groups;
+}
+
+Regex::Code Regex::compile(const string &expr, string::const_iterator &iter, unsigned &group, bool branch)
+{
+       bool has_branches = false;
+       unsigned level = 0;
+       bool escape = false;
+       unsigned bracket = 0;
+       string::const_iterator end;
+       for(end=iter; end!=expr.end(); ++end)
+       {
+               if(escape)
+                       escape = false;
+               else if(bracket)
+               {
+                       if(bracket==3 && *end==']')
+                               bracket = 0;
+                       else if(bracket==1 && *end=='^')
+                               bracket = 2;
+                       else
+                               bracket = 3;
+               }
+               else if(*end=='\\')
+                       escape = true;
+               else if(*end=='(')
+                       ++level;
+               else if(*end==')')
+               {
+                       if(level==0)
+                       {
+                               if(group==0)
+                                       throw InvalidParameterValue("Unexpected )");
+                               else
+                                       break;
+                       }
+                       --level;
+               }
+               else if(*end=='|' && level==0)
+               {
+                       if(branch)
+                               break;
+                       else
+                               has_branches = true;
+               }
+               else if(*end=='[')
+                       bracket = 1;
+       }
+
+       if(level>0)
+               throw InvalidParameterValue("Unmatched (");
+
+       Code result;
+
+       unsigned this_group = group;
+       if(!branch)
+       {
+               result += GROUP_BEGIN;
+               write_int<Index>(this_group, result);
+       }
+
+       const unsigned jump_size = 1+sizeof(Offset);
+
+       if(!has_branches)
+       {
+               for(string::const_iterator i=iter; i!=end;)
+               {
+                       Code atom = parse_atom(expr, i, group);
+
+                       Count repeat_min = 1;
+                       Count repeat_max = 1;
+                       parse_repeat(i, repeat_min, repeat_max);
+
+                       for(unsigned j=0; j<repeat_min; ++j)
+                               result += atom;
+                       if(repeat_max==numeric_limits<Count>::max())
+                       {
+                               if(repeat_min==0)
+                               {
+                                       result += ND_JUMP;
+                                       write_int<Offset>(atom.size()+jump_size, result);
+                                       result += atom;
+                               }
+                               result += ND_JUMP;
+                               write_int<Offset>(-(atom.size()+jump_size), result);
+                       }
+                       else if(repeat_max>repeat_min)
+                       {
+                               for(unsigned j=repeat_min; j<repeat_max; ++j)
+                               {
+                                       result += ND_JUMP;
+                                       write_int<Offset>((repeat_max-j)*(atom.size()+jump_size)-jump_size, result);
+                                       result += atom;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               list<Code> branches;
+               for(string::const_iterator i=iter;;)
+               {
+                       branches.push_back(compile(expr, i, group, true));
+                       if(i==end)
+                               break;
+                       ++i;
+               }
+
+               unsigned n_branches = branches.size();
+
+               Offset offset = (n_branches-1)*jump_size+branches.front().size();
+               for(list<Code>::iterator i=++branches.begin(); i!=branches.end(); ++i)
+               {
+                       result += ND_JUMP;
+                       write_int<Offset>(offset, result);
+                       offset += i->size();
+               }
+
+               for(list<Code>::iterator i=branches.begin(); i!=branches.end();)
+               {
+                       result += *i;
+                       offset -= i->size()+jump_size;
+                       ++i;
+                       if(i!=branches.end())
+                       {
+                               result += JUMP;
+                               write_int<Offset>(offset, result);
+                       }
+               }
+       }
+
+       if(!branch)
+       {
+               result += GROUP_END;
+               write_int<Index>(this_group, result);
+       }
+
+       iter = end;
+
+       return result;
+}
+
+Regex::Code Regex::parse_atom(const string &expr, string::const_iterator &i, unsigned &group)
+{
+       Code result;
+
+       if(i==expr.end())
+               return result;
+
+       bool flag = false;
+       if(*i=='\\')
+       {
+               if(++i==expr.end())
+                       throw InvalidParameterValue("Stray backslash");
+               flag = true;
+       }
+
+       if(!flag)
+       {
+               if(*i=='*' || *i=='{' || *i=='}' || *i=='+' || *i=='?' || *i=='|' || *i==')')
+                       throw InvalidParameterValue("Invalid atom");
+               else if(*i=='[')
+                       return parse_brackets(expr, i);
+               else if(*i=='.')
+                       result += MATCH_ANY;
+               else if(*i=='^')
+                       result += MATCH_BEGIN;
+               else if(*i=='$')
+                       result += MATCH_END;
+               else if(*i=='(')
+               {
+                       ++group;
+                       result = compile(expr, ++i, group, false);
+               }
+               else
+                       flag = true;
+       }
+
+       if(flag)
+       {
+               result += MATCH_CHAR;
+               result += *i;
+       }
+
+       ++i;
+
+       return result;
+}
+
+bool Regex::parse_repeat(string::const_iterator &i, Count &rmin, Count &rmax)
+{
+       if(*i!='*' && *i!='+' && *i!='?' && *i!='{')
+               return false;
+
+       if(*i=='*' || *i=='+')
+               rmax = numeric_limits<Count>::max();
+       if(*i=='*' || *i=='?')
+               rmin = 0;
+       if(*i=='{')
+       {
+               rmin = 0;
+               for(++i; isdigit(*i); ++i)
+                       rmin = rmin*10+(*i-'0');
+
+               if(*i==',')
+               {
+                       ++i;
+                       if(*i!='}')
+                       {
+                               rmax = 0;
+                               for(; isdigit(*i); ++i)
+                                       rmax = rmax*10+(*i-'0');
+                               if(rmax<rmin)
+                                       throw InvalidParameterValue("Invalid bound");
+                       }
+                       else
+                               rmax = numeric_limits<Count>::max();
+               }
+               else
+                       rmax = rmin;
+               if(*i!='}')
+                       throw InvalidParameterValue("Invalid bound");
+       }
+
+       ++i;
+
+       return true;
+}
+
+Regex::Code Regex::parse_brackets(const string &str, string::const_iterator &iter)
+{
+       Code result;
+
+       ++iter;
+       bool neg = false;
+       if(*iter=='^')
+       {
+               neg = true;
+               ++iter;
+       }
+
+       string::const_iterator end = iter;
+       for(; (end!=str.end() && (end==iter || *end!=']')); ++end) ;
+       if(end==str.end())
+               throw InvalidParameterValue("Unmatched '['");
+
+       unsigned char mask[32] = {0};
+       unsigned type = 0;
+       bool range = false;
+       unsigned char first=0, last = 0;
+       for(string::const_iterator i=iter; i!=end; ++i)
+       {
+               unsigned char c = *i;
+               if(range)
+               {
+                       last = c;
+                       for(unsigned j=first; j<=c; ++j)
+                               mask[j>>3] |= 1<<(j&7);
+                       range = false;
+                       if(type<2)
+                               type = 2;
+               }
+               else if(c=='-' && i!=iter && end-i>1)
+                       range = true;
+               else
+               {
+                       first = c;
+                       mask[c>>3] |= 1<<(c&7);
+                       if(type==0)
+                               type = 1;
+                       else
+                               type = 3;
+               }
+       }
+
+       if(neg)
+               result += NEGATE;
+
+       if(type==1)
+       {
+               result += MATCH_CHAR;
+               result += first;
+       }
+       else if(type==2)
+       {
+               result += MATCH_RANGE;
+               result += first;
+               result += last;
+       }
+       else
+       {
+               result += MATCH_MASK;
+               result.append(reinterpret_cast<char *>(mask), 32);
+       }
+
+       iter = end;
+       ++iter;
+
+       return result;
+}
+
+RegMatch Regex::match(const string &str) const
+{
+       RegMatch::GroupArray groups(n_groups);
+
+       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+               if(run(str, i, groups))
+                       return RegMatch(str, groups);
+
+       return RegMatch();
+}
+
+bool Regex::run(const string &str, const string::const_iterator &begin, RegMatch::GroupArray &groups) const
+{
+       bool result = false;
+       list<RunContext> ctx;
+       ctx.push_back(RunContext());
+       ctx.front().citer = code.begin();
+       ctx.front().groups.resize(groups.size());
+
+       for(string::const_iterator i=begin;;)
+       {
+               int c;
+               if(i!=str.end())
+                       c = static_cast<unsigned char>(*i);
+               else
+                       c = -1;
+
+               for(list<RunContext>::iterator j=ctx.begin(); j!=ctx.end();)
+               {
+                       bool terminate = false;
+                       bool negate_match = false;
+                       for(; j->citer!=code.end();)
+                       {
+                               Instruction instr = static_cast<Instruction>(*j->citer++);
+
+                               if(instr==NEGATE)
+                                       negate_match = true;
+                               else if(instr==JUMP)
+                               {
+                                       Offset offset = read_int<Offset>(j->citer);
+                                       j->citer += offset;
+                               }
+                               else if(instr==ND_JUMP)
+                               {
+                                       Offset offset = read_int<Offset>(j->citer);
+                                       ctx.push_back(*j);
+                                       ctx.back().citer += offset;
+                               }
+                               else if(instr==GROUP_BEGIN)
+                               {
+                                       Index n = read_int<Index>(j->citer);
+                                       if(!j->groups[n].match)
+                                               j->groups[n].begin = i-str.begin();
+                               }
+                               else if(instr==GROUP_END)
+                               {
+                                       Index n = read_int<Index>(j->citer);
+                                       if(!j->groups[n].match)
+                                       {
+                                               j->groups[n].match = true;
+                                               j->groups[n].end = i-str.begin();
+                                               j->groups[n].length = j->groups[n].end-j->groups[n].begin;
+                                       }
+
+                                       if(n==0)
+                                       {
+                                               result = true;
+                                               bool better = false;
+                                               for(unsigned k=0; (k<groups.size() && !better); ++k)
+                                               {
+                                                       better = group_compare(j->groups[k], groups[k]);
+                                                       if(group_compare(groups[k], j->groups[k]))
+                                                               break;
+                                               }
+                                               if(better)
+                                                       groups = j->groups;
+                                       }
+                               }
+                               else
+                               {
+                                       bool match_result = false;
+                                       bool input_consumed = false;
+                                       if(instr==MATCH_BEGIN)
+                                               match_result = (i==str.begin());
+                                       else if(instr==MATCH_END)
+                                               match_result = (i==str.end());
+                                       else if(instr==MATCH_CHAR)
+                                       {
+                                               match_result = (c==*j->citer++);
+                                               input_consumed = true;
+                                       }
+                                       else if(instr==MATCH_RANGE)
+                                       {
+                                               unsigned char first = *j->citer++;
+                                               unsigned char last = *j->citer++;
+                                               match_result = (c>=first && c<=last);
+                                               input_consumed = true;
+                                       }
+                                       else if(instr==MATCH_MASK)
+                                       {
+                                               if(c>=0 && c<=0xFF)
+                                               {
+                                                       unsigned char m = *(j->citer+(c>>3));
+                                                       match_result = m&(1<<(c&7));
+                                               }
+                                               input_consumed = true;
+                                               j->citer += 32;
+                                       }
+                                       else if(instr==MATCH_ANY)
+                                       {
+                                               match_result = true;
+                                               input_consumed = true;
+                                       }
+                                       else
+                                               throw Exception("Invalid instruction");
+
+                                       if(match_result==negate_match)
+                                               terminate = true;
+                                       negate_match = false;
+
+                                       if(input_consumed || terminate)
+                                               break;
+                               }
+                       }
+
+                       if(terminate || j->citer==code.end())
+                               j = ctx.erase(j);
+                       else
+                               ++j;
+               }
+
+               if(i==str.end() || ctx.empty())
+                       break;
+               ++i;
+       }
+
+       return result;
+}
+
+bool Regex::group_compare(const RegMatch::Group &g1, const RegMatch::Group &g2) const
+{
+       if(!g1.match)
+               return false;
+
+       // Any match is better than no match
+       if(!g2.match)
+               return true;
+
+       // Earlier match is better
+       if(g1.begin<g2.begin)
+               return true;
+       if(g2.begin>g2.begin)
+               return false;
+
+       // Longer match at same position is better
+       return g1.end>g2.end;
+}
+
+string Regex::disassemble() const
+{
+       ostringstream ss;
+
+       for(Code::const_iterator i=code.begin(); i!=code.end();)
+       {
+               Code::const_iterator j = i;
+               Offset offset = i-code.begin();
+               string decompiled = disassemble_instruction(i);
+               string bytes;
+               for(; j!=i; ++j)
+                       bytes += format(" %02X", static_cast<int>(*j)&0xFF);
+               ss<<Fmt("%3d")<<offset<<':'<<Fmt("%-9s")<<bytes;
+               if(bytes.size()>9)
+                       ss<<"\n"<<Fmt("%15s");
+               ss<<"  "<<decompiled<<'\n';
+       }
+
+       return ss.str();
+}
+
+string Regex::disassemble_instruction(Code::const_iterator &i) const
+{
+       Instruction instr = static_cast<Instruction>(*i++);
+
+       ostringstream result;
+       switch(instr)
+       {
+       case JUMP:
+               {
+                       Offset offset = read_int<Offset>(i);
+                       result<<"JUMP "<<Fmt("%+d")<<offset<<" ("<<Fmt("%d")<<i-code.begin()+offset<<')';
+               }
+               break;
+       case ND_JUMP:
+               {
+                       Offset offset = read_int<Offset>(i);
+                       result<<"ND_JUMP "<<Fmt("%+d")<<offset<<" ("<<Fmt("%d")<<i-code.begin()+offset<<')';
+               }
+               break;
+       case GROUP_BEGIN:
+               result<<"GROUP_BEGIN "<<read_int<Index>(i);
+               break;
+       case GROUP_END:
+               result<<"GROUP_END "<<read_int<Index>(i);
+               break;
+       case NEGATE:
+               result<<"NEGATE";
+               break;
+       case MATCH_BEGIN:
+               result<<"MATCH_BEGIN";
+               break;
+       case MATCH_END:
+               result<<"MATCH_END";
+               break;
+       case MATCH_CHAR:
+               {
+                       char c = *i++;
+                       result<<"MATCH_CHAR ";
+                       if(c>=0x20 && c<=0x7E)
+                               result<<'\''<<c<<'\'';
+                       else
+                               result<<(static_cast<int>(c)&0xFF);
+               }
+               break;
+       case MATCH_RANGE:
+               result<<"MATCH_RANGE "<<(static_cast<int>(*i++)&0xFF);
+               result<<'-'<<(static_cast<int>(*i++)&0xFF);
+               break;
+       case MATCH_MASK:
+               result<<"MATCH_MASK";
+               for(unsigned j=0; j<32; ++j)
+                       result<<' '<<Fmt("%02X")<<(static_cast<int>(*i++)&0xFF);
+               break;
+       case MATCH_ANY:
+               result<<"MATCH_ANY";
+               break;
+       default:
+               result<<"UNKNOWN "<<instr;
+       }
+
+       return result.str();
+}
+
+} // namespace Msp
diff --git a/source/strings/regex.h b/source/strings/regex.h
new file mode 100644 (file)
index 0000000..70f9ebb
--- /dev/null
@@ -0,0 +1,138 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+#ifndef MSP_STRINGS_REGEX_H_
+#define MSP_STRINGS_REGEX_H_
+
+#include <string>
+#include "regmatch.h"
+
+namespace Msp {
+
+/**
+This class provides regular expression matching.  It supports a subset of
+POSIX.2 extended regex syntax.  Character classes, equivalence classes and
+collating elements are not supported.  Refer to the regex(7) manpage for more
+details.
+
+A description of the internal workings of the class follows.  You may skip this
+if you are not a developer or otherwise interested.
+
+The core of this class is a virtual machine running a non-deterministic finite
+automaton (NFA).  The state of the automaton is represented by an iterator into
+the code.  Transitions between states are represented by instructions.
+Instructions may take multiple bytes, so a valid code iterator may not be a
+valid NFA state.
+
+The virtual machine may have any number of execution contexts at any one time.
+On every cycle, each context is advanced until an input-consuming instruction
+is encountered, keeping the input positions in sync with each other.  Execution
+continues as long as there's at least one context remaining.
+
+The GROUP_BEGIN and GROUP_END instructions record the begin and end offset of a
+match group, respectively.  The GROUP_END instruction also marks the group as
+successfully matched.  If the target group was already matched, these
+instructions do nothing.
+
+The JUMP instruction causes the execution iterator to be modified by an offset.
+
+The ND_JUMP instruction causes the execution context to be split in two.  One
+continues directly after the instruction and the other continues at an offset.
+
+The NEGATE instruction causes the result of the next match instruction to be
+negated.
+
+Match instructions compare the input against a condition.  If the match
+succeeds, execution continues at the next instruction.  If the match fails,
+execution of that context is terminated.
+
+The MATCH_BEGIN and MATCH_END instructions match the beginning and end of
+the input string, respectively.  They do not consume input.
+
+The MATCH_CHAR instruction consumes the input character and matches it against
+a single character.  Since regexes often match sequences of printable character,
+a match for a non-opcode character may be encoded as the character itself.
+
+The MATCH_RANGE instruction consumes the input character and matches it against
+an inclusive character range.
+
+The MATCH_MASK instruction consumes the input character and matches it against
+a bitmask.
+
+The MATCH_ANY instruction consumes the input character and always succeeds.
+*/
+class Regex
+{
+private:
+       typedef std::string Code;
+       typedef unsigned short Count;
+       typedef short Offset;
+       typedef unsigned short Index;
+
+       enum Instruction
+       {
+               FIRST_INSTRUCTION_ = 0,
+
+               JUMP,
+               ND_JUMP,
+
+               GROUP_BEGIN,
+               GROUP_END,
+
+               NEGATE,
+
+               MATCH_BEGIN,
+               MATCH_END,
+               MATCH_CHAR,
+               MATCH_RANGE,
+               MATCH_MASK,
+               MATCH_ANY,
+
+               LAST_INSTRUCTION_ = 31
+       };
+
+       struct RunContext
+       {
+               Code::const_iterator citer;
+               RegMatch::GroupArray groups;
+       };
+
+       Code code;
+       unsigned n_groups;
+
+public:
+       /** Constructs a new Regex object from a string representation. */
+       Regex(const std::string &expr);
+
+private:
+       /** Compiles a regular expression into NFA bytecode.  , 2011The iterator will be
+       advanced to the first unused character in the string. */
+       Code compile(const std::string &expr, std::string::const_iterator &iter, unsigned &group, bool branch);
+
+       Code parse_atom(const std::string &, std::string::const_iterator &i, unsigned &);
+       Code parse_brackets(const std::string &, std::string::const_iterator &);
+       bool parse_repeat(std::string::const_iterator &, Count &, Count &);
+
+public:
+       /** Matches the regex against a string.  Refer to RegMatch documentation for
+       more information on the resulting object. */
+       RegMatch match(const std::string &str) const;
+
+private:
+       bool run(const std::string &, const std::string::const_iterator &, RegMatch::GroupArray &) const;
+       bool group_compare(const RegMatch::Group &, const RegMatch::Group &) const;
+
+public:
+       /** Returns a disassembled representation of the NFA bytecode.  For debugging
+       purposes. */
+       std::string disassemble() const;
+private:
+       std::string disassemble_instruction(Code::const_iterator &) const;
+};
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/regmatch.cpp b/source/strings/regmatch.cpp
new file mode 100644 (file)
index 0000000..f81be1a
--- /dev/null
@@ -0,0 +1,33 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <msp/core/except.h>
+#include "regmatch.h"
+
+using namespace std;
+
+namespace Msp {
+
+RegMatch::RegMatch(const string &str, const GroupArray &g):
+       groups(g)
+{
+       for(GroupArray::iterator i=groups.begin(); i!=groups.end(); ++i)
+               if(i->match)
+               {
+                       i->length = i->end-i->begin;
+                       i->str = str.substr(i->begin, i->length);
+               }
+}
+
+const RegMatch::Group &RegMatch::group(unsigned i) const
+{
+       if(i>=groups.size())
+               throw InvalidParameterValue("Group index out of range");
+       return groups[i];
+}
+
+} // namespace Msp
diff --git a/source/strings/regmatch.h b/source/strings/regmatch.h
new file mode 100644 (file)
index 0000000..19cac11
--- /dev/null
@@ -0,0 +1,81 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2007 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_REGMATCH_H_
+#define MSP_STRINGS_REGMATCH_H_
+
+#include <string>
+#include <vector>
+
+namespace Msp {
+
+/**
+This class stores the result of a Regex being matched against a string.  If the
+match was successful, the RegMatch object evaluates to true.
+
+A RegMatch representing a successful match has one or more groups, indicating
+matching parts of the string.  The first group (with index 0) indicates the
+part matched by the whole regex.  Further groups, if present, indicate parts
+matched by subregexes.  These are ordered from left to right, by the opening
+parenthesis of the subregex.
+*/
+class RegMatch
+{
+public:
+       /**
+       A single subregex of the match.
+       */
+       struct Group
+       {
+               bool match;       //< Whether or not this group matched
+               unsigned begin;   //< First offset of the match
+               unsigned end;     //< One-past-last offset
+               unsigned length;  //< Length of the match (end-begin)
+               std::string str;  //< The part of the string that matched
+
+               Group(): match(false) { }
+               operator bool() const { return match; }
+       };
+
+       typedef std::vector<Group> GroupArray;
+
+private:
+       GroupArray groups;
+
+public:
+       /** Constructs a RegMatch representing a non-match. */
+       RegMatch() { }
+
+       /** Constructs a new RegMatch from a string and groups.  The length and str
+       members of each group are computed and need not be set.  Intended to be used
+       by the Regex class. */
+       RegMatch(const std::string &, const std::vector<Group> &);
+
+       /** Returns a reference to a single group in the match. */
+       const Group &group(unsigned) const;
+
+       /** Returns true if the RegMatch object represents a non-match. */
+       bool empty() const { return groups.empty(); }
+
+       /** Returns the number of groups in this match. */
+       unsigned size() const { return groups.size(); }
+
+       /** Returns the begin offset of the whole match. */
+       unsigned begin() const { return groups.empty() ? 0 : groups[0].begin; }
+
+       /** Returns the end offset of the whole match. */
+       unsigned end() const { return groups.empty() ? 0 : groups[0].end; }
+
+       /** Shorthand for the group() function. */
+       const Group &operator[](unsigned i) const { return group(i); }
+
+       operator bool() const { return !empty(); }
+};
+
+} // namespace Msp
+
+#endif
diff --git a/source/strings/utils.cpp b/source/strings/utils.cpp
new file mode 100644 (file)
index 0000000..5728332
--- /dev/null
@@ -0,0 +1,273 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#include <algorithm>
+#include <list>
+#include <msp/core/except.h>
+#include "utils.h"
+
+using namespace std;
+
+namespace {
+
+template<bool long_sep, bool allow_empty>
+vector<string> do_split(const string &str, const string &sep, int max_split)
+{
+       vector<string> result;
+
+       unsigned start = 0;
+       while(start<str.size())
+       {
+               unsigned end = long_sep ? str.find(sep, start) : str.find_first_of(sep, start);
+               if(end!=start || allow_empty)
+               {
+                       if(max_split>=0 && result.size()==static_cast<unsigned>(max_split))
+                       {
+                               result.push_back(str.substr(start));
+                               break;
+                       }
+                       else
+                               result.push_back(str.substr(start, end-start));
+               }
+
+               if(end>str.size())
+                       break;
+
+               start = end+(long_sep ? sep.size() : 1);
+
+               if(allow_empty && start==str.size())
+                       result.push_back(string());
+       }
+
+       return result;
+}
+
+bool check_str(const std::string &str, int (*pred)(int))
+{
+       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+               if(!pred(*i))
+                       return false;
+       return true;
+}
+
+}
+
+
+namespace Msp {
+
+int strcasecmp(const string &s1, const string &s2)
+{
+       string::const_iterator i1 = s1.begin();
+       string::const_iterator i2 = s2.begin();
+       for(; (i1!=s1.end() && i2!=s2.end()); ++i1, ++i2)
+       {
+               const char c1 = ::tolower(*i1);
+               const char c2 = ::tolower(*i2);
+               if(c1!=c2) return c1-c2;
+       }
+       if(i1!=s1.end()) return *i1;
+       if(i2!=s2.end()) return -*i2;
+       return 0;
+}
+
+string tolower(const string &str)
+{
+       string result(str);
+       transform(result.begin(), result.end(), result.begin(), ::tolower);
+       return result;
+}
+
+string toupper(const string &str)
+{
+       string result(str);
+       transform(result.begin(), result.end(), result.begin(), ::toupper);
+       return result;
+}
+
+bool isnumrc(const string &str)
+{
+       return check_str(str, isdigit);
+}
+
+bool isalpha(const string &str)
+{
+       return check_str(str, isalpha);
+}
+
+bool isalnum(const string &str)
+{
+       return check_str(str, isalnum);
+}
+
+vector<string> split(const string &str, const string &sep, int max_split)
+{
+       return do_split<false, false>(str, sep, max_split);
+}
+
+vector<string> split(const string &str, char sep, int max_split)
+{
+       return split(str, string(1, sep), max_split);
+}
+
+vector<string> split_long(const string &str, const string &sep, int max_split)
+{
+       return do_split<true, false>(str, sep, max_split);
+}
+
+vector<string> split_fields(const string &str, const string &sep, int max_split)
+{
+       return do_split<true, true>(str, sep, max_split);
+}
+
+vector<string> split_fields(const string &str, char sep, int max_split)
+{
+       return split_fields(str, string(1, sep), max_split);
+}
+
+string strip(const string &s)
+{
+       string result = s;
+       if(!result.erase(0, result.find_first_not_of(" \t\r\n")).empty())
+               result.erase(result.find_last_not_of(" \t\r\n")+1);
+       return result;
+}
+
+string c_unescape(const std::string &str)
+{
+       bool escape = false;
+       unsigned numeric_type = 0;
+       unsigned numeric_pos = 0;
+       unsigned numeric_value = 0;
+       string result;
+       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+       {
+               if(numeric_type==16)
+               {
+                       unsigned digit = 0;
+                       if(*i>='0' && *i<='9')
+                               digit = *i-'0';
+                       else if(*i>='a' && *i<='f')
+                               digit = *i-'a'+10;
+                       else if(*i>='A' && *i<='F')
+                               digit = *i-'A'+10;
+                       else
+                               throw InvalidParameterValue("Invalid hexadecimal digit");
+
+                       numeric_value = (numeric_value<<4 | digit);
+                       ++numeric_pos;
+                       if(numeric_pos==2)
+                       {
+                               result += numeric_value;
+                               numeric_type = 0;
+                       }
+               }
+               else if(numeric_type==8)
+               {
+                       unsigned digit = 0;
+                       if(*i>='0' && *i<='7')
+                               digit = *i-'0';
+                       else
+                               throw InvalidParameterValue("Invalid octal digit");
+
+                       numeric_value = (numeric_value<<3 | digit);
+                       ++numeric_pos;
+                       if(numeric_pos==3)
+                       {
+                               result += numeric_value;
+                               numeric_type = 0;
+                       }
+               }
+               else if(escape)
+               {
+                       if(*i=='x')
+                       {
+                               numeric_type = 16;
+                               numeric_pos = 0;
+                               numeric_value = 0;
+                       }
+                       else if(*i>='0' && *i<='3')
+                       {
+                               numeric_type = 8;
+                               numeric_pos = 1;
+                               numeric_value = *i-'0';
+                       }
+                       else if(*i=='n')
+                               result += '\n';
+                       else if(*i=='t')
+                               result += '\t';
+                       else if(*i=='r')
+                               result += '\r';
+                       else if(*i=='b')
+                               result += '\b';
+                       else if(*i=='v')
+                               result += '\v';
+                       else if(*i=='a')
+                               result += '\a';
+                       else if(*i=='f')
+                               result += '\f';
+                       else if(*i=='\"')
+                               result += '\"';
+                       else if(*i=='\'')
+                               result += '\'';
+                       else if(*i=='\\')
+                               result += '\\';
+                       else
+                               throw InvalidParameterValue("Invalid escape sequence");
+
+                       escape = false;
+               }
+               else if(*i=='\\')
+                       escape = true;
+               else
+                       result += *i;
+       }
+
+       if(escape)      
+               throw InvalidParameterValue("Stray backslash at end of string");
+
+       return result;
+}
+
+string c_escape(const string &str, bool escape_8bit)
+{
+       string result;
+
+       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+       {
+               if(*i=='\n')
+                       result += "\\n";
+               else if(*i=='\t')
+                       result += "\\t";
+               else if(*i=='\r')
+                       result += "\\r";
+               else if(*i=='\b')
+                       result += "\\b";
+               else if(*i=='\v')
+                       result += "\\v";
+               else if(*i=='\a')
+                       result += "\\a";
+               else if(*i=='\f')
+                       result += "\\f";
+               else if(*i=='\"')
+                       result += "\\\"";
+               else if(*i=='\'')
+                       result += "\\\'";
+               else if(*i=='\\')
+                       result += "\\\\";
+               else if(static_cast<unsigned char>(*i)<' ' || (escape_8bit && (*i&0x80)))
+               {
+                       char buf[4] = {'\\', '0'+((*i>>6)&3), '0'+((*i>>3)&7), '0'+(*i&7)};
+                       result.append(buf, 4);
+               }
+               else
+                       result += *i;
+       }
+
+       return result;
+}
+
+} // namespace Msp
diff --git a/source/strings/utils.h b/source/strings/utils.h
new file mode 100644 (file)
index 0000000..6e14591
--- /dev/null
@@ -0,0 +1,93 @@
+/* $Id$
+
+This file is part of libmspstrings
+Copyright © 2006-2008 Mikko Rasa
+Distributed under the LGPL
+*/
+
+#ifndef MSP_STRINGS_UTILS_H_
+#define MSP_STRINGS_UTILS_H_
+
+#include <string>
+#include <vector>
+
+namespace Msp {
+
+/** Compares two strings, ignoring upper/lower case.  Returns an integer less
+than, equal to or greater than zero depending on whether the first string
+lexicographically precedes, is equal to or follows the second one,
+respectively. */
+int strcasecmp(const std::string &s1, const std::string &s2);
+
+/** Converts a string to lower case. */
+std::string tolower(const std::string &);
+
+/** Converts a string to upper case. */
+std::string toupper(const std::string &);
+
+/** Checks whether a string consists of digits only. */
+bool isnumrc(const std::string &);
+
+/** Checks whether a string consists of alphabetic characters only. */
+bool isalpha(const std::string &);
+
+/** Checks whether a string consists of alphanumeric characters only. */
+bool isalnum(const std::string &);
+
+/* These are required to make the standard version work from inside the Msp
+namespace */
+using std::tolower;
+using std::toupper;
+using std::isalpha;
+using std::isalnum;
+
+/** Splits a string at occurrences of any of the characters in sep.  Default
+is to split at whitespace.  Two or more consecutive separator characters will
+be treated as a single separator.
+
+If max_split is non-negative, at most that many split will be performed, i.e.
+the resulting vector will contain at most max_split+1 elements. */
+std::vector<std::string> split(const std::string &str, const std::string &sep = " \t\r\n", int max_split = -1);
+
+/** Splits a string on occurrences of a single character. */
+std::vector<std::string> split(const std::string &str, char sep, int max_split = -1);
+
+/** Splits a string on occurrences of another string. */
+std::vector<std::string> split_long(const std::string &str, const std::string &sep, int max_split = -1);
+
+/** Splits a string on occurrences of another string.  Two consecutive
+separators will cause an empty string to be placed in the result. */
+std::vector<std::string> split_fields(const std::string &str, const std::string &sep, int max_split = -1);
+
+/** Splits a string on occurrences of a single character.  Two consecutive
+separators will cause an empty string to be placed in the result. */
+std::vector<std::string> split_fields(const std::string &str, char sep, int max_split = -1);
+
+/** Concatenates strings from an iterator range. */
+template<typename Iter>
+std::string join(Iter begin, Iter end, const std::string &sep = " ")
+{
+       std::string result;
+       for(Iter i=begin; i!=end; ++i)
+       {
+               if(i!=begin)
+                       result += sep;
+               result += *i;
+       }
+
+       return result;
+}
+
+/** Strips leading and trailing whitespace from a string. */
+std::string strip(const std::string &);
+
+/** Unescapes a string with C escape sequences. */
+std::string c_unescape(const std::string &str);
+
+/** Escapes any non-printable characters in a string with C escape sequences.
+Optionally, any characters with the high bit set can be escaped as well. */
+std::string c_escape(const std::string &str, bool escape_8bit = true);
+
+} // namespace Msp
+
+#endif
diff --git a/source/utf8.cpp b/source/utf8.cpp
deleted file mode 100644 (file)
index c7e1705..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "utf8.h"
-
-using namespace std;
-
-namespace Msp {
-namespace Codecs {
-
-void Utf8::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if(ch<0 || ch>0x10FFFF)
-               return error(ch, buf, "Can't express character in UTF-8");
-
-       unsigned bytes = 1;
-       if(ch>0xFFFF)
-               bytes = 4;
-       else if(ch>0x7FF)
-               bytes = 3;
-       else if(ch>0x7F)
-               bytes = 2;
-
-       if(bytes==1)
-               buf += ch;
-       else
-       {
-               char utf[4];
-
-               utf[0] = 0xFF<<(8-bytes) | ch>>(bytes*6-6);
-               for(unsigned j=bytes-1; j>0; --j)
-               {
-                       utf[j] = 0x80 | (ch&0x3F);
-                       ch >>= 6;
-               }
-
-               buf.append(utf, bytes);
-       }
-}
-
-void Utf8::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf.append("\357\277\275", 3);  // � U+FFFE Replacement Character
-}
-
-
-UnicodeChar Utf8::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       if((*i&0xC0)==0x80)
-       {
-               UnicodeChar result = error("UTF-8 tail byte found when expecting head");
-               ++i;
-               return result;
-       }
-       else if(*i&0x80)
-       {
-               unsigned bytes = 2;
-               unsigned mask = 0x20;
-               for(; *i&mask; mask>>=1)
-                       ++bytes;
-
-               string::const_iterator j = i;
-
-               UnicodeChar result = (*j++)&(mask-1);
-
-               unsigned k;
-               for(k=1; (k<bytes && j!=str.end() && (*j&0xC0)==0x80); ++k)
-                       result = (result<<6) | ((*j++)&0x3F);
-
-               if(k<bytes)
-                       result = error("Incomplete UTF-8 character");
-               else if(!(result>>(bytes*5-4)) || !(result>>7))
-                       result = error("Denormalized UTF-8 multibyte sequence");
-               else if(result>0x10FFFF || (result>=0xD800 && result<=0xDFFF))
-                       result = error("Invalid Unicode code point");
-
-               i = j;
-               return result;
-       }
-       else
-               return *i++;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/utf8.h b/source/utf8.h
deleted file mode 100644 (file)
index 0281b31..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_UTF8_H_
-#define MSP_STRINGS_UTF8_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Utf8: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "UTF-8"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif
diff --git a/source/utils.cpp b/source/utils.cpp
deleted file mode 100644 (file)
index 5728332..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include <algorithm>
-#include <list>
-#include <msp/core/except.h>
-#include "utils.h"
-
-using namespace std;
-
-namespace {
-
-template<bool long_sep, bool allow_empty>
-vector<string> do_split(const string &str, const string &sep, int max_split)
-{
-       vector<string> result;
-
-       unsigned start = 0;
-       while(start<str.size())
-       {
-               unsigned end = long_sep ? str.find(sep, start) : str.find_first_of(sep, start);
-               if(end!=start || allow_empty)
-               {
-                       if(max_split>=0 && result.size()==static_cast<unsigned>(max_split))
-                       {
-                               result.push_back(str.substr(start));
-                               break;
-                       }
-                       else
-                               result.push_back(str.substr(start, end-start));
-               }
-
-               if(end>str.size())
-                       break;
-
-               start = end+(long_sep ? sep.size() : 1);
-
-               if(allow_empty && start==str.size())
-                       result.push_back(string());
-       }
-
-       return result;
-}
-
-bool check_str(const std::string &str, int (*pred)(int))
-{
-       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
-               if(!pred(*i))
-                       return false;
-       return true;
-}
-
-}
-
-
-namespace Msp {
-
-int strcasecmp(const string &s1, const string &s2)
-{
-       string::const_iterator i1 = s1.begin();
-       string::const_iterator i2 = s2.begin();
-       for(; (i1!=s1.end() && i2!=s2.end()); ++i1, ++i2)
-       {
-               const char c1 = ::tolower(*i1);
-               const char c2 = ::tolower(*i2);
-               if(c1!=c2) return c1-c2;
-       }
-       if(i1!=s1.end()) return *i1;
-       if(i2!=s2.end()) return -*i2;
-       return 0;
-}
-
-string tolower(const string &str)
-{
-       string result(str);
-       transform(result.begin(), result.end(), result.begin(), ::tolower);
-       return result;
-}
-
-string toupper(const string &str)
-{
-       string result(str);
-       transform(result.begin(), result.end(), result.begin(), ::toupper);
-       return result;
-}
-
-bool isnumrc(const string &str)
-{
-       return check_str(str, isdigit);
-}
-
-bool isalpha(const string &str)
-{
-       return check_str(str, isalpha);
-}
-
-bool isalnum(const string &str)
-{
-       return check_str(str, isalnum);
-}
-
-vector<string> split(const string &str, const string &sep, int max_split)
-{
-       return do_split<false, false>(str, sep, max_split);
-}
-
-vector<string> split(const string &str, char sep, int max_split)
-{
-       return split(str, string(1, sep), max_split);
-}
-
-vector<string> split_long(const string &str, const string &sep, int max_split)
-{
-       return do_split<true, false>(str, sep, max_split);
-}
-
-vector<string> split_fields(const string &str, const string &sep, int max_split)
-{
-       return do_split<true, true>(str, sep, max_split);
-}
-
-vector<string> split_fields(const string &str, char sep, int max_split)
-{
-       return split_fields(str, string(1, sep), max_split);
-}
-
-string strip(const string &s)
-{
-       string result = s;
-       if(!result.erase(0, result.find_first_not_of(" \t\r\n")).empty())
-               result.erase(result.find_last_not_of(" \t\r\n")+1);
-       return result;
-}
-
-string c_unescape(const std::string &str)
-{
-       bool escape = false;
-       unsigned numeric_type = 0;
-       unsigned numeric_pos = 0;
-       unsigned numeric_value = 0;
-       string result;
-       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
-       {
-               if(numeric_type==16)
-               {
-                       unsigned digit = 0;
-                       if(*i>='0' && *i<='9')
-                               digit = *i-'0';
-                       else if(*i>='a' && *i<='f')
-                               digit = *i-'a'+10;
-                       else if(*i>='A' && *i<='F')
-                               digit = *i-'A'+10;
-                       else
-                               throw InvalidParameterValue("Invalid hexadecimal digit");
-
-                       numeric_value = (numeric_value<<4 | digit);
-                       ++numeric_pos;
-                       if(numeric_pos==2)
-                       {
-                               result += numeric_value;
-                               numeric_type = 0;
-                       }
-               }
-               else if(numeric_type==8)
-               {
-                       unsigned digit = 0;
-                       if(*i>='0' && *i<='7')
-                               digit = *i-'0';
-                       else
-                               throw InvalidParameterValue("Invalid octal digit");
-
-                       numeric_value = (numeric_value<<3 | digit);
-                       ++numeric_pos;
-                       if(numeric_pos==3)
-                       {
-                               result += numeric_value;
-                               numeric_type = 0;
-                       }
-               }
-               else if(escape)
-               {
-                       if(*i=='x')
-                       {
-                               numeric_type = 16;
-                               numeric_pos = 0;
-                               numeric_value = 0;
-                       }
-                       else if(*i>='0' && *i<='3')
-                       {
-                               numeric_type = 8;
-                               numeric_pos = 1;
-                               numeric_value = *i-'0';
-                       }
-                       else if(*i=='n')
-                               result += '\n';
-                       else if(*i=='t')
-                               result += '\t';
-                       else if(*i=='r')
-                               result += '\r';
-                       else if(*i=='b')
-                               result += '\b';
-                       else if(*i=='v')
-                               result += '\v';
-                       else if(*i=='a')
-                               result += '\a';
-                       else if(*i=='f')
-                               result += '\f';
-                       else if(*i=='\"')
-                               result += '\"';
-                       else if(*i=='\'')
-                               result += '\'';
-                       else if(*i=='\\')
-                               result += '\\';
-                       else
-                               throw InvalidParameterValue("Invalid escape sequence");
-
-                       escape = false;
-               }
-               else if(*i=='\\')
-                       escape = true;
-               else
-                       result += *i;
-       }
-
-       if(escape)      
-               throw InvalidParameterValue("Stray backslash at end of string");
-
-       return result;
-}
-
-string c_escape(const string &str, bool escape_8bit)
-{
-       string result;
-
-       for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
-       {
-               if(*i=='\n')
-                       result += "\\n";
-               else if(*i=='\t')
-                       result += "\\t";
-               else if(*i=='\r')
-                       result += "\\r";
-               else if(*i=='\b')
-                       result += "\\b";
-               else if(*i=='\v')
-                       result += "\\v";
-               else if(*i=='\a')
-                       result += "\\a";
-               else if(*i=='\f')
-                       result += "\\f";
-               else if(*i=='\"')
-                       result += "\\\"";
-               else if(*i=='\'')
-                       result += "\\\'";
-               else if(*i=='\\')
-                       result += "\\\\";
-               else if(static_cast<unsigned char>(*i)<' ' || (escape_8bit && (*i&0x80)))
-               {
-                       char buf[4] = {'\\', '0'+((*i>>6)&3), '0'+((*i>>3)&7), '0'+(*i&7)};
-                       result.append(buf, 4);
-               }
-               else
-                       result += *i;
-       }
-
-       return result;
-}
-
-} // namespace Msp
diff --git a/source/utils.h b/source/utils.h
deleted file mode 100644 (file)
index 6e14591..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2008 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_UTILS_H_
-#define MSP_STRINGS_UTILS_H_
-
-#include <string>
-#include <vector>
-
-namespace Msp {
-
-/** Compares two strings, ignoring upper/lower case.  Returns an integer less
-than, equal to or greater than zero depending on whether the first string
-lexicographically precedes, is equal to or follows the second one,
-respectively. */
-int strcasecmp(const std::string &s1, const std::string &s2);
-
-/** Converts a string to lower case. */
-std::string tolower(const std::string &);
-
-/** Converts a string to upper case. */
-std::string toupper(const std::string &);
-
-/** Checks whether a string consists of digits only. */
-bool isnumrc(const std::string &);
-
-/** Checks whether a string consists of alphabetic characters only. */
-bool isalpha(const std::string &);
-
-/** Checks whether a string consists of alphanumeric characters only. */
-bool isalnum(const std::string &);
-
-/* These are required to make the standard version work from inside the Msp
-namespace */
-using std::tolower;
-using std::toupper;
-using std::isalpha;
-using std::isalnum;
-
-/** Splits a string at occurrences of any of the characters in sep.  Default
-is to split at whitespace.  Two or more consecutive separator characters will
-be treated as a single separator.
-
-If max_split is non-negative, at most that many split will be performed, i.e.
-the resulting vector will contain at most max_split+1 elements. */
-std::vector<std::string> split(const std::string &str, const std::string &sep = " \t\r\n", int max_split = -1);
-
-/** Splits a string on occurrences of a single character. */
-std::vector<std::string> split(const std::string &str, char sep, int max_split = -1);
-
-/** Splits a string on occurrences of another string. */
-std::vector<std::string> split_long(const std::string &str, const std::string &sep, int max_split = -1);
-
-/** Splits a string on occurrences of another string.  Two consecutive
-separators will cause an empty string to be placed in the result. */
-std::vector<std::string> split_fields(const std::string &str, const std::string &sep, int max_split = -1);
-
-/** Splits a string on occurrences of a single character.  Two consecutive
-separators will cause an empty string to be placed in the result. */
-std::vector<std::string> split_fields(const std::string &str, char sep, int max_split = -1);
-
-/** Concatenates strings from an iterator range. */
-template<typename Iter>
-std::string join(Iter begin, Iter end, const std::string &sep = " ")
-{
-       std::string result;
-       for(Iter i=begin; i!=end; ++i)
-       {
-               if(i!=begin)
-                       result += sep;
-               result += *i;
-       }
-
-       return result;
-}
-
-/** Strips leading and trailing whitespace from a string. */
-std::string strip(const std::string &);
-
-/** Unescapes a string with C escape sequences. */
-std::string c_unescape(const std::string &str);
-
-/** Escapes any non-printable characters in a string with C escape sequences.
-Optionally, any characters with the high bit set can be escaped as well. */
-std::string c_escape(const std::string &str, bool escape_8bit = true);
-
-} // namespace Msp
-
-#endif
diff --git a/source/windows1252.cpp b/source/windows1252.cpp
deleted file mode 100644 (file)
index bbd6753..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#include "windows1252.h"
-
-using namespace std;
-
-namespace {
-
-unsigned short table[32]=
-{
-       0x20AC, 0,      0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
-       0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0,      0x017D, 0,
-       0,      0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
-       0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0,      0x017E, 0x0178
-};
-
-}
-
-
-namespace Msp {
-namespace Codecs {
-
-void Windows1252::Encoder::encode_char(UnicodeChar ch, string &buf)
-{
-       if((ch>=0 && ch<=0x7F) || (ch>=0xA0 && ch<=0xFF))
-               buf += ch;
-       else
-       {
-               for(unsigned i=0; i<32; ++i)
-                       if(table[i]==ch)
-                       {
-                               buf += ch;
-                               return;
-                       }
-
-               error(ch, buf, "Can't express character in Windows-1252");
-       }
-}
-
-void Windows1252::Encoder::transliterate(UnicodeChar, string &buf)
-{
-       buf += '?';
-}
-
-
-UnicodeChar Windows1252::Decoder::decode_char(const string &str, string::const_iterator &i)
-{
-       if(i==str.end())
-               return error("No input");
-
-       int ch = static_cast<unsigned char>(*i);
-       UnicodeChar result;
-       if(ch>=0x80 && ch<=0x9F)
-       {
-               result = table[ch-0x80];
-               if(result==0)
-                       result = error("Undefined Windows-1252 character");
-       }
-       else
-               result = ch;
-
-       ++i;
-       return result;
-}
-
-} // namespace Codecs
-} // namespace Msp
diff --git a/source/windows1252.h b/source/windows1252.h
deleted file mode 100644 (file)
index 47b2cf0..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $Id$
-
-This file is part of libmspstrings
-Copyright © 2006-2007 Mikko Rasa
-Distributed under the LGPL
-*/
-
-#ifndef MSP_STRINGS_WINDOWS1252_H_
-#define MSP_STRINGS_WINDOWS1252_H_
-
-#include "codec.h"
-
-namespace Msp {
-namespace Codecs {
-
-class Windows1252: public Codec
-{
-public:
-       class Encoder: public Codec::Encoder
-       {
-       public:
-               Encoder(ErrorMode em = THROW_ON_ERROR): Codec::Encoder(em) { }
-
-               virtual void encode_char(UnicodeChar, std::string &);
-       private:
-               virtual void transliterate(UnicodeChar, std::string &);
-       };
-
-       class Decoder: public Codec::Decoder
-       {
-       public:
-               Decoder(ErrorMode em = THROW_ON_ERROR): Codec::Decoder(em) { }
-
-               virtual UnicodeChar decode_char(const std::string &, std::string::const_iterator &);
-       };
-
-       virtual const char *get_name() const { return "Windows-1252"; }
-
-       virtual Encoder *create_encoder(ErrorMode em = THROW_ON_ERROR) const { return new Encoder(em); }
-       virtual Decoder *create_decoder(ErrorMode em = THROW_ON_ERROR) const { return new Decoder(em); }
-};
-
-} // namespace Codecs
-} // namespace Msp
-
-#endif