changeset 1715:039e19436f73

backporting
author bachmann
date Wed, 30 Mar 2011 08:11:35 +0000
parents 8b336ea39b7d
children b892d2903724
files make/tools/src/build/tools/charsetmapping/ASCII.java make/tools/src/build/tools/charsetmapping/AbstractStringBuilder.java make/tools/src/build/tools/charsetmapping/Appendable.java make/tools/src/build/tools/charsetmapping/Character.java make/tools/src/build/tools/charsetmapping/CharacterData.java make/tools/src/build/tools/charsetmapping/CharacterData00.java make/tools/src/build/tools/charsetmapping/CharacterData01.java make/tools/src/build/tools/charsetmapping/CharacterData02.java make/tools/src/build/tools/charsetmapping/CharacterData0E.java make/tools/src/build/tools/charsetmapping/CharacterDataLatin1.java make/tools/src/build/tools/charsetmapping/CharacterDataPrivateUse.java make/tools/src/build/tools/charsetmapping/CharacterDataUndefined.java make/tools/src/build/tools/charsetmapping/CharsetMapping.java make/tools/src/build/tools/charsetmapping/DoubleConsts.java make/tools/src/build/tools/charsetmapping/FloatingDecimal.java make/tools/src/build/tools/charsetmapping/FormatFlagsConversionMismatchException.java make/tools/src/build/tools/charsetmapping/Formattable.java make/tools/src/build/tools/charsetmapping/Formatter.java make/tools/src/build/tools/charsetmapping/FormatterClosedException.java make/tools/src/build/tools/charsetmapping/FpUtils.java make/tools/src/build/tools/charsetmapping/GenerateDBCS.java make/tools/src/build/tools/charsetmapping/GenerateEUC_TW.java make/tools/src/build/tools/charsetmapping/GenerateMapping.java make/tools/src/build/tools/charsetmapping/GenerateSBCS.java make/tools/src/build/tools/charsetmapping/IllegalFormatCodePointException.java make/tools/src/build/tools/charsetmapping/IllegalFormatConversionException.java make/tools/src/build/tools/charsetmapping/IllegalFormatException.java make/tools/src/build/tools/charsetmapping/IllegalFormatFlagsException.java make/tools/src/build/tools/charsetmapping/IllegalFormatPrecisionException.java make/tools/src/build/tools/charsetmapping/IllegalFormatWidthException.java make/tools/src/build/tools/charsetmapping/LRUCache.java make/tools/src/build/tools/charsetmapping/MatchResult.java make/tools/src/build/tools/charsetmapping/Matcher.java make/tools/src/build/tools/charsetmapping/MathContext.java make/tools/src/build/tools/charsetmapping/MissingFormatArgumentException.java make/tools/src/build/tools/charsetmapping/MissingFormatWidthException.java make/tools/src/build/tools/charsetmapping/Normalizer.java make/tools/src/build/tools/charsetmapping/NormalizerBase.java make/tools/src/build/tools/charsetmapping/NormalizerImpl.java make/tools/src/build/tools/charsetmapping/Pattern.java make/tools/src/build/tools/charsetmapping/Readable.java make/tools/src/build/tools/charsetmapping/RoundingMode.java make/tools/src/build/tools/charsetmapping/STNormalizer.java make/tools/src/build/tools/charsetmapping/Scanner.java make/tools/src/build/tools/charsetmapping/StringBuilder.java make/tools/src/build/tools/charsetmapping/UnknownFormatConversionException.java
diffstat 46 files changed, 32549 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/ASCII.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,274 @@
+/*
+ * Copyright 1999-2000 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+
+/**
+ * Utility class that implements the standard C ctype functionality.
+ *
+ * @author Hong Zhang
+ */
+
+final class ASCII {
+
+    static final int UPPER   = 0x00000100;
+
+    static final int LOWER   = 0x00000200;
+
+    static final int DIGIT   = 0x00000400;
+
+    static final int SPACE   = 0x00000800;
+
+    static final int PUNCT   = 0x00001000;
+
+    static final int CNTRL   = 0x00002000;
+
+    static final int BLANK   = 0x00004000;
+
+    static final int HEX     = 0x00008000;
+
+    static final int UNDER   = 0x00010000;
+
+    static final int ASCII   = 0x0000FF00;
+
+    static final int ALPHA   = (UPPER|LOWER);
+
+    static final int ALNUM   = (UPPER|LOWER|DIGIT);
+
+    static final int GRAPH   = (PUNCT|UPPER|LOWER|DIGIT);
+
+    static final int WORD    = (UPPER|LOWER|UNDER|DIGIT);
+
+    static final int XDIGIT  = (HEX);
+
+    private static final int[] ctype = new int[] {
+        CNTRL,                  /* 00 (NUL) */
+        CNTRL,                  /* 01 (SOH) */
+        CNTRL,                  /* 02 (STX) */
+        CNTRL,                  /* 03 (ETX) */
+        CNTRL,                  /* 04 (EOT) */
+        CNTRL,                  /* 05 (ENQ) */
+        CNTRL,                  /* 06 (ACK) */
+        CNTRL,                  /* 07 (BEL) */
+        CNTRL,                  /* 08 (BS)  */
+        SPACE+CNTRL+BLANK,      /* 09 (HT)  */
+        SPACE+CNTRL,            /* 0A (LF)  */
+        SPACE+CNTRL,            /* 0B (VT)  */
+        SPACE+CNTRL,            /* 0C (FF)  */
+        SPACE+CNTRL,            /* 0D (CR)  */
+        CNTRL,                  /* 0E (SI)  */
+        CNTRL,                  /* 0F (SO)  */
+        CNTRL,                  /* 10 (DLE) */
+        CNTRL,                  /* 11 (DC1) */
+        CNTRL,                  /* 12 (DC2) */
+        CNTRL,                  /* 13 (DC3) */
+        CNTRL,                  /* 14 (DC4) */
+        CNTRL,                  /* 15 (NAK) */
+        CNTRL,                  /* 16 (SYN) */
+        CNTRL,                  /* 17 (ETB) */
+        CNTRL,                  /* 18 (CAN) */
+        CNTRL,                  /* 19 (EM)  */
+        CNTRL,                  /* 1A (SUB) */
+        CNTRL,                  /* 1B (ESC) */
+        CNTRL,                  /* 1C (FS)  */
+        CNTRL,                  /* 1D (GS)  */
+        CNTRL,                  /* 1E (RS)  */
+        CNTRL,                  /* 1F (US)  */
+        SPACE+BLANK,            /* 20 SPACE */
+        PUNCT,                  /* 21 !     */
+        PUNCT,                  /* 22 "     */
+        PUNCT,                  /* 23 #     */
+        PUNCT,                  /* 24 $     */
+        PUNCT,                  /* 25 %     */
+        PUNCT,                  /* 26 &     */
+        PUNCT,                  /* 27 '     */
+        PUNCT,                  /* 28 (     */
+        PUNCT,                  /* 29 )     */
+        PUNCT,                  /* 2A *     */
+        PUNCT,                  /* 2B +     */
+        PUNCT,                  /* 2C ,     */
+        PUNCT,                  /* 2D -     */
+        PUNCT,                  /* 2E .     */
+        PUNCT,                  /* 2F /     */
+        DIGIT+HEX+0,            /* 30 0     */
+        DIGIT+HEX+1,            /* 31 1     */
+        DIGIT+HEX+2,            /* 32 2     */
+        DIGIT+HEX+3,            /* 33 3     */
+        DIGIT+HEX+4,            /* 34 4     */
+        DIGIT+HEX+5,            /* 35 5     */
+        DIGIT+HEX+6,            /* 36 6     */
+        DIGIT+HEX+7,            /* 37 7     */
+        DIGIT+HEX+8,            /* 38 8     */
+        DIGIT+HEX+9,            /* 39 9     */
+        PUNCT,                  /* 3A :     */
+        PUNCT,                  /* 3B ;     */
+        PUNCT,                  /* 3C <     */
+        PUNCT,                  /* 3D =     */
+        PUNCT,                  /* 3E >     */
+        PUNCT,                  /* 3F ?     */
+        PUNCT,                  /* 40 @     */
+        UPPER+HEX+10,           /* 41 A     */
+        UPPER+HEX+11,           /* 42 B     */
+        UPPER+HEX+12,           /* 43 C     */
+        UPPER+HEX+13,           /* 44 D     */
+        UPPER+HEX+14,           /* 45 E     */
+        UPPER+HEX+15,           /* 46 F     */
+        UPPER+16,               /* 47 G     */
+        UPPER+17,               /* 48 H     */
+        UPPER+18,               /* 49 I     */
+        UPPER+19,               /* 4A J     */
+        UPPER+20,               /* 4B K     */
+        UPPER+21,               /* 4C L     */
+        UPPER+22,               /* 4D M     */
+        UPPER+23,               /* 4E N     */
+        UPPER+24,               /* 4F O     */
+        UPPER+25,               /* 50 P     */
+        UPPER+26,               /* 51 Q     */
+        UPPER+27,               /* 52 R     */
+        UPPER+28,               /* 53 S     */
+        UPPER+29,               /* 54 T     */
+        UPPER+30,               /* 55 U     */
+        UPPER+31,               /* 56 V     */
+        UPPER+32,               /* 57 W     */
+        UPPER+33,               /* 58 X     */
+        UPPER+34,               /* 59 Y     */
+        UPPER+35,               /* 5A Z     */
+        PUNCT,                  /* 5B [     */
+        PUNCT,                  /* 5C \     */
+        PUNCT,                  /* 5D ]     */
+        PUNCT,                  /* 5E ^     */
+        PUNCT|UNDER,            /* 5F _     */
+        PUNCT,                  /* 60 `     */
+        LOWER+HEX+10,           /* 61 a     */
+        LOWER+HEX+11,           /* 62 b     */
+        LOWER+HEX+12,           /* 63 c     */
+        LOWER+HEX+13,           /* 64 d     */
+        LOWER+HEX+14,           /* 65 e     */
+        LOWER+HEX+15,           /* 66 f     */
+        LOWER+16,               /* 67 g     */
+        LOWER+17,               /* 68 h     */
+        LOWER+18,               /* 69 i     */
+        LOWER+19,               /* 6A j     */
+        LOWER+20,               /* 6B k     */
+        LOWER+21,               /* 6C l     */
+        LOWER+22,               /* 6D m     */
+        LOWER+23,               /* 6E n     */
+        LOWER+24,               /* 6F o     */
+        LOWER+25,               /* 70 p     */
+        LOWER+26,               /* 71 q     */
+        LOWER+27,               /* 72 r     */
+        LOWER+28,               /* 73 s     */
+        LOWER+29,               /* 74 t     */
+        LOWER+30,               /* 75 u     */
+        LOWER+31,               /* 76 v     */
+        LOWER+32,               /* 77 w     */
+        LOWER+33,               /* 78 x     */
+        LOWER+34,               /* 79 y     */
+        LOWER+35,               /* 7A z     */
+        PUNCT,                  /* 7B {     */
+        PUNCT,                  /* 7C |     */
+        PUNCT,                  /* 7D }     */
+        PUNCT,                  /* 7E ~     */
+        CNTRL,                  /* 7F (DEL) */
+    };
+
+    static int getType(int ch) {
+        return ((ch & 0xFFFFFF80) == 0 ? ctype[ch] : 0);
+    }
+
+    static boolean isType(int ch, int type) {
+        return (getType(ch) & type) != 0;
+    }
+
+    static boolean isAscii(int ch) {
+        return ((ch & 0xFFFFFF80) == 0);
+    }
+
+    static boolean isAlpha(int ch) {
+        return isType(ch, ALPHA);
+    }
+
+    static boolean isDigit(int ch) {
+        return ((ch-'0')|('9'-ch)) >= 0;
+    }
+
+    static boolean isAlnum(int ch) {
+        return isType(ch, ALNUM);
+    }
+
+    static boolean isGraph(int ch) {
+        return isType(ch, GRAPH);
+    }
+
+    static boolean isPrint(int ch) {
+        return ((ch-0x20)|(0x7E-ch)) >= 0;
+    }
+
+    static boolean isPunct(int ch) {
+        return isType(ch, PUNCT);
+    }
+
+    static boolean isSpace(int ch) {
+        return isType(ch, SPACE);
+    }
+
+    static boolean isHexDigit(int ch) {
+        return isType(ch, HEX);
+    }
+
+    static boolean isOctDigit(int ch) {
+        return ((ch-'0')|('7'-ch)) >= 0;
+    }
+
+    static boolean isCntrl(int ch) {
+        return isType(ch, CNTRL);
+    }
+
+    static boolean isLower(int ch) {
+        return ((ch-'a')|('z'-ch)) >= 0;
+    }
+
+    static boolean isUpper(int ch) {
+        return ((ch-'A')|('Z'-ch)) >= 0;
+    }
+
+    static boolean isWord(int ch) {
+        return isType(ch, WORD);
+    }
+
+    static int toDigit(int ch) {
+        return (ctype[ch & 0x7F] & 0x3F);
+    }
+
+    static int toLower(int ch) {
+        return isUpper(ch) ? (ch + 0x20) : ch;
+    }
+
+    static int toUpper(int ch) {
+        return isLower(ch) ? (ch - 0x20) : ch;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/AbstractStringBuilder.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,1999 @@
+/*
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+import java.util.Arrays;
+
+/**
+ * A mutable sequence of characters.
+ * <p>
+ * Implements a modifiable string. At any point in time it contains some
+ * particular sequence of characters, but the length and content of the
+ * sequence can be changed through certain method calls.
+ *
+ * @author      Michael McCloskey
+ * @since       1.5
+ */
+abstract class AbstractStringBuilder implements Appendable, CharSequence {
+    /**
+     * The value is used for character storage.
+     */
+    char[] value;
+
+    /**
+     * The count is the number of characters used.
+     */
+    int count;
+
+    /**
+     * This no-arg constructor is necessary for serialization of subclasses.
+     */
+    AbstractStringBuilder() {
+    }
+
+    /**
+     * Creates an AbstractStringBuilder of the specified capacity.
+     */
+    AbstractStringBuilder(int capacity) {
+        value = new char[capacity];
+    }
+
+    /**
+     * Returns the length (character count).
+     *
+     * @return  the length of the sequence of characters currently
+     *          represented by this object
+     */
+    public int length() {
+        return count;
+    }
+
+    /**
+     * Returns the current capacity. The capacity is the amount of storage
+     * available for newly inserted characters, beyond which an allocation
+     * will occur.
+     *
+     * @return  the current capacity
+     */
+    public int capacity() {
+        return value.length;
+    }
+
+    /**
+     * Ensures that the capacity is at least equal to the specified minimum.
+     * If the current capacity is less than the argument, then a new internal
+     * array is allocated with greater capacity. The new capacity is the
+     * larger of:
+     * <ul>
+     * <li>The <code>minimumCapacity</code> argument.
+     * <li>Twice the old capacity, plus <code>2</code>.
+     * </ul>
+     * If the <code>minimumCapacity</code> argument is nonpositive, this
+     * method takes no action and simply returns.
+     *
+     * @param   minimumCapacity   the minimum desired capacity.
+     */
+    public void ensureCapacity(int minimumCapacity) {
+        if (minimumCapacity > value.length) {
+            expandCapacity(minimumCapacity);
+        }
+    }
+
+    /**
+     * This implements the expansion semantics of ensureCapacity with no
+     * size check or synchronization.
+     */
+    void expandCapacity(int minimumCapacity) {
+        int newCapacity = (value.length + 1) * 2;
+        if (newCapacity < 0) {
+            newCapacity = Integer.MAX_VALUE;
+        } else if (minimumCapacity > newCapacity) {
+            newCapacity = minimumCapacity;
+        }
+        value = copyOf(value, newCapacity);
+    }
+    
+    public static char[] copyOf(char[] original, int newLength) {
+    	char[] copy = new char[newLength];
+    	System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
+    	return copy;
+    }
+
+    /**
+     * Attempts to reduce storage used for the character sequence.
+     * If the buffer is larger than necessary to hold its current sequence of
+     * characters, then it may be resized to become more space efficient.
+     * Calling this method may, but is not required to, affect the value
+     * returned by a subsequent call to the {@link #capacity()} method.
+     */
+    public void trimToSize() {
+        if (count < value.length) {
+            value = copyOf(value, count);
+        }
+    }
+
+    /**
+     * Sets the length of the character sequence.
+     * The sequence is changed to a new character sequence
+     * whose length is specified by the argument. For every nonnegative
+     * index <i>k</i> less than <code>newLength</code>, the character at
+     * index <i>k</i> in the new character sequence is the same as the
+     * character at index <i>k</i> in the old sequence if <i>k</i> is less
+     * than the length of the old character sequence; otherwise, it is the
+     * null character <code>'&#92;u0000'</code>.
+     *
+     * In other words, if the <code>newLength</code> argument is less than
+     * the current length, the length is changed to the specified length.
+     * <p>
+     * If the <code>newLength</code> argument is greater than or equal
+     * to the current length, sufficient null characters
+     * (<code>'&#92;u0000'</code>) are appended so that
+     * length becomes the <code>newLength</code> argument.
+     * <p>
+     * The <code>newLength</code> argument must be greater than or equal
+     * to <code>0</code>.
+     *
+     * @param      newLength   the new length
+     * @throws     IndexOutOfBoundsException  if the
+     *               <code>newLength</code> argument is negative.
+     */
+    public void setLength(int newLength) {
+        if (newLength < 0)
+            throw new StringIndexOutOfBoundsException(newLength);
+        if (newLength > value.length)
+            expandCapacity(newLength);
+
+        if (count < newLength) {
+            for (; count < newLength; count++)
+                value[count] = '\0';
+        } else {
+            count = newLength;
+        }
+    }
+
+    /**
+     * Returns the <code>char</code> value in this sequence at the specified index.
+     * The first <code>char</code> value is at index <code>0</code>, the next at index
+     * <code>1</code>, and so on, as in array indexing.
+     * <p>
+     * The index argument must be greater than or equal to
+     * <code>0</code>, and less than the length of this sequence.
+     *
+     * <p>If the <code>char</code> value specified by the index is a
+     * <a href="Character.html#unicode">surrogate</a>, the surrogate
+     * value is returned.
+     *
+     * @param      index   the index of the desired <code>char</code> value.
+     * @return     the <code>char</code> value at the specified index.
+     * @throws     IndexOutOfBoundsException  if <code>index</code> is
+     *             negative or greater than or equal to <code>length()</code>.
+     */
+    public char charAt(int index) {
+        if ((index < 0) || (index >= count))
+            throw new StringIndexOutOfBoundsException(index);
+        return value[index];
+    }
+
+    /**
+     * Returns the character (Unicode code point) at the specified
+     * index. The index refers to <code>char</code> values
+     * (Unicode code units) and ranges from <code>0</code> to
+     * {@link #length()}<code> - 1</code>.
+     *
+     * <p> If the <code>char</code> value specified at the given index
+     * is in the high-surrogate range, the following index is less
+     * than the length of this sequence, and the
+     * <code>char</code> value at the following index is in the
+     * low-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at the given index is returned.
+     *
+     * @param      index the index to the <code>char</code> values
+     * @return     the code point value of the character at the
+     *             <code>index</code>
+     * @exception  IndexOutOfBoundsException  if the <code>index</code>
+     *             argument is negative or not less than the length of this
+     *             sequence.
+     */
+    public int codePointAt(int index) {
+        if ((index < 0) || (index >= count)) {
+            throw new StringIndexOutOfBoundsException(index);
+        }
+        return codePointAt(value, index);
+    }
+
+    /**
+     * Returns the code point at the given index of the
+     * <code>CharSequence</code>. If the <code>char</code> value at
+     * the given index in the <code>CharSequence</code> is in the
+     * high-surrogate range, the following index is less than the
+     * length of the <code>CharSequence</code>, and the
+     * <code>char</code> value at the following index is in the
+     * low-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at the given index is returned.
+     *
+     * @param seq a sequence of <code>char</code> values (Unicode code
+     * units)
+     * @param index the index to the <code>char</code> values (Unicode
+     * code units) in <code>seq</code> to be converted
+     * @return the Unicode code point at the given index
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if the value
+     * <code>index</code> is negative or not less than
+     * {@link CharSequence#length() seq.length()}.
+     * @since  1.5
+     */
+    public static int codePointAt(char[] seq, int index) {
+        char c1 = seq[index++];
+        if (isHighSurrogate(c1)) {
+            if (index < seq.length) {
+                char c2 = seq[index];
+                if (isLowSurrogate(c2)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c1;
+    }
+
+    /**
+     * Converts the specified surrogate pair to its supplementary code
+     * point value. This method does not validate the specified
+     * surrogate pair. The caller must validate it using {@link
+     * #isSurrogatePair(char, char) isSurrogatePair} if necessary.
+     *
+     * @param  high the high-surrogate code unit
+     * @param  low the low-surrogate code unit
+     * @return the supplementary code point composed from the
+     *         specified surrogate pair.
+     * @since  1.5
+     */
+    public static int toCodePoint(char high, char low) {
+        // Optimized form of:
+        // return ((high - MIN_HIGH_SURROGATE) << 10)
+        //         + (low - MIN_LOW_SURROGATE)
+        //         + MIN_SUPPLEMENTARY_CODE_POINT;
+        return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
+                                       - (MIN_HIGH_SURROGATE << 10)
+                                       - MIN_LOW_SURROGATE);
+    }
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uD800'</code>.
+     * A high-surrogate is also known as a <i>leading-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_HIGH_SURROGATE = '\uD800';
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDBFF'</code>.
+     * A high-surrogate is also known as a <i>leading-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_HIGH_SURROGATE = '\uDBFF';
+
+    /**
+     * Determines if the given {@code char} value is a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * (also known as <i>leading-surrogate code unit</i>).
+     *
+     * <p>Such values do not represent characters by themselves,
+     * but are used in the representation of
+     * <a href="#supplementary">supplementary characters</a>
+     * in the UTF-16 encoding.
+     *
+     * @param  ch the {@code char} value to be tested.
+     * @return {@code true} if the {@code char} value is between
+     *         {@link #MIN_HIGH_SURROGATE} and
+     *         {@link #MAX_HIGH_SURROGATE} inclusive;
+     *         {@code false} otherwise.
+     * @see    #isLowSurrogate(char)
+     * @see    Character.UnicodeBlock#of(int)
+     * @since  1.5
+     */
+    public static boolean isHighSurrogate(char ch) {
+        return ch >= MIN_HIGH_SURROGATE && ch <= MAX_HIGH_SURROGATE;
+    }
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDC00'</code>.
+     * A low-surrogate is also known as a <i>trailing-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_LOW_SURROGATE  = '\uDC00';
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDFFF'</code>.
+     * A low-surrogate is also known as a <i>trailing-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_LOW_SURROGATE  = '\uDFFF';
+
+    /**
+     * Determines if the given {@code char} value is a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * (also known as <i>trailing-surrogate code unit</i>).
+     *
+     * <p>Such values do not represent characters by themselves,
+     * but are used in the representation of
+     * <a href="#supplementary">supplementary characters</a>
+     * in the UTF-16 encoding.
+     *
+     * @param  ch the {@code char} value to be tested.
+     * @return {@code true} if the {@code char} value is between
+     *         {@link #MIN_LOW_SURROGATE} and
+     *         {@link #MAX_LOW_SURROGATE} inclusive;
+     *         {@code false} otherwise.
+     * @see    #isHighSurrogate(char)
+     * @since  1.5
+     */
+    public static boolean isLowSurrogate(char ch) {
+        return ch >= MIN_LOW_SURROGATE && ch <= MAX_LOW_SURROGATE;
+    }
+
+    /**
+     * The minimum value of a Unicode surrogate code unit in the
+     * UTF-16 encoding, constant <code>'&#92;uD800'</code>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_SURROGATE = MIN_HIGH_SURROGATE;
+
+    /**
+     * The maximum value of a Unicode surrogate code unit in the
+     * UTF-16 encoding, constant <code>'&#92;uDFFF'</code>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_SURROGATE = MAX_LOW_SURROGATE;
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#supplementary_code_point">
+     * Unicode supplementary code point</a>, constant {@code U+10000}.
+     *
+     * @since 1.5
+     */
+    public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point</a>, constant {@code U+0000}.
+     *
+     * @since 1.5
+     */
+    public static final int MIN_CODE_POINT = 0x000000;
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point</a>, constant {@code U+10FFFF}.
+     *
+     * @since 1.5
+     */
+    public static final int MAX_CODE_POINT = 0X10FFFF;
+
+
+    /**
+     * Returns the character (Unicode code point) before the specified
+     * index. The index refers to <code>char</code> values
+     * (Unicode code units) and ranges from <code>1</code> to {@link
+     * #length()}.
+     *
+     * <p> If the <code>char</code> value at <code>(index - 1)</code>
+     * is in the low-surrogate range, <code>(index - 2)</code> is not
+     * negative, and the <code>char</code> value at <code>(index -
+     * 2)</code> is in the high-surrogate range, then the
+     * supplementary code point value of the surrogate pair is
+     * returned. If the <code>char</code> value at <code>index -
+     * 1</code> is an unpaired low-surrogate or a high-surrogate, the
+     * surrogate value is returned.
+     *
+     * @param     index the index following the code point that should be returned
+     * @return    the Unicode code point value before the given index.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     *            argument is less than 1 or greater than the length
+     *            of this sequence.
+     */
+    public int codePointBefore(int index) {
+        int i = index - 1;
+        if ((i < 0) || (i >= count)) {
+            throw new StringIndexOutOfBoundsException(index);
+        }
+        return codePointBefore(value, index);
+    }
+    
+        /**
+     * Returns the code point preceding the given index of the
+     * <code>CharSequence</code>. If the <code>char</code> value at
+     * <code>(index - 1)</code> in the <code>CharSequence</code> is in
+     * the low-surrogate range, <code>(index - 2)</code> is not
+     * negative, and the <code>char</code> value at <code>(index -
+     * 2)</code> in the <code>CharSequence</code> is in the
+     * high-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at <code>(index - 1)</code> is
+     * returned.
+     *
+     * @param seq the <code>CharSequence</code> instance
+     * @param index the index following the code point that should be returned
+     * @return the Unicode code point value before the given index.
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     * argument is less than 1 or greater than {@link
+     * CharSequence#length() seq.length()}.
+     * @since  1.5
+     */
+    public static int codePointBefore(char[] seq, int index) {
+        char c2 = seq[--index];
+        if (isLowSurrogate(c2)) {
+            if (index > 0) {
+                char c1 = seq[--index];
+                if (isHighSurrogate(c1)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c2;
+    }
+
+    /**
+     * Returns the number of Unicode code points in the specified text
+     * range of this sequence. The text range begins at the specified
+     * <code>beginIndex</code> and extends to the <code>char</code> at
+     * index <code>endIndex - 1</code>. Thus the length (in
+     * <code>char</code>s) of the text range is
+     * <code>endIndex-beginIndex</code>. Unpaired surrogates within
+     * this sequence count as one code point each.
+     *
+     * @param beginIndex the index to the first <code>char</code> of
+     * the text range.
+     * @param endIndex the index after the last <code>char</code> of
+     * the text range.
+     * @return the number of Unicode code points in the specified text
+     * range
+     * @exception IndexOutOfBoundsException if the
+     * <code>beginIndex</code> is negative, or <code>endIndex</code>
+     * is larger than the length of this sequence, or
+     * <code>beginIndex</code> is larger than <code>endIndex</code>.
+     */
+    public int codePointCount(int beginIndex, int endIndex) {
+        if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) {
+            throw new IndexOutOfBoundsException();
+        }
+        return codePointCountImpl(value, beginIndex, endIndex-beginIndex);
+    }
+
+    static int codePointCountImpl(char[] a, int offset, int count) {
+        int endIndex = offset + count;
+        int n = 0;
+        for (int i = offset; i < endIndex; ) {
+            n++;
+            if (isHighSurrogate(a[i++])) {
+                if (i < endIndex && isLowSurrogate(a[i])) {
+                    i++;
+                }
+            }
+        }
+        return n;
+    }
+
+    /**
+     * Returns the index within this sequence that is offset from the
+     * given <code>index</code> by <code>codePointOffset</code> code
+     * points. Unpaired surrogates within the text range given by
+     * <code>index</code> and <code>codePointOffset</code> count as
+     * one code point each.
+     *
+     * @param index the index to be offset
+     * @param codePointOffset the offset in code points
+     * @return the index within this sequence
+     * @exception IndexOutOfBoundsException if <code>index</code>
+     *   is negative or larger then the length of this sequence,
+     *   or if <code>codePointOffset</code> is positive and the subsequence
+     *   starting with <code>index</code> has fewer than
+     *   <code>codePointOffset</code> code points,
+     *   or if <code>codePointOffset</code> is negative and the subsequence
+     *   before <code>index</code> has fewer than the absolute value of
+     *   <code>codePointOffset</code> code points.
+     */
+    public int offsetByCodePoints(int index, int codePointOffset) {
+        if (index < 0 || index > count) {
+            throw new IndexOutOfBoundsException();
+        }
+        return offsetByCodePointsImpl(value, 0, count,
+                                                index, codePointOffset);
+    }
+
+    static int offsetByCodePointsImpl(char[]a, int start, int count,
+                                      int index, int codePointOffset) {
+        int x = index;
+        if (codePointOffset >= 0) {
+            int limit = start + count;
+            int i;
+            for (i = 0; x < limit && i < codePointOffset; i++) {
+                if (isHighSurrogate(a[x++])) {
+                    if (x < limit && isLowSurrogate(a[x])) {
+                        x++;
+                    }
+                }
+            }
+            if (i < codePointOffset) {
+                throw new IndexOutOfBoundsException();
+            }
+        } else {
+            int i;
+            for (i = codePointOffset; x > start && i < 0; i++) {
+                if (isLowSurrogate(a[--x])) {
+                    if (x > start && isHighSurrogate(a[x-1])) {
+                        x--;
+                    }
+                }
+            }
+            if (i < 0) {
+                throw new IndexOutOfBoundsException();
+            }
+        }
+        return x;
+    }
+
+    /**
+     * Characters are copied from this sequence into the
+     * destination character array <code>dst</code>. The first character to
+     * be copied is at index <code>srcBegin</code>; the last character to
+     * be copied is at index <code>srcEnd-1</code>. The total number of
+     * characters to be copied is <code>srcEnd-srcBegin</code>. The
+     * characters are copied into the subarray of <code>dst</code> starting
+     * at index <code>dstBegin</code> and ending at index:
+     * <p><blockquote><pre>
+     * dstbegin + (srcEnd-srcBegin) - 1
+     * </pre></blockquote>
+     *
+     * @param      srcBegin   start copying at this offset.
+     * @param      srcEnd     stop copying at this offset.
+     * @param      dst        the array to copy the data into.
+     * @param      dstBegin   offset into <code>dst</code>.
+     * @throws     NullPointerException if <code>dst</code> is
+     *             <code>null</code>.
+     * @throws     IndexOutOfBoundsException  if any of the following is true:
+     *             <ul>
+     *             <li><code>srcBegin</code> is negative
+     *             <li><code>dstBegin</code> is negative
+     *             <li>the <code>srcBegin</code> argument is greater than
+     *             the <code>srcEnd</code> argument.
+     *             <li><code>srcEnd</code> is greater than
+     *             <code>this.length()</code>.
+     *             <li><code>dstBegin+srcEnd-srcBegin</code> is greater than
+     *             <code>dst.length</code>
+     *             </ul>
+     */
+    public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
+    {
+        if (srcBegin < 0)
+            throw new StringIndexOutOfBoundsException(srcBegin);
+        if ((srcEnd < 0) || (srcEnd > count))
+            throw new StringIndexOutOfBoundsException(srcEnd);
+        if (srcBegin > srcEnd)
+            throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");
+        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
+    }
+
+    /**
+     * The character at the specified index is set to <code>ch</code>. This
+     * sequence is altered to represent a new character sequence that is
+     * identical to the old character sequence, except that it contains the
+     * character <code>ch</code> at position <code>index</code>.
+     * <p>
+     * The index argument must be greater than or equal to
+     * <code>0</code>, and less than the length of this sequence.
+     *
+     * @param      index   the index of the character to modify.
+     * @param      ch      the new character.
+     * @throws     IndexOutOfBoundsException  if <code>index</code> is
+     *             negative or greater than or equal to <code>length()</code>.
+     */
+    public void setCharAt(int index, char ch) {
+        if ((index < 0) || (index >= count))
+            throw new StringIndexOutOfBoundsException(index);
+        value[index] = ch;
+    }
+
+    /**
+     * Appends the string representation of the {@code Object} argument.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(Object)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   obj   an {@code Object}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(Object obj) {
+        return append(String.valueOf(obj));
+    }
+
+    /**
+     * Appends the specified string to this character sequence.
+     * <p>
+     * The characters of the {@code String} argument are appended, in
+     * order, increasing the length of this sequence by the length of the
+     * argument. If {@code str} is {@code null}, then the four
+     * characters {@code "null"} are appended.
+     * <p>
+     * Let <i>n</i> be the length of this character sequence just prior to
+     * execution of the {@code append} method. Then the character at
+     * index <i>k</i> in the new character sequence is equal to the character
+     * at index <i>k</i> in the old character sequence, if <i>k</i> is less
+     * than <i>n</i>; otherwise, it is equal to the character at index
+     * <i>k-n</i> in the argument {@code str}.
+     *
+     * @param   str   a string.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(String str) {
+        if (str == null) str = "null";
+        int len = str.length();
+        if (len == 0) return this;
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        str.getChars(0, len, value, count);
+        count = newCount;
+        return this;
+    }
+
+    // Documentation in subclasses because of synchro difference
+    public AbstractStringBuilder append(StringBuffer sb) {
+        if (sb == null)
+            return append("null");
+        int len = sb.length();
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        sb.getChars(0, len, value, count);
+        count = newCount;
+        return this;
+    }
+
+    // Documentation in subclasses because of synchro difference
+    public AbstractStringBuilder append(CharSequence s) {
+        if (s == null)
+            s = "null";
+        if (s instanceof String)
+            return this.append((String)s);
+        if (s instanceof StringBuffer)
+            return this.append((StringBuffer)s);
+        return this.append(s, 0, s.length());
+    }
+
+    /**
+     * Appends a subsequence of the specified {@code CharSequence} to this
+     * sequence.
+     * <p>
+     * Characters of the argument {@code s}, starting at
+     * index {@code start}, are appended, in order, to the contents of
+     * this sequence up to the (exclusive) index {@code end}. The length
+     * of this sequence is increased by the value of {@code end - start}.
+     * <p>
+     * Let <i>n</i> be the length of this character sequence just prior to
+     * execution of the {@code append} method. Then the character at
+     * index <i>k</i> in this character sequence becomes equal to the
+     * character at index <i>k</i> in this sequence, if <i>k</i> is less than
+     * <i>n</i>; otherwise, it is equal to the character at index
+     * <i>k+start-n</i> in the argument {@code s}.
+     * <p>
+     * If {@code s} is {@code null}, then this method appends
+     * characters as if the s parameter was a sequence containing the four
+     * characters {@code "null"}.
+     *
+     * @param   s the sequence to append.
+     * @param   start   the starting index of the subsequence to be appended.
+     * @param   end     the end index of the subsequence to be appended.
+     * @return  a reference to this object.
+     * @throws     IndexOutOfBoundsException if
+     *             {@code start} is negative, or
+     *             {@code start} is greater than {@code end} or
+     *             {@code end} is greater than {@code s.length()}
+     */
+    public AbstractStringBuilder append(CharSequence s, int start, int end) {
+        if (s == null)
+            s = "null";
+        if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))
+            throw new IndexOutOfBoundsException(
+                "start " + start + ", end " + end + ", s.length() "
+                + s.length());
+        int len = end - start;
+        if (len == 0)
+            return this;
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        for (int i=start; i<end; i++)
+            value[count++] = s.charAt(i);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code char} array
+     * argument to this sequence.
+     * <p>
+     * The characters of the array argument are appended, in order, to
+     * the contents of this sequence. The length of this sequence
+     * increases by the length of the argument.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(char[])},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   str   the characters to be appended.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(char[] str) {
+        int newCount = count + str.length;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(str, 0, value, count, str.length);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Appends the string representation of a subarray of the
+     * {@code char} array argument to this sequence.
+     * <p>
+     * Characters of the {@code char} array {@code str}, starting at
+     * index {@code offset}, are appended, in order, to the contents
+     * of this sequence. The length of this sequence increases
+     * by the value of {@code len}.
+     * <p>
+     * The overall effect is exactly as if the arguments were converted
+     * to a string by the method {@link String#valueOf(char[],int,int)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   str      the characters to be appended.
+     * @param   offset   the index of the first {@code char} to append.
+     * @param   len      the number of {@code char}s to append.
+     * @return  a reference to this object.
+     * @throws IndexOutOfBoundsException
+     *         if {@code offset < 0} or {@code len < 0}
+     *         or {@code offset+len > str.length}
+     */
+    public AbstractStringBuilder append(char str[], int offset, int len) {
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(str, offset, value, count, len);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code boolean}
+     * argument to the sequence.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(boolean)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   b   a {@code boolean}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(boolean b) {
+        if (b) {
+            int newCount = count + 4;
+            if (newCount > value.length)
+                expandCapacity(newCount);
+            value[count++] = 't';
+            value[count++] = 'r';
+            value[count++] = 'u';
+            value[count++] = 'e';
+        } else {
+            int newCount = count + 5;
+            if (newCount > value.length)
+                expandCapacity(newCount);
+            value[count++] = 'f';
+            value[count++] = 'a';
+            value[count++] = 'l';
+            value[count++] = 's';
+            value[count++] = 'e';
+        }
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code char}
+     * argument to this sequence.
+     * <p>
+     * The argument is appended to the contents of this sequence.
+     * The length of this sequence increases by {@code 1}.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(char)},
+     * and the character in that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   c   a {@code char}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(char c) {
+        int newCount = count + 1;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        value[count++] = c;
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code int}
+     * argument to this sequence.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(int)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   i   an {@code int}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(int i) {
+        if (i == Integer.MIN_VALUE) {
+            append("-2147483648");
+            return this;
+        }
+        int appendedLength = (i < 0) ? IntegerstringSize(-i) + 1
+                                     : IntegerstringSize(i);
+        int spaceNeeded = count + appendedLength;
+        if (spaceNeeded > value.length)
+            expandCapacity(spaceNeeded);
+        IntegergetChars(i, spaceNeeded, value);
+        count = spaceNeeded;
+        return this;
+    }
+
+    final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
+                                      99999999, 999999999, Integer.MAX_VALUE };
+
+    // Requires positive x
+    static int IntegerstringSize(int x) {
+        for (int i=0; ; i++)
+            if (x <= sizeTable[i])
+                return i+1;
+    }
+
+    /**
+     * Places characters representing the integer i into the
+     * character array buf. The characters are placed into
+     * the buffer backwards starting with the least significant
+     * digit at the specified index (exclusive), and working
+     * backwards from there.
+     *
+     * Will fail if i == Integer.MIN_VALUE
+     */
+    static void IntegergetChars(int i, int index, char[] buf) {
+        int q, r;
+        int charPos = index;
+        char sign = 0;
+
+        if (i < 0) {
+            sign = '-';
+            i = -i;
+        }
+
+        // Generate two digits per iteration
+        while (i >= 65536) {
+            q = i / 100;
+        // really: r = i - (q * 100);
+            r = i - ((q << 6) + (q << 5) + (q << 2));
+            i = q;
+            buf [--charPos] = DigitOnes[r];
+            buf [--charPos] = DigitTens[r];
+        }
+
+        // Fall thru to fast mode for smaller numbers
+        // assert(i <= 65536, i);
+        for (;;) {
+            q = (i * 52429) >>> (16+3);
+            r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
+            buf [--charPos] = digits [r];
+            i = q;
+            if (i == 0) break;
+        }
+        if (sign != 0) {
+            buf [--charPos] = sign;
+        }
+    }
+
+	final static char [] DigitTens = {
+        '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
+        '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
+        '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
+        '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
+        '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
+        '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
+        '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
+        '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
+        '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
+        '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
+        } ;
+
+    final static char [] DigitOnes = {
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        } ;
+        
+    /**
+     * Appends the string representation of the {@code long}
+     * argument to this sequence.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(long)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   l   a {@code long}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(long l) {
+        if (l == Long.MIN_VALUE) {
+            append("-9223372036854775808");
+            return this;
+        }
+        int appendedLength = (l < 0) ? LongstringSize(-l) + 1
+                                     : LongstringSize(l);
+        int spaceNeeded = count + appendedLength;
+        if (spaceNeeded > value.length)
+            expandCapacity(spaceNeeded);
+        LonggetChars(l, spaceNeeded, value);
+        count = spaceNeeded;
+        return this;
+    }
+
+    /**
+     * Places characters representing the integer i into the
+     * character array buf. The characters are placed into
+     * the buffer backwards starting with the least significant
+     * digit at the specified index (exclusive), and working
+     * backwards from there.
+     *
+     * Will fail if i == Long.MIN_VALUE
+     */
+    static void LonggetChars(long i, int index, char[] buf) {
+        long q;
+        int r;
+        int charPos = index;
+        char sign = 0;
+
+        if (i < 0) {
+            sign = '-';
+            i = -i;
+        }
+
+        // Get 2 digits/iteration using longs until quotient fits into an int
+        while (i > Integer.MAX_VALUE) {
+            q = i / 100;
+            // really: r = i - (q * 100);
+            r = (int)(i - ((q << 6) + (q << 5) + (q << 2)));
+            i = q;
+            buf[--charPos] = DigitOnes[r];
+            buf[--charPos] = DigitTens[r];
+        }
+
+        // Get 2 digits/iteration using ints
+        int q2;
+        int i2 = (int)i;
+        while (i2 >= 65536) {
+            q2 = i2 / 100;
+            // really: r = i2 - (q * 100);
+            r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
+            i2 = q2;
+            buf[--charPos] = DigitOnes[r];
+            buf[--charPos] = DigitTens[r];
+        }
+
+        // Fall thru to fast mode for smaller numbers
+        // assert(i2 <= 65536, i2);
+        for (;;) {
+            q2 = (i2 * 52429) >>> (16+3);
+            r = i2 - ((q2 << 3) + (q2 << 1));  // r = i2-(q2*10) ...
+            buf[--charPos] = digits[r];
+            i2 = q2;
+            if (i2 == 0) break;
+        }
+        if (sign != 0) {
+            buf[--charPos] = sign;
+        }
+    }
+
+    // Requires positive x
+    static int LongstringSize(long x) {
+        long p = 10;
+        for (int i=1; i<19; i++) {
+            if (x < p)
+                return i;
+            p = 10*p;
+        }
+        return 19;
+    }
+
+	/**
+     * All possible chars for representing a number as a String
+     */
+    final static char[] digits = {
+        '0' , '1' , '2' , '3' , '4' , '5' ,
+        '6' , '7' , '8' , '9' , 'a' , 'b' ,
+        'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
+        'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
+        'o' , 'p' , 'q' , 'r' , 's' , 't' ,
+        'u' , 'v' , 'w' , 'x' , 'y' , 'z'
+    };
+    
+    /**
+     * Appends the string representation of the {@code float}
+     * argument to this sequence.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(float)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   f   a {@code float}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(float f) {
+        new FloatingDecimal(f).appendTo(this);
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code double}
+     * argument to this sequence.
+     * <p>
+     * The overall effect is exactly as if the argument were converted
+     * to a string by the method {@link String#valueOf(double)},
+     * and the characters of that string were then
+     * {@link #append(String) appended} to this character sequence.
+     *
+     * @param   d   a {@code double}.
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder append(double d) {
+        new FloatingDecimal(d).appendTo(this);
+        return this;
+    }
+
+    /**
+     * Removes the characters in a substring of this sequence.
+     * The substring begins at the specified {@code start} and extends to
+     * the character at index {@code end - 1} or to the end of the
+     * sequence if no such character exists. If
+     * {@code start} is equal to {@code end}, no changes are made.
+     *
+     * @param      start  The beginning index, inclusive.
+     * @param      end    The ending index, exclusive.
+     * @return     This object.
+     * @throws     StringIndexOutOfBoundsException  if {@code start}
+     *             is negative, greater than {@code length()}, or
+     *             greater than {@code end}.
+     */
+    public AbstractStringBuilder delete(int start, int end) {
+        if (start < 0)
+            throw new StringIndexOutOfBoundsException(start);
+        if (end > count)
+            end = count;
+        if (start > end)
+            throw new StringIndexOutOfBoundsException();
+        int len = end - start;
+        if (len > 0) {
+            System.arraycopy(value, start+len, value, start, count-end);
+            count -= len;
+        }
+        return this;
+    }
+
+    /**
+     * Appends the string representation of the {@code codePoint}
+     * argument to this sequence.
+     *
+     * <p> The argument is appended to the contents of this sequence.
+     * The length of this sequence increases by
+     * {@link Character#charCount(int) Character.charCount(codePoint)}.
+     *
+     * <p> The overall effect is exactly as if the argument were
+     * converted to a {@code char} array by the method
+     * {@link Character#toChars(int)} and the character in that array
+     * were then {@link #append(char[]) appended} to this character
+     * sequence.
+     *
+     * @param   codePoint   a Unicode code point
+     * @return  a reference to this object.
+     * @exception IllegalArgumentException if the specified
+     * {@code codePoint} isn't a valid Unicode code point
+     */
+    public AbstractStringBuilder appendCodePoint(int codePoint) {
+        if (!isValidCodePoint(codePoint)) {
+            throw new IllegalArgumentException();
+        }
+        int n = 1;
+        if (codePoint >= MIN_SUPPLEMENTARY_CODE_POINT) {
+            n++;
+        }
+        int newCount = count + n;
+        if (newCount > value.length) {
+            expandCapacity(newCount);
+        }
+        if (n == 1) {
+            value[count++] = (char) codePoint;
+        } else {
+            toSurrogates(codePoint, value, count);
+            count += n;
+        }
+        return this;
+    }
+
+    /**
+     * Determines whether the specified code point is a valid
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point value</a>.
+     *
+     * @param  codePoint the Unicode code point to be tested
+     * @return {@code true} if the specified code point value is between
+     *         {@link #MIN_CODE_POINT} and
+     *         {@link #MAX_CODE_POINT} inclusive;
+     *         {@code false} otherwise.
+     * @since  1.5
+     */
+    public static boolean isValidCodePoint(int codePoint) {
+        return codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT;
+    }
+
+    static void toSurrogates(int codePoint, char[] dst, int index) {
+        // We write elements "backwards" to guarantee all-or-nothing
+        dst[index+1] = (char)((codePoint & 0x3ff) + MIN_LOW_SURROGATE);
+        dst[index] = (char)((codePoint >>> 10)
+            + (MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
+    }
+
+    /**
+     * Removes the <code>char</code> at the specified position in this
+     * sequence. This sequence is shortened by one <code>char</code>.
+     *
+     * <p>Note: If the character at the given index is a supplementary
+     * character, this method does not remove the entire character. If
+     * correct handling of supplementary characters is required,
+     * determine the number of <code>char</code>s to remove by calling
+     * <code>Character.charCount(thisSequence.codePointAt(index))</code>,
+     * where <code>thisSequence</code> is this sequence.
+     *
+     * @param       index  Index of <code>char</code> to remove
+     * @return      This object.
+     * @throws      StringIndexOutOfBoundsException  if the <code>index</code>
+     *              is negative or greater than or equal to
+     *              <code>length()</code>.
+     */
+    public AbstractStringBuilder deleteCharAt(int index) {
+        if ((index < 0) || (index >= count))
+            throw new StringIndexOutOfBoundsException(index);
+        System.arraycopy(value, index+1, value, index, count-index-1);
+        count--;
+        return this;
+    }
+
+    /**
+     * Replaces the characters in a substring of this sequence
+     * with characters in the specified <code>String</code>. The substring
+     * begins at the specified <code>start</code> and extends to the character
+     * at index <code>end - 1</code> or to the end of the
+     * sequence if no such character exists. First the
+     * characters in the substring are removed and then the specified
+     * <code>String</code> is inserted at <code>start</code>. (This
+     * sequence will be lengthened to accommodate the
+     * specified String if necessary.)
+     *
+     * @param      start    The beginning index, inclusive.
+     * @param      end      The ending index, exclusive.
+     * @param      str   String that will replace previous contents.
+     * @return     This object.
+     * @throws     StringIndexOutOfBoundsException  if <code>start</code>
+     *             is negative, greater than <code>length()</code>, or
+     *             greater than <code>end</code>.
+     */
+    public AbstractStringBuilder replace(int start, int end, String str) {
+        if (start < 0)
+            throw new StringIndexOutOfBoundsException(start);
+        if (start > count)
+            throw new StringIndexOutOfBoundsException("start > length()");
+        if (start > end)
+            throw new StringIndexOutOfBoundsException("start > end");
+
+        if (end > count)
+            end = count;
+        int len = str.length();
+        int newCount = count + len - (end - start);
+        if (newCount > value.length)
+            expandCapacity(newCount);
+
+        System.arraycopy(value, end, value, start + len, count - end);
+        str.getChars(0, str.length(), value, start);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Returns a new <code>String</code> that contains a subsequence of
+     * characters currently contained in this character sequence. The
+     * substring begins at the specified index and extends to the end of
+     * this sequence.
+     *
+     * @param      start    The beginning index, inclusive.
+     * @return     The new string.
+     * @throws     StringIndexOutOfBoundsException  if <code>start</code> is
+     *             less than zero, or greater than the length of this object.
+     */
+    public String substring(int start) {
+        return substring(start, count);
+    }
+
+    /**
+     * Returns a new character sequence that is a subsequence of this sequence.
+     *
+     * <p> An invocation of this method of the form
+     *
+     * <blockquote><pre>
+     * sb.subSequence(begin,&nbsp;end)</pre></blockquote>
+     *
+     * behaves in exactly the same way as the invocation
+     *
+     * <blockquote><pre>
+     * sb.substring(begin,&nbsp;end)</pre></blockquote>
+     *
+     * This method is provided so that this class can
+     * implement the {@link CharSequence} interface. </p>
+     *
+     * @param      start   the start index, inclusive.
+     * @param      end     the end index, exclusive.
+     * @return     the specified subsequence.
+     *
+     * @throws  IndexOutOfBoundsException
+     *          if <tt>start</tt> or <tt>end</tt> are negative,
+     *          if <tt>end</tt> is greater than <tt>length()</tt>,
+     *          or if <tt>start</tt> is greater than <tt>end</tt>
+     * @spec JSR-51
+     */
+    public CharSequence subSequence(int start, int end) {
+        return substring(start, end);
+    }
+
+    /**
+     * Returns a new <code>String</code> that contains a subsequence of
+     * characters currently contained in this sequence. The
+     * substring begins at the specified <code>start</code> and
+     * extends to the character at index <code>end - 1</code>.
+     *
+     * @param      start    The beginning index, inclusive.
+     * @param      end      The ending index, exclusive.
+     * @return     The new string.
+     * @throws     StringIndexOutOfBoundsException  if <code>start</code>
+     *             or <code>end</code> are negative or greater than
+     *             <code>length()</code>, or <code>start</code> is
+     *             greater than <code>end</code>.
+     */
+    public String substring(int start, int end) {
+        if (start < 0)
+            throw new StringIndexOutOfBoundsException(start);
+        if (end > count)
+            throw new StringIndexOutOfBoundsException(end);
+        if (start > end)
+            throw new StringIndexOutOfBoundsException(end - start);
+        return new String(value, start, end - start);
+    }
+
+    /**
+     * Inserts the string representation of a subarray of the {@code str}
+     * array argument into this sequence. The subarray begins at the
+     * specified {@code offset} and extends {@code len} {@code char}s.
+     * The characters of the subarray are inserted into this sequence at
+     * the position indicated by {@code index}. The length of this
+     * sequence increases by {@code len} {@code char}s.
+     *
+     * @param      index    position at which to insert subarray.
+     * @param      str       A {@code char} array.
+     * @param      offset   the index of the first {@code char} in subarray to
+     *             be inserted.
+     * @param      len      the number of {@code char}s in the subarray to
+     *             be inserted.
+     * @return     This object
+     * @throws     StringIndexOutOfBoundsException  if {@code index}
+     *             is negative or greater than {@code length()}, or
+     *             {@code offset} or {@code len} are negative, or
+     *             {@code (offset+len)} is greater than
+     *             {@code str.length}.
+     */
+    public AbstractStringBuilder insert(int index, char[] str, int offset,
+                                        int len)
+    {
+        if ((index < 0) || (index > length()))
+            throw new StringIndexOutOfBoundsException(index);
+        if ((offset < 0) || (len < 0) || (offset > str.length - len))
+            throw new StringIndexOutOfBoundsException(
+                "offset " + offset + ", len " + len + ", str.length "
+                + str.length);
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(value, index, value, index + len, count - index);
+        System.arraycopy(str, offset, value, index, len);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Inserts the string representation of the {@code Object}
+     * argument into this character sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(Object)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      obj      an {@code Object}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, Object obj) {
+        return insert(offset, String.valueOf(obj));
+    }
+
+    /**
+     * Inserts the string into this character sequence.
+     * <p>
+     * The characters of the {@code String} argument are inserted, in
+     * order, into this sequence at the indicated offset, moving up any
+     * characters originally above that position and increasing the length
+     * of this sequence by the length of the argument. If
+     * {@code str} is {@code null}, then the four characters
+     * {@code "null"} are inserted into this sequence.
+     * <p>
+     * The character at index <i>k</i> in the new character sequence is
+     * equal to:
+     * <ul>
+     * <li>the character at index <i>k</i> in the old character sequence, if
+     * <i>k</i> is less than {@code offset}
+     * <li>the character at index <i>k</i>{@code -offset} in the
+     * argument {@code str}, if <i>k</i> is not less than
+     * {@code offset} but is less than {@code offset+str.length()}
+     * <li>the character at index <i>k</i>{@code -str.length()} in the
+     * old character sequence, if <i>k</i> is not less than
+     * {@code offset+str.length()}
+     * </ul><p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      str      a string.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, String str) {
+        if ((offset < 0) || (offset > length()))
+            throw new StringIndexOutOfBoundsException(offset);
+        if (str == null)
+            str = "null";
+        int len = str.length();
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(value, offset, value, offset + len, count - offset);
+        str.getChars(0, str.length(), value, offset);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Inserts the string representation of the {@code char} array
+     * argument into this sequence.
+     * <p>
+     * The characters of the array argument are inserted into the
+     * contents of this sequence at the position indicated by
+     * {@code offset}. The length of this sequence increases by
+     * the length of the argument.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(char[])},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      str      a character array.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, char[] str) {
+        if ((offset < 0) || (offset > length()))
+            throw new StringIndexOutOfBoundsException(offset);
+        int len = str.length;
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(value, offset, value, offset + len, count - offset);
+        System.arraycopy(str, 0, value, offset, len);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Inserts the specified {@code CharSequence} into this sequence.
+     * <p>
+     * The characters of the {@code CharSequence} argument are inserted,
+     * in order, into this sequence at the indicated offset, moving up
+     * any characters originally above that position and increasing the length
+     * of this sequence by the length of the argument s.
+     * <p>
+     * The result of this method is exactly the same as if it were an
+     * invocation of this object's
+     * {@link #insert(int,CharSequence,int,int) insert}(dstOffset, s, 0, s.length())
+     * method.
+     *
+     * <p>If {@code s} is {@code null}, then the four characters
+     * {@code "null"} are inserted into this sequence.
+     *
+     * @param      dstOffset   the offset.
+     * @param      s the sequence to be inserted
+     * @return     a reference to this object.
+     * @throws     IndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int dstOffset, CharSequence s) {
+        if (s == null)
+            s = "null";
+        if (s instanceof String)
+            return this.insert(dstOffset, (String)s);
+        return this.insert(dstOffset, s, 0, s.length());
+    }
+
+    /**
+     * Inserts a subsequence of the specified {@code CharSequence} into
+     * this sequence.
+     * <p>
+     * The subsequence of the argument {@code s} specified by
+     * {@code start} and {@code end} are inserted,
+     * in order, into this sequence at the specified destination offset, moving
+     * up any characters originally above that position. The length of this
+     * sequence is increased by {@code end - start}.
+     * <p>
+     * The character at index <i>k</i> in this sequence becomes equal to:
+     * <ul>
+     * <li>the character at index <i>k</i> in this sequence, if
+     * <i>k</i> is less than {@code dstOffset}
+     * <li>the character at index <i>k</i>{@code +start-dstOffset} in
+     * the argument {@code s}, if <i>k</i> is greater than or equal to
+     * {@code dstOffset} but is less than {@code dstOffset+end-start}
+     * <li>the character at index <i>k</i>{@code -(end-start)} in this
+     * sequence, if <i>k</i> is greater than or equal to
+     * {@code dstOffset+end-start}
+     * </ul><p>
+     * The {@code dstOffset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     * <p>The start argument must be nonnegative, and not greater than
+     * {@code end}.
+     * <p>The end argument must be greater than or equal to
+     * {@code start}, and less than or equal to the length of s.
+     *
+     * <p>If {@code s} is {@code null}, then this method inserts
+     * characters as if the s parameter was a sequence containing the four
+     * characters {@code "null"}.
+     *
+     * @param      dstOffset   the offset in this sequence.
+     * @param      s       the sequence to be inserted.
+     * @param      start   the starting index of the subsequence to be inserted.
+     * @param      end     the end index of the subsequence to be inserted.
+     * @return     a reference to this object.
+     * @throws     IndexOutOfBoundsException  if {@code dstOffset}
+     *             is negative or greater than {@code this.length()}, or
+     *              {@code start} or {@code end} are negative, or
+     *              {@code start} is greater than {@code end} or
+     *              {@code end} is greater than {@code s.length()}
+     */
+     public AbstractStringBuilder insert(int dstOffset, CharSequence s,
+                                         int start, int end) {
+        if (s == null)
+            s = "null";
+        if ((dstOffset < 0) || (dstOffset > this.length()))
+            throw new IndexOutOfBoundsException("dstOffset "+dstOffset);
+        if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))
+            throw new IndexOutOfBoundsException(
+                "start " + start + ", end " + end + ", s.length() "
+                + s.length());
+        int len = end - start;
+        if (len == 0)
+            return this;
+        int newCount = count + len;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(value, dstOffset, value, dstOffset + len,
+                         count - dstOffset);
+        for (int i=start; i<end; i++)
+            value[dstOffset++] = s.charAt(i);
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Inserts the string representation of the {@code boolean}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(boolean)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      b        a {@code boolean}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, boolean b) {
+        return insert(offset, String.valueOf(b));
+    }
+
+    /**
+     * Inserts the string representation of the {@code char}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(char)},
+     * and the character in that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      c        a {@code char}.
+     * @return     a reference to this object.
+     * @throws     IndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, char c) {
+        int newCount = count + 1;
+        if (newCount > value.length)
+            expandCapacity(newCount);
+        System.arraycopy(value, offset, value, offset + 1, count - offset);
+        value[offset] = c;
+        count = newCount;
+        return this;
+    }
+
+    /**
+     * Inserts the string representation of the second {@code int}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(int)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      i        an {@code int}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, int i) {
+        return insert(offset, String.valueOf(i));
+    }
+
+    /**
+     * Inserts the string representation of the {@code long}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(long)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      l        a {@code long}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, long l) {
+        return insert(offset, String.valueOf(l));
+    }
+
+    /**
+     * Inserts the string representation of the {@code float}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(float)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      f        a {@code float}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, float f) {
+        return insert(offset, String.valueOf(f));
+    }
+
+    /**
+     * Inserts the string representation of the {@code double}
+     * argument into this sequence.
+     * <p>
+     * The overall effect is exactly as if the second argument were
+     * converted to a string by the method {@link String#valueOf(double)},
+     * and the characters of that string were then
+     * {@link #insert(int,String) inserted} into this character
+     * sequence at the indicated offset.
+     * <p>
+     * The {@code offset} argument must be greater than or equal to
+     * {@code 0}, and less than or equal to the {@linkplain #length() length}
+     * of this sequence.
+     *
+     * @param      offset   the offset.
+     * @param      d        a {@code double}.
+     * @return     a reference to this object.
+     * @throws     StringIndexOutOfBoundsException  if the offset is invalid.
+     */
+    public AbstractStringBuilder insert(int offset, double d) {
+        return insert(offset, String.valueOf(d));
+    }
+
+    /**
+     * Returns the index within this string of the first occurrence of the
+     * specified substring. The integer returned is the smallest value
+     * <i>k</i> such that:
+     * <blockquote><pre>
+     * this.toString().startsWith(str, <i>k</i>)
+     * </pre></blockquote>
+     * is <code>true</code>.
+     *
+     * @param   str   any string.
+     * @return  if the string argument occurs as a substring within this
+     *          object, then the index of the first character of the first
+     *          such substring is returned; if it does not occur as a
+     *          substring, <code>-1</code> is returned.
+     * @throws  java.lang.NullPointerException if <code>str</code> is
+     *          <code>null</code>.
+     */
+    public int indexOf(String str) {
+        return indexOf(str, 0);
+    }
+
+    /**
+     * Returns the index within this string of the first occurrence of the
+     * specified substring, starting at the specified index.  The integer
+     * returned is the smallest value <tt>k</tt> for which:
+     * <blockquote><pre>
+     *     k >= Math.min(fromIndex, str.length()) &&
+     *                   this.toString().startsWith(str, k)
+     * </pre></blockquote>
+     * If no such value of <i>k</i> exists, then -1 is returned.
+     *
+     * @param   str         the substring for which to search.
+     * @param   fromIndex   the index from which to start the search.
+     * @return  the index within this string of the first occurrence of the
+     *          specified substring, starting at the specified index.
+     * @throws  java.lang.NullPointerException if <code>str</code> is
+     *            <code>null</code>.
+     */
+    public int indexOf(String str, int fromIndex) {
+        return indexOf(value, 0, count,
+                              str.toCharArray(), 0, str.length(), fromIndex);
+    }
+
+    /**
+     * Code shared by String and StringBuffer to do searches. The
+     * source is the character array being searched, and the target
+     * is the string being searched for.
+     *
+     * @param   source       the characters being searched.
+     * @param   sourceOffset offset of the source string.
+     * @param   sourceCount  count of the source string.
+     * @param   target       the characters being searched for.
+     * @param   targetOffset offset of the target string.
+     * @param   targetCount  count of the target string.
+     * @param   fromIndex    the index to begin searching from.
+     */
+    static int indexOf(char[] source, int sourceOffset, int sourceCount,
+                       char[] target, int targetOffset, int targetCount,
+                       int fromIndex) {
+        if (fromIndex >= sourceCount) {
+            return (targetCount == 0 ? sourceCount : -1);
+        }
+        if (fromIndex < 0) {
+            fromIndex = 0;
+        }
+        if (targetCount == 0) {
+            return fromIndex;
+        }
+
+        char first  = target[targetOffset];
+        int max = sourceOffset + (sourceCount - targetCount);
+
+        for (int i = sourceOffset + fromIndex; i <= max; i++) {
+            /* Look for first character. */
+            if (source[i] != first) {
+                while (++i <= max && source[i] != first);
+            }
+
+            /* Found first character, now look at the rest of v2 */
+            if (i <= max) {
+                int j = i + 1;
+                int end = j + targetCount - 1;
+                for (int k = targetOffset + 1; j < end && source[j] ==
+                         target[k]; j++, k++);
+
+                if (j == end) {
+                    /* Found whole string. */
+                    return i - sourceOffset;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the index within this string of the rightmost occurrence
+     * of the specified substring.  The rightmost empty string "" is
+     * considered to occur at the index value <code>this.length()</code>.
+     * The returned index is the largest value <i>k</i> such that
+     * <blockquote><pre>
+     * this.toString().startsWith(str, k)
+     * </pre></blockquote>
+     * is true.
+     *
+     * @param   str   the substring to search for.
+     * @return  if the string argument occurs one or more times as a substring
+     *          within this object, then the index of the first character of
+     *          the last such substring is returned. If it does not occur as
+     *          a substring, <code>-1</code> is returned.
+     * @throws  java.lang.NullPointerException  if <code>str</code> is
+     *          <code>null</code>.
+     */
+    public int lastIndexOf(String str) {
+        return lastIndexOf(str, count);
+    }
+
+    /**
+     * Returns the index within this string of the last occurrence of the
+     * specified substring. The integer returned is the largest value <i>k</i>
+     * such that:
+     * <blockquote><pre>
+     *     k <= Math.min(fromIndex, str.length()) &&
+     *                   this.toString().startsWith(str, k)
+     * </pre></blockquote>
+     * If no such value of <i>k</i> exists, then -1 is returned.
+     *
+     * @param   str         the substring to search for.
+     * @param   fromIndex   the index to start the search from.
+     * @return  the index within this sequence of the last occurrence of the
+     *          specified substring.
+     * @throws  java.lang.NullPointerException if <code>str</code> is
+     *          <code>null</code>.
+     */
+    public int lastIndexOf(String str, int fromIndex) {
+        return lastIndexOf(value, 0, count,
+                              str.toCharArray(), 0, str.length(), fromIndex);
+    }
+
+    /**
+     * Code shared by String and StringBuffer to do searches. The
+     * source is the character array being searched, and the target
+     * is the string being searched for.
+     *
+     * @param   source       the characters being searched.
+     * @param   sourceOffset offset of the source string.
+     * @param   sourceCount  count of the source string.
+     * @param   target       the characters being searched for.
+     * @param   targetOffset offset of the target string.
+     * @param   targetCount  count of the target string.
+     * @param   fromIndex    the index to begin searching from.
+     */
+    static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
+                           char[] target, int targetOffset, int targetCount,
+                           int fromIndex) {
+        /*
+         * Check arguments; return immediately where possible. For
+         * consistency, don't check for null str.
+         */
+        int rightIndex = sourceCount - targetCount;
+        if (fromIndex < 0) {
+            return -1;
+        }
+        if (fromIndex > rightIndex) {
+            fromIndex = rightIndex;
+        }
+        /* Empty string always matches. */
+        if (targetCount == 0) {
+            return fromIndex;
+        }
+
+        int strLastIndex = targetOffset + targetCount - 1;
+        char strLastChar = target[strLastIndex];
+        int min = sourceOffset + targetCount - 1;
+        int i = min + fromIndex;
+
+    startSearchForLastChar:
+        while (true) {
+            while (i >= min && source[i] != strLastChar) {
+                i--;
+            }
+            if (i < min) {
+                return -1;
+            }
+            int j = i - 1;
+            int start = j - (targetCount - 1);
+            int k = strLastIndex - 1;
+
+            while (j > start) {
+                if (source[j--] != target[k--]) {
+                    i--;
+                    continue startSearchForLastChar;
+                }
+            }
+            return start - sourceOffset + 1;
+        }
+    }
+    
+    /**
+     * Causes this character sequence to be replaced by the reverse of
+     * the sequence. If there are any surrogate pairs included in the
+     * sequence, these are treated as single characters for the
+     * reverse operation. Thus, the order of the high-low surrogates
+     * is never reversed.
+     *
+     * Let <i>n</i> be the character length of this character sequence
+     * (not the length in <code>char</code> values) just prior to
+     * execution of the <code>reverse</code> method. Then the
+     * character at index <i>k</i> in the new character sequence is
+     * equal to the character at index <i>n-k-1</i> in the old
+     * character sequence.
+     *
+     * <p>Note that the reverse operation may result in producing
+     * surrogate pairs that were unpaired low-surrogates and
+     * high-surrogates before the operation. For example, reversing
+     * "&#92;uDC00&#92;uD800" produces "&#92;uD800&#92;uDC00" which is
+     * a valid surrogate pair.
+     *
+     * @return  a reference to this object.
+     */
+    public AbstractStringBuilder reverse() {
+        boolean hasSurrogate = false;
+        int n = count - 1;
+        for (int j = (n-1) >> 1; j >= 0; --j) {
+            char temp = value[j];
+            char temp2 = value[n - j];
+            if (!hasSurrogate) {
+                hasSurrogate = (temp >= MIN_SURROGATE && temp <= MAX_SURROGATE)
+                    || (temp2 >= MIN_SURROGATE && temp2 <= MAX_SURROGATE);
+            }
+            value[j] = temp2;
+            value[n - j] = temp;
+        }
+        if (hasSurrogate) {
+            // Reverse back all valid surrogate pairs
+            for (int i = 0; i < count - 1; i++) {
+                char c2 = value[i];
+                if (isLowSurrogate(c2)) {
+                    char c1 = value[i + 1];
+                    if (isHighSurrogate(c1)) {
+                        value[i++] = c1;
+                        value[i] = c2;
+                    }
+                }
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Returns a string representing the data in this sequence.
+     * A new <code>String</code> object is allocated and initialized to
+     * contain the character sequence currently represented by this
+     * object. This <code>String</code> is then returned. Subsequent
+     * changes to this sequence do not affect the contents of the
+     * <code>String</code>.
+     *
+     * @return  a string representation of this sequence of characters.
+     */
+    public abstract String toString();
+
+    /**
+     * Needed by <tt>String</tt> for the contentEquals method.
+     */
+    final char[] getValue() {
+        return value;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/Appendable.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+import java.io.IOException;
+
+/**
+ * An object to which <tt>char</tt> sequences and values can be appended.  The
+ * <tt>Appendable</tt> interface must be implemented by any class whose
+ * instances are intended to receive formatted output from a {@link
+ * java.util.Formatter}.
+ *
+ * <p> The characters to be appended should be valid Unicode characters as
+ * described in <a href="Character.html#unicode">Unicode Character
+ * Representation</a>.  Note that supplementary characters may be composed of
+ * multiple 16-bit <tt>char</tt> values.
+ *
+ * <p> Appendables are not necessarily safe for multithreaded access.  Thread
+ * safety is the responsibility of classes that extend and implement this
+ * interface.
+ *
+ * <p> Since this interface may be implemented by existing classes
+ * with different styles of error handling there is no guarantee that
+ * errors will be propagated to the invoker.
+ *
+ * @since 1.5
+ */
+public interface Appendable {
+
+    /**
+     * Appends the specified character sequence to this <tt>Appendable</tt>.
+     *
+     * <p> Depending on which class implements the character sequence
+     * <tt>csq</tt>, the entire sequence may not be appended.  For
+     * instance, if <tt>csq</tt> is a {@link java.nio.CharBuffer} then
+     * the subsequence to append is defined by the buffer's position and limit.
+     *
+     * @param  csq
+     *         The character sequence to append.  If <tt>csq</tt> is
+     *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
+     *         appended to this Appendable.
+     *
+     * @return  A reference to this <tt>Appendable</tt>
+     *
+     * @throws  IOException
+     *          If an I/O error occurs
+     */
+    Appendable append(CharSequence csq) throws IOException;
+
+    /**
+     * Appends a subsequence of the specified character sequence to this
+     * <tt>Appendable</tt>.
+     *
+     * <p> An invocation of this method of the form <tt>out.append(csq, start,
+     * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in
+     * exactly the same way as the invocation
+     *
+     * <pre>
+     *     out.append(csq.subSequence(start, end)) </pre>
+     *
+     * @param  csq
+     *         The character sequence from which a subsequence will be
+     *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
+     *         will be appended as if <tt>csq</tt> contained the four
+     *         characters <tt>"null"</tt>.
+     *
+     * @param  start
+     *         The index of the first character in the subsequence
+     *
+     * @param  end
+     *         The index of the character following the last character in the
+     *         subsequence
+     *
+     * @return  A reference to this <tt>Appendable</tt>
+     *
+     * @throws  IndexOutOfBoundsException
+     *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
+     *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
+     *          <tt>csq.length()</tt>
+     *
+     * @throws  IOException
+     *          If an I/O error occurs
+     */
+    Appendable append(CharSequence csq, int start, int end) throws IOException;
+
+    /**
+     * Appends the specified character to this <tt>Appendable</tt>.
+     *
+     * @param  c
+     *         The character to append
+     *
+     * @return  A reference to this <tt>Appendable</tt>
+     *
+     * @throws  IOException
+     *          If an I/O error occurs
+     */
+    Appendable append(char c) throws IOException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/Character.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,5026 @@
+/*
+ * Copyright 2002-2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Locale;
+
+/**
+ * The <code>Character</code> class wraps a value of the primitive
+ * type <code>char</code> in an object. An object of type
+ * <code>Character</code> contains a single field whose type is
+ * <code>char</code>.
+ * <p>
+ * In addition, this class provides several methods for determining
+ * a character's category (lowercase letter, digit, etc.) and for converting
+ * characters from uppercase to lowercase and vice versa.
+ * <p>
+ * Character information is based on the Unicode Standard, version 5.1.0.
+ * <p>
+ * The methods and data of class <code>Character</code> are defined by
+ * the information in the <i>UnicodeData</i> file that is part of the
+ * Unicode Character Database maintained by the Unicode
+ * Consortium. This file specifies various properties including name
+ * and general category for every defined Unicode code point or
+ * character range.
+ * <p>
+ * The file and its description are available from the Unicode Consortium at:
+ * <ul>
+ * <li><a href="http://www.unicode.org">http://www.unicode.org</a>
+ * </ul>
+ *
+ * <h4><a name="unicode">Unicode Character Representations</a></h4>
+ *
+ * <p>The <code>char</code> data type (and therefore the value that a
+ * <code>Character</code> object encapsulates) are based on the
+ * original Unicode specification, which defined characters as
+ * fixed-width 16-bit entities. The Unicode standard has since been
+ * changed to allow for characters whose representation requires more
+ * than 16 bits.  The range of legal <em>code point</em>s is now
+ * U+0000 to U+10FFFF, known as <em>Unicode scalar value</em>.
+ * (Refer to the <a
+ * href="http://www.unicode.org/reports/tr27/#notation"><i>
+ * definition</i></a> of the U+<i>n</i> notation in the Unicode
+ * standard.)
+ *
+ * <p>The set of characters from U+0000 to U+FFFF is sometimes
+ * referred to as the <em>Basic Multilingual Plane (BMP)</em>. <a
+ * name="supplementary">Characters</a> whose code points are greater
+ * than U+FFFF are called <em>supplementary character</em>s.  The Java
+ * 2 platform uses the UTF-16 representation in <code>char</code>
+ * arrays and in the <code>String</code> and <code>StringBuffer</code>
+ * classes. In this representation, supplementary characters are
+ * represented as a pair of <code>char</code> values, the first from
+ * the <em>high-surrogates</em> range, (&#92;uD800-&#92;uDBFF), the
+ * second from the <em>low-surrogates</em> range
+ * (&#92;uDC00-&#92;uDFFF).
+ *
+ * <p>A <code>char</code> value, therefore, represents Basic
+ * Multilingual Plane (BMP) code points, including the surrogate
+ * code points, or code units of the UTF-16 encoding. An
+ * <code>int</code> value represents all Unicode code points,
+ * including supplementary code points. The lower (least significant)
+ * 21 bits of <code>int</code> are used to represent Unicode code
+ * points and the upper (most significant) 11 bits must be zero.
+ * Unless otherwise specified, the behavior with respect to
+ * supplementary characters and surrogate <code>char</code> values is
+ * as follows:
+ *
+ * <ul>
+ * <li>The methods that only accept a <code>char</code> value cannot support
+ * supplementary characters. They treat <code>char</code> values from the
+ * surrogate ranges as undefined characters. For example,
+ * <code>Character.isLetter('&#92;uD840')</code> returns <code>false</code>, even though
+ * this specific value if followed by any low-surrogate value in a string
+ * would represent a letter.
+ *
+ * <li>The methods that accept an <code>int</code> value support all
+ * Unicode characters, including supplementary characters. For
+ * example, <code>Character.isLetter(0x2F81A)</code> returns
+ * <code>true</code> because the code point value represents a letter
+ * (a CJK ideograph).
+ * </ul>
+ *
+ * <p>In the Java SE API documentation, <em>Unicode code point</em> is
+ * used for character values in the range between U+0000 and U+10FFFF,
+ * and <em>Unicode code unit</em> is used for 16-bit
+ * <code>char</code> values that are code units of the <em>UTF-16</em>
+ * encoding. For more information on Unicode terminology, refer to the
+ * <a href="http://www.unicode.org/glossary/">Unicode Glossary</a>.
+ *
+ * @author  Lee Boynton
+ * @author  Guy Steele
+ * @author  Akira Tanaka
+ * @since   1.0
+ */
+public final
+class Character extends Object implements java.io.Serializable, Comparable {
+    /**
+     * The minimum radix available for conversion to and from strings.
+     * The constant value of this field is the smallest value permitted
+     * for the radix argument in radix-conversion methods such as the
+     * <code>digit</code> method, the <code>forDigit</code>
+     * method, and the <code>toString</code> method of class
+     * <code>Integer</code>.
+     *
+     * @see     java.lang.Character#digit(char, int)
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Integer#toString(int, int)
+     * @see     java.lang.Integer#valueOf(java.lang.String)
+     */
+    public static final int MIN_RADIX = 2;
+
+    /**
+     * The maximum radix available for conversion to and from strings.
+     * The constant value of this field is the largest value permitted
+     * for the radix argument in radix-conversion methods such as the
+     * <code>digit</code> method, the <code>forDigit</code>
+     * method, and the <code>toString</code> method of class
+     * <code>Integer</code>.
+     *
+     * @see     java.lang.Character#digit(char, int)
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Integer#toString(int, int)
+     * @see     java.lang.Integer#valueOf(java.lang.String)
+     */
+    public static final int MAX_RADIX = 36;
+
+    /**
+     * The constant value of this field is the smallest value of type
+     * <code>char</code>, <code>'&#92;u0000'</code>.
+     *
+     * @since   1.0.2
+     */
+    public static final char   MIN_VALUE = '\u0000';
+
+    /**
+     * The constant value of this field is the largest value of type
+     * <code>char</code>, <code>'&#92;uFFFF'</code>.
+     *
+     * @since   1.0.2
+     */
+    public static final char   MAX_VALUE = '\uFFFF';
+
+    /**
+     * The <code>Class</code> instance representing the primitive type
+     * <code>char</code>.
+     *
+     * @since   1.1
+     */
+    public static final Class TYPE = java.lang.Character.TYPE;
+
+   /*
+    * Normative general types
+    */
+
+   /*
+    * General character types
+    */
+
+   /**
+    * General category "Cn" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        UNASSIGNED                  = 0;
+
+   /**
+    * General category "Lu" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        UPPERCASE_LETTER            = 1;
+
+   /**
+    * General category "Ll" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        LOWERCASE_LETTER            = 2;
+
+   /**
+    * General category "Lt" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        TITLECASE_LETTER            = 3;
+
+   /**
+    * General category "Lm" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        MODIFIER_LETTER             = 4;
+
+   /**
+    * General category "Lo" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        OTHER_LETTER                = 5;
+
+   /**
+    * General category "Mn" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        NON_SPACING_MARK            = 6;
+
+   /**
+    * General category "Me" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        ENCLOSING_MARK              = 7;
+
+   /**
+    * General category "Mc" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        COMBINING_SPACING_MARK      = 8;
+
+   /**
+    * General category "Nd" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        DECIMAL_DIGIT_NUMBER        = 9;
+
+   /**
+    * General category "Nl" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        LETTER_NUMBER               = 10;
+
+   /**
+    * General category "No" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        OTHER_NUMBER                = 11;
+
+   /**
+    * General category "Zs" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        SPACE_SEPARATOR             = 12;
+
+   /**
+    * General category "Zl" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        LINE_SEPARATOR              = 13;
+
+   /**
+    * General category "Zp" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        PARAGRAPH_SEPARATOR         = 14;
+
+   /**
+    * General category "Cc" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        CONTROL                     = 15;
+
+   /**
+    * General category "Cf" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        FORMAT                      = 16;
+
+   /**
+    * General category "Co" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        PRIVATE_USE                 = 18;
+
+   /**
+    * General category "Cs" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        SURROGATE                   = 19;
+
+   /**
+    * General category "Pd" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        DASH_PUNCTUATION            = 20;
+
+   /**
+    * General category "Ps" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        START_PUNCTUATION           = 21;
+
+   /**
+    * General category "Pe" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        END_PUNCTUATION             = 22;
+
+   /**
+    * General category "Pc" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        CONNECTOR_PUNCTUATION       = 23;
+
+   /**
+    * General category "Po" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        OTHER_PUNCTUATION           = 24;
+
+   /**
+    * General category "Sm" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        MATH_SYMBOL                 = 25;
+
+   /**
+    * General category "Sc" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        CURRENCY_SYMBOL             = 26;
+
+   /**
+    * General category "Sk" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        MODIFIER_SYMBOL             = 27;
+
+   /**
+    * General category "So" in the Unicode specification.
+    * @since   1.1
+    */
+    public static final byte
+        OTHER_SYMBOL                = 28;
+
+   /**
+    * General category "Pi" in the Unicode specification.
+    * @since   1.4
+    */
+    public static final byte
+        INITIAL_QUOTE_PUNCTUATION   = 29;
+
+   /**
+    * General category "Pf" in the Unicode specification.
+    * @since   1.4
+    */
+    public static final byte
+        FINAL_QUOTE_PUNCTUATION     = 30;
+
+    /**
+     * Error flag. Use int (code point) to avoid confusion with U+FFFF.
+     */
+     static final int ERROR = 0xFFFFFFFF;
+
+
+    /**
+     * Undefined bidirectional character type. Undefined <code>char</code>
+     * values have undefined directionality in the Unicode specification.
+     * @since 1.4
+     */
+     public static final byte DIRECTIONALITY_UNDEFINED = -1;
+
+    /**
+     * Strong bidirectional character type "L" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_LEFT_TO_RIGHT = 0;
+
+    /**
+     * Strong bidirectional character type "R" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_RIGHT_TO_LEFT = 1;
+
+    /**
+    * Strong bidirectional character type "AL" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 2;
+
+    /**
+     * Weak bidirectional character type "EN" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_EUROPEAN_NUMBER = 3;
+
+    /**
+     * Weak bidirectional character type "ES" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 4;
+
+    /**
+     * Weak bidirectional character type "ET" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 5;
+
+    /**
+     * Weak bidirectional character type "AN" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_ARABIC_NUMBER = 6;
+
+    /**
+     * Weak bidirectional character type "CS" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 7;
+
+    /**
+     * Weak bidirectional character type "NSM" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_NONSPACING_MARK = 8;
+
+    /**
+     * Weak bidirectional character type "BN" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_BOUNDARY_NEUTRAL = 9;
+
+    /**
+     * Neutral bidirectional character type "B" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_PARAGRAPH_SEPARATOR = 10;
+
+    /**
+     * Neutral bidirectional character type "S" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_SEGMENT_SEPARATOR = 11;
+
+    /**
+     * Neutral bidirectional character type "WS" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_WHITESPACE = 12;
+
+    /**
+     * Neutral bidirectional character type "ON" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_OTHER_NEUTRALS = 13;
+
+    /**
+     * Strong bidirectional character type "LRE" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 14;
+
+    /**
+     * Strong bidirectional character type "LRO" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 15;
+
+    /**
+     * Strong bidirectional character type "RLE" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 16;
+
+    /**
+     * Strong bidirectional character type "RLO" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 17;
+
+    /**
+     * Weak bidirectional character type "PDF" in the Unicode specification.
+     * @since 1.4
+     */
+    public static final byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 18;
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uD800'</code>.
+     * A high-surrogate is also known as a <i>leading-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_HIGH_SURROGATE = '\uD800';
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDBFF'</code>.
+     * A high-surrogate is also known as a <i>leading-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_HIGH_SURROGATE = '\uDBFF';
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDC00'</code>.
+     * A low-surrogate is also known as a <i>trailing-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_LOW_SURROGATE  = '\uDC00';
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * in the UTF-16 encoding, constant <code>'&#92;uDFFF'</code>.
+     * A low-surrogate is also known as a <i>trailing-surrogate</i>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_LOW_SURROGATE  = '\uDFFF';
+
+    /**
+     * The minimum value of a Unicode surrogate code unit in the
+     * UTF-16 encoding, constant <code>'&#92;uD800'</code>.
+     *
+     * @since 1.5
+     */
+    public static final char MIN_SURROGATE = MIN_HIGH_SURROGATE;
+
+    /**
+     * The maximum value of a Unicode surrogate code unit in the
+     * UTF-16 encoding, constant <code>'&#92;uDFFF'</code>.
+     *
+     * @since 1.5
+     */
+    public static final char MAX_SURROGATE = MAX_LOW_SURROGATE;
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#supplementary_code_point">
+     * Unicode supplementary code point</a>, constant {@code U+10000}.
+     *
+     * @since 1.5
+     */
+    public static final int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
+
+    /**
+     * The minimum value of a
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point</a>, constant {@code U+0000}.
+     *
+     * @since 1.5
+     */
+    public static final int MIN_CODE_POINT = 0x000000;
+
+    /**
+     * The maximum value of a
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point</a>, constant {@code U+10FFFF}.
+     *
+     * @since 1.5
+     */
+    public static final int MAX_CODE_POINT = 0X10FFFF;
+
+
+    /**
+     * Instances of this class represent particular subsets of the Unicode
+     * character set.  The only family of subsets defined in the
+     * <code>Character</code> class is <code>{@link Character.UnicodeBlock
+     * UnicodeBlock}</code>.  Other portions of the Java API may define other
+     * subsets for their own purposes.
+     *
+     * @since 1.2
+     */
+    public static class Subset  {
+
+        private String name;
+
+        /**
+         * Constructs a new <code>Subset</code> instance.
+         *
+         * @exception NullPointerException if name is <code>null</code>
+         * @param  name  The name of this subset
+         */
+        protected Subset(String name) {
+            if (name == null) {
+                throw new NullPointerException("name");
+            }
+            this.name = name;
+        }
+
+        /**
+         * Compares two <code>Subset</code> objects for equality.
+         * This method returns <code>true</code> if and only if
+         * <code>this</code> and the argument refer to the same
+         * object; since this method is <code>final</code>, this
+         * guarantee holds for all subclasses.
+         */
+        public final boolean equals(Object obj) {
+            return (this == obj);
+        }
+
+        /**
+         * Returns the standard hash code as defined by the
+         * <code>{@link Object#hashCode}</code> method.  This method
+         * is <code>final</code> in order to ensure that the
+         * <code>equals</code> and <code>hashCode</code> methods will
+         * be consistent in all subclasses.
+         */
+        public final int hashCode() {
+            return super.hashCode();
+        }
+
+        /**
+         * Returns the name of this subset.
+         */
+        public final String toString() {
+            return name;
+        }
+    }
+
+    /**
+     * A family of character subsets representing the character blocks in the
+     * Unicode specification. Character blocks generally define characters
+     * used for a specific script or purpose. A character is contained by
+     * at most one Unicode block.
+     *
+     * @since 1.2
+     */
+    public static final class UnicodeBlock extends Subset {
+
+        private static Map map = new HashMap();
+
+        /**
+         * Create a UnicodeBlock with the given identifier name.
+         * This name must be the same as the block identifier.
+         */
+        private UnicodeBlock(String idName) {
+            super(idName);
+            map.put(idName.toUpperCase(Locale.US), this);
+        }
+
+        /**
+         * Create a UnicodeBlock with the given identifier name and
+         * alias name.
+         */
+        private UnicodeBlock(String idName, String alias) {
+            this(idName);
+            map.put(alias.toUpperCase(Locale.US), this);
+        }
+
+        /**
+         * Create a UnicodeBlock with the given identifier name and
+         * alias names.
+         */
+        private UnicodeBlock(String idName, String[] aliasName) {
+            this(idName);
+            if (aliasName != null) {
+                for(int x=0; x<aliasName.length; ++x) {
+                    map.put(aliasName[x].toUpperCase(Locale.US), this);
+                }
+            }
+        }
+
+        /**
+         * Constant for the "Basic Latin" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock  BASIC_LATIN =
+            new UnicodeBlock("BASIC_LATIN", new String[] {"Basic Latin", "BasicLatin" });
+
+        /**
+         * Constant for the "Latin-1 Supplement" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LATIN_1_SUPPLEMENT =
+            new UnicodeBlock("LATIN_1_SUPPLEMENT", new String[]{ "Latin-1 Supplement", "Latin-1Supplement"});
+
+        /**
+         * Constant for the "Latin Extended-A" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LATIN_EXTENDED_A =
+            new UnicodeBlock("LATIN_EXTENDED_A", new String[]{ "Latin Extended-A", "LatinExtended-A"});
+
+        /**
+         * Constant for the "Latin Extended-B" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LATIN_EXTENDED_B =
+            new UnicodeBlock("LATIN_EXTENDED_B", new String[] {"Latin Extended-B", "LatinExtended-B"});
+
+        /**
+         * Constant for the "IPA Extensions" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock IPA_EXTENSIONS =
+            new UnicodeBlock("IPA_EXTENSIONS", new String[] {"IPA Extensions", "IPAExtensions"});
+
+        /**
+         * Constant for the "Spacing Modifier Letters" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock SPACING_MODIFIER_LETTERS =
+            new UnicodeBlock("SPACING_MODIFIER_LETTERS", new String[] { "Spacing Modifier Letters",
+                                                                        "SpacingModifierLetters"});
+
+        /**
+         * Constant for the "Combining Diacritical Marks" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS =
+            new UnicodeBlock("COMBINING_DIACRITICAL_MARKS", new String[] {"Combining Diacritical Marks",
+                                                                          "CombiningDiacriticalMarks" });
+
+        /**
+         * Constant for the "Greek and Coptic" Unicode character block.
+         * <p>
+         * This block was previously known as the "Greek" block.
+         *
+         * @since 1.2
+         */
+        public static final UnicodeBlock GREEK
+            = new UnicodeBlock("GREEK", new String[] {"Greek and Coptic", "GreekandCoptic"});
+
+        /**
+         * Constant for the "Cyrillic" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CYRILLIC =
+            new UnicodeBlock("CYRILLIC");
+
+        /**
+         * Constant for the "Armenian" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ARMENIAN =
+            new UnicodeBlock("ARMENIAN");
+
+        /**
+         * Constant for the "Hebrew" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HEBREW =
+            new UnicodeBlock("HEBREW");
+
+        /**
+         * Constant for the "Arabic" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ARABIC =
+            new UnicodeBlock("ARABIC");
+
+        /**
+         * Constant for the "Devanagari" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock DEVANAGARI =
+            new UnicodeBlock("DEVANAGARI");
+
+        /**
+         * Constant for the "Bengali" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock BENGALI =
+            new UnicodeBlock("BENGALI");
+
+        /**
+         * Constant for the "Gurmukhi" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GURMUKHI =
+            new UnicodeBlock("GURMUKHI");
+
+        /**
+         * Constant for the "Gujarati" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GUJARATI =
+            new UnicodeBlock("GUJARATI");
+
+        /**
+         * Constant for the "Oriya" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ORIYA =
+            new UnicodeBlock("ORIYA");
+
+        /**
+         * Constant for the "Tamil" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock TAMIL =
+            new UnicodeBlock("TAMIL");
+
+        /**
+         * Constant for the "Telugu" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock TELUGU =
+            new UnicodeBlock("TELUGU");
+
+        /**
+         * Constant for the "Kannada" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock KANNADA =
+            new UnicodeBlock("KANNADA");
+
+        /**
+         * Constant for the "Malayalam" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock MALAYALAM =
+            new UnicodeBlock("MALAYALAM");
+
+        /**
+         * Constant for the "Thai" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock THAI =
+            new UnicodeBlock("THAI");
+
+        /**
+         * Constant for the "Lao" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LAO =
+            new UnicodeBlock("LAO");
+
+        /**
+         * Constant for the "Tibetan" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock TIBETAN =
+            new UnicodeBlock("TIBETAN");
+
+        /**
+         * Constant for the "Georgian" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GEORGIAN =
+            new UnicodeBlock("GEORGIAN");
+
+        /**
+         * Constant for the "Hangul Jamo" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HANGUL_JAMO =
+            new UnicodeBlock("HANGUL_JAMO", new String[] {"Hangul Jamo", "HangulJamo"});
+
+        /**
+         * Constant for the "Latin Extended Additional" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LATIN_EXTENDED_ADDITIONAL =
+            new UnicodeBlock("LATIN_EXTENDED_ADDITIONAL", new String[] {"Latin Extended Additional",
+                                                                        "LatinExtendedAdditional"});
+
+        /**
+         * Constant for the "Greek Extended" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GREEK_EXTENDED =
+            new UnicodeBlock("GREEK_EXTENDED", new String[] {"Greek Extended", "GreekExtended"});
+
+        /**
+         * Constant for the "General Punctuation" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GENERAL_PUNCTUATION =
+            new UnicodeBlock("GENERAL_PUNCTUATION", new String[] {"General Punctuation", "GeneralPunctuation"});
+
+        /**
+         * Constant for the "Superscripts and Subscripts" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS =
+            new UnicodeBlock("SUPERSCRIPTS_AND_SUBSCRIPTS", new String[] {"Superscripts and Subscripts",
+                                                                          "SuperscriptsandSubscripts" });
+
+        /**
+         * Constant for the "Currency Symbols" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CURRENCY_SYMBOLS =
+            new UnicodeBlock("CURRENCY_SYMBOLS", new String[] { "Currency Symbols", "CurrencySymbols"});
+
+        /**
+         * Constant for the "Combining Diacritical Marks for Symbols" Unicode character block.
+         * <p>
+         * This block was previously known as "Combining Marks for Symbols".
+         * @since 1.2
+         */
+        public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS =
+            new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS", new String[] {"Combining Diacritical Marks for Symbols",
+                                                                                                                                                   "CombiningDiacriticalMarksforSymbols",
+                                                                           "Combining Marks for Symbols",
+                                                                           "CombiningMarksforSymbols" });
+
+        /**
+         * Constant for the "Letterlike Symbols" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock LETTERLIKE_SYMBOLS =
+            new UnicodeBlock("LETTERLIKE_SYMBOLS", new String[] { "Letterlike Symbols", "LetterlikeSymbols"});
+
+        /**
+         * Constant for the "Number Forms" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock NUMBER_FORMS =
+            new UnicodeBlock("NUMBER_FORMS", new String[] {"Number Forms", "NumberForms"});
+
+        /**
+         * Constant for the "Arrows" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ARROWS =
+            new UnicodeBlock("ARROWS");
+
+        /**
+         * Constant for the "Mathematical Operators" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock MATHEMATICAL_OPERATORS =
+            new UnicodeBlock("MATHEMATICAL_OPERATORS", new String[] {"Mathematical Operators",
+                                                                     "MathematicalOperators"});
+
+        /**
+         * Constant for the "Miscellaneous Technical" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock MISCELLANEOUS_TECHNICAL =
+            new UnicodeBlock("MISCELLANEOUS_TECHNICAL", new String[] {"Miscellaneous Technical",
+                                                                      "MiscellaneousTechnical"});
+
+        /**
+         * Constant for the "Control Pictures" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CONTROL_PICTURES =
+            new UnicodeBlock("CONTROL_PICTURES", new String[] {"Control Pictures", "ControlPictures"});
+
+        /**
+         * Constant for the "Optical Character Recognition" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock OPTICAL_CHARACTER_RECOGNITION =
+            new UnicodeBlock("OPTICAL_CHARACTER_RECOGNITION", new String[] {"Optical Character Recognition",
+                                                                            "OpticalCharacterRecognition"});
+
+        /**
+         * Constant for the "Enclosed Alphanumerics" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ENCLOSED_ALPHANUMERICS =
+            new UnicodeBlock("ENCLOSED_ALPHANUMERICS", new String[] {"Enclosed Alphanumerics",
+                                                                     "EnclosedAlphanumerics"});
+
+        /**
+         * Constant for the "Box Drawing" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock BOX_DRAWING =
+            new UnicodeBlock("BOX_DRAWING", new String[] {"Box Drawing", "BoxDrawing"});
+
+        /**
+         * Constant for the "Block Elements" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock BLOCK_ELEMENTS =
+            new UnicodeBlock("BLOCK_ELEMENTS", new String[] {"Block Elements", "BlockElements"});
+
+        /**
+         * Constant for the "Geometric Shapes" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock GEOMETRIC_SHAPES =
+            new UnicodeBlock("GEOMETRIC_SHAPES", new String[] {"Geometric Shapes", "GeometricShapes"});
+
+        /**
+         * Constant for the "Miscellaneous Symbols" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock MISCELLANEOUS_SYMBOLS =
+            new UnicodeBlock("MISCELLANEOUS_SYMBOLS", new String[] {"Miscellaneous Symbols",
+                                                                    "MiscellaneousSymbols"});
+
+        /**
+         * Constant for the "Dingbats" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock DINGBATS =
+            new UnicodeBlock("DINGBATS");
+
+        /**
+         * Constant for the "CJK Symbols and Punctuation" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION =
+            new UnicodeBlock("CJK_SYMBOLS_AND_PUNCTUATION", new String[] {"CJK Symbols and Punctuation",
+                                                                          "CJKSymbolsandPunctuation"});
+
+        /**
+         * Constant for the "Hiragana" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HIRAGANA =
+            new UnicodeBlock("HIRAGANA");
+
+        /**
+         * Constant for the "Katakana" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock KATAKANA =
+            new UnicodeBlock("KATAKANA");
+
+        /**
+         * Constant for the "Bopomofo" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock BOPOMOFO =
+            new UnicodeBlock("BOPOMOFO");
+
+        /**
+         * Constant for the "Hangul Compatibility Jamo" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HANGUL_COMPATIBILITY_JAMO =
+            new UnicodeBlock("HANGUL_COMPATIBILITY_JAMO", new String[] {"Hangul Compatibility Jamo",
+                                                                        "HangulCompatibilityJamo"});
+
+        /**
+         * Constant for the "Kanbun" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock KANBUN =
+            new UnicodeBlock("KANBUN");
+
+        /**
+         * Constant for the "Enclosed CJK Letters and Months" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS =
+            new UnicodeBlock("ENCLOSED_CJK_LETTERS_AND_MONTHS", new String[] {"Enclosed CJK Letters and Months",
+                                                                              "EnclosedCJKLettersandMonths"});
+
+        /**
+         * Constant for the "CJK Compatibility" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CJK_COMPATIBILITY =
+            new UnicodeBlock("CJK_COMPATIBILITY", new String[] {"CJK Compatibility", "CJKCompatibility"});
+
+        /**
+         * Constant for the "CJK Unified Ideographs" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CJK_UNIFIED_IDEOGRAPHS =
+            new UnicodeBlock("CJK_UNIFIED_IDEOGRAPHS", new String[] {"CJK Unified Ideographs",
+                                                                     "CJKUnifiedIdeographs"});
+
+        /**
+         * Constant for the "Hangul Syllables" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HANGUL_SYLLABLES =
+            new UnicodeBlock("HANGUL_SYLLABLES", new String[] {"Hangul Syllables", "HangulSyllables"});
+
+        /**
+         * Constant for the "Private Use Area" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock PRIVATE_USE_AREA =
+            new UnicodeBlock("PRIVATE_USE_AREA", new String[] {"Private Use Area", "PrivateUseArea"});
+
+        /**
+         * Constant for the "CJK Compatibility Ideographs" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS =
+            new UnicodeBlock("CJK_COMPATIBILITY_IDEOGRAPHS",
+                             new String[] {"CJK Compatibility Ideographs",
+                                           "CJKCompatibilityIdeographs"});
+
+        /**
+         * Constant for the "Alphabetic Presentation Forms" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ALPHABETIC_PRESENTATION_FORMS =
+            new UnicodeBlock("ALPHABETIC_PRESENTATION_FORMS", new String[] {"Alphabetic Presentation Forms",
+                                                                            "AlphabeticPresentationForms"});
+
+        /**
+         * Constant for the "Arabic Presentation Forms-A" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ARABIC_PRESENTATION_FORMS_A =
+            new UnicodeBlock("ARABIC_PRESENTATION_FORMS_A", new String[] {"Arabic Presentation Forms-A",
+                                                                          "ArabicPresentationForms-A"});
+
+        /**
+         * Constant for the "Combining Half Marks" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock COMBINING_HALF_MARKS =
+            new UnicodeBlock("COMBINING_HALF_MARKS", new String[] {"Combining Half Marks",
+                                                                   "CombiningHalfMarks"});
+
+        /**
+         * Constant for the "CJK Compatibility Forms" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock CJK_COMPATIBILITY_FORMS =
+            new UnicodeBlock("CJK_COMPATIBILITY_FORMS", new String[] {"CJK Compatibility Forms",
+                                                                      "CJKCompatibilityForms"});
+
+        /**
+         * Constant for the "Small Form Variants" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock SMALL_FORM_VARIANTS =
+            new UnicodeBlock("SMALL_FORM_VARIANTS", new String[] {"Small Form Variants",
+                                                                  "SmallFormVariants"});
+
+        /**
+         * Constant for the "Arabic Presentation Forms-B" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock ARABIC_PRESENTATION_FORMS_B =
+            new UnicodeBlock("ARABIC_PRESENTATION_FORMS_B", new String[] {"Arabic Presentation Forms-B",
+                                                                          "ArabicPresentationForms-B"});
+
+        /**
+         * Constant for the "Halfwidth and Fullwidth Forms" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS =
+            new UnicodeBlock("HALFWIDTH_AND_FULLWIDTH_FORMS",
+                             new String[] {"Halfwidth and Fullwidth Forms",
+                                           "HalfwidthandFullwidthForms"});
+
+        /**
+         * Constant for the "Specials" Unicode character block.
+         * @since 1.2
+         */
+        public static final UnicodeBlock SPECIALS =
+            new UnicodeBlock("SPECIALS");
+
+        /**
+         * @deprecated As of J2SE 5, use {@link #HIGH_SURROGATES},
+         *             {@link #HIGH_PRIVATE_USE_SURROGATES}, and
+         *             {@link #LOW_SURROGATES}. These new constants match
+         *             the block definitions of the Unicode Standard.
+         *             The {@link #of(char)} and {@link #of(int)} methods
+         *             return the new constants, not SURROGATES_AREA.
+         */
+        
+        public static final UnicodeBlock SURROGATES_AREA =
+            new UnicodeBlock("SURROGATES_AREA");
+
+        /**
+         * Constant for the "Syriac" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock SYRIAC =
+            new UnicodeBlock("SYRIAC");
+
+        /**
+         * Constant for the "Thaana" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock THAANA =
+            new UnicodeBlock("THAANA");
+
+        /**
+         * Constant for the "Sinhala" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock SINHALA =
+            new UnicodeBlock("SINHALA");
+
+        /**
+         * Constant for the "Myanmar" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock MYANMAR =
+            new UnicodeBlock("MYANMAR");
+
+        /**
+         * Constant for the "Ethiopic" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock ETHIOPIC =
+            new UnicodeBlock("ETHIOPIC");
+
+        /**
+         * Constant for the "Cherokee" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock CHEROKEE =
+            new UnicodeBlock("CHEROKEE");
+
+        /**
+         * Constant for the "Unified Canadian Aboriginal Syllabics" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS =
+            new UnicodeBlock("UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS",
+                             new String[] {"Unified Canadian Aboriginal Syllabics",
+                                           "UnifiedCanadianAboriginalSyllabics"});
+
+        /**
+         * Constant for the "Ogham" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock OGHAM =
+                             new UnicodeBlock("OGHAM");
+
+        /**
+         * Constant for the "Runic" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock RUNIC =
+                             new UnicodeBlock("RUNIC");
+
+        /**
+         * Constant for the "Khmer" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock KHMER =
+                             new UnicodeBlock("KHMER");
+
+        /**
+         * Constant for the "Mongolian" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock MONGOLIAN =
+                             new UnicodeBlock("MONGOLIAN");
+
+        /**
+         * Constant for the "Braille Patterns" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock BRAILLE_PATTERNS =
+            new UnicodeBlock("BRAILLE_PATTERNS", new String[] {"Braille Patterns",
+                                                               "BraillePatterns"});
+
+        /**
+         * Constant for the "CJK Radicals Supplement" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock CJK_RADICALS_SUPPLEMENT =
+             new UnicodeBlock("CJK_RADICALS_SUPPLEMENT", new String[] {"CJK Radicals Supplement",
+                                                                       "CJKRadicalsSupplement"});
+
+        /**
+         * Constant for the "Kangxi Radicals" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock KANGXI_RADICALS =
+            new UnicodeBlock("KANGXI_RADICALS", new String[] {"Kangxi Radicals", "KangxiRadicals"});
+
+        /**
+         * Constant for the "Ideographic Description Characters" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS =
+            new UnicodeBlock("IDEOGRAPHIC_DESCRIPTION_CHARACTERS", new String[] {"Ideographic Description Characters",
+                                                                                 "IdeographicDescriptionCharacters"});
+
+        /**
+         * Constant for the "Bopomofo Extended" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock BOPOMOFO_EXTENDED =
+            new UnicodeBlock("BOPOMOFO_EXTENDED", new String[] {"Bopomofo Extended",
+                                                                "BopomofoExtended"});
+
+        /**
+         * Constant for the "CJK Unified Ideographs Extension A" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A =
+            new UnicodeBlock("CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A", new String[] {"CJK Unified Ideographs Extension A",
+                                                                                 "CJKUnifiedIdeographsExtensionA"});
+
+        /**
+         * Constant for the "Yi Syllables" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock YI_SYLLABLES =
+            new UnicodeBlock("YI_SYLLABLES", new String[] {"Yi Syllables", "YiSyllables"});
+
+        /**
+         * Constant for the "Yi Radicals" Unicode character block.
+         * @since 1.4
+         */
+        public static final UnicodeBlock YI_RADICALS =
+            new UnicodeBlock("YI_RADICALS", new String[] {"Yi Radicals", "YiRadicals"});
+
+
+        /**
+         * Constant for the "Cyrillic Supplementary" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock CYRILLIC_SUPPLEMENTARY =
+            new UnicodeBlock("CYRILLIC_SUPPLEMENTARY",
+                             new String[] {"Cyrillic Supplementary",
+                                           "CyrillicSupplementary",
+                                           "Cyrillic Supplement",
+                                           "CyrillicSupplement"});
+
+        /**
+         * Constant for the "Tagalog" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock TAGALOG =
+            new UnicodeBlock("TAGALOG");
+
+        /**
+         * Constant for the "Hanunoo" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock HANUNOO =
+            new UnicodeBlock("HANUNOO");
+
+        /**
+         * Constant for the "Buhid" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock BUHID =
+            new UnicodeBlock("BUHID");
+
+        /**
+         * Constant for the "Tagbanwa" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock TAGBANWA =
+            new UnicodeBlock("TAGBANWA");
+
+        /**
+         * Constant for the "Limbu" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock LIMBU =
+            new UnicodeBlock("LIMBU");
+
+        /**
+         * Constant for the "Tai Le" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock TAI_LE =
+            new UnicodeBlock("TAI_LE", new String[] {"Tai Le", "TaiLe"});
+
+        /**
+         * Constant for the "Khmer Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock KHMER_SYMBOLS =
+            new UnicodeBlock("KHMER_SYMBOLS", new String[] {"Khmer Symbols", "KhmerSymbols"});
+
+        /**
+         * Constant for the "Phonetic Extensions" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock PHONETIC_EXTENSIONS =
+            new UnicodeBlock("PHONETIC_EXTENSIONS", new String[] {"Phonetic Extensions", "PhoneticExtensions"});
+
+        /**
+         * Constant for the "Miscellaneous Mathematical Symbols-A" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A =
+            new UnicodeBlock("MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A",
+                             new String[]{"Miscellaneous Mathematical Symbols-A",
+                                          "MiscellaneousMathematicalSymbols-A"});
+
+        /**
+         * Constant for the "Supplemental Arrows-A" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SUPPLEMENTAL_ARROWS_A =
+            new UnicodeBlock("SUPPLEMENTAL_ARROWS_A", new String[] {"Supplemental Arrows-A",
+                                                                    "SupplementalArrows-A"});
+
+        /**
+         * Constant for the "Supplemental Arrows-B" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SUPPLEMENTAL_ARROWS_B =
+            new UnicodeBlock("SUPPLEMENTAL_ARROWS_B", new String[] {"Supplemental Arrows-B",
+                                                                    "SupplementalArrows-B"});
+
+        /**
+         * Constant for the "Miscellaneous Mathematical Symbols-B" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B
+                = new UnicodeBlock("MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B",
+                                   new String[] {"Miscellaneous Mathematical Symbols-B",
+                                                 "MiscellaneousMathematicalSymbols-B"});
+
+        /**
+         * Constant for the "Supplemental Mathematical Operators" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SUPPLEMENTAL_MATHEMATICAL_OPERATORS =
+            new UnicodeBlock("SUPPLEMENTAL_MATHEMATICAL_OPERATORS",
+                             new String[]{"Supplemental Mathematical Operators",
+                                          "SupplementalMathematicalOperators"} );
+
+        /**
+         * Constant for the "Miscellaneous Symbols and Arrows" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_ARROWS =
+            new UnicodeBlock("MISCELLANEOUS_SYMBOLS_AND_ARROWS", new String[] {"Miscellaneous Symbols and Arrows",
+                                                                               "MiscellaneousSymbolsandArrows"});
+
+        /**
+         * Constant for the "Katakana Phonetic Extensions" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock KATAKANA_PHONETIC_EXTENSIONS =
+            new UnicodeBlock("KATAKANA_PHONETIC_EXTENSIONS", new String[] {"Katakana Phonetic Extensions",
+                                                                           "KatakanaPhoneticExtensions"});
+
+        /**
+         * Constant for the "Yijing Hexagram Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock YIJING_HEXAGRAM_SYMBOLS =
+            new UnicodeBlock("YIJING_HEXAGRAM_SYMBOLS", new String[] {"Yijing Hexagram Symbols",
+                                                                      "YijingHexagramSymbols"});
+
+        /**
+         * Constant for the "Variation Selectors" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock VARIATION_SELECTORS =
+            new UnicodeBlock("VARIATION_SELECTORS", new String[] {"Variation Selectors", "VariationSelectors"});
+
+        /**
+         * Constant for the "Linear B Syllabary" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock LINEAR_B_SYLLABARY =
+            new UnicodeBlock("LINEAR_B_SYLLABARY", new String[] {"Linear B Syllabary", "LinearBSyllabary"});
+
+        /**
+         * Constant for the "Linear B Ideograms" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock LINEAR_B_IDEOGRAMS =
+            new UnicodeBlock("LINEAR_B_IDEOGRAMS", new String[] {"Linear B Ideograms", "LinearBIdeograms"});
+
+        /**
+         * Constant for the "Aegean Numbers" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock AEGEAN_NUMBERS =
+            new UnicodeBlock("AEGEAN_NUMBERS", new String[] {"Aegean Numbers", "AegeanNumbers"});
+
+        /**
+         * Constant for the "Old Italic" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock OLD_ITALIC =
+            new UnicodeBlock("OLD_ITALIC", new String[] {"Old Italic", "OldItalic"});
+
+        /**
+         * Constant for the "Gothic" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock GOTHIC = new UnicodeBlock("GOTHIC");
+
+        /**
+         * Constant for the "Ugaritic" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock UGARITIC = new UnicodeBlock("UGARITIC");
+
+        /**
+         * Constant for the "Deseret" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock DESERET = new UnicodeBlock("DESERET");
+
+        /**
+         * Constant for the "Shavian" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SHAVIAN = new UnicodeBlock("SHAVIAN");
+
+        /**
+         * Constant for the "Osmanya" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock OSMANYA = new UnicodeBlock("OSMANYA");
+
+        /**
+         * Constant for the "Cypriot Syllabary" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock CYPRIOT_SYLLABARY =
+            new UnicodeBlock("CYPRIOT_SYLLABARY", new String[] {"Cypriot Syllabary", "CypriotSyllabary"});
+
+        /**
+         * Constant for the "Byzantine Musical Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock BYZANTINE_MUSICAL_SYMBOLS =
+            new UnicodeBlock("BYZANTINE_MUSICAL_SYMBOLS", new String[] {"Byzantine Musical Symbols",
+                                                                        "ByzantineMusicalSymbols"});
+
+        /**
+         * Constant for the "Musical Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock MUSICAL_SYMBOLS =
+            new UnicodeBlock("MUSICAL_SYMBOLS", new String[] {"Musical Symbols", "MusicalSymbols"});
+
+        /**
+         * Constant for the "Tai Xuan Jing Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock TAI_XUAN_JING_SYMBOLS =
+            new UnicodeBlock("TAI_XUAN_JING_SYMBOLS", new String[] {"Tai Xuan Jing Symbols",
+                                                                     "TaiXuanJingSymbols"});
+
+        /**
+         * Constant for the "Mathematical Alphanumeric Symbols" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock MATHEMATICAL_ALPHANUMERIC_SYMBOLS =
+            new UnicodeBlock("MATHEMATICAL_ALPHANUMERIC_SYMBOLS",
+                             new String[] {"Mathematical Alphanumeric Symbols", "MathematicalAlphanumericSymbols"});
+
+        /**
+         * Constant for the "CJK Unified Ideographs Extension B" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B =
+            new UnicodeBlock("CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B",
+                             new String[] {"CJK Unified Ideographs Extension B", "CJKUnifiedIdeographsExtensionB"});
+
+        /**
+         * Constant for the "CJK Compatibility Ideographs Supplement" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT =
+            new UnicodeBlock("CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT",
+                             new String[]{"CJK Compatibility Ideographs Supplement",
+                                          "CJKCompatibilityIdeographsSupplement"});
+
+        /**
+         * Constant for the "Tags" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock TAGS = new UnicodeBlock("TAGS");
+
+        /**
+         * Constant for the "Variation Selectors Supplement" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock VARIATION_SELECTORS_SUPPLEMENT =
+            new UnicodeBlock("VARIATION_SELECTORS_SUPPLEMENT", new String[] {"Variation Selectors Supplement",
+                                                                             "VariationSelectorsSupplement"});
+
+        /**
+         * Constant for the "Supplementary Private Use Area-A" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A =
+            new UnicodeBlock("SUPPLEMENTARY_PRIVATE_USE_AREA_A",
+                             new String[] {"Supplementary Private Use Area-A",
+                                           "SupplementaryPrivateUseArea-A"});
+
+        /**
+         * Constant for the "Supplementary Private Use Area-B" Unicode character block.
+         * @since 1.5
+         */
+        public static final UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B =
+            new UnicodeBlock("SUPPLEMENTARY_PRIVATE_USE_AREA_B",
+                             new String[] {"Supplementary Private Use Area-B",
+                                           "SupplementaryPrivateUseArea-B"});
+
+        /**
+         * Constant for the "High Surrogates" Unicode character block.
+         * This block represents codepoint values in the high surrogate
+         * range: 0xD800 through 0xDB7F
+         *
+         * @since 1.5
+         */
+        public static final UnicodeBlock HIGH_SURROGATES =
+            new UnicodeBlock("HIGH_SURROGATES", new String[] {"High Surrogates", "HighSurrogates"});
+
+        /**
+         * Constant for the "High Private Use Surrogates" Unicode character block.
+         * This block represents codepoint values in the high surrogate
+         * range: 0xDB80 through 0xDBFF
+         *
+         * @since 1.5
+         */
+        public static final UnicodeBlock HIGH_PRIVATE_USE_SURROGATES =
+            new UnicodeBlock("HIGH_PRIVATE_USE_SURROGATES", new String[] { "High Private Use Surrogates",
+                                                                           "HighPrivateUseSurrogates"});
+
+        /**
+         * Constant for the "Low Surrogates" Unicode character block.
+         * This block represents codepoint values in the high surrogate
+         * range: 0xDC00 through 0xDFFF
+         *
+         * @since 1.5
+         */
+        public static final UnicodeBlock LOW_SURROGATES =
+            new UnicodeBlock("LOW_SURROGATES", new String[] {"Low Surrogates", "LowSurrogates"});
+
+        /**
+         * Constant for the "Arabic Supplement" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ARABIC_SUPPLEMENT =
+            new UnicodeBlock("ARABIC_SUPPLEMENT",
+                             new String[] { "Arabic Supplement",
+                                            "ArabicSupplement"});
+
+        /**
+         * Constant for the "NKo" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock NKO = new UnicodeBlock("NKO");
+
+        /**
+         * Constant for the "Ethiopic Supplement" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ETHIOPIC_SUPPLEMENT =
+            new UnicodeBlock("ETHIOPIC_SUPPLEMENT",
+                             new String[] { "Ethiopic Supplement",
+                                            "EthiopicSupplement"});
+
+        /**
+         * Constant for the "New Tai Lue" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock NEW_TAI_LUE =
+            new UnicodeBlock("NEW_TAI_LUE",
+                             new String[] { "New Tai Lue",
+                                            "NewTaiLue"});
+
+        /**
+         * Constant for the "Buginese" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock BUGINESE =
+            new UnicodeBlock("BUGINESE");
+
+        /**
+         * Constant for the "Balinese" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock BALINESE =
+            new UnicodeBlock("BALINESE");
+
+        /**
+         * Constant for the "Sundanese" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock SUNDANESE =
+            new UnicodeBlock("SUNDANESE");
+
+        /**
+         * Constant for the "Lepcha" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock LEPCHA = new UnicodeBlock("LEPCHA");
+
+        /**
+         * Constant for the "Ol Chiki" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock OL_CHIKI =
+            new UnicodeBlock("OL_CHIKI",
+                             new String[] { "Ol Chiki",
+                                            "OlChiki"});
+
+        /**
+         * Constant for the "Phonetic Extensions Supplement" Unicode character
+         * block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT =
+            new UnicodeBlock("PHONETIC_EXTENSIONS_SUPPLEMENT",
+                             new String[] { "Phonetic Extensions Supplement",
+                                            "PhoneticExtensionsSupplement"});
+
+        /**
+         * Constant for the "Combining Diacritical Marks Supplement" Unicode
+         * character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT =
+            new UnicodeBlock("COMBINING_DIACRITICAL_MARKS_SUPPLEMENT",
+                             new String[] { "Combining Diacritical Marks Supplement",
+                                            "CombiningDiacriticalMarksSupplement"});
+
+        /**
+         * Constant for the "Glagolitic" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock GLAGOLITIC =
+            new UnicodeBlock("GLAGOLITIC");
+
+        /**
+         * Constant for the "Latin Extended-C" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock LATIN_EXTENDED_C =
+            new UnicodeBlock("LATIN_EXTENDED_C",
+                             new String[] { "Latin Extended-C",
+                                            "LatinExtended-C"});
+
+        /**
+         * Constant for the "Coptic" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock COPTIC = new UnicodeBlock("COPTIC");
+
+        /**
+         * Constant for the "Georgian Supplement" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock GEORGIAN_SUPPLEMENT =
+            new UnicodeBlock("GEORGIAN_SUPPLEMENT",
+                             new String[] { "Georgian Supplement",
+                                            "GeorgianSupplement"});
+
+        /**
+         * Constant for the "Tifinagh" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock TIFINAGH =
+            new UnicodeBlock("TIFINAGH");
+
+        /**
+         * Constant for the "Ethiopic Extended" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ETHIOPIC_EXTENDED =
+            new UnicodeBlock("ETHIOPIC_EXTENDED",
+                             new String[] { "Ethiopic Extended",
+                                            "EthiopicExtended"});
+
+        /**
+         * Constant for the "Cyrillic Extended-A" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CYRILLIC_EXTENDED_A =
+            new UnicodeBlock("CYRILLIC_EXTENDED_A",
+                             new String[] { "Cyrillic Extended-A",
+                                            "CyrillicExtended-A"});
+
+        /**
+         * Constant for the "Supplemental Punctuation" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock SUPPLEMENTAL_PUNCTUATION =
+            new UnicodeBlock("SUPPLEMENTAL_PUNCTUATION",
+                             new String[] { "Supplemental Punctuation",
+                                            "SupplementalPunctuation"});
+
+        /**
+         * Constant for the "CJK Strokes" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CJK_STROKES =
+            new UnicodeBlock("CJK_STROKES",
+                             new String[] { "CJK Strokes",
+                                            "CJKStrokes"});
+
+        /**
+         * Constant for the "Vai" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock VAI = new UnicodeBlock("VAI");
+
+        /**
+         * Constant for the "Cyrillic Extended-B" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CYRILLIC_EXTENDED_B =
+            new UnicodeBlock("CYRILLIC_EXTENDED_B",
+                             new String[] { "Cyrillic Extended-B",
+                                            "CyrillicExtended-B"});
+
+        /**
+         * Constant for the "Modifier Tone Letters" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock MODIFIER_TONE_LETTERS =
+            new UnicodeBlock("MODIFIER_TONE_LETTERS",
+                             new String[] { "Modifier Tone Letters",
+                                            "ModifierToneLetters"});
+
+        /**
+         * Constant for the "Latin Extended-D" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock LATIN_EXTENDED_D =
+            new UnicodeBlock("LATIN_EXTENDED_D",
+                             new String[] { "Latin Extended-D",
+                                            "LatinExtended-D"});
+
+        /**
+         * Constant for the "Syloti Nagri" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock SYLOTI_NAGRI =
+            new UnicodeBlock("SYLOTI_NAGRI",
+                             new String[] { "Syloti Nagri",
+                                            "SylotiNagri"});
+
+        /**
+         * Constant for the "Phags-pa" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock PHAGS_PA =
+            new UnicodeBlock("PHAGS_PA", new String[] { "Phags-pa"});
+
+        /**
+         * Constant for the "Saurashtra" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock SAURASHTRA =
+            new UnicodeBlock("SAURASHTRA");
+
+        /**
+         * Constant for the "Kayah Li" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock KAYAH_LI =
+            new UnicodeBlock("KAYAH_LI",
+                             new String[] { "Kayah Li",
+                                            "KayahLi"});
+
+        /**
+         * Constant for the "Rejang" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock REJANG = new UnicodeBlock("REJANG");
+
+        /**
+         * Constant for the "Cham" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CHAM = new UnicodeBlock("CHAM");
+
+        /**
+         * Constant for the "Vertical Forms" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock VERTICAL_FORMS =
+            new UnicodeBlock("VERTICAL_FORMS",
+                             new String[] { "Vertical Forms",
+                                            "VerticalForms"});
+
+        /**
+         * Constant for the "Ancient Greek Numbers" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ANCIENT_GREEK_NUMBERS =
+            new UnicodeBlock("ANCIENT_GREEK_NUMBERS",
+                             new String[] { "Ancient Greek Numbers",
+                                            "AncientGreekNumbers"});
+
+        /**
+         * Constant for the "Ancient Symbols" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ANCIENT_SYMBOLS =
+            new UnicodeBlock("ANCIENT_SYMBOLS",
+                             new String[] { "Ancient Symbols",
+                                            "AncientSymbols"});
+
+        /**
+         * Constant for the "Phaistos Disc" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock PHAISTOS_DISC =
+            new UnicodeBlock("PHAISTOS_DISC",
+                             new String[] { "Phaistos Disc",
+                                            "PhaistosDisc"});
+
+        /**
+         * Constant for the "Lycian" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock LYCIAN = new UnicodeBlock("LYCIAN");
+
+        /**
+         * Constant for the "Carian" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CARIAN = new UnicodeBlock("CARIAN");
+
+        /**
+         * Constant for the "Old Persian" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock OLD_PERSIAN =
+            new UnicodeBlock("OLD_PERSIAN",
+                             new String[] { "Old Persian",
+                                            "OldPersian"});
+
+        /**
+         * Constant for the "Phoenician" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock PHOENICIAN =
+            new UnicodeBlock("PHOENICIAN");
+
+        /**
+         * Constant for the "Lydian" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock LYDIAN = new UnicodeBlock("LYDIAN");
+
+        /**
+         * Constant for the "Kharoshthi" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock KHAROSHTHI =
+            new UnicodeBlock("KHAROSHTHI");
+
+        /**
+         * Constant for the "Cuneiform" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CUNEIFORM =
+            new UnicodeBlock("CUNEIFORM");
+
+        /**
+         * Constant for the "Cuneiform Numbers and Punctuation" Unicode
+         * character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION =
+            new UnicodeBlock("CUNEIFORM_NUMBERS_AND_PUNCTUATION",
+                             new String[] { "Cuneiform Numbers and Punctuation",
+                                            "CuneiformNumbersandPunctuation"});
+
+        /**
+         * Constant for the "Ancient Greek Musical Notation" Unicode character
+         * block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION =
+            new UnicodeBlock("ANCIENT_GREEK_MUSICAL_NOTATION",
+                             new String[] { "Ancient Greek Musical Notation",
+                                            "AncientGreekMusicalNotation"});
+
+        /**
+         * Constant for the "Counting Rod Numerals" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock COUNTING_ROD_NUMERALS =
+            new UnicodeBlock("COUNTING_ROD_NUMERALS",
+                             new String[] { "Counting Rod Numerals",
+                                            "CountingRodNumerals"});
+
+        /**
+         * Constant for the "Mahjong Tiles" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock MAHJONG_TILES =
+            new UnicodeBlock("MAHJONG_TILES",
+                             new String[] { "Mahjong Tiles",
+                                            "MahjongTiles"});
+
+        /**
+         * Constant for the "Domino Tiles" Unicode character block.
+         * @since 1.7
+         */
+        public static final UnicodeBlock DOMINO_TILES =
+            new UnicodeBlock("DOMINO_TILES",
+                             new String[] { "Domino Tiles",
+                                            "DominoTiles"});
+
+        private static final int blockStarts[] = {
+            0x0000,   // 0000..007F; Basic Latin
+            0x0080,   // 0080..00FF; Latin-1 Supplement
+            0x0100,   // 0100..017F; Latin Extended-A
+            0x0180,   // 0180..024F; Latin Extended-B
+            0x0250,   // 0250..02AF; IPA Extensions
+            0x02B0,   // 02B0..02FF; Spacing Modifier Letters
+            0x0300,   // 0300..036F; Combining Diacritical Marks
+            0x0370,   // 0370..03FF; Greek and Coptic
+            0x0400,   // 0400..04FF; Cyrillic
+            0x0500,   // 0500..052F; Cyrillic Supplement
+            0x0530,   // 0530..058F; Armenian
+            0x0590,   // 0590..05FF; Hebrew
+            0x0600,   // 0600..06FF; Arabic
+            0x0700,   // 0700..074F; Syria
+            0x0750,   // 0750..077F; Arabic Supplement
+            0x0780,   // 0780..07BF; Thaana
+            0x07C0,   // 07C0..07FF; NKo
+            0x0800,   //             unassigned
+            0x0900,   // 0900..097F; Devanagari
+            0x0980,   // 0980..09FF; Bengali
+            0x0A00,   // 0A00..0A7F; Gurmukhi
+            0x0A80,   // 0A80..0AFF; Gujarati
+            0x0B00,   // 0B00..0B7F; Oriya
+            0x0B80,   // 0B80..0BFF; Tamil
+            0x0C00,   // 0C00..0C7F; Telugu
+            0x0C80,   // 0C80..0CFF; Kannada
+            0x0D00,   // 0D00..0D7F; Malayalam
+            0x0D80,   // 0D80..0DFF; Sinhala
+            0x0E00,   // 0E00..0E7F; Thai
+            0x0E80,   // 0E80..0EFF; Lao
+            0x0F00,   // 0F00..0FFF; Tibetan
+            0x1000,   // 1000..109F; Myanmar
+            0x10A0,   // 10A0..10FF; Georgian
+            0x1100,   // 1100..11FF; Hangul Jamo
+            0x1200,   // 1200..137F; Ethiopic
+            0x1380,   // 1380..139F; Ethiopic Supplement
+            0x13A0,   // 13A0..13FF; Cherokee
+            0x1400,   // 1400..167F; Unified Canadian Aboriginal Syllabics
+            0x1680,   // 1680..169F; Ogham
+            0x16A0,   // 16A0..16FF; Runic
+            0x1700,   // 1700..171F; Tagalog
+            0x1720,   // 1720..173F; Hanunoo
+            0x1740,   // 1740..175F; Buhid
+            0x1760,   // 1760..177F; Tagbanwa
+            0x1780,   // 1780..17FF; Khmer
+            0x1800,   // 1800..18AF; Mongolian
+            0x18B0,   //             unassigned
+            0x1900,   // 1900..194F; Limbu
+            0x1950,   // 1950..197F; Tai Le
+            0x1980,   // 1980..19DF; New Tai Lue
+            0x19E0,   // 19E0..19FF; Khmer Symbols
+            0x1A00,   // 1A00..1A1F; Buginese
+            0x1A20,   //             unassigned
+            0x1B00,   // 1B00..1B7F; Balinese
+            0x1B80,   // 1B80..1BBF; Sundanese
+            0x1BC0,   //             unassigned
+            0x1C00,   // 1C00..1C4F; Lepcha
+            0x1C50,   // 1C50..1C7F; Ol Chiki
+            0x1C80,   //             unassigned
+            0x1D00,   // 1D00..1D7F; Phonetic Extensions
+            0x1D80,   // 1D80..1DBF; Phonetic Extensions Supplement
+            0x1DC0,   // 1DC0..1DFF; Combining Diacritical Marks Supplement
+            0x1E00,   // 1E00..1EFF; Latin Extended Additional
+            0x1F00,   // 1F00..1FFF; Greek Extended
+            0x2000,   // 2000..206F; General Punctuation
+            0x2070,   // 2070..209F; Superscripts and Subscripts
+            0x20A0,   // 20A0..20CF; Currency Symbols
+            0x20D0,   // 20D0..20FF; Combining Diacritical Marks for Symbols
+            0x2100,   // 2100..214F; Letterlike Symbols
+            0x2150,   // 2150..218F; Number Forms
+            0x2190,   // 2190..21FF; Arrows
+            0x2200,   // 2200..22FF; Mathematical Operators
+            0x2300,   // 2300..23FF; Miscellaneous Technical
+            0x2400,   // 2400..243F; Control Pictures
+            0x2440,   // 2440..245F; Optical Character Recognition
+            0x2460,   // 2460..24FF; Enclosed Alphanumerics
+            0x2500,   // 2500..257F; Box Drawing
+            0x2580,   // 2580..259F; Block Elements
+            0x25A0,   // 25A0..25FF; Geometric Shapes
+            0x2600,   // 2600..26FF; Miscellaneous Symbols
+            0x2700,   // 2700..27BF; Dingbats
+            0x27C0,   // 27C0..27EF; Miscellaneous Mathematical Symbols-A
+            0x27F0,   // 27F0..27FF; Supplemental Arrows-A
+            0x2800,   // 2800..28FF; Braille Patterns
+            0x2900,   // 2900..297F; Supplemental Arrows-B
+            0x2980,   // 2980..29FF; Miscellaneous Mathematical Symbols-B
+            0x2A00,   // 2A00..2AFF; Supplemental Mathematical Operators
+            0x2B00,   // 2B00..2BFF; Miscellaneous Symbols and Arrows
+            0x2C00,   // 2C00..2C5F; Glagolitic
+            0x2C60,   // 2C60..2C7F; Latin Extended-C
+            0x2C80,   // 2C80..2CFF; Coptic
+            0x2D00,   // 2D00..2D2F; Georgian Supplement
+            0x2D30,   // 2D30..2D7F; Tifinagh
+            0x2D80,   // 2D80..2DDF; Ethiopic Extended
+            0x2DE0,   // 2DE0..2DFF; Cyrillic Extended-A
+            0x2E00,   // 2E00..2E7F; Supplemental Punctuation
+            0x2E80,   // 2E80..2EFF; CJK Radicals Supplement
+            0x2F00,   // 2F00..2FDF; Kangxi Radicals
+            0x2FE0,   //             unassigned
+            0x2FF0,   // 2FF0..2FFF; Ideographic Description Characters
+            0x3000,   // 3000..303F; CJK Symbols and Punctuation
+            0x3040,   // 3040..309F; Hiragana
+            0x30A0,   // 30A0..30FF; Katakana
+            0x3100,   // 3100..312F; Bopomofo
+            0x3130,   // 3130..318F; Hangul Compatibility Jamo
+            0x3190,   // 3190..319F; Kanbun
+            0x31A0,   // 31A0..31BF; Bopomofo Extended
+            0x31C0,   // 31C0..31EF; CJK Strokes
+            0x31F0,   // 31F0..31FF; Katakana Phonetic Extensions
+            0x3200,   // 3200..32FF; Enclosed CJK Letters and Months
+            0x3300,   // 3300..33FF; CJK Compatibility
+            0x3400,   // 3400..4DBF; CJK Unified Ideographs Extension A
+            0x4DC0,   // 4DC0..4DFF; Yijing Hexagram Symbols
+            0x4E00,   // 4E00..9FFF; CJK Unified Ideograph
+            0xA000,   // A000..A48F; Yi Syllables
+            0xA490,   // A490..A4CF; Yi Radicals
+            0xA4D0,   //             unassigned
+            0xA500,   // A500..A63F; Vai
+            0xA640,   // A640..A69F; Cyrillic Extended-B
+            0xA6A0,   //             unassigned
+            0xA700,   // A700..A71F; Modifier Tone Letters
+            0xA720,   // A720..A7FF; Latin Extended-D
+            0xA800,   // A800..A82F; Syloti Nagri
+            0xA830,   //             unassigned
+            0xA840,   // A840..A87F; Phags-pa
+            0xA880,   // A880..A8DF; Saurashtra
+            0xA8E0,   //             unassigned
+            0xA900,   // A900..A92F; Kayah Li
+            0xA930,   // A930..A95F; Rejang
+            0xA960,   //             unassigned
+            0xAA00,   // AA00..AA5F; Cham
+            0xAA60,   //             unassigned
+            0xAC00,   // AC00..D7AF; Hangul Syllables
+            0xD7B0,   //             unassigned
+            0xD800,   // D800..DB7F; High Surrogates
+            0xDB80,   // DB80..DBFF; High Private Use Surrogates
+            0xDC00,   // DC00..DFFF; Low Surrogates
+            0xE000,   // E000..F8FF; Private Use Area
+            0xF900,   // F900..FAFF; CJK Compatibility Ideographs
+            0xFB00,   // FB00..FB4F; Alphabetic Presentation Forms
+            0xFB50,   // FB50..FDFF; Arabic Presentation Forms-A
+            0xFE00,   // FE00..FE0F; Variation Selectors
+            0xFE10,   // FE10..FE1F; Vertical Forms
+            0xFE20,   // FE20..FE2F; Combining Half Marks
+            0xFE30,   // FE30..FE4F; CJK Compatibility Forms
+            0xFE50,   // FE50..FE6F; Small Form Variants
+            0xFE70,   // FE70..FEFF; Arabic Presentation Forms-B
+            0xFF00,   // FF00..FFEF; Halfwidth and Fullwidth Forms
+            0xFFF0,   // FFF0..FFFF; Specials
+            0x10000,  // 10000..1007F; Linear B Syllabary
+            0x10080,  // 10080..100FF; Linear B Ideograms
+            0x10100,  // 10100..1013F; Aegean Numbers
+            0x10140,  // 10140..1018F; Ancient Greek Numbers
+            0x10190,  // 10190..101CF; Ancient Symbols
+            0x101D0,  // 101D0..101FF; Phaistos Disc
+            0x10200,  //               unassigned
+            0x10280,  // 10280..1029F; Lycian
+            0x102A0,  // 102A0..102DF; Carian
+            0x102E0,  //               unassigned
+            0x10300,  // 10300..1032F; Old Italic
+            0x10330,  // 10330..1034F; Gothic
+            0x10350,  //               unassigned
+            0x10380,  // 10380..1039F; Ugaritic
+            0x103A0,  // 103A0..103DF; Old Persian
+            0x103E0,  //               unassigned
+            0x10400,  // 10400..1044F; Desere
+            0x10450,  // 10450..1047F; Shavian
+            0x10480,  // 10480..104AF; Osmanya
+            0x104B0,  //               unassigned
+            0x10800,  // 10800..1083F; Cypriot Syllabary
+            0x10840,  //               unassigned
+            0x10900,  // 10900..1091F; Phoenician
+            0x10920,  // 10920..1093F; Lydian
+            0x10940,  //               unassigned
+            0x10A00,  // 10A00..10A5F; Kharoshthi
+            0x10A60,  //               unassigned
+            0x12000,  // 12000..123FF; Cuneiform
+            0x12400,  // 12400..1247F; Cuneiform Numbers and Punctuation
+            0x12480,  //               unassigned
+            0x1D000,  // 1D000..1D0FF; Byzantine Musical Symbols
+            0x1D100,  // 1D100..1D1FF; Musical Symbols
+            0x1D200,  // 1D200..1D24F; Ancient Greek Musical Notation
+            0x1D250,  //               unassigned
+            0x1D300,  // 1D300..1D35F; Tai Xuan Jing Symbols
+            0x1D360,  // 1D360..1D37F; Counting Rod Numerals
+            0x1D380,  //               unassigned
+            0x1D400,  // 1D400..1D7FF; Mathematical Alphanumeric Symbols
+            0x1D800,  //               unassigned
+            0x1F000,  // 1F000..1F02F; Mahjong Tiles
+            0x1F030,  // 1F030..1F09F; Domino Tiles
+            0x1F0A0,  //               unassigned
+            0x20000,  // 20000..2A6DF; CJK Unified Ideographs Extension B
+            0x2A6E0,  //               unassigned
+            0x2F800,  // 2F800..2FA1F; CJK Compatibility Ideographs Supplement
+            0x2FA20,  //               unassigned
+            0xE0000,  // E0000..E007F; Tags
+            0xE0080,  //               unassigned
+            0xE0100,  // E0100..E01EF; Variation Selectors Supplement
+            0xE01F0,  //               unassigned
+            0xF0000,  // F0000..FFFFF; Supplementary Private Use Area-A
+            0x100000, // 100000..10FFFF; Supplementary Private Use Area-B
+        };
+
+        private static final UnicodeBlock[] blocks = {
+            BASIC_LATIN,
+            LATIN_1_SUPPLEMENT,
+            LATIN_EXTENDED_A,
+            LATIN_EXTENDED_B,
+            IPA_EXTENSIONS,
+            SPACING_MODIFIER_LETTERS,
+            COMBINING_DIACRITICAL_MARKS,
+            GREEK,
+            CYRILLIC,
+            CYRILLIC_SUPPLEMENTARY,
+            ARMENIAN,
+            HEBREW,
+            ARABIC,
+            SYRIAC,
+            ARABIC_SUPPLEMENT,
+            THAANA,
+            NKO,
+            null,
+            DEVANAGARI,
+            BENGALI,
+            GURMUKHI,
+            GUJARATI,
+            ORIYA,
+            TAMIL,
+            TELUGU,
+            KANNADA,
+            MALAYALAM,
+            SINHALA,
+            THAI,
+            LAO,
+            TIBETAN,
+            MYANMAR,
+            GEORGIAN,
+            HANGUL_JAMO,
+            ETHIOPIC,
+            ETHIOPIC_SUPPLEMENT,
+            CHEROKEE,
+            UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS,
+            OGHAM,
+            RUNIC,
+            TAGALOG,
+            HANUNOO,
+            BUHID,
+            TAGBANWA,
+            KHMER,
+            MONGOLIAN,
+            null,
+            LIMBU,
+            TAI_LE,
+            NEW_TAI_LUE,
+            KHMER_SYMBOLS,
+            BUGINESE,
+            null,
+            BALINESE,
+            SUNDANESE,
+            null,
+            LEPCHA,
+            OL_CHIKI,
+            null,
+            PHONETIC_EXTENSIONS,
+            PHONETIC_EXTENSIONS_SUPPLEMENT,
+            COMBINING_DIACRITICAL_MARKS_SUPPLEMENT,
+            LATIN_EXTENDED_ADDITIONAL,
+            GREEK_EXTENDED,
+            GENERAL_PUNCTUATION,
+            SUPERSCRIPTS_AND_SUBSCRIPTS,
+            CURRENCY_SYMBOLS,
+            COMBINING_MARKS_FOR_SYMBOLS,
+            LETTERLIKE_SYMBOLS,
+            NUMBER_FORMS,
+            ARROWS,
+            MATHEMATICAL_OPERATORS,
+            MISCELLANEOUS_TECHNICAL,
+            CONTROL_PICTURES,
+            OPTICAL_CHARACTER_RECOGNITION,
+            ENCLOSED_ALPHANUMERICS,
+            BOX_DRAWING,
+            BLOCK_ELEMENTS,
+            GEOMETRIC_SHAPES,
+            MISCELLANEOUS_SYMBOLS,
+            DINGBATS,
+            MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A,
+            SUPPLEMENTAL_ARROWS_A,
+            BRAILLE_PATTERNS,
+            SUPPLEMENTAL_ARROWS_B,
+            MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B,
+            SUPPLEMENTAL_MATHEMATICAL_OPERATORS,
+            MISCELLANEOUS_SYMBOLS_AND_ARROWS,
+            GLAGOLITIC,
+            LATIN_EXTENDED_C,
+            COPTIC,
+            GEORGIAN_SUPPLEMENT,
+            TIFINAGH,
+            ETHIOPIC_EXTENDED,
+            CYRILLIC_EXTENDED_A,
+            SUPPLEMENTAL_PUNCTUATION,
+            CJK_RADICALS_SUPPLEMENT,
+            KANGXI_RADICALS,
+            null,
+            IDEOGRAPHIC_DESCRIPTION_CHARACTERS,
+            CJK_SYMBOLS_AND_PUNCTUATION,
+            HIRAGANA,
+            KATAKANA,
+            BOPOMOFO,
+            HANGUL_COMPATIBILITY_JAMO,
+            KANBUN,
+            BOPOMOFO_EXTENDED,
+            CJK_STROKES,
+            KATAKANA_PHONETIC_EXTENSIONS,
+            ENCLOSED_CJK_LETTERS_AND_MONTHS,
+            CJK_COMPATIBILITY,
+            CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A,
+            YIJING_HEXAGRAM_SYMBOLS,
+            CJK_UNIFIED_IDEOGRAPHS,
+            YI_SYLLABLES,
+            YI_RADICALS,
+            null,
+            VAI,
+            CYRILLIC_EXTENDED_B,
+            null,
+            MODIFIER_TONE_LETTERS,
+            LATIN_EXTENDED_D,
+            SYLOTI_NAGRI,
+            null,
+            PHAGS_PA,
+            SAURASHTRA,
+            null,
+            KAYAH_LI,
+            REJANG,
+            null,
+            CHAM,
+            null,
+            HANGUL_SYLLABLES,
+            null,
+            HIGH_SURROGATES,
+            HIGH_PRIVATE_USE_SURROGATES,
+            LOW_SURROGATES,
+            PRIVATE_USE_AREA,
+            CJK_COMPATIBILITY_IDEOGRAPHS,
+            ALPHABETIC_PRESENTATION_FORMS,
+            ARABIC_PRESENTATION_FORMS_A,
+            VARIATION_SELECTORS,
+            VERTICAL_FORMS,
+            COMBINING_HALF_MARKS,
+            CJK_COMPATIBILITY_FORMS,
+            SMALL_FORM_VARIANTS,
+            ARABIC_PRESENTATION_FORMS_B,
+            HALFWIDTH_AND_FULLWIDTH_FORMS,
+            SPECIALS,
+            LINEAR_B_SYLLABARY,
+            LINEAR_B_IDEOGRAMS,
+            AEGEAN_NUMBERS,
+            ANCIENT_GREEK_NUMBERS,
+            ANCIENT_SYMBOLS,
+            PHAISTOS_DISC,
+            null,
+            LYCIAN,
+            CARIAN,
+            null,
+            OLD_ITALIC,
+            GOTHIC,
+            null,
+            UGARITIC,
+            OLD_PERSIAN,
+            null,
+            DESERET,
+            SHAVIAN,
+            OSMANYA,
+            null,
+            CYPRIOT_SYLLABARY,
+            null,
+            PHOENICIAN,
+            LYDIAN,
+            null,
+            KHAROSHTHI,
+            null,
+            CUNEIFORM,
+            CUNEIFORM_NUMBERS_AND_PUNCTUATION,
+            null,
+            BYZANTINE_MUSICAL_SYMBOLS,
+            MUSICAL_SYMBOLS,
+            ANCIENT_GREEK_MUSICAL_NOTATION,
+            null,
+            TAI_XUAN_JING_SYMBOLS,
+            COUNTING_ROD_NUMERALS,
+            null,
+            MATHEMATICAL_ALPHANUMERIC_SYMBOLS,
+            null,
+            MAHJONG_TILES,
+            DOMINO_TILES,
+            null,
+            CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B,
+            null,
+            CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT,
+            null,
+            TAGS,
+            null,
+            VARIATION_SELECTORS_SUPPLEMENT,
+            null,
+            SUPPLEMENTARY_PRIVATE_USE_AREA_A,
+            SUPPLEMENTARY_PRIVATE_USE_AREA_B
+        };
+
+
+        /**
+         * Returns the object representing the Unicode block containing the
+         * given character, or <code>null</code> if the character is not a
+         * member of a defined block.
+         *
+                 * <p><b>Note:</b> This method cannot handle <a
+                 * href="Character.html#supplementary"> supplementary
+                 * characters</a>. To support all Unicode characters,
+                 * including supplementary characters, use the {@link
+                 * #of(int)} method.
+         *
+         * @param   c  The character in question
+         * @return  The <code>UnicodeBlock</code> instance representing the
+         *          Unicode block of which this character is a member, or
+         *          <code>null</code> if the character is not a member of any
+         *          Unicode block
+         */
+        public static UnicodeBlock of(char c) {
+            return of((int)c);
+        }
+
+
+        /**
+         * Returns the object representing the Unicode block
+         * containing the given character (Unicode code point), or
+         * <code>null</code> if the character is not a member of a
+         * defined block.
+         *
+                 * @param   codePoint the character (Unicode code point) in question.
+         * @return  The <code>UnicodeBlock</code> instance representing the
+         *          Unicode block of which this character is a member, or
+         *          <code>null</code> if the character is not a member of any
+         *          Unicode block
+                 * @exception IllegalArgumentException if the specified
+                 * <code>codePoint</code> is an invalid Unicode code point.
+                 * @see Character#isValidCodePoint(int)
+                 * @since   1.5
+         */
+        public static UnicodeBlock of(int codePoint) {
+            if (!isValidCodePoint(codePoint)) {
+                throw new IllegalArgumentException();
+            }
+
+            int top, bottom, current;
+            bottom = 0;
+            top = blockStarts.length;
+            current = top/2;
+
+            // invariant: top > current >= bottom && codePoint >= unicodeBlockStarts[bottom]
+            while (top - bottom > 1) {
+                if (codePoint >= blockStarts[current]) {
+                    bottom = current;
+                } else {
+                    top = current;
+                }
+                current = (top + bottom) / 2;
+            }
+            return blocks[current];
+        }
+
+        /**
+         * Returns the UnicodeBlock with the given name. Block
+         * names are determined by The Unicode Standard. The file
+         * Blocks-&lt;version&gt;.txt defines blocks for a particular
+         * version of the standard. The {@link Character} class specifies
+         * the version of the standard that it supports.
+         * <p>
+         * This method accepts block names in the following forms:
+         * <ol>
+         * <li> Canonical block names as defined by the Unicode Standard.
+         * For example, the standard defines a "Basic Latin" block. Therefore, this
+         * method accepts "Basic Latin" as a valid block name. The documentation of
+         * each UnicodeBlock provides the canonical name.
+         * <li>Canonical block names with all spaces removed. For example, "BasicLatin"
+         * is a valid block name for the "Basic Latin" block.
+         * <li>The text representation of each constant UnicodeBlock identifier.
+         * For example, this method will return the {@link #BASIC_LATIN} block if
+         * provided with the "BASIC_LATIN" name. This form replaces all spaces and
+         *  hyphens in the canonical name with underscores.
+         * </ol>
+         * Finally, character case is ignored for all of the valid block name forms.
+         * For example, "BASIC_LATIN" and "basic_latin" are both valid block names.
+         * The en_US locale's case mapping rules are used to provide case-insensitive
+         * string comparisons for block name validation.
+         * <p>
+         * If the Unicode Standard changes block names, both the previous and
+         * current names will be accepted.
+         *
+         * @param blockName A <code>UnicodeBlock</code> name.
+         * @return The <code>UnicodeBlock</code> instance identified
+         *         by <code>blockName</code>
+         * @throws IllegalArgumentException if <code>blockName</code> is an
+         *         invalid name
+         * @throws NullPointerException if <code>blockName</code> is null
+         * @since 1.5
+         */
+        public static final UnicodeBlock forName(String blockName) {
+            UnicodeBlock block = (UnicodeBlock)map.get(blockName.toUpperCase(Locale.US));
+            if (block == null) {
+                throw new IllegalArgumentException();
+            }
+            return block;
+        }
+    }
+
+
+    /**
+     * The value of the <code>Character</code>.
+     *
+     * @serial
+     */
+    private final char value;
+
+    /** use serialVersionUID from JDK 1.0.2 for interoperability */
+    private static final long serialVersionUID = 3786198910865385080L;
+
+    /**
+     * Constructs a newly allocated <code>Character</code> object that
+     * represents the specified <code>char</code> value.
+     *
+     * @param  value   the value to be represented by the
+     *                  <code>Character</code> object.
+     */
+    public Character(char value) {
+        this.value = value;
+    }
+
+    private static class CharacterCache {
+        private CharacterCache(){}
+
+        static final Character cache[] = new Character[127 + 1];
+
+        static {
+            for(int i = 0; i < cache.length; i++)
+                cache[i] = new Character((char)i);
+        }
+    }
+
+    /**
+     * Returns a <tt>Character</tt> instance representing the specified
+     * <tt>char</tt> value.
+     * If a new <tt>Character</tt> instance is not required, this method
+     * should generally be used in preference to the constructor
+     * {@link #Character(char)}, as this method is likely to yield
+     * significantly better space and time performance by caching
+     * frequently requested values.
+     *
+     * This method will always cache values in the range {@code
+     * '\u005Cu0000'} to {@code '\u005Cu007f'}, inclusive, and may
+     * cache other values outside of this range.
+     *
+     * @param  c a char value.
+     * @return a <tt>Character</tt> instance representing <tt>c</tt>.
+     * @since  1.5
+     */
+    public static Character valueOf(char c) {
+        if(c <= 127) { // must cache
+            return CharacterCache.cache[(int)c];
+        }
+        return new Character(c);
+    }
+
+    /**
+     * Returns the value of this <code>Character</code> object.
+     * @return  the primitive <code>char</code> value represented by
+     *          this object.
+     */
+    public char charValue() {
+        return value;
+    }
+
+    /**
+     * Returns a hash code for this <code>Character</code>.
+     * @return  a hash code value for this object.
+     */
+    public int hashCode() {
+        return (int)value;
+    }
+
+    /**
+     * Compares this object against the specified object.
+     * The result is <code>true</code> if and only if the argument is not
+     * <code>null</code> and is a <code>Character</code> object that
+     * represents the same <code>char</code> value as this object.
+     *
+     * @param   obj   the object to compare with.
+     * @return  <code>true</code> if the objects are the same;
+     *          <code>false</code> otherwise.
+     */
+    public boolean equals(Object obj) {
+        if (obj instanceof Character) {
+            return value == ((Character)obj).charValue();
+        }
+        return false;
+    }
+
+    /**
+     * Returns a <code>String</code> object representing this
+     * <code>Character</code>'s value.  The result is a string of
+     * length 1 whose sole component is the primitive
+     * <code>char</code> value represented by this
+     * <code>Character</code> object.
+     *
+     * @return  a string representation of this object.
+     */
+    public String toString() {
+        char buf[] = {value};
+        return String.valueOf(buf);
+    }
+
+    /**
+     * Returns a <code>String</code> object representing the
+     * specified <code>char</code>.  The result is a string of length
+     * 1 consisting solely of the specified <code>char</code>.
+     *
+     * @param c the <code>char</code> to be converted
+     * @return the string representation of the specified <code>char</code>
+     * @since 1.4
+     */
+    public static String toString(char c) {
+        return String.valueOf(c);
+    }
+
+    /**
+     * Determines whether the specified code point is a valid
+     * <a href="http://www.unicode.org/glossary/#code_point">
+     * Unicode code point value</a>.
+     *
+     * @param  codePoint the Unicode code point to be tested
+     * @return {@code true} if the specified code point value is between
+     *         {@link #MIN_CODE_POINT} and
+     *         {@link #MAX_CODE_POINT} inclusive;
+     *         {@code false} otherwise.
+     * @since  1.5
+     */
+    public static boolean isValidCodePoint(int codePoint) {
+        return codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT;
+    }
+
+    /**
+     * Determines whether the specified character (Unicode code point)
+     * is in the <a href="#supplementary">supplementary character</a> range.
+     *
+     * @param  codePoint the character (Unicode code point) to be tested
+     * @return {@code true} if the specified code point is between
+     *         {@link #MIN_SUPPLEMENTARY_CODE_POINT} and
+     *         {@link #MAX_CODE_POINT} inclusive;
+     *         {@code false} otherwise.
+     * @since  1.5
+     */
+    public static boolean isSupplementaryCodePoint(int codePoint) {
+        return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT
+            && codePoint <= MAX_CODE_POINT;
+    }
+
+    /**
+     * Determines if the given {@code char} value is a
+     * <a href="http://www.unicode.org/glossary/#high_surrogate_code_unit">
+     * Unicode high-surrogate code unit</a>
+     * (also known as <i>leading-surrogate code unit</i>).
+     *
+     * <p>Such values do not represent characters by themselves,
+     * but are used in the representation of
+     * <a href="#supplementary">supplementary characters</a>
+     * in the UTF-16 encoding.
+     *
+     * @param  ch the {@code char} value to be tested.
+     * @return {@code true} if the {@code char} value is between
+     *         {@link #MIN_HIGH_SURROGATE} and
+     *         {@link #MAX_HIGH_SURROGATE} inclusive;
+     *         {@code false} otherwise.
+     * @see    #isLowSurrogate(char)
+     * @see    Character.UnicodeBlock#of(int)
+     * @since  1.5
+     */
+    public static boolean isHighSurrogate(char ch) {
+        return ch >= MIN_HIGH_SURROGATE && ch <= MAX_HIGH_SURROGATE;
+    }
+
+    /**
+     * Determines if the given {@code char} value is a
+     * <a href="http://www.unicode.org/glossary/#low_surrogate_code_unit">
+     * Unicode low-surrogate code unit</a>
+     * (also known as <i>trailing-surrogate code unit</i>).
+     *
+     * <p>Such values do not represent characters by themselves,
+     * but are used in the representation of
+     * <a href="#supplementary">supplementary characters</a>
+     * in the UTF-16 encoding.
+     *
+     * @param  ch the {@code char} value to be tested.
+     * @return {@code true} if the {@code char} value is between
+     *         {@link #MIN_LOW_SURROGATE} and
+     *         {@link #MAX_LOW_SURROGATE} inclusive;
+     *         {@code false} otherwise.
+     * @see    #isHighSurrogate(char)
+     * @since  1.5
+     */
+    public static boolean isLowSurrogate(char ch) {
+        return ch >= MIN_LOW_SURROGATE && ch <= MAX_LOW_SURROGATE;
+    }
+
+    /**
+     * Determines if the given {@code char} value is a Unicode
+     * <i>surrogate code unit</i>.
+     *
+     * <p>Such values do not represent characters by themselves,
+     * but are used in the representation of
+     * <a href="#supplementary">supplementary characters</a>
+     * in the UTF-16 encoding.
+     *
+     * <p>A char value is a surrogate code unit if and only if it is either
+     * a {@linkplain #isLowSurrogate(char) low-surrogate code unit} or
+     * a {@linkplain #isHighSurrogate(char) high-surrogate code unit}.
+     *
+     * @param  ch the {@code char} value to be tested.
+     * @return {@code true} if the {@code char} value is between
+     *         {@link #MIN_SURROGATE} and
+     *         {@link #MAX_SURROGATE} inclusive;
+     *         {@code false} otherwise.
+     * @since  1.7
+     */
+    public static boolean isSurrogate(char ch) {
+        return ch >= MIN_SURROGATE && ch <= MAX_SURROGATE;
+    }
+
+    /**
+     * Determines whether the specified pair of <code>char</code>
+     * values is a valid
+     * <a href="http://www.unicode.org/glossary/#surrogate_pair">
+     * Unicode surrogate pair</a>.
+
+     * <p>This method is equivalent to the expression:
+     * <blockquote><pre>
+     * isHighSurrogate(high) && isLowSurrogate(low)
+     * </pre></blockquote>
+     *
+     * @param  high the high-surrogate code value to be tested
+     * @param  low the low-surrogate code value to be tested
+     * @return <code>true</code> if the specified high and
+     * low-surrogate code values represent a valid surrogate pair;
+     * <code>false</code> otherwise.
+     * @since  1.5
+     */
+    public static boolean isSurrogatePair(char high, char low) {
+        return isHighSurrogate(high) && isLowSurrogate(low);
+    }
+
+    /**
+     * Determines the number of <code>char</code> values needed to
+     * represent the specified character (Unicode code point). If the
+     * specified character is equal to or greater than 0x10000, then
+     * the method returns 2. Otherwise, the method returns 1.
+     *
+     * <p>This method doesn't validate the specified character to be a
+     * valid Unicode code point. The caller must validate the
+     * character value using {@link #isValidCodePoint(int) isValidCodePoint}
+     * if necessary.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  2 if the character is a valid supplementary character; 1 otherwise.
+     * @see     #isSupplementaryCodePoint(int)
+     * @since   1.5
+     */
+    public static int charCount(int codePoint) {
+        return codePoint >= MIN_SUPPLEMENTARY_CODE_POINT? 2 : 1;
+    }
+
+    /**
+     * Converts the specified surrogate pair to its supplementary code
+     * point value. This method does not validate the specified
+     * surrogate pair. The caller must validate it using {@link
+     * #isSurrogatePair(char, char) isSurrogatePair} if necessary.
+     *
+     * @param  high the high-surrogate code unit
+     * @param  low the low-surrogate code unit
+     * @return the supplementary code point composed from the
+     *         specified surrogate pair.
+     * @since  1.5
+     */
+    public static int toCodePoint(char high, char low) {
+        // Optimized form of:
+        // return ((high - MIN_HIGH_SURROGATE) << 10)
+        //         + (low - MIN_LOW_SURROGATE)
+        //         + MIN_SUPPLEMENTARY_CODE_POINT;
+        return ((high << 10) + low) + (MIN_SUPPLEMENTARY_CODE_POINT
+                                       - (MIN_HIGH_SURROGATE << 10)
+                                       - MIN_LOW_SURROGATE);
+    }
+
+    /**
+     * Returns the code point at the given index of the
+     * <code>CharSequence</code>. If the <code>char</code> value at
+     * the given index in the <code>CharSequence</code> is in the
+     * high-surrogate range, the following index is less than the
+     * length of the <code>CharSequence</code>, and the
+     * <code>char</code> value at the following index is in the
+     * low-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at the given index is returned.
+     *
+     * @param seq a sequence of <code>char</code> values (Unicode code
+     * units)
+     * @param index the index to the <code>char</code> values (Unicode
+     * code units) in <code>seq</code> to be converted
+     * @return the Unicode code point at the given index
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if the value
+     * <code>index</code> is negative or not less than
+     * {@link CharSequence#length() seq.length()}.
+     * @since  1.5
+     */
+    public static int codePointAt(CharSequence seq, int index) {
+        char c1 = seq.charAt(index++);
+        if (isHighSurrogate(c1)) {
+            if (index < seq.length()) {
+                char c2 = seq.charAt(index);
+                if (isLowSurrogate(c2)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c1;
+    }
+
+    /**
+     * Returns the code point at the given index of the
+     * <code>char</code> array. If the <code>char</code> value at
+     * the given index in the <code>char</code> array is in the
+     * high-surrogate range, the following index is less than the
+     * length of the <code>char</code> array, and the
+     * <code>char</code> value at the following index is in the
+     * low-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at the given index is returned.
+     *
+     * @param a the <code>char</code> array
+     * @param index the index to the <code>char</code> values (Unicode
+     * code units) in the <code>char</code> array to be converted
+     * @return the Unicode code point at the given index
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException if the value
+     * <code>index</code> is negative or not less than
+     * the length of the <code>char</code> array.
+     * @since  1.5
+     */
+    public static int codePointAt(char[] a, int index) {
+        return codePointAtImpl(a, index, a.length);
+    }
+
+    /**
+     * Returns the code point at the given index of the
+     * <code>char</code> array, where only array elements with
+     * <code>index</code> less than <code>limit</code> can be used. If
+     * the <code>char</code> value at the given index in the
+     * <code>char</code> array is in the high-surrogate range, the
+     * following index is less than the <code>limit</code>, and the
+     * <code>char</code> value at the following index is in the
+     * low-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at the given index is returned.
+     *
+     * @param a the <code>char</code> array
+     * @param index the index to the <code>char</code> values (Unicode
+     * code units) in the <code>char</code> array to be converted
+     * @param limit the index after the last array element that can be used in the
+     * <code>char</code> array
+     * @return the Unicode code point at the given index
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     * argument is negative or not less than the <code>limit</code>
+     * argument, or if the <code>limit</code> argument is negative or
+     * greater than the length of the <code>char</code> array.
+     * @since  1.5
+     */
+    public static int codePointAt(char[] a, int index, int limit) {
+        if (index >= limit || limit < 0 || limit > a.length) {
+            throw new IndexOutOfBoundsException();
+        }
+        return codePointAtImpl(a, index, limit);
+    }
+
+    static int codePointAtImpl(char[] a, int index, int limit) {
+        char c1 = a[index++];
+        if (isHighSurrogate(c1)) {
+            if (index < limit) {
+                char c2 = a[index];
+                if (isLowSurrogate(c2)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c1;
+    }
+
+    /**
+     * Returns the code point preceding the given index of the
+     * <code>CharSequence</code>. If the <code>char</code> value at
+     * <code>(index - 1)</code> in the <code>CharSequence</code> is in
+     * the low-surrogate range, <code>(index - 2)</code> is not
+     * negative, and the <code>char</code> value at <code>(index -
+     * 2)</code> in the <code>CharSequence</code> is in the
+     * high-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at <code>(index - 1)</code> is
+     * returned.
+     *
+     * @param seq the <code>CharSequence</code> instance
+     * @param index the index following the code point that should be returned
+     * @return the Unicode code point value before the given index.
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     * argument is less than 1 or greater than {@link
+     * CharSequence#length() seq.length()}.
+     * @since  1.5
+     */
+    public static int codePointBefore(CharSequence seq, int index) {
+        char c2 = seq.charAt(--index);
+        if (isLowSurrogate(c2)) {
+            if (index > 0) {
+                char c1 = seq.charAt(--index);
+                if (isHighSurrogate(c1)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c2;
+    }
+
+    /**
+     * Returns the code point preceding the given index of the
+     * <code>char</code> array. If the <code>char</code> value at
+     * <code>(index - 1)</code> in the <code>char</code> array is in
+     * the low-surrogate range, <code>(index - 2)</code> is not
+     * negative, and the <code>char</code> value at <code>(index -
+     * 2)</code> in the <code>char</code> array is in the
+     * high-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at <code>(index - 1)</code> is
+     * returned.
+     *
+     * @param a the <code>char</code> array
+     * @param index the index following the code point that should be returned
+     * @return the Unicode code point value before the given index.
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     * argument is less than 1 or greater than the length of the
+     * <code>char</code> array
+     * @since  1.5
+     */
+    public static int codePointBefore(char[] a, int index) {
+        return codePointBeforeImpl(a, index, 0);
+    }
+
+    /**
+     * Returns the code point preceding the given index of the
+     * <code>char</code> array, where only array elements with
+     * <code>index</code> greater than or equal to <code>start</code>
+     * can be used. If the <code>char</code> value at <code>(index -
+     * 1)</code> in the <code>char</code> array is in the
+     * low-surrogate range, <code>(index - 2)</code> is not less than
+     * <code>start</code>, and the <code>char</code> value at
+     * <code>(index - 2)</code> in the <code>char</code> array is in
+     * the high-surrogate range, then the supplementary code point
+     * corresponding to this surrogate pair is returned. Otherwise,
+     * the <code>char</code> value at <code>(index - 1)</code> is
+     * returned.
+     *
+     * @param a the <code>char</code> array
+     * @param index the index following the code point that should be returned
+     * @param start the index of the first array element in the
+     * <code>char</code> array
+     * @return the Unicode code point value before the given index.
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException if the <code>index</code>
+     * argument is not greater than the <code>start</code> argument or
+     * is greater than the length of the <code>char</code> array, or
+     * if the <code>start</code> argument is negative or not less than
+     * the length of the <code>char</code> array.
+     * @since  1.5
+     */
+    public static int codePointBefore(char[] a, int index, int start) {
+        if (index <= start || start < 0 || start >= a.length) {
+            throw new IndexOutOfBoundsException();
+        }
+        return codePointBeforeImpl(a, index, start);
+    }
+
+    static int codePointBeforeImpl(char[] a, int index, int start) {
+        char c2 = a[--index];
+        if (isLowSurrogate(c2)) {
+            if (index > start) {
+                char c1 = a[--index];
+                if (isHighSurrogate(c1)) {
+                    return toCodePoint(c1, c2);
+                }
+            }
+        }
+        return c2;
+    }
+
+    /**
+     * Converts the specified character (Unicode code point) to its
+     * UTF-16 representation. If the specified code point is a BMP
+     * (Basic Multilingual Plane or Plane 0) value, the same value is
+     * stored in <code>dst[dstIndex]</code>, and 1 is returned. If the
+     * specified code point is a supplementary character, its
+     * surrogate values are stored in <code>dst[dstIndex]</code>
+     * (high-surrogate) and <code>dst[dstIndex+1]</code>
+     * (low-surrogate), and 2 is returned.
+     *
+     * @param  codePoint the character (Unicode code point) to be converted.
+     * @param  dst an array of <code>char</code> in which the
+     * <code>codePoint</code>'s UTF-16 value is stored.
+     * @param dstIndex the start index into the <code>dst</code>
+     * array where the converted value is stored.
+     * @return 1 if the code point is a BMP code point, 2 if the
+     * code point is a supplementary code point.
+     * @exception IllegalArgumentException if the specified
+     * <code>codePoint</code> is not a valid Unicode code point.
+     * @exception NullPointerException if the specified <code>dst</code> is null.
+     * @exception IndexOutOfBoundsException if <code>dstIndex</code>
+     * is negative or not less than <code>dst.length</code>, or if
+     * <code>dst</code> at <code>dstIndex</code> doesn't have enough
+     * array element(s) to store the resulting <code>char</code>
+     * value(s). (If <code>dstIndex</code> is equal to
+     * <code>dst.length-1</code> and the specified
+     * <code>codePoint</code> is a supplementary character, the
+     * high-surrogate value is not stored in
+     * <code>dst[dstIndex]</code>.)
+     * @since  1.5
+     */
+    public static int toChars(int codePoint, char[] dst, int dstIndex) {
+        if (codePoint < 0 || codePoint > MAX_CODE_POINT) {
+            throw new IllegalArgumentException();
+        }
+        if (codePoint < MIN_SUPPLEMENTARY_CODE_POINT) {
+            dst[dstIndex] = (char) codePoint;
+            return 1;
+        }
+        toSurrogates(codePoint, dst, dstIndex);
+        return 2;
+    }
+
+    /**
+     * Converts the specified character (Unicode code point) to its
+     * UTF-16 representation stored in a <code>char</code> array. If
+     * the specified code point is a BMP (Basic Multilingual Plane or
+     * Plane 0) value, the resulting <code>char</code> array has
+     * the same value as <code>codePoint</code>. If the specified code
+     * point is a supplementary code point, the resulting
+     * <code>char</code> array has the corresponding surrogate pair.
+     *
+     * @param  codePoint a Unicode code point
+     * @return a <code>char</code> array having
+     *         <code>codePoint</code>'s UTF-16 representation.
+     * @exception IllegalArgumentException if the specified
+     * <code>codePoint</code> is not a valid Unicode code point.
+     * @since  1.5
+     */
+    public static char[] toChars(int codePoint) {
+        if (codePoint < 0 || codePoint > MAX_CODE_POINT) {
+            throw new IllegalArgumentException();
+        }
+        if (codePoint < MIN_SUPPLEMENTARY_CODE_POINT) {
+                return new char[] { (char) codePoint };
+        }
+        char[] result = new char[2];
+        toSurrogates(codePoint, result, 0);
+        return result;
+    }
+
+    static void toSurrogates(int codePoint, char[] dst, int index) {
+        // We write elements "backwards" to guarantee all-or-nothing
+        dst[index+1] = (char)((codePoint & 0x3ff) + MIN_LOW_SURROGATE);
+        dst[index] = (char)((codePoint >>> 10)
+            + (MIN_HIGH_SURROGATE - (MIN_SUPPLEMENTARY_CODE_POINT >>> 10)));
+    }
+
+    /**
+     * Returns the number of Unicode code points in the text range of
+     * the specified char sequence. The text range begins at the
+     * specified <code>beginIndex</code> and extends to the
+     * <code>char</code> at index <code>endIndex - 1</code>. Thus the
+     * length (in <code>char</code>s) of the text range is
+     * <code>endIndex-beginIndex</code>. Unpaired surrogates within
+     * the text range count as one code point each.
+     *
+     * @param seq the char sequence
+     * @param beginIndex the index to the first <code>char</code> of
+     * the text range.
+     * @param endIndex the index after the last <code>char</code> of
+     * the text range.
+     * @return the number of Unicode code points in the specified text
+     * range
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if the
+     * <code>beginIndex</code> is negative, or <code>endIndex</code>
+     * is larger than the length of the given sequence, or
+     * <code>beginIndex</code> is larger than <code>endIndex</code>.
+     * @since  1.5
+     */
+    public static int codePointCount(CharSequence seq, int beginIndex, int endIndex) {
+        int length = seq.length();
+        if (beginIndex < 0 || endIndex > length || beginIndex > endIndex) {
+            throw new IndexOutOfBoundsException();
+        }
+        int n = 0;
+        for (int i = beginIndex; i < endIndex; ) {
+            n++;
+            if (isHighSurrogate(seq.charAt(i++))) {
+                if (i < endIndex && isLowSurrogate(seq.charAt(i))) {
+                    i++;
+                }
+            }
+        }
+        return n;
+    }
+
+    /**
+     * Returns the number of Unicode code points in a subarray of the
+     * <code>char</code> array argument. The <code>offset</code>
+     * argument is the index of the first <code>char</code> of the
+     * subarray and the <code>count</code> argument specifies the
+     * length of the subarray in <code>char</code>s. Unpaired
+     * surrogates within the subarray count as one code point each.
+     *
+     * @param a the <code>char</code> array
+     * @param offset the index of the first <code>char</code> in the
+     * given <code>char</code> array
+     * @param count the length of the subarray in <code>char</code>s
+     * @return the number of Unicode code points in the specified subarray
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException if <code>offset</code> or
+     * <code>count</code> is negative, or if <code>offset +
+     * count</code> is larger than the length of the given array.
+     * @since  1.5
+     */
+    public static int codePointCount(char[] a, int offset, int count) {
+        if (count > a.length - offset || offset < 0 || count < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        return codePointCountImpl(a, offset, count);
+    }
+
+    static int codePointCountImpl(char[] a, int offset, int count) {
+        int endIndex = offset + count;
+        int n = 0;
+        for (int i = offset; i < endIndex; ) {
+            n++;
+            if (isHighSurrogate(a[i++])) {
+                if (i < endIndex && isLowSurrogate(a[i])) {
+                    i++;
+                }
+            }
+        }
+        return n;
+    }
+
+    /**
+     * Returns the index within the given char sequence that is offset
+     * from the given <code>index</code> by <code>codePointOffset</code>
+     * code points. Unpaired surrogates within the text range given by
+     * <code>index</code> and <code>codePointOffset</code> count as
+     * one code point each.
+     *
+     * @param seq the char sequence
+     * @param index the index to be offset
+     * @param codePointOffset the offset in code points
+     * @return the index within the char sequence
+     * @exception NullPointerException if <code>seq</code> is null.
+     * @exception IndexOutOfBoundsException if <code>index</code>
+     *   is negative or larger then the length of the char sequence,
+     *   or if <code>codePointOffset</code> is positive and the
+     *   subsequence starting with <code>index</code> has fewer than
+     *   <code>codePointOffset</code> code points, or if
+     *   <code>codePointOffset</code> is negative and the subsequence
+     *   before <code>index</code> has fewer than the absolute value
+     *   of <code>codePointOffset</code> code points.
+     * @since 1.5
+     */
+    public static int offsetByCodePoints(CharSequence seq, int index,
+                                         int codePointOffset) {
+        int length = seq.length();
+        if (index < 0 || index > length) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        int x = index;
+        if (codePointOffset >= 0) {
+            int i;
+            for (i = 0; x < length && i < codePointOffset; i++) {
+                if (isHighSurrogate(seq.charAt(x++))) {
+                    if (x < length && isLowSurrogate(seq.charAt(x))) {
+                        x++;
+                    }
+                }
+            }
+            if (i < codePointOffset) {
+                throw new IndexOutOfBoundsException();
+            }
+        } else {
+            int i;
+            for (i = codePointOffset; x > 0 && i < 0; i++) {
+                if (isLowSurrogate(seq.charAt(--x))) {
+                    if (x > 0 && isHighSurrogate(seq.charAt(x-1))) {
+                        x--;
+                    }
+                }
+            }
+            if (i < 0) {
+                throw new IndexOutOfBoundsException();
+            }
+        }
+        return x;
+    }
+
+    /**
+     * Returns the index within the given <code>char</code> subarray
+     * that is offset from the given <code>index</code> by
+     * <code>codePointOffset</code> code points. The
+     * <code>start</code> and <code>count</code> arguments specify a
+     * subarray of the <code>char</code> array. Unpaired surrogates
+     * within the text range given by <code>index</code> and
+     * <code>codePointOffset</code> count as one code point each.
+     *
+     * @param a the <code>char</code> array
+     * @param start the index of the first <code>char</code> of the
+     * subarray
+     * @param count the length of the subarray in <code>char</code>s
+     * @param index the index to be offset
+     * @param codePointOffset the offset in code points
+     * @return the index within the subarray
+     * @exception NullPointerException if <code>a</code> is null.
+     * @exception IndexOutOfBoundsException
+     *   if <code>start</code> or <code>count</code> is negative,
+     *   or if <code>start + count</code> is larger than the length of
+     *   the given array,
+     *   or if <code>index</code> is less than <code>start</code> or
+     *   larger then <code>start + count</code>,
+     *   or if <code>codePointOffset</code> is positive and the text range
+     *   starting with <code>index</code> and ending with <code>start
+     *   + count - 1</code> has fewer than <code>codePointOffset</code> code
+     *   points,
+     *   or if <code>codePointOffset</code> is negative and the text range
+     *   starting with <code>start</code> and ending with <code>index
+     *   - 1</code> has fewer than the absolute value of
+     *   <code>codePointOffset</code> code points.
+     * @since 1.5
+     */
+    public static int offsetByCodePoints(char[] a, int start, int count,
+                                         int index, int codePointOffset) {
+        if (count > a.length-start || start < 0 || count < 0
+            || index < start || index > start+count) {
+            throw new IndexOutOfBoundsException();
+        }
+        return offsetByCodePointsImpl(a, start, count, index, codePointOffset);
+    }
+
+    static int offsetByCodePointsImpl(char[]a, int start, int count,
+                                      int index, int codePointOffset) {
+        int x = index;
+        if (codePointOffset >= 0) {
+            int limit = start + count;
+            int i;
+            for (i = 0; x < limit && i < codePointOffset; i++) {
+                if (isHighSurrogate(a[x++])) {
+                    if (x < limit && isLowSurrogate(a[x])) {
+                        x++;
+                    }
+                }
+            }
+            if (i < codePointOffset) {
+                throw new IndexOutOfBoundsException();
+            }
+        } else {
+            int i;
+            for (i = codePointOffset; x > start && i < 0; i++) {
+                if (isLowSurrogate(a[--x])) {
+                    if (x > start && isHighSurrogate(a[x-1])) {
+                        x--;
+                    }
+                }
+            }
+            if (i < 0) {
+                throw new IndexOutOfBoundsException();
+            }
+        }
+        return x;
+    }
+
+   /**
+     * Determines if the specified character is a lowercase character.
+     * <p>
+     * A character is lowercase if its general category type, provided
+     * by <code>Character.getType(ch)</code>, is
+     * <code>LOWERCASE_LETTER</code>.
+     * <p>
+     * The following are examples of lowercase characters:
+     * <p><blockquote><pre>
+     * a b c d e f g h i j k l m n o p q r s t u v w x y z
+     * '&#92;u00DF' '&#92;u00E0' '&#92;u00E1' '&#92;u00E2' '&#92;u00E3' '&#92;u00E4' '&#92;u00E5' '&#92;u00E6'
+     * '&#92;u00E7' '&#92;u00E8' '&#92;u00E9' '&#92;u00EA' '&#92;u00EB' '&#92;u00EC' '&#92;u00ED' '&#92;u00EE'
+     * '&#92;u00EF' '&#92;u00F0' '&#92;u00F1' '&#92;u00F2' '&#92;u00F3' '&#92;u00F4' '&#92;u00F5' '&#92;u00F6'
+     * '&#92;u00F8' '&#92;u00F9' '&#92;u00FA' '&#92;u00FB' '&#92;u00FC' '&#92;u00FD' '&#92;u00FE' '&#92;u00FF'
+     * </pre></blockquote>
+     * <p> Many other Unicode characters are lowercase too.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isLowerCase(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is lowercase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isTitleCase(char)
+     * @see     java.lang.Character#toLowerCase(char)
+     * @see     java.lang.Character#getType(char)
+     */
+    public static boolean isLowerCase(char ch) {
+        return isLowerCase((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a
+     * lowercase character.
+     * <p>
+     * A character is lowercase if its general category type, provided
+     * by {@link Character#getType getType(codePoint)}, is
+     * <code>LOWERCASE_LETTER</code>.
+     * <p>
+     * The following are examples of lowercase characters:
+     * <p><blockquote><pre>
+     * a b c d e f g h i j k l m n o p q r s t u v w x y z
+     * '&#92;u00DF' '&#92;u00E0' '&#92;u00E1' '&#92;u00E2' '&#92;u00E3' '&#92;u00E4' '&#92;u00E5' '&#92;u00E6'
+     * '&#92;u00E7' '&#92;u00E8' '&#92;u00E9' '&#92;u00EA' '&#92;u00EB' '&#92;u00EC' '&#92;u00ED' '&#92;u00EE'
+     * '&#92;u00EF' '&#92;u00F0' '&#92;u00F1' '&#92;u00F2' '&#92;u00F3' '&#92;u00F4' '&#92;u00F5' '&#92;u00F6'
+     * '&#92;u00F8' '&#92;u00F9' '&#92;u00FA' '&#92;u00FB' '&#92;u00FC' '&#92;u00FD' '&#92;u00FE' '&#92;u00FF'
+     * </pre></blockquote>
+     * <p> Many other Unicode characters are lowercase too.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is lowercase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.Character#isTitleCase(int)
+     * @see     java.lang.Character#toLowerCase(int)
+     * @see     java.lang.Character#getType(int)
+     * @since   1.5
+     */
+    public static boolean isLowerCase(int codePoint) {
+        return getType(codePoint) == Character.LOWERCASE_LETTER;
+    }
+
+   /**
+     * Determines if the specified character is an uppercase character.
+     * <p>
+     * A character is uppercase if its general category type, provided by
+     * <code>Character.getType(ch)</code>, is <code>UPPERCASE_LETTER</code>.
+     * <p>
+     * The following are examples of uppercase characters:
+     * <p><blockquote><pre>
+     * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+     * '&#92;u00C0' '&#92;u00C1' '&#92;u00C2' '&#92;u00C3' '&#92;u00C4' '&#92;u00C5' '&#92;u00C6' '&#92;u00C7'
+     * '&#92;u00C8' '&#92;u00C9' '&#92;u00CA' '&#92;u00CB' '&#92;u00CC' '&#92;u00CD' '&#92;u00CE' '&#92;u00CF'
+     * '&#92;u00D0' '&#92;u00D1' '&#92;u00D2' '&#92;u00D3' '&#92;u00D4' '&#92;u00D5' '&#92;u00D6' '&#92;u00D8'
+     * '&#92;u00D9' '&#92;u00DA' '&#92;u00DB' '&#92;u00DC' '&#92;u00DD' '&#92;u00DE'
+     * </pre></blockquote>
+     * <p> Many other Unicode characters are uppercase too.<p>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isUpperCase(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is uppercase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isTitleCase(char)
+     * @see     java.lang.Character#toUpperCase(char)
+     * @see     java.lang.Character#getType(char)
+     * @since   1.0
+     */
+    public static boolean isUpperCase(char ch) {
+        return isUpperCase((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is an uppercase character.
+     * <p>
+     * A character is uppercase if its general category type, provided by
+     * {@link Character#getType(int) getType(codePoint)}, is <code>UPPERCASE_LETTER</code>.
+     * <p>
+     * The following are examples of uppercase characters:
+     * <p><blockquote><pre>
+     * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+     * '&#92;u00C0' '&#92;u00C1' '&#92;u00C2' '&#92;u00C3' '&#92;u00C4' '&#92;u00C5' '&#92;u00C6' '&#92;u00C7'
+     * '&#92;u00C8' '&#92;u00C9' '&#92;u00CA' '&#92;u00CB' '&#92;u00CC' '&#92;u00CD' '&#92;u00CE' '&#92;u00CF'
+     * '&#92;u00D0' '&#92;u00D1' '&#92;u00D2' '&#92;u00D3' '&#92;u00D4' '&#92;u00D5' '&#92;u00D6' '&#92;u00D8'
+     * '&#92;u00D9' '&#92;u00DA' '&#92;u00DB' '&#92;u00DC' '&#92;u00DD' '&#92;u00DE'
+     * </pre></blockquote>
+     * <p> Many other Unicode characters are uppercase too.<p>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is uppercase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.Character#isTitleCase(int)
+     * @see     java.lang.Character#toUpperCase(int)
+     * @see     java.lang.Character#getType(int)
+     * @since   1.5
+     */
+    public static boolean isUpperCase(int codePoint) {
+        return getType(codePoint) == Character.UPPERCASE_LETTER;
+    }
+
+    /**
+     * Determines if the specified character is a titlecase character.
+     * <p>
+     * A character is a titlecase character if its general
+     * category type, provided by <code>Character.getType(ch)</code>,
+     * is <code>TITLECASE_LETTER</code>.
+     * <p>
+     * Some characters look like pairs of Latin letters. For example, there
+     * is an uppercase letter that looks like "LJ" and has a corresponding
+     * lowercase letter that looks like "lj". A third form, which looks like "Lj",
+     * is the appropriate form to use when rendering a word in lowercase
+     * with initial capitals, as for a book title.
+     * <p>
+     * These are some of the Unicode characters for which this method returns
+     * <code>true</code>:
+     * <ul>
+     * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON</code>
+     * <li><code>LATIN CAPITAL LETTER L WITH SMALL LETTER J</code>
+     * <li><code>LATIN CAPITAL LETTER N WITH SMALL LETTER J</code>
+     * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z</code>
+     * </ul>
+     * <p> Many other Unicode characters are titlecase too.<p>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isTitleCase(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is titlecase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isUpperCase(char)
+     * @see     java.lang.Character#toTitleCase(char)
+     * @see     java.lang.Character#getType(char)
+     * @since   1.0.2
+     */
+    public static boolean isTitleCase(char ch) {
+        return isTitleCase((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a titlecase character.
+     * <p>
+     * A character is a titlecase character if its general
+     * category type, provided by {@link Character#getType(int) getType(codePoint)},
+     * is <code>TITLECASE_LETTER</code>.
+     * <p>
+     * Some characters look like pairs of Latin letters. For example, there
+     * is an uppercase letter that looks like "LJ" and has a corresponding
+     * lowercase letter that looks like "lj". A third form, which looks like "Lj",
+     * is the appropriate form to use when rendering a word in lowercase
+     * with initial capitals, as for a book title.
+     * <p>
+     * These are some of the Unicode characters for which this method returns
+     * <code>true</code>:
+     * <ul>
+     * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON</code>
+     * <li><code>LATIN CAPITAL LETTER L WITH SMALL LETTER J</code>
+     * <li><code>LATIN CAPITAL LETTER N WITH SMALL LETTER J</code>
+     * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z</code>
+     * </ul>
+     * <p> Many other Unicode characters are titlecase too.<p>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is titlecase;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.Character#isUpperCase(int)
+     * @see     java.lang.Character#toTitleCase(int)
+     * @see     java.lang.Character#getType(int)
+     * @since   1.5
+     */
+    public static boolean isTitleCase(int codePoint) {
+        return getType(codePoint) == Character.TITLECASE_LETTER;
+    }
+
+    /**
+     * Determines if the specified character is a digit.
+     * <p>
+     * A character is a digit if its general category type, provided
+     * by <code>Character.getType(ch)</code>, is
+     * <code>DECIMAL_DIGIT_NUMBER</code>.
+     * <p>
+     * Some Unicode character ranges that contain digits:
+     * <ul>
+     * <li><code>'&#92;u0030'</code> through <code>'&#92;u0039'</code>,
+     *     ISO-LATIN-1 digits (<code>'0'</code> through <code>'9'</code>)
+     * <li><code>'&#92;u0660'</code> through <code>'&#92;u0669'</code>,
+     *     Arabic-Indic digits
+     * <li><code>'&#92;u06F0'</code> through <code>'&#92;u06F9'</code>,
+     *     Extended Arabic-Indic digits
+     * <li><code>'&#92;u0966'</code> through <code>'&#92;u096F'</code>,
+     *     Devanagari digits
+     * <li><code>'&#92;uFF10'</code> through <code>'&#92;uFF19'</code>,
+     *     Fullwidth digits
+     * </ul>
+     *
+     * Many other character ranges contain digits as well.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isDigit(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is a digit;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#digit(char, int)
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#getType(char)
+     */
+    public static boolean isDigit(char ch) {
+        return isDigit((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a digit.
+     * <p>
+     * A character is a digit if its general category type, provided
+     * by {@link Character#getType(int) getType(codePoint)}, is
+     * <code>DECIMAL_DIGIT_NUMBER</code>.
+     * <p>
+     * Some Unicode character ranges that contain digits:
+     * <ul>
+     * <li><code>'&#92;u0030'</code> through <code>'&#92;u0039'</code>,
+     *     ISO-LATIN-1 digits (<code>'0'</code> through <code>'9'</code>)
+     * <li><code>'&#92;u0660'</code> through <code>'&#92;u0669'</code>,
+     *     Arabic-Indic digits
+     * <li><code>'&#92;u06F0'</code> through <code>'&#92;u06F9'</code>,
+     *     Extended Arabic-Indic digits
+     * <li><code>'&#92;u0966'</code> through <code>'&#92;u096F'</code>,
+     *     Devanagari digits
+     * <li><code>'&#92;uFF10'</code> through <code>'&#92;uFF19'</code>,
+     *     Fullwidth digits
+     * </ul>
+     *
+     * Many other character ranges contain digits as well.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is a digit;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#getType(int)
+     * @since   1.5
+     */
+    public static boolean isDigit(int codePoint) {
+        return getType(codePoint) == Character.DECIMAL_DIGIT_NUMBER;
+    }
+
+    /**
+     * Determines if a character is defined in Unicode.
+     * <p>
+     * A character is defined if at least one of the following is true:
+     * <ul>
+     * <li>It has an entry in the UnicodeData file.
+     * <li>It has a value in a range defined by the UnicodeData file.
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isDefined(int)} method.
+     *
+     * @param   ch   the character to be tested
+     * @return  <code>true</code> if the character has a defined meaning
+     *          in Unicode; <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isTitleCase(char)
+     * @see     java.lang.Character#isUpperCase(char)
+     * @since   1.0.2
+     */
+    public static boolean isDefined(char ch) {
+        return isDefined((int)ch);
+    }
+
+    /**
+     * Determines if a character (Unicode code point) is defined in Unicode.
+     * <p>
+     * A character is defined if at least one of the following is true:
+     * <ul>
+     * <li>It has an entry in the UnicodeData file.
+     * <li>It has a value in a range defined by the UnicodeData file.
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character has a defined meaning
+     *          in Unicode; <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(int)
+     * @see     java.lang.Character#isLetter(int)
+     * @see     java.lang.Character#isLetterOrDigit(int)
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.Character#isTitleCase(int)
+     * @see     java.lang.Character#isUpperCase(int)
+     * @since   1.5
+     */
+    public static boolean isDefined(int codePoint) {
+        return getType(codePoint) != Character.UNASSIGNED;
+    }
+
+    /**
+     * Determines if the specified character is a letter.
+     * <p>
+     * A character is considered to be a letter if its general
+     * category type, provided by <code>Character.getType(ch)</code>,
+     * is any of the following:
+     * <ul>
+     * <li> <code>UPPERCASE_LETTER</code>
+     * <li> <code>LOWERCASE_LETTER</code>
+     * <li> <code>TITLECASE_LETTER</code>
+     * <li> <code>MODIFIER_LETTER</code>
+     * <li> <code>OTHER_LETTER</code>
+     * </ul>
+     *
+     * Not all letters have case. Many characters are
+     * letters but are neither uppercase nor lowercase nor titlecase.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isLetter(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is a letter;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(char)
+     * @see     java.lang.Character#isJavaIdentifierStart(char)
+     * @see     java.lang.Character#isJavaLetter(char)
+     * @see     java.lang.Character#isJavaLetterOrDigit(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isTitleCase(char)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(char)
+     * @see     java.lang.Character#isUpperCase(char)
+     */
+    public static boolean isLetter(char ch) {
+        return isLetter((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a letter.
+     * <p>
+     * A character is considered to be a letter if its general
+     * category type, provided by {@link Character#getType(int) getType(codePoint)},
+     * is any of the following:
+     * <ul>
+     * <li> <code>UPPERCASE_LETTER</code>
+     * <li> <code>LOWERCASE_LETTER</code>
+     * <li> <code>TITLECASE_LETTER</code>
+     * <li> <code>MODIFIER_LETTER</code>
+     * <li> <code>OTHER_LETTER</code>
+     * </ul>
+     *
+     * Not all letters have case. Many characters are
+     * letters but are neither uppercase nor lowercase nor titlecase.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is a letter;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(int)
+     * @see     java.lang.Character#isJavaIdentifierStart(int)
+     * @see     java.lang.Character#isLetterOrDigit(int)
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.Character#isTitleCase(int)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(int)
+     * @see     java.lang.Character#isUpperCase(int)
+     * @since   1.5
+     */
+    public static boolean isLetter(int codePoint) {
+        return ((((1 << Character.UPPERCASE_LETTER) |
+            (1 << Character.LOWERCASE_LETTER) |
+            (1 << Character.TITLECASE_LETTER) |
+            (1 << Character.MODIFIER_LETTER) |
+            (1 << Character.OTHER_LETTER)) >> getType(codePoint)) & 1)
+            != 0;
+    }
+
+    /**
+     * Determines if the specified character is a letter or digit.
+     * <p>
+     * A character is considered to be a letter or digit if either
+     * <code>Character.isLetter(char ch)</code> or
+     * <code>Character.isDigit(char ch)</code> returns
+     * <code>true</code> for the character.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isLetterOrDigit(int)} method.
+     *
+     * @param   ch   the character to be tested.
+     * @return  <code>true</code> if the character is a letter or digit;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(char)
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isJavaLetter(char)
+     * @see     java.lang.Character#isJavaLetterOrDigit(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(char)
+     * @since   1.0.2
+     */
+    public static boolean isLetterOrDigit(char ch) {
+        return isLetterOrDigit((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a letter or digit.
+     * <p>
+     * A character is considered to be a letter or digit if either
+     * {@link #isLetter(int) isLetter(codePoint)} or
+     * {@link #isDigit(int) isDigit(codePoint)} returns
+     * <code>true</code> for the character.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is a letter or digit;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isDigit(int)
+     * @see     java.lang.Character#isJavaIdentifierPart(int)
+     * @see     java.lang.Character#isLetter(int)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(int)
+     * @since   1.5
+     */
+    public static boolean isLetterOrDigit(int codePoint) {
+        return ((((1 << Character.UPPERCASE_LETTER) |
+            (1 << Character.LOWERCASE_LETTER) |
+            (1 << Character.TITLECASE_LETTER) |
+            (1 << Character.MODIFIER_LETTER) |
+            (1 << Character.OTHER_LETTER) |
+            (1 << Character.DECIMAL_DIGIT_NUMBER)) >> getType(codePoint)) & 1)
+            != 0;
+    }
+
+    /**
+     * Determines if the specified character is permissible as the first
+     * character in a Java identifier.
+     * <p>
+     * A character may start a Java identifier if and only if
+     * one of the following is true:
+     * <ul>
+     * <li> {@link #isLetter(char) isLetter(ch)} returns <code>true</code>
+     * <li> {@link #getType(char) getType(ch)} returns <code>LETTER_NUMBER</code>
+     * <li> ch is a currency symbol (such as "$")
+     * <li> ch is a connecting punctuation character (such as "_").
+     * </ul>
+     *
+     * @param   ch the character to be tested.
+     * @return  <code>true</code> if the character may start a Java
+     *          identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaLetterOrDigit(char)
+     * @see     java.lang.Character#isJavaIdentifierStart(char)
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(char)
+     * @since   1.02
+     * @deprecated Replaced by isJavaIdentifierStart(char).
+     */
+    
+    public static boolean isJavaLetter(char ch) {
+        return isJavaIdentifierStart(ch);
+    }
+
+    /**
+     * Determines if the specified character may be part of a Java
+     * identifier as other than the first character.
+     * <p>
+     * A character may be part of a Java identifier if and only if any
+     * of the following are true:
+     * <ul>
+     * <li>  it is a letter
+     * <li>  it is a currency symbol (such as <code>'$'</code>)
+     * <li>  it is a connecting punctuation character (such as <code>'_'</code>)
+     * <li>  it is a digit
+     * <li>  it is a numeric letter (such as a Roman numeral character)
+     * <li>  it is a combining mark
+     * <li>  it is a non-spacing mark
+     * <li> <code>isIdentifierIgnorable</code> returns
+     * <code>true</code> for the character.
+     * </ul>
+     *
+     * @param   ch the character to be tested.
+     * @return  <code>true</code> if the character may be part of a
+     *          Java identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaLetter(char)
+     * @see     java.lang.Character#isJavaIdentifierStart(char)
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(char)
+     * @see     java.lang.Character#isIdentifierIgnorable(char)
+     * @since   1.02
+     * @deprecated Replaced by isJavaIdentifierPart(char).
+     */
+    
+    public static boolean isJavaLetterOrDigit(char ch) {
+        return isJavaIdentifierPart(ch);
+    }
+
+    /**
+     * Determines if the specified character is
+     * permissible as the first character in a Java identifier.
+     * <p>
+     * A character may start a Java identifier if and only if
+     * one of the following conditions is true:
+     * <ul>
+     * <li> {@link #isLetter(char) isLetter(ch)} returns <code>true</code>
+     * <li> {@link #getType(char) getType(ch)} returns <code>LETTER_NUMBER</code>
+     * <li> ch is a currency symbol (such as "$")
+     * <li> ch is a connecting punctuation character (such as "_").
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isJavaIdentifierStart(int)} method.
+     *
+     * @param   ch the character to be tested.
+     * @return  <code>true</code> if the character may start a Java identifier;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(char)
+     * @see     javax.lang.model.SourceVersion#isIdentifier(CharSequence)
+     * @since   1.1
+     */
+    public static boolean isJavaIdentifierStart(char ch) {
+        return isJavaIdentifierStart((int)ch);
+    }
+
+    /**
+     * Determines if the character (Unicode code point) is
+     * permissible as the first character in a Java identifier.
+     * <p>
+     * A character may start a Java identifier if and only if
+     * one of the following conditions is true:
+     * <ul>
+     * <li> {@link #isLetter(int) isLetter(codePoint)}
+     *      returns <code>true</code>
+     * <li> {@link #getType(int) getType(codePoint)}
+     *      returns <code>LETTER_NUMBER</code>
+     * <li> the referenced character is a currency symbol (such as "$")
+     * <li> the referenced character is a connecting punctuation character
+     *      (such as "_").
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character may start a Java identifier;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierPart(int)
+     * @see     java.lang.Character#isLetter(int)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(int)
+     * @see     javax.lang.model.SourceVersion#isIdentifier(CharSequence)
+     * @since   1.5
+     */
+    public static boolean isJavaIdentifierStart(int codePoint) {
+        return CharacterData.of(codePoint).isJavaIdentifierStart(codePoint);
+    }
+
+    /**
+     * Determines if the specified character may be part of a Java
+     * identifier as other than the first character.
+     * <p>
+     * A character may be part of a Java identifier if any of the following
+     * are true:
+     * <ul>
+     * <li>  it is a letter
+     * <li>  it is a currency symbol (such as <code>'$'</code>)
+     * <li>  it is a connecting punctuation character (such as <code>'_'</code>)
+     * <li>  it is a digit
+     * <li>  it is a numeric letter (such as a Roman numeral character)
+     * <li>  it is a combining mark
+     * <li>  it is a non-spacing mark
+     * <li> <code>isIdentifierIgnorable</code> returns
+     * <code>true</code> for the character
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isJavaIdentifierPart(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return <code>true</code> if the character may be part of a
+     *          Java identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isIdentifierIgnorable(char)
+     * @see     java.lang.Character#isJavaIdentifierStart(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(char)
+     * @see     javax.lang.model.SourceVersion#isIdentifier(CharSequence)
+     * @since   1.1
+     */
+    public static boolean isJavaIdentifierPart(char ch) {
+        return isJavaIdentifierPart((int)ch);
+    }
+
+    /**
+     * Determines if the character (Unicode code point) may be part of a Java
+     * identifier as other than the first character.
+     * <p>
+     * A character may be part of a Java identifier if any of the following
+     * are true:
+     * <ul>
+     * <li>  it is a letter
+     * <li>  it is a currency symbol (such as <code>'$'</code>)
+     * <li>  it is a connecting punctuation character (such as <code>'_'</code>)
+     * <li>  it is a digit
+     * <li>  it is a numeric letter (such as a Roman numeral character)
+     * <li>  it is a combining mark
+     * <li>  it is a non-spacing mark
+     * <li> {@link #isIdentifierIgnorable(int)
+     * isIdentifierIgnorable(codePoint)} returns <code>true</code> for
+     * the character
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return <code>true</code> if the character may be part of a
+     *          Java identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isIdentifierIgnorable(int)
+     * @see     java.lang.Character#isJavaIdentifierStart(int)
+     * @see     java.lang.Character#isLetterOrDigit(int)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(int)
+     * @see     javax.lang.model.SourceVersion#isIdentifier(CharSequence)
+     * @since   1.5
+     */
+    public static boolean isJavaIdentifierPart(int codePoint) {
+        return CharacterData.of(codePoint).isJavaIdentifierPart(codePoint);
+    }
+
+    /**
+     * Determines if the specified character is permissible as the
+     * first character in a Unicode identifier.
+     * <p>
+     * A character may start a Unicode identifier if and only if
+     * one of the following conditions is true:
+     * <ul>
+     * <li> {@link #isLetter(char) isLetter(ch)} returns <code>true</code>
+     * <li> {@link #getType(char) getType(ch)} returns
+     *      <code>LETTER_NUMBER</code>.
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isUnicodeIdentifierStart(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  <code>true</code> if the character may start a Unicode
+     *          identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierStart(char)
+     * @see     java.lang.Character#isLetter(char)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(char)
+     * @since   1.1
+     */
+    public static boolean isUnicodeIdentifierStart(char ch) {
+        return isUnicodeIdentifierStart((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is permissible as the
+     * first character in a Unicode identifier.
+     * <p>
+     * A character may start a Unicode identifier if and only if
+     * one of the following conditions is true:
+     * <ul>
+     * <li> {@link #isLetter(int) isLetter(codePoint)}
+     *      returns <code>true</code>
+     * <li> {@link #getType(int) getType(codePoint)}
+     *      returns <code>LETTER_NUMBER</code>.
+     * </ul>
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character may start a Unicode
+     *          identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierStart(int)
+     * @see     java.lang.Character#isLetter(int)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(int)
+     * @since   1.5
+     */
+    public static boolean isUnicodeIdentifierStart(int codePoint) {
+        return CharacterData.of(codePoint).isUnicodeIdentifierStart(codePoint);
+    }
+
+    /**
+     * Determines if the specified character may be part of a Unicode
+     * identifier as other than the first character.
+     * <p>
+     * A character may be part of a Unicode identifier if and only if
+     * one of the following statements is true:
+     * <ul>
+     * <li>  it is a letter
+     * <li>  it is a connecting punctuation character (such as <code>'_'</code>)
+     * <li>  it is a digit
+     * <li>  it is a numeric letter (such as a Roman numeral character)
+     * <li>  it is a combining mark
+     * <li>  it is a non-spacing mark
+     * <li> <code>isIdentifierIgnorable</code> returns
+     * <code>true</code> for this character.
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isUnicodeIdentifierPart(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  <code>true</code> if the character may be part of a
+     *          Unicode identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isIdentifierIgnorable(char)
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isLetterOrDigit(char)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(char)
+     * @since   1.1
+     */
+    public static boolean isUnicodeIdentifierPart(char ch) {
+        return isUnicodeIdentifierPart((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) may be part of a Unicode
+     * identifier as other than the first character.
+     * <p>
+     * A character may be part of a Unicode identifier if and only if
+     * one of the following statements is true:
+     * <ul>
+     * <li>  it is a letter
+     * <li>  it is a connecting punctuation character (such as <code>'_'</code>)
+     * <li>  it is a digit
+     * <li>  it is a numeric letter (such as a Roman numeral character)
+     * <li>  it is a combining mark
+     * <li>  it is a non-spacing mark
+     * <li> <code>isIdentifierIgnorable</code> returns
+     * <code>true</code> for this character.
+     * </ul>
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character may be part of a
+     *          Unicode identifier; <code>false</code> otherwise.
+     * @see     java.lang.Character#isIdentifierIgnorable(int)
+     * @see     java.lang.Character#isJavaIdentifierPart(int)
+     * @see     java.lang.Character#isLetterOrDigit(int)
+     * @see     java.lang.Character#isUnicodeIdentifierStart(int)
+     * @since   1.5
+     */
+    public static boolean isUnicodeIdentifierPart(int codePoint) {
+        return CharacterData.of(codePoint).isUnicodeIdentifierPart(codePoint);
+    }
+
+    /**
+     * Determines if the specified character should be regarded as
+     * an ignorable character in a Java identifier or a Unicode identifier.
+     * <p>
+     * The following Unicode characters are ignorable in a Java identifier
+     * or a Unicode identifier:
+     * <ul>
+     * <li>ISO control characters that are not whitespace
+     * <ul>
+     * <li><code>'&#92;u0000'</code> through <code>'&#92;u0008'</code>
+     * <li><code>'&#92;u000E'</code> through <code>'&#92;u001B'</code>
+     * <li><code>'&#92;u007F'</code> through <code>'&#92;u009F'</code>
+     * </ul>
+     *
+     * <li>all characters that have the <code>FORMAT</code> general
+     * category value
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isIdentifierIgnorable(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  <code>true</code> if the character is an ignorable control
+     *          character that may be part of a Java or Unicode identifier;
+     *           <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierPart(char)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(char)
+     * @since   1.1
+     */
+    public static boolean isIdentifierIgnorable(char ch) {
+        return isIdentifierIgnorable((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) should be regarded as
+     * an ignorable character in a Java identifier or a Unicode identifier.
+     * <p>
+     * The following Unicode characters are ignorable in a Java identifier
+     * or a Unicode identifier:
+     * <ul>
+     * <li>ISO control characters that are not whitespace
+     * <ul>
+     * <li><code>'&#92;u0000'</code> through <code>'&#92;u0008'</code>
+     * <li><code>'&#92;u000E'</code> through <code>'&#92;u001B'</code>
+     * <li><code>'&#92;u007F'</code> through <code>'&#92;u009F'</code>
+     * </ul>
+     *
+     * <li>all characters that have the <code>FORMAT</code> general
+     * category value
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is an ignorable control
+     *          character that may be part of a Java or Unicode identifier;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isJavaIdentifierPart(int)
+     * @see     java.lang.Character#isUnicodeIdentifierPart(int)
+     * @since   1.5
+     */
+    public static boolean isIdentifierIgnorable(int codePoint) {
+        return CharacterData.of(codePoint).isIdentifierIgnorable(codePoint);
+    }
+
+    /**
+     * Converts the character argument to lowercase using case
+     * mapping information from the UnicodeData file.
+     * <p>
+     * Note that
+     * <code>Character.isLowerCase(Character.toLowerCase(ch))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters, particularly those that are symbols or ideographs.
+     *
+     * <p>In general, {@link java.lang.String#toLowerCase()} should be used to map
+     * characters to lowercase. <code>String</code> case mapping methods
+     * have several benefits over <code>Character</code> case mapping methods.
+     * <code>String</code> case mapping methods can perform locale-sensitive
+     * mappings, context-sensitive mappings, and 1:M character mappings, whereas
+     * the <code>Character</code> case mapping methods cannot.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #toLowerCase(int)} method.
+     *
+     * @param   ch   the character to be converted.
+     * @return  the lowercase equivalent of the character, if any;
+     *          otherwise, the character itself.
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.String#toLowerCase()
+     */
+    public static char toLowerCase(char ch) {
+        return (char)toLowerCase((int)ch);
+    }
+
+    /**
+     * Converts the character (Unicode code point) argument to
+     * lowercase using case mapping information from the UnicodeData
+     * file.
+     *
+     * <p> Note that
+     * <code>Character.isLowerCase(Character.toLowerCase(codePoint))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters, particularly those that are symbols or ideographs.
+     *
+     * <p>In general, {@link java.lang.String#toLowerCase()} should be used to map
+     * characters to lowercase. <code>String</code> case mapping methods
+     * have several benefits over <code>Character</code> case mapping methods.
+     * <code>String</code> case mapping methods can perform locale-sensitive
+     * mappings, context-sensitive mappings, and 1:M character mappings, whereas
+     * the <code>Character</code> case mapping methods cannot.
+     *
+     * @param   codePoint   the character (Unicode code point) to be converted.
+     * @return  the lowercase equivalent of the character (Unicode code
+     *          point), if any; otherwise, the character itself.
+     * @see     java.lang.Character#isLowerCase(int)
+     * @see     java.lang.String#toLowerCase()
+     *
+     * @since   1.5
+     */
+    public static int toLowerCase(int codePoint) {
+        return CharacterData.of(codePoint).toLowerCase(codePoint);
+    }
+
+    /**
+     * Converts the character argument to uppercase using case mapping
+     * information from the UnicodeData file.
+     * <p>
+     * Note that
+     * <code>Character.isUpperCase(Character.toUpperCase(ch))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters, particularly those that are symbols or ideographs.
+     *
+     * <p>In general, {@link java.lang.String#toUpperCase()} should be used to map
+     * characters to uppercase. <code>String</code> case mapping methods
+     * have several benefits over <code>Character</code> case mapping methods.
+     * <code>String</code> case mapping methods can perform locale-sensitive
+     * mappings, context-sensitive mappings, and 1:M character mappings, whereas
+     * the <code>Character</code> case mapping methods cannot.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #toUpperCase(int)} method.
+     *
+     * @param   ch   the character to be converted.
+     * @return  the uppercase equivalent of the character, if any;
+     *          otherwise, the character itself.
+     * @see     java.lang.Character#isUpperCase(char)
+     * @see     java.lang.String#toUpperCase()
+     */
+    public static char toUpperCase(char ch) {
+        return (char)toUpperCase((int)ch);
+    }
+
+    /**
+     * Converts the character (Unicode code point) argument to
+     * uppercase using case mapping information from the UnicodeData
+     * file.
+     *
+     * <p>Note that
+     * <code>Character.isUpperCase(Character.toUpperCase(codePoint))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters, particularly those that are symbols or ideographs.
+     *
+     * <p>In general, {@link java.lang.String#toUpperCase()} should be used to map
+     * characters to uppercase. <code>String</code> case mapping methods
+     * have several benefits over <code>Character</code> case mapping methods.
+     * <code>String</code> case mapping methods can perform locale-sensitive
+     * mappings, context-sensitive mappings, and 1:M character mappings, whereas
+     * the <code>Character</code> case mapping methods cannot.
+     *
+     * @param   codePoint   the character (Unicode code point) to be converted.
+     * @return  the uppercase equivalent of the character, if any;
+     *          otherwise, the character itself.
+     * @see     java.lang.Character#isUpperCase(int)
+     * @see     java.lang.String#toUpperCase()
+     *
+     * @since   1.5
+     */
+    public static int toUpperCase(int codePoint) {
+        return CharacterData.of(codePoint).toUpperCase(codePoint);
+    }
+
+    /**
+     * Converts the character argument to titlecase using case mapping
+     * information from the UnicodeData file. If a character has no
+     * explicit titlecase mapping and is not itself a titlecase char
+     * according to UnicodeData, then the uppercase mapping is
+     * returned as an equivalent titlecase mapping. If the
+     * <code>char</code> argument is already a titlecase
+     * <code>char</code>, the same <code>char</code> value will be
+     * returned.
+     * <p>
+     * Note that
+     * <code>Character.isTitleCase(Character.toTitleCase(ch))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #toTitleCase(int)} method.
+     *
+     * @param   ch   the character to be converted.
+     * @return  the titlecase equivalent of the character, if any;
+     *          otherwise, the character itself.
+     * @see     java.lang.Character#isTitleCase(char)
+     * @see     java.lang.Character#toLowerCase(char)
+     * @see     java.lang.Character#toUpperCase(char)
+     * @since   1.0.2
+     */
+    public static char toTitleCase(char ch) {
+        return (char)toTitleCase((int)ch);
+    }
+
+    /**
+     * Converts the character (Unicode code point) argument to titlecase using case mapping
+     * information from the UnicodeData file. If a character has no
+     * explicit titlecase mapping and is not itself a titlecase char
+     * according to UnicodeData, then the uppercase mapping is
+     * returned as an equivalent titlecase mapping. If the
+     * character argument is already a titlecase
+     * character, the same character value will be
+     * returned.
+     *
+     * <p>Note that
+     * <code>Character.isTitleCase(Character.toTitleCase(codePoint))</code>
+     * does not always return <code>true</code> for some ranges of
+     * characters.
+     *
+     * @param   codePoint   the character (Unicode code point) to be converted.
+     * @return  the titlecase equivalent of the character, if any;
+     *          otherwise, the character itself.
+     * @see     java.lang.Character#isTitleCase(int)
+     * @see     java.lang.Character#toLowerCase(int)
+     * @see     java.lang.Character#toUpperCase(int)
+     * @since   1.5
+     */
+    public static int toTitleCase(int codePoint) {
+        return CharacterData.of(codePoint).toTitleCase(codePoint);
+    }
+
+    /**
+     * Returns the numeric value of the character <code>ch</code> in the
+     * specified radix.
+     * <p>
+     * If the radix is not in the range <code>MIN_RADIX</code>&nbsp;&lt;=
+     * <code>radix</code>&nbsp;&lt;= <code>MAX_RADIX</code> or if the
+     * value of <code>ch</code> is not a valid digit in the specified
+     * radix, <code>-1</code> is returned. A character is a valid digit
+     * if at least one of the following is true:
+     * <ul>
+     * <li>The method <code>isDigit</code> is <code>true</code> of the character
+     *     and the Unicode decimal digit value of the character (or its
+     *     single-character decomposition) is less than the specified radix.
+     *     In this case the decimal digit value is returned.
+     * <li>The character is one of the uppercase Latin letters
+     *     <code>'A'</code> through <code>'Z'</code> and its code is less than
+     *     <code>radix&nbsp;+ 'A'&nbsp;-&nbsp;10</code>.
+     *     In this case, <code>ch&nbsp;- 'A'&nbsp;+&nbsp;10</code>
+     *     is returned.
+     * <li>The character is one of the lowercase Latin letters
+     *     <code>'a'</code> through <code>'z'</code> and its code is less than
+     *     <code>radix&nbsp;+ 'a'&nbsp;-&nbsp;10</code>.
+     *     In this case, <code>ch&nbsp;- 'a'&nbsp;+&nbsp;10</code>
+     *     is returned.
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #digit(int, int)} method.
+     *
+     * @param   ch      the character to be converted.
+     * @param   radix   the radix.
+     * @return  the numeric value represented by the character in the
+     *          specified radix.
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#isDigit(char)
+     */
+    public static int digit(char ch, int radix) {
+        return digit((int)ch, radix);
+    }
+
+    /**
+     * Returns the numeric value of the specified character (Unicode
+     * code point) in the specified radix.
+     *
+     * <p>If the radix is not in the range <code>MIN_RADIX</code>&nbsp;&lt;=
+     * <code>radix</code>&nbsp;&lt;= <code>MAX_RADIX</code> or if the
+     * character is not a valid digit in the specified
+     * radix, <code>-1</code> is returned. A character is a valid digit
+     * if at least one of the following is true:
+     * <ul>
+     * <li>The method {@link #isDigit(int) isDigit(codePoint)} is <code>true</code> of the character
+     *     and the Unicode decimal digit value of the character (or its
+     *     single-character decomposition) is less than the specified radix.
+     *     In this case the decimal digit value is returned.
+     * <li>The character is one of the uppercase Latin letters
+     *     <code>'A'</code> through <code>'Z'</code> and its code is less than
+     *     <code>radix&nbsp;+ 'A'&nbsp;-&nbsp;10</code>.
+     *     In this case, <code>ch&nbsp;- 'A'&nbsp;+&nbsp;10</code>
+     *     is returned.
+     * <li>The character is one of the lowercase Latin letters
+     *     <code>'a'</code> through <code>'z'</code> and its code is less than
+     *     <code>radix&nbsp;+ 'a'&nbsp;-&nbsp;10</code>.
+     *     In this case, <code>ch&nbsp;- 'a'&nbsp;+&nbsp;10</code>
+     *     is returned.
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be converted.
+     * @param   radix   the radix.
+     * @return  the numeric value represented by the character in the
+     *          specified radix.
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#isDigit(int)
+     * @since   1.5
+     */
+    public static int digit(int codePoint, int radix) {
+        return CharacterData.of(codePoint).digit(codePoint, radix);
+    }
+
+    /**
+     * Returns the <code>int</code> value that the specified Unicode
+     * character represents. For example, the character
+     * <code>'&#92;u216C'</code> (the roman numeral fifty) will return
+     * an int with a value of 50.
+     * <p>
+     * The letters A-Z in their uppercase (<code>'&#92;u0041'</code> through
+     * <code>'&#92;u005A'</code>), lowercase
+     * (<code>'&#92;u0061'</code> through <code>'&#92;u007A'</code>), and
+     * full width variant (<code>'&#92;uFF21'</code> through
+     * <code>'&#92;uFF3A'</code> and <code>'&#92;uFF41'</code> through
+     * <code>'&#92;uFF5A'</code>) forms have numeric values from 10
+     * through 35. This is independent of the Unicode specification,
+     * which does not assign numeric values to these <code>char</code>
+     * values.
+     * <p>
+     * If the character does not have a numeric value, then -1 is returned.
+     * If the character has a numeric value that cannot be represented as a
+     * nonnegative integer (for example, a fractional value), then -2
+     * is returned.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #getNumericValue(int)} method.
+     *
+     * @param   ch      the character to be converted.
+     * @return  the numeric value of the character, as a nonnegative <code>int</code>
+     *           value; -2 if the character has a numeric value that is not a
+     *          nonnegative integer; -1 if the character has no numeric value.
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#isDigit(char)
+     * @since   1.1
+     */
+    public static int getNumericValue(char ch) {
+        return getNumericValue((int)ch);
+    }
+
+    /**
+     * Returns the <code>int</code> value that the specified
+     * character (Unicode code point) represents. For example, the character
+     * <code>'&#92;u216C'</code> (the Roman numeral fifty) will return
+     * an <code>int</code> with a value of 50.
+     * <p>
+     * The letters A-Z in their uppercase (<code>'&#92;u0041'</code> through
+     * <code>'&#92;u005A'</code>), lowercase
+     * (<code>'&#92;u0061'</code> through <code>'&#92;u007A'</code>), and
+     * full width variant (<code>'&#92;uFF21'</code> through
+     * <code>'&#92;uFF3A'</code> and <code>'&#92;uFF41'</code> through
+     * <code>'&#92;uFF5A'</code>) forms have numeric values from 10
+     * through 35. This is independent of the Unicode specification,
+     * which does not assign numeric values to these <code>char</code>
+     * values.
+     * <p>
+     * If the character does not have a numeric value, then -1 is returned.
+     * If the character has a numeric value that cannot be represented as a
+     * nonnegative integer (for example, a fractional value), then -2
+     * is returned.
+     *
+     * @param   codePoint the character (Unicode code point) to be converted.
+     * @return  the numeric value of the character, as a nonnegative <code>int</code>
+     *          value; -2 if the character has a numeric value that is not a
+     *          nonnegative integer; -1 if the character has no numeric value.
+     * @see     java.lang.Character#forDigit(int, int)
+     * @see     java.lang.Character#isDigit(int)
+     * @since   1.5
+     */
+    public static int getNumericValue(int codePoint) {
+        return CharacterData.of(codePoint).getNumericValue(codePoint);
+    }
+
+    /**
+     * Determines if the specified character is ISO-LATIN-1 white space.
+     * This method returns <code>true</code> for the following five
+     * characters only:
+     * <table>
+     * <tr><td><code>'\t'</code></td>            <td><code>'&#92;u0009'</code></td>
+     *     <td><code>HORIZONTAL TABULATION</code></td></tr>
+     * <tr><td><code>'\n'</code></td>            <td><code>'&#92;u000A'</code></td>
+     *     <td><code>NEW LINE</code></td></tr>
+     * <tr><td><code>'\f'</code></td>            <td><code>'&#92;u000C'</code></td>
+     *     <td><code>FORM FEED</code></td></tr>
+     * <tr><td><code>'\r'</code></td>            <td><code>'&#92;u000D'</code></td>
+     *     <td><code>CARRIAGE RETURN</code></td></tr>
+     * <tr><td><code>'&nbsp;'</code></td>  <td><code>'&#92;u0020'</code></td>
+     *     <td><code>SPACE</code></td></tr>
+     * </table>
+     *
+     * @param      ch   the character to be tested.
+     * @return     <code>true</code> if the character is ISO-LATIN-1 white
+     *             space; <code>false</code> otherwise.
+     * @see        java.lang.Character#isSpaceChar(char)
+     * @see        java.lang.Character#isWhitespace(char)
+     * @deprecated Replaced by isWhitespace(char).
+     */
+    
+    public static boolean isSpace(char ch) {
+        return (ch <= 0x0020) &&
+            (((((1L << 0x0009) |
+            (1L << 0x000A) |
+            (1L << 0x000C) |
+            (1L << 0x000D) |
+            (1L << 0x0020)) >> ch) & 1L) != 0);
+    }
+
+
+    /**
+     * Determines if the specified character is a Unicode space character.
+     * A character is considered to be a space character if and only if
+     * it is specified to be a space character by the Unicode standard. This
+     * method returns true if the character's general category type is any of
+     * the following:
+     * <ul>
+     * <li> <code>SPACE_SEPARATOR</code>
+     * <li> <code>LINE_SEPARATOR</code>
+     * <li> <code>PARAGRAPH_SEPARATOR</code>
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isSpaceChar(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  <code>true</code> if the character is a space character;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isWhitespace(char)
+     * @since   1.1
+     */
+    public static boolean isSpaceChar(char ch) {
+        return isSpaceChar((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is a
+     * Unicode space character.  A character is considered to be a
+     * space character if and only if it is specified to be a space
+     * character by the Unicode standard. This method returns true if
+     * the character's general category type is any of the following:
+     *
+     * <ul>
+     * <li> {@link #SPACE_SEPARATOR}
+     * <li> {@link #LINE_SEPARATOR}
+     * <li> {@link #PARAGRAPH_SEPARATOR}
+     * </ul>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is a space character;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isWhitespace(int)
+     * @since   1.5
+     */
+    public static boolean isSpaceChar(int codePoint) {
+        return ((((1 << Character.SPACE_SEPARATOR) |
+                  (1 << Character.LINE_SEPARATOR) |
+                  (1 << Character.PARAGRAPH_SEPARATOR)) >> getType(codePoint)) & 1)
+            != 0;
+    }
+
+    /**
+     * Determines if the specified character is white space according to Java.
+     * A character is a Java whitespace character if and only if it satisfies
+     * one of the following criteria:
+     * <ul>
+     * <li> It is a Unicode space character (<code>SPACE_SEPARATOR</code>,
+     *      <code>LINE_SEPARATOR</code>, or <code>PARAGRAPH_SEPARATOR</code>)
+     *      but is not also a non-breaking space (<code>'&#92;u00A0'</code>,
+     *      <code>'&#92;u2007'</code>, <code>'&#92;u202F'</code>).
+     * <li> It is <code>'&#92;u0009'</code>, HORIZONTAL TABULATION.
+     * <li> It is <code>'&#92;u000A'</code>, LINE FEED.
+     * <li> It is <code>'&#92;u000B'</code>, VERTICAL TABULATION.
+     * <li> It is <code>'&#92;u000C'</code>, FORM FEED.
+     * <li> It is <code>'&#92;u000D'</code>, CARRIAGE RETURN.
+     * <li> It is <code>'&#92;u001C'</code>, FILE SEPARATOR.
+     * <li> It is <code>'&#92;u001D'</code>, GROUP SEPARATOR.
+     * <li> It is <code>'&#92;u001E'</code>, RECORD SEPARATOR.
+     * <li> It is <code>'&#92;u001F'</code>, UNIT SEPARATOR.
+     * </ul>
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isWhitespace(int)} method.
+     *
+     * @param   ch the character to be tested.
+     * @return  <code>true</code> if the character is a Java whitespace
+     *          character; <code>false</code> otherwise.
+     * @see     java.lang.Character#isSpaceChar(char)
+     * @since   1.1
+     */
+    public static boolean isWhitespace(char ch) {
+        return isWhitespace((int)ch);
+    }
+
+    /**
+     * Determines if the specified character (Unicode code point) is
+     * white space according to Java.  A character is a Java
+     * whitespace character if and only if it satisfies one of the
+     * following criteria:
+     * <ul>
+     * <li> It is a Unicode space character ({@link #SPACE_SEPARATOR},
+     *      {@link #LINE_SEPARATOR}, or {@link #PARAGRAPH_SEPARATOR})
+     *      but is not also a non-breaking space (<code>'&#92;u00A0'</code>,
+     *      <code>'&#92;u2007'</code>, <code>'&#92;u202F'</code>).
+     * <li> It is <code>'&#92;u0009'</code>, HORIZONTAL TABULATION.
+     * <li> It is <code>'&#92;u000A'</code>, LINE FEED.
+     * <li> It is <code>'&#92;u000B'</code>, VERTICAL TABULATION.
+     * <li> It is <code>'&#92;u000C'</code>, FORM FEED.
+     * <li> It is <code>'&#92;u000D'</code>, CARRIAGE RETURN.
+     * <li> It is <code>'&#92;u001C'</code>, FILE SEPARATOR.
+     * <li> It is <code>'&#92;u001D'</code>, GROUP SEPARATOR.
+     * <li> It is <code>'&#92;u001E'</code>, RECORD SEPARATOR.
+     * <li> It is <code>'&#92;u001F'</code>, UNIT SEPARATOR.
+     * </ul>
+     * <p>
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is a Java whitespace
+     *          character; <code>false</code> otherwise.
+     * @see     java.lang.Character#isSpaceChar(int)
+     * @since   1.5
+     */
+    public static boolean isWhitespace(int codePoint) {
+        return CharacterData.of(codePoint).isWhitespace(codePoint);
+    }
+
+    /**
+     * Determines if the specified character is an ISO control
+     * character.  A character is considered to be an ISO control
+     * character if its code is in the range <code>'&#92;u0000'</code>
+     * through <code>'&#92;u001F'</code> or in the range
+     * <code>'&#92;u007F'</code> through <code>'&#92;u009F'</code>.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isISOControl(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  <code>true</code> if the character is an ISO control character;
+     *          <code>false</code> otherwise.
+     *
+     * @see     java.lang.Character#isSpaceChar(char)
+     * @see     java.lang.Character#isWhitespace(char)
+     * @since   1.1
+     */
+    public static boolean isISOControl(char ch) {
+        return isISOControl((int)ch);
+    }
+
+    /**
+     * Determines if the referenced character (Unicode code point) is an ISO control
+     * character.  A character is considered to be an ISO control
+     * character if its code is in the range <code>'&#92;u0000'</code>
+     * through <code>'&#92;u001F'</code> or in the range
+     * <code>'&#92;u007F'</code> through <code>'&#92;u009F'</code>.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is an ISO control character;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.Character#isSpaceChar(int)
+     * @see     java.lang.Character#isWhitespace(int)
+     * @since   1.5
+     */
+    public static boolean isISOControl(int codePoint) {
+        return (codePoint >= 0x0000 && codePoint <= 0x001F) ||
+            (codePoint >= 0x007F && codePoint <= 0x009F);
+    }
+
+    /**
+     * Returns a value indicating a character's general category.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #getType(int)} method.
+     *
+     * @param   ch      the character to be tested.
+     * @return  a value of type <code>int</code> representing the
+     *          character's general category.
+     * @see     java.lang.Character#COMBINING_SPACING_MARK
+     * @see     java.lang.Character#CONNECTOR_PUNCTUATION
+     * @see     java.lang.Character#CONTROL
+     * @see     java.lang.Character#CURRENCY_SYMBOL
+     * @see     java.lang.Character#DASH_PUNCTUATION
+     * @see     java.lang.Character#DECIMAL_DIGIT_NUMBER
+     * @see     java.lang.Character#ENCLOSING_MARK
+     * @see     java.lang.Character#END_PUNCTUATION
+     * @see     java.lang.Character#FINAL_QUOTE_PUNCTUATION
+     * @see     java.lang.Character#FORMAT
+     * @see     java.lang.Character#INITIAL_QUOTE_PUNCTUATION
+     * @see     java.lang.Character#LETTER_NUMBER
+     * @see     java.lang.Character#LINE_SEPARATOR
+     * @see     java.lang.Character#LOWERCASE_LETTER
+     * @see     java.lang.Character#MATH_SYMBOL
+     * @see     java.lang.Character#MODIFIER_LETTER
+     * @see     java.lang.Character#MODIFIER_SYMBOL
+     * @see     java.lang.Character#NON_SPACING_MARK
+     * @see     java.lang.Character#OTHER_LETTER
+     * @see     java.lang.Character#OTHER_NUMBER
+     * @see     java.lang.Character#OTHER_PUNCTUATION
+     * @see     java.lang.Character#OTHER_SYMBOL
+     * @see     java.lang.Character#PARAGRAPH_SEPARATOR
+     * @see     java.lang.Character#PRIVATE_USE
+     * @see     java.lang.Character#SPACE_SEPARATOR
+     * @see     java.lang.Character#START_PUNCTUATION
+     * @see     java.lang.Character#SURROGATE
+     * @see     java.lang.Character#TITLECASE_LETTER
+     * @see     java.lang.Character#UNASSIGNED
+     * @see     java.lang.Character#UPPERCASE_LETTER
+     * @since   1.1
+     */
+    public static int getType(char ch) {
+        return getType((int)ch);
+    }
+
+    /**
+     * Returns a value indicating a character's general category.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  a value of type <code>int</code> representing the
+     *          character's general category.
+     * @see     Character#COMBINING_SPACING_MARK COMBINING_SPACING_MARK
+     * @see     Character#CONNECTOR_PUNCTUATION CONNECTOR_PUNCTUATION
+     * @see     Character#CONTROL CONTROL
+     * @see     Character#CURRENCY_SYMBOL CURRENCY_SYMBOL
+     * @see     Character#DASH_PUNCTUATION DASH_PUNCTUATION
+     * @see     Character#DECIMAL_DIGIT_NUMBER DECIMAL_DIGIT_NUMBER
+     * @see     Character#ENCLOSING_MARK ENCLOSING_MARK
+     * @see     Character#END_PUNCTUATION END_PUNCTUATION
+     * @see     Character#FINAL_QUOTE_PUNCTUATION FINAL_QUOTE_PUNCTUATION
+     * @see     Character#FORMAT FORMAT
+     * @see     Character#INITIAL_QUOTE_PUNCTUATION INITIAL_QUOTE_PUNCTUATION
+     * @see     Character#LETTER_NUMBER LETTER_NUMBER
+     * @see     Character#LINE_SEPARATOR LINE_SEPARATOR
+     * @see     Character#LOWERCASE_LETTER LOWERCASE_LETTER
+     * @see     Character#MATH_SYMBOL MATH_SYMBOL
+     * @see     Character#MODIFIER_LETTER MODIFIER_LETTER
+     * @see     Character#MODIFIER_SYMBOL MODIFIER_SYMBOL
+     * @see     Character#NON_SPACING_MARK NON_SPACING_MARK
+     * @see     Character#OTHER_LETTER OTHER_LETTER
+     * @see     Character#OTHER_NUMBER OTHER_NUMBER
+     * @see     Character#OTHER_PUNCTUATION OTHER_PUNCTUATION
+     * @see     Character#OTHER_SYMBOL OTHER_SYMBOL
+     * @see     Character#PARAGRAPH_SEPARATOR PARAGRAPH_SEPARATOR
+     * @see     Character#PRIVATE_USE PRIVATE_USE
+     * @see     Character#SPACE_SEPARATOR SPACE_SEPARATOR
+     * @see     Character#START_PUNCTUATION START_PUNCTUATION
+     * @see     Character#SURROGATE SURROGATE
+     * @see     Character#TITLECASE_LETTER TITLECASE_LETTER
+     * @see     Character#UNASSIGNED UNASSIGNED
+     * @see     Character#UPPERCASE_LETTER UPPERCASE_LETTER
+     * @since   1.5
+     */
+    public static int getType(int codePoint) {
+        return CharacterData.of(codePoint).getType(codePoint);
+    }
+
+    /**
+     * Determines the character representation for a specific digit in
+     * the specified radix. If the value of <code>radix</code> is not a
+     * valid radix, or the value of <code>digit</code> is not a valid
+     * digit in the specified radix, the null character
+     * (<code>'&#92;u0000'</code>) is returned.
+     * <p>
+     * The <code>radix</code> argument is valid if it is greater than or
+     * equal to <code>MIN_RADIX</code> and less than or equal to
+     * <code>MAX_RADIX</code>. The <code>digit</code> argument is valid if
+     * <code>0&nbsp;&lt;=digit&nbsp;&lt;&nbsp;radix</code>.
+     * <p>
+     * If the digit is less than 10, then
+     * <code>'0'&nbsp;+ digit</code> is returned. Otherwise, the value
+     * <code>'a'&nbsp;+ digit&nbsp;-&nbsp;10</code> is returned.
+     *
+     * @param   digit   the number to convert to a character.
+     * @param   radix   the radix.
+     * @return  the <code>char</code> representation of the specified digit
+     *          in the specified radix.
+     * @see     java.lang.Character#MIN_RADIX
+     * @see     java.lang.Character#MAX_RADIX
+     * @see     java.lang.Character#digit(char, int)
+     */
+    public static char forDigit(int digit, int radix) {
+        if ((digit >= radix) || (digit < 0)) {
+            return '\0';
+        }
+        if ((radix < Character.MIN_RADIX) || (radix > Character.MAX_RADIX)) {
+            return '\0';
+        }
+        if (digit < 10) {
+            return (char)('0' + digit);
+        }
+        return (char)('a' - 10 + digit);
+    }
+
+    /**
+     * Returns the Unicode directionality property for the given
+     * character.  Character directionality is used to calculate the
+     * visual ordering of text. The directionality value of undefined
+     * <code>char</code> values is <code>DIRECTIONALITY_UNDEFINED</code>.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #getDirectionality(int)} method.
+     *
+     * @param  ch <code>char</code> for which the directionality property
+     *            is requested.
+     * @return the directionality property of the <code>char</code> value.
+     *
+     * @see Character#DIRECTIONALITY_UNDEFINED
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+     * @see Character#DIRECTIONALITY_ARABIC_NUMBER
+     * @see Character#DIRECTIONALITY_COMMON_NUMBER_SEPARATOR
+     * @see Character#DIRECTIONALITY_NONSPACING_MARK
+     * @see Character#DIRECTIONALITY_BOUNDARY_NEUTRAL
+     * @see Character#DIRECTIONALITY_PARAGRAPH_SEPARATOR
+     * @see Character#DIRECTIONALITY_SEGMENT_SEPARATOR
+     * @see Character#DIRECTIONALITY_WHITESPACE
+     * @see Character#DIRECTIONALITY_OTHER_NEUTRALS
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE
+     * @see Character#DIRECTIONALITY_POP_DIRECTIONAL_FORMAT
+     * @since 1.4
+     */
+    public static byte getDirectionality(char ch) {
+        return getDirectionality((int)ch);
+    }
+
+    /**
+     * Returns the Unicode directionality property for the given
+     * character (Unicode code point).  Character directionality is
+     * used to calculate the visual ordering of text. The
+     * directionality value of undefined character is {@link
+     * #DIRECTIONALITY_UNDEFINED}.
+     *
+     * @param   codePoint the character (Unicode code point) for which
+     *          the directionality property is requested.
+     * @return the directionality property of the character.
+     *
+     * @see Character#DIRECTIONALITY_UNDEFINED DIRECTIONALITY_UNDEFINED
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT DIRECTIONALITY_LEFT_TO_RIGHT
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT DIRECTIONALITY_RIGHT_TO_LEFT
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER DIRECTIONALITY_EUROPEAN_NUMBER
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR
+     * @see Character#DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+     * @see Character#DIRECTIONALITY_ARABIC_NUMBER DIRECTIONALITY_ARABIC_NUMBER
+     * @see Character#DIRECTIONALITY_COMMON_NUMBER_SEPARATOR DIRECTIONALITY_COMMON_NUMBER_SEPARATOR
+     * @see Character#DIRECTIONALITY_NONSPACING_MARK DIRECTIONALITY_NONSPACING_MARK
+     * @see Character#DIRECTIONALITY_BOUNDARY_NEUTRAL DIRECTIONALITY_BOUNDARY_NEUTRAL
+     * @see Character#DIRECTIONALITY_PARAGRAPH_SEPARATOR DIRECTIONALITY_PARAGRAPH_SEPARATOR
+     * @see Character#DIRECTIONALITY_SEGMENT_SEPARATOR DIRECTIONALITY_SEGMENT_SEPARATOR
+     * @see Character#DIRECTIONALITY_WHITESPACE DIRECTIONALITY_WHITESPACE
+     * @see Character#DIRECTIONALITY_OTHER_NEUTRALS DIRECTIONALITY_OTHER_NEUTRALS
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING
+     * @see Character#DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING
+     * @see Character#DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE
+     * @see Character#DIRECTIONALITY_POP_DIRECTIONAL_FORMAT DIRECTIONALITY_POP_DIRECTIONAL_FORMAT
+     * @since    1.5
+     */
+    public static byte getDirectionality(int codePoint) {
+        return CharacterData.of(codePoint).getDirectionality(codePoint);
+    }
+
+    /**
+     * Determines whether the character is mirrored according to the
+     * Unicode specification.  Mirrored characters should have their
+     * glyphs horizontally mirrored when displayed in text that is
+     * right-to-left.  For example, <code>'&#92;u0028'</code> LEFT
+     * PARENTHESIS is semantically defined to be an <i>opening
+     * parenthesis</i>.  This will appear as a "(" in text that is
+     * left-to-right but as a ")" in text that is right-to-left.
+     *
+     * <p><b>Note:</b> This method cannot handle <a
+     * href="#supplementary"> supplementary characters</a>. To support
+     * all Unicode characters, including supplementary characters, use
+     * the {@link #isMirrored(int)} method.
+     *
+     * @param  ch <code>char</code> for which the mirrored property is requested
+     * @return <code>true</code> if the char is mirrored, <code>false</code>
+     *         if the <code>char</code> is not mirrored or is not defined.
+     * @since 1.4
+     */
+    public static boolean isMirrored(char ch) {
+        return isMirrored((int)ch);
+    }
+
+    /**
+     * Determines whether the specified character (Unicode code point)
+     * is mirrored according to the Unicode specification.  Mirrored
+     * characters should have their glyphs horizontally mirrored when
+     * displayed in text that is right-to-left.  For example,
+     * <code>'&#92;u0028'</code> LEFT PARENTHESIS is semantically
+     * defined to be an <i>opening parenthesis</i>.  This will appear
+     * as a "(" in text that is left-to-right but as a ")" in text
+     * that is right-to-left.
+     *
+     * @param   codePoint the character (Unicode code point) to be tested.
+     * @return  <code>true</code> if the character is mirrored, <code>false</code>
+     *          if the character is not mirrored or is not defined.
+     * @since   1.5
+     */
+    public static boolean isMirrored(int codePoint) {
+        return CharacterData.of(codePoint).isMirrored(codePoint);
+    }
+
+    /**
+     * Compares two <code>Character</code> objects numerically.
+     *
+     * @param   anotherCharacter   the <code>Character</code> to be compared.
+
+     * @return  the value <code>0</code> if the argument <code>Character</code>
+     *          is equal to this <code>Character</code>; a value less than
+     *          <code>0</code> if this <code>Character</code> is numerically less
+     *          than the <code>Character</code> argument; and a value greater than
+     *          <code>0</code> if this <code>Character</code> is numerically greater
+     *          than the <code>Character</code> argument (unsigned comparison).
+     *          Note that this is strictly a numerical comparison; it is not
+     *          locale-dependent.
+     * @since   1.2
+     */
+    public int compareTo(Object o) {
+    	Character anotherCharacter = (Character)o;
+        return this.value - anotherCharacter.value;
+    }
+
+    /**
+     * Converts the character (Unicode code point) argument to uppercase using
+     * information from the UnicodeData file.
+     * <p>
+     *
+     * @param   codePoint   the character (Unicode code point) to be converted.
+     * @return  either the uppercase equivalent of the character, if
+     *          any, or an error flag (<code>Character.ERROR</code>)
+     *          that indicates that a 1:M <code>char</code> mapping exists.
+     * @see     java.lang.Character#isLowerCase(char)
+     * @see     java.lang.Character#isUpperCase(char)
+     * @see     java.lang.Character#toLowerCase(char)
+     * @see     java.lang.Character#toTitleCase(char)
+     * @since 1.4
+     */
+    static int toUpperCaseEx(int codePoint) {
+        assert isValidCodePoint(codePoint);
+        return CharacterData.of(codePoint).toUpperCaseEx(codePoint);
+    }
+
+    /**
+     * Converts the character (Unicode code point) argument to uppercase using case
+     * mapping information from the SpecialCasing file in the Unicode
+     * specification. If a character has no explicit uppercase
+     * mapping, then the <code>char</code> itself is returned in the
+     * <code>char[]</code>.
+     *
+     * @param   codePoint   the character (Unicode code point) to be converted.
+     * @return a <code>char[]</code> with the uppercased character.
+     * @since 1.4
+     */
+    static char[] toUpperCaseCharArray(int codePoint) {
+        // As of Unicode 4.0, 1:M uppercasings only happen in the BMP.
+        assert isValidCodePoint(codePoint) &&
+               !isSupplementaryCodePoint(codePoint);
+        return CharacterData.of(codePoint).toUpperCaseCharArray(codePoint);
+    }
+
+    /**
+     * The number of bits used to represent a <tt>char</tt> value in unsigned
+     * binary form, constant {@code 16}.
+     *
+     * @since 1.5
+     */
+    public static final int SIZE = 16;
+
+    /**
+     * Returns the value obtained by reversing the order of the bytes in the
+     * specified <tt>char</tt> value.
+     *
+     * @return the value obtained by reversing (or, equivalently, swapping)
+     *     the bytes in the specified <tt>char</tt> value.
+     * @since 1.5
+     */
+    public static char reverseBytes(char ch) {
+        return (char) (((ch & 0xFF00) >> 8) | (ch << 8));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/CharacterData.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+abstract class CharacterData {
+    abstract int getProperties(int ch);
+    abstract int getType(int ch);
+    abstract boolean isWhitespace(int ch);
+    abstract boolean isMirrored(int ch);
+    abstract boolean isJavaIdentifierStart(int ch);
+    abstract boolean isJavaIdentifierPart(int ch);
+    abstract boolean isUnicodeIdentifierStart(int ch);
+    abstract boolean isUnicodeIdentifierPart(int ch);
+    abstract boolean isIdentifierIgnorable(int ch);
+    abstract int toLowerCase(int ch);
+    abstract int toUpperCase(int ch);
+    abstract int toTitleCase(int ch);
+    abstract int digit(int ch, int radix);
+    abstract int getNumericValue(int ch);
+    abstract byte getDirectionality(int ch);
+
+    //need to implement for JSR204
+    int toUpperCaseEx(int ch) {
+        return toUpperCase(ch);
+    }
+    char[] toUpperCaseCharArray(int ch) {
+        return null;
+    }
+
+    // Character <= 0xff (basic latin) is handled by internal fast-path
+    // to avoid initializing large tables.
+    // Note: performance of this "fast-path" code may be sub-optimal
+    // in negative cases for some accessors due to complicated ranges.
+    // Should revisit after optimization of table initialization.
+
+    static final CharacterData of(int ch) {
+        if (ch >>> 8 == 0) {     // fast-path
+            return CharacterDataLatin1.instance;
+        } else {
+            switch(ch >>> 16) {  //plane 00-16
+            case(0):
+                return CharacterData00.instance;
+            case(1):
+                return CharacterData01.instance;
+            case(2):
+                return CharacterData02.instance;
+            case(14):
+                return CharacterData0E.instance;
+            case(15):   // Private Use
+            case(16):   // Private Use
+                return CharacterDataPrivateUse.instance;
+            default:
+                return CharacterDataUndefined.instance;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/CharacterData00.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,1332 @@
+// This file was generated AUTOMATICALLY from a template file Tue Mar 29 05:26:53 GMT 2011
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+/** 
+ * The CharacterData00 class encapsulates the large tables once found in
+ * java.lang.Character
+*/
+
+class CharacterData00 extends CharacterData {
+    /* The character properties are currently encoded into 32 bits in the following manner:
+        1 bit   mirrored property
+        4 bits  directionality property
+        9 bits  signed offset used for converting case
+        1 bit   if 1, adding the signed offset converts the character to lowercase
+        1 bit   if 1, subtracting the signed offset converts the character to uppercase
+        1 bit   if 1, this character has a titlecase equivalent (possibly itself)
+        3 bits  0  may not be part of an identifier
+                1  ignorable control; may continue a Unicode identifier or Java identifier
+                2  may continue a Java identifier but not a Unicode identifier (unused)
+                3  may continue a Unicode identifier or Java identifier
+                4  is a Java whitespace character
+                5  may start or continue a Java identifier;
+                   may continue but not start a Unicode identifier (underscores)
+                6  may start or continue a Java identifier but not a Unicode identifier ($)
+                7  may start or continue a Unicode identifier or Java identifier
+                Thus:
+                   5, 6, 7 may start a Java identifier
+                   1, 2, 3, 5, 6, 7 may continue a Java identifier
+                   7 may start a Unicode identifier
+                   1, 3, 5, 7 may continue a Unicode identifier
+                   1 is ignorable within an identifier
+                   4 is Java whitespace
+        2 bits  0  this character has no numeric property
+                1  adding the digit offset to the character code and then
+                   masking with 0x1F will produce the desired numeric value
+                2  this character has a "strange" numeric value
+                3  a Java supradecimal digit: adding the digit offset to the
+                   character code, then masking with 0x1F, then adding 10
+                   will produce the desired numeric value
+        5 bits  digit offset
+        5 bits  character type
+
+        The encoding of character properties is subject to change at any time.
+     */
+
+    int getProperties(int ch) {
+        char offset = (char)ch;
+        int props = A[Y[X[offset>>5]|((offset>>1)&0xF)]|(offset&0x1)];
+        return props;
+    }
+
+    int getType(int ch) {
+        int props = getProperties(ch);
+        return (props & 0x1F);
+    }
+
+    boolean isJavaIdentifierStart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) >= 0x00005000);
+    }
+
+    boolean isJavaIdentifierPart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00003000) != 0);
+    }
+
+    boolean isUnicodeIdentifierStart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) == 0x00007000);
+    }
+
+    boolean isUnicodeIdentifierPart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00001000) != 0);
+    }
+
+    boolean isIdentifierIgnorable(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) == 0x00001000);
+    }
+
+    int toLowerCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00020000) != 0) {
+          if ((val & 0x07FC0000) == 0x07FC0000) {
+            switch(ch) {
+              // map the offset overflow chars
+			case 0x0130 : mapChar = 0x0069; break;
+            case 0x2126 : mapChar = 0x03C9; break;
+            case 0x212A : mapChar = 0x006B; break;
+            case 0x212B : mapChar = 0x00E5; break;
+              // map the titlecase chars with both a 1:M uppercase map
+              // and a lowercase map
+            case 0x1F88 : mapChar = 0x1F80; break;
+            case 0x1F89 : mapChar = 0x1F81; break;
+            case 0x1F8A : mapChar = 0x1F82; break;
+            case 0x1F8B : mapChar = 0x1F83; break;
+            case 0x1F8C : mapChar = 0x1F84; break;
+            case 0x1F8D : mapChar = 0x1F85; break;
+            case 0x1F8E : mapChar = 0x1F86; break;
+            case 0x1F8F : mapChar = 0x1F87; break;
+            case 0x1F98 : mapChar = 0x1F90; break;
+            case 0x1F99 : mapChar = 0x1F91; break;
+            case 0x1F9A : mapChar = 0x1F92; break;
+            case 0x1F9B : mapChar = 0x1F93; break;
+            case 0x1F9C : mapChar = 0x1F94; break;
+            case 0x1F9D : mapChar = 0x1F95; break;
+            case 0x1F9E : mapChar = 0x1F96; break;
+            case 0x1F9F : mapChar = 0x1F97; break;
+            case 0x1FA8 : mapChar = 0x1FA0; break;
+            case 0x1FA9 : mapChar = 0x1FA1; break;
+            case 0x1FAA : mapChar = 0x1FA2; break;
+            case 0x1FAB : mapChar = 0x1FA3; break;
+            case 0x1FAC : mapChar = 0x1FA4; break;
+            case 0x1FAD : mapChar = 0x1FA5; break;
+            case 0x1FAE : mapChar = 0x1FA6; break;
+            case 0x1FAF : mapChar = 0x1FA7; break;
+            case 0x1FBC : mapChar = 0x1FB3; break;
+            case 0x1FCC : mapChar = 0x1FC3; break;
+            case 0x1FFC : mapChar = 0x1FF3; break;
+
+            case 0x023A : mapChar = 0x2C65; break;
+            case 0x023E : mapChar = 0x2C66; break;
+            case 0x10A0 : mapChar = 0x2D00; break;
+            case 0x10A1 : mapChar = 0x2D01; break;
+            case 0x10A2 : mapChar = 0x2D02; break;
+            case 0x10A3 : mapChar = 0x2D03; break;
+            case 0x10A4 : mapChar = 0x2D04; break;
+            case 0x10A5 : mapChar = 0x2D05; break;
+            case 0x10A6 : mapChar = 0x2D06; break;
+            case 0x10A7 : mapChar = 0x2D07; break;
+            case 0x10A8 : mapChar = 0x2D08; break;
+            case 0x10A9 : mapChar = 0x2D09; break;
+            case 0x10AA : mapChar = 0x2D0A; break;
+            case 0x10AB : mapChar = 0x2D0B; break;
+            case 0x10AC : mapChar = 0x2D0C; break;
+            case 0x10AD : mapChar = 0x2D0D; break;
+            case 0x10AE : mapChar = 0x2D0E; break;
+            case 0x10AF : mapChar = 0x2D0F; break;
+            case 0x10B0 : mapChar = 0x2D10; break;
+            case 0x10B1 : mapChar = 0x2D11; break;
+            case 0x10B2 : mapChar = 0x2D12; break;
+            case 0x10B3 : mapChar = 0x2D13; break;
+            case 0x10B4 : mapChar = 0x2D14; break;
+            case 0x10B5 : mapChar = 0x2D15; break;
+            case 0x10B6 : mapChar = 0x2D16; break;
+            case 0x10B7 : mapChar = 0x2D17; break;
+            case 0x10B8 : mapChar = 0x2D18; break;
+            case 0x10B9 : mapChar = 0x2D19; break;
+            case 0x10BA : mapChar = 0x2D1A; break;
+            case 0x10BB : mapChar = 0x2D1B; break;
+            case 0x10BC : mapChar = 0x2D1C; break;
+            case 0x10BD : mapChar = 0x2D1D; break;
+            case 0x10BE : mapChar = 0x2D1E; break;
+            case 0x10BF : mapChar = 0x2D1F; break;
+            case 0x10C0 : mapChar = 0x2D20; break;
+            case 0x10C1 : mapChar = 0x2D21; break;
+            case 0x10C2 : mapChar = 0x2D22; break;
+            case 0x10C3 : mapChar = 0x2D23; break;
+            case 0x10C4 : mapChar = 0x2D24; break;
+            case 0x10C5 : mapChar = 0x2D25; break;
+            case 0x1E9E : mapChar = 0x00DF; break;
+            case 0x2C62 : mapChar = 0x026B; break;
+            case 0x2C63 : mapChar = 0x1D7D; break;
+            case 0x2C64 : mapChar = 0x027D; break;
+            case 0x2C6D : mapChar = 0x0251; break;
+            case 0x2C6E : mapChar = 0x0271; break;
+            case 0x2C6F : mapChar = 0x0250; break;
+            case 0xA77D : mapChar = 0x1D79; break;
+              // default mapChar is already set, so no
+              // need to redo it here.
+              // default       : mapChar = ch;
+            }
+          }
+          else {
+            int offset = val << 5 >> (5+18);
+            mapChar = ch + offset;
+          }
+        }
+        return mapChar;
+    }
+
+    int toUpperCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00010000) != 0) {
+          if ((val & 0x07FC0000) == 0x07FC0000) {
+            switch(ch) {
+              // map chars with overflow offsets
+            case 0x00B5 : mapChar = 0x039C; break;
+            case 0x017F : mapChar = 0x0053; break;
+            case 0x1FBE : mapChar = 0x0399; break;
+              // map char that have both a 1:1 and 1:M map
+            case 0x1F80 : mapChar = 0x1F88; break;
+            case 0x1F81 : mapChar = 0x1F89; break;
+            case 0x1F82 : mapChar = 0x1F8A; break;
+            case 0x1F83 : mapChar = 0x1F8B; break;
+            case 0x1F84 : mapChar = 0x1F8C; break;
+            case 0x1F85 : mapChar = 0x1F8D; break;
+            case 0x1F86 : mapChar = 0x1F8E; break;
+            case 0x1F87 : mapChar = 0x1F8F; break;
+            case 0x1F90 : mapChar = 0x1F98; break;
+            case 0x1F91 : mapChar = 0x1F99; break;
+            case 0x1F92 : mapChar = 0x1F9A; break;
+            case 0x1F93 : mapChar = 0x1F9B; break;
+            case 0x1F94 : mapChar = 0x1F9C; break;
+            case 0x1F95 : mapChar = 0x1F9D; break;
+            case 0x1F96 : mapChar = 0x1F9E; break;
+            case 0x1F97 : mapChar = 0x1F9F; break;
+            case 0x1FA0 : mapChar = 0x1FA8; break;
+            case 0x1FA1 : mapChar = 0x1FA9; break;
+            case 0x1FA2 : mapChar = 0x1FAA; break;
+            case 0x1FA3 : mapChar = 0x1FAB; break;
+            case 0x1FA4 : mapChar = 0x1FAC; break;
+            case 0x1FA5 : mapChar = 0x1FAD; break;
+            case 0x1FA6 : mapChar = 0x1FAE; break;
+            case 0x1FA7 : mapChar = 0x1FAF; break;
+            case 0x1FB3 : mapChar = 0x1FBC; break;
+            case 0x1FC3 : mapChar = 0x1FCC; break;
+            case 0x1FF3 : mapChar = 0x1FFC; break;
+
+            case 0x0250 : mapChar = 0x2C6F; break;
+            case 0x0251 : mapChar = 0x2C6D; break;
+            case 0x026B : mapChar = 0x2C62; break;
+            case 0x0271 : mapChar = 0x2C6E; break;
+            case 0x027D : mapChar = 0x2C64; break;
+            case 0x1D79 : mapChar = 0xA77D; break;
+            case 0x1D7D : mapChar = 0x2C63; break;
+            case 0x2C65 : mapChar = 0x023A; break;
+            case 0x2C66 : mapChar = 0x023E; break;
+            case 0x2D00 : mapChar = 0x10A0; break;
+            case 0x2D01 : mapChar = 0x10A1; break;
+            case 0x2D02 : mapChar = 0x10A2; break;
+            case 0x2D03 : mapChar = 0x10A3; break;
+            case 0x2D04 : mapChar = 0x10A4; break;
+            case 0x2D05 : mapChar = 0x10A5; break;
+            case 0x2D06 : mapChar = 0x10A6; break;
+            case 0x2D07 : mapChar = 0x10A7; break;
+            case 0x2D08 : mapChar = 0x10A8; break;
+            case 0x2D09 : mapChar = 0x10A9; break;
+            case 0x2D0A : mapChar = 0x10AA; break;
+            case 0x2D0B : mapChar = 0x10AB; break;
+            case 0x2D0C : mapChar = 0x10AC; break;
+            case 0x2D0D : mapChar = 0x10AD; break;
+            case 0x2D0E : mapChar = 0x10AE; break;
+            case 0x2D0F : mapChar = 0x10AF; break;
+            case 0x2D10 : mapChar = 0x10B0; break;
+            case 0x2D11 : mapChar = 0x10B1; break;
+            case 0x2D12 : mapChar = 0x10B2; break;
+            case 0x2D13 : mapChar = 0x10B3; break;
+            case 0x2D14 : mapChar = 0x10B4; break;
+            case 0x2D15 : mapChar = 0x10B5; break;
+            case 0x2D16 : mapChar = 0x10B6; break;
+            case 0x2D17 : mapChar = 0x10B7; break;
+            case 0x2D18 : mapChar = 0x10B8; break;
+            case 0x2D19 : mapChar = 0x10B9; break;
+            case 0x2D1A : mapChar = 0x10BA; break;
+            case 0x2D1B : mapChar = 0x10BB; break;
+            case 0x2D1C : mapChar = 0x10BC; break;
+            case 0x2D1D : mapChar = 0x10BD; break;
+            case 0x2D1E : mapChar = 0x10BE; break;
+            case 0x2D1F : mapChar = 0x10BF; break;
+            case 0x2D20 : mapChar = 0x10C0; break;
+            case 0x2D21 : mapChar = 0x10C1; break;
+            case 0x2D22 : mapChar = 0x10C2; break;
+            case 0x2D23 : mapChar = 0x10C3; break;
+            case 0x2D24 : mapChar = 0x10C4; break;
+            case 0x2D25 : mapChar = 0x10C5; break;
+              // ch must have a 1:M case mapping, but we
+              // can't handle it here. Return ch.
+              // since mapChar is already set, no need
+              // to redo it here.
+              //default       : mapChar = ch;
+            }
+          }
+          else {
+            int offset = val  << 5 >> (5+18);
+            mapChar =  ch - offset;
+          }
+        }
+        return mapChar;
+    }
+
+    int toTitleCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00008000) != 0) {
+            // There is a titlecase equivalent.  Perform further checks:
+            if ((val & 0x00010000) == 0) {
+                // The character does not have an uppercase equivalent, so it must
+                // already be uppercase; so add 1 to get the titlecase form.
+                mapChar = ch + 1;
+            }
+            else if ((val & 0x00020000) == 0) {
+                // The character does not have a lowercase equivalent, so it must
+                // already be lowercase; so subtract 1 to get the titlecase form.
+                mapChar = ch - 1;
+            }
+            // else {
+            // The character has both an uppercase equivalent and a lowercase
+            // equivalent, so it must itself be a titlecase form; return it.
+            // return ch;
+            //}
+        }
+        else if ((val & 0x00010000) != 0) {
+            // This character has no titlecase equivalent but it does have an
+            // uppercase equivalent, so use that (subtract the signed case offset).
+            mapChar = toUpperCase(ch);
+        }
+        return mapChar;
+    }
+
+    int digit(int ch, int radix) {
+        int value = -1;
+        if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
+            int val = getProperties(ch);
+            int kind = val & 0x1F;
+            if (kind == Character.DECIMAL_DIGIT_NUMBER) {
+                value = ch + ((val & 0x3E0) >> 5) & 0x1F;
+            }
+            else if ((val & 0xC00) == 0x00000C00) {
+                // Java supradecimal digit
+                value = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;
+            }
+        }
+        return (value < radix) ? value : -1;
+    }
+
+    int getNumericValue(int ch) {
+        int val = getProperties(ch);
+        int retval = -1;
+
+        switch (val & 0xC00) {
+        default: // cannot occur
+        case (0x00000000):         // not numeric
+            retval = -1;
+            break;
+        case (0x00000400):              // simple numeric
+            retval = ch + ((val & 0x3E0) >> 5) & 0x1F;
+            break;
+        case (0x00000800)      :       // "strange" numeric
+            switch (ch) {
+                case 0x0BF1: retval = 100; break;         // TAMIL NUMBER ONE HUNDRED
+                case 0x0BF2: retval = 1000; break;        // TAMIL NUMBER ONE THOUSAND
+                case 0x1375: retval = 40; break;          // ETHIOPIC NUMBER FORTY
+                case 0x1376: retval = 50; break;          // ETHIOPIC NUMBER FIFTY
+                case 0x1377: retval = 60; break;          // ETHIOPIC NUMBER SIXTY
+                case 0x1378: retval = 70; break;          // ETHIOPIC NUMBER SEVENTY
+                case 0x1379: retval = 80; break;          // ETHIOPIC NUMBER EIGHTY
+                case 0x137A: retval = 90; break;          // ETHIOPIC NUMBER NINETY
+                case 0x137B: retval = 100; break;         // ETHIOPIC NUMBER HUNDRED
+                case 0x137C: retval = 10000; break;       // ETHIOPIC NUMBER TEN THOUSAND
+                case 0x215F: retval = 1; break;           // FRACTION NUMERATOR ONE
+                case 0x216C: retval = 50; break;          // ROMAN NUMERAL FIFTY
+                case 0x216D: retval = 100; break;         // ROMAN NUMERAL ONE HUNDRED
+                case 0x216E: retval = 500; break;         // ROMAN NUMERAL FIVE HUNDRED
+                case 0x216F: retval = 1000; break;        // ROMAN NUMERAL ONE THOUSAND
+                case 0x217C: retval = 50; break;          // SMALL ROMAN NUMERAL FIFTY
+                case 0x217D: retval = 100; break;         // SMALL ROMAN NUMERAL ONE HUNDRED
+                case 0x217E: retval = 500; break;         // SMALL ROMAN NUMERAL FIVE HUNDRED
+                case 0x217F: retval = 1000; break;        // SMALL ROMAN NUMERAL ONE THOUSAND
+                case 0x2180: retval = 1000; break;        // ROMAN NUMERAL ONE THOUSAND C D
+                case 0x2181: retval = 5000; break;        // ROMAN NUMERAL FIVE THOUSAND
+                case 0x2182: retval = 10000; break;       // ROMAN NUMERAL TEN THOUSAND
+
+                case 0x325C: retval = 32; break;
+
+                case 0x325D: retval = 33; break;          // CIRCLED NUMBER THIRTY THREE
+                case 0x325E: retval = 34; break;          // CIRCLED NUMBER THIRTY FOUR
+                case 0x325F: retval = 35; break;          // CIRCLED NUMBER THIRTY FIVE
+                case 0x32B1: retval = 36; break;          // CIRCLED NUMBER THIRTY SIX
+                case 0x32B2: retval = 37; break;          // CIRCLED NUMBER THIRTY SEVEN
+                case 0x32B3: retval = 38; break;          // CIRCLED NUMBER THIRTY EIGHT
+                case 0x32B4: retval = 39; break;          // CIRCLED NUMBER THIRTY NINE
+                case 0x32B5: retval = 40; break;          // CIRCLED NUMBER FORTY
+                case 0x32B6: retval = 41; break;          // CIRCLED NUMBER FORTY ONE
+                case 0x32B7: retval = 42; break;          // CIRCLED NUMBER FORTY TWO
+                case 0x32B8: retval = 43; break;          // CIRCLED NUMBER FORTY THREE
+                case 0x32B9: retval = 44; break;          // CIRCLED NUMBER FORTY FOUR
+                case 0x32BA: retval = 45; break;          // CIRCLED NUMBER FORTY FIVE
+                case 0x32BB: retval = 46; break;          // CIRCLED NUMBER FORTY SIX
+                case 0x32BC: retval = 47; break;          // CIRCLED NUMBER FORTY SEVEN
+                case 0x32BD: retval = 48; break;          // CIRCLED NUMBER FORTY EIGHT
+                case 0x32BE: retval = 49; break;          // CIRCLED NUMBER FORTY NINE
+                case 0x32BF: retval = 50; break;          // CIRCLED NUMBER FIFTY
+
+                case 0x0D71: retval = 100; break;         // MALAYALAM NUMBER ONE HUNDRED
+                case 0x0D72: retval = 1000; break;        // MALAYALAM NUMBER ONE THOUSAND
+                case 0x2186: retval = 50; break;          // ROMAN NUMERAL FIFTY EARLY FORM
+                case 0x2187: retval = 50000; break;       // ROMAN NUMERAL FIFTY THOUSAND
+                case 0x2188: retval = 100000; break;      // ROMAN NUMERAL ONE HUNDRED THOUSAND
+
+                default:       retval = -2; break;
+            }
+            break;
+        case (0x00000C00):           // Java supradecimal
+            retval = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;
+            break;
+        }
+        return retval;
+    }
+
+    boolean isWhitespace(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) == 0x00004000);
+    }
+
+    byte getDirectionality(int ch) {
+        int val = getProperties(ch);
+        byte directionality = (byte)((val & 0x78000000) >> 27);
+        if (directionality == 0xF ) {
+            switch(ch) {
+                case 0x202A :
+                    // This is the only char with LRE
+                    directionality = Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING;
+                    break;
+                case 0x202B :
+                    // This is the only char with RLE
+                    directionality = Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING;
+                    break;
+                case 0x202C :
+                    // This is the only char with PDF
+                    directionality = Character.DIRECTIONALITY_POP_DIRECTIONAL_FORMAT;
+                    break;
+                case 0x202D :
+                    // This is the only char with LRO
+                    directionality = Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE;
+                    break;
+                case 0x202E :
+                    // This is the only char with RLO
+                    directionality = Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE;
+                    break;
+                default :
+                    directionality = Character.DIRECTIONALITY_UNDEFINED;
+                    break;
+            }
+        }
+        return directionality;
+    }
+
+    boolean isMirrored(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x80000000) != 0);
+    }
+
+    int toUpperCaseEx(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00010000) != 0) {
+            if ((val & 0x07FC0000) != 0x07FC0000) {
+                int offset = val  << 5 >> (5+18);
+                mapChar =  ch - offset;
+            }
+            else {
+                switch(ch) {
+                    // map overflow characters
+                    case 0x00B5 : mapChar = 0x039C; break;
+                    case 0x017F : mapChar = 0x0053; break;
+                    case 0x1FBE : mapChar = 0x0399; break;
+
+                    case 0x0250 : mapChar = 0x2C6F; break;
+                    case 0x0251 : mapChar = 0x2C6D; break;
+                    case 0x026B : mapChar = 0x2C62; break;
+                    case 0x0271 : mapChar = 0x2C6E; break;
+                    case 0x027D : mapChar = 0x2C64; break;
+                    case 0x1D79 : mapChar = 0xA77D; break;
+                    case 0x1D7D : mapChar = 0x2C63; break;
+                    case 0x2C65 : mapChar = 0x023A; break;
+                    case 0x2C66 : mapChar = 0x023E; break;
+                    case 0x2D00 : mapChar = 0x10A0; break;
+                    case 0x2D01 : mapChar = 0x10A1; break;
+                    case 0x2D02 : mapChar = 0x10A2; break;
+                    case 0x2D03 : mapChar = 0x10A3; break;
+                    case 0x2D04 : mapChar = 0x10A4; break;
+                    case 0x2D05 : mapChar = 0x10A5; break;
+                    case 0x2D06 : mapChar = 0x10A6; break;
+                    case 0x2D07 : mapChar = 0x10A7; break;
+                    case 0x2D08 : mapChar = 0x10A8; break;
+                    case 0x2D09 : mapChar = 0x10A9; break;
+                    case 0x2D0A : mapChar = 0x10AA; break;
+                    case 0x2D0B : mapChar = 0x10AB; break;
+                    case 0x2D0C : mapChar = 0x10AC; break;
+                    case 0x2D0D : mapChar = 0x10AD; break;
+                    case 0x2D0E : mapChar = 0x10AE; break;
+                    case 0x2D0F : mapChar = 0x10AF; break;
+                    case 0x2D10 : mapChar = 0x10B0; break;
+                    case 0x2D11 : mapChar = 0x10B1; break;
+                    case 0x2D12 : mapChar = 0x10B2; break;
+                    case 0x2D13 : mapChar = 0x10B3; break;
+                    case 0x2D14 : mapChar = 0x10B4; break;
+                    case 0x2D15 : mapChar = 0x10B5; break;
+                    case 0x2D16 : mapChar = 0x10B6; break;
+                    case 0x2D17 : mapChar = 0x10B7; break;
+                    case 0x2D18 : mapChar = 0x10B8; break;
+                    case 0x2D19 : mapChar = 0x10B9; break;
+                    case 0x2D1A : mapChar = 0x10BA; break;
+                    case 0x2D1B : mapChar = 0x10BB; break;
+                    case 0x2D1C : mapChar = 0x10BC; break;
+                    case 0x2D1D : mapChar = 0x10BD; break;
+                    case 0x2D1E : mapChar = 0x10BE; break;
+                    case 0x2D1F : mapChar = 0x10BF; break;
+                    case 0x2D20 : mapChar = 0x10C0; break;
+                    case 0x2D21 : mapChar = 0x10C1; break;
+                    case 0x2D22 : mapChar = 0x10C2; break;
+                    case 0x2D23 : mapChar = 0x10C3; break;
+                    case 0x2D24 : mapChar = 0x10C4; break;
+                    case 0x2D25 : mapChar = 0x10C5; break;
+                    default       : mapChar = Character.ERROR; break;
+                }
+            }
+        }
+        return mapChar;
+    }
+
+    char[] toUpperCaseCharArray(int ch) {
+        char[] upperMap = {(char)ch};
+        int location = findInCharMap(ch);
+        if (location != -1) {
+            upperMap = charMap[location][1];
+        }
+        return upperMap;
+    }
+
+
+    /**
+     * Finds the character in the uppercase mapping table.
+     *
+     * @param ch the <code>char</code> to search
+     * @return the index location ch in the table or -1 if not found
+     * @since 1.4
+     */
+     int findInCharMap(int ch) {
+        if (charMap == null || charMap.length == 0) {
+            return -1;
+        }
+        int top, bottom, current;
+        bottom = 0;
+        top = charMap.length;
+        current = top/2;
+        // invariant: top > current >= bottom && ch >= CharacterData.charMap[bottom][0]
+        while (top - bottom > 1) {
+            if (ch >= charMap[current][0][0]) {
+                bottom = current;
+            } else {
+                top = current;
+            }
+            current = (top + bottom) / 2;
+        }
+        if (ch == charMap[current][0][0]) return current;
+        else return -1;
+    }
+
+    static final CharacterData00 instance = new CharacterData00();
+    private CharacterData00() {};
+
+    // The following tables and code generated using:
+  // java GenerateCharacter -plane 0 -template ../../tools/GenerateCharacter/CharacterData00.java.template -spec ../../tools/UnicodeData/UnicodeData.txt -specialcasing ../../tools/UnicodeData/SpecialCasing.txt -o ../../../build/haiku-i586/gensrc/java/lang/CharacterData00.java -string -usecharforbyte 11 4 1
+      static final char[][][] charMap;
+// The X table has 2048 entries for a total of 4096 bytes.
+
+  static final char X[] = (
+    "\000\020\040\060\100\120\140\160\200\220\240\260\300\320\340\360\200\u0100"+
+    "\u0110\u0120\u0130\u0140\u0150\u0160\u0170\u0170\u0180\u0190\u01A0\u01B0\u01C0"+
+    "\u01D0\u01E0\u01F0\u0200\200\u0210\200\u0220\200\200\u0230\u0240\u0250\u0260"+
+    "\u0270\u0280\u0290\u02A0\u02B0\u02C0\u02D0\u02E0\u02E0\u02F0\u0300\u0310\u0320"+
+    "\u0330\u02E0\u02E0\u0340\u0350\u0360\u0370\u0370\u0370\u0370\u0370\u0370\u0370"+
+    "\u0370\u0380\u0390\u03A0\u03B0\u03C0\u03D0\u03E0\u03F0\u0400\u0410\u0420\u0430"+
+    "\u0440\u0450\u0460\u0470\u03C0\u0480\u0490\u04A0\u04B0\u04C0\u04D0\u04E0\u04F0"+
+    "\u0500\u0510\u0520\u0530\u0540\u0550\u0560\u0530\u0570\u0580\u0590\u05A0\u05B0"+
+    "\u05C0\u05D0\u05E0\u05F0\u0600\u0370\u0610\u0620\u0630\u0370\u0640\u0650\u0660"+
+    "\u0670\u0680\u0690\u06A0\u0370\u06B0\u06C0\u06D0\u06E0\u06F0\u0700\u0710\u0720"+
+    "\u06B0\u06B0\u0730\u06B0\u06B0\u0740\u06B0\u0750\u06B0\u06B0\u0760\u06B0\u0770"+
+    "\u0780\u0790\u06B0\u07A0\u06B0\u07B0\u07C0\u07D0\u06B0\u06B0\u07E0\u05E0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u07F0\u0800\u06B0\u06B0\u0810\u0820\u0830\u0840\u0850"+
+    "\u06B0\u0860\u0870\u0880\u0890\u06B0\u08A0\u08B0\u06B0\u08C0\u0370\u0370\u08D0"+
+    "\u08E0\u08F0\u0900\u06B0\u0910\u0920\u0930\u0940\u0370\u0370\u0370\u0370\u0370"+
+    "\u0370\u0370\u0950\u0960\u0970\u0980\u0990\u09A0\u0370\u0370\u06B0\u09B0\u09C0"+
+    "\u09D0\u0370\u0370\u0370\u0370\u09E0\u09F0\u0A00\u0A10\u0A20\u0A00\u0170\u0A30"+
+    "\200\200\200\200\u0A40\200\200\200\u0A50\u0A60\u0A70\u0A80\u0A90\u0AA0\u0AB0"+
+    "\u0AC0\u0AD0\u0AE0\u0AF0\u0B00\u0B10\u0B20\u0B30\u0B40\u0B50\u0B60\u0B70\u0B80"+
+    "\u0B90\u0BA0\u0BB0\u0BC0\u0BD0\u0BE0\u0BF0\u0C00\u0C10\u0C20\u0C30\u0C40\u0C50"+
+    "\u0C60\u0C70\u0C80\u0C90\u0CA0\u0CB0\u0CC0\u0930\u0CD0\u0CE0\u0CF0\u0D00\u0D10"+
+    "\u0D20\u0D30\u0930\u0930\u0930\u0930\u0930\u0D40\u0D50\u0D60\u0930\u0930\u0930"+
+    "\u0D70\u0D80\u0D90\u0DA0\u0370\u0DB0\u0DC0\u0DD0\u0DE0\u0DF0\u0E00\u0E10\u0E20"+
+    "\u0C70\u0C70\u0C70\u0C70\u0C70\u0C70\u0C70\u0C70\u0E30\u0E30\u0E30\u0E30\u0E40"+
+    "\u0E50\u0E60\u0E70\u0E80\u0E90\u0EA0\u0EB0\u0EC0\u0ED0\u0EE0\u0EF0\u0930\u0F00"+
+    "\u0F10\u0370\u0370\u0370\u0370\u0370\u0F20\u0F30\u0F40\u0F50\200\200\200\u0F60"+
+    "\u0F70\u0F80\u06B0\u0F90\u0FA0\u0FB0\u0FB0\u0170\u0FC0\u0FD0\u0370\u0370\u0FE0"+
+    "\u0930\u0930\u0FF0\u0930\u0930\u0930\u0930\u0930\u0930\u1000\u1010\u1020\u1030"+
+    "\u05E0\u06B0\u1040\u1050\u06B0\u1060\u1070\u1080\u06B0\u06B0\u1090\u08B0\u0930"+
+    "\u10A0\u10B0\u10C0\u10D0\u10E0\u10C0\u10F0\u1100\u1110\u0C70\u0C70\u0C70\u1120"+
+    "\u0C70\u0C70\u1130\u1140\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u1150\u0930\u0930\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u1160\u0370\u1170\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u1180\u0930\u0CD0\u0370\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u1190\u11A0\200\u11B0\u11C0\u0370\u0370"+
+    "\u0370\u11D0\u11E0\200\u11F0\u1200\u0370\u0370\u1210\u1220\u1230\u06B0\u1240"+
+    "\u1250\u1260\u1270\u0370\u1280\u1290\u12A0\u0370\u0370\u0370\u0370\u0370\u06B0"+
+    "\u12B0\u12C0\u0370\u0370\u0370\u0370\u0370\u0370\u0370\u0370\u0370\u0370\u0370"+
+    "\u0370\u0370\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0\u06B0"+
+    "\u1160\u0370\u0370\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0"+
+    "\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0"+
+    "\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0"+
+    "\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0"+
+    "\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0\u12D0"+
+    "\u12D0\u12D0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0"+
+    "\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u12E0\u06B0\u06B0\u06B0\u12F0\u06B0\u1300"+
+    "\u1310\u1320\u06B0\u1330\u06B0\u1340\u06B0\u06B0\u0750\u0370\u1350\u1360\u1370"+
+    "\u02E0\u02E0\u1380\u1390\u02E0\u02E0\u02E0\u02E0\u02E0\u02E0\u02E0\u02E0\u02E0"+
+    "\u02E0\u13A0\u13B0\u02E0\u13C0\u02E0\u13D0\u13E0\u13F0\u1400\u1410\u1420\u02E0"+
+    "\u02E0\u02E0\u1430\u1440\040\u1450\u1460\u1470\u1480\u1490\u14A0").toCharArray();
+
+  // The Y table has 5296 entries for a total of 10592 bytes.
+
+  static final char Y[] = (
+    "\000\000\000\000\002\004\006\000\000\000\000\000\000\000\010\004\012\014\016"+
+    "\020\022\024\026\030\032\032\032\032\032\034\036\040\042\044\044\044\044\044"+
+    "\044\044\044\044\044\044\044\046\050\052\054\056\056\056\056\056\056\056\056"+
+    "\056\056\056\056\060\062\064\000\000\066\000\000\000\000\000\000\000\000\000"+
+    "\000\000\000\000\070\072\072\074\076\100\102\104\106\110\112\114\116\120\122"+
+    "\124\126\126\126\126\126\126\126\126\126\126\126\130\126\126\126\132\134\134"+
+    "\134\134\134\134\134\134\134\134\134\136\134\134\134\140\142\142\142\142\142"+
+    "\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142"+
+    "\144\142\142\142\146\150\150\150\150\150\150\150\152\142\142\142\142\142\142"+
+    "\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\154\150"+
+    "\150\152\156\142\142\160\162\164\166\170\172\162\174\176\142\200\202\204\142"+
+    "\142\142\206\210\212\142\206\214\216\150\220\142\222\142\224\226\226\230\232"+
+    "\234\230\236\150\150\150\150\150\150\150\240\142\142\142\142\142\142\142\142"+
+    "\142\242\234\142\244\142\142\142\142\246\142\142\142\142\142\142\142\142\142"+
+    "\212\212\212\250\252\254\146\256\260\142\142\142\142\142\262\264\266\270\272"+
+    "\274\212\212\276\300\212\212\302\304\212\306\304\310\312\212\212\212\304\212"+
+    "\314\316\212\212\320\322\324\212\212\326\330\212\212\212\212\212\212\212\212"+
+    "\212\212\212\212\212\332\332\332\332\334\336\332\332\332\340\340\342\342\342"+
+    "\342\342\332\340\340\340\340\340\340\340\332\332\344\340\340\340\346\344\340"+
+    "\340\340\340\340\340\340\340\350\350\350\350\350\350\350\350\350\350\350\350"+
+    "\350\350\350\350\350\350\352\350\350\350\350\350\350\350\350\350\350\350\350"+
+    "\350\350\350\350\350\350\350\350\350\142\142\346\142\354\356\360\362\354\354"+
+    "\340\364\366\370\372\374\376\126\126\126\126\126\126\126\126\u0100\126\126"+
+    "\126\126\u0102\u0104\u0106\134\134\134\134\134\134\134\134\u0108\134\134\134"+
+    "\134\u010A\u010C\u010E\u0110\u0112\u0114\142\142\142\142\142\142\142\142\142"+
+    "\142\142\142\u0116\u0118\u011A\u011C\u011E\142\u0120\u0122\u0124\u0124\u0124"+
+    "\u0124\u0124\u0124\u0124\u0124\126\126\126\126\126\126\126\126\126\126\126"+
+    "\126\126\126\126\126\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
+    "\134\134\u0126\u0126\u0126\u0126\u0126\u0126\u0126\u0126\142\u0128\350\350"+
+    "\u012A\142\142\142\142\142\142\142\142\142\142\142\u012C\150\150\150\150\150"+
+    "\150\u012E\142\142\142\142\142\142\142\142\142\142\354\354\354\354\354\354"+
+    "\u0130\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132"+
+    "\u0132\u0132\u0132\u0132\u0132\u0132\u0134\u0136\u0138\u0138\u0138\u013A\u013C"+
+    "\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C"+
+    "\u013C\u013C\u013C\u013C\u013E\u0140\u0142\354\354\u0144\350\350\350\350\350"+
+    "\350\350\350\350\350\350\350\350\350\350\350\350\350\350\350\350\350\u0146"+
+    "\u0148\u014A\350\u0148\354\354\354\354\u014C\u014C\u014C\u014C\u014C\u014C"+
+    "\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014E\354\354\u014C\u0150\u0152"+
+    "\354\354\354\354\354\u0154\u0154\354\u0156\u0158\u015A\u015C\074\350\350\350"+
+    "\350\350\u015E\354\u0160\u0162\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0166\u0164\u0164\u0164\u0164\u0168"+
+    "\350\350\350\350\350\350\350\350\350\u016A\u016C\u016C\u016C\u016C\u016C\u016E"+
+    "\u0170\u0164\u0172\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0174\350\350"+
+    "\350\u0176\u0178\350\350\u017A\u017C\u017E\350\350\u0164\032\032\032\032\032"+
+    "\u0164\u0180\u0182\u0160\u0160\u0160\u0160\u0160\u0160\u0160\u0184\u0168\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\350\350\350\350\350\350\350\350\350\350\350\350\350\u016A\u0162\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\350\350"+
+    "\350\350\350\u0172\354\354\354\354\354\354\354\u0186\u0186\u0186\u0186\u0186"+
+    "\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C\u014C"+
+    "\u014C\u014C\u014C\u0188\350\350\350\350\u018A\114\020\u018C\354\354\354\354"+
+    "\354\354\354\354\354\354\354\354\354\354\354\354\354\354\u0144\u018E\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\354\u0190\u0192\u0194\350\350\350\u018E\u0192\u0194"+
+    "\354\u0196\350\u016A\354\226\226\226\226\226\350\u0138\u0198\u0198\u0198\u0198"+
+    "\u0198\u019A\u019C\354\354\354\u019E\226\226\u0144\u0192\u019E\226\226\226"+
+    "\u019C\u019E\u019C\u019E\226\226\226\226\226\226\226\226\226\226\u019C\226"+
+    "\226\226\u019C\u019C\354\226\226\354\u0190\u0192\u0194\350\u016A\u01A0\u01A2"+
+    "\u01A0\u0194\u019C\354\354\354\u01A0\354\354\226\u019E\226\350\354\u0198\u0198"+
+    "\u0198\u0198\u0198\226\072\u01A4\u01A4\u01A6\u01A8\354\354\u0144\u018E\u019E"+
+    "\226\226\u019C\354\u019E\u019C\u019E\226\226\226\226\226\226\226\226\226\226"+
+    "\u019C\226\226\226\u019C\226\u019E\u019C\226\354\u016A\u0192\u0194\u016A\354"+
+    "\u0144\u016A\u0144\350\354\u0144\354\354\354\u019E\226\u019C\u019C\354\354"+
+    "\354\u0198\u0198\u0198\u0198\u0198\350\226\u0196\354\354\354\354\354\u0144"+
+    "\u018E\u019E\226\226\226\226\u019E\226\u019E\226\226\226\226\226\226\226\226"+
+    "\226\226\u019C\226\226\226\u019C\226\u019E\226\226\354\u0190\u0192\u0194\350"+
+    "\350\u0144\u018E\u01A0\u0194\354\u019C\354\354\354\354\354\354\354\226\350"+
+    "\354\u0198\u0198\u0198\u0198\u0198\u01AA\354\354\354\354\354\354\354\226\226"+
+    "\226\226\u019C\226\226\226\u019C\226\u019E\226\226\354\u0190\u0194\u0194\350"+
+    "\u016A\u01A0\u01A2\u01A0\u0194\354\354\354\354\u018E\354\354\226\u019E\226"+
+    "\350\354\u0198\u0198\u0198\u0198\u0198\u01AC\354\354\354\354\354\354\354\354"+
+    "\u0190\u019E\226\226\u019C\354\226\u019C\226\226\354\u019E\u019C\u019C\226"+
+    "\354\u019E\u019C\354\226\u019C\354\226\226\226\226\226\226\354\354\u0192\u018E"+
+    "\u01A2\354\u0192\u01A2\u0192\u0194\354\u019C\354\354\u01A0\354\354\354\354"+
+    "\354\354\354\u0198\u0198\u0198\u0198\u0198\u01AE\u01B0\074\074\u01B2\u01B4"+
+    "\354\354\u01A0\u0192\u019E\226\226\226\u019C\226\u019C\226\226\226\226\226"+
+    "\226\226\226\226\226\226\u019C\226\226\226\226\226\u019E\226\226\354\u019E"+
+    "\350\u018E\u0192\u01A2\350\u016A\350\350\354\354\354\u0144\u016A\226\354\354"+
+    "\354\226\350\354\u0198\u0198\u0198\u0198\u0198\354\354\354\354\u01B6\u01B6"+
+    "\u01B8\u01BA\354\u0192\u019E\226\226\226\u019C\226\u019C\226\226\226\226\226"+
+    "\226\226\226\226\226\226\u019C\226\226\226\226\226\u019E\226\226\354\u0190"+
+    "\u01BC\u0192\u0192\u01A2\u01BE\u01A2\u0192\350\354\354\354\u01A0\u01A2\354"+
+    "\354\354\u019C\226\350\354\u0198\u0198\u0198\u0198\u0198\u01C0\u01B4\354\354"+
+    "\354\354\354\354\226\226\226\226\u019C\226\226\226\226\226\226\226\226\354"+
+    "\u019E\u0192\u0194\350\u016A\u0192\u01A2\u0192\u0194\354\354\354\354\u01A0"+
+    "\354\354\354\354\226\350\354\u0198\u0198\u0198\u0198\u0198\u01AE\u01C2\u01C2"+
+    "\354\u01C4\226\226\226\354\u0192\u019E\226\226\226\226\226\226\226\226\u019C"+
+    "\354\226\226\226\226\226\226\226\226\226\226\226\226\u019E\226\226\226\226"+
+    "\u019E\354\226\226\226\u019C\354\u016A\354\u01A0\u0192\350\u016A\u016A\u0192"+
+    "\u0192\u0192\u0192\354\354\354\354\354\354\354\354\354\u0192\u01C6\354\354"+
+    "\354\354\354\u019E\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\u0196\226\350\350\350\u016A\354\u01AA"+
+    "\226\226\226\u01C8\350\350\350\u01CA\u01CC\u01CC\u01CC\u01CC\u01CC\u0138\354"+
+    "\354\u019E\u019C\u019C\u019E\u019C\u019C\u019E\354\354\354\226\226\u019E\226"+
+    "\226\226\u019E\226\u019E\u019E\354\226\u019E\226\u0196\226\350\350\350\u0144"+
+    "\u0190\354\226\226\u019C\u01CE\350\350\350\354\u01CC\u01CC\u01CC\u01CC\u01CC"+
+    "\354\226\354\u01D0\u01D2\u0138\u0138\u0138\u0138\u0138\u0138\u0138\u01D4\u01D2"+
+    "\u01D2\350\u01D2\u01D2\u01D2\u01D6\u01D6\u01D6\u01D6\u01D6\u01C2\u01C2\u01C2"+
+    "\u01C2\u01C2\u0128\u0128\u0128\022\022\u0192\226\226\226\226\u019E\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\u019C\354\u0144"+
+    "\350\350\350\350\350\350\u018E\350\350\u01CA\350\226\226\354\354\350\350\350"+
+    "\350\u0144\350\350\350\350\350\350\350\350\350\350\350\350\350\350\350\350"+
+    "\350\u016A\u01D2\u01D2\u01D2\u01D2\u01D8\u01D2\u01D2\u01A8\u01D2\u0138\u0138"+
+    "\u01C6\354\354\354\354\354\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\u01DA\u0194\350\u018E\350\350\350\u0194"+
+    "\u018E\u0194\u0190\u01D6\u01D6\u01D6\u01D6\u01D6\u0138\u0138\u0138\226\226"+
+    "\226\u0192\350\226\226\350\u0190\u0192\u01DC\u01DA\u0192\u0192\u0192\226\u0196"+
+    "\350\u0190\226\226\226\226\226\226\u018E\u0194\u018E\u0192\u0192\u0194\u01DA"+
+    "\u01CC\u01CC\u01CC\u01CC\u01CC\354\354\u01D2\u01DE\u01DE\u01DE\u01DE\u01DE"+
+    "\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE\u01DE"+
+    "\u01DE\354\354\354\354\354\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\u01E0\u01CE\354\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\354\354\u019E\226\u019C\354\354\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\354\354\354\226\226\226\226\u019C\226\226\354\226\226\226\u019C\u019C"+
+    "\226\226\354\226\226\226\226\u019C\226\226\354\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\u019C\226\226\354\226\226\226\u019C\u019C"+
+    "\226\226\354\226\226\226\226\226\226\226\u019C\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\u019C\226\226\354\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\u019C\354\u0144\u01E2\u0138\u0138\u0138\u01E4"+
+    "\u01E6\u01E6\u01E6\u01E6\u01E8\u01EA\u01C2\u01C2\u01C2\u01EC\354\226\226\226"+
+    "\226\226\226\226\226\074\074\074\074\074\354\354\354\226\226\226\226\226\226"+
+    "\226\226\226\226\u019C\354\354\354\354\354\226\226\226\226\226\226\u01E0\u01EE"+
+    "\226\226\226\u019C\354\354\354\354\u01F0\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\u01F2\u01F4\354\226\226\226\226\226\u01E0\u0138\u01F6\u01F8\354"+
+    "\354\354\354\354\354\354\226\226\226\226\226\226\u019C\226\226\350\u016A\354"+
+    "\354\354\354\354\226\226\226\226\226\226\226\226\226\350\u01CA\u01C6\354\354"+
+    "\354\354\226\226\226\226\226\226\226\226\226\350\354\354\354\354\354\354\226"+
+    "\226\226\226\226\226\u019C\226\u019C\350\354\354\354\354\354\354\226\226\226"+
+    "\226\226\226\226\226\226\226\u01FA\u0194\350\350\350\u0192\u0192\u0192\u0192"+
+    "\u018E\u0194\350\350\350\350\350\u0138\u019A\u0138\u01FC\u0196\354\u01D6\u01D6"+
+    "\u01D6\u01D6\u01D6\354\354\354\u01FE\u01FE\u01FE\u01FE\u01FE\354\354\354\020"+
+    "\020\020\u0200\020\u0202\350\u0204\u01CC\u01CC\u01CC\u01CC\u01CC\354\354\354"+
+    "\226\u0206\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\354\354\354\354\226\226\226\226\u0196"+
+    "\u019C\354\354\354\354\354\354\354\354\354\354\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\u019C\354\350\u018E\u0192\u0194\u018E\u0192\354"+
+    "\354\u0192\u018E\u0192\u0192\u0194\350\354\354\u01B4\354\020\u0198\u0198\u0198"+
+    "\u0198\u0198\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\354"+
+    "\226\226\u019C\354\354\354\354\354\226\226\226\226\226\354\354\354\u0192\u0192"+
+    "\u0192\u0192\u0192\u0192\u0192\u0192\u01DC\226\226\226\u0192\354\354\354\u01CC"+
+    "\u01CC\u01CC\u01CC\u01CC\354\354\020\074\074\074\074\074\074\074\074\074\074"+
+    "\074\074\074\074\074\074\226\226\226\226\226\226\226\226\226\226\226\u0196"+
+    "\u018E\u0192\354\u0138\350\350\u01DC\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\u018E\350\350\u018E\u018E"+
+    "\u0192\u0192\u018E\u01DC\226\226\226\354\354\u01CC\u01CC\u01CC\u01CC\u01CC"+
+    "\u0138\u0138\u0138\u01D4\u01D2\u01D2\u01D2\u01D2\u0128\350\350\350\350\u01D2"+
+    "\u01D2\u01D2\u01D2\u01A8\354\350\u01DC\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\u01DA\350\350\u0192\350\u01A2\354\226\u01CC\u01CC\u01CC"+
+    "\u01CC\u01CC\354\354\354\226\226\u0192\u0192\u0192\u0192\350\350\350\350\u0192"+
+    "\350\354\u0140\u0138\u0138\u01D6\u01D6\u01D6\u01D6\u01D6\354\u019E\226\u01CC"+
+    "\u01CC\u01CC\u01CC\u01CC\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\332\332\332\u0138\212\212\212\212\212\212\212\212\212\212\212\212"+
+    "\212\212\212\212\212\212\212\212\212\212\332\332\332\332\332\332\332\332\332"+
+    "\332\332\332\332\332\332\332\332\332\332\332\332\332\332\332\332\332\332\212"+
+    "\212\212\212\212\212\212\212\212\212\212\u0208\212\304\212\212\212\212\212"+
+    "\212\212\212\212\212\212\212\212\212\u020A\332\332\350\350\350\u016A\354\354"+
+    "\354\354\354\354\354\354\354\354\354\350\142\142\142\142\142\142\142\142\142"+
+    "\142\142\262\262\u020C\212\254\u020E\u020E\u020E\u020E\u0210\u0210\u0210\u0210"+
+    "\u020E\u020E\u020E\354\u0210\u0210\u0210\354\u020E\u020E\u020E\u020E\u0210"+
+    "\u0210\u0210\u0210\u020E\u020E\u020E\u020E\u0210\u0210\u0210\u0210\u020E\u020E"+
+    "\u020E\354\u0210\u0210\u0210\354\u0212\u0212\u0212\u0212\u0214\u0214\u0214"+
+    "\u0214\u020E\u020E\u020E\u020E\u0210\u0210\u0210\u0210\u0216\u0218\u0218\u021A"+
+    "\u021C\u021E\u0220\354\262\262\262\262\u0222\u0222\u0222\u0222\262\262\262"+
+    "\262\u0222\u0222\u0222\u0222\262\262\262\262\u0222\u0222\u0222\u0222\u020E"+
+    "\262\u0224\262\u0210\u0226\u0228\u022A\340\262\u0224\262\u022C\u022C\u0228"+
+    "\340\u020E\262\354\262\u0210\u022E\u0230\340\u020E\262\u0232\262\u0210\u0234"+
+    "\u0236\340\354\262\u0224\262\u0238\u023A\u0228\u023C\u023E\u023E\u023E\u0240"+
+    "\u023E\u0242\u0244\u0246\u0248\u0248\u0248\020\u024A\u024C\u024A\u024C\020"+
+    "\020\020\020\u024E\u0250\u0250\u0252\u0254\u0254\u0256\020\u0258\u025A\020"+
+    "\u025C\u025E\020\u0260\u0262\020\020\020\020\020\u0264\u025E\020\020\020\020"+
+    "\u0266\u0244\u0244\u0268\354\354\u0244\u0244\u0244\u026A\354\110\110\110\u026C"+
+    "\u026E\u0270\u0272\u0272\u0272\u0272\u0272\u026C\u026E\u01F4\332\332\u01CE"+
+    "\354\354\354\354\354\072\072\072\072\072\072\072\072\072\072\072\354\354\354"+
+    "\354\354\354\354\354\354\354\354\354\354\350\350\350\350\350\350\u0274\u012A"+
+    "\u0178\u012A\u0178\350\350\350\350\350\u016A\354\354\354\354\354\354\354\074"+
+    "\u0276\074\u0278\074\u027A\u0110\212\u0110\u027C\u0278\074\u0278\u0110\u0110"+
+    "\074\074\074\u0276\u027E\u0276\u01DE\u0110\u0280\u0110\u0282\222\226\330\074"+
+    "\212\u0110\036\u0156\u0284\212\212\u0286\074\u0288\354\u028A\122\122\122\122"+
+    "\122\122\u028C\u028C\u028C\u028C\u028C\u028C\u028E\u028E\u0290\u0290\u0290"+
+    "\u0290\u0290\u0290\u0292\u0292\u0294\u0296\u0298\u0294\u029A\354\354\354\u0156"+
+    "\u0156\u029C\074\074\u0156\074\074\u029C\u0286\074\u029C\074\074\074\u029C"+
+    "\074\074\074\074\074\074\074\074\074\074\074\074\074\074\074\u0156\074\u029C"+
+    "\u029C\074\074\074\074\074\074\074\074\074\074\074\074\074\074\074\u0156\u0156"+
+    "\u0156\u0156\u0156\u0156\u029E\u02A0\036\u0156\u02A0\u02A0\u02A0\u0156\u029E"+
+    "\u02A2\u029E\036\u0156\u02A0\u02A0\u029E\u02A0\036\036\036\u0156\u029E\u02A0"+
+    "\u02A0\u02A0\u02A0\u0156\u0156\u029E\u029E\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\036\u0156\u0156\u02A0\u02A0\u0156\u0156\u0156\u0156\u029E\036"+
+    "\036\u02A0\u02A0\u02A0\u02A0\u0156\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\036\u029E\u02A0\036\u0156"+
+    "\u0156\036\u0156\u0156\u0156\u0156\u02A0\u0156\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\036\u0156\u0156\u02A0\u0156\u0156\u0156\u0156\u029E"+
+    "\u02A0\u02A0\u0156\u02A0\u0156\u0156\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\u02A0\u0156\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\074\074\074\074\u02A0\u02A0\074\074\074\074\074\074\074\074\074\074"+
+    "\u02A0\074\074\074\u02A4\u02A6\074\074\074\074\074\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u02A8\u029C\074\074\074\074\074\074\074\074\074\074"+
+    "\074\u02AA\074\074\u0286\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156"+
+    "\u0156\u0156\u0156\074\074\074\074\074\074\074\074\074\074\074\074\074\074"+
+    "\074\074\074\074\074\074\u0156\u0156\u0156\074\074\074\354\354\354\354\354"+
+    "\354\354\354\354\354\354\354\074\074\074\u01B4\354\354\354\354\354\354\354"+
+    "\354\354\354\354\354\074\074\074\074\074\u01B4\354\354\354\354\354\354\354"+
+    "\354\354\354\u02AC\u02AC\u02AC\u02AC\u02AC\u02AC\u02AC\u02AC\u02AC\u02AC\u02AE"+
+    "\u02AE\u02AE\u02AE\u02AE\u02AE\u02AE\u02AE\u02AE\u02AE\u02B0\u02B0\u02B0\u02B0"+
+    "\u02B0\u02B0\u02B0\u02B0\u02B0\u02B0\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u02B2\u02B2\u02B2\u02B2\u02B2\u02B2\u02B2"+
+    "\u02B2\u02B2\u02B2\u02B2\u02B2\u02B2\u02B4\u02B4\u02B4\u02B4\u02B4\u02B4\u02B4"+
+    "\u02B4\u02B4\u02B4\u02B4\u02B4\u02B4\u02B6\u02B8\u02B8\u02B8\u02B8\u02BA\u02BC"+
+    "\u02BC\u02BC\u02BC\u02BE\074\074\074\074\074\074\074\074\074\074\074\u0286"+
+    "\074\074\074\074\u0286\074\074\074\074\074\074\074\074\074\074\074\074\074"+
+    "\074\074\074\074\074\074\074\074\074\074\074\074\074\074\u0156\u0156\u0156"+
+    "\u0156\074\074\074\074\074\074\074\u0286\074\074\074\074\074\074\074\074\074"+
+    "\074\074\074\074\074\074\074\074\074\074\074\074\074\074\354\074\074\074\074"+
+    "\074\074\u02A8\074\074\074\074\074\074\074\u01B4\354\074\074\354\354\354\354"+
+    "\354\354\354\354\354\354\354\354\354\354\u01C0\074\u01B4\074\074\354\074\074"+
+    "\074\074\074\074\074\074\074\074\074\074\074\074\u01C0\074\074\074\074\074"+
+    "\074\074\074\074\074\074\074\074\074\074\074\074\u01C0\u01C0\074\u01B4\354"+
+    "\u01B4\074\074\074\u01B4\u01C0\074\074\074\022\022\022\022\022\022\022\u02C0"+
+    "\u02C0\u02C0\u02C0\u02C0\u02AC\u02AC\u02AC\u02AC\u02AC\u02C2\u02C2\u02C2\u02C2"+
+    "\u02C2\u01B4\354\074\074\074\074\074\074\074\074\074\074\074\074\u01C0\074"+
+    "\074\074\074\074\074\u01B4\036\u029E\u02C4\u02C6\u02A0\u02C8\u02CA\354\u0156"+
+    "\u029E\u02A0\036\u0156\u0156\u02A0\036\u0156\u02A0\u02A0\022\022\022\022\022"+
+    "\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156"+
+    "\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u026E"+
+    "\u02CC\u02CC\u02CC\u02CC\u02CC\u02CC\u02CC\u02CC\u02CC\u02CC\u02C6\u029E\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u0156\u0156\u0156\u0156"+
+    "\036\u0156\u0156\u0156\u02A0\u02A0\u02A0\u0156\u029E\u0156\u0156\u02A0\u02A0"+
+    "\036\u02A0\u0156\022\022\036\u0156\u029E\u029E\u02A0\u0156\u02A0\u0156\u0156"+
+    "\u0156\u0156\u0156\u02A0\u02A0\u02A0\u0156\022\u0156\u0156\u0156\u0156\u0156"+
+    "\u0156\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\036\u02A0\u02A0"+
+    "\u0156\036\036\u029E\u029E\u02A0\036\u0156\u0156\u02A0\u0156\u0156\u0156\u02A0"+
+    "\036\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u029E"+
+    "\036\u0156\u0156\u0156\u0156\u0156\u02A0\u0156\u0156\u02A0\u02A0\u029E\036"+
+    "\u029E\036\u0156\u029E\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u0156"+
+    "\u02A0\u02A0\u02A0\u02A0\u029E\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0"+
+    "\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\u02A0\036\u0156"+
+    "\u0156\036\036\u0156\u02A0\u02A0\036\u0156\u0156\u02A0\036\u0156\u029E\u0156"+
+    "\u029E\u02A0\u02A0\u029E\u0156\074\074\074\074\074\074\074\074\u0156\u0156"+
+    "\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u0156\u029C\u0286\u0156\u0156\u02C8"+
+    "\354\074\074\u01B4\354\354\354\354\354\u0132\u0132\u0132\u0132\u0132\u0132"+
+    "\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132\u0132"+
+    "\u0132\u0132\u0132\u0132\u0134\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C"+
+    "\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C\u013C"+
+    "\u013C\u013C\u02CE\142\u01DE\u02D0\u02D2\150\150\u02D4\u01DE\u02D6\142\146"+
+    "\166\212\212\u020A\354\142\142\u02D8\074\074\u01B4\354\354\354\354\354\354"+
+    "\u02DA\020\u02DC\020\262\262\262\262\262\262\262\262\262\262\262\262\262\262"+
+    "\262\262\262\262\262\354\354\354\354\354\226\226\226\226\226\226\226\226\226"+
+    "\226\226\354\354\354\354\u0136\354\354\354\354\354\354\354\354\226\226\226"+
+    "\226\226\226\226\226\226\226\226\u019C\354\354\354\354\226\226\226\u019C\226"+
+    "\226\226\u019C\226\226\226\u019C\226\226\226\u019C\020\u02DE\u02DE\020\u0258"+
+    "\u025A\u02DE\020\020\020\020\u02E0\020\u0200\u02DE\020\u02DE\022\022\022\022"+
+    "\020\020\u02E2\362\354\354\354\354\354\354\354\074\074\074\074\074\074\074"+
+    "\074\074\074\074\074\074\u01C0\074\074\074\074\074\074\074\074\074\074\074"+
+    "\074\354\354\354\354\354\354\074\074\074\074\074\074\074\074\074\074\074\354"+
+    "\354\354\354\354\354\354\354\354\354\354\354\354\074\074\074\074\074\074\354"+
+    "\354\012\020\u02E4\u02E6\022\022\022\022\022\074\022\022\022\022\u02E8\u02EA"+
+    "\u02EC\u02EE\u02EE\u02EE\u02EE\350\350\350\u02F0\332\332\074\u02F2\u02F4\u02F6"+
+    "\074\226\226\226\226\226\226\226\226\226\226\226\u019C\u0144\u02F8\u02FA\u02FC"+
+    "\u02FE\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\u02F6\332\u02FC\354\354\u019E"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\354\u019E\226\226\226\226\226\226\226\226\226\226\226\226\226\226\u019C"+
+    "\u01D2\u0300\u0300\u01D2\u01D2\u01D2\u01D2\u01D2\074\074\354\354\354\354\354"+
+    "\354\226\226\226\226\226\226\226\226\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u02A8\u01B4\u0302\u0302\u0302\u0302"+
+    "\u0302\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\354\354\354\354\354\354\u0304\u0306\u0306\u0306\u0306\u0306\122\122"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\074\u02AA\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u0308\122"+
+    "\122\122\122\122\122\122\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\074\074\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01A8\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u02A8\074\u02AA\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\074\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2\u01D2"+
+    "\u01D2\u01D2\u01D2\u01D2\u01D2\u02A8\226\226\226\226\226\226\226\226\226\226"+
+    "\226\354\354\354\354\354\226\226\354\354\354\354\354\354\354\354\354\354\354"+
+    "\354\354\354\226\226\226\226\226\226\226\226\226\226\u0206\226\226\226\226"+
+    "\226\226\226\226\226\226\226\u019C\354\074\074\074\074\074\074\074\074\226"+
+    "\226\226\226\226\226\u030A\020\226\226\226\226\226\226\226\226\u01D6\u01D6"+
+    "\u01D6\u01D6\u01D6\226\354\354\354\354\354\354\354\354\354\354\354\142\142"+
+    "\142\142\142\142\u0196\u012A\u030C\354\354\354\354\350\u02E2\142\142\142\142"+
+    "\142\142\142\142\142\142\142\142\354\354\354\354\340\340\340\340\340\340\340"+
+    "\340\340\340\340\u030E\342\342\342\342\340\142\142\142\142\142\142\142\212"+
+    "\142\142\142\142\142\142\142\142\142\142\142\142\142\142\142\u0310\212\212"+
+    "\212\146\150\u02D4\142\142\142\142\142\u0312\u0314\u0316\354\354\354\354\354"+
+    "\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\u019E"+
+    "\226\226\226\u0190\226\u0190\226\u0196\226\226\226\226\226\226\226\226\226"+
+    "\226\226\u01DA\u0194\u018E\074\074\354\354\354\354\354\354\354\354\354\354"+
+    "\226\226\226\226\226\226\226\226\226\226\020\020\354\354\354\354\u0192\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\u0192\u0192\u0192\u0192\u0192\u0192\u0192\u0192\u016A"+
+    "\354\354\354\354\u0138\u01CC\u01CC\u01CC\u01CC\u01CC\354\354\354\u01D6\u01D6"+
+    "\u01D6\u01D6\u01D6\226\226\226\226\226\226\226\226\226\226\226\226\226\226"+
+    "\350\350\350\350\u0138\226\226\226\226\226\226\226\226\226\226\226\u0196\350"+
+    "\350\350\350\350\u0192\354\354\354\354\354\u0140\226\226\226\226\u0196\350"+
+    "\350\u018E\u0194\u018E\u0194\u016A\354\354\354\354\226\u0196\226\226\226\226"+
+    "\u018E\354\u01CC\u01CC\u01CC\u01CC\u01CC\354\u0138\u0138\u0318\u0318\u0318"+
+    "\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318\u0318"+
+    "\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A\u031A"+
+    "\u031A\u031A\u031A\226\226\226\226\226\u031C\226\226\226\u031E\226\226\u0320"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\u0322\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\u0324\u0326\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\u0328\226\226\226\226"+
+    "\226\226\226\226\354\226\226\226\226\226\226\226\226\226\226\226\226\226\u019C"+
+    "\354\354\226\226\226\226\226\226\226\226\262\262\262\u0224\354\354\354\354"+
+    "\354\u032A\262\262\354\354\u032C\u032E\u014C\u014C\u014C\u014C\u0330\u014C"+
+    "\u014C\u014C\u014C\u014C\u014C\u014E\u014C\u014C\u014E\u014E\u014C\u032C\u014E"+
+    "\u014C\u014C\u014C\u014C\u014C\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\354\354\354\354\354"+
+    "\354\354\354\354\354\354\354\354\354\354\354\u0162\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0332\354\354\354\354\354\354\354\354\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\354\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354\354"+
+    "\354\u0164\u0164\u0164\u0164\u0164\u0164\u0334\354\350\350\350\350\350\350"+
+    "\350\350\020\020\020\u0336\u0338\354\354\354\350\350\350\u016A\354\354\354"+
+    "\354\u02E0\u033A\u033C\u033E\u033E\u033E\u033E\u033E\u033E\u033E\u0338\u0336"+
+    "\u0338\020\u025C\u0340\034\u0342\u0344\020\u0346\u02CC\u02CC\u0348\020\u034A"+
+    "\u02A0\u02C8\u034C\u0256\354\354\u0164\u0164\u034E\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164\u0164"+
+    "\u0164\u0164\u034E\u0184\u02DA\014\016\020\022\024\026\030\032\032\032\032"+
+    "\032\034\036\040\054\056\056\056\056\056\056\056\056\056\056\056\056\060\062"+
+    "\u026E\u0262\022\020\226\226\226\226\226\u02FC\226\226\226\226\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\226\226\226\332\226\226\226"+
+    "\226\226\226\226\226\226\226\226\226\226\226\226\u019C\354\226\226\226\354"+
+    "\226\226\226\354\226\226\226\354\226\u019C\354\072\u0350\u01B2\u0352\u0286"+
+    "\u0156\u029C\u01B4\354\354\354\354\u0354\u0356\074\354").toCharArray();
+
+  // The A table has 856 entries for a total of 3424 bytes.
+
+  static final int A[] = new int[856];
+  static final String A_DATA =
+    "\u4800\u100F\u4800\u100F\u4800\u100F\u5800\u400F\u5000\u400F\u5800\u400F\u6000"+
+    "\u400F\u5000\u400F\u5000\u400F\u5000\u400F\u6000\u400C\u6800\030\u6800\030"+
+    "\u2800\030\u2800\u601A\u2800\030\u6800\030\u6800\030\uE800\025\uE800\026\u6800"+
+    "\030\u2000\031\u3800\030\u2000\024\u3800\030\u3800\030\u1800\u3609\u1800\u3609"+
+    "\u3800\030\u6800\030\uE800\031\u6800\031\uE800\031\u6800\030\u6800\030\202"+
+    "\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\uE800\025\u6800\030\uE800\026\u6800\033"+
+    "\u6800\u5017\u6800\033\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\uE800\025\u6800"+
+    "\031\uE800\026\u6800\031\u4800\u100F\u4800\u100F\u5000\u100F\u3800\014\u6800"+
+    "\030\u2800\u601A\u2800\u601A\u6800\034\u6800\034\u6800\033\u6800\034\000\u7002"+
+    "\uE800\035\u6800\031\u4800\u1010\u6800\034\u6800\033\u2800\034\u2800\031\u1800"+
+    "\u060B\u1800\u060B\u6800\033\u07FD\u7002\u6800\034\u6800\030\u6800\033\u1800"+
+    "\u050B\000\u7002\uE800\036\u6800\u080B\u6800\u080B\u6800\u080B\u6800\030\202"+
+    "\u7001\202\u7001\202\u7001\u6800\031\202\u7001\u07FD\u7002\201\u7002\201\u7002"+
+    "\201\u7002\u6800\031\201\u7002\u061D\u7002\006\u7001\005\u7002\u07FF\uF001"+
+    "\u03A1\u7002\000\u7002\006\u7001\005\u7002\006\u7001\005\u7002\u07FD\u7002"+
+    "\u061E\u7001\006\u7001\u04F5\u7002\u034A\u7001\u033A\u7001\006\u7001\005\u7002"+
+    "\u0336\u7001\u0336\u7001\006\u7001\005\u7002\000\u7002\u013E\u7001\u032A\u7001"+
+    "\u032E\u7001\006\u7001\u033E\u7001\u067D\u7002\u034E\u7001\u0346\u7001\u0575"+
+    "\u7002\000\u7002\u034E\u7001\u0356\u7001\u05F9\u7002\u035A\u7001\u036A\u7001"+
+    "\006\u7001\005\u7002\u036A\u7001\000\u7002\000\u7002\005\u7002\u0366\u7001"+
+    "\u0366\u7001\006\u7001\005\u7002\u036E\u7001\000\u7002\000\u7005\000\u7002"+
+    "\u0721\u7002\000\u7005\000\u7005\012\uF001\007\uF003\011\uF002\012\uF001\007"+
+    "\uF003\011\uF002\011\uF002\006\u7001\005\u7002\u013D\u7002\u07FD\u7002\012"+
+    "\uF001\u067E\u7001\u0722\u7001\u05FA\u7001\000\u7002\u07FE\u7001\006\u7001"+
+    "\005\u7002\u0576\u7001\u07FE\u7001\000\u7002\005\u7002\u04F6\u7001\u0116\u7001"+
+    "\u011E\u7001\u07FD\u7002\u07FD\u7002\000\u7002\u0349\u7002\u0339\u7002\000"+
+    "\u7002\u0335\u7002\u0335\u7002\000\u7002\u0329\u7002\000\u7002\u032D\u7002"+
+    "\u0335\u7002\000\u7002\000\u7002\u033D\u7002\u0345\u7002\u034D\u7002\000\u7002"+
+    "\u07FD\u7002\000\u7002\u034D\u7002\u0355\u7002\000\u7002\000\u7002\u0359\u7002"+
+    "\u0369\u7002\000\u7002\000\u7002\u0369\u7002\u0369\u7002\u0115\u7002\u0365"+
+    "\u7002\u0365\u7002\u011D\u7002\000\u7002\u036D\u7002\000\u7002\000\u7005\000"+
+    "\u7002\000\u7004\000\u7004\000\u7004\u6800\u7004\u6800\u7004\000\u7004\u6800"+
+    "\033\u6800\033\u6800\u7004\u6800\u7004\000\u7004\u6800\033\u6800\u7004\u6800"+
+    "\033\u4000\u3006\u4000\u3006\u4000\u3006\u46B1\u3006\u7800\000\u7800\000\000"+
+    "\u7004\u05F9\u7002\u05F9\u7002\u05F9\u7002\u6800\030\u7800\000\232\u7001\u6800"+
+    "\030\226\u7001\226\u7001\226\u7001\u7800\000\u0102\u7001\u7800\000\376\u7001"+
+    "\376\u7001\u07FD\u7002\202\u7001\u7800\000\202\u7001\231\u7002\225\u7002\225"+
+    "\u7002\225\u7002\u07FD\u7002\201\u7002\175\u7002\201\u7002\u0101\u7002\375"+
+    "\u7002\375\u7002\042\u7001\371\u7002\345\u7002\000\u7001\000\u7001\000\u7001"+
+    "\275\u7002\331\u7002\041\u7002\u0159\u7002\u0141\u7002\u07E5\u7002\000\u7002"+
+    "\u0712\u7001\u0181\u7002\u6800\031\006\u7001\005\u7002\u07E6\u7001\000\u7002"+
+    "\u05FA\u7001\u05FA\u7001\u05FA\u7001\u0142\u7001\u0142\u7001\u0141\u7002\u0141"+
+    "\u7002\000\034\u4000\u3006\u4000\007\u4000\007\076\u7001\006\u7001\005\u7002"+
+    "\075\u7002\u7800\000\302\u7001\302\u7001\302\u7001\302\u7001\u7800\000\u7800"+
+    "\000\000\u7004\000\030\000\030\u7800\000\301\u7002\301\u7002\301\u7002\301"+
+    "\u7002\u07FD\u7002\u7800\000\000\030\u6800\024\u7800\000\u7800\000\u4000\u3006"+
+    "\u0800\024\u4000\u3006\u0800\030\u4000\u3006\u4000\u3006\u0800\030\u0800\u7005"+
+    "\u0800\u7005\u0800\u7005\u7800\000\u0800\u7005\u0800\030\u0800\030\u7800\000"+
+    "\u3000\u1010\u3000\u1010\u6800\031\u6800\031\u1000\031\u2800\030\u2800\030"+
+    "\u1000\u601A\u3800\030\u1000\030\u4000\u3006\u1000\030\u1000\030\u1000\030"+
+    "\u7800\000\u1000\u7005\u1000\u7005\u1000\u7005\u1000\u7004\u1000\u7005\u1000"+
+    "\u7005\u4000\u3006\u4000\u3006\u7800\000\u3000\u3409\u3000\u3409\u2800\030"+
+    "\u3000\030\u3000\030\u1000\030\u4000\u3006\u1000\u7005\u1000\030\u1000\u7005"+
+    "\u4000\u3006\u3000\u1010\u4000\007\u4000\u3006\u4000\u3006\u1000\u7004\u1000"+
+    "\u7004\u4000\u3006\u4000\u3006\u6800\034\u1000\u7005\u1000\034\u1000\034\u1000"+
+    "\u7005\u7800\000\u4800\u1010\u0800\u3409\u0800\u3409\u0800\u7005\u4000\u3006"+
+    "\u0800\u7004\u0800\u7004\u0800\u7004\u7800\000\u4000\u3006\000\u3008\u4000"+
+    "\u3006\000\u7005\000\u3008\000\u3008\000\u3008\u4000\u3006\000\u7005\u4000"+
+    "\u3006\000\u3749\000\u3749\000\030\000\u7004\000\u7005\u7800\000\u7800\000"+
+    "\000\u7005\u7800\000\000\u3008\000\u3008\u7800\000\000\u05AB\000\u05AB\000"+
+    "\013\000\u06EB\000\034\u7800\000\u7800\000\u2800\u601A\000\034\000\u7005\000"+
+    "\u074B\000\u080B\000\u080B\u6800\034\u6800\034\u2800\u601A\u6800\034\u7800"+
+    "\000\u6800\u050B\u6800\u050B\u6800\u04AB\u6800\u04AB\u6800\u04AB\000\034\000"+
+    "\u3008\000\u3006\000\u3006\000\u3008\u7800\000\u6800\034\000\u080B\000\u080B"+
+    "\u7800\000\000\034\000\030\u7800\000\000\u7004\u4000\u3006\u4000\u3006\000"+
+    "\030\000\u3609\000\u3609\000\u7004\u7800\000\000\u7005\000\034\000\034\000"+
+    "\034\000\030\000\034\000\u3409\000\u3409\u4000\u3006\000\034\000\u7005\000"+
+    "\u3008\000\u3008\000\u7005\u07FE\u7001\u07FE\u7001\000\u7005\000\030\000\034"+
+    "\000\030\000\030\000\u070B\000\u070B\000\u070B\000\u070B\000\u042B\000\u054B"+
+    "\000\u080B\000\u080B\u7800\000\000\030\000\u7005\u6000\u400C\000\u7005\000"+
+    "\u7005\uE800\025\uE800\026\u7800\000\000\u746A\000\u746A\000\u746A\u7800\000"+
+    "\000\u1010\000\u1010\000\030\u2800\u601A\u6800\u060B\u6800\u060B\u6800\024"+
+    "\u6800\030\u6800\030\u4000\u3006\u6000\u400C\u7800\000\000\u7005\000\u7004"+
+    "\000\u7004\u07FD\u7002\000\u7002\000\u7004\u07FD\u7002\355\u7002\u07E1\u7002"+
+    "\u07E1\u7002\u07E2\u7001\u07E2\u7001\u07FD\u7002\u07E1\u7002\u7800\000\u07E2"+
+    "\u7001\u06D9\u7002\u06D9\u7002\u06A9\u7002\u06A9\u7002\u0671\u7002\u0671\u7002"+
+    "\u0601\u7002\u0601\u7002\u0641\u7002\u0641\u7002\u0609\u7002\u0609\u7002\u07FF"+
+    "\uF003\u07FF\uF003\u07FD\u7002\u7800\000\u06DA\u7001\u06DA\u7001\u07FF\uF003"+
+    "\u6800\033\u07FD\u7002\u6800\033\u06AA\u7001\u06AA\u7001\u0672\u7001\u0672"+
+    "\u7001\u7800\000\u6800\033\u07FD\u7002\u07E5\u7002\u0642\u7001\u0642\u7001"+
+    "\u07E6\u7001\u6800\033\u0602\u7001\u0602\u7001\u060A\u7001\u060A\u7001\u6800"+
+    "\033\u7800\000\u6000\u400C\u6000\u400C\u6000\u400C\u6000\014\u6000\u400C\u4800"+
+    "\u1010\u4800\u1010\u4800\u1010\000\u1010\u0800\u1010\u6800\024\u6800\024\u6800"+
+    "\035\u6800\036\u6800\025\u6800\035\u6000\u400D\u5000\u400E\u7800\u1010\u7800"+
+    "\u1010\u7800\u1010\u3800\014\u2800\030\u2800\030\u2800\030\u6800\030\u6800"+
+    "\030\uE800\035\uE800\036\u6800\030\u6800\030\u6800\u5017\u6800\u5017\u6800"+
+    "\030\u3800\031\uE800\025\uE800\026\u6800\030\u6800\031\u6800\030\u6800\030"+
+    "\u6000\u400C\u4800\u1010\u7800\000\u1800\u060B\000\u7002\u2000\031\u2000\031"+
+    "\u6800\031\uE800\025\uE800\026\000\u7002\u1800\u040B\u1800\u040B\u4000\u3006"+
+    "\u4000\007\000\u7001\u6800\034\u6800\034\000\u7001\000\u7002\000\u7001\000"+
+    "\u7001\000\u7002\u07FE\u7001\u6800\034\u2800\034\000\u7002\162\u7001\000\u7001"+
+    "\u6800\031\000\u7001\u6800\034\u6800\031\161\u7002\000\034\u7800\000\u6800"+
+    "\u080B\102\u742A\102\u742A\102\u780A\102\u780A\101\u762A\101\u762A\101\u780A"+
+    "\101\u780A\000\u780A\000\u780A\000\u780A\006\u7001\005\u7002\000\u742A\000"+
+    "\u780A\u7800\000\u6800\031\u6800\034\u6800\031\uE800\031\uE800\031\uE800\031"+
+    "\u2000\031\u2800\031\u6800\034\uE800\025\uE800\026\u6800\034\000\034\u6800"+
+    "\034\u6800\034\000\034\u6800\u042B\u6800\u042B\u6800\u05AB\u6800\u05AB\u1800"+
+    "\u072B\u1800\u072B\152\034\152\034\151\034\151\034\u6800\u06CB\u6800\u040B"+
+    "\u6800\u040B\u6800\u040B\u6800\u040B\u6800\u058B\u6800\u058B\u6800\u058B\u6800"+
+    "\u058B\u6800\u042B\u6800\u056B\u6800\u056B\u6800\u06EB\u6800\u06EB\uE800\031"+
+    "\uE800\025\uE800\026\u6800\031\u6800\031\u7800\000\uE800\031\u7800\000\uE800"+
+    "\026\uE800\025\301\u7002\u7800\000\u07FE\u7001\u07FD\u7002\u07FD\u7002\006"+
+    "\u7001\005\u7002\u07FE\u7001\u7800\000\000\u7002\000\u7002\u6800\034\u7800"+
+    "\000\u6800\030\u6800\030\u6800\u080B\uE800\035\uE800\036\u6800\030\u6800\024"+
+    "\u6800\030\u6800\u7004\u6800\034\000\u7004\000\u7005\000\u772A\u6800\024\u6800"+
+    "\025\u6800\026\u6800\026\u6800\034\000\u740A\000\u740A\000\u740A\u6800\024"+
+    "\000\u7004\000\u764A\000\u776A\000\u748A\000\u7004\000\u7005\u6800\030\u4000"+
+    "\u3006\u6800\033\u6800\033\000\u7004\000\u7004\000\u7005\u6800\024\000\u7005"+
+    "\000\u05EB\000\u05EB\000\u042B\000\u042B\u6800\034\u6800\u048B\u6800\u048B"+
+    "\u6800\u048B\000\034\u6800\u080B\000\u7004\u6800\030\u4000\007\u6800\030\u6800"+
+    "\033\u6800\u7004\000\u7004\000\u7002\u6800\u7004\000\033\000\033\006\u7001"+
+    "\005\u7002\u7800\000\000\023\000\023\000\022\000\022\000\u7005\000\u7705\000"+
+    "\u7005\000\u76E5\000\u7545\000\u7005\000\u75C5\000\u7005\000\u7005\000\u76A5"+
+    "\000\u7005\000\u7665\000\u7005\000\u75A5\u7800\000\u07FD\u7002\u7800\000\u0800"+
+    "\u7005\u4000\u3006\u0800\u7005\u0800\u7005\u2000\031\u6800\025\u6800\026\u1000"+
+    "\u601A\u6800\034\u6800\030\u6800\025\u6800\026\u6800\030\u6800\024\u6800\u5017"+
+    "\u6800\u5017\u6800\025\u6800\026\u6800\025\u6800\u5017\u6800\u5017\u3800\030"+
+    "\u7800\000\u6800\030\u3800\030\u6800\024\uE800\025\uE800\026\u2800\030\u2000"+
+    "\031\u2000\024\u6800\030\u2800\u601A\u1000\u7005\u7800\000\u6800\031\u6800"+
+    "\033\u2800\u601A\u7800\000\u7800\000\u6800\u1010\u6800\u1010\u6800\u1010";
+
+  // In all, the character property tables require 18112 bytes.
+
+    static {
+            charMap = new char[][][] {
+        { {'\u00DF'}, {'\u0053', '\u0053', } },
+        { {'\u0130'}, {'\u0130', } },
+        { {'\u0149'}, {'\u02BC', '\u004E', } },
+        { {'\u01F0'}, {'\u004A', '\u030C', } },
+        { {'\u0390'}, {'\u0399', '\u0308', '\u0301', } },
+        { {'\u03B0'}, {'\u03A5', '\u0308', '\u0301', } },
+        { {'\u0587'}, {'\u0535', '\u0552', } },
+        { {'\u1E96'}, {'\u0048', '\u0331', } },
+        { {'\u1E97'}, {'\u0054', '\u0308', } },
+        { {'\u1E98'}, {'\u0057', '\u030A', } },
+        { {'\u1E99'}, {'\u0059', '\u030A', } },
+        { {'\u1E9A'}, {'\u0041', '\u02BE', } },
+        { {'\u1F50'}, {'\u03A5', '\u0313', } },
+        { {'\u1F52'}, {'\u03A5', '\u0313', '\u0300', } },
+        { {'\u1F54'}, {'\u03A5', '\u0313', '\u0301', } },
+        { {'\u1F56'}, {'\u03A5', '\u0313', '\u0342', } },
+        { {'\u1F80'}, {'\u1F08', '\u0399', } },
+        { {'\u1F81'}, {'\u1F09', '\u0399', } },
+        { {'\u1F82'}, {'\u1F0A', '\u0399', } },
+        { {'\u1F83'}, {'\u1F0B', '\u0399', } },
+        { {'\u1F84'}, {'\u1F0C', '\u0399', } },
+        { {'\u1F85'}, {'\u1F0D', '\u0399', } },
+        { {'\u1F86'}, {'\u1F0E', '\u0399', } },
+        { {'\u1F87'}, {'\u1F0F', '\u0399', } },
+        { {'\u1F88'}, {'\u1F08', '\u0399', } },
+        { {'\u1F89'}, {'\u1F09', '\u0399', } },
+        { {'\u1F8A'}, {'\u1F0A', '\u0399', } },
+        { {'\u1F8B'}, {'\u1F0B', '\u0399', } },
+        { {'\u1F8C'}, {'\u1F0C', '\u0399', } },
+        { {'\u1F8D'}, {'\u1F0D', '\u0399', } },
+        { {'\u1F8E'}, {'\u1F0E', '\u0399', } },
+        { {'\u1F8F'}, {'\u1F0F', '\u0399', } },
+        { {'\u1F90'}, {'\u1F28', '\u0399', } },
+        { {'\u1F91'}, {'\u1F29', '\u0399', } },
+        { {'\u1F92'}, {'\u1F2A', '\u0399', } },
+        { {'\u1F93'}, {'\u1F2B', '\u0399', } },
+        { {'\u1F94'}, {'\u1F2C', '\u0399', } },
+        { {'\u1F95'}, {'\u1F2D', '\u0399', } },
+        { {'\u1F96'}, {'\u1F2E', '\u0399', } },
+        { {'\u1F97'}, {'\u1F2F', '\u0399', } },
+        { {'\u1F98'}, {'\u1F28', '\u0399', } },
+        { {'\u1F99'}, {'\u1F29', '\u0399', } },
+        { {'\u1F9A'}, {'\u1F2A', '\u0399', } },
+        { {'\u1F9B'}, {'\u1F2B', '\u0399', } },
+        { {'\u1F9C'}, {'\u1F2C', '\u0399', } },
+        { {'\u1F9D'}, {'\u1F2D', '\u0399', } },
+        { {'\u1F9E'}, {'\u1F2E', '\u0399', } },
+        { {'\u1F9F'}, {'\u1F2F', '\u0399', } },
+        { {'\u1FA0'}, {'\u1F68', '\u0399', } },
+        { {'\u1FA1'}, {'\u1F69', '\u0399', } },
+        { {'\u1FA2'}, {'\u1F6A', '\u0399', } },
+        { {'\u1FA3'}, {'\u1F6B', '\u0399', } },
+        { {'\u1FA4'}, {'\u1F6C', '\u0399', } },
+        { {'\u1FA5'}, {'\u1F6D', '\u0399', } },
+        { {'\u1FA6'}, {'\u1F6E', '\u0399', } },
+        { {'\u1FA7'}, {'\u1F6F', '\u0399', } },
+        { {'\u1FA8'}, {'\u1F68', '\u0399', } },
+        { {'\u1FA9'}, {'\u1F69', '\u0399', } },
+        { {'\u1FAA'}, {'\u1F6A', '\u0399', } },
+        { {'\u1FAB'}, {'\u1F6B', '\u0399', } },
+        { {'\u1FAC'}, {'\u1F6C', '\u0399', } },
+        { {'\u1FAD'}, {'\u1F6D', '\u0399', } },
+        { {'\u1FAE'}, {'\u1F6E', '\u0399', } },
+        { {'\u1FAF'}, {'\u1F6F', '\u0399', } },
+        { {'\u1FB2'}, {'\u1FBA', '\u0399', } },
+        { {'\u1FB3'}, {'\u0391', '\u0399', } },
+        { {'\u1FB4'}, {'\u0386', '\u0399', } },
+        { {'\u1FB6'}, {'\u0391', '\u0342', } },
+        { {'\u1FB7'}, {'\u0391', '\u0342', '\u0399', } },
+        { {'\u1FBC'}, {'\u0391', '\u0399', } },
+        { {'\u1FC2'}, {'\u1FCA', '\u0399', } },
+        { {'\u1FC3'}, {'\u0397', '\u0399', } },
+        { {'\u1FC4'}, {'\u0389', '\u0399', } },
+        { {'\u1FC6'}, {'\u0397', '\u0342', } },
+        { {'\u1FC7'}, {'\u0397', '\u0342', '\u0399', } },
+        { {'\u1FCC'}, {'\u0397', '\u0399', } },
+        { {'\u1FD2'}, {'\u0399', '\u0308', '\u0300', } },
+        { {'\u1FD3'}, {'\u0399', '\u0308', '\u0301', } },
+        { {'\u1FD6'}, {'\u0399', '\u0342', } },
+        { {'\u1FD7'}, {'\u0399', '\u0308', '\u0342', } },
+        { {'\u1FE2'}, {'\u03A5', '\u0308', '\u0300', } },
+        { {'\u1FE3'}, {'\u03A5', '\u0308', '\u0301', } },
+        { {'\u1FE4'}, {'\u03A1', '\u0313', } },
+        { {'\u1FE6'}, {'\u03A5', '\u0342', } },
+        { {'\u1FE7'}, {'\u03A5', '\u0308', '\u0342', } },
+        { {'\u1FF2'}, {'\u1FFA', '\u0399', } },
+        { {'\u1FF3'}, {'\u03A9', '\u0399', } },
+        { {'\u1FF4'}, {'\u038F', '\u0399', } },
+        { {'\u1FF6'}, {'\u03A9', '\u0342', } },
+        { {'\u1FF7'}, {'\u03A9', '\u0342', '\u0399', } },
+        { {'\u1FFC'}, {'\u03A9', '\u0399', } },
+        { {'\uFB00'}, {'\u0046', '\u0046', } },
+        { {'\uFB01'}, {'\u0046', '\u0049', } },
+        { {'\uFB02'}, {'\u0046', '\u004C', } },
+        { {'\uFB03'}, {'\u0046', '\u0046', '\u0049', } },
+        { {'\uFB04'}, {'\u0046', '\u0046', '\u004C', } },
+        { {'\uFB05'}, {'\u0053', '\u0054', } },
+        { {'\uFB06'}, {'\u0053', '\u0054', } },
+        { {'\uFB13'}, {'\u0544', '\u0546', } },
+        { {'\uFB14'}, {'\u0544', '\u0535', } },
+        { {'\uFB15'}, {'\u0544', '\u053B', } },
+        { {'\uFB16'}, {'\u054E', '\u0546', } },
+        { {'\uFB17'}, {'\u0544', '\u053D', } },
+    };
+        { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
+            char[] data = A_DATA.toCharArray();
+            assert (data.length == (856 * 2));
+            int i = 0, j = 0;
+            while (i < (856 * 2)) {
+                int entry = data[i++] << 16;
+                A[j++] = entry | data[i++];
+            }
+        }
+
+    }        
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/tools/src/build/tools/charsetmapping/CharacterData01.java	Wed Mar 30 08:11:35 2011 +0000
@@ -0,0 +1,533 @@
+// This file was generated AUTOMATICALLY from a template file Tue Mar 29 05:26:54 GMT 2011
+/*
+ * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package build.tools.charsetmapping;
+
+/** The CharacterData class encapsulates the large tables once found in
+ *  java.lang.Character. 
+ */
+
+class CharacterData01 extends CharacterData {
+    /* The character properties are currently encoded into 32 bits in the following manner:
+        1 bit   mirrored property
+        4 bits  directionality property
+        9 bits  signed offset used for converting case
+        1 bit   if 1, adding the signed offset converts the character to lowercase
+        1 bit   if 1, subtracting the signed offset converts the character to uppercase
+        1 bit   if 1, this character has a titlecase equivalent (possibly itself)
+        3 bits  0  may not be part of an identifier
+                1  ignorable control; may continue a Unicode identifier or Java identifier
+                2  may continue a Java identifier but not a Unicode identifier (unused)
+                3  may continue a Unicode identifier or Java identifier
+                4  is a Java whitespace character
+                5  may start or continue a Java identifier;
+                   may continue but not start a Unicode identifier (underscores)
+                6  may start or continue a Java identifier but not a Unicode identifier ($)
+                7  may start or continue a Unicode identifier or Java identifier
+                Thus:
+                   5, 6, 7 may start a Java identifier
+                   1, 2, 3, 5, 6, 7 may continue a Java identifier
+                   7 may start a Unicode identifier
+                   1, 3, 5, 7 may continue a Unicode identifier
+                   1 is ignorable within an identifier
+                   4 is Java whitespace
+        2 bits  0  this character has no numeric property
+                1  adding the digit offset to the character code and then
+                   masking with 0x1F will produce the desired numeric value
+                2  this character has a "strange" numeric value
+                3  a Java supradecimal digit: adding the digit offset to the
+                   character code, then masking with 0x1F, then adding 10
+                   will produce the desired numeric value
+        5 bits  digit offset
+        5 bits  character type
+
+        The encoding of character properties is subject to change at any time.
+     */
+
+    int getProperties(int ch) {
+        char offset = (char)ch;
+        int props = A[Y[(X[offset>>5]<<4)|((offset>>1)&0xF)]|(offset&0x1)];
+        return props;
+    }
+
+    int getType(int ch) {
+        int props = getProperties(ch);
+        return (props & 0x1F);
+    }
+
+    boolean isJavaIdentifierStart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) >= 0x00005000);
+    }
+
+    boolean isJavaIdentifierPart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00003000) != 0);
+    }
+
+    boolean isUnicodeIdentifierStart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) == 0x00007000);
+    }
+
+    boolean isUnicodeIdentifierPart(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00001000) != 0);
+    }
+
+    boolean isIdentifierIgnorable(int ch) {
+        int props = getProperties(ch);
+        return ((props & 0x00007000) == 0x00001000);
+    }
+
+    int toLowerCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00020000) != 0) {
+            int offset = val << 5 >> (5+18);
+            mapChar = ch + offset;
+        }
+        return  mapChar;
+    }
+
+    int toUpperCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00010000) != 0) {
+            int offset = val  << 5 >> (5+18);
+            mapChar =  ch - offset;
+        }
+        return  mapChar;
+    }
+
+    int toTitleCase(int ch) {
+        int mapChar = ch;
+        int val = getProperties(ch);
+
+        if ((val & 0x00008000) != 0) {
+            // There is a titlecase equivalent.  Perform further checks:
+            if ((val & 0x00010000) == 0) {
+                // The character does not have an uppercase equivalent, so it must
+                // already be uppercase; so add 1 to get the titlecase form.
+                mapChar = ch + 1;
+            }
+            else if ((val & 0x00020000) == 0) {
+                // The character does not have a lowercase equivalent, so it must
+                // already be lowercase; so subtract 1 to get the titlecase form.
+                mapChar = ch - 1;
+            }
+            // else {
+            // The character has both an uppercase equivalent and a lowercase
+            // equivalent, so it must itself be a titlecase form; return it.
+            // return ch;
+            //}
+        }
+        else if ((val & 0x00010000) != 0) {
+            // This character has no titlecase equivalent but it does have an
+            // uppercase equivalent, so use that (subtract the signed case offset).
+            mapChar = toUpperCase(ch);
+        }
+        return  mapChar;
+    }