From 04170b0a4166de0612d24bb3a22a133dbe99cc15 Mon Sep 17 00:00:00 2001 From: Piotr Zolnierek Date: Wed, 26 Feb 2014 13:49:56 +0100 Subject: [PATCH] Implement lower, upper case conversion for char --- src/etc/unicode.py | 103 +++-- src/libstd/char.rs | 67 ++- src/libstd/unicode.rs | 1022 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1162 insertions(+), 30 deletions(-) diff --git a/src/etc/unicode.py b/src/etc/unicode.py index 012da258ac3..6333a51ce3a 100755 --- a/src/etc/unicode.py +++ b/src/etc/unicode.py @@ -19,7 +19,7 @@ # programs". It is not meant to be a complete implementation of unicode. # For that we recommend you use a proper binding to libicu. -import fileinput, re, os, sys +import fileinput, re, os, sys, operator def fetch(f): @@ -35,6 +35,8 @@ def fetch(f): def load_unicode_data(f): fetch(f) gencats = {} + upperlower = {} + lowerupper = {} combines = [] canon_decomp = {} compat_decomp = {} @@ -44,6 +46,7 @@ def load_unicode_data(f): c_hi = 0 com_lo = 0 com_hi = 0 + for line in fileinput.input(f): fields = line.split(";") if len(fields) != 15: @@ -52,7 +55,17 @@ def load_unicode_data(f): decomp, deci, digit, num, mirror, old, iso, upcase, lowcase, titlecase ] = fields - code = int(code, 16) + code_org = code + code = int(code, 16) + + # generate char to char direct common and simple conversions + # uppercase to lowercase + if gencat == "Lu" and lowcase != "" and code_org != lowcase: + upperlower[code] = int(lowcase, 16) + + # lowercase to uppercase + if gencat == "Ll" and upcase != "" and code_org != upcase: + lowerupper[code] = int(upcase, 16) if decomp != "": if decomp.startswith('<'): @@ -96,7 +109,7 @@ def load_unicode_data(f): com_lo = code com_hi = code - return (canon_decomp, compat_decomp, gencats, combines) + return (canon_decomp, compat_decomp, gencats, combines, lowerupper, upperlower) def load_properties(f, interestingprops): fetch(f) @@ -164,11 +177,12 @@ def emit_property_module(f, mod, tbl): keys = tbl.keys() keys.sort() emit_bsearch_range_table(f); + for cat in keys: if cat not in ["Nd", "Nl", "No", "Cc", - "XID_Start", "XID_Continue", "Alphabetic", - "Lowercase", "Uppercase", "White_Space"]: - continue + "XID_Start", "XID_Continue", "Alphabetic", + "Lowercase", "Uppercase", "White_Space"]: + continue f.write(" static %s_table : &'static [(char,char)] = &[\n" % cat) ix = 0 for pair in tbl[cat]: @@ -183,30 +197,58 @@ def emit_property_module(f, mod, tbl): f.write("}\n") -def emit_property_module_old(f, mod, tbl): - f.write("mod %s {\n" % mod) - keys = tbl.keys() - keys.sort() - for cat in keys: - f.write(" fn %s(c: char) -> bool {\n" % cat) - f.write(" ret alt c {\n") - prefix = ' ' - for pair in tbl[cat]: - if pair[0] == pair[1]: - f.write(" %c %s\n" % - (prefix, escape_char(pair[0]))) - else: - f.write(" %c %s to %s\n" % - (prefix, - escape_char(pair[0]), - escape_char(pair[1]))) - prefix = '|' - f.write(" { true }\n") - f.write(" _ { false }\n") - f.write(" };\n") - f.write(" }\n\n") +def emit_conversions_module(f, lowerupper, upperlower): + f.write("pub mod conversions {\n") + f.write(""" + use cmp::{Equal, Less, Greater}; + use vec::ImmutableVector; + use tuple::Tuple2; + use option::{ Option, Some, None }; + + pub fn to_lower(c: char) -> char { + match bsearch_case_table(c, LuLl_table) { + None => c, + Some(index) => LuLl_table[index].val1() + } + } + + pub fn to_upper(c: char) -> char { + match bsearch_case_table(c, LlLu_table) { + None => c, + Some(index) => LlLu_table[index].val1() + } + } + + fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option { + table.bsearch(|&(key, _)| { + if c == key { Equal } + else if key < c { Less } + else { Greater } + }) + } +"""); + emit_caseconversions(f, lowerupper, upperlower) f.write("}\n") +def emit_caseconversions(f, lowerupper, upperlower): + f.write(" static LuLl_table : &'static [(char, char)] = &[\n") + sorted_by_lu = sorted(upperlower.iteritems(), key=operator.itemgetter(0)) + ix = 0 + for key, value in sorted_by_lu: + f.write(ch_prefix(ix)) + f.write("(%s, %s)" % (escape_char(key), escape_char(value))) + ix += 1 + f.write("\n ];\n\n") + + f.write(" static LlLu_table : &'static [(char, char)] = &[\n") + sorted_by_ll = sorted(lowerupper.iteritems(), key=operator.itemgetter(0)) + ix = 0 + for key, value in sorted_by_ll: + f.write(ch_prefix(ix)) + f.write("(%s, %s)" % (escape_char(key), escape_char(value))) + ix += 1 + f.write("\n ];\n\n") + def format_table_content(f, content, indent): line = " "*indent first = True @@ -362,7 +404,8 @@ for i in [r]: os.remove(i); rf = open(r, "w") -(canon_decomp, compat_decomp, gencats, combines) = load_unicode_data("UnicodeData.txt") +(canon_decomp, compat_decomp, gencats, + combines, lowerupper, upperlower) = load_unicode_data("UnicodeData.txt") # Preamble rf.write('''// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT @@ -388,7 +431,9 @@ emit_decomp_module(rf, canon_decomp, compat_decomp, combines) derived = load_properties("DerivedCoreProperties.txt", ["XID_Start", "XID_Continue", "Alphabetic", "Lowercase", "Uppercase"]) + emit_property_module(rf, "derived_property", derived) props = load_properties("PropList.txt", ["White_Space"]) emit_property_module(rf, "property", props) +emit_conversions_module(rf, lowerupper, upperlower) diff --git a/src/libstd/char.rs b/src/libstd/char.rs index 4c0f77586db..3fb9e47dbdc 100644 --- a/src/libstd/char.rs +++ b/src/libstd/char.rs @@ -28,7 +28,7 @@ use cast::transmute; use option::{None, Option, Some}; use iter::{Iterator, range_step}; use str::StrSlice; -use unicode::{derived_property, property, general_category, decompose}; +use unicode::{derived_property, property, general_category, decompose, conversions}; #[cfg(test)] use str::OwnedStr; @@ -225,6 +225,32 @@ pub fn to_digit(c: char, radix: uint) -> Option { else { None } } +/// Convert a char to its uppercase equivalent +/// +/// The case-folding performed is the common or simple mapping: +/// it only maps a codepoint to its equivalent if it is also a single codepoint +/// +/// # Return value +/// +/// Returns the char itself if no conversion if possible +#[inline] +pub fn to_uppercase(c: char) -> char { + conversions::to_upper(c) +} + +/// Convert a char to its lowercase equivalent +/// +/// The case-folding performed is the common or simple mapping: +/// it only maps a codepoint to its equivalent if it is also a single codepoint +/// +/// # Return value +/// +/// Returns the char itself if no conversion if possible +#[inline] +pub fn to_lowercase(c: char) -> char { + conversions::to_lower(c) +} + /// /// Converts a number to the character representing it /// @@ -385,6 +411,8 @@ pub trait Char { fn is_digit(&self) -> bool; fn is_digit_radix(&self, radix: uint) -> bool; fn to_digit(&self, radix: uint) -> Option; + fn to_lowercase(&self) -> char; + fn to_uppercase(&self) -> char; fn from_digit(num: uint, radix: uint) -> Option; fn escape_unicode(&self, f: |char|); fn escape_default(&self, f: |char|); @@ -421,6 +449,10 @@ impl Char for char { fn to_digit(&self, radix: uint) -> Option { to_digit(*self, radix) } + fn to_lowercase(&self) -> char { to_lowercase(*self) } + + fn to_uppercase(&self) -> char { to_uppercase(*self) } + fn from_digit(num: uint, radix: uint) -> Option { from_digit(num, radix) } fn escape_unicode(&self, f: |char|) { escape_unicode(*self, f) } @@ -516,6 +548,39 @@ fn test_to_digit() { assert_eq!('$'.to_digit(36u), None); } +#[test] +fn test_to_lowercase() { + assert_eq!('A'.to_lowercase(), 'a'); + assert_eq!('Ö'.to_lowercase(), 'ö'); + assert_eq!('ß'.to_lowercase(), 'ß'); + assert_eq!('Ü'.to_lowercase(), 'ü'); + assert_eq!('💩'.to_lowercase(), '💩'); + assert_eq!('Σ'.to_lowercase(), 'σ'); + assert_eq!('Τ'.to_lowercase(), 'τ'); + assert_eq!('Ι'.to_lowercase(), 'ι'); + assert_eq!('Γ'.to_lowercase(), 'γ'); + assert_eq!('Μ'.to_lowercase(), 'μ'); + assert_eq!('Α'.to_lowercase(), 'α'); + assert_eq!('Σ'.to_lowercase(), 'σ'); +} + +#[test] +fn test_to_uppercase() { + assert_eq!('a'.to_uppercase(), 'A'); + assert_eq!('ö'.to_uppercase(), 'Ö'); + assert_eq!('ß'.to_uppercase(), 'ß'); // not ẞ: Latin capital letter sharp s + assert_eq!('ü'.to_uppercase(), 'Ü'); + assert_eq!('💩'.to_uppercase(), '💩'); + + assert_eq!('σ'.to_uppercase(), 'Σ'); + assert_eq!('τ'.to_uppercase(), 'Τ'); + assert_eq!('ι'.to_uppercase(), 'Ι'); + assert_eq!('γ'.to_uppercase(), 'Γ'); + assert_eq!('μ'.to_uppercase(), 'Μ'); + assert_eq!('α'.to_uppercase(), 'Α'); + assert_eq!('ς'.to_uppercase(), 'Σ'); +} + #[test] fn test_is_control() { assert!('\u0000'.is_control()); diff --git a/src/libstd/unicode.rs b/src/libstd/unicode.rs index 311bb80603f..d55ddbda002 100644 --- a/src/libstd/unicode.rs +++ b/src/libstd/unicode.rs @@ -4179,3 +4179,1025 @@ pub mod property { } } +pub mod conversions { + + use cmp::{Equal, Less, Greater}; + use vec::ImmutableVector; + use tuple::Tuple2; + use option::{ Option, Some, None }; + + pub fn to_lower(c: char) -> char { + match bsearch_case_table(c, LuLl_table) { + None => c, + Some(index) => LuLl_table[index].val1() + } + } + + pub fn to_upper(c: char) -> char { + match bsearch_case_table(c, LlLu_table) { + None => c, + Some(index) => LlLu_table[index].val1() + } + } + + fn bsearch_case_table(c: char, table: &'static [(char, char)]) -> Option { + table.bsearch(|&(key, _)| { + if c == key { Equal } + else if key < c { Less } + else { Greater } + }) + } + static LuLl_table : &'static [(char, char)] = &[ + ('\x41', '\x61'), ('\x42', '\x62'), + ('\x43', '\x63'), ('\x44', '\x64'), + ('\x45', '\x65'), ('\x46', '\x66'), + ('\x47', '\x67'), ('\x48', '\x68'), + ('\x49', '\x69'), ('\x4a', '\x6a'), + ('\x4b', '\x6b'), ('\x4c', '\x6c'), + ('\x4d', '\x6d'), ('\x4e', '\x6e'), + ('\x4f', '\x6f'), ('\x50', '\x70'), + ('\x51', '\x71'), ('\x52', '\x72'), + ('\x53', '\x73'), ('\x54', '\x74'), + ('\x55', '\x75'), ('\x56', '\x76'), + ('\x57', '\x77'), ('\x58', '\x78'), + ('\x59', '\x79'), ('\x5a', '\x7a'), + ('\xc0', '\xe0'), ('\xc1', '\xe1'), + ('\xc2', '\xe2'), ('\xc3', '\xe3'), + ('\xc4', '\xe4'), ('\xc5', '\xe5'), + ('\xc6', '\xe6'), ('\xc7', '\xe7'), + ('\xc8', '\xe8'), ('\xc9', '\xe9'), + ('\xca', '\xea'), ('\xcb', '\xeb'), + ('\xcc', '\xec'), ('\xcd', '\xed'), + ('\xce', '\xee'), ('\xcf', '\xef'), + ('\xd0', '\xf0'), ('\xd1', '\xf1'), + ('\xd2', '\xf2'), ('\xd3', '\xf3'), + ('\xd4', '\xf4'), ('\xd5', '\xf5'), + ('\xd6', '\xf6'), ('\xd8', '\xf8'), + ('\xd9', '\xf9'), ('\xda', '\xfa'), + ('\xdb', '\xfb'), ('\xdc', '\xfc'), + ('\xdd', '\xfd'), ('\xde', '\xfe'), + ('\u0100', '\u0101'), ('\u0102', '\u0103'), + ('\u0104', '\u0105'), ('\u0106', '\u0107'), + ('\u0108', '\u0109'), ('\u010a', '\u010b'), + ('\u010c', '\u010d'), ('\u010e', '\u010f'), + ('\u0110', '\u0111'), ('\u0112', '\u0113'), + ('\u0114', '\u0115'), ('\u0116', '\u0117'), + ('\u0118', '\u0119'), ('\u011a', '\u011b'), + ('\u011c', '\u011d'), ('\u011e', '\u011f'), + ('\u0120', '\u0121'), ('\u0122', '\u0123'), + ('\u0124', '\u0125'), ('\u0126', '\u0127'), + ('\u0128', '\u0129'), ('\u012a', '\u012b'), + ('\u012c', '\u012d'), ('\u012e', '\u012f'), + ('\u0130', '\x69'), ('\u0132', '\u0133'), + ('\u0134', '\u0135'), ('\u0136', '\u0137'), + ('\u0139', '\u013a'), ('\u013b', '\u013c'), + ('\u013d', '\u013e'), ('\u013f', '\u0140'), + ('\u0141', '\u0142'), ('\u0143', '\u0144'), + ('\u0145', '\u0146'), ('\u0147', '\u0148'), + ('\u014a', '\u014b'), ('\u014c', '\u014d'), + ('\u014e', '\u014f'), ('\u0150', '\u0151'), + ('\u0152', '\u0153'), ('\u0154', '\u0155'), + ('\u0156', '\u0157'), ('\u0158', '\u0159'), + ('\u015a', '\u015b'), ('\u015c', '\u015d'), + ('\u015e', '\u015f'), ('\u0160', '\u0161'), + ('\u0162', '\u0163'), ('\u0164', '\u0165'), + ('\u0166', '\u0167'), ('\u0168', '\u0169'), + ('\u016a', '\u016b'), ('\u016c', '\u016d'), + ('\u016e', '\u016f'), ('\u0170', '\u0171'), + ('\u0172', '\u0173'), ('\u0174', '\u0175'), + ('\u0176', '\u0177'), ('\u0178', '\xff'), + ('\u0179', '\u017a'), ('\u017b', '\u017c'), + ('\u017d', '\u017e'), ('\u0181', '\u0253'), + ('\u0182', '\u0183'), ('\u0184', '\u0185'), + ('\u0186', '\u0254'), ('\u0187', '\u0188'), + ('\u0189', '\u0256'), ('\u018a', '\u0257'), + ('\u018b', '\u018c'), ('\u018e', '\u01dd'), + ('\u018f', '\u0259'), ('\u0190', '\u025b'), + ('\u0191', '\u0192'), ('\u0193', '\u0260'), + ('\u0194', '\u0263'), ('\u0196', '\u0269'), + ('\u0197', '\u0268'), ('\u0198', '\u0199'), + ('\u019c', '\u026f'), ('\u019d', '\u0272'), + ('\u019f', '\u0275'), ('\u01a0', '\u01a1'), + ('\u01a2', '\u01a3'), ('\u01a4', '\u01a5'), + ('\u01a6', '\u0280'), ('\u01a7', '\u01a8'), + ('\u01a9', '\u0283'), ('\u01ac', '\u01ad'), + ('\u01ae', '\u0288'), ('\u01af', '\u01b0'), + ('\u01b1', '\u028a'), ('\u01b2', '\u028b'), + ('\u01b3', '\u01b4'), ('\u01b5', '\u01b6'), + ('\u01b7', '\u0292'), ('\u01b8', '\u01b9'), + ('\u01bc', '\u01bd'), ('\u01c4', '\u01c6'), + ('\u01c7', '\u01c9'), ('\u01ca', '\u01cc'), + ('\u01cd', '\u01ce'), ('\u01cf', '\u01d0'), + ('\u01d1', '\u01d2'), ('\u01d3', '\u01d4'), + ('\u01d5', '\u01d6'), ('\u01d7', '\u01d8'), + ('\u01d9', '\u01da'), ('\u01db', '\u01dc'), + ('\u01de', '\u01df'), ('\u01e0', '\u01e1'), + ('\u01e2', '\u01e3'), ('\u01e4', '\u01e5'), + ('\u01e6', '\u01e7'), ('\u01e8', '\u01e9'), + ('\u01ea', '\u01eb'), ('\u01ec', '\u01ed'), + ('\u01ee', '\u01ef'), ('\u01f1', '\u01f3'), + ('\u01f4', '\u01f5'), ('\u01f6', '\u0195'), + ('\u01f7', '\u01bf'), ('\u01f8', '\u01f9'), + ('\u01fa', '\u01fb'), ('\u01fc', '\u01fd'), + ('\u01fe', '\u01ff'), ('\u0200', '\u0201'), + ('\u0202', '\u0203'), ('\u0204', '\u0205'), + ('\u0206', '\u0207'), ('\u0208', '\u0209'), + ('\u020a', '\u020b'), ('\u020c', '\u020d'), + ('\u020e', '\u020f'), ('\u0210', '\u0211'), + ('\u0212', '\u0213'), ('\u0214', '\u0215'), + ('\u0216', '\u0217'), ('\u0218', '\u0219'), + ('\u021a', '\u021b'), ('\u021c', '\u021d'), + ('\u021e', '\u021f'), ('\u0220', '\u019e'), + ('\u0222', '\u0223'), ('\u0224', '\u0225'), + ('\u0226', '\u0227'), ('\u0228', '\u0229'), + ('\u022a', '\u022b'), ('\u022c', '\u022d'), + ('\u022e', '\u022f'), ('\u0230', '\u0231'), + ('\u0232', '\u0233'), ('\u023a', '\u2c65'), + ('\u023b', '\u023c'), ('\u023d', '\u019a'), + ('\u023e', '\u2c66'), ('\u0241', '\u0242'), + ('\u0243', '\u0180'), ('\u0244', '\u0289'), + ('\u0245', '\u028c'), ('\u0246', '\u0247'), + ('\u0248', '\u0249'), ('\u024a', '\u024b'), + ('\u024c', '\u024d'), ('\u024e', '\u024f'), + ('\u0370', '\u0371'), ('\u0372', '\u0373'), + ('\u0376', '\u0377'), ('\u0386', '\u03ac'), + ('\u0388', '\u03ad'), ('\u0389', '\u03ae'), + ('\u038a', '\u03af'), ('\u038c', '\u03cc'), + ('\u038e', '\u03cd'), ('\u038f', '\u03ce'), + ('\u0391', '\u03b1'), ('\u0392', '\u03b2'), + ('\u0393', '\u03b3'), ('\u0394', '\u03b4'), + ('\u0395', '\u03b5'), ('\u0396', '\u03b6'), + ('\u0397', '\u03b7'), ('\u0398', '\u03b8'), + ('\u0399', '\u03b9'), ('\u039a', '\u03ba'), + ('\u039b', '\u03bb'), ('\u039c', '\u03bc'), + ('\u039d', '\u03bd'), ('\u039e', '\u03be'), + ('\u039f', '\u03bf'), ('\u03a0', '\u03c0'), + ('\u03a1', '\u03c1'), ('\u03a3', '\u03c3'), + ('\u03a4', '\u03c4'), ('\u03a5', '\u03c5'), + ('\u03a6', '\u03c6'), ('\u03a7', '\u03c7'), + ('\u03a8', '\u03c8'), ('\u03a9', '\u03c9'), + ('\u03aa', '\u03ca'), ('\u03ab', '\u03cb'), + ('\u03cf', '\u03d7'), ('\u03d8', '\u03d9'), + ('\u03da', '\u03db'), ('\u03dc', '\u03dd'), + ('\u03de', '\u03df'), ('\u03e0', '\u03e1'), + ('\u03e2', '\u03e3'), ('\u03e4', '\u03e5'), + ('\u03e6', '\u03e7'), ('\u03e8', '\u03e9'), + ('\u03ea', '\u03eb'), ('\u03ec', '\u03ed'), + ('\u03ee', '\u03ef'), ('\u03f4', '\u03b8'), + ('\u03f7', '\u03f8'), ('\u03f9', '\u03f2'), + ('\u03fa', '\u03fb'), ('\u03fd', '\u037b'), + ('\u03fe', '\u037c'), ('\u03ff', '\u037d'), + ('\u0400', '\u0450'), ('\u0401', '\u0451'), + ('\u0402', '\u0452'), ('\u0403', '\u0453'), + ('\u0404', '\u0454'), ('\u0405', '\u0455'), + ('\u0406', '\u0456'), ('\u0407', '\u0457'), + ('\u0408', '\u0458'), ('\u0409', '\u0459'), + ('\u040a', '\u045a'), ('\u040b', '\u045b'), + ('\u040c', '\u045c'), ('\u040d', '\u045d'), + ('\u040e', '\u045e'), ('\u040f', '\u045f'), + ('\u0410', '\u0430'), ('\u0411', '\u0431'), + ('\u0412', '\u0432'), ('\u0413', '\u0433'), + ('\u0414', '\u0434'), ('\u0415', '\u0435'), + ('\u0416', '\u0436'), ('\u0417', '\u0437'), + ('\u0418', '\u0438'), ('\u0419', '\u0439'), + ('\u041a', '\u043a'), ('\u041b', '\u043b'), + ('\u041c', '\u043c'), ('\u041d', '\u043d'), + ('\u041e', '\u043e'), ('\u041f', '\u043f'), + ('\u0420', '\u0440'), ('\u0421', '\u0441'), + ('\u0422', '\u0442'), ('\u0423', '\u0443'), + ('\u0424', '\u0444'), ('\u0425', '\u0445'), + ('\u0426', '\u0446'), ('\u0427', '\u0447'), + ('\u0428', '\u0448'), ('\u0429', '\u0449'), + ('\u042a', '\u044a'), ('\u042b', '\u044b'), + ('\u042c', '\u044c'), ('\u042d', '\u044d'), + ('\u042e', '\u044e'), ('\u042f', '\u044f'), + ('\u0460', '\u0461'), ('\u0462', '\u0463'), + ('\u0464', '\u0465'), ('\u0466', '\u0467'), + ('\u0468', '\u0469'), ('\u046a', '\u046b'), + ('\u046c', '\u046d'), ('\u046e', '\u046f'), + ('\u0470', '\u0471'), ('\u0472', '\u0473'), + ('\u0474', '\u0475'), ('\u0476', '\u0477'), + ('\u0478', '\u0479'), ('\u047a', '\u047b'), + ('\u047c', '\u047d'), ('\u047e', '\u047f'), + ('\u0480', '\u0481'), ('\u048a', '\u048b'), + ('\u048c', '\u048d'), ('\u048e', '\u048f'), + ('\u0490', '\u0491'), ('\u0492', '\u0493'), + ('\u0494', '\u0495'), ('\u0496', '\u0497'), + ('\u0498', '\u0499'), ('\u049a', '\u049b'), + ('\u049c', '\u049d'), ('\u049e', '\u049f'), + ('\u04a0', '\u04a1'), ('\u04a2', '\u04a3'), + ('\u04a4', '\u04a5'), ('\u04a6', '\u04a7'), + ('\u04a8', '\u04a9'), ('\u04aa', '\u04ab'), + ('\u04ac', '\u04ad'), ('\u04ae', '\u04af'), + ('\u04b0', '\u04b1'), ('\u04b2', '\u04b3'), + ('\u04b4', '\u04b5'), ('\u04b6', '\u04b7'), + ('\u04b8', '\u04b9'), ('\u04ba', '\u04bb'), + ('\u04bc', '\u04bd'), ('\u04be', '\u04bf'), + ('\u04c0', '\u04cf'), ('\u04c1', '\u04c2'), + ('\u04c3', '\u04c4'), ('\u04c5', '\u04c6'), + ('\u04c7', '\u04c8'), ('\u04c9', '\u04ca'), + ('\u04cb', '\u04cc'), ('\u04cd', '\u04ce'), + ('\u04d0', '\u04d1'), ('\u04d2', '\u04d3'), + ('\u04d4', '\u04d5'), ('\u04d6', '\u04d7'), + ('\u04d8', '\u04d9'), ('\u04da', '\u04db'), + ('\u04dc', '\u04dd'), ('\u04de', '\u04df'), + ('\u04e0', '\u04e1'), ('\u04e2', '\u04e3'), + ('\u04e4', '\u04e5'), ('\u04e6', '\u04e7'), + ('\u04e8', '\u04e9'), ('\u04ea', '\u04eb'), + ('\u04ec', '\u04ed'), ('\u04ee', '\u04ef'), + ('\u04f0', '\u04f1'), ('\u04f2', '\u04f3'), + ('\u04f4', '\u04f5'), ('\u04f6', '\u04f7'), + ('\u04f8', '\u04f9'), ('\u04fa', '\u04fb'), + ('\u04fc', '\u04fd'), ('\u04fe', '\u04ff'), + ('\u0500', '\u0501'), ('\u0502', '\u0503'), + ('\u0504', '\u0505'), ('\u0506', '\u0507'), + ('\u0508', '\u0509'), ('\u050a', '\u050b'), + ('\u050c', '\u050d'), ('\u050e', '\u050f'), + ('\u0510', '\u0511'), ('\u0512', '\u0513'), + ('\u0514', '\u0515'), ('\u0516', '\u0517'), + ('\u0518', '\u0519'), ('\u051a', '\u051b'), + ('\u051c', '\u051d'), ('\u051e', '\u051f'), + ('\u0520', '\u0521'), ('\u0522', '\u0523'), + ('\u0524', '\u0525'), ('\u0526', '\u0527'), + ('\u0531', '\u0561'), ('\u0532', '\u0562'), + ('\u0533', '\u0563'), ('\u0534', '\u0564'), + ('\u0535', '\u0565'), ('\u0536', '\u0566'), + ('\u0537', '\u0567'), ('\u0538', '\u0568'), + ('\u0539', '\u0569'), ('\u053a', '\u056a'), + ('\u053b', '\u056b'), ('\u053c', '\u056c'), + ('\u053d', '\u056d'), ('\u053e', '\u056e'), + ('\u053f', '\u056f'), ('\u0540', '\u0570'), + ('\u0541', '\u0571'), ('\u0542', '\u0572'), + ('\u0543', '\u0573'), ('\u0544', '\u0574'), + ('\u0545', '\u0575'), ('\u0546', '\u0576'), + ('\u0547', '\u0577'), ('\u0548', '\u0578'), + ('\u0549', '\u0579'), ('\u054a', '\u057a'), + ('\u054b', '\u057b'), ('\u054c', '\u057c'), + ('\u054d', '\u057d'), ('\u054e', '\u057e'), + ('\u054f', '\u057f'), ('\u0550', '\u0580'), + ('\u0551', '\u0581'), ('\u0552', '\u0582'), + ('\u0553', '\u0583'), ('\u0554', '\u0584'), + ('\u0555', '\u0585'), ('\u0556', '\u0586'), + ('\u10a0', '\u2d00'), ('\u10a1', '\u2d01'), + ('\u10a2', '\u2d02'), ('\u10a3', '\u2d03'), + ('\u10a4', '\u2d04'), ('\u10a5', '\u2d05'), + ('\u10a6', '\u2d06'), ('\u10a7', '\u2d07'), + ('\u10a8', '\u2d08'), ('\u10a9', '\u2d09'), + ('\u10aa', '\u2d0a'), ('\u10ab', '\u2d0b'), + ('\u10ac', '\u2d0c'), ('\u10ad', '\u2d0d'), + ('\u10ae', '\u2d0e'), ('\u10af', '\u2d0f'), + ('\u10b0', '\u2d10'), ('\u10b1', '\u2d11'), + ('\u10b2', '\u2d12'), ('\u10b3', '\u2d13'), + ('\u10b4', '\u2d14'), ('\u10b5', '\u2d15'), + ('\u10b6', '\u2d16'), ('\u10b7', '\u2d17'), + ('\u10b8', '\u2d18'), ('\u10b9', '\u2d19'), + ('\u10ba', '\u2d1a'), ('\u10bb', '\u2d1b'), + ('\u10bc', '\u2d1c'), ('\u10bd', '\u2d1d'), + ('\u10be', '\u2d1e'), ('\u10bf', '\u2d1f'), + ('\u10c0', '\u2d20'), ('\u10c1', '\u2d21'), + ('\u10c2', '\u2d22'), ('\u10c3', '\u2d23'), + ('\u10c4', '\u2d24'), ('\u10c5', '\u2d25'), + ('\u10c7', '\u2d27'), ('\u10cd', '\u2d2d'), + ('\u1e00', '\u1e01'), ('\u1e02', '\u1e03'), + ('\u1e04', '\u1e05'), ('\u1e06', '\u1e07'), + ('\u1e08', '\u1e09'), ('\u1e0a', '\u1e0b'), + ('\u1e0c', '\u1e0d'), ('\u1e0e', '\u1e0f'), + ('\u1e10', '\u1e11'), ('\u1e12', '\u1e13'), + ('\u1e14', '\u1e15'), ('\u1e16', '\u1e17'), + ('\u1e18', '\u1e19'), ('\u1e1a', '\u1e1b'), + ('\u1e1c', '\u1e1d'), ('\u1e1e', '\u1e1f'), + ('\u1e20', '\u1e21'), ('\u1e22', '\u1e23'), + ('\u1e24', '\u1e25'), ('\u1e26', '\u1e27'), + ('\u1e28', '\u1e29'), ('\u1e2a', '\u1e2b'), + ('\u1e2c', '\u1e2d'), ('\u1e2e', '\u1e2f'), + ('\u1e30', '\u1e31'), ('\u1e32', '\u1e33'), + ('\u1e34', '\u1e35'), ('\u1e36', '\u1e37'), + ('\u1e38', '\u1e39'), ('\u1e3a', '\u1e3b'), + ('\u1e3c', '\u1e3d'), ('\u1e3e', '\u1e3f'), + ('\u1e40', '\u1e41'), ('\u1e42', '\u1e43'), + ('\u1e44', '\u1e45'), ('\u1e46', '\u1e47'), + ('\u1e48', '\u1e49'), ('\u1e4a', '\u1e4b'), + ('\u1e4c', '\u1e4d'), ('\u1e4e', '\u1e4f'), + ('\u1e50', '\u1e51'), ('\u1e52', '\u1e53'), + ('\u1e54', '\u1e55'), ('\u1e56', '\u1e57'), + ('\u1e58', '\u1e59'), ('\u1e5a', '\u1e5b'), + ('\u1e5c', '\u1e5d'), ('\u1e5e', '\u1e5f'), + ('\u1e60', '\u1e61'), ('\u1e62', '\u1e63'), + ('\u1e64', '\u1e65'), ('\u1e66', '\u1e67'), + ('\u1e68', '\u1e69'), ('\u1e6a', '\u1e6b'), + ('\u1e6c', '\u1e6d'), ('\u1e6e', '\u1e6f'), + ('\u1e70', '\u1e71'), ('\u1e72', '\u1e73'), + ('\u1e74', '\u1e75'), ('\u1e76', '\u1e77'), + ('\u1e78', '\u1e79'), ('\u1e7a', '\u1e7b'), + ('\u1e7c', '\u1e7d'), ('\u1e7e', '\u1e7f'), + ('\u1e80', '\u1e81'), ('\u1e82', '\u1e83'), + ('\u1e84', '\u1e85'), ('\u1e86', '\u1e87'), + ('\u1e88', '\u1e89'), ('\u1e8a', '\u1e8b'), + ('\u1e8c', '\u1e8d'), ('\u1e8e', '\u1e8f'), + ('\u1e90', '\u1e91'), ('\u1e92', '\u1e93'), + ('\u1e94', '\u1e95'), ('\u1e9e', '\xdf'), + ('\u1ea0', '\u1ea1'), ('\u1ea2', '\u1ea3'), + ('\u1ea4', '\u1ea5'), ('\u1ea6', '\u1ea7'), + ('\u1ea8', '\u1ea9'), ('\u1eaa', '\u1eab'), + ('\u1eac', '\u1ead'), ('\u1eae', '\u1eaf'), + ('\u1eb0', '\u1eb1'), ('\u1eb2', '\u1eb3'), + ('\u1eb4', '\u1eb5'), ('\u1eb6', '\u1eb7'), + ('\u1eb8', '\u1eb9'), ('\u1eba', '\u1ebb'), + ('\u1ebc', '\u1ebd'), ('\u1ebe', '\u1ebf'), + ('\u1ec0', '\u1ec1'), ('\u1ec2', '\u1ec3'), + ('\u1ec4', '\u1ec5'), ('\u1ec6', '\u1ec7'), + ('\u1ec8', '\u1ec9'), ('\u1eca', '\u1ecb'), + ('\u1ecc', '\u1ecd'), ('\u1ece', '\u1ecf'), + ('\u1ed0', '\u1ed1'), ('\u1ed2', '\u1ed3'), + ('\u1ed4', '\u1ed5'), ('\u1ed6', '\u1ed7'), + ('\u1ed8', '\u1ed9'), ('\u1eda', '\u1edb'), + ('\u1edc', '\u1edd'), ('\u1ede', '\u1edf'), + ('\u1ee0', '\u1ee1'), ('\u1ee2', '\u1ee3'), + ('\u1ee4', '\u1ee5'), ('\u1ee6', '\u1ee7'), + ('\u1ee8', '\u1ee9'), ('\u1eea', '\u1eeb'), + ('\u1eec', '\u1eed'), ('\u1eee', '\u1eef'), + ('\u1ef0', '\u1ef1'), ('\u1ef2', '\u1ef3'), + ('\u1ef4', '\u1ef5'), ('\u1ef6', '\u1ef7'), + ('\u1ef8', '\u1ef9'), ('\u1efa', '\u1efb'), + ('\u1efc', '\u1efd'), ('\u1efe', '\u1eff'), + ('\u1f08', '\u1f00'), ('\u1f09', '\u1f01'), + ('\u1f0a', '\u1f02'), ('\u1f0b', '\u1f03'), + ('\u1f0c', '\u1f04'), ('\u1f0d', '\u1f05'), + ('\u1f0e', '\u1f06'), ('\u1f0f', '\u1f07'), + ('\u1f18', '\u1f10'), ('\u1f19', '\u1f11'), + ('\u1f1a', '\u1f12'), ('\u1f1b', '\u1f13'), + ('\u1f1c', '\u1f14'), ('\u1f1d', '\u1f15'), + ('\u1f28', '\u1f20'), ('\u1f29', '\u1f21'), + ('\u1f2a', '\u1f22'), ('\u1f2b', '\u1f23'), + ('\u1f2c', '\u1f24'), ('\u1f2d', '\u1f25'), + ('\u1f2e', '\u1f26'), ('\u1f2f', '\u1f27'), + ('\u1f38', '\u1f30'), ('\u1f39', '\u1f31'), + ('\u1f3a', '\u1f32'), ('\u1f3b', '\u1f33'), + ('\u1f3c', '\u1f34'), ('\u1f3d', '\u1f35'), + ('\u1f3e', '\u1f36'), ('\u1f3f', '\u1f37'), + ('\u1f48', '\u1f40'), ('\u1f49', '\u1f41'), + ('\u1f4a', '\u1f42'), ('\u1f4b', '\u1f43'), + ('\u1f4c', '\u1f44'), ('\u1f4d', '\u1f45'), + ('\u1f59', '\u1f51'), ('\u1f5b', '\u1f53'), + ('\u1f5d', '\u1f55'), ('\u1f5f', '\u1f57'), + ('\u1f68', '\u1f60'), ('\u1f69', '\u1f61'), + ('\u1f6a', '\u1f62'), ('\u1f6b', '\u1f63'), + ('\u1f6c', '\u1f64'), ('\u1f6d', '\u1f65'), + ('\u1f6e', '\u1f66'), ('\u1f6f', '\u1f67'), + ('\u1fb8', '\u1fb0'), ('\u1fb9', '\u1fb1'), + ('\u1fba', '\u1f70'), ('\u1fbb', '\u1f71'), + ('\u1fc8', '\u1f72'), ('\u1fc9', '\u1f73'), + ('\u1fca', '\u1f74'), ('\u1fcb', '\u1f75'), + ('\u1fd8', '\u1fd0'), ('\u1fd9', '\u1fd1'), + ('\u1fda', '\u1f76'), ('\u1fdb', '\u1f77'), + ('\u1fe8', '\u1fe0'), ('\u1fe9', '\u1fe1'), + ('\u1fea', '\u1f7a'), ('\u1feb', '\u1f7b'), + ('\u1fec', '\u1fe5'), ('\u1ff8', '\u1f78'), + ('\u1ff9', '\u1f79'), ('\u1ffa', '\u1f7c'), + ('\u1ffb', '\u1f7d'), ('\u2126', '\u03c9'), + ('\u212a', '\x6b'), ('\u212b', '\xe5'), + ('\u2132', '\u214e'), ('\u2183', '\u2184'), + ('\u2c00', '\u2c30'), ('\u2c01', '\u2c31'), + ('\u2c02', '\u2c32'), ('\u2c03', '\u2c33'), + ('\u2c04', '\u2c34'), ('\u2c05', '\u2c35'), + ('\u2c06', '\u2c36'), ('\u2c07', '\u2c37'), + ('\u2c08', '\u2c38'), ('\u2c09', '\u2c39'), + ('\u2c0a', '\u2c3a'), ('\u2c0b', '\u2c3b'), + ('\u2c0c', '\u2c3c'), ('\u2c0d', '\u2c3d'), + ('\u2c0e', '\u2c3e'), ('\u2c0f', '\u2c3f'), + ('\u2c10', '\u2c40'), ('\u2c11', '\u2c41'), + ('\u2c12', '\u2c42'), ('\u2c13', '\u2c43'), + ('\u2c14', '\u2c44'), ('\u2c15', '\u2c45'), + ('\u2c16', '\u2c46'), ('\u2c17', '\u2c47'), + ('\u2c18', '\u2c48'), ('\u2c19', '\u2c49'), + ('\u2c1a', '\u2c4a'), ('\u2c1b', '\u2c4b'), + ('\u2c1c', '\u2c4c'), ('\u2c1d', '\u2c4d'), + ('\u2c1e', '\u2c4e'), ('\u2c1f', '\u2c4f'), + ('\u2c20', '\u2c50'), ('\u2c21', '\u2c51'), + ('\u2c22', '\u2c52'), ('\u2c23', '\u2c53'), + ('\u2c24', '\u2c54'), ('\u2c25', '\u2c55'), + ('\u2c26', '\u2c56'), ('\u2c27', '\u2c57'), + ('\u2c28', '\u2c58'), ('\u2c29', '\u2c59'), + ('\u2c2a', '\u2c5a'), ('\u2c2b', '\u2c5b'), + ('\u2c2c', '\u2c5c'), ('\u2c2d', '\u2c5d'), + ('\u2c2e', '\u2c5e'), ('\u2c60', '\u2c61'), + ('\u2c62', '\u026b'), ('\u2c63', '\u1d7d'), + ('\u2c64', '\u027d'), ('\u2c67', '\u2c68'), + ('\u2c69', '\u2c6a'), ('\u2c6b', '\u2c6c'), + ('\u2c6d', '\u0251'), ('\u2c6e', '\u0271'), + ('\u2c6f', '\u0250'), ('\u2c70', '\u0252'), + ('\u2c72', '\u2c73'), ('\u2c75', '\u2c76'), + ('\u2c7e', '\u023f'), ('\u2c7f', '\u0240'), + ('\u2c80', '\u2c81'), ('\u2c82', '\u2c83'), + ('\u2c84', '\u2c85'), ('\u2c86', '\u2c87'), + ('\u2c88', '\u2c89'), ('\u2c8a', '\u2c8b'), + ('\u2c8c', '\u2c8d'), ('\u2c8e', '\u2c8f'), + ('\u2c90', '\u2c91'), ('\u2c92', '\u2c93'), + ('\u2c94', '\u2c95'), ('\u2c96', '\u2c97'), + ('\u2c98', '\u2c99'), ('\u2c9a', '\u2c9b'), + ('\u2c9c', '\u2c9d'), ('\u2c9e', '\u2c9f'), + ('\u2ca0', '\u2ca1'), ('\u2ca2', '\u2ca3'), + ('\u2ca4', '\u2ca5'), ('\u2ca6', '\u2ca7'), + ('\u2ca8', '\u2ca9'), ('\u2caa', '\u2cab'), + ('\u2cac', '\u2cad'), ('\u2cae', '\u2caf'), + ('\u2cb0', '\u2cb1'), ('\u2cb2', '\u2cb3'), + ('\u2cb4', '\u2cb5'), ('\u2cb6', '\u2cb7'), + ('\u2cb8', '\u2cb9'), ('\u2cba', '\u2cbb'), + ('\u2cbc', '\u2cbd'), ('\u2cbe', '\u2cbf'), + ('\u2cc0', '\u2cc1'), ('\u2cc2', '\u2cc3'), + ('\u2cc4', '\u2cc5'), ('\u2cc6', '\u2cc7'), + ('\u2cc8', '\u2cc9'), ('\u2cca', '\u2ccb'), + ('\u2ccc', '\u2ccd'), ('\u2cce', '\u2ccf'), + ('\u2cd0', '\u2cd1'), ('\u2cd2', '\u2cd3'), + ('\u2cd4', '\u2cd5'), ('\u2cd6', '\u2cd7'), + ('\u2cd8', '\u2cd9'), ('\u2cda', '\u2cdb'), + ('\u2cdc', '\u2cdd'), ('\u2cde', '\u2cdf'), + ('\u2ce0', '\u2ce1'), ('\u2ce2', '\u2ce3'), + ('\u2ceb', '\u2cec'), ('\u2ced', '\u2cee'), + ('\u2cf2', '\u2cf3'), ('\ua640', '\ua641'), + ('\ua642', '\ua643'), ('\ua644', '\ua645'), + ('\ua646', '\ua647'), ('\ua648', '\ua649'), + ('\ua64a', '\ua64b'), ('\ua64c', '\ua64d'), + ('\ua64e', '\ua64f'), ('\ua650', '\ua651'), + ('\ua652', '\ua653'), ('\ua654', '\ua655'), + ('\ua656', '\ua657'), ('\ua658', '\ua659'), + ('\ua65a', '\ua65b'), ('\ua65c', '\ua65d'), + ('\ua65e', '\ua65f'), ('\ua660', '\ua661'), + ('\ua662', '\ua663'), ('\ua664', '\ua665'), + ('\ua666', '\ua667'), ('\ua668', '\ua669'), + ('\ua66a', '\ua66b'), ('\ua66c', '\ua66d'), + ('\ua680', '\ua681'), ('\ua682', '\ua683'), + ('\ua684', '\ua685'), ('\ua686', '\ua687'), + ('\ua688', '\ua689'), ('\ua68a', '\ua68b'), + ('\ua68c', '\ua68d'), ('\ua68e', '\ua68f'), + ('\ua690', '\ua691'), ('\ua692', '\ua693'), + ('\ua694', '\ua695'), ('\ua696', '\ua697'), + ('\ua722', '\ua723'), ('\ua724', '\ua725'), + ('\ua726', '\ua727'), ('\ua728', '\ua729'), + ('\ua72a', '\ua72b'), ('\ua72c', '\ua72d'), + ('\ua72e', '\ua72f'), ('\ua732', '\ua733'), + ('\ua734', '\ua735'), ('\ua736', '\ua737'), + ('\ua738', '\ua739'), ('\ua73a', '\ua73b'), + ('\ua73c', '\ua73d'), ('\ua73e', '\ua73f'), + ('\ua740', '\ua741'), ('\ua742', '\ua743'), + ('\ua744', '\ua745'), ('\ua746', '\ua747'), + ('\ua748', '\ua749'), ('\ua74a', '\ua74b'), + ('\ua74c', '\ua74d'), ('\ua74e', '\ua74f'), + ('\ua750', '\ua751'), ('\ua752', '\ua753'), + ('\ua754', '\ua755'), ('\ua756', '\ua757'), + ('\ua758', '\ua759'), ('\ua75a', '\ua75b'), + ('\ua75c', '\ua75d'), ('\ua75e', '\ua75f'), + ('\ua760', '\ua761'), ('\ua762', '\ua763'), + ('\ua764', '\ua765'), ('\ua766', '\ua767'), + ('\ua768', '\ua769'), ('\ua76a', '\ua76b'), + ('\ua76c', '\ua76d'), ('\ua76e', '\ua76f'), + ('\ua779', '\ua77a'), ('\ua77b', '\ua77c'), + ('\ua77d', '\u1d79'), ('\ua77e', '\ua77f'), + ('\ua780', '\ua781'), ('\ua782', '\ua783'), + ('\ua784', '\ua785'), ('\ua786', '\ua787'), + ('\ua78b', '\ua78c'), ('\ua78d', '\u0265'), + ('\ua790', '\ua791'), ('\ua792', '\ua793'), + ('\ua7a0', '\ua7a1'), ('\ua7a2', '\ua7a3'), + ('\ua7a4', '\ua7a5'), ('\ua7a6', '\ua7a7'), + ('\ua7a8', '\ua7a9'), ('\ua7aa', '\u0266'), + ('\uff21', '\uff41'), ('\uff22', '\uff42'), + ('\uff23', '\uff43'), ('\uff24', '\uff44'), + ('\uff25', '\uff45'), ('\uff26', '\uff46'), + ('\uff27', '\uff47'), ('\uff28', '\uff48'), + ('\uff29', '\uff49'), ('\uff2a', '\uff4a'), + ('\uff2b', '\uff4b'), ('\uff2c', '\uff4c'), + ('\uff2d', '\uff4d'), ('\uff2e', '\uff4e'), + ('\uff2f', '\uff4f'), ('\uff30', '\uff50'), + ('\uff31', '\uff51'), ('\uff32', '\uff52'), + ('\uff33', '\uff53'), ('\uff34', '\uff54'), + ('\uff35', '\uff55'), ('\uff36', '\uff56'), + ('\uff37', '\uff57'), ('\uff38', '\uff58'), + ('\uff39', '\uff59'), ('\uff3a', '\uff5a'), + ('\U00010400', '\U00010428'), ('\U00010401', '\U00010429'), + ('\U00010402', '\U0001042a'), ('\U00010403', '\U0001042b'), + ('\U00010404', '\U0001042c'), ('\U00010405', '\U0001042d'), + ('\U00010406', '\U0001042e'), ('\U00010407', '\U0001042f'), + ('\U00010408', '\U00010430'), ('\U00010409', '\U00010431'), + ('\U0001040a', '\U00010432'), ('\U0001040b', '\U00010433'), + ('\U0001040c', '\U00010434'), ('\U0001040d', '\U00010435'), + ('\U0001040e', '\U00010436'), ('\U0001040f', '\U00010437'), + ('\U00010410', '\U00010438'), ('\U00010411', '\U00010439'), + ('\U00010412', '\U0001043a'), ('\U00010413', '\U0001043b'), + ('\U00010414', '\U0001043c'), ('\U00010415', '\U0001043d'), + ('\U00010416', '\U0001043e'), ('\U00010417', '\U0001043f'), + ('\U00010418', '\U00010440'), ('\U00010419', '\U00010441'), + ('\U0001041a', '\U00010442'), ('\U0001041b', '\U00010443'), + ('\U0001041c', '\U00010444'), ('\U0001041d', '\U00010445'), + ('\U0001041e', '\U00010446'), ('\U0001041f', '\U00010447'), + ('\U00010420', '\U00010448'), ('\U00010421', '\U00010449'), + ('\U00010422', '\U0001044a'), ('\U00010423', '\U0001044b'), + ('\U00010424', '\U0001044c'), ('\U00010425', '\U0001044d'), + ('\U00010426', '\U0001044e'), ('\U00010427', '\U0001044f') + ]; + + static LlLu_table : &'static [(char, char)] = &[ + ('\x61', '\x41'), ('\x62', '\x42'), + ('\x63', '\x43'), ('\x64', '\x44'), + ('\x65', '\x45'), ('\x66', '\x46'), + ('\x67', '\x47'), ('\x68', '\x48'), + ('\x69', '\x49'), ('\x6a', '\x4a'), + ('\x6b', '\x4b'), ('\x6c', '\x4c'), + ('\x6d', '\x4d'), ('\x6e', '\x4e'), + ('\x6f', '\x4f'), ('\x70', '\x50'), + ('\x71', '\x51'), ('\x72', '\x52'), + ('\x73', '\x53'), ('\x74', '\x54'), + ('\x75', '\x55'), ('\x76', '\x56'), + ('\x77', '\x57'), ('\x78', '\x58'), + ('\x79', '\x59'), ('\x7a', '\x5a'), + ('\xb5', '\u039c'), ('\xe0', '\xc0'), + ('\xe1', '\xc1'), ('\xe2', '\xc2'), + ('\xe3', '\xc3'), ('\xe4', '\xc4'), + ('\xe5', '\xc5'), ('\xe6', '\xc6'), + ('\xe7', '\xc7'), ('\xe8', '\xc8'), + ('\xe9', '\xc9'), ('\xea', '\xca'), + ('\xeb', '\xcb'), ('\xec', '\xcc'), + ('\xed', '\xcd'), ('\xee', '\xce'), + ('\xef', '\xcf'), ('\xf0', '\xd0'), + ('\xf1', '\xd1'), ('\xf2', '\xd2'), + ('\xf3', '\xd3'), ('\xf4', '\xd4'), + ('\xf5', '\xd5'), ('\xf6', '\xd6'), + ('\xf8', '\xd8'), ('\xf9', '\xd9'), + ('\xfa', '\xda'), ('\xfb', '\xdb'), + ('\xfc', '\xdc'), ('\xfd', '\xdd'), + ('\xfe', '\xde'), ('\xff', '\u0178'), + ('\u0101', '\u0100'), ('\u0103', '\u0102'), + ('\u0105', '\u0104'), ('\u0107', '\u0106'), + ('\u0109', '\u0108'), ('\u010b', '\u010a'), + ('\u010d', '\u010c'), ('\u010f', '\u010e'), + ('\u0111', '\u0110'), ('\u0113', '\u0112'), + ('\u0115', '\u0114'), ('\u0117', '\u0116'), + ('\u0119', '\u0118'), ('\u011b', '\u011a'), + ('\u011d', '\u011c'), ('\u011f', '\u011e'), + ('\u0121', '\u0120'), ('\u0123', '\u0122'), + ('\u0125', '\u0124'), ('\u0127', '\u0126'), + ('\u0129', '\u0128'), ('\u012b', '\u012a'), + ('\u012d', '\u012c'), ('\u012f', '\u012e'), + ('\u0131', '\x49'), ('\u0133', '\u0132'), + ('\u0135', '\u0134'), ('\u0137', '\u0136'), + ('\u013a', '\u0139'), ('\u013c', '\u013b'), + ('\u013e', '\u013d'), ('\u0140', '\u013f'), + ('\u0142', '\u0141'), ('\u0144', '\u0143'), + ('\u0146', '\u0145'), ('\u0148', '\u0147'), + ('\u014b', '\u014a'), ('\u014d', '\u014c'), + ('\u014f', '\u014e'), ('\u0151', '\u0150'), + ('\u0153', '\u0152'), ('\u0155', '\u0154'), + ('\u0157', '\u0156'), ('\u0159', '\u0158'), + ('\u015b', '\u015a'), ('\u015d', '\u015c'), + ('\u015f', '\u015e'), ('\u0161', '\u0160'), + ('\u0163', '\u0162'), ('\u0165', '\u0164'), + ('\u0167', '\u0166'), ('\u0169', '\u0168'), + ('\u016b', '\u016a'), ('\u016d', '\u016c'), + ('\u016f', '\u016e'), ('\u0171', '\u0170'), + ('\u0173', '\u0172'), ('\u0175', '\u0174'), + ('\u0177', '\u0176'), ('\u017a', '\u0179'), + ('\u017c', '\u017b'), ('\u017e', '\u017d'), + ('\u017f', '\x53'), ('\u0180', '\u0243'), + ('\u0183', '\u0182'), ('\u0185', '\u0184'), + ('\u0188', '\u0187'), ('\u018c', '\u018b'), + ('\u0192', '\u0191'), ('\u0195', '\u01f6'), + ('\u0199', '\u0198'), ('\u019a', '\u023d'), + ('\u019e', '\u0220'), ('\u01a1', '\u01a0'), + ('\u01a3', '\u01a2'), ('\u01a5', '\u01a4'), + ('\u01a8', '\u01a7'), ('\u01ad', '\u01ac'), + ('\u01b0', '\u01af'), ('\u01b4', '\u01b3'), + ('\u01b6', '\u01b5'), ('\u01b9', '\u01b8'), + ('\u01bd', '\u01bc'), ('\u01bf', '\u01f7'), + ('\u01c6', '\u01c4'), ('\u01c9', '\u01c7'), + ('\u01cc', '\u01ca'), ('\u01ce', '\u01cd'), + ('\u01d0', '\u01cf'), ('\u01d2', '\u01d1'), + ('\u01d4', '\u01d3'), ('\u01d6', '\u01d5'), + ('\u01d8', '\u01d7'), ('\u01da', '\u01d9'), + ('\u01dc', '\u01db'), ('\u01dd', '\u018e'), + ('\u01df', '\u01de'), ('\u01e1', '\u01e0'), + ('\u01e3', '\u01e2'), ('\u01e5', '\u01e4'), + ('\u01e7', '\u01e6'), ('\u01e9', '\u01e8'), + ('\u01eb', '\u01ea'), ('\u01ed', '\u01ec'), + ('\u01ef', '\u01ee'), ('\u01f3', '\u01f1'), + ('\u01f5', '\u01f4'), ('\u01f9', '\u01f8'), + ('\u01fb', '\u01fa'), ('\u01fd', '\u01fc'), + ('\u01ff', '\u01fe'), ('\u0201', '\u0200'), + ('\u0203', '\u0202'), ('\u0205', '\u0204'), + ('\u0207', '\u0206'), ('\u0209', '\u0208'), + ('\u020b', '\u020a'), ('\u020d', '\u020c'), + ('\u020f', '\u020e'), ('\u0211', '\u0210'), + ('\u0213', '\u0212'), ('\u0215', '\u0214'), + ('\u0217', '\u0216'), ('\u0219', '\u0218'), + ('\u021b', '\u021a'), ('\u021d', '\u021c'), + ('\u021f', '\u021e'), ('\u0223', '\u0222'), + ('\u0225', '\u0224'), ('\u0227', '\u0226'), + ('\u0229', '\u0228'), ('\u022b', '\u022a'), + ('\u022d', '\u022c'), ('\u022f', '\u022e'), + ('\u0231', '\u0230'), ('\u0233', '\u0232'), + ('\u023c', '\u023b'), ('\u023f', '\u2c7e'), + ('\u0240', '\u2c7f'), ('\u0242', '\u0241'), + ('\u0247', '\u0246'), ('\u0249', '\u0248'), + ('\u024b', '\u024a'), ('\u024d', '\u024c'), + ('\u024f', '\u024e'), ('\u0250', '\u2c6f'), + ('\u0251', '\u2c6d'), ('\u0252', '\u2c70'), + ('\u0253', '\u0181'), ('\u0254', '\u0186'), + ('\u0256', '\u0189'), ('\u0257', '\u018a'), + ('\u0259', '\u018f'), ('\u025b', '\u0190'), + ('\u0260', '\u0193'), ('\u0263', '\u0194'), + ('\u0265', '\ua78d'), ('\u0266', '\ua7aa'), + ('\u0268', '\u0197'), ('\u0269', '\u0196'), + ('\u026b', '\u2c62'), ('\u026f', '\u019c'), + ('\u0271', '\u2c6e'), ('\u0272', '\u019d'), + ('\u0275', '\u019f'), ('\u027d', '\u2c64'), + ('\u0280', '\u01a6'), ('\u0283', '\u01a9'), + ('\u0288', '\u01ae'), ('\u0289', '\u0244'), + ('\u028a', '\u01b1'), ('\u028b', '\u01b2'), + ('\u028c', '\u0245'), ('\u0292', '\u01b7'), + ('\u0371', '\u0370'), ('\u0373', '\u0372'), + ('\u0377', '\u0376'), ('\u037b', '\u03fd'), + ('\u037c', '\u03fe'), ('\u037d', '\u03ff'), + ('\u03ac', '\u0386'), ('\u03ad', '\u0388'), + ('\u03ae', '\u0389'), ('\u03af', '\u038a'), + ('\u03b1', '\u0391'), ('\u03b2', '\u0392'), + ('\u03b3', '\u0393'), ('\u03b4', '\u0394'), + ('\u03b5', '\u0395'), ('\u03b6', '\u0396'), + ('\u03b7', '\u0397'), ('\u03b8', '\u0398'), + ('\u03b9', '\u0399'), ('\u03ba', '\u039a'), + ('\u03bb', '\u039b'), ('\u03bc', '\u039c'), + ('\u03bd', '\u039d'), ('\u03be', '\u039e'), + ('\u03bf', '\u039f'), ('\u03c0', '\u03a0'), + ('\u03c1', '\u03a1'), ('\u03c2', '\u03a3'), + ('\u03c3', '\u03a3'), ('\u03c4', '\u03a4'), + ('\u03c5', '\u03a5'), ('\u03c6', '\u03a6'), + ('\u03c7', '\u03a7'), ('\u03c8', '\u03a8'), + ('\u03c9', '\u03a9'), ('\u03ca', '\u03aa'), + ('\u03cb', '\u03ab'), ('\u03cc', '\u038c'), + ('\u03cd', '\u038e'), ('\u03ce', '\u038f'), + ('\u03d0', '\u0392'), ('\u03d1', '\u0398'), + ('\u03d5', '\u03a6'), ('\u03d6', '\u03a0'), + ('\u03d7', '\u03cf'), ('\u03d9', '\u03d8'), + ('\u03db', '\u03da'), ('\u03dd', '\u03dc'), + ('\u03df', '\u03de'), ('\u03e1', '\u03e0'), + ('\u03e3', '\u03e2'), ('\u03e5', '\u03e4'), + ('\u03e7', '\u03e6'), ('\u03e9', '\u03e8'), + ('\u03eb', '\u03ea'), ('\u03ed', '\u03ec'), + ('\u03ef', '\u03ee'), ('\u03f0', '\u039a'), + ('\u03f1', '\u03a1'), ('\u03f2', '\u03f9'), + ('\u03f5', '\u0395'), ('\u03f8', '\u03f7'), + ('\u03fb', '\u03fa'), ('\u0430', '\u0410'), + ('\u0431', '\u0411'), ('\u0432', '\u0412'), + ('\u0433', '\u0413'), ('\u0434', '\u0414'), + ('\u0435', '\u0415'), ('\u0436', '\u0416'), + ('\u0437', '\u0417'), ('\u0438', '\u0418'), + ('\u0439', '\u0419'), ('\u043a', '\u041a'), + ('\u043b', '\u041b'), ('\u043c', '\u041c'), + ('\u043d', '\u041d'), ('\u043e', '\u041e'), + ('\u043f', '\u041f'), ('\u0440', '\u0420'), + ('\u0441', '\u0421'), ('\u0442', '\u0422'), + ('\u0443', '\u0423'), ('\u0444', '\u0424'), + ('\u0445', '\u0425'), ('\u0446', '\u0426'), + ('\u0447', '\u0427'), ('\u0448', '\u0428'), + ('\u0449', '\u0429'), ('\u044a', '\u042a'), + ('\u044b', '\u042b'), ('\u044c', '\u042c'), + ('\u044d', '\u042d'), ('\u044e', '\u042e'), + ('\u044f', '\u042f'), ('\u0450', '\u0400'), + ('\u0451', '\u0401'), ('\u0452', '\u0402'), + ('\u0453', '\u0403'), ('\u0454', '\u0404'), + ('\u0455', '\u0405'), ('\u0456', '\u0406'), + ('\u0457', '\u0407'), ('\u0458', '\u0408'), + ('\u0459', '\u0409'), ('\u045a', '\u040a'), + ('\u045b', '\u040b'), ('\u045c', '\u040c'), + ('\u045d', '\u040d'), ('\u045e', '\u040e'), + ('\u045f', '\u040f'), ('\u0461', '\u0460'), + ('\u0463', '\u0462'), ('\u0465', '\u0464'), + ('\u0467', '\u0466'), ('\u0469', '\u0468'), + ('\u046b', '\u046a'), ('\u046d', '\u046c'), + ('\u046f', '\u046e'), ('\u0471', '\u0470'), + ('\u0473', '\u0472'), ('\u0475', '\u0474'), + ('\u0477', '\u0476'), ('\u0479', '\u0478'), + ('\u047b', '\u047a'), ('\u047d', '\u047c'), + ('\u047f', '\u047e'), ('\u0481', '\u0480'), + ('\u048b', '\u048a'), ('\u048d', '\u048c'), + ('\u048f', '\u048e'), ('\u0491', '\u0490'), + ('\u0493', '\u0492'), ('\u0495', '\u0494'), + ('\u0497', '\u0496'), ('\u0499', '\u0498'), + ('\u049b', '\u049a'), ('\u049d', '\u049c'), + ('\u049f', '\u049e'), ('\u04a1', '\u04a0'), + ('\u04a3', '\u04a2'), ('\u04a5', '\u04a4'), + ('\u04a7', '\u04a6'), ('\u04a9', '\u04a8'), + ('\u04ab', '\u04aa'), ('\u04ad', '\u04ac'), + ('\u04af', '\u04ae'), ('\u04b1', '\u04b0'), + ('\u04b3', '\u04b2'), ('\u04b5', '\u04b4'), + ('\u04b7', '\u04b6'), ('\u04b9', '\u04b8'), + ('\u04bb', '\u04ba'), ('\u04bd', '\u04bc'), + ('\u04bf', '\u04be'), ('\u04c2', '\u04c1'), + ('\u04c4', '\u04c3'), ('\u04c6', '\u04c5'), + ('\u04c8', '\u04c7'), ('\u04ca', '\u04c9'), + ('\u04cc', '\u04cb'), ('\u04ce', '\u04cd'), + ('\u04cf', '\u04c0'), ('\u04d1', '\u04d0'), + ('\u04d3', '\u04d2'), ('\u04d5', '\u04d4'), + ('\u04d7', '\u04d6'), ('\u04d9', '\u04d8'), + ('\u04db', '\u04da'), ('\u04dd', '\u04dc'), + ('\u04df', '\u04de'), ('\u04e1', '\u04e0'), + ('\u04e3', '\u04e2'), ('\u04e5', '\u04e4'), + ('\u04e7', '\u04e6'), ('\u04e9', '\u04e8'), + ('\u04eb', '\u04ea'), ('\u04ed', '\u04ec'), + ('\u04ef', '\u04ee'), ('\u04f1', '\u04f0'), + ('\u04f3', '\u04f2'), ('\u04f5', '\u04f4'), + ('\u04f7', '\u04f6'), ('\u04f9', '\u04f8'), + ('\u04fb', '\u04fa'), ('\u04fd', '\u04fc'), + ('\u04ff', '\u04fe'), ('\u0501', '\u0500'), + ('\u0503', '\u0502'), ('\u0505', '\u0504'), + ('\u0507', '\u0506'), ('\u0509', '\u0508'), + ('\u050b', '\u050a'), ('\u050d', '\u050c'), + ('\u050f', '\u050e'), ('\u0511', '\u0510'), + ('\u0513', '\u0512'), ('\u0515', '\u0514'), + ('\u0517', '\u0516'), ('\u0519', '\u0518'), + ('\u051b', '\u051a'), ('\u051d', '\u051c'), + ('\u051f', '\u051e'), ('\u0521', '\u0520'), + ('\u0523', '\u0522'), ('\u0525', '\u0524'), + ('\u0527', '\u0526'), ('\u0561', '\u0531'), + ('\u0562', '\u0532'), ('\u0563', '\u0533'), + ('\u0564', '\u0534'), ('\u0565', '\u0535'), + ('\u0566', '\u0536'), ('\u0567', '\u0537'), + ('\u0568', '\u0538'), ('\u0569', '\u0539'), + ('\u056a', '\u053a'), ('\u056b', '\u053b'), + ('\u056c', '\u053c'), ('\u056d', '\u053d'), + ('\u056e', '\u053e'), ('\u056f', '\u053f'), + ('\u0570', '\u0540'), ('\u0571', '\u0541'), + ('\u0572', '\u0542'), ('\u0573', '\u0543'), + ('\u0574', '\u0544'), ('\u0575', '\u0545'), + ('\u0576', '\u0546'), ('\u0577', '\u0547'), + ('\u0578', '\u0548'), ('\u0579', '\u0549'), + ('\u057a', '\u054a'), ('\u057b', '\u054b'), + ('\u057c', '\u054c'), ('\u057d', '\u054d'), + ('\u057e', '\u054e'), ('\u057f', '\u054f'), + ('\u0580', '\u0550'), ('\u0581', '\u0551'), + ('\u0582', '\u0552'), ('\u0583', '\u0553'), + ('\u0584', '\u0554'), ('\u0585', '\u0555'), + ('\u0586', '\u0556'), ('\u1d79', '\ua77d'), + ('\u1d7d', '\u2c63'), ('\u1e01', '\u1e00'), + ('\u1e03', '\u1e02'), ('\u1e05', '\u1e04'), + ('\u1e07', '\u1e06'), ('\u1e09', '\u1e08'), + ('\u1e0b', '\u1e0a'), ('\u1e0d', '\u1e0c'), + ('\u1e0f', '\u1e0e'), ('\u1e11', '\u1e10'), + ('\u1e13', '\u1e12'), ('\u1e15', '\u1e14'), + ('\u1e17', '\u1e16'), ('\u1e19', '\u1e18'), + ('\u1e1b', '\u1e1a'), ('\u1e1d', '\u1e1c'), + ('\u1e1f', '\u1e1e'), ('\u1e21', '\u1e20'), + ('\u1e23', '\u1e22'), ('\u1e25', '\u1e24'), + ('\u1e27', '\u1e26'), ('\u1e29', '\u1e28'), + ('\u1e2b', '\u1e2a'), ('\u1e2d', '\u1e2c'), + ('\u1e2f', '\u1e2e'), ('\u1e31', '\u1e30'), + ('\u1e33', '\u1e32'), ('\u1e35', '\u1e34'), + ('\u1e37', '\u1e36'), ('\u1e39', '\u1e38'), + ('\u1e3b', '\u1e3a'), ('\u1e3d', '\u1e3c'), + ('\u1e3f', '\u1e3e'), ('\u1e41', '\u1e40'), + ('\u1e43', '\u1e42'), ('\u1e45', '\u1e44'), + ('\u1e47', '\u1e46'), ('\u1e49', '\u1e48'), + ('\u1e4b', '\u1e4a'), ('\u1e4d', '\u1e4c'), + ('\u1e4f', '\u1e4e'), ('\u1e51', '\u1e50'), + ('\u1e53', '\u1e52'), ('\u1e55', '\u1e54'), + ('\u1e57', '\u1e56'), ('\u1e59', '\u1e58'), + ('\u1e5b', '\u1e5a'), ('\u1e5d', '\u1e5c'), + ('\u1e5f', '\u1e5e'), ('\u1e61', '\u1e60'), + ('\u1e63', '\u1e62'), ('\u1e65', '\u1e64'), + ('\u1e67', '\u1e66'), ('\u1e69', '\u1e68'), + ('\u1e6b', '\u1e6a'), ('\u1e6d', '\u1e6c'), + ('\u1e6f', '\u1e6e'), ('\u1e71', '\u1e70'), + ('\u1e73', '\u1e72'), ('\u1e75', '\u1e74'), + ('\u1e77', '\u1e76'), ('\u1e79', '\u1e78'), + ('\u1e7b', '\u1e7a'), ('\u1e7d', '\u1e7c'), + ('\u1e7f', '\u1e7e'), ('\u1e81', '\u1e80'), + ('\u1e83', '\u1e82'), ('\u1e85', '\u1e84'), + ('\u1e87', '\u1e86'), ('\u1e89', '\u1e88'), + ('\u1e8b', '\u1e8a'), ('\u1e8d', '\u1e8c'), + ('\u1e8f', '\u1e8e'), ('\u1e91', '\u1e90'), + ('\u1e93', '\u1e92'), ('\u1e95', '\u1e94'), + ('\u1e9b', '\u1e60'), ('\u1ea1', '\u1ea0'), + ('\u1ea3', '\u1ea2'), ('\u1ea5', '\u1ea4'), + ('\u1ea7', '\u1ea6'), ('\u1ea9', '\u1ea8'), + ('\u1eab', '\u1eaa'), ('\u1ead', '\u1eac'), + ('\u1eaf', '\u1eae'), ('\u1eb1', '\u1eb0'), + ('\u1eb3', '\u1eb2'), ('\u1eb5', '\u1eb4'), + ('\u1eb7', '\u1eb6'), ('\u1eb9', '\u1eb8'), + ('\u1ebb', '\u1eba'), ('\u1ebd', '\u1ebc'), + ('\u1ebf', '\u1ebe'), ('\u1ec1', '\u1ec0'), + ('\u1ec3', '\u1ec2'), ('\u1ec5', '\u1ec4'), + ('\u1ec7', '\u1ec6'), ('\u1ec9', '\u1ec8'), + ('\u1ecb', '\u1eca'), ('\u1ecd', '\u1ecc'), + ('\u1ecf', '\u1ece'), ('\u1ed1', '\u1ed0'), + ('\u1ed3', '\u1ed2'), ('\u1ed5', '\u1ed4'), + ('\u1ed7', '\u1ed6'), ('\u1ed9', '\u1ed8'), + ('\u1edb', '\u1eda'), ('\u1edd', '\u1edc'), + ('\u1edf', '\u1ede'), ('\u1ee1', '\u1ee0'), + ('\u1ee3', '\u1ee2'), ('\u1ee5', '\u1ee4'), + ('\u1ee7', '\u1ee6'), ('\u1ee9', '\u1ee8'), + ('\u1eeb', '\u1eea'), ('\u1eed', '\u1eec'), + ('\u1eef', '\u1eee'), ('\u1ef1', '\u1ef0'), + ('\u1ef3', '\u1ef2'), ('\u1ef5', '\u1ef4'), + ('\u1ef7', '\u1ef6'), ('\u1ef9', '\u1ef8'), + ('\u1efb', '\u1efa'), ('\u1efd', '\u1efc'), + ('\u1eff', '\u1efe'), ('\u1f00', '\u1f08'), + ('\u1f01', '\u1f09'), ('\u1f02', '\u1f0a'), + ('\u1f03', '\u1f0b'), ('\u1f04', '\u1f0c'), + ('\u1f05', '\u1f0d'), ('\u1f06', '\u1f0e'), + ('\u1f07', '\u1f0f'), ('\u1f10', '\u1f18'), + ('\u1f11', '\u1f19'), ('\u1f12', '\u1f1a'), + ('\u1f13', '\u1f1b'), ('\u1f14', '\u1f1c'), + ('\u1f15', '\u1f1d'), ('\u1f20', '\u1f28'), + ('\u1f21', '\u1f29'), ('\u1f22', '\u1f2a'), + ('\u1f23', '\u1f2b'), ('\u1f24', '\u1f2c'), + ('\u1f25', '\u1f2d'), ('\u1f26', '\u1f2e'), + ('\u1f27', '\u1f2f'), ('\u1f30', '\u1f38'), + ('\u1f31', '\u1f39'), ('\u1f32', '\u1f3a'), + ('\u1f33', '\u1f3b'), ('\u1f34', '\u1f3c'), + ('\u1f35', '\u1f3d'), ('\u1f36', '\u1f3e'), + ('\u1f37', '\u1f3f'), ('\u1f40', '\u1f48'), + ('\u1f41', '\u1f49'), ('\u1f42', '\u1f4a'), + ('\u1f43', '\u1f4b'), ('\u1f44', '\u1f4c'), + ('\u1f45', '\u1f4d'), ('\u1f51', '\u1f59'), + ('\u1f53', '\u1f5b'), ('\u1f55', '\u1f5d'), + ('\u1f57', '\u1f5f'), ('\u1f60', '\u1f68'), + ('\u1f61', '\u1f69'), ('\u1f62', '\u1f6a'), + ('\u1f63', '\u1f6b'), ('\u1f64', '\u1f6c'), + ('\u1f65', '\u1f6d'), ('\u1f66', '\u1f6e'), + ('\u1f67', '\u1f6f'), ('\u1f70', '\u1fba'), + ('\u1f71', '\u1fbb'), ('\u1f72', '\u1fc8'), + ('\u1f73', '\u1fc9'), ('\u1f74', '\u1fca'), + ('\u1f75', '\u1fcb'), ('\u1f76', '\u1fda'), + ('\u1f77', '\u1fdb'), ('\u1f78', '\u1ff8'), + ('\u1f79', '\u1ff9'), ('\u1f7a', '\u1fea'), + ('\u1f7b', '\u1feb'), ('\u1f7c', '\u1ffa'), + ('\u1f7d', '\u1ffb'), ('\u1f80', '\u1f88'), + ('\u1f81', '\u1f89'), ('\u1f82', '\u1f8a'), + ('\u1f83', '\u1f8b'), ('\u1f84', '\u1f8c'), + ('\u1f85', '\u1f8d'), ('\u1f86', '\u1f8e'), + ('\u1f87', '\u1f8f'), ('\u1f90', '\u1f98'), + ('\u1f91', '\u1f99'), ('\u1f92', '\u1f9a'), + ('\u1f93', '\u1f9b'), ('\u1f94', '\u1f9c'), + ('\u1f95', '\u1f9d'), ('\u1f96', '\u1f9e'), + ('\u1f97', '\u1f9f'), ('\u1fa0', '\u1fa8'), + ('\u1fa1', '\u1fa9'), ('\u1fa2', '\u1faa'), + ('\u1fa3', '\u1fab'), ('\u1fa4', '\u1fac'), + ('\u1fa5', '\u1fad'), ('\u1fa6', '\u1fae'), + ('\u1fa7', '\u1faf'), ('\u1fb0', '\u1fb8'), + ('\u1fb1', '\u1fb9'), ('\u1fb3', '\u1fbc'), + ('\u1fbe', '\u0399'), ('\u1fc3', '\u1fcc'), + ('\u1fd0', '\u1fd8'), ('\u1fd1', '\u1fd9'), + ('\u1fe0', '\u1fe8'), ('\u1fe1', '\u1fe9'), + ('\u1fe5', '\u1fec'), ('\u1ff3', '\u1ffc'), + ('\u214e', '\u2132'), ('\u2184', '\u2183'), + ('\u2c30', '\u2c00'), ('\u2c31', '\u2c01'), + ('\u2c32', '\u2c02'), ('\u2c33', '\u2c03'), + ('\u2c34', '\u2c04'), ('\u2c35', '\u2c05'), + ('\u2c36', '\u2c06'), ('\u2c37', '\u2c07'), + ('\u2c38', '\u2c08'), ('\u2c39', '\u2c09'), + ('\u2c3a', '\u2c0a'), ('\u2c3b', '\u2c0b'), + ('\u2c3c', '\u2c0c'), ('\u2c3d', '\u2c0d'), + ('\u2c3e', '\u2c0e'), ('\u2c3f', '\u2c0f'), + ('\u2c40', '\u2c10'), ('\u2c41', '\u2c11'), + ('\u2c42', '\u2c12'), ('\u2c43', '\u2c13'), + ('\u2c44', '\u2c14'), ('\u2c45', '\u2c15'), + ('\u2c46', '\u2c16'), ('\u2c47', '\u2c17'), + ('\u2c48', '\u2c18'), ('\u2c49', '\u2c19'), + ('\u2c4a', '\u2c1a'), ('\u2c4b', '\u2c1b'), + ('\u2c4c', '\u2c1c'), ('\u2c4d', '\u2c1d'), + ('\u2c4e', '\u2c1e'), ('\u2c4f', '\u2c1f'), + ('\u2c50', '\u2c20'), ('\u2c51', '\u2c21'), + ('\u2c52', '\u2c22'), ('\u2c53', '\u2c23'), + ('\u2c54', '\u2c24'), ('\u2c55', '\u2c25'), + ('\u2c56', '\u2c26'), ('\u2c57', '\u2c27'), + ('\u2c58', '\u2c28'), ('\u2c59', '\u2c29'), + ('\u2c5a', '\u2c2a'), ('\u2c5b', '\u2c2b'), + ('\u2c5c', '\u2c2c'), ('\u2c5d', '\u2c2d'), + ('\u2c5e', '\u2c2e'), ('\u2c61', '\u2c60'), + ('\u2c65', '\u023a'), ('\u2c66', '\u023e'), + ('\u2c68', '\u2c67'), ('\u2c6a', '\u2c69'), + ('\u2c6c', '\u2c6b'), ('\u2c73', '\u2c72'), + ('\u2c76', '\u2c75'), ('\u2c81', '\u2c80'), + ('\u2c83', '\u2c82'), ('\u2c85', '\u2c84'), + ('\u2c87', '\u2c86'), ('\u2c89', '\u2c88'), + ('\u2c8b', '\u2c8a'), ('\u2c8d', '\u2c8c'), + ('\u2c8f', '\u2c8e'), ('\u2c91', '\u2c90'), + ('\u2c93', '\u2c92'), ('\u2c95', '\u2c94'), + ('\u2c97', '\u2c96'), ('\u2c99', '\u2c98'), + ('\u2c9b', '\u2c9a'), ('\u2c9d', '\u2c9c'), + ('\u2c9f', '\u2c9e'), ('\u2ca1', '\u2ca0'), + ('\u2ca3', '\u2ca2'), ('\u2ca5', '\u2ca4'), + ('\u2ca7', '\u2ca6'), ('\u2ca9', '\u2ca8'), + ('\u2cab', '\u2caa'), ('\u2cad', '\u2cac'), + ('\u2caf', '\u2cae'), ('\u2cb1', '\u2cb0'), + ('\u2cb3', '\u2cb2'), ('\u2cb5', '\u2cb4'), + ('\u2cb7', '\u2cb6'), ('\u2cb9', '\u2cb8'), + ('\u2cbb', '\u2cba'), ('\u2cbd', '\u2cbc'), + ('\u2cbf', '\u2cbe'), ('\u2cc1', '\u2cc0'), + ('\u2cc3', '\u2cc2'), ('\u2cc5', '\u2cc4'), + ('\u2cc7', '\u2cc6'), ('\u2cc9', '\u2cc8'), + ('\u2ccb', '\u2cca'), ('\u2ccd', '\u2ccc'), + ('\u2ccf', '\u2cce'), ('\u2cd1', '\u2cd0'), + ('\u2cd3', '\u2cd2'), ('\u2cd5', '\u2cd4'), + ('\u2cd7', '\u2cd6'), ('\u2cd9', '\u2cd8'), + ('\u2cdb', '\u2cda'), ('\u2cdd', '\u2cdc'), + ('\u2cdf', '\u2cde'), ('\u2ce1', '\u2ce0'), + ('\u2ce3', '\u2ce2'), ('\u2cec', '\u2ceb'), + ('\u2cee', '\u2ced'), ('\u2cf3', '\u2cf2'), + ('\u2d00', '\u10a0'), ('\u2d01', '\u10a1'), + ('\u2d02', '\u10a2'), ('\u2d03', '\u10a3'), + ('\u2d04', '\u10a4'), ('\u2d05', '\u10a5'), + ('\u2d06', '\u10a6'), ('\u2d07', '\u10a7'), + ('\u2d08', '\u10a8'), ('\u2d09', '\u10a9'), + ('\u2d0a', '\u10aa'), ('\u2d0b', '\u10ab'), + ('\u2d0c', '\u10ac'), ('\u2d0d', '\u10ad'), + ('\u2d0e', '\u10ae'), ('\u2d0f', '\u10af'), + ('\u2d10', '\u10b0'), ('\u2d11', '\u10b1'), + ('\u2d12', '\u10b2'), ('\u2d13', '\u10b3'), + ('\u2d14', '\u10b4'), ('\u2d15', '\u10b5'), + ('\u2d16', '\u10b6'), ('\u2d17', '\u10b7'), + ('\u2d18', '\u10b8'), ('\u2d19', '\u10b9'), + ('\u2d1a', '\u10ba'), ('\u2d1b', '\u10bb'), + ('\u2d1c', '\u10bc'), ('\u2d1d', '\u10bd'), + ('\u2d1e', '\u10be'), ('\u2d1f', '\u10bf'), + ('\u2d20', '\u10c0'), ('\u2d21', '\u10c1'), + ('\u2d22', '\u10c2'), ('\u2d23', '\u10c3'), + ('\u2d24', '\u10c4'), ('\u2d25', '\u10c5'), + ('\u2d27', '\u10c7'), ('\u2d2d', '\u10cd'), + ('\ua641', '\ua640'), ('\ua643', '\ua642'), + ('\ua645', '\ua644'), ('\ua647', '\ua646'), + ('\ua649', '\ua648'), ('\ua64b', '\ua64a'), + ('\ua64d', '\ua64c'), ('\ua64f', '\ua64e'), + ('\ua651', '\ua650'), ('\ua653', '\ua652'), + ('\ua655', '\ua654'), ('\ua657', '\ua656'), + ('\ua659', '\ua658'), ('\ua65b', '\ua65a'), + ('\ua65d', '\ua65c'), ('\ua65f', '\ua65e'), + ('\ua661', '\ua660'), ('\ua663', '\ua662'), + ('\ua665', '\ua664'), ('\ua667', '\ua666'), + ('\ua669', '\ua668'), ('\ua66b', '\ua66a'), + ('\ua66d', '\ua66c'), ('\ua681', '\ua680'), + ('\ua683', '\ua682'), ('\ua685', '\ua684'), + ('\ua687', '\ua686'), ('\ua689', '\ua688'), + ('\ua68b', '\ua68a'), ('\ua68d', '\ua68c'), + ('\ua68f', '\ua68e'), ('\ua691', '\ua690'), + ('\ua693', '\ua692'), ('\ua695', '\ua694'), + ('\ua697', '\ua696'), ('\ua723', '\ua722'), + ('\ua725', '\ua724'), ('\ua727', '\ua726'), + ('\ua729', '\ua728'), ('\ua72b', '\ua72a'), + ('\ua72d', '\ua72c'), ('\ua72f', '\ua72e'), + ('\ua733', '\ua732'), ('\ua735', '\ua734'), + ('\ua737', '\ua736'), ('\ua739', '\ua738'), + ('\ua73b', '\ua73a'), ('\ua73d', '\ua73c'), + ('\ua73f', '\ua73e'), ('\ua741', '\ua740'), + ('\ua743', '\ua742'), ('\ua745', '\ua744'), + ('\ua747', '\ua746'), ('\ua749', '\ua748'), + ('\ua74b', '\ua74a'), ('\ua74d', '\ua74c'), + ('\ua74f', '\ua74e'), ('\ua751', '\ua750'), + ('\ua753', '\ua752'), ('\ua755', '\ua754'), + ('\ua757', '\ua756'), ('\ua759', '\ua758'), + ('\ua75b', '\ua75a'), ('\ua75d', '\ua75c'), + ('\ua75f', '\ua75e'), ('\ua761', '\ua760'), + ('\ua763', '\ua762'), ('\ua765', '\ua764'), + ('\ua767', '\ua766'), ('\ua769', '\ua768'), + ('\ua76b', '\ua76a'), ('\ua76d', '\ua76c'), + ('\ua76f', '\ua76e'), ('\ua77a', '\ua779'), + ('\ua77c', '\ua77b'), ('\ua77f', '\ua77e'), + ('\ua781', '\ua780'), ('\ua783', '\ua782'), + ('\ua785', '\ua784'), ('\ua787', '\ua786'), + ('\ua78c', '\ua78b'), ('\ua791', '\ua790'), + ('\ua793', '\ua792'), ('\ua7a1', '\ua7a0'), + ('\ua7a3', '\ua7a2'), ('\ua7a5', '\ua7a4'), + ('\ua7a7', '\ua7a6'), ('\ua7a9', '\ua7a8'), + ('\uff41', '\uff21'), ('\uff42', '\uff22'), + ('\uff43', '\uff23'), ('\uff44', '\uff24'), + ('\uff45', '\uff25'), ('\uff46', '\uff26'), + ('\uff47', '\uff27'), ('\uff48', '\uff28'), + ('\uff49', '\uff29'), ('\uff4a', '\uff2a'), + ('\uff4b', '\uff2b'), ('\uff4c', '\uff2c'), + ('\uff4d', '\uff2d'), ('\uff4e', '\uff2e'), + ('\uff4f', '\uff2f'), ('\uff50', '\uff30'), + ('\uff51', '\uff31'), ('\uff52', '\uff32'), + ('\uff53', '\uff33'), ('\uff54', '\uff34'), + ('\uff55', '\uff35'), ('\uff56', '\uff36'), + ('\uff57', '\uff37'), ('\uff58', '\uff38'), + ('\uff59', '\uff39'), ('\uff5a', '\uff3a'), + ('\U00010428', '\U00010400'), ('\U00010429', '\U00010401'), + ('\U0001042a', '\U00010402'), ('\U0001042b', '\U00010403'), + ('\U0001042c', '\U00010404'), ('\U0001042d', '\U00010405'), + ('\U0001042e', '\U00010406'), ('\U0001042f', '\U00010407'), + ('\U00010430', '\U00010408'), ('\U00010431', '\U00010409'), + ('\U00010432', '\U0001040a'), ('\U00010433', '\U0001040b'), + ('\U00010434', '\U0001040c'), ('\U00010435', '\U0001040d'), + ('\U00010436', '\U0001040e'), ('\U00010437', '\U0001040f'), + ('\U00010438', '\U00010410'), ('\U00010439', '\U00010411'), + ('\U0001043a', '\U00010412'), ('\U0001043b', '\U00010413'), + ('\U0001043c', '\U00010414'), ('\U0001043d', '\U00010415'), + ('\U0001043e', '\U00010416'), ('\U0001043f', '\U00010417'), + ('\U00010440', '\U00010418'), ('\U00010441', '\U00010419'), + ('\U00010442', '\U0001041a'), ('\U00010443', '\U0001041b'), + ('\U00010444', '\U0001041c'), ('\U00010445', '\U0001041d'), + ('\U00010446', '\U0001041e'), ('\U00010447', '\U0001041f'), + ('\U00010448', '\U00010420'), ('\U00010449', '\U00010421'), + ('\U0001044a', '\U00010422'), ('\U0001044b', '\U00010423'), + ('\U0001044c', '\U00010424'), ('\U0001044d', '\U00010425'), + ('\U0001044e', '\U00010426'), ('\U0001044f', '\U00010427') + ]; + +}