From 13db1b83c1e7160276c87b1faa8b573bb390cce3 Mon Sep 17 00:00:00 2001
From: Benau <Benau@users.noreply.github.com>
Date: Mon, 24 Aug 2020 00:53:04 +0800
Subject: [PATCH] Add SheenBidi library for better unicode support

---
 CMakeLists.txt                               |    6 +
 android/Android.mk                           |   14 +-
 lib/sheenbidi/CMakeLists.txt                 |    3 +
 lib/sheenbidi/Headers/SBAlgorithm.h          |  119 +
 lib/sheenbidi/Headers/SBBase.h               |  119 +
 lib/sheenbidi/Headers/SBBidiType.h           |   81 +
 lib/sheenbidi/Headers/SBCodepoint.h          |   80 +
 lib/sheenbidi/Headers/SBCodepointSequence.h  |   66 +
 lib/sheenbidi/Headers/SBConfig.h             |   29 +
 lib/sheenbidi/Headers/SBGeneralCategory.h    |  106 +
 lib/sheenbidi/Headers/SBLine.h               |   84 +
 lib/sheenbidi/Headers/SBMirrorLocator.h      |  103 +
 lib/sheenbidi/Headers/SBParagraph.h          |  100 +
 lib/sheenbidi/Headers/SBRun.h                |   32 +
 lib/sheenbidi/Headers/SBScript.h             |  247 ++
 lib/sheenbidi/Headers/SBScriptLocator.h      |  101 +
 lib/sheenbidi/Headers/SheenBidi.h            |   33 +
 lib/sheenbidi/LICENSE                        |  202 ++
 lib/sheenbidi/README.md                      |  107 +
 lib/sheenbidi/Source/BidiChain.c             |  110 +
 lib/sheenbidi/Source/BidiChain.h             |   60 +
 lib/sheenbidi/Source/BidiTypeLookup.c        | 1014 +++++++++
 lib/sheenbidi/Source/BidiTypeLookup.h        |   16 +
 lib/sheenbidi/Source/BracketQueue.c          |  230 ++
 lib/sheenbidi/Source/BracketQueue.h          |   72 +
 lib/sheenbidi/Source/BracketType.h           |   32 +
 lib/sheenbidi/Source/GeneralCategoryLookup.c | 1964 ++++++++++++++++
 lib/sheenbidi/Source/GeneralCategoryLookup.h |   16 +
 lib/sheenbidi/Source/IsolatingRun.c          |  529 +++++
 lib/sheenbidi/Source/IsolatingRun.h          |   47 +
 lib/sheenbidi/Source/LevelRun.c              |   68 +
 lib/sheenbidi/Source/LevelRun.h              |   42 +
 lib/sheenbidi/Source/PairingLookup.c         |  256 +++
 lib/sheenbidi/Source/PairingLookup.h         |   17 +
 lib/sheenbidi/Source/RunExtrema.h            |   50 +
 lib/sheenbidi/Source/RunKind.h               |   81 +
 lib/sheenbidi/Source/RunQueue.c              |  148 ++
 lib/sheenbidi/Source/RunQueue.h              |   55 +
 lib/sheenbidi/Source/SBAlgorithm.c           |  177 ++
 lib/sheenbidi/Source/SBAlgorithm.h           |   34 +
 lib/sheenbidi/Source/SBAssert.h              |   24 +
 lib/sheenbidi/Source/SBBase.c                |  420 ++++
 lib/sheenbidi/Source/SBBase.h                |  108 +
 lib/sheenbidi/Source/SBCodepointSequence.c   |  303 +++
 lib/sheenbidi/Source/SBCodepointSequence.h   |   25 +
 lib/sheenbidi/Source/SBLine.c                |  300 +++
 lib/sheenbidi/Source/SBLine.h                |   39 +
 lib/sheenbidi/Source/SBLog.c                 |  303 +++
 lib/sheenbidi/Source/SBLog.h                 |  153 ++
 lib/sheenbidi/Source/SBMirrorLocator.c       |  121 +
 lib/sheenbidi/Source/SBMirrorLocator.h       |   32 +
 lib/sheenbidi/Source/SBParagraph.c           |  646 ++++++
 lib/sheenbidi/Source/SBParagraph.h           |   38 +
 lib/sheenbidi/Source/SBScriptLocator.c       |  174 ++
 lib/sheenbidi/Source/SBScriptLocator.h       |   33 +
 lib/sheenbidi/Source/ScriptLookup.c          | 2142 ++++++++++++++++++
 lib/sheenbidi/Source/ScriptLookup.h          |   16 +
 lib/sheenbidi/Source/ScriptStack.c           |   83 +
 lib/sheenbidi/Source/ScriptStack.h           |   49 +
 lib/sheenbidi/Source/SheenBidi.c             |   42 +
 lib/sheenbidi/Source/StatusStack.c           |  111 +
 lib/sheenbidi/Source/StatusStack.h           |   58 +
 62 files changed, 11869 insertions(+), 1 deletion(-)
 create mode 100644 lib/sheenbidi/CMakeLists.txt
 create mode 100644 lib/sheenbidi/Headers/SBAlgorithm.h
 create mode 100644 lib/sheenbidi/Headers/SBBase.h
 create mode 100644 lib/sheenbidi/Headers/SBBidiType.h
 create mode 100644 lib/sheenbidi/Headers/SBCodepoint.h
 create mode 100644 lib/sheenbidi/Headers/SBCodepointSequence.h
 create mode 100644 lib/sheenbidi/Headers/SBConfig.h
 create mode 100644 lib/sheenbidi/Headers/SBGeneralCategory.h
 create mode 100644 lib/sheenbidi/Headers/SBLine.h
 create mode 100644 lib/sheenbidi/Headers/SBMirrorLocator.h
 create mode 100644 lib/sheenbidi/Headers/SBParagraph.h
 create mode 100644 lib/sheenbidi/Headers/SBRun.h
 create mode 100644 lib/sheenbidi/Headers/SBScript.h
 create mode 100644 lib/sheenbidi/Headers/SBScriptLocator.h
 create mode 100644 lib/sheenbidi/Headers/SheenBidi.h
 create mode 100755 lib/sheenbidi/LICENSE
 create mode 100644 lib/sheenbidi/README.md
 create mode 100644 lib/sheenbidi/Source/BidiChain.c
 create mode 100644 lib/sheenbidi/Source/BidiChain.h
 create mode 100644 lib/sheenbidi/Source/BidiTypeLookup.c
 create mode 100644 lib/sheenbidi/Source/BidiTypeLookup.h
 create mode 100644 lib/sheenbidi/Source/BracketQueue.c
 create mode 100644 lib/sheenbidi/Source/BracketQueue.h
 create mode 100644 lib/sheenbidi/Source/BracketType.h
 create mode 100644 lib/sheenbidi/Source/GeneralCategoryLookup.c
 create mode 100644 lib/sheenbidi/Source/GeneralCategoryLookup.h
 create mode 100644 lib/sheenbidi/Source/IsolatingRun.c
 create mode 100644 lib/sheenbidi/Source/IsolatingRun.h
 create mode 100644 lib/sheenbidi/Source/LevelRun.c
 create mode 100644 lib/sheenbidi/Source/LevelRun.h
 create mode 100644 lib/sheenbidi/Source/PairingLookup.c
 create mode 100644 lib/sheenbidi/Source/PairingLookup.h
 create mode 100644 lib/sheenbidi/Source/RunExtrema.h
 create mode 100644 lib/sheenbidi/Source/RunKind.h
 create mode 100644 lib/sheenbidi/Source/RunQueue.c
 create mode 100644 lib/sheenbidi/Source/RunQueue.h
 create mode 100644 lib/sheenbidi/Source/SBAlgorithm.c
 create mode 100644 lib/sheenbidi/Source/SBAlgorithm.h
 create mode 100644 lib/sheenbidi/Source/SBAssert.h
 create mode 100644 lib/sheenbidi/Source/SBBase.c
 create mode 100644 lib/sheenbidi/Source/SBBase.h
 create mode 100644 lib/sheenbidi/Source/SBCodepointSequence.c
 create mode 100644 lib/sheenbidi/Source/SBCodepointSequence.h
 create mode 100644 lib/sheenbidi/Source/SBLine.c
 create mode 100644 lib/sheenbidi/Source/SBLine.h
 create mode 100644 lib/sheenbidi/Source/SBLog.c
 create mode 100644 lib/sheenbidi/Source/SBLog.h
 create mode 100644 lib/sheenbidi/Source/SBMirrorLocator.c
 create mode 100644 lib/sheenbidi/Source/SBMirrorLocator.h
 create mode 100644 lib/sheenbidi/Source/SBParagraph.c
 create mode 100644 lib/sheenbidi/Source/SBParagraph.h
 create mode 100644 lib/sheenbidi/Source/SBScriptLocator.c
 create mode 100644 lib/sheenbidi/Source/SBScriptLocator.h
 create mode 100644 lib/sheenbidi/Source/ScriptLookup.c
 create mode 100644 lib/sheenbidi/Source/ScriptLookup.h
 create mode 100644 lib/sheenbidi/Source/ScriptStack.c
 create mode 100644 lib/sheenbidi/Source/ScriptStack.h
 create mode 100644 lib/sheenbidi/Source/SheenBidi.c
 create mode 100644 lib/sheenbidi/Source/StatusStack.c
 create mode 100644 lib/sheenbidi/Source/StatusStack.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 071f70c15..25c320c7c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -372,6 +372,11 @@ endif()
 
 # Text handling in STK (We use freetype, harfbuzz, fribidi and libraqm for i18n text handling)
 if (NOT SERVER_ONLY)
+    # SheenBidi
+    add_subdirectory("${PROJECT_SOURCE_DIR}/lib/sheenbidi")
+    include_directories("${PROJECT_SOURCE_DIR}/lib/sheenbidi/Headers")
+    SET(SHEENBIDI_LIBRARY sheenbidi)
+
     # Freetype
     find_package(Freetype)
     if(FREETYPE_FOUND)
@@ -665,6 +670,7 @@ if(NOT SERVER_ONLY)
         ${FREETYPE_LIBRARIES}
         ${HARFBUZZ_LIBRARY}
         ${SDL2_LIBRARY}
+        ${SHEENBIDI_LIBRARY}
         graphics_utils)
 endif()
 
diff --git a/android/Android.mk b/android/Android.mk
index 56d99f22e..a72e9fdd4 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -171,6 +171,16 @@ include $(BUILD_STATIC_LIBRARY)
 include $(CLEAR_VARS)
 
 
+# SheenBidi
+LOCAL_MODULE       := sheenbidi
+LOCAL_PATH         := .
+LOCAL_CPP_FEATURES += rtti
+LOCAL_SRC_FILES    := $(wildcard ../lib/sheenbidi/Source/*.c)
+LOCAL_CFLAGS       := -I../lib/sheenbidi/Headers
+include $(BUILD_STATIC_LIBRARY)
+include $(CLEAR_VARS)
+
+
 # Irrlicht
 LOCAL_MODULE       := irrlicht
 LOCAL_PATH         := .
@@ -249,6 +259,7 @@ LOCAL_LDLIBS       := -llog -landroid -lGLESv1_CM -lGLESv3 -lOpenSLES -ldl -lm
 LOCAL_CFLAGS       := -I../lib/angelscript/include      \
                       -I../lib/bullet/src               \
                       -I../lib/libraqm                  \
+                      -I../lib/sheenbidi/Headers        \
                       -I../lib/enet/include             \
                       -I../lib/ifaddrs                  \
                       -I../lib/irrlicht/include         \
@@ -279,7 +290,8 @@ LOCAL_CPPFLAGS     := -std=gnu++0x
 
 LOCAL_STATIC_LIBRARIES := irrlicht bullet enet ifaddrs angelscript mcpp SDL2 \
                           vorbisfile vorbis ogg openal curl libssl libcrypto \
-                          c++_static raqm fribidi harfbuzz freetype graphics_utils
+                          c++_static raqm fribidi sheenbidi harfbuzz freetype \
+                          graphics_utils
 
 include $(BUILD_SHARED_LIBRARY)
 include $(CLEAR_VARS)
diff --git a/lib/sheenbidi/CMakeLists.txt b/lib/sheenbidi/CMakeLists.txt
new file mode 100644
index 000000000..8c7a145fa
--- /dev/null
+++ b/lib/sheenbidi/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_definitions(-DSB_CONFIG_UNITY)
+include_directories("Headers")
+add_library(sheenbidi STATIC Source/SheenBidi.c)
diff --git a/lib/sheenbidi/Headers/SBAlgorithm.h b/lib/sheenbidi/Headers/SBAlgorithm.h
new file mode 100644
index 000000000..15758de64
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBAlgorithm.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2016-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_ALGORITHM_H
+#define _SB_PUBLIC_ALGORITHM_H
+
+#include "SBBase.h"
+#include "SBBidiType.h"
+#include "SBCodepointSequence.h"
+#include "SBParagraph.h"
+
+typedef struct _SBAlgorithm *SBAlgorithmRef;
+
+/**
+ * Creates an algorithm object for the specified code point sequence. The source string inside the
+ * code point sequence should not be freed until the algorithm object is in use.
+ *
+ * @param codepointSequence
+ *      The code point sequence to apply bidirectional algorithm on.
+ * @return
+ *      A reference to an algorithm object if the call was successful, NULL otherwise.
+ */
+SBAlgorithmRef SBAlgorithmCreate(const SBCodepointSequence *codepointSequence);
+
+/**
+ * Returns a direct pointer to the bidirectional types of code units, stored in the algorithm
+ * object.
+ *
+ * @param algorithm
+ *      The algorithm object from which to access the bidirectional types of code units.
+ * @return
+ *      A valid pointer to an array of SBBidiType structures, whose length will be equal to that of
+ *      string buffer.
+ */
+const SBBidiType *SBAlgorithmGetBidiTypesPtr(SBAlgorithmRef algorithm);
+
+/**
+ * Determines the boundary of first paragraph within the specified range.
+ *
+ * The boundary of the paragraph occurs after a code point whose bidirectional type is Paragraph
+ * Separator (B), or at the suggestedLength if no such code point exists before it. The exception to
+ * this rule is when a Carriage Return (CR) is followed by a Line Feed (LF). Both CR and LF are
+ * paragraph separators, but in that case, the boundary of the paragraph is considered after LF code
+ * point.
+ *
+ * @param algorithm
+ *      The algorithm object to use for determining paragraph boundary.
+ * @param paragraphOffset
+ *      The index to the first code unit of the paragraph in source string.
+ * @param suggestedLength
+ *      The number of code units covering the suggested length of the paragraph.
+ * @param acutalLength
+ *      The actual length of the first paragraph, including the paragraph separator, within the
+ *      given range.
+ * @param separatorLength
+ *      On output, the length of paragraph separator. This parameter can be set to NULL if not
+ *      needed.
+ */
+void SBAlgorithmGetParagraphBoundary(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength,
+    SBUInteger *acutalLength, SBUInteger *separatorLength);
+
+/**
+ * Creates a paragraph object processed with Unicode Bidirectional Algorithm.
+ *
+ * This function processes only first paragraph starting at paragraphOffset with length less than or
+ * equal to suggestedLength, in accordance with Rule P1 of Unicode Bidirectional Algorithm.
+ *
+ * The paragraph level is determined by applying Rules P2-P3 and embedding levels are resolved by
+ * applying Rules X1-I2.
+ *
+ * @param algorithm
+ *      The algorithm object to use for creating the desired paragraph.
+ * @param paragraphOffset
+ *      The index to the first code unit of the paragraph in source string.
+ * @param suggestedLength
+ *      The number of code units covering the suggested length of the paragraph.
+ * @param baseLevel
+ *      The desired base level of the paragraph. Rules P2-P3 would be ignored if it is neither
+ *      SBLevelDefaultLTR nor SBLevelDefaultRTL.
+ * @return
+ *      A reference to a paragraph object if the call was successful, NULL otherwise.
+ */
+SBParagraphRef SBAlgorithmCreateParagraph(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel);
+
+/**
+ * Increments the reference count of an algorithm object.
+ *
+ * @param algorithm
+ *      The algorithm object whose reference count will be incremented.
+ * @return
+ *      The same algorithm object passed in as the parameter.
+ */
+SBAlgorithmRef SBAlgorithmRetain(SBAlgorithmRef algorithm);
+
+/**
+ * Decrements the reference count of an algorithm object. The object will be deallocated when its
+ * reference count reaches zero.
+ *
+ * @param algorithm
+ *      The algorithm object whose reference count will be decremented.
+ */
+void SBAlgorithmRelease(SBAlgorithmRef algorithm);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBBase.h b/lib/sheenbidi/Headers/SBBase.h
new file mode 100644
index 000000000..dfadf1c1d
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBBase.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2014-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_BASE_H
+#define _SB_PUBLIC_BASE_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+/**
+ * A type to represent an 8-bit signed integer.
+ */
+typedef int8_t                      SBInt8;
+
+/**
+ * A type to represent a 16-bit signed integer.
+ */
+typedef int16_t                     SBInt16;
+
+/**
+ * A type to represent a 32-bit signed integer.
+ */
+typedef int32_t                     SBInt32;
+
+/**
+ * A type to represent an 8-bit unsigned integer.
+ */
+typedef uint8_t                     SBUInt8;
+
+/**
+ * A type to represent a 16-bit unsigned integer.
+ */
+typedef uint16_t                    SBUInt16;
+
+/**
+ * A type to represent a 32-bit unsigned integer.
+ */
+typedef uint32_t                    SBUInt32;
+
+/**
+ * A signed integer type whose width is equal to the width of the machine word.
+ */
+typedef intptr_t                    SBInteger;
+
+/**
+ * An unsigned integer type whose width is equal to the width of the machine word.
+ */
+typedef uintptr_t                   SBUInteger;
+
+/**
+ * Constants that specify the states of a boolean.
+ */
+enum {
+    SBFalse = 0, /**< A value representing the false state. */
+    SBTrue  = 1  /**< A value representing the true state. */
+};
+/**
+ * A type to represent a boolean value.
+ */
+typedef SBUInt8                     SBBoolean;
+
+#define SBUInt8InRange(v, s, e)     \
+(                                   \
+    (SBUInt8)((v) - (s))            \
+ <= (SBUInt8)((e) - (s))            \
+)
+
+#define SBUInt16InRange(v, s, e)    \
+(                                   \
+    (SBUInt16)((v) - (s))           \
+ <= (SBUInt16)((e) - (s))           \
+)
+
+#define SBUInt32InRange(v, s, e)    \
+(                                   \
+    (SBUInt32)((v) - (s))           \
+ <= (SBUInt32)((e) - (s))           \
+)
+
+
+/**
+ * A type to represent a bidi level.
+ */
+typedef SBUInt8                     SBLevel;
+
+/**
+ * A value representing an invalid bidi level.
+ */
+#define SBLevelInvalid              0xFF
+
+/**
+ * A value representing maximum explicit embedding level.
+ */
+#define SBLevelMax                  125
+
+/**
+ * A value specifying to set base level to zero (left-to-right) if there is no strong character.
+ */
+#define SBLevelDefaultLTR           0xFE
+
+/**
+ * A value specifying to set base level to one (right-to-left) if there is no strong character.
+ */
+#define SBLevelDefaultRTL           0xFD
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBBidiType.h b/lib/sheenbidi/Headers/SBBidiType.h
new file mode 100644
index 000000000..0aaaad14f
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBBidiType.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_BIDI_TYPE_H
+#define _SB_PUBLIC_BIDI_TYPE_H
+
+#include "SBBase.h"
+
+/**
+ * Constants that specify the bidirectional types of a character.
+ */
+enum {
+    SBBidiTypeNil = 0x00,
+
+    SBBidiTypeL   = 0x01,   /**< Strong: Left-to-Right */
+    SBBidiTypeR   = 0x02,   /**< Strong: Right-to-Left */
+    SBBidiTypeAL  = 0x03,   /**< Strong: Right-to-Left Arabic */
+
+    SBBidiTypeBN  = 0x04,   /**< Weak: Boundary Neutral */
+    SBBidiTypeNSM = 0x05,   /**< Weak: Non-Spacing Mark */
+    SBBidiTypeAN  = 0x06,   /**< Weak: Arabic Number */
+    SBBidiTypeEN  = 0x07,   /**< Weak: European Number */
+    SBBidiTypeET  = 0x08,   /**< Weak: European Number Terminator */
+    SBBidiTypeES  = 0x09,   /**< Weak: European Number Separator */
+    SBBidiTypeCS  = 0x0A,   /**< Weak: Common Number Separator */
+
+    SBBidiTypeWS  = 0x0B,   /**< Neutral: White Space */
+    SBBidiTypeS   = 0x0C,   /**< Neutral: Segment Separator */
+    SBBidiTypeB   = 0x0D,   /**< Neutral: Paragraph Separator */
+    SBBidiTypeON  = 0x0E,   /**< Neutral: Other Neutral */
+
+    SBBidiTypeLRI = 0x0F,   /**< Format: Left-to-Right Isolate */
+    SBBidiTypeRLI = 0x10,   /**< Format: Right-to-Left Isolate */
+    SBBidiTypeFSI = 0x11,   /**< Format: First Strong Isolate */
+    SBBidiTypePDI = 0x12,   /**< Format: Pop Directional Isolate */
+    SBBidiTypeLRE = 0x13,   /**< Format: Left-to-Right Embedding */
+    SBBidiTypeRLE = 0x14,   /**< Format: Right-to-Left Embedding */
+    SBBidiTypeLRO = 0x15,   /**< Format: Left-to-Right Override */
+    SBBidiTypeRLO = 0x16,   /**< Format: Right-to-Left Override */
+    SBBidiTypePDF = 0x17    /**< Format: Pop Directional Formatting */
+};
+
+/**
+ * A type to represent the bidirectional type of a character.
+ */
+typedef SBUInt8 SBBidiType;
+
+/**
+ * Checks whether specified bidirectional type is strong.
+ */
+#define SBBidiTypeIsStrong(t)               SBUInt8InRange(t, SBBidiTypeL, SBBidiTypeAL)
+
+/**
+ * Checks whether specified bidirectional type is weak.
+ */
+#define SBBidiTypeIsWeak(t)                 SBUInt8InRange(t, SBBidiTypeBN, SBBidiTypeCS)
+
+/**
+ * Checks whether specified bidirectional type is neutral.
+ */
+#define SBBidiTypeIsNeutral(t)              SBUInt8InRange(t, SBBidiTypeWS, SBBidiTypeON)
+
+/**
+ * Checks whether specified bidirectional type is format.
+ */
+#define SBBidiTypeIsFormat(t)               SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypePDF)
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBCodepoint.h b/lib/sheenbidi/Headers/SBCodepoint.h
new file mode 100644
index 000000000..b22e07ba1
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBCodepoint.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_CODEPOINT_H
+#define _SB_PUBLIC_CODEPOINT_H
+
+#include "SBBase.h"
+#include "SBBidiType.h"
+#include "SBGeneralCategory.h"
+#include "SBScript.h"
+
+/**
+ * A type to represent a unicode code point.
+ */
+typedef SBUInt32                    SBCodepoint;
+
+/**
+ * A value representing an invalid code point.
+ */
+#define SBCodepointInvalid          UINT32_MAX
+
+/**
+ * A value representing a faulty code point, used as a replacement by the decoder.
+ */
+#define SBCodepointFaulty           0xFFFD
+
+/**
+ * Returns the bidirectional type of a code point.
+ *
+ * @param codepoint
+ *      The code point whose bidirectional type is returned.
+ * @return
+ *      The bidirectional type of specified code point.
+ */
+SBBidiType SBCodepointGetBidiType(SBCodepoint codepoint);
+
+/**
+ * Returns the general category of a code point.
+ *
+ * @param codepoint
+ *      The code point whose general category is returned.
+ * @return
+ *      The general category of specified code point.
+ */
+SBGeneralCategory SBCodepointGetGeneralCategory(SBCodepoint codepoint);
+
+/**
+ * Returns the mirror of a code point.
+ *
+ * @param codepoint
+ *      The code point whose mirror is returned.
+ * @return
+ *      The mirror of specified code point if available, 0 otherwise.
+ */
+SBCodepoint SBCodepointGetMirror(SBCodepoint codepoint);
+
+/**
+ * Returns the script of a code point.
+ *
+ * @param codepoint
+ *      The code point whose script is returned.
+ * @return
+ *      The script of specified code point.
+ */
+SBScript SBCodepointGetScript(SBCodepoint codepoint);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBCodepointSequence.h b/lib/sheenbidi/Headers/SBCodepointSequence.h
new file mode 100644
index 000000000..f1f8a5c3f
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBCodepointSequence.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_CODEPOINT_SEQUENCE_H
+#define _SB_PUBLIC_CODEPOINT_SEQUENCE_H
+
+#include "SBBase.h"
+#include "SBCodepoint.h"
+
+enum {
+    SBStringEncodingUTF8 = 0,  /**< An 8-bit representation of Unicode code points. */
+    SBStringEncodingUTF16 = 1, /**< 16-bit UTF encoding in native endianness. */
+    SBStringEncodingUTF32 = 2  /**< 32-bit UTF encoding in native endianness. */
+};
+typedef SBUInt32 SBStringEncoding;
+
+typedef struct _SBCodepointSequence {
+    SBStringEncoding stringEncoding; /**< The encoding of the string. */
+    void *stringBuffer;              /**< The source string containing the code units. */
+    SBUInteger stringLength;         /**< The length of the string in terms of code units. */
+} SBCodepointSequence;
+
+/**
+ * Returns the code point before the given string index.
+ *
+ * @param codepointSequence
+ *      The object holding the information of the string.
+ * @param stringIndex
+ *      The index of code unit before which to get the code point. On output, it is set to point to
+ *      the first code unit of returned code point.
+ * @return
+ *      The code point before the given string index, or SBCodepointInvalid if stringIndex is equal 
+ *      to zero or larger than actual length of source string.
+ */
+SBCodepoint SBCodepointSequenceGetCodepointBefore(const SBCodepointSequence *codepointSequence,
+    SBUInteger *stringIndex);
+
+/**
+ * Returns the code point at the given string index.
+ *
+ * @param codepointSequence
+ *      The object holding the information of the string.
+ * @param stringIndex
+ *      The index of code unit at which to get the code point. On output, it is set to point to the
+ *      first code unit of next code point.
+ * @return
+ *      The code point at the given string index, or SBCodepointInvalid if stringIndex is larger
+ *      than or equal to actual length of source string.
+ */
+SBCodepoint SBCodepointSequenceGetCodepointAt(const SBCodepointSequence *codepointSequence,
+    SBUInteger *stringIndex);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBConfig.h b/lib/sheenbidi/Headers/SBConfig.h
new file mode 100644
index 000000000..801e91abb
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBConfig.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2014 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_CONFIG_H
+#define _SB_PUBLIC_CONFIG_H
+
+/* #define SB_CONFIG_LOG */
+/* #define SB_CONFIG_UNITY */
+
+#ifdef SB_CONFIG_UNITY
+#define SB_INTERNAL static
+#else
+#define SB_INTERNAL
+#endif
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBGeneralCategory.h b/lib/sheenbidi/Headers/SBGeneralCategory.h
new file mode 100644
index 000000000..ce15284fc
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBGeneralCategory.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_GENERAL_CATEGORY_H
+#define _SB_PUBLIC_GENERAL_CATEGORY_H
+
+#include "SBBase.h"
+
+/**
+ * Constants that specify the general category of a character.
+ */
+enum {
+    SBGeneralCategoryNil = 0x00,
+
+    SBGeneralCategoryLU  = 0x01, /**< Letter: Uppercase Letter */
+    SBGeneralCategoryLL  = 0x02, /**< Letter: Lowercase Letter */
+    SBGeneralCategoryLT  = 0x03, /**< Letter: Titlecase Letter */
+    SBGeneralCategoryLM  = 0x04, /**< Letter: Modifier Letter */
+    SBGeneralCategoryLO  = 0x05, /**< Letter: Other Letter */
+
+    SBGeneralCategoryMN  = 0x06, /**< Mark: Nonspacing Mark */
+    SBGeneralCategoryMC  = 0x07, /**< Mark: Spacing Mark */
+    SBGeneralCategoryME  = 0x08, /**< Mark: Enclosing Mark */
+
+    SBGeneralCategoryND  = 0x09, /**< Number: Decimal Number */
+    SBGeneralCategoryNL  = 0x0A, /**< Number: Letter Number */
+    SBGeneralCategoryNO  = 0x0B, /**< Number: Other Number */
+
+    SBGeneralCategoryPC  = 0x0C, /**< Punctuation: Connector Punctuation */
+    SBGeneralCategoryPD  = 0x0D, /**< Punctuation: Dash Punctuation */
+    SBGeneralCategoryPS  = 0x0E, /**< Punctuation: Open Punctuation */
+    SBGeneralCategoryPE  = 0x0F, /**< Punctuation: Close Punctuation */
+    SBGeneralCategoryPI  = 0x10, /**< Punctuation: Initial Punctuation */
+    SBGeneralCategoryPF  = 0x11, /**< Punctuation: Final Punctuation */
+    SBGeneralCategoryPO  = 0x12, /**< Punctuation: Other Punctuation */
+
+    SBGeneralCategorySM  = 0x13, /**< Symbol: Math Symbol */
+    SBGeneralCategorySC  = 0x14, /**< Symbol: Currency Symbol */
+    SBGeneralCategorySK  = 0x15, /**< Symbol: Modifier Symbol */
+    SBGeneralCategorySO  = 0x16, /**< Symbol: Other Symbol */
+
+    SBGeneralCategoryZS  = 0x17, /**< Separator: Space Separator */
+    SBGeneralCategoryZL  = 0x18, /**< Separator: Line Separator */
+    SBGeneralCategoryZP  = 0x19, /**< Separator: Paragraph Separator */
+
+    SBGeneralCategoryCC  = 0x1A, /**< Other: Control */
+    SBGeneralCategoryCF  = 0x1B, /**< Other: Format */
+    SBGeneralCategoryCS  = 0x1C, /**< Other: Surrogate */
+    SBGeneralCategoryCO  = 0x1D, /**< Other: Private_Use */
+    SBGeneralCategoryCN  = 0x1E  /**< Other: Unassigned */
+};
+
+/**
+ * A type to represent the general category of a character.
+ */
+typedef SBUInt8 SBGeneralCategory;
+
+/**
+ * Checks whether specified general category is letter.
+ */
+#define SBGeneralCategoryIsLetter(gc)       SBUInt8InRange(gc, SBGeneralCategoryLU, SBGeneralCategoryLO)
+
+/**
+ * Checks whether specified general category is mark.
+ */
+#define SBGeneralCategoryIsMark(gc)         SBUInt8InRange(gc, SBGeneralCategoryMN, SBGeneralCategoryME)
+
+/**
+ * Checks whether specified general category is number.
+ */
+#define SBGeneralCategoryIsNumber(gc)       SBUInt8InRange(gc, SBGeneralCategoryND, SBGeneralCategoryNO)
+
+/**
+ * Checks whether specified general category is punctuation.
+ */
+#define SBGeneralCategoryIsPunctuation(gc)  SBUInt8InRange(gc, SBGeneralCategoryPC, SBGeneralCategoryPO)
+
+/**
+ * Checks whether specified general category is symbol.
+ */
+#define SBGeneralCategoryIsSymbol(gc)       SBUInt8InRange(gc, SBGeneralCategorySM, SBGeneralCategorySO)
+
+/**
+ * Checks whether specified general category is separator.
+ */
+#define SBGeneralCategoryIsSeparator(gc)    SBUInt8InRange(gc, SBGeneralCategoryZS, SBGeneralCategoryZP)
+
+/**
+ * Checks whether specified general category is other.
+ */
+#define SBGeneralCategoryIsOther(gc)        SBUInt8InRange(gc, SBGeneralCategoryCC, SBGeneralCategoryCN)
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBLine.h b/lib/sheenbidi/Headers/SBLine.h
new file mode 100644
index 000000000..b3f612340
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBLine.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2014-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_LINE_H
+#define _SB_PUBLIC_LINE_H
+
+#include "SBBase.h"
+#include "SBRun.h"
+
+typedef struct _SBLine *SBLineRef;
+
+/**
+ * Returns the index to the first code unit of the line in source string.
+ *
+ * @param line
+ *      The line whose offset is returned.
+ * @return
+ *      The offset of the line passed in.
+ */
+SBUInteger SBLineGetOffset(SBLineRef line);
+
+/**
+ * Returns the number of code units coverting the length of the line.
+ *
+ * @param line
+ *      The line whose length is returned.
+ * @return
+ *      The length of the line passed in.
+ */
+SBUInteger SBLineGetLength(SBLineRef line);
+
+/**
+ * Returns the number of runs in the line.
+ *
+ * @param line
+ *      The line whose run count is returned.
+ * @return
+ *      The number of runs in the line passed in.
+ */
+SBUInteger SBLineGetRunCount(SBLineRef line);
+
+/**
+ * Returns a direct pointer to the run array, stored in the line.
+ *
+ * @param line
+ *      The line from which to access the runs.
+ * @return
+ *      A valid pointer to an array of SBRun structures. 
+ */
+const SBRun *SBLineGetRunsPtr(SBLineRef line);
+
+/**
+ * Increments the reference count of a line object.
+ *
+ * @param line
+ *      The line object whose reference count will be incremented.
+ * @return
+ *      The same line object passed in as the parameter.
+ */
+SBLineRef SBLineRetain(SBLineRef line);
+
+/**
+ * Decrements the reference count of a line object. The object will be deallocated when its
+ * reference count reaches zero.
+ *
+ * @param line
+ *      The line object whose reference count will be decremented.
+ */
+void SBLineRelease(SBLineRef line);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBMirrorLocator.h b/lib/sheenbidi/Headers/SBMirrorLocator.h
new file mode 100644
index 000000000..dc3effeab
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBMirrorLocator.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2014-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_MIRROR_LOCATOR_H
+#define _SB_PUBLIC_MIRROR_LOCATOR_H
+
+#include "SBBase.h"
+#include "SBCodepoint.h"
+#include "SBLine.h"
+
+typedef struct _SBMirrorLocator *SBMirrorLocatorRef;
+
+/**
+ * A structure containing the information about a code point having Bidi_Mirrored property.
+ */
+typedef struct _SBMirrorAgent {
+    SBUInteger index;      /**< The absolute index of the code point. */
+    SBCodepoint mirror;    /**< The mirrored code point. */
+    SBCodepoint codepoint; /**< The actual code point. */
+} SBMirrorAgent;
+
+/**
+ * Creates a mirror locator object which can be used to find mirrors in a line.
+ *
+ * @return
+ *      A reference to a mirror locator object.
+ */
+SBMirrorLocatorRef SBMirrorLocatorCreate(void);
+
+/**
+ * Loads a line in the locator so that its mirror can be located.
+ *
+ * @param locator
+ *      The locator in which the line will be loaded.
+ * @param line
+ *      The line which will be loaded in the locator.
+ * @param stringBuffer
+ *      The string buffer from which the line's algorithm was created.
+ */
+void SBMirrorLocatorLoadLine(SBMirrorLocatorRef locator, SBLineRef line, void *stringBuffer);
+
+/**
+ * Returns the agent containing the information of current located mirror.
+ *
+ * @param locator
+ *      The locator whose agent is returned.
+ */
+const SBMirrorAgent *SBMirrorLocatorGetAgent(SBMirrorLocatorRef locator);
+
+/**
+ * Instructs the locator to find next mirror in the loaded line.
+ *
+ * @param locator
+ *      The locator whom you want to instruct.
+ * @return
+ *      SBTrue if another mirror is available, SBFalse otherwise.
+ * @note
+ *      The locator will be reset after locating last mirror.
+ */
+SBBoolean SBMirrorLocatorMoveNext(SBMirrorLocatorRef locator);
+
+/**
+ * Instructs the locator to reset itself so that mirrors of the loaded line can be obatained from
+ * the beginning.
+ *
+ * @param locator
+ *      The locator whom you want to reset.
+ */
+void SBMirrorLocatorReset(SBMirrorLocatorRef locator);
+
+/**
+ * Increments the reference count of a mirror locator object.
+ *
+ * @param locator
+ *      The mirror locator object whose reference count will be incremented.
+ * @return
+ *      The same mirror locator object passed in as the parameter.
+ */
+SBMirrorLocatorRef SBMirrorLocatorRetain(SBMirrorLocatorRef locator);
+
+/**
+ * Decrements the reference count of a mirror locator object. The object will be deallocated when
+ * its reference count reaches zero.
+ *
+ * @param locator
+ *      The mirror locator object whose reference count will be decremented.
+ */
+void SBMirrorLocatorRelease(SBMirrorLocatorRef locator);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBParagraph.h b/lib/sheenbidi/Headers/SBParagraph.h
new file mode 100644
index 000000000..07fe59d45
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBParagraph.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_PARAGRAPH_H
+#define _SB_PUBLIC_PARAGRAPH_H
+
+#include "SBBase.h"
+#include "SBLine.h"
+
+typedef struct _SBParagraph *SBParagraphRef;
+
+/**
+ * Returns the index to the first code unit of the paragraph in source string.
+ *
+ * @param paragraph
+ *      The paragraph whose offset is returned.
+ * @return
+ *      The offset of the paragraph passed in.
+ */
+SBUInteger SBParagraphGetOffset(SBParagraphRef paragraph);
+
+/**
+ * Returns the number of code units covering the length of the paragraph.
+ *
+ * @param paragraph
+ *      The paragraph whose length is returned.
+ * @return
+ *      The length of the paragraph passed in.
+ */
+SBUInteger SBParagraphGetLength(SBParagraphRef paragraph);
+
+/**
+ * Returns the base level of the paragraph.
+ *
+ * @param paragraph
+ *      The paragraph whose base level is returned.
+ * @return
+ *      The base level of the paragraph passed in.
+ */
+SBLevel SBParagraphGetBaseLevel(SBParagraphRef paragraph);
+
+/**
+ * Returns a direct pointer to the embedding levels, stored in the paragraph.
+ *
+ * @param paragraph
+ *      The paragraph from which to access the embedding levels.
+ * @return
+ *      A valid pointer to an array of SBLevel structures.
+ */
+const SBLevel *SBParagraphGetLevelsPtr(SBParagraphRef paragraph);
+
+/**
+ * Creates a line object of specified range by applying rules L1-L2 of Unicode Bidirectional
+ * Algorithm.
+ *
+ * @param paragraph
+ *      The paragraph that creates the line.
+ * @param lineOffset
+ *      The index to the first code unit of the line in source string. It should occur within the
+ *      range of paragraph.
+ * @param lineLength
+ *      The number of code units covering the length of the line.
+ * @return
+ *      A reference to a line object if the call was successful, NULL otherwise.
+ */
+SBLineRef SBParagraphCreateLine(SBParagraphRef paragraph, SBUInteger lineOffset, SBUInteger lineLength);
+
+/**
+ * Increments the reference count of a paragraph object.
+ *
+ * @param paragraph
+ *      The paragraph object whose reference count will be incremented.
+ * @return
+ *      The same paragraph object passed in as the parameter.
+ */
+SBParagraphRef SBParagraphRetain(SBParagraphRef paragraph);
+
+/**
+ * Decrements the reference count of a paragraph object. The object will be deallocated when its
+ * reference count reaches zero.
+ *
+ * @param paragraph
+ *      The paragraph object whose reference count will be decremented.
+ */
+void SBParagraphRelease(SBParagraphRef paragraph);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBRun.h b/lib/sheenbidi/Headers/SBRun.h
new file mode 100644
index 000000000..71cbe14c7
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBRun.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_RUN_H
+#define _SB_PUBLIC_RUN_H
+
+#include "SBBase.h"
+
+/**
+ * A structure containing the information of a sequence of characters having the same embedding
+ * level.
+ */
+typedef struct _SBRun {
+    SBUInteger offset; /**< The index to the first code unit of the run in source string. */
+    SBUInteger length; /**< The number of code units covering the length of the run. */
+    SBLevel level;     /**< The embedding level of the run. */
+} SBRun;
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBScript.h b/lib/sheenbidi/Headers/SBScript.h
new file mode 100644
index 000000000..5d5c9360e
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBScript.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2018-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_SCRIPT_H
+#define _SB_PUBLIC_SCRIPT_H
+
+#include "SBBase.h"
+
+/**
+ * Constants that specify the script of a character.
+ */
+enum {
+    SBScriptNil  = 0x00,
+
+    SBScriptZINH = 0x01,    /**< Inherited */
+    SBScriptZYYY = 0x02,    /**< Common */
+    SBScriptZZZZ = 0x03,    /**< Unknown */
+
+    /* Unicode 1.1  */
+    SBScriptARAB = 0x04,    /**< Arabic */
+    SBScriptARMN = 0x05,    /**< Armenian */
+    SBScriptBENG = 0x06,    /**< Bengali */
+    SBScriptBOPO = 0x07,    /**< Bopomofo */
+    SBScriptCYRL = 0x08,    /**< Cyrillic */
+    SBScriptDEVA = 0x09,    /**< Devanagari */
+    SBScriptGEOR = 0x0A,    /**< Georgian */
+    SBScriptGREK = 0x0B,    /**< Greek */
+    SBScriptGUJR = 0x0C,    /**< Gujarati */
+    SBScriptGURU = 0x0D,    /**< Gurmukhi */
+    SBScriptHANG = 0x0E,    /**< Hangul */
+    SBScriptHANI = 0x0F,    /**< Han */
+    SBScriptHEBR = 0x10,    /**< Hebrew */
+    SBScriptHIRA = 0x11,    /**< Hiragana */
+    SBScriptKANA = 0x12,    /**< Katakana */
+    SBScriptKNDA = 0x13,    /**< Kannada */
+    SBScriptLAOO = 0x14,    /**< Lao */
+    SBScriptLATN = 0x15,    /**< Latin */
+    SBScriptMLYM = 0x16,    /**< Malayalam */
+    SBScriptORYA = 0x17,    /**< Oriya */
+    SBScriptTAML = 0x18,    /**< Tamil */
+    SBScriptTELU = 0x19,    /**< Telugu */
+    SBScriptTHAI = 0x1A,    /**< Thai */
+
+    /* Unicode 2.0 */
+    SBScriptTIBT = 0x1B,    /**< Tibetan */
+
+    /* Unicode 3.0 */
+    SBScriptBRAI = 0x1C,    /**< Braille */
+    SBScriptCANS = 0x1D,    /**< Canadian_Aboriginal */
+    SBScriptCHER = 0x1E,    /**< Cherokee */
+    SBScriptETHI = 0x1F,    /**< Ethiopic */
+    SBScriptKHMR = 0x20,    /**< Khmer */
+    SBScriptMONG = 0x21,    /**< Mongolian */
+    SBScriptMYMR = 0x22,    /**< Myanmar */
+    SBScriptOGAM = 0x23,    /**< Ogham */
+    SBScriptRUNR = 0x24,    /**< Runic */
+    SBScriptSINH = 0x25,    /**< Sinhala */
+    SBScriptSYRC = 0x26,    /**< Syriac */
+    SBScriptTHAA = 0x27,    /**< Thaana */
+    SBScriptYIII = 0x28,    /**< Yi */
+
+    /* Unicode 3.1 */
+    SBScriptDSRT = 0x29,    /**< Deseret */
+    SBScriptGOTH = 0x2A,    /**< Gothic */
+    SBScriptITAL = 0x2B,    /**< Old_Italic */
+
+    /* Unicode 3.2 */
+    SBScriptBUHD = 0x2C,    /**< Buhid */
+    SBScriptHANO = 0x2D,    /**< Hanunoo */
+    SBScriptTAGB = 0x2E,    /**< Tagbanwa */
+    SBScriptTGLG = 0x2F,    /**< Tagalog */
+
+    /* Unicode 4.0 */
+    SBScriptCPRT = 0x30,    /**< Cypriot */
+    SBScriptLIMB = 0x31,    /**< Limbu */
+    SBScriptLINB = 0x32,    /**< Linear_B */
+    SBScriptOSMA = 0x33,    /**< Osmanya */
+    SBScriptSHAW = 0x34,    /**< Shavian */
+    SBScriptTALE = 0x35,    /**< Tai_Le */
+    SBScriptUGAR = 0x36,    /**< Ugaritic */
+
+    /* Unicode 4.1 */
+    SBScriptBUGI = 0x37,    /**< Buginese */
+    SBScriptCOPT = 0x38,    /**< Coptic */
+    SBScriptGLAG = 0x39,    /**< Glagolitic */
+    SBScriptKHAR = 0x3A,    /**< Kharoshthi */
+    SBScriptSYLO = 0x3B,    /**< Syloti_Nagri */
+    SBScriptTALU = 0x3C,    /**< New_Tai_Lue */
+    SBScriptTFNG = 0x3D,    /**< Tifinagh */
+    SBScriptXPEO = 0x3E,    /**< Old_Persian */
+
+    /* Unicode 5.0 */
+    SBScriptBALI = 0x3F,    /**< Balinese */
+    SBScriptNKOO = 0x40,    /**< Nko */
+    SBScriptPHAG = 0x41,    /**< Phags_Pa */
+    SBScriptPHNX = 0x42,    /**< Phoenician */
+    SBScriptXSUX = 0x43,    /**< Cuneiform */
+
+    /* Unicode 5.1 */
+    SBScriptCARI = 0x44,    /**< Carian */
+    SBScriptCHAM = 0x45,    /**< Cham */
+    SBScriptKALI = 0x46,    /**< Kayah_Li */
+    SBScriptLEPC = 0x47,    /**< Lepcha */
+    SBScriptLYCI = 0x48,    /**< Lycian */
+    SBScriptLYDI = 0x49,    /**< Lydian */
+    SBScriptOLCK = 0x4A,    /**< Ol_Chiki */
+    SBScriptRJNG = 0x4B,    /**< Rejang */
+    SBScriptSAUR = 0x4C,    /**< Saurashtra */
+    SBScriptSUND = 0x4D,    /**< Sundanese */
+    SBScriptVAII = 0x4E,    /**< Vai */
+
+    /* Unicode 5.2 */
+    SBScriptARMI = 0x4F,    /**< Imperial_Aramaic */
+    SBScriptAVST = 0x50,    /**< Avestan */
+    SBScriptBAMU = 0x51,    /**< Bamum */
+    SBScriptEGYP = 0x52,    /**< Egyptian_Hieroglyphs */
+    SBScriptJAVA = 0x53,    /**< Javanese */
+    SBScriptKTHI = 0x54,    /**< Kaithi */
+    SBScriptLANA = 0x55,    /**< Tai_Tham */
+    SBScriptLISU = 0x56,    /**< Lisu */
+    SBScriptMTEI = 0x57,    /**< Meetei_Mayek */
+    SBScriptORKH = 0x58,    /**< Old_Turkic */
+    SBScriptPHLI = 0x59,    /**< Inscriptional_Pahlavi */
+    SBScriptPRTI = 0x5A,    /**< Inscriptional_Parthian */
+    SBScriptSAMR = 0x5B,    /**< Samaritan */
+    SBScriptSARB = 0x5C,    /**< Old_South_Arabian */
+    SBScriptTAVT = 0x5D,    /**< Tai_Viet */
+
+    /* Unicode 6.0 */
+    SBScriptBATK = 0x5E,    /**< Batak */
+    SBScriptBRAH = 0x5F,    /**< Brahmi */
+    SBScriptMAND = 0x60,    /**< Mandaic */
+
+    /* Unicode 6.1 */
+    SBScriptCAKM = 0x61,    /**< Chakma */
+    SBScriptMERC = 0x62,    /**< Meroitic_Cursive */
+    SBScriptMERO = 0x63,    /**< Meroitic_Hieroglyphs */
+    SBScriptPLRD = 0x64,    /**< Miao */
+    SBScriptSHRD = 0x65,    /**< Sharada */
+    SBScriptSORA = 0x66,    /**< Sora_Sompeng */
+    SBScriptTAKR = 0x67,    /**< Takri */
+
+    /* Unicode 7.0 */
+    SBScriptAGHB = 0x68,    /**< Caucasian_Albanian */
+    SBScriptBASS = 0x69,    /**< Bassa_Vah */
+    SBScriptDUPL = 0x6A,    /**< Duployan */
+    SBScriptELBA = 0x6B,    /**< Elbasan */
+    SBScriptGRAN = 0x6C,    /**< Grantha */
+    SBScriptHMNG = 0x6D,    /**< Pahawh_Hmong */
+    SBScriptKHOJ = 0x6E,    /**< Khojki */
+    SBScriptLINA = 0x6F,    /**< Linear_A */
+    SBScriptMAHJ = 0x70,    /**< Mahajani */
+    SBScriptMANI = 0x71,    /**< Manichaean */
+    SBScriptMEND = 0x72,    /**< Mende_Kikakui */
+    SBScriptMODI = 0x73,    /**< Modi */
+    SBScriptMROO = 0x74,    /**< Mro */
+    SBScriptNARB = 0x75,    /**< Old_North_Arabian */
+    SBScriptNBAT = 0x76,    /**< Nabataean */
+    SBScriptPALM = 0x77,    /**< Palmyrene */
+    SBScriptPAUC = 0x78,    /**< Pau_Cin_Hau */
+    SBScriptPERM = 0x79,    /**< Old_Permic */
+    SBScriptPHLP = 0x7A,    /**< Psalter_Pahlavi */
+    SBScriptSIDD = 0x7B,    /**< Siddham */
+    SBScriptSIND = 0x7C,    /**< Khudawadi */
+    SBScriptTIRH = 0x7D,    /**< Tirhuta */
+    SBScriptWARA = 0x7E,    /**< Warang_Citi */
+
+    /* Unicode 8.0 */
+    SBScriptAHOM = 0x7F,    /**< Ahom */
+    SBScriptHATR = 0x80,    /**< Hatran */
+    SBScriptHLUW = 0x81,    /**< Anatolian_Hieroglyphs */
+    SBScriptHUNG = 0x82,    /**< Old_Hungarian */
+    SBScriptMULT = 0x83,    /**< Multani */
+    SBScriptSGNW = 0x84,    /**< SignWriting */
+
+    /* Unicode 9.0 */
+    SBScriptADLM = 0x85,    /**< Adlam */
+    SBScriptBHKS = 0x86,    /**< Bhaiksuki */
+    SBScriptMARC = 0x87,    /**< Marchen */
+    SBScriptNEWA = 0x88,    /**< Newa */
+    SBScriptOSGE = 0x89,    /**< Osage */
+    SBScriptTANG = 0x8A,    /**< Tangut */
+
+    /* Unicode 10.0 */
+    SBScriptGONM = 0x8B,    /**< Masaram_Gondi */
+    SBScriptNSHU = 0x8C,    /**< Nushu */
+    SBScriptSOYO = 0x8D,    /**< Soyombo */
+    SBScriptZANB = 0x8E,    /**< Zanabazar_Square */
+
+    /* Unicode 11.0 */
+    SBScriptDOGR = 0x8F,    /**< Dogra */
+    SBScriptGONG = 0x90,    /**< Gunjala_Gondi */
+    SBScriptMAKA = 0x91,    /**< Makasar */
+    SBScriptMEDF = 0x92,    /**< Medefaidrin */
+    SBScriptROHG = 0x93,    /**< Hanifi_Rohingya */
+    SBScriptSOGD = 0x94,    /**< Sogdian */
+    SBScriptSOGO = 0x95,    /**< Old_Sogdian */
+
+    /* Unicode 12.0 */
+    SBScriptELYM = 0x96,    /**< Elymaic */
+    SBScriptHMNP = 0x97,    /**< Nyiakeng_Puachue_Hmong */
+    SBScriptNAND = 0x98,    /**< Nandinagari */
+    SBScriptWCHO = 0x99,    /**< Wancho */
+
+    /* Unicde 13.0 */
+    SBScriptCHRS = 0x9A,    /**< Chorasmian */
+    SBScriptDIAK = 0x9B,    /**< Dives_Akuru */
+    SBScriptKITS = 0x9C,    /**< Khitan_Small_Script */
+    SBScriptYEZI = 0x9D     /**< Yezidi */
+};
+
+/**
+ * A type to represent the script of a character.
+ */
+typedef SBUInt8 SBScript;
+
+/**
+ * Returns the OpenType tag of a script as UInt32 in big endian byte order. The association between
+ * Unicode Script property and OpenType script tags is taken from the specification:
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags.
+ *
+ * If more than one tag is associated with a script, then the latest one is retured. For example,
+ * Devanagari script has two tags, `deva` and `dev2`. So in this case, `dev2` will be returned.
+ *
+ * If no tag is associated with a script, then `DFLT` is returned.
+ *
+ * @param script
+ *      The script whose OpenType tag is returned.
+ * @return
+ *      The OpenType tag of specified script as UInt32 in big endian byte order.
+ */
+SBUInt32 SBScriptGetOpenTypeTag(SBScript script);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SBScriptLocator.h b/lib/sheenbidi/Headers/SBScriptLocator.h
new file mode 100644
index 000000000..cad4afbb2
--- /dev/null
+++ b/lib/sheenbidi/Headers/SBScriptLocator.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_PUBLIC_SCRIPT_LOCATOR_H
+#define _SB_PUBLIC_SCRIPT_LOCATOR_H
+
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+#include "SBScript.h"
+
+typedef struct _SBScriptLocator *SBScriptLocatorRef;
+
+/**
+ * A structure containing the information about a run of code points having same script.
+ */
+typedef struct _SBScriptAgent {
+    SBUInteger offset; /**< The index to the first code unit of the run in source string. */
+    SBUInteger length; /**< The number of code units covering the length of the run. */
+    SBScript script;   /**< The script of the run. */
+} SBScriptAgent;
+
+/**
+ * Creates a script locator object which can be used to find script runs in a string.
+ *
+ * @return
+ *      A reference to a script locator object.
+ */
+SBScriptLocatorRef SBScriptLocatorCreate(void);
+
+/**
+ * Loads a code point sequence in the locator so that its script runs can be located.
+ *
+ * @param locator
+ *      The locator in which the code point sequence will be loaded.
+ * @param codepointSequence
+ *      The code point sequence which will be loaded in the locator.
+ */
+void SBScriptLocatorLoadCodepoints(SBScriptLocatorRef locator, const SBCodepointSequence *codepointSequence);
+
+/**
+ * Returns the agent containing the information of current located script run.
+ *
+ * @param locator
+ *      The locator whose agent is returned.
+ */
+const SBScriptAgent *SBScriptLocatorGetAgent(SBScriptLocatorRef locator);
+
+/**
+ * Instructs the locator to find next script run in the loaded code point sequence.
+ *
+ * @param locator
+ *      The locator whom you want to instruct.
+ * @return
+ *      SBTrue if another script run is available, SBFalse otherwise.
+ * @note
+ *      The locator will be reset after locating last script run.
+ */
+SBBoolean SBScriptLocatorMoveNext(SBScriptLocatorRef locator);
+
+/**
+ * Instructs the locator to reset itself so that script runs of the loaded line can be obatained
+ * from the beginning.
+ *
+ * @param locator
+ *      The locator whom you want to reset.
+ */
+void SBScriptLocatorReset(SBScriptLocatorRef locator);
+
+/**
+ * Increments the reference count of a script locator object.
+ *
+ * @param locator
+ *      The script locator object whose reference count will be incremented.
+ * @return
+ *      The same script locator object passed in as the parameter.
+ */
+SBScriptLocatorRef SBScriptLocatorRetain(SBScriptLocatorRef locator);
+
+/**
+ * Decrements the reference count of a script locator object. The object will be deallocated when
+ * its reference count reaches zero.
+ *
+ * @param locator
+ *      The script locator object whose reference count will be decremented.
+ */
+void SBScriptLocatorRelease(SBScriptLocatorRef locator);
+
+#endif
diff --git a/lib/sheenbidi/Headers/SheenBidi.h b/lib/sheenbidi/Headers/SheenBidi.h
new file mode 100644
index 000000000..96cdd9f07
--- /dev/null
+++ b/lib/sheenbidi/Headers/SheenBidi.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014-2018 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SHEEN_BIDI_H
+#define _SHEEN_BIDI_H
+
+#include "SBAlgorithm.h"
+#include "SBBase.h"
+#include "SBBidiType.h"
+#include "SBCodepoint.h"
+#include "SBCodepointSequence.h"
+#include "SBGeneralCategory.h"
+#include "SBLine.h"
+#include "SBMirrorLocator.h"
+#include "SBParagraph.h"
+#include "SBRun.h"
+#include "SBScript.h"
+#include "SBScriptLocator.h"
+
+#endif
diff --git a/lib/sheenbidi/LICENSE b/lib/sheenbidi/LICENSE
new file mode 100755
index 000000000..d64569567
--- /dev/null
+++ b/lib/sheenbidi/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/lib/sheenbidi/README.md b/lib/sheenbidi/README.md
new file mode 100644
index 000000000..034824963
--- /dev/null
+++ b/lib/sheenbidi/README.md
@@ -0,0 +1,107 @@
+SheenBidi
+=========
+[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
+[![Travis-CI Build Status](https://api.travis-ci.org/Tehreer/SheenBidi.svg?branch=master)](https://travis-ci.org/Tehreer/SheenBidi)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/k2vvegcdqsb9ld5a?svg=true)](https://ci.appveyor.com/project/mta452/sheenbidi)
+[![Coverage Status](https://coveralls.io/repos/github/Tehreer/SheenBidi/badge.svg?branch=master)](https://coveralls.io/github/Tehreer/SheenBidi)
+
+SheenBidi implements Unicode Bidirectional Algorithm available at http://www.unicode.org/reports/tr9. It is a sophisticated implementaion which provides the developers an easy way to use UBA in their applications.
+
+Here are some of the advantages of SheenBidi.
+
+* Object based.
+* Optimized to the core.
+* Designed to be thread safe.
+* Lightweight API for interaction.
+* Supports UTF-8, UTF-16 and UTF-32 encodings.
+
+## API
+<img src="https://user-images.githubusercontent.com/2664112/39663208-716af1c4-5088-11e8-855c-ababe3e58c58.png" width="350">
+The above screenshot depicts a visual representation of the API on a sample text.
+
+### SBCodepointSequence
+It works as a code point decoder by accepting a string buffer in specified encoding.
+
+### SBAlgorithm
+It provides bidirectional type of each code unit in source string. Paragraph boundaries can be quried from it as determined by rule [P1](https://www.unicode.org/reports/tr9/#P1). Individual paragraph objects can be created from it by explicitly specifying the base level or deriving it from rules [P2](https://www.unicode.org/reports/tr9/#P2)-[P3](https://www.unicode.org/reports/tr9/#P3).
+
+### SBParagraph
+It represents a single paragraph of text processed with rules [X1](https://www.unicode.org/reports/tr9/#X1)-[I2](https://www.unicode.org/reports/tr9/#I2). It provides resolved embedding levels of all the code units of a paragraph.
+
+### SBLine
+It represents a single line of text processed with rules [L1](https://www.unicode.org/reports/tr9/#L1)-[L2](https://www.unicode.org/reports/tr9/#L2). However, it provides reordered level runs instead of reordered characters.
+
+### SBRun
+It represents a sequence of characters which have the same embedding level. The direction of a run would be right-to-left, if its embedding level is odd.
+
+### SBMirrorLocator
+It provides the facility to find out the mirrored characters in a line as determined by rule [L4](https://www.unicode.org/reports/tr9/#L4).
+
+### SBScriptLocator
+Not directly related to UBA but can be useful for text shaping. It provides the facility to find out the script runs as specified in [UAX #24](https://www.unicode.org/reports/tr24/).
+
+## Dependency
+SheenBidi does not depend on any external library. It only uses standard C library headers ```stddef.h```, ```stdint.h``` and ```stdlib.h```.
+
+## Configuration
+The configuration options are available in `Headers/SBConfig.h`.
+
+* ```SB_CONFIG_LOG``` logs every activity performed in order to apply bidirectional algorithm.
+* ```SB_CONFIG_UNITY``` builds the library as a single module and lets the compiler make decisions to inline functions.
+
+## Compiling
+SheenBidi can be compiled with any C compiler. The best way for compiling is to add all the files in an IDE and hit build. The only thing to consider however is that if ```SB_CONFIG_UNITY``` is enabled then only ```Source/SheenBidi.c``` should be compiled.
+
+## Example
+Here is a simple example written in C11.
+
+```c
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <SheenBidi.h>
+
+int main(int argc, const char * argv[]) {
+    /* Create code point sequence for a sample bidirectional text. */
+    const char *bidiText = "یہ ایک )car( ہے۔";
+    SBCodepointSequence codepointSequence = { SBStringEncodingUTF8, (void *)bidiText, strlen(bidiText) };
+
+    /* Extract the first bidirectional paragraph. */
+    SBAlgorithmRef bidiAlgorithm = SBAlgorithmCreate(&codepointSequence);
+    SBParagraphRef firstParagraph = SBAlgorithmCreateParagraph(bidiAlgorithm, 0, INT32_MAX, SBLevelDefaultLTR);
+    SBUInteger paragraphLength = SBParagraphGetLength(firstParagraph);
+
+    /* Create a line consisting of whole paragraph and get its runs. */
+    SBLineRef paragraphLine = SBParagraphCreateLine(firstParagraph, 0, paragraphLength);
+    SBUInteger runCount = SBLineGetRunCount(paragraphLine);
+    const SBRun *runArray = SBLineGetRunsPtr(paragraphLine);
+
+    /* Log the details of each run in the line. */
+    for (SBUInteger i = 0; i < runCount; i++) {
+        printf("Run Offset: %ld\n", (long)runArray[i].offset);
+        printf("Run Length: %ld\n", (long)runArray[i].length);
+        printf("Run Level: %ld\n\n", (long)runArray[i].level);
+    }
+
+    /* Create a mirror locator and load the line in it. */
+    SBMirrorLocatorRef mirrorLocator = SBMirrorLocatorCreate();
+    SBMirrorLocatorLoadLine(mirrorLocator, paragraphLine, (void *)bidiText);
+    const SBMirrorAgent *mirrorAgent = SBMirrorLocatorGetAgent(mirrorLocator);
+
+    /* Log the details of each mirror in the line. */
+    while (SBMirrorLocatorMoveNext(mirrorLocator)) {
+        printf("Mirror Index: %ld\n", (long)mirrorAgent->index);
+        printf("Actual Code Point: %ld\n", (long)mirrorAgent->codepoint);
+        printf("Mirrored Code Point: %ld\n\n", (long)mirrorAgent->mirror);
+    }
+
+    /* Release all objects. */
+    SBMirrorLocatorRelease(mirrorLocator);
+    SBLineRelease(paragraphLine);
+    SBParagraphRelease(firstParagraph);
+    SBAlgorithmRelease(bidiAlgorithm);
+
+    return 0;
+}
+```
diff --git a/lib/sheenbidi/Source/BidiChain.c b/lib/sheenbidi/Source/BidiChain.c
new file mode 100644
index 000000000..0f80d6b16
--- /dev/null
+++ b/lib/sheenbidi/Source/BidiChain.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#include "SBBase.h"
+#include "BidiChain.h"
+
+SB_INTERNAL void BidiChainInitialize(BidiChainRef chain,
+    SBBidiType *types, SBLevel *levels, BidiLink *links)
+{
+    chain->types = types;
+    chain->levels = levels;
+    chain->links = links;
+    chain->roller = 0;
+    chain->last = 0;
+
+    /* Make first link empty. */
+    chain->types[0] = SBBidiTypeNil;
+    chain->levels[0] = SBLevelInvalid;
+    chain->links[0] = BidiLinkNone;
+}
+
+SB_INTERNAL void BidiChainAdd(BidiChainRef chain, SBBidiType type, SBUInteger length)
+{
+    BidiLink last = chain->last;
+    BidiLink current = last + (SBUInt32)length;
+
+    chain->types[current] = type;
+    chain->links[current] = chain->roller;
+
+    chain->links[last] = current;
+    chain->last = current;
+}
+
+SB_INTERNAL SBBoolean BidiChainIsSingle(BidiChainRef chain, BidiLink link)
+{
+    BidiLink next = chain->links[link];
+
+    /* Check the type of in between code units. */
+    while (++link != next) {
+        if (chain->types[link] != SBBidiTypeBN) {
+            return SBFalse;
+        }
+    }
+
+    return SBTrue;
+}
+
+SB_INTERNAL SBBidiType BidiChainGetType(BidiChainRef chain, BidiLink link)
+{
+    return chain->types[link];
+}
+
+SB_INTERNAL void BidiChainSetType(BidiChainRef chain, BidiLink link, SBBidiType type)
+{
+    chain->types[link] = type;
+}
+
+SB_INTERNAL SBLevel BidiChainGetLevel(BidiChainRef chain, BidiLink link)
+{
+    return chain->levels[link];
+}
+
+SB_INTERNAL void BidiChainSetLevel(BidiChainRef chain, BidiLink link, SBLevel level)
+{
+    chain->levels[link] = level;
+}
+
+SB_INTERNAL BidiLink BidiChainGetNext(BidiChainRef chain, BidiLink link)
+{
+    return chain->links[link];
+}
+
+SB_INTERNAL void BidiChainSetNext(BidiChainRef chain, BidiLink link, BidiLink next)
+{
+    chain->links[link] = next;
+}
+
+SB_INTERNAL void BidiChainAbandonNext(BidiChainRef chain, BidiLink link)
+{
+    BidiLink next = chain->links[link];
+    BidiLink limit = chain->links[next];
+
+    chain->links[link] = limit;
+}
+
+SB_INTERNAL SBBoolean BidiChainMergeIfEqual(BidiChainRef chain, BidiLink first, BidiLink second)
+{
+    if (chain->types[first] == chain->types[second]
+        && chain->levels[first] == chain->levels[second]) {
+        chain->links[first] = chain->links[second];
+        return SBTrue;
+    }
+
+    return SBFalse;
+}
diff --git a/lib/sheenbidi/Source/BidiChain.h b/lib/sheenbidi/Source/BidiChain.h
new file mode 100644
index 000000000..4b378c335
--- /dev/null
+++ b/lib/sheenbidi/Source/BidiChain.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_BIDI_CHAIN_H
+#define _SB_INTERNAL_BIDI_CHAIN_H
+
+#include <SBConfig.h>
+#include "SBBase.h"
+
+typedef SBUInt32 BidiLink;
+
+#define BidiLinkNone    (SBUInt32)(-1)
+
+typedef struct _BidiChain {
+    SBBidiType *types;
+    SBLevel *levels;
+    BidiLink *links;
+    BidiLink roller;
+    BidiLink last;
+} BidiChain, *BidiChainRef;
+
+SB_INTERNAL void BidiChainInitialize(BidiChainRef chain,
+    SBBidiType *types, SBLevel *levels, BidiLink *links);
+SB_INTERNAL void BidiChainAdd(BidiChainRef chain, SBBidiType type, SBUInteger length);
+
+#define BidiChainGetOffset(chain, link)         \
+(                                               \
+    (link) - 1                                  \
+)
+
+SB_INTERNAL SBBoolean BidiChainIsSingle(BidiChainRef chain, BidiLink link);
+
+SB_INTERNAL SBBidiType BidiChainGetType(BidiChainRef chain, BidiLink link);
+SB_INTERNAL void BidiChainSetType(BidiChainRef chain, BidiLink link, SBBidiType type);
+
+SB_INTERNAL SBLevel BidiChainGetLevel(BidiChainRef chain, BidiLink link);
+SB_INTERNAL void BidiChainSetLevel(BidiChainRef chain, BidiLink link, SBLevel level);
+
+SB_INTERNAL BidiLink BidiChainGetNext(BidiChainRef chain, BidiLink link);
+SB_INTERNAL void BidiChainSetNext(BidiChainRef chain, BidiLink link, BidiLink next);
+SB_INTERNAL void BidiChainAbandonNext(BidiChainRef chain, BidiLink link);
+SB_INTERNAL SBBoolean BidiChainMergeIfEqual(BidiChainRef chain, BidiLink first, BidiLink second);
+
+#define BidiChainForEach(chain, roller, link) \
+    for (link = chain->links[roller]; link != roller; link = chain->links[link])
+
+#endif
diff --git a/lib/sheenbidi/Source/BidiTypeLookup.c b/lib/sheenbidi/Source/BidiTypeLookup.c
new file mode 100644
index 000000000..b448e061e
--- /dev/null
+++ b/lib/sheenbidi/Source/BidiTypeLookup.c
@@ -0,0 +1,1014 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ *
+ * REQUIRED MEMORY: 4448+(2624*2)+(1088*2) = 11872 Bytes
+ */
+
+#include "BidiTypeLookup.h"
+
+#define AL      SBBidiTypeAL 
+#define AN      SBBidiTypeAN 
+#define B       SBBidiTypeB  
+#define BN      SBBidiTypeBN 
+#define CS      SBBidiTypeCS 
+#define EN      SBBidiTypeEN 
+#define ES      SBBidiTypeES 
+#define ET      SBBidiTypeET 
+#define FSI     SBBidiTypeFSI
+#define L       SBBidiTypeL  
+#define LRE     SBBidiTypeLRE
+#define LRI     SBBidiTypeLRI
+#define LRO     SBBidiTypeLRO
+#define NSM     SBBidiTypeNSM
+#define ON      SBBidiTypeON 
+#define PDF     SBBidiTypePDF
+#define PDI     SBBidiTypePDI
+#define R       SBBidiTypeR  
+#define RLE     SBBidiTypeRLE
+#define RLI     SBBidiTypeRLI
+#define RLO     SBBidiTypeRLO
+#define S       SBBidiTypeS  
+#define WS      SBBidiTypeWS 
+
+static const SBUInt8 PrimaryBidiTypeData[4448] = {
+/* DATA_BLOCK: -- 0x0000..0x000F -- */
+    BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  S,   B,   S,   WS,  B,   BN,  BN,
+/* DATA_BLOCK: -- 0x0010..0x001F -- */
+    BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  B,   B,   B,   S,
+/* DATA_BLOCK: -- 0x0020..0x002F -- */
+    WS,  ON,  ON,  ET,  ET,  ET,  ON,  ON,  ON,  ON,  ON,  ES,  CS,  ES,  CS,  CS,
+/* DATA_BLOCK: -- 0x0030..0x003F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  CS,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0040..0x004F -- */
+    ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0050..0x005F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0060..0x006F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  BN,
+/* DATA_BLOCK: -- 0x0070..0x007F -- */
+    BN,  BN,  BN,  BN,  BN,  B,   BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,
+/* DATA_BLOCK: -- 0x0080..0x008F -- */
+    BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,
+/* DATA_BLOCK: -- 0x0090..0x009F -- */
+    CS,  ON,  ET,  ET,  ET,  ET,  ON,  ON,  ON,  ON,  L,   ON,  ON,  BN,  ON,  ON,
+/* DATA_BLOCK: -- 0x00A0..0x00AF -- */
+    ET,  ET,  EN,  EN,  ON,  L,   ON,  ON,  ON,  EN,  L,   ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x00B0..0x00BF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x00C0..0x00CF -- */
+    L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x00D0..0x00DF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x00E0..0x00EF -- */
+    L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x00F0..0x00FF -- */
+    L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   ON,
+/* DATA_BLOCK: -- 0x0100..0x010F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0110..0x011F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0120..0x012F -- */
+    L,   L,   L,   L,   ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,
+/* DATA_BLOCK: -- 0x0130..0x013F -- */
+    L,   L,   L,   L,   ON,  ON,  L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0140..0x014F -- */
+    L,   L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0150..0x015F -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0160..0x016F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,   ON,  ON,  ET,
+/* DATA_BLOCK: -- 0x0170..0x017F -- */
+    R,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0180..0x018F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, R,   NSM,
+/* DATA_BLOCK: -- 0x0190..0x019F -- */
+    R,   NSM, NSM, R,   NSM, NSM, R,   NSM, R,   R,   R,   R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x01A0..0x01AF -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x01B0..0x01BF -- */
+    AN,  AN,  AN,  AN,  AN,  AN,  ON,  ON,  AL,  ET,  ET,  AL,  CS,  AL,  ON,  ON,
+/* DATA_BLOCK: -- 0x01C0..0x01CF -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x01D0..0x01DF -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x01E0..0x01EF -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x01F0..0x01FF -- */
+    AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  ET,  AN,  AN,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0200..0x020F -- */
+    NSM, AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0210..0x021F -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  NSM, NSM, NSM, NSM, NSM, NSM, NSM, AN,  ON,  NSM,
+/* DATA_BLOCK: -- 0x0220..0x022F -- */
+    NSM, NSM, NSM, NSM, NSM, AL,  AL,  NSM, NSM, ON,  NSM, NSM, NSM, NSM, AL,  AL,
+/* DATA_BLOCK: -- 0x0230..0x023F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0240..0x024F -- */
+    AL,  NSM, AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0250..0x025F -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0260..0x026F -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0270..0x027F -- */
+    NSM, NSM, NSM, NSM, R,   R,   ON,  ON,  ON,  ON,  R,   R,   R,   NSM, R,   R,
+/* DATA_BLOCK: -- 0x0280..0x028F -- */
+    R,   R,   R,   R,   R,   R,   NSM, NSM, NSM, NSM, R,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0290..0x029F -- */
+    NSM, NSM, NSM, NSM, R,   NSM, NSM, NSM, R,   NSM, NSM, NSM, NSM, NSM, R,   R,
+/* DATA_BLOCK: -- 0x02A0..0x02AF -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   NSM, NSM, NSM, R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x02B0..0x02BF -- */
+    AL,  AL,  AL,  NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x02C0..0x02CF -- */
+    NSM, NSM, AN,  NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x02D0..0x02DF -- */
+    NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x02E0..0x02EF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x02F0..0x02FF -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0300..0x030F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0310..0x031F -- */
+    L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0320..0x032F -- */
+    L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0330..0x033F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0340..0x034F -- */
+    L,   NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0350..0x035F -- */
+    L,   L,   ET,  ET,  L,   L,   L,   L,   L,   L,   L,   ET,  L,   L,   NSM, L,
+/* DATA_BLOCK: -- 0x0360..0x036F -- */
+    L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0370..0x037F -- */
+    L,   NSM, NSM, L,   L,   L,   L,   NSM, NSM, L,   L,   NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0380..0x038F -- */
+    NSM, NSM, L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0390..0x039F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x03A0..0x03AF -- */
+    L,   ET,  L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x03B0..0x03BF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   NSM,
+/* DATA_BLOCK: -- 0x03C0..0x03CF -- */
+    L,   L,   L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x03D0..0x03DF -- */
+    L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x03E0..0x03EF -- */
+    NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x03F0..0x03FF -- */
+    L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ET,  ON,  L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0400..0x040F -- */
+    NSM, L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0410..0x041F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM,
+/* DATA_BLOCK: -- 0x0420..0x042F -- */
+    NSM, L,   L,   L,   L,   L,   NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0430..0x043F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x0440..0x044F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0450..0x045F -- */
+    NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0460..0x046F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0470..0x047F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0480..0x048F -- */
+    L,   L,   NSM, NSM, NSM, L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0490..0x049F -- */
+    L,   NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   ET,
+/* DATA_BLOCK: -- 0x04A0..0x04AF -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x04B0..0x04BF -- */
+    L,   NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x04C0..0x04CF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x04D0..0x04DF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x04E0..0x04EF -- */
+    L,   L,   L,   L,   L,   NSM, L,   NSM, L,   NSM, ON,  ON,  ON,  ON,  L,   L,
+/* DATA_BLOCK: -- 0x04F0..0x04FF -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0500..0x050F -- */
+    NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, L,   L,   L,   L,   L,   NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0510..0x051F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0520..0x052F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0530..0x053F -- */
+    L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0540..0x054F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0550..0x055F -- */
+    NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, L,   L,   NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0560..0x056F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   L,   L,   L,   NSM, NSM,
+/* DATA_BLOCK: -- 0x0570..0x057F -- */
+    NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0580..0x058F -- */
+    L,   NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0590..0x059F -- */
+    L,   L,   NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x05A0..0x05AF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x05B0..0x05BF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x05C0..0x05CF -- */
+    WS,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x05D0..0x05DF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  L,   L,   L,
+/* DATA_BLOCK: -- 0x05E0..0x05EF -- */
+    L,   L,   NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x05F0..0x05FF -- */
+    L,   L,   L,   L,   NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0600..0x060F -- */
+    L,   L,   L,   L,   L,   L,   NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0610..0x061F -- */
+    NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   ET,  L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0620..0x062F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  NSM, NSM, NSM, BN,  L,
+/* DATA_BLOCK: -- 0x0630..0x063F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0640..0x064F -- */
+    NSM, NSM, NSM, L,   L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0650..0x065F -- */
+    L,   L,   NSM, L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0660..0x066F -- */
+    ON,  L,   L,   L,   ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0670..0x067F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,
+/* DATA_BLOCK: -- 0x0680..0x068F -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   L,   NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0690..0x069F -- */
+    L,   L,   L,   L,   L,   L,   NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x06A0..0x06AF -- */
+    NSM, L,   NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x06B0..0x06BF -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM,
+/* DATA_BLOCK: -- 0x06C0..0x06CF -- */
+    NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x06D0..0x06DF -- */
+    L,   L,   L,   L,   NSM, L,   NSM, NSM, NSM, NSM, NSM, L,   NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x06E0..0x06EF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x06F0..0x06FF -- */
+    L,   L,   NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0700..0x070F -- */
+    L,   L,   L,   L,   L,   L,   NSM, L,   NSM, NSM, L,   L,   L,   NSM, L,   NSM,
+/* DATA_BLOCK: -- 0x0710..0x071F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0720..0x072F -- */
+    NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0730..0x073F -- */
+    NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0740..0x074F -- */
+    NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0750..0x075F -- */
+    L,   L,   L,   L,   NSM, L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0760..0x076F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0770..0x077F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   ON,
+/* DATA_BLOCK: -- 0x0780..0x078F -- */
+    ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0790..0x079F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x07A0..0x07AF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  L,
+/* DATA_BLOCK: -- 0x07B0..0x07BF -- */
+    WS,  WS,  WS,  WS,  WS,  WS,  WS,  WS,  WS,  WS,  WS,  BN,  BN,  BN,  L,   R,
+/* DATA_BLOCK: -- 0x07C0..0x07CF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  WS,  B,   LRE, RLE, PDF, LRO, RLO, CS,
+/* DATA_BLOCK: -- 0x07D0..0x07DF -- */
+    ET,  ET,  ET,  ET,  ET,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x07E0..0x07EF -- */
+    ON,  ON,  ON,  ON,  CS,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x07F0..0x07FF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  WS,
+/* DATA_BLOCK: -- 0x0800..0x080F -- */
+    BN,  BN,  BN,  BN,  BN,  BN,  LRI, RLI, FSI, PDI, BN,  BN,  BN,  BN,  BN,  BN,
+/* DATA_BLOCK: -- 0x0810..0x081F -- */
+    EN,  L,   L,   L,   EN,  EN,  EN,  EN,  EN,  EN,  ES,  ES,  ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x0820..0x082F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  ES,  ES,  ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x0830..0x083F -- */
+    ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,  ET,
+/* DATA_BLOCK: -- 0x0840..0x084F -- */
+    ON,  ON,  L,   ON,  ON,  ON,  ON,  L,   ON,  ON,  L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0850..0x085F -- */
+    L,   L,   L,   L,   ON,  L,   ON,  ON,  ON,  L,   L,   L,   L,   L,   ON,  ON,
+/* DATA_BLOCK: -- 0x0860..0x086F -- */
+    ON,  ON,  ON,  ON,  L,   ON,  L,   ON,  L,   ON,  L,   L,   L,   L,   ET,  L,
+/* DATA_BLOCK: -- 0x0870..0x087F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0880..0x088F -- */
+    ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  L,   L,
+/* DATA_BLOCK: -- 0x0890..0x089F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x08A0..0x08AF -- */
+    ON,  ON,  ES,  ET,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x08B0..0x08BF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x08C0..0x08CF -- */
+    ON,  ON,  ON,  ON,  ON,  L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x08D0..0x08DF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x08E0..0x08EF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x08F0..0x08FF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,
+/* DATA_BLOCK: -- 0x0900..0x090F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0910..0x091F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0920..0x092F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0930..0x093F -- */
+    ON,  ON,  ON,  ON,  L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0940..0x094F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0950..0x095F -- */
+    L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   NSM,
+/* DATA_BLOCK: -- 0x0960..0x096F -- */
+    NSM, NSM, L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0970..0x097F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM,
+/* DATA_BLOCK: -- 0x0980..0x098F -- */
+    ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0990..0x099F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x09A0..0x09AF -- */
+    ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x09B0..0x09BF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x09C0..0x09CF -- */
+    WS,  ON,  ON,  ON,  ON,  L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x09D0..0x09DF -- */
+    ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x09E0..0x09EF -- */
+    ON,  L,   L,   L,   L,   L,   ON,  ON,  L,   L,   L,   L,   L,   ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x09F0..0x09FF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, ON,  ON,  L,   L,   L,
+/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */
+    L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */
+    L,   L,   L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,
+/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */
+    NSM, NSM, NSM, ON,  NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, ON,  ON,
+/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */
+    ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */
+    L,   L,   NSM, L,   L,   L,   NSM, L,   L,   L,   L,   NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */
+    L,   L,   L,   L,   L,   NSM, NSM, L,   ON,  ON,  ON,  ON,  NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   ET,  ET,  L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */
+    L,   L,   L,   L,   ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */
+    L,   L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */
+    NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM,
+/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */
+    L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */
+    L,   L,   L,   NSM, L,   L,   NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */
+    L,   L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */
+    L,   NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */
+    L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */
+    NSM, L,   NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,   NSM, NSM,
+/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */
+    L,   L,   L,   L,   L,   NSM, L,   L,   NSM, L,   L,   L,   L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   R,   NSM, R,
+/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   ES,  R,   R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  ON,  ON,
+/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  ON,  AL,  AL,
+/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */
+    CS,  ON,  CS,  L,   ON,  CS,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ET,
+/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */
+    ON,  ON,  ES,  ES,  ON,  ON,  ON,  L,   ON,  ET,  ET,  ON,  L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */
+    AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  BN,
+/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */
+    L,   ON,  ON,  ET,  ET,  ET,  ON,  ON,  ON,  ON,  ON,  ES,  CS,  ES,  CS,  CS,
+/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */
+    ET,  ET,  ON,  ON,  ON,  ET,  ET,  L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */
+    BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  ON,  ON,  ON,  ON,  ON,  BN,  BN,
+/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */
+    L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,
+/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */
+    NSM, EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,
+/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */
+    L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   ON,
+/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */
+    R,   NSM, NSM, NSM, R,   NSM, NSM, R,   R,   R,   R,   R,   NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   NSM, NSM, NSM, R,   R,   R,   R,   NSM,
+/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */
+    R,   R,   R,   R,   R,   NSM, NSM, R,   R,   R,   R,   R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */
+    AL,  AL,  AL,  AL,  NSM, NSM, NSM, NSM, AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */
+    AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */
+    AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,
+/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */
+    AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  AN,  R,
+/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */
+    R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   R,   NSM, NSM, R,   R,   R,
+/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */
+    NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */
+    L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */
+    L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, L,   L,   NSM,
+/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */
+    NSM, NSM, L,   L,   NSM, L,   NSM, NSM, L,   L,   L,   L,   L,   L,   NSM, L,
+/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */
+    L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,
+/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,
+/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, L,   L,   L,   L,   NSM,
+/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */
+    NSM, L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */
+    L,   L,   NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,   L,   NSM, NSM, L,   NSM,
+/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, L,   NSM,
+/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, L,   NSM, L,   L,
+/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */
+    L,   L,   NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,   NSM, L,
+/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */
+    L,   L,   L,   L,   NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */
+    L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */
+    L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */
+    NSM, L,   NSM, NSM, L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   NSM, L,   NSM, NSM, L,   NSM,
+/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */
+    NSM, NSM, L,   L,   L,   NSM, L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */
+    L,   L,   L,   NSM, NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */
+    L,   L,   L,   L,   L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ET,  ET,  ET,
+/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */
+    ET,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */
+    L,   L,   ON,  L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, L,
+/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */
+    BN,  BN,  BN,  BN,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */
+    L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */
+    L,   L,   L,   BN,  BN,  BN,  BN,  BN,  BN,  BN,  BN,  NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */
+    NSM, NSM, NSM, L,   L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   NSM, NSM, NSM, NSM, L,   L,
+/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */
+    ON,  ON,  NSM, NSM, NSM, ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */
+    L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */
+    L,   L,   L,   ON,  L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   EN,  EN,
+/* DATA_BLOCK: -- 0x1000..0x100F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,
+/* DATA_BLOCK: -- 0x1010..0x101F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x1020..0x102F -- */
+    L,   L,   L,   L,   NSM, L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x1030..0x103F -- */
+    L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x1040..0x104F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x1050..0x105F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L,   L,   NSM, NSM, NSM, NSM, NSM,
+/* DATA_BLOCK: -- 0x1060..0x106F -- */
+    NSM, NSM, L,   NSM, NSM, L,   NSM, NSM, NSM, NSM, NSM, L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x1070..0x107F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ET,
+/* DATA_BLOCK: -- 0x1080..0x108F -- */
+    NSM, NSM, NSM, NSM, NSM, NSM, NSM, R,   R,   R,   R,   R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x1090..0x109F -- */
+    R,   R,   R,   R,   NSM, NSM, NSM, NSM, NSM, NSM, NSM, R,   R,   R,   R,   R,
+/* DATA_BLOCK: -- 0x10A0..0x10AF -- */
+    ON,  ON,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,  AL,
+/* DATA_BLOCK: -- 0x10B0..0x10BF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,
+/* DATA_BLOCK: -- 0x10C0..0x10CF -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x10D0..0x10DF -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   ON,  L,   L,
+/* DATA_BLOCK: -- 0x10E0..0x10EF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x10F0..0x10FF -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x1100..0x110F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   L,
+/* DATA_BLOCK: -- 0x1110..0x111F -- */
+    ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  L,   ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x1120..0x112F -- */
+    ON,  ON,  ON,  ON,  ON,  L,   L,   L,   ON,  ON,  ON,  L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x1130..0x113F -- */
+    ON,  ON,  ON,  L,   ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,  ON,
+/* DATA_BLOCK: -- 0x1140..0x114F -- */
+    EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  EN,  L,   L,   L,   L,   L,   L,
+/* DATA_BLOCK: -- 0x1150..0x115F -- */
+    L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   L,   BN,  BN
+};
+
+static const SBUInt16 MainBidiTypeIndexes[2624] = {
+/* INDEX_BLOCK: -- 0x0000..0x003F -- */
+    0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0040, 0x0060, 0x0070, 0x0080, 0x0090, 0x00A0,
+    0x00B0, 0x00C0, 0x00B0, 0x00C0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00D0, 0x00E0, 0x00E0, 0x00F0, 0x0100,
+    0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0120, 0x0130, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x0140,
+/* INDEX_BLOCK: -- 0x0040..0x007F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0150, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x0160, 0x0170, 0x0110, 0x0180, 0x0190, 0x01A0, 0x01A0, 0x01A0, 0x01B0, 0x01C0, 0x01D0, 0x01D0,
+    0x01E0, 0x0110, 0x01F0, 0x0200, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0210, 0x0220, 0x0230,
+    0x01D0, 0x0240, 0x01D0, 0x0110, 0x01C0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0250, 0x0200,
+    0x01A0, 0x01A0, 0x0260, 0x0270,
+/* INDEX_BLOCK: -- 0x0080..0x00BF -- */
+    0x01A0, 0x0280, 0x0290, 0x01A0, 0x01A0, 0x02A0, 0x01D0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0,
+    0x01D0, 0x02B0, 0x02C0, 0x0110, 0x02D0, 0x00B0, 0x00B0, 0x02E0, 0x02F0, 0x0300, 0x0310, 0x00B0,
+    0x0320, 0x00B0, 0x00B0, 0x0330, 0x0340, 0x00B0, 0x0310, 0x0350, 0x0360, 0x00B0, 0x00B0, 0x0330,
+    0x0370, 0x0320, 0x00B0, 0x0380, 0x0360, 0x00B0, 0x00B0, 0x0330, 0x0390, 0x00B0, 0x0310, 0x03A0,
+    0x0320, 0x00B0, 0x00B0, 0x03B0, 0x0340, 0x03C0, 0x0310, 0x00B0, 0x03D0, 0x00B0, 0x00B0, 0x00B0,
+    0x03E0, 0x00B0, 0x00B0, 0x03F0,
+/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */
+    0x0400, 0x00B0, 0x00B0, 0x0410, 0x0420, 0x03C0, 0x0310, 0x0430, 0x0320, 0x00B0, 0x00B0, 0x0330,
+    0x0440, 0x00B0, 0x0310, 0x00B0, 0x0450, 0x00B0, 0x00B0, 0x0460, 0x0340, 0x00B0, 0x0310, 0x00B0,
+    0x0320, 0x00B0, 0x00B0, 0x00B0, 0x0470, 0x0480, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0490,
+    0x04A0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x04B0, 0x04C0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x04D0, 0x00B0, 0x04E0, 0x00B0, 0x00B0, 0x00B0, 0x04F0, 0x0500, 0x0510, 0x0110, 0x0520,
+    0x0530, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0100..0x013F -- */
+    0x00B0, 0x00B0, 0x0540, 0x0550, 0x00B0, 0x0560, 0x0570, 0x0580, 0x0590, 0x05A0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0540, 0x00B0, 0x00B0, 0x00B0, 0x05B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0140..0x017F -- */
+    0x0040, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x05C0, 0x05D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x05E0, 0x00B0, 0x05E0, 0x00B0, 0x0310, 0x00B0, 0x0310, 0x00B0, 0x00B0, 0x00B0, 0x05F0,
+    0x0600, 0x0610, 0x00B0, 0x05B0,
+/* INDEX_BLOCK: -- 0x0180..0x01BF -- */
+    0x0620, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x03C0, 0x00B0, 0x0630, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0640, 0x0650, 0x0660, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0670, 0x0100, 0x0100, 0x00B0, 0x0680, 0x00B0, 0x00B0,
+    0x00B0, 0x0690, 0x06A0, 0x06B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0570, 0x00B0, 0x00B0, 0x00B0,
+    0x06C0, 0x00B0, 0x00B0, 0x06D0, 0x03D0, 0x00B0, 0x06E0, 0x06C0, 0x0450, 0x00B0, 0x06F0, 0x00B0,
+    0x00B0, 0x00B0, 0x0700, 0x0450,
+/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */
+    0x00B0, 0x00B0, 0x0710, 0x0720, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0730, 0x0740, 0x0750, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0110, 0x0760, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0770,
+    0x0780, 0x0790, 0x0790, 0x07A0,
+/* INDEX_BLOCK: -- 0x0200..0x023F -- */
+    0x07B0, 0x0100, 0x07C0, 0x07D0, 0x07E0, 0x07F0, 0x0800, 0x0810, 0x0820, 0x00B0, 0x0830, 0x0830,
+    0x0830, 0x0110, 0x0110, 0x0570, 0x0840, 0x0850, 0x0860, 0x0870, 0x0880, 0x0100, 0x00B0, 0x00B0,
+    0x0890, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x08A0, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x0050, 0x0100, 0x08C0, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100,
+/* INDEX_BLOCK: -- 0x0240..0x027F -- */
+    0x0100, 0x0100, 0x08D0, 0x00B0, 0x08E0, 0x00B0, 0x0100, 0x0100, 0x08F0, 0x0900, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0910, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0920, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100,
+/* INDEX_BLOCK: -- 0x0280..0x02BF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0930, 0x0100, 0x0940, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100,
+/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0950, 0x0960, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0980, 0x00B0, 0x00B0, 0x0100, 0x0990, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x08B0, 0x00B0, 0x09B0,
+/* INDEX_BLOCK: -- 0x0300..0x033F -- */
+    0x09C0, 0x0100, 0x09D0, 0x09E0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x09F0, 0x0040, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x0A00, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x09A0, 0x00B0, 0x00B0, 0x07A0, 0x00B0, 0x00B0,
+    0x00B0, 0x0100, 0x00B0, 0x0A10, 0x00B0, 0x00B0, 0x00B0, 0x0A20, 0x0A30, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A40, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0670, 0x00B0, 0x0A50,
+/* INDEX_BLOCK: -- 0x0340..0x037F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0380..0x03BF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100,
+    0x08D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0790, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0970, 0x0A60, 0x00B0, 0x0410, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0450,
+    0x0100, 0x0100, 0x0A70, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A80, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0400..0x043F -- */
+    0x0A90, 0x00B0, 0x0AA0, 0x0AB0, 0x00B0, 0x00B0, 0x00B0, 0x0AC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x0AD0, 0x00B0, 0x0110, 0x0AE0, 0x00B0, 0x00B0, 0x0AF0, 0x00B0, 0x0B00, 0x0450, 0x00B0, 0x00B0,
+    0x02D0, 0x00B0, 0x00B0, 0x0B10, 0x00B0, 0x00B0, 0x0B20, 0x00B0, 0x00B0, 0x00B0, 0x0B30, 0x0B40,
+    0x0B50, 0x00B0, 0x00B0, 0x0330, 0x00B0, 0x00B0, 0x00B0, 0x0B60, 0x0320, 0x00B0, 0x0440, 0x0530,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0870, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0B70, 0x00B0,
+/* INDEX_BLOCK: -- 0x0440..0x047F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0B80, 0x0B90, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0,
+    0x01D0, 0x01D0, 0x01D0, 0x01D0,
+/* INDEX_BLOCK: -- 0x0480..0x04BF -- */
+    0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0,
+    0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0BA0, 0x01D0, 0x01D0, 0x01D0, 0x01D0,
+    0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0080, 0x0080, 0x0BB0, 0x0110, 0x05B0, 0x0110, 0x0100,
+    0x0100, 0x0BC0, 0x0BD0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0BE0,
+    0x0BF0, 0x0030, 0x0040, 0x0050, 0x0040, 0x0050, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0C00, 0x0C10,
+/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C20, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0C30, 0x0C30, 0x0040, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x05A0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C40, 0x0900,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C50, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0500..0x053F -- */
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C60, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C70, 0x01A0, 0x01A0, 0x0C80,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C90, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x0CA0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0,
+/* INDEX_BLOCK: -- 0x0540..0x057F -- */
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x0CB0, 0x0CC0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x0CD0, 0x0CE0, 0x01A0, 0x01A0, 0x0CF0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x0250, 0x0200, 0x01D0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0,
+/* INDEX_BLOCK: -- 0x0580..0x05BF -- */
+    0x0320, 0x00B0, 0x00B0, 0x0D00, 0x0D10, 0x00E0, 0x08B0, 0x0970, 0x0450, 0x00B0, 0x00B0, 0x0D20,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x02D0, 0x00B0, 0x0D30, 0x0D40, 0x00B0, 0x00B0, 0x00B0, 0x0D50,
+    0x0450, 0x00B0, 0x00B0, 0x0D60, 0x0D70, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x0D80,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x0D90, 0x00B0,
+    0x0450, 0x00B0, 0x00B0, 0x0460, 0x0570, 0x00B0, 0x0DA0, 0x0D40, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x0D00, 0x0480, 0x0DB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0DC0,
+    0x0DD0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x0DE0, 0x0570, 0x0440, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0DF0,
+    0x0570, 0x00B0, 0x0C30, 0x00B0, 0x00B0, 0x00B0, 0x0E00, 0x0E10, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0540, 0x0E20, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0600..0x063F -- */
+    0x00B0, 0x00B0, 0x0970, 0x0E30, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0E40, 0x0D50, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0E50, 0x0570, 0x00B0, 0x0E60, 0x00B0, 0x00B0, 0x0E70,
+    0x0E80, 0x0E90, 0x00B0, 0x00B0, 0x0EA0, 0x0EB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0640..0x067F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x0EC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0ED0, 0x0EE0, 0x0EF0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F00, 0x0E10, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0F10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F20,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x0F30, 0x0F40, 0x0A70,
+/* INDEX_BLOCK: -- 0x0680..0x06BF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0D40,
+    0x00B0, 0x00B0, 0x00B0, 0x0D10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x02D0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x0F50, 0x00B0,
+/* INDEX_BLOCK: -- 0x0700..0x073F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F60, 0x0F70, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0740..0x077F -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F80, 0x0F90,
+    0x0FA0, 0x00B0, 0x0FB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0FC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x08D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0780..0x07BF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A00, 0x00B0, 0x00B0,
+    0x00B0, 0x0FD0, 0x00B0, 0x00B0, 0x0A50, 0x00B0, 0x00B0, 0x00B0, 0x0FE0, 0x00B0, 0x00B0, 0x00B0,
+    0x0FF0, 0x1000, 0x1000, 0x1000,
+/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0110, 0x1010,
+    0x0110, 0x0110, 0x0520, 0x0B20, 0x1020, 0x06E0, 0x1030, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0800..0x083F -- */
+    0x1040, 0x1050, 0x1060, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0D10, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0710, 0x1070,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0840..0x087F -- */
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x1080, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x1090, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0,
+/* INDEX_BLOCK: -- 0x0880..0x08BF -- */
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0,
+    0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x10A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0,
+    0x01A0, 0x01A0, 0x01A0, 0x01A0,
+/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */
+    0x0100, 0x0100, 0x09B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0, 0x10B0, 0x0A20,
+    0x0A20, 0x0A20, 0x0100, 0x08B0, 0x10C0, 0x00B0, 0x0A50, 0x00B0, 0x00B0, 0x00B0, 0x0910, 0x00B0,
+    0x00B0, 0x00B0, 0x10D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100,
+/* INDEX_BLOCK: -- 0x0900..0x093F -- */
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x10E0, 0x0C30, 0x0C30,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x10F0, 0x09B0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0940..0x097F -- */
+    0x09B0, 0x0100, 0x0100, 0x0100, 0x10E0, 0x05B0, 0x0100, 0x0100, 0x10E0, 0x0100, 0x1100, 0x0A70,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x1110,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0920, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x09A0, 0x1100, 0x1120, 0x08D0, 0x0100, 0x10F0, 0x08D0, 0x0980, 0x08D0, 0x00B0, 0x00B0,
+    0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x1130, 0x0100, 0x0100,
+    0x08E0, 0x00B0, 0x00B0, 0x1140,
+/* INDEX_BLOCK: -- 0x0980..0x09BF -- */
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x00B0, 0x00B0, 0x00B0, 0x1150,
+/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110,
+    0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080,
+/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080
+};
+
+static const SBUInt16 BranchBidiTypeIndexes[1088] = {
+    0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0,
+    0x0300, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0380, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x03C0, 0x0400, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0440, 0x0480, 0x04C0, 0x0340, 0x0500, 0x0540, 0x0580, 0x05C0, 0x0600, 0x0640,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0680, 0x06C0, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0700, 0x0340, 0x0340, 0x0340, 0x0340, 0x0740, 0x0780, 0x07C0, 0x0340,
+    0x0800, 0x0340, 0x0840, 0x0880, 0x08C0, 0x0900, 0x0940, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x09C0, 0x0A00, 0x0A00, 0x0A00,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980
+};
+
+SB_INTERNAL SBBidiType LookupBidiType(SBCodepoint codepoint)
+{
+    if (codepoint <= 0x10FFFF) {
+        return PrimaryBidiTypeData[
+                MainBidiTypeIndexes[
+                 BranchBidiTypeIndexes[
+                      codepoint / 0x0400
+                 ] + (codepoint % 0x0400) / 0x0010
+                ] + codepoint % 0x0010
+               ];
+    }
+
+    return ON;
+}
+
+#undef AL
+#undef AN
+#undef B
+#undef BN
+#undef CS
+#undef EN
+#undef ES
+#undef ET
+#undef FSI
+#undef L
+#undef LRE
+#undef LRI
+#undef LRO
+#undef NSM
+#undef ON
+#undef PDF
+#undef PDI
+#undef R
+#undef RLE
+#undef RLI
+#undef RLO
+#undef S
+#undef WS
diff --git a/lib/sheenbidi/Source/BidiTypeLookup.h b/lib/sheenbidi/Source/BidiTypeLookup.h
new file mode 100644
index 000000000..dc39b32fd
--- /dev/null
+++ b/lib/sheenbidi/Source/BidiTypeLookup.h
@@ -0,0 +1,16 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ */
+
+#ifndef _SB_INTERNAL_BIDI_TYPE_LOOKUP_H
+#define _SB_INTERNAL_BIDI_TYPE_LOOKUP_H
+
+#include <SBBidiType.h>
+#include <SBConfig.h>
+
+#include "SBBase.h"
+
+SB_INTERNAL SBBidiType LookupBidiType(SBCodepoint codepoint);
+
+#endif
diff --git a/lib/sheenbidi/Source/BracketQueue.c b/lib/sheenbidi/Source/BracketQueue.c
new file mode 100644
index 000000000..a47783114
--- /dev/null
+++ b/lib/sheenbidi/Source/BracketQueue.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "BidiChain.h"
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "BracketQueue.h"
+
+static void BracketQueueFinalizePairs(BracketQueueRef queue, BracketQueueListRef list, SBInteger top)
+{
+    do {
+        SBInteger limit = (list == queue->_rearList ? queue->_rearTop : BracketQueueList_MaxIndex);
+
+        while (++top <= limit) {
+            if (list->openingLink[top] != BidiLinkNone
+                && list->closingLink[top] == BidiLinkNone) {
+                list->openingLink[top] = BidiLinkNone;
+            }
+        }
+
+        list = list->next;
+        top = 0;
+    } while (list);
+}
+
+SB_INTERNAL void BracketQueueInitialize(BracketQueueRef queue)
+{
+    queue->_firstList.previous = NULL;
+    queue->_firstList.next = NULL;
+    queue->_frontList = NULL;
+    queue->_rearList = NULL;
+    queue->count = 0;
+    queue->shouldDequeue = SBFalse;
+}
+
+SB_INTERNAL void BracketQueueReset(BracketQueueRef queue, SBBidiType direction)
+{
+    queue->_frontList = &queue->_firstList;
+    queue->_rearList = &queue->_firstList;
+    queue->_frontTop = 0;
+    queue->_rearTop = -1;
+    queue->count = 0;
+    queue->shouldDequeue = SBFalse;
+    queue->_direction = direction;
+}
+
+SB_INTERNAL void BracketQueueEnqueue(BracketQueueRef queue,
+   BidiLink priorStrongLink, BidiLink openingLink, SBCodepoint bracket)
+{
+    BracketQueueListRef list;
+    SBInteger top;
+
+    /* The queue can only take a maximum of 63 elements. */
+    SBAssert(queue->count < BracketQueueGetMaxCapacity());
+
+    if (queue->_rearTop != BracketQueueList_MaxIndex) {
+        list = queue->_rearList;
+        top = ++queue->_rearTop;
+    } else {
+        BracketQueueListRef rearList;
+
+        rearList = queue->_rearList;
+        list = rearList->next;
+
+        if (!list) {
+            list = malloc(sizeof(BracketQueueList));
+            list->previous = rearList;
+            list->next = NULL;
+
+            rearList->next = list;
+        }
+
+        queue->_rearList = list;
+        queue->_rearTop = top = 0;
+    }
+    queue->count += 1;
+
+    list->priorStrongLink[top] = priorStrongLink;
+    list->openingLink[top] = openingLink;
+    list->closingLink[top] = BidiLinkNone;
+    list->bracket[top] = bracket;
+    list->strongType[top] = SBBidiTypeNil;
+}
+
+SB_INTERNAL void BracketQueueDequeue(BracketQueueRef queue)
+{
+    /* The queue must NOT be empty. */
+    SBAssert(queue->count != 0);
+
+    if (queue->_frontTop != BracketQueueList_MaxIndex) {
+        queue->_frontTop += 1;
+    } else {
+        BracketQueueListRef frontList = queue->_frontList;
+
+        if (frontList == queue->_rearList) {
+            queue->_rearTop = -1;
+        } else {
+            queue->_frontList = frontList->next;
+        }
+
+        queue->_frontTop = 0;
+    }
+
+    queue->count -= 1;
+}
+
+SB_INTERNAL void BracketQueueSetStrongType(BracketQueueRef queue, SBBidiType strongType)
+{
+    BracketQueueListRef list = queue->_rearList;
+    SBInteger top = queue->_rearTop;
+
+    while (1) {
+        SBInteger limit = (list == queue->_frontList ? queue->_frontTop : 0);
+
+        do {
+            if (list->closingLink[top] == BidiLinkNone
+                && list->strongType[top] != queue->_direction) {
+                list->strongType[top] = strongType;
+            }
+        } while (top-- > limit);
+
+        if (list == queue->_frontList) {
+            break;
+        }
+
+        list = list->previous;
+        top = BracketQueueList_MaxIndex;
+    }
+}
+
+SB_INTERNAL void BracketQueueClosePair(BracketQueueRef queue, BidiLink closingLink, SBCodepoint bracket)
+{
+    BracketQueueListRef list = queue->_rearList;
+    SBInteger top = queue->_rearTop;
+    SBCodepoint canonical;
+
+    switch (bracket) {
+    case 0x232A:
+        canonical = 0x3009;
+        break;
+
+    case 0x3009:
+        canonical = 0x232A;
+        break;
+
+    default:
+        canonical = bracket;
+        break;
+    }
+
+    while (1) {
+        SBBoolean isFrontList = (list == queue->_frontList);
+        SBInteger limit = (isFrontList ? queue->_frontTop : 0);
+
+        do {
+            if (list->openingLink[top] != BidiLinkNone
+                && list->closingLink[top] == BidiLinkNone
+                && (list->bracket[top] == bracket || list->bracket[top] == canonical)) {
+                list->closingLink[top] = closingLink;
+                BracketQueueFinalizePairs(queue, list, top);
+
+                if (isFrontList && top == queue->_frontTop) {
+                    queue->shouldDequeue = SBTrue;
+                }
+
+                return;
+            }
+        } while (top-- > limit);
+
+        if (isFrontList) {
+            break;
+        }
+
+        list = list->previous;
+        top = BracketQueueList_MaxIndex;
+    }
+}
+
+SB_INTERNAL SBBoolean BracketQueueShouldDequeue(BracketQueueRef queue)
+{
+    return queue->shouldDequeue;
+}
+
+SB_INTERNAL BidiLink BracketQueueGetPriorStrongLink(BracketQueueRef queue)
+{
+    return queue->_frontList->priorStrongLink[queue->_frontTop];
+}
+
+SB_INTERNAL BidiLink BracketQueueGetOpeningLink(BracketQueueRef queue)
+{
+    return queue->_frontList->openingLink[queue->_frontTop];
+}
+
+SB_INTERNAL BidiLink BracketQueueGetClosingLink(BracketQueueRef queue)
+{
+    return queue->_frontList->closingLink[queue->_frontTop];
+}
+
+SB_INTERNAL SBBidiType BracketQueueGetStrongType(BracketQueueRef queue)
+{
+    return queue->_frontList->strongType[queue->_frontTop];
+}
+
+SB_INTERNAL void BracketQueueFinalize(BracketQueueRef queue)
+{
+    BracketQueueListRef list = queue->_firstList.next;
+
+    while (list) {
+        BracketQueueListRef next = list->next;
+        free(list);
+        list = next;
+    }
+}
diff --git a/lib/sheenbidi/Source/BracketQueue.h b/lib/sheenbidi/Source/BracketQueue.h
new file mode 100644
index 000000000..8cf135a10
--- /dev/null
+++ b/lib/sheenbidi/Source/BracketQueue.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_BRACKET_QUEUE_H
+#define _SB_INTERNAL_BRACKET_QUEUE_H
+
+#include <SBConfig.h>
+
+#include "BidiChain.h"
+#include "SBBase.h"
+
+#define BracketQueueList_Length         8
+#define BracketQueueList_MaxIndex       (BracketQueueList_Length - 1)
+
+typedef struct _BracketQueueList {
+    SBCodepoint bracket[BracketQueueList_Length];
+    BidiLink priorStrongLink[BracketQueueList_Length];
+    BidiLink openingLink[BracketQueueList_Length];
+    BidiLink closingLink[BracketQueueList_Length];
+    SBBidiType strongType[BracketQueueList_Length];
+
+    struct _BracketQueueList *previous;
+    struct _BracketQueueList *next;
+} BracketQueueList, *BracketQueueListRef;
+
+typedef struct _BracketQueue {
+    BracketQueueList _firstList;
+    BracketQueueListRef _frontList;
+    BracketQueueListRef _rearList;
+    SBInteger _frontTop;
+    SBInteger _rearTop;
+    SBUInteger count;
+    SBBoolean shouldDequeue;
+    SBBidiType _direction;
+} BracketQueue, *BracketQueueRef;
+
+#define BracketQueueGetMaxCapacity()        63
+
+SB_INTERNAL void BracketQueueInitialize(BracketQueueRef queue);
+SB_INTERNAL void BracketQueueReset(BracketQueueRef queue, SBBidiType direction);
+
+SB_INTERNAL void BracketQueueEnqueue(BracketQueueRef queue,
+    BidiLink priorStrongLink, BidiLink openingLink, SBCodepoint bracket);
+SB_INTERNAL void BracketQueueDequeue(BracketQueueRef queue);
+
+SB_INTERNAL void BracketQueueSetStrongType(BracketQueueRef queue, SBBidiType strongType);
+SB_INTERNAL void BracketQueueClosePair(BracketQueueRef queue,
+    BidiLink closingLink, SBCodepoint bracket);
+
+SB_INTERNAL SBBoolean BracketQueueShouldDequeue(BracketQueueRef queue);
+
+SB_INTERNAL BidiLink BracketQueueGetPriorStrongLink(BracketQueueRef queue);
+SB_INTERNAL BidiLink BracketQueueGetOpeningLink(BracketQueueRef queue);
+SB_INTERNAL BidiLink BracketQueueGetClosingLink(BracketQueueRef queue);
+SB_INTERNAL SBBidiType BracketQueueGetStrongType(BracketQueueRef queue);
+
+SB_INTERNAL void BracketQueueFinalize(BracketQueueRef queue);
+
+#endif
diff --git a/lib/sheenbidi/Source/BracketType.h b/lib/sheenbidi/Source/BracketType.h
new file mode 100644
index 000000000..5f44e3479
--- /dev/null
+++ b/lib/sheenbidi/Source/BracketType.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_BRACKET_TYPE_H
+#define _SB_INTERNAL_BRACKET_TYPE_H
+
+#include "SBBase.h"
+
+enum {
+    BracketTypeNone  = 0x00,
+    BracketTypeOpen  = 0x40,    /**< Opening paired bracket. */
+    BracketTypeClose = 0x80,    /**< Closing paired bracket. */
+
+    BracketTypePrimaryMask = BracketTypeOpen | BracketTypeClose,
+    BracketTypeInverseMask = ~BracketTypePrimaryMask
+};
+typedef SBUInt8 BracketType;
+
+#endif
diff --git a/lib/sheenbidi/Source/GeneralCategoryLookup.c b/lib/sheenbidi/Source/GeneralCategoryLookup.c
new file mode 100644
index 000000000..276c33e42
--- /dev/null
+++ b/lib/sheenbidi/Source/GeneralCategoryLookup.c
@@ -0,0 +1,1964 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool. 
+ * DO NOT EDIT!!
+ *
+ * REQUIRED MEMORY: 10654+(4096*2)+(1088*2) = 21022 Bytes
+ */
+
+#include "GeneralCategoryLookup.h"
+
+#define Cc     SBGeneralCategoryCC
+#define Cf     SBGeneralCategoryCF
+#define Cn     SBGeneralCategoryCN
+#define Co     SBGeneralCategoryCO
+#define Cs     SBGeneralCategoryCS
+#define Ll     SBGeneralCategoryLL
+#define Lm     SBGeneralCategoryLM
+#define Lo     SBGeneralCategoryLO
+#define Lt     SBGeneralCategoryLT
+#define Lu     SBGeneralCategoryLU
+#define Mc     SBGeneralCategoryMC
+#define Me     SBGeneralCategoryME
+#define Mn     SBGeneralCategoryMN
+#define Nd     SBGeneralCategoryND
+#define Nl     SBGeneralCategoryNL
+#define No     SBGeneralCategoryNO
+#define Pc     SBGeneralCategoryPC
+#define Pd     SBGeneralCategoryPD
+#define Pe     SBGeneralCategoryPE
+#define Pf     SBGeneralCategoryPF
+#define Pi     SBGeneralCategoryPI
+#define Po     SBGeneralCategoryPO
+#define Ps     SBGeneralCategoryPS
+#define Sc     SBGeneralCategorySC
+#define Sk     SBGeneralCategorySK
+#define Sm     SBGeneralCategorySM
+#define So     SBGeneralCategorySO
+#define Zl     SBGeneralCategoryZL
+#define Zp     SBGeneralCategoryZP
+#define Zs     SBGeneralCategoryZS
+
+static const SBUInt8 PrimaryGeneralCategoryData[10654] = {
+/* DATA_BLOCK: -- 0x0000..0x000F -- */
+    Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,  Cc,
+/* DATA_BLOCK: -- 0x0010..0x001F -- */
+    Zs,  Po,  Po,  Po,  Sc,  Po,  Po,  Po,  Ps,  Pe,  Po,  Sm,  Po,  Pd,  Po,  Po,
+/* DATA_BLOCK: -- 0x0020..0x002F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Po,  Po,  Sm,  Sm,  Sm,  Po,
+/* DATA_BLOCK: -- 0x0030..0x003F -- */
+    Po,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0040..0x004F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ps,  Po,  Pe,  Sk,  Pc,
+/* DATA_BLOCK: -- 0x0050..0x005F -- */
+    Sk,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0060..0x006F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ps,  Sm,  Pe,  Sm,  Cc,
+/* DATA_BLOCK: -- 0x0070..0x007F -- */
+    Zs,  Po,  Sc,  Sc,  Sc,  Sc,  So,  Po,  Sk,  So,  Lo,  Pi,  Sm,  Cf,  So,  Sk,
+/* DATA_BLOCK: -- 0x0080..0x008F -- */
+    So,  Sm,  No,  No,  Sk,  Ll,  Po,  Po,  Sk,  No,  Lo,  Pf,  No,  No,  No,  Po,
+/* DATA_BLOCK: -- 0x0090..0x009F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x00A0..0x00AF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Sm,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x00B0..0x00BF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x00C0..0x00CF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x00D0..0x00DF -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x00E0..0x00EF -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,
+/* DATA_BLOCK: -- 0x00F0..0x00FF -- */
+    Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0100..0x010F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0110..0x011F -- */
+    Ll,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Ll,  Lu,  Lu,  Lu,  Ll,  Ll,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0120..0x012F -- */
+    Lu,  Lu,  Ll,  Lu,  Lu,  Ll,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Lu,  Lu,  Ll,  Lu,
+/* DATA_BLOCK: -- 0x0130..0x013F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Ll,  Lu,  Ll,  Ll,  Lu,  Ll,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0140..0x014F -- */
+    Ll,  Lu,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Ll,  Ll,  Lo,  Lu,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0150..0x015F -- */
+    Lo,  Lo,  Lo,  Lo,  Lu,  Lt,  Ll,  Lu,  Lt,  Ll,  Lu,  Lt,  Ll,  Lu,  Ll,  Lu,
+/* DATA_BLOCK: -- 0x0160..0x016F -- */
+    Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0170..0x017F -- */
+    Ll,  Lu,  Lt,  Ll,  Lu,  Ll,  Lu,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0180..0x018F -- */
+    Lu,  Ll,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Ll,  Lu,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0190..0x019F -- */
+    Ll,  Lu,  Ll,  Lu,  Lu,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x01A0..0x01AF -- */
+    Ll,  Ll,  Ll,  Ll,  Lo,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x01B0..0x01BF -- */
+    Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x01C0..0x01CF -- */
+    Lm,  Lm,  Sk,  Sk,  Sk,  Sk,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x01D0..0x01DF -- */
+    Lm,  Lm,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x01E0..0x01EF -- */
+    Lm,  Lm,  Lm,  Lm,  Lm,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Lm,  Sk,  Lm,  Sk,
+/* DATA_BLOCK: -- 0x01F0..0x01FF -- */
+    Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x0200..0x020F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0210..0x021F -- */
+    Lu,  Ll,  Lu,  Ll,  Lm,  Sk,  Lu,  Ll,  Cn,  Cn,  Lm,  Ll,  Ll,  Ll,  Po,  Lu,
+/* DATA_BLOCK: -- 0x0220..0x022F -- */
+    Cn,  Cn,  Cn,  Cn,  Sk,  Sk,  Lu,  Po,  Lu,  Lu,  Lu,  Cn,  Lu,  Cn,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0230..0x023F -- */
+    Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0240..0x024F -- */
+    Lu,  Lu,  Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0250..0x025F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,
+/* DATA_BLOCK: -- 0x0260..0x026F -- */
+    Ll,  Ll,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0270..0x027F -- */
+    Ll,  Ll,  Ll,  Ll,  Lu,  Ll,  Sm,  Lu,  Ll,  Lu,  Lu,  Ll,  Ll,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0280..0x028F -- */
+    Lu,  Ll,  So,  Mn,  Mn,  Mn,  Mn,  Mn,  Me,  Me,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0290..0x029F -- */
+    Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x02A0..0x02AF -- */
+    Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x02B0..0x02BF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Cn,  Lm,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x02C0..0x02CF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Po,  Pd,  Cn,  Cn,  So,  So,  Sc,
+/* DATA_BLOCK: -- 0x02D0..0x02DF -- */
+    Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x02E0..0x02EF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Pd,  Mn,
+/* DATA_BLOCK: -- 0x02F0..0x02FF -- */
+    Po,  Mn,  Mn,  Po,  Mn,  Mn,  Po,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0300..0x030F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0310..0x031F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x0320..0x032F -- */
+    Lo,  Lo,  Lo,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0330..0x033F -- */
+    Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Sm,  Sm,  Sm,  Po,  Po,  Sc,  Po,  Po,  So,  So,
+/* DATA_BLOCK: -- 0x0340..0x034F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Cf,  Cn,  Po,  Po,
+/* DATA_BLOCK: -- 0x0350..0x035F -- */
+    Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0360..0x036F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Po,  Po,  Po,  Po,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0370..0x037F -- */
+    Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0380..0x038F -- */
+    Lo,  Lo,  Lo,  Lo,  Po,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cf,  So,  Mn,
+/* DATA_BLOCK: -- 0x0390..0x039F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Lm,  Lm,  Mn,  Mn,  So,  Mn,  Mn,  Mn,  Mn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x03A0..0x03AF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Lo,  Lo,  Lo,  So,  So,  Lo,
+/* DATA_BLOCK: -- 0x03B0..0x03BF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cf,
+/* DATA_BLOCK: -- 0x03C0..0x03CF -- */
+    Lo,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x03D0..0x03DF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x03E0..0x03EF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x03F0..0x03FF -- */
+    Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0400..0x040F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0410..0x041F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0420..0x042F -- */
+    Mn,  Mn,  Mn,  Mn,  Lm,  Lm,  So,  Po,  Po,  Po,  Lm,  Cn,  Cn,  Mn,  Sc,  Sc,
+/* DATA_BLOCK: -- 0x0430..0x043F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Lm,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0440..0x044F -- */
+    Mn,  Mn,  Mn,  Mn,  Lm,  Mn,  Mn,  Mn,  Lm,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0450..0x045F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,
+/* DATA_BLOCK: -- 0x0460..0x046F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Cn,  Cn,  Po,  Cn,
+/* DATA_BLOCK: -- 0x0470..0x047F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0480..0x048F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0490..0x049F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x04A0..0x04AF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x04B0..0x04BF -- */
+    Cn,  Cn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x04C0..0x04CF -- */
+    Mn,  Mn,  Cf,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x04D0..0x04DF -- */
+    Mn,  Mn,  Mn,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x04E0..0x04EF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mc,  Mn,  Lo,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x04F0..0x04FF -- */
+    Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mc,  Mc,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0500..0x050F -- */
+    Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0510..0x051F -- */
+    Lo,  Lo,  Mn,  Mn,  Po,  Po,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x0520..0x052F -- */
+    Po,  Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0530..0x053F -- */
+    Lo,  Mn,  Mc,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x0540..0x054F -- */
+    Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0550..0x055F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0560..0x056F -- */
+    Lo,  Cn,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Lo,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0570..0x057F -- */
+    Mc,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mc,  Mc,  Cn,  Cn,  Mc,  Mc,  Mn,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x0580..0x058F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mc,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x0590..0x059F -- */
+    Lo,  Lo,  Mn,  Mn,  Cn,  Cn,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x05A0..0x05AF -- */
+    Lo,  Lo,  Sc,  Sc,  No,  No,  No,  No,  No,  No,  So,  Sc,  Lo,  Po,  Mn,  Cn,
+/* DATA_BLOCK: -- 0x05B0..0x05BF -- */
+    Cn,  Mn,  Mn,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x05C0..0x05CF -- */
+    Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Cn,  Mn,  Cn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x05D0..0x05DF -- */
+    Mc,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Mn,  Mn,  Cn,  Cn,  Mn,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x05E0..0x05EF -- */
+    Cn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x05F0..0x05FF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x0600..0x060F -- */
+    Mn,  Mn,  Lo,  Lo,  Lo,  Mn,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0610..0x061F -- */
+    Cn,  Mn,  Mn,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x0620..0x062F -- */
+    Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0630..0x063F -- */
+    Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Lo,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0640..0x064F -- */
+    Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mc,  Cn,  Mc,  Mc,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0650..0x065F -- */
+    Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0660..0x066F -- */
+    Po,  Sc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0670..0x067F -- */
+    Cn,  Mn,  Mc,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x0680..0x068F -- */
+    Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Lo,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x0690..0x069F -- */
+    Mc,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mc,  Mc,  Cn,  Cn,  Mc,  Mc,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x06A0..0x06AF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Mn,  Mn,  Mc,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x06B0..0x06BF -- */
+    So,  Lo,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x06C0..0x06CF -- */
+    Cn,  Cn,  Mn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x06D0..0x06DF -- */
+    Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x06E0..0x06EF -- */
+    Cn,  Cn,  Cn,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x06F0..0x06FF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0700..0x070F -- */
+    Mn,  Mc,  Mc,  Cn,  Cn,  Cn,  Mc,  Mc,  Mc,  Cn,  Mc,  Mc,  Mc,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0710..0x071F -- */
+    Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0720..0x072F -- */
+    No,  No,  No,  So,  So,  So,  So,  So,  So,  Sc,  So,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0730..0x073F -- */
+    Mn,  Mc,  Mc,  Mc,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0740..0x074F -- */
+    Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0750..0x075F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0760..0x076F -- */
+    Mn,  Mc,  Mc,  Mc,  Mc,  Cn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0770..0x077F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Mn,  Mn,  Cn,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0780..0x078F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,  No,  No,  No,  No,  No,  No,  No,  So,
+/* DATA_BLOCK: -- 0x0790..0x079F -- */
+    Lo,  Mn,  Mc,  Mc,  Po,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x07A0..0x07AF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Lo,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x07B0..0x07BF -- */
+    Mc,  Mc,  Mc,  Mc,  Mc,  Cn,  Mn,  Mc,  Mc,  Cn,  Mc,  Mc,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x07C0..0x07CF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Mc,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x07D0..0x07DF -- */
+    Cn,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x07E0..0x07EF -- */
+    Mn,  Mn,  Mc,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x07F0..0x07FF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Lo,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0800..0x080F -- */
+    Mc,  Mn,  Mn,  Mn,  Mn,  Cn,  Mc,  Mc,  Mc,  Cn,  Mc,  Mc,  Mc,  Mn,  Lo,  So,
+/* DATA_BLOCK: -- 0x0810..0x081F -- */
+    Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Mc,  No,  No,  No,  No,  No,  No,  No,  Lo,
+/* DATA_BLOCK: -- 0x0820..0x082F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0830..0x083F -- */
+    Cn,  Mn,  Mc,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0840..0x084F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0850..0x085F -- */
+    Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0860..0x086F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Mn,  Cn,  Cn,  Cn,  Cn,  Mc,
+/* DATA_BLOCK: -- 0x0870..0x087F -- */
+    Mc,  Mc,  Mn,  Mn,  Mn,  Cn,  Mn,  Cn,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0880..0x088F -- */
+    Cn,  Cn,  Mc,  Mc,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0890..0x089F -- */
+    Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x08A0..0x08AF -- */
+    Lo,  Mn,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Sc,
+/* DATA_BLOCK: -- 0x08B0..0x08BF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lm,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,
+/* DATA_BLOCK: -- 0x08C0..0x08CF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Po,  Po,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x08D0..0x08DF -- */
+    Cn,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x08E0..0x08EF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x08F0..0x08FF -- */
+    Lo,  Mn,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0900..0x090F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lm,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0910..0x091F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0920..0x092F -- */
+    Lo,  So,  So,  So,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x0930..0x093F -- */
+    Po,  Po,  Po,  So,  Po,  So,  So,  So,  Mn,  Mn,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x0940..0x094F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x0950..0x095F -- */
+    No,  No,  No,  No,  So,  Mn,  So,  Mn,  So,  Mn,  Ps,  Pe,  Ps,  Pe,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0960..0x096F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0970..0x097F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0980..0x098F -- */
+    Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,
+/* DATA_BLOCK: -- 0x0990..0x099F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x09A0..0x09AF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x09B0..0x09BF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  So,  So,
+/* DATA_BLOCK: -- 0x09C0..0x09CF -- */
+    So,  So,  So,  So,  So,  So,  Mn,  So,  So,  So,  So,  So,  So,  Cn,  So,  So,
+/* DATA_BLOCK: -- 0x09D0..0x09DF -- */
+    Po,  Po,  Po,  Po,  Po,  So,  So,  So,  So,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x09E0..0x09EF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x09F0..0x09FF -- */
+    Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Lo,
+/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */
+    Mn,  Lo,  Mc,  Mc,  Mc,  Lo,  Lo,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */
+    Lo,  Mn,  Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */
+    Lo,  Lo,  Mn,  Mc,  Mc,  Mn,  Mn,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mn,  Lo,  Mc,
+/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Mc,  Mc,  Mc,  Mn,  So,  So,
+/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Lu,  Cn,  Cn,  Cn,  Cn,  Cn,  Lu,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Po,  Lm,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */
+    Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */
+    Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */
+    Pd,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  So,  Po,  Lo,
+/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */
+    Zs,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Ps,  Pe,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Po,  Po,  Po,  Nl,  Nl,
+/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */
+    Nl,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */
+    Lo,  Lo,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */
+    Lo,  Lo,  Mn,  Mn,  Mn,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */
+    Lo,  Lo,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */
+    Lo,  Cn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */
+    Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */
+    Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mn,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */
+    Mn,  Mn,  Mn,  Mn,  Po,  Po,  Po,  Lm,  Po,  Po,  Po,  Sc,  Lo,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Pd,  Po,  Po,  Po,  Po,  Mn,  Mn,  Mn,  Cf,  Cn,
+/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */
+    Lo,  Lo,  Lo,  Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */
+    Mn,  Mn,  Mn,  Mc,  Mc,  Mc,  Mc,  Mn,  Mn,  Mc,  Mc,  Mc,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */
+    Mc,  Mc,  Mn,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */
+    So,  Cn,  Cn,  Cn,  Po,  Po,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  No,  Cn,  Cn,  Cn,  So,  So,
+/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mc,  Mc,  Mn,  Cn,  Cn,  Po,  Po,
+/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,
+/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */
+    Mn,  Mc,  Mn,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */
+    Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Lm,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Me,  Mn,
+/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */
+    Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */
+    Mn,  Mn,  Mn,  Mn,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */
+    Lo,  Lo,  Lo,  Lo,  Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */
+    Mc,  Mc,  Mn,  Mc,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */
+    Po,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */
+    Mn,  Mn,  Mn,  Mn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */
+    Mn,  Mn,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */
+    Lo,  Mc,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Mc,  Mn,  Mn,  Mn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mc,  Mn,  Mn,  Mc,  Mc,  Mc,  Mn,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */
+    Mn,  Mn,  Mc,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */
+    Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */
+    Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Cn,  Cn,  Cn,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Po,  Po,
+/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Cn,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */
+    Mn,  Mn,  Mn,  Po,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */
+    Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Mn,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */
+    Lo,  Lo,  Lo,  Lo,  Mn,  Lo,  Lo,  Mc,  Mn,  Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */
+    Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lm,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Lu,  Cn,  Lu,  Cn,  Lu,  Cn,  Lu,
+/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lt,  Lt,  Lt,  Lt,  Lt,  Lt,  Lt,  Lt,
+/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lt,  Sk,  Ll,  Sk,
+/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */
+    Sk,  Sk,  Ll,  Ll,  Ll,  Cn,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lt,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */
+    Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Cn,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */
+    Cn,  Cn,  Ll,  Ll,  Ll,  Cn,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lt,  Sk,  Sk,  Cn,
+/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */
+    Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Zs,  Cf,  Cf,  Cf,  Cf,  Cf,
+/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */
+    Pd,  Pd,  Pd,  Pd,  Pd,  Pd,  Po,  Po,  Pi,  Pf,  Ps,  Pi,  Pi,  Pf,  Ps,  Pi,
+/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Zl,  Zp,  Cf,  Cf,  Cf,  Cf,  Cf,  Zs,
+/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Pi,  Pf,  Po,  Po,  Po,  Po,  Pc,
+/* DATA_BLOCK: -- 0x1000..0x100F -- */
+    Pc,  Po,  Po,  Po,  Sm,  Ps,  Pe,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1010..0x101F -- */
+    Po,  Po,  Sm,  Po,  Pc,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Zs,
+/* DATA_BLOCK: -- 0x1020..0x102F -- */
+    Cf,  Cf,  Cf,  Cf,  Cf,  Cn,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,
+/* DATA_BLOCK: -- 0x1030..0x103F -- */
+    No,  Lm,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  Sm,  Sm,  Sm,  Ps,  Pe,  Lm,
+/* DATA_BLOCK: -- 0x1040..0x104F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Sm,  Sm,  Sm,  Ps,  Pe,  Cn,
+/* DATA_BLOCK: -- 0x1050..0x105F -- */
+    Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1060..0x106F -- */
+    Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,  Sc,
+/* DATA_BLOCK: -- 0x1070..0x107F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Me,  Me,  Me,
+/* DATA_BLOCK: -- 0x1080..0x108F -- */
+    Me,  Mn,  Me,  Me,  Me,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1090..0x109F -- */
+    So,  So,  Lu,  So,  So,  So,  So,  Lu,  So,  So,  Ll,  Lu,  Lu,  Lu,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x10A0..0x10AF -- */
+    Lu,  Lu,  Lu,  Ll,  So,  Lu,  So,  So,  Sm,  Lu,  Lu,  Lu,  Lu,  Lu,  So,  So,
+/* DATA_BLOCK: -- 0x10B0..0x10BF -- */
+    So,  So,  So,  So,  Lu,  So,  Lu,  So,  Lu,  So,  Lu,  Lu,  Lu,  Lu,  So,  Ll,
+/* DATA_BLOCK: -- 0x10C0..0x10CF -- */
+    Lu,  Lu,  Lu,  Lu,  Ll,  Lo,  Lo,  Lo,  Lo,  Ll,  So,  So,  Ll,  Ll,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x10D0..0x10DF -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Lu,  Ll,  Ll,  Ll,  Ll,  So,  Sm,  So,  So,  Ll,  So,
+/* DATA_BLOCK: -- 0x10E0..0x10EF -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x10F0..0x10FF -- */
+    Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,
+/* DATA_BLOCK: -- 0x1100..0x110F -- */
+    Nl,  Nl,  Nl,  Lu,  Ll,  Nl,  Nl,  Nl,  Nl,  No,  So,  So,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1110..0x111F -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  So,  So,  So,  So,  So,  Sm,  Sm,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1120..0x112F -- */
+    Sm,  So,  So,  Sm,  So,  So,  Sm,  So,  So,  So,  So,  So,  So,  So,  Sm,  So,
+/* DATA_BLOCK: -- 0x1130..0x113F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x1140..0x114F -- */
+    So,  So,  Sm,  So,  Sm,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1150..0x115F -- */
+    So,  So,  So,  So,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x1160..0x116F -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x1170..0x117F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  Ps,  Pe,  Ps,  Pe,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1180..0x118F -- */
+    Sm,  Sm,  So,  So,  So,  So,  So,  So,  So,  Ps,  Pe,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1190..0x119F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sm,  So,  So,  So,
+/* DATA_BLOCK: -- 0x11A0..0x11AF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x11B0..0x11BF -- */
+    Sm,  Sm,  Sm,  Sm,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x11C0..0x11CF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x11D0..0x11DF -- */
+    Sm,  Sm,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x11E0..0x11EF -- */
+    So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x11F0..0x11FF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1200..0x120F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1210..0x121F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1220..0x122F -- */
+    So,  So,  So,  So,  So,  So,  So,  Sm,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1230..0x123F -- */
+    So,  Sm,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1240..0x124F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x1250..0x125F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sm,
+/* DATA_BLOCK: -- 0x1260..0x126F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,
+/* DATA_BLOCK: -- 0x1270..0x127F -- */
+    Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1280..0x128F -- */
+    No,  No,  No,  No,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1290..0x129F -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Ps,  Pe,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x12A0..0x12AF -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,
+/* DATA_BLOCK: -- 0x12B0..0x12BF -- */
+    Sm,  Sm,  Sm,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,
+/* DATA_BLOCK: -- 0x12C0..0x12CF -- */
+    Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x12D0..0x12DF -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Ps,  Pe,  Ps,  Pe,  Sm,  Sm,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x12E0..0x12EF -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  Ps,  Pe,  Sm,  Sm,
+/* DATA_BLOCK: -- 0x12F0..0x12FF -- */
+    Sm,  Sm,  Sm,  Sm,  Sm,  So,  So,  Sm,  Sm,  Sm,  Sm,  Sm,  Sm,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1300..0x130F -- */
+    So,  So,  So,  So,  Cn,  Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1310..0x131F -- */
+    So,  So,  So,  So,  So,  So,  Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1320..0x132F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,
+/* DATA_BLOCK: -- 0x1330..0x133F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,
+/* DATA_BLOCK: -- 0x1340..0x134F -- */
+    Lu,  Ll,  Lu,  Lu,  Lu,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x1350..0x135F -- */
+    Lu,  Ll,  Lu,  Ll,  Ll,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lm,  Lm,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x1360..0x136F -- */
+    Lu,  Ll,  Lu,  Ll,  Ll,  So,  So,  So,  So,  So,  So,  Lu,  Ll,  Lu,  Ll,  Mn,
+/* DATA_BLOCK: -- 0x1370..0x137F -- */
+    Mn,  Mn,  Lu,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,  Po,  Po,  Po,  No,  Po,  Po,
+/* DATA_BLOCK: -- 0x1380..0x138F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Ll,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1390..0x139F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lm,
+/* DATA_BLOCK: -- 0x13A0..0x13AF -- */
+    Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x13B0..0x13BF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x13C0..0x13CF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x13D0..0x13DF -- */
+    Po,  Po,  Pi,  Pf,  Pi,  Pf,  Po,  Po,  Po,  Pi,  Pf,  Po,  Pi,  Pf,  Po,  Po,
+/* DATA_BLOCK: -- 0x13E0..0x13EF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Pd,  Po,  Po,  Pd,  Po,  Pi,  Pf,  Po,  Po,
+/* DATA_BLOCK: -- 0x13F0..0x13FF -- */
+    Pi,  Pf,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Po,  Po,  Po,  Po,  Po,  Lm,
+/* DATA_BLOCK: -- 0x1400..0x140F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Pd,  Pd,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1410..0x141F -- */
+    Pd,  Po,  Ps,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1420..0x142F -- */
+    So,  So,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1430..0x143F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1440..0x144F -- */
+    So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1450..0x145F -- */
+    So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1460..0x146F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1470..0x147F -- */
+    Zs,  Po,  Po,  Po,  So,  Lm,  Lo,  Nl,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,
+/* DATA_BLOCK: -- 0x1480..0x148F -- */
+    Ps,  Pe,  So,  So,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Pd,  Ps,  Pe,  Pe,
+/* DATA_BLOCK: -- 0x1490..0x149F -- */
+    So,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x14A0..0x14AF -- */
+    Pd,  Lm,  Lm,  Lm,  Lm,  Lm,  So,  So,  Nl,  Nl,  Nl,  Lm,  Lo,  Po,  So,  So,
+/* DATA_BLOCK: -- 0x14B0..0x14BF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Mn,  Sk,  Sk,  Lm,  Lm,  Lo,
+/* DATA_BLOCK: -- 0x14C0..0x14CF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Po,  Lm,  Lm,  Lm,  Lo,
+/* DATA_BLOCK: -- 0x14D0..0x14DF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x14E0..0x14EF -- */
+    So,  So,  No,  No,  No,  No,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x14F0..0x14FF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,
+/* DATA_BLOCK: -- 0x1500..0x150F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1510..0x151F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1520..0x152F -- */
+    So,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1530..0x153F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1540..0x154F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1550..0x155F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1560..0x156F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lm,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1570..0x157F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1580..0x158F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lo,  Mn,
+/* DATA_BLOCK: -- 0x1590..0x159F -- */
+    Me,  Me,  Me,  Po,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Lm,
+/* DATA_BLOCK: -- 0x15A0..0x15AF -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lm,  Lm,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x15B0..0x15BF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,
+/* DATA_BLOCK: -- 0x15C0..0x15CF -- */
+    Mn,  Mn,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x15D0..0x15DF -- */
+    Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x15E0..0x15EF -- */
+    Sk,  Sk,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x15F0..0x15FF -- */
+    Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x1600..0x160F -- */
+    Lm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x1610..0x161F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lm,  Sk,  Sk,  Lu,  Ll,  Lu,  Ll,  Lo,
+/* DATA_BLOCK: -- 0x1620..0x162F -- */
+    Lu,  Ll,  Lu,  Ll,  Ll,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x1630..0x163F -- */
+    Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x1640..0x164F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,  Lu,  Ll,
+/* DATA_BLOCK: -- 0x1650..0x165F -- */
+    Cn,  Cn,  Lu,  Ll,  Lu,  Lu,  Lu,  Lu,  Ll,  Lu,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1660..0x166F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Lu,  Ll,  Lo,  Lm,  Lm,  Ll,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1670..0x167F -- */
+    Lo,  Lo,  Mn,  Lo,  Lo,  Lo,  Mn,  Lo,  Lo,  Lo,  Lo,  Mn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1680..0x168F -- */
+    Lo,  Lo,  Lo,  Mc,  Mc,  Mn,  Mn,  Mc,  So,  So,  So,  So,  Mn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1690..0x169F -- */
+    No,  No,  No,  No,  No,  No,  So,  So,  Sc,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x16A0..0x16AF -- */
+    Lo,  Lo,  Lo,  Lo,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x16B0..0x16BF -- */
+    Mc,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x16C0..0x16CF -- */
+    Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x16D0..0x16DF -- */
+    Mc,  Mc,  Mc,  Mc,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,  Po,
+/* DATA_BLOCK: -- 0x16E0..0x16EF -- */
+    Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Po,  Po,  Po,  Lo,  Po,  Lo,  Lo,  Mn,
+/* DATA_BLOCK: -- 0x16F0..0x16FF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Po,
+/* DATA_BLOCK: -- 0x1700..0x170F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1710..0x171F -- */
+    Mn,  Mn,  Mc,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,
+/* DATA_BLOCK: -- 0x1720..0x172F -- */
+    Lo,  Lo,  Lo,  Mn,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x1730..0x173F -- */
+    Mc,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Lm,
+/* DATA_BLOCK: -- 0x1740..0x174F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Cn,  Cn,  Po,  Po,
+/* DATA_BLOCK: -- 0x1750..0x175F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1760..0x176F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x1770..0x177F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,
+/* DATA_BLOCK: -- 0x1780..0x178F -- */
+    Mc,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1790..0x179F -- */
+    Lo,  Lo,  Lo,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mc,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x17A0..0x17AF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x17B0..0x17BF -- */
+    Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  So,  So,  So,  Lo,  Mc,  Mn,  Mc,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x17C0..0x17CF -- */
+    Mn,  Lo,  Mn,  Mn,  Mn,  Lo,  Lo,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x17D0..0x17DF -- */
+    Lo,  Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x17E0..0x17EF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lm,  Po,  Po,
+/* DATA_BLOCK: -- 0x17F0..0x17FF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mn,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x1800..0x180F -- */
+    Po,  Po,  Lo,  Lm,  Lm,  Mc,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1810..0x181F -- */
+    Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x1820..0x182F -- */
+    Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1830..0x183F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Sk,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x1840..0x184F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lm,  Sk,  Sk,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1850..0x185F -- */
+    Lo,  Lo,  Lo,  Mc,  Mc,  Mn,  Mc,  Mc,  Mn,  Mc,  Mc,  Po,  Mc,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1860..0x186F -- */
+    Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1870..0x187F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1880..0x188F -- */
+    Cs,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1890..0x189F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cs,
+/* DATA_BLOCK: -- 0x18A0..0x18AF -- */
+    Co,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x18B0..0x18BF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Co,
+/* DATA_BLOCK: -- 0x18C0..0x18CF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x18D0..0x18DF -- */
+    Cn,  Cn,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Mn,  Lo,
+/* DATA_BLOCK: -- 0x18E0..0x18EF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Sm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x18F0..0x18FF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x1900..0x190F -- */
+    Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1910..0x191F -- */
+    Lo,  Lo,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x1920..0x192F -- */
+    Sk,  Sk,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1930..0x193F -- */
+    Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1940..0x194F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Pe,  Ps,
+/* DATA_BLOCK: -- 0x1950..0x195F -- */
+    Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1960..0x196F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Sc,  So,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1970..0x197F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Ps,  Pe,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1980..0x198F -- */
+    Po,  Pd,  Pd,  Pc,  Pc,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Ps,
+/* DATA_BLOCK: -- 0x1990..0x199F -- */
+    Pe,  Ps,  Pe,  Ps,  Pe,  Po,  Po,  Ps,  Pe,  Po,  Po,  Po,  Po,  Pc,  Pc,  Pc,
+/* DATA_BLOCK: -- 0x19A0..0x19AF -- */
+    Po,  Po,  Po,  Cn,  Po,  Po,  Po,  Po,  Pd,  Ps,  Pe,  Ps,  Pe,  Ps,  Pe,  Po,
+/* DATA_BLOCK: -- 0x19B0..0x19BF -- */
+    Po,  Po,  Sm,  Pd,  Sm,  Sm,  Sm,  Cn,  Po,  Sc,  Po,  Po,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x19C0..0x19CF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cf,
+/* DATA_BLOCK: -- 0x19D0..0x19DF -- */
+    Cn,  Po,  Po,  Po,  Sc,  Po,  Po,  Po,  Ps,  Pe,  Po,  Sm,  Po,  Pd,  Po,  Po,
+/* DATA_BLOCK: -- 0x19E0..0x19EF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ps,  Sm,  Pe,  Sm,  Ps,
+/* DATA_BLOCK: -- 0x19F0..0x19FF -- */
+    Pe,  Po,  Ps,  Pe,  Po,  Po,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1A00..0x1A0F -- */
+    Lm,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1A10..0x1A1F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x1A20..0x1A2F -- */
+    Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1A30..0x1A3F -- */
+    Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1A40..0x1A4F -- */
+    Sc,  Sc,  Sm,  Sk,  So,  Sc,  Sc,  Cn,  So,  Sm,  Sm,  Sm,  Sm,  So,  So,  Cn,
+/* DATA_BLOCK: -- 0x1A50..0x1A5F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cf,  Cf,  Cf,  So,  So,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1A60..0x1A6F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1A70..0x1A7F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1A80..0x1A8F -- */
+    Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1A90..0x1A9F -- */
+    No,  No,  No,  No,  Cn,  Cn,  Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1AA0..0x1AAF -- */
+    Nl,  Nl,  Nl,  Nl,  Nl,  No,  No,  No,  No,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x1AB0..0x1ABF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  No,  No,  So,  So,  So,  Cn,
+/* DATA_BLOCK: -- 0x1AC0..0x1ACF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1AD0..0x1ADF -- */
+    So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1AE0..0x1AEF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1AF0..0x1AFF -- */
+    Mn,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1B00..0x1B0F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1B10..0x1B1F -- */
+    No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1B20..0x1B2F -- */
+    Lo,  Nl,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Nl,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1B30..0x1B3F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1B40..0x1B4F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Po,
+/* DATA_BLOCK: -- 0x1B50..0x1B5F -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1B60..0x1B6F -- */
+    Po,  Nl,  Nl,  Nl,  Nl,  Nl,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1B70..0x1B7F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x1B80..0x1B8F -- */
+    Lu,  Lu,  Lu,  Lu,  Cn,  Cn,  Cn,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x1B90..0x1B9F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1BA0..0x1BAF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,
+/* DATA_BLOCK: -- 0x1BB0..0x1BBF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1BC0..0x1BCF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1BD0..0x1BDF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Po,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1BE0..0x1BEF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  So,  So,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1BF0..0x1BFF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1C00..0x1C0F -- */
+    Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1C10..0x1C1F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Po,
+/* DATA_BLOCK: -- 0x1C20..0x1C2F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,
+/* DATA_BLOCK: -- 0x1C30..0x1C3F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  No,  No,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1C40..0x1C4F -- */
+    Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1C50..0x1C5F -- */
+    Lo,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1C60..0x1C6F -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1C70..0x1C7F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x1C80..0x1C8F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1C90..0x1C9F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1CA0..0x1CAF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  No,  No,  Po,
+/* DATA_BLOCK: -- 0x1CB0..0x1CBF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1CC0..0x1CCF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  So,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1CD0..0x1CDF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1CE0..0x1CEF -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1CF0..0x1CFF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Po,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1D00..0x1D0F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1D10..0x1D1F -- */
+    Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1D20..0x1D2F -- */
+    Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1D30..0x1D3F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1D40..0x1D4F -- */
+    Lu,  Lu,  Lu,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1D50..0x1D5F -- */
+    Ll,  Ll,  Ll,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1D60..0x1D6F -- */
+    Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1D70..0x1D7F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,
+/* DATA_BLOCK: -- 0x1D80..0x1D8F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Mn,  Mn,  Pd,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1D90..0x1D9F -- */
+    Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1DA0..0x1DAF -- */
+    No,  No,  No,  No,  No,  No,  No,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1DB0..0x1DBF -- */
+    Mn,  No,  No,  No,  No,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1DC0..0x1DCF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1DD0..0x1DDF -- */
+    Mc,  Mn,  Mc,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1DE0..0x1DEF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1DF0..0x1DFF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1E00..0x1E0F -- */
+    No,  No,  No,  No,  No,  No,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x1E10..0x1E1F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x1E20..0x1E2F -- */
+    Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Po,  Po,  Cf,  Po,  Po,
+/* DATA_BLOCK: -- 0x1E30..0x1E3F -- */
+    Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cf,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1E40..0x1E4F -- */
+    Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1E50..0x1E5F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1E60..0x1E6F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x1E70..0x1E7F -- */
+    Po,  Po,  Po,  Po,  Lo,  Mc,  Mc,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1E80..0x1E8F -- */
+    Lo,  Lo,  Lo,  Mn,  Po,  Po,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1E90..0x1E9F -- */
+    Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,
+/* DATA_BLOCK: -- 0x1EA0..0x1EAF -- */
+    Mc,  Lo,  Lo,  Lo,  Lo,  Po,  Po,  Po,  Po,  Mn,  Mn,  Mn,  Mn,  Po,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x1EB0..0x1EBF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Lo,  Po,  Lo,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1EC0..0x1ECF -- */
+    Cn,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x1ED0..0x1EDF -- */
+    No,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1EE0..0x1EEF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x1EF0..0x1EFF -- */
+    Mn,  Mn,  Mc,  Mc,  Mn,  Mc,  Mn,  Mn,  Po,  Po,  Po,  Po,  Po,  Po,  Mn,  Cn,
+/* DATA_BLOCK: -- 0x1F00..0x1F0F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1F10..0x1F1F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1F20..0x1F2F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1F30..0x1F3F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,
+/* DATA_BLOCK: -- 0x1F40..0x1F4F -- */
+    Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1F50..0x1F5F -- */
+    Mn,  Mn,  Mc,  Mc,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x1F60..0x1F6F -- */
+    Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Mn,  Mn,  Lo,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x1F70..0x1F7F -- */
+    Mn,  Mc,  Mc,  Mc,  Mc,  Cn,  Cn,  Mc,  Mc,  Cn,  Cn,  Mc,  Mc,  Mc,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1F80..0x1F8F -- */
+    Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x1F90..0x1F9F -- */
+    Lo,  Lo,  Mc,  Mc,  Cn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1FA0..0x1FAF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x1FB0..0x1FBF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x1FC0..0x1FCF -- */
+    Mc,  Mc,  Mn,  Mn,  Mn,  Mc,  Mn,  Lo,  Lo,  Lo,  Lo,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x1FD0..0x1FDF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Po,  Po,  Cn,  Po,  Mn,  Lo,
+/* DATA_BLOCK: -- 0x1FE0..0x1FEF -- */
+    Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mc,  Mc,  Mc,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x1FF0..0x1FFF -- */
+    Mn,  Mc,  Mn,  Mn,  Lo,  Lo,  Po,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2000..0x200F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,
+/* DATA_BLOCK: -- 0x2010..0x201F -- */
+    Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mc,  Mc,  Mc,  Mc,  Mn,  Mn,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x2020..0x202F -- */
+    Mn,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,
+/* DATA_BLOCK: -- 0x2030..0x203F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2040..0x204F -- */
+    Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x2050..0x205F -- */
+    Mn,  Po,  Po,  Po,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2060..0x206F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2070..0x207F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mc,  Mn,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x2080..0x208F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2090..0x209F -- */
+    Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x20A0..0x20AF -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  No,  No,  Po,  Po,  Po,  So,
+/* DATA_BLOCK: -- 0x20B0..0x20BF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mn,  Po,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x20C0..0x20CF -- */
+    No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x20D0..0x20DF -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x20E0..0x20EF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x20F0..0x20FF -- */
+    Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Cn,  Mc,  Mc,  Cn,  Cn,  Mn,  Mn,  Mc,  Mn,  Lo,
+/* DATA_BLOCK: -- 0x2100..0x210F -- */
+    Mc,  Lo,  Mc,  Mn,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2110..0x211F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2120..0x212F -- */
+    Lo,  Mc,  Mc,  Mc,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mn,  Mn,  Mc,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x2130..0x213F -- */
+    Mn,  Lo,  Po,  Lo,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2140..0x214F -- */
+    Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2150..0x215F -- */
+    Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Lo,  Mn,  Mn,  Mn,  Mn,  Po,
+/* DATA_BLOCK: -- 0x2160..0x216F -- */
+    Po,  Po,  Po,  Po,  Po,  Po,  Po,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2170..0x217F -- */
+    Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mc,  Mn,  Mn,  Mn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2180..0x218F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x2190..0x219F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,  Mn,  Po,  Po,  Po,  Lo,  Po,  Po,
+/* DATA_BLOCK: -- 0x21A0..0x21AF -- */
+    Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x21B0..0x21BF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mc,  Mn,
+/* DATA_BLOCK: -- 0x21C0..0x21CF -- */
+    Lo,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x21D0..0x21DF -- */
+    Po,  Po,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x21E0..0x21EF -- */
+    Cn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x21F0..0x21FF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mc,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x2200..0x220F -- */
+    Mn,  Mc,  Mn,  Mn,  Mc,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2210..0x221F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2220..0x222F -- */
+    Lo,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Mn,  Cn,  Mn,  Mn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x2230..0x223F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lo,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2240..0x224F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2250..0x225F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mc,  Mc,  Mc,  Mc,  Mc,  Cn,
+/* DATA_BLOCK: -- 0x2260..0x226F -- */
+    Mn,  Mn,  Cn,  Mc,  Mc,  Mn,  Mc,  Mn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2270..0x227F -- */
+    Lo,  Lo,  Lo,  Mn,  Mn,  Mc,  Mc,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2280..0x228F -- */
+    No,  No,  No,  No,  No,  So,  So,  So,  So,  So,  So,  So,  So,  Sc,  Sc,  Sc,
+/* DATA_BLOCK: -- 0x2290..0x229F -- */
+    Sc,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x22A0..0x22AF -- */
+    So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Po,
+/* DATA_BLOCK: -- 0x22B0..0x22BF -- */
+    Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Nl,  Cn,
+/* DATA_BLOCK: -- 0x22C0..0x22CF -- */
+    Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x22D0..0x22DF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x22E0..0x22EF -- */
+    Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x22F0..0x22FF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2300..0x230F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Po,  Po,  Po,  Po,  Po,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2310..0x231F -- */
+    Lm,  Lm,  Lm,  Lm,  Po,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2320..0x232F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x2330..0x233F -- */
+    No,  No,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2340..0x234F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2350..0x235F -- */
+    No,  No,  No,  No,  No,  No,  No,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2360..0x236F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x2370..0x237F -- */
+    Lo,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x2380..0x238F -- */
+    Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x2390..0x239F -- */
+    Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mn,
+/* DATA_BLOCK: -- 0x23A0..0x23AF -- */
+    Mn,  Mn,  Mn,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,
+/* DATA_BLOCK: -- 0x23B0..0x23BF -- */
+    Lm,  Lm,  Po,  Lm,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x23C0..0x23CF -- */
+    Mc,  Mc,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x23D0..0x23DF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x23E0..0x23EF -- */
+    Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x23F0..0x23FF -- */
+    Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2400..0x240F -- */
+    Cn,  Cn,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2410..0x241F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  So,  Mn,  Mn,  Po,
+/* DATA_BLOCK: -- 0x2420..0x242F -- */
+    Cf,  Cf,  Cf,  Cf,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2430..0x243F -- */
+    So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2440..0x244F -- */
+    So,  So,  So,  So,  So,  Mc,  Mc,  Mn,  Mn,  Mn,  So,  So,  So,  Mc,  Mc,  Mc,
+/* DATA_BLOCK: -- 0x2450..0x245F -- */
+    Mc,  Mc,  Mc,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x2460..0x246F -- */
+    Mn,  Mn,  Mn,  So,  So,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2470..0x247F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Mn,  Mn,  Mn,  Mn,  So,  So,
+/* DATA_BLOCK: -- 0x2480..0x248F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2490..0x249F -- */
+    So,  So,  Mn,  Mn,  Mn,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x24A0..0x24AF -- */
+    No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x24B0..0x24BF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x24C0..0x24CF -- */
+    Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x24D0..0x24DF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x24E0..0x24EF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x24F0..0x24FF -- */
+    Lu,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2500..0x250F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Cn,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2510..0x251F -- */
+    Cn,  Cn,  Lu,  Cn,  Cn,  Lu,  Lu,  Cn,  Cn,  Lu,  Lu,  Lu,  Lu,  Cn,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2520..0x252F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Ll,  Cn,  Ll,  Cn,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2530..0x253F -- */
+    Ll,  Ll,  Ll,  Ll,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2540..0x254F -- */
+    Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Cn,  Lu,  Lu,  Lu,  Lu,  Cn,  Cn,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2550..0x255F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2560..0x256F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Cn,  Lu,  Lu,  Lu,  Lu,  Cn,
+/* DATA_BLOCK: -- 0x2570..0x257F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Cn,  Lu,  Cn,  Cn,  Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2580..0x258F -- */
+    Lu,  Cn,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2590..0x259F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x25A0..0x25AF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x25B0..0x25BF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Cn,  Cn,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x25C0..0x25CF -- */
+    Lu,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x25D0..0x25DF -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Sm,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x25E0..0x25EF -- */
+    Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x25F0..0x25FF -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Sm,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2600..0x260F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2610..0x261F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2620..0x262F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Sm,
+/* DATA_BLOCK: -- 0x2630..0x263F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,
+/* DATA_BLOCK: -- 0x2640..0x264F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Sm,
+/* DATA_BLOCK: -- 0x2650..0x265F -- */
+    Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2660..0x266F -- */
+    Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Lu,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,
+/* DATA_BLOCK: -- 0x2670..0x267F -- */
+    Ll,  Ll,  Ll,  Sm,  Ll,  Ll,  Ll,  Ll,  Ll,  Ll,  Lu,  Ll,  Cn,  Cn,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x2680..0x268F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,
+/* DATA_BLOCK: -- 0x2690..0x269F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  So,  So,  So,  So,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x26A0..0x26AF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  So,  So,  So,
+/* DATA_BLOCK: -- 0x26B0..0x26BF -- */
+    So,  So,  So,  So,  So,  Mn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x26C0..0x26CF -- */
+    So,  So,  So,  So,  Mn,  So,  So,  Po,  Po,  Po,  Po,  Po,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x26D0..0x26DF -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x26E0..0x26EF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x26F0..0x26FF -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x2700..0x270F -- */
+    Mn,  Mn,  Cn,  Mn,  Mn,  Cn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2710..0x271F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Lm,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2720..0x272F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Cn,  Cn,  Lo,  So,
+/* DATA_BLOCK: -- 0x2730..0x273F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Mn,  Mn,  Mn,  Mn,
+/* DATA_BLOCK: -- 0x2740..0x274F -- */
+    Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Nd,  Cn,  Cn,  Cn,  Cn,  Cn,  Sc,
+/* DATA_BLOCK: -- 0x2750..0x275F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Cn,  No,  No,  No,  No,  No,  No,  No,  No,  No,
+/* DATA_BLOCK: -- 0x2760..0x276F -- */
+    Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2770..0x277F -- */
+    Ll,  Ll,  Ll,  Ll,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Mn,  Lm,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2780..0x278F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  No,  No,  No,
+/* DATA_BLOCK: -- 0x2790..0x279F -- */
+    Sc,  No,  No,  No,  No,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x27A0..0x27AF -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  No,
+/* DATA_BLOCK: -- 0x27B0..0x27BF -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x27C0..0x27CF -- */
+    Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x27D0..0x27DF -- */
+    Cn,  Lo,  Lo,  Cn,  Lo,  Cn,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x27E0..0x27EF -- */
+    Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x27F0..0x27FF -- */
+    Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Lo,  Cn,  Lo,  Cn,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2800..0x280F -- */
+    Cn,  Lo,  Lo,  Cn,  Lo,  Cn,  Cn,  Lo,  Cn,  Lo,  Cn,  Lo,  Cn,  Lo,  Cn,  Lo,
+/* DATA_BLOCK: -- 0x2810..0x281F -- */
+    Cn,  Lo,  Lo,  Cn,  Lo,  Cn,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2820..0x282F -- */
+    Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Cn,
+/* DATA_BLOCK: -- 0x2830..0x283F -- */
+    Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2840..0x284F -- */
+    Cn,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,  Cn,  Lo,  Lo,  Lo,  Lo,  Lo,
+/* DATA_BLOCK: -- 0x2850..0x285F -- */
+    Sm,  Sm,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2860..0x286F -- */
+    Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2870..0x287F -- */
+    No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  No,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2880..0x288F -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2890..0x289F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x28A0..0x28AF -- */
+    So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x28B0..0x28BF -- */
+    So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x28C0..0x28CF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Sk,  Sk,  Sk,  Sk,  Sk,
+/* DATA_BLOCK: -- 0x28D0..0x28DF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x28E0..0x28EF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x28F0..0x28FF -- */
+    So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  Cn,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2900..0x290F -- */
+    So,  So,  So,  So,  So,  Cn,  Cn,  Cn,  So,  So,  So,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2910..0x291F -- */
+    So,  So,  So,  Cn,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,  So,
+/* DATA_BLOCK: -- 0x2920..0x292F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2930..0x293F -- */
+    Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2940..0x294F -- */
+    Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2950..0x295F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Lo,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2960..0x296F -- */
+    Cn,  Cf,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2970..0x297F -- */
+    Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,  Cf,
+/* DATA_BLOCK: -- 0x2980..0x298F -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Co,  Cn,  Cn,
+/* DATA_BLOCK: -- 0x2990..0x299D -- */
+    Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Cn,  Co
+};
+
+static const SBUInt16 MainGeneralCategoryIndexes[4096] = {
+/* INDEX_BLOCK: -- 0x0000..0x003F -- */
+    0x0000, 0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0060, 0x0000, 0x0000, 0x0070, 0x0080,
+    0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00D0, 0x00D0, 0x00D0, 0x00E0, 0x00F0, 0x00D0, 0x00D0, 0x0100,
+    0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x00D0, 0x0170, 0x00D0, 0x00D0, 0x00D0, 0x0180,
+    0x0190, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x01A0, 0x00B0, 0x01B0, 0x01C0, 0x01D0, 0x01E0, 0x01F0,
+    0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0210, 0x0220, 0x0230, 0x0240, 0x00B0,
+    0x0250, 0x0260, 0x00D0, 0x0270,
+/* INDEX_BLOCK: -- 0x0040..0x007F -- */
+    0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00D0, 0x00D0, 0x0280, 0x00D0, 0x00D0, 0x00D0,
+    0x0290, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x02A0, 0x0090, 0x02B0, 0x00B0, 0x00B0,
+    0x02C0, 0x02D0, 0x0200, 0x02E0, 0x02F0, 0x0300, 0x0310, 0x0320, 0x0330, 0x0340, 0x0300, 0x0300,
+    0x0350, 0x0200, 0x0360, 0x0370, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0380, 0x0390, 0x03A0,
+    0x03B0, 0x03C0, 0x0300, 0x0200, 0x03D0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03F0,
+    0x0400, 0x0300, 0x0410, 0x0420,
+/* INDEX_BLOCK: -- 0x0080..0x00BF -- */
+    0x0300, 0x0430, 0x0440, 0x0450, 0x0300, 0x0460, 0x0470, 0x0480, 0x0480, 0x0480, 0x0300, 0x0490,
+    0x04A0, 0x04B0, 0x04C0, 0x0200, 0x04D0, 0x0300, 0x0300, 0x04E0, 0x04F0, 0x0500, 0x0510, 0x0520,
+    0x0530, 0x0540, 0x0550, 0x0560, 0x0570, 0x0580, 0x0590, 0x05A0, 0x05B0, 0x0540, 0x0550, 0x05C0,
+    0x05D0, 0x05E0, 0x05F0, 0x0600, 0x0610, 0x0620, 0x0550, 0x0630, 0x0640, 0x0650, 0x0590, 0x0660,
+    0x0670, 0x0540, 0x0550, 0x0680, 0x0690, 0x06A0, 0x0590, 0x06B0, 0x06C0, 0x06D0, 0x06E0, 0x06F0,
+    0x0700, 0x0710, 0x05F0, 0x0720,
+/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */
+    0x0730, 0x0740, 0x0550, 0x0750, 0x0760, 0x0770, 0x0590, 0x0780, 0x0790, 0x0740, 0x0550, 0x07A0,
+    0x07B0, 0x07C0, 0x0590, 0x07D0, 0x07E0, 0x0740, 0x0300, 0x07F0, 0x0800, 0x0810, 0x0590, 0x0820,
+    0x0830, 0x0840, 0x0300, 0x0850, 0x0860, 0x0870, 0x05F0, 0x0880, 0x0890, 0x0300, 0x0300, 0x08A0,
+    0x08B0, 0x08C0, 0x0480, 0x0480, 0x08D0, 0x0300, 0x08E0, 0x08F0, 0x0900, 0x0910, 0x0480, 0x0480,
+    0x0920, 0x0930, 0x0940, 0x0950, 0x0960, 0x0300, 0x0970, 0x0980, 0x0990, 0x09A0, 0x0200, 0x09B0,
+    0x09C0, 0x09D0, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0100..0x013F -- */
+    0x0300, 0x0300, 0x09E0, 0x09F0, 0x0A00, 0x0A10, 0x0A20, 0x0A30, 0x0A40, 0x0A50, 0x0090, 0x0090,
+    0x0A60, 0x00B0, 0x00B0, 0x0A70, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0A80, 0x0A90, 0x0300, 0x0300, 0x0A80, 0x0300, 0x0300, 0x0AA0, 0x0AB0, 0x0AC0, 0x0300, 0x0300,
+    0x0300, 0x0AB0, 0x0300, 0x0300, 0x0300, 0x0AD0, 0x0AE0, 0x0AF0, 0x0300, 0x0B00, 0x0090, 0x0090,
+    0x0090, 0x0090, 0x0090, 0x0B10,
+/* INDEX_BLOCK: -- 0x0140..0x017F -- */
+    0x0B20, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0B30, 0x0300, 0x0B40, 0x0B50, 0x0300, 0x0300, 0x0300, 0x0300, 0x0B60, 0x0B70,
+    0x0B80, 0x0B90, 0x0300, 0x0BA0, 0x0300, 0x0BB0, 0x0B80, 0x0BC0, 0x0300, 0x0300, 0x0300, 0x0BD0,
+    0x0BE0, 0x0BF0, 0x0C00, 0x0C10,
+/* INDEX_BLOCK: -- 0x0180..0x01BF -- */
+    0x0C20, 0x0C00, 0x0300, 0x0300, 0x0C30, 0x0300, 0x0300, 0x0C40, 0x0C50, 0x0300, 0x0C60, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0C70, 0x0300, 0x0C80, 0x0C90, 0x0CA0, 0x0CB0, 0x0300, 0x0CC0, 0x0CD0,
+    0x0300, 0x0300, 0x0CE0, 0x0300, 0x0CF0, 0x0D00, 0x0D10, 0x0D10, 0x0300, 0x0D20, 0x0300, 0x0300,
+    0x0300, 0x0D30, 0x0D40, 0x0D50, 0x0C00, 0x0C00, 0x0D60, 0x0D70, 0x0D80, 0x0480, 0x0480, 0x0480,
+    0x0D90, 0x0300, 0x0300, 0x0DA0, 0x0DB0, 0x0A00, 0x0DC0, 0x0DD0, 0x0DE0, 0x0300, 0x0DF0, 0x0400,
+    0x0300, 0x0300, 0x0E00, 0x0E10,
+/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */
+    0x0300, 0x0300, 0x0E20, 0x0E30, 0x0E40, 0x0400, 0x0300, 0x0E50, 0x0E60, 0x0090, 0x0090, 0x0E70,
+    0x0E80, 0x0E90, 0x0EA0, 0x0EB0, 0x00B0, 0x00B0, 0x0EC0, 0x01B0, 0x01B0, 0x01B0, 0x0ED0, 0x0EE0,
+    0x00B0, 0x0EF0, 0x01B0, 0x01B0, 0x0200, 0x0200, 0x0200, 0x0F00, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
+    0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0F10, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
+    0x0F20, 0x0F30, 0x0F20, 0x0F20, 0x0F30, 0x0F40, 0x0F20, 0x0F50, 0x0F60, 0x0F60, 0x0F60, 0x0F70,
+    0x0F80, 0x0F90, 0x0FA0, 0x0FB0,
+/* INDEX_BLOCK: -- 0x0200..0x023F -- */
+    0x0FC0, 0x0FD0, 0x0FE0, 0x0FF0, 0x1000, 0x1010, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060, 0x1060,
+    0x0480, 0x1070, 0x1080, 0x0D80, 0x1090, 0x10A0, 0x10B0, 0x10C0, 0x10D0, 0x10E0, 0x10F0, 0x10F0,
+    0x1100, 0x1110, 0x1120, 0x0D10, 0x1130, 0x1140, 0x0D10, 0x1150, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x1170, 0x0D10, 0x1180, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1190, 0x0D10, 0x11A0, 0x1160, 0x11B0,
+    0x0D10, 0x11C0, 0x11D0, 0x0D10,
+/* INDEX_BLOCK: -- 0x0240..0x027F -- */
+    0x0D10, 0x0D10, 0x11E0, 0x0480, 0x11F0, 0x0480, 0x10E0, 0x10E0, 0x10E0, 0x1200, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x1210, 0x10E0, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x1220, 0x1230, 0x0D10, 0x0D10, 0x1240, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x1250, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1260, 0x1270, 0x10E0, 0x1280, 0x0D10, 0x0D10,
+    0x1290, 0x1160, 0x12A0, 0x1160,
+/* INDEX_BLOCK: -- 0x0280..0x02BF -- */
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x12B0, 0x12C0, 0x1160, 0x1160, 0x1160, 0x12D0, 0x1160, 0x12E0, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x0D10, 0x0D10, 0x0D10, 0x1160, 0x12F0, 0x0D10, 0x0D10, 0x1300, 0x0D10, 0x1310, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10,
+/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */
+    0x0090, 0x0090, 0x1320, 0x00B0, 0x00B0, 0x1330, 0x1340, 0x1350, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
+    0x00D0, 0x00D0, 0x1360, 0x1370, 0x00B0, 0x00B0, 0x1380, 0x0300, 0x0300, 0x0300, 0x1390, 0x13A0,
+    0x0300, 0x13B0, 0x13C0, 0x13C0, 0x13C0, 0x13C0, 0x0200, 0x0200, 0x13D0, 0x13E0, 0x13F0, 0x1400,
+    0x1410, 0x1420, 0x0480, 0x0480, 0x0D10, 0x1430, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x1450, 0x0480, 0x1460,
+/* INDEX_BLOCK: -- 0x0300..0x033F -- */
+    0x1470, 0x1480, 0x1490, 0x14A0, 0x0890, 0x0300, 0x0300, 0x0300, 0x0300, 0x14B0, 0x0B20, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x14C0, 0x14D0, 0x0300, 0x0300, 0x0890, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0C80, 0x14E0, 0x0300, 0x0300, 0x0D10, 0x0D10, 0x1440, 0x0300, 0x0D10, 0x14F0, 0x1500, 0x0D10,
+    0x1510, 0x1520, 0x0D10, 0x0D10, 0x1500, 0x0D10, 0x0D10, 0x1520, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10,
+/* INDEX_BLOCK: -- 0x0340..0x037F -- */
+    0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0380..0x03BF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x1530, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0650, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0400..0x043F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x1540,
+/* INDEX_BLOCK: -- 0x0440..0x047F -- */
+    0x0300, 0x1550, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300,
+/* INDEX_BLOCK: -- 0x0480..0x04BF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0970, 0x0D10, 0x0D10, 0x0D10,
+    0x11E0, 0x0300, 0x0300, 0x0E50, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1560, 0x0300, 0x1570, 0x0480,
+    0x00D0, 0x00D0, 0x1580, 0x1590, 0x00D0, 0x15A0, 0x0300, 0x0300, 0x0300, 0x0300, 0x15B0, 0x15C0,
+    0x01F0, 0x15D0, 0x15E0, 0x15F0, 0x00D0, 0x00D0, 0x00D0, 0x1600, 0x1610, 0x1620, 0x1630, 0x1640,
+    0x1650, 0x0480, 0x0480, 0x1660,
+/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */
+    0x1670, 0x0300, 0x1680, 0x1690, 0x0300, 0x0300, 0x0300, 0x16A0, 0x16B0, 0x0300, 0x0300, 0x16C0,
+    0x16D0, 0x0C00, 0x0200, 0x16E0, 0x0400, 0x0300, 0x16F0, 0x0300, 0x1700, 0x1710, 0x0300, 0x0970,
+    0x04D0, 0x0300, 0x0300, 0x1720, 0x1730, 0x1740, 0x1750, 0x1760, 0x0300, 0x0300, 0x1770, 0x1780,
+    0x1790, 0x17A0, 0x0300, 0x17B0, 0x0300, 0x0300, 0x0300, 0x17C0, 0x17D0, 0x17E0, 0x17F0, 0x1800,
+    0x1810, 0x1820, 0x13C0, 0x00B0, 0x00B0, 0x1830, 0x1840, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x0300, 0x0300, 0x1850, 0x0C00,
+/* INDEX_BLOCK: -- 0x0500..0x053F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1860, 0x0300,
+    0x1870, 0x0300, 0x0300, 0x0CE0,
+/* INDEX_BLOCK: -- 0x0540..0x057F -- */
+    0x1880, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1890, 0x1880, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x1890,
+/* INDEX_BLOCK: -- 0x0580..0x05BF -- */
+    0x1880, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x1890,
+/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */
+    0x18A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0600..0x063F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x18B0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0CC0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CF0, 0x0480, 0x0480,
+    0x18C0, 0x18D0, 0x18E0, 0x18F0, 0x1900, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1910,
+    0x1920, 0x1930, 0x0300, 0x0300,
+/* INDEX_BLOCK: -- 0x0640..0x067F -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1940, 0x0480, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x1950, 0x0300, 0x0300, 0x04A0, 0x0480, 0x0480, 0x1960, 0x0200, 0x1970, 0x0200, 0x1980,
+    0x1990, 0x19A0, 0x19B0, 0x0490, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x19C0,
+    0x19D0, 0x0020, 0x0030, 0x0040, 0x0050, 0x19E0, 0x19F0, 0x1A00, 0x0300, 0x1A10, 0x0300, 0x0C80,
+    0x1A20, 0x1A30, 0x1A40, 0x1A50,
+/* INDEX_BLOCK: -- 0x0680..0x06BF -- */
+    0x1A60, 0x0300, 0x0AC0, 0x1A70, 0x0CC0, 0x0CC0, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0470, 0x1A80, 0x10E0, 0x10E0, 0x1A90, 0x10F0, 0x10F0, 0x10F0, 0x1AA0,
+    0x1AB0, 0x1AC0, 0x1AD0, 0x0480, 0x0480, 0x0D10, 0x0D10, 0x1AE0, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0970, 0x0300, 0x0300, 0x0300, 0x0650, 0x1AF0, 0x1B00,
+    0x0300, 0x0300, 0x1B10, 0x0300, 0x1B20, 0x0300, 0x0300, 0x1B30, 0x0300, 0x1B40, 0x0300, 0x0300,
+    0x1B50, 0x1B60, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */
+    0x0090, 0x0090, 0x1B70, 0x00B0, 0x00B0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CC0, 0x0C00, 0x0090,
+    0x0090, 0x1B80, 0x00B0, 0x1B90, 0x0300, 0x0300, 0x04A0, 0x0300, 0x0300, 0x0300, 0x1BA0, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x13B0, 0x0300, 0x0C70, 0x04A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0700..0x073F -- */
+    0x1BB0, 0x0300, 0x0300, 0x1BC0, 0x0300, 0x1BD0, 0x0300, 0x1BE0, 0x0300, 0x0C80, 0x1BF0, 0x0480,
+    0x0480, 0x0480, 0x0300, 0x1C00, 0x0300, 0x1C10, 0x0300, 0x1C20, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0300, 0x0300, 0x0300, 0x1C30, 0x10E0, 0x1C40, 0x10E0, 0x10E0, 0x1C50, 0x1C60, 0x0300, 0x1C70,
+    0x1C80, 0x1C90, 0x0300, 0x1CA0, 0x0300, 0x1CB0, 0x0480, 0x0480, 0x1CC0, 0x0300, 0x1CD0, 0x1CE0,
+    0x0300, 0x0300, 0x0300, 0x1CF0, 0x0300, 0x1D00, 0x0300, 0x1D10, 0x0300, 0x1D20, 0x1D30, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0740..0x077F -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0C40, 0x0480, 0x0480, 0x0480, 0x0090, 0x0090, 0x0090, 0x1D40,
+    0x00B0, 0x00B0, 0x00B0, 0x1D50, 0x0300, 0x0300, 0x1D60, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x10E0, 0x1D70, 0x0300, 0x0300, 0x1D80, 0x1D90, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0300, 0x1CB0, 0x1DA0, 0x0300, 0x03E0, 0x1DB0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300,
+    0x1DC0, 0x0480, 0x0300, 0x13B0,
+/* INDEX_BLOCK: -- 0x0780..0x07BF -- */
+    0x1DD0, 0x0300, 0x0300, 0x1DE0, 0x1DF0, 0x1C40, 0x1E00, 0x1E10, 0x0DE0, 0x0300, 0x0300, 0x1E20,
+    0x1E30, 0x0300, 0x0C40, 0x0C00, 0x1E40, 0x0300, 0x1E50, 0x1E60, 0x1E70, 0x0300, 0x0300, 0x1E80,
+    0x0DE0, 0x0300, 0x0300, 0x1E90, 0x1EA0, 0x1EB0, 0x1EC0, 0x1ED0, 0x0300, 0x0620, 0x1EE0, 0x1EF0,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x1F00, 0x1F10, 0x1F20, 0x0300, 0x0300, 0x1F30, 0x1F40, 0x0C00,
+    0x1F50, 0x0540, 0x0550, 0x1F60, 0x1F70, 0x1F80, 0x1F90, 0x1FA0, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */
+    0x0300, 0x0300, 0x0300, 0x1FB0, 0x1FC0, 0x1FD0, 0x1D90, 0x0480, 0x0300, 0x0300, 0x0300, 0x1FE0,
+    0x1FF0, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0300, 0x0300, 0x2000, 0x2010, 0x2020, 0x2030, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x2040,
+    0x2050, 0x0C00, 0x2060, 0x0480, 0x0300, 0x0300, 0x2070, 0x2080, 0x0C00, 0x0480, 0x0480, 0x0480,
+    0x0300, 0x0AD0, 0x2090, 0x20A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0800..0x083F -- */
+    0x0300, 0x0300, 0x1EE0, 0x20B0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0090, 0x0090,
+    0x00B0, 0x00B0, 0x0940, 0x20C0, 0x20D0, 0x20E0, 0x0300, 0x20F0, 0x2100, 0x0C00, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x2110, 0x0300, 0x0300, 0x2120, 0x2130, 0x0480, 0x2140, 0x0300, 0x0300, 0x2150,
+    0x2160, 0x2170, 0x0300, 0x0300, 0x2180, 0x2190, 0x21A0, 0x0480, 0x0300, 0x0300, 0x0300, 0x0C40,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0840..0x087F -- */
+    0x0550, 0x0300, 0x2000, 0x21B0, 0x21C0, 0x0940, 0x0AF0, 0x21D0, 0x0300, 0x21E0, 0x21F0, 0x2200,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x2210, 0x0300, 0x0300, 0x2220, 0x2230, 0x0C00, 0x2240, 0x0300,
+    0x2250, 0x2260, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x2270,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0650,
+    0x10E0, 0x2280, 0x2290, 0x22A0,
+/* INDEX_BLOCK: -- 0x0880..0x08BF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CF0, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */
+    0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x22B0, 0x22C0, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x22D0, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0900..0x093F -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300,
+/* INDEX_BLOCK: -- 0x0940..0x097F -- */
+    0x0300, 0x0300, 0x0C80, 0x22E0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0980..0x09BF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x13B0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0C40,
+    0x0300, 0x0C80, 0x1740, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0CC0, 0x22F0,
+    0x0300, 0x0300, 0x0300, 0x2300, 0x2310, 0x2320, 0x2330, 0x2340, 0x0300, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0090, 0x0090, 0x00B0, 0x00B0, 0x10E0, 0x2350, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x2360, 0x2370, 0x2380, 0x2380, 0x2390, 0x23A0, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x23B0, 0x23C0,
+/* INDEX_BLOCK: -- 0x0A40..0x0A7F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x23D0,
+/* INDEX_BLOCK: -- 0x0A80..0x0ABF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0C70, 0x0480, 0x0480, 0x23E0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0AC0..0x0AFF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0C80, 0x0480, 0x0480, 0x0480, 0x23F0, 0x2400, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CE0,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0B00..0x0B3F -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0470, 0x0970, 0x0C40, 0x2410, 0x2420, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0B40..0x0B7F -- */
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x1450, 0x0D10, 0x0D10, 0x2430, 0x0D10, 0x0D10, 0x0D10, 0x2440, 0x2450,
+    0x2460, 0x0D10, 0x2470, 0x0D10, 0x0D10, 0x0D10, 0x2480, 0x0480, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x2490, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x10E0, 0x24A0,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x11E0, 0x10E0, 0x1C80, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0B80..0x0BBF -- */
+    0x0090, 0x24B0, 0x00B0, 0x24C0, 0x24D0, 0x24E0, 0x0F20, 0x0090, 0x24F0, 0x2500, 0x2510, 0x2520,
+    0x2530, 0x0090, 0x24B0, 0x00B0, 0x2540, 0x2550, 0x00B0, 0x2560, 0x2570, 0x2580, 0x2590, 0x0090,
+    0x25A0, 0x00B0, 0x0090, 0x24B0, 0x00B0, 0x24C0, 0x24D0, 0x00B0, 0x0F20, 0x0090, 0x24F0, 0x2590,
+    0x0090, 0x25A0, 0x00B0, 0x0090, 0x24B0, 0x00B0, 0x25B0, 0x0090, 0x25C0, 0x25D0, 0x25E0, 0x25F0,
+    0x00B0, 0x2600, 0x0090, 0x2610, 0x2620, 0x2630, 0x2640, 0x00B0, 0x2650, 0x0090, 0x2660, 0x00B0,
+    0x2670, 0x2680, 0x2680, 0x2680,
+/* INDEX_BLOCK: -- 0x0BC0..0x0BFF -- */
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0200, 0x0200, 0x0200, 0x2690,
+    0x0200, 0x0200, 0x26A0, 0x26B0, 0x26C0, 0x26D0, 0x02D0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0C00..0x0C3F -- */
+    0x26E0, 0x26F0, 0x2700, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x0970, 0x2710, 0x2720, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x2730, 0x2740,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0C40..0x0C7F -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x2750, 0x2760, 0x0480, 0x0480, 0x0090, 0x0090, 0x24F0, 0x00B0, 0x2770, 0x1740, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0C80..0x0CBF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1EC0, 0x10E0, 0x10E0, 0x2780, 0x2790,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x1EC0, 0x10E0, 0x27A0, 0x27B0, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x27C0, 0x0300, 0x27D0, 0x27E0,
+    0x27F0, 0x2800, 0x2810, 0x2820, 0x2830, 0x0CE0, 0x2840, 0x0CE0, 0x0480, 0x0480, 0x0480, 0x2850,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0CC0..0x0CFF -- */
+    0x0D10, 0x0D10, 0x1460, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440, 0x14F0, 0x2860,
+    0x2860, 0x2860, 0x0D10, 0x1450, 0x2870, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x2880, 0x0480, 0x0480, 0x0480, 0x2890, 0x0D10, 0x28A0, 0x0D10, 0x0D10, 0x1460,
+    0x2480, 0x28B0, 0x1450, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x28C0,
+/* INDEX_BLOCK: -- 0x0D00..0x0D3F -- */
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28D0, 0x1AC0, 0x1AC0,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x2480, 0x1460, 0x0480,
+/* INDEX_BLOCK: -- 0x0D40..0x0D7F -- */
+    0x1460, 0x0D10, 0x0D10, 0x0D10, 0x28D0, 0x0B00, 0x0D10, 0x0D10, 0x28D0, 0x0D10, 0x2880, 0x28B0,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28E0,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28F0, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10,
+    0x0D10, 0x1440, 0x2880, 0x2900, 0x11E0, 0x0D10, 0x2480, 0x11E0, 0x28A0, 0x11E0, 0x0480, 0x0480,
+    0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x2910, 0x0D10, 0x0D10,
+    0x11F0, 0x0480, 0x0480, 0x0C00,
+/* INDEX_BLOCK: -- 0x0D80..0x0DBF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x2920, 0x0480, 0x0480,
+    0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0DC0..0x0DFF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x2930, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0E00..0x0E3F -- */
+    0x0480, 0x2920, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0E40..0x0E7F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x2940, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0E80..0x0EBF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0650, 0x0480,
+/* INDEX_BLOCK: -- 0x0EC0..0x0EFF -- */
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+    0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CC0, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0F00..0x0F3F -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x2950, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0F40..0x0F7F -- */
+    0x2960, 0x0480, 0x2970, 0x2970, 0x2970, 0x2970, 0x2970, 0x2970, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200,
+    0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480,
+/* INDEX_BLOCK: -- 0x0F80..0x0FBF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x2980,
+/* INDEX_BLOCK: -- 0x0FC0..0x0FFF -- */
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480,
+    0x0480, 0x0480, 0x0480, 0x2990
+};
+
+static const SBUInt16 BranchGeneralCategoryIndexes[1088] = {
+    0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0,
+    0x0300, 0x0340, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x03C0, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0400, 0x0440, 0x0480, 0x04C0, 0x0340, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0500, 0x0540, 0x0580, 0x05C0, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0600, 0x0640, 0x0680, 0x06C0, 0x0700, 0x0740, 0x0780, 0x07C0, 0x0800, 0x0840,
+    0x0880, 0x08C0, 0x0380, 0x0380, 0x0900, 0x0940, 0x0380, 0x0380, 0x0380, 0x0980, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x09C0, 0x0A00, 0x0340, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0A40, 0x0900, 0x0A80, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0AC0, 0x0380, 0x0380, 0x0B00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0B40, 0x0B80, 0x0BC0, 0x0380,
+    0x0C00, 0x0380, 0x0C40, 0x0C80, 0x0CC0, 0x0D00, 0x0D40, 0x0380, 0x0340, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0D80, 0x0380, 0x0380, 0x0380, 0x0DC0, 0x0E00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0E40,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0E80, 0x0380, 0x0380, 0x0380, 0x0EC0, 0x0380,
+    0x0340, 0x0380, 0x0380, 0x0380, 0x0F00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0F40, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x05C0, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0F80, 0x05C0, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380,
+    0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FC0
+};
+
+SB_INTERNAL SBGeneralCategory LookupGeneralCategory(SBCodepoint codepoint) {
+    if (codepoint <= 0x10FFFD) {
+        return PrimaryGeneralCategoryData[
+                MainGeneralCategoryIndexes[
+                 BranchGeneralCategoryIndexes[
+                      codepoint / 0x0400
+                 ] + (codepoint % 0x0400) / 0x0010
+                ] + (codepoint % 0x0010)
+               ];
+    }
+
+    return Cn;
+}
+
+#undef Cc
+#undef Cf
+#undef Cn
+#undef Co
+#undef Cs
+#undef Ll
+#undef Lm
+#undef Lo
+#undef Lt
+#undef Lu
+#undef Mc
+#undef Me
+#undef Mn
+#undef Nd
+#undef Nl
+#undef No
+#undef Pc
+#undef Pd
+#undef Pe
+#undef Pf
+#undef Pi
+#undef Po
+#undef Ps
+#undef Sc
+#undef Sk
+#undef Sm
+#undef So
+#undef Zl
+#undef Zp
+#undef Zs
diff --git a/lib/sheenbidi/Source/GeneralCategoryLookup.h b/lib/sheenbidi/Source/GeneralCategoryLookup.h
new file mode 100644
index 000000000..9a0f6aac4
--- /dev/null
+++ b/lib/sheenbidi/Source/GeneralCategoryLookup.h
@@ -0,0 +1,16 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool. 
+ * DO NOT EDIT!!
+ */
+
+#ifndef _SB_INTERNAL_GENERAL_CATEGORY_LOOKUP_H
+#define _SB_INTERNAL_GENERAL_CATEGORY_LOOKUP_H
+
+#include <SBConfig.h>
+#include <SBGeneralCategory.h>
+
+#include "SBBase.h"
+
+SB_INTERNAL SBGeneralCategory LookupGeneralCategory(SBCodepoint codepoint);
+
+#endif
diff --git a/lib/sheenbidi/Source/IsolatingRun.c b/lib/sheenbidi/Source/IsolatingRun.c
new file mode 100644
index 000000000..a5e8c87cc
--- /dev/null
+++ b/lib/sheenbidi/Source/IsolatingRun.c
@@ -0,0 +1,529 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#include "BidiChain.h"
+#include "BracketQueue.h"
+#include "BracketType.h"
+#include "LevelRun.h"
+#include "PairingLookup.h"
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "SBLog.h"
+#include "IsolatingRun.h"
+
+static void ResolveAvailableBracketPairs(IsolatingRunRef isolatingRun);
+
+static void AttachLevelRunLinks(IsolatingRunRef isolatingRun)
+{
+    BidiChainRef chain = isolatingRun->bidiChain;
+    LevelRunRef baseLevelRun = isolatingRun->baseLevelRun;
+    LevelRunRef current;
+    LevelRunRef next;
+
+    isolatingRun->_originalLink = BidiChainGetNext(chain, chain->roller);
+    BidiChainSetNext(chain, chain->roller, baseLevelRun->firstLink);
+
+    /* Iterate over level runs and attach their links to form an isolating run. */
+    for (current = baseLevelRun; (next = current->next); current = next) {
+        BidiChainSetNext(chain, current->lastLink, next->firstLink);
+    }
+    BidiChainSetNext(chain, current->lastLink, chain->roller);
+
+    isolatingRun->_lastLevelRun = current;
+    isolatingRun->_sos = RunExtrema_SOR(baseLevelRun->extrema);
+
+    if (!RunKindIsPartialIsolate(baseLevelRun->kind)) {
+        isolatingRun->_eos = RunExtrema_EOR(current->extrema);
+    } else {
+        SBLevel paragraphLevel = isolatingRun->paragraphLevel;
+        SBLevel runLevel = baseLevelRun->level;
+        SBLevel eosLevel = (runLevel > paragraphLevel ? runLevel : paragraphLevel);
+        isolatingRun->_eos = ((eosLevel & 1) ? SBBidiTypeR : SBBidiTypeL);
+    }
+}
+
+static void AttachOriginalLinks(IsolatingRunRef isolatingRun)
+{
+    BidiChainRef chain = isolatingRun->bidiChain;
+    LevelRunRef current;
+
+    BidiChainSetNext(chain, chain->roller, isolatingRun->_originalLink);
+
+    /* Iterate over level runs and attach original subsequent links. */
+    for (current = isolatingRun->baseLevelRun; current; current = current->next) {
+        BidiChainSetNext(chain, current->lastLink, current->subsequentLink);
+    }
+}
+
+static BidiLink ResolveWeakTypes(IsolatingRunRef isolatingRun)
+{
+    BidiChainRef chain = isolatingRun->bidiChain;
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    BidiLink priorLink;
+    SBBidiType sos;
+
+    SBBidiType w1PriorType;
+    SBBidiType w2StrongType;
+    SBBidiType w4PriorType;
+    SBBidiType w5PriorType;
+    SBBidiType w7StrongType;
+
+    priorLink = roller;
+    sos = isolatingRun->_sos;
+
+    w1PriorType = sos;
+    w2StrongType = sos;
+
+    BidiChainForEach(chain, roller, link) {
+        SBBidiType type = BidiChainGetType(chain, link);
+        SBBoolean forceMerge = SBFalse;
+
+        /* Rule W1 */
+        if (type == SBBidiTypeNSM) {
+            /* Change the 'type' variable as well because it can be EN on which W2 depends. */
+            type = (SBBidiTypeIsIsolate(w1PriorType) ? SBBidiTypeON : w1PriorType);
+            BidiChainSetType(chain, link, type);
+
+            /* Fix for 3rd point of rule N0. */
+            if (w1PriorType == SBBidiTypeON) {
+                forceMerge = SBTrue;
+            }
+        }
+        w1PriorType = type;
+
+        /* Rule W2 */
+        if (type == SBBidiTypeEN) {
+            if (w2StrongType == SBBidiTypeAL) {
+                BidiChainSetType(chain, link, SBBidiTypeAN);
+            }
+        }
+        /*
+         * Rule W3
+         * NOTE: It is safe to apply W3 in 'else-if' statement because it only depends on type AL.
+         *       Even if W2 changes EN to AN, there won't be any harm.
+         */
+        else if (type == SBBidiTypeAL) {
+            BidiChainSetType(chain, link, SBBidiTypeR);
+        }
+
+        if (SBBidiTypeIsStrong(type)) {
+            /* Save the strong type as it is checked in W2. */
+            w2StrongType = type;
+        }
+
+        if ((type != SBBidiTypeON && BidiChainGetType(chain, priorLink) == type) || forceMerge) {
+            BidiChainAbandonNext(chain, priorLink);
+        } else {
+            priorLink = link;
+        }
+    }
+
+    priorLink = roller;
+    w4PriorType = sos;
+    w5PriorType = sos;
+    w7StrongType = sos;
+
+    BidiChainForEach(chain, roller, link) {
+        SBBidiType type = BidiChainGetType(chain, link);
+        SBBidiType nextType = BidiChainGetType(chain, BidiChainGetNext(chain, link));
+
+        /* Rule W4 */
+        if (BidiChainIsSingle(chain, link)
+            && SBBidiTypeIsNumberSeparator(type)
+            && SBBidiTypeIsNumber(w4PriorType)
+            && (w4PriorType == nextType)
+            && (w4PriorType == SBBidiTypeEN || type == SBBidiTypeCS))
+        {
+            /* Change the current type as well because it can be EN on which W5 depends. */
+            type = w4PriorType;
+            BidiChainSetType(chain, link, type);
+        }
+        w4PriorType = type;
+
+        /* Rule W5 */
+        if (type == SBBidiTypeET && (w5PriorType == SBBidiTypeEN || nextType == SBBidiTypeEN)) {
+            /* Change the current type as well because it is EN on which W7 depends. */
+            type = SBBidiTypeEN;
+            BidiChainSetType(chain, link, type);
+        }
+        w5PriorType = type;
+
+        switch (type) {
+        /* Rule W6 */
+        case SBBidiTypeET:
+        case SBBidiTypeCS:
+        case SBBidiTypeES:
+            BidiChainSetType(chain, link, SBBidiTypeON);
+            break;
+
+        /*
+         * Rule W7
+         * NOTE: W7 is expected to be applied after W6. However this is not the case here. The
+         *       reason is that W6 can only create the type ON which is not tested in W7 by any
+         *       means. So it won't affect the algorithm.
+         */
+        case SBBidiTypeEN:
+            if (w7StrongType == SBBidiTypeL) {
+                BidiChainSetType(chain, link, SBBidiTypeL);
+            }
+            break;
+
+        /*
+         * Save the strong type for W7.
+         * NOTE: The strong type is expected to be saved after applying W7 because W7 itself creates
+         *       a strong type. However the strong type being saved here is based on the type after
+         *       W5. This won't effect the algorithm because a single link contains all consecutive
+         *       EN types. This means that even if W7 creates a strong type, it will be saved in
+         *       next iteration.
+         */
+        case SBBidiTypeL:
+        case SBBidiTypeR:
+            w7StrongType = type;
+            break;
+        }
+
+        if (type != SBBidiTypeON && BidiChainGetType(chain, priorLink) == type) {
+            BidiChainAbandonNext(chain, priorLink);
+        } else {
+            priorLink = link;
+        }
+    }
+
+    return priorLink;
+}
+
+static void ResolveBrackets(IsolatingRunRef isolatingRun)
+{
+    const SBCodepointSequence *sequence = isolatingRun->codepointSequence;
+    SBUInteger paragraphOffset = isolatingRun->paragraphOffset;
+    BracketQueueRef queue = &isolatingRun->_bracketQueue;
+    BidiChainRef chain = isolatingRun->bidiChain;
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    BidiLink priorStrongLink;
+    SBLevel runLevel;
+
+    priorStrongLink = BidiLinkNone;
+    runLevel = isolatingRun->baseLevelRun->level;
+
+    BracketQueueReset(queue, SBLevelAsNormalBidiType(runLevel));
+
+    BidiChainForEach(chain, roller, link) {
+        SBUInteger stringIndex;
+        SBCodepoint codepoint;
+        SBBidiType type;
+
+        SBCodepoint bracketValue;
+        BracketType bracketType;
+
+        type = BidiChainGetType(chain, link);
+
+        switch (type) {
+        case SBBidiTypeON:
+            stringIndex = BidiChainGetOffset(chain, link) + paragraphOffset;
+            codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex);
+            bracketValue = LookupBracketPair(codepoint, &bracketType);
+
+            switch (bracketType) {
+            case BracketTypeOpen:
+                if (queue->count < BracketQueueGetMaxCapacity()) {
+                    BracketQueueEnqueue(queue, priorStrongLink, link, bracketValue);
+                } else {
+                    goto Resolve;
+                }
+                break;
+
+            case BracketTypeClose:
+                if (queue->count != 0) {
+                    BracketQueueClosePair(queue, link, codepoint);
+
+                    if (BracketQueueShouldDequeue(queue)) {
+                        ResolveAvailableBracketPairs(isolatingRun);
+                    }
+                }
+                break;
+            }
+            break;
+
+        case SBBidiTypeEN:
+        case SBBidiTypeAN:
+            type = SBBidiTypeR;
+
+        case SBBidiTypeR:
+        case SBBidiTypeL:
+            if (queue->count != 0) {
+                BracketQueueSetStrongType(queue, type);
+            }
+
+            priorStrongLink = link;
+            break;
+        }
+    }
+
+Resolve:
+    ResolveAvailableBracketPairs(isolatingRun);
+}
+
+static void ResolveAvailableBracketPairs(IsolatingRunRef isolatingRun)
+{
+    BracketQueueRef queue = &isolatingRun->_bracketQueue;
+    BidiChainRef chain = isolatingRun->bidiChain;
+
+    SBLevel runLevel;
+    SBBidiType embeddingDirection;
+    SBBidiType oppositeDirection;
+
+    runLevel = isolatingRun->baseLevelRun->level;
+    embeddingDirection = SBLevelAsNormalBidiType(runLevel);
+    oppositeDirection = SBLevelAsOppositeBidiType(runLevel);
+
+    while (queue->count != 0) {
+        BidiLink openingLink = BracketQueueGetOpeningLink(queue);
+        BidiLink closingLink = BracketQueueGetClosingLink(queue);
+
+        if ((openingLink != BidiLinkNone) && (closingLink != BidiLinkNone)) {
+            SBBidiType innerStrongType;
+            SBBidiType pairType;
+
+            innerStrongType = BracketQueueGetStrongType(queue);
+
+            /* Rule: N0.b */
+            if (innerStrongType == embeddingDirection) {
+                pairType = innerStrongType;
+            }
+            /* Rule: N0.c */
+            else if (innerStrongType == oppositeDirection) {
+                BidiLink priorStrongLink;
+                SBBidiType priorStrongType;
+
+                priorStrongLink = BracketQueueGetPriorStrongLink(queue);
+
+                if (priorStrongLink != BidiLinkNone) {
+                    BidiLink link;
+
+                    priorStrongType = BidiChainGetType(chain, priorStrongLink);
+                    if (SBBidiTypeIsNumber(priorStrongType)) {
+                        priorStrongType = SBBidiTypeR;
+                    }
+
+                    link = BidiChainGetNext(chain, priorStrongLink);
+
+                    while (link != openingLink) {
+                        SBBidiType type = BidiChainGetType(chain, link);
+                        if (type == SBBidiTypeL || type == SBBidiTypeR) {
+                            priorStrongType = type;
+                        }
+
+                        link = BidiChainGetNext(chain, link);
+                    }
+                } else {
+                    priorStrongType = isolatingRun->_sos;
+                }
+
+                /* Rule: N0.c.1 */
+                if (priorStrongType == oppositeDirection) {
+                    pairType = oppositeDirection;
+                }
+                /* Rule: N0.c.2 */
+                else {
+                    pairType = embeddingDirection;
+                }
+            }
+            /* Rule: N0.d */
+            else {
+                pairType = SBBidiTypeNil;
+            }
+
+            if (pairType != SBBidiTypeNil) {
+                /* Do the substitution */
+                BidiChainSetType(chain, openingLink, pairType);
+                BidiChainSetType(chain, closingLink, pairType);
+            }
+        }
+
+        BracketQueueDequeue(queue);
+    }
+}
+
+static void ResolveNeutrals(IsolatingRunRef isolatingRun)
+{
+    BidiChainRef chain = isolatingRun->bidiChain;
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    SBLevel runLevel;
+    SBBidiType strongType;
+    BidiLink neutralLink;
+
+    runLevel = isolatingRun->baseLevelRun->level;
+    strongType = isolatingRun->_sos;
+    neutralLink = BidiLinkNone;
+
+    BidiChainForEach(chain, roller, link) {
+        SBBidiType type = BidiChainGetType(chain, link);
+        SBBidiType nextType;
+
+        SBAssert(SBBidiTypeIsStrongOrNumber(type) || SBBidiTypeIsNeutralOrIsolate(type));
+
+        switch (type) {
+        case SBBidiTypeL:
+            strongType = SBBidiTypeL;
+            break;
+
+        case SBBidiTypeR:
+        case SBBidiTypeEN:
+        case SBBidiTypeAN:
+            strongType = SBBidiTypeR;
+            break;
+
+        case SBBidiTypeB:                           
+        case SBBidiTypeS:
+        case SBBidiTypeWS:
+        case SBBidiTypeON:
+        case SBBidiTypeLRI:
+        case SBBidiTypeRLI:                         
+        case SBBidiTypeFSI:
+        case SBBidiTypePDI:
+            if (neutralLink == BidiLinkNone) {
+                neutralLink = link;
+            }
+
+            nextType = BidiChainGetType(chain, BidiChainGetNext(chain, link));
+            if (SBBidiTypeIsNumber(nextType)) {
+                nextType = SBBidiTypeR;
+            } else if (nextType == SBBidiTypeNil) {
+                nextType = isolatingRun->_eos;
+            }
+
+            if (SBBidiTypeIsStrong(nextType)) {
+                /* Rules N1, N2 */
+                SBBidiType resolvedType = (strongType == nextType
+                                           ? strongType
+                                           : SBLevelAsNormalBidiType(runLevel));
+
+                do {
+                    BidiChainSetType(chain, neutralLink, resolvedType);
+                    neutralLink = BidiChainGetNext(chain, neutralLink);
+                } while (neutralLink != BidiChainGetNext(chain, link));
+
+                neutralLink = BidiLinkNone;
+            }
+            break;
+        }
+    }
+}
+
+static void ResolveImplicitLevels(IsolatingRunRef isolatingRun)
+{
+    BidiChainRef chain = isolatingRun->bidiChain;
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    SBLevel runLevel = isolatingRun->baseLevelRun->level;
+    
+    if ((runLevel & 1) == 0) {
+        BidiChainForEach(chain, roller, link) {
+            SBBidiType type = BidiChainGetType(chain, link);
+            SBLevel level = BidiChainGetLevel(chain, link);
+            
+            SBAssert(SBBidiTypeIsStrongOrNumber(type));
+            
+            /* Rule I1 */
+            if (type == SBBidiTypeR) {
+                BidiChainSetLevel(chain, link, level + 1);
+            } else if (type != SBBidiTypeL) {
+                BidiChainSetLevel(chain, link, level + 2);
+            }
+        }
+    } else {
+        BidiChainForEach(chain, roller, link) {
+            SBBidiType type = BidiChainGetType(chain, link);
+            SBLevel level = BidiChainGetLevel(chain, link);
+            
+            SBAssert(SBBidiTypeIsStrongOrNumber(type));
+            
+            /* Rule I2 */
+            if (type != SBBidiTypeR) {
+                BidiChainSetLevel(chain, link, level + 1);
+            }
+        }
+    }
+}
+
+SB_INTERNAL void IsolatingRunInitialize(IsolatingRunRef isolatingRun)
+{
+    BracketQueueInitialize(&isolatingRun->_bracketQueue);
+}
+
+SB_INTERNAL void IsolatingRunResolve(IsolatingRunRef isolatingRun)
+{
+    BidiLink lastLink;
+    BidiLink subsequentLink;
+
+    SB_LOG_BLOCK_OPENER("Identified Isolating Run");
+
+    /* Attach level run links to form isolating run. */
+    AttachLevelRunLinks(isolatingRun);
+    /* Save last subsequent link. */
+    subsequentLink = isolatingRun->_lastLevelRun->subsequentLink;
+
+    SB_LOG_STATEMENT("Range", 1, SB_LOG_RUN_RANGE(isolatingRun));
+    SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun));
+    SB_LOG_STATEMENT("Level", 1, SB_LOG_LEVEL(isolatingRun->baseLevelRun->level));
+    SB_LOG_STATEMENT("SOS", 1, SB_LOG_BIDI_TYPE(isolatingRun->_sos));
+    SB_LOG_STATEMENT("EOS", 1, SB_LOG_BIDI_TYPE(isolatingRun->_eos));
+
+    /* Rules W1-W7 */
+    lastLink = ResolveWeakTypes(isolatingRun);
+    SB_LOG_BLOCK_OPENER("Resolved Weak Types");
+    SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun));
+    SB_LOG_BLOCK_CLOSER();
+
+    /* Rule N0 */
+    ResolveBrackets(isolatingRun);
+    SB_LOG_BLOCK_OPENER("Resolved Brackets");
+    SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun));
+    SB_LOG_BLOCK_CLOSER();
+
+    /* Rules N1, N2 */
+    ResolveNeutrals(isolatingRun);
+    SB_LOG_BLOCK_OPENER("Resolved Neutrals");
+    SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun));
+    SB_LOG_BLOCK_CLOSER();
+
+    /* Rules I1, I2 */
+    ResolveImplicitLevels(isolatingRun);
+    SB_LOG_BLOCK_OPENER("Resolved Implicit Levels");
+    SB_LOG_STATEMENT("Levels", 1, SB_LOG_RUN_LEVELS(isolatingRun));
+    SB_LOG_BLOCK_CLOSER();
+
+    /* Re-attach original links. */
+    AttachOriginalLinks(isolatingRun);
+    /* Attach new final link (of isolating run) with last subsequent link. */
+    BidiChainSetNext(isolatingRun->bidiChain, lastLink, subsequentLink);
+
+    SB_LOG_BLOCK_CLOSER();
+}
+
+SB_INTERNAL void IsolatingRunFinalize(IsolatingRunRef isolatingRun)
+{
+    BracketQueueFinalize(&isolatingRun->_bracketQueue);
+}
diff --git a/lib/sheenbidi/Source/IsolatingRun.h b/lib/sheenbidi/Source/IsolatingRun.h
new file mode 100644
index 000000000..3119a56da
--- /dev/null
+++ b/lib/sheenbidi/Source/IsolatingRun.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_ISOLATING_RUN_H
+#define _SB_INTERNAL_ISOLATING_RUN_H
+
+#include <SBConfig.h>
+
+#include "BidiChain.h"
+#include "BracketQueue.h"
+#include "LevelRun.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+
+typedef struct _IsolatingRun {
+    const SBCodepointSequence *codepointSequence;
+    const SBBidiType *bidiTypes;
+    BidiChainRef bidiChain;
+    LevelRunRef baseLevelRun;
+    LevelRunRef _lastLevelRun;
+    BracketQueue _bracketQueue;
+    SBUInteger paragraphOffset;
+    BidiLink _originalLink;
+    SBBidiType _sos;
+    SBBidiType _eos;
+    SBLevel paragraphLevel;
+} IsolatingRun, *IsolatingRunRef;
+
+SB_INTERNAL void IsolatingRunInitialize(IsolatingRunRef isolatingRun);
+SB_INTERNAL void IsolatingRunResolve(IsolatingRunRef isolatingRun);
+
+SB_INTERNAL void IsolatingRunFinalize(IsolatingRunRef isolatingRun);
+
+#endif
diff --git a/lib/sheenbidi/Source/LevelRun.c b/lib/sheenbidi/Source/LevelRun.c
new file mode 100644
index 000000000..267a3acc1
--- /dev/null
+++ b/lib/sheenbidi/Source/LevelRun.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+
+#include "BidiChain.h"
+#include "RunExtrema.h"
+#include "RunKind.h"
+#include "SBAssert.h"
+#include "LevelRun.h"
+
+SB_INTERNAL void LevelRunInitialize(LevelRunRef levelRun,
+    BidiChainRef bidiChain, BidiLink firstLink, BidiLink lastLink,
+    SBBidiType sor, SBBidiType eor)
+{
+    SBBidiType firstType = BidiChainGetType(bidiChain, firstLink);
+    SBBidiType lastType = BidiChainGetType(bidiChain, lastLink);
+
+    levelRun->next = NULL;
+    levelRun->firstLink = firstLink;
+    levelRun->lastLink = lastLink;
+    levelRun->subsequentLink = BidiChainGetNext(bidiChain, lastLink);
+    levelRun->extrema = RunExtremaMake(sor, eor);
+    levelRun->kind = RunKindMake
+                     (
+                        SBBidiTypeIsIsolateInitiator(lastType),
+                        SBBidiTypeIsIsolateTerminator(firstType)
+                     );
+    levelRun->level = BidiChainGetLevel(bidiChain, firstLink);
+}
+
+SB_INTERNAL void LevelRunAttach(LevelRunRef levelRun, LevelRunRef next)
+{
+    /* Only the runs of same level can be attached. */
+    SBAssert(levelRun->level == next->level);
+    /* No other run can be attached with a simple run. */
+    SBAssert(!RunKindIsSimple(levelRun->kind));
+    /* No other run can be attached with a complete isolating run. */
+    SBAssert(!RunKindIsCompleteIsolate(levelRun->kind));
+    /* Only a terminating run can be attached with an isolating run. */
+    SBAssert(RunKindIsIsolate(levelRun->kind) && RunKindIsTerminating(next->kind));
+    /* The next run must be unattached. */
+    SBAssert(!RunKindIsAttachedTerminating(next->kind));
+    
+    if (RunKindIsTerminating(next->kind)) {
+        RunKindMakeAttached(next->kind);
+    }
+    
+    if (RunKindIsIsolate(levelRun->kind)) {
+        RunKindMakeComplete(levelRun->kind);
+    }
+    
+    levelRun->next = next;
+}
diff --git a/lib/sheenbidi/Source/LevelRun.h b/lib/sheenbidi/Source/LevelRun.h
new file mode 100644
index 000000000..e7e392dee
--- /dev/null
+++ b/lib/sheenbidi/Source/LevelRun.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_LEVEL_RUN_H
+#define _SB_INTERNAL_LEVEL_RUN_H
+
+#include <SBConfig.h>
+
+#include "BidiChain.h"
+#include "RunExtrema.h"
+#include "RunKind.h"
+#include "SBBase.h"
+
+typedef struct _LevelRun {
+    struct _LevelRun *next;   /**< Reference to the next sequence of run links. */
+    BidiLink firstLink;       /**< First link of the run. */
+    BidiLink lastLink;        /**< Last link of the run. */
+    BidiLink subsequentLink;  /**< Subsequent link of the run. */
+    RunExtrema extrema;
+    RunKind kind;
+    SBLevel level;
+} LevelRun, *LevelRunRef;
+
+SB_INTERNAL void LevelRunInitialize(LevelRunRef levelRun,
+    BidiChainRef bidiChain, BidiLink firstLink, BidiLink lastLink,
+    SBBidiType sor, SBBidiType eor);
+SB_INTERNAL void LevelRunAttach(LevelRunRef levelRun, LevelRunRef next);
+
+#endif
diff --git a/lib/sheenbidi/Source/PairingLookup.c b/lib/sheenbidi/Source/PairingLookup.c
new file mode 100644
index 000000000..a177e3997
--- /dev/null
+++ b/lib/sheenbidi/Source/PairingLookup.c
@@ -0,0 +1,256 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ *
+ * REQUIRED MEMORY: (37)+2326+(579*2) = 3558 Bytes
+ */
+
+#include "PairingLookup.h"
+
+static const SBInt16 PairDifferences[37] = {
+    0,     1,     -1,    2,     -2,    16,    -16,   3,     -3,    2016,  2527,  1923,  1914,  1918,
+    2250,  138,   7,     -7,    1824,  2104,  2108,  2106,  1316,  -138,  8,     -8,    -1316,
+    -1914, -1918, -1923, -1824, -2016, -2104, -2106, -2108, -2250, -2527
+};
+
+static const SBUInt8 PairData[2326] = {
+/* DATA_BLOCK: -- 0x0000..0x0070 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   3,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   67,  0,   132, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0071..0x00E1 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   67,  0,   132, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   5,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   6,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x00E2..0x0152 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0153..0x01C3 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,
+    130, 65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x01C4..0x0234 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0235..0x02A5 -- */
+    1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x02A6..0x0316 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   7,   7,   7,   8,   8,   8,   0,   0,
+    0,   0,   0,   0,   0,   9,   0,   0,   0,   0,   0,   0,   0,   0,   0,   10,  11,  12,  13,
+    0,   14,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,   15,  0,   16,  0,   0,   0,
+    0,   0,   0,   17,  0,   0,   0,   0,   0,   1,   2,   1,   2,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   1,   2,   1,   2,   1,   2,   0,   0,
+/* DATA_BLOCK: -- 0x0317..0x0387 -- */
+    1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+    2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   0,   0,   0,   1,   2,   1,   2,   0,
+    0,   0,   0,   0,   18,  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   19,
+    0,   20,  21,  0,   21,  0,   0,   0,   0,   1,   2,   1,   2,   1,   2,   1,   2,   22,  0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   1,   2,
+    23,  0,   0,   1,   2,   0,   0,   0,   0,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+/* DATA_BLOCK: -- 0x0388..0x03F8 -- */
+    2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   0,   0,   1,   2,
+    24,  24,  24,  0,   16,  16,  0,   0,   25,  25,  25,  17,  17,  0,   0,   0,   0,   0,   0,
+    0,   0,   0,   65,  130, 65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x03F9..0x0469 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 65,  130, 65,  130, 65,
+    130, 65,  130, 65,  130, 65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x046A..0x04DA -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   65,  130, 0,   1,   2,   0,   3,   0,
+    4,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,   26,  1,   2,   0,
+    0,   0,   1,   2,   1,   2,   65,  130, 65,  130, 65,  130, 65,  130, 65,  130, 0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x04DB..0x054B -- */
+    0,   0,   0,   0,   0,   65,  130, 65,  130, 65,  130, 65,  130, 65,  130, 71,  129, 66,  136,
+    65,  130, 65,  130, 65,  130, 65,  130, 0,   0,   27,  0,   0,   0,   0,   28,  0,   0,   29,
+    1,   2,   0,   0,   1,   2,   1,   2,   1,   2,   1,   2,   0,   0,   0,   0,   0,   0,   0,
+    0,   30,  0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   1,   2,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   1,   2,   1,   2,   0,   1,   2,   0,   0,   65,  130, 65,  130, 0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x054C..0x05BC -- */
+    0,   0,   0,   0,   0,   0,   31,  0,   0,   1,   2,   0,   0,   65,  130, 0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   1,   2,   1,   2,   0,   0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,
+    0,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x05BD..0x062D -- */
+    0,   0,   0,   0,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,
+    2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+    1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   0,   0,   0,   1,   2,   1,   2,   1,   2,
+    1,   2,   0,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+    1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,   1,   2,
+/* DATA_BLOCK: -- 0x062E..0x069E -- */
+    1,   2,   1,   2,   1,   2,   0,   0,   0,   0,   0,   0,   0,   32,  0,   0,   0,   0,   33,
+    34,  33,  0,   0,   0,   0,   0,   0,   1,   2,   35,  0,   0,   0,   0,   0,   0,   0,   0,
+    1,   2,   1,   2,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x069F..0x070F -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   36,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0710..0x0780 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   1,   2,   1,   2,   0,   0,   0,   1,   2,   0,   1,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   2,   0,   0,   1,
+    2,   65,  130, 65,  130, 65,  130, 65,  130, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0781..0x07F1 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 65,
+    130, 65,  130, 65,  130, 65,  130, 0,   0,   65,  130, 65,  130, 65,  130, 65,  130, 0,
+/* DATA_BLOCK: -- 0x07F2..0x0862 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   65,  130, 65,  130, 65,  130, 0,   0,   0,   0,   0,   1,   2,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+/* DATA_BLOCK: -- 0x0863..0x08D3 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   65,  130, 0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   3,   0,   4,   0,   0,   0,
+/* DATA_BLOCK: -- 0x08D4..0x0915 -- */
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   67,  0,   132, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    67,  0,   132, 0,   65,  130, 0,   65,  130,
+};
+
+static const SBUInt16 PairIndexes[579] = {
+    0x0000, 0x0071, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x0153, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x01C4, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x0235, 0x00E2, 0x00E2, 0x00E2, 0x02A6, 0x0317, 0x0388, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x03F9, 0x046A, 0x00E2, 0x00E2, 0x00E2, 0x04DB, 0x054C,
+    0x05BD, 0x062E, 0x00E2, 0x069F, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x0710, 0x00E2, 0x00E2, 0x00E2,
+    0x0781, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2,
+    0x07F2, 0x0863, 0x08D4
+};
+
+SB_INTERNAL SBCodepoint LookupMirror(SBCodepoint codepoint)
+{
+    if (codepoint <= 0xFF63) {
+        SBInt16 diff = PairDifferences[
+                        PairData[
+                         PairIndexes[
+                              codepoint / 0x071
+                         ] + (codepoint % 0x071)
+                        ] & BracketTypeInverseMask
+                       ];
+
+        if (diff != 0) {
+            return (codepoint + diff);
+        }
+    }
+
+    return 0;
+}
+
+SB_INTERNAL SBCodepoint LookupBracketPair(SBCodepoint codepoint, BracketType *type)
+{
+    if (codepoint <= 0xFF63) {
+        SBUInt8 data = PairData[
+                        PairIndexes[
+                             codepoint / 0x071
+                        ] + (codepoint % 0x071)
+                       ];
+        *type = (data & BracketTypePrimaryMask);
+
+        if (*type != 0) {
+            SBInt16 diff = PairDifferences[
+                            data & BracketTypeInverseMask
+                           ];
+            return (codepoint + diff);
+        }
+    } else {
+        *type = BracketTypeNone;
+    }
+
+    return 0;
+}
diff --git a/lib/sheenbidi/Source/PairingLookup.h b/lib/sheenbidi/Source/PairingLookup.h
new file mode 100644
index 000000000..28a0e9feb
--- /dev/null
+++ b/lib/sheenbidi/Source/PairingLookup.h
@@ -0,0 +1,17 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ */
+
+#ifndef _SB_INTERNAL_PAIRING_LOOKUP_H
+#define _SB_INTERNAL_PAIRING_LOOKUP_H
+
+#include <SBConfig.h>
+
+#include "BracketType.h"
+#include "SBBase.h"
+
+SB_INTERNAL SBCodepoint LookupMirror(SBCodepoint codepoint);
+SB_INTERNAL SBCodepoint LookupBracketPair(SBCodepoint codepoint, BracketType *bracketType);
+
+#endif
diff --git a/lib/sheenbidi/Source/RunExtrema.h b/lib/sheenbidi/Source/RunExtrema.h
new file mode 100644
index 000000000..3ce68d340
--- /dev/null
+++ b/lib/sheenbidi/Source/RunExtrema.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_RUN_EXTREMA_H
+#define _SB_INTERNAL_RUN_EXTREMA_H
+
+#include "SBBase.h"
+
+enum {
+    RunExtremaLeadingL  = SBBidiTypeL << 0,
+    RunExtremaLeadingR  = SBBidiTypeR << 0,
+    
+    RunExtremaTrailingL = SBBidiTypeL << 4,
+    RunExtremaTrailingR = SBBidiTypeR << 4
+};
+typedef SBUInt8 RunExtrema;
+
+#define RunExtremaMake(sor, eor)            \
+(RunExtrema)                                \
+(                                           \
+   ((sor) << 0)                             \
+ | ((eor) << 4)                             \
+)
+
+#define RunExtrema_SOR(e)                   \
+(RunExtrema)                                \
+(                                           \
+ (e) & 0xF                                  \
+)
+
+#define RunExtrema_EOR(e)                   \
+(RunExtrema)                                \
+(                                           \
+ (e) >> 4                                   \
+)
+
+#endif
diff --git a/lib/sheenbidi/Source/RunKind.h b/lib/sheenbidi/Source/RunKind.h
new file mode 100644
index 000000000..ebda9fa55
--- /dev/null
+++ b/lib/sheenbidi/Source/RunKind.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_RUN_KIND_H
+#define _SB_INTERNAL_RUN_KIND_H
+
+#include "SBBase.h"
+
+enum {
+    RunKindSimple         = 0x00,
+
+    RunKindIsolate        = 0x01,
+    RunKindPartial        = 0x02,
+    RunKindPartialIsolate = RunKindIsolate | RunKindPartial,
+
+    RunKindTerminating    = 0x04,
+    RunKindAttached       = 0x08
+};
+typedef SBUInt8 RunKind;
+
+#define RunKindMake(i, t)                   \
+(                                           \
+   ((i) ? RunKindPartialIsolate : 0)        \
+ | ((t) ? RunKindTerminating : 0)           \
+)
+
+#define RunKindMakeComplete(k)              \
+(                                           \
+ (k) &= ~RunKindPartial                     \
+)
+
+#define RunKindMakeAttached(k)              \
+(                                           \
+ (k) |= RunKindAttached                     \
+)
+
+#define RunKindIsSimple(k)                  \
+(                                           \
+ (k) == RunKindSimple                       \
+)
+
+#define RunKindIsIsolate(k)                 \
+(                                           \
+ (k) & RunKindIsolate                       \
+)
+
+#define RunKindIsTerminating(k)             \
+(                                           \
+ (k) & RunKindTerminating                   \
+)
+
+#define RunKindIsPartialIsolate(k)          \
+(                                           \
+ (k) & RunKindPartial                       \
+)
+
+#define RunKindIsCompleteIsolate(k)         \
+(                                           \
+    ((k) & RunKindPartialIsolate)           \
+ == RunKindIsolate                          \
+)
+
+#define RunKindIsAttachedTerminating(k)     \
+(                                           \
+ (k) & RunKindAttached                      \
+)
+
+#endif
diff --git a/lib/sheenbidi/Source/RunQueue.c b/lib/sheenbidi/Source/RunQueue.c
new file mode 100644
index 000000000..e3b5cb950
--- /dev/null
+++ b/lib/sheenbidi/Source/RunQueue.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "LevelRun.h"
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "RunQueue.h"
+
+static void FindPreviousPartialRun(RunQueueRef queue)
+{
+    RunQueueListRef list = queue->_partialList;
+    SBInteger top = queue->_partialTop;
+
+    do {
+        SBInteger limit = (list == queue->_frontList ? queue->_frontTop : 0);
+
+        do {
+            LevelRunRef levelRun = &list->elements[top];
+            if (RunKindIsPartialIsolate(levelRun->kind)) {
+                queue->_partialList = list;
+                queue->_partialTop = top;
+                return;
+            }
+        } while (top-- > limit);
+
+        list = list->previous;
+        top = RunQueueList_MaxIndex;
+    } while (list);
+
+    queue->_partialList = NULL;
+    queue->_partialTop = -1;
+    queue->shouldDequeue = SBFalse;
+}
+
+SB_INTERNAL void RunQueueInitialize(RunQueueRef queue)
+{
+    /* Initialize first list. */
+    queue->_firstList.previous = NULL;
+    queue->_firstList.next = NULL;
+
+    /* Initialize front and rear lists with first list. */
+    queue->_frontList = &queue->_firstList;
+    queue->_rearList = &queue->_firstList;
+    queue->_partialList = NULL;
+
+    /* Initialize list indexes. */
+    queue->_frontTop = 0;
+    queue->_rearTop = -1;
+    queue->_partialTop = -1;
+
+    /* Initialize rest of the elements. */
+    queue->count = 0;
+    queue->peek = &queue->_frontList->elements[queue->_frontTop];
+    queue->shouldDequeue = SBFalse;
+}
+
+SB_INTERNAL void RunQueueEnqueue(RunQueueRef queue, const LevelRunRef levelRun)
+{
+    LevelRunRef element;
+
+    if (queue->_rearTop != RunQueueList_MaxIndex) {
+        element = &queue->_rearList->elements[++queue->_rearTop];
+    } else {
+        RunQueueListRef previousList = queue->_rearList;
+        RunQueueListRef rearList = previousList->next;
+
+        if (!rearList) {
+            rearList = malloc(sizeof(RunQueueList));
+            rearList->previous = previousList;
+            rearList->next = NULL;
+
+            previousList->next = rearList;
+        }
+
+        queue->_rearList = rearList;
+        queue->_rearTop = 0;
+
+        element = &rearList->elements[0];
+    }
+    queue->count += 1;
+
+    /* Copy the level run into current element. */
+    *element = *levelRun;
+
+    /* Complete the latest isolating run with this terminating run */
+    if (queue->_partialTop != -1 && RunKindIsTerminating(element->kind)) {
+        LevelRunRef incompleteRun = &queue->_partialList->elements[queue->_partialTop];
+        LevelRunAttach(incompleteRun, element);
+        FindPreviousPartialRun(queue);
+    }
+
+    /* Save the location of the isolating run */
+    if (RunKindIsIsolate(element->kind)) {
+        queue->_partialList = queue->_rearList;
+        queue->_partialTop = queue->_rearTop;
+    }
+}
+
+SB_INTERNAL void RunQueueDequeue(RunQueueRef queue)
+{
+    /* The queue should not be empty. */
+    SBAssert(queue->count != 0);
+
+    if (queue->_frontTop != RunQueueList_MaxIndex) {
+        queue->_frontTop += 1;
+    } else {
+        RunQueueListRef frontList = queue->_frontList;
+
+        if (frontList == queue->_rearList) {
+            queue->_rearTop = -1;
+        } else {
+            queue->_frontList = frontList->next;
+        }
+
+        queue->_frontTop = 0;
+    }
+
+    queue->count -= 1;
+    queue->peek = &queue->_frontList->elements[queue->_frontTop];
+}
+
+SB_INTERNAL void RunQueueFinalize(RunQueueRef queue)
+{
+    RunQueueListRef list = queue->_firstList.next;
+
+    while (list) {
+        RunQueueListRef next = list->next;
+        free(list);
+        list = next;
+    };
+}
diff --git a/lib/sheenbidi/Source/RunQueue.h b/lib/sheenbidi/Source/RunQueue.h
new file mode 100644
index 000000000..3fba5cabb
--- /dev/null
+++ b/lib/sheenbidi/Source/RunQueue.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_RUN_QUEUE_H
+#define _SB_INTERNAL_RUN_QUEUE_H
+
+#include <SBConfig.h>
+
+#include "LevelRun.h"
+#include "SBBase.h"
+
+#define RunQueueList_Length         8
+#define RunQueueList_MaxIndex       (RunQueueList_Length - 1)
+
+typedef struct _RunQueueList {
+    LevelRun elements[RunQueueList_Length];
+
+    struct _RunQueueList *previous; /**< Reference to the previous list of queue elements */
+    struct _RunQueueList *next;     /**< Reference to the next list of queue elements */
+} RunQueueList, *RunQueueListRef;
+
+typedef struct _RunQueue {
+    RunQueueList _firstList;        /**< First list of elements, which is part of the queue */
+    RunQueueListRef _frontList;     /**< The list containing front element of the queue */
+    RunQueueListRef _rearList;      /**< The list containing rear element of the queue */
+    RunQueueListRef _partialList;   /**< The list containing latest partial isolating run */
+    SBInteger _frontTop;            /**< Index of front element in front list */
+    SBInteger _rearTop;             /**< Index of rear element in rear list */
+    SBInteger _partialTop;          /**< Index of partial run in partial list */
+    LevelRunRef peek;               /**< Peek element of the queue */
+    SBUInteger count;               /**< Number of elements the queue contains */
+    SBBoolean shouldDequeue;
+} RunQueue, *RunQueueRef;
+
+SB_INTERNAL void RunQueueInitialize(RunQueueRef queue);
+
+SB_INTERNAL void RunQueueEnqueue(RunQueueRef queue, const LevelRunRef levelRun);
+SB_INTERNAL void RunQueueDequeue(RunQueueRef queue);
+
+SB_INTERNAL void RunQueueFinalize(RunQueueRef queue);
+
+#endif
diff --git a/lib/sheenbidi/Source/SBAlgorithm.c b/lib/sheenbidi/Source/SBAlgorithm.c
new file mode 100644
index 000000000..d784b617c
--- /dev/null
+++ b/lib/sheenbidi/Source/SBAlgorithm.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2016-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "BidiTypeLookup.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+#include "SBLog.h"
+#include "SBParagraph.h"
+#include "SBAlgorithm.h"
+
+static SBAlgorithmRef AlgorithmAllocate(SBUInteger stringLength)
+{
+    const SBUInteger sizeAlgorithm = sizeof(SBAlgorithm);
+    const SBUInteger sizeTypes     = sizeof(SBBidiType) * stringLength;
+
+    const SBUInteger sizeMemory    = sizeAlgorithm
+                                   + sizeTypes;
+
+    SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory);
+
+    SBUInteger offset = 0;
+    SBAlgorithmRef algorithm = (SBAlgorithmRef)(memory + offset);
+
+    offset += sizeAlgorithm;
+    algorithm->fixedTypes = (SBBidiType *)(memory + offset);
+
+    return algorithm;
+}
+
+static void DetermineBidiTypes(const SBCodepointSequence *sequence, SBBidiType *types)
+{
+    SBUInteger stringIndex = 0;
+    SBUInteger firstIndex = 0;
+    SBCodepoint codepoint;
+
+    while ((codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex)) != SBCodepointInvalid) {
+        types[firstIndex] = LookupBidiType(codepoint);
+
+        /* Subsequent code units get 'BN' type. */
+        while (++firstIndex < stringIndex) {
+            types[firstIndex] = SBBidiTypeBN;
+        }
+    }
+}
+
+SBAlgorithmRef SBAlgorithmCreate(const SBCodepointSequence *codepointSequence)
+{
+    if (SBCodepointSequenceIsValid(codepointSequence)) {
+        SBUInteger stringLength = codepointSequence->stringLength;
+        SBAlgorithmRef algorithm;
+
+        SB_LOG_BLOCK_OPENER("Algorithm Input");
+        SB_LOG_STATEMENT("Codepoints", 1, SB_LOG_CODEPOINT_SEQUENCE(codepointSequence));
+        SB_LOG_BLOCK_CLOSER();
+
+        algorithm = AlgorithmAllocate(stringLength);
+        algorithm->codepointSequence = *codepointSequence;
+        algorithm->retainCount = 1;
+
+        DetermineBidiTypes(codepointSequence, algorithm->fixedTypes);
+
+        SB_LOG_BLOCK_OPENER("Determined Types");
+        SB_LOG_STATEMENT("Types",  1, SB_LOG_BIDI_TYPES_ARRAY(algorithm->fixedTypes, stringLength));
+        SB_LOG_BLOCK_CLOSER();
+
+        SB_LOG_BREAKER();
+        
+        return algorithm;
+    }
+
+    return NULL;
+}
+
+const SBBidiType *SBAlgorithmGetBidiTypesPtr(SBAlgorithmRef algorithm)
+{
+    return algorithm->fixedTypes;
+}
+
+SB_INTERNAL SBUInteger SBAlgorithmGetSeparatorLength(SBAlgorithmRef algorithm, SBUInteger separatorIndex)
+{
+    const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence;
+    SBUInteger stringIndex = separatorIndex;
+    SBCodepoint codepoint;
+    SBUInteger separatorLength;
+
+    codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex);
+    separatorLength = stringIndex - separatorIndex;
+
+    if (codepoint == '\r') {
+        /* Don't break in between 'CR' and 'LF'. */
+        if (stringIndex < codepointSequence->stringLength) {
+            codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex);
+
+            if (codepoint == '\n') {
+                separatorLength = stringIndex - separatorIndex;
+            }
+        }
+    }
+
+    return separatorLength;
+}
+
+void SBAlgorithmGetParagraphBoundary(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength,
+    SBUInteger *acutalLength, SBUInteger *separatorLength)
+{
+    const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence;
+    SBBidiType *bidiTypes = algorithm->fixedTypes;
+    SBUInteger limitIndex;
+    SBUInteger startIndex;
+
+    SBUIntegerNormalizeRange(codepointSequence->stringLength, &paragraphOffset, &suggestedLength);
+    limitIndex = paragraphOffset + suggestedLength;
+
+    for (startIndex = paragraphOffset; startIndex < limitIndex; startIndex++) {
+        SBBidiType currentType = bidiTypes[startIndex];
+
+        if (currentType == SBBidiTypeB) {
+            if (separatorLength) {
+                *separatorLength = SBAlgorithmGetSeparatorLength(algorithm, startIndex);
+            }
+            break;
+        }
+    }
+
+    if (acutalLength) {
+        *acutalLength = startIndex - paragraphOffset;
+    }
+}
+
+SBParagraphRef SBAlgorithmCreateParagraph(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel)
+{
+    const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence;
+    SBUInteger stringLength = codepointSequence->stringLength;
+
+    SBUIntegerNormalizeRange(stringLength, &paragraphOffset, &suggestedLength);
+
+    if (suggestedLength > 0) {
+        return SBParagraphCreate(algorithm, paragraphOffset, suggestedLength, baseLevel);
+    }
+
+    return NULL;
+}
+
+SBAlgorithmRef SBAlgorithmRetain(SBAlgorithmRef algorithm)
+{
+    if (algorithm) {
+        algorithm->retainCount += 1;
+    }
+
+    return algorithm;
+}
+
+void SBAlgorithmRelease(SBAlgorithmRef algorithm)
+{
+    if (algorithm && --algorithm->retainCount == 0) {
+        free(algorithm);
+    }
+}
diff --git a/lib/sheenbidi/Source/SBAlgorithm.h b/lib/sheenbidi/Source/SBAlgorithm.h
new file mode 100644
index 000000000..6d417a319
--- /dev/null
+++ b/lib/sheenbidi/Source/SBAlgorithm.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_ALGORITHM_H
+#define _SB_INTERNAL_ALGORITHM_H
+
+#include <SBAlgorithm.h>
+#include <SBBase.h>
+#include <SBBidiType.h>
+#include <SBCodepointSequence.h>
+#include <SBConfig.h>
+
+typedef struct _SBAlgorithm {
+    SBCodepointSequence codepointSequence;
+    SBBidiType *fixedTypes;
+    SBUInteger retainCount;
+} SBAlgorithm;
+
+SB_INTERNAL SBUInteger SBAlgorithmGetSeparatorLength(SBAlgorithmRef algorithm, SBUInteger separatorIndex);
+
+#endif
diff --git a/lib/sheenbidi/Source/SBAssert.h b/lib/sheenbidi/Source/SBAssert.h
new file mode 100644
index 000000000..22923c72b
--- /dev/null
+++ b/lib/sheenbidi/Source/SBAssert.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2014 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_ASSERT_H
+#define _SB_INTERNAL_ASSERT_H
+
+#include <assert.h>
+
+#define SBAssert(exp)   assert(exp)
+
+#endif
diff --git a/lib/sheenbidi/Source/SBBase.c b/lib/sheenbidi/Source/SBBase.c
new file mode 100644
index 000000000..c5323a9c9
--- /dev/null
+++ b/lib/sheenbidi/Source/SBBase.c
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2016-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#include "BidiTypeLookup.h"
+#include "GeneralCategoryLookup.h"
+#include "PairingLookup.h"
+#include "ScriptLookup.h"
+#include "SBBase.h"
+
+#define TAG(a, b, c, d) \
+(SBUInt32)              \
+(                       \
+   ((SBUInt8)(a) << 24) \
+ | ((SBUInt8)(b) << 16) \
+ | ((SBUInt8)(c) <<  8) \
+ | ((SBUInt8)(d) <<  0) \
+)
+
+SB_INTERNAL void SBUIntegerNormalizeRange(SBUInteger actualLength,
+    SBUInteger *rangeOffset, SBUInteger *rangeLength)
+{
+    /**
+     * Assume:
+     *      Actual Length = 10
+     *
+     * Case 1:
+     *      Offset = 0, Length = 10
+     * Result:
+     *      Offset = 0, Length = 10
+     *
+     * Case 2:
+     *      Offset = 0, Length = 11
+     * Result:
+     *      Offset = 0, Length = 10
+     *
+     * Case 3:
+     *      Offset = 1, Length = -1 (MAX)
+     * Result:
+     *      Offset = 1, Length = 9
+     *
+     * Case 4:
+     *      Offset = 10, Length = 0
+     * Result:
+     *      Offset = Invalid, Length = 0
+     *
+     * Case 5:
+     *      Offset = -1 (MAX), Length = 1
+     * Result:
+     *      Offset = Invalid, Length = 0
+     */
+
+    if (*rangeOffset < actualLength) {
+        SBUInteger possibleLimit = *rangeOffset + *rangeLength;
+
+        if (*rangeOffset <= possibleLimit && possibleLimit <= actualLength) {
+            /* The range is valid. Nothing to do here. */
+        } else {
+            *rangeLength = actualLength - *rangeOffset;
+        }
+    } else {
+        *rangeOffset = SBInvalidIndex;
+        *rangeLength = 0;
+    }
+}
+
+SB_INTERNAL SBBoolean SBUIntegerVerifyRange(SBUInteger actualLength,
+    SBUInteger rangeOffset, SBUInteger rangeLength)
+{
+    SBUInteger possibleLimit = rangeOffset + rangeLength;
+
+    return rangeOffset < actualLength
+        && rangeOffset <= possibleLimit
+        && possibleLimit <= actualLength;
+}
+
+SBBidiType SBCodepointGetBidiType(SBCodepoint codepoint)
+{
+    return LookupBidiType(codepoint);
+}
+
+SBGeneralCategory SBCodepointGetGeneralCategory(SBCodepoint codepoint)
+{
+    return LookupGeneralCategory(codepoint);
+}
+
+SBCodepoint SBCodepointGetMirror(SBCodepoint codepoint)
+{
+    return LookupMirror(codepoint);
+}
+
+SBScript SBCodepointGetScript(SBCodepoint codepoint)
+{
+    return LookupScript(codepoint);
+}
+
+SBUInt32 SBScriptGetOpenTypeTag(SBScript script)
+{
+    /* Reference: https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags */
+    /* Dated: 07/24/2017 */
+
+    switch (script) {
+    case SBScriptADLM:
+        return TAG('a', 'd', 'l', 'm');
+    case SBScriptAHOM:
+        return TAG('a', 'h', 'o', 'm');
+    case SBScriptHLUW:
+        return TAG('h', 'l', 'u', 'w');
+    case SBScriptARAB:
+        return TAG('a', 'r', 'a', 'b');
+    case SBScriptARMN:
+        return TAG('a', 'r', 'm', 'n');
+    case SBScriptAVST:
+        return TAG('a', 'v', 's', 't');
+    case SBScriptBALI:
+        return TAG('b', 'a', 'l', 'i');
+    case SBScriptBAMU:
+        return TAG('b', 'a', 'm', 'u');
+    case SBScriptBASS:
+        return TAG('b', 'a', 's', 's');
+    case SBScriptBATK:
+        return TAG('b', 'a', 't', 'k');
+ /* case SBScriptBENG:
+        return TAG('b', 'e', 'n', 'g'); */
+    case SBScriptBENG:
+        return TAG('b', 'n', 'g', '2');
+    case SBScriptBHKS:
+        return TAG('b', 'h', 'k', 's');
+    case SBScriptBOPO:
+        return TAG('b', 'o', 'p', 'o');
+    case SBScriptBRAH:
+        return TAG('b', 'r', 'a', 'h');
+    case SBScriptBRAI:
+        return TAG('b', 'r', 'a', 'i');
+    case SBScriptBUGI:
+        return TAG('b', 'u', 'g', 'i');
+    case SBScriptBUHD:
+        return TAG('b', 'u', 'h', 'd');
+ /* case SBScriptBYZM:
+        return TAG('b', 'y', 'z', 'm'); */
+    case SBScriptCANS:
+        return TAG('c', 'a', 'n', 's');
+    case SBScriptCARI:
+        return TAG('c', 'a', 'r', 'i');
+    case SBScriptAGHB:
+        return TAG('a', 'g', 'h', 'b');
+    case SBScriptCAKM:
+        return TAG('c', 'a', 'k', 'm');
+    case SBScriptCHAM:
+        return TAG('c', 'h', 'a', 'm');
+    case SBScriptCHER:
+        return TAG('c', 'h', 'e', 'r');
+    case SBScriptHANI:
+        return TAG('h', 'a', 'n', 'i');
+    case SBScriptCOPT:
+        return TAG('c', 'o', 'p', 't');
+    case SBScriptCPRT:
+        return TAG('c', 'p', 'r', 't');
+    case SBScriptCYRL:
+        return TAG('c', 'y', 'r', 'l');
+ /* case SBScriptDFLT:
+        return TAG('D', 'F', 'L', 'T'); */
+    case SBScriptDSRT:
+        return TAG('d', 's', 'r', 't');
+ /* case SBScriptDEVA:
+        return TAG('d', 'e', 'v', 'a'); */
+    case SBScriptDEVA:
+        return TAG('d', 'e', 'v', '2');
+    case SBScriptDUPL:
+        return TAG('d', 'u', 'p', 'l');
+    case SBScriptEGYP:
+        return TAG('e', 'g', 'y', 'p');
+    case SBScriptELBA:
+        return TAG('e', 'l', 'b', 'a');
+    case SBScriptETHI:
+        return TAG('e', 't', 'h', 'i');
+    case SBScriptGEOR:
+        return TAG('g', 'e', 'o', 'r');
+    case SBScriptGLAG:
+        return TAG('g', 'l', 'a', 'g');
+    case SBScriptGOTH:
+        return TAG('g', 'o', 't', 'h');
+    case SBScriptGRAN:
+        return TAG('g', 'r', 'a', 'n');
+    case SBScriptGREK:
+        return TAG('g', 'r', 'e', 'k');
+ /* case SBScriptGUJR:
+        return TAG('g', 'u', 'j', 'r'); */
+    case SBScriptGUJR:
+        return TAG('g', 'j', 'r', '2');
+ /* case SBScriptGURU:
+        return TAG('g', 'u', 'r', 'u'); */
+    case SBScriptGURU:
+        return TAG('g', 'u', 'r', '2');
+    case SBScriptHANG:
+        return TAG('h', 'a', 'n', 'g');
+ /* case SBScriptJAMO:
+        return TAG('j', 'a', 'm', 'o'); */
+    case SBScriptHANO:
+        return TAG('h', 'a', 'n', 'o');
+    case SBScriptHATR:
+        return TAG('h', 'a', 't', 'r');
+    case SBScriptHEBR:
+        return TAG('h', 'e', 'b', 'r');
+    case SBScriptHIRA:
+        return TAG('k', 'a', 'n', 'a');
+    case SBScriptARMI:
+        return TAG('a', 'r', 'm', 'i');
+    case SBScriptPHLI:
+        return TAG('p', 'h', 'l', 'i');
+    case SBScriptPRTI:
+        return TAG('p', 'r', 't', 'i');
+    case SBScriptJAVA:
+        return TAG('j', 'a', 'v', 'a');
+    case SBScriptKTHI:
+        return TAG('k', 't', 'h', 'i');
+ /* case SBScriptKNDA:
+        return TAG('k', 'n', 'd', 'a'); */
+    case SBScriptKNDA:
+        return TAG('k', 'n', 'd', '2');
+    case SBScriptKANA:
+        return TAG('k', 'a', 'n', 'a');
+    case SBScriptKALI:
+        return TAG('k', 'a', 'l', 'i');
+    case SBScriptKHAR:
+        return TAG('k', 'h', 'a', 'r');
+    case SBScriptKHMR:
+        return TAG('k', 'h', 'm', 'r');
+    case SBScriptKHOJ:
+        return TAG('k', 'h', 'o', 'j');
+    case SBScriptSIND:
+        return TAG('s', 'i', 'n', 'd');
+    case SBScriptLAOO:
+        return TAG('l', 'a', 'o', ' ');
+    case SBScriptLATN:
+        return TAG('l', 'a', 't', 'n');
+    case SBScriptLEPC:
+        return TAG('l', 'e', 'p', 'c');
+    case SBScriptLIMB:
+        return TAG('l', 'i', 'm', 'b');
+    case SBScriptLINA:
+        return TAG('l', 'i', 'n', 'a');
+    case SBScriptLINB:
+        return TAG('l', 'i', 'n', 'b');
+    case SBScriptLISU:
+        return TAG('l', 'i', 's', 'u');
+    case SBScriptLYCI:
+        return TAG('l', 'y', 'c', 'i');
+    case SBScriptLYDI:
+        return TAG('l', 'y', 'd', 'i');
+    case SBScriptMAHJ:
+        return TAG('m', 'a', 'h', 'j');
+ /* case SBScriptMLYM:
+        return TAG('m', 'l', 'y', 'm'); */
+    case SBScriptMLYM:
+        return TAG('m', 'l', 'm', '2');
+    case SBScriptMAND:
+        return TAG('m', 'a', 'n', 'd');
+    case SBScriptMANI:
+        return TAG('m', 'a', 'n', 'i');
+    case SBScriptMARC:
+        return TAG('m', 'a', 'r', 'c');
+ /* case SBScriptMATH:
+        return TAG('m', 'a', 't', 'h'); */
+    case SBScriptMTEI:
+        return TAG('m', 't', 'e', 'i');
+    case SBScriptMEND:
+        return TAG('m', 'e', 'n', 'd');
+    case SBScriptMERC:
+        return TAG('m', 'e', 'r', 'c');
+    case SBScriptMERO:
+        return TAG('m', 'e', 'r', 'o');
+    case SBScriptPLRD:
+        return TAG('p', 'l', 'r', 'd');
+    case SBScriptMODI:
+        return TAG('m', 'o', 'd', 'i');
+    case SBScriptMONG:
+        return TAG('m', 'o', 'n', 'g');
+    case SBScriptMROO:
+        return TAG('m', 'r', 'o', 'o');
+    case SBScriptMULT:
+        return TAG('m', 'u', 'l', 't');
+ /* case SBScriptMUSC:
+        return TAG('m', 'u', 's', 'c'); */
+ /* case SBScriptMYMR:
+        return TAG('m', 'y', 'm', 'r'); */
+    case SBScriptMYMR:
+        return TAG('m', 'y', 'm', '2');
+    case SBScriptNBAT:
+        return TAG('n', 'b', 'a', 't');
+    case SBScriptNEWA:
+        return TAG('n', 'e', 'w', 'a');
+    case SBScriptTALU:
+        return TAG('t', 'a', 'l', 'u');
+    case SBScriptNKOO:
+        return TAG('n', 'k', 'o', ' ');
+ /* case SBScriptORYA:
+        return TAG('o', 'r', 'y', 'a'); */
+    case SBScriptORYA:
+        return TAG('o', 'r', 'y', '2');
+    case SBScriptOGAM:
+        return TAG('o', 'g', 'a', 'm');
+    case SBScriptOLCK:
+        return TAG('o', 'l', 'c', 'k');
+    case SBScriptITAL:
+        return TAG('i', 't', 'a', 'l');
+    case SBScriptHUNG:
+        return TAG('h', 'u', 'n', 'g');
+    case SBScriptNARB:
+        return TAG('n', 'a', 'r', 'b');
+    case SBScriptPERM:
+        return TAG('p', 'e', 'r', 'm');
+    case SBScriptXPEO:
+        return TAG('x', 'p', 'e', 'o');
+    case SBScriptSARB:
+        return TAG('s', 'a', 'r', 'b');
+    case SBScriptORKH:
+        return TAG('o', 'r', 'k', 'h');
+    case SBScriptOSGE:
+        return TAG('o', 's', 'g', 'e');
+    case SBScriptOSMA:
+        return TAG('o', 's', 'm', 'a');
+    case SBScriptHMNG:
+        return TAG('h', 'm', 'n', 'g');
+    case SBScriptPALM:
+        return TAG('p', 'a', 'l', 'm');
+    case SBScriptPAUC:
+        return TAG('p', 'a', 'u', 'c');
+    case SBScriptPHAG:
+        return TAG('p', 'h', 'a', 'g');
+    case SBScriptPHNX:
+        return TAG('p', 'h', 'n', 'x');
+    case SBScriptPHLP:
+        return TAG('p', 'h', 'l', 'p');
+    case SBScriptRJNG:
+        return TAG('r', 'j', 'n', 'g');
+    case SBScriptRUNR:
+        return TAG('r', 'u', 'n', 'r');
+    case SBScriptSAMR:
+        return TAG('s', 'a', 'm', 'r');
+    case SBScriptSAUR:
+        return TAG('s', 'a', 'u', 'r');
+    case SBScriptSHRD:
+        return TAG('s', 'h', 'r', 'd');
+    case SBScriptSHAW:
+        return TAG('s', 'h', 'a', 'w');
+    case SBScriptSIDD:
+        return TAG('s', 'i', 'd', 'd');
+    case SBScriptSGNW:
+        return TAG('s', 'g', 'n', 'w');
+    case SBScriptSINH:
+        return TAG('s', 'i', 'n', 'h');
+    case SBScriptSORA:
+        return TAG('s', 'o', 'r', 'a');
+    case SBScriptXSUX:
+        return TAG('x', 's', 'u', 'x');
+    case SBScriptSUND:
+        return TAG('s', 'u', 'n', 'd');
+    case SBScriptSYLO:
+        return TAG('s', 'y', 'l', 'o');
+    case SBScriptSYRC:
+        return TAG('s', 'y', 'r', 'c');
+    case SBScriptTGLG:
+        return TAG('t', 'g', 'l', 'g');
+    case SBScriptTAGB:
+        return TAG('t', 'a', 'g', 'b');
+    case SBScriptTALE:
+        return TAG('t', 'a', 'l', 'e');
+    case SBScriptLANA:
+        return TAG('l', 'a', 'n', 'a');
+    case SBScriptTAVT:
+        return TAG('t', 'a', 'v', 't');
+    case SBScriptTAKR:
+        return TAG('t', 'a', 'k', 'r');
+ /* case SBScriptTAML:
+        return TAG('t', 'a', 'm', 'l'); */
+    case SBScriptTAML:
+        return TAG('t', 'm', 'l', '2');
+    case SBScriptTANG:
+        return TAG('t', 'a', 'n', 'g');
+ /* case SBScriptTELU:
+        return TAG('t', 'e', 'l', 'u'); */
+    case SBScriptTELU:
+        return TAG('t', 'e', 'l', '2');
+    case SBScriptTHAA:
+        return TAG('t', 'h', 'a', 'a');
+    case SBScriptTHAI:
+        return TAG('t', 'h', 'a', 'i');
+    case SBScriptTIBT:
+        return TAG('t', 'i', 'b', 't');
+    case SBScriptTFNG:
+        return TAG('t', 'f', 'n', 'g');
+    case SBScriptTIRH:
+        return TAG('t', 'i', 'r', 'h');
+    case SBScriptUGAR:
+        return TAG('u', 'g', 'a', 'r');
+    case SBScriptVAII:
+        return TAG('v', 'a', 'i', ' ');
+    case SBScriptWARA:
+        return TAG('w', 'a', 'r', 'a');
+    case SBScriptYIII:
+        return TAG('y', 'i', ' ', ' ');
+    default:
+        return TAG('D', 'F', 'L', 'T');
+    }
+}
diff --git a/lib/sheenbidi/Source/SBBase.h b/lib/sheenbidi/Source/SBBase.h
new file mode 100644
index 000000000..00cc977f6
--- /dev/null
+++ b/lib/sheenbidi/Source/SBBase.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_BASE_H
+#define _SB_INTERNAL_BASE_H
+
+#include <SBBase.h>
+#include <SBBidiType.h>
+#include <SBCodepoint.h>
+#include <SBConfig.h>
+#include <SBGeneralCategory.h>
+#include <SBScript.h>
+
+/**
+ * A value that indicates an invalid unsigned index.
+ */
+#define SBInvalidIndex  (SBUInteger)(-1)
+
+SB_INTERNAL void SBUIntegerNormalizeRange(SBUInteger actualLength,
+    SBUInteger *rangeOffset, SBUInteger *rangeLength);
+
+SB_INTERNAL SBBoolean SBUIntegerVerifyRange(SBUInteger actualLength,
+    SBUInteger rangeOffset, SBUInteger rangeLength);
+
+
+#define SBNumberGetMax(first, second)           \
+(                                               \
+   (first) > (second)                           \
+ ? (first)                                      \
+ : (second)                                     \
+)
+
+#define SBNumberLimitIncrement(number, limit)   \
+(                                               \
+   (number) < (limit)                           \
+ ? (number) + (1)                               \
+ : (limit)                                      \
+)
+
+#define SBNumberLimitDecrement(number, limit)   \
+(                                               \
+   (number) > (limit)                           \
+ ? (number) - (1)                               \
+ : (limit)                                      \
+)
+
+#define SBNumberRingAdd(number, count, capacity) \
+    (((number) + (count)) % (capacity))
+
+#define SBNumberRingIncrement(number, capacity) \
+    SBNumberRingAdd(number, 1, capacity)
+
+#define SBNumberRingSubtract(number, count, capacity) \
+    (((number) + (capacity) - (count)) % (capacity))
+
+#define SBNumberRingDecrement(number, capacity) \
+    SBNumberRingSubtract(number, 1, capacity)
+
+
+#define SBLevelAsNormalBidiType(level)      \
+(                                           \
+   ((level) & 1)                            \
+ ? SBBidiTypeR                              \
+ : SBBidiTypeL                              \
+)
+
+#define SBLevelAsOppositeBidiType(level)    \
+(                                           \
+   ((level) & 1)                            \
+ ? SBBidiTypeL                              \
+ : SBBidiTypeR                              \
+)
+
+
+#define SBBidiTypeIsEqual(t1, t2)           ((t1) == (t2))
+
+#define SBBidiTypeIsNumber(t)               SBUInt8InRange(t, SBBidiTypeAN, SBBidiTypeEN)
+#define SBBidiTypeIsIsolate(t)              SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypePDI)
+
+#define SBBidiTypeIsStrongOrNumber(t)       (SBBidiTypeIsStrong(t) || SBBidiTypeIsNumber(t))
+#define SBBidiTypeIsNumberSeparator(t)      SBUInt8InRange(t, SBBidiTypeES, SBBidiTypeCS)
+#define SBBidiTypeIsIsolateInitiator(t)     SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypeFSI)
+#define SBBidiTypeIsIsolateTerminator(t)    SBBidiTypeIsEqual(t, SBBidiTypePDI)
+#define SBBidiTypeIsNeutralOrIsolate(t)     SBUInt8InRange(t, SBBidiTypeWS, SBBidiTypePDI)
+
+
+#define SBCodepointMax                      0x10FFFF
+#define SBCodepointInRange(v, s, e)         SBUInt32InRange(v, s, e)
+#define SBCodepointIsSurrogate(c)           SBCodepointInRange(c, 0xD800, 0xDFFF)
+#define SBCodepointIsValid(c)               (!SBCodepointIsSurrogate(c) && (c) <= SBCodepointMax)
+
+
+#define SBScriptIsCommonOrInherited(s)      ((s) <= SBScriptZYYY)
+
+#endif
diff --git a/lib/sheenbidi/Source/SBCodepointSequence.c b/lib/sheenbidi/Source/SBCodepointSequence.c
new file mode 100644
index 000000000..3828fa776
--- /dev/null
+++ b/lib/sheenbidi/Source/SBCodepointSequence.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2016-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+
+typedef struct {
+    SBUInt8 valid;
+    SBUInt8 total;
+    SBUInt8 start;
+    SBUInt8 end;
+} UTF8State;
+
+static const UTF8State UTF8StateTable[9] = {
+    {1,0,0x00,0x00}, {0,0,0x00,0x00}, {1,2,0x80,0xBF}, {1,3,0xA0,0xBF}, {1,3,0x80,0xBF},
+    {1,3,0x80,0x9F}, {1,4,0x90,0xBF}, {1,4,0x80,0xBF}, {1,4,0x80,0x8F}
+};
+
+static const SBUInt8 UTF8LookupTable[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+/* LEAD: -- 80..BF -- */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1,
+/* LEAD: -- C0..C1 -- */
+    1, 1,
+/* LEAD: -- C2..DF -- */
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+/* LEAD: -- E0..E0 -- */
+    3,
+/* LEAD: -- E1..EC -- */
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+/* LEAD: -- ED..ED -- */
+    5,
+/* LEAD: -- EE..EF -- */
+    4, 4,
+/* LEAD: -- F0..F0 -- */
+    6,
+/* LEAD: -- F1..F3 -- */
+    7, 7, 7,
+/* LEAD: -- F4..F4 -- */
+    8,
+/* LEAD: -- F5..F7 -- */
+    1, 1, 1,
+/* LEAD: -- F8..FB -- */
+    1, 1, 1, 1,
+/* LEAD: -- FC..FD -- */
+    1, 1,
+/* LEAD: -- FE..FF -- */
+    1, 1
+};
+
+static SBCodepoint GetUTF8CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+static SBCodepoint GetUTF8CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+static SBCodepoint GetUTF16CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+static SBCodepoint GetUTF16CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+static SBCodepoint GetUTF32CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+static SBCodepoint GetUTF32CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex);
+
+SB_INTERNAL SBBoolean SBCodepointSequenceIsValid(const SBCodepointSequence *codepointSequence)
+{
+    if (codepointSequence) {
+        SBBoolean encodingValid = SBFalse;
+
+        switch (codepointSequence->stringEncoding) {
+        case SBStringEncodingUTF8:
+        case SBStringEncodingUTF16:
+        case SBStringEncodingUTF32:
+            encodingValid = SBTrue;
+            break;
+        }
+
+        return (encodingValid && codepointSequence->stringBuffer && codepointSequence->stringLength > 0);
+    }
+
+    return SBFalse;
+}
+
+SBCodepoint SBCodepointSequenceGetCodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex)
+{
+    SBCodepoint codepoint = SBCodepointInvalid;
+
+    if ((*stringIndex - 1) < codepointSequence->stringLength) {
+        switch (codepointSequence->stringEncoding) {
+        case SBStringEncodingUTF8:
+            codepoint = GetUTF8CodepointBefore(codepointSequence, stringIndex);
+            break;
+
+        case SBStringEncodingUTF16:
+            codepoint = GetUTF16CodepointBefore(codepointSequence, stringIndex);
+            break;
+
+        case SBStringEncodingUTF32:
+            codepoint = GetUTF32CodepointBefore(codepointSequence, stringIndex);
+            break;
+        }
+    }
+
+    return codepoint;
+}
+
+SBCodepoint SBCodepointSequenceGetCodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex)
+{
+    SBCodepoint codepoint = SBCodepointInvalid;
+
+    if (*stringIndex < codepointSequence->stringLength) {
+        switch (codepointSequence->stringEncoding) {
+        case SBStringEncodingUTF8:
+            codepoint = GetUTF8CodepointAt(codepointSequence, stringIndex);
+            break;
+
+        case SBStringEncodingUTF16:
+            codepoint = GetUTF16CodepointAt(codepointSequence, stringIndex);
+            break;
+
+        case SBStringEncodingUTF32:
+            codepoint = GetUTF32CodepointAt(codepointSequence, stringIndex);
+            break;
+        }
+    }
+
+    return codepoint;
+}
+
+static SBCodepoint GetUTF8CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt8 *buffer = sequence->stringBuffer;
+    SBUInteger length = sequence->stringLength;
+    SBUInt8 lead;
+    UTF8State state;
+    SBUInteger limit;
+    SBCodepoint codepoint;
+
+    lead = buffer[*index];
+    state = UTF8StateTable[UTF8LookupTable[lead]];
+    limit = *index + state.total;
+
+    if (limit > length) {
+        limit = length;
+        state.valid = SBFalse;
+    }
+
+    codepoint = lead & (0x7F >> state.total);
+
+    while (++(*index) < limit) {
+        SBUInt8 byte = buffer[*index];
+
+        if (byte >= state.start && byte <= state.end) {
+            codepoint = (codepoint << 6) | (byte & 0x3F);
+        } else {
+            state.valid = SBFalse;
+            break;
+        }
+
+        state.start = 0x80;
+        state.end = 0xBF;
+    }
+
+    if (state.valid) {
+        return codepoint;
+    }
+
+    return SBCodepointFaulty;
+}
+
+static SBCodepoint GetUTF8CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt8 *buffer = sequence->stringBuffer;
+    SBUInteger startIndex = *index;
+    SBUInteger limitIndex;
+    SBUInteger continuation;
+    SBCodepoint codepoint;
+
+    continuation = 7;
+
+    while (--continuation && --startIndex) {
+        SBUInt8 codeunit = buffer[startIndex];
+
+        if ((codeunit & 0xC0) != 0x80) {
+            break;
+        }
+    }
+
+    limitIndex = startIndex;
+    codepoint = GetUTF8CodepointAt(sequence, &limitIndex);
+
+    if (limitIndex == *index) {
+        *index = startIndex;
+    } else {
+        codepoint = SBCodepointFaulty;
+        *index -= 1;
+    }
+
+    return codepoint;
+}
+
+static SBCodepoint GetUTF16CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt16 *buffer = sequence->stringBuffer;
+    SBUInteger length = sequence->stringLength;
+    SBCodepoint codepoint;
+    SBUInt16 lead;
+
+    codepoint = SBCodepointFaulty;
+
+    lead = buffer[*index];
+    *index += 1;
+
+    if (!SBCodepointIsSurrogate(lead)) {
+        codepoint = lead;
+    } else if (lead <= 0xDBFF) {
+        if (*index < length) {
+            SBUInt16 trail = buffer[*index];
+
+            if (SBUInt16InRange(trail, 0xDC00, 0xDFFF)) {
+                codepoint = (lead << 10) + trail - ((0xD800 << 10) + 0xDC00 - 0x10000);
+                *index += 1;
+            }
+        }
+    }
+
+    return codepoint;
+}
+
+static SBCodepoint GetUTF16CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt16 *buffer = sequence->stringBuffer;
+    SBCodepoint codepoint;
+    SBUInt16 trail;
+
+    codepoint = SBCodepointFaulty;
+
+    *index -= 1;
+    trail = buffer[*index];
+
+    if (!SBCodepointIsSurrogate(trail)) {
+        codepoint = trail;
+    } else if (trail >= 0xDC00) {
+        if (*index > 0) {
+            SBUInt16 lead = buffer[*index - 1];
+
+            if (SBUInt16InRange(lead, 0xD800, 0xDBFF)) {
+                codepoint = (lead << 10) + trail - ((0xD800 << 10) + 0xDC00 - 0x10000);
+                *index -= 1;
+            }
+        }
+    }
+    
+    return codepoint;
+}
+
+static SBCodepoint GetUTF32CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt32 *buffer = sequence->stringBuffer;
+    SBCodepoint codepoint;
+
+    codepoint = buffer[*index];
+    *index += 1;
+
+    if (SBCodepointIsValid(codepoint)) {
+        return codepoint;
+    }
+    
+    return SBCodepointFaulty;
+}
+
+static SBCodepoint GetUTF32CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index)
+{
+    const SBUInt32 *buffer = sequence->stringBuffer;
+    SBCodepoint codepoint;
+
+    *index -= 1;
+    codepoint = buffer[*index];
+
+    if (SBCodepointIsValid(codepoint)) {
+        return codepoint;
+    }
+
+    return SBCodepointFaulty;
+}
diff --git a/lib/sheenbidi/Source/SBCodepointSequence.h b/lib/sheenbidi/Source/SBCodepointSequence.h
new file mode 100644
index 000000000..e5967c450
--- /dev/null
+++ b/lib/sheenbidi/Source/SBCodepointSequence.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_CODEPOINT_SEQUENCE_H
+#define _SB_INTERNAL_CODEPOINT_SEQUENCE_H
+
+#include <SBConfig.h>
+#include <SBCodepointSequence.h>
+
+SB_INTERNAL SBBoolean SBCodepointSequenceIsValid(const SBCodepointSequence *codepointSequence);
+
+#endif
diff --git a/lib/sheenbidi/Source/SBLine.c b/lib/sheenbidi/Source/SBLine.c
new file mode 100644
index 000000000..8de303768
--- /dev/null
+++ b/lib/sheenbidi/Source/SBLine.c
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "PairingLookup.h"
+#include "SBAlgorithm.h"
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+#include "SBParagraph.h"
+#include "SBRun.h"
+#include "SBLine.h"
+
+typedef struct _LineContext {
+    const SBBidiType *refTypes;
+    SBLevel *fixedLevels;
+    SBUInteger runCount;
+    SBLevel maxLevel;
+} LineContext, *LineContextRef;
+
+static SBLevel CopyLevels(SBLevel *destination,
+    const SBLevel *source, SBUInteger length, SBUInteger *runCount)
+{
+    SBLevel lastLevel = SBLevelInvalid;
+    SBLevel maxLevel = 0;
+    SBUInteger totalRuns = 0;
+
+    while (length--) {
+        SBLevel level = *(source++);
+        *(destination++) = level;
+
+        if (level != lastLevel) {
+            totalRuns += 1;
+
+            if (level > maxLevel) {
+                maxLevel = level;
+            }
+        }
+    }
+
+    *runCount = totalRuns;
+
+    return maxLevel;
+}
+
+static LineContextRef CreateLineContext(const SBBidiType *types, const SBLevel *levels, SBUInteger length)
+{
+    const SBUInteger sizeContext = sizeof(LineContext);
+    const SBUInteger sizeLevels  = sizeof(SBLevel) * length;
+    const SBUInteger sizeMemory  = sizeContext + sizeLevels;
+
+    const SBUInteger offsetContext = 0;
+    const SBUInteger offsetLevels  = offsetContext + sizeContext;
+
+    SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory);
+    LineContextRef context = (LineContextRef)(memory + offsetContext);
+    SBLevel *fixedLevels = (SBLevel *)(memory + offsetLevels);
+
+    context->refTypes = types;
+    context->fixedLevels = fixedLevels;
+    context->maxLevel = CopyLevels(fixedLevels, levels, length, &context->runCount);
+
+    return context;
+}
+
+static void DisposeLineContext(LineContextRef context)
+{
+    free(context);
+}
+
+static SBLineRef AllocateLine(SBUInteger runCount)
+{
+    const SBUInteger sizeLine   = sizeof(SBLine);
+    const SBUInteger sizeRuns   = sizeof(SBRun) * runCount;
+    const SBUInteger sizeMemory = sizeLine + sizeRuns;
+
+    const SBUInteger offsetLine = 0;
+    const SBUInteger offsetRuns = offsetLine + sizeLine;
+
+    SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory);
+    SBLineRef line = (SBLineRef)(memory + offsetLine);
+    SBRun *runs = (SBRun *)(memory + offsetRuns);
+
+    line->fixedRuns = runs;
+
+    return line;
+}
+
+static void SetNewLevel(SBLevel *levels, SBUInteger length, SBLevel newLevel)
+{
+    SBUInteger index = length;
+
+    while (index--) {
+        levels[index] = newLevel;
+    }
+}
+
+static void ResetLevels(LineContextRef context, SBLevel baseLevel, SBUInteger charCount)
+{
+    const SBBidiType *types = context->refTypes;
+    SBLevel *levels = context->fixedLevels;
+    SBUInteger index;
+    SBUInteger length;
+    SBBoolean reset;
+
+    index = charCount;
+    length = 0;
+    reset = SBTrue;
+
+    while (index--) {
+        SBBidiType type = types[index];
+
+        switch (type) {
+        case SBBidiTypeB:
+        case SBBidiTypeS:
+            SetNewLevel(levels + index, length + 1, baseLevel);
+            length = 0;
+            reset = SBTrue;
+            context->runCount += 1;
+            break;
+
+        case SBBidiTypeLRE:
+        case SBBidiTypeRLE:
+        case SBBidiTypeLRO:
+        case SBBidiTypeRLO:
+        case SBBidiTypePDF:
+        case SBBidiTypeBN:
+            length += 1;
+            break;
+
+        case SBBidiTypeWS:
+        case SBBidiTypeLRI:
+        case SBBidiTypeRLI:
+        case SBBidiTypeFSI:
+        case SBBidiTypePDI:
+            if (reset) {
+                SetNewLevel(levels + index, length + 1, baseLevel);
+                length = 0;
+
+                context->runCount += 1;
+            }
+            break;
+
+        default:
+            length = 0;
+            reset = SBFalse;
+            break;
+        }
+    }
+}
+
+static SBUInteger InitializeRuns(SBRun *runs,
+    const SBLevel *levels, SBUInteger length, SBUInteger lineOffset)
+{
+    SBUInteger index;
+    SBUInteger runCount = 1;
+
+    (*runs).offset = lineOffset;
+    (*runs).level = levels[0];
+
+    for (index = 0; index < length; index++) {
+        SBLevel level = levels[index];
+
+        if (level != (*runs).level) {
+            (*runs).length = index + lineOffset - (*runs).offset;
+
+            ++runs;
+            (*runs).offset = lineOffset + index;
+            (*runs).level = level;
+
+            runCount += 1;
+        }
+    }
+
+    (*runs).length = index + lineOffset - (*runs).offset;
+
+    return runCount;
+}
+
+static void ReverseRunSequence(SBRun *runs, SBUInteger runCount)
+{
+    SBUInteger halfCount = runCount / 2;
+    SBUInteger finalIndex = runCount - 1;
+    SBUInteger index;
+
+    for (index = 0; index < halfCount; index++) {
+        SBUInteger tieIndex;
+        SBRun tempRun;
+
+        tieIndex = finalIndex - index;
+
+        tempRun = runs[index];
+        runs[index] = runs[tieIndex];
+        runs[tieIndex] = tempRun;
+    }
+}
+
+static void ReorderRuns(SBRun *runs, SBUInteger runCount, SBLevel maxLevel)
+{
+    SBLevel newLevel;
+
+    for (newLevel = maxLevel; newLevel; newLevel--) {
+        SBUInteger start = runCount;
+
+        while (start--) {
+            if (runs[start].level >= newLevel) {
+                SBUInteger count = 1;
+
+                for (; start && runs[start - 1].level >= newLevel; start--) {
+                    count += 1;
+                }
+
+                ReverseRunSequence(runs + start, count);
+            }
+        }
+    }
+}
+
+SB_INTERNAL SBLineRef SBLineCreate(SBParagraphRef paragraph,
+    SBUInteger lineOffset, SBUInteger lineLength)
+{
+    SBUInteger innerOffset = lineOffset - paragraph->offset;
+    const SBBidiType *refTypes = paragraph->refTypes + innerOffset;
+    const SBLevel *refLevels = paragraph->fixedLevels + innerOffset;
+    LineContextRef context;
+    SBLineRef line;
+
+    /* Line range MUST be valid. */
+    SBAssert(lineOffset < (lineOffset + lineLength)
+             && lineOffset >= paragraph->offset
+             && (lineOffset + lineLength) <= (paragraph->offset + paragraph->length));
+
+    context = CreateLineContext(refTypes, refLevels, lineLength);
+    ResetLevels(context, paragraph->baseLevel, lineLength);
+
+    line = AllocateLine(context->runCount);
+    line->runCount = InitializeRuns(line->fixedRuns, context->fixedLevels, lineLength, lineOffset);
+    ReorderRuns(line->fixedRuns, line->runCount, context->maxLevel);
+
+    line->codepointSequence = paragraph->algorithm->codepointSequence;
+    line->offset = lineOffset;
+    line->length = lineLength;
+    line->retainCount = 1;
+
+    DisposeLineContext(context);
+
+    return line;
+}
+
+SBUInteger SBLineGetOffset(SBLineRef line)
+{
+    return line->offset;
+}
+
+SBUInteger SBLineGetLength(SBLineRef line)
+{
+    return line->length;
+}
+
+SBUInteger SBLineGetRunCount(SBLineRef line)
+{
+    return line->runCount;
+}
+
+const SBRun *SBLineGetRunsPtr(SBLineRef line)
+{
+    return line->fixedRuns;
+}
+
+SBLineRef SBLineRetain(SBLineRef line)
+{
+    if (line) {
+        line->retainCount += 1;
+    }
+    
+    return line;
+}
+
+void SBLineRelease(SBLineRef line)
+{
+    if (line && --line->retainCount == 0) {
+        free(line);
+    }
+}
diff --git a/lib/sheenbidi/Source/SBLine.h b/lib/sheenbidi/Source/SBLine.h
new file mode 100644
index 000000000..6ecf10365
--- /dev/null
+++ b/lib/sheenbidi/Source/SBLine.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_LINE_H
+#define _SB_INTERNAL_LINE_H
+
+#include <SBBase.h>
+#include <SBCodepointSequence.h>
+#include <SBConfig.h>
+#include <SBLine.h>
+#include <SBParagraph.h>
+#include <SBRun.h>
+
+typedef struct _SBLine {
+    SBCodepointSequence codepointSequence;
+    SBRun *fixedRuns;
+    SBUInteger runCount;
+    SBUInteger offset;
+    SBUInteger length;
+    SBUInteger retainCount;
+} SBLine;
+
+SB_INTERNAL SBLineRef SBLineCreate(SBParagraphRef paragraph,
+    SBUInteger lineOffset, SBUInteger lineLength);
+
+#endif
diff --git a/lib/sheenbidi/Source/SBLog.c b/lib/sheenbidi/Source/SBLog.c
new file mode 100644
index 000000000..a77591fef
--- /dev/null
+++ b/lib/sheenbidi/Source/SBLog.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#ifdef SB_CONFIG_LOG
+
+#include "SBBase.h"
+#include "SBBidiChain.h"
+#include "SBBidiType.h"
+#include "SBIsolatingRun.h"
+#include "SBLog.h"
+
+int _SBLogPosition = 0;
+
+SB_INTERNAL void PrintBaseLevel(SBLevel baseLevel)
+{
+    switch (baseLevel) {
+    case SBLevelDefaultLTR:
+        SB_LOG_STRING("Auto-LTR");
+        break;
+
+    case SBLevelDefaultRTL:
+        SB_LOG_STRING("Auto-RTL");
+        break;
+
+    case 0:
+        SB_LOG_STRING("LTR");
+        break;
+
+    case 1:
+        SB_LOG_STRING("RTL");
+        break;
+
+    default:
+        SB_LOG(("Level - %d", baseLevel));
+        break;
+    }
+}
+
+SB_INTERNAL void PrintBidiType(SBBidiType type)
+{
+    switch (type) {
+    case SBBidiTypeNil:
+        SB_LOG_STRING("Nil");
+        break;
+
+    case SBBidiTypeL:
+        SB_LOG_STRING("L");
+        break;
+
+    case SBBidiTypeR:
+        SB_LOG_STRING("R");
+        break;
+
+    case SBBidiTypeAL:
+        SB_LOG_STRING("AL");
+        break;
+
+    case SBBidiTypeEN:
+        SB_LOG_STRING("EN");
+        break;
+
+    case SBBidiTypeES:
+        SB_LOG_STRING("ES");
+        break;
+
+    case SBBidiTypeET:
+        SB_LOG_STRING("EN");
+        break;
+
+    case SBBidiTypeAN:
+        SB_LOG_STRING("AN");
+        break;
+
+    case SBBidiTypeCS:
+        SB_LOG_STRING("CS");
+        break;
+
+    case SBBidiTypeNSM:
+        SB_LOG_STRING("NSM");
+        break;
+
+    case SBBidiTypeBN:
+        SB_LOG_STRING("BN");
+        break;
+
+    case SBBidiTypeB:
+        SB_LOG_STRING("B");
+        break;
+
+    case SBBidiTypeS:
+        SB_LOG_STRING("S");
+        break;
+
+    case SBBidiTypeWS:
+        SB_LOG_STRING("WS");
+        break;
+
+    case SBBidiTypeON:
+        SB_LOG_STRING("ON");
+        break;
+
+    case SBBidiTypeLRE:
+        SB_LOG_STRING("LRE");
+        break;
+
+    case SBBidiTypeRLE:
+        SB_LOG_STRING("RLE");
+        break;
+
+    case SBBidiTypeLRO:
+        SB_LOG_STRING("LRO");
+        break;
+
+    case SBBidiTypeRLO:
+        SB_LOG_STRING("RLO");
+        break;
+
+    case SBBidiTypePDF:
+        SB_LOG_STRING("PDF");
+        break;
+
+    case SBBidiTypeLRI:
+        SB_LOG_STRING("LRI");
+        break;
+
+    case SBBidiTypeRLI:
+        SB_LOG_STRING("RLI");
+        break;
+
+    case SBBidiTypeFSI:
+        SB_LOG_STRING("FSI");
+        break;
+
+    case SBBidiTypePDI:
+        SB_LOG_STRING("PDI");
+        break;
+    }
+}
+
+SB_INTERNAL void PrintCodepointSequence(const SBCodepointSequence *codepointSequence)
+{
+    SBUInteger stringIndex = 0;
+    SBCodepoint codepoint;
+
+    while ((codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex)) != SBCodepointInvalid) {
+        SB_LOG(("%04X ", codepoint));
+    }
+}
+
+SB_INTERNAL void PrintBidiTypesArray(SBBidiType *types, SBUInteger length)
+{
+    SBUInteger index;
+
+    for (index = 0; index < length; ++index) {
+        SB_LOG_BIDI_TYPE(types[index]);
+        SB_LOG_DIVIDER(1);
+    }
+}
+
+SB_INTERNAL void PrintLevelsArray(SBLevel *levels, SBUInteger length)
+{
+    SBUInteger index;
+
+    for (index = 0; index < length; ++index) {
+        SB_LOG_LEVEL(levels[index]);
+        SB_LOG_DIVIDER(1);
+    }
+}
+
+typedef struct {
+    void *object;
+    BidiLink link;
+    SBUInteger length;
+} IsolatingContext;
+
+typedef void (*IsolatingConsumer)(IsolatingRunRef isolatingRun, IsolatingContext *context);
+
+SB_INTERNAL void IsolatingRunForEach(IsolatingRunRef isolatingRun,
+    IsolatingContext *context, IsolatingConsumer consumer)
+{
+    BidiChainRef bidiChain = isolatingRun->bidiChain;
+    LevelRunRef levelRun;
+
+    /* Iterate over individual level runs of the isolating run. */
+    for (levelRun = isolatingRun->baseLevelRun; levelRun; levelRun = levelRun->next) {
+        BidiLink breakLink = BidiChainGetNext(bidiChain, levelRun->lastLink);
+        BidiLink currentLink = levelRun->firstLink;
+        BidiLink subsequentLink = levelRun->subsequentLink;
+
+        /* Iterate over each link of the level run. */
+        while (currentLink != breakLink) {
+            BidiLink nextLink = BidiChainGetNext(bidiChain, currentLink);
+            SBUInteger linkOffset = BidiChainGetOffset(bidiChain, currentLink);
+            SBUInteger linkLength;
+            SBUInteger index;
+
+            if (nextLink != breakLink) {
+                linkLength = BidiChainGetOffset(bidiChain, nextLink) - linkOffset;
+            } else {
+                linkLength = BidiChainGetOffset(bidiChain, subsequentLink) - linkOffset;
+            }
+
+            /* Skip any sequence of BN character types. */
+            for (index = 1; index < linkLength; index++) {
+                SBBidiType bidiType = BidiChainGetType(bidiChain, currentLink + index);
+                if (bidiType == SBBidiTypeBN) {
+                    linkLength = index;
+                    break;
+                }
+            }
+
+            context->link = currentLink;
+            context->length = linkLength;
+            consumer(isolatingRun, context);
+            
+            currentLink = nextLink;
+        }
+    }
+}
+
+static void PrintTypesOperation(IsolatingRunRef isolatingRun, IsolatingContext *context)
+{
+    SBBidiType bidiType = BidiChainGetType(isolatingRun->bidiChain, context->link);
+
+    while (context->length--) {
+        SB_LOG_BIDI_TYPE(bidiType);
+        SB_LOG_DIVIDER(1);
+    }
+}
+
+SB_INTERNAL void PrintRunTypes(IsolatingRunRef isolatingRun)
+{
+    IsolatingContext context;
+    IsolatingRunForEach(isolatingRun, &context, _SBPrintTypesOperation);
+}
+
+static void PrintLevelsOperation(IsolatingRunRef isolatingRun, IsolatingContext *context)
+{
+    SBLevel charLevel = BidiChainGetLevel(isolatingRun->bidiChain, context->link);
+
+    while (context->length--) {
+        SB_LOG_LEVEL(charLevel);
+        SB_LOG_DIVIDER(1);
+    }
+}
+
+SB_INTERNAL void PrintRunLevels(IsolatingRunRef isolatingRun)
+{
+    IsolatingContext context;
+    IsolatingRunForEach(isolatingRun, &context, _SBPrintLevelsOperation);
+}
+
+typedef struct {
+    SBUInteger offset;
+    SBUInteger length;
+} IsolatingRange;
+
+static void PrintRangeOperation(IsolatingRunRef isolatingRun, IsolatingContext *context)
+{
+    IsolatingRange *range = context->object;
+    SBUInteger offset = BidiChainGetOffset(isolatingRun->bidiChain, context->link);
+
+    if (range->length == 0) {
+        range->offset = offset;
+        range->length = context->length;
+    } else if (offset == (range->offset + range->length)) {
+        range->length += context->length;
+    } else {
+        SB_LOG_RANGE(range->offset, range->length);
+        SB_LOG_DIVIDER(1);
+
+        range->offset = offset;
+        range->length = context->length;
+    }
+}
+
+SB_INTERNAL void PrintRunRange(IsolatingRunRef isolatingRun)
+{
+    IsolatingRange range = { 0, 0 };
+    IsolatingContext context;
+    context.object = &range;
+
+    IsolatingRunForEach(isolatingRun, &context, _SBPrintRangeOperation);
+    SB_LOG_RANGE(range.offset, range.length);
+    SB_LOG_DIVIDER(1);
+}
+
+#endif
diff --git a/lib/sheenbidi/Source/SBLog.h b/lib/sheenbidi/Source/SBLog.h
new file mode 100644
index 000000000..5c70508fe
--- /dev/null
+++ b/lib/sheenbidi/Source/SBLog.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_LOG_H
+#define _SB_INTERNAL_LOG_H
+
+#include <SBConfig.h>
+
+#ifdef SB_CONFIG_LOG
+
+#include <stdio.h>
+
+#include "SBBase.h"
+#include "SBBidiType.h"
+#include "SBCodepointSequence.h"
+#include "SBIsolatingRun.h"
+
+SB_INTERNAL void PrintBaseLevel(SBLevel baseLevel);
+SB_INTERNAL void PrintBidiType(SBBidiType type);
+
+SB_INTERNAL void PrintCodepointSequence(const SBCodepointSequence *codepointSequence);
+SB_INTERNAL void PrintBidiTypesArray(SBBidiType *types, SBUInteger length);
+SB_INTERNAL void PrintLevelsArray(SBLevel *levels, SBUInteger length);
+
+SB_INTERNAL void PrintRunTypes(IsolatingRunRef isolatingRun);
+SB_INTERNAL void PrintRunLevels(IsolatingRunRef isolatingRun);
+SB_INTERNAL void PrintRunRange(IsolatingRunRef isolatingRun);
+
+extern int _SBLogPosition;
+
+#define SB_LOG_BEGIN()                  (++_SBLogPosition)
+#define SB_LOG_END()                    (--_SBLogPosition)
+
+#define SB_LOG(s)                       printf s
+
+#define SB_LOG_NUMBER(n)                \
+SB_LOG(("%ld", (long)n))
+
+#define SB_LOG_RANGE(o, l)              \
+SB_LOG(("[%ld, %ld]", (long)o, (long)(o + l - 1)))
+
+#define SB_LOG_CHAR(c)                  \
+SBLOG(("%c", c))
+
+#define SB_LOG_STRING(s)                \
+SB_LOG(("%s", s))
+
+#define SB_LOG_LEVEL(l)                 \
+SB_LOG_NUMBER(l)
+
+#define SB_LOG_BREAKER()                \
+SB_LOG(("\n"))
+
+#define SB_LOG_DIVIDER(n)               \
+SB_LOG(("%.*s", n, "\t\t\t\t\t\t\t\t\t\t"))
+
+#define SB_LOG_INITIATOR()              \
+SB_LOG_DIVIDER(_SBLogPosition)
+
+#define SB_LOG_CAPTION(c)               \
+SB_LOG((c":"))
+
+#define SB_LOG_STATEMENT_TEXT(t)        \
+(t)
+
+#define SB_LOG_LINE(s)                  \
+do {                                    \
+    SB_LOG(s);                          \
+    SB_LOG_BREAKER();                   \
+} while (0)
+
+#define SB_LOG_STATEMENT(c, d, t)       \
+do {                                    \
+    SB_LOG_INITIATOR();                 \
+    SB_LOG_CAPTION(c);                  \
+    SB_LOG_DIVIDER(d);                  \
+    SB_LOG_STATEMENT_TEXT(t);           \
+    SB_LOG_BREAKER();                   \
+} while (0)
+
+#define SB_LOG_BLOCK_OPENER(c)          \
+do {                                    \
+    SB_LOG_INITIATOR();                 \
+    SB_LOG_CAPTION(c);                  \
+    SB_LOG_BREAKER();                   \
+    SB_LOG_BEGIN();                     \
+} while (0)
+
+#define SB_LOG_BLOCK_CLOSER()           SB_LOG_END()
+
+#define SB_LOG_BASE_LEVEL(l)            PrintBaseLevel(l)
+#define SB_LOG_BIDI_TYPE(t)             PrintBidiType(t)
+
+#define SB_LOG_CODEPOINT_SEQUENCE(s)    PrintCodepointSequence(s)
+#define SB_LOG_BIDI_TYPES_ARRAY(a, l)   PrintBidiTypesArray(a, l)
+#define SB_LOG_LEVELS_ARRAY(a, l)       PrintLevelsArray(a, l)
+
+#define SB_LOG_RUN_TYPES(r)             PrintRunTypes(r)
+#define SB_LOG_RUN_LEVELS(r)            PrintRunLevels(r)
+#define SB_LOG_RUN_RANGE(r)             PrintRunRange(r)
+
+#else
+
+#define SB_LOG_NONE()
+
+#define SB_LOG(s)                       SB_LOG_NONE()
+
+#define SB_LOG_NUMBER(n)                SB_LOG_NONE()
+#define SB_LOG_RANGE(o, l)              SB_LOG_NONE()
+#define SB_LOG_CHAR(c)                  SB_LOG_NONE()
+#define SB_LOG_STRING(s)                SB_LOG_NONE()
+#define SB_LOG_LEVEL(l)                 SB_LOG_NONE()
+
+#define SB_LOG_BREAKER()                SB_LOG_NONE()
+#define SB_LOG_DIVIDER(n)               SB_LOG_NONE()
+#define SB_LOG_INITIATOR()              SB_LOG_NONE()
+#define SB_LOG_CAPTION(c)               SB_LOG_NONE()
+#define SB_LOG_STATEMENT_TEXT(t)        SB_LOG_NONE()
+
+#define SB_LOG_LINE(s)                  SB_LOG_NONE()
+#define SB_LOG_STATEMENT(c, d, t)       SB_LOG_NONE()
+
+#define SB_LOG_BLOCK_OPENER(c)          SB_LOG_NONE()
+#define SB_LOG_BLOCK_CLOSER()           SB_LOG_NONE()
+
+#define SB_LOG_BASE_LEVEL(l)            SB_LOG_NONE()
+#define SB_LOG_BIDI_TYPE(t)             SB_LOG_NONE()
+
+#define SB_LOG_CODEPOINT_SEQUENCE(s)    SB_LOG_NONE()
+#define SB_LOG_BIDI_TYPES_ARRAY(a, l)   SB_LOG_NONE()
+#define SB_LOG_LEVELS_ARRAY(a, l)       SB_LOG_NONE()
+
+#define SB_LOG_RUN_TYPES(r)             SB_LOG_NONE()
+#define SB_LOG_RUN_LEVELS(r)            SB_LOG_NONE()
+
+#define SB_LOG_RUN_RANGE(r)             SB_LOG_NONE()
+
+#endif
+
+#endif
diff --git a/lib/sheenbidi/Source/SBMirrorLocator.c b/lib/sheenbidi/Source/SBMirrorLocator.c
new file mode 100644
index 000000000..b926cb37b
--- /dev/null
+++ b/lib/sheenbidi/Source/SBMirrorLocator.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "PairingLookup.h"
+#include "SBBase.h"
+#include "SBLine.h"
+#include "SBMirrorLocator.h"
+
+SBMirrorLocatorRef SBMirrorLocatorCreate(void)
+{
+    SBMirrorLocatorRef locator;
+
+    locator = malloc(sizeof(SBMirrorLocator));
+    locator->_line = NULL;
+    locator->retainCount = 1;
+    SBMirrorLocatorReset(locator);
+
+    return locator;
+}
+
+void SBMirrorLocatorLoadLine(SBMirrorLocatorRef locator, SBLineRef line, void *stringBuffer)
+{
+    SBLineRelease(locator->_line);
+
+    if (line && stringBuffer == line->codepointSequence.stringBuffer) {
+        locator->_line = SBLineRetain(line);
+    }
+
+    SBMirrorLocatorReset(locator);
+}
+
+const SBMirrorAgent *SBMirrorLocatorGetAgent(SBMirrorLocatorRef locator)
+{
+    return &locator->agent;
+}
+
+SBBoolean SBMirrorLocatorMoveNext(SBMirrorLocatorRef locator)
+{
+    SBLineRef line = locator->_line;
+
+    if (line) {
+        const SBCodepointSequence *sequence = &line->codepointSequence;
+
+        do {
+            const SBRun *run = &line->fixedRuns[locator->_runIndex];
+
+            if (run->level & 1) {
+                SBUInteger stringIndex;
+                SBUInteger stringLimit;
+
+                stringIndex = locator->_stringIndex;
+                if (stringIndex == SBInvalidIndex) {
+                    stringIndex = run->offset;
+                }
+                stringLimit = run->offset + run->length;
+
+                while (stringIndex < stringLimit) {
+                    SBUInteger initialIndex = stringIndex;
+                    SBCodepoint codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex);
+                    SBCodepoint mirror = LookupMirror(codepoint);
+
+                    if (mirror) {
+                        locator->_stringIndex = stringIndex;
+                        locator->agent.index = initialIndex;
+                        locator->agent.mirror = mirror;
+                        locator->agent.codepoint = codepoint;
+
+                        return SBTrue;
+                    }
+                }
+            }
+            
+            locator->_stringIndex = SBInvalidIndex;
+        } while (++locator->_runIndex < line->runCount);
+        
+        SBMirrorLocatorReset(locator);
+    }
+    
+    return SBFalse;
+}
+
+void SBMirrorLocatorReset(SBMirrorLocatorRef locator)
+{
+    locator->_runIndex = 0;
+    locator->_stringIndex = SBInvalidIndex;
+    locator->agent.index = SBInvalidIndex;
+    locator->agent.mirror = 0;
+}
+
+SBMirrorLocatorRef SBMirrorLocatorRetain(SBMirrorLocatorRef locator)
+{
+    if (locator) {
+        locator->retainCount += 1;
+    }
+
+    return locator;
+}
+
+void SBMirrorLocatorRelease(SBMirrorLocatorRef locator)
+{
+    if (locator && --locator->retainCount == 0) {
+        SBLineRelease(locator->_line);
+        free(locator);
+    }
+}
diff --git a/lib/sheenbidi/Source/SBMirrorLocator.h b/lib/sheenbidi/Source/SBMirrorLocator.h
new file mode 100644
index 000000000..2f4463a68
--- /dev/null
+++ b/lib/sheenbidi/Source/SBMirrorLocator.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_MIRROR_LOCATOR_H
+#define _SB_INTERNAL_MIRROR_LOCATOR_H
+
+#include <SBBase.h>
+#include <SBMirrorLocator.h>
+#include <SBLine.h>
+
+typedef struct _SBMirrorLocator {
+    SBLineRef _line;
+    SBUInteger _runIndex;
+    SBUInteger _stringIndex;
+    SBMirrorAgent agent;
+    SBUInteger retainCount;
+} SBMirrorLocator;
+
+#endif
diff --git a/lib/sheenbidi/Source/SBParagraph.c b/lib/sheenbidi/Source/SBParagraph.c
new file mode 100644
index 000000000..36d562cf8
--- /dev/null
+++ b/lib/sheenbidi/Source/SBParagraph.c
@@ -0,0 +1,646 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "BidiChain.h"
+#include "BidiTypeLookup.h"
+#include "IsolatingRun.h"
+#include "LevelRun.h"
+#include "RunQueue.h"
+#include "SBAlgorithm.h"
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+#include "SBLine.h"
+#include "SBLog.h"
+#include "StatusStack.h"
+#include "SBParagraph.h"
+
+typedef struct _ParagraphContext {
+    BidiChain bidiChain;
+    StatusStack statusStack;
+    RunQueue runQueue;
+    IsolatingRun isolatingRun;
+} ParagraphContext, *ParagraphContextRef;
+
+static void PopulateBidiChain(BidiChainRef chain, const SBBidiType *types, SBUInteger length);
+static void ProcessRun(ParagraphContextRef context, const LevelRunRef levelRun, SBBoolean forceFinish);
+
+static ParagraphContextRef CreateParagraphContext(const SBBidiType *types, SBLevel *levels, SBUInteger length)
+{
+    const SBUInteger sizeContext = sizeof(ParagraphContext);
+    const SBUInteger sizeLinks   = sizeof(BidiLink) * (length + 2);
+    const SBUInteger sizeTypes   = sizeof(SBBidiType) * (length + 2);
+    const SBUInteger sizeMemory  = sizeContext + sizeLinks + sizeTypes;
+
+    const SBUInteger offsetContext = 0;
+    const SBUInteger offsetLinks   = offsetContext + sizeContext;
+    const SBUInteger offsetTypes   = offsetLinks + sizeLinks;
+
+    SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory);
+    ParagraphContextRef context = (ParagraphContextRef)(memory + offsetContext);
+    BidiLink *fixedLinks = (BidiLink *)(memory + offsetLinks);
+    SBBidiType *fixedTypes = (SBBidiType *)(memory + offsetTypes);
+
+    BidiChainInitialize(&context->bidiChain, fixedTypes, levels, fixedLinks);
+    StatusStackInitialize(&context->statusStack);
+    RunQueueInitialize(&context->runQueue);
+    IsolatingRunInitialize(&context->isolatingRun);
+
+    PopulateBidiChain(&context->bidiChain, types, length);
+
+    return context;
+}
+
+static void DisposeParagraphContext(ParagraphContextRef context)
+{
+    StatusStackFinalize(&context->statusStack);
+    RunQueueFinalize(&context->runQueue);
+    IsolatingRunFinalize(&context->isolatingRun);
+    free(context);
+}
+
+static SBParagraphRef ParagraphAllocate(SBUInteger length)
+{
+    const SBUInteger sizeParagraph = sizeof(SBParagraph);
+    const SBUInteger sizeLevels    = sizeof(SBLevel) * (length + 2);
+    const SBUInteger sizeMemory    = sizeParagraph + sizeLevels;
+
+    const SBUInteger offsetParagraph = 0;
+    const SBUInteger offsetLevels    = offsetParagraph + sizeParagraph;
+
+    SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory);
+    SBParagraphRef paragraph = (SBParagraphRef)(memory + offsetParagraph);
+    SBLevel *levels = (SBLevel *)(memory + offsetLevels);
+
+    paragraph->fixedLevels = levels;
+
+    return paragraph;
+}
+
+static SBUInteger DetermineBoundary(SBAlgorithmRef algorithm, SBUInteger paragraphOffset, SBUInteger suggestedLength)
+{
+    SBBidiType *bidiTypes = algorithm->fixedTypes;
+    SBUInteger suggestedLimit = paragraphOffset + suggestedLength;
+    SBUInteger stringIndex;
+
+    for (stringIndex = paragraphOffset; stringIndex < suggestedLimit; stringIndex++) {
+        if (bidiTypes[stringIndex] == SBBidiTypeB) {
+            goto Return;
+        }
+    }
+
+Return:
+    stringIndex += SBAlgorithmGetSeparatorLength(algorithm, stringIndex);
+
+    return (stringIndex - paragraphOffset);
+}
+
+static void PopulateBidiChain(BidiChainRef chain, const SBBidiType *types, SBUInteger length)
+{
+    SBBidiType type = SBBidiTypeNil;
+    SBUInteger priorIndex = SBInvalidIndex;
+    SBUInteger index;
+
+    for (index = 0; index < length; index++) {
+        SBBidiType priorType = type;
+        type = types[index];
+
+        switch (type) {
+        case SBBidiTypeB:
+        case SBBidiTypeON:
+        case SBBidiTypeLRE:
+        case SBBidiTypeRLE:
+        case SBBidiTypeLRO:
+        case SBBidiTypeRLO:
+        case SBBidiTypePDF:
+        case SBBidiTypeLRI:
+        case SBBidiTypeRLI:
+        case SBBidiTypeFSI:
+        case SBBidiTypePDI:
+            BidiChainAdd(chain, type, index - priorIndex);
+            priorIndex = index;
+
+            if (type == SBBidiTypeB) {
+                index = length;
+                goto AddLast;
+            }
+            break;
+
+        default:
+            if (type != priorType) {
+                BidiChainAdd(chain, type, index - priorIndex);
+                priorIndex = index;
+            }
+            break;
+        }
+    }
+
+AddLast:
+    BidiChainAdd(chain, SBBidiTypeNil, index - priorIndex);
+}
+
+static BidiLink SkipIsolatingRun(BidiChainRef chain, BidiLink skipLink, BidiLink breakLink)
+{
+    BidiLink link = skipLink;
+    SBUInteger depth = 1;
+
+    while ((link = BidiChainGetNext(chain, link)) != breakLink) {
+        SBBidiType type = BidiChainGetType(chain, link);
+
+        switch (type) {
+        case SBBidiTypeLRI:
+        case SBBidiTypeRLI:
+        case SBBidiTypeFSI:
+            depth += 1;
+            break;
+
+        case SBBidiTypePDI:
+            if (--depth == 0) {
+                return link;
+            }
+            break;
+        }
+    }
+
+    return BidiLinkNone;
+}
+
+static SBLevel DetermineBaseLevel(BidiChainRef chain, BidiLink skipLink, BidiLink breakLink, SBLevel defaultLevel, SBBoolean isIsolate)
+{
+    BidiLink link = skipLink;
+
+    /* Rules P2, P3 */
+    while ((link = BidiChainGetNext(chain, link)) != breakLink) {
+        SBBidiType type = BidiChainGetType(chain, link);
+
+        switch (type) {
+        case SBBidiTypeL:
+            return 0;
+
+        case SBBidiTypeAL:
+        case SBBidiTypeR:
+            return 1;
+
+        case SBBidiTypeLRI:
+        case SBBidiTypeRLI:
+        case SBBidiTypeFSI:
+            link = SkipIsolatingRun(chain, link, breakLink);
+            if (link == BidiLinkNone) {
+                goto Default;
+            }
+            break;
+
+        case SBBidiTypePDI:
+            if (isIsolate) {
+                /*
+                 * In case of isolating run, the PDI will be the last code point.
+                 * NOTE:
+                 *      The inner isolating runs will be skipped by the case above this one.
+                 */
+                goto Default;
+            }
+            break;
+        }
+    }
+
+Default:
+    return defaultLevel;
+}
+
+static SBLevel DetermineParagraphLevel(BidiChainRef chain, SBLevel baseLevel)
+{
+    if (baseLevel >= SBLevelMax) {
+        return DetermineBaseLevel(chain, chain->roller, chain->roller,
+                                  (baseLevel != SBLevelDefaultRTL ? 0 : 1),
+                                  SBFalse);
+    }
+
+    return baseLevel;
+}
+
+static void DetermineLevels(ParagraphContextRef context, SBLevel baseLevel)
+{
+    BidiChainRef chain = &context->bidiChain;
+    StatusStackRef stack = &context->statusStack;
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    BidiLink priorLink;
+    BidiLink firstLink;
+    BidiLink lastLink;
+
+    SBLevel priorLevel;
+    SBBidiType sor;
+    SBBidiType eor;
+
+    SBUInteger overIsolate;
+    SBUInteger overEmbedding;
+    SBUInteger validIsolate;
+
+    priorLink = chain->roller;
+    firstLink = BidiLinkNone;
+    lastLink = BidiLinkNone;
+
+    priorLevel = baseLevel;
+    sor = SBBidiTypeNil;
+
+    /* Rule X1 */
+    overIsolate = 0;
+    overEmbedding = 0;
+    validIsolate = 0;
+
+    StatusStackPush(stack, baseLevel, SBBidiTypeON, SBFalse);
+
+    BidiChainForEach(chain, roller, link) {
+        SBBoolean forceFinish = SBFalse;
+        SBBoolean bnEquivalent = SBFalse;
+        SBBidiType type;
+
+        type = BidiChainGetType(chain, link);
+
+#define LeastGreaterOddLevel()                                              \
+(                                                                           \
+        (StatusStackGetEmbeddingLevel(stack) + 1) | 1                       \
+)
+
+#define LeastGreaterEvenLevel()                                             \
+(                                                                           \
+        (StatusStackGetEmbeddingLevel(stack) + 2) & ~1                      \
+)
+
+#define MergeLinkIfNeeded()                                                 \
+{                                                                           \
+        if (BidiChainMergeIfEqual(chain, priorLink, link)) {                \
+            continue;                                                       \
+        }                                                                   \
+}
+
+#define PushEmbedding(l, o)                                                 \
+{                                                                           \
+        SBLevel newLevel = l;                                               \
+                                                                            \
+        bnEquivalent = SBTrue;                                              \
+                                                                            \
+        if (newLevel <= SBLevelMax && !overIsolate && !overEmbedding) {     \
+            StatusStackPush(stack, newLevel, o, SBFalse);                   \
+        } else {                                                            \
+            if (!overIsolate) {                                             \
+                overEmbedding += 1;                                         \
+            }                                                               \
+        }                                                                   \
+}
+
+#define PushIsolate(l, o)                                                   \
+{                                                                           \
+        SBBidiType priorStatus = StatusStackGetOverrideStatus(stack);       \
+        SBLevel newLevel = l;                                               \
+                                                                            \
+        BidiChainSetLevel(chain, link,                                      \
+                          StatusStackGetEmbeddingLevel(stack));             \
+                                                                            \
+        if (newLevel <= SBLevelMax && !overIsolate && !overEmbedding) {     \
+            validIsolate += 1;                                              \
+            StatusStackPush(stack, newLevel, o, SBTrue);                    \
+        } else {                                                            \
+            overIsolate += 1;                                               \
+        }                                                                   \
+                                                                            \
+        if (priorStatus != SBBidiTypeON) {                                  \
+            BidiChainSetType(chain, link, priorStatus);                     \
+            MergeLinkIfNeeded();                                            \
+        }                                                                   \
+}
+
+        switch (type) {
+        /* Rule X2 */
+        case SBBidiTypeRLE:
+            PushEmbedding(LeastGreaterOddLevel(), SBBidiTypeON);
+            break;
+
+        /* Rule X3 */
+        case SBBidiTypeLRE:
+            PushEmbedding(LeastGreaterEvenLevel(), SBBidiTypeON);
+            break;
+
+        /* Rule X4 */
+        case SBBidiTypeRLO:
+            PushEmbedding(LeastGreaterOddLevel(), SBBidiTypeR);
+            break;
+
+        /* Rule X5 */
+        case SBBidiTypeLRO:
+            PushEmbedding(LeastGreaterEvenLevel(), SBBidiTypeL);
+            break;
+
+        /* Rule X5a */
+        case SBBidiTypeRLI:
+            PushIsolate(LeastGreaterOddLevel(), SBBidiTypeON);
+            break;
+
+        /* Rule X5b */
+        case SBBidiTypeLRI:
+            PushIsolate(LeastGreaterEvenLevel(), SBBidiTypeON);
+            break;
+
+        /* Rule X5c */
+        case SBBidiTypeFSI:
+        {
+            SBBoolean isRTL = (DetermineBaseLevel(chain, link, roller, 0, SBTrue) == 1);
+            PushIsolate(isRTL ? LeastGreaterOddLevel() : LeastGreaterEvenLevel(), SBBidiTypeON);
+            break;
+        }
+
+        /* Rule X6 */
+        default:
+            BidiChainSetLevel(chain, link, StatusStackGetEmbeddingLevel(stack));
+
+            if (StatusStackGetOverrideStatus(stack) != SBBidiTypeON) {
+                BidiChainSetType(chain, link, StatusStackGetOverrideStatus(stack));
+                MergeLinkIfNeeded();
+            }
+            break;
+
+        /* Rule X6a */
+        case SBBidiTypePDI:
+        {
+            SBBidiType overrideStatus;
+
+            if (overIsolate != 0) {
+                overIsolate -= 1;
+            } else if (validIsolate == 0) {
+                /* Do nothing */
+            } else {
+                overEmbedding = 0;
+
+                while (!StatusStackGetIsolateStatus(stack)) {
+                    StatusStackPop(stack);
+                }
+                StatusStackPop(stack);
+
+                validIsolate -= 1;
+            }
+
+            BidiChainSetLevel(chain, link, StatusStackGetEmbeddingLevel(stack));
+            overrideStatus = StatusStackGetOverrideStatus(stack);
+
+            if (overrideStatus != SBBidiTypeON) {
+                BidiChainSetType(chain, link, overrideStatus);
+                MergeLinkIfNeeded();
+            }
+            break;
+        }
+
+        /* Rule X7 */
+        case SBBidiTypePDF:
+            bnEquivalent = SBTrue;
+
+            if (overIsolate != 0) {
+                /* Do nothing */
+            } else if (overEmbedding != 0) {
+                overEmbedding -= 1;
+            } else if (!StatusStackGetIsolateStatus(stack) && stack->count >= 2) {
+                StatusStackPop(stack);
+            }
+            break;
+
+        /* Rule X8 */
+        case SBBidiTypeB:
+            /*
+             * These values are reset for clarity, in this implementation B can only occur as the
+             * last code in the array.
+             */
+            StatusStackSetEmpty(stack);
+            StatusStackPush(stack, baseLevel, SBBidiTypeON, SBFalse);
+
+            overIsolate = 0;
+            overEmbedding = 0;
+            validIsolate = 0;
+
+            BidiChainSetLevel(chain, link, baseLevel);
+            break;
+
+        case SBBidiTypeBN:
+            bnEquivalent = SBTrue;
+            break;
+
+        case SBBidiTypeNil:
+            forceFinish = SBTrue;
+            BidiChainSetLevel(chain, link, baseLevel);
+            break;
+        }
+
+        /* Rule X9 */
+        if (bnEquivalent) {
+            /* The type of this link is BN equivalent, so abandon it and continue the loop. */
+            BidiChainSetType(chain, link, SBBidiTypeBN);
+            BidiChainAbandonNext(chain, priorLink);
+            continue;
+        }
+
+        if (sor == SBBidiTypeNil) {
+            sor = SBLevelAsNormalBidiType(SBNumberGetMax(baseLevel, BidiChainGetLevel(chain, link)));
+            firstLink = link;
+            priorLevel = BidiChainGetLevel(chain, link);
+        } else if (priorLevel != BidiChainGetLevel(chain, link) || forceFinish) {
+            LevelRun levelRun;
+            SBLevel currentLevel;
+
+            /* Since the level has changed at this link, therefore the run must end at prior link. */
+            lastLink = priorLink;
+
+            /* Save the current level i.e. level of the next run. */
+            currentLevel = BidiChainGetLevel(chain, link);
+            /*
+             * Now we have both the prior level and the current level i.e. unchanged levels of both
+             * the current run and the next run. So, identify eor of the current run.
+             * NOTE:
+             *      sor of the run has been already determined at this stage.
+             */
+            eor = SBLevelAsNormalBidiType(SBNumberGetMax(priorLevel, currentLevel));
+
+            LevelRunInitialize(&levelRun, chain, firstLink, lastLink, sor, eor);
+            ProcessRun(context, &levelRun, forceFinish);
+
+            /* The sor of next run (if any) should be technically equal to eor of this run. */
+            sor = eor;
+            /* The next run (if any) will start from this index. */
+            firstLink = link;
+
+            priorLevel = currentLevel;
+        }
+
+        priorLink = link;
+    }
+}
+
+static void ProcessRun(ParagraphContextRef context, const LevelRunRef levelRun, SBBoolean forceFinish)
+{
+    RunQueueRef queue = &context->runQueue;
+    RunQueueEnqueue(queue, levelRun);
+
+    if (queue->shouldDequeue || forceFinish) {
+        IsolatingRunRef isolatingRun = &context->isolatingRun;
+        LevelRunRef peek;
+
+        /* Rule X10 */
+        for (; queue->count != 0; RunQueueDequeue(queue)) {
+            peek = queue->peek;
+            if (RunKindIsAttachedTerminating(peek->kind)) {
+                continue;
+            }
+
+            isolatingRun->baseLevelRun = peek;
+            IsolatingRunResolve(isolatingRun);
+        }
+    }
+}
+
+static void SaveLevels(BidiChainRef chain, SBLevel *levels, SBLevel baseLevel)
+{
+    BidiLink roller = chain->roller;
+    BidiLink link;
+
+    SBUInteger index = 0;
+    SBLevel level = baseLevel;
+
+    BidiChainForEach(chain, roller, link) {
+        SBUInteger offset = BidiChainGetOffset(chain, link);
+
+        for (; index < offset; index++) {
+            levels[index] = level;
+        }
+
+        level = BidiChainGetLevel(chain, link);
+    }
+}
+
+SB_INTERNAL SBParagraphRef SBParagraphCreate(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel)
+{
+    const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence;
+    SBUInteger stringLength = codepointSequence->stringLength;
+    SBUInteger actualLength;
+
+    SBParagraphRef paragraph;
+    ParagraphContextRef context;
+    SBLevel resolvedLevel;
+
+    /* The given range MUST be valid. */
+    SBAssert(SBUIntegerVerifyRange(stringLength, paragraphOffset, suggestedLength) && suggestedLength > 0);
+
+    SB_LOG_BLOCK_OPENER("Paragraph Input");
+    SB_LOG_STATEMENT("Paragraph Offset", 1, SB_LOG_NUMBER(paragraphOffset));
+    SB_LOG_STATEMENT("Suggested Length", 1, SB_LOG_NUMBER(suggestedLength));
+    SB_LOG_STATEMENT("Base Direction",   1, SB_LOG_BASE_LEVEL(baseLevel));
+    SB_LOG_BLOCK_CLOSER();
+
+    actualLength = DetermineBoundary(algorithm, paragraphOffset, suggestedLength);
+
+    SB_LOG_BLOCK_OPENER("Determined Paragraph Boundary");
+    SB_LOG_STATEMENT("Actual Length", 1, SB_LOG_NUMBER(actualLength));
+    SB_LOG_BLOCK_CLOSER();
+
+    paragraph = ParagraphAllocate(actualLength);
+    paragraph->refTypes = algorithm->fixedTypes + paragraphOffset;
+
+    context = CreateParagraphContext(paragraph->refTypes, paragraph->fixedLevels, actualLength);
+    
+    resolvedLevel = DetermineParagraphLevel(&context->bidiChain, baseLevel);
+    
+    SB_LOG_BLOCK_OPENER("Determined Paragraph Level");
+    SB_LOG_STATEMENT("Base Level", 1, SB_LOG_LEVEL(resolvedLevel));
+    SB_LOG_BLOCK_CLOSER();
+
+    context->isolatingRun.codepointSequence = codepointSequence;
+    context->isolatingRun.bidiTypes = paragraph->refTypes;
+    context->isolatingRun.bidiChain = &context->bidiChain;
+    context->isolatingRun.paragraphOffset = paragraphOffset;
+    context->isolatingRun.paragraphLevel = resolvedLevel;
+    
+    DetermineLevels(context, resolvedLevel);
+    SaveLevels(&context->bidiChain, ++paragraph->fixedLevels, resolvedLevel);
+    
+    SB_LOG_BLOCK_OPENER("Determined Embedding Levels");
+    SB_LOG_STATEMENT("Levels",  1, SB_LOG_LEVELS_ARRAY(paragraph->fixedLevels, actualLength));
+    SB_LOG_BLOCK_CLOSER();
+
+    paragraph->algorithm = SBAlgorithmRetain(algorithm);
+    paragraph->offset = paragraphOffset;
+    paragraph->length = actualLength;
+    paragraph->baseLevel = resolvedLevel;
+    paragraph->retainCount = 1;
+    
+    DisposeParagraphContext(context);
+    
+    SB_LOG_BREAKER();
+    
+    return paragraph;
+}
+
+SBUInteger SBParagraphGetOffset(SBParagraphRef paragraph)
+{
+    return paragraph->offset;
+}
+
+SBUInteger SBParagraphGetLength(SBParagraphRef paragraph)
+{
+    return paragraph->length;
+}
+
+SBLevel SBParagraphGetBaseLevel(SBParagraphRef paragraph)
+{
+    return paragraph->baseLevel;
+}
+
+const SBLevel *SBParagraphGetLevelsPtr(SBParagraphRef paragraph)
+{
+    return paragraph->fixedLevels;
+}
+
+SBLineRef SBParagraphCreateLine(SBParagraphRef paragraph, SBUInteger lineOffset, SBUInteger lineLength)
+{
+    SBUInteger paragraphOffset = paragraph->offset;
+    SBUInteger paragraphLength = paragraph->length;
+    SBUInteger paragraphLimit = paragraphOffset + paragraphLength;
+    SBUInteger lineLimit = lineOffset + lineLength;
+
+    if (lineOffset < lineLimit && lineOffset >= paragraphOffset && lineLimit <= paragraphLimit) {
+        return SBLineCreate(paragraph, lineOffset, lineLength);
+    }
+
+    return NULL;
+}
+
+SBParagraphRef SBParagraphRetain(SBParagraphRef paragraph)
+{
+    if (paragraph) {
+        paragraph->retainCount += 1;
+    }
+    
+    return paragraph;
+}
+
+void SBParagraphRelease(SBParagraphRef paragraph)
+{
+    if (paragraph && --paragraph->retainCount == 0) {
+        SBAlgorithmRelease(paragraph->algorithm);
+        free(paragraph);
+    }
+}
diff --git a/lib/sheenbidi/Source/SBParagraph.h b/lib/sheenbidi/Source/SBParagraph.h
new file mode 100644
index 000000000..c40b4ee2a
--- /dev/null
+++ b/lib/sheenbidi/Source/SBParagraph.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_PARAGRAPH_H
+#define _SB_INTERNAL_PARAGRAPH_H
+
+#include <SBAlgorithm.h>
+#include <SBBase.h>
+#include <SBConfig.h>
+#include <SBParagraph.h>
+
+typedef struct _SBParagraph {
+    SBAlgorithmRef algorithm;
+    const SBBidiType *refTypes;
+    SBLevel *fixedLevels;
+    SBUInteger offset;
+    SBUInteger length;
+    SBLevel baseLevel;
+    SBUInteger retainCount;
+} SBParagraph;
+
+SB_INTERNAL SBParagraphRef SBParagraphCreate(SBAlgorithmRef algorithm,
+    SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel);
+
+#endif
diff --git a/lib/sheenbidi/Source/SBScriptLocator.c b/lib/sheenbidi/Source/SBScriptLocator.c
new file mode 100644
index 000000000..438336e2d
--- /dev/null
+++ b/lib/sheenbidi/Source/SBScriptLocator.c
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "GeneralCategoryLookup.h"
+#include "PairingLookup.h"
+#include "SBBase.h"
+#include "SBCodepointSequence.h"
+#include "ScriptLookup.h"
+#include "ScriptStack.h"
+#include "SBScriptLocator.h"
+
+static SBBoolean IsSimilarScript(SBScript lhs, SBScript rhs)
+{
+    return SBScriptIsCommonOrInherited(lhs)
+        || SBScriptIsCommonOrInherited(rhs)
+        || lhs == rhs;
+}
+
+SBScriptLocatorRef SBScriptLocatorCreate(void)
+{
+    SBScriptLocatorRef locator;
+
+    locator = malloc(sizeof(SBScriptLocator));
+    locator->_codepointSequence.stringEncoding = SBStringEncodingUTF8;
+    locator->_codepointSequence.stringBuffer = NULL;
+    locator->_codepointSequence.stringLength = 0;
+    locator->retainCount = 1;
+    SBScriptLocatorReset(locator);
+
+    return locator;
+}
+
+void SBScriptLocatorLoadCodepoints(SBScriptLocatorRef locator, const SBCodepointSequence *codepointSequence)
+{
+    locator->_codepointSequence = *codepointSequence;
+    SBScriptLocatorReset(locator);
+}
+
+const SBScriptAgent *SBScriptLocatorGetAgent(SBScriptLocatorRef locator)
+{
+    return &locator->agent;
+}
+
+static void ResolveScriptRun(SBScriptLocatorRef locator, SBUInteger offset)
+{
+    const SBCodepointSequence *sequence = &locator->_codepointSequence;
+    ScriptStackRef stack = &locator->_scriptStack;
+    SBScript result = SBScriptZYYY;
+    SBUInteger current = offset;
+    SBUInteger next = offset;
+    SBCodepoint codepoint;
+
+    /* Iterate over the code points of specified string buffer. */
+    while ((codepoint = SBCodepointSequenceGetCodepointAt(sequence, &next)) != SBCodepointInvalid) {
+        SBBoolean isStacked = SBFalse;
+        SBScript script;
+
+        script = LookupScript(codepoint);
+
+        /* Handle paired punctuations in case of a common script. */
+        if (script == SBScriptZYYY) {
+            SBGeneralCategory generalCategory = LookupGeneralCategory(codepoint);
+
+            /* Check if current code point is an open punctuation. */
+            if (generalCategory == SBGeneralCategoryPS) {
+                SBCodepoint mirror = LookupMirror(codepoint);
+                if (mirror) {
+                    /* A closing pair exists for this punctuation, so push it onto the stack. */
+                    ScriptStackPush(stack, result, mirror);
+                }
+            }
+            /* Check if current code point is a close punctuation. */
+            else if (generalCategory == SBGeneralCategoryPE) {
+                SBBoolean isMirrored = (LookupMirror(codepoint) != 0);
+                if (isMirrored) {
+                    /* Find the matching entry in the stack, while popping the unmatched ones. */
+                    while (!ScriptStackIsEmpty(stack)) {
+                        SBCodepoint mirror = ScriptStackGetMirror(stack);
+                        if (mirror != codepoint) {
+                            ScriptStackPop(stack);
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if (!ScriptStackIsEmpty(stack)) {
+                        isStacked = SBTrue;
+                        /* Paired punctuation match the script of enclosing text. */
+                        script = ScriptStackGetScript(stack);
+                    }
+                }
+            }
+        }
+
+        if (IsSimilarScript(result, script)) {
+            if (SBScriptIsCommonOrInherited(result) && !SBScriptIsCommonOrInherited(script)) {
+                /* Set the concrete script of this code point as the result. */
+                result = script;
+                /* Seal the pending punctuations with the result. */
+                ScriptStackSealPairs(stack, result);
+            }
+
+            if (isStacked) {
+                /* Pop the paired punctuation from the stack. */
+                ScriptStackPop(stack);
+            }
+        } else {
+            /* The current code point has a different script, so finish the run. */
+            break;
+        }
+
+        current = next;
+    }
+
+    ScriptStackLeavePairs(stack);
+
+    /* Set the run info in agent. */
+    locator->agent.offset = offset;
+    locator->agent.length = current - offset;
+    locator->agent.script = result;
+}
+
+SBBoolean SBScriptLocatorMoveNext(SBScriptLocatorRef locator)
+{
+    SBUInteger offset = locator->agent.offset + locator->agent.length;
+
+    if (offset < locator->_codepointSequence.stringLength) {
+        ResolveScriptRun(locator, offset);
+        return SBTrue;
+    }
+
+    SBScriptLocatorReset(locator);
+    return SBFalse;
+}
+
+void SBScriptLocatorReset(SBScriptLocatorRef locator)
+{
+    ScriptStackReset(&locator->_scriptStack);
+    locator->agent.offset = 0;
+    locator->agent.length = 0;
+    locator->agent.script = SBScriptNil;
+}
+
+SBScriptLocatorRef SBScriptLocatorRetain(SBScriptLocatorRef locator)
+{
+    if (locator) {
+        locator->retainCount += 1;
+    }
+
+    return locator;
+}
+
+void SBScriptLocatorRelease(SBScriptLocatorRef locator)
+{
+    if (locator && --locator->retainCount == 0) {
+        free(locator);
+    }
+}
diff --git a/lib/sheenbidi/Source/SBScriptLocator.h b/lib/sheenbidi/Source/SBScriptLocator.h
new file mode 100644
index 000000000..c9ea97e7b
--- /dev/null
+++ b/lib/sheenbidi/Source/SBScriptLocator.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2018-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_SCRIPT_LOCATOR_H
+#define _SB_INTERNAL_SCRIPT_LOCATOR_H
+
+#include <SBBase.h>
+#include <SBCodepointSequence.h>
+#include <SBScriptLocator.h>
+
+#include "ScriptStack.h"
+
+typedef struct _SBScriptLocator {
+    SBCodepointSequence _codepointSequence;
+    ScriptStack _scriptStack;
+    SBScriptAgent agent;
+    SBUInteger retainCount;
+} SBScriptLocator;
+
+#endif
diff --git a/lib/sheenbidi/Source/ScriptLookup.c b/lib/sheenbidi/Source/ScriptLookup.c
new file mode 100644
index 000000000..40f09021b
--- /dev/null
+++ b/lib/sheenbidi/Source/ScriptLookup.c
@@ -0,0 +1,2142 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ *
+ * REQUIRED MEMORY: 10304+(3935*2)+(897*2) = 19968 Bytes
+ */
+
+#include "ScriptLookup.h"
+
+#define Adlm     SBScriptADLM
+#define Aghb     SBScriptAGHB
+#define Ahom     SBScriptAHOM
+#define Arab     SBScriptARAB
+#define Armi     SBScriptARMI
+#define Armn     SBScriptARMN
+#define Avst     SBScriptAVST
+#define Bali     SBScriptBALI
+#define Bamu     SBScriptBAMU
+#define Bass     SBScriptBASS
+#define Batk     SBScriptBATK
+#define Beng     SBScriptBENG
+#define Bhks     SBScriptBHKS
+#define Bopo     SBScriptBOPO
+#define Brah     SBScriptBRAH
+#define Brai     SBScriptBRAI
+#define Bugi     SBScriptBUGI
+#define Buhd     SBScriptBUHD
+#define Cakm     SBScriptCAKM
+#define Cans     SBScriptCANS
+#define Cari     SBScriptCARI
+#define Cham     SBScriptCHAM
+#define Cher     SBScriptCHER
+#define Chrs     SBScriptCHRS
+#define Copt     SBScriptCOPT
+#define Cprt     SBScriptCPRT
+#define Cyrl     SBScriptCYRL
+#define Deva     SBScriptDEVA
+#define Diak     SBScriptDIAK
+#define Dogr     SBScriptDOGR
+#define Dsrt     SBScriptDSRT
+#define Dupl     SBScriptDUPL
+#define Egyp     SBScriptEGYP
+#define Elba     SBScriptELBA
+#define Elym     SBScriptELYM
+#define Ethi     SBScriptETHI
+#define Geor     SBScriptGEOR
+#define Glag     SBScriptGLAG
+#define Gong     SBScriptGONG
+#define Gonm     SBScriptGONM
+#define Goth     SBScriptGOTH
+#define Gran     SBScriptGRAN
+#define Grek     SBScriptGREK
+#define Gujr     SBScriptGUJR
+#define Guru     SBScriptGURU
+#define Hang     SBScriptHANG
+#define Hani     SBScriptHANI
+#define Hano     SBScriptHANO
+#define Hatr     SBScriptHATR
+#define Hebr     SBScriptHEBR
+#define Hira     SBScriptHIRA
+#define Hluw     SBScriptHLUW
+#define Hmng     SBScriptHMNG
+#define Hmnp     SBScriptHMNP
+#define Hung     SBScriptHUNG
+#define Ital     SBScriptITAL
+#define Java     SBScriptJAVA
+#define Kali     SBScriptKALI
+#define Kana     SBScriptKANA
+#define Khar     SBScriptKHAR
+#define Khmr     SBScriptKHMR
+#define Khoj     SBScriptKHOJ
+#define Kits     SBScriptKITS
+#define Knda     SBScriptKNDA
+#define Kthi     SBScriptKTHI
+#define Lana     SBScriptLANA
+#define Laoo     SBScriptLAOO
+#define Latn     SBScriptLATN
+#define Lepc     SBScriptLEPC
+#define Limb     SBScriptLIMB
+#define Lina     SBScriptLINA
+#define Linb     SBScriptLINB
+#define Lisu     SBScriptLISU
+#define Lyci     SBScriptLYCI
+#define Lydi     SBScriptLYDI
+#define Mahj     SBScriptMAHJ
+#define Maka     SBScriptMAKA
+#define Mand     SBScriptMAND
+#define Mani     SBScriptMANI
+#define Marc     SBScriptMARC
+#define Medf     SBScriptMEDF
+#define Mend     SBScriptMEND
+#define Merc     SBScriptMERC
+#define Mero     SBScriptMERO
+#define Mlym     SBScriptMLYM
+#define Modi     SBScriptMODI
+#define Mong     SBScriptMONG
+#define Mroo     SBScriptMROO
+#define Mtei     SBScriptMTEI
+#define Mult     SBScriptMULT
+#define Mymr     SBScriptMYMR
+#define Nand     SBScriptNAND
+#define Narb     SBScriptNARB
+#define Nbat     SBScriptNBAT
+#define Newa     SBScriptNEWA
+#define Nkoo     SBScriptNKOO
+#define Nshu     SBScriptNSHU
+#define Ogam     SBScriptOGAM
+#define Olck     SBScriptOLCK
+#define Orkh     SBScriptORKH
+#define Orya     SBScriptORYA
+#define Osge     SBScriptOSGE
+#define Osma     SBScriptOSMA
+#define Palm     SBScriptPALM
+#define Pauc     SBScriptPAUC
+#define Perm     SBScriptPERM
+#define Phag     SBScriptPHAG
+#define Phli     SBScriptPHLI
+#define Phlp     SBScriptPHLP
+#define Phnx     SBScriptPHNX
+#define Plrd     SBScriptPLRD
+#define Prti     SBScriptPRTI
+#define Rjng     SBScriptRJNG
+#define Rohg     SBScriptROHG
+#define Runr     SBScriptRUNR
+#define Samr     SBScriptSAMR
+#define Sarb     SBScriptSARB
+#define Saur     SBScriptSAUR
+#define Sgnw     SBScriptSGNW
+#define Shaw     SBScriptSHAW
+#define Shrd     SBScriptSHRD
+#define Sidd     SBScriptSIDD
+#define Sind     SBScriptSIND
+#define Sinh     SBScriptSINH
+#define Sogd     SBScriptSOGD
+#define Sogo     SBScriptSOGO
+#define Sora     SBScriptSORA
+#define Soyo     SBScriptSOYO
+#define Sund     SBScriptSUND
+#define Sylo     SBScriptSYLO
+#define Syrc     SBScriptSYRC
+#define Tagb     SBScriptTAGB
+#define Takr     SBScriptTAKR
+#define Tale     SBScriptTALE
+#define Talu     SBScriptTALU
+#define Taml     SBScriptTAML
+#define Tang     SBScriptTANG
+#define Tavt     SBScriptTAVT
+#define Telu     SBScriptTELU
+#define Tfng     SBScriptTFNG
+#define Tglg     SBScriptTGLG
+#define Thaa     SBScriptTHAA
+#define Thai     SBScriptTHAI
+#define Tibt     SBScriptTIBT
+#define Tirh     SBScriptTIRH
+#define Ugar     SBScriptUGAR
+#define Vaii     SBScriptVAII
+#define Wara     SBScriptWARA
+#define Wcho     SBScriptWCHO
+#define Xpeo     SBScriptXPEO
+#define Xsux     SBScriptXSUX
+#define Yezi     SBScriptYEZI
+#define Yiii     SBScriptYIII
+#define Zanb     SBScriptZANB
+#define Zinh     SBScriptZINH
+#define Zyyy     SBScriptZYYY
+#define Zzzz     SBScriptZZZZ
+
+static const SBUInt8 PrimaryScriptData[10304] = {
+/* DATA_BLOCK: -- 0x0000..0x000F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0010..0x001F -- */
+    Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0020..0x002F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0030..0x003F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0040..0x004F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0050..0x005F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0060..0x006F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0070..0x007F -- */
+    Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Bopo, Bopo, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0080..0x008F -- */
+    Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh,
+/* DATA_BLOCK: -- 0x0090..0x009F -- */
+    Grek, Grek, Grek, Grek, Zyyy, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Zyyy, Grek,
+/* DATA_BLOCK: -- 0x00A0..0x00AF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Grek, Zyyy, Grek, Zyyy, Grek, Grek, Grek, Zzzz, Grek, Zzzz, Grek, Grek,
+/* DATA_BLOCK: -- 0x00B0..0x00BF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek,
+/* DATA_BLOCK: -- 0x00C0..0x00CF -- */
+    Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek,
+/* DATA_BLOCK: -- 0x00D0..0x00DF -- */
+    Grek, Grek, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt,
+/* DATA_BLOCK: -- 0x00E0..0x00EF -- */
+    Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl,
+/* DATA_BLOCK: -- 0x00F0..0x00FF -- */
+    Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Zinh, Zinh, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl,
+/* DATA_BLOCK: -- 0x0100..0x010F -- */
+    Zzzz, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn,
+/* DATA_BLOCK: -- 0x0110..0x011F -- */
+    Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn,
+/* DATA_BLOCK: -- 0x0120..0x012F -- */
+    Armn, Armn, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Armn, Armn, Armn, Armn, Armn, Armn, Armn,
+/* DATA_BLOCK: -- 0x0130..0x013F -- */
+    Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Armn, Armn, Armn,
+/* DATA_BLOCK: -- 0x0140..0x014F -- */
+    Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr,
+/* DATA_BLOCK: -- 0x0150..0x015F -- */
+    Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr,
+/* DATA_BLOCK: -- 0x0160..0x016F -- */
+    Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0170..0x017F -- */
+    Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Hebr,
+/* DATA_BLOCK: -- 0x0180..0x018F -- */
+    Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0190..0x019F -- */
+    Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x01A0..0x01AF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Zzzz, Arab, Zyyy,
+/* DATA_BLOCK: -- 0x01B0..0x01BF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x01C0..0x01CF -- */
+    Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zinh, Zinh, Zinh, Zinh, Zinh,
+/* DATA_BLOCK: -- 0x01D0..0x01DF -- */
+    Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x01E0..0x01EF -- */
+    Zinh, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x01F0..0x01FF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab,
+/* DATA_BLOCK: -- 0x0200..0x020F -- */
+    Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Syrc,
+/* DATA_BLOCK: -- 0x0210..0x021F -- */
+    Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc,
+/* DATA_BLOCK: -- 0x0220..0x022F -- */
+    Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Zzzz, Syrc, Syrc, Syrc,
+/* DATA_BLOCK: -- 0x0230..0x023F -- */
+    Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa,
+/* DATA_BLOCK: -- 0x0240..0x024F -- */
+    Thaa, Thaa, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0250..0x025F -- */
+    Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo,
+/* DATA_BLOCK: -- 0x0260..0x026F -- */
+    Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Zzzz, Zzzz, Nkoo, Nkoo, Nkoo,
+/* DATA_BLOCK: -- 0x0270..0x027F -- */
+    Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr,
+/* DATA_BLOCK: -- 0x0280..0x028F -- */
+    Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0290..0x029F -- */
+    Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Zzzz,
+/* DATA_BLOCK: -- 0x02A0..0x02AF -- */
+    Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand,
+/* DATA_BLOCK: -- 0x02B0..0x02BF -- */
+    Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Zzzz, Zzzz, Mand, Zzzz,
+/* DATA_BLOCK: -- 0x02C0..0x02CF -- */
+    Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x02D0..0x02DF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x02E0..0x02EF -- */
+    Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x02F0..0x02FF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0300..0x030F -- */
+    Zzzz, Zzzz, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x0310..0x031F -- */
+    Arab, Arab, Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x0320..0x032F -- */
+    Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva,
+/* DATA_BLOCK: -- 0x0330..0x033F -- */
+    Deva, Zinh, Zinh, Zinh, Zinh, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva,
+/* DATA_BLOCK: -- 0x0340..0x034F -- */
+    Deva, Deva, Deva, Deva, Zyyy, Zyyy, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva,
+/* DATA_BLOCK: -- 0x0350..0x035F -- */
+    Beng, Beng, Beng, Beng, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng,
+/* DATA_BLOCK: -- 0x0360..0x036F -- */
+    Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng,
+/* DATA_BLOCK: -- 0x0370..0x037F -- */
+    Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng,
+/* DATA_BLOCK: -- 0x0380..0x038F -- */
+    Beng, Zzzz, Beng, Zzzz, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng,
+/* DATA_BLOCK: -- 0x0390..0x039F -- */
+    Beng, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Zzzz,
+/* DATA_BLOCK: -- 0x03A0..0x03AF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Beng, Zzzz, Zzzz, Zzzz, Zzzz, Beng, Beng, Zzzz, Beng,
+/* DATA_BLOCK: -- 0x03B0..0x03BF -- */
+    Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng,
+/* DATA_BLOCK: -- 0x03C0..0x03CF -- */
+    Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz,
+/* DATA_BLOCK: -- 0x03D0..0x03DF -- */
+    Zzzz, Guru, Guru, Guru, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Guru,
+/* DATA_BLOCK: -- 0x03E0..0x03EF -- */
+    Guru, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru,
+/* DATA_BLOCK: -- 0x03F0..0x03FF -- */
+    Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru,
+/* DATA_BLOCK: -- 0x0400..0x040F -- */
+    Guru, Zzzz, Guru, Guru, Zzzz, Guru, Guru, Zzzz, Guru, Guru, Zzzz, Zzzz, Guru, Zzzz, Guru, Guru,
+/* DATA_BLOCK: -- 0x0410..0x041F -- */
+    Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Zzzz, Zzzz, Guru, Guru, Guru, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0420..0x042F -- */
+    Zzzz, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Zzzz, Guru, Zzzz,
+/* DATA_BLOCK: -- 0x0430..0x043F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru,
+/* DATA_BLOCK: -- 0x0440..0x044F -- */
+    Guru, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0450..0x045F -- */
+    Zzzz, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr,
+/* DATA_BLOCK: -- 0x0460..0x046F -- */
+    Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr,
+/* DATA_BLOCK: -- 0x0470..0x047F -- */
+    Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr,
+/* DATA_BLOCK: -- 0x0480..0x048F -- */
+    Gujr, Zzzz, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr,
+/* DATA_BLOCK: -- 0x0490..0x049F -- */
+    Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x04A0..0x04AF -- */
+    Gujr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x04B0..0x04BF -- */
+    Gujr, Gujr, Gujr, Gujr, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr,
+/* DATA_BLOCK: -- 0x04C0..0x04CF -- */
+    Gujr, Gujr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr,
+/* DATA_BLOCK: -- 0x04D0..0x04DF -- */
+    Zzzz, Orya, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya,
+/* DATA_BLOCK: -- 0x04E0..0x04EF -- */
+    Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya,
+/* DATA_BLOCK: -- 0x04F0..0x04FF -- */
+    Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya,
+/* DATA_BLOCK: -- 0x0500..0x050F -- */
+    Orya, Zzzz, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya,
+/* DATA_BLOCK: -- 0x0510..0x051F -- */
+    Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0520..0x052F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Orya, Orya, Orya, Zzzz, Zzzz, Zzzz, Zzzz, Orya, Orya, Zzzz, Orya,
+/* DATA_BLOCK: -- 0x0530..0x053F -- */
+    Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya,
+/* DATA_BLOCK: -- 0x0540..0x054F -- */
+    Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0550..0x055F -- */
+    Zzzz, Zzzz, Taml, Taml, Zzzz, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml,
+/* DATA_BLOCK: -- 0x0560..0x056F -- */
+    Taml, Zzzz, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Zzzz, Taml, Zzzz, Taml, Taml,
+/* DATA_BLOCK: -- 0x0570..0x057F -- */
+    Zzzz, Zzzz, Zzzz, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml,
+/* DATA_BLOCK: -- 0x0580..0x058F -- */
+    Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Taml,
+/* DATA_BLOCK: -- 0x0590..0x059F -- */
+    Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Zzzz, Taml, Taml, Taml, Taml, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x05A0..0x05AF -- */
+    Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x05B0..0x05BF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml,
+/* DATA_BLOCK: -- 0x05C0..0x05CF -- */
+    Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x05D0..0x05DF -- */
+    Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu,
+/* DATA_BLOCK: -- 0x05E0..0x05EF -- */
+    Telu, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu,
+/* DATA_BLOCK: -- 0x05F0..0x05FF -- */
+    Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu,
+/* DATA_BLOCK: -- 0x0600..0x060F -- */
+    Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Zzzz, Zzzz, Telu, Telu, Telu,
+/* DATA_BLOCK: -- 0x0610..0x061F -- */
+    Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Telu, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0620..0x062F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Telu, Telu, Zzzz, Telu, Telu, Telu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0630..0x063F -- */
+    Telu, Telu, Telu, Telu, Zzzz, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu,
+/* DATA_BLOCK: -- 0x0640..0x064F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu,
+/* DATA_BLOCK: -- 0x0650..0x065F -- */
+    Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda,
+/* DATA_BLOCK: -- 0x0660..0x066F -- */
+    Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda,
+/* DATA_BLOCK: -- 0x0670..0x067F -- */
+    Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda,
+/* DATA_BLOCK: -- 0x0680..0x068F -- */
+    Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Zzzz, Zzzz, Knda, Knda, Knda, Knda,
+/* DATA_BLOCK: -- 0x0690..0x069F -- */
+    Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x06A0..0x06AF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Knda, Knda, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Knda, Zzzz,
+/* DATA_BLOCK: -- 0x06B0..0x06BF -- */
+    Knda, Knda, Knda, Knda, Zzzz, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda,
+/* DATA_BLOCK: -- 0x06C0..0x06CF -- */
+    Zzzz, Knda, Knda, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x06D0..0x06DF -- */
+    Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x06E0..0x06EF -- */
+    Mlym, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x06F0..0x06FF -- */
+    Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x0700..0x070F -- */
+    Mlym, Mlym, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x0710..0x071F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x0720..0x072F -- */
+    Mlym, Mlym, Mlym, Mlym, Zzzz, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym,
+/* DATA_BLOCK: -- 0x0730..0x073F -- */
+    Zzzz, Sinh, Sinh, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x0740..0x074F -- */
+    Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x0750..0x075F -- */
+    Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x0760..0x076F -- */
+    Sinh, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Sinh, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0770..0x077F -- */
+    Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Sinh,
+/* DATA_BLOCK: -- 0x0780..0x078F -- */
+    Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x0790..0x079F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x07A0..0x07AF -- */
+    Zzzz, Zzzz, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x07B0..0x07BF -- */
+    Zzzz, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai,
+/* DATA_BLOCK: -- 0x07C0..0x07CF -- */
+    Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai,
+/* DATA_BLOCK: -- 0x07D0..0x07DF -- */
+    Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy,
+/* DATA_BLOCK: -- 0x07E0..0x07EF -- */
+    Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x07F0..0x07FF -- */
+    Zzzz, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo,
+/* DATA_BLOCK: -- 0x0800..0x080F -- */
+    Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo,
+/* DATA_BLOCK: -- 0x0810..0x081F -- */
+    Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo,
+/* DATA_BLOCK: -- 0x0820..0x082F -- */
+    Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0830..0x083F -- */
+    Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0840..0x084F -- */
+    Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz, Laoo, Laoo, Laoo, Laoo,
+/* DATA_BLOCK: -- 0x0850..0x085F -- */
+    Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt,
+/* DATA_BLOCK: -- 0x0860..0x086F -- */
+    Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt,
+/* DATA_BLOCK: -- 0x0870..0x087F -- */
+    Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0880..0x088F -- */
+    Zzzz, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt,
+/* DATA_BLOCK: -- 0x0890..0x089F -- */
+    Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Tibt, Tibt,
+/* DATA_BLOCK: -- 0x08A0..0x08AF -- */
+    Tibt, Tibt, Tibt, Tibt, Tibt, Zyyy, Zyyy, Zyyy, Zyyy, Tibt, Tibt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x08B0..0x08BF -- */
+    Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr,
+/* DATA_BLOCK: -- 0x08C0..0x08CF -- */
+    Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor,
+/* DATA_BLOCK: -- 0x08D0..0x08DF -- */
+    Geor, Geor, Geor, Geor, Geor, Geor, Zzzz, Geor, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Geor, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x08E0..0x08EF -- */
+    Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Zyyy, Geor, Geor, Geor, Geor,
+/* DATA_BLOCK: -- 0x08F0..0x08FF -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang,
+/* DATA_BLOCK: -- 0x0900..0x090F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi,
+/* DATA_BLOCK: -- 0x0910..0x091F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0920..0x092F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0930..0x093F -- */
+    Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz,
+/* DATA_BLOCK: -- 0x0940..0x094F -- */
+    Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi,
+/* DATA_BLOCK: -- 0x0950..0x095F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi,
+/* DATA_BLOCK: -- 0x0960..0x096F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi,
+/* DATA_BLOCK: -- 0x0970..0x097F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0980..0x098F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0990..0x099F -- */
+    Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher,
+/* DATA_BLOCK: -- 0x09A0..0x09AF -- */
+    Cher, Cher, Cher, Cher, Cher, Cher, Zzzz, Zzzz, Cher, Cher, Cher, Cher, Cher, Cher, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x09B0..0x09BF -- */
+    Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans,
+/* DATA_BLOCK: -- 0x09C0..0x09CF -- */
+    Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam,
+/* DATA_BLOCK: -- 0x09D0..0x09DF -- */
+    Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x09E0..0x09EF -- */
+    Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr,
+/* DATA_BLOCK: -- 0x09F0..0x09FF -- */
+    Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Zyyy, Zyyy, Zyyy, Runr, Runr,
+/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */
+    Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */
+    Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Zzzz, Tglg, Tglg,
+/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */
+    Tglg, Tglg, Tglg, Tglg, Tglg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */
+    Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano,
+/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */
+    Hano, Hano, Hano, Hano, Hano, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */
+    Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd,
+/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */
+    Buhd, Buhd, Buhd, Buhd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */
+    Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Zzzz, Tagb, Tagb,
+/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */
+    Tagb, Zzzz, Tagb, Tagb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */
+    Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr,
+/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */
+    Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */
+    Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */
+    Mong, Mong, Zyyy, Zyyy, Mong, Zyyy, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz,
+/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */
+    Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */
+    Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong,
+/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */
+    Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */
+    Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */
+    Cans, Cans, Cans, Cans, Cans, Cans, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */
+    Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb,
+/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */
+    Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Zzzz,
+/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */
+    Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */
+    Limb, Zzzz, Zzzz, Zzzz, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb,
+/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */
+    Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale,
+/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */
+    Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */
+    Tale, Tale, Tale, Tale, Tale, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */
+    Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu,
+/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */
+    Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */
+    Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */
+    Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Talu, Talu,
+/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */
+    Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi,
+/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */
+    Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Zzzz, Zzzz, Bugi, Bugi,
+/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */
+    Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana,
+/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */
+    Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz,
+/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */
+    Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz, Lana,
+/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */
+    Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */
+    Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */
+    Zinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */
+    Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali,
+/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */
+    Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */
+    Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */
+    Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund,
+/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */
+    Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk,
+/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */
+    Batk, Batk, Batk, Batk, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Batk, Batk, Batk, Batk,
+/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */
+    Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc,
+/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */
+    Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Zzzz, Zzzz, Zzzz, Lepc, Lepc, Lepc, Lepc, Lepc,
+/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */
+    Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Zzzz, Zzzz, Zzzz, Lepc, Lepc, Lepc,
+/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */
+    Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck,
+/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */
+    Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */
+    Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Zzzz, Zzzz, Geor, Geor, Geor,
+/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */
+    Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */
+    Zinh, Zinh, Zinh, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh,
+/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */
+    Zinh, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Grek, Grek, Grek, Grek, Grek, Cyrl, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Grek, Grek, Grek,
+/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */
+    Grek, Grek, Latn, Latn, Latn, Latn, Grek, Grek, Grek, Grek, Grek, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Cyrl, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Grek,
+/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */
+    Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zzzz, Zinh, Zinh, Zinh, Zinh, Zinh,
+/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Zzzz, Grek, Zzzz, Grek, Zzzz, Grek,
+/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */
+    Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek,
+/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */
+    Grek, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek,
+/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */
+    Zzzz, Zzzz, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz,
+/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */
+    Zyyy, Latn, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn,
+/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz,
+/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Grek, Zyyy, Zyyy, Zyyy, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */
+    Zyyy, Zyyy, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn, Zyyy,
+/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */
+    Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai,
+/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */
+    Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag,
+/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */
+    Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz,
+/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */
+    Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt,
+/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */
+    Copt, Copt, Copt, Copt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Copt, Copt, Copt, Copt, Copt, Copt, Copt,
+/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */
+    Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng,
+/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */
+    Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tfng,
+/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */
+    Tfng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tfng,
+/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */
+    Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz,
+/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */
+    Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani,
+/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Hani, Hani, Hani, Hani, Hani,
+/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */
+    Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Hani, Zyyy, Hani, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */
+    Zyyy, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zinh, Zinh, Zinh, Zinh, Hang, Hang,
+/* DATA_BLOCK: -- 0x1000..0x100F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Hani, Hani, Hani, Hani, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x1010..0x101F -- */
+    Zzzz, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira,
+/* DATA_BLOCK: -- 0x1020..0x102F -- */
+    Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira,
+/* DATA_BLOCK: -- 0x1030..0x103F -- */
+    Hira, Hira, Hira, Hira, Hira, Hira, Hira, Zzzz, Zzzz, Zinh, Zinh, Zyyy, Zyyy, Hira, Hira, Hira,
+/* DATA_BLOCK: -- 0x1040..0x104F -- */
+    Zyyy, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana,
+/* DATA_BLOCK: -- 0x1050..0x105F -- */
+    Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana,
+/* DATA_BLOCK: -- 0x1060..0x106F -- */
+    Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy, Kana, Kana, Kana,
+/* DATA_BLOCK: -- 0x1070..0x107F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo,
+/* DATA_BLOCK: -- 0x1080..0x108F -- */
+    Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo,
+/* DATA_BLOCK: -- 0x1090..0x109F -- */
+    Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang,
+/* DATA_BLOCK: -- 0x10A0..0x10AF -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz,
+/* DATA_BLOCK: -- 0x10B0..0x10BF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x10C0..0x10CF -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zyyy,
+/* DATA_BLOCK: -- 0x10D0..0x10DF -- */
+    Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy,
+/* DATA_BLOCK: -- 0x10E0..0x10EF -- */
+    Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x10F0..0x10FF -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1100..0x110F -- */
+    Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii,
+/* DATA_BLOCK: -- 0x1110..0x111F -- */
+    Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1120..0x112F -- */
+    Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1130..0x113F -- */
+    Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu,
+/* DATA_BLOCK: -- 0x1140..0x114F -- */
+    Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii,
+/* DATA_BLOCK: -- 0x1150..0x115F -- */
+    Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1160..0x116F -- */
+    Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu,
+/* DATA_BLOCK: -- 0x1170..0x117F -- */
+    Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1180..0x118F -- */
+    Zyyy, Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x1190..0x119F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x11A0..0x11AF -- */
+    Zzzz, Zzzz, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x11B0..0x11BF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x11C0..0x11CF -- */
+    Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo,
+/* DATA_BLOCK: -- 0x11D0..0x11DF -- */
+    Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x11E0..0x11EF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x11F0..0x11FF -- */
+    Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag,
+/* DATA_BLOCK: -- 0x1200..0x120F -- */
+    Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1210..0x121F -- */
+    Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur,
+/* DATA_BLOCK: -- 0x1220..0x122F -- */
+    Saur, Saur, Saur, Saur, Saur, Saur, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Saur, Saur,
+/* DATA_BLOCK: -- 0x1230..0x123F -- */
+    Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1240..0x124F -- */
+    Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali,
+/* DATA_BLOCK: -- 0x1250..0x125F -- */
+    Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Zyyy, Kali,
+/* DATA_BLOCK: -- 0x1260..0x126F -- */
+    Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng,
+/* DATA_BLOCK: -- 0x1270..0x127F -- */
+    Rjng, Rjng, Rjng, Rjng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Rjng,
+/* DATA_BLOCK: -- 0x1280..0x128F -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1290..0x129F -- */
+    Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java,
+/* DATA_BLOCK: -- 0x12A0..0x12AF -- */
+    Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Zzzz, Zyyy,
+/* DATA_BLOCK: -- 0x12B0..0x12BF -- */
+    Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Zzzz, Zzzz, Zzzz, Zzzz, Java, Java,
+/* DATA_BLOCK: -- 0x12C0..0x12CF -- */
+    Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Zzzz,
+/* DATA_BLOCK: -- 0x12D0..0x12DF -- */
+    Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham,
+/* DATA_BLOCK: -- 0x12E0..0x12EF -- */
+    Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x12F0..0x12FF -- */
+    Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1300..0x130F -- */
+    Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz, Cham, Cham, Cham, Cham,
+/* DATA_BLOCK: -- 0x1310..0x131F -- */
+    Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt,
+/* DATA_BLOCK: -- 0x1320..0x132F -- */
+    Tavt, Tavt, Tavt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1330..0x133F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tavt, Tavt, Tavt, Tavt, Tavt,
+/* DATA_BLOCK: -- 0x1340..0x134F -- */
+    Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei,
+/* DATA_BLOCK: -- 0x1350..0x135F -- */
+    Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1360..0x136F -- */
+    Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz,
+/* DATA_BLOCK: -- 0x1370..0x137F -- */
+    Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1380..0x138F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Latn, Latn, Latn, Latn,
+/* DATA_BLOCK: -- 0x1390..0x139F -- */
+    Latn, Latn, Latn, Latn, Latn, Grek, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x13A0..0x13AF -- */
+    Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x13B0..0x13BF -- */
+    Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x13C0..0x13CF -- */
+    Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x13D0..0x13DF -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang,
+/* DATA_BLOCK: -- 0x13E0..0x13EF -- */
+    Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x13F0..0x13FF -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1400..0x140F -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1410..0x141F -- */
+    Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1420..0x142F -- */
+    Zzzz, Zzzz, Zzzz, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hebr, Hebr, Hebr,
+/* DATA_BLOCK: -- 0x1430..0x143F -- */
+    Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Hebr, Zzzz,
+/* DATA_BLOCK: -- 0x1440..0x144F -- */
+    Hebr, Hebr, Zzzz, Hebr, Hebr, Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr,
+/* DATA_BLOCK: -- 0x1450..0x145F -- */
+    Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1460..0x146F -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x1470..0x147F -- */
+    Zzzz, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x1480..0x148F -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1490..0x149F -- */
+    Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Cyrl, Cyrl,
+/* DATA_BLOCK: -- 0x14A0..0x14AF -- */
+    Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x14B0..0x14BF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x14C0..0x14CF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zyyy,
+/* DATA_BLOCK: -- 0x14D0..0x14DF -- */
+    Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x14E0..0x14EF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana,
+/* DATA_BLOCK: -- 0x14F0..0x14FF -- */
+    Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x1500..0x150F -- */
+    Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang,
+/* DATA_BLOCK: -- 0x1510..0x151F -- */
+    Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1520..0x152F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz,
+/* DATA_BLOCK: -- 0x1530..0x153F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1540..0x154F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Linb,
+/* DATA_BLOCK: -- 0x1550..0x155F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb,
+/* DATA_BLOCK: -- 0x1560..0x156F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb,
+/* DATA_BLOCK: -- 0x1570..0x157F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Zzzz, Linb,
+/* DATA_BLOCK: -- 0x1580..0x158F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1590..0x159F -- */
+    Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x15A0..0x15AF -- */
+    Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x15B0..0x15BF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x15C0..0x15CF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz,
+/* DATA_BLOCK: -- 0x15D0..0x15DF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x15E0..0x15EF -- */
+    Grek, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x15F0..0x15FF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1600..0x160F -- */
+    Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci,
+/* DATA_BLOCK: -- 0x1610..0x161F -- */
+    Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1620..0x162F -- */
+    Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari,
+/* DATA_BLOCK: -- 0x1630..0x163F -- */
+    Cari, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1640..0x164F -- */
+    Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x1650..0x165F -- */
+    Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital,
+/* DATA_BLOCK: -- 0x1660..0x166F -- */
+    Ital, Ital, Ital, Ital, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Ital, Ital, Ital,
+/* DATA_BLOCK: -- 0x1670..0x167F -- */
+    Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth,
+/* DATA_BLOCK: -- 0x1680..0x168F -- */
+    Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1690..0x169F -- */
+    Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm,
+/* DATA_BLOCK: -- 0x16A0..0x16AF -- */
+    Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x16B0..0x16BF -- */
+    Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar,
+/* DATA_BLOCK: -- 0x16C0..0x16CF -- */
+    Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Zzzz, Ugar,
+/* DATA_BLOCK: -- 0x16D0..0x16DF -- */
+    Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo,
+/* DATA_BLOCK: -- 0x16E0..0x16EF -- */
+    Xpeo, Xpeo, Xpeo, Xpeo, Zzzz, Zzzz, Zzzz, Zzzz, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo,
+/* DATA_BLOCK: -- 0x16F0..0x16FF -- */
+    Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1700..0x170F -- */
+    Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt,
+/* DATA_BLOCK: -- 0x1710..0x171F -- */
+    Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw,
+/* DATA_BLOCK: -- 0x1720..0x172F -- */
+    Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma,
+/* DATA_BLOCK: -- 0x1730..0x173F -- */
+    Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1740..0x174F -- */
+    Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1750..0x175F -- */
+    Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge,
+/* DATA_BLOCK: -- 0x1760..0x176F -- */
+    Osge, Osge, Osge, Osge, Zzzz, Zzzz, Zzzz, Zzzz, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge,
+/* DATA_BLOCK: -- 0x1770..0x177F -- */
+    Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1780..0x178F -- */
+    Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba,
+/* DATA_BLOCK: -- 0x1790..0x179F -- */
+    Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x17A0..0x17AF -- */
+    Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb,
+/* DATA_BLOCK: -- 0x17B0..0x17BF -- */
+    Aghb, Aghb, Aghb, Aghb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Aghb,
+/* DATA_BLOCK: -- 0x17C0..0x17CF -- */
+    Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina,
+/* DATA_BLOCK: -- 0x17D0..0x17DF -- */
+    Lina, Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x17E0..0x17EF -- */
+    Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x17F0..0x17FF -- */
+    Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1800..0x180F -- */
+    Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Zzzz, Zzzz, Cprt, Zzzz, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt,
+/* DATA_BLOCK: -- 0x1810..0x181F -- */
+    Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt,
+/* DATA_BLOCK: -- 0x1820..0x182F -- */
+    Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Zzzz, Cprt, Cprt, Zzzz, Zzzz, Zzzz, Cprt, Zzzz, Zzzz, Cprt,
+/* DATA_BLOCK: -- 0x1830..0x183F -- */
+    Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi,
+/* DATA_BLOCK: -- 0x1840..0x184F -- */
+    Armi, Armi, Armi, Armi, Armi, Armi, Zzzz, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi,
+/* DATA_BLOCK: -- 0x1850..0x185F -- */
+    Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm,
+/* DATA_BLOCK: -- 0x1860..0x186F -- */
+    Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat,
+/* DATA_BLOCK: -- 0x1870..0x187F -- */
+    Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Zzzz,
+/* DATA_BLOCK: -- 0x1880..0x188F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat,
+/* DATA_BLOCK: -- 0x1890..0x189F -- */
+    Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr,
+/* DATA_BLOCK: -- 0x18A0..0x18AF -- */
+    Hatr, Hatr, Hatr, Zzzz, Hatr, Hatr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hatr, Hatr, Hatr, Hatr, Hatr,
+/* DATA_BLOCK: -- 0x18B0..0x18BF -- */
+    Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx,
+/* DATA_BLOCK: -- 0x18C0..0x18CF -- */
+    Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Zzzz, Zzzz, Zzzz, Phnx,
+/* DATA_BLOCK: -- 0x18D0..0x18DF -- */
+    Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi,
+/* DATA_BLOCK: -- 0x18E0..0x18EF -- */
+    Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Lydi,
+/* DATA_BLOCK: -- 0x18F0..0x18FF -- */
+    Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero,
+/* DATA_BLOCK: -- 0x1900..0x190F -- */
+    Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc,
+/* DATA_BLOCK: -- 0x1910..0x191F -- */
+    Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Zzzz, Zzzz, Zzzz, Zzzz, Merc, Merc, Merc, Merc,
+/* DATA_BLOCK: -- 0x1920..0x192F -- */
+    Zzzz, Zzzz, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc,
+/* DATA_BLOCK: -- 0x1930..0x193F -- */
+    Khar, Khar, Khar, Khar, Zzzz, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Khar, Khar, Khar, Khar,
+/* DATA_BLOCK: -- 0x1940..0x194F -- */
+    Khar, Khar, Khar, Khar, Zzzz, Khar, Khar, Khar, Zzzz, Khar, Khar, Khar, Khar, Khar, Khar, Khar,
+/* DATA_BLOCK: -- 0x1950..0x195F -- */
+    Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar,
+/* DATA_BLOCK: -- 0x1960..0x196F -- */
+    Khar, Khar, Khar, Khar, Khar, Khar, Zzzz, Zzzz, Khar, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Khar,
+/* DATA_BLOCK: -- 0x1970..0x197F -- */
+    Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1980..0x198F -- */
+    Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb,
+/* DATA_BLOCK: -- 0x1990..0x199F -- */
+    Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb,
+/* DATA_BLOCK: -- 0x19A0..0x19AF -- */
+    Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani,
+/* DATA_BLOCK: -- 0x19B0..0x19BF -- */
+    Mani, Mani, Mani, Mani, Mani, Mani, Mani, Zzzz, Zzzz, Zzzz, Zzzz, Mani, Mani, Mani, Mani, Mani,
+/* DATA_BLOCK: -- 0x19C0..0x19CF -- */
+    Mani, Mani, Mani, Mani, Mani, Mani, Mani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x19D0..0x19DF -- */
+    Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst,
+/* DATA_BLOCK: -- 0x19E0..0x19EF -- */
+    Avst, Avst, Avst, Avst, Avst, Avst, Zzzz, Zzzz, Zzzz, Avst, Avst, Avst, Avst, Avst, Avst, Avst,
+/* DATA_BLOCK: -- 0x19F0..0x19FF -- */
+    Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti,
+/* DATA_BLOCK: -- 0x1A00..0x1A0F -- */
+    Prti, Prti, Prti, Prti, Prti, Prti, Zzzz, Zzzz, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti,
+/* DATA_BLOCK: -- 0x1A10..0x1A1F -- */
+    Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli,
+/* DATA_BLOCK: -- 0x1A20..0x1A2F -- */
+    Phli, Phli, Phli, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli,
+/* DATA_BLOCK: -- 0x1A30..0x1A3F -- */
+    Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp,
+/* DATA_BLOCK: -- 0x1A40..0x1A4F -- */
+    Phlp, Phlp, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phlp, Phlp, Phlp, Phlp, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1A50..0x1A5F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp,
+/* DATA_BLOCK: -- 0x1A60..0x1A6F -- */
+    Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh,
+/* DATA_BLOCK: -- 0x1A70..0x1A7F -- */
+    Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1A80..0x1A8F -- */
+    Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung,
+/* DATA_BLOCK: -- 0x1A90..0x1A9F -- */
+    Hung, Hung, Hung, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1AA0..0x1AAF -- */
+    Hung, Hung, Hung, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hung, Hung, Hung, Hung, Hung, Hung,
+/* DATA_BLOCK: -- 0x1AB0..0x1ABF -- */
+    Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg,
+/* DATA_BLOCK: -- 0x1AC0..0x1ACF -- */
+    Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1AD0..0x1ADF -- */
+    Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1AE0..0x1AEF -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz,
+/* DATA_BLOCK: -- 0x1AF0..0x1AFF -- */
+    Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi,
+/* DATA_BLOCK: -- 0x1B00..0x1B0F -- */
+    Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Zzzz, Yezi, Yezi, Yezi, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1B10..0x1B1F -- */
+    Yezi, Yezi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1B20..0x1B2F -- */
+    Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo,
+/* DATA_BLOCK: -- 0x1B30..0x1B3F -- */
+    Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1B40..0x1B4F -- */
+    Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd,
+/* DATA_BLOCK: -- 0x1B50..0x1B5F -- */
+    Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1B60..0x1B6F -- */
+    Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs,
+/* DATA_BLOCK: -- 0x1B70..0x1B7F -- */
+    Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1B80..0x1B8F -- */
+    Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym,
+/* DATA_BLOCK: -- 0x1B90..0x1B9F -- */
+    Elym, Elym, Elym, Elym, Elym, Elym, Elym, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1BA0..0x1BAF -- */
+    Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah,
+/* DATA_BLOCK: -- 0x1BB0..0x1BBF -- */
+    Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1BC0..0x1BCF -- */
+    Zzzz, Zzzz, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah,
+/* DATA_BLOCK: -- 0x1BD0..0x1BDF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Brah,
+/* DATA_BLOCK: -- 0x1BE0..0x1BEF -- */
+    Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi,
+/* DATA_BLOCK: -- 0x1BF0..0x1BFF -- */
+    Kthi, Kthi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Kthi, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1C00..0x1C0F -- */
+    Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora,
+/* DATA_BLOCK: -- 0x1C10..0x1C1F -- */
+    Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1C20..0x1C2F -- */
+    Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1C30..0x1C3F -- */
+    Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm,
+/* DATA_BLOCK: -- 0x1C40..0x1C4F -- */
+    Cakm, Cakm, Cakm, Cakm, Cakm, Zzzz, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm,
+/* DATA_BLOCK: -- 0x1C50..0x1C5F -- */
+    Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1C60..0x1C6F -- */
+    Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj,
+/* DATA_BLOCK: -- 0x1C70..0x1C7F -- */
+    Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1C80..0x1C8F -- */
+    Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd,
+/* DATA_BLOCK: -- 0x1C90..0x1C9F -- */
+    Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh,
+/* DATA_BLOCK: -- 0x1CA0..0x1CAF -- */
+    Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1CB0..0x1CBF -- */
+    Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj,
+/* DATA_BLOCK: -- 0x1CC0..0x1CCF -- */
+    Khoj, Khoj, Zzzz, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj,
+/* DATA_BLOCK: -- 0x1CD0..0x1CDF -- */
+    Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Zzzz,
+/* DATA_BLOCK: -- 0x1CE0..0x1CEF -- */
+    Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Mult, Zzzz, Mult, Mult, Mult, Mult, Zzzz, Mult,
+/* DATA_BLOCK: -- 0x1CF0..0x1CFF -- */
+    Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Mult,
+/* DATA_BLOCK: -- 0x1D00..0x1D0F -- */
+    Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1D10..0x1D1F -- */
+    Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind,
+/* DATA_BLOCK: -- 0x1D20..0x1D2F -- */
+    Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1D30..0x1D3F -- */
+    Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1D40..0x1D4F -- */
+    Gran, Gran, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran,
+/* DATA_BLOCK: -- 0x1D50..0x1D5F -- */
+    Gran, Zzzz, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran,
+/* DATA_BLOCK: -- 0x1D60..0x1D6F -- */
+    Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran,
+/* DATA_BLOCK: -- 0x1D70..0x1D7F -- */
+    Gran, Zzzz, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Zzzz, Zinh, Gran, Gran, Gran, Gran,
+/* DATA_BLOCK: -- 0x1D80..0x1D8F -- */
+    Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Gran, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1D90..0x1D9F -- */
+    Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gran, Gran, Gran,
+/* DATA_BLOCK: -- 0x1DA0..0x1DAF -- */
+    Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1DB0..0x1DBF -- */
+    Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1DC0..0x1DCF -- */
+    Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa,
+/* DATA_BLOCK: -- 0x1DD0..0x1DDF -- */
+    Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Zzzz, Newa, Newa, Newa,
+/* DATA_BLOCK: -- 0x1DE0..0x1DEF -- */
+    Newa, Newa, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1DF0..0x1DFF -- */
+    Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh,
+/* DATA_BLOCK: -- 0x1E00..0x1E0F -- */
+    Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E10..0x1E1F -- */
+    Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E20..0x1E2F -- */
+    Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd,
+/* DATA_BLOCK: -- 0x1E30..0x1E3F -- */
+    Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Zzzz, Zzzz, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd,
+/* DATA_BLOCK: -- 0x1E40..0x1E4F -- */
+    Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E50..0x1E5F -- */
+    Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi,
+/* DATA_BLOCK: -- 0x1E60..0x1E6F -- */
+    Modi, Modi, Modi, Modi, Modi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E70..0x1E7F -- */
+    Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E80..0x1E8F -- */
+    Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1E90..0x1E9F -- */
+    Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr,
+/* DATA_BLOCK: -- 0x1EA0..0x1EAF -- */
+    Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1EB0..0x1EBF -- */
+    Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1EC0..0x1ECF -- */
+    Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom,
+/* DATA_BLOCK: -- 0x1ED0..0x1EDF -- */
+    Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Zzzz, Zzzz, Ahom, Ahom, Ahom,
+/* DATA_BLOCK: -- 0x1EE0..0x1EEF -- */
+    Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1EF0..0x1EFF -- */
+    Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr,
+/* DATA_BLOCK: -- 0x1F00..0x1F0F -- */
+    Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1F10..0x1F1F -- */
+    Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara,
+/* DATA_BLOCK: -- 0x1F20..0x1F2F -- */
+    Wara, Wara, Wara, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Wara,
+/* DATA_BLOCK: -- 0x1F30..0x1F3F -- */
+    Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Diak, Zzzz, Zzzz, Diak, Diak, Diak, Diak,
+/* DATA_BLOCK: -- 0x1F40..0x1F4F -- */
+    Diak, Diak, Diak, Diak, Zzzz, Diak, Diak, Zzzz, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak,
+/* DATA_BLOCK: -- 0x1F50..0x1F5F -- */
+    Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak,
+/* DATA_BLOCK: -- 0x1F60..0x1F6F -- */
+    Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Diak, Diak, Zzzz, Zzzz, Diak, Diak, Diak, Diak, Diak,
+/* DATA_BLOCK: -- 0x1F70..0x1F7F -- */
+    Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1F80..0x1F8F -- */
+    Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1F90..0x1F9F -- */
+    Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Zzzz, Zzzz, Nand, Nand, Nand, Nand, Nand, Nand,
+/* DATA_BLOCK: -- 0x1FA0..0x1FAF -- */
+    Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand,
+/* DATA_BLOCK: -- 0x1FB0..0x1FBF -- */
+    Nand, Nand, Nand, Nand, Nand, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1FC0..0x1FCF -- */
+    Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb,
+/* DATA_BLOCK: -- 0x1FD0..0x1FDF -- */
+    Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x1FE0..0x1FEF -- */
+    Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo,
+/* DATA_BLOCK: -- 0x1FF0..0x1FFF -- */
+    Soyo, Soyo, Soyo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2000..0x200F -- */
+    Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc,
+/* DATA_BLOCK: -- 0x2010..0x201F -- */
+    Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2020..0x202F -- */
+    Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks,
+/* DATA_BLOCK: -- 0x2030..0x203F -- */
+    Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks,
+/* DATA_BLOCK: -- 0x2040..0x204F -- */
+    Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks,
+/* DATA_BLOCK: -- 0x2050..0x205F -- */
+    Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2060..0x206F -- */
+    Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2070..0x207F -- */
+    Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc,
+/* DATA_BLOCK: -- 0x2080..0x208F -- */
+    Zzzz, Zzzz, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc,
+/* DATA_BLOCK: -- 0x2090..0x209F -- */
+    Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Zzzz, Marc, Marc, Marc, Marc, Marc, Marc, Marc,
+/* DATA_BLOCK: -- 0x20A0..0x20AF -- */
+    Marc, Marc, Marc, Marc, Marc, Marc, Marc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x20B0..0x20BF -- */
+    Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Gonm, Gonm, Zzzz, Gonm, Gonm, Gonm, Gonm, Gonm,
+/* DATA_BLOCK: -- 0x20C0..0x20CF -- */
+    Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm,
+/* DATA_BLOCK: -- 0x20D0..0x20DF -- */
+    Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Gonm, Zzzz, Gonm, Gonm, Zzzz, Gonm,
+/* DATA_BLOCK: -- 0x20E0..0x20EF -- */
+    Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x20F0..0x20FF -- */
+    Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2100..0x210F -- */
+    Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Gong, Gong, Zzzz, Gong, Gong, Gong, Gong, Gong, Gong,
+/* DATA_BLOCK: -- 0x2110..0x211F -- */
+    Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong,
+/* DATA_BLOCK: -- 0x2120..0x212F -- */
+    Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz,
+/* DATA_BLOCK: -- 0x2130..0x213F -- */
+    Gong, Gong, Zzzz, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2140..0x214F -- */
+    Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2150..0x215F -- */
+    Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka,
+/* DATA_BLOCK: -- 0x2160..0x216F -- */
+    Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2170..0x217F -- */
+    Lisu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2180..0x218F -- */
+    Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml,
+/* DATA_BLOCK: -- 0x2190..0x219F -- */
+    Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml,
+/* DATA_BLOCK: -- 0x21A0..0x21AF -- */
+    Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux,
+/* DATA_BLOCK: -- 0x21B0..0x21BF -- */
+    Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x21C0..0x21CF -- */
+    Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz,
+/* DATA_BLOCK: -- 0x21D0..0x21DF -- */
+    Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x21E0..0x21EF -- */
+    Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x21F0..0x21FF -- */
+    Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp,
+/* DATA_BLOCK: -- 0x2200..0x220F -- */
+    Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Zzzz,
+/* DATA_BLOCK: -- 0x2210..0x221F -- */
+    Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2220..0x222F -- */
+    Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw,
+/* DATA_BLOCK: -- 0x2230..0x223F -- */
+    Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2240..0x224F -- */
+    Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2250..0x225F -- */
+    Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo,
+/* DATA_BLOCK: -- 0x2260..0x226F -- */
+    Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Zzzz,
+/* DATA_BLOCK: -- 0x2270..0x227F -- */
+    Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Zzzz, Zzzz, Zzzz, Zzzz, Mroo, Mroo,
+/* DATA_BLOCK: -- 0x2280..0x228F -- */
+    Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass,
+/* DATA_BLOCK: -- 0x2290..0x229F -- */
+    Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x22A0..0x22AF -- */
+    Bass, Bass, Bass, Bass, Bass, Bass, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x22B0..0x22BF -- */
+    Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng,
+/* DATA_BLOCK: -- 0x22C0..0x22CF -- */
+    Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x22D0..0x22DF -- */
+    Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Hmng, Hmng, Hmng, Hmng, Hmng,
+/* DATA_BLOCK: -- 0x22E0..0x22EF -- */
+    Hmng, Hmng, Zzzz, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng,
+/* DATA_BLOCK: -- 0x22F0..0x22FF -- */
+    Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hmng, Hmng, Hmng,
+/* DATA_BLOCK: -- 0x2300..0x230F -- */
+    Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf,
+/* DATA_BLOCK: -- 0x2310..0x231F -- */
+    Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2320..0x232F -- */
+    Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd,
+/* DATA_BLOCK: -- 0x2330..0x233F -- */
+    Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Zzzz, Zzzz, Zzzz, Zzzz, Plrd,
+/* DATA_BLOCK: -- 0x2340..0x234F -- */
+    Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Plrd,
+/* DATA_BLOCK: -- 0x2350..0x235F -- */
+    Tang, Nshu, Zyyy, Zyyy, Kits, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2360..0x236F -- */
+    Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2370..0x237F -- */
+    Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang,
+/* DATA_BLOCK: -- 0x2380..0x238F -- */
+    Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2390..0x239F -- */
+    Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits,
+/* DATA_BLOCK: -- 0x23A0..0x23AF -- */
+    Kits, Kits, Kits, Kits, Kits, Kits, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x23B0..0x23BF -- */
+    Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x23C0..0x23CF -- */
+    Kana, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira,
+/* DATA_BLOCK: -- 0x23D0..0x23DF -- */
+    Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Zzzz,
+/* DATA_BLOCK: -- 0x23E0..0x23EF -- */
+    Hira, Hira, Hira, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x23F0..0x23FF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Kana, Kana, Kana, Kana, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2400..0x240F -- */
+    Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu,
+/* DATA_BLOCK: -- 0x2410..0x241F -- */
+    Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2420..0x242F -- */
+    Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl,
+/* DATA_BLOCK: -- 0x2430..0x243F -- */
+    Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2440..0x244F -- */
+    Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2450..0x245F -- */
+    Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2460..0x246F -- */
+    Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Dupl, Dupl, Dupl, Dupl,
+/* DATA_BLOCK: -- 0x2470..0x247F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2480..0x248F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2490..0x249F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x24A0..0x24AF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh,
+/* DATA_BLOCK: -- 0x24B0..0x24BF -- */
+    Zinh, Zinh, Zinh, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x24C0..0x24CF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x24D0..0x24DF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x24E0..0x24EF -- */
+    Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x24F0..0x24FF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2500..0x250F -- */
+    Zzzz, Zzzz, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2510..0x251F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2520..0x252F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2530..0x253F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2540..0x254F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2550..0x255F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz,
+/* DATA_BLOCK: -- 0x2560..0x256F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2570..0x257F -- */
+    Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2580..0x258F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x2590..0x259F -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x25A0..0x25AF -- */
+    Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw,
+/* DATA_BLOCK: -- 0x25B0..0x25BF -- */
+    Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x25C0..0x25CF -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw,
+/* DATA_BLOCK: -- 0x25D0..0x25DF -- */
+    Zzzz, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw,
+/* DATA_BLOCK: -- 0x25E0..0x25EF -- */
+    Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag,
+/* DATA_BLOCK: -- 0x25F0..0x25FF -- */
+    Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz, Zzzz, Glag, Glag, Glag, Glag, Glag,
+/* DATA_BLOCK: -- 0x2600..0x260F -- */
+    Glag, Glag, Zzzz, Glag, Glag, Zzzz, Glag, Glag, Glag, Glag, Glag, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2610..0x261F -- */
+    Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp,
+/* DATA_BLOCK: -- 0x2620..0x262F -- */
+    Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2630..0x263F -- */
+    Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2640..0x264F -- */
+    Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz, Zzzz, Zzzz, Hmnp, Hmnp,
+/* DATA_BLOCK: -- 0x2650..0x265F -- */
+    Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho,
+/* DATA_BLOCK: -- 0x2660..0x266F -- */
+    Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Wcho,
+/* DATA_BLOCK: -- 0x2670..0x267F -- */
+    Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend,
+/* DATA_BLOCK: -- 0x2680..0x268F -- */
+    Mend, Mend, Mend, Mend, Mend, Zzzz, Zzzz, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend,
+/* DATA_BLOCK: -- 0x2690..0x269F -- */
+    Mend, Mend, Mend, Mend, Mend, Mend, Mend, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x26A0..0x26AF -- */
+    Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm,
+/* DATA_BLOCK: -- 0x26B0..0x26BF -- */
+    Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x26C0..0x26CF -- */
+    Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Zzzz, Zzzz, Zzzz, Zzzz, Adlm, Adlm,
+/* DATA_BLOCK: -- 0x26D0..0x26DF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x26E0..0x26EF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x26F0..0x26FF -- */
+    Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2700..0x270F -- */
+    Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2710..0x271F -- */
+    Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2720..0x272F -- */
+    Zzzz, Zzzz, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2730..0x273F -- */
+    Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab,
+/* DATA_BLOCK: -- 0x2740..0x274F -- */
+    Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2750..0x275F -- */
+    Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Zzzz,
+/* DATA_BLOCK: -- 0x2760..0x276F -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2770..0x277F -- */
+    Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2780..0x278F -- */
+    Zzzz, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab,
+/* DATA_BLOCK: -- 0x2790..0x279F -- */
+    Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x27A0..0x27AF -- */
+    Hira, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x27B0..0x27BF -- */
+    Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x27C0..0x27CF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x27D0..0x27DF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x27E0..0x27EF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy,
+/* DATA_BLOCK: -- 0x27F0..0x27FF -- */
+    Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2800..0x280F -- */
+    Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2810..0x281F -- */
+    Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2820..0x282F -- */
+    Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz,
+/* DATA_BLOCK: -- 0x2830..0x283F -- */
+    Zzzz, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz
+};
+
+static const SBUInt16 MainScriptIndexes[3935] = {
+/* INDEX_BLOCK: -- 0x0000..0x003F -- */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0020, 0x0010, 0x0020, 0x0000, 0x0000, 0x0030, 0x0030,
+    0x0040, 0x0050, 0x0040, 0x0050, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040,
+    0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040,
+    0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0060, 0x0000, 0x0000, 0x0070, 0x0000,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00B0,
+    0x00B0, 0x00B0, 0x00D0, 0x00B0,
+/* INDEX_BLOCK: -- 0x0040..0x007F -- */
+    0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00F0, 0x00E0, 0x00E0, 0x00E0,
+    0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x0100, 0x0110, 0x0120, 0x0110, 0x0110,
+    0x0130, 0x0140, 0x0150, 0x0150, 0x0160, 0x0150, 0x0170, 0x0180, 0x0190, 0x01A0, 0x01B0, 0x01B0,
+    0x01C0, 0x01D0, 0x01B0, 0x01E0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01F0, 0x01B0, 0x01B0,
+    0x0200, 0x0210, 0x0210, 0x0210, 0x0220, 0x01B0, 0x01B0, 0x01B0, 0x0230, 0x0230, 0x0230, 0x0240,
+    0x0250, 0x0250, 0x0250, 0x0260,
+/* INDEX_BLOCK: -- 0x0080..0x00BF -- */
+    0x0270, 0x0270, 0x0280, 0x0290, 0x02A0, 0x02B0, 0x02C0, 0x02D0, 0x02D0, 0x02D0, 0x01B0, 0x02E0,
+    0x02F0, 0x0300, 0x0310, 0x01B0, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0330, 0x0340, 0x0320,
+    0x0350, 0x0360, 0x0370, 0x0380, 0x0390, 0x03A0, 0x03B0, 0x03C0, 0x03D0, 0x03E0, 0x03F0, 0x0400,
+    0x0410, 0x0420, 0x0430, 0x0440, 0x0450, 0x0460, 0x0470, 0x0480, 0x0490, 0x04A0, 0x04B0, 0x04C0,
+    0x04D0, 0x04E0, 0x04F0, 0x0500, 0x0510, 0x0520, 0x0530, 0x0540, 0x0550, 0x0560, 0x0570, 0x0580,
+    0x0590, 0x05A0, 0x05B0, 0x05C0,
+/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */
+    0x05D0, 0x05E0, 0x05F0, 0x0600, 0x0610, 0x0620, 0x0630, 0x0640, 0x0650, 0x0660, 0x0670, 0x0680,
+    0x0690, 0x06A0, 0x06B0, 0x06C0, 0x06D0, 0x06E0, 0x06F0, 0x06F0, 0x0700, 0x0710, 0x0720, 0x06F0,
+    0x0730, 0x0740, 0x0750, 0x0760, 0x0770, 0x0780, 0x0790, 0x07A0, 0x07B0, 0x07C0, 0x07C0, 0x07D0,
+    0x07C0, 0x07E0, 0x02D0, 0x02D0, 0x07F0, 0x0800, 0x0810, 0x0820, 0x0830, 0x0840, 0x02D0, 0x02D0,
+    0x0850, 0x0850, 0x0850, 0x0850, 0x0860, 0x0850, 0x0870, 0x0880, 0x0850, 0x0860, 0x0850, 0x0890,
+    0x0890, 0x08A0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0100..0x013F -- */
+    0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08C0, 0x08C0,
+    0x08D0, 0x08C0, 0x08C0, 0x08E0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x0900, 0x0900, 0x0900, 0x0900,
+    0x0910, 0x0920, 0x0900, 0x0900, 0x0910, 0x0900, 0x0900, 0x0930, 0x0940, 0x0950, 0x0900, 0x0900,
+    0x0900, 0x0940, 0x0900, 0x0900, 0x0900, 0x0960, 0x0900, 0x0970, 0x0900, 0x0980, 0x0990, 0x0990,
+    0x0990, 0x0990, 0x0990, 0x09A0,
+/* INDEX_BLOCK: -- 0x0140..0x017F -- */
+    0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0,
+    0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0,
+    0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0,
+    0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09C0, 0x09D0, 0x09E0, 0x09E0, 0x09E0, 0x09E0, 0x09F0, 0x0A00,
+    0x0A10, 0x0A20, 0x0A30, 0x0A40, 0x0A50, 0x0A60, 0x0A70, 0x0A80, 0x0A90, 0x0A90, 0x0A90, 0x0A90,
+    0x0A90, 0x0AA0, 0x0AB0, 0x0AB0,
+/* INDEX_BLOCK: -- 0x0180..0x01BF -- */
+    0x0AC0, 0x0AD0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AF0, 0x0AE0, 0x0AE0, 0x0B00, 0x09B0,
+    0x09B0, 0x09B0, 0x09B0, 0x0B10, 0x0B20, 0x0B30, 0x0B40, 0x0B40, 0x0B50, 0x0B60, 0x0B70, 0x0B80,
+    0x0B90, 0x0B90, 0x0BA0, 0x0B90, 0x0BB0, 0x0BC0, 0x0A90, 0x0A90, 0x0BD0, 0x0BE0, 0x0BF0, 0x0BF0,
+    0x0BF0, 0x0C00, 0x0BF0, 0x0C10, 0x0C20, 0x0C20, 0x0C30, 0x0080, 0x0C40, 0x02D0, 0x02D0, 0x02D0,
+    0x0C50, 0x0C50, 0x0C50, 0x0C50, 0x0C60, 0x0C50, 0x0C50, 0x0C70, 0x0C80, 0x0C80, 0x0C80, 0x0C80,
+    0x0C90, 0x0C90, 0x0C90, 0x0CA0,
+/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */
+    0x0CB0, 0x0CB0, 0x0CB0, 0x0CC0, 0x0CD0, 0x0CE0, 0x0CE0, 0x0CE0, 0x0CF0, 0x08C0, 0x08C0, 0x0D00,
+    0x0D10, 0x0D20, 0x0D30, 0x0D40, 0x0040, 0x0040, 0x0D50, 0x0040, 0x0040, 0x0D60, 0x0D70, 0x0D80,
+    0x0040, 0x0040, 0x0040, 0x0D90, 0x0080, 0x0080, 0x0080, 0x0DA0, 0x0040, 0x0040, 0x0040, 0x0040,
+    0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040,
+    0x00B0, 0x0DB0, 0x00B0, 0x00B0, 0x0DB0, 0x0DC0, 0x00B0, 0x0DD0, 0x00B0, 0x00B0, 0x00B0, 0x0DE0,
+    0x0DE0, 0x0DF0, 0x00B0, 0x0E00,
+/* INDEX_BLOCK: -- 0x0200..0x023F -- */
+    0x0E10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E20, 0x0E30, 0x0E40, 0x0E50, 0x0000, 0x0000,
+    0x02D0, 0x0080, 0x0080, 0x0C40, 0x0000, 0x0000, 0x0E60, 0x0E70, 0x0E80, 0x0000, 0x0040, 0x0040,
+    0x0E90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x0240..0x027F -- */
+    0x0000, 0x0000, 0x0EA0, 0x02D0, 0x0EB0, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x0280..0x02BF -- */
+    0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0,
+    0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ED0, 0x0000, 0x0EE0, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */
+    0x0EF0, 0x0EF0, 0x0F00, 0x0EF0, 0x0EF0, 0x0F00, 0x0040, 0x0040, 0x0F10, 0x0F10, 0x0F10, 0x0F10,
+    0x0F10, 0x0F10, 0x0F10, 0x0F20, 0x08C0, 0x08C0, 0x08D0, 0x0F30, 0x0F30, 0x0F30, 0x0F40, 0x0F50,
+    0x0900, 0x0F60, 0x0F70, 0x0F70, 0x0F70, 0x0F70, 0x00E0, 0x00E0, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0F80, 0x02D0, 0x02D0, 0x0F90, 0x0FA0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0FB0,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0FC0, 0x02D0, 0x0FD0,
+/* INDEX_BLOCK: -- 0x0300..0x033F -- */
+    0x0FE0, 0x0000, 0x0FF0, 0x1000, 0x1010, 0x1020, 0x1020, 0x1020, 0x1020, 0x1030, 0x1040, 0x1050,
+    0x1050, 0x1050, 0x1050, 0x1060, 0x1070, 0x1080, 0x1080, 0x1090, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x10A0, 0x0000, 0x1080, 0x1080, 0x0000, 0x0000, 0x10B0, 0x1050, 0x08F0, 0x10A0, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x08F0, 0x10C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1050, 0x1050, 0x10D0,
+    0x1050, 0x1050, 0x1050, 0x1050, 0x1050, 0x10E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x0340..0x037F -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x0380..0x03BF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x10F0,
+/* INDEX_BLOCK: -- 0x0400..0x043F -- */
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100,
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100,
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100,
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100,
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100,
+    0x1100, 0x1100, 0x1100, 0x1100,
+/* INDEX_BLOCK: -- 0x0440..0x047F -- */
+    0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1110, 0x1100, 0x1100, 0x1100,
+    0x1120, 0x1130, 0x1130, 0x1130, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140,
+    0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1150, 0x02D0,
+    0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1170,
+    0x0000, 0x0000, 0x1180, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x1190, 0x0040, 0x0040, 0x0040,
+    0x11A0, 0x02D0, 0x02D0, 0x11B0,
+/* INDEX_BLOCK: -- 0x0480..0x04BF -- */
+    0x11C0, 0x11C0, 0x11D0, 0x11E0, 0x11F0, 0x11F0, 0x11F0, 0x1200, 0x1210, 0x1210, 0x1210, 0x1210,
+    0x1220, 0x1230, 0x0320, 0x0320, 0x1240, 0x1240, 0x1250, 0x1260, 0x1260, 0x1270, 0x08F0, 0x1280,
+    0x1290, 0x1290, 0x1290, 0x1290, 0x12A0, 0x12B0, 0x08B0, 0x12C0, 0x12D0, 0x12D0, 0x12D0, 0x12E0,
+    0x12F0, 0x1300, 0x08B0, 0x08B0, 0x1310, 0x1310, 0x1310, 0x1310, 0x1320, 0x1330, 0x1340, 0x1350,
+    0x1360, 0x1370, 0x0F70, 0x0040, 0x0040, 0x1380, 0x1390, 0x0990, 0x0990, 0x0990, 0x0990, 0x0990,
+    0x1340, 0x1340, 0x13A0, 0x13B0,
+/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0,
+/* INDEX_BLOCK: -- 0x0500..0x053F -- */
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0,
+    0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x13C0, 0x08F0,
+    0x13D0, 0x08F0, 0x08F0, 0x13E0,
+/* INDEX_BLOCK: -- 0x0540..0x057F -- */
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0580..0x05BF -- */
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x13F0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x1400, 0x02D0, 0x02D0,
+    0x1410, 0x1420, 0x0150, 0x1430, 0x1440, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0,
+    0x1450, 0x0300, 0x01B0, 0x01B0,
+/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */
+    0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0,
+    0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x1460, 0x02D0, 0x01B0, 0x01B0, 0x01B0,
+    0x01B0, 0x1470, 0x01B0, 0x01B0, 0x02F0, 0x02D0, 0x02D0, 0x1480, 0x0080, 0x11E0, 0x1490, 0x0000,
+    0x0000, 0x14A0, 0x14B0, 0x02E0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x14C0,
+    0x14D0, 0x0000, 0x0010, 0x0020, 0x0010, 0x0020, 0x14E0, 0x1040, 0x1050, 0x14F0, 0x08F0, 0x10A0,
+    0x1500, 0x1510, 0x1520, 0x1530,
+/* INDEX_BLOCK: -- 0x0600..0x063F -- */
+    0x1540, 0x1550, 0x1560, 0x1570, 0x1580, 0x1580, 0x02D0, 0x02D0, 0x1550, 0x1550, 0x1550, 0x1550,
+    0x1550, 0x1550, 0x1550, 0x1590, 0x15A0, 0x0000, 0x0000, 0x15B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x15C0, 0x15D0, 0x15E0, 0x02D0, 0x02D0, 0x0000, 0x0000, 0x15F0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1600, 0x1610, 0x1620, 0x1620, 0x1620, 0x1630, 0x1640, 0x0FD0,
+    0x1650, 0x1650, 0x1660, 0x1670, 0x1680, 0x1690, 0x1690, 0x16A0, 0x16B0, 0x16C0, 0x16D0, 0x16D0,
+    0x16E0, 0x16F0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0640..0x067F -- */
+    0x1700, 0x1700, 0x1700, 0x1700, 0x1700, 0x1710, 0x1710, 0x1710, 0x1720, 0x1730, 0x1740, 0x1750,
+    0x1750, 0x1760, 0x1750, 0x1770, 0x1780, 0x1780, 0x1790, 0x17A0, 0x17A0, 0x17A0, 0x17B0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x17C0, 0x17C0, 0x17C0, 0x17C0,
+    0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0,
+    0x17C0, 0x17C0, 0x17C0, 0x17D0, 0x17C0, 0x17E0, 0x17F0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0680..0x06BF -- */
+    0x1800, 0x1810, 0x1810, 0x1820, 0x1830, 0x1840, 0x1850, 0x1850, 0x1860, 0x1870, 0x1880, 0x02D0,
+    0x02D0, 0x02D0, 0x1890, 0x18A0, 0x18B0, 0x18C0, 0x18D0, 0x18E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x18F0, 0x18F0, 0x1900, 0x1910, 0x1900, 0x1920, 0x1900, 0x1900, 0x1930, 0x1940, 0x1950, 0x1960,
+    0x1970, 0x1970, 0x1980, 0x1980, 0x1990, 0x1990, 0x02D0, 0x02D0, 0x19A0, 0x19A0, 0x19B0, 0x19C0,
+    0x19D0, 0x19D0, 0x19D0, 0x19E0, 0x19F0, 0x1A00, 0x1A10, 0x1A20, 0x1A30, 0x1A40, 0x1A50, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */
+    0x1A60, 0x1A60, 0x1A60, 0x1A60, 0x1A70, 0x02D0, 0x02D0, 0x02D0, 0x1A80, 0x1A80, 0x1A80, 0x1A90,
+    0x1A80, 0x1A80, 0x1A80, 0x1AA0, 0x1AB0, 0x1AB0, 0x1AC0, 0x1AD0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x01B0, 0x1AE0, 0x1AF0, 0x1AF0, 0x1B00, 0x1B10, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x1B20, 0x1B20, 0x1B30, 0x1B40, 0x1B40, 0x1B50, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1B60,
+    0x1B70, 0x02D0, 0x1B80, 0x1B90,
+/* INDEX_BLOCK: -- 0x0700..0x073F -- */
+    0x1BA0, 0x1BA0, 0x1BA0, 0x1BA0, 0x1BB0, 0x1BC0, 0x1BA0, 0x1BD0, 0x1BE0, 0x1BE0, 0x1BE0, 0x1BE0,
+    0x1BF0, 0x1C00, 0x1C10, 0x1C20, 0x1C30, 0x1C30, 0x1C30, 0x1C40, 0x1C50, 0x1C60, 0x1C60, 0x1C70,
+    0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C90, 0x1CA0, 0x1CB0, 0x1CC0, 0x1CB0, 0x1CD0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1CE0, 0x1CF0, 0x1D00, 0x1D10, 0x1D10, 0x1D10, 0x1D20, 0x1D30,
+    0x1D40, 0x1D50, 0x1D60, 0x1D70, 0x1D80, 0x1D90, 0x1DA0, 0x1DB0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0740..0x077F -- */
+    0x1DC0, 0x1DC0, 0x1DC0, 0x1DC0, 0x1DC0, 0x1DD0, 0x1DE0, 0x02D0, 0x1DF0, 0x1DF0, 0x1DF0, 0x1DF0,
+    0x1E00, 0x1E10, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x1E20, 0x1E20, 0x1E20, 0x1E30, 0x1E20, 0x1E40, 0x02D0, 0x02D0, 0x1E50, 0x1E50, 0x1E50, 0x1E50,
+    0x1E60, 0x1E70, 0x1E80, 0x02D0, 0x1E90, 0x1E90, 0x1E90, 0x1EA0, 0x1EB0, 0x02D0, 0x02D0, 0x02D0,
+    0x1EC0, 0x1ED0, 0x1EE0, 0x1EC0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0780..0x07BF -- */
+    0x1EF0, 0x1EF0, 0x1EF0, 0x1F00, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1F10, 0x1F10,
+    0x1F10, 0x1F10, 0x1F10, 0x1F20, 0x1F30, 0x1F40, 0x1F50, 0x1F60, 0x1F70, 0x1F80, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x1F90, 0x1FA0, 0x1FA0, 0x1F90, 0x1FB0, 0x02D0, 0x1FC0, 0x1FC0, 0x1FC0, 0x1FC0,
+    0x1FD0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FF0, 0x02D0, 0x2000, 0x2000, 0x2000, 0x2010,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */
+    0x2020, 0x2030, 0x2030, 0x2040, 0x2050, 0x2030, 0x2060, 0x2070, 0x2070, 0x2080, 0x2090, 0x20A0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x20B0, 0x20C0, 0x20C0, 0x20D0, 0x20E0, 0x20F0, 0x2100, 0x2110,
+    0x2120, 0x2130, 0x2140, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2150, 0x2160,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2170,
+    0x2180, 0x2180, 0x2180, 0x2190,
+/* INDEX_BLOCK: -- 0x0800..0x083F -- */
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0,
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0,
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0,
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0,
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21B0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0840..0x087F -- */
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21C0, 0x21D0, 0x21A0, 0x21A0, 0x21A0, 0x21A0,
+    0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21E0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0880..0x08BF -- */
+    0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0,
+    0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0,
+    0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0,
+    0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0,
+    0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0,
+    0x21F0, 0x21F0, 0x21F0, 0x21F0,
+/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */
+    0x21F0, 0x21F0, 0x2200, 0x2210, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0900..0x093F -- */
+    0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220,
+    0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220,
+    0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220,
+    0x2230, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0940..0x097F -- */
+    0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160,
+    0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x2240,
+    0x2250, 0x2260, 0x2270, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2280, 0x2290, 0x22A0,
+    0x22B0, 0x22B0, 0x22B0, 0x22B0, 0x22C0, 0x22D0, 0x22E0, 0x22F0, 0x22B0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0980..0x09BF -- */
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2310, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x2320, 0x2320, 0x2320, 0x2320, 0x2330, 0x2320, 0x2320, 0x2320, 0x2340, 0x2320, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x2350, 0x2360,
+/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370,
+/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2380,
+/* INDEX_BLOCK: -- 0x0A40..0x0A7F -- */
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370,
+    0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390,
+    0x2390, 0x2390, 0x2390, 0x2390,
+/* INDEX_BLOCK: -- 0x0A80..0x0ABF -- */
+    0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390,
+    0x2390, 0x23A0, 0x02D0, 0x02D0, 0x23B0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0AC0..0x0AFF -- */
+    0x23C0, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020,
+    0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x23D0, 0x02D0, 0x02D0, 0x02D0, 0x23E0, 0x23F0, 0x2400,
+    0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400,
+    0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2410,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0B00..0x0B3F -- */
+    0x2420, 0x2420, 0x2420, 0x2420, 0x2420, 0x2420, 0x2430, 0x2440, 0x2450, 0x2460, 0x10B0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0B40..0x0B7F -- */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x2470, 0x0000, 0x0000, 0x2480, 0x0000, 0x0000, 0x0000, 0x2490, 0x24A0,
+    0x24B0, 0x0000, 0x24C0, 0x0000, 0x0000, 0x0000, 0x24D0, 0x02D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0,
+    0x24E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0000, 0x10B0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0EA0, 0x0000, 0x24D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0B80..0x0BBF -- */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E20, 0x0000, 0x0000, 0x0000, 0x24F0, 0x2500, 0x2510,
+    0x2520, 0x0000, 0x0000, 0x0000, 0x2530, 0x2540, 0x0000, 0x2550, 0x2560, 0x2570, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2580, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x2590, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x0BC0..0x0BFF -- */
+    0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0,
+    0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0,
+    0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0,
+    0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25B0, 0x25C0, 0x25D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0C00..0x0C3F -- */
+    0x25E0, 0x25F0, 0x2600, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2610, 0x2610, 0x2620, 0x2630, 0x2640, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2650, 0x2650, 0x2650, 0x2660,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0C40..0x0C7F -- */
+    0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670,
+    0x2680, 0x2690, 0x02D0, 0x02D0, 0x26A0, 0x26A0, 0x26A0, 0x26A0, 0x26B0, 0x26C0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0C80..0x0CBF -- */
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x14D0, 0x0000, 0x0000, 0x0000, 0x26D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x14D0, 0x0000, 0x0000, 0x26E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x26F0, 0x01B0, 0x2700, 0x2710,
+    0x2720, 0x2730, 0x2740, 0x2750, 0x2760, 0x2770, 0x2780, 0x2770, 0x02D0, 0x02D0, 0x02D0, 0x1450,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0CC0..0x0CFF -- */
+    0x0000, 0x0000, 0x0FD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10B0, 0x0E40, 0x14D0,
+    0x14D0, 0x14D0, 0x0000, 0x2470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x26E0, 0x02D0, 0x02D0, 0x02D0, 0x2790, 0x0000, 0x27A0, 0x0000, 0x0000, 0x0FD0,
+    0x24D0, 0x27B0, 0x2470, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
+/* INDEX_BLOCK: -- 0x0D00..0x0D3F -- */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x27C0, 0x15D0, 0x15D0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10B0, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x24D0, 0x0FD0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0D40..0x0D7F -- */
+    0x0FD0, 0x0000, 0x0000, 0x0000, 0x27C0, 0x11E0, 0x0000, 0x0000, 0x27C0, 0x0000, 0x26E0, 0x27B0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x27D0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x27E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x10B0, 0x26E0, 0x27F0, 0x0EA0, 0x0000, 0x24D0, 0x0EA0, 0x0F80, 0x0EA0, 0x02D0, 0x02D0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14A0, 0x0000, 0x0000,
+    0x0EB0, 0x02D0, 0x02D0, 0x11E0,
+/* INDEX_BLOCK: -- 0x0D80..0x0DBF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x13F0, 0x02D0, 0x02D0,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x0DC0..0x0DFF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x2800, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x0E00..0x0E3F -- */
+    0x0F90, 0x13F0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x0E40..0x0E7F -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x2360, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90,
+/* INDEX_BLOCK: -- 0x0E80..0x0EBF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x2810, 0x02D0,
+/* INDEX_BLOCK: -- 0x0EC0..0x0EFF -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x13F0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0F00..0x0F3F -- */
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90,
+    0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x2820, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0,
+/* INDEX_BLOCK: -- 0x0F40..0x0F5E -- */
+    0x2830, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02D0, 0x02D0, 0x02D0, 0x02D0,
+    0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080
+};
+
+static const SBUInt16 BranchScriptIndexes[897] = {
+    0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0,
+    0x0300, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0380, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x03C0, 0x0400, 0x0440, 0x0480, 0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x04C0,
+    0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x0500, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0580, 0x05C0, 0x0600, 0x0640, 0x0680, 0x06C0, 0x0700, 0x0740, 0x0780, 0x07C0,
+    0x0800, 0x0840, 0x0540, 0x0540, 0x0880, 0x08C0, 0x0540, 0x0540, 0x0540, 0x0900, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0940, 0x0980, 0x09C0, 0x09C0, 0x09C0, 0x09C0,
+    0x09C0, 0x0A00, 0x0A40, 0x0A80, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0AC0, 0x0540, 0x0540, 0x0B00, 0x0540, 0x0540, 0x0540, 0x0540, 0x0B40, 0x0B80, 0x0BC0, 0x0540,
+    0x0C00, 0x0540, 0x0C40, 0x0C80, 0x0CC0, 0x0D00, 0x0D40, 0x0540, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340,
+    0x0340, 0x0D80, 0x0340, 0x0340, 0x0340, 0x0DC0, 0x0E00, 0x0340, 0x0340, 0x0340, 0x0340, 0x0E40,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0E80, 0x0540, 0x0540, 0x0540, 0x0EC0, 0x0540,
+    0x0340, 0x0340, 0x0340, 0x0340, 0x0F00, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540,
+    0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0F40
+};
+
+SB_INTERNAL SBScript LookupScript(SBCodepoint codepoint)
+{
+    if (codepoint <= 0x0E01EF) {
+        return PrimaryScriptData[
+                MainScriptIndexes[
+                 BranchScriptIndexes[
+                      codepoint / 0x0400
+                 ] + (codepoint % 0x0400) / 0x0010
+                ] + codepoint % 0x0010
+               ];
+    }
+
+    return Zzzz;
+}
+
+#undef Adlm
+#undef Aghb
+#undef Ahom
+#undef Arab
+#undef Armi
+#undef Armn
+#undef Avst
+#undef Bali
+#undef Bamu
+#undef Bass
+#undef Batk
+#undef Beng
+#undef Bhks
+#undef Bopo
+#undef Brah
+#undef Brai
+#undef Bugi
+#undef Buhd
+#undef Cakm
+#undef Cans
+#undef Cari
+#undef Cham
+#undef Cher
+#undef Chrs
+#undef Copt
+#undef Cprt
+#undef Cyrl
+#undef Deva
+#undef Diak
+#undef Dogr
+#undef Dsrt
+#undef Dupl
+#undef Egyp
+#undef Elba
+#undef Elym
+#undef Ethi
+#undef Geor
+#undef Glag
+#undef Gong
+#undef Gonm
+#undef Goth
+#undef Gran
+#undef Grek
+#undef Gujr
+#undef Guru
+#undef Hang
+#undef Hani
+#undef Hano
+#undef Hatr
+#undef Hebr
+#undef Hira
+#undef Hluw
+#undef Hmng
+#undef Hmnp
+#undef Hung
+#undef Ital
+#undef Java
+#undef Kali
+#undef Kana
+#undef Khar
+#undef Khmr
+#undef Khoj
+#undef Kits
+#undef Knda
+#undef Kthi
+#undef Lana
+#undef Laoo
+#undef Latn
+#undef Lepc
+#undef Limb
+#undef Lina
+#undef Linb
+#undef Lisu
+#undef Lyci
+#undef Lydi
+#undef Mahj
+#undef Maka
+#undef Mand
+#undef Mani
+#undef Marc
+#undef Medf
+#undef Mend
+#undef Merc
+#undef Mero
+#undef Mlym
+#undef Modi
+#undef Mong
+#undef Mroo
+#undef Mtei
+#undef Mult
+#undef Mymr
+#undef Nand
+#undef Narb
+#undef Nbat
+#undef Newa
+#undef Nkoo
+#undef Nshu
+#undef Ogam
+#undef Olck
+#undef Orkh
+#undef Orya
+#undef Osge
+#undef Osma
+#undef Palm
+#undef Pauc
+#undef Perm
+#undef Phag
+#undef Phli
+#undef Phlp
+#undef Phnx
+#undef Plrd
+#undef Prti
+#undef Rjng
+#undef Rohg
+#undef Runr
+#undef Samr
+#undef Sarb
+#undef Saur
+#undef Sgnw
+#undef Shaw
+#undef Shrd
+#undef Sidd
+#undef Sind
+#undef Sinh
+#undef Sogd
+#undef Sogo
+#undef Sora
+#undef Soyo
+#undef Sund
+#undef Sylo
+#undef Syrc
+#undef Tagb
+#undef Takr
+#undef Tale
+#undef Talu
+#undef Taml
+#undef Tang
+#undef Tavt
+#undef Telu
+#undef Tfng
+#undef Tglg
+#undef Thaa
+#undef Thai
+#undef Tibt
+#undef Tirh
+#undef Ugar
+#undef Vaii
+#undef Wara
+#undef Wcho
+#undef Xpeo
+#undef Xsux
+#undef Yezi
+#undef Yiii
+#undef Zanb
+#undef Zinh
+#undef Zyyy
+#undef Zzzz
diff --git a/lib/sheenbidi/Source/ScriptLookup.h b/lib/sheenbidi/Source/ScriptLookup.h
new file mode 100644
index 000000000..da92eb519
--- /dev/null
+++ b/lib/sheenbidi/Source/ScriptLookup.h
@@ -0,0 +1,16 @@
+/*
+ * Automatically generated by SheenBidiGenerator tool.
+ * DO NOT EDIT!!
+ */
+
+#ifndef _SB_INTERNAL_SCRIPT_LOOKUP_H
+#define _SB_INTERNAL_SCRIPT_LOOKUP_H
+
+#include <SBConfig.h>
+#include <SBScript.h>
+
+#include "SBBase.h"
+
+SB_INTERNAL SBScript LookupScript(SBCodepoint codepoint);
+
+#endif
diff --git a/lib/sheenbidi/Source/ScriptStack.c b/lib/sheenbidi/Source/ScriptStack.c
new file mode 100644
index 000000000..a525a3de7
--- /dev/null
+++ b/lib/sheenbidi/Source/ScriptStack.c
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "ScriptStack.h"
+
+SB_INTERNAL void ScriptStackReset(ScriptStackRef stack)
+{
+    stack->top = -1;
+    stack->count = 0;
+    stack->open = 0;
+}
+
+SB_INTERNAL void ScriptStackPush(ScriptStackRef stack, SBScript script, SBCodepoint mirror)
+{
+    stack->count = SBNumberLimitIncrement(stack->count, _SBScriptStackCapacity);
+    stack->open = SBNumberLimitIncrement(stack->open, _SBScriptStackCapacity);
+
+    stack->top = SBNumberRingIncrement(stack->top, _SBScriptStackCapacity);
+    stack->_elements[stack->top].script = script;
+    stack->_elements[stack->top].mirror = mirror;
+}
+
+SB_INTERNAL void ScriptStackPop(ScriptStackRef stack)
+{
+    /* There must be at least one entry in the stack. */
+    SBAssert(stack->count > 0);
+
+    stack->count -= 1;
+    stack->open = SBNumberLimitDecrement(stack->open, 0);
+    stack->top = SBNumberRingDecrement(stack->top, _SBScriptStackCapacity);
+
+    if (ScriptStackIsEmpty(stack)) {
+        stack->top = -1;
+    }
+}
+
+SB_INTERNAL void ScriptStackLeavePairs(ScriptStackRef stack)
+{
+    stack->open = 0;
+}
+
+SB_INTERNAL void ScriptStackSealPairs(ScriptStackRef stack, SBScript script)
+{
+    SBInteger index = SBNumberRingSubtract(stack->top, (SBInteger)stack->open, _SBScriptStackCapacity);
+
+    while (stack->open) {
+        index = SBNumberRingIncrement(index, _SBScriptStackCapacity);
+        stack->_elements[index].script = script;
+        stack->open -= 1;
+    }
+}
+
+SB_INTERNAL SBBoolean ScriptStackIsEmpty(ScriptStackRef stack)
+{
+    return (stack->count == 0);
+}
+
+SB_INTERNAL SBScript ScriptStackGetScript(ScriptStackRef stack)
+{
+    return stack->_elements[stack->top].script;
+}
+
+SB_INTERNAL SBCodepoint ScriptStackGetMirror(ScriptStackRef stack)
+{
+    return stack->_elements[stack->top].mirror;
+}
diff --git a/lib/sheenbidi/Source/ScriptStack.h b/lib/sheenbidi/Source/ScriptStack.h
new file mode 100644
index 000000000..fee54c95d
--- /dev/null
+++ b/lib/sheenbidi/Source/ScriptStack.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_SCRIPT_STACK_H
+#define _SB_INTERNAL_SCRIPT_STACK_H
+
+#include <SBBase.h>
+#include <SBConfig.h>
+
+#define _SBScriptStackCapacity  63
+
+typedef struct _SBScriptStackElement {
+    SBScript script;
+    SBCodepoint mirror;
+} _SBScriptStackElement;
+
+typedef struct _SBScriptStack {
+    _SBScriptStackElement _elements[_SBScriptStackCapacity];
+    SBInteger top;
+    SBUInteger count;
+    SBUInteger open;
+} ScriptStack, *ScriptStackRef;
+
+SB_INTERNAL void ScriptStackReset(ScriptStackRef stack);
+
+SB_INTERNAL void ScriptStackPush(ScriptStackRef stack, SBScript script, SBCodepoint mirror);
+SB_INTERNAL void ScriptStackPop(ScriptStackRef stack);
+
+SB_INTERNAL void ScriptStackLeavePairs(ScriptStackRef stack);
+SB_INTERNAL void ScriptStackSealPairs(ScriptStackRef stack, SBScript script);
+
+SB_INTERNAL SBBoolean ScriptStackIsEmpty(ScriptStackRef stack);
+SB_INTERNAL SBScript ScriptStackGetScript(ScriptStackRef stack);
+SB_INTERNAL SBCodepoint ScriptStackGetMirror(ScriptStackRef stack);
+
+#endif
diff --git a/lib/sheenbidi/Source/SheenBidi.c b/lib/sheenbidi/Source/SheenBidi.c
new file mode 100644
index 000000000..4a4917607
--- /dev/null
+++ b/lib/sheenbidi/Source/SheenBidi.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <SheenBidi.h>
+
+#ifdef SB_CONFIG_UNITY
+
+#include "BidiChain.c"
+#include "BidiTypeLookup.c"
+#include "BracketQueue.c"
+#include "GeneralCategoryLookup.c"
+#include "IsolatingRun.c"
+#include "LevelRun.c"
+#include "PairingLookup.c"
+#include "RunQueue.c"
+#include "SBAlgorithm.c"
+#include "SBBase.c"
+#include "SBCodepointSequence.c"
+#include "SBLine.c"
+#include "SBLog.c"
+#include "SBMirrorLocator.c"
+#include "SBParagraph.c"
+#include "SBScriptLocator.c"
+#include "ScriptLookup.c"
+#include "ScriptStack.c"
+#include "StatusStack.c"
+
+#endif
diff --git a/lib/sheenbidi/Source/StatusStack.c b/lib/sheenbidi/Source/StatusStack.c
new file mode 100644
index 000000000..afa99caa5
--- /dev/null
+++ b/lib/sheenbidi/Source/StatusStack.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <SBConfig.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "SBAssert.h"
+#include "SBBase.h"
+#include "StatusStack.h"
+
+SB_INTERNAL void StatusStackInitialize(StatusStackRef stack)
+{
+    stack->_firstList.previous = NULL;
+    stack->_firstList.next = NULL;
+    
+    StatusStackSetEmpty(stack);
+}
+
+SB_INTERNAL void StatusStackPush(StatusStackRef stack, SBLevel embeddingLevel, SBBidiType overrideStatus, SBBoolean isolateStatus)
+{
+    _SBStatusStackElementRef element;
+
+    /* The stack can hold upto 127 elements. */
+    SBAssert(stack->count <= 127);
+
+    if (stack->_peekTop != _SBStatusStackList_MaxIndex) {
+        element = &stack->_peekList->elements[++stack->_peekTop];
+    } else {
+        _SBStatusStackListRef previousList = stack->_peekList;
+        _SBStatusStackListRef peekList = previousList->next;
+
+        if (!peekList) {
+            peekList = malloc(sizeof(_SBStatusStackList));
+            peekList->previous = previousList;
+            peekList->next = NULL;
+
+            previousList->next = peekList;
+        }
+
+        stack->_peekList = peekList;
+        stack->_peekTop = 0;
+
+        element = &peekList->elements[0];
+    }
+    stack->count += 1;
+
+    element->embeddingLevel = embeddingLevel;
+    element->overrideStatus = overrideStatus;
+    element->isolateStatus = isolateStatus;
+}
+
+SB_INTERNAL void StatusStackPop(StatusStackRef stack)
+{
+    /* The stack should not be empty. */
+    SBAssert(stack->count != 0);
+
+    if (stack->_peekTop != 0) {
+        stack->_peekTop -= 1;
+    } else {
+        stack->_peekList = stack->_peekList->previous;
+        stack->_peekTop = _SBStatusStackList_MaxIndex;
+    }
+    stack->count -= 1;
+}
+
+SB_INTERNAL void StatusStackSetEmpty(StatusStackRef stack)
+{
+    stack->_peekList = &stack->_firstList;
+    stack->_peekTop = 0;
+    stack->count = 0;
+}
+
+SB_INTERNAL SBLevel StatusStackGetEmbeddingLevel(StatusStackRef stack)
+{
+    return stack->_peekList->elements[stack->_peekTop].embeddingLevel;
+}
+
+SB_INTERNAL SBBidiType StatusStackGetOverrideStatus(StatusStackRef stack)
+{
+    return stack->_peekList->elements[stack->_peekTop].overrideStatus;
+}
+
+SB_INTERNAL SBBoolean StatusStackGetIsolateStatus(StatusStackRef stack)
+{
+    return stack->_peekList->elements[stack->_peekTop].isolateStatus;
+}
+
+SB_INTERNAL void StatusStackFinalize(StatusStackRef stack)
+{
+    _SBStatusStackListRef list = stack->_firstList.next;
+
+    while (list) {
+        _SBStatusStackListRef next = list->next;
+        free(list);
+        list = next;
+    };
+}
diff --git a/lib/sheenbidi/Source/StatusStack.h b/lib/sheenbidi/Source/StatusStack.h
new file mode 100644
index 000000000..24e05325c
--- /dev/null
+++ b/lib/sheenbidi/Source/StatusStack.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2014-2019 Muhammad Tayyab Akram
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _SB_INTERNAL_STATUS_STACK_H
+#define _SB_INTERNAL_STATUS_STACK_H
+
+#include <SBConfig.h>
+#include "SBBase.h"
+
+#define _SBStatusStackList_Length       16
+#define _SBStatusStackList_MaxIndex     (_SBStatusStackList_Length - 1)
+
+typedef struct _SBStatusStackElement {
+    SBBoolean isolateStatus;
+    SBBidiType overrideStatus;
+    SBLevel embeddingLevel;
+} _SBStatusStackElement, *_SBStatusStackElementRef;
+
+typedef struct _SBStatusStackList {
+    _SBStatusStackElement elements[_SBStatusStackList_Length];
+
+    struct _SBStatusStackList *previous;
+    struct _SBStatusStackList *next;
+} _SBStatusStackList, *_SBStatusStackListRef;
+
+typedef struct _SBStatusStack {
+    _SBStatusStackList _firstList;
+    _SBStatusStackListRef _peekList;
+    SBUInteger _peekTop;
+    SBUInteger count;
+} StatusStack, *StatusStackRef;
+
+SB_INTERNAL void StatusStackInitialize(StatusStackRef stack);
+SB_INTERNAL void StatusStackFinalize(StatusStackRef stack);
+
+SB_INTERNAL void StatusStackPush(StatusStackRef stack,
+   SBLevel embeddingLevel, SBBidiType overrideStatus, SBBoolean isolateStatus);
+SB_INTERNAL void StatusStackPop(StatusStackRef stack);
+SB_INTERNAL void StatusStackSetEmpty(StatusStackRef stack);
+
+SB_INTERNAL SBLevel StatusStackGetEmbeddingLevel(StatusStackRef stack);
+SB_INTERNAL SBBidiType StatusStackGetOverrideStatus(StatusStackRef stack);
+SB_INTERNAL SBBoolean StatusStackGetIsolateStatus(StatusStackRef stack);
+
+#endif