/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
LanguagePlugins/SPython/SPythonParserKrylovMovchan/SPythonLexer.cs
2 798 строк
138 KB
AlexanderZemlyak
Исправления в Intellisense SPython + падения компилятора из-за неточности в spython_syntax_tree_visitor (#3333)
12 окт 2025, 20:26
Не верифицирован
12 окт 2025, 20:26
0c4c029
Код
Авторство
О чём код?
// // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 // Machine: DESKTOP-V3E9T2U // DateTime: 03.09.2025 11:37:43 // UserName: alex // GPLEX input file <SPythonLexer.lex> // GPLEX frame file <embedded resource> // // Option settings: unicode, parser, minimize // Option settings: classes, compressMap, compressNext, persistBuffer, embedbuffers // Fallback code page: Target machine default // // // Experimental embedded frame // Version 1.1.3 of 18-April-2010 // // #define BACKUP #define PERSIST using System; using System.IO; using System.Text; using System.Globalization; using System.Collections.Generic; using System.Runtime.Serialization; using System.Diagnostics.CodeAnalysis; using SPythonParser; using QUT.Gppg; using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.ParserTools; using SPythonParserYacc; using SPythonParser; namespace SPythonParser { /// <summary> /// Summary Canonical example of GPLEX automaton /// </summary> #if STANDALONE // // These are the dummy declarations for stand-alone GPLEX applications // normally these declarations would come from the parser. // If you declare /noparser, or %option noparser then you get this. // public enum Tokens { EOF = 0, maxParseToken = int.MaxValue // must have at least these two, values are almost arbitrary } public abstract class ScanBase { [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yylex")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yylex")] public abstract int yylex(); [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yywrap")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yywrap")] protected virtual bool yywrap() { return true; } #if BABEL protected abstract int CurrentSc { get; set; } // EolState is the 32-bit of state data persisted at // the end of each line for Visual Studio colorization. // The default is to return CurrentSc. You must override // this if you want more complicated behavior. public virtual int EolState { get { return CurrentSc; } set { CurrentSc = value; } } } public interface IColorScan { void SetSource(string source, int offset); int GetNext(ref int state, out int start, out int end); #endif // BABEL } #endif // STANDALONE // If the compiler can't find the scanner base class maybe you // need to run GPPG with the /gplex option, or GPLEX with /noparser #if BABEL public sealed partial class Scanner : ScanBase, IColorScan { private ScanBuff buffer; int currentScOrd; // start condition ordinal protected override int CurrentSc { // The current start state is a property // to try to avoid the user error of setting // scState but forgetting to update the FSA // start state "currentStart" // get { return currentScOrd; } // i.e. return YY_START; set { currentScOrd = value; // i.e. BEGIN(value); currentStart = startState[value]; } } #else // BABEL public sealed partial class Scanner : ScanBase { private ScanBuff buffer; int currentScOrd; // start condition ordinal #endif // BABEL /// <summary> /// The input buffer for this scanner. /// </summary> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public ScanBuff Buffer { get { return buffer; } } private static int GetMaxParseToken() { System.Reflection.FieldInfo f = typeof(Tokens).GetField("maxParseToken"); return (f == null ? int.MaxValue : (int)f.GetValue(null)); } static int parserMax = GetMaxParseToken(); enum Result {accept, noMatch, contextFound}; const int maxAccept = 65; const int initial = 66; const int eofNum = 0; const int goStart = -1; const int INITIAL = 0; #region user code private SPythonKeywords keywords; public SPythonParserTools parserTools; public List<string> Defines = new List<string>(); private int last_line_needed_colon = -1; private LexLocation currentLexLocation; private LexLocation prevLexLocation = new LexLocation(-1, -1, -1, -1, ""); public Scanner(string text, SPythonParserTools parserTools, PascalABCCompiler.Parsers.BaseKeywords keywords, List<string> defines = null) { this.parserTools = parserTools; this.keywords = (SPythonKeywords)keywords; if (defines != null) this.Defines.AddRange(defines); SetSource(text, 0); } #endregion user code int state; int currentStart = startState[0]; int code; // last code read int cCol; // column number of code int lNum; // current line number // // The following instance variables are used, among other // things, for constructing the yylloc location objects. // int tokPos; // buffer position at start of token int tokCol; // zero-based column number at start of token int tokLin; // line number at start of token int tokEPos; // buffer position at end of token int tokECol; // column number at end of token int tokELin; // line number at end of token string tokTxt; // lazily constructed text of token #if STACK private Stack<int> scStack = new Stack<int>(); #endif // STACK #region ScannerTables struct Table { public int min; public int rng; public int dflt; public sbyte[] nxt; public Table(int m, int x, int d, sbyte[] n) { min = m; rng = x; dflt = d; nxt = n; } }; static int[] startState = new int[] {66, 0}; #region TwoLevelCharacterMap // // There are 49 equivalence classes // There are 256 character sequence regions // There are 47 tables, 12032 entries // static sbyte[] mLo0 = new sbyte[256] { /* '\0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 8, 48, 48, /* '\x10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\x20' */ 8, 21, 10, 26, 47, 18, 23, 7, 34, 35, 17, 15, 32, 16, 6, 13, /* '0' */ 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 29, 19, 14, 20, 48, /* '@' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* 'P' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 30, 9, 31, 25, 2, /* '`' */ 48, 44, 4, 12, 12, 36, 11, 12, 12, 5, 12, 12, 12, 45, 42, 41, /* 'p' */ 38, 12, 39, 40, 43, 12, 12, 12, 37, 46, 12, 27, 24, 28, 22, 48, /* '\x80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\x90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\xA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 48, 48, 48, 48, 48, /* '\xB0' */ 48, 48, 48, 48, 48, 12, 48, 48, 48, 48, 12, 48, 48, 48, 48, 48, /* '\xC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\xD0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\xE0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\xF0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo1 = new sbyte[256] { /* '\u0100' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0110' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0120' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0130' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0140' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0150' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0160' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0170' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0180' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0190' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u01F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo2 = new sbyte[256] { /* '\u0200' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0210' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0220' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0230' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0240' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0250' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0260' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0270' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0280' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0290' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u02A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u02B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u02C0' */ 12, 12, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u02D0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u02E0' */ 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 48, /* '\u02F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo3 = new sbyte[256] { /* '\u0300' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0310' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0320' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0330' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0340' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0350' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 48, 48, /* '\u0380' */ 48, 48, 48, 48, 48, 48, 12, 48, 12, 12, 12, 48, 12, 48, 12, 12, /* '\u0390' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u03A0' */ 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u03B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u03C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u03D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u03E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u03F0' */ 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo4 = new sbyte[256] { /* '\u0400' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0410' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0420' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0430' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0440' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0450' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0460' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0470' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0480' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, /* '\u0490' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u04F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo5 = new sbyte[256] { /* '\u0500' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0510' */ 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0520' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0530' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0540' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0550' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 12, 48, 48, 48, 48, 48, 48, /* '\u0560' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0570' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0580' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0590' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u05A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u05B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u05C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u05D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u05E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u05F0' */ 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo6 = new sbyte[256] { /* '\u0600' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0610' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0620' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0630' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u0640' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u0650' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0660' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, /* '\u0670' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0680' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0690' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u06A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u06B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u06C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u06D0' */ 12, 12, 12, 12, 48, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u06E0' */ 48, 48, 48, 48, 48, 12, 12, 48, 48, 48, 48, 48, 48, 48, 12, 12, /* '\u06F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 48, 48, 12 }; static sbyte[] mLo7 = new sbyte[256] { /* '\u0700' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0710' */ 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0720' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0730' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0740' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, /* '\u0750' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0760' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\u0770' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0780' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0790' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u07A0' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u07B0' */ 48, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u07C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, /* '\u07D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u07E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u07F0' */ 48, 48, 48, 48, 12, 12, 48, 48, 48, 48, 12, 48, 48, 48, 48, 48 }; static sbyte[] mLo8 = new sbyte[256] { /* '\u0800' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0810' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0820' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0830' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0840' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0850' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0860' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0870' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0880' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0890' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u08F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo9 = new sbyte[256] { /* '\u0900' */ 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0910' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0920' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0930' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 12, 48, 48, /* '\u0940' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0950' */ 12, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0960' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0970' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, /* '\u0980' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 12, /* '\u0990' */ 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u09A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u09B0' */ 12, 48, 12, 48, 48, 48, 12, 12, 12, 12, 48, 48, 48, 12, 48, 48, /* '\u09C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 48, /* '\u09D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 48, 12, /* '\u09E0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u09F0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo10 = new sbyte[256] { /* '\u0A00' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 12, /* '\u0A10' */ 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0A20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0A30' */ 12, 48, 12, 12, 48, 12, 12, 48, 12, 12, 48, 48, 48, 48, 48, 48, /* '\u0A40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0A50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 48, 12, 48, /* '\u0A60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0A70' */ 48, 48, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0A80' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, /* '\u0A90' */ 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0AA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0AB0' */ 12, 48, 12, 12, 48, 12, 12, 12, 12, 12, 48, 48, 48, 12, 48, 48, /* '\u0AC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0AD0' */ 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0AE0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0AF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo11 = new sbyte[256] { /* '\u0B00' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 12, /* '\u0B10' */ 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0B20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0B30' */ 12, 48, 12, 12, 48, 12, 12, 12, 12, 12, 48, 48, 48, 12, 48, 48, /* '\u0B40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0B50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 48, 12, /* '\u0B60' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0B70' */ 48, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0B80' */ 48, 48, 48, 12, 48, 12, 12, 12, 12, 12, 12, 48, 48, 48, 12, 12, /* '\u0B90' */ 12, 48, 12, 12, 12, 12, 48, 48, 48, 12, 12, 48, 12, 48, 12, 12, /* '\u0BA0' */ 48, 48, 48, 12, 12, 48, 48, 48, 12, 12, 12, 48, 48, 48, 12, 12, /* '\u0BB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\u0BC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0BD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0BE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0BF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo12 = new sbyte[256] { /* '\u0C00' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\u0C10' */ 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0C20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0C30' */ 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\u0C40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0C50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0C60' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0C70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0C80' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\u0C90' */ 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0CA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0CB0' */ 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 48, 48, 48, 12, 48, 48, /* '\u0CC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0CD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 48, /* '\u0CE0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0CF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo13 = new sbyte[256] { /* '\u0D00' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\u0D10' */ 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0D20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\u0D30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\u0D40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0D50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0D60' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0D70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0D80' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0D90' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 12, 12, 12, 12, 12, 12, /* '\u0DA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0DB0' */ 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, 48, /* '\u0DC0' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo14 = new sbyte[256] { /* '\u0E00' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0E10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0E20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0E30' */ 12, 48, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0E40' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0E50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0E60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0E70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0E80' */ 48, 12, 12, 48, 12, 48, 48, 12, 12, 48, 12, 48, 48, 12, 48, 48, /* '\u0E90' */ 48, 48, 48, 48, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, /* '\u0EA0' */ 48, 12, 12, 12, 48, 12, 48, 12, 48, 48, 12, 12, 48, 12, 12, 12, /* '\u0EB0' */ 12, 48, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 48, 48, /* '\u0EC0' */ 12, 12, 12, 12, 12, 48, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0ED0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 48, 48, /* '\u0EE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0EF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo15 = new sbyte[256] { /* '\u0F00' */ 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0F10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0F20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0F30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0F40' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, /* '\u0F50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u0F60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u0F70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0F80' */ 48, 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 48, 48, 48, 48, /* '\u0F90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u0FF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo16 = new sbyte[256] { /* '\u1000' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1010' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1020' */ 12, 12, 48, 12, 12, 12, 12, 12, 48, 12, 12, 48, 48, 48, 48, 48, /* '\u1030' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1040' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1050' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1070' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1080' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1090' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u10A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u10B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u10C0' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u10D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u10E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u10F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, 48, 48 }; static sbyte[] mLo17 = new sbyte[256] { /* '\u1100' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1110' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1120' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1130' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1140' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1150' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 12, /* '\u1160' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1170' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1180' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1190' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11A0' */ 12, 12, 12, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u11F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo18 = new sbyte[256] { /* '\u1200' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1210' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1220' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1230' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1240' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 48, 48, /* '\u1250' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, 12, 12, 12, 12, 48, 48, /* '\u1260' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1270' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1280' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 48, 48, /* '\u1290' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u12A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u12B0' */ 12, 48, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u12C0' */ 12, 48, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u12D0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u12E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u12F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo19 = new sbyte[256] { /* '\u1300' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1310' */ 12, 48, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1320' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1330' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1340' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1350' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u1360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1380' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1390' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u13A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u13B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u13C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u13D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u13E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u13F0' */ 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo20 = new sbyte[256] { /* '\u1400' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1410' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1420' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1430' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1440' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1450' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1460' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1470' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1480' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1490' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u14F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo22 = new sbyte[256] { /* '\u1600' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1610' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1620' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1630' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1640' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1650' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1660' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 12, /* '\u1670' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1680' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1690' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u16A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u16B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u16C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u16D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u16E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\u16F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo23 = new sbyte[256] { /* '\u1700' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\u1710' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1720' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1730' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1740' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1750' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1760' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\u1770' */ 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1780' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1790' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u17A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u17B0' */ 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u17C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u17D0' */ 48, 48, 48, 48, 48, 48, 48, 12, 48, 48, 48, 48, 12, 48, 48, 48, /* '\u17E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u17F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo24 = new sbyte[256] { /* '\u1800' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1810' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1820' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1830' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1840' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1850' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1860' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1870' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1880' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1890' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u18A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, /* '\u18B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u18C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u18D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u18E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u18F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo25 = new sbyte[256] { /* '\u1900' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1910' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\u1920' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1930' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1940' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1950' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1960' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\u1970' */ 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1980' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1990' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u19A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\u19B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u19C0' */ 48, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u19D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u19E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u19F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo26 = new sbyte[256] { /* '\u1A00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1A10' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1A90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1AF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo27 = new sbyte[256] { /* '\u1B00' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1B10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1B20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1B30' */ 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1B40' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, /* '\u1B50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1B60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1B70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1B80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1B90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1BF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo29 = new sbyte[256] { /* '\u1D00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1D90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1DA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1DB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1DC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u1DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo30 = new sbyte[256] { /* '\u1E00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1E90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, /* '\u1EA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1EB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1EC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1ED0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1EE0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1EF0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo31 = new sbyte[256] { /* '\u1F00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1F10' */ 12, 12, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, /* '\u1F20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1F30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1F40' */ 12, 12, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, /* '\u1F50' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, 12, 48, 12, 48, 12, /* '\u1F60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1F70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\u1F80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1F90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1FA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u1FB0' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, /* '\u1FC0' */ 48, 48, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\u1FD0' */ 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, /* '\u1FE0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\u1FF0' */ 48, 48, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48 }; static sbyte[] mLo32 = new sbyte[256] { /* '\u2000' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2010' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2020' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2030' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2040' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2050' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2070' */ 48, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, /* '\u2080' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2090' */ 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u20F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo33 = new sbyte[256] { /* '\u2100' */ 48, 48, 12, 48, 48, 48, 48, 12, 48, 48, 12, 12, 12, 12, 12, 12, /* '\u2110' */ 12, 12, 12, 12, 48, 12, 48, 48, 48, 12, 12, 12, 12, 12, 48, 48, /* '\u2120' */ 48, 48, 48, 48, 12, 48, 12, 48, 12, 48, 12, 12, 12, 12, 48, 12, /* '\u2130' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, /* '\u2140' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 48, 48, 48, 48, 12, 48, /* '\u2150' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2160' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2170' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2180' */ 48, 48, 48, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2190' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u21F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo44 = new sbyte[256] { /* '\u2C00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2C10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2C20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2C30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2C40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2C50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2C60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\u2C70' */ 48, 48, 48, 48, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2C80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2C90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2CA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2CB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2CC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2CD0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2CE0' */ 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2CF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo45 = new sbyte[256] { /* '\u2D00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D20' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2D30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D60' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 12, /* '\u2D70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2D80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u2D90' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2DA0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2DB0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2DC0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2DD0' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u2DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u2DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo48 = new sbyte[256] { /* '\u3000' */ 48, 48, 48, 48, 48, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u3010' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u3020' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u3030' */ 48, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 12, 12, 48, 48, 48, /* '\u3040' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3050' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3060' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3070' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3080' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3090' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 12, 12, 12, /* '\u30A0' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u30B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u30C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u30D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u30E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u30F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12 }; static sbyte[] mLo49 = new sbyte[256] { /* '\u3100' */ 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3110' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3120' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\u3130' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3140' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3150' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3160' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3170' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u3180' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\u3190' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u31A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u31B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u31C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u31D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u31E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u31F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo77 = new sbyte[256] { /* '\u4D00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4D90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4DA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u4DB0' */ 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u4DC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u4DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u4DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u4DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo159 = new sbyte[256] { /* '\u9F00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9F90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9FA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\u9FB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, /* '\u9FC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u9FD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u9FE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\u9FF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo164 = new sbyte[256] { /* '\uA400' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA410' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA420' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA430' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA440' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA450' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA460' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA470' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA480' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, /* '\uA490' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA4F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo167 = new sbyte[256] { /* '\uA700' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA710' */ 48, 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\uA720' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA730' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA740' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA750' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA760' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA770' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA780' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA790' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA7F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo168 = new sbyte[256] { /* '\uA800' */ 12, 12, 48, 12, 12, 12, 48, 12, 12, 12, 12, 48, 12, 12, 12, 12, /* '\uA810' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA820' */ 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA830' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA840' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA850' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA860' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uA870' */ 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA880' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA890' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uA8F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo215 = new sbyte[256] { /* '\uD700' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD710' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD720' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD730' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD740' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD750' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD760' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD770' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD780' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD790' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uD7A0' */ 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uD7B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uD7C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uD7D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uD7E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uD7F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo250 = new sbyte[256] { /* '\uFA00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\uFA30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA40' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\uFA70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFA90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFAA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFAB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFAC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFAD0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\uFAE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFAF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo251 = new sbyte[256] { /* '\uFB00' */ 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFB10' */ 48, 48, 48, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 12, 48, 12, /* '\uFB20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\uFB30' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 48, 12, 48, /* '\uFB40' */ 12, 12, 48, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFB50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFB60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFB70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFB80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFB90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFBA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFBB0' */ 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFBC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFBD0' */ 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFBE0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFBF0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mLo253 = new sbyte[256] { /* '\uFD00' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD10' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\uFD40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFD50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD60' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFD90' */ 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFDA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFDB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFDC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFDD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFDE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFDF0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48 }; static sbyte[] mLo254 = new sbyte[256] { /* '\uFE00' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFE70' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFE80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFE90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFEA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFEB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFEC0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFED0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFEE0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFEF0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48 }; static sbyte[] mLo255 = new sbyte[256] { /* '\uFF00' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFF10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFF20' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFF30' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\uFF40' */ 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFF50' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, /* '\uFF60' */ 48, 48, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFF70' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFF80' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFF90' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFFA0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\uFFB0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\uFFC0' */ 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, 12, 12, 12, 12, 12, 12, /* '\uFFD0' */ 48, 48, 12, 12, 12, 12, 12, 12, 48, 48, 12, 12, 12, 48, 48, 48, /* '\uFFE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\uFFF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[][] map = new sbyte[256][] { /* '\u00xx' */ mLo0, mLo1, mLo2, mLo3, mLo4, mLo5, mLo6, mLo7, mLo8, mLo9, mLo10, mLo11, mLo12, mLo13, mLo14, mLo15, /* '\u10xx' */ mLo16, mLo17, mLo18, mLo19, mLo20, mLo1, mLo22, mLo23, mLo24, mLo25, mLo26, mLo27, mLo8, mLo29, mLo30, mLo31, /* '\u20xx' */ mLo32, mLo33, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo44, mLo45, mLo8, mLo8, /* '\u30xx' */ mLo48, mLo49, mLo8, mLo8, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\u40xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo77, mLo1, mLo1, /* '\u50xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\u60xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\u70xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\u80xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\u90xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo159, /* '\uA0xx' */ mLo1, mLo1, mLo1, mLo1, mLo164, mLo8, mLo8, mLo167, mLo168, mLo8, mLo8, mLo8, mLo1, mLo1, mLo1, mLo1, /* '\uB0xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\uC0xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, /* '\uD0xx' */ mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo1, mLo215, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, /* '\uE0xx' */ mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, /* '\uF0xx' */ mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo8, mLo1, mLo250, mLo251, mLo1, mLo253, mLo254, mLo255}; #endregion #region CompressedCharacterMap // // There are 49 equivalence classes // There are 21 character sequence regions // There are 6 tables, 1255 entries // There are 15 runs, 0 singletons // Decision tree depth is 5 // static sbyte[] mapC0 = new sbyte[251] { /* '\U00010000' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, /* '\U00010010' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010020' */ 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010030' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 48, 12, /* '\U00010040' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\U00010050' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\U00010060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010070' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010080' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010090' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100C0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000100F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 }; static sbyte[] mapC2 = new sbyte[256] { /* '\U00010300' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010310' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\U00010320' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010330' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010340' */ 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, 48, 48, 48, 48, /* '\U00010350' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010380' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010390' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 48, /* '\U000103A0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000103B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000103C0' */ 12, 12, 12, 12, 48, 48, 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U000103D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U000103E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U000103F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mapC5 = new sbyte[64] { /* '\U00010800' */ 12, 12, 12, 12, 12, 12, 48, 48, 12, 48, 12, 12, 12, 12, 12, 12, /* '\U00010810' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010820' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010830' */ 12, 12, 12, 12, 12, 12, 48, 12, 12, 48, 48, 48, 12, 48, 48, 12 }; static sbyte[] mapC9 = new sbyte[52] { /* '\U00010A00' */ 12, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* '\U00010A10' */ 12, 12, 12, 12, 48, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, /* '\U00010A20' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U00010A30' */ 12, 12, 12, 12 }; static sbyte[] mapC13 = new sbyte[338] { /* '\U0001D400' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D410' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D420' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D430' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D440' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D450' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D460' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D470' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D480' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D490' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\U0001D4A0' */ 48, 48, 12, 48, 48, 12, 12, 48, 48, 12, 12, 12, 12, 48, 12, 12, /* '\U0001D4B0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 48, 12, 12, 12, /* '\U0001D4C0' */ 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D4D0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D4E0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D4F0' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D500' */ 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 48, 48, 12, 12, 12, /* '\U0001D510' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\U0001D520' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D530' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 48, /* '\U0001D540' */ 12, 12, 12, 12, 12, 48, 12, 48, 48, 48, 12, 12, 12, 12, 12, 12, /* '\U0001D550' */ 12, 48 }; static sbyte[] mapC15 = new sbyte[294] { /* '\U0001D6A6' */ 48, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D6B6' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, /* '\U0001D6C6' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D6D6' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D6E6' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D6F6' */ 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D706' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\U0001D716' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D726' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, /* '\U0001D736' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D746' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\U0001D756' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D766' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, /* '\U0001D776' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D786' */ 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D796' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D7A6' */ 12, 12, 12, 48, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, /* '\U0001D7B6' */ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 48, 12, 12, /* '\U0001D7C6' */ 12, 12, 12, 12, 12, 12 }; static sbyte MapC(int code) { // '\U00010000' <= code <= '\U0010FFFF' if (code < 68148) // '\U00010000' <= code <= '\U00010A33' if (code < 67584) // '\U00010000' <= code <= '\U000107FF' if (code < 66304) // '\U00010000' <= code <= '\U000102FF' if (code < 65787) // '\U00010000' <= code <= '\U000100FA' return mapC0[code - 65536]; else // '\U000100FB' <= code <= '\U000102FF' return (sbyte)48; else // '\U00010300' <= code <= '\U000107FF' if (code < 66560) // '\U00010300' <= code <= '\U000103FF' return mapC2[code - 66304]; else // '\U00010400' <= code <= '\U000107FF' if (code < 66718) // '\U00010400' <= code <= '\U0001049D' return (sbyte)12; else // '\U0001049E' <= code <= '\U000107FF' return (sbyte)48; else // '\U00010800' <= code <= '\U00010A33' if (code < 67840) // '\U00010800' <= code <= '\U000108FF' if (code < 67648) // '\U00010800' <= code <= '\U0001083F' return mapC5[code - 67584]; else // '\U00010840' <= code <= '\U000108FF' return (sbyte)48; else // '\U00010900' <= code <= '\U00010A33' if (code < 67862) // '\U00010900' <= code <= '\U00010915' return (sbyte)12; else // '\U00010916' <= code <= '\U00010A33' if (code < 68096) // '\U00010916' <= code <= '\U000109FF' return (sbyte)48; else // '\U00010A00' <= code <= '\U00010A33' return mapC9[code - 68096]; else // '\U00010A34' <= code <= '\U0010FFFF' if (code < 120486) // '\U00010A34' <= code <= '\U0001D6A5' if (code < 74607) // '\U00010A34' <= code <= '\U0001236E' if (code < 73728) // '\U00010A34' <= code <= '\U00011FFF' return (sbyte)48; else // '\U00012000' <= code <= '\U0001236E' return (sbyte)12; else // '\U0001236F' <= code <= '\U0001D6A5' if (code < 119808) // '\U0001236F' <= code <= '\U0001D3FF' return (sbyte)48; else // '\U0001D400' <= code <= '\U0001D6A5' if (code < 120146) // '\U0001D400' <= code <= '\U0001D551' return mapC13[code - 119808]; else // '\U0001D552' <= code <= '\U0001D6A5' return (sbyte)12; else // '\U0001D6A6' <= code <= '\U0010FFFF' if (code < 173783) // '\U0001D6A6' <= code <= '\U0002A6D6' if (code < 120780) // '\U0001D6A6' <= code <= '\U0001D7CB' return mapC15[code - 120486]; else // '\U0001D7CC' <= code <= '\U0002A6D6' if (code < 131072) // '\U0001D7CC' <= code <= '\U0001FFFF' return (sbyte)48; else // '\U00020000' <= code <= '\U0002A6D6' return (sbyte)12; else // '\U0002A6D7' <= code <= '\U0010FFFF' if (code < 194560) // '\U0002A6D7' <= code <= '\U0002F7FF' return (sbyte)48; else // '\U0002F800' <= code <= '\U0010FFFF' if (code < 195102) // '\U0002F800' <= code <= '\U0002FA1D' return (sbyte)12; else // '\U0002FA1E' <= code <= '\U0010FFFF' return (sbyte)48; } #endregion static sbyte Map(int code) { if (code <= 65535) return map[code / 256][code % 256]; else return MapC(code); } static Table[] NxS = new Table[104] { /* NxS[ 0] */ new Table(0, 0, 0, null), /* NxS[ 1] */ new Table(1, 6, -1, new sbyte[] {1, 103, 1, 102, -1, 64}), /* NxS[ 2] */ new Table(36, 26, -1, new sbyte[] {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, 2, 2}), /* NxS[ 3] */ new Table(4, 3, -1, new sbyte[] {102, -1, 64}), /* NxS[ 4] */ new Table(1, 3, -1, new sbyte[] {62, -1, 63}), /* NxS[ 5] */ new Table(0, 10, 99, new sbyte[] {-1, 99, 99, 99, 99, 99, 99, 61, 99, 100}), /* NxS[ 6] */ new Table(0, 0, -1, null), /* NxS[ 7] */ new Table(0, 11, 97, new sbyte[] {-1, 97, 97, 97, 97, 97, 97, 97, 97, 98, 61}), /* NxS[ 8] */ new Table(36, 26, -1, new sbyte[] {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, 2, 2, 2, 2, 2, -1, 93, -1, -1, 94, 2, 2}), /* NxS[ 9] */ new Table(13, 2, -1, new sbyte[] {57, 58}), /* NxS[ 10] */ new Table(14, 1, -1, new sbyte[] {56}), /* NxS[ 11] */ new Table(14, 1, -1, new sbyte[] {55}), /* NxS[ 12] */ new Table(14, 7, -1, new sbyte[] {53, -1, -1, -1, -1, -1, 54}), /* NxS[ 13] */ new Table(14, 4, -1, new sbyte[] {51, -1, -1, 52}), /* NxS[ 14] */ new Table(0, 0, -1, null), /* NxS[ 15] */ new Table(14, 6, -1, new sbyte[] {45, -1, -1, -1, -1, 46}), /* NxS[ 16] */ new Table(14, 7, -1, new sbyte[] {42, -1, -1, -1, -1, -1, 43}), /* NxS[ 17] */ new Table(14, 1, -1, new sbyte[] {41}), /* NxS[ 18] */ new Table(0, 0, -1, null), /* NxS[ 19] */ new Table(14, 1, -1, new sbyte[] {40}), /* NxS[ 20] */ new Table(14, 1, -1, new sbyte[] {39}), /* NxS[ 21] */ new Table(14, 1, -1, new sbyte[] {38}), /* NxS[ 22] */ new Table(47, 32, -1, new sbyte[] {37, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, 34, 35, 36}), /* NxS[ 23] */ new Table(0, 0, -1, null), /* NxS[ 24] */ new Table(0, 0, -1, null), /* NxS[ 25] */ new Table(0, 0, -1, null), /* NxS[ 26] */ new Table(0, 0, -1, null), /* NxS[ 27] */ new Table(0, 0, -1, null), /* NxS[ 28] */ new Table(0, 0, -1, null), /* NxS[ 29] */ new Table(0, 0, -1, null), /* NxS[ 30] */ new Table(0, 0, -1, null), /* NxS[ 31] */ new Table(0, 0, -1, null), /* NxS[ 32] */ new Table(0, 0, -1, null), /* NxS[ 33] */ new Table(0, 0, -1, null), /* NxS[ 34] */ new Table(0, 0, -1, null), /* NxS[ 35] */ new Table(0, 0, -1, null), /* NxS[ 36] */ new Table(0, 0, -1, null), /* NxS[ 37] */ new Table(0, 0, -1, null), /* NxS[ 38] */ new Table(0, 0, -1, null), /* NxS[ 39] */ new Table(0, 0, -1, null), /* NxS[ 40] */ new Table(0, 0, -1, null), /* NxS[ 41] */ new Table(0, 0, -1, null), /* NxS[ 42] */ new Table(0, 0, -1, null), /* NxS[ 43] */ new Table(14, 1, -1, new sbyte[] {44}), /* NxS[ 44] */ new Table(0, 0, -1, null), /* NxS[ 45] */ new Table(0, 0, -1, null), /* NxS[ 46] */ new Table(36, 28, -1, new sbyte[] {67, -1, -1, -1, 68, -1, -1, 69, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47}), /* NxS[ 47] */ new Table(0, 0, -1, null), /* NxS[ 48] */ new Table(0, 0, -1, null), /* NxS[ 49] */ new Table(0, 0, -1, null), /* NxS[ 50] */ new Table(0, 0, -1, null), /* NxS[ 51] */ new Table(0, 0, -1, null), /* NxS[ 52] */ new Table(0, 0, -1, null), /* NxS[ 53] */ new Table(0, 0, -1, null), /* NxS[ 54] */ new Table(0, 0, -1, null), /* NxS[ 55] */ new Table(0, 0, -1, null), /* NxS[ 56] */ new Table(0, 0, -1, null), /* NxS[ 57] */ new Table(14, 1, -1, new sbyte[] {59}), /* NxS[ 58] */ new Table(0, 0, -1, null), /* NxS[ 59] */ new Table(0, 0, -1, null), /* NxS[ 60] */ new Table(0, 0, -1, null), /* NxS[ 61] */ new Table(0, 0, -1, null), /* NxS[ 62] */ new Table(1, 3, -1, new sbyte[] {62, 101, 62}), /* NxS[ 63] */ new Table(0, 0, -1, null), /* NxS[ 64] */ new Table(1, 3, -1, new sbyte[] {62, -1, 63}), /* NxS[ 65] */ new Table(0, 0, -1, null), /* NxS[ 66] */ new Table(47, 38, 2, new sbyte[] {6, 6, -1, 1, 2, 3, 2, 2, 4, 5, -1, 6, 7, 8, 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}), /* NxS[ 67] */ new Table(37, 1, -1, new sbyte[] {83}), /* NxS[ 68] */ new Table(43, 1, -1, new sbyte[] {74}), /* NxS[ 69] */ new Table(46, 1, -1, new sbyte[] {70}), /* NxS[ 70] */ new Table(38, 1, -1, new sbyte[] {71}), /* NxS[ 71] */ new Table(36, 1, -1, new sbyte[] {72}), /* NxS[ 72] */ new Table(20, 1, -1, new sbyte[] {73}), /* NxS[ 73] */ new Table(20, 1, -1, new sbyte[] {48}), /* NxS[ 74] */ new Table(44, 1, -1, new sbyte[] {75}), /* NxS[ 75] */ new Table(43, 1, -1, new sbyte[] {76}), /* NxS[ 76] */ new Table(36, 1, -1, new sbyte[] {77}), /* NxS[ 77] */ new Table(45, 1, -1, new sbyte[] {78}), /* NxS[ 78] */ new Table(36, 1, -1, new sbyte[] {79}), /* NxS[ 79] */ new Table(42, 1, -1, new sbyte[] {80}), /* NxS[ 80] */ new Table(43, 1, -1, new sbyte[] {81}), /* NxS[ 81] */ new Table(20, 1, -1, new sbyte[] {82}), /* NxS[ 82] */ new Table(20, 1, -1, new sbyte[] {49}), /* NxS[ 83] */ new Table(38, 1, -1, new sbyte[] {84}), /* NxS[ 84] */ new Table(39, 1, -1, new sbyte[] {85}), /* NxS[ 85] */ new Table(36, 1, -1, new sbyte[] {86}), /* NxS[ 86] */ new Table(40, 1, -1, new sbyte[] {87}), /* NxS[ 87] */ new Table(40, 1, -1, new sbyte[] {88}), /* NxS[ 88] */ new Table(5, 1, -1, new sbyte[] {89}), /* NxS[ 89] */ new Table(41, 1, -1, new sbyte[] {90}), /* NxS[ 90] */ new Table(42, 1, -1, new sbyte[] {91}), /* NxS[ 91] */ new Table(20, 1, -1, new sbyte[] {92}), /* NxS[ 92] */ new Table(20, 1, -1, new sbyte[] {50}), /* NxS[ 93] */ new Table(0, 10, 93, new sbyte[] {-1, 93, 93, 93, 93, 93, 93, 60, 93, 96}), /* NxS[ 94] */ new Table(0, 11, 94, new sbyte[] {-1, 94, 94, 94, 94, 94, 94, 94, 94, 95, 60}), /* NxS[ 95] */ new Table(0, 1, 94, new sbyte[] {-1}), /* NxS[ 96] */ new Table(0, 1, 93, new sbyte[] {-1}), /* NxS[ 97] */ new Table(0, 11, 97, new sbyte[] {-1, 97, 97, 97, 97, 97, 97, 97, 97, 98, 61}), /* NxS[ 98] */ new Table(0, 1, 97, new sbyte[] {-1}), /* NxS[ 99] */ new Table(0, 10, 99, new sbyte[] {-1, 99, 99, 99, 99, 99, 99, 61, 99, 100}), /* NxS[ 100] */ new Table(0, 1, 99, new sbyte[] {-1}), /* NxS[ 101] */ new Table(1, 3, -1, new sbyte[] {62, -1, 62}), /* NxS[ 102] */ new Table(5, 1, -1, new sbyte[] {65}), /* NxS[ 103] */ new Table(1, 3, -1, new sbyte[] {1, -1, 1}), }; int NextState() { if (code == ScanBuff.EndOfFile) return eofNum; else unchecked { int rslt; int idx = Map(code) - NxS[state].min; if (idx < 0) idx += 49; if ((uint)idx >= (uint)NxS[state].rng) rslt = NxS[state].dflt; else rslt = NxS[state].nxt[idx]; return rslt; } } #endregion #if BACKUP // ============================================================== // == Nested struct used for backup in automata that do backup == // ============================================================== struct Context // class used for automaton backup. { public int bPos; public int rPos; // scanner.readPos saved value public int cCol; public int lNum; // Need this in case of backup over EOL. public int state; public int cChr; } private Context ctx = new Context(); #endif // BACKUP // ============================================================== // ==== Nested struct to support input switching in scanners ==== // ============================================================== struct BufferContext { internal ScanBuff buffSv; internal int chrSv; internal int cColSv; internal int lNumSv; } // ============================================================== // ===== Private methods to save and restore buffer contexts ==== // ============================================================== /// <summary> /// This method creates a buffer context record from /// the current buffer object, together with some /// scanner state values. /// </summary> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] BufferContext MkBuffCtx() { BufferContext rslt; rslt.buffSv = this.buffer; rslt.chrSv = this.code; rslt.cColSv = this.cCol; rslt.lNumSv = this.lNum; return rslt; } /// <summary> /// This method restores the buffer value and allied /// scanner state from the given context record value. /// </summary> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] void RestoreBuffCtx(BufferContext value) { this.buffer = value.buffSv; this.code = value.chrSv; this.cCol = value.cColSv; this.lNum = value.lNumSv; } // =================== End Nested classes ======================= #if !NOFILES public Scanner(Stream file) { SetSource(file, 0); // unicode option } public Scanner(Stream file, string codepage) { SetSource(file, CodePageHandling.GetCodePage(codepage)); } #endif // !NOFILES public Scanner() { } private int readPos; void GetCode() { if (code == '\n') // This needs to be fixed for other conventions // i.e. [\r\n\205\u2028\u2029] { cCol = -1; lNum++; } readPos = buffer.Pos; // Now read new codepoint. code = buffer.Read(); if (code > ScanBuff.EndOfFile) { #if (!BYTEMODE) if (code >= 0xD800 && code <= 0xDBFF) { int next = buffer.Read(); if (next < 0xDC00 || next > 0xDFFF) code = ScanBuff.UnicodeReplacementChar; else code = (0x10000 + (code & 0x3FF << 10) + (next & 0x3FF)); } #endif cCol++; } } void MarkToken() { #if (!PERSIST) buffer.Mark(); #endif tokPos = readPos; tokLin = lNum; tokCol = cCol; } void MarkEnd() { tokTxt = null; tokEPos = readPos; tokELin = lNum; tokECol = cCol; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] int Peek() { int rslt, codeSv = code, cColSv = cCol, lNumSv = lNum, bPosSv = buffer.Pos; GetCode(); rslt = code; lNum = lNumSv; cCol = cColSv; code = codeSv; buffer.Pos = bPosSv; return rslt; } // ============================================================== // ===== Initialization of string-based input buffers ==== // ============================================================== /// <summary> /// Create and initialize a StringBuff buffer object for this scanner /// </summary> /// <param name="source">the input string</param> /// <param name="offset">starting offset in the string</param> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void SetSource(string source, int offset) { this.buffer = ScanBuff.GetBuffer(source); this.buffer.Pos = offset; this.lNum = 0; this.code = '\n'; // to initialize yyline, yycol and lineStart GetCode(); } #if !NOFILES // ================ LineBuffer Initialization =================== /// <summary> /// Create and initialize a LineBuff buffer object for this scanner /// </summary> /// <param name="source">the list of input strings</param> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void SetSource(IList<string> source) { this.buffer = ScanBuff.GetBuffer(source); this.code = '\n'; // to initialize yyline, yycol and lineStart this.lNum = 0; GetCode(); } // =============== StreamBuffer Initialization ================== /// <summary> /// Create and initialize a StreamBuff buffer object for this scanner. /// StreamBuff is buffer for 8-bit byte files. /// </summary> /// <param name="source">the input byte stream</param> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void SetSource(Stream source) { this.buffer = ScanBuff.GetBuffer(source); this.lNum = 0; this.code = '\n'; // to initialize yyline, yycol and lineStart GetCode(); } #if !BYTEMODE // ================ TextBuffer Initialization =================== /// <summary> /// Create and initialize a TextBuff buffer object for this scanner. /// TextBuff is a buffer for encoded unicode files. /// </summary> /// <param name="source">the input text file</param> /// <param name="fallbackCodePage">Code page to use if file has /// no BOM. For 0, use machine default; for -1, 8-bit binary</param> [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] public void SetSource(Stream source, int fallbackCodePage) { this.buffer = ScanBuff.GetBuffer(source, fallbackCodePage); this.lNum = 0; this.code = '\n'; // to initialize yyline, yycol and lineStart GetCode(); } #endif // !BYTEMODE #endif // !NOFILES // ============================================================== #if BABEL // // Get the next token for Visual Studio // // "state" is the inout mode variable that maintains scanner // state between calls, using the EolState property. In principle, // if the calls of EolState are costly set could be called once // only per line, at the start; and get called only at the end // of the line. This needs more infrastructure ... // public int GetNext(ref int state, out int start, out int end) { Tokens next; int s, e; s = state; // state at start EolState = state; next = (Tokens)Scan(); state = EolState; e = state; // state at end; start = tokPos; end = tokEPos - 1; // end is the index of last char. return (int)next; } #endif // BABEL // ======== AbstractScanner<> Implementation ========= [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yylex")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yylex")] public override int yylex() { // parserMax is set by reflecting on the Tokens // enumeration. If maxParseToken is defined // that is used, otherwise int.MaxValue is used. int next; do { next = Scan(); } while (next >= parserMax); return next; } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] int yypos { get { return tokPos; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] int yyline { get { return tokLin; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] int yycol { get { return tokCol; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yytext")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yytext")] public string yytext { get { if (tokTxt == null) tokTxt = buffer.GetString(tokPos, tokEPos); return tokTxt; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] void yyless(int n) { buffer.Pos = tokPos; // Must read at least one char, so set before start. cCol = tokCol - 1; GetCode(); // Now ensure that line counting is correct. lNum = tokLin; // And count the rest of the text. for (int i = 0; i < n; i++) GetCode(); MarkEnd(); } // // It would be nice to count backward in the text // but it does not seem possible to re-establish // the correct column counts except by going forward. // [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] void _yytrunc(int n) { yyless(yyleng - n); } // // This is painful, but we no longer count // codepoints. For the overwhelming majority // of cases the single line code is fast, for // the others, well, at least it is all in the // buffer so no files are touched. Note that we // can't use (tokEPos - tokPos) because of the // possibility of surrogate pairs in the token. // [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yyleng")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yyleng")] public int yyleng { get { #if BYTEMODE return tokEPos - tokPos; #else if (tokELin == tokLin) return tokECol - tokCol; else { int ch; int count = 0; int save = buffer.Pos; buffer.Pos = tokPos; do { ch = buffer.Read(); if (!char.IsHighSurrogate((char)ch)) count++; } while (buffer.Pos < tokEPos && ch != ScanBuff.EndOfFile); buffer.Pos = save; return count; } #endif // BYTEMODE } } // ============ methods available in actions ============== [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal int YY_START { get { return currentScOrd; } set { currentScOrd = value; currentStart = startState[value]; } } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal void BEGIN(int next) { currentScOrd = next; currentStart = startState[next]; } // ============== The main tokenizer code ================= int Scan() { try { for (; ; ) { int next; // next state to enter #if BACKUP Result rslt = Result.noMatch; #endif // BACKUP #if LEFTANCHORS for (;;) { // Discard characters that do not start any pattern. // Must check the left anchor condition after *every* GetCode! state = ((cCol == 0) ? anchorState[currentScOrd] : currentStart); if ((next = NextState()) != goStart) break; // LOOP EXIT HERE... GetCode(); } #else // !LEFTANCHORS state = currentStart; while ((next = NextState()) == goStart) // At this point, the current character has no // transition from the current state. We discard // the "no-match" char. In traditional LEX such // characters are echoed to the console. GetCode(); #endif // LEFTANCHORS // At last, a valid transition ... MarkToken(); state = next; GetCode(); while ((next = NextState()) > eofNum) // Exit for goStart AND for eofNum #if BACKUP if (state <= maxAccept && next > maxAccept) // need to prepare backup data { // ctx is an object. The fields may be // mutated by the call to Recurse2. // On return the data in ctx is the // *latest* accept state that was found. rslt = Recurse2(ref ctx, next); if (rslt == Result.noMatch) RestoreStateAndPos(ref ctx); break; } else #endif // BACKUP { state = next; GetCode(); } if (state <= maxAccept) { MarkEnd(); #region ActionSwitch #pragma warning disable 162 switch (state) { case eofNum: if (yywrap()) return (int)Tokens.EOF; break; case 1: case 3: yylval = new SPythonParserYacc.ValueType(); currentLexLocation = CurrentLexLocation; yylval.ex = parserTools.create_spy_int_const(yytext,currentLexLocation); return (int)Tokens.INTNUM; break; case 2: case 8: string cur_yytext = yytext; int res = keywords.KeywordOrIDToken(cur_yytext); currentLexLocation = CurrentLexLocation; yylval = new SPythonParserYacc.ValueType(); switch (res) { case (int)Tokens.ID: yylval.id = parserTools.create_ident(cur_yytext, currentLexLocation); break; case (int)Tokens.AND: yylval.op = new op_type_node(Operators.LogicalAND, currentLexLocation); yylval.op.text = cur_yytext; break; case (int)Tokens.OR: yylval.op = new op_type_node(Operators.LogicalOR, currentLexLocation); yylval.op.text = cur_yytext; break; case (int)Tokens.NOT: yylval.op = new op_type_node(Operators.LogicalNOT, currentLexLocation); yylval.op.text = cur_yytext; break; case (int)Tokens.IF: case (int)Tokens.ELIF: case (int)Tokens.ELSE: case (int)Tokens.WHILE: case (int)Tokens.FOR: case (int)Tokens.DEF: last_line_needed_colon = CurrentLexLocation.StartLine; break; case (int)Tokens.CLASS: case (int)Tokens.LAMBDA: parserTools.AddErrorFromResource("UNSUPPORTED_CONSTRUCTION_{0}", currentLexLocation, yytext); break; } return res; break; case 4: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.DOT; break; case 5: case 6: case 7: case 17: case 22: parserTools.AddErrorFromResource("UNEXPECTED_TOKEN_{0}", CurrentLexLocation, yytext); return (int)Tokens.EOF; break; case 9: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Division); return (int)Tokens.DIVIDE; break; case 10: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.ASSIGN; break; case 11: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Plus); return (int)Tokens.PLUS; break; case 12: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Minus); return (int)Tokens.MINUS; break; case 13: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Multiplication); return (int)Tokens.STAR; break; case 14: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.ModulusRemainder); return (int)Tokens.PERCENTAGE; break; case 15: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Less); return (int)Tokens.LESS; break; case 16: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Greater); return (int)Tokens.GREATER; break; case 18: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.LogicalNOT); return (int)Tokens.BINNOT; break; case 19: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.LogicalAND); return (int)Tokens.BINAND; break; case 20: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.LogicalOR); return (int)Tokens.BINOR; break; case 21: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.BitwiseXOR); return (int)Tokens.BINXOR; break; case 23: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.LBRACE; break; case 24: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.RBRACE; break; case 25: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.SEMICOLON; break; case 26: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.LBRACKET; break; case 27: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.RBRACKET; break; case 28: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.COMMA; break; case 29: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.COLON; break; case 30: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.LPAR; break; case 31: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.RPAR; break; case 32: parserTools.AddErrorFromResource("PROGRAM_BEGIN_WITH_INDENT", CurrentLexLocation); return (int)Tokens.EOF; break; case 33: parserTools.AddErrorFromResource("WRONG_INDENT", new LexLocation(CurrentLexLocation.StartLine + 1, 0, CurrentLexLocation.StartLine + 1, 0)); return (int)Tokens.EOF; break; case 34: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.INDENT; break; case 35: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.UNINDENT; break; case 36: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.END_OF_LINE; break; case 37: return (int)Tokens.END_OF_FILE; break; case 38: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentBitwiseXOR); return (int)Tokens.BINXOREQUAL; break; case 39: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentBitwiseOR); return (int)Tokens.BINOREQUAL; break; case 40: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentBitwiseAND); return (int)Tokens.BINANDEQUAL; break; case 41: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.NOTEQUAL; break; case 42: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.GREATEREQUAL; break; case 43: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.BitwiseRightShift); return (int)Tokens.SHR; break; case 44: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentBitwiseRightShift); return (int)Tokens.SHREQUAL; break; case 45: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.LessEqual); return (int)Tokens.LESSEQUAL; break; case 46: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.BitwiseLeftShift); return (int)Tokens.SHL; break; case 47: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentBitwiseLeftShift); return (int)Tokens.SHLEQUAL; break; case 48: return (int)Tokens.tkParseModeType; break; case 49: return (int)Tokens.tkParseModeStatement; break; case 50: return (int)Tokens.tkParseModeExpression; break; case 51: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.STAREQUAL; break; case 52: yylval = new SPythonParserYacc.ValueType(); return (int)Tokens.STARSTAR; break; case 53: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.MINUSEQUAL; break; case 54: yylval = new SPythonParserYacc.ValueType(); yylval.ti = new token_info(yytext); return (int)Tokens.ARROW; break; case 55: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.PLUSEQUAL; break; case 56: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.Equal); return (int)Tokens.EQUAL; break; case 57: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.IntegerDivision); return (int)Tokens.SLASHSLASH; break; case 58: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.DIVEQUAL; break; case 59: yylval = new SPythonParserYacc.ValueType(); yylval.op = new op_type_node(Operators.AssignmentIntDivision); return (int)Tokens.INTDIVISIONEQUAL; break; case 60: yylval = new SPythonParserYacc.ValueType(); currentLexLocation = CurrentLexLocation; yylval.ex = parserTools.create_fstring(yytext,currentLexLocation); return (int)Tokens.FSTRINGNUM; break; case 61: yylval = new SPythonParserYacc.ValueType(); currentLexLocation = CurrentLexLocation; yylval.stn = parserTools.create_string_const(yytext,currentLexLocation); return (int)Tokens.STRINGNUM; break; case 62: case 63: case 64: yylval = new SPythonParserYacc.ValueType(); currentLexLocation = CurrentLexLocation; yylval.ex = parserTools.create_double_const(yytext,currentLexLocation); return (int)Tokens.REALNUM; break; case 65: yylval = new SPythonParserYacc.ValueType(); currentLexLocation = CurrentLexLocation; yylval.ex = parserTools.create_bigint_const(yytext,currentLexLocation); return (int)Tokens.BIGINT; break; default: break; } #pragma warning restore 162 #endregion } } } // end try finally { // User-specified epilog to scan() prevLexLocation = yylloc; if (currentLexLocation != null) yylloc = currentLexLocation; else yylloc = CurrentLexLocation; currentLexLocation = null; // End, user-specified epilog } // end finally } #if BACKUP Result Recurse2(ref Context ctx, int next) { // Assert: at entry "state" is an accept state AND // NextState(state, code) != goStart AND // NextState(state, code) is not an accept state. // SaveStateAndPos(ref ctx); state = next; GetCode(); while ((next = NextState()) > eofNum) { if (state <= maxAccept && next > maxAccept) // need to update backup data SaveStateAndPos(ref ctx); state = next; if (state == eofNum) return Result.accept; GetCode(); } return (state <= maxAccept ? Result.accept : Result.noMatch); } void SaveStateAndPos(ref Context ctx) { ctx.bPos = buffer.Pos; ctx.rPos = readPos; ctx.cCol = cCol; ctx.lNum = lNum; ctx.state = state; ctx.cChr = code; } void RestoreStateAndPos(ref Context ctx) { buffer.Pos = ctx.bPos; readPos = ctx.rPos; cCol = ctx.cCol; lNum = ctx.lNum; state = ctx.state; code = ctx.cChr; } #endif // BACKUP // ============= End of the tokenizer code ================ #if STACK [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal void yy_clear_stack() { scStack.Clear(); } [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal int yy_top_state() { return scStack.Peek(); } internal void yy_push_state(int state) { scStack.Push(currentScOrd); BEGIN(state); } internal void yy_pop_state() { // Protect against input errors that pop too far ... if (scStack.Count > 0) { int newSc = scStack.Pop(); BEGIN(newSc); } // Otherwise leave stack unchanged. } #endif // STACK [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal void ECHO() { Console.Out.Write(yytext); } #region UserCodeSection public LexLocation CurrentLexLocation { get { return new LexLocation(tokLin, tokCol, tokELin, tokECol, parserTools.currentFileName); } } public override void yyerror(string format, params object[] args) { string expected = parserTools.ExpectedToken(last_line_needed_colon == prevLexLocation.StartLine, args); LexLocation lexLocation = parserTools.GetLexLocation( yytext, expected, prevLexLocation, CurrentLexLocation); if (yytext == "#{" && expected == "END_OF_LINE") { parserTools.AddErrorFromResource("WRONG_INDENT", lexLocation); } else { string errorMsg = parserTools.CreateErrorString(yytext, expected); parserTools.AddError(errorMsg, lexLocation); } } protected override bool yywrap() { return true; } #endregion } // end class $Scanner // ============================================================== // <auto-generated> // This code automatically produced from an embedded resource. // Do not edit this file, or it will become incompatible with // the specification from which it was generated. // </auto-generated> // ============================================================== // Code copied from GPLEX embedded resource [Serializable] public class BufferException : Exception { public BufferException() { } public BufferException(string message) : base(message) { } public BufferException(string message, Exception innerException) : base(message, innerException) { } protected BufferException(SerializationInfo info, StreamingContext context) : base(info, context) { } } public abstract class ScanBuff { private string fileNm; public const int EndOfFile = -1; public const int UnicodeReplacementChar = 0xFFFD; public bool IsFile { get { return (fileNm != null); } } public string FileName { get { return fileNm; } set { fileNm = value; } } public abstract int Pos { get; set; } public abstract int Read(); public virtual void Mark() { } public abstract string GetString(int begin, int limit); public static ScanBuff GetBuffer(string source) { return new StringBuffer(source); } public static ScanBuff GetBuffer(IList<string> source) { return new LineBuffer(source); } public static ScanBuff GetBuffer(Stream source) { return new BuildBuffer(source); } #if (!BYTEMODE) public static ScanBuff GetBuffer(Stream source, int fallbackCodePage) { return new BuildBuffer(source, fallbackCodePage); } #endif } #region Buffer classes // ============================================================== // ===== Definitions for various ScanBuff derived classes ==== // ============================================================== // =============== String input ================ // ============================================================== /// <summary> /// This class reads characters from a single string as /// required, for example, by Visual Studio language services /// </summary> sealed class StringBuffer : ScanBuff { string str; // input buffer int bPos; // current position in buffer int sLen; public StringBuffer(string source) { this.str = source; this.sLen = source.Length; this.FileName = null; } public override int Read() { if (bPos < sLen) return str[bPos++]; else if (bPos == sLen) { bPos++; return '\n'; } // one strike, see new line else { bPos++; return EndOfFile; } // two strikes and you're out! } public override string GetString(int begin, int limit) { // "limit" can be greater than sLen with the BABEL // option set. Read returns a "virtual" EOL if // an attempt is made to read past the end of the // string buffer. Without the guard any attempt // to fetch yytext for a token that includes the // EOL will throw an index exception. if (limit > sLen) limit = sLen; if (limit <= begin) return ""; else return str.Substring(begin, limit - begin); } public override int Pos { get { return bPos; } set { bPos = value; } } public override string ToString() { return "StringBuffer"; } } // ============================================================== // The LineBuff class contributed by Nigel Horspool, // nigelh@cs.uvic.cs // ============================================================== sealed class LineBuffer : ScanBuff { IList<string> line; // list of source lines from a file int numLines; // number of strings in line list string curLine; // current line in that list int cLine; // index of current line in the list int curLen; // length of current line int curLineStart; // position of line start in whole file int curLineEnd; // position of line end in whole file int maxPos; // max position ever visited in whole file int cPos; // ordinal number of code in source // Constructed from a list of strings, one per source line. // The lines have had trailing '\n' characters removed. public LineBuffer(IList<string> lineList) { line = lineList; numLines = line.Count; cPos = curLineStart = 0; curLine = (numLines > 0 ? line[0] : ""); maxPos = curLineEnd = curLen = curLine.Length; cLine = 1; FileName = null; } public override int Read() { if (cPos < curLineEnd) return curLine[cPos++ - curLineStart]; if (cPos++ == curLineEnd) return '\n'; if (cLine >= numLines) return EndOfFile; curLine = line[cLine]; curLen = curLine.Length; curLineStart = curLineEnd + 1; curLineEnd = curLineStart + curLen; if (curLineEnd > maxPos) maxPos = curLineEnd; cLine++; return curLen > 0 ? curLine[0] : '\n'; } // To speed up searches for the line containing a position private int cachedPosition; private int cachedIxdex; private int cachedLineStart; // Given a position pos within the entire source, the results are // ix -- the index of the containing line // lstart -- the position of the first character on that line private void findIndex(int pos, out int ix, out int lstart) { if (pos >= cachedPosition) { ix = cachedIxdex; lstart = cachedLineStart; } else { ix = lstart = 0; } for (; ; ) { int len = line[ix].Length + 1; if (pos < lstart + len) break; lstart += len; ix++; } cachedPosition = pos; cachedIxdex = ix; cachedLineStart = lstart; } public override string GetString(int begin, int limit) { if (begin >= maxPos || limit <= begin) return ""; int endIx, begIx, endLineStart, begLineStart; findIndex(begin, out begIx, out begLineStart); int begCol = begin - begLineStart; findIndex(limit, out endIx, out endLineStart); int endCol = limit - endLineStart; string s = line[begIx]; if (begIx == endIx) { // the usual case, substring all on one line return (endCol <= s.Length) ? s.Substring(begCol, endCol - begCol) : s.Substring(begCol) + "\n"; } // the string spans multiple lines, yuk! StringBuilder sb = new StringBuilder(); if (begCol < s.Length) sb.Append(s.Substring(begCol)); for (; ; ) { sb.Append("\n"); s = line[++begIx]; if (begIx >= endIx) break; sb.Append(s); } if (endCol <= s.Length) { sb.Append(s.Substring(0, endCol)); } else { sb.Append(s); sb.Append("\n"); } return sb.ToString(); } public override int Pos { get { return cPos; } set { cPos = value; findIndex(cPos, out cLine, out curLineStart); curLine = line[cLine]; curLineEnd = curLineStart + curLine.Length; } } public override string ToString() { return "LineBuffer"; } } // ============================================================== // ===== class BuildBuff : for unicode text files ======== // ============================================================== class BuildBuffer : ScanBuff { // Double buffer for char stream. class BufferElement { StringBuilder bldr = new StringBuilder(); StringBuilder next = new StringBuilder(); int minIx; int maxIx; int brkIx; bool appendToNext; internal BufferElement() { } internal int MaxIndex { get { return maxIx; } } // internal int MinIndex { get { return minIx; } } internal char this[int index] { get { if (index < minIx || index >= maxIx) throw new BufferException("Index was outside data buffer"); else if (index < brkIx) return bldr[index - minIx]; else return next[index - brkIx]; } } internal void Append(char[] block, int count) { maxIx += count; if (appendToNext) this.next.Append(block, 0, count); else { this.bldr.Append(block, 0, count); brkIx = maxIx; appendToNext = true; } } internal string GetString(int start, int limit) { if (limit <= start) return ""; if (start >= minIx && limit <= maxIx) if (limit < brkIx) // String entirely in bldr builder return bldr.ToString(start - minIx, limit - start); else if (start >= brkIx) // String entirely in next builder return next.ToString(start - brkIx, limit - start); else // Must do a string-concatenation return bldr.ToString(start - minIx, brkIx - start) + next.ToString(0, limit - brkIx); else throw new BufferException("String was outside data buffer"); } internal void Mark(int limit) { if (limit > brkIx + 16) // Rotate blocks { StringBuilder temp = bldr; bldr = next; next = temp; next.Length = 0; minIx = brkIx; brkIx = maxIx; } } } BufferElement data = new BufferElement(); int bPos; // Postion index in the StringBuilder BlockReader NextBlk; // Delegate that serves char-arrays; private string EncodingName { get { StreamReader rdr = NextBlk.Target as StreamReader; return (rdr == null ? "raw-bytes" : rdr.CurrentEncoding.BodyName); } } public BuildBuffer(Stream stream) { FileStream fStrm = (stream as FileStream); if (fStrm != null) FileName = fStrm.Name; NextBlk = BlockReaderFactory.Raw(stream); } #if (!BYTEMODE) public BuildBuffer(Stream stream, int fallbackCodePage) { FileStream fStrm = (stream as FileStream); if (fStrm != null) FileName = fStrm.Name; NextBlk = BlockReaderFactory.Get(stream, fallbackCodePage); } #endif /// <summary> /// Marks a conservative lower bound for the buffer, /// allowing space to be reclaimed. If an application /// needs to call GetString at arbitrary past locations /// in the input stream, Mark() is not called. /// </summary> public override void Mark() { data.Mark(bPos - 2); } public override int Pos { get { return bPos; } set { bPos = value; } } /// <summary> /// Read returns the ordinal number of the next char, or /// EOF (-1) for an end of stream. Note that the next /// code point may require *two* calls of Read(). /// </summary> /// <returns></returns> public override int Read() { // // Characters at positions // [data.offset, data.offset + data.bldr.Length) // are available in data.bldr. // if (bPos < data.MaxIndex) { // ch0 cannot be EOF return (int)data[bPos++]; } else // Read from underlying stream { // Experimental code, blocks of page size char[] chrs = new char[4096]; int count = NextBlk(chrs, 0, 4096); if (count == 0) return EndOfFile; else { data.Append(chrs, count); return (int)data[bPos++]; } } } public override string GetString(int begin, int limit) { return data.GetString(begin, limit); } public override string ToString() { return "StringBuilder buffer, encoding: " + this.EncodingName; } } // =============== End ScanBuff-derived classes ================== public delegate int BlockReader(char[] block, int index, int number); // A delegate factory, serving up a delegate that // reads a block of characters from the underlying // encoded stream, via a StreamReader object. // public static class BlockReaderFactory { public static BlockReader Raw(Stream stream) { return delegate(char[] block, int index, int number) { byte[] b = new byte[number]; int count = stream.Read(b, 0, number); int i = 0; int j = index; for (; i < count; i++, j++) block[j] = (char)b[i]; return count; }; } #if (!BYTEMODE) public static BlockReader Get(Stream stream, int fallbackCodePage) { Encoding encoding; int preamble = Preamble(stream); if (preamble != 0) // There is a valid BOM here! encoding = Encoding.GetEncoding(preamble); else if (fallbackCodePage == -1) // Fallback is "raw" bytes return Raw(stream); else if (fallbackCodePage != -2) // Anything but "guess" encoding = Encoding.GetEncoding(fallbackCodePage); else // This is the "guess" option { int guess = new Guesser(stream).GuessCodePage(); stream.Seek(0, SeekOrigin.Begin); if (guess == -1) // ==> this is a 7-bit file encoding = Encoding.ASCII; else if (guess == 65001) encoding = Encoding.UTF8; else // ==> use the machine default encoding = Encoding.Default; } StreamReader reader = new StreamReader(stream, encoding); return reader.Read; } static int Preamble(Stream stream) { int b0 = stream.ReadByte(); int b1 = stream.ReadByte(); if (b0 == 0xfe && b1 == 0xff) return 1201; // UTF16BE if (b0 == 0xff && b1 == 0xfe) return 1200; // UTF16LE int b2 = stream.ReadByte(); if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf) return 65001; // UTF8 // // There is no unicode preamble, so we // return denoter for the machine default. // stream.Seek(0, SeekOrigin.Begin); return 0; } #endif // !BYTEMODE } #endregion Buffer classes // ============================================================== // ============ class CodePageHandling ============= // ============================================================== public static class CodePageHandling { public static int GetCodePage(string option) { string command = option.ToUpperInvariant(); if (command.StartsWith("CodePage:", StringComparison.OrdinalIgnoreCase)) command = command.Substring(9); try { if (command.Equals("RAW")) return -1; else if (command.Equals("GUESS")) return -2; else if (command.Equals("DEFAULT")) return 0; else if (char.IsDigit(command[0])) return int.Parse(command, CultureInfo.InvariantCulture); else { Encoding enc = Encoding.GetEncoding(command); return enc.CodePage; } } catch (FormatException) { Console.Error.WriteLine( "Invalid format \"{0}\", using machine default", option); } catch (ArgumentException) { Console.Error.WriteLine( "Unknown code page \"{0}\", using machine default", option); } return 0; } } #region guesser #if (!BYTEMODE) // ============================================================== // ============ Encoding Guesser ============= // ============================================================== /// <summary> /// This class provides a simple finite state automaton that /// scans the file looking for (1) valid UTF-8 byte patterns, /// (2) bytes >= 0x80 which are not part of a UTF-8 sequence. /// The method then guesses whether it is UTF-8 or maybe some /// local machine default encoding. This works well for the /// various Latin encodings. /// </summary> internal class Guesser { ScanBuff buffer; public int GuessCodePage() { return Scan(); } const int maxAccept = 10; const int initial = 0; const int eofNum = 0; const int goStart = -1; const int INITIAL = 0; const int EndToken = 0; #region user code /* * Reads the bytes of a file to determine if it is * UTF-8 or a single-byte code page file. */ public long utfX; public long uppr; #endregion user code int state; int currentStart = startState[0]; int code; #region ScannerTables static int[] startState = new int[] { 11, 0 }; #region CharacterMap static sbyte[] map = new sbyte[256] { /* '\0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '\x10' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '\x20' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '@' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 'P' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '`' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 'p' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* '\x80' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* '\x90' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* '\xA0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* '\xB0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* '\xC0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* '\xD0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* '\xE0' */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* '\xF0' */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 }; #endregion static sbyte[][] nextState = new sbyte[][] { new sbyte[] {0, 0, 0, 0, 0, 0}, new sbyte[] {-1, -1, 10, -1, -1, -1}, new sbyte[] {-1, -1, -1, -1, -1, -1}, new sbyte[] {-1, -1, 8, -1, -1, -1}, new sbyte[] {-1, -1, 5, -1, -1, -1}, new sbyte[] {-1, -1, 6, -1, -1, -1}, new sbyte[] {-1, -1, 7, -1, -1, -1}, null, new sbyte[] {-1, -1, 9, -1, -1, -1}, null, null, new sbyte[] {-1, 1, 2, 3, 4, 2} }; [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] // Reason for suppression: cannot have self-reference in array initializer. static Guesser() { nextState[7] = nextState[2]; nextState[9] = nextState[2]; nextState[10] = nextState[2]; } int NextState() { if (code == ScanBuff.EndOfFile) return eofNum; else return nextState[state][map[code]]; } #endregion public Guesser(System.IO.Stream file) { SetSource(file); } public void SetSource(System.IO.Stream source) { this.buffer = new BuildBuffer(source); code = buffer.Read(); } int Scan() { for (; ; ) { int next; state = currentStart; while ((next = NextState()) == goStart) code = buffer.Read(); state = next; code = buffer.Read(); while ((next = NextState()) > eofNum) { state = next; code = buffer.Read(); } if (state <= maxAccept) { #region ActionSwitch #pragma warning disable 162 switch (state) { case eofNum: switch (currentStart) { case 11: if (utfX == 0 && uppr == 0) return -1; /* raw ascii */ else if (uppr * 10 > utfX) return 0; /* default code page */ else return 65001; /* UTF-8 encoding */ break; } return EndToken; case 1: // Recognized '{Upper128}', Shortest string "\xC0" case 2: // Recognized '{Upper128}', Shortest string "\x80" case 3: // Recognized '{Upper128}', Shortest string "\xE0" case 4: // Recognized '{Upper128}', Shortest string "\xF0" uppr++; break; case 5: // Recognized '{Utf8pfx4}{Utf8cont}', Shortest string "\xF0\x80" uppr += 2; break; case 6: // Recognized '{Utf8pfx4}{Utf8cont}{2}', Shortest string "\xF0\x80\x80" uppr += 3; break; case 7: // Recognized '{Utf8pfx4}{Utf8cont}{3}', Shortest string "\xF0\x80\x80\x80" utfX += 3; break; case 8: // Recognized '{Utf8pfx3}{Utf8cont}', Shortest string "\xE0\x80" uppr += 2; break; case 9: // Recognized '{Utf8pfx3}{Utf8cont}{2}', Shortest string "\xE0\x80\x80" utfX += 2; break; case 10: // Recognized '{Utf8pfx2}{Utf8cont}', Shortest string "\xC0\x80" utfX++; break; default: break; } #pragma warning restore 162 #endregion } } } } // end class Guesser #endif // !BYTEMODE #endregion // End of code copied from embedded resource } // end namespace