diff --git a/icu4j/src/com/ibm/text/CharSet.java b/icu4j/src/com/ibm/text/CharSet.java deleted file mode 100755 index 047da03571..0000000000 --- a/icu4j/src/com/ibm/text/CharSet.java +++ /dev/null @@ -1,975 +0,0 @@ -/* - ******************************************************************************* - * Copyright (C) 1996-2000, International Business Machines Corporation and * - * others. All Rights Reserved. * - ******************************************************************************* - * - * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/text/Attic/CharSet.java,v $ - * $Date: 2000/03/10 04:07:18 $ - * $Revision: 1.2 $ - * - ***************************************************************************************** - */ -package com.ibm.text; - -import java.util.Hashtable; - -/** - * An object representing a set of characters. (This is a "set" in the - * mathematical sense: an unduplicated list of characters on which set - * operations such as union and intersection can be performed.) The - * set information is stored in compressed, optimized form: The object - * contains a String with an even number of characters. Each pair of - * characters represents a range of characters contained in the set - * (a pair of the same character represents a single character). The - * characters are sorted in increasing order. - */ -public class CharSet implements Cloneable { - /** - * The structure containing the set information. The characters - * in this string are organized into pairs, each pair representing - * a range of characters contained in the set - */ - private String chars; - - //========================================================================== - // parseString() and associated routines - //========================================================================== - /** - * A cache which is used to speed up parseString() whenever it is - * used to parse a description that has been parsed before - */ - private static Hashtable expressionCache = null; - - /** - * Builds a CharSet based on a textual description. For the syntax of - * the description, see the documentation of RuleBasedBreakIterator. - * @see com.ibm.text.RuleBasedBreakIterator - */ - public static CharSet parseString(String s) { - CharSet result = null; - - // if "s" is in the expression cache, pull the result out - // of the expresison cache - if (expressionCache != null) { - result = (CharSet)expressionCache.get(s); - } - - // otherwise, use doParseString() to actually parse the string, - // and then add a corresponding entry to the expression cache - if (result == null) { - result = doParseString(s); - if (expressionCache == null) { - expressionCache = new Hashtable(); - } - expressionCache.put(s, result); - } - result = (CharSet)(result.clone()); - return result; - } - - /** - * This function is used by parseString() to actually parse the string - */ - private static CharSet doParseString(String s) { - CharSet result = new CharSet(); - int p = 0; - - boolean haveDash = false; - boolean haveTilde = false; - boolean wIsReal = false; - char w = '\u0000'; - - // for each character in the description... - while (p < s.length()) { - char c = s.charAt(p); - - // if it's an opening bracket... - if (c == '[') { - // flush the single-character cache - if (wIsReal) { - result.internalUnion(new CharSet(w)); - } - - // locate the matching closing bracket - int bracketLevel = 1; - int q = p + 1; - while (bracketLevel != 0) { - if (s.charAt(q) == '[') { - ++bracketLevel; - } - else if (s.charAt(q) == ']') { - --bracketLevel; - } - ++q; - } - --q; - - // call parseString() recursively to parse the text inside - // the brackets, then either add or subtract the result from - // our running result depending on whether or not the [] - // expresison was preceded by a ^ - if (!haveTilde) { - result.internalUnion(CharSet.parseString(s.substring(p + 1, q))); - } - else { - result.internalDifference(CharSet.parseString(s.substring(p + 1, q))); - } - haveTilde = false; - haveDash = false; - wIsReal = false; - p = q + 1; - } - - // if the character is a colon... - else if (c == ':') { - // flush the single-character cache - if (wIsReal) { - result.internalUnion(new CharSet(w)); - } - - // locate the matching colon (and throw an error if there - // isn't one) - int q = s.indexOf(':', p + 1); - if (q == -1) { - throw new IllegalArgumentException("Parse error at position " + p + " in " + s); - } - - // use charSetForCategory() to parse the text in the colons, - // and either add or substract the result from our running - // result depending on whether the :: expression was - // preceded by a ^ - if (!haveTilde) { - result.internalUnion(charSetForCategory(s.substring(p + 1, q))); - } - else { - result.internalDifference(charSetForCategory(s.substring(p + 1, q))); - } - - // reset everything and advance to the next character - haveTilde = false; - haveDash = false; - wIsReal = false; - p = q + 1; - } - - // if the character is a dash, set an appropriate flag - else if (c == '-') { - if (wIsReal) { - haveDash = true; - } - ++p; - } - - // if the character is a caret, flush the single-character - // cache and set an appropriate flag. If the set is empty - // (i.e., if the expression begins with ^), invert the set - // (i.e., set it to include everything). The idea here is - // that a set that includes nothing but ^ expressions - // means "everything but these things". - else if (c == '^') { - if (wIsReal) { - result.internalUnion(new CharSet(w)); - wIsReal = false; - } - haveTilde = true; - ++p; - if (result.empty()) { - result.internalComplement(); - } - } - - // throw an exception on an illegal character - else if (c >= ' ' && c < '\u007f' && !Character.isLetter(c) - && !Character.isDigit(c) && c != '\\') { - throw new IllegalArgumentException("Parse error at position " + p + " in " + s); - } - - // otherwise, we end up here... - else { - // on a backslash, advance to the next character - if (c == '\\') { - ++p; - } - - // if the preceding character was a dash, this character - // defines the end of a range. Add or subtract that range - // from the running result depending on whether or not it - // was preceded by a ^ - if (haveDash) { - if (s.charAt(p) < w) { - throw new IllegalArgumentException("U+" + Integer.toHexString(s.charAt(p)) - + " is less than U+" + Integer.toHexString(w) + ". Dash expressions " - + "can't have their endpoints in reverse order."); - } - - if (!haveTilde) { - result.internalUnion(new CharSet(w, s.charAt(p++))); - } - else { - result.internalDifference(new CharSet(w, s.charAt(p++))); - } - haveDash = false; - haveTilde = false; - wIsReal = false; - } - - // if the preceding character was a caret, remove this character - // from the running result - else if (haveTilde) { - result.internalDifference(new CharSet(s.charAt(p++))); - haveTilde = false; - wIsReal = false; - } - - // otherwise, flush the single-character cache and then - // put this character into the cache - else if (wIsReal) { - result.internalUnion(new CharSet(w)); - w = s.charAt(p++); - wIsReal = true; - } - else { - w = s.charAt(p++); - wIsReal = true; - } - } - } - - // finally, flush the single-character cache one last time - if (wIsReal) { - result.internalUnion(new CharSet(w)); - } - - return result; - } - - /** - * Creates a CharSet containing all the characters in a particular - * Unicode category. The text is either a two-character code from - * the Unicode database or a single character that begins one or more - * two-character codes. - */ - private static CharSet charSetForCategory(String category) { - // throw an exception if we have anything other than one or two - // characters inside the colons - if (category.length() == 0 || category.length() >= 3) { - throw new IllegalArgumentException("Invalid character category: " + category); - } - - // if we have two characters, search the category map for that code - // and either construct and return a CharSet from the data in the - // category map or throw an exception - if (category.length() == 2) { - for (int i = 0; i < categoryMap.length; i++) { - if (categoryMap[i][0].equals(category)) { - return new CharSet(categoryMap[i][1]); - } - } - throw new IllegalArgumentException("Invalid character category: " + category); - } - - // if we have one character, search the category map for codes beginning - // with that letter, and union together all of the matching sets that - // we find (or throw an exception if there are no matches) - else if (category.length() == 1) { - CharSet result = new CharSet(); - for (int i = 0; i < categoryMap.length; i++) { - if (categoryMap[i][0].startsWith(category)) { - result = result.union(new CharSet(categoryMap[i][1])); - } - } - if (result.empty()) { - throw new IllegalArgumentException("Invalid character category: " + category); - } - else { - return result; - } - } - return new CharSet(); // should never get here, but to make the compiler happy... - } - - /** - * Returns a copy of CharSet's expression cache and sets CharSet's - * expression cache to empty. - */ - public static Hashtable releaseExpressionCache() { - Hashtable result = expressionCache; - expressionCache = null; - return result; - } - - //========================================================================== - // CharSet manipulation - //========================================================================== - /** - * Creates an empty CharSet. - */ - public CharSet() { - chars = ""; - } - - /** - * Creates a CharSet containing a single character. - * @param c The character to put into the CharSet - */ - public CharSet(char c) { - StringBuffer temp = new StringBuffer(); - temp.append(c); - temp.append(c); - chars = temp.toString(); - } - - /** - * Creates a CharSet containing a range of characters. - * @param lo The lowest-numbered character to include in the range - * @param hi The highest-numbered character to include in the range - */ - public CharSet(char lo, char hi) { - StringBuffer temp = new StringBuffer(); - if (lo <= hi) { - temp.append(lo); - temp.append(hi); - } - else { - temp.append(hi); - temp.append(lo); - } - chars = temp.toString(); - } - - /** - * Creates a CharSet, initializing it from the internal storage - * of another CharSet (this function performs no error checking - * on "chars", so if it's malformed, undefined behavior will result) - */ - private CharSet(String chars) { - this.chars = chars; - } - - /** - * Returns a CharSet representing the union of two CharSets. - */ - public CharSet union(CharSet that) { - return new CharSet(doUnion(that.chars).toString()); - } - - /** - * Adds the characters in "that" to this CharSet - */ - private void internalUnion(CharSet that) { - chars = doUnion(that.chars).toString(); - } - - /** - * The actual implementation of the union functions - */ - private StringBuffer doUnion(String c2) { - StringBuffer result = new StringBuffer(); - - int i = 0; - int j = 0; - - // consider all the characters in both strings - while (i < chars.length() && j < c2.length()) { - char ub; - - // the first character in the result is the lower of the - // starting characters of the two strings, and "ub" gets - // set to the upper bound of that range - if (chars.charAt(i) < c2.charAt(j)) { - result.append(chars.charAt(i)); - ub = chars.charAt(++i); - } - else { - result.append(c2.charAt(j)); - ub = c2.charAt(++j); - } - - // for as long as one of our two pointers is pointing to a range's - // end point, or i is pointing to a character that is less than - // "ub" plus one (the "plus one" stitches touching ranges together)... - while (i % 2 == 1 || - j % 2 == 1 || - (i < chars.length() && chars.charAt(i) <= ub + 1)) { - - // advance i to the first character that is greater than - // "ub" plus one - while (i < chars.length() && chars.charAt(i) <= ub + 1) { - ++i; - } - - // if i points to the endpoint of a range, update "ub" - // to that character, or if i points to the start of - // a range and the endpoint of the preceding range is - // greater than "ub", update "up" to _that_ character - if (i % 2 == 1) { - ub = chars.charAt(i); - } - else if (i > 0 && chars.charAt(i - 1) > ub) { - ub = chars.charAt(i - 1); - } - - // now advance j to the first character that is greater - // that "ub" plus one - while (j < c2.length() && c2.charAt(j) <= ub + 1) { - ++j; - } - - // if j points to the endpoint of a range, update "ub" - // to that character, or if j points to the start of - // a range and the endpoint of the preceding range is - // greater than "ub", update "up" to _that_ character - if (j % 2 == 1) { - ub = c2.charAt(j); - } - else if (j > 0 && c2.charAt(j - 1) > ub) { - ub = c2.charAt(j - 1); - } - } - // when we finally fall out of this loop, we will have stitched - // together a series of ranges that overlap or touch, i and j - // will both point to starting points of ranges, and "ub" will - // be the endpoint of the range we're working on. Write "ub" - // to the result - result.append(ub); - - // loop back around to create the next range in the result - } - - // we fall out to here when we've exhausted all the characters in - // one of the operands. We can append all of the remaining characters - // in the other operand without doing any extra work. - if (i < chars.length()) { - result.append(chars.substring(i)); - } - if (j < c2.length()) { - result.append(c2.substring(j)); - } - - return result; - } - - /** - * Returns the intersection of two CharSets. - */ - public CharSet intersection(CharSet that) { - return new CharSet(doIntersection(that.chars).toString()); - } - - /** - * Removes from this CharSet any characters that aren't also in "that" - */ - private void internalIntersection(CharSet that) { - chars = doIntersection(that.chars).toString(); - } - - /** - * The internal implementation of the two intersection functions - */ - private StringBuffer doIntersection(String c2) { - StringBuffer result = new StringBuffer(); - - int i = 0; - int j = 0; - int oldI; - int oldJ; - - // iterate until we've exhausted one of the operands - while (i < chars.length() && j < c2.length()) { - - // advance j until it points to a character that is larger than - // the one i points to. If this is the beginning of a one- - // character range, advance j to point to the end - if (i < chars.length() && i % 2 == 0) { - while (j < c2.length() && c2.charAt(j) < chars.charAt(i)) { - ++j; - } - if (j < c2.length() && j % 2 == 0 && c2.charAt(j) == chars.charAt(i)) { - ++j; - } - } - - // if j points to the endpoint of a range, save the current - // value of i, then advance i until it reaches a character - // which is larger than the character pointed at - // by j. All of the characters we've advanced over (except - // the one currently pointed to by i) are added to the result - oldI = i; - while (j % 2 == 1 && i < chars.length() && chars.charAt(i) <= c2.charAt(j)) { - ++i; - } - result.append(chars.substring(oldI, i)); - - // if i points to the endpoint of a range, save the current - // value of j, then advance j until it reaches a character - // which is larger than the character pointed at - // by i. All of the characters we've advanced over (except - // the one currently pointed to by i) are added to the result - oldJ = j; - while (i % 2 == 1 && j < c2.length() && c2.charAt(j) <= chars.charAt(i)) { - ++j; - } - result.append(c2.substring(oldJ, j)); - - // advance i until it points to a character larger than j - // If it points at the beginning of a one-character range, - // advance it to the end of that range - if (j < c2.length() && j % 2 == 0) { - while (i < chars.length() && chars.charAt(i) < c2.charAt(j)) { - ++i; - } - if (i < chars.length() && i % 2 == 0 && c2.charAt(j) == chars.charAt(i)) { - ++i; - } - } - } - - return result; - } - - /** - * Returns a CharSet containing all the characters in "this" that - * aren't also in "that" - */ - public CharSet difference(CharSet that) { - return new CharSet(doIntersection(that.doComplement().toString()).toString()); - } - - /** - * Removes from "this" all the characters that are also in "that" - */ - private void internalDifference(CharSet that) { - chars = doIntersection(that.doComplement().toString()).toString(); - } - - /** - * Returns a CharSet containing all the characters which are not - * in "this" - */ - public CharSet complement() { - return new CharSet(doComplement().toString()); - } - - /** - * Complements "this". All the characters it contains are removed, - * and all the characters it doesn't contain are added. - */ - private void internalComplement() { - chars = doComplement().toString(); - } - - /** - * The internal implementation function for the complement routines - */ - private StringBuffer doComplement() { - // the complement of an empty CharSet is one containing everything - if (empty()) { - return new StringBuffer("\u0000\uffff"); - } - - StringBuffer result = new StringBuffer(); - - int i = 0; - - // the result begins with \u0000 unless the original CharSet does - if (chars.charAt(0) != '\u0000') { - result.append('\u0000'); - } - - // walk through the characters in this CharSet. Append a pair of - // characters the first of which is one less than the first - // character we see and the second of which is one plus the second - // character we see (don't write the first character if it's \u0000, - // and don't write the second character if it's \uffff. - while (i < chars.length()) { - if (chars.charAt(i) != '\u0000') { - result.append((char)(chars.charAt(i) - 1)); - } - if (chars.charAt(i + 1) != '\uffff') { - result.append((char)(chars.charAt(i + 1) + 1)); - } - i += 2; - } - - // add \uffff to the end of the result, unless it was in - // the original set - if (chars.charAt(chars.length() - 1) != '\uffff') { - result.append('\uffff'); - } - - return result; - } - - /** - * Returns true if this CharSet contains the specified character - * @param c The character we're testing for set membership - */ - public boolean contains(char c) { - // search for the first range endpoint that is greater than or - // equal to c - int i = 1; - while (i < chars.length() && chars.charAt(i) < c) { - i += 2; - } - - // if we've walked off the end, we don't contain c - if (i == chars.length()) { - return false; - } - - // otherwise, we contain c if the beginning of the range is less - // than or equal to c - return chars.charAt(i - 1) <= c; - } - - /** - * Returns true if "that" is another instance of CharSet containing - * the exact same characters as this one - */ - public boolean equals(Object that) { - return (that instanceof CharSet) && chars.equals(((CharSet)that).chars); - } - - /** - * Creates a new CharSet that is equal to this one - */ - public Object clone() { - return new CharSet(chars); - } - - /** - * Returns true if this CharSet contains no characters - */ - public boolean empty() { - return chars.length() == 0; - } - - /** - * Returns a textual representation of this CharSet. If the result - * of calling this function is passed to CharSet.parseString(), it - * will produce another CharSet that is equal to this one. - */ - public String toString() { - StringBuffer result = new StringBuffer(); - - // the result begins with an opening bracket - result.append('['); - - // iterate through the ranges in the CharSet - for (int i = 0; i < chars.length(); i += 2) { - // for a range with the same beginning and ending point, - // output that character - if (chars.charAt(i) == chars.charAt(i + 1)) { - result.append(chars.charAt(i)); - } - - // otherwise, output the start and end points of the range - // separated by a dash - else { - result.append(chars.charAt(i) + "-" + chars.charAt(i + 1)); - } - } - - // the result ends with a closing bracket - result.append(']'); - return result.toString(); - } - - /** - * Returns a String representing the contents of this CharSet - * in the same form in which they're stored internally: as pairs - * of characters representing the start and end points of ranges - */ - public String getRanges() { - return chars; - } - - /** - * Returns an Enumeration that will return the ranges of characters - * contained in this CharSet one at a time - */ - public Enumeration getChars() { - return new Enumeration(this); - } - - //========================================================================== - // CharSet.Enumeration - //========================================================================== - - /** - * An Enumeration that can be used to extract the character ranges - * from a CharSet one at a time - */ - public class Enumeration implements java.util.Enumeration { - /** - * Initializes a CharSet.Enumeration - */ - Enumeration(CharSet cs) { - this.chars = cs.chars; - p = 0; - } - - /** - * Returns true if the enumeration hasn't yet returned - * all the ranges in the CharSet - */ - public boolean hasMoreElements() { - return p < chars.length(); - } - - /** - * Returns the next range in the CarSet - */ - public Object nextElement() { - char[] result = new char[2]; - result[0] = chars.charAt(p); - result[1] = chars.charAt(p + 1); - p += 2; - - return result; - } - - int p; - String chars; - } - - //========================================================================== - // tables for charSetForCategory() - //========================================================================== - - /** - * Table used with charSetFromCategory. This is an array of pairs - * of Strings. The first column of Strings is Unicode character category - * codes as defined in the Unicode database. The second column is the - * internal storage for a CharSet containing the characters in that - * category. - */ - private static final String[][] categoryMap = { - { "Ll", "az\u00AA\u00AA\u00B5\u00B5\u00BA\u00BA\u00DF\u00F6\u00F8\u00FF\u0101\u0101" - + "\u0103\u0103\u0105\u0105\u0107\u0107\u0109\u0109\u010B\u010B\u010D\u010D" - + "\u010F\u010F\u0111\u0111\u0113\u0113\u0115\u0115\u0117\u0117\u0119\u0119" - + "\u011B\u011B\u011D\u011D\u011F\u011F\u0121\u0121\u0123\u0123\u0125\u0125" - + "\u0127\u0127\u0129\u0129\u012B\u012B\u012D\u012D\u012F\u012F\u0131\u0131" - + "\u0133\u0133\u0135\u0135\u0137\u0138\u013A\u013A\u013C\u013C\u013E\u013E" - + "\u0140\u0140\u0142\u0142\u0144\u0144\u0146\u0146\u0148\u0149\u014B\u014B" - + "\u014D\u014D\u014F\u014F\u0151\u0151\u0153\u0153\u0155\u0155\u0157\u0157" - + "\u0159\u0159\u015B\u015B\u015D\u015D\u015F\u015F\u0161\u0161\u0163\u0163" - + "\u0165\u0165\u0167\u0167\u0169\u0169\u016B\u016B\u016D\u016D\u016F\u016F" - + "\u0171\u0171\u0173\u0173\u0175\u0175\u0177\u0177\u017A\u017A\u017C\u017C" - + "\u017E\u0180\u0183\u0183\u0185\u0185\u0188\u0188\u018C\u018D\u0192\u0192" - + "\u0195\u0195\u0199\u019B\u019E\u019E\u01A1\u01A1\u01A3\u01A3\u01A5\u01A5" - + "\u01A8\u01A8\u01AB\u01AB\u01AD\u01AD\u01B0\u01B0\u01B4\u01B4\u01B6\u01B6" - + "\u01B9\u01BA\u01BD\u01BD\u01C6\u01C6\u01C9\u01C9\u01CC\u01CC\u01CE\u01CE" - + "\u01D0\u01D0\u01D2\u01D2\u01D4\u01D4\u01D6\u01D6\u01D8\u01D8\u01DA\u01DA" - + "\u01DC\u01DD\u01DF\u01DF\u01E1\u01E1\u01E3\u01E3\u01E5\u01E5\u01E7\u01E7" - + "\u01E9\u01E9\u01EB\u01EB\u01ED\u01ED\u01EF\u01F0\u01F3\u01F3\u01F5\u01F5" - + "\u01FB\u01FB\u01FD\u01FD\u01FF\u01FF\u0201\u0201\u0203\u0203\u0205\u0205" - + "\u0207\u0207\u0209\u0209\u020B\u020B\u020D\u020D\u020F\u020F\u0211\u0211" - + "\u0213\u0213\u0215\u0215\u0217\u0217\u0250\u02A8\u0390\u0390\u03AC\u03CE" - + "\u03D0\u03D1\u03D5\u03D6\u03E3\u03E3\u03E5\u03E5\u03E7\u03E7\u03E9\u03E9" - + "\u03EB\u03EB\u03ED\u03ED\u03EF\u03F2\u0430\u044F\u0451\u045C\u045E\u045F" - + "\u0461\u0461\u0463\u0463\u0465\u0465\u0467\u0467\u0469\u0469\u046B\u046B" - + "\u046D\u046D\u046F\u046F\u0471\u0471\u0473\u0473\u0475\u0475\u0477\u0477" - + "\u0479\u0479\u047B\u047B\u047D\u047D\u047F\u047F\u0481\u0481\u0491\u0491" - + "\u0493\u0493\u0495\u0495\u0497\u0497\u0499\u0499\u049B\u049B\u049D\u049D" - + "\u049F\u049F\u04A1\u04A1\u04A3\u04A3\u04A5\u04A5\u04A7\u04A7\u04A9\u04A9" - + "\u04AB\u04AB\u04AD\u04AD\u04AF\u04AF\u04B1\u04B1\u04B3\u04B3\u04B5\u04B5" - + "\u04B7\u04B7\u04B9\u04B9\u04BB\u04BB\u04BD\u04BD\u04BF\u04BF\u04C2\u04C2" - + "\u04C4\u04C4\u04C8\u04C8\u04CC\u04CC\u04D1\u04D1\u04D3\u04D3\u04D5\u04D5" - + "\u04D7\u04D7\u04D9\u04D9\u04DB\u04DB\u04DD\u04DD\u04DF\u04DF\u04E1\u04E1" - + "\u04E3\u04E3\u04E5\u04E5\u04E7\u04E7\u04E9\u04E9\u04EB\u04EB\u04EF\u04EF" - + "\u04F1\u04F1\u04F3\u04F3\u04F5\u04F5\u04F9\u04F9\u0561\u0587\u10D0\u10F6" - + "\u1E01\u1E01\u1E03\u1E03\u1E05\u1E05\u1E07\u1E07\u1E09\u1E09\u1E0B\u1E0B" - + "\u1E0D\u1E0D\u1E0F\u1E0F\u1E11\u1E11\u1E13\u1E13\u1E15\u1E15\u1E17\u1E17" - + "\u1E19\u1E19\u1E1B\u1E1B\u1E1D\u1E1D\u1E1F\u1E1F\u1E21\u1E21\u1E23\u1E23" - + "\u1E25\u1E25\u1E27\u1E27\u1E29\u1E29\u1E2B\u1E2B\u1E2D\u1E2D\u1E2F\u1E2F" - + "\u1E31\u1E31\u1E33\u1E33\u1E35\u1E35\u1E37\u1E37\u1E39\u1E39\u1E3B\u1E3B" - + "\u1E3D\u1E3D\u1E3F\u1E3F\u1E41\u1E41\u1E43\u1E43\u1E45\u1E45\u1E47\u1E47" - + "\u1E49\u1E49\u1E4B\u1E4B\u1E4D\u1E4D\u1E4F\u1E4F\u1E51\u1E51\u1E53\u1E53" - + "\u1E55\u1E55\u1E57\u1E57\u1E59\u1E59\u1E5B\u1E5B\u1E5D\u1E5D\u1E5F\u1E5F" - + "\u1E61\u1E61\u1E63\u1E63\u1E65\u1E65\u1E67\u1E67\u1E69\u1E69\u1E6B\u1E6B" - + "\u1E6D\u1E6D\u1E6F\u1E6F\u1E71\u1E71\u1E73\u1E73\u1E75\u1E75\u1E77\u1E77" - + "\u1E79\u1E79\u1E7B\u1E7B\u1E7D\u1E7D\u1E7F\u1E7F\u1E81\u1E81\u1E83\u1E83" - + "\u1E85\u1E85\u1E87\u1E87\u1E89\u1E89\u1E8B\u1E8B\u1E8D\u1E8D\u1E8F\u1E8F" - + "\u1E91\u1E91\u1E93\u1E93\u1E95\u1E9B\u1EA1\u1EA1\u1EA3\u1EA3\u1EA5\u1EA5" - + "\u1EA7\u1EA7\u1EA9\u1EA9\u1EAB\u1EAB\u1EAD\u1EAD\u1EAF\u1EAF\u1EB1\u1EB1" - + "\u1EB3\u1EB3\u1EB5\u1EB5\u1EB7\u1EB7\u1EB9\u1EB9\u1EBB\u1EBB\u1EBD\u1EBD" - + "\u1EBF\u1EBF\u1EC1\u1EC1\u1EC3\u1EC3\u1EC5\u1EC5\u1EC7\u1EC7\u1EC9\u1EC9" - + "\u1ECB\u1ECB\u1ECD\u1ECD\u1ECF\u1ECF\u1ED1\u1ED1\u1ED3\u1ED3\u1ED5\u1ED5" - + "\u1ED7\u1ED7\u1ED9\u1ED9\u1EDB\u1EDB\u1EDD\u1EDD\u1EDF\u1EDF\u1EE1\u1EE1" - + "\u1EE3\u1EE3\u1EE5\u1EE5\u1EE7\u1EE7\u1EE9\u1EE9\u1EEB\u1EEB\u1EED\u1EED" - + "\u1EEF\u1EEF\u1EF1\u1EF1\u1EF3\u1EF3\u1EF5\u1EF5\u1EF7\u1EF7\u1EF9\u1EF9" - + "\u1F00\u1F07\u1F10\u1F15\u1F20\u1F27\u1F30\u1F37\u1F40\u1F45\u1F50\u1F57" - + "\u1F60\u1F67\u1F70\u1F7D\u1F80\u1F87\u1F90\u1F97\u1FA0\u1FA7\u1FB0\u1FB4" - + "\u1FB6\u1FB7\u1FC2\u1FC4\u1FC6\u1FC7\u1FD0\u1FD3\u1FD6\u1FD7\u1FE0\u1FE7" - + "\u1FF2\u1FF4\u1FF6\u1FF7\u207F\u207F\u210A\u210A\u210E\u210F\u2113\u2113" - + "\u212E\u212F\u2134\u2134\uFB00\uFB06\uFB13\uFB17\uFF41\uFF5A" }, - { "Lu", "AZ\u00C0\u00D6\u00D8\u00DE\u0100\u0100\u0102\u0102\u0104\u0104\u0106\u0106" - + "\u0108\u0108\u010A\u010A\u010C\u010C\u010E\u010E\u0110\u0110\u0112\u0112" - + "\u0114\u0114\u0116\u0116\u0118\u0118\u011A\u011A\u011C\u011C\u011E\u011E" - + "\u0120\u0120\u0122\u0122\u0124\u0124\u0126\u0126\u0128\u0128\u012A\u012A" - + "\u012C\u012C\u012E\u012E\u0130\u0130\u0132\u0132\u0134\u0134\u0136\u0136" - + "\u0139\u0139\u013B\u013B\u013D\u013D\u013F\u013F\u0141\u0141\u0143\u0143" - + "\u0145\u0145\u0147\u0147\u014A\u014A\u014C\u014C\u014E\u014E\u0150\u0150" - + "\u0152\u0152\u0154\u0154\u0156\u0156\u0158\u0158\u015A\u015A\u015C\u015C" - + "\u015E\u015E\u0160\u0160\u0162\u0162\u0164\u0164\u0166\u0166\u0168\u0168" - + "\u016A\u016A\u016C\u016C\u016E\u016E\u0170\u0170\u0172\u0172\u0174\u0174" - + "\u0176\u0176\u0178\u0179\u017B\u017B\u017D\u017D\u0181\u0182\u0184\u0184" - + "\u0186\u0187\u0189\u018B\u018E\u0191\u0193\u0194\u0196\u0198\u019C\u019D" - + "\u019F\u01A0\u01A2\u01A2\u01A4\u01A4\u01A6\u01A7\u01A9\u01A9\u01AC\u01AC" - + "\u01AE\u01AF\u01B1\u01B3\u01B5\u01B5\u01B7\u01B8\u01BC\u01BC\u01C4\u01C4" - + "\u01C7\u01C7\u01CA\u01CA\u01CD\u01CD\u01CF\u01CF\u01D1\u01D1\u01D3\u01D3" - + "\u01D5\u01D5\u01D7\u01D7\u01D9\u01D9\u01DB\u01DB\u01DE\u01DE\u01E0\u01E0" - + "\u01E2\u01E2\u01E4\u01E4\u01E6\u01E6\u01E8\u01E8\u01EA\u01EA\u01EC\u01EC" - + "\u01EE\u01EE\u01F1\u01F1\u01F4\u01F4\u01FA\u01FA\u01FC\u01FC\u01FE\u01FE" - + "\u0200\u0200\u0202\u0202\u0204\u0204\u0206\u0206\u0208\u0208\u020A\u020A" - + "\u020C\u020C\u020E\u020E\u0210\u0210\u0212\u0212\u0214\u0214\u0216\u0216" - + "\u0386\u0386\u0388\u038A\u038C\u038C\u038E\u038F\u0391\u03A1\u03A3\u03AB" - + "\u03D2\u03D4\u03DA\u03DA\u03DC\u03DC\u03DE\u03DE\u03E0\u03E0\u03E2\u03E2" - + "\u03E4\u03E4\u03E6\u03E6\u03E8\u03E8\u03EA\u03EA\u03EC\u03EC\u03EE\u03EE" - + "\u0401\u040C\u040E\u042F\u0460\u0460\u0462\u0462\u0464\u0464\u0466\u0466" - + "\u0468\u0468\u046A\u046A\u046C\u046C\u046E\u046E\u0470\u0470\u0472\u0472" - + "\u0474\u0474\u0476\u0476\u0478\u0478\u047A\u047A\u047C\u047C\u047E\u047E" - + "\u0480\u0480\u0490\u0490\u0492\u0492\u0494\u0494\u0496\u0496\u0498\u0498" - + "\u049A\u049A\u049C\u049C\u049E\u049E\u04A0\u04A0\u04A2\u04A2\u04A4\u04A4" - + "\u04A6\u04A6\u04A8\u04A8\u04AA\u04AA\u04AC\u04AC\u04AE\u04AE\u04B0\u04B0" - + "\u04B2\u04B2\u04B4\u04B4\u04B6\u04B6\u04B8\u04B8\u04BA\u04BA\u04BC\u04BC" - + "\u04BE\u04BE\u04C1\u04C1\u04C3\u04C3\u04C7\u04C7\u04CB\u04CB\u04D0\u04D0" - + "\u04D2\u04D2\u04D4\u04D4\u04D6\u04D6\u04D8\u04D8\u04DA\u04DA\u04DC\u04DC" - + "\u04DE\u04DE\u04E0\u04E0\u04E2\u04E2\u04E4\u04E4\u04E6\u04E6\u04E8\u04E8" - + "\u04EA\u04EA\u04EE\u04EE\u04F0\u04F0\u04F2\u04F2\u04F4\u04F4\u04F8\u04F8" - + "\u0531\u0556\u10A0\u10C5\u1E00\u1E00\u1E02\u1E02\u1E04\u1E04\u1E06\u1E06" - + "\u1E08\u1E08\u1E0A\u1E0A\u1E0C\u1E0C\u1E0E\u1E0E\u1E10\u1E10\u1E12\u1E12" - + "\u1E14\u1E14\u1E16\u1E16\u1E18\u1E18\u1E1A\u1E1A\u1E1C\u1E1C\u1E1E\u1E1E" - + "\u1E20\u1E20\u1E22\u1E22\u1E24\u1E24\u1E26\u1E26\u1E28\u1E28\u1E2A\u1E2A" - + "\u1E2C\u1E2C\u1E2E\u1E2E\u1E30\u1E30\u1E32\u1E32\u1E34\u1E34\u1E36\u1E36" - + "\u1E38\u1E38\u1E3A\u1E3A\u1E3C\u1E3C\u1E3E\u1E3E\u1E40\u1E40\u1E42\u1E42" - + "\u1E44\u1E44\u1E46\u1E46\u1E48\u1E48\u1E4A\u1E4A\u1E4C\u1E4C\u1E4E\u1E4E" - + "\u1E50\u1E50\u1E52\u1E52\u1E54\u1E54\u1E56\u1E56\u1E58\u1E58\u1E5A\u1E5A" - + "\u1E5C\u1E5C\u1E5E\u1E5E\u1E60\u1E60\u1E62\u1E62\u1E64\u1E64\u1E66\u1E66" - + "\u1E68\u1E68\u1E6A\u1E6A\u1E6C\u1E6C\u1E6E\u1E6E\u1E70\u1E70\u1E72\u1E72" - + "\u1E74\u1E74\u1E76\u1E76\u1E78\u1E78\u1E7A\u1E7A\u1E7C\u1E7C\u1E7E\u1E7E" - + "\u1E80\u1E80\u1E82\u1E82\u1E84\u1E84\u1E86\u1E86\u1E88\u1E88\u1E8A\u1E8A" - + "\u1E8C\u1E8C\u1E8E\u1E8E\u1E90\u1E90\u1E92\u1E92\u1E94\u1E94\u1EA0\u1EA0" - + "\u1EA2\u1EA2\u1EA4\u1EA4\u1EA6\u1EA6\u1EA8\u1EA8\u1EAA\u1EAA\u1EAC\u1EAC" - + "\u1EAE\u1EAE\u1EB0\u1EB0\u1EB2\u1EB2\u1EB4\u1EB4\u1EB6\u1EB6\u1EB8\u1EB8" - + "\u1EBA\u1EBA\u1EBC\u1EBC\u1EBE\u1EBE\u1EC0\u1EC0\u1EC2\u1EC2\u1EC4\u1EC4" - + "\u1EC6\u1EC6\u1EC8\u1EC8\u1ECA\u1ECA\u1ECC\u1ECC\u1ECE\u1ECE\u1ED0\u1ED0" - + "\u1ED2\u1ED2\u1ED4\u1ED4\u1ED6\u1ED6\u1ED8\u1ED8\u1EDA\u1EDA\u1EDC\u1EDC" - + "\u1EDE\u1EDE\u1EE0\u1EE0\u1EE2\u1EE2\u1EE4\u1EE4\u1EE6\u1EE6\u1EE8\u1EE8" - + "\u1EEA\u1EEA\u1EEC\u1EEC\u1EEE\u1EEE\u1EF0\u1EF0\u1EF2\u1EF2\u1EF4\u1EF4" - + "\u1EF6\u1EF6\u1EF8\u1EF8\u1F08\u1F0F\u1F18\u1F1D\u1F28\u1F2F\u1F38\u1F3F" - + "\u1F48\u1F4D\u1F59\u1F59\u1F5B\u1F5B\u1F5D\u1F5D\u1F5F\u1F5F\u1F68\u1F6F" - + "\u1F88\u1F8F\u1F98\u1F9F\u1FA8\u1FAF\u1FB8\u1FBC\u1FBE\u1FBE\u1FC8\u1FCC" - + "\u1FD8\u1FDB\u1FE8\u1FEC\u1FF8\u1FFC\u2102\u2102\u2107\u2107\u210B\u210D" - + "\u2110\u2112\u2115\u2115\u2118\u211D\u2124\u2124\u2126\u2126\u2128\u2128" - + "\u212A\u212D\u2130\u2131\u2133\u2133\uFF21\uFF3A" }, - { "Lt", "\u01C5\u01C5\u01C8\u01C8\u01CB\u01CB\u01F2\u01F2" }, - { "Lo", "\u01AA\u01AA\u01BB\u01BB\u01BE\u01C3\u03F3\u03F3\u04C0\u04C0\u05D0\u05EA" - + "\u05F0\u05F2\u0621\u063A\u0641\u064A\u0671\u06B7\u06BA\u06BE\u06C0\u06CE" - + "\u06D0\u06D3\u06D5\u06D5\u0905\u0939\u093D\u093D\u0958\u0961\u0985\u098C" - + "\u098F\u0990\u0993\u09A8\u09AA\u09B0\u09B2\u09B2\u09B6\u09B9\u09DC\u09DD" - + "\u09DF\u09E1\u09F0\u09F1\u0A05\u0A0A\u0A0F\u0A10\u0A13\u0A28\u0A2A\u0A30" - + "\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5C\u0A5E\u0A5E\u0A72\u0A74" - + "\u0A85\u0A8B\u0A8D\u0A8D\u0A8F\u0A91\u0A93\u0AA8\u0AAA\u0AB0\u0AB2\u0AB3" - + "\u0AB5\u0AB9\u0ABD\u0ABD\u0AE0\u0AE0\u0B05\u0B0C\u0B0F\u0B10\u0B13\u0B28" - + "\u0B2A\u0B30\u0B32\u0B33\u0B36\u0B39\u0B3D\u0B3D\u0B5C\u0B5D\u0B5F\u0B61" - + "\u0B85\u0B8A\u0B8E\u0B90\u0B92\u0B95\u0B99\u0B9A\u0B9C\u0B9C\u0B9E\u0B9F" - + "\u0BA3\u0BA4\u0BA8\u0BAA\u0BAE\u0BB5\u0BB7\u0BB9\u0C05\u0C0C\u0C0E\u0C10" - + "\u0C12\u0C28\u0C2A\u0C33\u0C35\u0C39\u0C60\u0C61\u0C85\u0C8C\u0C8E\u0C90" - + "\u0C92\u0CA8\u0CAA\u0CB3\u0CB5\u0CB9\u0CDE\u0CDE\u0CE0\u0CE1\u0D05\u0D0C" - + "\u0D0E\u0D10\u0D12\u0D28\u0D2A\u0D39\u0D60\u0D61\u0E01\u0E2E\u0E30\u0E30" - + "\u0E32\u0E33\u0E40\u0E45\u0E81\u0E82\u0E84\u0E84\u0E87\u0E88\u0E8A\u0E8A" - + "\u0E8D\u0E8D\u0E94\u0E97\u0E99\u0E9F\u0EA1\u0EA3\u0EA5\u0EA5\u0EA7\u0EA7" - + "\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB0\u0EB2\u0EB3\u0EBD\u0EBD\u0EC0\u0EC4" - + "\u0EDC\u0EDD\u0F40\u0F47\u0F49\u0F69\u1100\u1159\u115F\u11A2\u11A8\u11F9" - + "\u2135\u2138\u3041\u3094\u30A1\u30FA\u3105\u312C\u3131\u318E\u4E00\u9FA5" - + "\uAC00\uD7A3\uF900\uFA2D\uFB1F\uFB28\uFB2A\uFB36\uFB38\uFB3C\uFB3E\uFB3E" - + "\uFB40\uFB41\uFB43\uFB44\uFB46\uFBB1\uFBD3\uFD3D\uFD50\uFD8F\uFD92\uFDC7" - + "\uFDF0\uFDFB\uFE70\uFE72\uFE74\uFE74\uFE76\uFEFC\uFF66\uFF6F\uFF71\uFF9D" - + "\uFFA0\uFFBE\uFFC2\uFFC7\uFFCA\uFFCF\uFFD2\uFFD7\uFFDA\uFFDC" }, - { "Lm", "\u02B0\u02B8\u02BB\u02C1\u02D0\u02D1\u02E0\u02E4\u037A\u037A\u0559\u0559" - + "\u0640\u0640\u06E5\u06E6\u0E46\u0E46\u0EC6\u0EC6\u3005\u3005\u3031\u3035" - + "\u309B\u309E\u30FC\u30FE\uFF70\uFF70\uFF9E\uFF9F" }, - { "Nd", "09\u0660\u0669\u06F0\u06F9\u0966\u096F\u09E6\u09EF\u0A66\u0A6F\u0AE6\u0AEF" - + "\u0B66\u0B6F\u0BE7\u0BEF\u0C66\u0C6F\u0CE6\u0CEF\u0D66\u0D6F\u0E50\u0E59" - + "\u0ED0\u0ED9\u0F20\u0F29\uFF10\uFF19" }, - { "Nl", "\u2160\u2182\u3007\u3007\u3021\u3029" }, - { "No", "\u00B2\u00B3\u00B9\u00B9\u00BC\u00BE\u09F4\u09F9\u0BF0\u0BF2\u0F2A\u0F33" - + "\u2070\u2070\u2074\u2079\u2080\u2089\u2153\u215F\u2460\u249B\u24EA\u24EA" - + "\u2776\u2793\u3192\u3195\u3220\u3229\u3280\u3289" }, - { "Ps", "(([[{{\u00AB\u00AB\u0F3A\u0F3A\u0F3C\u0F3C\u2018\u2018\u201A" - + "\u201C\u201E\u201F\u2039\u2039\u2045\u2045\u207D\u207D\u208D\u208D\u2329" - + "\u2329\u3008\u3008\u300A\u300A\u300C\u300C\u300E\u300E\u3010\u3010\u3014" - + "\u3014\u3016\u3016\u3018\u3018\u301A\u301A\u301D\u301D\u301F\u301F\uFD3E" - + "\uFD3E\uFE35\uFE35\uFE37\uFE37\uFE39\uFE39\uFE3B\uFE3B\uFE3D\uFE3D\uFE3F" - + "\uFE3F\uFE41\uFE41\uFE43\uFE43\uFE59\uFE59\uFE5B\uFE5B\uFE5D\uFE5D\uFF08" - + "\uFF08\uFF3B\uFF3B\uFF5B\uFF5B\uFF62\uFF62" }, - { "Pe", "))]]}}\u00BB\u00BB\u0F3B\u0F3B\u0F3D\u0F3D\u2019\u2019\u201D\u201D\u203A" - + "\u203A\u2046\u2046\u207E\u207E\u208E\u208E\u232A\u232A\u3009\u3009\u300B" - + "\u300B\u300D\u300D\u300F\u300F\u3011\u3011\u3015\u3015\u3017\u3017\u3019" - + "\u3019\u301B\u301B\u301E\u301E\uFD3F\uFD3F\uFE36\uFE36\uFE38\uFE38\uFE3A" - + "\uFE3A\uFE3C\uFE3C\uFE3E\uFE3E\uFE40\uFE40\uFE42\uFE42\uFE44\uFE44\uFE5A" - + "\uFE5A\uFE5C\uFE5C\uFE5E\uFE5E\uFF09\uFF09\uFF3D\uFF3D\uFF5D\uFF5D\uFF63" - + "\uFF63" }, - { "Pd", "--\u00AD\u00AD\u2010\u2015\u301C\u301C\u3030\u3030\uFE31\uFE32\uFE58\uFE58" - + "\uFE63\uFE63\uFF0D\uFF0D" }, - { "Pc", "__\u203F\u2040\uFE33\uFE34\uFE4D\uFE4F\uFF3F\uFF3F" }, - { "Po", "!#%'**,,./:;?@\\\\\u00A1\u00A1\u00B7\u00B7\u00BF\u00BF\u0374\u0375\u037E" - + "\u037E\u0387\u0387\u055A\u055F\u0589\u0589\u05BE\u05BE\u05C0\u05C0\u05C3" - + "\u05C3\u05F3\u05F4\u060C\u060C\u061B\u061B\u061F\u061F\u066A\u066D\u06D4" - + "\u06D4\u0964\u0965\u0970\u0970\u0E2F\u0E2F\u0E5A\u0E5B\u0EAF\u0EAF\u0F04" - + "\u0F12\u0F85\u0F85\u10FB\u10FB\u2016\u2017\u2020\u2027\u2030\u2038\u203B" - + "\u203E\u2041\u2043\u3001\u3003\u3006\u3006\u30FB\u30FB\uFE30\uFE30\uFE49" - + "\uFE4C\uFE50\uFE52\uFE54\uFE57\uFE5F\uFE61\uFE68\uFE68\uFE6A\uFE6B\uFF01" - + "\uFF03\uFF05\uFF07\uFF0A\uFF0A\uFF0C\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F" - + "\uFF20\uFF3C\uFF3C\uFF61\uFF61\uFF64\uFF65" }, - { "Sc", "$$\u00A2\u00A5\u09F2\u09F3\u0E3F\u0E3F\u20A0\u20AB\uFE69\uFE69\uFF04\uFF04" - + "\uFFE0\uFFE1\uFFE5\uFFE6" }, - { "Sm", "++<>||~~\u00AC\u00AC\u00B1\u00B1\u00D7\u00D7\u00F7\u00F7\u2044\u2044\u207A" - + "\u207C\u208A\u208C\u2190\u2194\u21D2\u21D2\u21D4\u21D4\u2200\u22F1\u2308" - + "\u230B\u2320\u2321\uFB29\uFB29\uFE62\uFE62\uFE64\uFE66\uFF0B\uFF0B\uFF1C" - + "\uFF1E\uFF5C\uFF5C\uFF5E\uFF5E\uFFE2\uFFE2\uFFE8\uFFEC" }, - { "So", "\u00A6\u00A7\u00A9\u00A9\u00AE\u00AE\u00B0\u00B0\u00B6\u00B6\u0482\u0482" - + "\u06E9\u06E9\u0950\u0950\u09FA\u09FA\u0AD0\u0AD0\u0B70\u0B70\u0E4F\u0E4F" - + "\u0F00\u0F03\u0F13\u0F17\u0F1A\u0F1F\u0F34\u0F34\u0F36\u0F36\u0F38\u0F38" - + "\u2100\u2101\u2103\u2106\u2108\u2109\u2114\u2114\u2116\u2117\u211E\u2123" - + "\u2125\u2125\u2127\u2127\u2129\u2129\u2132\u2132\u2195\u21D1\u21D3\u21D3" - + "\u21D5\u21EA\u2300\u2300\u2302\u2307\u230C\u231F\u2322\u2328\u232B\u237A" - + "\u2400\u2424\u2440\u244A\u249C\u24E9\u2500\u2595\u25A0\u25EF\u2600\u2613" - + "\u261A\u266F\u2701\u2704\u2706\u2709\u270C\u2727\u2729\u274B\u274D\u274D" - + "\u274F\u2752\u2756\u2756\u2758\u275E\u2761\u2767\u2794\u2794\u2798\u27AF" - + "\u27B1\u27BE\u3004\u3004\u3012\u3013\u3020\u3020\u3036\u3037\u303F\u303F" - + "\u3190\u3191\u3196\u319F\u3200\u321C\u322A\u3243\u3260\u327B\u327F\u327F" - + "\u328A\u32B0\u32C0\u32CB\u32D0\u32FE\u3300\u3376\u337B\u33DD\u33E0\u33FE" - + "\uFFE4\uFFE4\uFFED\uFFEE\uFFFD\uFFFD" }, - { "Mn", "\u0300\u0345\u0360\u0361\u0483\u0486\u0591\u05A1\u05A3\u05B9\u05BB\u05BD" - + "\u05BF\u05BF\u05C1\u05C2\u05C4\u05C4\u064B\u0652\u0670\u0670\u06D6\u06DC" - + "\u06DF\u06E4\u06E7\u06E8\u06EA\u06ED\u0901\u0902\u093C\u093C\u0941\u0948" - + "\u094D\u094D\u0951\u0954\u0962\u0963\u0981\u0981\u09BC\u09BC\u09C1\u09C4" - + "\u09CD\u09CD\u09E2\u09E3\u0A02\u0A02\u0A3C\u0A3C\u0A41\u0A42\u0A47\u0A48" - + "\u0A4B\u0A4D\u0A70\u0A71\u0A81\u0A82\u0ABC\u0ABC\u0AC1\u0AC5\u0AC7\u0AC8" - + "\u0ACD\u0ACD\u0B01\u0B01\u0B3C\u0B3C\u0B3F\u0B3F\u0B41\u0B43\u0B4D\u0B4D" - + "\u0B56\u0B56\u0B82\u0B82\u0BC0\u0BC0\u0BCD\u0BCD\u0C3E\u0C40\u0C46\u0C48" - + "\u0C4A\u0C4D\u0C55\u0C56\u0CBF\u0CBF\u0CC6\u0CC6\u0CCC\u0CCD\u0D41\u0D43" - + "\u0D4D\u0D4D\u0E31\u0E31\u0E34\u0E3A\u0E47\u0E4E\u0EB1\u0EB1\u0EB4\u0EB9" - + "\u0EBB\u0EBC\u0EC8\u0ECD\u0F18\u0F19\u0F35\u0F35\u0F37\u0F37\u0F39\u0F39" - + "\u0F71\u0F7E\u0F80\u0F84\u0F86\u0F8B\u0F90\u0F95\u0F97\u0F97\u0F99\u0FAD" - + "\u0FB1\u0FB7\u0FB9\u0FB9\u20D0\u20DC\u20E1\u20E1\u302A\u302F\u3099\u309A" - + "\uFB1E\uFB1E\uFE20\uFE23" }, - { "Mc", "\u0903\u0903\u093E\u0940\u0949\u094C\u0982\u0983\u09BE\u09C0\u09C7\u09C8" - + "\u09CB\u09CC\u09D7\u09D7\u0A3E\u0A40\u0A83\u0A83\u0ABE\u0AC0\u0AC9\u0AC9" - + "\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B3E\u0B40\u0B40\u0B47\u0B48\u0B4B\u0B4C" - + "\u0B57\u0B57\u0B83\u0B83\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6\u0BC8\u0BCA\u0BCC" - + "\u0BD7\u0BD7\u0C01\u0C03\u0C41\u0C44\u0C82\u0C83\u0CBE\u0CBE\u0CC0\u0CC4" - + "\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E\u0D40\u0D46\u0D48" - + "\u0D4A\u0D4C\u0D57\u0D57\u0F3E\u0F3F\u0F7F\u0F7F" }, - { "Me", "\u06DD\u06DE\u20DD\u20E0" }, - { "Zl", "\u2028\u2028" }, - { "Zp", "\u2029\u2029" }, - { "Zs", "\u0020\u0020\u00A0\u00A0\u2000\u200B\u3000\u3000" }, - { "Cc", "\u0000\u001F\u007F\u009F" }, - { "Cf", "\u200C\u200F\u202A\u202E\u206A\u206F\uFEFF\uFEFF" } - }; -}